89 warning = attr.ib(default=None) |
89 warning = attr.ib(default=None) |
90 error = attr.ib(default=None) |
90 error = attr.ib(default=None) |
91 node = attr.ib(default=None) |
91 node = attr.ib(default=None) |
92 |
92 |
93 @interfaceutil.implementer(repository.ifilestorage) |
93 @interfaceutil.implementer(repository.ifilestorage) |
94 class filestorage(object): |
94 class filestorage(flagutil.flagprocessorsmixin): |
95 """Implements storage for a tracked path. |
95 """Implements storage for a tracked path. |
96 |
96 |
97 Data is stored in the VFS in a directory corresponding to the tracked |
97 Data is stored in the VFS in a directory corresponding to the tracked |
98 path. |
98 path. |
99 |
99 |
100 Index data is stored in an ``index`` file using CBOR. |
100 Index data is stored in an ``index`` file using CBOR. |
101 |
101 |
102 Fulltext data is stored in files having names of the node. |
102 Fulltext data is stored in files having names of the node. |
103 """ |
103 """ |
|
104 |
|
105 _flagserrorclass = simplestoreerror |
104 |
106 |
105 def __init__(self, svfs, path): |
107 def __init__(self, svfs, path): |
106 self._svfs = svfs |
108 self._svfs = svfs |
107 self._path = path |
109 self._path = path |
108 |
110 |
116 self._indexdata = indexdata or [] |
118 self._indexdata = indexdata or [] |
117 self._indexbynode = {} |
119 self._indexbynode = {} |
118 self._indexbyrev = {} |
120 self._indexbyrev = {} |
119 self._index = [] |
121 self._index = [] |
120 self._refreshindex() |
122 self._refreshindex() |
|
123 |
|
124 self._flagprocessors = dict(flagutil.flagprocessors) |
121 |
125 |
122 def _refreshindex(self): |
126 def _refreshindex(self): |
123 self._indexbynode.clear() |
127 self._indexbynode.clear() |
124 self._indexbyrev.clear() |
128 self._indexbyrev.clear() |
125 self._index = [] |
129 self._index = [] |
260 if ((self._flags(baserev) & revlog.REVIDX_RAWTEXT_CHANGING_FLAGS) |
264 if ((self._flags(baserev) & revlog.REVIDX_RAWTEXT_CHANGING_FLAGS) |
261 or (self._flags(rev) & revlog.REVIDX_RAWTEXT_CHANGING_FLAGS)): |
265 or (self._flags(rev) & revlog.REVIDX_RAWTEXT_CHANGING_FLAGS)): |
262 return False |
266 return False |
263 |
267 |
264 return True |
268 return True |
265 |
|
266 def _processflags(self, text, flags, operation, raw=False): |
|
267 if flags == 0: |
|
268 return text, True |
|
269 |
|
270 if flags & ~flagutil.REVIDX_KNOWN_FLAGS: |
|
271 raise simplestoreerror(_("incompatible revision flag '%#x'") % |
|
272 (flags & ~flagutil.REVIDX_KNOWN_FLAGS)) |
|
273 |
|
274 validatehash = True |
|
275 # Depending on the operation (read or write), the order might be |
|
276 # reversed due to non-commutative transforms. |
|
277 orderedflags = revlog.REVIDX_FLAGS_ORDER |
|
278 if operation == 'write': |
|
279 orderedflags = reversed(orderedflags) |
|
280 |
|
281 for flag in orderedflags: |
|
282 # If a flagprocessor has been registered for a known flag, apply the |
|
283 # related operation transform and update result tuple. |
|
284 if flag & flags: |
|
285 vhash = True |
|
286 |
|
287 if flag not in revlog._flagprocessors: |
|
288 message = _("missing processor for flag '%#x'") % (flag) |
|
289 raise simplestoreerror(message) |
|
290 |
|
291 processor = revlog._flagprocessors[flag] |
|
292 if processor is not None: |
|
293 readtransform, writetransform, rawtransform = processor |
|
294 |
|
295 if raw: |
|
296 vhash = rawtransform(self, text) |
|
297 elif operation == 'read': |
|
298 text, vhash = readtransform(self, text) |
|
299 else: # write operation |
|
300 text, vhash = writetransform(self, text) |
|
301 validatehash = validatehash and vhash |
|
302 |
|
303 return text, validatehash |
|
304 |
269 |
305 def checkhash(self, text, node, p1=None, p2=None, rev=None): |
270 def checkhash(self, text, node, p1=None, p2=None, rev=None): |
306 if p1 is None and p2 is None: |
271 if p1 is None and p2 is None: |
307 p1, p2 = self.parents(node) |
272 p1, p2 = self.parents(node) |
308 if node != storageutil.hashrevisionsha1(text, p1, p2): |
273 if node != storageutil.hashrevisionsha1(text, p1, p2): |