##// END OF EJS Templates
changelog: move delayopener outside of class to eliminate reference cycle
Matt Mackall -
r9166:e6162b85 default
parent child Browse files
Show More
@@ -87,6 +87,16 b' class appender(object):'
87 self.data.append(str(s))
87 self.data.append(str(s))
88 self.offset += len(s)
88 self.offset += len(s)
89
89
90 def delayopener(opener, target, divert, buf):
91 def o(name, mode='r'):
92 if name != target:
93 return opener(name, mode)
94 if divert:
95 return opener(name + ".a", mode.replace('a', 'w'))
96 # otherwise, divert to memory
97 return appender(opener(name, mode), buf)
98 return o
99
90 class changelog(revlog.revlog):
100 class changelog(revlog.revlog):
91 def __init__(self, opener):
101 def __init__(self, opener):
92 revlog.revlog.__init__(self, opener, "00changelog.i")
102 revlog.revlog.__init__(self, opener, "00changelog.i")
@@ -99,7 +109,8 b' class changelog(revlog.revlog):'
99 self._delayed = True
109 self._delayed = True
100 self._divert = (len(self) == 0)
110 self._divert = (len(self) == 0)
101 self._delaybuf = []
111 self._delaybuf = []
102 self.opener = self._delayopener
112 self.opener = delayopener(self._realopener, self.indexfile,
113 self._divert, self._delaybuf)
103
114
104 def finalize(self, tr):
115 def finalize(self, tr):
105 "finalize index updates"
116 "finalize index updates"
@@ -107,8 +118,8 b' class changelog(revlog.revlog):'
107 self.opener = self._realopener
118 self.opener = self._realopener
108 # move redirected index data back into place
119 # move redirected index data back into place
109 if self._divert:
120 if self._divert:
110 n = self._realopener(self.indexfile).name
121 n = self.opener(self.indexfile + ".a").name
111 util.rename(n + ".a", n)
122 util.rename(n, n[:-2])
112 elif self._delaybuf:
123 elif self._delaybuf:
113 fp = self.opener(self.indexfile, 'a')
124 fp = self.opener(self.indexfile, 'a')
114 fp.write("".join(self._delaybuf))
125 fp.write("".join(self._delaybuf))
@@ -117,20 +128,6 b' class changelog(revlog.revlog):'
117 # split when we're done
128 # split when we're done
118 self.checkinlinesize(tr)
129 self.checkinlinesize(tr)
119
130
120 def _delayopener(self, name, mode='r'):
121 fp = self._realopener(name, mode)
122 # only divert the index
123 if not name == self.indexfile:
124 return fp
125 # if we're doing an initial clone, divert to another file
126 if self._divert:
127 if not len(self):
128 # make sure to truncate the file
129 mode = mode.replace('a', 'w')
130 return self._realopener(name + ".a", mode)
131 # otherwise, divert to memory
132 return appender(fp, self._delaybuf)
133
134 def readpending(self, file):
131 def readpending(self, file):
135 r = revlog.revlog(self.opener, file)
132 r = revlog.revlog(self.opener, file)
136 self.index = r.index
133 self.index = r.index
@@ -20,7 +20,7 b' echo % should fail'
20 hg add b
20 hg add b
21 hg st
21 hg st
22
22
23 hg ci -m 0
23 hg ci -m 0 --traceback
24 echo % should fail
24 echo % should fail
25 hg add a
25 hg add a
26
26
General Comments 0
You need to be logged in to leave comments. Login now