revlog: handle hidden revs in _partialmatch (issue3979) stable
authorMatt Mackall <mpm@selenic.com>
Tue, 23 Jul 2013 17:28:12 -0500
branchstable
changeset 19471 fd1bb7c1be78
parent 19470 19ac0d8ee9a2
child 19472 32e502b26983
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
mercurial/revlog.py
tests/test-log.t
--- 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