comparison mercurial/revlog.py @ 47037:d57386e5c80e

revlog: have an explicit "pack_header" method Having to pass the version header when retrieving the binary version of every single entry is a bit silly. So we extract that special logic in its own method. This also prepare the move to newer revlog format, not storing the header within an actual entry… Differential Revision: https://phab.mercurial-scm.org/D10510
author Pierre-Yves David <pierre-yves.david@octobus.net>
date Thu, 01 Apr 2021 11:31:54 +0200
parents 5e64c93d5f94
children 724db234b790
comparison
equal deleted inserted replaced
47036:5e64c93d5f94 47037:d57386e5c80e
264 def __getitem__(self, i): 264 def __getitem__(self, i):
265 if i == -1: 265 if i == -1:
266 return (0, 0, 0, -1, -1, -1, -1, sha1nodeconstants.nullid) 266 return (0, 0, 0, -1, -1, -1, -1, sha1nodeconstants.nullid)
267 return list.__getitem__(self, i) 267 return list.__getitem__(self, i)
268 268
269 def entry_binary(self, rev, header): 269 def entry_binary(self, rev):
270 """return the raw binary string representing a revision""" 270 """return the raw binary string representing a revision"""
271 entry = self[rev] 271 entry = self[rev]
272 if gettype(entry[0]): 272 if gettype(entry[0]):
273 raise error.RevlogError( 273 raise error.RevlogError(
274 _(b'index entry flags need revlog version 1') 274 _(b'index entry flags need revlog version 1')
281 self[entry[5]][7], 281 self[entry[5]][7],
282 self[entry[6]][7], 282 self[entry[6]][7],
283 entry[7], 283 entry[7],
284 ) 284 )
285 return INDEX_ENTRY_V0.pack(*e2) 285 return INDEX_ENTRY_V0.pack(*e2)
286
287 def pack_header(self, header):
288 """Pack header information in binary"""
289 return b''
286 290
287 291
288 def parse_index_v0(data, inline): 292 def parse_index_v0(data, inline):
289 s = INDEX_ENTRY_V0.size 293 s = INDEX_ENTRY_V0.size
290 index = [] 294 index = []
2039 2043
2040 with self._indexfp(b'w') as fp: 2044 with self._indexfp(b'w') as fp:
2041 self.version &= ~FLAG_INLINE_DATA 2045 self.version &= ~FLAG_INLINE_DATA
2042 self._inline = False 2046 self._inline = False
2043 for i in self: 2047 for i in self:
2044 e = self.index.entry_binary(i, self.version) 2048 e = self.index.entry_binary(i)
2049 if i == 0:
2050 header = self.index.pack_header(self.version)
2051 e = header + e
2045 fp.write(e) 2052 fp.write(e)
2046 2053
2047 # the temp file replace the real index when we exit the context 2054 # the temp file replace the real index when we exit the context
2048 # manager 2055 # manager
2049 2056
2361 2368
2362 if self.version & 0xFFFF != REVLOGV2: 2369 if self.version & 0xFFFF != REVLOGV2:
2363 e = e[:8] 2370 e = e[:8]
2364 2371
2365 self.index.append(e) 2372 self.index.append(e)
2366 entry = self.index.entry_binary(curr, self.version) 2373 entry = self.index.entry_binary(curr)
2374 if curr == 0:
2375 header = self.index.pack_header(self.version)
2376 entry = header + entry
2367 self._writeentry( 2377 self._writeentry(
2368 transaction, 2378 transaction,
2369 ifh, 2379 ifh,
2370 dfh, 2380 dfh,
2371 entry, 2381 entry,
3214 with self._indexfp(b'w+') as fp: 3224 with self._indexfp(b'w+') as fp:
3215 fp.seek(startrev * self.index.entry_size) 3225 fp.seek(startrev * self.index.entry_size)
3216 for i, entry in enumerate(new_entries): 3226 for i, entry in enumerate(new_entries):
3217 rev = startrev + i 3227 rev = startrev + i
3218 self.index.replace_sidedata_info(rev, entry[8], entry[9]) 3228 self.index.replace_sidedata_info(rev, entry[8], entry[9])
3219 packed = self.index.entry_binary(rev, self.version) 3229 packed = self.index.entry_binary(rev)
3230 if rev == 0:
3231 header = self.index.pack_header(self.version)
3232 packed = header + packed
3220 fp.write(packed) 3233 fp.write(packed)