diff -r fcf14d87e0a4 -r dba3cadef789 mercurial/revlog.py --- a/mercurial/revlog.py Wed Oct 18 10:46:51 2006 -0500 +++ b/mercurial/revlog.py Wed Oct 18 11:44:56 2006 -0500 @@ -746,11 +746,7 @@ continue return c - def lookup(self, id): - """locate a node based on: - - revision number or str(revision number) - - nodeid or subset of hex nodeid - """ + def _match(self, id): if isinstance(id, (long, int)): # rev return self.node(id) @@ -772,13 +768,18 @@ return self.node(rev) except (ValueError, OverflowError): pass - try: - if len(id) == 40: + if len(id) == 40: + try: # a full hex nodeid? node = bin(id) r = self.rev(node) return node - elif len(id) < 40: + except TypeError: + pass + + def _partialmatch(self, id): + if len(id) < 40: + try: # hex(node)[:...] bin_id = bin(id[:len(id) & ~1]) # grab an even number of digits node = None @@ -789,8 +790,21 @@ node = n if node is not None: return node - except TypeError: - pass + except TypeError: + pass + + def lookup(self, id): + """locate a node based on: + - revision number or str(revision number) + - nodeid or subset of hex nodeid + """ + + n = self._match(id) + if n is not None: + return n + n = self._partialmatch(id) + if n: + return n raise RevlogError(_("No match found"))