Mercurial > public > mercurial-scm > hg-stable
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 |