equal
deleted
inserted
replaced
261 length = revlog.length |
261 length = revlog.length |
262 |
262 |
263 if endidx is None: |
263 if endidx is None: |
264 endidx = len(revs) |
264 endidx = len(revs) |
265 |
265 |
266 # Trim empty revs at the end, but never the very first revision of a chain |
266 # If we have a non-emtpy delta candidate, there are nothing to trim |
267 while endidx > 1 and endidx > startidx and length(revs[endidx - 1]) == 0: |
267 if revs[endidx - 1] < len(revlog): |
268 endidx -= 1 |
268 # Trim empty revs at the end, except the very first revision of a chain |
|
269 while (endidx > 1 |
|
270 and endidx > startidx |
|
271 and length(revs[endidx - 1]) == 0): |
|
272 endidx -= 1 |
269 |
273 |
270 return revs[startidx:endidx] |
274 return revs[startidx:endidx] |
271 |
275 |
272 def _segmentspan(revlog, revs): |
276 def _segmentspan(revlog, revs, deltainfo=None): |
273 """Get the byte span of a segment of revisions |
277 """Get the byte span of a segment of revisions |
274 |
278 |
275 revs is a sorted array of revision numbers |
279 revs is a sorted array of revision numbers |
276 |
280 |
277 >>> revlog = _testrevlog([ |
281 >>> revlog = _testrevlog([ |
293 >>> _segmentspan(revlog, [1, 3]) |
297 >>> _segmentspan(revlog, [1, 3]) |
294 7 |
298 7 |
295 """ |
299 """ |
296 if not revs: |
300 if not revs: |
297 return 0 |
301 return 0 |
298 return revlog.end(revs[-1]) - revlog.start(revs[0]) |
302 if deltainfo is not None and len(revlog) <= revs[-1]: |
|
303 if len(revs) == 1: |
|
304 return deltainfo.deltalen |
|
305 offset = revlog.end(len(revlog) - 1) |
|
306 end = deltainfo.deltalen + offset |
|
307 else: |
|
308 end = revlog.end(revs[-1]) |
|
309 return end - revlog.start(revs[0]) |
299 |
310 |
300 def _slicechunk(revlog, revs, deltainfo=None, targetsize=None): |
311 def _slicechunk(revlog, revs, deltainfo=None, targetsize=None): |
301 """slice revs to reduce the amount of unrelated data to be read from disk. |
312 """slice revs to reduce the amount of unrelated data to be read from disk. |
302 |
313 |
303 ``revs`` is sliced into groups that should be read in one time. |
314 ``revs`` is sliced into groups that should be read in one time. |
525 |
536 |
526 if density >= targetdensity: |
537 if density >= targetdensity: |
527 yield revs |
538 yield revs |
528 return |
539 return |
529 |
540 |
530 if deltainfo is not None: |
541 if deltainfo is not None and deltainfo.deltalen: |
531 revs = list(revs) |
542 revs = list(revs) |
532 revs.append(nextrev) |
543 revs.append(nextrev) |
533 |
544 |
534 # Store the gaps in a heap to have them sorted by decreasing size |
545 # Store the gaps in a heap to have them sorted by decreasing size |
535 gapsheap = [] |
546 gapsheap = [] |
2469 deltachain = self._deltachain(base)[0] |
2480 deltachain = self._deltachain(base)[0] |
2470 else: |
2481 else: |
2471 deltachain = [] |
2482 deltachain = [] |
2472 |
2483 |
2473 chunks = _slicechunk(self, deltachain, deltainfo) |
2484 chunks = _slicechunk(self, deltachain, deltainfo) |
2474 distance = max(map(lambda revs:_segmentspan(self, revs), chunks)) |
2485 all_span = [_segmentspan(self, revs, deltainfo) for revs in chunks] |
|
2486 distance = max(all_span) |
2475 else: |
2487 else: |
2476 distance = deltainfo.distance |
2488 distance = deltainfo.distance |
2477 |
2489 |
2478 textlen = revinfo.textlen |
2490 textlen = revinfo.textlen |
2479 defaultmax = textlen * 4 |
2491 defaultmax = textlen * 4 |