##// END OF EJS Templates
storageutil: implement file identifier resolution method (BC)...
Gregory Szorc -
r40038:0e8836be default
parent child Browse files
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.lookup(node)
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