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