Show More
@@ -108,15 +108,21 b' class appender(object):' | |||
|
108 | 108 | self.data.append(str(s)) |
|
109 | 109 | self.offset += len(s) |
|
110 | 110 | |
|
111 |
def |
|
|
112 | def o(name, mode='r'): | |
|
111 | def _divertopener(opener, target): | |
|
112 | """build an opener that writes in 'target.a' instead of 'target'""" | |
|
113 | def _divert(name, mode='r'): | |
|
113 | 114 | if name != target: |
|
114 | 115 | return opener(name, mode) |
|
115 | if divert: | |
|
116 | return opener(name + ".a", mode.replace('a', 'w')) | |
|
117 | # otherwise, divert to memory | |
|
116 | return opener(name + ".a", mode) | |
|
117 | return _divert | |
|
118 | ||
|
119 | def _delayopener(opener, target, buf): | |
|
120 | """build an opener that stores chunks in 'buf' instead of 'target'""" | |
|
121 | def _delay(name, mode='r'): | |
|
122 | if name != target: | |
|
123 | return opener(name, mode) | |
|
118 | 124 | return appender(opener, name, mode, buf) |
|
119 |
return |
|
|
125 | return _delay | |
|
120 | 126 | |
|
121 | 127 | class changelog(revlog.revlog): |
|
122 | 128 | def __init__(self, opener): |
@@ -127,7 +133,7 b' class changelog(revlog.revlog):' | |||
|
127 | 133 | self._generaldelta = False |
|
128 | 134 | self._realopener = opener |
|
129 | 135 | self._delayed = False |
|
130 |
self._delaybuf = |
|
|
136 | self._delaybuf = None | |
|
131 | 137 | self._divert = False |
|
132 | 138 | self.filteredrevs = frozenset() |
|
133 | 139 | |
@@ -220,11 +226,18 b' class changelog(revlog.revlog):' | |||
|
220 | 226 | |
|
221 | 227 | def delayupdate(self): |
|
222 | 228 | "delay visibility of index updates to other readers" |
|
229 | ||
|
230 | if not self._delayed: | |
|
231 | if len(self) == 0: | |
|
232 | self._divert = True | |
|
233 | if self._realopener.exists(self.indexfile + '.a'): | |
|
234 | self._realopener.unlink(self.indexfile + '.a') | |
|
235 | self.opener = _divertopener(self._realopener, self.indexfile) | |
|
236 | else: | |
|
237 | self._delaybuf = [] | |
|
238 | self.opener = _delayopener(self._realopener, self.indexfile, | |
|
239 | self._delaybuf) | |
|
223 | 240 | self._delayed = True |
|
224 | self._divert = (len(self) == 0) | |
|
225 | self._delaybuf = [] | |
|
226 | self.opener = delayopener(self._realopener, self.indexfile, | |
|
227 | self._divert, self._delaybuf) | |
|
228 | 241 | |
|
229 | 242 | def finalize(self, tr): |
|
230 | 243 | "finalize index updates" |
@@ -232,6 +245,7 b' class changelog(revlog.revlog):' | |||
|
232 | 245 | self.opener = self._realopener |
|
233 | 246 | # move redirected index data back into place |
|
234 | 247 | if self._divert: |
|
248 | assert not self._delaybuf | |
|
235 | 249 | tmpname = self.indexfile + ".a" |
|
236 | 250 | nfile = self.opener.open(tmpname) |
|
237 | 251 | nfile.close() |
@@ -240,7 +254,8 b' class changelog(revlog.revlog):' | |||
|
240 | 254 | fp = self.opener(self.indexfile, 'a') |
|
241 | 255 | fp.write("".join(self._delaybuf)) |
|
242 | 256 | fp.close() |
|
243 |
self._delaybuf = |
|
|
257 | self._delaybuf = None | |
|
258 | self._divert = False | |
|
244 | 259 | # split when we're done |
|
245 | 260 | self.checkinlinesize(tr) |
|
246 | 261 | |
@@ -262,8 +277,9 b' class changelog(revlog.revlog):' | |||
|
262 | 277 | fp2.write("".join(self._delaybuf)) |
|
263 | 278 | fp2.close() |
|
264 | 279 | # switch modes so finalize can simply rename |
|
265 |
self._delaybuf = |
|
|
280 | self._delaybuf = None | |
|
266 | 281 | self._divert = True |
|
282 | self.opener = _divertopener(self._realopener, self.indexfile) | |
|
267 | 283 | |
|
268 | 284 | if self._divert: |
|
269 | 285 | return True |
General Comments 0
You need to be logged in to leave comments.
Login now