error.RevlogError was moved from revlog.py in 08cabecfa8a8 in
- revlog.RevlogError has remained as an alias ever since.
Let's drop the alias and use error.RevlogError directly.
| hg-reviewers |
error.RevlogError was moved from revlog.py in 08cabecfa8a8 in
Let's drop the alias and use error.RevlogError directly.
| Automatic diff as part of commit; lint not applicable. |
| Automatic diff as part of commit; unit tests not applicable. |
| Path | Packages | |||
|---|---|---|---|---|
| M | mercurial/revlog.py (79 lines) | |||
| M | mercurial/revlogutils/deltas.py (3 lines) | |||
| M | tests/simplestorerepo.py (2 lines) |
| # Aliased for performance. | # Aliased for performance. | ||||
| _zlibdecompress = zlib.decompress | _zlibdecompress = zlib.decompress | ||||
| # max size of revlog with inline data | # max size of revlog with inline data | ||||
| _maxinline = 131072 | _maxinline = 131072 | ||||
| _chunksize = 1048576 | _chunksize = 1048576 | ||||
| RevlogError = error.RevlogError | |||||
| LookupError = error.LookupError | LookupError = error.LookupError | ||||
| AmbiguousPrefixLookupError = error.AmbiguousPrefixLookupError | AmbiguousPrefixLookupError = error.AmbiguousPrefixLookupError | ||||
| CensoredNodeError = error.CensoredNodeError | CensoredNodeError = error.CensoredNodeError | ||||
| ProgrammingError = error.ProgrammingError | ProgrammingError = error.ProgrammingError | ||||
| # Store flag processors (cf. 'addflagprocessor()' to register) | # Store flag processors (cf. 'addflagprocessor()' to register) | ||||
| _flagprocessors = { | _flagprocessors = { | ||||
| REVIDX_ISCENSORED: None, | REVIDX_ISCENSORED: None, | ||||
| index.append(e2) | index.append(e2) | ||||
| nodemap[e[6]] = n | nodemap[e[6]] = n | ||||
| n += 1 | n += 1 | ||||
| return revlogoldindex(index), nodemap, None | return revlogoldindex(index), nodemap, None | ||||
| def packentry(self, entry, node, version, rev): | def packentry(self, entry, node, version, rev): | ||||
| if gettype(entry[0]): | if gettype(entry[0]): | ||||
| raise RevlogError(_('index entry flags need revlog version 1')) | raise error.RevlogError(_('index entry flags need revlog ' | ||||
| 'version 1')) | |||||
| e2 = (getoffset(entry[0]), entry[1], entry[3], entry[4], | e2 = (getoffset(entry[0]), entry[1], entry[3], entry[4], | ||||
| node(entry[5]), node(entry[6]), entry[7]) | node(entry[5]), node(entry[6]), entry[7]) | ||||
| return indexformatv0_pack(*e2) | return indexformatv0_pack(*e2) | ||||
| # index ng: | # index ng: | ||||
| # 6 bytes: offset | # 6 bytes: offset | ||||
| # 2 bytes: flags | # 2 bytes: flags | ||||
| # 4 bytes: compressed length | # 4 bytes: compressed length | ||||
| if 'sparse-read-density-threshold' in opts: | if 'sparse-read-density-threshold' in opts: | ||||
| self._srdensitythreshold = opts['sparse-read-density-threshold'] | self._srdensitythreshold = opts['sparse-read-density-threshold'] | ||||
| if 'sparse-read-min-gap-size' in opts: | if 'sparse-read-min-gap-size' in opts: | ||||
| self._srmingapsize = opts['sparse-read-min-gap-size'] | self._srmingapsize = opts['sparse-read-min-gap-size'] | ||||
| if opts.get('enableellipsis'): | if opts.get('enableellipsis'): | ||||
| self._flagprocessors[REVIDX_ELLIPSIS] = ellipsisprocessor | self._flagprocessors[REVIDX_ELLIPSIS] = ellipsisprocessor | ||||
| if self._chunkcachesize <= 0: | if self._chunkcachesize <= 0: | ||||
| raise RevlogError(_('revlog chunk cache size %r is not greater ' | raise error.RevlogError(_('revlog chunk cache size %r is not ' | ||||
| 'than 0') % self._chunkcachesize) | 'greater than 0') % self._chunkcachesize) | ||||
| elif self._chunkcachesize & (self._chunkcachesize - 1): | elif self._chunkcachesize & (self._chunkcachesize - 1): | ||||
| raise RevlogError(_('revlog chunk cache size %r is not a power ' | raise error.RevlogError(_('revlog chunk cache size %r is not a ' | ||||
| 'of 2') % self._chunkcachesize) | 'power of 2') % self._chunkcachesize) | ||||
| indexdata = '' | indexdata = '' | ||||
| self._initempty = True | self._initempty = True | ||||
| try: | try: | ||||
| with self._indexfp() as f: | with self._indexfp() as f: | ||||
| if (mmapindexthreshold is not None and | if (mmapindexthreshold is not None and | ||||
| self.opener.fstat(f).st_size >= mmapindexthreshold): | self.opener.fstat(f).st_size >= mmapindexthreshold): | ||||
| indexdata = util.buffer(util.mmapread(f)) | indexdata = util.buffer(util.mmapread(f)) | ||||
| else: | else: | ||||
| indexdata = f.read() | indexdata = f.read() | ||||
| if len(indexdata) > 0: | if len(indexdata) > 0: | ||||
| v = versionformat_unpack(indexdata[:4])[0] | v = versionformat_unpack(indexdata[:4])[0] | ||||
| self._initempty = False | self._initempty = False | ||||
| except IOError as inst: | except IOError as inst: | ||||
| if inst.errno != errno.ENOENT: | if inst.errno != errno.ENOENT: | ||||
| raise | raise | ||||
| self.version = v | self.version = v | ||||
| self._inline = v & FLAG_INLINE_DATA | self._inline = v & FLAG_INLINE_DATA | ||||
| self._generaldelta = v & FLAG_GENERALDELTA | self._generaldelta = v & FLAG_GENERALDELTA | ||||
| flags = v & ~0xFFFF | flags = v & ~0xFFFF | ||||
| fmt = v & 0xFFFF | fmt = v & 0xFFFF | ||||
| if fmt == REVLOGV0: | if fmt == REVLOGV0: | ||||
| if flags: | if flags: | ||||
| raise RevlogError(_('unknown flags (%#04x) in version %d ' | raise error.RevlogError(_('unknown flags (%#04x) in version %d ' | ||||
| 'revlog %s') % | 'revlog %s') % | ||||
| (flags >> 16, fmt, self.indexfile)) | (flags >> 16, fmt, self.indexfile)) | ||||
| elif fmt == REVLOGV1: | elif fmt == REVLOGV1: | ||||
| if flags & ~REVLOGV1_FLAGS: | if flags & ~REVLOGV1_FLAGS: | ||||
| raise RevlogError(_('unknown flags (%#04x) in version %d ' | raise error.RevlogError(_('unknown flags (%#04x) in version %d ' | ||||
| 'revlog %s') % | 'revlog %s') % | ||||
| (flags >> 16, fmt, self.indexfile)) | (flags >> 16, fmt, self.indexfile)) | ||||
| elif fmt == REVLOGV2: | elif fmt == REVLOGV2: | ||||
| if flags & ~REVLOGV2_FLAGS: | if flags & ~REVLOGV2_FLAGS: | ||||
| raise RevlogError(_('unknown flags (%#04x) in version %d ' | raise error.RevlogError(_('unknown flags (%#04x) in version %d ' | ||||
| 'revlog %s') % | 'revlog %s') % | ||||
| (flags >> 16, fmt, self.indexfile)) | (flags >> 16, fmt, self.indexfile)) | ||||
| else: | else: | ||||
| raise RevlogError(_('unknown version (%d) in revlog %s') % | raise error.RevlogError(_('unknown version (%d) in revlog %s') % | ||||
| (fmt, self.indexfile)) | (fmt, self.indexfile)) | ||||
| self._storedeltachains = True | self._storedeltachains = True | ||||
| self._io = revlogio() | self._io = revlogio() | ||||
| if self.version == REVLOGV0: | if self.version == REVLOGV0: | ||||
| self._io = revlogoldio() | self._io = revlogoldio() | ||||
| try: | try: | ||||
| d = self._io.parseindex(indexdata, self._inline) | d = self._io.parseindex(indexdata, self._inline) | ||||
| except (ValueError, IndexError): | except (ValueError, IndexError): | ||||
| raise RevlogError(_("index %s is corrupted") % (self.indexfile)) | raise error.RevlogError(_("index %s is corrupted") % | ||||
| self.indexfile) | |||||
| self.index, nodemap, self._chunkcache = d | self.index, nodemap, self._chunkcache = d | ||||
| if nodemap is not None: | if nodemap is not None: | ||||
| self.nodemap = self._nodecache = nodemap | self.nodemap = self._nodecache = nodemap | ||||
| if not self._chunkcache: | if not self._chunkcache: | ||||
| self._chunkclear() | self._chunkclear() | ||||
| # revnum -> (chain-length, sum-delta-length) | # revnum -> (chain-length, sum-delta-length) | ||||
| self._chaininfocache = {} | self._chaininfocache = {} | ||||
| # revlog header -> revlog compressor | # revlog header -> revlog compressor | ||||
| self._nodecache = {nullid: nullrev} | self._nodecache = {nullid: nullrev} | ||||
| self._nodepos = None | self._nodepos = None | ||||
| def rev(self, node): | def rev(self, node): | ||||
| try: | try: | ||||
| return self._nodecache[node] | return self._nodecache[node] | ||||
| except TypeError: | except TypeError: | ||||
| raise | raise | ||||
| except RevlogError: | except error.RevlogError: | ||||
| # parsers.c radix tree lookup failed | # parsers.c radix tree lookup failed | ||||
| if node == wdirid or node in wdirfilenodeids: | if node == wdirid or node in wdirfilenodeids: | ||||
| raise error.WdirUnsupported | raise error.WdirUnsupported | ||||
| raise LookupError(node, self.indexfile, _('no node')) | raise LookupError(node, self.indexfile, _('no node')) | ||||
| except KeyError: | except KeyError: | ||||
| # pure python cache lookup failed | # pure python cache lookup failed | ||||
| n = self._nodecache | n = self._nodecache | ||||
| i = self.index | i = self.index | ||||
| def _partialmatch(self, id): | def _partialmatch(self, id): | ||||
| # we don't care wdirfilenodeids as they should be always full hash | # we don't care wdirfilenodeids as they should be always full hash | ||||
| maybewdir = wdirhex.startswith(id) | maybewdir = wdirhex.startswith(id) | ||||
| try: | try: | ||||
| partial = self.index.partialmatch(id) | partial = self.index.partialmatch(id) | ||||
| if partial and self.hasnode(partial): | if partial and self.hasnode(partial): | ||||
| if maybewdir: | if maybewdir: | ||||
| # single 'ff...' match in radix tree, ambiguous with wdir | # single 'ff...' match in radix tree, ambiguous with wdir | ||||
| raise RevlogError | raise error.RevlogError | ||||
| return partial | return partial | ||||
| if maybewdir: | if maybewdir: | ||||
| # no 'ff...' match in radix tree, wdir identified | # no 'ff...' match in radix tree, wdir identified | ||||
| raise error.WdirUnsupported | raise error.WdirUnsupported | ||||
| return None | return None | ||||
| except RevlogError: | except error.RevlogError: | ||||
| # parsers.c radix tree lookup gave multiple matches | # parsers.c radix tree lookup gave multiple matches | ||||
| # fast path: for unfiltered changelog, radix tree is accurate | # fast path: for unfiltered changelog, radix tree is accurate | ||||
| if not getattr(self, 'filteredrevs', None): | if not getattr(self, 'filteredrevs', None): | ||||
| raise AmbiguousPrefixLookupError(id, self.indexfile, | raise AmbiguousPrefixLookupError(id, self.indexfile, | ||||
| _('ambiguous identifier')) | _('ambiguous identifier')) | ||||
| # fall through to slow path that filters hidden revisions | # fall through to slow path that filters hidden revisions | ||||
| except (AttributeError, ValueError): | except (AttributeError, ValueError): | ||||
| # we are pure python, or key was too short to search radix tree | # we are pure python, or key was too short to search radix tree | ||||
| prefix = hexnode[:length] | prefix = hexnode[:length] | ||||
| if not maybewdir(prefix): | if not maybewdir(prefix): | ||||
| return prefix | return prefix | ||||
| if not getattr(self, 'filteredrevs', None): | if not getattr(self, 'filteredrevs', None): | ||||
| try: | try: | ||||
| length = max(self.index.shortest(node), minlength) | length = max(self.index.shortest(node), minlength) | ||||
| return disambiguate(hexnode, length) | return disambiguate(hexnode, length) | ||||
| except RevlogError: | except error.RevlogError: | ||||
| if node != wdirid: | if node != wdirid: | ||||
| raise LookupError(node, self.indexfile, _('no node')) | raise LookupError(node, self.indexfile, _('no node')) | ||||
| except AttributeError: | except AttributeError: | ||||
| # Fall through to pure code | # Fall through to pure code | ||||
| pass | pass | ||||
| if node == wdirid: | if node == wdirid: | ||||
| for length in range(minlength, 41): | for length in range(minlength, 41): | ||||
| """ | """ | ||||
| # fast path: no flag processors will run | # fast path: no flag processors will run | ||||
| if flags == 0: | if flags == 0: | ||||
| return text, True | return text, True | ||||
| if not operation in ('read', 'write'): | if not operation in ('read', 'write'): | ||||
| raise ProgrammingError(_("invalid '%s' operation ") % (operation)) | raise ProgrammingError(_("invalid '%s' operation ") % (operation)) | ||||
| # Check all flags are known. | # Check all flags are known. | ||||
| if flags & ~REVIDX_KNOWN_FLAGS: | if flags & ~REVIDX_KNOWN_FLAGS: | ||||
| raise RevlogError(_("incompatible revision flag '%#x'") % | raise error.RevlogError(_("incompatible revision flag '%#x'") % | ||||
| (flags & ~REVIDX_KNOWN_FLAGS)) | (flags & ~REVIDX_KNOWN_FLAGS)) | ||||
| validatehash = True | validatehash = True | ||||
| # Depending on the operation (read or write), the order might be | # Depending on the operation (read or write), the order might be | ||||
| # reversed due to non-commutative transforms. | # reversed due to non-commutative transforms. | ||||
| orderedflags = REVIDX_FLAGS_ORDER | orderedflags = REVIDX_FLAGS_ORDER | ||||
| if operation == 'write': | if operation == 'write': | ||||
| orderedflags = reversed(orderedflags) | orderedflags = reversed(orderedflags) | ||||
| for flag in orderedflags: | for flag in orderedflags: | ||||
| # If a flagprocessor has been registered for a known flag, apply the | # If a flagprocessor has been registered for a known flag, apply the | ||||
| # related operation transform and update result tuple. | # related operation transform and update result tuple. | ||||
| if flag & flags: | if flag & flags: | ||||
| vhash = True | vhash = True | ||||
| if flag not in self._flagprocessors: | if flag not in self._flagprocessors: | ||||
| message = _("missing processor for flag '%#x'") % (flag) | message = _("missing processor for flag '%#x'") % (flag) | ||||
| raise RevlogError(message) | raise error.RevlogError(message) | ||||
| processor = self._flagprocessors[flag] | processor = self._flagprocessors[flag] | ||||
| if processor is not None: | if processor is not None: | ||||
| readtransform, writetransform, rawtransform = processor | readtransform, writetransform, rawtransform = processor | ||||
| if raw: | if raw: | ||||
| vhash = rawtransform(self, text) | vhash = rawtransform(self, text) | ||||
| elif operation == 'read': | elif operation == 'read': | ||||
| """ | """ | ||||
| try: | try: | ||||
| if p1 is None and p2 is None: | if p1 is None and p2 is None: | ||||
| p1, p2 = self.parents(node) | p1, p2 = self.parents(node) | ||||
| if node != self.hash(text, p1, p2): | if node != self.hash(text, p1, p2): | ||||
| revornode = rev | revornode = rev | ||||
| if revornode is None: | if revornode is None: | ||||
| revornode = templatefilters.short(hex(node)) | revornode = templatefilters.short(hex(node)) | ||||
| raise RevlogError(_("integrity check failed on %s:%s") | raise error.RevlogError(_("integrity check failed on %s:%s") | ||||
| % (self.indexfile, pycompat.bytestr(revornode))) | % (self.indexfile, pycompat.bytestr(revornode))) | ||||
| except RevlogError: | except error.RevlogError: | ||||
| if self._censorable and _censoredtext(text): | if self._censorable and _censoredtext(text): | ||||
| raise error.CensoredNodeError(self.indexfile, node, text) | raise error.CensoredNodeError(self.indexfile, node, text) | ||||
| raise | raise | ||||
| def _enforceinlinesize(self, tr, fp=None): | def _enforceinlinesize(self, tr, fp=None): | ||||
| """Check if the revlog is too big for inline and convert if so. | """Check if the revlog is too big for inline and convert if so. | ||||
| This should be called after revisions are added to the revlog. If the | This should be called after revisions are added to the revlog. If the | ||||
| revlog has grown too large to be an inline revlog, it will convert it | revlog has grown too large to be an inline revlog, it will convert it | ||||
| to use multiple index and data files. | to use multiple index and data files. | ||||
| """ | """ | ||||
| tiprev = len(self) - 1 | tiprev = len(self) - 1 | ||||
| if (not self._inline or | if (not self._inline or | ||||
| (self.start(tiprev) + self.length(tiprev)) < _maxinline): | (self.start(tiprev) + self.length(tiprev)) < _maxinline): | ||||
| return | return | ||||
| trinfo = tr.find(self.indexfile) | trinfo = tr.find(self.indexfile) | ||||
| if trinfo is None: | if trinfo is None: | ||||
| raise RevlogError(_("%s not found in the transaction") | raise error.RevlogError(_("%s not found in the transaction") | ||||
| % self.indexfile) | % self.indexfile) | ||||
| trindex = trinfo[2] | trindex = trinfo[2] | ||||
| if trindex is not None: | if trindex is not None: | ||||
| dataoff = self.start(trindex) | dataoff = self.start(trindex) | ||||
| else: | else: | ||||
| # revlog was stripped at start of transaction, use all leftover data | # revlog was stripped at start of transaction, use all leftover data | ||||
| trindex = len(self) - 1 | trindex = len(self) - 1 | ||||
| dataoff = self.end(tiprev) | dataoff = self.end(tiprev) | ||||
| node - nodeid of revision; typically node is not specified, and it is | node - nodeid of revision; typically node is not specified, and it is | ||||
| computed by default as hash(text, p1, p2), however subclasses might | computed by default as hash(text, p1, p2), however subclasses might | ||||
| use different hashing method (and override checkhash() in such case) | use different hashing method (and override checkhash() in such case) | ||||
| flags - the known flags to set on the revision | flags - the known flags to set on the revision | ||||
| deltacomputer - an optional deltacomputer instance shared between | deltacomputer - an optional deltacomputer instance shared between | ||||
| multiple calls | multiple calls | ||||
| """ | """ | ||||
| if link == nullrev: | if link == nullrev: | ||||
| raise RevlogError(_("attempted to add linkrev -1 to %s") | raise error.RevlogError(_("attempted to add linkrev -1 to %s") | ||||
| % self.indexfile) | % self.indexfile) | ||||
| if flags: | if flags: | ||||
| node = node or self.hash(text, p1, p2) | node = node or self.hash(text, p1, p2) | ||||
| rawtext, validatehash = self._processflags(text, flags, 'write') | rawtext, validatehash = self._processflags(text, flags, 'write') | ||||
| # If the flag processor modifies the revision data, ignore any provided | # If the flag processor modifies the revision data, ignore any provided | ||||
| # cachedelta. | # cachedelta. | ||||
| if rawtext != text: | if rawtext != text: | ||||
| cachedelta = None | cachedelta = None | ||||
| if len(rawtext) > _maxentrysize: | if len(rawtext) > _maxentrysize: | ||||
| raise RevlogError( | raise error.RevlogError( | ||||
| _("%s: size of %d bytes exceeds maximum revlog storage of 2GiB") | _("%s: size of %d bytes exceeds maximum revlog storage of 2GiB") | ||||
| % (self.indexfile, len(rawtext))) | % (self.indexfile, len(rawtext))) | ||||
| node = node or self.hash(rawtext, p1, p2) | node = node or self.hash(rawtext, p1, p2) | ||||
| if node in self.nodemap: | if node in self.nodemap: | ||||
| return node | return node | ||||
| if validatehash: | if validatehash: | ||||
| # According to `hg perfrevlogchunks`, this is ~0.5% faster for zlib | # According to `hg perfrevlogchunks`, this is ~0.5% faster for zlib | ||||
| # compressed chunks. And this matters for changelog and manifest reads. | # compressed chunks. And this matters for changelog and manifest reads. | ||||
| t = data[0:1] | t = data[0:1] | ||||
| if t == 'x': | if t == 'x': | ||||
| try: | try: | ||||
| return _zlibdecompress(data) | return _zlibdecompress(data) | ||||
| except zlib.error as e: | except zlib.error as e: | ||||
| raise RevlogError(_('revlog decompress error: %s') % | raise error.RevlogError(_('revlog decompress error: %s') % | ||||
| stringutil.forcebytestr(e)) | stringutil.forcebytestr(e)) | ||||
| # '\0' is more common than 'u' so it goes first. | # '\0' is more common than 'u' so it goes first. | ||||
| elif t == '\0': | elif t == '\0': | ||||
| return data | return data | ||||
| elif t == 'u': | elif t == 'u': | ||||
| return util.buffer(data, 1) | return util.buffer(data, 1) | ||||
| try: | try: | ||||
| compressor = self._decompressors[t] | compressor = self._decompressors[t] | ||||
| except KeyError: | except KeyError: | ||||
| try: | try: | ||||
| engine = util.compengines.forrevlogheader(t) | engine = util.compengines.forrevlogheader(t) | ||||
| compressor = engine.revlogcompressor() | compressor = engine.revlogcompressor() | ||||
| self._decompressors[t] = compressor | self._decompressors[t] = compressor | ||||
| except KeyError: | except KeyError: | ||||
| raise RevlogError(_('unknown compression type %r') % t) | raise error.RevlogError(_('unknown compression type %r') % t) | ||||
| return compressor.decompress(data) | return compressor.decompress(data) | ||||
| def _addrevision(self, node, rawtext, transaction, link, p1, p2, flags, | def _addrevision(self, node, rawtext, transaction, link, p1, p2, flags, | ||||
| cachedelta, ifh, dfh, alwayscache=False, | cachedelta, ifh, dfh, alwayscache=False, | ||||
| deltacomputer=None): | deltacomputer=None): | ||||
| """internal function to add revisions to the log | """internal function to add revisions to the log | ||||
| see addrevision for argument descriptions. | see addrevision for argument descriptions. | ||||
| note: "addrevision" takes non-raw text, "_addrevision" takes raw text. | note: "addrevision" takes non-raw text, "_addrevision" takes raw text. | ||||
| if "deltacomputer" is not provided or None, a defaultdeltacomputer will | if "deltacomputer" is not provided or None, a defaultdeltacomputer will | ||||
| be used. | be used. | ||||
| invariants: | invariants: | ||||
| - rawtext is optional (can be None); if not set, cachedelta must be set. | - rawtext is optional (can be None); if not set, cachedelta must be set. | ||||
| if both are set, they must correspond to each other. | if both are set, they must correspond to each other. | ||||
| """ | """ | ||||
| if node == nullid: | if node == nullid: | ||||
| raise RevlogError(_("%s: attempt to add null revision") % | raise error.RevlogError(_("%s: attempt to add null revision") % | ||||
| (self.indexfile)) | self.indexfile) | ||||
| if node == wdirid or node in wdirfilenodeids: | if node == wdirid or node in wdirfilenodeids: | ||||
| raise RevlogError(_("%s: attempt to add wdir revision") % | raise error.RevlogError(_("%s: attempt to add wdir revision") % | ||||
| (self.indexfile)) | self.indexfile) | ||||
| if self._inline: | if self._inline: | ||||
| fh = ifh | fh = ifh | ||||
| else: | else: | ||||
| fh = dfh | fh = dfh | ||||
| btext = [rawtext] | btext = [rawtext] | ||||
| attr, | attr, | ||||
| ) | ) | ||||
| from .. import ( | from .. import ( | ||||
| error, | error, | ||||
| mdiff, | mdiff, | ||||
| ) | ) | ||||
| RevlogError = error.RevlogError | |||||
| CensoredNodeError = error.CensoredNodeError | CensoredNodeError = error.CensoredNodeError | ||||
| # maximum <delta-chain-data>/<revision-text-length> ratio | # maximum <delta-chain-data>/<revision-text-length> ratio | ||||
| LIMIT_DELTA2TEXT = 2 | LIMIT_DELTA2TEXT = 2 | ||||
| class _testrevlog(object): | class _testrevlog(object): | ||||
| """minimalist fake revlog to use in doctests""" | """minimalist fake revlog to use in doctests""" | ||||
| fulltext = mdiff.patch(basetext, delta) | fulltext = mdiff.patch(basetext, delta) | ||||
| try: | try: | ||||
| res = revlog._processflags(fulltext, flags, 'read', raw=True) | res = revlog._processflags(fulltext, flags, 'read', raw=True) | ||||
| fulltext, validatehash = res | fulltext, validatehash = res | ||||
| if validatehash: | if validatehash: | ||||
| revlog.checkhash(fulltext, expectednode, p1=p1, p2=p2) | revlog.checkhash(fulltext, expectednode, p1=p1, p2=p2) | ||||
| if flags & REVIDX_ISCENSORED: | if flags & REVIDX_ISCENSORED: | ||||
| raise RevlogError(_('node %s is not censored') % expectednode) | raise error.RevlogError(_('node %s is not censored') % expectednode) | ||||
| except CensoredNodeError: | except CensoredNodeError: | ||||
| # must pass the censored index flag to add censored revisions | # must pass the censored index flag to add censored revisions | ||||
| if not flags & REVIDX_ISCENSORED: | if not flags & REVIDX_ISCENSORED: | ||||
| raise | raise | ||||
| return fulltext | return fulltext | ||||
| @attr.s(slots=True, frozen=True) | @attr.s(slots=True, frozen=True) | ||||
| class _deltainfo(object): | class _deltainfo(object): | ||||
| for flag in orderedflags: | for flag in orderedflags: | ||||
| # If a flagprocessor has been registered for a known flag, apply the | # If a flagprocessor has been registered for a known flag, apply the | ||||
| # related operation transform and update result tuple. | # related operation transform and update result tuple. | ||||
| if flag & flags: | if flag & flags: | ||||
| vhash = True | vhash = True | ||||
| if flag not in revlog._flagprocessors: | if flag not in revlog._flagprocessors: | ||||
| message = _("missing processor for flag '%#x'") % (flag) | message = _("missing processor for flag '%#x'") % (flag) | ||||
| raise revlog.RevlogError(message) | raise error.RevlogError(message) | ||||
| processor = revlog._flagprocessors[flag] | processor = revlog._flagprocessors[flag] | ||||
| if processor is not None: | if processor is not None: | ||||
| readtransform, writetransform, rawtransform = processor | readtransform, writetransform, rawtransform = processor | ||||
| if raw: | if raw: | ||||
| vhash = rawtransform(self, text) | vhash = rawtransform(self, text) | ||||
| elif operation == 'read': | elif operation == 'read': | ||||