mercurial/revlog.py
changeset 38643 967fee55e8d9
parent 38642 e59e27e52297
child 38644 43d0619cec90
equal deleted inserted replaced
38642:e59e27e52297 38643:967fee55e8d9
   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