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
This commit is contained in:
Matt Mackall 2013-07-23 17:28:12 -05:00
parent 704604439e
commit 06155d5c8a
2 changed files with 11 additions and 3 deletions

View File

@ -751,10 +751,14 @@ class revlog(object):
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 @@ class revlog(object):
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]

View File

@ -1223,6 +1223,9 @@ enable obsolete to test hidden feature
$ 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