mercurial/revlog.py
changeset 39147 b95b48a55c36
parent 39144 5f924aa0567c
parent 39139 3730b779ed5b
child 39149 f8db458651c8
equal deleted inserted replaced
39145:b623c7b23695 39147:b95b48a55c36
   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