Mercurial > public > mercurial-scm > hg-stable
comparison mercurial/revlogutils/docket.py @ 47332:0a3fa41fa719
revlogv2: use a unique filename for data
Having a unique data will allow for ambiguity less rewriting of revlog content,
something useful to clarify handling of some operation like censoring or
stripping.
Differential Revision: https://phab.mercurial-scm.org/D10772
author | Pierre-Yves David <pierre-yves.david@octobus.net> |
---|---|
date | Wed, 19 May 2021 16:55:36 +0200 |
parents | f612db768c7a |
children | f286d715f9ab |
comparison
equal
deleted
inserted
replaced
47331:f612db768c7a | 47332:0a3fa41fa719 |
---|---|
87 # | 87 # |
88 # * 4 bytes: revlog version | 88 # * 4 bytes: revlog version |
89 # | This is mandatory as docket must be compatible with the previous | 89 # | This is mandatory as docket must be compatible with the previous |
90 # | revlog index header. | 90 # | revlog index header. |
91 # * 1 bytes: size of index uuid | 91 # * 1 bytes: size of index uuid |
92 # * 1 bytes: size of data uuid | |
92 # * 8 bytes: size of index-data | 93 # * 8 bytes: size of index-data |
93 # * 8 bytes: pending size of index-data | 94 # * 8 bytes: pending size of index-data |
94 # * 8 bytes: size of data | 95 # * 8 bytes: size of data |
95 # * 8 bytes: pending size of data | 96 # * 8 bytes: pending size of data |
96 # * 1 bytes: default compression header | 97 # * 1 bytes: default compression header |
97 S_HEADER = struct.Struct(constants.INDEX_HEADER.format + 'BLLLLc') | 98 S_HEADER = struct.Struct(constants.INDEX_HEADER.format + 'BBLLLLc') |
98 | 99 |
99 | 100 |
100 class RevlogDocket(object): | 101 class RevlogDocket(object): |
101 """metadata associated with revlog""" | 102 """metadata associated with revlog""" |
102 | 103 |
104 self, | 105 self, |
105 revlog, | 106 revlog, |
106 use_pending=False, | 107 use_pending=False, |
107 version_header=None, | 108 version_header=None, |
108 index_uuid=None, | 109 index_uuid=None, |
110 data_uuid=None, | |
109 index_end=0, | 111 index_end=0, |
110 pending_index_end=0, | 112 pending_index_end=0, |
111 data_end=0, | 113 data_end=0, |
112 pending_data_end=0, | 114 pending_data_end=0, |
113 default_compression_header=None, | 115 default_compression_header=None, |
117 self._dirty = False | 119 self._dirty = False |
118 self._radix = revlog.radix | 120 self._radix = revlog.radix |
119 self._path = revlog._docket_file | 121 self._path = revlog._docket_file |
120 self._opener = revlog.opener | 122 self._opener = revlog.opener |
121 self._index_uuid = index_uuid | 123 self._index_uuid = index_uuid |
124 self._data_uuid = data_uuid | |
122 # thes asserts should be True as long as we have a single index filename | 125 # thes asserts should be True as long as we have a single index filename |
123 assert index_end <= pending_index_end | 126 assert index_end <= pending_index_end |
124 assert data_end <= pending_data_end | 127 assert data_end <= pending_data_end |
125 self._initial_index_end = index_end | 128 self._initial_index_end = index_end |
126 self._pending_index_end = pending_index_end | 129 self._pending_index_end = pending_index_end |
138 """file path to the current index file associated to this docket""" | 141 """file path to the current index file associated to this docket""" |
139 # very simplistic version at first | 142 # very simplistic version at first |
140 if self._index_uuid is None: | 143 if self._index_uuid is None: |
141 self._index_uuid = make_uid() | 144 self._index_uuid = make_uid() |
142 return b"%s-%s.idx" % (self._radix, self._index_uuid) | 145 return b"%s-%s.idx" % (self._radix, self._index_uuid) |
146 | |
147 def data_filepath(self): | |
148 """file path to the current index file associated to this docket""" | |
149 # very simplistic version at first | |
150 if self._data_uuid is None: | |
151 self._data_uuid = make_uid() | |
152 return b"%s-%s.dat" % (self._radix, self._data_uuid) | |
143 | 153 |
144 @property | 154 @property |
145 def index_end(self): | 155 def index_end(self): |
146 return self._index_end | 156 return self._index_end |
147 | 157 |
193 # this assert should be True as long as we have a single index filename | 203 # this assert should be True as long as we have a single index filename |
194 assert official_data_end <= self._data_end | 204 assert official_data_end <= self._data_end |
195 data = ( | 205 data = ( |
196 self._version_header, | 206 self._version_header, |
197 len(self._index_uuid), | 207 len(self._index_uuid), |
208 len(self._data_uuid), | |
198 official_index_end, | 209 official_index_end, |
199 self._index_end, | 210 self._index_end, |
200 official_data_end, | 211 official_data_end, |
201 self._data_end, | 212 self._data_end, |
202 self.default_compression_header, | 213 self.default_compression_header, |
203 ) | 214 ) |
204 s = [] | 215 s = [] |
205 s.append(S_HEADER.pack(*data)) | 216 s.append(S_HEADER.pack(*data)) |
206 s.append(self._index_uuid) | 217 s.append(self._index_uuid) |
218 s.append(self._data_uuid) | |
207 return b''.join(s) | 219 return b''.join(s) |
208 | 220 |
209 | 221 |
210 def default_docket(revlog, version_header): | 222 def default_docket(revlog, version_header): |
211 """given a revlog version a new docket object for the given revlog""" | 223 """given a revlog version a new docket object for the given revlog""" |
228 offset = S_HEADER.size | 240 offset = S_HEADER.size |
229 version_header = header[0] | 241 version_header = header[0] |
230 index_uuid_size = header[1] | 242 index_uuid_size = header[1] |
231 index_uuid = data[offset : offset + index_uuid_size] | 243 index_uuid = data[offset : offset + index_uuid_size] |
232 offset += index_uuid_size | 244 offset += index_uuid_size |
233 index_size = header[2] | 245 data_uuid_size = header[2] |
234 pending_index_size = header[3] | 246 data_uuid = data[offset : offset + data_uuid_size] |
235 data_size = header[4] | 247 offset += data_uuid_size |
236 pending_data_size = header[5] | 248 index_size = header[3] |
237 default_compression_header = header[6] | 249 pending_index_size = header[4] |
250 data_size = header[5] | |
251 pending_data_size = header[6] | |
252 default_compression_header = header[7] | |
238 docket = RevlogDocket( | 253 docket = RevlogDocket( |
239 revlog, | 254 revlog, |
240 use_pending=use_pending, | 255 use_pending=use_pending, |
241 version_header=version_header, | 256 version_header=version_header, |
242 index_uuid=index_uuid, | 257 index_uuid=index_uuid, |
258 data_uuid=data_uuid, | |
243 index_end=index_size, | 259 index_end=index_size, |
244 pending_index_end=pending_index_size, | 260 pending_index_end=pending_index_size, |
245 data_end=data_size, | 261 data_end=data_size, |
246 pending_data_end=pending_data_size, | 262 pending_data_end=pending_data_size, |
247 default_compression_header=default_compression_header, | 263 default_compression_header=default_compression_header, |