mercurial/changelog.py
changeset 4275 73c918c71300
parent 4270 cd7b36b7869c
child 4635 63b9d2deed48
equal deleted inserted replaced
4274:f38f90a177dc 4275:73c918c71300
    83         revlog.__init__(self, opener, "00changelog.i")
    83         revlog.__init__(self, opener, "00changelog.i")
    84 
    84 
    85     def delayupdate(self):
    85     def delayupdate(self):
    86         "delay visibility of index updates to other readers"
    86         "delay visibility of index updates to other readers"
    87         self._realopener = self.opener
    87         self._realopener = self.opener
    88         self.opener = self._appendopener
    88         self.opener = self._delayopener
       
    89         self._delaycount = self.count()
    89         self._delaybuf = []
    90         self._delaybuf = []
       
    91         self._delayname = None
    90 
    92 
    91     def finalize(self, tr):
    93     def finalize(self, tr):
    92         "finalize index updates"
    94         "finalize index updates"
    93         self.opener = self._realopener
    95         self.opener = self._realopener
    94         if self._delaybuf:
    96         # move redirected index data back into place
       
    97         if self._delayname:
       
    98             util.rename(self._delayname + ".a", self._delayname)
       
    99         elif self._delaybuf:
    95             fp = self.opener(self.indexfile, 'a')
   100             fp = self.opener(self.indexfile, 'a')
    96             fp.write("".join(self._delaybuf))
   101             fp.write("".join(self._delaybuf))
    97             fp.close()
   102             fp.close()
    98             del self._delaybuf
   103             del self._delaybuf
       
   104         # split when we're done
    99         self.checkinlinesize(tr)
   105         self.checkinlinesize(tr)
   100 
   106 
   101     def _appendopener(self, name, mode='r'):
   107     def _delayopener(self, name, mode='r'):
   102         fp = self._realopener(name, mode)
   108         fp = self._realopener(name, mode)
       
   109         # only divert the index
   103         if not name == self.indexfile:
   110         if not name == self.indexfile:
   104             return fp
   111             return fp
       
   112         # if we're doing an initial clone, divert to another file
       
   113         if self._delaycount == 0:
       
   114             self._delayname = fp.name
       
   115             return self._realopener(name + ".a", mode)
       
   116         # otherwise, divert to memory
   105         return appender(fp, self._delaybuf)
   117         return appender(fp, self._delaybuf)
   106 
   118 
   107     def checkinlinesize(self, tr, fp=None):
   119     def checkinlinesize(self, tr, fp=None):
   108         if self.opener == self._appendopener:
   120         if self.opener == self._delayopener:
   109             return
   121             return
   110         return revlog.checkinlinesize(self, tr, fp)
   122         return revlog.checkinlinesize(self, tr, fp)
   111 
   123 
   112     def decode_extra(self, text):
   124     def decode_extra(self, text):
   113         extra = {}
   125         extra = {}