[PATCH 02 of 10 V2] revlog: fix pure python slicing code when chain contains nullrev
Boris Feld
boris.feld at octobus.net
Fri Dec 21 06:47:05 EST 2018
# HG changeset patch
# User Boris Feld <boris.feld at octobus.net>
# Date 1545296356 -3600
# Thu Dec 20 09:59:16 2018 +0100
# Node ID df9b79e863d6e5215175487330b1469067e20bbd
# Parent d51d82a46d9545235be727b875deeffd9de324e9
# EXP-Topic sparse-revlog
# Available At https://bitbucket.org/octobus/mercurial-devel/
# hg pull https://bitbucket.org/octobus/mercurial-devel/ -r df9b79e863d6
revlog: fix pure python slicing code when chain contains nullrev
We fixed the C code, but the python code still misbehaved.
diff --git a/mercurial/revlogutils/deltas.py b/mercurial/revlogutils/deltas.py
--- a/mercurial/revlogutils/deltas.py
+++ b/mercurial/revlogutils/deltas.py
@@ -116,6 +116,12 @@ def slicechunk(revlog, revs, targetsize=
[[0], [11], [13], [15]]
>>> list(slicechunk(revlog, [0, 11, 13, 15], targetsize=20))
[[0], [11], [13, 15]]
+
+ Slicing involving nullrev
+ >>> list(slicechunk(revlog, [-1, 0, 11, 13, 15], targetsize=20))
+ [[-1, 0], [11], [13, 15]]
+ >>> list(slicechunk(revlog, [-1, 13, 15], targetsize=5))
+ [[-1, 13, 15]]
"""
if targetsize is not None:
targetsize = max(targetsize, revlog._srmingapsize)
@@ -363,6 +369,8 @@ def _slicechunktodensity(revlog, revs, t
gaps = []
prevend = None
for i, rev in enumerate(revs):
+ if rev == nullrev:
+ continue
revstart = start(rev)
revlen = length(rev)
@@ -490,7 +498,11 @@ def segmentspan(revlog, revs):
if not revs:
return 0
end = revlog.end(revs[-1])
- return end - revlog.start(revs[0])
+ i = 0
+ while revs[i] == nullrev:
+ i += 1
+ startrev = revs[i]
+ return end - revlog.start(startrev)
def _textfromdelta(fh, revlog, baserev, delta, p1, p2, flags, expectednode):
"""build full text from a (base, delta) pair and other metadata"""
More information about the Mercurial-devel
mailing list