mercurial/changelog.py
changeset 47148 a07d5cb03a85
parent 47145 c6b8d5d91e73
child 47150 8d3c2f9d4af7
equal deleted inserted replaced
47147:8a1a51d31e85 47148:a07d5cb03a85
   450         """delay visibility of index updates to other readers"""
   450         """delay visibility of index updates to other readers"""
   451 
   451 
   452         if not self._delayed:
   452         if not self._delayed:
   453             if len(self) == 0:
   453             if len(self) == 0:
   454                 self._divert = True
   454                 self._divert = True
   455                 if self._realopener.exists(self.indexfile + b'.a'):
   455                 if self._realopener.exists(self._indexfile + b'.a'):
   456                     self._realopener.unlink(self.indexfile + b'.a')
   456                     self._realopener.unlink(self._indexfile + b'.a')
   457                 self.opener = _divertopener(self._realopener, self.indexfile)
   457                 self.opener = _divertopener(self._realopener, self._indexfile)
   458             else:
   458             else:
   459                 self._delaybuf = []
   459                 self._delaybuf = []
   460                 self.opener = _delayopener(
   460                 self.opener = _delayopener(
   461                     self._realopener, self.indexfile, self._delaybuf
   461                     self._realopener, self._indexfile, self._delaybuf
   462                 )
   462                 )
   463         self._delayed = True
   463         self._delayed = True
   464         tr.addpending(b'cl-%i' % id(self), self._writepending)
   464         tr.addpending(b'cl-%i' % id(self), self._writepending)
   465         tr.addfinalize(b'cl-%i' % id(self), self._finalize)
   465         tr.addfinalize(b'cl-%i' % id(self), self._finalize)
   466 
   466 
   469         self._delayed = False
   469         self._delayed = False
   470         self.opener = self._realopener
   470         self.opener = self._realopener
   471         # move redirected index data back into place
   471         # move redirected index data back into place
   472         if self._divert:
   472         if self._divert:
   473             assert not self._delaybuf
   473             assert not self._delaybuf
   474             tmpname = self.indexfile + b".a"
   474             tmpname = self._indexfile + b".a"
   475             nfile = self.opener.open(tmpname)
   475             nfile = self.opener.open(tmpname)
   476             nfile.close()
   476             nfile.close()
   477             self.opener.rename(tmpname, self.indexfile, checkambig=True)
   477             self.opener.rename(tmpname, self._indexfile, checkambig=True)
   478         elif self._delaybuf:
   478         elif self._delaybuf:
   479             fp = self.opener(self.indexfile, b'a', checkambig=True)
   479             fp = self.opener(self._indexfile, b'a', checkambig=True)
   480             fp.write(b"".join(self._delaybuf))
   480             fp.write(b"".join(self._delaybuf))
   481             fp.close()
   481             fp.close()
   482             self._delaybuf = None
   482             self._delaybuf = None
   483         self._divert = False
   483         self._divert = False
   484         # split when we're done
   484         # split when we're done
   487     def _writepending(self, tr):
   487     def _writepending(self, tr):
   488         """create a file containing the unfinalized state for
   488         """create a file containing the unfinalized state for
   489         pretxnchangegroup"""
   489         pretxnchangegroup"""
   490         if self._delaybuf:
   490         if self._delaybuf:
   491             # make a temporary copy of the index
   491             # make a temporary copy of the index
   492             fp1 = self._realopener(self.indexfile)
   492             fp1 = self._realopener(self._indexfile)
   493             pendingfilename = self.indexfile + b".a"
   493             pendingfilename = self._indexfile + b".a"
   494             # register as a temp file to ensure cleanup on failure
   494             # register as a temp file to ensure cleanup on failure
   495             tr.registertmp(pendingfilename)
   495             tr.registertmp(pendingfilename)
   496             # write existing data
   496             # write existing data
   497             fp2 = self._realopener(pendingfilename, b"w")
   497             fp2 = self._realopener(pendingfilename, b"w")
   498             fp2.write(fp1.read())
   498             fp2.write(fp1.read())
   500             fp2.write(b"".join(self._delaybuf))
   500             fp2.write(b"".join(self._delaybuf))
   501             fp2.close()
   501             fp2.close()
   502             # switch modes so finalize can simply rename
   502             # switch modes so finalize can simply rename
   503             self._delaybuf = None
   503             self._delaybuf = None
   504             self._divert = True
   504             self._divert = True
   505             self.opener = _divertopener(self._realopener, self.indexfile)
   505             self.opener = _divertopener(self._realopener, self._indexfile)
   506 
   506 
   507         if self._divert:
   507         if self._divert:
   508             return True
   508             return True
   509 
   509 
   510         return False
   510         return False