mirror of
https://github.com/facebook/sapling.git
synced 2024-10-07 07:17:55 +03:00
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:
parent
c8198124de
commit
17f016acd0
@ -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 = []
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
|
Loading…
Reference in New Issue
Block a user