tags: don't read .hgtags fnodes from tags cache files
Now that we have a standalone and shared cache for .hgtags fnodes, the
.hgtags fnodes stored in the tags cache files are redundant.
Upcoming patches will change the format of the tags cache files to
remove this data and to improve the validation. To prepare for this, we
change the tags reading code to ignore all but the tip .hgtags fnodes
entries in existing tags cache files.
All fnodes lookups now go through our new shared cache, which is why
test output changed. Format of tags cache files has not yet changed.
--- a/mercurial/tags.py Mon Apr 13 14:54:02 2015 -0400
+++ b/mercurial/tags.py Thu Apr 16 10:12:44 2015 -0400
@@ -278,26 +278,23 @@
except IOError:
cachefile = None
- cacherevs = [] # list of headrev
- cacheheads = [] # list of headnode
- cachefnode = {} # map headnode to filenode
+ cachetiprev = None
+ cachetipnode = None
if cachefile:
try:
- for line in cachelines:
+ for i, line in enumerate(cachelines):
+ # Getting the first line and consuming all fnode lines.
if line == "\n":
break
+ if i != 0:
+ continue
+
line = line.split()
- cacherevs.append(int(line[0]))
- headnode = bin(line[1])
- cacheheads.append(headnode)
- if len(line) == 3:
- fnode = bin(line[2])
- cachefnode[headnode] = fnode
+ cachetiprev = int(line[0])
+ cachetipnode = bin(line[1])
except Exception:
- # corruption of the tags cache, just recompute it
- cacheheads = []
- cacherevs = []
- cachefnode = {}
+ # corruption of the cache, just recompute it.
+ pass
tipnode = repo.changelog.tip()
tiprev = len(repo.changelog) - 1
@@ -306,7 +303,9 @@
# (Unchanged tip trivially means no changesets have been added.
# But, thanks to localrepository.destroyed(), it also means none
# have been destroyed by strip or rollback.)
- if cacheheads and cacheheads[0] == tipnode and cacherevs[0] == tiprev:
+ if (cachetiprev is not None
+ and cachetiprev == tiprev
+ and cachetipnode == tipnode):
tags = _readtags(ui, repo, cachelines, cachefile.name)
cachefile.close()
return (None, None, tags, False)
@@ -335,20 +334,17 @@
if not len(repo.file('.hgtags')):
# No tags have ever been committed, so we can avoid a
# potentially expensive search.
- return (repoheads, cachefnode, None, True)
+ return (repoheads, {}, None, True)
starttime = time.time()
- newheads = [head
- for head in repoheads
- if head not in set(cacheheads)]
-
# Now we have to lookup the .hgtags filenode for every new head.
# This is the most expensive part of finding tags, so performance
# depends primarily on the size of newheads. Worst case: no cache
# file, so newheads == repoheads.
fnodescache = hgtagsfnodescache(repo.unfiltered())
- for head in reversed(newheads):
+ cachefnode = {}
+ for head in reversed(repoheads):
fnode = fnodescache.getfnode(head)
if fnode != nullid:
cachefnode[head] = fnode
--- a/tests/test-tags.t Mon Apr 13 14:54:02 2015 -0400
+++ b/tests/test-tags.t Thu Apr 16 10:12:44 2015 -0400
@@ -345,7 +345,7 @@
$ hg blackbox -l 5
1970/01/01 00:00:00 bob> tags
1970/01/01 00:00:00 bob> writing 24 bytes to cache/hgtagsfnodes1
- 1970/01/01 00:00:00 bob> 0/1 cache hits/lookups in * seconds (glob)
+ 1970/01/01 00:00:00 bob> 2/3 cache hits/lookups in * seconds (glob)
1970/01/01 00:00:00 bob> writing tags cache file with 3 heads and 1 tags
1970/01/01 00:00:00 bob> tags exited 0 after * seconds (glob)
@@ -396,7 +396,7 @@
$ hg blackbox -l 4
1970/01/01 00:00:00 bob> tags
- 1970/01/01 00:00:00 bob> 1/1 cache hits/lookups in * seconds (glob)
+ 1970/01/01 00:00:00 bob> 3/3 cache hits/lookups in * seconds (glob)
1970/01/01 00:00:00 bob> writing tags cache file with 3 heads and 1 tags
1970/01/01 00:00:00 bob> tags exited 0 after * seconds (glob)
@@ -413,7 +413,7 @@
$ hg blackbox -l 5
1970/01/01 00:00:00 bob> tags
1970/01/01 00:00:00 bob> writing 24 bytes to cache/hgtagsfnodes1
- 1970/01/01 00:00:00 bob> 0/1 cache hits/lookups in * seconds (glob)
+ 1970/01/01 00:00:00 bob> 2/3 cache hits/lookups in * seconds (glob)
1970/01/01 00:00:00 bob> writing tags cache file with 3 heads and 1 tags
1970/01/01 00:00:00 bob> tags exited 0 after * seconds (glob)
$ f --size .hg/cache/hgtagsfnodes1