mercurial/revlog.py
changeset 51089 9c8df10ea6e0
parent 51088 a82704902db8
child 51090 ff673b9da21f
equal deleted inserted replaced
51088:a82704902db8 51089:9c8df10ea6e0
   716             end += (endrev + 1) * self.index.entry_size
   716             end += (endrev + 1) * self.index.entry_size
   717         length = end - start
   717         length = end - start
   718 
   718 
   719         return start, self._segmentfile.read_chunk(start, length)
   719         return start, self._segmentfile.read_chunk(start, length)
   720 
   720 
       
   721     def _chunk(self, rev):
       
   722         """Obtain a single decompressed chunk for a revision.
       
   723 
       
   724         Accepts an integer revision and an optional already-open file handle
       
   725         to be used for reading. If used, the seek position of the file will not
       
   726         be preserved.
       
   727 
       
   728         Returns a str holding uncompressed data for the requested revision.
       
   729         """
       
   730         compression_mode = self.index[rev][10]
       
   731         data = self.get_segment_for_revs(rev, rev)[1]
       
   732         if compression_mode == COMP_MODE_PLAIN:
       
   733             return data
       
   734         elif compression_mode == COMP_MODE_DEFAULT:
       
   735             return self._decompressor(data)
       
   736         elif compression_mode == COMP_MODE_INLINE:
       
   737             return self.decompress(data)
       
   738         else:
       
   739             msg = b'unknown compression mode %d'
       
   740             msg %= compression_mode
       
   741             raise error.RevlogError(msg)
       
   742 
   721 
   743 
   722 class revlog:
   744 class revlog:
   723     """
   745     """
   724     the underlying revision storage object
   746     the underlying revision storage object
   725 
   747 
  2334         returns True if text is different than what is stored.
  2356         returns True if text is different than what is stored.
  2335         """
  2357         """
  2336         p1, p2 = self.parents(node)
  2358         p1, p2 = self.parents(node)
  2337         return storageutil.hashrevisionsha1(text, p1, p2) != node
  2359         return storageutil.hashrevisionsha1(text, p1, p2) != node
  2338 
  2360 
  2339     def _chunk(self, rev):
       
  2340         """Obtain a single decompressed chunk for a revision.
       
  2341 
       
  2342         Accepts an integer revision and an optional already-open file handle
       
  2343         to be used for reading. If used, the seek position of the file will not
       
  2344         be preserved.
       
  2345 
       
  2346         Returns a str holding uncompressed data for the requested revision.
       
  2347         """
       
  2348         compression_mode = self.index[rev][10]
       
  2349         data = self._inner.get_segment_for_revs(rev, rev)[1]
       
  2350         if compression_mode == COMP_MODE_PLAIN:
       
  2351             return data
       
  2352         elif compression_mode == COMP_MODE_DEFAULT:
       
  2353             return self._inner._decompressor(data)
       
  2354         elif compression_mode == COMP_MODE_INLINE:
       
  2355             return self._inner.decompress(data)
       
  2356         else:
       
  2357             msg = b'unknown compression mode %d'
       
  2358             msg %= compression_mode
       
  2359             raise error.RevlogError(msg)
       
  2360 
       
  2361     def _chunks(self, revs, targetsize=None):
  2361     def _chunks(self, revs, targetsize=None):
  2362         """Obtain decompressed chunks for the specified revisions.
  2362         """Obtain decompressed chunks for the specified revisions.
  2363 
  2363 
  2364         Accepts an iterable of numeric revisions that are assumed to be in
  2364         Accepts an iterable of numeric revisions that are assumed to be in
  2365         ascending order. Also accepts an optional already-open file handle
  2365         ascending order. Also accepts an optional already-open file handle
  2402                     lastrev,
  2402                     lastrev,
  2403                 )
  2403                 )
  2404             except OverflowError:
  2404             except OverflowError:
  2405                 # issue4215 - we can't cache a run of chunks greater than
  2405                 # issue4215 - we can't cache a run of chunks greater than
  2406                 # 2G on Windows
  2406                 # 2G on Windows
  2407                 return [self._chunk(rev) for rev in revschunk]
  2407                 return [self._inner._chunk(rev) for rev in revschunk]
  2408 
  2408 
  2409             decomp = self._inner.decompress
  2409             decomp = self._inner.decompress
  2410             # self._decompressor might be None, but will not be used in that case
  2410             # self._decompressor might be None, but will not be used in that case
  2411             def_decomp = self._inner._decompressor
  2411             def_decomp = self._inner._decompressor
  2412             for rev in revschunk:
  2412             for rev in revschunk:
  2482 
  2482 
  2483         The delta calculated is in binary form and is intended to be written to
  2483         The delta calculated is in binary form and is intended to be written to
  2484         revlog data directly. So this function needs raw revision data.
  2484         revlog data directly. So this function needs raw revision data.
  2485         """
  2485         """
  2486         if rev1 != nullrev and self.deltaparent(rev2) == rev1:
  2486         if rev1 != nullrev and self.deltaparent(rev2) == rev1:
  2487             return bytes(self._chunk(rev2))
  2487             return bytes(self._inner._chunk(rev2))
  2488 
  2488 
  2489         return mdiff.textdiff(self.rawdata(rev1), self.rawdata(rev2))
  2489         return mdiff.textdiff(self.rawdata(rev1), self.rawdata(rev2))
  2490 
  2490 
  2491     def revision(self, nodeorrev):
  2491     def revision(self, nodeorrev):
  2492         """return an uncompressed revision of a given node or revision
  2492         """return an uncompressed revision of a given node or revision
  3679                 )
  3679                 )
  3680             else:
  3680             else:
  3681                 if destrevlog.delta_config.lazy_delta:
  3681                 if destrevlog.delta_config.lazy_delta:
  3682                     dp = self.deltaparent(rev)
  3682                     dp = self.deltaparent(rev)
  3683                     if dp != nullrev:
  3683                     if dp != nullrev:
  3684                         cachedelta = (dp, bytes(self._chunk(rev)))
  3684                         cachedelta = (dp, bytes(self._inner._chunk(rev)))
  3685 
  3685 
  3686                 sidedata = None
  3686                 sidedata = None
  3687                 if not cachedelta:
  3687                 if not cachedelta:
  3688                     try:
  3688                     try:
  3689                         rawtext = self._revisiondata(rev)
  3689                         rawtext = self._revisiondata(rev)