Mercurial > hg-stable
changeset 11999:62e2bbf523f2
revlog: generate full revisions when parent node is missing
The full revision is sent if the first parent, against which diff is calculated, is
missing at remote. This happens in the case of shallow clones.
author | Vishakh H <vsh426@gmail.com> |
---|---|
date | Fri, 13 Aug 2010 19:41:51 +0530 |
parents | e789a811c21d |
children | 3361075816f8 |
files | mercurial/revlog.py |
diffstat | 1 files changed, 13 insertions(+), 6 deletions(-) [+] |
line wrap: on
line diff
--- a/mercurial/revlog.py Fri Aug 20 00:17:50 2010 +0200 +++ b/mercurial/revlog.py Fri Aug 13 19:41:51 2010 +0530 @@ -1220,15 +1220,19 @@ self._cache = (node, curr, text) return node - def group(self, nodelist, lookup, infocollect=None): + def group(self, nodelist, lookup, infocollect=None, fullrev=False): """Calculate a delta group, yielding a sequence of changegroup chunks (strings). Given a list of changeset revs, return a set of deltas and - metadata corresponding to nodes. the first delta is - parent(nodes[0]) -> nodes[0] the receiver is guaranteed to - have this parent as it has all history before these - changesets. parent is parent[0] + metadata corresponding to nodes. The first delta is + first parent(nodelist[0]) -> nodelist[0], the receiver is + guaranteed to have this parent as it has all history before + these changesets. In the case firstparent is nullrev the + changegroup starts with a full revision. + fullrev forces the insertion of the full revision, necessary + in the case of shallow clones where the first parent might + not exist at the reciever. """ revs = [self.rev(n) for n in nodelist] @@ -1241,6 +1245,8 @@ # add the parent of the first rev p = self.parentrevs(revs[0])[0] revs.insert(0, p) + if p == nullrev: + fullrev = True # build deltas for d in xrange(len(revs) - 1): @@ -1252,9 +1258,10 @@ p = self.parents(nb) meta = nb + p[0] + p[1] + lookup(nb) - if a == -1: + if fullrev: d = self.revision(nb) meta += mdiff.trivialdiffheader(len(d)) + fullrev = False else: d = self.revdiff(a, b) yield changegroup.chunkheader(len(meta) + len(d))