diff mercurial/localrepo.py @ 3577:7f7425306925

Correct optimization from 3464f5e77f34; add a test. If there are two (or more) heads that point to the same .hgtags node, we can safely skip parsing the file in all but the last head. (In 3464f5e77f34, we were parsing the file in the first head and skipping all the others.)
author Alexis S. L. Carvalho <alexis@cecm.usp.br>
date Sat, 28 Oct 2006 23:37:59 -0300
parents 23f7d9621783
children 3b4e00cba57a
line wrap: on
line diff
--- a/mercurial/localrepo.py
+++ b/mercurial/localrepo.py
@@ -244,13 +244,10 @@ class localrepository(repo.repository):
             # read the tags file from each head, ending with the tip,
             # and add each tag found to the map, with "newer" ones
             # taking precedence
-            heads = self.heads()
-            heads.reverse()
-            seen = {}
-            for node in heads:
-                f = self.filectx('.hgtags', node)
-                if not f or f.filerev() in seen: continue
-                seen[f.filerev()] = 1
+            f = None
+            for rev, node, fnode in self._hgtagsnodes():
+                f = (f and f.filectx(fnode) or
+                     self.filectx('.hgtags', fileid=fnode))
                 count = 0
                 for l in f.data().splitlines():
                     count += 1
@@ -269,6 +266,24 @@ class localrepository(repo.repository):
 
         return self.tagscache
 
+    def _hgtagsnodes(self):
+        heads = self.heads()
+        heads.reverse()
+        last = {}
+        ret = []
+        for node in heads:
+            c = self.changectx(node)
+            rev = c.rev()
+            try:
+                fnode = c.filenode('.hgtags')
+            except repo.LookupError:
+                continue
+            ret.append((rev, node, fnode))
+            if fnode in last:
+                ret[last[fnode]] = None
+            last[fnode] = len(ret) - 1
+        return [item for item in ret if item]
+
     def tagslist(self):
         '''return a list of tags ordered by revision'''
         l = []