Mercurial > hg > mercurial-crew-with-dirclash
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)) |