mercurial/revlogutils/docket.py
changeset 47255 ff9fd7107d11
parent 47242 4abd474a10af
child 47266 921648d31553
equal deleted inserted replaced
47254:eac3591abbf4 47255:ff9fd7107d11
    19 
    19 
    20 import struct
    20 import struct
    21 
    21 
    22 from .. import (
    22 from .. import (
    23     error,
    23     error,
       
    24     util,
    24 )
    25 )
    25 
    26 
    26 from . import (
    27 from . import (
    27     constants,
    28     constants,
    28 )
    29 )
    34 #          |   revlog index header.
    35 #          |   revlog index header.
    35 # * 8 bytes: size of index-data
    36 # * 8 bytes: size of index-data
    36 # * 8 bytes: pending size of index-data
    37 # * 8 bytes: pending size of index-data
    37 # * 8 bytes: size of data
    38 # * 8 bytes: size of data
    38 # * 8 bytes: pending size of data
    39 # * 8 bytes: pending size of data
    39 S_HEADER = struct.Struct(constants.INDEX_HEADER.format + 'LLLL')
    40 # * 1 bytes: default compression header
       
    41 S_HEADER = struct.Struct(constants.INDEX_HEADER.format + 'LLLLc')
    40 
    42 
    41 
    43 
    42 class RevlogDocket(object):
    44 class RevlogDocket(object):
    43     """metadata associated with revlog"""
    45     """metadata associated with revlog"""
    44 
    46 
    49         version_header=None,
    51         version_header=None,
    50         index_end=0,
    52         index_end=0,
    51         pending_index_end=0,
    53         pending_index_end=0,
    52         data_end=0,
    54         data_end=0,
    53         pending_data_end=0,
    55         pending_data_end=0,
       
    56         default_compression_header=None,
    54     ):
    57     ):
    55         self._version_header = version_header
    58         self._version_header = version_header
    56         self._read_only = bool(use_pending)
    59         self._read_only = bool(use_pending)
    57         self._dirty = False
    60         self._dirty = False
    58         self._radix = revlog.radix
    61         self._radix = revlog.radix
    69             self._index_end = self._pending_index_end
    72             self._index_end = self._pending_index_end
    70             self._data_end = self._pending_data_end
    73             self._data_end = self._pending_data_end
    71         else:
    74         else:
    72             self._index_end = self._initial_index_end
    75             self._index_end = self._initial_index_end
    73             self._data_end = self._initial_data_end
    76             self._data_end = self._initial_data_end
       
    77         self.default_compression_header = default_compression_header
    74 
    78 
    75     def index_filepath(self):
    79     def index_filepath(self):
    76         """file path to the current index file associated to this docket"""
    80         """file path to the current index file associated to this docket"""
    77         # very simplistic version at first
    81         # very simplistic version at first
    78         return b"%s.idx" % self._radix
    82         return b"%s.idx" % self._radix
   132             self._version_header,
   136             self._version_header,
   133             official_index_end,
   137             official_index_end,
   134             self._index_end,
   138             self._index_end,
   135             official_data_end,
   139             official_data_end,
   136             self._data_end,
   140             self._data_end,
       
   141             self.default_compression_header,
   137         )
   142         )
   138         return S_HEADER.pack(*data)
   143         return S_HEADER.pack(*data)
   139 
   144 
   140 
   145 
   141 def default_docket(revlog, version_header):
   146 def default_docket(revlog, version_header):
   142     """given a revlog version a new docket object for the given revlog"""
   147     """given a revlog version a new docket object for the given revlog"""
   143     if (version_header & 0xFFFF) != constants.REVLOGV2:
   148     if (version_header & 0xFFFF) != constants.REVLOGV2:
   144         return None
   149         return None
   145     docket = RevlogDocket(revlog, version_header=version_header)
   150     comp = util.compengines[revlog._compengine].revlogheader()
       
   151     docket = RevlogDocket(
       
   152         revlog,
       
   153         version_header=version_header,
       
   154         default_compression_header=comp,
       
   155     )
   146     docket._dirty = True
   156     docket._dirty = True
   147     return docket
   157     return docket
   148 
   158 
   149 
   159 
   150 def parse_docket(revlog, data, use_pending=False):
   160 def parse_docket(revlog, data, use_pending=False):
   153     version_header = header[0]
   163     version_header = header[0]
   154     index_size = header[1]
   164     index_size = header[1]
   155     pending_index_size = header[2]
   165     pending_index_size = header[2]
   156     data_size = header[3]
   166     data_size = header[3]
   157     pending_data_size = header[4]
   167     pending_data_size = header[4]
       
   168     default_compression_header = header[5]
   158     docket = RevlogDocket(
   169     docket = RevlogDocket(
   159         revlog,
   170         revlog,
   160         use_pending=use_pending,
   171         use_pending=use_pending,
   161         version_header=version_header,
   172         version_header=version_header,
   162         index_end=index_size,
   173         index_end=index_size,
   163         pending_index_end=pending_index_size,
   174         pending_index_end=pending_index_size,
   164         data_end=data_size,
   175         data_end=data_size,
   165         pending_data_end=pending_data_size,
   176         pending_data_end=pending_data_size,
       
   177         default_compression_header=default_compression_header,
   166     )
   178     )
   167     return docket
   179     return docket