291 """ |
291 """ |
292 if not revs: |
292 if not revs: |
293 return 0 |
293 return 0 |
294 return revlog.end(revs[-1]) - revlog.start(revs[0]) |
294 return revlog.end(revs[-1]) - revlog.start(revs[0]) |
295 |
295 |
296 def _slicechunk(revlog, revs): |
296 def _slicechunk(revlog, revs, targetsize=None): |
297 """slice revs to reduce the amount of unrelated data to be read from disk. |
297 """slice revs to reduce the amount of unrelated data to be read from disk. |
298 |
298 |
299 ``revs`` is sliced into groups that should be read in one time. |
299 ``revs`` is sliced into groups that should be read in one time. |
300 Assume that revs are sorted. |
300 Assume that revs are sorted. |
301 |
301 |
302 The initial chunk is sliced until the overall density (payload/chunks-span |
302 The initial chunk is sliced until the overall density (payload/chunks-span |
303 ratio) is above `revlog._srdensitythreshold`. No gap smaller than |
303 ratio) is above `revlog._srdensitythreshold`. No gap smaller than |
304 `revlog._srmingapsize` is skipped. |
304 `revlog._srmingapsize` is skipped. |
|
305 |
|
306 If `targetsize` is set, no chunk larger than `targetsize` will be yield. |
|
307 For consistency with other slicing choice, this limit won't go lower than |
|
308 `revlog._srmingapsize`. |
|
309 |
|
310 If individual revisions chunk are larger than this limit, they will still |
|
311 be raised individually. |
305 |
312 |
306 >>> revlog = _testrevlog([ |
313 >>> revlog = _testrevlog([ |
307 ... 5, #00 (5) |
314 ... 5, #00 (5) |
308 ... 10, #01 (5) |
315 ... 10, #01 (5) |
309 ... 12, #02 (2) |
316 ... 12, #02 (2) |
330 [[0], [11], [15]] |
337 [[0], [11], [15]] |
331 >>> list(_slicechunk(revlog, [0, 11, 13, 15])) |
338 >>> list(_slicechunk(revlog, [0, 11, 13, 15])) |
332 [[0], [11, 13, 15]] |
339 [[0], [11, 13, 15]] |
333 >>> list(_slicechunk(revlog, [1, 2, 3, 5, 8, 10, 11, 14])) |
340 >>> list(_slicechunk(revlog, [1, 2, 3, 5, 8, 10, 11, 14])) |
334 [[1, 2], [5, 8, 10, 11], [14]] |
341 [[1, 2], [5, 8, 10, 11], [14]] |
|
342 |
|
343 Slicing with a maximum chunk size |
|
344 >>> list(_slicechunk(revlog, [0, 11, 13, 15], 15)) |
|
345 [[0], [11], [13], [15]] |
|
346 >>> list(_slicechunk(revlog, [0, 11, 13, 15], 20)) |
|
347 [[0], [11], [13, 15]] |
335 """ |
348 """ |
|
349 if targetsize is not None: |
|
350 targetsize = max(targetsize, revlog._srmingapsize) |
336 for chunk in _slicechunktodensity(revlog, revs, |
351 for chunk in _slicechunktodensity(revlog, revs, |
337 revlog._srdensitythreshold, |
352 revlog._srdensitythreshold, |
338 revlog._srmingapsize): |
353 revlog._srmingapsize): |
339 yield chunk |
354 for subchunk in _slicechunktosize(revlog, chunk, targetsize): |
|
355 yield subchunk |
340 |
356 |
341 def _slicechunktosize(revlog, revs, targetsize): |
357 def _slicechunktosize(revlog, revs, targetsize): |
342 """slice revs to match the target size |
358 """slice revs to match the target size |
343 |
359 |
344 This is intended to be used on chunk that density slicing selected by that |
360 This is intended to be used on chunk that density slicing selected by that |