Comments
Patch
@@ -349,7 +349,7 @@
uncompressed size of bundle content:
* (changelog) (glob)
* (manifests) (glob)
- * a (glob)
+ * a (glob)
$ hg --config extensions.strip= strip -r 2 --no-backup --force -q
$ hg -R bundle.hg log -p -T '{rev} {desc}\n' a
5 branching
@@ -95,6 +95,6 @@
2 integrity errors encountered!
(first damaged changeset appears to be 2)
---- Applying src-lfs.bundle to dst-normal ----
- CRASHED
+ OK
---- Applying src-lfs.bundle to dst-lfs ----
OK
@@ -713,6 +713,13 @@
except KeyError:
return False
+ def candelta(self, baserev, rev):
+ """whether two revisions (prev, rev) can be delta-ed or not"""
+ # disable delta if either rev uses non-default flag (ex. LFS)
+ if self.flags(baserev) or self.flags(rev):
+ return False
+ return True
+
def clearcaches(self):
self._cache = None
self._chainbasecache.clear()
@@ -770,6 +770,8 @@
progress(msgbundling, None)
def deltaparent(self, revlog, rev, p1, p2, prev):
+ if not revlog.candelta(prev, rev):
+ raise error.ProgrammingError('cg1 should not be used in this case')
return prev
def revchunk(self, revlog, rev, prev, linknode):
@@ -829,16 +831,19 @@
# expensive. The revlog caches should have prev cached, meaning
# less CPU for changegroup generation. There is likely room to add
# a flag and/or config option to control this behavior.
- return prev
+ base = prev
elif dp == nullrev:
# revlog is configured to use full snapshot for a reason,
# stick to full snapshot.
- return nullrev
+ base = nullrev
elif dp not in (p1, p2, prev):
# Pick prev when we can't be sure remote has the base revision.
return prev
else:
- return dp
+ base = dp
+ if base != nullrev and not revlog.candelta(base, rev):
+ base = nullrev
+ return base
def builddeltaheader(self, node, p1n, p2n, basenode, linknode, flags):
# Do nothing with flags, it is implicitly 0 in cg1 and cg2