Correct optimization from 56bc6966622e; 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 56bc6966622e, we were parsing the file in the first head and
skipping all the others.)
This commit is contained in:
Alexis S. L. Carvalho 2006-10-28 23:37:59 -03:00
parent c8198124de
commit 17f016acd0
3 changed files with 42 additions and 7 deletions

View File

@ -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 = []

View File

@ -60,3 +60,19 @@ hg commit -m "head" -d "1000000 0"
hg tags
hg tip
# tags from later heads override previous ones
cd ..
hg init t2
cd t2
echo foo > foo
hg add foo
hg ci -m 'add foo' -d '1000000 0' # rev 0
hg tag -d '1000000 0' bar # rev 1
echo >> foo
hg ci -m 'change foo 1' -d '1000000 0' # rev 2
hg up -C 1
hg tag -r 1 -d '1000000 0' bar # rev 3
hg up -C 1
echo >> foo
hg ci -m 'change foo 2' -d '1000000 0' # rev 4
hg tags

View File

@ -36,3 +36,7 @@ user: test
date: Mon Jan 12 13:46:40 1970 +0000
summary: head
1 files updated, 0 files merged, 0 files removed, 0 files unresolved
1 files updated, 0 files merged, 0 files removed, 0 files unresolved
tip 4:36195b728445
bar 0:b409d9da318e