144 assert repo.filtername is None |
144 assert repo.filtername is None |
145 self._repo = repo |
145 self._repo = repo |
146 self._names = [] # branch names in local encoding with static index |
146 self._names = [] # branch names in local encoding with static index |
147 self._rbcrevs = rbcrevs(bytearray()) |
147 self._rbcrevs = rbcrevs(bytearray()) |
148 self._rbcsnameslen = 0 # length of names read at _rbcsnameslen |
148 self._rbcsnameslen = 0 # length of names read at _rbcsnameslen |
|
149 self._force_overwrite = False |
149 v1_fallback = False |
150 v1_fallback = False |
150 try: |
151 try: |
151 try: |
152 try: |
152 bndata = repo.cachevfs.read(_rbcnames) |
153 bndata = repo.cachevfs.read(_rbcnames) |
153 except (IOError, OSError): |
154 except (IOError, OSError): |
155 # using. |
156 # using. |
156 # |
157 # |
157 # consider stop doing this many version after hg-6.9 release |
158 # consider stop doing this many version after hg-6.9 release |
158 bndata = repo.cachevfs.read(_rbc_legacy_names) |
159 bndata = repo.cachevfs.read(_rbc_legacy_names) |
159 v1_fallback = True |
160 v1_fallback = True |
|
161 self._force_overwrite = True |
160 self._rbcsnameslen = len(bndata) # for verification before writing |
162 self._rbcsnameslen = len(bndata) # for verification before writing |
161 if bndata: |
163 if bndata: |
162 self._names = [ |
164 self._names = [ |
163 encoding.tolocal(bn) for bn in bndata.split(b'\0') |
165 encoding.tolocal(bn) for bn in bndata.split(b'\0') |
164 ] |
166 ] |
343 wlock.release() |
344 wlock.release() |
344 |
345 |
345 def _writenames(self, repo): |
346 def _writenames(self, repo): |
346 """write the new branch names to revbranchcache""" |
347 """write the new branch names to revbranchcache""" |
347 f = None |
348 f = None |
|
349 if self._force_overwrite: |
|
350 self._rbcsnameslen = 0 |
|
351 self._rbcnamescount = 0 |
348 try: |
352 try: |
349 if self._rbcnamescount != 0: |
353 if self._force_overwrite or self._rbcnamescount != 0: |
350 f = repo.cachevfs.open(_rbcnames, b'ab') |
354 f = repo.cachevfs.open(_rbcnames, b'ab') |
351 if f.tell() == self._rbcsnameslen: |
355 current_size = f.tell() |
|
356 if current_size == self._rbcsnameslen: |
352 f.write(b'\0') |
357 f.write(b'\0') |
353 else: |
358 else: |
354 f.close() |
359 f.close() |
355 f = None |
360 if self._force_overwrite: |
356 repo.ui.debug(b"%s changed - rewriting it\n" % _rbcnames) |
361 dbg = b"resetting content of %s\n" |
|
362 elif current_size > 0: |
|
363 dbg = b"%s changed - rewriting it\n" |
|
364 else: |
|
365 dbg = b"%s is missing - rewriting it\n" |
|
366 repo.ui.debug(dbg % _rbcnames) |
357 self._rbcnamescount = 0 |
367 self._rbcnamescount = 0 |
358 self._rbcrevslen = 0 |
368 self._rbcrevslen = 0 |
359 if self._rbcnamescount == 0: |
369 if self._rbcnamescount == 0: |
360 # before rewriting names, make sure references are removed |
370 # before rewriting names, make sure references are removed |
361 repo.cachevfs.unlinkpath(_rbcrevs, ignoremissing=True) |
371 repo.cachevfs.unlinkpath(_rbcrevs, ignoremissing=True) |