Mercurial > hg
changeset 3438:b17f9d3eda74
revlog.lookup tweaks
- fast path for binary node ids
- direct lookup for full hex ids
- silly change to bin_id
author | Matt Mackall <mpm@selenic.com> |
---|---|
date | Tue, 17 Oct 2006 22:07:54 -0500 |
parents | d96429ddc8e2 |
children | a7ef6b6cc311 |
files | mercurial/revlog.py |
diffstat | 1 files changed, 24 insertions(+), 17 deletions(-) [+] |
line wrap: on
line diff
--- a/mercurial/revlog.py Tue Oct 17 19:04:13 2006 -0500 +++ b/mercurial/revlog.py Tue Oct 17 22:07:54 2006 -0500 @@ -754,6 +754,15 @@ if isinstance(id, (long, int)): # rev return self.node(id) + if len(id) == 20: + # possibly a binary node + # odds of a binary node being all hex in ASCII are 1 in 10**25 + try: + node = id + r = self.rev(node) # quick search the index + return node + except RevlogError: + pass # may be partial hex id try: # str(rev) rev = int(id) @@ -764,27 +773,25 @@ except (ValueError, OverflowError): pass try: - # hex(node)[:...] - if len(id) % 2 == 0: - bin_id = bin(id) - else: - bin_id = bin(id[:-1]) - node = None - for n in self.nodemap: - if n.startswith(bin_id) and hex(n).startswith(id): - if node is not None: - raise RevlogError(_("Ambiguous identifier")) - node = n - if node is not None: + if len(id) == 40: + # a full hex nodeid? + node = bin(id) + r = self.rev(node) return node + elif len(id) < 40: + # hex(node)[:...] + bin_id = bin(id[:len(id) & ~1]) # grab an even number of digits + node = None + for n in self.nodemap: + if n.startswith(bin_id) and hex(n).startswith(id): + if node is not None: + raise RevlogError(_("Ambiguous identifier")) + node = n + if node is not None: + return node except TypeError: pass - # might need fixing if we change hash lengths - if len(id) == 20 and id in self.nodemap: - # node - return id - raise RevlogError(_("No match found")) def cmp(self, node, text):