revlog: handle hidden revs in _partialmatch (issue3979)
Looking up hidden prefixes could cause a no node exception
Looking up unique non-hidden prefixes could be ambiguous
--- a/mercurial/revlog.py Tue Jul 23 14:18:56 2013 -0500
+++ b/mercurial/revlog.py Tue Jul 23 17:28:12 2013 -0500
@@ -751,10 +751,14 @@
def _partialmatch(self, id):
try:
- return self.index.partialmatch(id)
+ n = self.index.partialmatch(id)
+ if n and self.hasnode(n):
+ return n
+ return None
except RevlogError:
# parsers.c radix tree lookup gave multiple matches
- raise LookupError(id, self.indexfile, _("ambiguous identifier"))
+ # fall through to slow path that filters hidden revisions
+ pass
except (AttributeError, ValueError):
# we are pure python, or key was too short to search radix tree
pass
@@ -768,7 +772,8 @@
l = len(id) // 2 # grab an even number of digits
prefix = bin(id[:l * 2])
nl = [e[7] for e in self.index if e[7].startswith(prefix)]
- nl = [n for n in nl if hex(n).startswith(id)]
+ nl = [n for n in nl if hex(n).startswith(id) and
+ self.hasnode(n)]
if len(nl) > 0:
if len(nl) == 1:
self._pcache[id] = nl[0]
--- a/tests/test-log.t Tue Jul 23 14:18:56 2013 -0500
+++ b/tests/test-log.t Tue Jul 23 17:28:12 2013 -0500
@@ -1223,6 +1223,9 @@
$ hg log --template='{rev}:{node}\n' --hidden
1:a765632148dc55d38c35c4f247c618701886cb2f
0:9f758d63dcde62d547ebfb08e1e7ee96535f2b05
+ $ hg log -r a
+ abort: unknown revision 'a'!
+ [255]
test that parent prevent a changeset to be hidden