Mercurial > public > mercurial-scm > hg
diff mercurial/dispatch.py @ 43076:2372284d9457
formatting: blacken the codebase
This is using my patch to black
(https://github.com/psf/black/pull/826) so we don't un-wrap collection
literals.
Done with:
hg files 'set:**.py - mercurial/thirdparty/** - "contrib/python-zstandard/**"' | xargs black -S
# skip-blame mass-reformatting only
# no-check-commit reformats foo_bar functions
Differential Revision: https://phab.mercurial-scm.org/D6971
author | Augie Fackler <augie@google.com> |
---|---|
date | Sun, 06 Oct 2019 09:45:02 -0400 |
parents | dd97354b8891 |
children | 687b865b95ad |
line wrap: on
line diff
--- a/mercurial/dispatch.py Sat Oct 05 10:29:34 2019 -0400 +++ b/mercurial/dispatch.py Sun Oct 06 09:45:02 2019 -0400 @@ -48,9 +48,19 @@ stringutil, ) + class request(object): - def __init__(self, args, ui=None, repo=None, fin=None, fout=None, - ferr=None, fmsg=None, prereposetups=None): + def __init__( + self, + args, + ui=None, + repo=None, + fin=None, + fout=None, + ferr=None, + fmsg=None, + prereposetups=None, + ): self.args = args self.ui = ui self.repo = repo @@ -80,15 +90,16 @@ func, args, kwargs = handlers.pop() try: func(*args, **kwargs) - except: # re-raises below + except: # re-raises below if exc is None: exc = sys.exc_info()[1] - self.ui.warn(('error in exit handlers:\n')) + self.ui.warn('error in exit handlers:\n') self.ui.traceback(force=True) finally: if exc is not None: raise exc + def run(): "run the command in sys.argv" initstdio() @@ -112,8 +123,9 @@ if util.safehasattr(req.ui, 'ferr'): try: if err is not None and err.errno != errno.EPIPE: - req.ui.ferr.write('abort: %s\n' % - encoding.strtolocal(err.strerror)) + req.ui.ferr.write( + 'abort: %s\n' % encoding.strtolocal(err.strerror) + ) req.ui.ferr.flush() # There's not much we can do about an I/O error here. So (possibly) # change the status code and move on. @@ -123,7 +135,9 @@ _silencestdio() sys.exit(status & 255) + if pycompat.ispy3: + def initstdio(): pass @@ -143,7 +157,10 @@ fp.close() except IOError: pass + + else: + def initstdio(): for fp in (sys.stdin, sys.stdout, sys.stderr): procutil.setbinary(fp) @@ -151,12 +168,14 @@ def _silencestdio(): pass + def _getsimilar(symbols, value): sim = lambda x: difflib.SequenceMatcher(None, value, x).ratio() # The cutoff for similarity here is pretty arbitrary. It should # probably be investigated and tweaked. return [s for s in symbols if sim(s) > 0.6] + def _reportsimilar(write, similar): if len(similar) == 1: write(_("(did you mean %s?)\n") % similar[0]) @@ -164,14 +183,17 @@ ss = ", ".join(sorted(similar)) write(_("(did you mean one of %s?)\n") % ss) + def _formatparse(write, inst): similar = [] if isinstance(inst, error.UnknownIdentifier): # make sure to check fileset first, as revset can invoke fileset similar = _getsimilar(inst.symbols, inst.function) if len(inst.args) > 1: - write(_("hg: parse error at %s: %s\n") % - (pycompat.bytestr(inst.args[1]), inst.args[0])) + write( + _("hg: parse error at %s: %s\n") + % (pycompat.bytestr(inst.args[1]), inst.args[0]) + ) if inst.args[0].startswith(' '): write(_("unexpected leading whitespace\n")) else: @@ -180,9 +202,11 @@ if inst.hint: write(_("(%s)\n") % inst.hint) + def _formatargs(args): return ' '.join(procutil.shellquote(a) for a in args) + def dispatch(req): """run the command specified in req.args; returns an integer status code""" with tracing.log('dispatch.dispatch'): @@ -248,8 +272,11 @@ req.ui.flush() if req.ui.logblockedtimes: req.ui._blockedtimes['command_duration'] = duration * 1000 - req.ui.log('uiblocked', 'ui blocked ms\n', - **pycompat.strkwargs(req.ui._blockedtimes)) + req.ui.log( + 'uiblocked', + 'ui blocked ms\n', + **pycompat.strkwargs(req.ui._blockedtimes) + ) return_code = ret & 255 req.ui.log( "commandfinish", @@ -263,12 +290,14 @@ ) try: req._runexithandlers() - except: # exiting, so no re-raises + except: # exiting, so no re-raises ret = ret or -1 return ret + def _runcatch(req): with tracing.log('dispatch._runcatch'): + def catchterm(*args): raise error.SignalInterrupt @@ -279,18 +308,23 @@ if num: signal.signal(num, catchterm) except ValueError: - pass # happens if called in a thread + pass # happens if called in a thread def _runcatchfunc(): realcmd = None try: cmdargs = fancyopts.fancyopts( - req.args[:], commands.globalopts, {}) + req.args[:], commands.globalopts, {} + ) cmd = cmdargs[0] aliases, entry = cmdutil.findcmd(cmd, commands.table, False) realcmd = aliases[0] - except (error.UnknownCommand, error.AmbiguousCommand, - IndexError, getopt.GetoptError): + except ( + error.UnknownCommand, + error.AmbiguousCommand, + IndexError, + getopt.GetoptError, + ): # Don't handle this here. We know the command is # invalid, but all we're worried about for now is that # it's not a command that server operators expect to @@ -305,23 +339,22 @@ # shenanigans wherein a user does something like pass # --debugger or --config=ui.debugger=1 as a repo # name. This used to actually run the debugger. - if (len(req.args) != 4 or - req.args[0] != '-R' or - req.args[1].startswith('--') or - req.args[2] != 'serve' or - req.args[3] != '--stdio'): + if ( + len(req.args) != 4 + or req.args[0] != '-R' + or req.args[1].startswith('--') + or req.args[2] != 'serve' + or req.args[3] != '--stdio' + ): raise error.Abort( - _('potentially unsafe serve --stdio invocation: %s') % - (stringutil.pprint(req.args),)) + _('potentially unsafe serve --stdio invocation: %s') + % (stringutil.pprint(req.args),) + ) try: debugger = 'pdb' - debugtrace = { - 'pdb': pdb.set_trace - } - debugmortem = { - 'pdb': pdb.post_mortem - } + debugtrace = {'pdb': pdb.set_trace} + debugmortem = {'pdb': pdb.post_mortem} # read --config before doing anything else # (e.g. to change trust settings for reading .hg/hgrc) @@ -347,34 +380,47 @@ try: debugmod = __import__(debugger) except ImportError: - pass # Leave debugmod = pdb + pass # Leave debugmod = pdb debugtrace[debugger] = debugmod.set_trace debugmortem[debugger] = debugmod.post_mortem # enter the debugger before command execution if req.earlyoptions['debugger']: - ui.warn(_("entering debugger - " - "type c to continue starting hg or h for help\n")) + ui.warn( + _( + "entering debugger - " + "type c to continue starting hg or h for help\n" + ) + ) - if (debugger != 'pdb' and - debugtrace[debugger] == debugtrace['pdb']): - ui.warn(_("%s debugger specified " - "but its module was not found\n") % debugger) + if ( + debugger != 'pdb' + and debugtrace[debugger] == debugtrace['pdb'] + ): + ui.warn( + _( + "%s debugger specified " + "but its module was not found\n" + ) + % debugger + ) with demandimport.deactivated(): debugtrace[debugger]() try: return _dispatch(req) finally: ui.flush() - except: # re-raises + except: # re-raises # enter the debugger when we hit an exception if req.earlyoptions['debugger']: traceback.print_exc() debugmortem[debugger](sys.exc_info()[2]) raise + return _callcatch(ui, _runcatchfunc) + def _callcatch(ui, func): """like scmutil.callcatch but handles more high-level exceptions about config parsing and commands. besides, use handlecommandexception to handle @@ -383,8 +429,10 @@ try: return scmutil.callcatch(ui, func) except error.AmbiguousCommand as inst: - ui.warn(_("hg: command '%s' is ambiguous:\n %s\n") % - (inst.args[0], " ".join(inst.args[1]))) + ui.warn( + _("hg: command '%s' is ambiguous:\n %s\n") + % (inst.args[0], " ".join(inst.args[1])) + ) except error.CommandError as inst: if inst.args[0]: ui.pager('help') @@ -402,8 +450,9 @@ try: # check if the command is in a disabled extension # (but don't check for extensions themselves) - formatted = help.formattedhelp(ui, commands, inst.args[0], - unknowncmd=True) + formatted = help.formattedhelp( + ui, commands, inst.args[0], unknowncmd=True + ) ui.warn(nocmdmsg) ui.write(formatted) except (error.UnknownCommand, error.Abort): @@ -427,6 +476,7 @@ return -1 + def aliasargs(fn, givenargs): args = [] # only care about alias 'args', ignore 'args' set by extensions.wrapfunction @@ -436,18 +486,20 @@ cmd = ' '.join(map(procutil.shellquote, args)) nums = [] + def replacer(m): num = int(m.group(1)) - 1 nums.append(num) if num < len(givenargs): return givenargs[num] raise error.Abort(_('too few arguments for command alias')) + cmd = re.sub(br'\$(\d+|\$)', replacer, cmd) - givenargs = [x for i, x in enumerate(givenargs) - if i not in nums] + givenargs = [x for i, x in enumerate(givenargs) if i not in nums] args = pycompat.shlexsplit(cmd) return args + givenargs + def aliasinterpolate(name, args, cmd): '''interpolate args into cmd for shell aliases @@ -469,6 +521,7 @@ r = re.compile(regex) return r.sub(lambda x: replacemap[x.group()], cmd) + class cmdalias(object): def __init__(self, ui, name, definition, cmdtable, source): self.name = self.cmd = name @@ -499,22 +552,29 @@ if self.definition.startswith('!'): shdef = self.definition[1:] self.shell = True + def fn(ui, *args): env = {'HG_ARGS': ' '.join((self.name,) + args)} + def _checkvar(m): if m.groups()[0] == '$': return m.group() elif int(m.groups()[0]) <= len(args): return m.group() else: - ui.debug("No argument found for substitution " - "of %i variable in alias '%s' definition.\n" - % (int(m.groups()[0]), self.name)) + ui.debug( + "No argument found for substitution " + "of %i variable in alias '%s' definition.\n" + % (int(m.groups()[0]), self.name) + ) return '' + cmd = re.sub(br'\$(\d+|\$)', _checkvar, shdef) cmd = aliasinterpolate(self.name, args, cmd) - return ui.system(cmd, environ=env, - blockedtag='alias_%s' % self.name) + return ui.system( + cmd, environ=env, blockedtag='alias_%s' % self.name + ) + self.fn = fn self.alias = True self._populatehelp(ui, name, shdef, self.fn) @@ -523,15 +583,17 @@ try: args = pycompat.shlexsplit(self.definition) except ValueError as inst: - self.badalias = (_("error in definition for alias '%s': %s") - % (self.name, stringutil.forcebytestr(inst))) + self.badalias = _("error in definition for alias '%s': %s") % ( + self.name, + stringutil.forcebytestr(inst), + ) return earlyopts, args = _earlysplitopts(args) if earlyopts: - self.badalias = (_("error in definition for alias '%s': %s may " - "only be given on the command line") - % (self.name, '/'.join(pycompat.ziplist(*earlyopts) - [0]))) + self.badalias = _( + "error in definition for alias '%s': %s may " + "only be given on the command line" + ) % (self.name, '/'.join(pycompat.ziplist(*earlyopts)[0])) return self.cmdname = cmd = args.pop(0) self.givenargs = args @@ -548,12 +610,15 @@ self._populatehelp(ui, name, cmd, self.fn, cmdhelp) except error.UnknownCommand: - self.badalias = (_("alias '%s' resolves to unknown command '%s'") - % (self.name, cmd)) + self.badalias = _("alias '%s' resolves to unknown command '%s'") % ( + self.name, + cmd, + ) self.unknowncmd = True except error.AmbiguousCommand: - self.badalias = (_("alias '%s' resolves to ambiguous command '%s'") - % (self.name, cmd)) + self.badalias = _( + "alias '%s' resolves to ambiguous command '%s'" + ) % (self.name, cmd) def _populatehelp(self, ui, name, cmd, fn, defaulthelp=None): # confine strings to be passed to i18n.gettext() @@ -563,15 +628,16 @@ if v is None: continue if not encoding.isasciistr(v): - self.badalias = (_("non-ASCII character in alias definition " - "'%s:%s'") % (name, k)) + self.badalias = _( + "non-ASCII character in alias definition " "'%s:%s'" + ) % (name, k) return cfg[k] = v self.help = cfg.get('help', defaulthelp or '') if self.help and self.help.startswith("hg " + cmd): # drop prefix in old-style help lines so hg shows the alias - self.help = self.help[4 + len(cmd):] + self.help = self.help[4 + len(cmd) :] self.owndoc = 'doc' in cfg doc = cfg.get('doc', pycompat.getdoc(fn)) @@ -587,8 +653,12 @@ return aliasargs(self.fn, args) def __getattr__(self, name): - adefaults = {r'norepo': True, r'intents': set(), - r'optionalrepo': False, r'inferrepo': False} + adefaults = { + r'norepo': True, + r'intents': set(), + r'optionalrepo': False, + r'inferrepo': False, + } if name not in adefaults: raise AttributeError(name) if self.badalias or util.safehasattr(self, 'shell'): @@ -607,11 +677,16 @@ pass raise error.Abort(self.badalias, hint=hint) if self.shadows: - ui.debug("alias '%s' shadows command '%s'\n" % - (self.name, self.cmdname)) + ui.debug( + "alias '%s' shadows command '%s'\n" % (self.name, self.cmdname) + ) - ui.log('commandalias', "alias '%s' expands to '%s'\n", - self.name, self.definition) + ui.log( + 'commandalias', + "alias '%s' expands to '%s'\n", + self.name, + self.definition, + ) if util.safehasattr(self, 'shell'): return self.fn(ui, *args, **opts) else: @@ -622,6 +697,7 @@ ui.debug("alias '%s' expands to '%s'\n" % (self.name, args)) raise + class lazyaliasentry(object): """like a typical command entry (func, opts, help), but is lazy""" @@ -635,8 +711,9 @@ @util.propertycache def _aliasdef(self): - return cmdalias(self.ui, self.name, self.definition, self.cmdtable, - self.source) + return cmdalias( + self.ui, self.name, self.definition, self.cmdtable, self.source + ) def __getitem__(self, n): aliasdef = self._aliasdef @@ -656,6 +733,7 @@ def __len__(self): return 3 + def addaliases(ui, cmdtable): # aliases are processed after extensions have been loaded, so they # may use extension commands. Aliases can also use other alias definitions, @@ -672,6 +750,7 @@ entry = lazyaliasentry(ui, alias, definition, cmdtable, source) cmdtable[alias] = entry + def _parse(ui, args): options = {} cmdoptions = {} @@ -683,14 +762,17 @@ if args: cmd, args = args[0], args[1:] - aliases, entry = cmdutil.findcmd(cmd, commands.table, - ui.configbool("ui", "strict")) + aliases, entry = cmdutil.findcmd( + cmd, commands.table, ui.configbool("ui", "strict") + ) cmd = aliases[0] args = aliasargs(entry[0], args) defaults = ui.config("defaults", cmd) if defaults: - args = pycompat.maplist( - util.expandpath, pycompat.shlexsplit(defaults)) + args + args = ( + pycompat.maplist(util.expandpath, pycompat.shlexsplit(defaults)) + + args + ) c = list(entry[1]) else: cmd = None @@ -713,57 +795,93 @@ return (cmd, cmd and entry[0] or None, args, options, cmdoptions) + def _parseconfig(ui, config): """parse the --config options from the command line""" configs = [] for cfg in config: try: - name, value = [cfgelem.strip() - for cfgelem in cfg.split('=', 1)] + name, value = [cfgelem.strip() for cfgelem in cfg.split('=', 1)] section, name = name.split('.', 1) if not section or not name: raise IndexError ui.setconfig(section, name, value, '--config') configs.append((section, name, value)) except (IndexError, ValueError): - raise error.Abort(_('malformed --config option: %r ' - '(use --config section.name=value)') - % pycompat.bytestr(cfg)) + raise error.Abort( + _( + 'malformed --config option: %r ' + '(use --config section.name=value)' + ) + % pycompat.bytestr(cfg) + ) return configs + def _earlyparseopts(ui, args): options = {} - fancyopts.fancyopts(args, commands.globalopts, options, - gnu=not ui.plain('strictflags'), early=True, - optaliases={'repository': ['repo']}) + fancyopts.fancyopts( + args, + commands.globalopts, + options, + gnu=not ui.plain('strictflags'), + early=True, + optaliases={'repository': ['repo']}, + ) return options + def _earlysplitopts(args): """Split args into a list of possible early options and remainder args""" shortoptions = 'R:' # TODO: perhaps 'debugger' should be included longoptions = ['cwd=', 'repository=', 'repo=', 'config='] - return fancyopts.earlygetopt(args, shortoptions, longoptions, - gnu=True, keepsep=True) + return fancyopts.earlygetopt( + args, shortoptions, longoptions, gnu=True, keepsep=True + ) + def runcommand(lui, repo, cmd, fullargs, ui, options, d, cmdpats, cmdoptions): # run pre-hook, and abort if it fails - hook.hook(lui, repo, "pre-%s" % cmd, True, args=" ".join(fullargs), - pats=cmdpats, opts=cmdoptions) + hook.hook( + lui, + repo, + "pre-%s" % cmd, + True, + args=" ".join(fullargs), + pats=cmdpats, + opts=cmdoptions, + ) try: ret = _runcommand(ui, options, cmd, d) # run post-hook, passing command result - hook.hook(lui, repo, "post-%s" % cmd, False, args=" ".join(fullargs), - result=ret, pats=cmdpats, opts=cmdoptions) + hook.hook( + lui, + repo, + "post-%s" % cmd, + False, + args=" ".join(fullargs), + result=ret, + pats=cmdpats, + opts=cmdoptions, + ) except Exception: # run failure hook and re-raise - hook.hook(lui, repo, "fail-%s" % cmd, False, args=" ".join(fullargs), - pats=cmdpats, opts=cmdoptions) + hook.hook( + lui, + repo, + "fail-%s" % cmd, + False, + args=" ".join(fullargs), + pats=cmdpats, + opts=cmdoptions, + ) raise return ret + def _getlocal(ui, rpath, wd=None): """Return (path, local ui object) for the given target path. @@ -773,8 +891,10 @@ try: wd = encoding.getcwd() except OSError as e: - raise error.Abort(_("error getting current working directory: %s") % - encoding.strtolocal(e.strerror)) + raise error.Abort( + _("error getting current working directory: %s") + % encoding.strtolocal(e.strerror) + ) path = cmdutil.findrepo(wd) or "" if not path: lui = ui @@ -789,6 +909,7 @@ return path, lui + def _checkshellalias(lui, ui, args): """Return the function to run the shell alias, if it is required""" options = {} @@ -817,8 +938,10 @@ # shell alias shouldn't receive early options which are consumed by hg _earlyopts, args = _earlysplitopts(args) d = lambda: fn(ui, *args[1:]) - return lambda: runcommand(lui, None, cmd, args[:1], ui, options, d, - [], {}) + return lambda: runcommand( + lui, None, cmd, args[:1], ui, options, d, [], {} + ) + def _dispatch(req): args = req.args @@ -837,8 +960,11 @@ if req.repo: uis.add(req.repo.ui) - if (req.earlyoptions['verbose'] or req.earlyoptions['debug'] - or req.earlyoptions['quiet']): + if ( + req.earlyoptions['verbose'] + or req.earlyoptions['debug'] + or req.earlyoptions['quiet'] + ): for opt in ('verbose', 'debug', 'quiet'): val = pycompat.bytestr(bool(req.earlyoptions[opt])) for ui_ in uis: @@ -887,9 +1013,12 @@ if options["cwd"] != req.earlyoptions["cwd"]: raise error.Abort(_("option --cwd may not be abbreviated!")) if options["repository"] != req.earlyoptions["repository"]: - raise error.Abort(_( - "option -R has to be separated from other options (e.g. not " - "-qR) and --repository may only be abbreviated as --repo!")) + raise error.Abort( + _( + "option -R has to be separated from other options (e.g. not " + "-qR) and --repository may only be abbreviated as --repo!" + ) + ) if options["debugger"] != req.earlyoptions["debugger"]: raise error.Abort(_("option --debugger may not be abbreviated!")) # don't validate --profile/--traceback, which can be enabled from now @@ -899,18 +1028,29 @@ if options["encodingmode"]: encoding.encodingmode = options["encodingmode"] if options["time"]: + def get_times(): t = os.times() if t[4] == 0.0: # Windows leaves this as zero, so use time.clock() t = (t[0], t[1], t[2], t[3], time.clock()) return t + s = get_times() + def print_time(): t = get_times() ui.warn( - _("time: real %.3f secs (user %.3f+%.3f sys %.3f+%.3f)\n") % - (t[4]-s[4], t[0]-s[0], t[2]-s[2], t[1]-s[1], t[3]-s[3])) + _("time: real %.3f secs (user %.3f+%.3f sys %.3f+%.3f)\n") + % ( + t[4] - s[4], + t[0] - s[0], + t[2] - s[2], + t[1] - s[1], + t[3] - s[3], + ) + ) + ui.atexit(print_time) if options["profile"]: profiler.start() @@ -977,18 +1117,23 @@ repo.ui.fmsg = ui.fmsg else: try: - repo = hg.repository(ui, path=path, - presetupfuncs=req.prereposetups, - intents=func.intents) + repo = hg.repository( + ui, + path=path, + presetupfuncs=req.prereposetups, + intents=func.intents, + ) if not repo.local(): - raise error.Abort(_("repository '%s' is not local") - % path) - repo.ui.setconfig("bundle", "mainreporoot", repo.root, - 'repo') + raise error.Abort( + _("repository '%s' is not local") % path + ) + repo.ui.setconfig( + "bundle", "mainreporoot", repo.root, 'repo' + ) except error.RequirementError: raise except error.RepoError: - if rpath: # invalid -R path + if rpath: # invalid -R path raise if not func.optionalrepo: if func.inferrepo and args and not path: @@ -1000,9 +1145,13 @@ req.earlyoptions['repository'] = guess return _dispatch(req) if not path: - raise error.RepoError(_("no repository found in" - " '%s' (.hg not found)") - % encoding.getcwd()) + raise error.RepoError( + _( + "no repository found in" + " '%s' (.hg not found)" + ) + % encoding.getcwd() + ) raise if repo: ui = repo.ui @@ -1017,12 +1166,14 @@ strcmdopt = pycompat.strkwargs(cmdoptions) d = lambda: util.checksignature(func)(ui, *args, **strcmdopt) try: - return runcommand(lui, repo, cmd, fullargs, ui, options, d, - cmdpats, cmdoptions) + return runcommand( + lui, repo, cmd, fullargs, ui, options, d, cmdpats, cmdoptions + ) finally: if repo and repo != req.repo: repo.close() + def _runcommand(ui, options, cmd, cmdfunc): """Run a command function, possibly with profiling enabled.""" try: @@ -1031,6 +1182,7 @@ except error.SignatureError: raise error.CommandError(cmd, _('invalid arguments')) + def _exceptionwarning(ui): """Produce a warning message for the current active exception""" @@ -1069,28 +1221,40 @@ if worst[0] is not None: name, testedwith, report = worst if not isinstance(testedwith, (bytes, str)): - testedwith = '.'.join([stringutil.forcebytestr(c) - for c in testedwith]) - warning = (_('** Unknown exception encountered with ' - 'possibly-broken third-party extension %s\n' - '** which supports versions %s of Mercurial.\n' - '** Please disable %s and try your action again.\n' - '** If that fixes the bug please report it to %s\n') - % (name, testedwith, name, stringutil.forcebytestr(report))) + testedwith = '.'.join( + [stringutil.forcebytestr(c) for c in testedwith] + ) + warning = _( + '** Unknown exception encountered with ' + 'possibly-broken third-party extension %s\n' + '** which supports versions %s of Mercurial.\n' + '** Please disable %s and try your action again.\n' + '** If that fixes the bug please report it to %s\n' + ) % (name, testedwith, name, stringutil.forcebytestr(report)) else: bugtracker = ui.config('ui', 'supportcontact') if bugtracker is None: bugtracker = _("https://mercurial-scm.org/wiki/BugTracker") - warning = (_("** unknown exception encountered, " - "please report by visiting\n** ") + bugtracker + '\n') + warning = ( + _( + "** unknown exception encountered, " + "please report by visiting\n** " + ) + + bugtracker + + '\n' + ) sysversion = pycompat.sysbytes(sys.version).replace('\n', '') - warning += ((_("** Python %s\n") % sysversion) + - (_("** Mercurial Distributed SCM (version %s)\n") % - util.version()) + - (_("** Extensions loaded: %s\n") % - ", ".join([x[0] for x in extensions.extensions()]))) + warning += ( + (_("** Python %s\n") % sysversion) + + (_("** Mercurial Distributed SCM (version %s)\n") % util.version()) + + ( + _("** Extensions loaded: %s\n") + % ", ".join([x[0] for x in extensions.extensions()]) + ) + ) return warning + def handlecommandexception(ui): """Produce a warning message for broken commands @@ -1098,7 +1262,11 @@ this function returns False, ignored otherwise. """ warning = _exceptionwarning(ui) - ui.log("commandexception", "%s\n%s\n", warning, - pycompat.sysbytes(traceback.format_exc())) + ui.log( + "commandexception", + "%s\n%s\n", + warning, + pycompat.sysbytes(traceback.format_exc()), + ) ui.warn(warning) return False # re-raise the exception