Mercurial > public > mercurial-scm > hg-stable
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) |