equal
deleted
inserted
replaced
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) |