266 def __getitem__(self, i): |
266 def __getitem__(self, i): |
267 if i == -1: |
267 if i == -1: |
268 return (0, 0, 0, -1, -1, -1, -1, sha1nodeconstants.nullid) |
268 return (0, 0, 0, -1, -1, -1, -1, sha1nodeconstants.nullid) |
269 return list.__getitem__(self, i) |
269 return list.__getitem__(self, i) |
270 |
270 |
|
271 def entry_binary(self, rev, header): |
|
272 """return the raw binary string representing a revision""" |
|
273 entry = self[rev] |
|
274 if gettype(entry[0]): |
|
275 raise error.RevlogError( |
|
276 _(b'index entry flags need revlog version 1') |
|
277 ) |
|
278 e2 = ( |
|
279 getoffset(entry[0]), |
|
280 entry[1], |
|
281 entry[3], |
|
282 entry[4], |
|
283 self[entry[5]][7], |
|
284 self[entry[6]][7], |
|
285 entry[7], |
|
286 ) |
|
287 return INDEX_ENTRY_V0.pack(*e2) |
|
288 |
271 |
289 |
272 class revlogoldio(object): |
290 class revlogoldio(object): |
273 def parseindex(self, data, inline): |
291 def parseindex(self, data, inline): |
274 s = INDEX_ENTRY_V0.size |
292 s = INDEX_ENTRY_V0.size |
275 index = [] |
293 index = [] |
296 n += 1 |
314 n += 1 |
297 |
315 |
298 index = revlogoldindex(index) |
316 index = revlogoldindex(index) |
299 return index, None |
317 return index, None |
300 |
318 |
301 def packentry(self, entry, node, version, rev): |
|
302 """return the binary representation of an entry |
|
303 |
|
304 entry: a tuple containing all the values (see index.__getitem__) |
|
305 node: a callback to convert a revision to nodeid |
|
306 version: the changelog version |
|
307 rev: the revision number |
|
308 """ |
|
309 if gettype(entry[0]): |
|
310 raise error.RevlogError( |
|
311 _(b'index entry flags need revlog version 1') |
|
312 ) |
|
313 e2 = ( |
|
314 getoffset(entry[0]), |
|
315 entry[1], |
|
316 entry[3], |
|
317 entry[4], |
|
318 node(entry[5]), |
|
319 node(entry[6]), |
|
320 entry[7], |
|
321 ) |
|
322 return INDEX_ENTRY_V0.pack(*e2) |
|
323 |
|
324 |
319 |
325 # corresponds to uncompressed length of indexformatng (2 gigs, 4-byte |
320 # corresponds to uncompressed length of indexformatng (2 gigs, 4-byte |
326 # signed integer) |
321 # signed integer) |
327 _maxentrysize = 0x7FFFFFFF |
322 _maxentrysize = 0x7FFFFFFF |
328 |
323 |
331 def parseindex(self, data, inline): |
326 def parseindex(self, data, inline): |
332 # call the C implementation to parse the index data |
327 # call the C implementation to parse the index data |
333 index, cache = parsers.parse_index2(data, inline) |
328 index, cache = parsers.parse_index2(data, inline) |
334 return index, cache |
329 return index, cache |
335 |
330 |
336 def packentry(self, entry, node, version, rev): |
|
337 p = INDEX_ENTRY_V1.pack(*entry) |
|
338 if rev == 0: |
|
339 p = INDEX_HEADER.pack(version) + p[4:] |
|
340 return p |
|
341 |
|
342 |
331 |
343 class revlogv2io(object): |
332 class revlogv2io(object): |
344 def parseindex(self, data, inline): |
333 def parseindex(self, data, inline): |
345 index, cache = parsers.parse_index2(data, inline, revlogv2=True) |
334 index, cache = parsers.parse_index2(data, inline, revlogv2=True) |
346 return index, cache |
335 return index, cache |
347 |
|
348 def packentry(self, entry, node, version, rev): |
|
349 p = INDEX_ENTRY_V2.pack(*entry) |
|
350 if rev == 0: |
|
351 p = INDEX_HEADER.pack(version) + p[4:] |
|
352 return p |
|
353 |
336 |
354 |
337 |
355 NodemapRevlogIO = None |
338 NodemapRevlogIO = None |
356 |
339 |
357 if util.safehasattr(parsers, 'parse_index_devel_nodemap'): |
340 if util.safehasattr(parsers, 'parse_index_devel_nodemap'): |
2066 with self._indexfp(b'w') as fp: |
2049 with self._indexfp(b'w') as fp: |
2067 self.version &= ~FLAG_INLINE_DATA |
2050 self.version &= ~FLAG_INLINE_DATA |
2068 self._inline = False |
2051 self._inline = False |
2069 io = self._io |
2052 io = self._io |
2070 for i in self: |
2053 for i in self: |
2071 e = io.packentry(self.index[i], self.node, self.version, i) |
2054 e = self.index.entry_binary(i, self.version) |
2072 fp.write(e) |
2055 fp.write(e) |
2073 |
2056 |
2074 # the temp file replace the real index when we exit the context |
2057 # the temp file replace the real index when we exit the context |
2075 # manager |
2058 # manager |
2076 |
2059 |
3241 with self._indexfp(b'w+') as fp: |
3224 with self._indexfp(b'w+') as fp: |
3242 fp.seek(startrev * self.index.entry_size) |
3225 fp.seek(startrev * self.index.entry_size) |
3243 for i, entry in enumerate(new_entries): |
3226 for i, entry in enumerate(new_entries): |
3244 rev = startrev + i |
3227 rev = startrev + i |
3245 self.index.replace_sidedata_info(rev, entry[8], entry[9]) |
3228 self.index.replace_sidedata_info(rev, entry[8], entry[9]) |
3246 packed = self._io.packentry(entry, self.node, self.version, rev) |
3229 packed = self.index.entry_binary(rev, self.version) |
3247 fp.write(packed) |
3230 fp.write(packed) |