comparison mercurial/dirstate.py @ 4605:c867c11426ad

dirstate: lazify copymap, _branch, and _pl
author Matt Mackall <mpm@selenic.com>
date Mon, 18 Jun 2007 13:24:33 -0500
parents 0f6853c15606
children 9da7a4da650f
comparison
equal deleted inserted replaced
4604:0f6853c15606 4605:c867c11426ad
18 def __init__(self, opener, ui, root): 18 def __init__(self, opener, ui, root):
19 self.opener = opener 19 self.opener = opener
20 self.root = root 20 self.root = root
21 self.dirty = 0 21 self.dirty = 0
22 self.ui = ui 22 self.ui = ui
23 self.fp = None
24 self.pl = None
25 self.dirs = None 23 self.dirs = None
26 self.copymap = {}
27 self.ignorefunc = None 24 self.ignorefunc = None
28 self._branch = None
29 self._slash = None 25 self._slash = None
30 26
31 def __getattr__(self, name): 27 def __getattr__(self, name):
32 if name == 'map': 28 if name == 'map':
33 self.read() 29 self.read()
34 return self.map 30 return self.map
31 elif name == 'copymap':
32 self.read()
33 return self.copymap
34 elif name == '_branch':
35 try:
36 self._branch = self.opener("branch").read().strip()\
37 or "default"
38 except IOError:
39 self._branch = "default"
40 return self._branch
41 elif name == 'pl':
42 self.pl = [nullid, nullid]
43 try:
44 st = self.opener("dirstate").read(40)
45 if len(st) == 40:
46 self.pl = st[:20], st[20:40]
47 except IOError, err:
48 if err.errno != errno.ENOENT: raise
49 return self.pl
35 else: 50 else:
36 raise AttributeError, name 51 raise AttributeError, name
37 52
38 def wjoin(self, f): 53 def wjoin(self, f):
39 return os.path.join(self.root, f) 54 return os.path.join(self.root, f)
160 175
161 def __contains__(self, key): 176 def __contains__(self, key):
162 return key in self.map 177 return key in self.map
163 178
164 def parents(self): 179 def parents(self):
165 if self.pl is None:
166 self.pl = [nullid, nullid]
167 try:
168 self.fp = self.opener('dirstate')
169 st = self.fp.read(40)
170 if len(st) == 40:
171 self.pl = st[:20], st[20:40]
172 except IOError, err:
173 if err.errno != errno.ENOENT: raise
174 return self.pl 180 return self.pl
175 181
176 def branch(self): 182 def branch(self):
177 if not self._branch:
178 try:
179 self._branch = self.opener("branch").read().strip()\
180 or "default"
181 except IOError:
182 self._branch = "default"
183 return self._branch 183 return self._branch
184 184
185 def markdirty(self): 185 def markdirty(self):
186 if not self.dirty: 186 if not self.dirty:
187 self.dirty = 1 187 self.dirty = 1
225 map[f] = e[:4] 225 map[f] = e[:4]
226 pos = newpos 226 pos = newpos
227 227
228 def read(self): 228 def read(self):
229 self.map = {} 229 self.map = {}
230 self.copymap = {}
230 self.pl = [nullid, nullid] 231 self.pl = [nullid, nullid]
231 try: 232 try:
232 if self.fp: 233 st = self.opener("dirstate").read()
233 self.fp.seek(0)
234 st = self.fp.read()
235 self.fp = None
236 else:
237 st = self.opener("dirstate").read()
238 if st: 234 if st:
239 self.parse(st) 235 self.parse(st)
240 except IOError, err: 236 except IOError, err:
241 if err.errno != errno.ENOENT: raise 237 if err.errno != errno.ENOENT: raise
242 238