Mercurial > public > mercurial-scm > hg-stable
comparison mercurial/revlogutils/revlogv0.py @ 47079:724db234b790
revlog: code for `revlogv0` in its own module
This code is mostly unused compatiblity code. Yet it take a prohiminent place in
the `revlog.py` module. That module is already quite big, so we move all that
code in a dedicated module.
Differential Revision: https://phab.mercurial-scm.org/D10511
author | Pierre-Yves David <pierre-yves.david@octobus.net> |
---|---|
date | Thu, 08 Apr 2021 00:34:16 +0200 |
parents | |
children | 4292bed8da7c |
comparison
equal
deleted
inserted
replaced
47078:d57386e5c80e | 47079:724db234b790 |
---|---|
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 |