comparison mercurial/revlog.py @ 2078:441ea218414e

Fill in the uncompressed size during revlog.addgroup This uses code from Matt to calculate the size change that would result from applying a delta to keep an accurate running total of the text size during revlog.addgroup
author mason@suse.com
date Tue, 04 Apr 2006 16:38:44 -0400
parents 4d0700ae0991
children ee96ca273f32
comparison
equal deleted inserted replaced
2077:4d0700ae0991 2078:441ea218414e
340 if rev < 0: 340 if rev < 0:
341 return -1 341 return -1
342 if self.version != 0: 342 if self.version != 0:
343 return self.ngoffset(self.index[rev][0]) 343 return self.ngoffset(self.index[rev][0])
344 return self.index[rev][0] 344 return self.index[rev][0]
345
345 def end(self, rev): return self.start(rev) + self.length(rev) 346 def end(self, rev): return self.start(rev) + self.length(rev)
347
348 def size(self, rev):
349 """return the length of the uncompressed text for a given revision"""
350 l = -1
351 if self.version != 0:
352 l = self.index[rev][2]
353 if l >= 0:
354 return l
355
356 t = self.revision(self.node(rev))
357 return len(t)
358
359 # alternate implementation, The advantage to this code is it
360 # will be faster for a single revision. But, the results are not
361 # cached, so finding the size of every revision will be slower.
362 """
363 if self.cache and self.cache[1] == rev:
364 return len(self.cache[2])
365
366 base = self.base(rev)
367 if self.cache and self.cache[1] >= base and self.cache[1] < rev:
368 base = self.cache[1]
369 text = self.cache[2]
370 else:
371 text = self.revision(self.node(base))
372
373 l = len(text)
374 for x in xrange(base + 1, rev + 1):
375 l = mdiff.patchedsize(l, self.chunk(x))
376 return l
377 """
346 378
347 def length(self, rev): 379 def length(self, rev):
348 if rev < 0: 380 if rev < 0:
349 return 0 381 return 0
350 else: 382 else:
902 r = self.count() 934 r = self.count()
903 t = r - 1 935 t = r - 1
904 node = None 936 node = None
905 937
906 base = prev = -1 938 base = prev = -1
907 start = end = measure = 0 939 start = end = textlen = 0
908 if r: 940 if r:
909 end = self.end(t) 941 end = self.end(t)
910 942
911 ifh = self.opener(self.indexfile, "a+") 943 ifh = self.opener(self.indexfile, "a+")
912 ifh.seek(0, 2) 944 ifh.seek(0, 2)
947 # current size. 979 # current size.
948 980
949 if chain == prev: 981 if chain == prev:
950 tempd = compress(delta) 982 tempd = compress(delta)
951 cdelta = tempd[0] + tempd[1] 983 cdelta = tempd[0] + tempd[1]
952 984 textlen = mdiff.patchedsize(textlen, delta)
953 if chain != prev or (end - start + len(cdelta)) > measure * 2: 985
986 if chain != prev or (end - start + len(cdelta)) > textlen * 2:
954 # flush our writes here so we can read it in revision 987 # flush our writes here so we can read it in revision
955 if dfh: 988 if dfh:
956 dfh.flush() 989 dfh.flush()
957 ifh.flush() 990 ifh.flush()
958 text = self.revision(chain) 991 text = self.revision(chain)
959 text = self.patches(text, [delta]) 992 text = self.patches(text, [delta])
960 chk = self.addrevision(text, transaction, link, p1, p2) 993 chk = self.addrevision(text, transaction, link, p1, p2)
961 if chk != node: 994 if chk != node:
962 raise RevlogError(_("consistency error adding group")) 995 raise RevlogError(_("consistency error adding group"))
963 measure = len(text) 996 textlen = len(text)
964 else: 997 else:
965 if self.version == 0: 998 if self.version == 0:
966 e = (end, len(cdelta), base, link, p1, p2, node) 999 e = (end, len(cdelta), base, link, p1, p2, node)
967 else: 1000 else:
968 e = (self.offset_type(end, 0), len(cdelta), -1, base, 1001 e = (self.offset_type(end, 0), len(cdelta), textlen, base,
969 link, self.rev(p1), self.rev(p2), node) 1002 link, self.rev(p1), self.rev(p2), node)
970 self.index.append(e) 1003 self.index.append(e)
971 self.nodemap[node] = r 1004 self.nodemap[node] = r
972 if self.inlinedata(): 1005 if self.inlinedata():
973 ifh.write(struct.pack(self.indexformat, *e)) 1006 ifh.write(struct.pack(self.indexformat, *e))