comparison mercurial/revlog.py @ 13254:5ef5eb1f3515

revlog: only build the nodemap on demand
author Matt Mackall <mpm@selenic.com>
date Tue, 11 Jan 2011 17:01:04 -0600
parents 61c9bc3da402
children c2661863f16f
comparison
equal deleted inserted replaced
13253:61c9bc3da402 13254:5ef5eb1f3515
170 def __init__(self): 170 def __init__(self):
171 self.size = struct.calcsize(indexformatng) 171 self.size = struct.calcsize(indexformatng)
172 172
173 def parseindex(self, fp, data, inline): 173 def parseindex(self, fp, data, inline):
174 # call the C implementation to parse the index data 174 # call the C implementation to parse the index data
175 index, nodemap, cache = parsers.parse_index(data, inline) 175 index, cache = parsers.parse_index2(data, inline)
176 return index, nodemap, cache 176 return index, None, cache
177 177
178 def packentry(self, entry, node, version, rev): 178 def packentry(self, entry, node, version, rev):
179 p = _pack(indexformatng, *entry) 179 p = _pack(indexformatng, *entry)
180 if rev == 0: 180 if rev == 0:
181 p = _pack(versionformat, version) + p[4:] 181 p = _pack(versionformat, version) + p[4:]
216 self.indexfile = indexfile 216 self.indexfile = indexfile
217 self.datafile = indexfile[:-2] + ".d" 217 self.datafile = indexfile[:-2] + ".d"
218 self.opener = opener 218 self.opener = opener
219 self._cache = None 219 self._cache = None
220 self._chunkcache = (0, '') 220 self._chunkcache = (0, '')
221 self.nodemap = {nullid: nullrev}
222 self.index = [] 221 self.index = []
223 self._shallowroot = shallowroot 222 self._shallowroot = shallowroot
224 self._parentdelta = 0 223 self._parentdelta = 0
225 224
226 v = REVLOG_DEFAULT_VERSION 225 v = REVLOG_DEFAULT_VERSION
265 if i: 264 if i:
266 try: 265 try:
267 d = self._io.parseindex(f, i, self._inline) 266 d = self._io.parseindex(f, i, self._inline)
268 except (ValueError, IndexError): 267 except (ValueError, IndexError):
269 raise RevlogError(_("index %s is corrupted") % (self.indexfile)) 268 raise RevlogError(_("index %s is corrupted") % (self.indexfile))
270 self.index, self.nodemap, self._chunkcache = d 269 self.index, n, self._chunkcache = d
270 if n:
271 self.nodemap = n
271 if not self._chunkcache: 272 if not self._chunkcache:
272 self._chunkclear() 273 self._chunkclear()
273 274
274 # add the magic null revision at -1 (if it hasn't been done already) 275 # add the magic null revision at -1 (if it hasn't been done already)
275 if self.index == [] or self.index[-1][7] != nullid: 276 if self.index == [] or self.index[-1][7] != nullid:
276 self.index.append((0, 0, 0, -1, -1, -1, -1, nullid)) 277 self.index.append((0, 0, 0, -1, -1, -1, -1, nullid))
278
279 @util.propertycache
280 def nodemap(self):
281 n = {nullid: nullrev}
282 i = self.index
283 for r in xrange(len(i) - 1):
284 n[i[r][7]] = r
285 return n
277 286
278 def tip(self): 287 def tip(self):
279 return self.node(len(self.index) - 2) 288 return self.node(len(self.index) - 2)
280 def __len__(self): 289 def __len__(self):
281 return len(self.index) - 1 290 return len(self.index) - 1