mercurial/branching/rev_cache.py
changeset 51908 16efed18ae4e
parent 51907 bd7359c18d69
equal deleted inserted replaced
51907:bd7359c18d69 51908:16efed18ae4e
   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                 ]
   196         )
   198         )
   197         if self._rbcrevslen == 0:
   199         if self._rbcrevslen == 0:
   198             self._names = []
   200             self._names = []
   199         self._rbcnamescount = len(self._names)  # number of names read at
   201         self._rbcnamescount = len(self._names)  # number of names read at
   200         # _rbcsnameslen
   202         # _rbcsnameslen
   201         self._force_overwrite = False
       
   202 
   203 
   203     def _clear(self):
   204     def _clear(self):
   204         self._rbcsnameslen = 0
   205         self._rbcsnameslen = 0
   205         del self._names[:]
   206         del self._names[:]
   206         self._rbcnamescount = 0
   207         self._rbcnamescount = 0
   318         repo = self._repo
   319         repo = self._repo
   319         wlock = None
   320         wlock = None
   320         step = b''
   321         step = b''
   321         try:
   322         try:
   322             # write the new names
   323             # write the new names
   323             if self._rbcnamescount < len(self._names):
   324             if self._force_overwrite or self._rbcnamescount < len(self._names):
   324                 wlock = repo.wlock(wait=False)
   325                 wlock = repo.wlock(wait=False)
   325                 step = b' names'
   326                 step = b' names'
   326                 self._writenames(repo)
   327                 self._writenames(repo)
   327 
   328 
   328             # write the new revs
   329             # write the new revs
   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)