##// END OF EJS Templates
linelog: add replacelines_vec for fastannotate...
Augie Fackler -
r38960:6fed8b32 default
parent child Browse files
Show More
@@ -280,7 +280,11 b' class linelog(object):'
280 280 self._maxrev = 0
281 281 self._lastannotate = None
282 282
283 def replacelines(self, rev, a1, a2, b1, b2):
283 def replacelines_vec(self, rev, a1, a2, blines):
284 return self.replacelines(rev, a1, a2, 0, len(blines),
285 _internal_blines=blines)
286
287 def replacelines(self, rev, a1, a2, b1, b2, _internal_blines=None):
284 288 """Replace lines [a1, a2) with lines [b1, b2)."""
285 289 if self._lastannotate:
286 290 # TODO(augie): make replacelines() accept a revision at
@@ -315,7 +319,10 b' class linelog(object):'
315 319 # Jump to skip the insert if we're at an older revision.
316 320 appendinst(_jl(rev, tgt))
317 321 for linenum in pycompat.xrange(b1, b2):
318 appendinst(_line(rev, linenum))
322 if _internal_blines is None:
323 appendinst(_line(rev, linenum))
324 else:
325 appendinst(_line(*_internal_blines[linenum]))
319 326 # delete
320 327 if a1 < a2:
321 328 if a2 > len(ar.lines):
@@ -6,6 +6,7 b' import unittest'
6 6
7 7 from mercurial import linelog
8 8
9 vecratio = 3 # number of replacelines / number of replacelines_vec
9 10 maxlinenum = 0xffffff
10 11 maxb1 = 0xffffff
11 12 maxdeltaa = 10
@@ -21,9 +22,14 b' def _genedits(seed, endrev):'
21 22 a2 = random.randint(a1, min(n, a1 + maxdeltaa))
22 23 b1 = random.randint(0, maxb1)
23 24 b2 = random.randint(b1, b1 + maxdeltab)
24 blines = [(rev, idx) for idx in range(b1, b2)]
25 usevec = not bool(random.randint(0, vecratio))
26 if usevec:
27 blines = [(random.randint(0, rev), random.randint(0, maxlinenum))
28 for _ in range(b1, b2)]
29 else:
30 blines = [(rev, bidx) for bidx in range(b1, b2)]
25 31 lines[a1:a2] = blines
26 yield lines, rev, a1, a2, b1, b2
32 yield lines, rev, a1, a2, b1, b2, blines, usevec
27 33
28 34 class linelogtests(unittest.TestCase):
29 35 def testlinelogencodedecode(self):
@@ -159,12 +165,17 b' class linelogtests(unittest.TestCase):'
159 165 numrevs = 2000
160 166 ll = linelog.linelog()
161 167 # Populate linelog
162 for lines, rev, a1, a2, b1, b2 in _genedits(seed, numrevs):
163 ll.replacelines(rev, a1, a2, b1, b2)
168 for lines, rev, a1, a2, b1, b2, blines, usevec in _genedits(
169 seed, numrevs):
170 if usevec:
171 ll.replacelines_vec(rev, a1, a2, blines)
172 else:
173 ll.replacelines(rev, a1, a2, b1, b2)
164 174 ar = ll.annotate(rev)
165 175 self.assertEqual(ll.annotateresult, lines)
166 176 # Verify we can get back these states by annotating each rev
167 for lines, rev, a1, a2, b1, b2 in _genedits(seed, numrevs):
177 for lines, rev, a1, a2, b1, b2, blines, usevec in _genedits(
178 seed, numrevs):
168 179 ar = ll.annotate(rev)
169 180 self.assertEqual([(l.rev, l.linenum) for l in ar], lines)
170 181
General Comments 0
You need to be logged in to leave comments. Login now