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