diff -r 2372284d9457 -r 687b865b95ad mercurial/verify.py --- a/mercurial/verify.py Sun Oct 06 09:45:02 2019 -0400 +++ b/mercurial/verify.py Sun Oct 06 09:48:39 2019 -0400 @@ -35,8 +35,8 @@ def _normpath(f): # under hg < 2.4, convert didn't sanitize paths properly, so a # converted repo may contain repeated slashes - while '//' in f: - f = f.replace('//', '/') + while b'//' in f: + f = f.replace(b'//', b'/') return f @@ -58,25 +58,25 @@ self.refersmf = False self.fncachewarned = False # developer config: verify.skipflags - self.skipflags = repo.ui.configint('verify', 'skipflags') + self.skipflags = repo.ui.configint(b'verify', b'skipflags') self.warnorphanstorefiles = True def _warn(self, msg): """record a "warning" level issue""" - self.ui.warn(msg + "\n") + self.ui.warn(msg + b"\n") self.warnings += 1 def _err(self, linkrev, msg, filename=None): """record a "error" level issue""" if linkrev is not None: self.badrevs.add(linkrev) - linkrev = "%d" % linkrev + linkrev = b"%d" % linkrev else: - linkrev = '?' - msg = "%s: %s" % (linkrev, msg) + linkrev = b'?' + msg = b"%s: %s" % (linkrev, msg) if filename: - msg = "%s@%s" % (filename, msg) - self.ui.warn(" " + msg + "\n") + msg = b"%s@%s" % (filename, msg) + self.ui.warn(b" " + msg + b"\n") self.errors += 1 def _exc(self, linkrev, msg, inst, filename=None): @@ -84,7 +84,7 @@ fmsg = pycompat.bytestr(inst) if not fmsg: fmsg = pycompat.byterepr(inst) - self._err(linkrev, "%s: %s" % (msg, fmsg), filename) + self._err(linkrev, b"%s: %s" % (msg, fmsg), filename) def _checkrevlog(self, obj, name, linkrev): """verify high level property of a revlog @@ -95,20 +95,20 @@ - revlog's format version is correct. """ if not len(obj) and (self.havecl or self.havemf): - self._err(linkrev, _("empty or missing %s") % name) + self._err(linkrev, _(b"empty or missing %s") % name) return d = obj.checksize() if d[0]: - self._err(None, _("data length off by %d bytes") % d[0], name) + self._err(None, _(b"data length off by %d bytes") % d[0], name) if d[1]: - self._err(None, _("index contains %d extra bytes") % d[1], name) + self._err(None, _(b"index contains %d extra bytes") % d[1], name) if obj.version != revlog.REVLOGV0: if not self.revlogv1: - self._warn(_("warning: `%s' uses revlog format 1") % name) + self._warn(_(b"warning: `%s' uses revlog format 1") % name) elif self.revlogv1: - self._warn(_("warning: `%s' uses revlog format 0") % name) + self._warn(_(b"warning: `%s' uses revlog format 0") % name) def _checkentry(self, obj, i, node, seen, linkrevs, f): """verify a single revlog entry @@ -133,9 +133,9 @@ lr = obj.linkrev(obj.rev(node)) if lr < 0 or (self.havecl and lr not in linkrevs): if lr < 0 or lr >= len(self.repo.changelog): - msg = _("rev %d points to nonexistent changeset %d") + msg = _(b"rev %d points to nonexistent changeset %d") else: - msg = _("rev %d points to unexpected changeset %d") + msg = _(b"rev %d points to unexpected changeset %d") self._err(None, msg % (i, lr), f) if linkrevs: if f and len(linkrevs) > 1: @@ -149,8 +149,8 @@ except Exception: pass self._warn( - _(" (expected %s)") - % " ".join(map(pycompat.bytestr, linkrevs)) + _(b" (expected %s)") + % b" ".join(map(pycompat.bytestr, linkrevs)) ) lr = None # can't be trusted @@ -159,20 +159,20 @@ if p1 not in seen and p1 != nullid: self._err( lr, - _("unknown parent 1 %s of %s") % (short(p1), short(node)), + _(b"unknown parent 1 %s of %s") % (short(p1), short(node)), f, ) if p2 not in seen and p2 != nullid: self._err( lr, - _("unknown parent 2 %s of %s") % (short(p2), short(node)), + _(b"unknown parent 2 %s of %s") % (short(p2), short(node)), f, ) except Exception as inst: - self._exc(lr, _("checking parents of %s") % short(node), inst, f) + self._exc(lr, _(b"checking parents of %s") % short(node), inst, f) if node in seen: - self._err(lr, _("duplicate revision %d (%d)") % (i, seen[node]), f) + self._err(lr, _(b"duplicate revision %d (%d)") % (i, seen[node]), f) seen[node] = i return lr @@ -185,15 +185,15 @@ # initial validation and generic report repo = self.repo ui = repo.ui - if not repo.url().startswith('file:'): - raise error.Abort(_("cannot verify bundle or remote repos")) + if not repo.url().startswith(b'file:'): + raise error.Abort(_(b"cannot verify bundle or remote repos")) - if os.path.exists(repo.sjoin("journal")): - ui.warn(_("abandoned transaction found - run hg recover\n")) + if os.path.exists(repo.sjoin(b"journal")): + ui.warn(_(b"abandoned transaction found - run hg recover\n")) if ui.verbose or not self.revlogv1: ui.status( - _("repository uses revlog format %d\n") + _(b"repository uses revlog format %d\n") % (self.revlogv1 and 1 or 0) ) @@ -206,23 +206,23 @@ # final report ui.status( - _("checked %d changesets with %d changes to %d files\n") + _(b"checked %d changesets with %d changes to %d files\n") % (len(repo.changelog), filerevisions, totalfiles) ) if self.warnings: - ui.warn(_("%d warnings encountered!\n") % self.warnings) + ui.warn(_(b"%d warnings encountered!\n") % self.warnings) if self.fncachewarned: ui.warn( _( - 'hint: run "hg debugrebuildfncache" to recover from ' - 'corrupt fncache\n' + b'hint: run "hg debugrebuildfncache" to recover from ' + b'corrupt fncache\n' ) ) if self.errors: - ui.warn(_("%d integrity errors encountered!\n") % self.errors) + ui.warn(_(b"%d integrity errors encountered!\n") % self.errors) if self.badrevs: ui.warn( - _("(first damaged changeset appears to be %d)\n") + _(b"(first damaged changeset appears to be %d)\n") % min(self.badrevs) ) return 1 @@ -249,18 +249,18 @@ match = self.match cl = repo.changelog - ui.status(_("checking changesets\n")) + ui.status(_(b"checking changesets\n")) mflinkrevs = {} filelinkrevs = {} seen = {} - self._checkrevlog(cl, "changelog", 0) + self._checkrevlog(cl, b"changelog", 0) progress = ui.makeprogress( - _('checking'), unit=_('changesets'), total=len(repo) + _(b'checking'), unit=_(b'changesets'), total=len(repo) ) for i in repo: progress.update(i) n = cl.node(i) - self._checkentry(cl, i, n, seen, [i], "changelog") + self._checkentry(cl, i, n, seen, [i], b"changelog") try: changes = cl.read(n) @@ -272,12 +272,12 @@ filelinkrevs.setdefault(_normpath(f), []).append(i) except Exception as inst: self.refersmf = True - self._exc(i, _("unpacking changeset %s") % short(n), inst) + self._exc(i, _(b"unpacking changeset %s") % short(n), inst) progress.complete() return mflinkrevs, filelinkrevs def _verifymanifest( - self, mflinkrevs, dir="", storefiles=None, subdirprogress=None + self, mflinkrevs, dir=b"", storefiles=None, subdirprogress=None ): """verify the manifestlog content @@ -313,12 +313,12 @@ mf = mfl.getstorage(dir) if not dir: - self.ui.status(_("checking manifests\n")) + self.ui.status(_(b"checking manifests\n")) filenodes = {} subdirnodes = {} seen = {} - label = "manifest" + label = b"manifest" if dir: label = dir revlogfiles = mf.files() @@ -330,7 +330,7 @@ # null manifests. self._checkrevlog(mf, label, 0) progress = ui.makeprogress( - _('checking'), unit=_('manifests'), total=len(mf) + _(b'checking'), unit=_(b'manifests'), total=len(mf) ) for i in mf: if not dir: @@ -342,24 +342,24 @@ elif dir: self._err( lr, - _("%s not in parent-directory manifest") % short(n), + _(b"%s not in parent-directory manifest") % short(n), label, ) else: - self._err(lr, _("%s not in changesets") % short(n), label) + self._err(lr, _(b"%s not in changesets") % short(n), label) try: mfdelta = mfl.get(dir, n).readdelta(shallow=True) for f, fn, fl in mfdelta.iterentries(): if not f: - self._err(lr, _("entry without name in manifest")) - elif f == "/dev/null": # ignore this in very old repos + self._err(lr, _(b"entry without name in manifest")) + elif f == b"/dev/null": # ignore this in very old repos continue fullpath = dir + _normpath(f) - if fl == 't': + if fl == b't': if not match.visitdir(fullpath): continue - subdirnodes.setdefault(fullpath + '/', {}).setdefault( + subdirnodes.setdefault(fullpath + b'/', {}).setdefault( fn, [] ).append(lr) else: @@ -367,7 +367,7 @@ continue filenodes.setdefault(fullpath, {}).setdefault(fn, lr) except Exception as inst: - self._exc(lr, _("reading delta %s") % short(n), inst, label) + self._exc(lr, _(b"reading delta %s") % short(n), inst, label) if self._level >= VERIFY_FULL: try: # Various issues can affect manifest. So we read each full @@ -377,7 +377,7 @@ except Exception as inst: self._exc( lr, - _("reading full manifest %s") % short(n), + _(b"reading full manifest %s") % short(n), inst, label, ) @@ -394,8 +394,8 @@ self._err( c, _( - "parent-directory manifest refers to unknown" - " revision %s" + b"parent-directory manifest refers to unknown" + b" revision %s" ) % short(m), label, @@ -403,23 +403,24 @@ else: self._err( c, - _("changeset refers to unknown revision %s") % short(m), + _(b"changeset refers to unknown revision %s") + % short(m), label, ) if not dir and subdirnodes: - self.ui.status(_("checking directory manifests\n")) + self.ui.status(_(b"checking directory manifests\n")) storefiles = set() subdirs = set() revlogv1 = self.revlogv1 for f, f2, size in repo.store.datafiles(): if not f: - self._err(None, _("cannot decode filename '%s'") % f2) - elif (size > 0 or not revlogv1) and f.startswith('meta/'): + self._err(None, _(b"cannot decode filename '%s'") % f2) + elif (size > 0 or not revlogv1) and f.startswith(b'meta/'): storefiles.add(_normpath(f)) subdirs.add(os.path.dirname(f)) subdirprogress = ui.makeprogress( - _('checking'), unit=_('manifests'), total=len(subdirs) + _(b'checking'), unit=_(b'manifests'), total=len(subdirs) ) for subdir, linkrevs in subdirnodes.iteritems(): @@ -433,25 +434,25 @@ subdirprogress.complete() if self.warnorphanstorefiles: for f in sorted(storefiles): - self._warn(_("warning: orphan data file '%s'") % f) + self._warn(_(b"warning: orphan data file '%s'") % f) return filenodes def _crosscheckfiles(self, filelinkrevs, filenodes): repo = self.repo ui = self.ui - ui.status(_("crosschecking files in changesets and manifests\n")) + ui.status(_(b"crosschecking files in changesets and manifests\n")) total = len(filelinkrevs) + len(filenodes) progress = ui.makeprogress( - _('crosschecking'), unit=_('files'), total=total + _(b'crosschecking'), unit=_(b'files'), total=total ) if self.havemf: for f in sorted(filelinkrevs): progress.increment() if f not in filenodes: lr = filelinkrevs[f][0] - self._err(lr, _("in changeset but not in manifest"), f) + self._err(lr, _(b"in changeset but not in manifest"), f) if self.havecl: for f in sorted(filenodes): @@ -462,7 +463,7 @@ lr = min([fl.linkrev(fl.rev(n)) for n in filenodes[f]]) except Exception: lr = None - self._err(lr, _("in manifest but not in changeset"), f) + self._err(lr, _(b"in manifest but not in changeset"), f) progress.complete() @@ -472,27 +473,27 @@ lrugetctx = self.lrugetctx revlogv1 = self.revlogv1 havemf = self.havemf - ui.status(_("checking files\n")) + ui.status(_(b"checking files\n")) storefiles = set() for f, f2, size in repo.store.datafiles(): if not f: - self._err(None, _("cannot decode filename '%s'") % f2) - elif (size > 0 or not revlogv1) and f.startswith('data/'): + self._err(None, _(b"cannot decode filename '%s'") % f2) + elif (size > 0 or not revlogv1) and f.startswith(b'data/'): storefiles.add(_normpath(f)) state = { # TODO this assumes revlog storage for changelog. - 'expectedversion': self.repo.changelog.version & 0xFFFF, - 'skipflags': self.skipflags, + b'expectedversion': self.repo.changelog.version & 0xFFFF, + b'skipflags': self.skipflags, # experimental config: censor.policy - 'erroroncensored': ui.config('censor', 'policy') == 'abort', + b'erroroncensored': ui.config(b'censor', b'policy') == b'abort', } files = sorted(set(filenodes) | set(filelinkrevs)) revisions = 0 progress = ui.makeprogress( - _('checking'), unit=_('files'), total=len(files) + _(b'checking'), unit=_(b'files'), total=len(files) ) for i, f in enumerate(files): progress.update(i, item=f) @@ -510,7 +511,7 @@ try: fl = repo.file(f) except error.StorageError as e: - self._err(lr, _("broken revlog! (%s)") % e, f) + self._err(lr, _(b"broken revlog! (%s)") % e, f) continue for ff in fl.files(): @@ -519,15 +520,15 @@ except KeyError: if self.warnorphanstorefiles: self._warn( - _(" warning: revlog '%s' not in fncache!") % ff + _(b" warning: revlog '%s' not in fncache!") % ff ) self.fncachewarned = True if not len(fl) and (self.havecl or self.havemf): - self._err(lr, _("empty or missing %s") % f) + self._err(lr, _(b"empty or missing %s") % f) else: # Guard against implementations not setting this. - state['skipread'] = set() + state[b'skipread'] = set() for problem in fl.verifyintegrity(state): if problem.node is not None: linkrev = fl.linkrev(fl.rev(problem.node)) @@ -544,8 +545,8 @@ ) else: raise error.ProgrammingError( - 'problem instance does not set warning or error ' - 'attribute: %s' % problem.msg + b'problem instance does not set warning or error ' + b'attribute: %s' % problem.msg ) seen = {} @@ -555,11 +556,11 @@ lr = self._checkentry(fl, i, n, seen, linkrevs, f) if f in filenodes: if havemf and n not in filenodes[f]: - self._err(lr, _("%s not in manifests") % (short(n)), f) + self._err(lr, _(b"%s not in manifests") % (short(n)), f) else: del filenodes[f][n] - if n in state['skipread']: + if n in state[b'skipread']: continue # check renames @@ -574,8 +575,8 @@ if not any(rp[0] in pctx for pctx in ctx.parents()): self._warn( _( - "warning: copy source of '%s' not" - " in parents of %s" + b"warning: copy source of '%s' not" + b" in parents of %s" ) % (f, ctx) ) @@ -584,8 +585,8 @@ self._err( lr, _( - "empty or missing copy source revlog " - "%s:%s" + b"empty or missing copy source revlog " + b"%s:%s" ) % (rp[0], short(rp[1])), f, @@ -593,8 +594,8 @@ elif rp[1] == nullid: ui.note( _( - "warning: %s@%s: copy source" - " revision is nullid %s:%s\n" + b"warning: %s@%s: copy source" + b" revision is nullid %s:%s\n" ) % (f, lr, rp[0], short(rp[1])) ) @@ -602,7 +603,7 @@ fl2.rev(rp[1]) except Exception as inst: self._exc( - lr, _("checking rename of %s") % short(n), inst, f + lr, _(b"checking rename of %s") % short(n), inst, f ) # cross-check @@ -611,7 +612,7 @@ for lr, node in sorted(fns): self._err( lr, - _("manifest refers to unknown revision %s") + _(b"manifest refers to unknown revision %s") % short(node), f, ) @@ -619,6 +620,6 @@ if self.warnorphanstorefiles: for f in sorted(storefiles): - self._warn(_("warning: orphan data file '%s'") % f) + self._warn(_(b"warning: orphan data file '%s'") % f) return len(files), revisions