D10018: tags: update the hgtagsfnodes cache if invalid file nodes are found
pulkit (Pulkit Goyal)
phabricator at mercurial-scm.org
Wed Feb 17 19:44:36 UTC 2021
pulkit created this revision.
Herald added a reviewer: hg-reviewers.
Herald added a subscriber: mercurial-patches.
REVISION SUMMARY
The cache update happens but it happens post calculation of alltags and hence we
still don't get correct list of tags in current run.
Next patch will try to fix this.
REPOSITORY
rHG Mercurial
BRANCH
default
REVISION DETAIL
https://phab.mercurial-scm.org/D10018
AFFECTED FILES
mercurial/tags.py
tests/test-tags.t
CHANGE DETAILS
diff --git a/tests/test-tags.t b/tests/test-tags.t
--- a/tests/test-tags.t
+++ b/tests/test-tags.t
@@ -451,9 +451,17 @@
4 0c192d7d5e6b78a714de54a2e9627952a877e25a 0c04f2a8af31de17fab7422878ee5a2dadbc943d
5 8dbfe60eff306a54259cfe007db9e330e7ecf866 0c04f2a8deadde17fab7422878ee5a2dadbc943d (invalid node)
- $ hg tags
- tip 5:8dbfe60eff30
- bar 1:78391a272241
+ $ hg tags --debug
+ found invalid fnodes for "8dbfe60eff306a54259cfe007db9e330e7ecf866", updating them
+ tip 5:8dbfe60eff306a54259cfe007db9e330e7ecf866
+ bar 1:78391a272241d70354aa14c874552cad6b51bb42
+
+ $ hg debugtagscache | tail -2
+ 4 0c192d7d5e6b78a714de54a2e9627952a877e25a 0c04f2a8af31de17fab7422878ee5a2dadbc943d
+ 5 8dbfe60eff306a54259cfe007db9e330e7ecf866 0c04f2a8af31de17fab7422878ee5a2dadbc943d
+ $ hg tags --debug
+ tip 5:8dbfe60eff306a54259cfe007db9e330e7ecf866
+ bar 1:78391a272241d70354aa14c874552cad6b51bb42
BUG: Unless this file is restored, the `hg tags` in the next unix-permissions
conditional will fail: "abort: data/.hgtags.i at 0c04f2a8dead: no match found"
diff --git a/mercurial/tags.py b/mercurial/tags.py
--- a/mercurial/tags.py
+++ b/mercurial/tags.py
@@ -201,6 +201,18 @@
), b"tag cache returned bogus head %s" % short(head)
fnodes = _filterfnodes(tagfnode, reversed(heads))
alltags, invalidnodes = _tagsfromfnodes(ui, repo, fnodes)
+ recomputeheads = []
+ for head, fnode in pycompat.iteritems(tagfnode):
+ if fnode in invalidnodes:
+ recomputeheads.append(head)
+ # only hgtagsfnodes contains fnodes explicitly
+ if source == 'hgtagsfnodes' and recomputeheads:
+ ui.debug(
+ b'found invalid fnodes for "%s", updating them\n'
+ % b','.join([hex(h) for h in recomputeheads])
+ )
+ fnodescache = hgtagsfnodescache(repo.unfiltered())
+ fnodescache.recomputefnodes(recomputeheads)
# and update the cache (if necessary)
if shouldwrite:
@@ -795,6 +807,14 @@
self._writeentry(offset, properprefix, fnode)
return fnode
+ def recomputefnodes(self, nodes):
+ """recomputes file nodes for given nodes as the current ones are
+ invalid and write the updates to the cache"""
+ for node in nodes:
+ fnode = self._computefnode(node)
+ self.setfnode(node, fnode)
+ self.write()
+
def _computefnode(self, node):
"""Finds the tag filenode for a node which is missing or invalid
in cache"""
To: pulkit, #hg-reviewers
Cc: mercurial-patches, mercurial-devel
More information about the Mercurial-devel
mailing list