Mercurial > public > mercurial-scm > hg
comparison mercurial/revlog.py @ 1941:7518823709a2
revlog.py: factorization and fixes for rev < 0 (nullid)
author | Benoit Boissinot <benoit.boissinot@ens-lyon.org> |
---|---|
date | Mon, 13 Mar 2006 03:54:23 +0100 |
parents | 5ac811b720de |
children | 736b6c96bbbc |
comparison
equal
deleted
inserted
replaced
1940:7ae177a70f54 | 1941:7518823709a2 |
---|---|
252 def linkrev(self, node): return self.index[self.rev(node)][3] | 252 def linkrev(self, node): return self.index[self.rev(node)][3] |
253 def parents(self, node): | 253 def parents(self, node): |
254 if node == nullid: return (nullid, nullid) | 254 if node == nullid: return (nullid, nullid) |
255 return self.index[self.rev(node)][4:6] | 255 return self.index[self.rev(node)][4:6] |
256 | 256 |
257 def start(self, rev): return self.index[rev][0] | 257 def start(self, rev): return (rev < 0) and -1 or self.index[rev][0] |
258 def length(self, rev): return self.index[rev][1] | 258 def length(self, rev): |
259 if rev < 0: | |
260 return 0 | |
261 else: | |
262 return self.index[rev][1] | |
259 def end(self, rev): return self.start(rev) + self.length(rev) | 263 def end(self, rev): return self.start(rev) + self.length(rev) |
260 def base(self, rev): return self.index[rev][2] | 264 def base(self, rev): return (rev < 0) and rev or self.index[rev][2] |
261 | 265 |
262 def reachable(self, rev, stop=None): | 266 def reachable(self, rev, stop=None): |
263 reachable = {} | 267 reachable = {} |
264 visit = [rev] | 268 visit = [rev] |
265 reachable[rev] = 1 | 269 reachable[rev] = 1 |
526 return decompress(self.chunkcache[1][offset:offset + length]) | 530 return decompress(self.chunkcache[1][offset:offset + length]) |
527 | 531 |
528 def delta(self, node): | 532 def delta(self, node): |
529 """return or calculate a delta between a node and its predecessor""" | 533 """return or calculate a delta between a node and its predecessor""" |
530 r = self.rev(node) | 534 r = self.rev(node) |
531 b = self.base(r) | 535 return self.revdiff(r - 1, r) |
532 if r == b: | 536 |
533 return self.diff(self.revision(self.node(r - 1)), | 537 def revdiff(self, rev1, rev2): |
534 self.revision(node)) | 538 """return or calculate a delta between two revisions""" |
535 else: | 539 b1 = self.base(rev1) |
536 return self.chunk(r) | 540 b2 = self.base(rev2) |
541 if b1 == b2 and rev1 + 1 == rev2: | |
542 return self.chunk(rev2) | |
543 else: | |
544 return self.diff(self.revision(self.node(rev1)), | |
545 self.revision(self.node(rev2))) | |
537 | 546 |
538 def revision(self, node): | 547 def revision(self, node): |
539 """return an uncompressed revision of a given""" | 548 """return an uncompressed revision of a given""" |
540 if node == nullid: return "" | 549 if node == nullid: return "" |
541 if self.cache and self.cache[0] == node: return self.cache[2] | 550 if self.cache and self.cache[0] == node: return self.cache[2] |
554 | 563 |
555 bins = [] | 564 bins = [] |
556 for r in xrange(base + 1, rev + 1): | 565 for r in xrange(base + 1, rev + 1): |
557 bins.append(self.chunk(r)) | 566 bins.append(self.chunk(r)) |
558 | 567 |
559 text = mdiff.patches(text, bins) | 568 text = self.patches(text, bins) |
560 | 569 |
561 p1, p2 = self.parents(node) | 570 p1, p2 = self.parents(node) |
562 if node != hash(text, p1, p2): | 571 if node != hash(text, p1, p2): |
563 raise RevlogError(_("integrity check failed on %s:%d") | 572 raise RevlogError(_("integrity check failed on %s:%d") |
564 % (self.datafile, rev)) | 573 % (self.datafile, rev)) |
707 revs.insert(0, self.rev(p)) | 716 revs.insert(0, self.rev(p)) |
708 | 717 |
709 # build deltas | 718 # build deltas |
710 for d in xrange(0, len(revs) - 1): | 719 for d in xrange(0, len(revs) - 1): |
711 a, b = revs[d], revs[d + 1] | 720 a, b = revs[d], revs[d + 1] |
712 na = self.node(a) | |
713 nb = self.node(b) | 721 nb = self.node(b) |
714 | 722 |
715 if infocollect is not None: | 723 if infocollect is not None: |
716 infocollect(nb) | 724 infocollect(nb) |
717 | 725 |
718 # do we need to construct a new delta? | 726 d = self.revdiff(a, b) |
719 if a + 1 != b or self.base(b) == b: | |
720 ta = self.revision(na) | |
721 tb = self.revision(nb) | |
722 d = self.diff(ta, tb) | |
723 else: | |
724 d = self.chunk(b) | |
725 | |
726 p = self.parents(nb) | 727 p = self.parents(nb) |
727 meta = nb + p[0] + p[1] + lookup(nb) | 728 meta = nb + p[0] + p[1] + lookup(nb) |
728 l = struct.pack(">l", len(meta) + len(d) + 4) | 729 l = struct.pack(">l", len(meta) + len(d) + 4) |
729 yield l | 730 yield l |
730 yield meta | 731 yield meta |