D2068: revlog: do not use delta for lfs revisions
quark (Jun Wu)
phabricator at mercurial-scm.org
Thu Feb 8 00:35:43 UTC 2018
quark updated this revision to Diff 5328.
REPOSITORY
rHG Mercurial
CHANGES SINCE LAST UPDATE
https://phab.mercurial-scm.org/D2068?vs=5274&id=5328
REVISION DETAIL
https://phab.mercurial-scm.org/D2068
AFFECTED FILES
mercurial/revlog.py
tests/test-lfs-bundle.t
tests/test-revlog-raw.py
CHANGE DETAILS
diff --git a/tests/test-revlog-raw.py b/tests/test-revlog-raw.py
--- a/tests/test-revlog-raw.py
+++ b/tests/test-revlog-raw.py
@@ -114,6 +114,8 @@
else:
# suboptimal deltaparent
deltaparent = min(0, parentrev)
+ if not rlog.candelta(deltaparent, r):
+ deltaparent = -1
return {'node': rlog.node(r), 'p1': pnode, 'p2': node.nullid,
'cs': rlog.node(rlog.linkrev(r)), 'flags': rlog.flags(r),
'deltabase': rlog.node(deltaparent),
@@ -151,12 +153,12 @@
for r in rlog:
p1 = rlog.node(r - 1)
p2 = node.nullid
- if r == 0:
+ if r == 0 or rlog.flags(r):
text = rlog.revision(r, raw=True)
cachedelta = None
else:
- # deltaparent is more interesting if it has the EXTSTORED flag.
- deltaparent = max([0] + [p for p in range(r - 2) if rlog.flags(p)])
+ # deltaparent cannot have EXTSTORED flag.
+ deltaparent = max([-1] + [p for p in range(r) if not rlog.flags(p)])
text = None
cachedelta = (deltaparent, rlog.revdiff(deltaparent, r))
flags = rlog.flags(r)
@@ -262,8 +264,9 @@
result.append((text, rawtext))
# Verify flags like isdelta, isext work as expected
- if bool(rlog.deltaparent(rev) > -1) != isdelta:
- abort('rev %d: isdelta is ineffective' % rev)
+ # isdelta can be overridden to False if this or p1 has isext set
+ if bool(rlog.deltaparent(rev) > -1) and not isdelta:
+ abort('rev %d: isdelta is unexpected' % rev)
if bool(rlog.flags(rev)) != isext:
abort('rev %d: isext is ineffective' % rev)
return result
diff --git a/tests/test-lfs-bundle.t b/tests/test-lfs-bundle.t
--- a/tests/test-lfs-bundle.t
+++ b/tests/test-lfs-bundle.t
@@ -90,10 +90,7 @@
---- Applying src-normal.bundle to dst-normal ----
OK
---- Applying src-normal.bundle to dst-lfs ----
- X at 2: unpacking bcc7d23fa6b7: integrity check failed on data/X.i:2
- Y at 2: unpacking 46017a6640e7: integrity check failed on data/Y.i:2
- 2 integrity errors encountered!
- (first damaged changeset appears to be 2)
+ CRASHED
---- Applying src-lfs.bundle to dst-normal ----
OK
---- Applying src-lfs.bundle to dst-lfs ----
diff --git a/mercurial/revlog.py b/mercurial/revlog.py
--- a/mercurial/revlog.py
+++ b/mercurial/revlog.py
@@ -404,6 +404,9 @@
for candidaterevs in self._getcandidaterevs(p1, p2, cachedelta):
nominateddeltas = []
for candidaterev in candidaterevs:
+ # no delta for flag processor revision (see "candelta" for why)
+ if revlog.flags(candidaterev) & REVIDX_KNOWN_FLAGS:
+ continue
candidatedelta = self._builddeltainfo(revinfo, candidaterev, fh)
if revlog._isgooddeltainfo(candidatedelta, revinfo.textlen):
nominateddeltas.append(candidatedelta)
@@ -2087,7 +2090,12 @@
deltacomputer = _deltacomputer(self)
revinfo = _revisioninfo(node, p1, p2, btext, textlen, cachedelta, flags)
- deltainfo = deltacomputer.finddeltainfo(revinfo, fh)
+
+ # no delta for flag processor revision (see "candelta" for why)
+ if flags & REVIDX_KNOWN_FLAGS:
+ deltainfo = deltacomputer.finddeltainfo(revinfo, fh)
+ else:
+ deltainfo = None
if deltainfo is not None:
base = deltainfo.base
To: quark, indygreg, #hg-reviewers
Cc: mercurial-devel
More information about the Mercurial-devel
mailing list