repoview: do not crash when localtags refers to non existing revisions stable
authorAngel Ezquerra <angel.ezquerra@gmail.com>
Sun, 29 Jun 2014 13:52:35 +0200
branchstable
changeset 21823 925d1bb9a971
parent 21815 a4b67bf1f0a5
child 21825 3666331164bb
repoview: do not crash when localtags refers to non existing revisions This fixes a crash that may happen when using mercurial 3.0.x. The _gethiddenblockers function assumed that the output of tags.readlocaltags() was a dict mapping tags to of valid nodes. However this was not necessarily the case. When a repository had obsolete revisions and had local tag pointing to a non existing revision was found, many mercurial commands would crash. This revision fixes the problem by removing any tags from the output of tags.readlocaltags() which point to invalid nodes. We may want to add a warning when this happens (although it might be annoying to get that warning for every command, possibly even more than once per command). A test for this problem has been added to test-obsolete.t. Without this fix the test would output: $ hg tags abort: 00changelog.i@3816541e5485: no node! [255] Instead of: $ hg tags tiptag 2:3816541e5485 tip 2:3816541e5485 visible 0:193e9254ce7e
mercurial/tags.py
tests/test-obsolete.t
--- a/mercurial/tags.py	Wed Jun 25 14:50:48 2014 -0700
+++ b/mercurial/tags.py	Sun Jun 29 13:52:35 2014 +0200
@@ -72,6 +72,15 @@
     filetags = _readtags(
         ui, repo, data.splitlines(), "localtags",
         recode=encoding.fromlocal)
+
+    # remove tags pointing to invalid nodes
+    cl = repo.changelog
+    for t in filetags.keys():
+        try:
+            cl.rev(filetags[t][0])
+        except (LookupError, ValueError):
+            del filetags[t]
+
     _updatetags(filetags, "local", alltags, tagtypes)
 
 def _readtags(ui, repo, lines, fn, recode=None):
--- a/tests/test-obsolete.t	Wed Jun 25 14:50:48 2014 -0700
+++ b/tests/test-obsolete.t	Sun Jun 29 13:52:35 2014 +0200
@@ -907,3 +907,15 @@
      date:        Thu Jan 01 00:00:00 1970 +0000
      summary:     A
   
+Test that removing a local tag does not cause some commands to fail
+
+  $ hg tag -l -r tip tiptag
+  $ hg tags
+  tiptag                             2:3816541e5485
+  tip                                2:3816541e5485
+  visible                            0:193e9254ce7e
+  $ hg --config extensions.strip= strip -r tip --no-backup
+  0 files updated, 0 files merged, 1 files removed, 0 files unresolved
+  $ hg tags
+  visible                            0:193e9254ce7e
+  tip                                0:193e9254ce7e