comparison mercurial/changelog.py @ 9164:b0d995b6b0a6

changelog: factor out _delayname
author Matt Mackall <mpm@selenic.com>
date Sat, 18 Jul 2009 11:25:55 -0500
parents f193b643d1b1
children 07f9b2f4a9aa
comparison
equal deleted inserted replaced
9163:f193b643d1b1 9164:b0d995b6b0a6
92 self._realopener = opener 92 self._realopener = opener
93 self._delayed = False 93 self._delayed = False
94 self._divert = False 94 self._divert = False
95 revlog.revlog.__init__(self, self._delayopener, "00changelog.i") 95 revlog.revlog.__init__(self, self._delayopener, "00changelog.i")
96 96
97
98 def delayupdate(self): 97 def delayupdate(self):
99 "delay visibility of index updates to other readers" 98 "delay visibility of index updates to other readers"
100 self._delayed = True 99 self._delayed = True
101 self._divert = (len(self) == 0) 100 self._divert = (len(self) == 0)
102 self._delaybuf = [] 101 self._delaybuf = []
103 self._delayname = None
104 102
105 def finalize(self, tr): 103 def finalize(self, tr):
106 "finalize index updates" 104 "finalize index updates"
107 self._delayed = False 105 self._delayed = False
108 # move redirected index data back into place 106 # move redirected index data back into place
109 if self._delayname: 107 if self._divert:
110 util.rename(self._delayname + ".a", self._delayname) 108 n = self._realopener(self.indexfile).name
109 util.rename(n + ".a", n)
111 elif self._delaybuf: 110 elif self._delaybuf:
112 fp = self.opener(self.indexfile, 'a') 111 fp = self.opener(self.indexfile, 'a')
113 fp.write("".join(self._delaybuf)) 112 fp.write("".join(self._delaybuf))
114 fp.close() 113 fp.close()
115 self._delaybuf = [] 114 self._delaybuf = []
121 # only divert the index 120 # only divert the index
122 if not self._delayed or not name == self.indexfile: 121 if not self._delayed or not name == self.indexfile:
123 return fp 122 return fp
124 # if we're doing an initial clone, divert to another file 123 # if we're doing an initial clone, divert to another file
125 if self._divert: 124 if self._divert:
126 self._delayname = fp.name
127 if not len(self): 125 if not len(self):
128 # make sure to truncate the file 126 # make sure to truncate the file
129 mode = mode.replace('a', 'w') 127 mode = mode.replace('a', 'w')
130 return self._realopener(name + ".a", mode) 128 return self._realopener(name + ".a", mode)
131 # otherwise, divert to memory 129 # otherwise, divert to memory
147 # add pending data 145 # add pending data
148 fp2.write("".join(self._delaybuf)) 146 fp2.write("".join(self._delaybuf))
149 fp2.close() 147 fp2.close()
150 # switch modes so finalize can simply rename 148 # switch modes so finalize can simply rename
151 self._delaybuf = [] 149 self._delaybuf = []
152 self._delayname = fp1.name 150 self._divert = True
153 151
154 if self._delayname: 152 if self._divert:
155 return True 153 return True
156 154
157 return False 155 return False
158 156
159 def checkinlinesize(self, tr, fp=None): 157 def checkinlinesize(self, tr, fp=None):