Show More
@@ -0,0 +1,144 b'' | |||
|
1 | # revlogv0 - code related to revlog format "V0" | |
|
2 | # | |
|
3 | # Copyright 2005-2007 Olivia Mackall <olivia@selenic.com> | |
|
4 | # | |
|
5 | # This software may be used and distributed according to the terms of the | |
|
6 | # GNU General Public License version 2 or any later version. | |
|
7 | from __future__ import absolute_import | |
|
8 | ||
|
9 | ||
|
10 | from ..node import sha1nodeconstants | |
|
11 | from .constants import ( | |
|
12 | INDEX_ENTRY_V0, | |
|
13 | ) | |
|
14 | from ..i18n import _ | |
|
15 | ||
|
16 | from .. import ( | |
|
17 | error, | |
|
18 | node, | |
|
19 | pycompat, | |
|
20 | util, | |
|
21 | ) | |
|
22 | ||
|
23 | from . import ( | |
|
24 | flagutil, | |
|
25 | nodemap as nodemaputil, | |
|
26 | ) | |
|
27 | ||
|
28 | ||
|
29 | def getoffset(q): | |
|
30 | return int(q >> 16) | |
|
31 | ||
|
32 | ||
|
33 | def gettype(q): | |
|
34 | return int(q & 0xFFFF) | |
|
35 | ||
|
36 | ||
|
37 | def offset_type(offset, type): | |
|
38 | if (type & ~flagutil.REVIDX_KNOWN_FLAGS) != 0: | |
|
39 | raise ValueError(b'unknown revlog index flags') | |
|
40 | return int(int(offset) << 16 | type) | |
|
41 | ||
|
42 | ||
|
43 | class revlogoldindex(list): | |
|
44 | entry_size = INDEX_ENTRY_V0.size | |
|
45 | ||
|
46 | @property | |
|
47 | def nodemap(self): | |
|
48 | msg = b"index.nodemap is deprecated, use index.[has_node|rev|get_rev]" | |
|
49 | util.nouideprecwarn(msg, b'5.3', stacklevel=2) | |
|
50 | return self._nodemap | |
|
51 | ||
|
52 | @util.propertycache | |
|
53 | def _nodemap(self): | |
|
54 | nodemap = nodemaputil.NodeMap({sha1nodeconstants.nullid: node.nullrev}) | |
|
55 | for r in range(0, len(self)): | |
|
56 | n = self[r][7] | |
|
57 | nodemap[n] = r | |
|
58 | return nodemap | |
|
59 | ||
|
60 | def has_node(self, node): | |
|
61 | """return True if the node exist in the index""" | |
|
62 | return node in self._nodemap | |
|
63 | ||
|
64 | def rev(self, node): | |
|
65 | """return a revision for a node | |
|
66 | ||
|
67 | If the node is unknown, raise a RevlogError""" | |
|
68 | return self._nodemap[node] | |
|
69 | ||
|
70 | def get_rev(self, node): | |
|
71 | """return a revision for a node | |
|
72 | ||
|
73 | If the node is unknown, return None""" | |
|
74 | return self._nodemap.get(node) | |
|
75 | ||
|
76 | def append(self, tup): | |
|
77 | self._nodemap[tup[7]] = len(self) | |
|
78 | super(revlogoldindex, self).append(tup) | |
|
79 | ||
|
80 | def __delitem__(self, i): | |
|
81 | if not isinstance(i, slice) or not i.stop == -1 or i.step is not None: | |
|
82 | raise ValueError(b"deleting slices only supports a:-1 with step 1") | |
|
83 | for r in pycompat.xrange(i.start, len(self)): | |
|
84 | del self._nodemap[self[r][7]] | |
|
85 | super(revlogoldindex, self).__delitem__(i) | |
|
86 | ||
|
87 | def clearcaches(self): | |
|
88 | self.__dict__.pop('_nodemap', None) | |
|
89 | ||
|
90 | def __getitem__(self, i): | |
|
91 | if i == -1: | |
|
92 | return (0, 0, 0, -1, -1, -1, -1, node.nullid) | |
|
93 | return list.__getitem__(self, i) | |
|
94 | ||
|
95 | def pack_header(self, header): | |
|
96 | """pack header information in binary""" | |
|
97 | return b'' | |
|
98 | ||
|
99 | def entry_binary(self, rev): | |
|
100 | """return the raw binary string representing a revision""" | |
|
101 | entry = self[rev] | |
|
102 | if gettype(entry[0]): | |
|
103 | raise error.RevlogError( | |
|
104 | _(b'index entry flags need revlog version 1') | |
|
105 | ) | |
|
106 | e2 = ( | |
|
107 | getoffset(entry[0]), | |
|
108 | entry[1], | |
|
109 | entry[3], | |
|
110 | entry[4], | |
|
111 | self[entry[5]][7], | |
|
112 | self[entry[6]][7], | |
|
113 | entry[7], | |
|
114 | ) | |
|
115 | return INDEX_ENTRY_V0.pack(*e2) | |
|
116 | ||
|
117 | ||
|
118 | def parse_index_v0(data, inline): | |
|
119 | s = INDEX_ENTRY_V0.size | |
|
120 | index = [] | |
|
121 | nodemap = nodemaputil.NodeMap({node.nullid: node.nullrev}) | |
|
122 | n = off = 0 | |
|
123 | l = len(data) | |
|
124 | while off + s <= l: | |
|
125 | cur = data[off : off + s] | |
|
126 | off += s | |
|
127 | e = INDEX_ENTRY_V0.unpack(cur) | |
|
128 | # transform to revlogv1 format | |
|
129 | e2 = ( | |
|
130 | offset_type(e[0], 0), | |
|
131 | e[1], | |
|
132 | -1, | |
|
133 | e[2], | |
|
134 | e[3], | |
|
135 | nodemap.get(e[4], node.nullrev), | |
|
136 | nodemap.get(e[5], node.nullrev), | |
|
137 | e[6], | |
|
138 | ) | |
|
139 | index.append(e2) | |
|
140 | nodemap[e[6]] = n | |
|
141 | n += 1 | |
|
142 | ||
|
143 | index = revlogoldindex(index) | |
|
144 | return index, None |
@@ -36,7 +36,6 b' from .pycompat import getattr' | |||
|
36 | 36 | from .revlogutils.constants import ( |
|
37 | 37 | FLAG_GENERALDELTA, |
|
38 | 38 | FLAG_INLINE_DATA, |
|
39 | INDEX_ENTRY_V0, | |
|
40 | 39 | INDEX_HEADER, |
|
41 | 40 | REVLOGV0, |
|
42 | 41 | REVLOGV1, |
@@ -76,6 +75,7 b' from .revlogutils import (' | |||
|
76 | 75 | deltas as deltautil, |
|
77 | 76 | flagutil, |
|
78 | 77 | nodemap as nodemaputil, |
|
78 | revlogv0, | |
|
79 | 79 | sidedata as sidedatautil, |
|
80 | 80 | ) |
|
81 | 81 | from .utils import ( |
@@ -136,14 +136,6 b' ellipsisprocessor = (' | |||
|
136 | 136 | ) |
|
137 | 137 | |
|
138 | 138 | |
|
139 | def getoffset(q): | |
|
140 | return int(q >> 16) | |
|
141 | ||
|
142 | ||
|
143 | def gettype(q): | |
|
144 | return int(q & 0xFFFF) | |
|
145 | ||
|
146 | ||
|
147 | 139 | def offset_type(offset, type): |
|
148 | 140 | if (type & ~flagutil.REVIDX_KNOWN_FLAGS) != 0: |
|
149 | 141 | raise ValueError(b'unknown revlog index flags') |
@@ -214,110 +206,6 b' class revlogproblem(object):' | |||
|
214 | 206 | node = attr.ib(default=None) |
|
215 | 207 | |
|
216 | 208 | |
|
217 | class revlogoldindex(list): | |
|
218 | entry_size = INDEX_ENTRY_V0.size | |
|
219 | ||
|
220 | @property | |
|
221 | def nodemap(self): | |
|
222 | msg = b"index.nodemap is deprecated, use index.[has_node|rev|get_rev]" | |
|
223 | util.nouideprecwarn(msg, b'5.3', stacklevel=2) | |
|
224 | return self._nodemap | |
|
225 | ||
|
226 | @util.propertycache | |
|
227 | def _nodemap(self): | |
|
228 | nodemap = nodemaputil.NodeMap({sha1nodeconstants.nullid: nullrev}) | |
|
229 | for r in range(0, len(self)): | |
|
230 | n = self[r][7] | |
|
231 | nodemap[n] = r | |
|
232 | return nodemap | |
|
233 | ||
|
234 | def has_node(self, node): | |
|
235 | """return True if the node exist in the index""" | |
|
236 | return node in self._nodemap | |
|
237 | ||
|
238 | def rev(self, node): | |
|
239 | """return a revision for a node | |
|
240 | ||
|
241 | If the node is unknown, raise a RevlogError""" | |
|
242 | return self._nodemap[node] | |
|
243 | ||
|
244 | def get_rev(self, node): | |
|
245 | """return a revision for a node | |
|
246 | ||
|
247 | If the node is unknown, return None""" | |
|
248 | return self._nodemap.get(node) | |
|
249 | ||
|
250 | def append(self, tup): | |
|
251 | self._nodemap[tup[7]] = len(self) | |
|
252 | super(revlogoldindex, self).append(tup) | |
|
253 | ||
|
254 | def __delitem__(self, i): | |
|
255 | if not isinstance(i, slice) or not i.stop == -1 or i.step is not None: | |
|
256 | raise ValueError(b"deleting slices only supports a:-1 with step 1") | |
|
257 | for r in pycompat.xrange(i.start, len(self)): | |
|
258 | del self._nodemap[self[r][7]] | |
|
259 | super(revlogoldindex, self).__delitem__(i) | |
|
260 | ||
|
261 | def clearcaches(self): | |
|
262 | self.__dict__.pop('_nodemap', None) | |
|
263 | ||
|
264 | def __getitem__(self, i): | |
|
265 | if i == -1: | |
|
266 | return (0, 0, 0, -1, -1, -1, -1, sha1nodeconstants.nullid) | |
|
267 | return list.__getitem__(self, i) | |
|
268 | ||
|
269 | def entry_binary(self, rev): | |
|
270 | """return the raw binary string representing a revision""" | |
|
271 | entry = self[rev] | |
|
272 | if gettype(entry[0]): | |
|
273 | raise error.RevlogError( | |
|
274 | _(b'index entry flags need revlog version 1') | |
|
275 | ) | |
|
276 | e2 = ( | |
|
277 | getoffset(entry[0]), | |
|
278 | entry[1], | |
|
279 | entry[3], | |
|
280 | entry[4], | |
|
281 | self[entry[5]][7], | |
|
282 | self[entry[6]][7], | |
|
283 | entry[7], | |
|
284 | ) | |
|
285 | return INDEX_ENTRY_V0.pack(*e2) | |
|
286 | ||
|
287 | def pack_header(self, header): | |
|
288 | """Pack header information in binary""" | |
|
289 | return b'' | |
|
290 | ||
|
291 | ||
|
292 | def parse_index_v0(data, inline): | |
|
293 | s = INDEX_ENTRY_V0.size | |
|
294 | index = [] | |
|
295 | nodemap = nodemaputil.NodeMap({sha1nodeconstants.nullid: nullrev}) | |
|
296 | n = off = 0 | |
|
297 | l = len(data) | |
|
298 | while off + s <= l: | |
|
299 | cur = data[off : off + s] | |
|
300 | off += s | |
|
301 | e = INDEX_ENTRY_V0.unpack(cur) | |
|
302 | # transform to revlogv1 format | |
|
303 | e2 = ( | |
|
304 | offset_type(e[0], 0), | |
|
305 | e[1], | |
|
306 | -1, | |
|
307 | e[2], | |
|
308 | e[3], | |
|
309 | nodemap.get(e[4], nullrev), | |
|
310 | nodemap.get(e[5], nullrev), | |
|
311 | e[6], | |
|
312 | ) | |
|
313 | index.append(e2) | |
|
314 | nodemap[e[6]] = n | |
|
315 | n += 1 | |
|
316 | ||
|
317 | index = revlogoldindex(index) | |
|
318 | return index, None | |
|
319 | ||
|
320 | ||
|
321 | 209 | def parse_index_v1(data, inline): |
|
322 | 210 | # call the C implementation to parse the index data |
|
323 | 211 | index, cache = parsers.parse_index2(data, inline) |
@@ -621,7 +509,7 b' class revlog(object):' | |||
|
621 | 509 | |
|
622 | 510 | self._parse_index = parse_index_v1 |
|
623 | 511 | if self.version == REVLOGV0: |
|
624 | self._parse_index = parse_index_v0 | |
|
512 | self._parse_index = revlogv0.parse_index_v0 | |
|
625 | 513 | elif fmt == REVLOGV2: |
|
626 | 514 | self._parse_index = parse_index_v2 |
|
627 | 515 | elif devel_nodemap: |
General Comments 0
You need to be logged in to leave comments.
Login now