Mercurial > public > mercurial-scm > hg
comparison mercurial/changelog.py @ 9165:07f9b2f4a9aa
changelog: swap opener to switch delay modes
author | Matt Mackall <mpm@selenic.com> |
---|---|
date | Sat, 18 Jul 2009 11:26:35 -0500 |
parents | b0d995b6b0a6 |
children | e6162b854ed5 |
comparison
equal
deleted
inserted
replaced
9164:b0d995b6b0a6 | 9165:07f9b2f4a9aa |
---|---|
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 class changelog(revlog.revlog): | 90 class changelog(revlog.revlog): |
91 def __init__(self, opener): | 91 def __init__(self, opener): |
92 revlog.revlog.__init__(self, opener, "00changelog.i") | |
92 self._realopener = opener | 93 self._realopener = opener |
93 self._delayed = False | 94 self._delayed = False |
94 self._divert = False | 95 self._divert = False |
95 revlog.revlog.__init__(self, self._delayopener, "00changelog.i") | |
96 | 96 |
97 def delayupdate(self): | 97 def delayupdate(self): |
98 "delay visibility of index updates to other readers" | 98 "delay visibility of index updates to other readers" |
99 self._delayed = True | 99 self._delayed = True |
100 self._divert = (len(self) == 0) | 100 self._divert = (len(self) == 0) |
101 self._delaybuf = [] | 101 self._delaybuf = [] |
102 self.opener = self._delayopener | |
102 | 103 |
103 def finalize(self, tr): | 104 def finalize(self, tr): |
104 "finalize index updates" | 105 "finalize index updates" |
105 self._delayed = False | 106 self._delayed = False |
107 self.opener = self._realopener | |
106 # move redirected index data back into place | 108 # move redirected index data back into place |
107 if self._divert: | 109 if self._divert: |
108 n = self._realopener(self.indexfile).name | 110 n = self._realopener(self.indexfile).name |
109 util.rename(n + ".a", n) | 111 util.rename(n + ".a", n) |
110 elif self._delaybuf: | 112 elif self._delaybuf: |
116 self.checkinlinesize(tr) | 118 self.checkinlinesize(tr) |
117 | 119 |
118 def _delayopener(self, name, mode='r'): | 120 def _delayopener(self, name, mode='r'): |
119 fp = self._realopener(name, mode) | 121 fp = self._realopener(name, mode) |
120 # only divert the index | 122 # only divert the index |
121 if not self._delayed or not name == self.indexfile: | 123 if not name == self.indexfile: |
122 return fp | 124 return fp |
123 # if we're doing an initial clone, divert to another file | 125 # if we're doing an initial clone, divert to another file |
124 if self._divert: | 126 if self._divert: |
125 if not len(self): | 127 if not len(self): |
126 # make sure to truncate the file | 128 # make sure to truncate the file |
153 return True | 155 return True |
154 | 156 |
155 return False | 157 return False |
156 | 158 |
157 def checkinlinesize(self, tr, fp=None): | 159 def checkinlinesize(self, tr, fp=None): |
158 if self.opener == self._delayopener: | 160 if not self._delayed: |
159 return | 161 revlog.revlog.checkinlinesize(self, tr, fp) |
160 return revlog.revlog.checkinlinesize(self, tr, fp) | |
161 | 162 |
162 def read(self, node): | 163 def read(self, node): |
163 """ | 164 """ |
164 format used: | 165 format used: |
165 nodeid\n : manifest node in ascii | 166 nodeid\n : manifest node in ascii |