Patchwork D10018: tags: update the hgtagsfnodes cache if invalid file nodes are found

login
register
mail settings
Submitter phabricator
Date Feb. 17, 2021, 7:44 p.m.
Message ID <differential-rev-PHID-DREV-zxfl6y77qiixp6v5k727-req@mercurial-scm.org>
Download mbox | patch
Permalink /patch/48332/
State Superseded
Headers show

Comments

phabricator - Feb. 17, 2021, 7:44 p.m.
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




To: pulkit, #hg-reviewers
Cc: mercurial-patches, mercurial-devel

Patch

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@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"""