comparison mercurial/revlog.py @ 1458:1033892bbb87

This changes the revlog.group and re-implements the localrepo.changeroup function in terms of it. revlog.group now takes a list of nodes, and some callback functions instead of a linkmap.
author Eric Hopper <hopper@omnifarious.org>
date Fri, 07 Oct 2005 10:57:11 -0700
parents 518da3c3b6ce
children 106fdec8e1fb
comparison
equal deleted inserted replaced
1457:518da3c3b6ce 1458:1033892bbb87
620 gy = y.next() 620 gy = y.next()
621 else: 621 else:
622 #print "next x" 622 #print "next x"
623 gx = x.next() 623 gx = x.next()
624 624
625 def group(self, linkmap): 625 def group(self, nodelist, lookup, infocollect = None):
626 """calculate a delta group 626 """calculate a delta group
627 627
628 Given a list of changeset revs, return a set of deltas and 628 Given a list of changeset revs, return a set of deltas and
629 metadata corresponding to nodes. the first delta is 629 metadata corresponding to nodes. the first delta is
630 parent(nodes[0]) -> nodes[0] the receiver is guaranteed to 630 parent(nodes[0]) -> nodes[0] the receiver is guaranteed to
631 have this parent as it has all history before these 631 have this parent as it has all history before these
632 changesets. parent is parent[0] 632 changesets. parent is parent[0]
633 """ 633 """
634 revs = [] 634 revs = [self.rev(n) for n in nodelist]
635 needed = {} 635 needed = dict.fromkeys(revs, 1)
636
637 # find file nodes/revs that match changeset revs
638 for i in xrange(0, self.count()):
639 if self.index[i][3] in linkmap:
640 revs.append(i)
641 needed[i] = 1
642 636
643 # if we don't have any revisions touched by these changesets, bail 637 # if we don't have any revisions touched by these changesets, bail
644 if not revs: 638 if not revs:
645 yield struct.pack(">l", 0) 639 yield struct.pack(">l", 0)
646 return 640 return
704 deltas = [] 698 deltas = []
705 for d in xrange(0, len(revs) - 1): 699 for d in xrange(0, len(revs) - 1):
706 a, b = revs[d], revs[d + 1] 700 a, b = revs[d], revs[d + 1]
707 n = self.node(b) 701 n = self.node(b)
708 702
703 if infocollect is not None:
704 infocollect(n)
705
709 # do we need to construct a new delta? 706 # do we need to construct a new delta?
710 if a + 1 != b or self.base(b) == b: 707 if a + 1 != b or self.base(b) == b:
711 if a >= 0: 708 if a >= 0:
712 base = self.base(a) 709 base = self.base(a)
713 ta = chunks[self.base(a)] 710 ta = chunks[self.base(a)]
725 d = self.diff(ta, tb) 722 d = self.diff(ta, tb)
726 else: 723 else:
727 d = chunks[b] 724 d = chunks[b]
728 725
729 p = self.parents(n) 726 p = self.parents(n)
730 meta = n + p[0] + p[1] + linkmap[self.linkrev(n)] 727 meta = n + p[0] + p[1] + lookup(n)
731 l = struct.pack(">l", len(meta) + len(d) + 4) 728 l = struct.pack(">l", len(meta) + len(d) + 4)
732 yield l 729 yield l
733 yield meta 730 yield meta
734 yield d 731 yield d
735 732