Show More
@@ -49,7 +49,8 b' class filelog(object):' | |||||
49 | return self._revlog.node(rev) |
|
49 | return self._revlog.node(rev) | |
50 |
|
50 | |||
51 | def lookup(self, node): |
|
51 | def lookup(self, node): | |
52 |
return self._revlog |
|
52 | return storageutil.fileidlookup(self._revlog, node, | |
|
53 | self._revlog.indexfile) | |||
53 |
|
54 | |||
54 | def linkrev(self, rev): |
|
55 | def linkrev(self, rev): | |
55 | return self._revlog.linkrev(rev) |
|
56 | return self._revlog.linkrev(rev) |
@@ -1099,9 +1099,6 b' class imanifeststorage(interfaceutil.Int' | |||||
1099 | that can be converted to an integer. |
|
1099 | that can be converted to an integer. | |
1100 |
|
1100 | |||
1101 | Raises ``error.LookupError`` if a ndoe could not be resolved. |
|
1101 | Raises ``error.LookupError`` if a ndoe could not be resolved. | |
1102 |
|
||||
1103 | TODO this is only used by debug* commands and can probably be deleted |
|
|||
1104 | easily. |
|
|||
1105 | """ |
|
1102 | """ | |
1106 |
|
1103 | |||
1107 | def parents(node): |
|
1104 | def parents(node): |
@@ -85,21 +85,19 b' class ifileindextests(basetestcase):' | |||||
85 | self.assertEqual(f.lookup(nullid), nullid) |
|
85 | self.assertEqual(f.lookup(nullid), nullid) | |
86 | self.assertEqual(f.lookup(nullrev), nullid) |
|
86 | self.assertEqual(f.lookup(nullrev), nullid) | |
87 | self.assertEqual(f.lookup(hex(nullid)), nullid) |
|
87 | self.assertEqual(f.lookup(hex(nullid)), nullid) | |
88 |
|
88 | self.assertEqual(f.lookup(b'%d' % nullrev), nullid) | ||
89 | # String converted to integer doesn't work for nullrev. |
|
|||
90 | with self.assertRaises(error.LookupError): |
|
|||
91 | f.lookup(b'%d' % nullrev) |
|
|||
92 |
|
89 | |||
93 | with self.assertRaises(error.LookupError): |
|
90 | with self.assertRaises(error.LookupError): | |
94 | f.lookup(b'badvalue') |
|
91 | f.lookup(b'badvalue') | |
95 |
|
92 | |||
96 | self.assertEqual(f.lookup(hex(nullid)[0:12]), nullid) |
|
93 | with self.assertRaises(error.LookupError): | |
|
94 | f.lookup(hex(nullid)[0:12]) | |||
97 |
|
95 | |||
98 | with self.assertRaises(error.LookupError): |
|
96 | with self.assertRaises(error.LookupError): | |
99 | f.lookup(b'-2') |
|
97 | f.lookup(b'-2') | |
100 |
|
98 | |||
101 | # TODO this is wonky. |
|
99 | with self.assertRaises(error.LookupError): | |
102 | self.assertEqual(f.lookup(b'0'), nullid) |
|
100 | f.lookup(b'0') | |
103 |
|
101 | |||
104 | with self.assertRaises(error.LookupError): |
|
102 | with self.assertRaises(error.LookupError): | |
105 | f.lookup(b'1') |
|
103 | f.lookup(b'1') | |
@@ -197,7 +195,9 b' class ifileindextests(basetestcase):' | |||||
197 | self.assertEqual(f.lookup(-1), nullid) |
|
195 | self.assertEqual(f.lookup(-1), nullid) | |
198 | self.assertEqual(f.lookup(b'0'), node) |
|
196 | self.assertEqual(f.lookup(b'0'), node) | |
199 | self.assertEqual(f.lookup(hex(node)), node) |
|
197 | self.assertEqual(f.lookup(hex(node)), node) | |
200 | self.assertEqual(f.lookup(hex(node)[0:12]), node) |
|
198 | ||
|
199 | with self.assertRaises(error.LookupError): | |||
|
200 | f.lookup(hex(node)[0:12]) | |||
201 |
|
201 | |||
202 | with self.assertRaises(IndexError): |
|
202 | with self.assertRaises(IndexError): | |
203 | f.lookup(-2) |
|
203 | f.lookup(-2) |
@@ -10,10 +10,13 b' from __future__ import absolute_import' | |||||
10 | import hashlib |
|
10 | import hashlib | |
11 | import re |
|
11 | import re | |
12 |
|
12 | |||
|
13 | from ..i18n import _ | |||
13 | from ..node import ( |
|
14 | from ..node import ( | |
|
15 | bin, | |||
14 | nullid, |
|
16 | nullid, | |
15 | ) |
|
17 | ) | |
16 | from .. import ( |
|
18 | from .. import ( | |
|
19 | error, | |||
17 | pycompat, |
|
20 | pycompat, | |
18 | ) |
|
21 | ) | |
19 |
|
22 | |||
@@ -99,3 +102,53 b' def iterrevs(storelen, start=0, stop=Non' | |||||
99 | stop = storelen |
|
102 | stop = storelen | |
100 |
|
103 | |||
101 | return pycompat.xrange(start, stop, step) |
|
104 | return pycompat.xrange(start, stop, step) | |
|
105 | ||||
|
106 | def fileidlookup(store, fileid, identifier): | |||
|
107 | """Resolve the file node for a value. | |||
|
108 | ||||
|
109 | ``store`` is an object implementing the ``ifileindex`` interface. | |||
|
110 | ||||
|
111 | ``fileid`` can be: | |||
|
112 | ||||
|
113 | * A 20 byte binary node. | |||
|
114 | * An integer revision number | |||
|
115 | * A 40 byte hex node. | |||
|
116 | * A bytes that can be parsed as an integer representing a revision number. | |||
|
117 | ||||
|
118 | ``identifier`` is used to populate ``error.LookupError`` with an identifier | |||
|
119 | for the store. | |||
|
120 | ||||
|
121 | Raises ``error.LookupError`` on failure. | |||
|
122 | """ | |||
|
123 | if isinstance(fileid, int): | |||
|
124 | return store.node(fileid) | |||
|
125 | ||||
|
126 | if len(fileid) == 20: | |||
|
127 | try: | |||
|
128 | store.rev(fileid) | |||
|
129 | return fileid | |||
|
130 | except error.LookupError: | |||
|
131 | pass | |||
|
132 | ||||
|
133 | if len(fileid) == 40: | |||
|
134 | try: | |||
|
135 | rawnode = bin(fileid) | |||
|
136 | store.rev(rawnode) | |||
|
137 | return rawnode | |||
|
138 | except TypeError: | |||
|
139 | pass | |||
|
140 | ||||
|
141 | try: | |||
|
142 | rev = int(fileid) | |||
|
143 | ||||
|
144 | if b'%d' % rev != fileid: | |||
|
145 | raise ValueError | |||
|
146 | ||||
|
147 | try: | |||
|
148 | return store.node(rev) | |||
|
149 | except (IndexError, TypeError): | |||
|
150 | pass | |||
|
151 | except (ValueError, OverflowError): | |||
|
152 | pass | |||
|
153 | ||||
|
154 | raise error.LookupError(fileid, identifier, _('no match found')) |
General Comments 0
You need to be logged in to leave comments.
Login now