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: