rev-branch-cache: add a way to force rewrite of the cache
This seems useful to be able to do this, for example during strip.
This align with the intended expressed in the `test-branches.t` test. This will
help use being more confident about future changes in the series.
--- a/mercurial/branching/rev_cache.py Tue Sep 24 00:01:30 2024 +0200
+++ b/mercurial/branching/rev_cache.py Mon Sep 23 23:52:45 2024 +0200
@@ -170,6 +170,7 @@
self._names = []
self._rbcnamescount = len(self._names) # number of names read at
# _rbcsnameslen
+ self._force_overwrite = False
def _clear(self):
self._rbcsnameslen = 0
@@ -178,6 +179,12 @@
self._rbcrevslen = len(self._repo.changelog)
self._rbcrevs = rbcrevs(bytearray(self._rbcrevslen * _rbcrecsize))
util.clearcachedproperty(self, b'_namesreverse')
+ self._force_overwrite = True
+
+ def invalidate(self, rev=0):
+ self._rbcrevslen = rev
+ self._rbcrevs.truncate(rev)
+ self._force_overwrite = True
@util.propertycache
def _namesreverse(self):
@@ -292,7 +299,7 @@
# write the new revs
start = self._rbcrevslen * _rbcrecsize
- if start != len(self._rbcrevs):
+ if self._force_overwrite or start != len(self._rbcrevs):
step = b''
if wlock is None:
wlock = repo.wlock(wait=False)
@@ -335,6 +342,8 @@
def _writerevs(self, repo, start):
"""write the new revs to revbranchcache"""
revs = min(len(repo.changelog), len(self._rbcrevs) // _rbcrecsize)
+ if self._force_overwrite:
+ start = 0
with repo.cachevfs.open(_rbcrevs, b'ab') as f:
current_size = f.tell()
if current_size < start:
@@ -348,3 +357,4 @@
end = revs * _rbcrecsize
f.write(self._rbcrevs.slice(start, end))
self._rbcrevslen = revs
+ self._force_overwrite = False
--- a/mercurial/repair.py Tue Sep 24 00:01:30 2024 +0200
+++ b/mercurial/repair.py Mon Sep 23 23:52:45 2024 +0200
@@ -242,6 +242,10 @@
del repo.obsstore
repo.invalidatevolatilesets()
+ # NOTE: eventually make a common entry point on localrepo to help
+ # other caches
+ repo.revbranchcache().invalidate(striprev)
+
if tmpbundlefile:
ui.note(_(b"adding branch\n"))
f = vfs.open(tmpbundlefile, b"rb")
--- a/tests/test-rebase-conflicts.t Tue Sep 24 00:01:30 2024 +0200
+++ b/tests/test-rebase-conflicts.t Mon Sep 23 23:52:45 2024 +0200
@@ -319,12 +319,14 @@
bundle2-input-part: "phase-heads" supported
bundle2-input-part: total payload size 24
bundle2-input-bundle: 3 parts total
- truncating cache/rbc-revs-v1 to 72
+ truncating cache/rbc-revs-v1 to 0
added 2 changesets with 2 changes to 1 files
updating the branch cache
invalid branch cache (served): tip differs
+ history modification detected - truncating revision branch cache to revision 1
invalid branch cache (served.hidden): tip differs
rebase completed
+ truncating cache/rbc-revs-v1 to 8
Test minimization of merge conflicts
$ hg up -q null
--- a/tests/test-strip.t Tue Sep 24 00:01:30 2024 +0200
+++ b/tests/test-strip.t Mon Sep 23 23:52:45 2024 +0200
@@ -913,6 +913,7 @@
saved backup bundle to $TESTTMP/issue4736/.hg/strip-backup/6625a5168474-345bb43d-backup.hg
updating the branch cache
invalid branch cache (served): tip differs
+ truncating cache/rbc-revs-v1 to 0
$ hg log -G
o changeset: 2:5c51d8d6557d
| tag: tip