Mercurial > hg > mercurial-crew-with-dirclash
comparison mercurial/dirstate.py @ 1529:a208e86bbc34
add dirstate.lazyread, write atomically the dirstate
- add a dirstate.lazyread function that read only if it wasn't read before and
update all callers
- use the atomic keyword from util.opener to atomically write the dirstate
mercurial/dirstate.py
author | Benoit Boissinot <benoit.boissinot@ens-lyon.org> |
---|---|
date | Fri, 11 Nov 2005 15:34:06 -0800 |
parents | c13fce7167c2 |
children | bf4e7ef08741 |
comparison
equal
deleted
inserted
replaced
1528:c9f33196805b | 1529:a208e86bbc34 |
---|---|
99 | 99 |
100 def __getitem__(self, key): | 100 def __getitem__(self, key): |
101 try: | 101 try: |
102 return self.map[key] | 102 return self.map[key] |
103 except TypeError: | 103 except TypeError: |
104 self.read() | 104 self.lazyread() |
105 return self[key] | 105 return self[key] |
106 | 106 |
107 def __contains__(self, key): | 107 def __contains__(self, key): |
108 if not self.map: self.read() | 108 self.lazyread() |
109 return key in self.map | 109 return key in self.map |
110 | 110 |
111 def parents(self): | 111 def parents(self): |
112 if not self.pl: | 112 self.lazyread() |
113 self.read() | |
114 return self.pl | 113 return self.pl |
115 | 114 |
116 def markdirty(self): | 115 def markdirty(self): |
117 if not self.dirty: | 116 if not self.dirty: |
118 self.dirty = 1 | 117 self.dirty = 1 |
119 | 118 |
120 def setparents(self, p1, p2=nullid): | 119 def setparents(self, p1, p2=nullid): |
121 if not self.pl: | 120 self.lazyread() |
122 self.read() | |
123 self.markdirty() | 121 self.markdirty() |
124 self.pl = p1, p2 | 122 self.pl = p1, p2 |
125 | 123 |
126 def state(self, key): | 124 def state(self, key): |
127 try: | 125 try: |
128 return self[key][0] | 126 return self[key][0] |
129 except KeyError: | 127 except KeyError: |
130 return "?" | 128 return "?" |
131 | 129 |
130 def lazyread(self): | |
131 if self.map is None: | |
132 self.read() | |
133 | |
132 def read(self): | 134 def read(self): |
133 if self.map is not None: return self.map | |
134 | |
135 self.map = {} | 135 self.map = {} |
136 self.pl = [nullid, nullid] | 136 self.pl = [nullid, nullid] |
137 try: | 137 try: |
138 st = self.opener("dirstate").read() | 138 st = self.opener("dirstate").read() |
139 if not st: return | 139 if not st: return |
152 self.copies[f] = c | 152 self.copies[f] = c |
153 self.map[f] = e[:4] | 153 self.map[f] = e[:4] |
154 pos += l | 154 pos += l |
155 | 155 |
156 def copy(self, source, dest): | 156 def copy(self, source, dest): |
157 self.read() | 157 self.lazyread() |
158 self.markdirty() | 158 self.markdirty() |
159 self.copies[dest] = source | 159 self.copies[dest] = source |
160 | 160 |
161 def copied(self, file): | 161 def copied(self, file): |
162 return self.copies.get(file, None) | 162 return self.copies.get(file, None) |
167 m needs merging | 167 m needs merging |
168 r marked for removal | 168 r marked for removal |
169 a marked for addition''' | 169 a marked for addition''' |
170 | 170 |
171 if not files: return | 171 if not files: return |
172 self.read() | 172 self.lazyread() |
173 self.markdirty() | 173 self.markdirty() |
174 for f in files: | 174 for f in files: |
175 if state == "r": | 175 if state == "r": |
176 self.map[f] = ('r', 0, 0, 0) | 176 self.map[f] = ('r', 0, 0, 0) |
177 else: | 177 else: |
182 if self.copies.has_key(f): | 182 if self.copies.has_key(f): |
183 del self.copies[f] | 183 del self.copies[f] |
184 | 184 |
185 def forget(self, files): | 185 def forget(self, files): |
186 if not files: return | 186 if not files: return |
187 self.read() | 187 self.lazyread() |
188 self.markdirty() | 188 self.markdirty() |
189 for f in files: | 189 for f in files: |
190 try: | 190 try: |
191 del self.map[f] | 191 del self.map[f] |
192 except KeyError: | 192 except KeyError: |
196 def clear(self): | 196 def clear(self): |
197 self.map = {} | 197 self.map = {} |
198 self.markdirty() | 198 self.markdirty() |
199 | 199 |
200 def write(self): | 200 def write(self): |
201 st = self.opener("dirstate", "w") | 201 st = self.opener("dirstate", "w", atomic=True) |
202 st.write("".join(self.pl)) | 202 st.write("".join(self.pl)) |
203 for f, e in self.map.items(): | 203 for f, e in self.map.items(): |
204 c = self.copied(f) | 204 c = self.copied(f) |
205 if c: | 205 if c: |
206 f = f + "\0" + c | 206 f = f + "\0" + c |
256 util.pathto(self.getcwd(), f), | 256 util.pathto(self.getcwd(), f), |
257 kind)) | 257 kind)) |
258 return False | 258 return False |
259 | 259 |
260 def statwalk(self, files=None, match=util.always, dc=None): | 260 def statwalk(self, files=None, match=util.always, dc=None): |
261 self.read() | 261 self.lazyread() |
262 | 262 |
263 # walk all files by default | 263 # walk all files by default |
264 if not files: | 264 if not files: |
265 files = [self.root] | 265 files = [self.root] |
266 if not dc: | 266 if not dc: |