comparison mercurial/branching/rev_cache.py @ 51899:9f7cf869e9f4

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.
author Pierre-Yves David <pierre-yves.david@octobus.net>
date Mon, 23 Sep 2024 23:52:45 +0200
parents 1eb2317c1762
children 7032da075572
comparison
equal deleted inserted replaced
51898:1eb2317c1762 51899:9f7cf869e9f4
168 ) 168 )
169 if self._rbcrevslen == 0: 169 if self._rbcrevslen == 0:
170 self._names = [] 170 self._names = []
171 self._rbcnamescount = len(self._names) # number of names read at 171 self._rbcnamescount = len(self._names) # number of names read at
172 # _rbcsnameslen 172 # _rbcsnameslen
173 self._force_overwrite = False
173 174
174 def _clear(self): 175 def _clear(self):
175 self._rbcsnameslen = 0 176 self._rbcsnameslen = 0
176 del self._names[:] 177 del self._names[:]
177 self._rbcnamescount = 0 178 self._rbcnamescount = 0
178 self._rbcrevslen = len(self._repo.changelog) 179 self._rbcrevslen = len(self._repo.changelog)
179 self._rbcrevs = rbcrevs(bytearray(self._rbcrevslen * _rbcrecsize)) 180 self._rbcrevs = rbcrevs(bytearray(self._rbcrevslen * _rbcrecsize))
180 util.clearcachedproperty(self, b'_namesreverse') 181 util.clearcachedproperty(self, b'_namesreverse')
182 self._force_overwrite = True
183
184 def invalidate(self, rev=0):
185 self._rbcrevslen = rev
186 self._rbcrevs.truncate(rev)
187 self._force_overwrite = True
181 188
182 @util.propertycache 189 @util.propertycache
183 def _namesreverse(self): 190 def _namesreverse(self):
184 return {b: r for r, b in enumerate(self._names)} 191 return {b: r for r, b in enumerate(self._names)}
185 192
290 step = b' names' 297 step = b' names'
291 self._writenames(repo) 298 self._writenames(repo)
292 299
293 # write the new revs 300 # write the new revs
294 start = self._rbcrevslen * _rbcrecsize 301 start = self._rbcrevslen * _rbcrecsize
295 if start != len(self._rbcrevs): 302 if self._force_overwrite or start != len(self._rbcrevs):
296 step = b'' 303 step = b''
297 if wlock is None: 304 if wlock is None:
298 wlock = repo.wlock(wait=False) 305 wlock = repo.wlock(wait=False)
299 self._writerevs(repo, start) 306 self._writerevs(repo, start)
300 307
333 self._rbcnamescount = len(self._names) 340 self._rbcnamescount = len(self._names)
334 341
335 def _writerevs(self, repo, start): 342 def _writerevs(self, repo, start):
336 """write the new revs to revbranchcache""" 343 """write the new revs to revbranchcache"""
337 revs = min(len(repo.changelog), len(self._rbcrevs) // _rbcrecsize) 344 revs = min(len(repo.changelog), len(self._rbcrevs) // _rbcrecsize)
345 if self._force_overwrite:
346 start = 0
338 with repo.cachevfs.open(_rbcrevs, b'ab') as f: 347 with repo.cachevfs.open(_rbcrevs, b'ab') as f:
339 current_size = f.tell() 348 current_size = f.tell()
340 if current_size < start: 349 if current_size < start:
341 start = 0 350 start = 0
342 if current_size != start: 351 if current_size != start:
346 f.seek(start) 355 f.seek(start)
347 f.truncate() 356 f.truncate()
348 end = revs * _rbcrecsize 357 end = revs * _rbcrecsize
349 f.write(self._rbcrevs.slice(start, end)) 358 f.write(self._rbcrevs.slice(start, end))
350 self._rbcrevslen = revs 359 self._rbcrevslen = revs
360 self._force_overwrite = False