Mercurial > public > mercurial-scm > hg-stable
diff mercurial/changegroup.py @ 35839:d031609b3cb7 stable
changegroup: do not delta lfs revisions
There is no way to distinguish whether a delta base is LFS or non-LFS.
If the delta is against LFS rawtext, and the client trying to apply it has
the base revision stored as fulltext, the delta (aka. bundle) will fail to
apply.
This patch forbids using delta for LFS revisions in changegroup so bad
deltas won't be transmitted.
Note: this does not solve the problem entirely. It solves LFS delta applying
to non-LFS base. But the other direction: non-LFS delta applying to LFS base
is not solved yet.
Differential Revision: https://phab.mercurial-scm.org/D2067
author | Jun Wu <quark@fb.com> |
---|---|
date | Tue, 06 Feb 2018 19:08:25 -0800 |
parents | fb0be099063f |
children | 7bf80d9d9543 |
line wrap: on
line diff
--- a/mercurial/changegroup.py Tue Feb 06 16:08:57 2018 -0800 +++ b/mercurial/changegroup.py Tue Feb 06 19:08:25 2018 -0800 @@ -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