comparison mercurial/revlog.py @ 36:da28286bf6b7

Add smart node lookup by substring or by rev number
author mpm@selenic.com
date Sat, 07 May 2005 16:11:36 -0800
parents 9cf83bf9ad38
children df3f46253878
comparison
equal deleted inserted replaced
35:9197c26a414b 36:da28286bf6b7
6 # Copyright 2005 Matt Mackall <mpm@selenic.com> 6 # Copyright 2005 Matt Mackall <mpm@selenic.com>
7 # 7 #
8 # This software may be used and distributed according to the terms 8 # This software may be used and distributed according to the terms
9 # of the GNU General Public License, incorporated herein by reference. 9 # of the GNU General Public License, incorporated herein by reference.
10 10
11 import zlib, struct, sha, os, tempfile 11 import zlib, struct, sha, os, tempfile, binascii
12 from mercurial import mdiff 12 from mercurial import mdiff
13
14 def hex(node): return binascii.hexlify(node)
15 def bin(node): return binascii.unhexlify(node)
13 16
14 def compress(text): 17 def compress(text):
15 return zlib.compress(text) 18 return zlib.compress(text)
16 19
17 def decompress(bin): 20 def decompress(bin):
30 self.indexfile = indexfile 33 self.indexfile = indexfile
31 self.datafile = datafile 34 self.datafile = datafile
32 self.index = [] 35 self.index = []
33 self.opener = opener 36 self.opener = opener
34 self.cache = None 37 self.cache = None
35 self.nodemap = { -1: nullid, nullid: -1 } 38 self.nodemap = {nullid: -1}
36 # read the whole index for now, handle on-demand later 39 # read the whole index for now, handle on-demand later
37 try: 40 try:
38 n = 0 41 n = 0
39 i = self.opener(self.indexfile).read() 42 i = self.opener(self.indexfile).read()
40 s = struct.calcsize(indexformat) 43 s = struct.calcsize(indexformat)
58 def start(self, rev): return self.index[rev][0] 61 def start(self, rev): return self.index[rev][0]
59 def length(self, rev): return self.index[rev][1] 62 def length(self, rev): return self.index[rev][1]
60 def end(self, rev): return self.start(rev) + self.length(rev) 63 def end(self, rev): return self.start(rev) + self.length(rev)
61 def base(self, rev): return self.index[rev][2] 64 def base(self, rev): return self.index[rev][2]
62 65
66 def lookup(self, id):
67 try:
68 rev = int(id)
69 return self.node(rev)
70 except ValueError:
71 c = []
72 for n in self.nodemap:
73 if id in hex(n):
74 c.append(n)
75 if len(c) > 1: raise KeyError("Ambiguous identifier")
76 if len(c) < 1: raise KeyError
77 return c[0]
78
79 return None
80
63 def revisions(self, list): 81 def revisions(self, list):
64 # this can be optimized to do spans, etc 82 # this can be optimized to do spans, etc
65 # be stupid for now 83 # be stupid for now
66 for node in list: 84 for node in list:
67 yield self.revision(node) 85 yield self.revision(node)
71 89
72 def patch(self, text, patch): 90 def patch(self, text, patch):
73 return mdiff.patch(text, patch) 91 return mdiff.patch(text, patch)
74 92
75 def revision(self, node): 93 def revision(self, node):
76 if node is nullid: return "" 94 if node == nullid: return ""
77 if self.cache and self.cache[0] == node: return self.cache[2] 95 if self.cache and self.cache[0] == node: return self.cache[2]
78 96
79 text = None 97 text = None
80 rev = self.rev(node) 98 rev = self.rev(node)
81 base = self.base(rev) 99 base = self.base(rev)