Show More
@@ -42,23 +42,30 b' def hash(text, p1, p2):' | |||||
42 |
|
42 | |||
43 | def compress(text): |
|
43 | def compress(text): | |
44 | """ generate a possibly-compressed representation of text """ |
|
44 | """ generate a possibly-compressed representation of text """ | |
45 |
if not text: |
|
45 | if not text: | |
|
46 | return ("", text) | |||
46 | if len(text) < 44: |
|
47 | if len(text) < 44: | |
47 |
if text[0] == '\0': |
|
48 | if text[0] == '\0': | |
|
49 | return ("", text) | |||
48 | return ('u', text) |
|
50 | return ('u', text) | |
49 | bin = zlib.compress(text) |
|
51 | bin = zlib.compress(text) | |
50 | if len(bin) > len(text): |
|
52 | if len(bin) > len(text): | |
51 |
if text[0] == '\0': |
|
53 | if text[0] == '\0': | |
|
54 | return ("", text) | |||
52 | return ('u', text) |
|
55 | return ('u', text) | |
53 | return ("", bin) |
|
56 | return ("", bin) | |
54 |
|
57 | |||
55 | def decompress(bin): |
|
58 | def decompress(bin): | |
56 | """ decompress the given input """ |
|
59 | """ decompress the given input """ | |
57 |
if not bin: |
|
60 | if not bin: | |
|
61 | return bin | |||
58 | t = bin[0] |
|
62 | t = bin[0] | |
59 |
if t == '\0': |
|
63 | if t == '\0': | |
60 | if t == 'x': return zlib.decompress(bin) |
|
64 | return bin | |
61 |
if t == ' |
|
65 | if t == 'x': | |
|
66 | return zlib.decompress(bin) | |||
|
67 | if t == 'u': | |||
|
68 | return bin[1:] | |||
62 | raise RevlogError(_("unknown compression type %r") % t) |
|
69 | raise RevlogError(_("unknown compression type %r") % t) | |
63 |
|
70 | |||
64 | indexformatv0 = ">4l20s20s20s" |
|
71 | indexformatv0 = ">4l20s20s20s" | |
@@ -106,7 +113,8 b' class lazyparser(object):' | |||||
106 | which is fairly slow. loadmap can load up just the node map, |
|
113 | which is fairly slow. loadmap can load up just the node map, | |
107 | which takes much less time. |
|
114 | which takes much less time. | |
108 | """ |
|
115 | """ | |
109 |
if self.allmap: |
|
116 | if self.allmap: | |
|
117 | return | |||
110 | end = self.datasize |
|
118 | end = self.datasize | |
111 | self.allmap = 1 |
|
119 | self.allmap = 1 | |
112 | cur = 0 |
|
120 | cur = 0 | |
@@ -126,7 +134,8 b' class lazyparser(object):' | |||||
126 | cur += blocksize |
|
134 | cur += blocksize | |
127 |
|
135 | |||
128 | def loadblock(self, blockstart, blocksize, data=None): |
|
136 | def loadblock(self, blockstart, blocksize, data=None): | |
129 |
if self.all: |
|
137 | if self.all: | |
|
138 | return | |||
130 | if data is None: |
|
139 | if data is None: | |
131 | self.dataf.seek(blockstart) |
|
140 | self.dataf.seek(blockstart) | |
132 | if blockstart + blocksize > self.datasize: |
|
141 | if blockstart + blocksize > self.datasize: | |
@@ -151,7 +160,8 b' class lazyparser(object):' | |||||
151 |
|
160 | |||
152 | def findnode(self, node): |
|
161 | def findnode(self, node): | |
153 | """search backwards through the index file for a specific node""" |
|
162 | """search backwards through the index file for a specific node""" | |
154 |
if self.allmap: |
|
163 | if self.allmap: | |
|
164 | return None | |||
155 |
|
165 | |||
156 | # hg log will cause many many searches for the manifest |
|
166 | # hg log will cause many many searches for the manifest | |
157 | # nodes. After we get called a few times, just load the whole |
|
167 | # nodes. After we get called a few times, just load the whole | |
@@ -194,7 +204,8 b' class lazyparser(object):' | |||||
194 | return None |
|
204 | return None | |
195 |
|
205 | |||
196 | def loadindex(self, i=None, end=None): |
|
206 | def loadindex(self, i=None, end=None): | |
197 |
if self.all: |
|
207 | if self.all: | |
|
208 | return | |||
198 | all = False |
|
209 | all = False | |
199 | if i == None: |
|
210 | if i == None: | |
200 | blockstart = 0 |
|
211 | blockstart = 0 | |
@@ -213,7 +224,8 b' class lazyparser(object):' | |||||
213 | while blockstart < end: |
|
224 | while blockstart < end: | |
214 | self.loadblock(blockstart, blocksize) |
|
225 | self.loadblock(blockstart, blocksize) | |
215 | blockstart += blocksize |
|
226 | blockstart += blocksize | |
216 |
if all: |
|
227 | if all: | |
|
228 | self.all = True | |||
217 |
|
229 | |||
218 | class lazyindex(object): |
|
230 | class lazyindex(object): | |
219 | """a lazy version of the index array""" |
|
231 | """a lazy version of the index array""" | |
@@ -277,8 +289,10 b' class lazymap(object):' | |||||
277 | def __delitem__(self, key): |
|
289 | def __delitem__(self, key): | |
278 | del self.p.map[key] |
|
290 | del self.p.map[key] | |
279 |
|
291 | |||
280 |
class RevlogError(Exception): |
|
292 | class RevlogError(Exception): | |
281 | class LookupError(RevlogError): pass |
|
293 | pass | |
|
294 | class LookupError(RevlogError): | |||
|
295 | pass | |||
282 |
|
296 | |||
283 | def getoffset(q): |
|
297 | def getoffset(q): | |
284 | if q & 0xFFFF: |
|
298 | if q & 0xFFFF: | |
@@ -474,17 +488,20 b' class revlog(object):' | |||||
474 | self.nodemap.p.loadmap() |
|
488 | self.nodemap.p.loadmap() | |
475 | self.nodemap = self.nodemap.p.map |
|
489 | self.nodemap = self.nodemap.p.map | |
476 |
|
490 | |||
477 | def _inline(self): return self.version & REVLOGNGINLINEDATA |
|
491 | def _inline(self): | |
|
492 | return self.version & REVLOGNGINLINEDATA | |||
|
493 | def tip(self): | |||
|
494 | return self.node(len(self.index) - 2) | |||
|
495 | def count(self): | |||
|
496 | return len(self.index) - 1 | |||
478 |
|
497 | |||
479 | def tip(self): return self.node(len(self.index) - 2) |
|
|||
480 | def count(self): return len(self.index) - 1 |
|
|||
481 | def node(self, rev): |
|
|||
482 | return self.index[rev][7] |
|
|||
483 | def rev(self, node): |
|
498 | def rev(self, node): | |
484 | try: |
|
499 | try: | |
485 | return self.nodemap[node] |
|
500 | return self.nodemap[node] | |
486 | except KeyError: |
|
501 | except KeyError: | |
487 | raise LookupError(_('%s: no node %s') % (self.indexfile, hex(node))) |
|
502 | raise LookupError(_('%s: no node %s') % (self.indexfile, hex(node))) | |
|
503 | def node(self, rev): | |||
|
504 | return self.index[rev][7] | |||
488 | def linkrev(self, node): |
|
505 | def linkrev(self, node): | |
489 | return self.index[self.rev(node)][4] |
|
506 | return self.index[self.rev(node)][4] | |
490 | def parents(self, node): |
|
507 | def parents(self, node): | |
@@ -494,7 +511,12 b' class revlog(object):' | |||||
494 | return self.index[rev][5:7] |
|
511 | return self.index[rev][5:7] | |
495 | def start(self, rev): |
|
512 | def start(self, rev): | |
496 | return getoffset(self.index[rev][0]) |
|
513 | return getoffset(self.index[rev][0]) | |
497 | def end(self, rev): return self.start(rev) + self.length(rev) |
|
514 | def end(self, rev): | |
|
515 | return self.start(rev) + self.length(rev) | |||
|
516 | def length(self, rev): | |||
|
517 | return self.index[rev][1] | |||
|
518 | def base(self, rev): | |||
|
519 | return self.index[rev][3] | |||
498 |
|
520 | |||
499 | def size(self, rev): |
|
521 | def size(self, rev): | |
500 | """return the length of the uncompressed text for a given revision""" |
|
522 | """return the length of the uncompressed text for a given revision""" | |
@@ -525,11 +547,6 b' class revlog(object):' | |||||
525 | return l |
|
547 | return l | |
526 | """ |
|
548 | """ | |
527 |
|
549 | |||
528 | def length(self, rev): |
|
|||
529 | return self.index[rev][1] |
|
|||
530 | def base(self, rev): |
|
|||
531 | return self.index[rev][3] |
|
|||
532 |
|
||||
533 | def reachable(self, node, stop=None): |
|
550 | def reachable(self, node, stop=None): | |
534 | """return a hash of all nodes ancestral to a given node, including |
|
551 | """return a hash of all nodes ancestral to a given node, including | |
535 | the node itself, stopping when stop is matched""" |
|
552 | the node itself, stopping when stop is matched""" | |
@@ -764,9 +781,12 b' class revlog(object):' | |||||
764 | try: |
|
781 | try: | |
765 | # str(rev) |
|
782 | # str(rev) | |
766 | rev = int(id) |
|
783 | rev = int(id) | |
767 |
if str(rev) != id: |
|
784 | if str(rev) != id: | |
768 | if rev < 0: rev = self.count() + rev |
|
785 | raise ValueError | |
769 | if rev < 0 or rev >= self.count(): raise ValueError |
|
786 | if rev < 0: | |
|
787 | rev = self.count() + rev | |||
|
788 | if rev < 0 or rev >= self.count(): | |||
|
789 | raise ValueError | |||
770 | return self.node(rev) |
|
790 | return self.node(rev) | |
771 | except (ValueError, OverflowError): |
|
791 | except (ValueError, OverflowError): | |
772 | pass |
|
792 | pass | |
@@ -800,7 +820,6 b' class revlog(object):' | |||||
800 | - revision number or str(revision number) |
|
820 | - revision number or str(revision number) | |
801 | - nodeid or subset of hex nodeid |
|
821 | - nodeid or subset of hex nodeid | |
802 | """ |
|
822 | """ | |
803 |
|
||||
804 | n = self._match(id) |
|
823 | n = self._match(id) | |
805 | if n is not None: |
|
824 | if n is not None: | |
806 | return n |
|
825 | return n | |
@@ -851,11 +870,6 b' class revlog(object):' | |||||
851 | loadcache(df) |
|
870 | loadcache(df) | |
852 | offset = 0 |
|
871 | offset = 0 | |
853 |
|
872 | |||
854 | #def checkchunk(): |
|
|||
855 | # df = self.opener(self.datafile) |
|
|||
856 | # df.seek(start) |
|
|||
857 | # return df.read(length) |
|
|||
858 | #assert s == checkchunk() |
|
|||
859 | return decompress(self._io.chunkcache[1][offset:offset + length]) |
|
873 | return decompress(self._io.chunkcache[1][offset:offset + length]) | |
860 |
|
874 | |||
861 | def delta(self, node): |
|
875 | def delta(self, node): | |
@@ -875,8 +889,10 b' class revlog(object):' | |||||
875 |
|
889 | |||
876 | def revision(self, node): |
|
890 | def revision(self, node): | |
877 | """return an uncompressed revision of a given""" |
|
891 | """return an uncompressed revision of a given""" | |
878 |
if node == nullid: |
|
892 | if node == nullid: | |
879 | if self.cache and self.cache[0] == node: return self.cache[2] |
|
893 | return "" | |
|
894 | if self.cache and self.cache[0] == node: | |||
|
895 | return self.cache[2] | |||
880 |
|
896 | |||
881 | # look up what we need to read |
|
897 | # look up what we need to read | |
882 | text = None |
|
898 | text = None | |
@@ -978,9 +994,12 b' class revlog(object):' | |||||
978 | return self._addrevision(text, transaction, link, p1, p2, d, ifh, dfh) |
|
994 | return self._addrevision(text, transaction, link, p1, p2, d, ifh, dfh) | |
979 |
|
995 | |||
980 | def _addrevision(self, text, transaction, link, p1, p2, d, ifh, dfh): |
|
996 | def _addrevision(self, text, transaction, link, p1, p2, d, ifh, dfh): | |
981 |
if text is None: |
|
997 | if text is None: | |
982 | if p1 is None: p1 = self.tip() |
|
998 | text = "" | |
983 |
if p |
|
999 | if p1 is None: | |
|
1000 | p1 = self.tip() | |||
|
1001 | if p2 is None: | |||
|
1002 | p2 = nullid | |||
984 |
|
1003 | |||
985 | node = hash(text, p1, p2) |
|
1004 | node = hash(text, p1, p2) | |
986 |
|
1005 |
General Comments 0
You need to be logged in to leave comments.
Login now