comparison mercurial/dirstate.py @ 4371:abeb3edb2b4e

dirstate: make parents() faster. This allows localrepository.status() to avoid reading all but the first 40 bytes of the dirstate in the common case of running "hg status".
author Bryan O'Sullivan <bos@serpentine.com>
date Tue, 24 Apr 2007 11:46:15 -0700
parents 1cc5fc1d0994
children 9edc2d6f7c10
comparison
equal deleted inserted replaced
4370:4ddc6d374265 4371:abeb3edb2b4e
18 self.opener = opener 18 self.opener = opener
19 self.root = root 19 self.root = root
20 self.dirty = 0 20 self.dirty = 0
21 self.ui = ui 21 self.ui = ui
22 self.map = None 22 self.map = None
23 self.fp = None
23 self.pl = None 24 self.pl = None
24 self.dirs = None 25 self.dirs = None
25 self.copymap = {} 26 self.copymap = {}
26 self.ignorefunc = None 27 self.ignorefunc = None
27 self._branch = None 28 self._branch = None
131 return self.map[key] 132 return self.map[key]
132 except TypeError: 133 except TypeError:
133 self.lazyread() 134 self.lazyread()
134 return self[key] 135 return self[key]
135 136
137 _unknown = ('?', 0, 0, 0)
138
139 def get(self, key):
140 try:
141 return self[key]
142 except KeyError:
143 return self._unknown
144
136 def __contains__(self, key): 145 def __contains__(self, key):
137 self.lazyread() 146 self.lazyread()
138 return key in self.map 147 return key in self.map
139 148
140 def parents(self): 149 def parents(self):
141 self.lazyread() 150 if self.pl is None:
151 self.pl = [nullid, nullid]
152 try:
153 self.fp = self.opener('dirstate')
154 st = self.fp.read(40)
155 if len(st) == 40:
156 self.pl = st[:20], st[20:40]
157 except IOError, err:
158 if err.errno != errno.ENOENT: raise
142 return self.pl 159 return self.pl
143 160
144 def branch(self): 161 def branch(self):
145 if not self._branch: 162 if not self._branch:
146 try: 163 try:
200 217
201 def read(self): 218 def read(self):
202 self.map = {} 219 self.map = {}
203 self.pl = [nullid, nullid] 220 self.pl = [nullid, nullid]
204 try: 221 try:
205 st = self.opener("dirstate").read() 222 if self.fp:
223 self.fp.seek(0)
224 st = self.fp.read()
225 self.fp = None
226 else:
227 st = self.opener("dirstate").read()
206 if st: 228 if st:
207 self.parse(st) 229 self.parse(st)
208 except IOError, err: 230 except IOError, err:
209 if err.errno != errno.ENOENT: raise 231 if err.errno != errno.ENOENT: raise
210 232