Mercurial > public > mercurial-scm > hg
comparison mercurial/localrepo.py @ 3417:028fff46a4ac
Add branchtags function with cache
- cache stores tipmost node and rev and node,label pairs
- if cache is out of date, scan new changesets
- write new cache out after scan
author | Matt Mackall <mpm@selenic.com> |
---|---|
date | Tue, 17 Oct 2006 18:31:18 -0500 |
parents | 9fe62e2db71d |
children | 5436c8fe0ff5 |
comparison
equal
deleted
inserted
replaced
3416:145a8fde69e6 | 3417:028fff46a4ac |
---|---|
77 if v == self.revlogversion: | 77 if v == self.revlogversion: |
78 v |= flags | 78 v |= flags |
79 self.revlogversion = v | 79 self.revlogversion = v |
80 | 80 |
81 self.tagscache = None | 81 self.tagscache = None |
82 self.branchcache = None | |
82 self.nodetagscache = None | 83 self.nodetagscache = None |
83 self.encodepats = None | 84 self.encodepats = None |
84 self.decodepats = None | 85 self.decodepats = None |
85 self.transhandle = None | 86 self.transhandle = None |
86 | 87 |
285 if not self.nodetagscache: | 286 if not self.nodetagscache: |
286 self.nodetagscache = {} | 287 self.nodetagscache = {} |
287 for t, n in self.tags().items(): | 288 for t, n in self.tags().items(): |
288 self.nodetagscache.setdefault(n, []).append(t) | 289 self.nodetagscache.setdefault(n, []).append(t) |
289 return self.nodetagscache.get(node, []) | 290 return self.nodetagscache.get(node, []) |
291 | |
292 def branchtags(self): | |
293 if self.branchcache != None: | |
294 return self.branchcache | |
295 | |
296 self.branchcache = {} | |
297 | |
298 try: | |
299 f = self.opener("branches.cache") | |
300 last, lrev = f.readline().rstrip().split(" ", 1) | |
301 last, lrev = bin(last), int(lrev) | |
302 if self.changelog.node(lrev) == last: # sanity check | |
303 for l in f: | |
304 node, label = l.rstrip().split(" ", 1) | |
305 self.branchcache[label] = bin(node) | |
306 f.close() | |
307 except IOError: | |
308 last, lrev = nullid, -1 | |
309 lrev = self.changelog.rev(last) | |
310 | |
311 tip = self.changelog.count() - 1 | |
312 if lrev != tip: | |
313 for r in range(lrev + 1, tip + 1): | |
314 n = self.changelog.node(r) | |
315 c = self.changelog.read(n) | |
316 b = c[5].get("branch") | |
317 if b: | |
318 self.branchcache[b] = n | |
319 self._writebranchcache() | |
320 | |
321 return self.branchcache | |
322 | |
323 def _writebranchcache(self): | |
324 f = self.opener("branches.cache", "w") | |
325 t = self.changelog.tip() | |
326 f.write("%s %s\n" % (hex(t), self.changelog.count() - 1)) | |
327 for label, node in self.branchcache.iteritems(): | |
328 f.write("%s %s\n" % (hex(node), label)) | |
290 | 329 |
291 def lookup(self, key): | 330 def lookup(self, key): |
292 try: | 331 try: |
293 return self.tags()[key] | 332 return self.tags()[key] |
294 except KeyError: | 333 except KeyError: |