Add smart node lookup by substring or by rev number
authormpm@selenic.com
Sat, 07 May 2005 16:11:36 -0800
changeset 36 da28286bf6b7
parent 35 9197c26a414b
child 37 a8811676c85a
Add smart node lookup by substring or by rev number
mercurial/revlog.py
--- a/mercurial/revlog.py	Sat May 07 16:10:50 2005 -0800
+++ b/mercurial/revlog.py	Sat May 07 16:11:36 2005 -0800
@@ -8,9 +8,12 @@
 # This software may be used and distributed according to the terms
 # of the GNU General Public License, incorporated herein by reference.
 
-import zlib, struct, sha, os, tempfile
+import zlib, struct, sha, os, tempfile, binascii
 from mercurial import mdiff
 
+def hex(node): return binascii.hexlify(node)
+def bin(node): return binascii.unhexlify(node)
+
 def compress(text):
     return zlib.compress(text)
 
@@ -32,7 +35,7 @@
         self.index = []
         self.opener = opener
         self.cache = None
-        self.nodemap = { -1: nullid, nullid: -1 }
+        self.nodemap = {nullid: -1}
         # read the whole index for now, handle on-demand later
         try:
             n = 0
@@ -60,6 +63,21 @@
     def end(self, rev): return self.start(rev) + self.length(rev)
     def base(self, rev): return self.index[rev][2]
 
+    def lookup(self, id):
+        try:
+            rev = int(id)
+            return self.node(rev)
+        except ValueError:
+            c = []
+            for n in self.nodemap:
+                if id in hex(n):
+                    c.append(n)
+            if len(c) > 1: raise KeyError("Ambiguous identifier")
+            if len(c) < 1: raise KeyError
+            return c[0]
+                
+        return None
+
     def revisions(self, list):
         # this can be optimized to do spans, etc
         # be stupid for now
@@ -73,7 +91,7 @@
         return mdiff.patch(text, patch)
 
     def revision(self, node):
-        if node is nullid: return ""
+        if node == nullid: return ""
         if self.cache and self.cache[0] == node: return self.cache[2]
 
         text = None