Mercurial > public > mercurial-scm > hg-stable
comparison mercurial/revlog.py @ 51097:ff673b9da21f
revlog: add a couple more of useful method on the inner object
This will be needed for the next changeset.
author | Pierre-Yves David <pierre-yves.david@octobus.net> |
---|---|
date | Wed, 25 Oct 2023 04:40:40 +0200 |
parents | 9c8df10ea6e0 |
children | e8ad6d8de8b8 |
comparison
equal
deleted
inserted
replaced
51096:9c8df10ea6e0 | 51097:ff673b9da21f |
---|---|
351 index_file, | 351 index_file, |
352 data_file, | 352 data_file, |
353 sidedata_file, | 353 sidedata_file, |
354 inline, | 354 inline, |
355 data_config, | 355 data_config, |
356 delta_config, | |
356 feature_config, | 357 feature_config, |
357 chunk_cache, | 358 chunk_cache, |
358 default_compression_header, | 359 default_compression_header, |
359 ): | 360 ): |
360 self.opener = opener | 361 self.opener = opener |
363 self.__index_file = index_file | 364 self.__index_file = index_file |
364 self.data_file = data_file | 365 self.data_file = data_file |
365 self.sidedata_file = sidedata_file | 366 self.sidedata_file = sidedata_file |
366 self.inline = inline | 367 self.inline = inline |
367 self.data_config = data_config | 368 self.data_config = data_config |
369 self.delta_config = delta_config | |
368 self.feature_config = feature_config | 370 self.feature_config = feature_config |
369 | 371 |
370 self._default_compression_header = default_compression_header | 372 self._default_compression_header = default_compression_header |
371 | 373 |
372 # index | 374 # index |
397 def index_file(self, new_index_file): | 399 def index_file(self, new_index_file): |
398 self.__index_file = new_index_file | 400 self.__index_file = new_index_file |
399 if self.inline: | 401 if self.inline: |
400 self._segmentfile.filename = new_index_file | 402 self._segmentfile.filename = new_index_file |
401 | 403 |
404 def __len__(self): | |
405 return len(self.index) | |
406 | |
402 # Derived from index values. | 407 # Derived from index values. |
403 | 408 |
404 def start(self, rev): | 409 def start(self, rev): |
405 """the offset of the data chunk for this revision""" | 410 """the offset of the data chunk for this revision""" |
406 return int(self.index[rev][0] >> 16) | 411 return int(self.index[rev][0] >> 16) |
410 return self.index[rev][1] | 415 return self.index[rev][1] |
411 | 416 |
412 def end(self, rev): | 417 def end(self, rev): |
413 """the end of the data chunk for this revision""" | 418 """the end of the data chunk for this revision""" |
414 return self.start(rev) + self.length(rev) | 419 return self.start(rev) + self.length(rev) |
420 | |
421 def deltaparent(self, rev): | |
422 """return deltaparent of the given revision""" | |
423 base = self.index[rev][3] | |
424 if base == rev: | |
425 return nullrev | |
426 elif self.delta_config.general_delta: | |
427 return base | |
428 else: | |
429 return rev - 1 | |
430 | |
431 def issnapshot(self, rev): | |
432 """tells whether rev is a snapshot""" | |
433 if not self.delta_config.sparse_revlog: | |
434 return self.deltaparent(rev) == nullrev | |
435 elif hasattr(self.index, 'issnapshot'): | |
436 # directly assign the method to cache the testing and access | |
437 self.issnapshot = self.index.issnapshot | |
438 return self.issnapshot(rev) | |
439 if rev == nullrev: | |
440 return True | |
441 entry = self.index[rev] | |
442 base = entry[3] | |
443 if base == rev: | |
444 return True | |
445 if base == nullrev: | |
446 return True | |
447 p1 = entry[5] | |
448 while self.length(p1) == 0: | |
449 b = self.deltaparent(p1) | |
450 if b == p1: | |
451 break | |
452 p1 = b | |
453 p2 = entry[6] | |
454 while self.length(p2) == 0: | |
455 b = self.deltaparent(p2) | |
456 if b == p2: | |
457 break | |
458 p2 = b | |
459 if base == p1 or base == p2: | |
460 return False | |
461 return self.issnapshot(base) | |
415 | 462 |
416 @util.propertycache | 463 @util.propertycache |
417 def _compressor(self): | 464 def _compressor(self): |
418 engine = util.compengines[self.feature_config.compression_engine] | 465 engine = util.compengines[self.feature_config.compression_engine] |
419 return engine.revlogcompressor( | 466 return engine.revlogcompressor( |
1426 index_file=self._indexfile, | 1473 index_file=self._indexfile, |
1427 data_file=self._datafile, | 1474 data_file=self._datafile, |
1428 sidedata_file=self._sidedatafile, | 1475 sidedata_file=self._sidedatafile, |
1429 inline=self._inline, | 1476 inline=self._inline, |
1430 data_config=self.data_config, | 1477 data_config=self.data_config, |
1478 delta_config=self.delta_config, | |
1431 feature_config=self.feature_config, | 1479 feature_config=self.feature_config, |
1432 chunk_cache=chunk_cache, | 1480 chunk_cache=chunk_cache, |
1433 default_compression_header=default_compression_header, | 1481 default_compression_header=default_compression_header, |
1434 ) | 1482 ) |
1435 | 1483 |
2439 else: | 2487 else: |
2440 return rev - 1 | 2488 return rev - 1 |
2441 | 2489 |
2442 def issnapshot(self, rev): | 2490 def issnapshot(self, rev): |
2443 """tells whether rev is a snapshot""" | 2491 """tells whether rev is a snapshot""" |
2444 if not self.delta_config.sparse_revlog: | 2492 ret = self._inner.issnapshot(rev) |
2445 return self.deltaparent(rev) == nullrev | 2493 self.issnapshot = self._inner.issnapshot |
2446 elif hasattr(self.index, 'issnapshot'): | 2494 return ret |
2447 # directly assign the method to cache the testing and access | |
2448 self.issnapshot = self.index.issnapshot | |
2449 return self.issnapshot(rev) | |
2450 if rev == nullrev: | |
2451 return True | |
2452 entry = self.index[rev] | |
2453 base = entry[3] | |
2454 if base == rev: | |
2455 return True | |
2456 if base == nullrev: | |
2457 return True | |
2458 p1 = entry[5] | |
2459 while self.length(p1) == 0: | |
2460 b = self.deltaparent(p1) | |
2461 if b == p1: | |
2462 break | |
2463 p1 = b | |
2464 p2 = entry[6] | |
2465 while self.length(p2) == 0: | |
2466 b = self.deltaparent(p2) | |
2467 if b == p2: | |
2468 break | |
2469 p2 = b | |
2470 if base == p1 or base == p2: | |
2471 return False | |
2472 return self.issnapshot(base) | |
2473 | 2495 |
2474 def snapshotdepth(self, rev): | 2496 def snapshotdepth(self, rev): |
2475 """number of snapshot in the chain before this one""" | 2497 """number of snapshot in the chain before this one""" |
2476 if not self.issnapshot(rev): | 2498 if not self.issnapshot(rev): |
2477 raise error.ProgrammingError(b'revision %d not a snapshot') | 2499 raise error.ProgrammingError(b'revision %d not a snapshot') |