From 06155d5c8af5976c99063d7f93790405d865b713 Mon Sep 17 00:00:00 2001 From: Matt Mackall Date: Tue, 23 Jul 2013 17:28:12 -0500 Subject: [PATCH] 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 | 11 ++++++++--- tests/test-log.t | 3 +++ 2 files changed, 11 insertions(+), 3 deletions(-) diff --git a/mercurial/revlog.py b/mercurial/revlog.py index af929083f7..9921e64b91 100644 --- a/mercurial/revlog.py +++ b/mercurial/revlog.py @@ -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] diff --git a/tests/test-log.t b/tests/test-log.t index 1e6e5fe73e..84ba81dc84 100644 --- a/tests/test-log.t +++ b/tests/test-log.t @@ -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