mercurial/dispatch.py
author Matt Harbison <matt_harbison@yahoo.com>
Sun, 05 Jan 2025 21:03:17 -0500
changeset 52640 24ee91ba9aa8
parent 52426 22129ce9f86d
child 52642 73ab542565e0
permissions -rw-r--r--
pyupgrade: drop usage of py3 aliases for `OSError` These were different classes in py2, but now a handful of error classes are just an alias of `OSError`, like `IOError`, `EnvironmentError`, `WindowsError`, etc. This is the result of running a hacked version of `pyupgrade` 3.19.1[1] $ hg files -0 'relglob:**.py' | xargs -0 \ pyupgrade --py38-plus --keep-percent-format --keep-mock --keep-runtime-typing The hack is because it doesn't have command line switches to disable most changes, so it makes tons of unrelated changes all at once. The hack is to 1) patch `pyupgrade._main._fix_tokens()` to immediately return its content arg 2) change `pyupgrade._data.register_decorator()` to only register the function if it's from the fixer we're interested in: if func.__module__ in ( "pyupgrade._plugins.exceptions", ): FUNCS[tp].append(func) return func [1] https://github.com/asottile/pyupgrade
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
5178
18a9fbb5cd78 dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
     1
# dispatch.py - command dispatching for mercurial
18a9fbb5cd78 dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
     2
#
46819
d4ba4d51f85f contributor: change mentions of mpm to olivia
Rapha?l Gom?s <rgomes@octobus.net>
parents: 46786
diff changeset
     3
# Copyright 2005-2007 Olivia Mackall <olivia@selenic.com>
5178
18a9fbb5cd78 dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
     4
#
8225
46293a0c7e9f updated license to be explicit about GPL version 2
Martin Geisler <mg@lazybytes.net>
parents: 8206
diff changeset
     5
# This software may be used and distributed according to the terms of the
10263
25e572394f5c Update license to GPLv2+
Matt Mackall <mpm@selenic.com>
parents: 9993
diff changeset
     6
# GNU General Public License version 2 or any later version.
5178
18a9fbb5cd78 dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
     7
51859
f4733654f144 typing: add `from __future__ import annotations` to most files
Matt Harbison <matt_harbison@yahoo.com>
parents: 51858
diff changeset
     8
from __future__ import annotations
25932
d491f289045f dispatch: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25834
diff changeset
     9
d491f289045f dispatch: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25834
diff changeset
    10
import errno
30576
541949a10a68 fancyopts: switch from fancyopts.getopt.* to getopt.*
Pulkit Goyal <7895pulkit@gmail.com>
parents: 30559
diff changeset
    11
import getopt
44653
02fa5392bab6 dispatch: force \n for newlines on sys.std* streams (BC)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 44452
diff changeset
    12
import io
25932
d491f289045f dispatch: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25834
diff changeset
    13
import os
d491f289045f dispatch: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25834
diff changeset
    14
import pdb
d491f289045f dispatch: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25834
diff changeset
    15
import re
d491f289045f dispatch: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25834
diff changeset
    16
import signal
d491f289045f dispatch: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25834
diff changeset
    17
import sys
d491f289045f dispatch: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25834
diff changeset
    18
import traceback
d491f289045f dispatch: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25834
diff changeset
    19
d491f289045f dispatch: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25834
diff changeset
    20
d491f289045f dispatch: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25834
diff changeset
    21
from .i18n import _
d491f289045f dispatch: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25834
diff changeset
    22
39255
4019b4542e61 dispatch: have dispatch.dispatch and dispatch._runcatch emit trace events
Augie Fackler <augie@google.com>
parents: 38788
diff changeset
    23
from hgdemandimport import tracing
4019b4542e61 dispatch: have dispatch.dispatch and dispatch._runcatch emit trace events
Augie Fackler <augie@google.com>
parents: 38788
diff changeset
    24
25932
d491f289045f dispatch: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25834
diff changeset
    25
from . import (
d491f289045f dispatch: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25834
diff changeset
    26
    cmdutil,
30653
b2be4ccaff1d color: load 'colortable' from extension using an 'extraloader'
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 30586
diff changeset
    27
    color,
25932
d491f289045f dispatch: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25834
diff changeset
    28
    commands,
d491f289045f dispatch: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25834
diff changeset
    29
    demandimport,
d491f289045f dispatch: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25834
diff changeset
    30
    encoding,
d491f289045f dispatch: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25834
diff changeset
    31
    error,
d491f289045f dispatch: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25834
diff changeset
    32
    extensions,
d491f289045f dispatch: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25834
diff changeset
    33
    fancyopts,
31060
ab20491b1760 dispatch: rearrange 'unknown command' code to better employ pager
Augie Fackler <augie@google.com>
parents: 31027
diff changeset
    34
    help,
25932
d491f289045f dispatch: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25834
diff changeset
    35
    hg,
d491f289045f dispatch: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25834
diff changeset
    36
    hook,
29781
2654a0aac80d profiling: move profiling code from dispatch.py (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 29761
diff changeset
    37
    profiling,
30468
7f2b18c34c02 py3: use pycompat.sysargv in dispatch.run()
Pulkit Goyal <7895pulkit@gmail.com>
parents: 30401
diff changeset
    38
    pycompat,
40414
444861dc1e55 help: displaying documented aliases by default
rdamazio@google.com
parents: 40402
diff changeset
    39
    registrar,
30520
4338f87dbf6f dispatch: move part of callcatch to scmutil
Jun Wu <quark@fb.com>
parents: 30519
diff changeset
    40
    scmutil,
25932
d491f289045f dispatch: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25834
diff changeset
    41
    ui as uimod,
d491f289045f dispatch: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25834
diff changeset
    42
    util,
d491f289045f dispatch: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25834
diff changeset
    43
)
5178
18a9fbb5cd78 dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
    44
52416
0a81f3ef054c config: move `rcutil` module under a new `mercurial.configuration` module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51859
diff changeset
    45
from .configuration import rcutil
37084
f0b6fbea00cf stringutil: bulk-replace call sites to point to new module
Yuya Nishihara <yuya@tcha.org>
parents: 36729
diff changeset
    46
from .utils import (
37119
d4a2e0d5d042 procutil: bulk-replace util.std* to point to new module
Yuya Nishihara <yuya@tcha.org>
parents: 37084
diff changeset
    47
    procutil,
37084
f0b6fbea00cf stringutil: bulk-replace call sites to point to new module
Yuya Nishihara <yuya@tcha.org>
parents: 36729
diff changeset
    48
    stringutil,
46957
e7d082e4ace6 dispatch: use the new API to resolve --repository
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 46819
diff changeset
    49
    urlutil,
37084
f0b6fbea00cf stringutil: bulk-replace call sites to point to new module
Yuya Nishihara <yuya@tcha.org>
parents: 36729
diff changeset
    50
)
f0b6fbea00cf stringutil: bulk-replace call sites to point to new module
Yuya Nishihara <yuya@tcha.org>
parents: 36729
diff changeset
    51
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41193
diff changeset
    52
48946
642e31cb55f0 py3: use class X: instead of class X(object):
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48913
diff changeset
    53
class request:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41193
diff changeset
    54
    def __init__(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41193
diff changeset
    55
        self,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41193
diff changeset
    56
        args,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41193
diff changeset
    57
        ui=None,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41193
diff changeset
    58
        repo=None,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41193
diff changeset
    59
        fin=None,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41193
diff changeset
    60
        fout=None,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41193
diff changeset
    61
        ferr=None,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41193
diff changeset
    62
        fmsg=None,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41193
diff changeset
    63
        prereposetups=None,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41193
diff changeset
    64
    ):
14438
08bfec2ef031 dispatch: wrap dispatch related information in a request class
Idan Kamara <idankk86@gmail.com>
parents: 14286
diff changeset
    65
        self.args = args
14439
80c599eee3f3 dispatch: use the request to store the ui object
Idan Kamara <idankk86@gmail.com>
parents: 14438
diff changeset
    66
        self.ui = ui
14510
eccbb9980ada dispatch: add repo to the request
Idan Kamara <idankk86@gmail.com>
parents: 14439
diff changeset
    67
        self.repo = repo
14438
08bfec2ef031 dispatch: wrap dispatch related information in a request class
Idan Kamara <idankk86@gmail.com>
parents: 14286
diff changeset
    68
14613
ea8938d3a5aa dispatch: add I/O descriptors to the request
Idan Kamara <idankk86@gmail.com>
parents: 14601
diff changeset
    69
        # input/output/error streams
ea8938d3a5aa dispatch: add I/O descriptors to the request
Idan Kamara <idankk86@gmail.com>
parents: 14601
diff changeset
    70
        self.fin = fin
ea8938d3a5aa dispatch: add I/O descriptors to the request
Idan Kamara <idankk86@gmail.com>
parents: 14601
diff changeset
    71
        self.fout = fout
ea8938d3a5aa dispatch: add I/O descriptors to the request
Idan Kamara <idankk86@gmail.com>
parents: 14601
diff changeset
    72
        self.ferr = ferr
40587
5542bc9125c9 dispatch: pass around ui.fmsg channel
Yuya Nishihara <yuya@tcha.org>
parents: 40414
diff changeset
    73
        # separate stream for status/error messages
5542bc9125c9 dispatch: pass around ui.fmsg channel
Yuya Nishihara <yuya@tcha.org>
parents: 40414
diff changeset
    74
        self.fmsg = fmsg
14613
ea8938d3a5aa dispatch: add I/O descriptors to the request
Idan Kamara <idankk86@gmail.com>
parents: 14601
diff changeset
    75
35224
6e6d0a5b88e6 dispatch: replace _earlyreq*() with new fancyopts-based parser
Yuya Nishihara <yuya@tcha.org>
parents: 35223
diff changeset
    76
        # remember options pre-parsed by _earlyparseopts()
35030
d9aba3730d30 dispatch: abort if early boolean options can't be parsed
Yuya Nishihara <yuya@tcha.org>
parents: 35029
diff changeset
    77
        self.earlyoptions = {}
d9aba3730d30 dispatch: abort if early boolean options can't be parsed
Yuya Nishihara <yuya@tcha.org>
parents: 35029
diff changeset
    78
32379
71e735bd8170 dispatch: make request accept additional reposetups
Jun Wu <quark@fb.com>
parents: 32377
diff changeset
    79
        # reposetups which run before extensions, useful for chg to pre-fill
71e735bd8170 dispatch: make request accept additional reposetups
Jun Wu <quark@fb.com>
parents: 32377
diff changeset
    80
        # low-level repo state (for example, changelog) before extensions.
71e735bd8170 dispatch: make request accept additional reposetups
Jun Wu <quark@fb.com>
parents: 32377
diff changeset
    81
        self.prereposetups = prereposetups or []
71e735bd8170 dispatch: make request accept additional reposetups
Jun Wu <quark@fb.com>
parents: 32377
diff changeset
    82
40402
106adc261492 logtoprocess: sends the canonical command name to the subprocess
Boris Feld <boris.feld@octobus.net>
parents: 39818
diff changeset
    83
        # store the parsed and canonical command
106adc261492 logtoprocess: sends the canonical command name to the subprocess
Boris Feld <boris.feld@octobus.net>
parents: 39818
diff changeset
    84
        self.canonical_command = None
106adc261492 logtoprocess: sends the canonical command name to the subprocess
Boris Feld <boris.feld@octobus.net>
parents: 39818
diff changeset
    85
51811
460e80488cf0 typing: lock in correct changes from pytype 2023.04.11 -> 2023.06.16
Matt Harbison <matt_harbison@yahoo.com>
parents: 51375
diff changeset
    86
    def _runexithandlers(self) -> None:
31956
c13ff31818b0 ui: add special-purpose atexit functionality
Bryan O'Sullivan <bryano@fb.com>
parents: 31629
diff changeset
    87
        exc = None
c13ff31818b0 ui: add special-purpose atexit functionality
Bryan O'Sullivan <bryano@fb.com>
parents: 31629
diff changeset
    88
        handlers = self.ui._exithandlers
c13ff31818b0 ui: add special-purpose atexit functionality
Bryan O'Sullivan <bryano@fb.com>
parents: 31629
diff changeset
    89
        try:
c13ff31818b0 ui: add special-purpose atexit functionality
Bryan O'Sullivan <bryano@fb.com>
parents: 31629
diff changeset
    90
            while handlers:
c13ff31818b0 ui: add special-purpose atexit functionality
Bryan O'Sullivan <bryano@fb.com>
parents: 31629
diff changeset
    91
                func, args, kwargs = handlers.pop()
c13ff31818b0 ui: add special-purpose atexit functionality
Bryan O'Sullivan <bryano@fb.com>
parents: 31629
diff changeset
    92
                try:
c13ff31818b0 ui: add special-purpose atexit functionality
Bryan O'Sullivan <bryano@fb.com>
parents: 31629
diff changeset
    93
                    func(*args, **kwargs)
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41193
diff changeset
    94
                except:  # re-raises below
31956
c13ff31818b0 ui: add special-purpose atexit functionality
Bryan O'Sullivan <bryano@fb.com>
parents: 31629
diff changeset
    95
                    if exc is None:
c13ff31818b0 ui: add special-purpose atexit functionality
Bryan O'Sullivan <bryano@fb.com>
parents: 31629
diff changeset
    96
                        exc = sys.exc_info()[1]
43080
86e4daa2d54c cleanup: mark some ui.(status|note|warn|write) calls as not needing i18n
Augie Fackler <augie@google.com>
parents: 43077
diff changeset
    97
                    self.ui.warnnoi18n(b'error in exit handlers:\n')
31956
c13ff31818b0 ui: add special-purpose atexit functionality
Bryan O'Sullivan <bryano@fb.com>
parents: 31629
diff changeset
    98
                    self.ui.traceback(force=True)
c13ff31818b0 ui: add special-purpose atexit functionality
Bryan O'Sullivan <bryano@fb.com>
parents: 31629
diff changeset
    99
        finally:
c13ff31818b0 ui: add special-purpose atexit functionality
Bryan O'Sullivan <bryano@fb.com>
parents: 31629
diff changeset
   100
            if exc is not None:
c13ff31818b0 ui: add special-purpose atexit functionality
Bryan O'Sullivan <bryano@fb.com>
parents: 31629
diff changeset
   101
                raise exc
c13ff31818b0 ui: add special-purpose atexit functionality
Bryan O'Sullivan <bryano@fb.com>
parents: 31629
diff changeset
   102
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41193
diff changeset
   103
46101
49b6910217f9 dispatch: move IOError handling and flushing of streams to `dispatch()`
Pulkit Goyal <7895pulkit@gmail.com>
parents: 46086
diff changeset
   104
def _flushstdio(ui, err):
46086
ac9de799d390 commandserver: handle IOError related to flushing of streams
Pulkit Goyal <7895pulkit@gmail.com>
parents: 46084
diff changeset
   105
    status = None
ac9de799d390 commandserver: handle IOError related to flushing of streams
Pulkit Goyal <7895pulkit@gmail.com>
parents: 46084
diff changeset
   106
    # In all cases we try to flush stdio streams.
50925
d718eddf01d9 safehasattr: drop usage in favor of hasattr
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50570
diff changeset
   107
    if hasattr(ui, 'fout'):
46086
ac9de799d390 commandserver: handle IOError related to flushing of streams
Pulkit Goyal <7895pulkit@gmail.com>
parents: 46084
diff changeset
   108
        assert ui is not None  # help pytype
ac9de799d390 commandserver: handle IOError related to flushing of streams
Pulkit Goyal <7895pulkit@gmail.com>
parents: 46084
diff changeset
   109
        assert ui.fout is not None  # help pytype
ac9de799d390 commandserver: handle IOError related to flushing of streams
Pulkit Goyal <7895pulkit@gmail.com>
parents: 46084
diff changeset
   110
        try:
ac9de799d390 commandserver: handle IOError related to flushing of streams
Pulkit Goyal <7895pulkit@gmail.com>
parents: 46084
diff changeset
   111
            ui.fout.flush()
52640
24ee91ba9aa8 pyupgrade: drop usage of py3 aliases for `OSError`
Matt Harbison <matt_harbison@yahoo.com>
parents: 52426
diff changeset
   112
        except OSError as e:
46086
ac9de799d390 commandserver: handle IOError related to flushing of streams
Pulkit Goyal <7895pulkit@gmail.com>
parents: 46084
diff changeset
   113
            err = e
ac9de799d390 commandserver: handle IOError related to flushing of streams
Pulkit Goyal <7895pulkit@gmail.com>
parents: 46084
diff changeset
   114
            status = -1
ac9de799d390 commandserver: handle IOError related to flushing of streams
Pulkit Goyal <7895pulkit@gmail.com>
parents: 46084
diff changeset
   115
50925
d718eddf01d9 safehasattr: drop usage in favor of hasattr
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50570
diff changeset
   116
    if hasattr(ui, 'ferr'):
46086
ac9de799d390 commandserver: handle IOError related to flushing of streams
Pulkit Goyal <7895pulkit@gmail.com>
parents: 46084
diff changeset
   117
        assert ui is not None  # help pytype
ac9de799d390 commandserver: handle IOError related to flushing of streams
Pulkit Goyal <7895pulkit@gmail.com>
parents: 46084
diff changeset
   118
        assert ui.ferr is not None  # help pytype
ac9de799d390 commandserver: handle IOError related to flushing of streams
Pulkit Goyal <7895pulkit@gmail.com>
parents: 46084
diff changeset
   119
        try:
ac9de799d390 commandserver: handle IOError related to flushing of streams
Pulkit Goyal <7895pulkit@gmail.com>
parents: 46084
diff changeset
   120
            if err is not None and err.errno != errno.EPIPE:
ac9de799d390 commandserver: handle IOError related to flushing of streams
Pulkit Goyal <7895pulkit@gmail.com>
parents: 46084
diff changeset
   121
                ui.ferr.write(
ac9de799d390 commandserver: handle IOError related to flushing of streams
Pulkit Goyal <7895pulkit@gmail.com>
parents: 46084
diff changeset
   122
                    b'abort: %s\n' % encoding.strtolocal(err.strerror)
ac9de799d390 commandserver: handle IOError related to flushing of streams
Pulkit Goyal <7895pulkit@gmail.com>
parents: 46084
diff changeset
   123
                )
ac9de799d390 commandserver: handle IOError related to flushing of streams
Pulkit Goyal <7895pulkit@gmail.com>
parents: 46084
diff changeset
   124
            ui.ferr.flush()
ac9de799d390 commandserver: handle IOError related to flushing of streams
Pulkit Goyal <7895pulkit@gmail.com>
parents: 46084
diff changeset
   125
        # There's not much we can do about an I/O error here. So (possibly)
ac9de799d390 commandserver: handle IOError related to flushing of streams
Pulkit Goyal <7895pulkit@gmail.com>
parents: 46084
diff changeset
   126
        # change the status code and move on.
52640
24ee91ba9aa8 pyupgrade: drop usage of py3 aliases for `OSError`
Matt Harbison <matt_harbison@yahoo.com>
parents: 52426
diff changeset
   127
        except OSError:
46086
ac9de799d390 commandserver: handle IOError related to flushing of streams
Pulkit Goyal <7895pulkit@gmail.com>
parents: 46084
diff changeset
   128
            status = -1
ac9de799d390 commandserver: handle IOError related to flushing of streams
Pulkit Goyal <7895pulkit@gmail.com>
parents: 46084
diff changeset
   129
ac9de799d390 commandserver: handle IOError related to flushing of streams
Pulkit Goyal <7895pulkit@gmail.com>
parents: 46084
diff changeset
   130
    return status
ac9de799d390 commandserver: handle IOError related to flushing of streams
Pulkit Goyal <7895pulkit@gmail.com>
parents: 46084
diff changeset
   131
ac9de799d390 commandserver: handle IOError related to flushing of streams
Pulkit Goyal <7895pulkit@gmail.com>
parents: 46084
diff changeset
   132
5178
18a9fbb5cd78 dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
   133
def run():
43787
be8552f25cab cleanup: fix docstring formatting
Matt Harbison <matt_harbison@yahoo.com>
parents: 43706
diff changeset
   134
    """run the command in sys.argv"""
31960
71dcd4a4fa2f stdio: catch StdioError in dispatch.run and clean up appropriately
Bryan O'Sullivan <bryano@fb.com>
parents: 31958
diff changeset
   135
    try:
45101
9e6b86a8f438 dispatch: indent run() function
Yuya Nishihara <yuya@tcha.org>
parents: 44653
diff changeset
   136
        initstdio()
9e6b86a8f438 dispatch: indent run() function
Yuya Nishihara <yuya@tcha.org>
parents: 44653
diff changeset
   137
        with tracing.log('parse args into request'):
9e6b86a8f438 dispatch: indent run() function
Yuya Nishihara <yuya@tcha.org>
parents: 44653
diff changeset
   138
            req = request(pycompat.sysargv[1:])
37994
e9c588802529 dispatch: minor code refactor
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37944
diff changeset
   139
46101
49b6910217f9 dispatch: move IOError handling and flushing of streams to `dispatch()`
Pulkit Goyal <7895pulkit@gmail.com>
parents: 46086
diff changeset
   140
        status = dispatch(req)
45101
9e6b86a8f438 dispatch: indent run() function
Yuya Nishihara <yuya@tcha.org>
parents: 44653
diff changeset
   141
        _silencestdio()
45102
efcc87d37f4d dispatch: handle late KeyboardInterrupt occurred in run()
Yuya Nishihara <yuya@tcha.org>
parents: 45101
diff changeset
   142
    except KeyboardInterrupt:
efcc87d37f4d dispatch: handle late KeyboardInterrupt occurred in run()
Yuya Nishihara <yuya@tcha.org>
parents: 45101
diff changeset
   143
        # Catch early/late KeyboardInterrupt as last ditch. Here nothing will
efcc87d37f4d dispatch: handle late KeyboardInterrupt occurred in run()
Yuya Nishihara <yuya@tcha.org>
parents: 45101
diff changeset
   144
        # be printed to console to avoid another IOError/KeyboardInterrupt.
efcc87d37f4d dispatch: handle late KeyboardInterrupt occurred in run()
Yuya Nishihara <yuya@tcha.org>
parents: 45101
diff changeset
   145
        status = -1
31960
71dcd4a4fa2f stdio: catch StdioError in dispatch.run and clean up appropriately
Bryan O'Sullivan <bryano@fb.com>
parents: 31958
diff changeset
   146
    sys.exit(status & 255)
5178
18a9fbb5cd78 dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
   147
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41193
diff changeset
   148
48891
4eae533354ae dispatch: remove Python 2 function variants
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48875
diff changeset
   149
def initstdio():
4eae533354ae dispatch: remove Python 2 function variants
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48875
diff changeset
   150
    # stdio streams on Python 3 are io.TextIOWrapper instances proxying another
4eae533354ae dispatch: remove Python 2 function variants
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48875
diff changeset
   151
    # buffer. These streams will normalize \n to \r\n by default. Mercurial's
4eae533354ae dispatch: remove Python 2 function variants
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48875
diff changeset
   152
    # preferred mechanism for writing output (ui.write()) uses io.BufferedWriter
4eae533354ae dispatch: remove Python 2 function variants
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48875
diff changeset
   153
    # instances, which write to the underlying stdio file descriptor in binary
4eae533354ae dispatch: remove Python 2 function variants
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48875
diff changeset
   154
    # mode. ui.write() uses \n for line endings and no line ending normalization
4eae533354ae dispatch: remove Python 2 function variants
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48875
diff changeset
   155
    # is attempted through this interface. This "just works," even if the system
4eae533354ae dispatch: remove Python 2 function variants
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48875
diff changeset
   156
    # preferred line ending is not \n.
4eae533354ae dispatch: remove Python 2 function variants
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48875
diff changeset
   157
    #
4eae533354ae dispatch: remove Python 2 function variants
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48875
diff changeset
   158
    # But some parts of Mercurial (e.g. hooks) can still send data to sys.stdout
4eae533354ae dispatch: remove Python 2 function variants
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48875
diff changeset
   159
    # and sys.stderr. They will inherit the line ending normalization settings,
4eae533354ae dispatch: remove Python 2 function variants
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48875
diff changeset
   160
    # potentially causing e.g. \r\n to be emitted. Since emitting \n should
4eae533354ae dispatch: remove Python 2 function variants
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48875
diff changeset
   161
    # "just work," here we change the sys.* streams to disable line ending
4eae533354ae dispatch: remove Python 2 function variants
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48875
diff changeset
   162
    # normalization, ensuring compatibility with our ui type.
44653
02fa5392bab6 dispatch: force \n for newlines on sys.std* streams (BC)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 44452
diff changeset
   163
48891
4eae533354ae dispatch: remove Python 2 function variants
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48875
diff changeset
   164
    if sys.stdout is not None:
4eae533354ae dispatch: remove Python 2 function variants
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48875
diff changeset
   165
        # write_through is new in Python 3.7.
4eae533354ae dispatch: remove Python 2 function variants
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48875
diff changeset
   166
        kwargs = {
4eae533354ae dispatch: remove Python 2 function variants
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48875
diff changeset
   167
            "newline": "\n",
4eae533354ae dispatch: remove Python 2 function variants
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48875
diff changeset
   168
            "line_buffering": sys.stdout.line_buffering,
4eae533354ae dispatch: remove Python 2 function variants
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48875
diff changeset
   169
        }
50925
d718eddf01d9 safehasattr: drop usage in favor of hasattr
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50570
diff changeset
   170
        if hasattr(sys.stdout, "write_through"):
48891
4eae533354ae dispatch: remove Python 2 function variants
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48875
diff changeset
   171
            # pytype: disable=attribute-error
4eae533354ae dispatch: remove Python 2 function variants
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48875
diff changeset
   172
            kwargs["write_through"] = sys.stdout.write_through
4eae533354ae dispatch: remove Python 2 function variants
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48875
diff changeset
   173
            # pytype: enable=attribute-error
4eae533354ae dispatch: remove Python 2 function variants
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48875
diff changeset
   174
        sys.stdout = io.TextIOWrapper(
4eae533354ae dispatch: remove Python 2 function variants
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48875
diff changeset
   175
            sys.stdout.buffer, sys.stdout.encoding, sys.stdout.errors, **kwargs
4eae533354ae dispatch: remove Python 2 function variants
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48875
diff changeset
   176
        )
44653
02fa5392bab6 dispatch: force \n for newlines on sys.std* streams (BC)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 44452
diff changeset
   177
48891
4eae533354ae dispatch: remove Python 2 function variants
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48875
diff changeset
   178
    if sys.stderr is not None:
4eae533354ae dispatch: remove Python 2 function variants
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48875
diff changeset
   179
        kwargs = {
4eae533354ae dispatch: remove Python 2 function variants
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48875
diff changeset
   180
            "newline": "\n",
4eae533354ae dispatch: remove Python 2 function variants
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48875
diff changeset
   181
            "line_buffering": sys.stderr.line_buffering,
4eae533354ae dispatch: remove Python 2 function variants
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48875
diff changeset
   182
        }
50925
d718eddf01d9 safehasattr: drop usage in favor of hasattr
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50570
diff changeset
   183
        if hasattr(sys.stderr, "write_through"):
48891
4eae533354ae dispatch: remove Python 2 function variants
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48875
diff changeset
   184
            # pytype: disable=attribute-error
4eae533354ae dispatch: remove Python 2 function variants
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48875
diff changeset
   185
            kwargs["write_through"] = sys.stderr.write_through
4eae533354ae dispatch: remove Python 2 function variants
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48875
diff changeset
   186
            # pytype: enable=attribute-error
4eae533354ae dispatch: remove Python 2 function variants
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48875
diff changeset
   187
        sys.stderr = io.TextIOWrapper(
4eae533354ae dispatch: remove Python 2 function variants
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48875
diff changeset
   188
            sys.stderr.buffer, sys.stderr.encoding, sys.stderr.errors, **kwargs
4eae533354ae dispatch: remove Python 2 function variants
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48875
diff changeset
   189
        )
36637
e8c361316803 py3: silence the final IOError by closing stdout/err slightly early
Yuya Nishihara <yuya@tcha.org>
parents: 36636
diff changeset
   190
48891
4eae533354ae dispatch: remove Python 2 function variants
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48875
diff changeset
   191
    if sys.stdin is not None:
4eae533354ae dispatch: remove Python 2 function variants
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48875
diff changeset
   192
        # No write_through on read-only stream.
4eae533354ae dispatch: remove Python 2 function variants
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48875
diff changeset
   193
        sys.stdin = io.TextIOWrapper(
4eae533354ae dispatch: remove Python 2 function variants
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48875
diff changeset
   194
            sys.stdin.buffer,
4eae533354ae dispatch: remove Python 2 function variants
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48875
diff changeset
   195
            sys.stdin.encoding,
4eae533354ae dispatch: remove Python 2 function variants
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48875
diff changeset
   196
            sys.stdin.errors,
4eae533354ae dispatch: remove Python 2 function variants
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48875
diff changeset
   197
            # None is universal newlines mode.
4eae533354ae dispatch: remove Python 2 function variants
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48875
diff changeset
   198
            newline=None,
4eae533354ae dispatch: remove Python 2 function variants
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48875
diff changeset
   199
            line_buffering=sys.stdin.line_buffering,
4eae533354ae dispatch: remove Python 2 function variants
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48875
diff changeset
   200
        )
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41193
diff changeset
   201
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41193
diff changeset
   202
48891
4eae533354ae dispatch: remove Python 2 function variants
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48875
diff changeset
   203
def _silencestdio():
4eae533354ae dispatch: remove Python 2 function variants
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48875
diff changeset
   204
    for fp in (sys.stdout, sys.stderr):
4eae533354ae dispatch: remove Python 2 function variants
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48875
diff changeset
   205
        if fp is None:
4eae533354ae dispatch: remove Python 2 function variants
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48875
diff changeset
   206
            continue
4eae533354ae dispatch: remove Python 2 function variants
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48875
diff changeset
   207
        # Check if the file is okay
4eae533354ae dispatch: remove Python 2 function variants
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48875
diff changeset
   208
        try:
4eae533354ae dispatch: remove Python 2 function variants
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48875
diff changeset
   209
            fp.flush()
4eae533354ae dispatch: remove Python 2 function variants
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48875
diff changeset
   210
            continue
52640
24ee91ba9aa8 pyupgrade: drop usage of py3 aliases for `OSError`
Matt Harbison <matt_harbison@yahoo.com>
parents: 52426
diff changeset
   211
        except OSError:
48891
4eae533354ae dispatch: remove Python 2 function variants
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48875
diff changeset
   212
            pass
4eae533354ae dispatch: remove Python 2 function variants
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48875
diff changeset
   213
        # Otherwise mark it as closed to silence "Exception ignored in"
4eae533354ae dispatch: remove Python 2 function variants
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48875
diff changeset
   214
        # message emitted by the interpreter finalizer.
4eae533354ae dispatch: remove Python 2 function variants
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48875
diff changeset
   215
        try:
4eae533354ae dispatch: remove Python 2 function variants
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48875
diff changeset
   216
            fp.close()
52640
24ee91ba9aa8 pyupgrade: drop usage of py3 aliases for `OSError`
Matt Harbison <matt_harbison@yahoo.com>
parents: 52426
diff changeset
   217
        except OSError:
48891
4eae533354ae dispatch: remove Python 2 function variants
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48875
diff changeset
   218
            pass
36637
e8c361316803 py3: silence the final IOError by closing stdout/err slightly early
Yuya Nishihara <yuya@tcha.org>
parents: 36636
diff changeset
   219
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41193
diff changeset
   220
31492
3c77414a0f9c dispatch: consolidate formatting of arguments
Augie Fackler <augie@google.com>
parents: 31491
diff changeset
   221
def _formatargs(args):
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   222
    return b' '.join(procutil.shellquote(a) for a in args)
31492
3c77414a0f9c dispatch: consolidate formatting of arguments
Augie Fackler <augie@google.com>
parents: 31491
diff changeset
   223
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41193
diff changeset
   224
14438
08bfec2ef031 dispatch: wrap dispatch related information in a request class
Idan Kamara <idankk86@gmail.com>
parents: 14286
diff changeset
   225
def dispatch(req):
37995
6f9ac3cb0987 dispatch: unify handling of None returned by a command function
Yuya Nishihara <yuya@tcha.org>
parents: 37994
diff changeset
   226
    """run the command specified in req.args; returns an integer status code"""
46101
49b6910217f9 dispatch: move IOError handling and flushing of streams to `dispatch()`
Pulkit Goyal <7895pulkit@gmail.com>
parents: 46086
diff changeset
   227
    err = None
49b6910217f9 dispatch: move IOError handling and flushing of streams to `dispatch()`
Pulkit Goyal <7895pulkit@gmail.com>
parents: 46086
diff changeset
   228
    try:
49b6910217f9 dispatch: move IOError handling and flushing of streams to `dispatch()`
Pulkit Goyal <7895pulkit@gmail.com>
parents: 46086
diff changeset
   229
        status = _rundispatch(req)
49b6910217f9 dispatch: move IOError handling and flushing of streams to `dispatch()`
Pulkit Goyal <7895pulkit@gmail.com>
parents: 46086
diff changeset
   230
    except error.StdioError as e:
49b6910217f9 dispatch: move IOError handling and flushing of streams to `dispatch()`
Pulkit Goyal <7895pulkit@gmail.com>
parents: 46086
diff changeset
   231
        err = e
49b6910217f9 dispatch: move IOError handling and flushing of streams to `dispatch()`
Pulkit Goyal <7895pulkit@gmail.com>
parents: 46086
diff changeset
   232
        status = -1
49b6910217f9 dispatch: move IOError handling and flushing of streams to `dispatch()`
Pulkit Goyal <7895pulkit@gmail.com>
parents: 46086
diff changeset
   233
48256
56d037d07395 backout: backed out changeset 2f2107c01dee
Rapha?l Gom?s <rgomes@octobus.net>
parents: 48255
diff changeset
   234
    ret = _flushstdio(req.ui, err)
56d037d07395 backout: backed out changeset 2f2107c01dee
Rapha?l Gom?s <rgomes@octobus.net>
parents: 48255
diff changeset
   235
    if ret and not status:
56d037d07395 backout: backed out changeset 2f2107c01dee
Rapha?l Gom?s <rgomes@octobus.net>
parents: 48255
diff changeset
   236
        status = ret
46101
49b6910217f9 dispatch: move IOError handling and flushing of streams to `dispatch()`
Pulkit Goyal <7895pulkit@gmail.com>
parents: 46086
diff changeset
   237
    return status
49b6910217f9 dispatch: move IOError handling and flushing of streams to `dispatch()`
Pulkit Goyal <7895pulkit@gmail.com>
parents: 46086
diff changeset
   238
49b6910217f9 dispatch: move IOError handling and flushing of streams to `dispatch()`
Pulkit Goyal <7895pulkit@gmail.com>
parents: 46086
diff changeset
   239
51811
460e80488cf0 typing: lock in correct changes from pytype 2023.04.11 -> 2023.06.16
Matt Harbison <matt_harbison@yahoo.com>
parents: 51375
diff changeset
   240
def _rundispatch(req) -> int:
46101
49b6910217f9 dispatch: move IOError handling and flushing of streams to `dispatch()`
Pulkit Goyal <7895pulkit@gmail.com>
parents: 46086
diff changeset
   241
    with tracing.log('dispatch._rundispatch'):
39255
4019b4542e61 dispatch: have dispatch.dispatch and dispatch._runcatch emit trace events
Augie Fackler <augie@google.com>
parents: 38788
diff changeset
   242
        if req.ferr:
4019b4542e61 dispatch: have dispatch.dispatch and dispatch._runcatch emit trace events
Augie Fackler <augie@google.com>
parents: 38788
diff changeset
   243
            ferr = req.ferr
4019b4542e61 dispatch: have dispatch.dispatch and dispatch._runcatch emit trace events
Augie Fackler <augie@google.com>
parents: 38788
diff changeset
   244
        elif req.ui:
4019b4542e61 dispatch: have dispatch.dispatch and dispatch._runcatch emit trace events
Augie Fackler <augie@google.com>
parents: 38788
diff changeset
   245
            ferr = req.ui.ferr
4019b4542e61 dispatch: have dispatch.dispatch and dispatch._runcatch emit trace events
Augie Fackler <augie@google.com>
parents: 38788
diff changeset
   246
        else:
4019b4542e61 dispatch: have dispatch.dispatch and dispatch._runcatch emit trace events
Augie Fackler <augie@google.com>
parents: 38788
diff changeset
   247
            ferr = procutil.stderr
14615
9fba795dd030 dispatch: assign I/O descriptors from the request to the ui
Idan Kamara <idankk86@gmail.com>
parents: 14613
diff changeset
   248
39255
4019b4542e61 dispatch: have dispatch.dispatch and dispatch._runcatch emit trace events
Augie Fackler <augie@google.com>
parents: 38788
diff changeset
   249
        try:
4019b4542e61 dispatch: have dispatch.dispatch and dispatch._runcatch emit trace events
Augie Fackler <augie@google.com>
parents: 38788
diff changeset
   250
            if not req.ui:
4019b4542e61 dispatch: have dispatch.dispatch and dispatch._runcatch emit trace events
Augie Fackler <augie@google.com>
parents: 38788
diff changeset
   251
                req.ui = uimod.ui.load()
4019b4542e61 dispatch: have dispatch.dispatch and dispatch._runcatch emit trace events
Augie Fackler <augie@google.com>
parents: 38788
diff changeset
   252
            req.earlyoptions.update(_earlyparseopts(req.ui, req.args))
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   253
            if req.earlyoptions[b'traceback']:
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   254
                req.ui.setconfig(b'ui', b'traceback', b'on', b'--traceback')
14615
9fba795dd030 dispatch: assign I/O descriptors from the request to the ui
Idan Kamara <idankk86@gmail.com>
parents: 14613
diff changeset
   255
39255
4019b4542e61 dispatch: have dispatch.dispatch and dispatch._runcatch emit trace events
Augie Fackler <augie@google.com>
parents: 38788
diff changeset
   256
            # set ui streams from the request
4019b4542e61 dispatch: have dispatch.dispatch and dispatch._runcatch emit trace events
Augie Fackler <augie@google.com>
parents: 38788
diff changeset
   257
            if req.fin:
4019b4542e61 dispatch: have dispatch.dispatch and dispatch._runcatch emit trace events
Augie Fackler <augie@google.com>
parents: 38788
diff changeset
   258
                req.ui.fin = req.fin
4019b4542e61 dispatch: have dispatch.dispatch and dispatch._runcatch emit trace events
Augie Fackler <augie@google.com>
parents: 38788
diff changeset
   259
            if req.fout:
4019b4542e61 dispatch: have dispatch.dispatch and dispatch._runcatch emit trace events
Augie Fackler <augie@google.com>
parents: 38788
diff changeset
   260
                req.ui.fout = req.fout
4019b4542e61 dispatch: have dispatch.dispatch and dispatch._runcatch emit trace events
Augie Fackler <augie@google.com>
parents: 38788
diff changeset
   261
            if req.ferr:
4019b4542e61 dispatch: have dispatch.dispatch and dispatch._runcatch emit trace events
Augie Fackler <augie@google.com>
parents: 38788
diff changeset
   262
                req.ui.ferr = req.ferr
40587
5542bc9125c9 dispatch: pass around ui.fmsg channel
Yuya Nishihara <yuya@tcha.org>
parents: 40414
diff changeset
   263
            if req.fmsg:
5542bc9125c9 dispatch: pass around ui.fmsg channel
Yuya Nishihara <yuya@tcha.org>
parents: 40414
diff changeset
   264
                req.ui.fmsg = req.fmsg
39255
4019b4542e61 dispatch: have dispatch.dispatch and dispatch._runcatch emit trace events
Augie Fackler <augie@google.com>
parents: 38788
diff changeset
   265
        except error.Abort as inst:
45885
600aec73f309 errors: format "abort: " text in a new Abort.format() method
Martin von Zweigbergk <martinvonz@google.com>
parents: 45884
diff changeset
   266
            ferr.write(inst.format())
39255
4019b4542e61 dispatch: have dispatch.dispatch and dispatch._runcatch emit trace events
Augie Fackler <augie@google.com>
parents: 38788
diff changeset
   267
            return -1
14615
9fba795dd030 dispatch: assign I/O descriptors from the request to the ui
Idan Kamara <idankk86@gmail.com>
parents: 14613
diff changeset
   268
48998
91a60031aba2 dispatch: fix silly blackbox entries when hg is interrupted
Valentin Gatien-Baron <vgatien-baron@janestreet.com>
parents: 48256
diff changeset
   269
        formattedargs = _formatargs(req.args)
39255
4019b4542e61 dispatch: have dispatch.dispatch and dispatch._runcatch emit trace events
Augie Fackler <augie@google.com>
parents: 38788
diff changeset
   270
        starttime = util.timer()
4019b4542e61 dispatch: have dispatch.dispatch and dispatch._runcatch emit trace events
Augie Fackler <augie@google.com>
parents: 38788
diff changeset
   271
        ret = 1  # default of Python exit code on unhandled exception
28520
84cc72c5771e dispatch: catch KeyboardInterrupt more broadly
Yuya Nishihara <yuya@tcha.org>
parents: 28515
diff changeset
   272
        try:
39255
4019b4542e61 dispatch: have dispatch.dispatch and dispatch._runcatch emit trace events
Augie Fackler <augie@google.com>
parents: 38788
diff changeset
   273
            ret = _runcatch(req) or 0
4019b4542e61 dispatch: have dispatch.dispatch and dispatch._runcatch emit trace events
Augie Fackler <augie@google.com>
parents: 38788
diff changeset
   274
        except error.ProgrammingError as inst:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   275
            req.ui.error(_(b'** ProgrammingError: %s\n') % inst)
39255
4019b4542e61 dispatch: have dispatch.dispatch and dispatch._runcatch emit trace events
Augie Fackler <augie@google.com>
parents: 38788
diff changeset
   276
            if inst.hint:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   277
                req.ui.error(_(b'** (%s)\n') % inst.hint)
39255
4019b4542e61 dispatch: have dispatch.dispatch and dispatch._runcatch emit trace events
Augie Fackler <augie@google.com>
parents: 38788
diff changeset
   278
            raise
4019b4542e61 dispatch: have dispatch.dispatch and dispatch._runcatch emit trace events
Augie Fackler <augie@google.com>
parents: 38788
diff changeset
   279
        except KeyboardInterrupt as inst:
4019b4542e61 dispatch: have dispatch.dispatch and dispatch._runcatch emit trace events
Augie Fackler <augie@google.com>
parents: 38788
diff changeset
   280
            try:
4019b4542e61 dispatch: have dispatch.dispatch and dispatch._runcatch emit trace events
Augie Fackler <augie@google.com>
parents: 38788
diff changeset
   281
                if isinstance(inst, error.SignalInterrupt):
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   282
                    msg = _(b"killed!\n")
39255
4019b4542e61 dispatch: have dispatch.dispatch and dispatch._runcatch emit trace events
Augie Fackler <augie@google.com>
parents: 38788
diff changeset
   283
                else:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   284
                    msg = _(b"interrupted!\n")
39255
4019b4542e61 dispatch: have dispatch.dispatch and dispatch._runcatch emit trace events
Augie Fackler <augie@google.com>
parents: 38788
diff changeset
   285
                req.ui.error(msg)
4019b4542e61 dispatch: have dispatch.dispatch and dispatch._runcatch emit trace events
Augie Fackler <augie@google.com>
parents: 38788
diff changeset
   286
            except error.SignalInterrupt:
4019b4542e61 dispatch: have dispatch.dispatch and dispatch._runcatch emit trace events
Augie Fackler <augie@google.com>
parents: 38788
diff changeset
   287
                # maybe pager would quit without consuming all the output, and
4019b4542e61 dispatch: have dispatch.dispatch and dispatch._runcatch emit trace events
Augie Fackler <augie@google.com>
parents: 38788
diff changeset
   288
                # SIGPIPE was raised. we cannot print anything in this case.
4019b4542e61 dispatch: have dispatch.dispatch and dispatch._runcatch emit trace events
Augie Fackler <augie@google.com>
parents: 38788
diff changeset
   289
                pass
49304
48f1b314056b py3: catch BrokenPipeError instead of checking errno == EPIPE
Manuel Jacob <me@manueljacob.de>
parents: 49005
diff changeset
   290
            except BrokenPipeError:
48f1b314056b py3: catch BrokenPipeError instead of checking errno == EPIPE
Manuel Jacob <me@manueljacob.de>
parents: 49005
diff changeset
   291
                pass
48255
8c34edb1ad10 backout: backed out changeset 6edc8800dbc3
Rapha?l Gom?s <rgomes@octobus.net>
parents: 48186
diff changeset
   292
            ret = -1
39255
4019b4542e61 dispatch: have dispatch.dispatch and dispatch._runcatch emit trace events
Augie Fackler <augie@google.com>
parents: 38788
diff changeset
   293
        finally:
4019b4542e61 dispatch: have dispatch.dispatch and dispatch._runcatch emit trace events
Augie Fackler <augie@google.com>
parents: 38788
diff changeset
   294
            duration = util.timer() - starttime
48256
56d037d07395 backout: backed out changeset 2f2107c01dee
Rapha?l Gom?s <rgomes@octobus.net>
parents: 48255
diff changeset
   295
            req.ui.flush()  # record blocked times
39255
4019b4542e61 dispatch: have dispatch.dispatch and dispatch._runcatch emit trace events
Augie Fackler <augie@google.com>
parents: 38788
diff changeset
   296
            if req.ui.logblockedtimes:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   297
                req.ui._blockedtimes[b'command_duration'] = duration * 1000
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41193
diff changeset
   298
                req.ui.log(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   299
                    b'uiblocked',
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   300
                    b'ui blocked ms\n',
51858
607e94e01851 format: add many "missing" comma
Matt Harbison <matt_harbison@yahoo.com>
parents: 51811
diff changeset
   301
                    **pycompat.strkwargs(req.ui._blockedtimes),
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41193
diff changeset
   302
                )
40651
1243295fcc3a logtoprocess: update commandfinish options arguments
Boris Feld <boris.feld@octobus.net>
parents: 40587
diff changeset
   303
            return_code = ret & 255
1243295fcc3a logtoprocess: update commandfinish options arguments
Boris Feld <boris.feld@octobus.net>
parents: 40587
diff changeset
   304
            req.ui.log(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   305
                b"commandfinish",
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   306
                b"%s exited %d after %0.2f seconds\n",
48998
91a60031aba2 dispatch: fix silly blackbox entries when hg is interrupted
Valentin Gatien-Baron <vgatien-baron@janestreet.com>
parents: 48256
diff changeset
   307
                formattedargs,
40651
1243295fcc3a logtoprocess: update commandfinish options arguments
Boris Feld <boris.feld@octobus.net>
parents: 40587
diff changeset
   308
                return_code,
1243295fcc3a logtoprocess: update commandfinish options arguments
Boris Feld <boris.feld@octobus.net>
parents: 40587
diff changeset
   309
                duration,
1243295fcc3a logtoprocess: update commandfinish options arguments
Boris Feld <boris.feld@octobus.net>
parents: 40587
diff changeset
   310
                return_code=return_code,
1243295fcc3a logtoprocess: update commandfinish options arguments
Boris Feld <boris.feld@octobus.net>
parents: 40587
diff changeset
   311
                duration=duration,
1243295fcc3a logtoprocess: update commandfinish options arguments
Boris Feld <boris.feld@octobus.net>
parents: 40587
diff changeset
   312
                canonical_command=req.canonical_command,
1243295fcc3a logtoprocess: update commandfinish options arguments
Boris Feld <boris.feld@octobus.net>
parents: 40587
diff changeset
   313
            )
39255
4019b4542e61 dispatch: have dispatch.dispatch and dispatch._runcatch emit trace events
Augie Fackler <augie@google.com>
parents: 38788
diff changeset
   314
            try:
4019b4542e61 dispatch: have dispatch.dispatch and dispatch._runcatch emit trace events
Augie Fackler <augie@google.com>
parents: 38788
diff changeset
   315
                req._runexithandlers()
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41193
diff changeset
   316
            except:  # exiting, so no re-raises
39255
4019b4542e61 dispatch: have dispatch.dispatch and dispatch._runcatch emit trace events
Augie Fackler <augie@google.com>
parents: 38788
diff changeset
   317
                ret = ret or -1
45253
9b5723784aac dispatch: adjust ui.flush() timing to stabilize test-blackbox.t
Yuya Nishihara <yuya@tcha.org>
parents: 45102
diff changeset
   318
            # do flush again since ui.log() and exit handlers may write to ui
48256
56d037d07395 backout: backed out changeset 2f2107c01dee
Rapha?l Gom?s <rgomes@octobus.net>
parents: 48255
diff changeset
   319
            req.ui.flush()
39255
4019b4542e61 dispatch: have dispatch.dispatch and dispatch._runcatch emit trace events
Augie Fackler <augie@google.com>
parents: 38788
diff changeset
   320
        return ret
5178
18a9fbb5cd78 dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
   321
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41193
diff changeset
   322
14439
80c599eee3f3 dispatch: use the request to store the ui object
Idan Kamara <idankk86@gmail.com>
parents: 14438
diff changeset
   323
def _runcatch(req):
43238
101ae8bbfa02 cleanup: hgdemandimport.tracing accepts strings, not bytes
Augie Fackler <augie@google.com>
parents: 43117
diff changeset
   324
    with tracing.log('dispatch._runcatch'):
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41193
diff changeset
   325
39255
4019b4542e61 dispatch: have dispatch.dispatch and dispatch._runcatch emit trace events
Augie Fackler <augie@google.com>
parents: 38788
diff changeset
   326
        def catchterm(*args):
4019b4542e61 dispatch: have dispatch.dispatch and dispatch._runcatch emit trace events
Augie Fackler <augie@google.com>
parents: 38788
diff changeset
   327
            raise error.SignalInterrupt
5178
18a9fbb5cd78 dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
   328
39255
4019b4542e61 dispatch: have dispatch.dispatch and dispatch._runcatch emit trace events
Augie Fackler <augie@google.com>
parents: 38788
diff changeset
   329
        ui = req.ui
32050
77eaf9539499 dispatch: protect against malicious 'hg serve --stdio' invocations (sec)
Augie Fackler <augie@google.com>
parents: 30678
diff changeset
   330
        try:
50566
fca08dd6223d safehasattr: pass attribute name as string instead of bytes
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50564
diff changeset
   331
            for name in 'SIGBREAK', 'SIGHUP', 'SIGTERM':
39255
4019b4542e61 dispatch: have dispatch.dispatch and dispatch._runcatch emit trace events
Augie Fackler <augie@google.com>
parents: 38788
diff changeset
   332
                num = getattr(signal, name, None)
4019b4542e61 dispatch: have dispatch.dispatch and dispatch._runcatch emit trace events
Augie Fackler <augie@google.com>
parents: 38788
diff changeset
   333
                if num:
4019b4542e61 dispatch: have dispatch.dispatch and dispatch._runcatch emit trace events
Augie Fackler <augie@google.com>
parents: 38788
diff changeset
   334
                    signal.signal(num, catchterm)
4019b4542e61 dispatch: have dispatch.dispatch and dispatch._runcatch emit trace events
Augie Fackler <augie@google.com>
parents: 38788
diff changeset
   335
        except ValueError:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41193
diff changeset
   336
            pass  # happens if called in a thread
32050
77eaf9539499 dispatch: protect against malicious 'hg serve --stdio' invocations (sec)
Augie Fackler <augie@google.com>
parents: 30678
diff changeset
   337
39255
4019b4542e61 dispatch: have dispatch.dispatch and dispatch._runcatch emit trace events
Augie Fackler <augie@google.com>
parents: 38788
diff changeset
   338
        def _runcatchfunc():
4019b4542e61 dispatch: have dispatch.dispatch and dispatch._runcatch emit trace events
Augie Fackler <augie@google.com>
parents: 38788
diff changeset
   339
            realcmd = None
4019b4542e61 dispatch: have dispatch.dispatch and dispatch._runcatch emit trace events
Augie Fackler <augie@google.com>
parents: 38788
diff changeset
   340
            try:
4019b4542e61 dispatch: have dispatch.dispatch and dispatch._runcatch emit trace events
Augie Fackler <augie@google.com>
parents: 38788
diff changeset
   341
                cmdargs = fancyopts.fancyopts(
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41193
diff changeset
   342
                    req.args[:], commands.globalopts, {}
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41193
diff changeset
   343
                )
39255
4019b4542e61 dispatch: have dispatch.dispatch and dispatch._runcatch emit trace events
Augie Fackler <augie@google.com>
parents: 38788
diff changeset
   344
                cmd = cmdargs[0]
4019b4542e61 dispatch: have dispatch.dispatch and dispatch._runcatch emit trace events
Augie Fackler <augie@google.com>
parents: 38788
diff changeset
   345
                aliases, entry = cmdutil.findcmd(cmd, commands.table, False)
4019b4542e61 dispatch: have dispatch.dispatch and dispatch._runcatch emit trace events
Augie Fackler <augie@google.com>
parents: 38788
diff changeset
   346
                realcmd = aliases[0]
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41193
diff changeset
   347
            except (
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41193
diff changeset
   348
                error.UnknownCommand,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41193
diff changeset
   349
                error.AmbiguousCommand,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41193
diff changeset
   350
                IndexError,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41193
diff changeset
   351
                getopt.GetoptError,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41193
diff changeset
   352
            ):
39255
4019b4542e61 dispatch: have dispatch.dispatch and dispatch._runcatch emit trace events
Augie Fackler <augie@google.com>
parents: 38788
diff changeset
   353
                # Don't handle this here. We know the command is
4019b4542e61 dispatch: have dispatch.dispatch and dispatch._runcatch emit trace events
Augie Fackler <augie@google.com>
parents: 38788
diff changeset
   354
                # invalid, but all we're worried about for now is that
4019b4542e61 dispatch: have dispatch.dispatch and dispatch._runcatch emit trace events
Augie Fackler <augie@google.com>
parents: 38788
diff changeset
   355
                # it's not a command that server operators expect to
4019b4542e61 dispatch: have dispatch.dispatch and dispatch._runcatch emit trace events
Augie Fackler <augie@google.com>
parents: 38788
diff changeset
   356
                # be safe to offer to users in a sandbox.
4019b4542e61 dispatch: have dispatch.dispatch and dispatch._runcatch emit trace events
Augie Fackler <augie@google.com>
parents: 38788
diff changeset
   357
                pass
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   358
            if realcmd == b'serve' and b'--stdio' in cmdargs:
39255
4019b4542e61 dispatch: have dispatch.dispatch and dispatch._runcatch emit trace events
Augie Fackler <augie@google.com>
parents: 38788
diff changeset
   359
                # We want to constrain 'hg serve --stdio' instances pretty
4019b4542e61 dispatch: have dispatch.dispatch and dispatch._runcatch emit trace events
Augie Fackler <augie@google.com>
parents: 38788
diff changeset
   360
                # closely, as many shared-ssh access tools want to grant
4019b4542e61 dispatch: have dispatch.dispatch and dispatch._runcatch emit trace events
Augie Fackler <augie@google.com>
parents: 38788
diff changeset
   361
                # access to run *only* 'hg -R $repo serve --stdio'. We
4019b4542e61 dispatch: have dispatch.dispatch and dispatch._runcatch emit trace events
Augie Fackler <augie@google.com>
parents: 38788
diff changeset
   362
                # restrict to exactly that set of arguments, and prohibit
4019b4542e61 dispatch: have dispatch.dispatch and dispatch._runcatch emit trace events
Augie Fackler <augie@google.com>
parents: 38788
diff changeset
   363
                # any repo name that starts with '--' to prevent
4019b4542e61 dispatch: have dispatch.dispatch and dispatch._runcatch emit trace events
Augie Fackler <augie@google.com>
parents: 38788
diff changeset
   364
                # shenanigans wherein a user does something like pass
4019b4542e61 dispatch: have dispatch.dispatch and dispatch._runcatch emit trace events
Augie Fackler <augie@google.com>
parents: 38788
diff changeset
   365
                # --debugger or --config=ui.debugger=1 as a repo
4019b4542e61 dispatch: have dispatch.dispatch and dispatch._runcatch emit trace events
Augie Fackler <augie@google.com>
parents: 38788
diff changeset
   366
                # name. This used to actually run the debugger.
50443
afb27fc92717 hidden: support passing --hidden with `serve --stdio`
Manuel Jacob <me@manueljacob.de>
parents: 49742
diff changeset
   367
                nbargs = 4
afb27fc92717 hidden: support passing --hidden with `serve --stdio`
Manuel Jacob <me@manueljacob.de>
parents: 49742
diff changeset
   368
                hashiddenaccess = b'--hidden' in cmdargs
afb27fc92717 hidden: support passing --hidden with `serve --stdio`
Manuel Jacob <me@manueljacob.de>
parents: 49742
diff changeset
   369
                if hashiddenaccess:
afb27fc92717 hidden: support passing --hidden with `serve --stdio`
Manuel Jacob <me@manueljacob.de>
parents: 49742
diff changeset
   370
                    nbargs += 1
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41193
diff changeset
   371
                if (
50443
afb27fc92717 hidden: support passing --hidden with `serve --stdio`
Manuel Jacob <me@manueljacob.de>
parents: 49742
diff changeset
   372
                    len(req.args) != nbargs
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   373
                    or req.args[0] != b'-R'
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   374
                    or req.args[1].startswith(b'--')
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   375
                    or req.args[2] != b'serve'
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   376
                    or req.args[3] != b'--stdio'
50443
afb27fc92717 hidden: support passing --hidden with `serve --stdio`
Manuel Jacob <me@manueljacob.de>
parents: 49742
diff changeset
   377
                    or hashiddenaccess
afb27fc92717 hidden: support passing --hidden with `serve --stdio`
Manuel Jacob <me@manueljacob.de>
parents: 49742
diff changeset
   378
                    and req.args[4] != b'--hidden'
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41193
diff changeset
   379
                ):
39255
4019b4542e61 dispatch: have dispatch.dispatch and dispatch._runcatch emit trace events
Augie Fackler <augie@google.com>
parents: 38788
diff changeset
   380
                    raise error.Abort(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   381
                        _(b'potentially unsafe serve --stdio invocation: %s')
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41193
diff changeset
   382
                        % (stringutil.pprint(req.args),)
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41193
diff changeset
   383
                    )
19639
09573ad59f7b dispatch: move command line --config argument parsing to _runcatch()
Sean Farley <sean.michael.farley@gmail.com>
parents: 19229
diff changeset
   384
39255
4019b4542e61 dispatch: have dispatch.dispatch and dispatch._runcatch emit trace events
Augie Fackler <augie@google.com>
parents: 38788
diff changeset
   385
            try:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   386
                debugger = b'pdb'
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   387
                debugtrace = {b'pdb': pdb.set_trace}
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   388
                debugmortem = {b'pdb': pdb.post_mortem}
19639
09573ad59f7b dispatch: move command line --config argument parsing to _runcatch()
Sean Farley <sean.michael.farley@gmail.com>
parents: 19229
diff changeset
   389
39255
4019b4542e61 dispatch: have dispatch.dispatch and dispatch._runcatch emit trace events
Augie Fackler <augie@google.com>
parents: 38788
diff changeset
   390
                # read --config before doing anything else
4019b4542e61 dispatch: have dispatch.dispatch and dispatch._runcatch emit trace events
Augie Fackler <augie@google.com>
parents: 38788
diff changeset
   391
                # (e.g. to change trust settings for reading .hg/hgrc)
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   392
                cfgs = _parseconfig(req.ui, req.earlyoptions[b'config'])
39255
4019b4542e61 dispatch: have dispatch.dispatch and dispatch._runcatch emit trace events
Augie Fackler <augie@google.com>
parents: 38788
diff changeset
   393
4019b4542e61 dispatch: have dispatch.dispatch and dispatch._runcatch emit trace events
Augie Fackler <augie@google.com>
parents: 38788
diff changeset
   394
                if req.repo:
4019b4542e61 dispatch: have dispatch.dispatch and dispatch._runcatch emit trace events
Augie Fackler <augie@google.com>
parents: 38788
diff changeset
   395
                    # copy configs that were passed on the cmdline (--config) to
4019b4542e61 dispatch: have dispatch.dispatch and dispatch._runcatch emit trace events
Augie Fackler <augie@google.com>
parents: 38788
diff changeset
   396
                    # the repo ui
4019b4542e61 dispatch: have dispatch.dispatch and dispatch._runcatch emit trace events
Augie Fackler <augie@google.com>
parents: 38788
diff changeset
   397
                    for sec, name, val in cfgs:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   398
                        req.repo.ui.setconfig(
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   399
                            sec, name, val, source=b'--config'
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   400
                        )
19640
472fa3b782b1 dispatch: add ability to specify a custom pdb module as a debugger
Sean Farley <sean.michael.farley@gmail.com>
parents: 19639
diff changeset
   401
39255
4019b4542e61 dispatch: have dispatch.dispatch and dispatch._runcatch emit trace events
Augie Fackler <augie@google.com>
parents: 38788
diff changeset
   402
                # developer config: ui.debugger
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   403
                debugger = ui.config(b"ui", b"debugger")
39255
4019b4542e61 dispatch: have dispatch.dispatch and dispatch._runcatch emit trace events
Augie Fackler <augie@google.com>
parents: 38788
diff changeset
   404
                debugmod = pdb
4019b4542e61 dispatch: have dispatch.dispatch and dispatch._runcatch emit trace events
Augie Fackler <augie@google.com>
parents: 38788
diff changeset
   405
                if not debugger or ui.plain():
4019b4542e61 dispatch: have dispatch.dispatch and dispatch._runcatch emit trace events
Augie Fackler <augie@google.com>
parents: 38788
diff changeset
   406
                    # if we are in HGPLAIN mode, then disable custom debugging
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   407
                    debugger = b'pdb'
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   408
                elif req.earlyoptions[b'debugger']:
39255
4019b4542e61 dispatch: have dispatch.dispatch and dispatch._runcatch emit trace events
Augie Fackler <augie@google.com>
parents: 38788
diff changeset
   409
                    # This import can be slow for fancy debuggers, so only
4019b4542e61 dispatch: have dispatch.dispatch and dispatch._runcatch emit trace events
Augie Fackler <augie@google.com>
parents: 38788
diff changeset
   410
                    # do it when absolutely necessary, i.e. when actual
4019b4542e61 dispatch: have dispatch.dispatch and dispatch._runcatch emit trace events
Augie Fackler <augie@google.com>
parents: 38788
diff changeset
   411
                    # debugging has been requested
4019b4542e61 dispatch: have dispatch.dispatch and dispatch._runcatch emit trace events
Augie Fackler <augie@google.com>
parents: 38788
diff changeset
   412
                    with demandimport.deactivated():
4019b4542e61 dispatch: have dispatch.dispatch and dispatch._runcatch emit trace events
Augie Fackler <augie@google.com>
parents: 38788
diff changeset
   413
                        try:
51375
82131be5258e dispatch: don't attempt to import debugger as bytestring
Jordi Guti?rrez Hermoso <jordigh@octave.org>
parents: 50926
diff changeset
   414
                            debugmod = __import__(pycompat.sysstr(debugger))
39255
4019b4542e61 dispatch: have dispatch.dispatch and dispatch._runcatch emit trace events
Augie Fackler <augie@google.com>
parents: 38788
diff changeset
   415
                        except ImportError:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41193
diff changeset
   416
                            pass  # Leave debugmod = pdb
19640
472fa3b782b1 dispatch: add ability to specify a custom pdb module as a debugger
Sean Farley <sean.michael.farley@gmail.com>
parents: 19639
diff changeset
   417
39255
4019b4542e61 dispatch: have dispatch.dispatch and dispatch._runcatch emit trace events
Augie Fackler <augie@google.com>
parents: 38788
diff changeset
   418
                debugtrace[debugger] = debugmod.set_trace
4019b4542e61 dispatch: have dispatch.dispatch and dispatch._runcatch emit trace events
Augie Fackler <augie@google.com>
parents: 38788
diff changeset
   419
                debugmortem[debugger] = debugmod.post_mortem
19640
472fa3b782b1 dispatch: add ability to specify a custom pdb module as a debugger
Sean Farley <sean.michael.farley@gmail.com>
parents: 19639
diff changeset
   420
39255
4019b4542e61 dispatch: have dispatch.dispatch and dispatch._runcatch emit trace events
Augie Fackler <augie@google.com>
parents: 38788
diff changeset
   421
                # enter the debugger before command execution
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   422
                if req.earlyoptions[b'debugger']:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41193
diff changeset
   423
                    ui.warn(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41193
diff changeset
   424
                        _(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   425
                            b"entering debugger - "
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   426
                            b"type c to continue starting hg or h for help\n"
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41193
diff changeset
   427
                        )
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41193
diff changeset
   428
                    )
5178
18a9fbb5cd78 dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
   429
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41193
diff changeset
   430
                    if (
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   431
                        debugger != b'pdb'
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   432
                        and debugtrace[debugger] == debugtrace[b'pdb']
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41193
diff changeset
   433
                    ):
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41193
diff changeset
   434
                        ui.warn(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41193
diff changeset
   435
                            _(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   436
                                b"%s debugger specified "
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   437
                                b"but its module was not found\n"
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41193
diff changeset
   438
                            )
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41193
diff changeset
   439
                            % debugger
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41193
diff changeset
   440
                        )
39255
4019b4542e61 dispatch: have dispatch.dispatch and dispatch._runcatch emit trace events
Augie Fackler <augie@google.com>
parents: 38788
diff changeset
   441
                    with demandimport.deactivated():
4019b4542e61 dispatch: have dispatch.dispatch and dispatch._runcatch emit trace events
Augie Fackler <augie@google.com>
parents: 38788
diff changeset
   442
                        debugtrace[debugger]()
4019b4542e61 dispatch: have dispatch.dispatch and dispatch._runcatch emit trace events
Augie Fackler <augie@google.com>
parents: 38788
diff changeset
   443
                try:
4019b4542e61 dispatch: have dispatch.dispatch and dispatch._runcatch emit trace events
Augie Fackler <augie@google.com>
parents: 38788
diff changeset
   444
                    return _dispatch(req)
4019b4542e61 dispatch: have dispatch.dispatch and dispatch._runcatch emit trace events
Augie Fackler <augie@google.com>
parents: 38788
diff changeset
   445
                finally:
48256
56d037d07395 backout: backed out changeset 2f2107c01dee
Rapha?l Gom?s <rgomes@octobus.net>
parents: 48255
diff changeset
   446
                    ui.flush()
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41193
diff changeset
   447
            except:  # re-raises
39255
4019b4542e61 dispatch: have dispatch.dispatch and dispatch._runcatch emit trace events
Augie Fackler <augie@google.com>
parents: 38788
diff changeset
   448
                # enter the debugger when we hit an exception
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   449
                if req.earlyoptions[b'debugger']:
39255
4019b4542e61 dispatch: have dispatch.dispatch and dispatch._runcatch emit trace events
Augie Fackler <augie@google.com>
parents: 38788
diff changeset
   450
                    traceback.print_exc()
4019b4542e61 dispatch: have dispatch.dispatch and dispatch._runcatch emit trace events
Augie Fackler <augie@google.com>
parents: 38788
diff changeset
   451
                    debugmortem[debugger](sys.exc_info()[2])
4019b4542e61 dispatch: have dispatch.dispatch and dispatch._runcatch emit trace events
Augie Fackler <augie@google.com>
parents: 38788
diff changeset
   452
                raise
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41193
diff changeset
   453
39255
4019b4542e61 dispatch: have dispatch.dispatch and dispatch._runcatch emit trace events
Augie Fackler <augie@google.com>
parents: 38788
diff changeset
   454
        return _callcatch(ui, _runcatchfunc)
29761
39149b6036e6 dispatch: split global error handling out so it can be reused
Jun Wu <quark@fb.com>
parents: 29132
diff changeset
   455
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41193
diff changeset
   456
32040
0fb78cb90ca7 dispatch: mark callcatch() as a private function
Yuya Nishihara <yuya@tcha.org>
parents: 31960
diff changeset
   457
def _callcatch(ui, func):
30520
4338f87dbf6f dispatch: move part of callcatch to scmutil
Jun Wu <quark@fb.com>
parents: 30519
diff changeset
   458
    """like scmutil.callcatch but handles more high-level exceptions about
4338f87dbf6f dispatch: move part of callcatch to scmutil
Jun Wu <quark@fb.com>
parents: 30519
diff changeset
   459
    config parsing and commands. besides, use handlecommandexception to handle
4338f87dbf6f dispatch: move part of callcatch to scmutil
Jun Wu <quark@fb.com>
parents: 30519
diff changeset
   460
    uncaught exceptions.
29761
39149b6036e6 dispatch: split global error handling out so it can be reused
Jun Wu <quark@fb.com>
parents: 29132
diff changeset
   461
    """
46262
9c9e0b4b2ca7 error: use detailed exit code 10 for command errors
Martin von Zweigbergk <martinvonz@google.com>
parents: 46173
diff changeset
   462
    detailed_exit_code = -1
29761
39149b6036e6 dispatch: split global error handling out so it can be reused
Jun Wu <quark@fb.com>
parents: 29132
diff changeset
   463
    try:
30520
4338f87dbf6f dispatch: move part of callcatch to scmutil
Jun Wu <quark@fb.com>
parents: 30519
diff changeset
   464
        return scmutil.callcatch(ui, func)
25660
328739ea70c3 global: mass rewrite to use modern exception syntax
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25329
diff changeset
   465
    except error.AmbiguousCommand as inst:
46262
9c9e0b4b2ca7 error: use detailed exit code 10 for command errors
Martin von Zweigbergk <martinvonz@google.com>
parents: 46173
diff changeset
   466
        detailed_exit_code = 10
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41193
diff changeset
   467
        ui.warn(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   468
            _(b"hg: command '%s' is ambiguous:\n    %s\n")
45679
65e2b64670b5 errors: name arguments to AmbiguousCommand constructor
Martin von Zweigbergk <martinvonz@google.com>
parents: 45678
diff changeset
   469
            % (inst.prefix, b" ".join(inst.matches))
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41193
diff changeset
   470
        )
25660
328739ea70c3 global: mass rewrite to use modern exception syntax
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25329
diff changeset
   471
    except error.CommandError as inst:
46262
9c9e0b4b2ca7 error: use detailed exit code 10 for command errors
Martin von Zweigbergk <martinvonz@google.com>
parents: 46173
diff changeset
   472
        detailed_exit_code = 10
45678
bd2df58366b1 errors: name arguments to CommandError constructor
Martin von Zweigbergk <martinvonz@google.com>
parents: 45253
diff changeset
   473
        if inst.command:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   474
            ui.pager(b'help')
45678
bd2df58366b1 errors: name arguments to CommandError constructor
Martin von Zweigbergk <martinvonz@google.com>
parents: 45253
diff changeset
   475
            msgbytes = pycompat.bytestr(inst.message)
bd2df58366b1 errors: name arguments to CommandError constructor
Martin von Zweigbergk <martinvonz@google.com>
parents: 45253
diff changeset
   476
            ui.warn(_(b"hg %s: %s\n") % (inst.command, msgbytes))
bd2df58366b1 errors: name arguments to CommandError constructor
Martin von Zweigbergk <martinvonz@google.com>
parents: 45253
diff changeset
   477
            commands.help_(ui, inst.command, full=False, command=True)
7645
020a896a5292 dispatch: sort exception handlers
Matt Mackall <mpm@selenic.com>
parents: 7644
diff changeset
   478
        else:
45678
bd2df58366b1 errors: name arguments to CommandError constructor
Martin von Zweigbergk <martinvonz@google.com>
parents: 45253
diff changeset
   479
            ui.warn(_(b"hg: %s\n") % inst.message)
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   480
            ui.warn(_(b"(use 'hg help -v' for a list of global options)\n"))
25660
328739ea70c3 global: mass rewrite to use modern exception syntax
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25329
diff changeset
   481
    except error.UnknownCommand as inst:
46262
9c9e0b4b2ca7 error: use detailed exit code 10 for command errors
Martin von Zweigbergk <martinvonz@google.com>
parents: 46173
diff changeset
   482
        detailed_exit_code = 10
45680
bb1a988ef4a5 errors: name arguments to UnknownCommand constructor
Martin von Zweigbergk <martinvonz@google.com>
parents: 45679
diff changeset
   483
        nocmdmsg = _(b"hg: unknown command '%s'\n") % inst.command
10364
de1e7099d100 dispatch: provide help for disabled extensions and commands
Brodie Rao <me+hg@dackz.net>
parents: 10282
diff changeset
   484
        try:
de1e7099d100 dispatch: provide help for disabled extensions and commands
Brodie Rao <me+hg@dackz.net>
parents: 10282
diff changeset
   485
            # check if the command is in a disabled extension
de1e7099d100 dispatch: provide help for disabled extensions and commands
Brodie Rao <me+hg@dackz.net>
parents: 10282
diff changeset
   486
            # (but don't check for extensions themselves)
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41193
diff changeset
   487
            formatted = help.formattedhelp(
45680
bb1a988ef4a5 errors: name arguments to UnknownCommand constructor
Martin von Zweigbergk <martinvonz@google.com>
parents: 45679
diff changeset
   488
                ui, commands, inst.command, unknowncmd=True
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41193
diff changeset
   489
            )
31060
ab20491b1760 dispatch: rearrange 'unknown command' code to better employ pager
Augie Fackler <augie@google.com>
parents: 31027
diff changeset
   490
            ui.warn(nocmdmsg)
ab20491b1760 dispatch: rearrange 'unknown command' code to better employ pager
Augie Fackler <augie@google.com>
parents: 31027
diff changeset
   491
            ui.write(formatted)
26587
56b2bcea2529 error: get Abort from 'error' instead of 'util'
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 26421
diff changeset
   492
        except (error.UnknownCommand, error.Abort):
24222
02d7b5cd373b dispatch: offer suggestions of similar-named commands
Augie Fackler <augie@google.com>
parents: 24221
diff changeset
   493
            suggested = False
45680
bb1a988ef4a5 errors: name arguments to UnknownCommand constructor
Martin von Zweigbergk <martinvonz@google.com>
parents: 45679
diff changeset
   494
            if inst.all_commands:
45882
8cc9e7f762d6 errors: move similarity_hint() to error module
Martin von Zweigbergk <martinvonz@google.com>
parents: 45881
diff changeset
   495
                sim = error.getsimilar(inst.all_commands, inst.command)
24222
02d7b5cd373b dispatch: offer suggestions of similar-named commands
Augie Fackler <augie@google.com>
parents: 24221
diff changeset
   496
                if sim:
31060
ab20491b1760 dispatch: rearrange 'unknown command' code to better employ pager
Augie Fackler <augie@google.com>
parents: 31027
diff changeset
   497
                    ui.warn(nocmdmsg)
45882
8cc9e7f762d6 errors: move similarity_hint() to error module
Martin von Zweigbergk <martinvonz@google.com>
parents: 45881
diff changeset
   498
                    ui.warn(b"(%s)\n" % error.similarity_hint(sim))
24222
02d7b5cd373b dispatch: offer suggestions of similar-named commands
Augie Fackler <augie@google.com>
parents: 24221
diff changeset
   499
                    suggested = True
02d7b5cd373b dispatch: offer suggestions of similar-named commands
Augie Fackler <augie@google.com>
parents: 24221
diff changeset
   500
            if not suggested:
31060
ab20491b1760 dispatch: rearrange 'unknown command' code to better employ pager
Augie Fackler <augie@google.com>
parents: 31027
diff changeset
   501
                ui.warn(nocmdmsg)
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   502
                ui.warn(_(b"(use 'hg help' for a list of commands)\n"))
52640
24ee91ba9aa8 pyupgrade: drop usage of py3 aliases for `OSError`
Matt Harbison <matt_harbison@yahoo.com>
parents: 52426
diff changeset
   503
    except OSError:
30520
4338f87dbf6f dispatch: move part of callcatch to scmutil
Jun Wu <quark@fb.com>
parents: 30519
diff changeset
   504
        raise
7645
020a896a5292 dispatch: sort exception handlers
Matt Mackall <mpm@selenic.com>
parents: 7644
diff changeset
   505
    except KeyboardInterrupt:
28520
84cc72c5771e dispatch: catch KeyboardInterrupt more broadly
Yuya Nishihara <yuya@tcha.org>
parents: 28515
diff changeset
   506
        raise
30520
4338f87dbf6f dispatch: move part of callcatch to scmutil
Jun Wu <quark@fb.com>
parents: 30519
diff changeset
   507
    except:  # probably re-raises
28784
09750b1231c2 dispatch: factor out command failure handling into a function
Martijn Pieters <mjpieters@fb.com>
parents: 28695
diff changeset
   508
        if not handlecommandexception(ui):
09750b1231c2 dispatch: factor out command failure handling into a function
Martijn Pieters <mjpieters@fb.com>
parents: 28695
diff changeset
   509
            raise
5178
18a9fbb5cd78 dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
   510
46262
9c9e0b4b2ca7 error: use detailed exit code 10 for command errors
Martin von Zweigbergk <martinvonz@google.com>
parents: 46173
diff changeset
   511
    if ui.configbool(b'ui', b'detailed-exit-code'):
9c9e0b4b2ca7 error: use detailed exit code 10 for command errors
Martin von Zweigbergk <martinvonz@google.com>
parents: 46173
diff changeset
   512
        return detailed_exit_code
9c9e0b4b2ca7 error: use detailed exit code 10 for command errors
Martin von Zweigbergk <martinvonz@google.com>
parents: 46173
diff changeset
   513
    else:
9c9e0b4b2ca7 error: use detailed exit code 10 for command errors
Martin von Zweigbergk <martinvonz@google.com>
parents: 46173
diff changeset
   514
        return -1
5178
18a9fbb5cd78 dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
   515
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41193
diff changeset
   516
14265
e4ab5ae193f2 add positional arguments to non-shell aliases
Alexander Solovyov <alexander@solovyov.net>
parents: 14096
diff changeset
   517
def aliasargs(fn, givenargs):
34087
5361771f9714 wrapfunction: use functools.partial if possible
Jun Wu <quark@fb.com>
parents: 34022
diff changeset
   518
    args = []
5361771f9714 wrapfunction: use functools.partial if possible
Jun Wu <quark@fb.com>
parents: 34022
diff changeset
   519
    # only care about alias 'args', ignore 'args' set by extensions.wrapfunction
50925
d718eddf01d9 safehasattr: drop usage in favor of hasattr
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50570
diff changeset
   520
    if not hasattr(fn, '_origfunc'):
34087
5361771f9714 wrapfunction: use functools.partial if possible
Jun Wu <quark@fb.com>
parents: 34022
diff changeset
   521
        args = getattr(fn, 'args', args)
16294
795d591b6ef5 alias: abort on missing positional args (issue3331)
Matt Mackall <mpm@selenic.com>
parents: 16277
diff changeset
   522
    if args:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   523
        cmd = b' '.join(map(procutil.shellquote, args))
14265
e4ab5ae193f2 add positional arguments to non-shell aliases
Alexander Solovyov <alexander@solovyov.net>
parents: 14096
diff changeset
   524
e4ab5ae193f2 add positional arguments to non-shell aliases
Alexander Solovyov <alexander@solovyov.net>
parents: 14096
diff changeset
   525
        nums = []
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41193
diff changeset
   526
14265
e4ab5ae193f2 add positional arguments to non-shell aliases
Alexander Solovyov <alexander@solovyov.net>
parents: 14096
diff changeset
   527
        def replacer(m):
e4ab5ae193f2 add positional arguments to non-shell aliases
Alexander Solovyov <alexander@solovyov.net>
parents: 14096
diff changeset
   528
            num = int(m.group(1)) - 1
e4ab5ae193f2 add positional arguments to non-shell aliases
Alexander Solovyov <alexander@solovyov.net>
parents: 14096
diff changeset
   529
            nums.append(num)
16277
1c2aaf05f7d7 aliases: use empty string for missing position parameters (issue3331)
Matt Mackall <mpm@selenic.com>
parents: 15781
diff changeset
   530
            if num < len(givenargs):
1c2aaf05f7d7 aliases: use empty string for missing position parameters (issue3331)
Matt Mackall <mpm@selenic.com>
parents: 15781
diff changeset
   531
                return givenargs[num]
45914
be25b66f86ab errors: raise InputError when too few arguments given to alias
Martin von Zweigbergk <martinvonz@google.com>
parents: 45912
diff changeset
   532
            raise error.InputError(_(b'too few arguments for command alias'))
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41193
diff changeset
   533
31491
492c64afc54c py3: make the regular expression bytes to prevent TypeError
Pulkit Goyal <7895pulkit@gmail.com>
parents: 31305
diff changeset
   534
        cmd = re.sub(br'\$(\d+|\$)', replacer, cmd)
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41193
diff changeset
   535
        givenargs = [x for i, x in enumerate(givenargs) if i not in nums]
30678
caf7e1c5efe4 py3: have a bytes version of shlex.split()
Pulkit Goyal <7895pulkit@gmail.com>
parents: 30653
diff changeset
   536
        args = pycompat.shlexsplit(cmd)
14265
e4ab5ae193f2 add positional arguments to non-shell aliases
Alexander Solovyov <alexander@solovyov.net>
parents: 14096
diff changeset
   537
    return args + givenargs
8655
21688b8a594b Move alias into core
Brendan Cully <brendan@kublai.com>
parents: 8304
diff changeset
   538
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41193
diff changeset
   539
22158
bc2132dfc0a4 alias: expand "$@" as list of parameters quoted individually (BC) (issue4200)
Siddharth Agarwal <sid0@fb.com>
parents: 21961
diff changeset
   540
def aliasinterpolate(name, args, cmd):
45942
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 45920
diff changeset
   541
    """interpolate args into cmd for shell aliases
22158
bc2132dfc0a4 alias: expand "$@" as list of parameters quoted individually (BC) (issue4200)
Siddharth Agarwal <sid0@fb.com>
parents: 21961
diff changeset
   542
bc2132dfc0a4 alias: expand "$@" as list of parameters quoted individually (BC) (issue4200)
Siddharth Agarwal <sid0@fb.com>
parents: 21961
diff changeset
   543
    This also handles $0, $@ and "$@".
45942
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 45920
diff changeset
   544
    """
22158
bc2132dfc0a4 alias: expand "$@" as list of parameters quoted individually (BC) (issue4200)
Siddharth Agarwal <sid0@fb.com>
parents: 21961
diff changeset
   545
    # util.interpolate can't deal with "$@" (with quotes) because it's only
bc2132dfc0a4 alias: expand "$@" as list of parameters quoted individually (BC) (issue4200)
Siddharth Agarwal <sid0@fb.com>
parents: 21961
diff changeset
   546
    # built to match prefix + patterns.
44452
9d2b2df2c2ba cleanup: run pyupgrade on our source tree to clean up varying things
Augie Fackler <augie@google.com>
parents: 44306
diff changeset
   547
    replacemap = {b'$%d' % (i + 1): arg for i, arg in enumerate(args)}
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   548
    replacemap[b'$0'] = name
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   549
    replacemap[b'$$'] = b'$'
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   550
    replacemap[b'$@'] = b' '.join(args)
22158
bc2132dfc0a4 alias: expand "$@" as list of parameters quoted individually (BC) (issue4200)
Siddharth Agarwal <sid0@fb.com>
parents: 21961
diff changeset
   551
    # Typical Unix shells interpolate "$@" (with quotes) as all the positional
bc2132dfc0a4 alias: expand "$@" as list of parameters quoted individually (BC) (issue4200)
Siddharth Agarwal <sid0@fb.com>
parents: 21961
diff changeset
   552
    # parameters, separated out into words. Emulate the same behavior here by
bc2132dfc0a4 alias: expand "$@" as list of parameters quoted individually (BC) (issue4200)
Siddharth Agarwal <sid0@fb.com>
parents: 21961
diff changeset
   553
    # quoting the arguments individually. POSIX shells will then typically
bc2132dfc0a4 alias: expand "$@" as list of parameters quoted individually (BC) (issue4200)
Siddharth Agarwal <sid0@fb.com>
parents: 21961
diff changeset
   554
    # tokenize each argument into exactly one word.
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   555
    replacemap[b'"$@"'] = b' '.join(procutil.shellquote(arg) for arg in args)
22158
bc2132dfc0a4 alias: expand "$@" as list of parameters quoted individually (BC) (issue4200)
Siddharth Agarwal <sid0@fb.com>
parents: 21961
diff changeset
   556
    # escape '\$' for regex
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   557
    regex = b'|'.join(replacemap.keys()).replace(b'$', br'\$')
22158
bc2132dfc0a4 alias: expand "$@" as list of parameters quoted individually (BC) (issue4200)
Siddharth Agarwal <sid0@fb.com>
parents: 21961
diff changeset
   558
    r = re.compile(regex)
bc2132dfc0a4 alias: expand "$@" as list of parameters quoted individually (BC) (issue4200)
Siddharth Agarwal <sid0@fb.com>
parents: 21961
diff changeset
   559
    return r.sub(lambda x: replacemap[x.group()], cmd)
bc2132dfc0a4 alias: expand "$@" as list of parameters quoted individually (BC) (issue4200)
Siddharth Agarwal <sid0@fb.com>
parents: 21961
diff changeset
   560
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41193
diff changeset
   561
48946
642e31cb55f0 py3: use class X: instead of class X(object):
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48913
diff changeset
   562
class cmdalias:
37134
6890b7e991a4 help: supporting both help and doc for aliases
Rodrigo Damazio <rdamazio@google.com>
parents: 37120
diff changeset
   563
    def __init__(self, ui, name, definition, cmdtable, source):
12039
18e1e7520b67 alias: make shadowing behavior more consistent (issue2054)
Brodie Rao <brodie@bitheap.org>
parents: 11712
diff changeset
   564
        self.name = self.cmd = name
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   565
        self.cmdname = b''
8655
21688b8a594b Move alias into core
Brendan Cully <brendan@kublai.com>
parents: 8304
diff changeset
   566
        self.definition = definition
22160
645457f73aa6 alias: keep error message in "badalias" so that help can see it
Yuya Nishihara <yuya@tcha.org>
parents: 22158
diff changeset
   567
        self.fn = None
29087
ad1bdea43965 dispatch: defer environment variable resolution in alias commands (BC)
Jun Wu <quark@fb.com>
parents: 28861
diff changeset
   568
        self.givenargs = []
8655
21688b8a594b Move alias into core
Brendan Cully <brendan@kublai.com>
parents: 8304
diff changeset
   569
        self.opts = []
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   570
        self.help = b''
22160
645457f73aa6 alias: keep error message in "badalias" so that help can see it
Yuya Nishihara <yuya@tcha.org>
parents: 22158
diff changeset
   571
        self.badalias = None
22161
063628423fd1 alias: provide "unknowncmd" flag to tell help to look for disabled command
Yuya Nishihara <yuya@tcha.org>
parents: 22160
diff changeset
   572
        self.unknowncmd = False
28828
3640c1702c43 help: report source of aliases
timeless <timeless@mozdev.org>
parents: 28821
diff changeset
   573
        self.source = source
8655
21688b8a594b Move alias into core
Brendan Cully <brendan@kublai.com>
parents: 8304
diff changeset
   574
21688b8a594b Move alias into core
Brendan Cully <brendan@kublai.com>
parents: 8304
diff changeset
   575
        try:
12039
18e1e7520b67 alias: make shadowing behavior more consistent (issue2054)
Brodie Rao <brodie@bitheap.org>
parents: 11712
diff changeset
   576
            aliases, entry = cmdutil.findcmd(self.name, cmdtable)
48913
f254fc73d956 global: bulk replace simple pycompat.iteritems(x) with x.items()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48891
diff changeset
   577
            for alias, e in cmdtable.items():
12039
18e1e7520b67 alias: make shadowing behavior more consistent (issue2054)
Brodie Rao <brodie@bitheap.org>
parents: 11712
diff changeset
   578
                if e is entry:
18e1e7520b67 alias: make shadowing behavior more consistent (issue2054)
Brodie Rao <brodie@bitheap.org>
parents: 11712
diff changeset
   579
                    self.cmd = alias
18e1e7520b67 alias: make shadowing behavior more consistent (issue2054)
Brodie Rao <brodie@bitheap.org>
parents: 11712
diff changeset
   580
                    break
8655
21688b8a594b Move alias into core
Brendan Cully <brendan@kublai.com>
parents: 8304
diff changeset
   581
            self.shadows = True
21688b8a594b Move alias into core
Brendan Cully <brendan@kublai.com>
parents: 8304
diff changeset
   582
        except error.UnknownCommand:
21688b8a594b Move alias into core
Brendan Cully <brendan@kublai.com>
parents: 8304
diff changeset
   583
            self.shadows = False
21688b8a594b Move alias into core
Brendan Cully <brendan@kublai.com>
parents: 8304
diff changeset
   584
21688b8a594b Move alias into core
Brendan Cully <brendan@kublai.com>
parents: 8304
diff changeset
   585
        if not self.definition:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   586
            self.badalias = _(b"no definition for alias '%s'") % self.name
8655
21688b8a594b Move alias into core
Brendan Cully <brendan@kublai.com>
parents: 8304
diff changeset
   587
            return
21688b8a594b Move alias into core
Brendan Cully <brendan@kublai.com>
parents: 8304
diff changeset
   588
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   589
        if self.definition.startswith(b'!'):
37134
6890b7e991a4 help: supporting both help and doc for aliases
Rodrigo Damazio <rdamazio@google.com>
parents: 37120
diff changeset
   590
            shdef = self.definition[1:]
12536
208fc9ad6a48 alias: only allow global options before a shell alias, pass later ones through
Steve Losh <steve@stevelosh.com>
parents: 12276
diff changeset
   591
            self.shell = True
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41193
diff changeset
   592
11524
24965bb270b7 dispatch: add shell aliases
Steve Losh <steve@stevelosh.com>
parents: 11495
diff changeset
   593
            def fn(ui, *args):
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   594
                env = {b'HG_ARGS': b' '.join((self.name,) + args)}
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41193
diff changeset
   595
11989
f853873fc66d aliases: provide more flexible ways to work with shell alias arguments
Steve Losh <steve@stevelosh.com>
parents: 11985
diff changeset
   596
                def _checkvar(m):
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   597
                    if m.groups()[0] == b'$':
13392
777cef34a890 dispatch: support for $ escaping in shell-alias definition
Roman Sokolov <sokolov.r.v@gmail.com>
parents: 13382
diff changeset
   598
                        return m.group()
777cef34a890 dispatch: support for $ escaping in shell-alias definition
Roman Sokolov <sokolov.r.v@gmail.com>
parents: 13382
diff changeset
   599
                    elif int(m.groups()[0]) <= len(args):
11989
f853873fc66d aliases: provide more flexible ways to work with shell alias arguments
Steve Losh <steve@stevelosh.com>
parents: 11985
diff changeset
   600
                        return m.group()
f853873fc66d aliases: provide more flexible ways to work with shell alias arguments
Steve Losh <steve@stevelosh.com>
parents: 11985
diff changeset
   601
                    else:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41193
diff changeset
   602
                        ui.debug(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   603
                            b"No argument found for substitution "
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   604
                            b"of %i variable in alias '%s' definition.\n"
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41193
diff changeset
   605
                            % (int(m.groups()[0]), self.name)
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41193
diff changeset
   606
                        )
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   607
                        return b''
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41193
diff changeset
   608
37134
6890b7e991a4 help: supporting both help and doc for aliases
Rodrigo Damazio <rdamazio@google.com>
parents: 37120
diff changeset
   609
                cmd = re.sub(br'\$(\d+|\$)', _checkvar, shdef)
22158
bc2132dfc0a4 alias: expand "$@" as list of parameters quoted individually (BC) (issue4200)
Siddharth Agarwal <sid0@fb.com>
parents: 21961
diff changeset
   610
                cmd = aliasinterpolate(self.name, args, cmd)
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41193
diff changeset
   611
                return ui.system(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   612
                    cmd, environ=env, blockedtag=b'alias_%s' % self.name
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41193
diff changeset
   613
                )
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41193
diff changeset
   614
11524
24965bb270b7 dispatch: add shell aliases
Steve Losh <steve@stevelosh.com>
parents: 11495
diff changeset
   615
            self.fn = fn
40414
444861dc1e55 help: displaying documented aliases by default
rdamazio@google.com
parents: 40402
diff changeset
   616
            self.alias = True
37134
6890b7e991a4 help: supporting both help and doc for aliases
Rodrigo Damazio <rdamazio@google.com>
parents: 37120
diff changeset
   617
            self._populatehelp(ui, name, shdef, self.fn)
11524
24965bb270b7 dispatch: add shell aliases
Steve Losh <steve@stevelosh.com>
parents: 11495
diff changeset
   618
            return
24965bb270b7 dispatch: add shell aliases
Steve Losh <steve@stevelosh.com>
parents: 11495
diff changeset
   619
21569
c5afb07c33d3 alias: handle shlex error in command aliases
Yuya Nishihara <yuya@tcha.org>
parents: 21556
diff changeset
   620
        try:
30678
caf7e1c5efe4 py3: have a bytes version of shlex.split()
Pulkit Goyal <7895pulkit@gmail.com>
parents: 30653
diff changeset
   621
            args = pycompat.shlexsplit(self.definition)
25660
328739ea70c3 global: mass rewrite to use modern exception syntax
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25329
diff changeset
   622
        except ValueError as inst:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   623
            self.badalias = _(b"error in definition for alias '%s': %s") % (
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41193
diff changeset
   624
                self.name,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41193
diff changeset
   625
                stringutil.forcebytestr(inst),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41193
diff changeset
   626
            )
21569
c5afb07c33d3 alias: handle shlex error in command aliases
Yuya Nishihara <yuya@tcha.org>
parents: 21556
diff changeset
   627
            return
35225
7ce0ba3a1c32 dispatch: replace _earlygetopt(strip=True) with new parser
Yuya Nishihara <yuya@tcha.org>
parents: 35224
diff changeset
   628
        earlyopts, args = _earlysplitopts(args)
7ce0ba3a1c32 dispatch: replace _earlygetopt(strip=True) with new parser
Yuya Nishihara <yuya@tcha.org>
parents: 35224
diff changeset
   629
        if earlyopts:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41193
diff changeset
   630
            self.badalias = _(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   631
                b"error in definition for alias '%s': %s may "
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   632
                b"only be given on the command line"
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   633
            ) % (self.name, b'/'.join(pycompat.ziplist(*earlyopts)[0]))
35225
7ce0ba3a1c32 dispatch: replace _earlygetopt(strip=True) with new parser
Yuya Nishihara <yuya@tcha.org>
parents: 35224
diff changeset
   634
            return
12092
4982fa38e544 alias: print what command is being shadowed in debug message
Brodie Rao <brodie@bitheap.org>
parents: 12070
diff changeset
   635
        self.cmdname = cmd = args.pop(0)
29087
ad1bdea43965 dispatch: defer environment variable resolution in alias commands (BC)
Jun Wu <quark@fb.com>
parents: 28861
diff changeset
   636
        self.givenargs = args
8655
21688b8a594b Move alias into core
Brendan Cully <brendan@kublai.com>
parents: 8304
diff changeset
   637
21688b8a594b Move alias into core
Brendan Cully <brendan@kublai.com>
parents: 8304
diff changeset
   638
        try:
9993
8bce1e0d2801 alias: do not crash when aliased command has no usage help text
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents: 9825
diff changeset
   639
            tableentry = cmdutil.findcmd(cmd, cmdtable, False)[1]
8bce1e0d2801 alias: do not crash when aliased command has no usage help text
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents: 9825
diff changeset
   640
            if len(tableentry) > 2:
37134
6890b7e991a4 help: supporting both help and doc for aliases
Rodrigo Damazio <rdamazio@google.com>
parents: 37120
diff changeset
   641
                self.fn, self.opts, cmdhelp = tableentry
9993
8bce1e0d2801 alias: do not crash when aliased command has no usage help text
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents: 9825
diff changeset
   642
            else:
8bce1e0d2801 alias: do not crash when aliased command has no usage help text
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents: 9825
diff changeset
   643
                self.fn, self.opts = tableentry
37134
6890b7e991a4 help: supporting both help and doc for aliases
Rodrigo Damazio <rdamazio@google.com>
parents: 37120
diff changeset
   644
                cmdhelp = None
9993
8bce1e0d2801 alias: do not crash when aliased command has no usage help text
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents: 9825
diff changeset
   645
40414
444861dc1e55 help: displaying documented aliases by default
rdamazio@google.com
parents: 40402
diff changeset
   646
            self.alias = True
37134
6890b7e991a4 help: supporting both help and doc for aliases
Rodrigo Damazio <rdamazio@google.com>
parents: 37120
diff changeset
   647
            self._populatehelp(ui, name, cmd, self.fn, cmdhelp)
9876
6e8a16dd3e30 alias: improve help text for command aliases
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 9875
diff changeset
   648
8655
21688b8a594b Move alias into core
Brendan Cully <brendan@kublai.com>
parents: 8304
diff changeset
   649
        except error.UnknownCommand:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   650
            self.badalias = _(
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   651
                b"alias '%s' resolves to unknown command '%s'"
45942
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 45920
diff changeset
   652
            ) % (
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 45920
diff changeset
   653
                self.name,
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 45920
diff changeset
   654
                cmd,
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 45920
diff changeset
   655
            )
22161
063628423fd1 alias: provide "unknowncmd" flag to tell help to look for disabled command
Yuya Nishihara <yuya@tcha.org>
parents: 22160
diff changeset
   656
            self.unknowncmd = True
8655
21688b8a594b Move alias into core
Brendan Cully <brendan@kublai.com>
parents: 8304
diff changeset
   657
        except error.AmbiguousCommand:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41193
diff changeset
   658
            self.badalias = _(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   659
                b"alias '%s' resolves to ambiguous command '%s'"
45942
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 45920
diff changeset
   660
            ) % (
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 45920
diff changeset
   661
                self.name,
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 45920
diff changeset
   662
                cmd,
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 45920
diff changeset
   663
            )
8655
21688b8a594b Move alias into core
Brendan Cully <brendan@kublai.com>
parents: 8304
diff changeset
   664
37134
6890b7e991a4 help: supporting both help and doc for aliases
Rodrigo Damazio <rdamazio@google.com>
parents: 37120
diff changeset
   665
    def _populatehelp(self, ui, name, cmd, fn, defaulthelp=None):
37139
aa55c5354b8f alias: reject non-ascii characters in user help/doc strings
Yuya Nishihara <yuya@tcha.org>
parents: 37134
diff changeset
   666
        # confine strings to be passed to i18n.gettext()
aa55c5354b8f alias: reject non-ascii characters in user help/doc strings
Yuya Nishihara <yuya@tcha.org>
parents: 37134
diff changeset
   667
        cfg = {}
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   668
        for k in (b'doc', b'help', b'category'):
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   669
            v = ui.config(b'alias', b'%s:%s' % (name, k), None)
37139
aa55c5354b8f alias: reject non-ascii characters in user help/doc strings
Yuya Nishihara <yuya@tcha.org>
parents: 37134
diff changeset
   670
            if v is None:
aa55c5354b8f alias: reject non-ascii characters in user help/doc strings
Yuya Nishihara <yuya@tcha.org>
parents: 37134
diff changeset
   671
                continue
aa55c5354b8f alias: reject non-ascii characters in user help/doc strings
Yuya Nishihara <yuya@tcha.org>
parents: 37134
diff changeset
   672
            if not encoding.isasciistr(v):
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41193
diff changeset
   673
                self.badalias = _(
43117
8ff1ecfadcd1 cleanup: join string literals that are already on one line
Martin von Zweigbergk <martinvonz@google.com>
parents: 43106
diff changeset
   674
                    b"non-ASCII character in alias definition '%s:%s'"
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41193
diff changeset
   675
                ) % (name, k)
37139
aa55c5354b8f alias: reject non-ascii characters in user help/doc strings
Yuya Nishihara <yuya@tcha.org>
parents: 37134
diff changeset
   676
                return
aa55c5354b8f alias: reject non-ascii characters in user help/doc strings
Yuya Nishihara <yuya@tcha.org>
parents: 37134
diff changeset
   677
            cfg[k] = v
aa55c5354b8f alias: reject non-ascii characters in user help/doc strings
Yuya Nishihara <yuya@tcha.org>
parents: 37134
diff changeset
   678
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   679
        self.help = cfg.get(b'help', defaulthelp or b'')
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   680
        if self.help and self.help.startswith(b"hg " + cmd):
37134
6890b7e991a4 help: supporting both help and doc for aliases
Rodrigo Damazio <rdamazio@google.com>
parents: 37120
diff changeset
   681
            # drop prefix in old-style help lines so hg shows the alias
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41193
diff changeset
   682
            self.help = self.help[4 + len(cmd) :]
37134
6890b7e991a4 help: supporting both help and doc for aliases
Rodrigo Damazio <rdamazio@google.com>
parents: 37120
diff changeset
   683
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   684
        self.owndoc = b'doc' in cfg
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   685
        doc = cfg.get(b'doc', pycompat.getdoc(fn))
37140
1d56c539794e py3: bytes/unicode dance on __doc__ of cmdalias
Yuya Nishihara <yuya@tcha.org>
parents: 37139
diff changeset
   686
        if doc is not None:
1d56c539794e py3: bytes/unicode dance on __doc__ of cmdalias
Yuya Nishihara <yuya@tcha.org>
parents: 37139
diff changeset
   687
            doc = pycompat.sysstr(doc)
1d56c539794e py3: bytes/unicode dance on __doc__ of cmdalias
Yuya Nishihara <yuya@tcha.org>
parents: 37139
diff changeset
   688
        self.__doc__ = doc
37134
6890b7e991a4 help: supporting both help and doc for aliases
Rodrigo Damazio <rdamazio@google.com>
parents: 37120
diff changeset
   689
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   690
        self.helpcategory = cfg.get(
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   691
            b'category', registrar.command.CATEGORY_NONE
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   692
        )
40414
444861dc1e55 help: displaying documented aliases by default
rdamazio@google.com
parents: 40402
diff changeset
   693
29087
ad1bdea43965 dispatch: defer environment variable resolution in alias commands (BC)
Jun Wu <quark@fb.com>
parents: 28861
diff changeset
   694
    @property
ad1bdea43965 dispatch: defer environment variable resolution in alias commands (BC)
Jun Wu <quark@fb.com>
parents: 28861
diff changeset
   695
    def args(self):
31629
2632df096fc0 dispatch: use pycompat.maplist() instead of map() to get a list
Pulkit Goyal <7895pulkit@gmail.com>
parents: 31502
diff changeset
   696
        args = pycompat.maplist(util.expandpath, self.givenargs)
29087
ad1bdea43965 dispatch: defer environment variable resolution in alias commands (BC)
Jun Wu <quark@fb.com>
parents: 28861
diff changeset
   697
        return aliasargs(self.fn, args)
ad1bdea43965 dispatch: defer environment variable resolution in alias commands (BC)
Jun Wu <quark@fb.com>
parents: 28861
diff changeset
   698
28621
d856e85a8a7a dispatch: make cmdalias forward command attributes to function
Yuya Nishihara <yuya@tcha.org>
parents: 28538
diff changeset
   699
    def __getattr__(self, name):
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41193
diff changeset
   700
        adefaults = {
43506
9f70512ae2cf cleanup: remove pointless r-prefixes on single-quoted strings
Augie Fackler <augie@google.com>
parents: 43238
diff changeset
   701
            'norepo': True,
9f70512ae2cf cleanup: remove pointless r-prefixes on single-quoted strings
Augie Fackler <augie@google.com>
parents: 43238
diff changeset
   702
            'intents': set(),
9f70512ae2cf cleanup: remove pointless r-prefixes on single-quoted strings
Augie Fackler <augie@google.com>
parents: 43238
diff changeset
   703
            'optionalrepo': False,
9f70512ae2cf cleanup: remove pointless r-prefixes on single-quoted strings
Augie Fackler <augie@google.com>
parents: 43238
diff changeset
   704
            'inferrepo': False,
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41193
diff changeset
   705
        }
28621
d856e85a8a7a dispatch: make cmdalias forward command attributes to function
Yuya Nishihara <yuya@tcha.org>
parents: 28538
diff changeset
   706
        if name not in adefaults:
d856e85a8a7a dispatch: make cmdalias forward command attributes to function
Yuya Nishihara <yuya@tcha.org>
parents: 28538
diff changeset
   707
            raise AttributeError(name)
50925
d718eddf01d9 safehasattr: drop usage in favor of hasattr
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50570
diff changeset
   708
        if self.badalias or hasattr(self, 'shell'):
28621
d856e85a8a7a dispatch: make cmdalias forward command attributes to function
Yuya Nishihara <yuya@tcha.org>
parents: 28538
diff changeset
   709
            return adefaults[name]
d856e85a8a7a dispatch: make cmdalias forward command attributes to function
Yuya Nishihara <yuya@tcha.org>
parents: 28538
diff changeset
   710
        return getattr(self.fn, name)
d856e85a8a7a dispatch: make cmdalias forward command attributes to function
Yuya Nishihara <yuya@tcha.org>
parents: 28538
diff changeset
   711
8655
21688b8a594b Move alias into core
Brendan Cully <brendan@kublai.com>
parents: 8304
diff changeset
   712
    def __call__(self, ui, *args, **opts):
22160
645457f73aa6 alias: keep error message in "badalias" so that help can see it
Yuya Nishihara <yuya@tcha.org>
parents: 22158
diff changeset
   713
        if self.badalias:
22164
efd65e51bc0b alias: exit from bad definition by Abort
Yuya Nishihara <yuya@tcha.org>
parents: 22163
diff changeset
   714
            hint = None
22161
063628423fd1 alias: provide "unknowncmd" flag to tell help to look for disabled command
Yuya Nishihara <yuya@tcha.org>
parents: 22160
diff changeset
   715
            if self.unknowncmd:
10364
de1e7099d100 dispatch: provide help for disabled extensions and commands
Brodie Rao <me+hg@dackz.net>
parents: 10282
diff changeset
   716
                try:
de1e7099d100 dispatch: provide help for disabled extensions and commands
Brodie Rao <me+hg@dackz.net>
parents: 10282
diff changeset
   717
                    # check if the command is in a disabled extension
22163
01ef4347e4ab alias: show one-line hint for command provided by disabled extension
Yuya Nishihara <yuya@tcha.org>
parents: 22161
diff changeset
   718
                    cmd, ext = extensions.disabledcmd(ui, self.cmdname)[:2]
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   719
                    hint = _(b"'%s' is provided by '%s' extension") % (cmd, ext)
10364
de1e7099d100 dispatch: provide help for disabled extensions and commands
Brodie Rao <me+hg@dackz.net>
parents: 10282
diff changeset
   720
                except error.UnknownCommand:
de1e7099d100 dispatch: provide help for disabled extensions and commands
Brodie Rao <me+hg@dackz.net>
parents: 10282
diff changeset
   721
                    pass
45912
35ab6e39f482 errors: raise ConfigError on bad alias definition
Martin von Zweigbergk <martinvonz@google.com>
parents: 45911
diff changeset
   722
            raise error.ConfigError(self.badalias, hint=hint)
8655
21688b8a594b Move alias into core
Brendan Cully <brendan@kublai.com>
parents: 8304
diff changeset
   723
        if self.shadows:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41193
diff changeset
   724
            ui.debug(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   725
                b"alias '%s' shadows command '%s'\n" % (self.name, self.cmdname)
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41193
diff changeset
   726
            )
8655
21688b8a594b Move alias into core
Brendan Cully <brendan@kublai.com>
parents: 8304
diff changeset
   727
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41193
diff changeset
   728
        ui.log(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   729
            b'commandalias',
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   730
            b"alias '%s' expands to '%s'\n",
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41193
diff changeset
   731
            self.name,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41193
diff changeset
   732
            self.definition,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41193
diff changeset
   733
        )
50925
d718eddf01d9 safehasattr: drop usage in favor of hasattr
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50570
diff changeset
   734
        if hasattr(self, 'shell'):
11989
f853873fc66d aliases: provide more flexible ways to work with shell alias arguments
Steve Losh <steve@stevelosh.com>
parents: 11985
diff changeset
   735
            return self.fn(ui, *args, **opts)
f853873fc66d aliases: provide more flexible ways to work with shell alias arguments
Steve Losh <steve@stevelosh.com>
parents: 11985
diff changeset
   736
        else:
12093
cd895084a4cd alias: on --debug, print expansion when it has invalid arguments
Brodie Rao <brodie@bitheap.org>
parents: 12092
diff changeset
   737
            try:
21556
5e13507a3b4e alias: fix loss of non-zero return code in command aliases
Yuya Nishihara <yuya@tcha.org>
parents: 20829
diff changeset
   738
                return util.checksignature(self.fn)(ui, *args, **opts)
12093
cd895084a4cd alias: on --debug, print expansion when it has invalid arguments
Brodie Rao <brodie@bitheap.org>
parents: 12092
diff changeset
   739
            except error.SignatureError:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   740
                args = b' '.join([self.cmdname] + self.args)
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   741
                ui.debug(b"alias '%s' expands to '%s'\n" % (self.name, args))
12093
cd895084a4cd alias: on --debug, print expansion when it has invalid arguments
Brodie Rao <brodie@bitheap.org>
parents: 12092
diff changeset
   742
                raise
8655
21688b8a594b Move alias into core
Brendan Cully <brendan@kublai.com>
parents: 8304
diff changeset
   743
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41193
diff changeset
   744
48946
642e31cb55f0 py3: use class X: instead of class X(object):
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48913
diff changeset
   745
class lazyaliasentry:
34306
bd50aa1aa035 alias: make alias command lazily resolved
Jun Wu <quark@fb.com>
parents: 34305
diff changeset
   746
    """like a typical command entry (func, opts, help), but is lazy"""
bd50aa1aa035 alias: make alias command lazily resolved
Jun Wu <quark@fb.com>
parents: 34305
diff changeset
   747
37134
6890b7e991a4 help: supporting both help and doc for aliases
Rodrigo Damazio <rdamazio@google.com>
parents: 37120
diff changeset
   748
    def __init__(self, ui, name, definition, cmdtable, source):
6890b7e991a4 help: supporting both help and doc for aliases
Rodrigo Damazio <rdamazio@google.com>
parents: 37120
diff changeset
   749
        self.ui = ui
34306
bd50aa1aa035 alias: make alias command lazily resolved
Jun Wu <quark@fb.com>
parents: 34305
diff changeset
   750
        self.name = name
bd50aa1aa035 alias: make alias command lazily resolved
Jun Wu <quark@fb.com>
parents: 34305
diff changeset
   751
        self.definition = definition
bd50aa1aa035 alias: make alias command lazily resolved
Jun Wu <quark@fb.com>
parents: 34305
diff changeset
   752
        self.cmdtable = cmdtable.copy()
bd50aa1aa035 alias: make alias command lazily resolved
Jun Wu <quark@fb.com>
parents: 34305
diff changeset
   753
        self.source = source
40414
444861dc1e55 help: displaying documented aliases by default
rdamazio@google.com
parents: 40402
diff changeset
   754
        self.alias = True
34306
bd50aa1aa035 alias: make alias command lazily resolved
Jun Wu <quark@fb.com>
parents: 34305
diff changeset
   755
bd50aa1aa035 alias: make alias command lazily resolved
Jun Wu <quark@fb.com>
parents: 34305
diff changeset
   756
    @util.propertycache
bd50aa1aa035 alias: make alias command lazily resolved
Jun Wu <quark@fb.com>
parents: 34305
diff changeset
   757
    def _aliasdef(self):
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41193
diff changeset
   758
        return cmdalias(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41193
diff changeset
   759
            self.ui, self.name, self.definition, self.cmdtable, self.source
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41193
diff changeset
   760
        )
34306
bd50aa1aa035 alias: make alias command lazily resolved
Jun Wu <quark@fb.com>
parents: 34305
diff changeset
   761
bd50aa1aa035 alias: make alias command lazily resolved
Jun Wu <quark@fb.com>
parents: 34305
diff changeset
   762
    def __getitem__(self, n):
bd50aa1aa035 alias: make alias command lazily resolved
Jun Wu <quark@fb.com>
parents: 34305
diff changeset
   763
        aliasdef = self._aliasdef
bd50aa1aa035 alias: make alias command lazily resolved
Jun Wu <quark@fb.com>
parents: 34305
diff changeset
   764
        if n == 0:
bd50aa1aa035 alias: make alias command lazily resolved
Jun Wu <quark@fb.com>
parents: 34305
diff changeset
   765
            return aliasdef
bd50aa1aa035 alias: make alias command lazily resolved
Jun Wu <quark@fb.com>
parents: 34305
diff changeset
   766
        elif n == 1:
bd50aa1aa035 alias: make alias command lazily resolved
Jun Wu <quark@fb.com>
parents: 34305
diff changeset
   767
            return aliasdef.opts
bd50aa1aa035 alias: make alias command lazily resolved
Jun Wu <quark@fb.com>
parents: 34305
diff changeset
   768
        elif n == 2:
bd50aa1aa035 alias: make alias command lazily resolved
Jun Wu <quark@fb.com>
parents: 34305
diff changeset
   769
            return aliasdef.help
bd50aa1aa035 alias: make alias command lazily resolved
Jun Wu <quark@fb.com>
parents: 34305
diff changeset
   770
        else:
bd50aa1aa035 alias: make alias command lazily resolved
Jun Wu <quark@fb.com>
parents: 34305
diff changeset
   771
            raise IndexError
bd50aa1aa035 alias: make alias command lazily resolved
Jun Wu <quark@fb.com>
parents: 34305
diff changeset
   772
bd50aa1aa035 alias: make alias command lazily resolved
Jun Wu <quark@fb.com>
parents: 34305
diff changeset
   773
    def __iter__(self):
bd50aa1aa035 alias: make alias command lazily resolved
Jun Wu <quark@fb.com>
parents: 34305
diff changeset
   774
        for i in range(3):
bd50aa1aa035 alias: make alias command lazily resolved
Jun Wu <quark@fb.com>
parents: 34305
diff changeset
   775
            yield self[i]
bd50aa1aa035 alias: make alias command lazily resolved
Jun Wu <quark@fb.com>
parents: 34305
diff changeset
   776
bd50aa1aa035 alias: make alias command lazily resolved
Jun Wu <quark@fb.com>
parents: 34305
diff changeset
   777
    def __len__(self):
bd50aa1aa035 alias: make alias command lazily resolved
Jun Wu <quark@fb.com>
parents: 34305
diff changeset
   778
        return 3
bd50aa1aa035 alias: make alias command lazily resolved
Jun Wu <quark@fb.com>
parents: 34305
diff changeset
   779
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41193
diff changeset
   780
8655
21688b8a594b Move alias into core
Brendan Cully <brendan@kublai.com>
parents: 8304
diff changeset
   781
def addaliases(ui, cmdtable):
21688b8a594b Move alias into core
Brendan Cully <brendan@kublai.com>
parents: 8304
diff changeset
   782
    # aliases are processed after extensions have been loaded, so they
21688b8a594b Move alias into core
Brendan Cully <brendan@kublai.com>
parents: 8304
diff changeset
   783
    # may use extension commands. Aliases can also use other alias definitions,
21688b8a594b Move alias into core
Brendan Cully <brendan@kublai.com>
parents: 8304
diff changeset
   784
    # but only if they have been defined prior to the current definition.
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   785
    for alias, definition in ui.configitems(b'alias', ignoresub=True):
15019
f4b7be3f8430 dispatch: don't rewrap aliases that have the same definition
Idan Kamara <idankk86@gmail.com>
parents: 14992
diff changeset
   786
        try:
34306
bd50aa1aa035 alias: make alias command lazily resolved
Jun Wu <quark@fb.com>
parents: 34305
diff changeset
   787
            if cmdtable[alias].definition == definition:
15019
f4b7be3f8430 dispatch: don't rewrap aliases that have the same definition
Idan Kamara <idankk86@gmail.com>
parents: 14992
diff changeset
   788
                continue
f4b7be3f8430 dispatch: don't rewrap aliases that have the same definition
Idan Kamara <idankk86@gmail.com>
parents: 14992
diff changeset
   789
        except (KeyError, AttributeError):
f4b7be3f8430 dispatch: don't rewrap aliases that have the same definition
Idan Kamara <idankk86@gmail.com>
parents: 14992
diff changeset
   790
            # definition might not exist or it might not be a cmdalias
f4b7be3f8430 dispatch: don't rewrap aliases that have the same definition
Idan Kamara <idankk86@gmail.com>
parents: 14992
diff changeset
   791
            pass
f4b7be3f8430 dispatch: don't rewrap aliases that have the same definition
Idan Kamara <idankk86@gmail.com>
parents: 14992
diff changeset
   792
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   793
        source = ui.configsource(b'alias', alias)
37134
6890b7e991a4 help: supporting both help and doc for aliases
Rodrigo Damazio <rdamazio@google.com>
parents: 37120
diff changeset
   794
        entry = lazyaliasentry(ui, alias, definition, cmdtable, source)
34306
bd50aa1aa035 alias: make alias command lazily resolved
Jun Wu <quark@fb.com>
parents: 34305
diff changeset
   795
        cmdtable[alias] = entry
8655
21688b8a594b Move alias into core
Brendan Cully <brendan@kublai.com>
parents: 8304
diff changeset
   796
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41193
diff changeset
   797
5178
18a9fbb5cd78 dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
   798
def _parse(ui, args):
18a9fbb5cd78 dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
   799
    options = {}
18a9fbb5cd78 dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
   800
    cmdoptions = {}
18a9fbb5cd78 dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
   801
18a9fbb5cd78 dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
   802
    try:
18a9fbb5cd78 dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
   803
        args = fancyopts.fancyopts(args, commands.globalopts, options)
30576
541949a10a68 fancyopts: switch from fancyopts.getopt.* to getopt.*
Pulkit Goyal <7895pulkit@gmail.com>
parents: 30559
diff changeset
   804
    except getopt.GetoptError as inst:
37084
f0b6fbea00cf stringutil: bulk-replace call sites to point to new module
Yuya Nishihara <yuya@tcha.org>
parents: 36729
diff changeset
   805
        raise error.CommandError(None, stringutil.forcebytestr(inst))
5178
18a9fbb5cd78 dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
   806
18a9fbb5cd78 dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
   807
    if args:
18a9fbb5cd78 dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
   808
        cmd, args = args[0], args[1:]
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41193
diff changeset
   809
        aliases, entry = cmdutil.findcmd(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   810
            cmd, commands.table, ui.configbool(b"ui", b"strict")
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41193
diff changeset
   811
        )
5178
18a9fbb5cd78 dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
   812
        cmd = aliases[0]
14265
e4ab5ae193f2 add positional arguments to non-shell aliases
Alexander Solovyov <alexander@solovyov.net>
parents: 14096
diff changeset
   813
        args = aliasargs(entry[0], args)
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   814
        defaults = ui.config(b"defaults", cmd)
5178
18a9fbb5cd78 dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
   815
        if defaults:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41193
diff changeset
   816
            args = (
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41193
diff changeset
   817
                pycompat.maplist(util.expandpath, pycompat.shlexsplit(defaults))
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41193
diff changeset
   818
                + args
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41193
diff changeset
   819
            )
9875
d6a95c5f6ff9 dispatch: minor refactoring
Henri Wiechers <hwiechers@gmail.com>
parents: 9825
diff changeset
   820
        c = list(entry[1])
5178
18a9fbb5cd78 dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
   821
    else:
18a9fbb5cd78 dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
   822
        cmd = None
18a9fbb5cd78 dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
   823
        c = []
18a9fbb5cd78 dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
   824
18a9fbb5cd78 dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
   825
    # combine global options into local
18a9fbb5cd78 dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
   826
    for o in commands.globalopts:
18a9fbb5cd78 dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
   827
        c.append((o[0], o[1], options[o[1]], o[3]))
18a9fbb5cd78 dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
   828
18a9fbb5cd78 dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
   829
    try:
29822
61a4cdc98307 dispatch: explicitly pass fancyopts optional arg as a keyword
Augie Fackler <augie@google.com>
parents: 29784
diff changeset
   830
        args = fancyopts.fancyopts(args, c, cmdoptions, gnu=True)
30576
541949a10a68 fancyopts: switch from fancyopts.getopt.* to getopt.*
Pulkit Goyal <7895pulkit@gmail.com>
parents: 30559
diff changeset
   831
    except getopt.GetoptError as inst:
37084
f0b6fbea00cf stringutil: bulk-replace call sites to point to new module
Yuya Nishihara <yuya@tcha.org>
parents: 36729
diff changeset
   832
        raise error.CommandError(cmd, stringutil.forcebytestr(inst))
5178
18a9fbb5cd78 dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
   833
18a9fbb5cd78 dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
   834
    # separate global options back out
18a9fbb5cd78 dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
   835
    for o in commands.globalopts:
18a9fbb5cd78 dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
   836
        n = o[1]
18a9fbb5cd78 dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
   837
        options[n] = cmdoptions[n]
18a9fbb5cd78 dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
   838
        del cmdoptions[n]
18a9fbb5cd78 dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
   839
9875
d6a95c5f6ff9 dispatch: minor refactoring
Henri Wiechers <hwiechers@gmail.com>
parents: 9825
diff changeset
   840
    return (cmd, cmd and entry[0] or None, args, options, cmdoptions)
5178
18a9fbb5cd78 dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
   841
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41193
diff changeset
   842
8137
7fd0616b3d80 ui: kill updateopts
Matt Mackall <mpm@selenic.com>
parents: 8136
diff changeset
   843
def _parseconfig(ui, config):
5178
18a9fbb5cd78 dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
   844
    """parse the --config options from the command line"""
14753
10dcb3e7cb55 dispatch: return read config options
Idan Kamara <idankk86@gmail.com>
parents: 14752
diff changeset
   845
    configs = []
10dcb3e7cb55 dispatch: return read config options
Idan Kamara <idankk86@gmail.com>
parents: 14752
diff changeset
   846
5178
18a9fbb5cd78 dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
   847
    for cfg in config:
18a9fbb5cd78 dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
   848
        try:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   849
            name, value = [cfgelem.strip() for cfgelem in cfg.split(b'=', 1)]
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   850
            section, name = name.split(b'.', 1)
5178
18a9fbb5cd78 dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
   851
            if not section or not name:
18a9fbb5cd78 dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
   852
                raise IndexError
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   853
            ui.setconfig(section, name, value, b'--config')
14753
10dcb3e7cb55 dispatch: return read config options
Idan Kamara <idankk86@gmail.com>
parents: 14752
diff changeset
   854
            configs.append((section, name, value))
5178
18a9fbb5cd78 dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
   855
        except (IndexError, ValueError):
46118
db5dddb38f5b errors: raise InputError on early parse error in dispatch
Martin von Zweigbergk <martinvonz@google.com>
parents: 46101
diff changeset
   856
            raise error.InputError(
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41193
diff changeset
   857
                _(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   858
                    b'malformed --config option: %r '
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   859
                    b'(use --config section.name=value)'
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41193
diff changeset
   860
                )
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41193
diff changeset
   861
                % pycompat.bytestr(cfg)
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41193
diff changeset
   862
            )
5178
18a9fbb5cd78 dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
   863
14753
10dcb3e7cb55 dispatch: return read config options
Idan Kamara <idankk86@gmail.com>
parents: 14752
diff changeset
   864
    return configs
10dcb3e7cb55 dispatch: return read config options
Idan Kamara <idankk86@gmail.com>
parents: 14752
diff changeset
   865
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41193
diff changeset
   866
35224
6e6d0a5b88e6 dispatch: replace _earlyreq*() with new fancyopts-based parser
Yuya Nishihara <yuya@tcha.org>
parents: 35223
diff changeset
   867
def _earlyparseopts(ui, args):
35170
c9740b69b9b7 dispatch: add HGPLAIN=+strictflags to restrict early parsing of global options
Yuya Nishihara <yuya@tcha.org>
parents: 35034
diff changeset
   868
    options = {}
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41193
diff changeset
   869
    fancyopts.fancyopts(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41193
diff changeset
   870
        args,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41193
diff changeset
   871
        commands.globalopts,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41193
diff changeset
   872
        options,
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   873
        gnu=not ui.plain(b'strictflags'),
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41193
diff changeset
   874
        early=True,
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   875
        optaliases={b'repository': [b'repo']},
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41193
diff changeset
   876
    )
35170
c9740b69b9b7 dispatch: add HGPLAIN=+strictflags to restrict early parsing of global options
Yuya Nishihara <yuya@tcha.org>
parents: 35034
diff changeset
   877
    return options
c9740b69b9b7 dispatch: add HGPLAIN=+strictflags to restrict early parsing of global options
Yuya Nishihara <yuya@tcha.org>
parents: 35034
diff changeset
   878
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41193
diff changeset
   879
35225
7ce0ba3a1c32 dispatch: replace _earlygetopt(strip=True) with new parser
Yuya Nishihara <yuya@tcha.org>
parents: 35224
diff changeset
   880
def _earlysplitopts(args):
7ce0ba3a1c32 dispatch: replace _earlygetopt(strip=True) with new parser
Yuya Nishihara <yuya@tcha.org>
parents: 35224
diff changeset
   881
    """Split args into a list of possible early options and remainder args"""
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   882
    shortoptions = b'R:'
35225
7ce0ba3a1c32 dispatch: replace _earlygetopt(strip=True) with new parser
Yuya Nishihara <yuya@tcha.org>
parents: 35224
diff changeset
   883
    # TODO: perhaps 'debugger' should be included
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   884
    longoptions = [b'cwd=', b'repository=', b'repo=', b'config=']
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41193
diff changeset
   885
    return fancyopts.earlygetopt(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41193
diff changeset
   886
        args, shortoptions, longoptions, gnu=True, keepsep=True
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41193
diff changeset
   887
    )
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41193
diff changeset
   888
5178
18a9fbb5cd78 dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
   889
11330
713ae78bb583 provide pre- and post- hooks with parsed command line arguments.
Chad Dombrova <chadrik@gmail.com>
parents: 11305
diff changeset
   890
def runcommand(lui, repo, cmd, fullargs, ui, options, d, cmdpats, cmdoptions):
7819
14b703252f14 dispatch: extract command execution block into method
Bill Barry <after.fallout@gmail.com>
parents: 7772
diff changeset
   891
    # run pre-hook, and abort if it fails
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41193
diff changeset
   892
    hook.hook(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41193
diff changeset
   893
        lui,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41193
diff changeset
   894
        repo,
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   895
        b"pre-%s" % cmd,
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41193
diff changeset
   896
        True,
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   897
        args=b" ".join(fullargs),
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41193
diff changeset
   898
        pats=cmdpats,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41193
diff changeset
   899
        opts=cmdoptions,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41193
diff changeset
   900
    )
29129
e6dfb0e4eeef dispatch: add fail-* family of hooks
Jordi Guti?rrez Hermoso <jordigh@octave.org>
parents: 29114
diff changeset
   901
    try:
e6dfb0e4eeef dispatch: add fail-* family of hooks
Jordi Guti?rrez Hermoso <jordigh@octave.org>
parents: 29114
diff changeset
   902
        ret = _runcommand(ui, options, cmd, d)
e6dfb0e4eeef dispatch: add fail-* family of hooks
Jordi Guti?rrez Hermoso <jordigh@octave.org>
parents: 29114
diff changeset
   903
        # run post-hook, passing command result
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41193
diff changeset
   904
        hook.hook(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41193
diff changeset
   905
            lui,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41193
diff changeset
   906
            repo,
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   907
            b"post-%s" % cmd,
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41193
diff changeset
   908
            False,
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   909
            args=b" ".join(fullargs),
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41193
diff changeset
   910
            result=ret,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41193
diff changeset
   911
            pats=cmdpats,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41193
diff changeset
   912
            opts=cmdoptions,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41193
diff changeset
   913
        )
29129
e6dfb0e4eeef dispatch: add fail-* family of hooks
Jordi Guti?rrez Hermoso <jordigh@octave.org>
parents: 29114
diff changeset
   914
    except Exception:
e6dfb0e4eeef dispatch: add fail-* family of hooks
Jordi Guti?rrez Hermoso <jordigh@octave.org>
parents: 29114
diff changeset
   915
        # run failure hook and re-raise
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41193
diff changeset
   916
        hook.hook(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41193
diff changeset
   917
            lui,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41193
diff changeset
   918
            repo,
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   919
            b"fail-%s" % cmd,
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41193
diff changeset
   920
            False,
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   921
            args=b" ".join(fullargs),
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41193
diff changeset
   922
            pats=cmdpats,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41193
diff changeset
   923
            opts=cmdoptions,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41193
diff changeset
   924
        )
29129
e6dfb0e4eeef dispatch: add fail-* family of hooks
Jordi Guti?rrez Hermoso <jordigh@octave.org>
parents: 29114
diff changeset
   925
        raise
7819
14b703252f14 dispatch: extract command execution block into method
Bill Barry <after.fallout@gmail.com>
parents: 7772
diff changeset
   926
    return ret
14b703252f14 dispatch: extract command execution block into method
Bill Barry <after.fallout@gmail.com>
parents: 7772
diff changeset
   927
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41193
diff changeset
   928
28263
59509c6724c7 dispatch: add wd parameter to _getlocal
Jun Wu <quark@fb.com>
parents: 28081
diff changeset
   929
def _getlocal(ui, rpath, wd=None):
12536
208fc9ad6a48 alias: only allow global options before a shell alias, pass later ones through
Steve Losh <steve@stevelosh.com>
parents: 12276
diff changeset
   930
    """Return (path, local ui object) for the given target path.
12770
614f0d8724ab check-code: find trailing whitespace
Martin Geisler <mg@lazybytes.net>
parents: 12748
diff changeset
   931
12536
208fc9ad6a48 alias: only allow global options before a shell alias, pass later ones through
Steve Losh <steve@stevelosh.com>
parents: 12276
diff changeset
   932
    Takes paths in [cwd]/.hg/hgrc into account."
208fc9ad6a48 alias: only allow global options before a shell alias, pass later ones through
Steve Losh <steve@stevelosh.com>
parents: 12276
diff changeset
   933
    """
49420
3681a47611b8 dispatch: change cwd when loading local config
Arun Kulshreshtha <akulshreshtha@janestreet.com>
parents: 49304
diff changeset
   934
    try:
3681a47611b8 dispatch: change cwd when loading local config
Arun Kulshreshtha <akulshreshtha@janestreet.com>
parents: 49304
diff changeset
   935
        cwd = encoding.getcwd()
3681a47611b8 dispatch: change cwd when loading local config
Arun Kulshreshtha <akulshreshtha@janestreet.com>
parents: 49304
diff changeset
   936
    except OSError as e:
3681a47611b8 dispatch: change cwd when loading local config
Arun Kulshreshtha <akulshreshtha@janestreet.com>
parents: 49304
diff changeset
   937
        raise error.Abort(
3681a47611b8 dispatch: change cwd when loading local config
Arun Kulshreshtha <akulshreshtha@janestreet.com>
parents: 49304
diff changeset
   938
            _(b"error getting current working directory: %s")
3681a47611b8 dispatch: change cwd when loading local config
Arun Kulshreshtha <akulshreshtha@janestreet.com>
parents: 49304
diff changeset
   939
            % encoding.strtolocal(e.strerror)
3681a47611b8 dispatch: change cwd when loading local config
Arun Kulshreshtha <akulshreshtha@janestreet.com>
parents: 49304
diff changeset
   940
        )
3681a47611b8 dispatch: change cwd when loading local config
Arun Kulshreshtha <akulshreshtha@janestreet.com>
parents: 49304
diff changeset
   941
3681a47611b8 dispatch: change cwd when loading local config
Arun Kulshreshtha <akulshreshtha@janestreet.com>
parents: 49304
diff changeset
   942
    # If using an alternate wd, temporarily switch to it so that relative
3681a47611b8 dispatch: change cwd when loading local config
Arun Kulshreshtha <akulshreshtha@janestreet.com>
parents: 49304
diff changeset
   943
    # paths are resolved correctly during config loading.
3681a47611b8 dispatch: change cwd when loading local config
Arun Kulshreshtha <akulshreshtha@janestreet.com>
parents: 49304
diff changeset
   944
    oldcwd = None
28263
59509c6724c7 dispatch: add wd parameter to _getlocal
Jun Wu <quark@fb.com>
parents: 28081
diff changeset
   945
    if wd is None:
49420
3681a47611b8 dispatch: change cwd when loading local config
Arun Kulshreshtha <akulshreshtha@janestreet.com>
parents: 49304
diff changeset
   946
        wd = cwd
3681a47611b8 dispatch: change cwd when loading local config
Arun Kulshreshtha <akulshreshtha@janestreet.com>
parents: 49304
diff changeset
   947
    else:
3681a47611b8 dispatch: change cwd when loading local config
Arun Kulshreshtha <akulshreshtha@janestreet.com>
parents: 49304
diff changeset
   948
        oldcwd = cwd
3681a47611b8 dispatch: change cwd when loading local config
Arun Kulshreshtha <akulshreshtha@janestreet.com>
parents: 49304
diff changeset
   949
        os.chdir(wd)
44244
ef11dfc56674 config: also respect HGRCSKIPREPO in `dispatch._getlocal`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 44017
diff changeset
   950
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   951
    path = cmdutil.findrepo(wd) or b""
5178
18a9fbb5cd78 dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
   952
    if not path:
18a9fbb5cd78 dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
   953
        lui = ui
9436
96379c93ba6f improve code readability
Andrey Somov <py4fun@gmail.com>
parents: 9411
diff changeset
   954
    else:
12636
c24215aa7e69 dispatch: remove superfluous try/except when reading local ui config
Brodie Rao <brodie@bitheap.org>
parents: 12633
diff changeset
   955
        lui = ui.copy()
44244
ef11dfc56674 config: also respect HGRCSKIPREPO in `dispatch._getlocal`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 44017
diff changeset
   956
        if rcutil.use_repo_hgrc():
52426
22129ce9f86d config: include the component level when returning them
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52424
diff changeset
   957
            for __, c_type, rc_path in rcutil.repo_components(path):
52424
e3b45916c375 config: return component from `repo_components`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52423
diff changeset
   958
                assert c_type == b'path'
52423
0b791c90280a repo-config: move rc component of repository inside `rcutil`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52422
diff changeset
   959
                lui.readconfig(rc_path, root=path)
5178
18a9fbb5cd78 dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
   960
35033
d3d35a55e03b dispatch: convert non-list option parsed by _earlygetopt() to string
Yuya Nishihara <yuya@tcha.org>
parents: 35032
diff changeset
   961
    if rpath:
52421
8ac33b3f2552 repo-config: clarify why we seems to parse the repository "twice"
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52416
diff changeset
   962
        # the specified path, might be defined in the [paths] section of the
8ac33b3f2552 repo-config: clarify why we seems to parse the repository "twice"
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52416
diff changeset
   963
        # local repository. So we had to read the local config first even if it
8ac33b3f2552 repo-config: clarify why we seems to parse the repository "twice"
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52416
diff changeset
   964
        # get overriden here.
49742
30eb36d93072 path: use `get_clone_path_obj` in _getlocal
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49420
diff changeset
   965
        path_obj = urlutil.get_clone_path_obj(lui, rpath)
30eb36d93072 path: use `get_clone_path_obj` in _getlocal
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49420
diff changeset
   966
        path = path_obj.rawloc
8190
9b8ac5fb7760 ui: kill most users of parentui name and arg, replace with .copy()
Matt Mackall <mpm@selenic.com>
parents: 8144
diff changeset
   967
        lui = ui.copy()
44244
ef11dfc56674 config: also respect HGRCSKIPREPO in `dispatch._getlocal`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 44017
diff changeset
   968
        if rcutil.use_repo_hgrc():
52426
22129ce9f86d config: include the component level when returning them
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52424
diff changeset
   969
            for __, c_type, rc_path in rcutil.repo_components(path):
52424
e3b45916c375 config: return component from `repo_components`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52423
diff changeset
   970
                assert c_type == b'path'
52423
0b791c90280a repo-config: move rc component of repository inside `rcutil`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52422
diff changeset
   971
                lui.readconfig(rc_path, root=path)
5178
18a9fbb5cd78 dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
   972
49420
3681a47611b8 dispatch: change cwd when loading local config
Arun Kulshreshtha <akulshreshtha@janestreet.com>
parents: 49304
diff changeset
   973
    if oldcwd:
3681a47611b8 dispatch: change cwd when loading local config
Arun Kulshreshtha <akulshreshtha@janestreet.com>
parents: 49304
diff changeset
   974
        os.chdir(oldcwd)
3681a47611b8 dispatch: change cwd when loading local config
Arun Kulshreshtha <akulshreshtha@janestreet.com>
parents: 49304
diff changeset
   975
12536
208fc9ad6a48 alias: only allow global options before a shell alias, pass later ones through
Steve Losh <steve@stevelosh.com>
parents: 12276
diff changeset
   976
    return path, lui
208fc9ad6a48 alias: only allow global options before a shell alias, pass later ones through
Steve Losh <steve@stevelosh.com>
parents: 12276
diff changeset
   977
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41193
diff changeset
   978
29132
12769703d4ba dispatch: always load extensions before running shell aliases (issue5230)
Jun Wu <quark@fb.com>
parents: 29129
diff changeset
   979
def _checkshellalias(lui, ui, args):
12769703d4ba dispatch: always load extensions before running shell aliases (issue5230)
Jun Wu <quark@fb.com>
parents: 29129
diff changeset
   980
    """Return the function to run the shell alias, if it is required"""
12536
208fc9ad6a48 alias: only allow global options before a shell alias, pass later ones through
Steve Losh <steve@stevelosh.com>
parents: 12276
diff changeset
   981
    options = {}
12748
d10369fefd01 alias: fail gracefully when invalid global options are given (issue2442)
Steve Losh <steve@stevelosh.com>
parents: 12637
diff changeset
   982
d10369fefd01 alias: fail gracefully when invalid global options are given (issue2442)
Steve Losh <steve@stevelosh.com>
parents: 12637
diff changeset
   983
    try:
d10369fefd01 alias: fail gracefully when invalid global options are given (issue2442)
Steve Losh <steve@stevelosh.com>
parents: 12637
diff changeset
   984
        args = fancyopts.fancyopts(args, commands.globalopts, options)
30576
541949a10a68 fancyopts: switch from fancyopts.getopt.* to getopt.*
Pulkit Goyal <7895pulkit@gmail.com>
parents: 30559
diff changeset
   985
    except getopt.GetoptError:
12748
d10369fefd01 alias: fail gracefully when invalid global options are given (issue2442)
Steve Losh <steve@stevelosh.com>
parents: 12637
diff changeset
   986
        return
12536
208fc9ad6a48 alias: only allow global options before a shell alias, pass later ones through
Steve Losh <steve@stevelosh.com>
parents: 12276
diff changeset
   987
208fc9ad6a48 alias: only allow global options before a shell alias, pass later ones through
Steve Losh <steve@stevelosh.com>
parents: 12276
diff changeset
   988
    if not args:
208fc9ad6a48 alias: only allow global options before a shell alias, pass later ones through
Steve Losh <steve@stevelosh.com>
parents: 12276
diff changeset
   989
        return
208fc9ad6a48 alias: only allow global options before a shell alias, pass later ones through
Steve Losh <steve@stevelosh.com>
parents: 12276
diff changeset
   990
29132
12769703d4ba dispatch: always load extensions before running shell aliases (issue5230)
Jun Wu <quark@fb.com>
parents: 29129
diff changeset
   991
    cmdtable = commands.table
12536
208fc9ad6a48 alias: only allow global options before a shell alias, pass later ones through
Steve Losh <steve@stevelosh.com>
parents: 12276
diff changeset
   992
208fc9ad6a48 alias: only allow global options before a shell alias, pass later ones through
Steve Losh <steve@stevelosh.com>
parents: 12276
diff changeset
   993
    cmd = args[0]
208fc9ad6a48 alias: only allow global options before a shell alias, pass later ones through
Steve Losh <steve@stevelosh.com>
parents: 12276
diff changeset
   994
    try:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   995
        strict = ui.configbool(b"ui", b"strict")
22377
f98abe3146b2 dispatch: check shell alias again after loading extensions (issue4355)
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 22376
diff changeset
   996
        aliases, entry = cmdutil.findcmd(cmd, cmdtable, strict)
12932
ab93029ab622 alias: fall back to normal error handling for ambigious commands (fixes issue2475)
Steve Losh <steve@stevelosh.com>
parents: 12831
diff changeset
   997
    except (error.AmbiguousCommand, error.UnknownCommand):
12536
208fc9ad6a48 alias: only allow global options before a shell alias, pass later ones through
Steve Losh <steve@stevelosh.com>
parents: 12276
diff changeset
   998
        return
208fc9ad6a48 alias: only allow global options before a shell alias, pass later ones through
Steve Losh <steve@stevelosh.com>
parents: 12276
diff changeset
   999
208fc9ad6a48 alias: only allow global options before a shell alias, pass later ones through
Steve Losh <steve@stevelosh.com>
parents: 12276
diff changeset
  1000
    cmd = aliases[0]
208fc9ad6a48 alias: only allow global options before a shell alias, pass later ones through
Steve Losh <steve@stevelosh.com>
parents: 12276
diff changeset
  1001
    fn = entry[0]
208fc9ad6a48 alias: only allow global options before a shell alias, pass later ones through
Steve Losh <steve@stevelosh.com>
parents: 12276
diff changeset
  1002
50925
d718eddf01d9 safehasattr: drop usage in favor of hasattr
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50570
diff changeset
  1003
    if cmd and hasattr(fn, 'shell'):
35034
02845f7441af dispatch: verify result of early command parsing
Yuya Nishihara <yuya@tcha.org>
parents: 35033
diff changeset
  1004
        # shell alias shouldn't receive early options which are consumed by hg
35225
7ce0ba3a1c32 dispatch: replace _earlygetopt(strip=True) with new parser
Yuya Nishihara <yuya@tcha.org>
parents: 35224
diff changeset
  1005
        _earlyopts, args = _earlysplitopts(args)
12536
208fc9ad6a48 alias: only allow global options before a shell alias, pass later ones through
Steve Losh <steve@stevelosh.com>
parents: 12276
diff changeset
  1006
        d = lambda: fn(ui, *args[1:])
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41193
diff changeset
  1007
        return lambda: runcommand(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41193
diff changeset
  1008
            lui, None, cmd, args[:1], ui, options, d, [], {}
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41193
diff changeset
  1009
        )
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41193
diff changeset
  1010
12536
208fc9ad6a48 alias: only allow global options before a shell alias, pass later ones through
Steve Losh <steve@stevelosh.com>
parents: 12276
diff changeset
  1011
14439
80c599eee3f3 dispatch: use the request to store the ui object
Idan Kamara <idankk86@gmail.com>
parents: 14438
diff changeset
  1012
def _dispatch(req):
14438
08bfec2ef031 dispatch: wrap dispatch related information in a request class
Idan Kamara <idankk86@gmail.com>
parents: 14286
diff changeset
  1013
    args = req.args
14439
80c599eee3f3 dispatch: use the request to store the ui object
Idan Kamara <idankk86@gmail.com>
parents: 14438
diff changeset
  1014
    ui = req.ui
80c599eee3f3 dispatch: use the request to store the ui object
Idan Kamara <idankk86@gmail.com>
parents: 14438
diff changeset
  1015
12536
208fc9ad6a48 alias: only allow global options before a shell alias, pass later ones through
Steve Losh <steve@stevelosh.com>
parents: 12276
diff changeset
  1016
    # check for cwd
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1017
    cwd = req.earlyoptions[b'cwd']
12536
208fc9ad6a48 alias: only allow global options before a shell alias, pass later ones through
Steve Losh <steve@stevelosh.com>
parents: 12276
diff changeset
  1018
    if cwd:
35033
d3d35a55e03b dispatch: convert non-list option parsed by _earlygetopt() to string
Yuya Nishihara <yuya@tcha.org>
parents: 35032
diff changeset
  1019
        os.chdir(cwd)
12536
208fc9ad6a48 alias: only allow global options before a shell alias, pass later ones through
Steve Losh <steve@stevelosh.com>
parents: 12276
diff changeset
  1020
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1021
    rpath = req.earlyoptions[b'repository']
12536
208fc9ad6a48 alias: only allow global options before a shell alias, pass later ones through
Steve Losh <steve@stevelosh.com>
parents: 12276
diff changeset
  1022
    path, lui = _getlocal(ui, rpath)
208fc9ad6a48 alias: only allow global options before a shell alias, pass later ones through
Steve Losh <steve@stevelosh.com>
parents: 12276
diff changeset
  1023
32291
bd872f64a8ba cleanup: use set literals
Martin von Zweigbergk <martinvonz@google.com>
parents: 32158
diff changeset
  1024
    uis = {ui, lui}
30933
69a3c6c8bf95 dispatch: move detection of profiling earlier during startup
Bryan O'Sullivan <bryano@fb.com>
parents: 30917
diff changeset
  1025
69a3c6c8bf95 dispatch: move detection of profiling earlier during startup
Bryan O'Sullivan <bryano@fb.com>
parents: 30917
diff changeset
  1026
    if req.repo:
69a3c6c8bf95 dispatch: move detection of profiling earlier during startup
Bryan O'Sullivan <bryano@fb.com>
parents: 30917
diff changeset
  1027
        uis.add(req.repo.ui)
69a3c6c8bf95 dispatch: move detection of profiling earlier during startup
Bryan O'Sullivan <bryano@fb.com>
parents: 30917
diff changeset
  1028
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41193
diff changeset
  1029
    if (
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1030
        req.earlyoptions[b'verbose']
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1031
        or req.earlyoptions[b'debug']
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1032
        or req.earlyoptions[b'quiet']
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41193
diff changeset
  1033
    ):
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1034
        for opt in (b'verbose', b'debug', b'quiet'):
38534
b86664c81833 debug: process --debug flag earlier
Boris Feld <boris.feld@octobus.net>
parents: 38110
diff changeset
  1035
            val = pycompat.bytestr(bool(req.earlyoptions[opt]))
b86664c81833 debug: process --debug flag earlier
Boris Feld <boris.feld@octobus.net>
parents: 38110
diff changeset
  1036
            for ui_ in uis:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1037
                ui_.setconfig(b'ui', opt, val, b'--' + opt)
38534
b86664c81833 debug: process --debug flag earlier
Boris Feld <boris.feld@octobus.net>
parents: 38110
diff changeset
  1038
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1039
    if req.earlyoptions[b'profile']:
30933
69a3c6c8bf95 dispatch: move detection of profiling earlier during startup
Bryan O'Sullivan <bryano@fb.com>
parents: 30917
diff changeset
  1040
        for ui_ in uis:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1041
            ui_.setconfig(b'profiling', b'enabled', b'true', b'--profile')
47023
a2bf93ab3014 profiling: add --no-profile to disable profiling enabled via config
Kyle Lippincott <spectral@google.com>
parents: 46957
diff changeset
  1042
    elif req.earlyoptions[b'profile'] is False:
a2bf93ab3014 profiling: add --no-profile to disable profiling enabled via config
Kyle Lippincott <spectral@google.com>
parents: 46957
diff changeset
  1043
        # Check for it being set already, so that we don't pollute the config
a2bf93ab3014 profiling: add --no-profile to disable profiling enabled via config
Kyle Lippincott <spectral@google.com>
parents: 46957
diff changeset
  1044
        # with this when using chg in the very common case that it's not
a2bf93ab3014 profiling: add --no-profile to disable profiling enabled via config
Kyle Lippincott <spectral@google.com>
parents: 46957
diff changeset
  1045
        # enabled.
a2bf93ab3014 profiling: add --no-profile to disable profiling enabled via config
Kyle Lippincott <spectral@google.com>
parents: 46957
diff changeset
  1046
        if lui.configbool(b'profiling', b'enabled'):
a2bf93ab3014 profiling: add --no-profile to disable profiling enabled via config
Kyle Lippincott <spectral@google.com>
parents: 46957
diff changeset
  1047
            # Only do this on lui so that `chg foo` with a user config setting
a2bf93ab3014 profiling: add --no-profile to disable profiling enabled via config
Kyle Lippincott <spectral@google.com>
parents: 46957
diff changeset
  1048
            # profiling.enabled=1 still shows profiling information (chg will
a2bf93ab3014 profiling: add --no-profile to disable profiling enabled via config
Kyle Lippincott <spectral@google.com>
parents: 46957
diff changeset
  1049
            # specify `--no-profile` when `hg serve` is starting up, we don't
a2bf93ab3014 profiling: add --no-profile to disable profiling enabled via config
Kyle Lippincott <spectral@google.com>
parents: 46957
diff changeset
  1050
            # want that to propagate to every later invocation).
a2bf93ab3014 profiling: add --no-profile to disable profiling enabled via config
Kyle Lippincott <spectral@google.com>
parents: 46957
diff changeset
  1051
            lui.setconfig(b'profiling', b'enabled', b'false', b'--no-profile')
30933
69a3c6c8bf95 dispatch: move detection of profiling earlier during startup
Bryan O'Sullivan <bryano@fb.com>
parents: 30917
diff changeset
  1052
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1053
    profile = lui.configbool(b'profiling', b'enabled')
32788
eede022fc142 profile: drop maybeprofile
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 32787
diff changeset
  1054
    with profiling.profile(lui, enabled=profile) as profiler:
30934
6d642ecf1a89 dispatch: start profiling earlier
Bryan O'Sullivan <bryano@fb.com>
parents: 30933
diff changeset
  1055
        # Configure extensions in phases: uisetup, extsetup, cmdtable, and
33053
ef46d432e2e4 dispatch: remove unused _loaded
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 33052
diff changeset
  1056
        # reposetup
30934
6d642ecf1a89 dispatch: start profiling earlier
Bryan O'Sullivan <bryano@fb.com>
parents: 30933
diff changeset
  1057
        extensions.loadall(lui)
6d642ecf1a89 dispatch: start profiling earlier
Bryan O'Sullivan <bryano@fb.com>
parents: 30933
diff changeset
  1058
        # Propagate any changes to lui.__class__ by extensions
6d642ecf1a89 dispatch: start profiling earlier
Bryan O'Sullivan <bryano@fb.com>
parents: 30933
diff changeset
  1059
        ui.__class__ = lui.__class__
5828
863e237b58fb dispatch: allow extensions to provide setup code
Kirill Smelkov <kirr@mns.spb.ru>
parents: 5664
diff changeset
  1060
30934
6d642ecf1a89 dispatch: start profiling earlier
Bryan O'Sullivan <bryano@fb.com>
parents: 30933
diff changeset
  1061
        # (uisetup and extsetup are handled in extensions.loadall)
5828
863e237b58fb dispatch: allow extensions to provide setup code
Kirill Smelkov <kirr@mns.spb.ru>
parents: 5664
diff changeset
  1062
30934
6d642ecf1a89 dispatch: start profiling earlier
Bryan O'Sullivan <bryano@fb.com>
parents: 30933
diff changeset
  1063
        # (reposetup is handled in hg.repository)
9410
1c83938b6a8e extensions: load and configure extensions in well-defined phases
Martin Geisler <mg@lazybytes.net>
parents: 8936
diff changeset
  1064
30934
6d642ecf1a89 dispatch: start profiling earlier
Bryan O'Sullivan <bryano@fb.com>
parents: 30933
diff changeset
  1065
        addaliases(lui, commands.table)
8655
21688b8a594b Move alias into core
Brendan Cully <brendan@kublai.com>
parents: 8304
diff changeset
  1066
30934
6d642ecf1a89 dispatch: start profiling earlier
Bryan O'Sullivan <bryano@fb.com>
parents: 30933
diff changeset
  1067
        # All aliases and commands are completely defined, now.
6d642ecf1a89 dispatch: start profiling earlier
Bryan O'Sullivan <bryano@fb.com>
parents: 30933
diff changeset
  1068
        # Check abbreviation/ambiguity of shell alias.
6d642ecf1a89 dispatch: start profiling earlier
Bryan O'Sullivan <bryano@fb.com>
parents: 30933
diff changeset
  1069
        shellaliasfn = _checkshellalias(lui, ui, args)
6d642ecf1a89 dispatch: start profiling earlier
Bryan O'Sullivan <bryano@fb.com>
parents: 30933
diff changeset
  1070
        if shellaliasfn:
40729
c93d046d4300 extensions: add "uipopulate" hook, called per instance, not per process
Yuya Nishihara <yuya@tcha.org>
parents: 40651
diff changeset
  1071
            # no additional configs will be set, set up the ui instances
c93d046d4300 extensions: add "uipopulate" hook, called per instance, not per process
Yuya Nishihara <yuya@tcha.org>
parents: 40651
diff changeset
  1072
            for ui_ in uis:
c93d046d4300 extensions: add "uipopulate" hook, called per instance, not per process
Yuya Nishihara <yuya@tcha.org>
parents: 40651
diff changeset
  1073
                extensions.populateui(ui_)
30006
b19c2679289c dispatch: make hg --profile wrap reposetup
Arun Kulshreshtha <kulshrax@fb.com>
parents: 30005
diff changeset
  1074
            return shellaliasfn()
22377
f98abe3146b2 dispatch: check shell alias again after loading extensions (issue4355)
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 22376
diff changeset
  1075
30934
6d642ecf1a89 dispatch: start profiling earlier
Bryan O'Sullivan <bryano@fb.com>
parents: 30933
diff changeset
  1076
        # check for fallback encoding
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1077
        fallback = lui.config(b'ui', b'fallbackencoding')
30934
6d642ecf1a89 dispatch: start profiling earlier
Bryan O'Sullivan <bryano@fb.com>
parents: 30933
diff changeset
  1078
        if fallback:
6d642ecf1a89 dispatch: start profiling earlier
Bryan O'Sullivan <bryano@fb.com>
parents: 30933
diff changeset
  1079
            encoding.fallbackencoding = fallback
5178
18a9fbb5cd78 dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
  1080
30934
6d642ecf1a89 dispatch: start profiling earlier
Bryan O'Sullivan <bryano@fb.com>
parents: 30933
diff changeset
  1081
        fullargs = args
6d642ecf1a89 dispatch: start profiling earlier
Bryan O'Sullivan <bryano@fb.com>
parents: 30933
diff changeset
  1082
        cmd, func, args, options, cmdoptions = _parse(lui, args)
5178
18a9fbb5cd78 dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
  1083
40402
106adc261492 logtoprocess: sends the canonical command name to the subprocess
Boris Feld <boris.feld@octobus.net>
parents: 39818
diff changeset
  1084
        # store the canonical command name in request object for later access
106adc261492 logtoprocess: sends the canonical command name to the subprocess
Boris Feld <boris.feld@octobus.net>
parents: 39818
diff changeset
  1085
        req.canonical_command = cmd
106adc261492 logtoprocess: sends the canonical command name to the subprocess
Boris Feld <boris.feld@octobus.net>
parents: 39818
diff changeset
  1086
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1087
        if options[b"config"] != req.earlyoptions[b"config"]:
45918
ac565222b9f8 errors: raise InputError on bad top-level flags
Martin von Zweigbergk <martinvonz@google.com>
parents: 45914
diff changeset
  1088
            raise error.InputError(_(b"option --config may not be abbreviated"))
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1089
        if options[b"cwd"] != req.earlyoptions[b"cwd"]:
45918
ac565222b9f8 errors: raise InputError on bad top-level flags
Martin von Zweigbergk <martinvonz@google.com>
parents: 45914
diff changeset
  1090
            raise error.InputError(_(b"option --cwd may not be abbreviated"))
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1091
        if options[b"repository"] != req.earlyoptions[b"repository"]:
45918
ac565222b9f8 errors: raise InputError on bad top-level flags
Martin von Zweigbergk <martinvonz@google.com>
parents: 45914
diff changeset
  1092
            raise error.InputError(
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41193
diff changeset
  1093
                _(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1094
                    b"option -R has to be separated from other options (e.g. not "
45909
ca39c45014fa errors: remove trailing "!" in messages about bad top-level args
Martin von Zweigbergk <martinvonz@google.com>
parents: 45887
diff changeset
  1095
                    b"-qR) and --repository may only be abbreviated as --repo"
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41193
diff changeset
  1096
                )
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41193
diff changeset
  1097
            )
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1098
        if options[b"debugger"] != req.earlyoptions[b"debugger"]:
45918
ac565222b9f8 errors: raise InputError on bad top-level flags
Martin von Zweigbergk <martinvonz@google.com>
parents: 45914
diff changeset
  1099
            raise error.InputError(
ac565222b9f8 errors: raise InputError on bad top-level flags
Martin von Zweigbergk <martinvonz@google.com>
parents: 45914
diff changeset
  1100
                _(b"option --debugger may not be abbreviated")
ac565222b9f8 errors: raise InputError on bad top-level flags
Martin von Zweigbergk <martinvonz@google.com>
parents: 45914
diff changeset
  1101
            )
35030
d9aba3730d30 dispatch: abort if early boolean options can't be parsed
Yuya Nishihara <yuya@tcha.org>
parents: 35029
diff changeset
  1102
        # don't validate --profile/--traceback, which can be enabled from now
5178
18a9fbb5cd78 dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
  1103
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1104
        if options[b"encoding"]:
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1105
            encoding.encoding = options[b"encoding"]
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1106
        if options[b"encodingmode"]:
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1107
            encoding.encodingmode = options[b"encodingmode"]
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1108
        if options[b"time"]:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41193
diff changeset
  1109
30934
6d642ecf1a89 dispatch: start profiling earlier
Bryan O'Sullivan <bryano@fb.com>
parents: 30933
diff changeset
  1110
            def get_times():
6d642ecf1a89 dispatch: start profiling earlier
Bryan O'Sullivan <bryano@fb.com>
parents: 30933
diff changeset
  1111
                t = os.times()
6d642ecf1a89 dispatch: start profiling earlier
Bryan O'Sullivan <bryano@fb.com>
parents: 30933
diff changeset
  1112
                if t[4] == 0.0:
44017
6b90f5c89cb4 py3: replace `time.clock()` with `time.perf_counter()`
Matt Harbison <matt_harbison@yahoo.com>
parents: 43787
diff changeset
  1113
                    # Windows leaves this as zero, so use time.perf_counter()
6b90f5c89cb4 py3: replace `time.clock()` with `time.perf_counter()`
Matt Harbison <matt_harbison@yahoo.com>
parents: 43787
diff changeset
  1114
                    t = (t[0], t[1], t[2], t[3], util.timer())
30934
6d642ecf1a89 dispatch: start profiling earlier
Bryan O'Sullivan <bryano@fb.com>
parents: 30933
diff changeset
  1115
                return t
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41193
diff changeset
  1116
30934
6d642ecf1a89 dispatch: start profiling earlier
Bryan O'Sullivan <bryano@fb.com>
parents: 30933
diff changeset
  1117
            s = get_times()
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41193
diff changeset
  1118
30934
6d642ecf1a89 dispatch: start profiling earlier
Bryan O'Sullivan <bryano@fb.com>
parents: 30933
diff changeset
  1119
            def print_time():
6d642ecf1a89 dispatch: start profiling earlier
Bryan O'Sullivan <bryano@fb.com>
parents: 30933
diff changeset
  1120
                t = get_times()
6d642ecf1a89 dispatch: start profiling earlier
Bryan O'Sullivan <bryano@fb.com>
parents: 30933
diff changeset
  1121
                ui.warn(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1122
                    _(b"time: real %.3f secs (user %.3f+%.3f sys %.3f+%.3f)\n")
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41193
diff changeset
  1123
                    % (
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41193
diff changeset
  1124
                        t[4] - s[4],
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41193
diff changeset
  1125
                        t[0] - s[0],
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41193
diff changeset
  1126
                        t[2] - s[2],
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41193
diff changeset
  1127
                        t[1] - s[1],
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41193
diff changeset
  1128
                        t[3] - s[3],
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41193
diff changeset
  1129
                    )
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41193
diff changeset
  1130
                )
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41193
diff changeset
  1131
31958
de5c9d0e02ea atexit: switch to home-grown implementation
Bryan O'Sullivan <bryano@fb.com>
parents: 31956
diff changeset
  1132
            ui.atexit(print_time)
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1133
        if options[b"profile"]:
32787
545f69cd6042 profile: support --profile in alias and abbreviated version (--prof)
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 32687
diff changeset
  1134
            profiler.start()
5178
18a9fbb5cd78 dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
  1135
38534
b86664c81833 debug: process --debug flag earlier
Boris Feld <boris.feld@octobus.net>
parents: 38110
diff changeset
  1136
        # if abbreviated version of this were used, take them in account, now
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1137
        if options[b'verbose'] or options[b'debug'] or options[b'quiet']:
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1138
            for opt in (b'verbose', b'debug', b'quiet'):
38534
b86664c81833 debug: process --debug flag earlier
Boris Feld <boris.feld@octobus.net>
parents: 38110
diff changeset
  1139
                if options[opt] == req.earlyoptions[opt]:
b86664c81833 debug: process --debug flag earlier
Boris Feld <boris.feld@octobus.net>
parents: 38110
diff changeset
  1140
                    continue
35898
a2b3b5c5a25a py3: replace "if ispy3" by pycompat.bytestr()
Yuya Nishihara <yuya@tcha.org>
parents: 35653
diff changeset
  1141
                val = pycompat.bytestr(bool(options[opt]))
30934
6d642ecf1a89 dispatch: start profiling earlier
Bryan O'Sullivan <bryano@fb.com>
parents: 30933
diff changeset
  1142
                for ui_ in uis:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1143
                    ui_.setconfig(b'ui', opt, val, b'--' + opt)
30934
6d642ecf1a89 dispatch: start profiling earlier
Bryan O'Sullivan <bryano@fb.com>
parents: 30933
diff changeset
  1144
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1145
        if options[b'traceback']:
14752
99ace3cb7352 dispatch: set global options on the request repo.ui
Idan Kamara <idankk86@gmail.com>
parents: 14748
diff changeset
  1146
            for ui_ in uis:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1147
                ui_.setconfig(b'ui', b'traceback', b'on', b'--traceback')
14992
188936b334b1 dispatch: make sure global options on the command line take precedence
Idan Kamara <idankk86@gmail.com>
parents: 14914
diff changeset
  1148
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1149
        if options[b'noninteractive']:
30934
6d642ecf1a89 dispatch: start profiling earlier
Bryan O'Sullivan <bryano@fb.com>
parents: 30933
diff changeset
  1150
            for ui_ in uis:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1151
                ui_.setconfig(b'ui', b'interactive', b'off', b'-y')
5178
18a9fbb5cd78 dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
  1152
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1153
        if cmdoptions.get(b'insecure', False):
30934
6d642ecf1a89 dispatch: start profiling earlier
Bryan O'Sullivan <bryano@fb.com>
parents: 30933
diff changeset
  1154
            for ui_ in uis:
6d642ecf1a89 dispatch: start profiling earlier
Bryan O'Sullivan <bryano@fb.com>
parents: 30933
diff changeset
  1155
                ui_.insecureconnections = True
13328
a939f08fae9c url: add --insecure option to bypass verification of ssl certificates
Yuya Nishihara <yuya@tcha.org>
parents: 12932
diff changeset
  1156
32383
f928d53b687c dispatch: setup color before pager for correct console information on windows
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 32054
diff changeset
  1157
        # setup color handling before pager, because setting up pager
f928d53b687c dispatch: setup color before pager for correct console information on windows
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 32054
diff changeset
  1158
        # might cause incorrect console information
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1159
        coloropt = options[b'color']
31105
45be7590301d color: move triggering of the initialisation logic in core
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 31060
diff changeset
  1160
        for ui_ in uis:
31110
7fec37746417 color: add a 'ui.color' option to control color behavior
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 31105
diff changeset
  1161
            if coloropt:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1162
                ui_.setconfig(b'ui', b'color', coloropt, b'--color')
31110
7fec37746417 color: add a 'ui.color' option to control color behavior
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 31105
diff changeset
  1163
            color.setup(ui_)
31105
45be7590301d color: move triggering of the initialisation logic in core
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 31060
diff changeset
  1164
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1165
        if stringutil.parsebool(options[b'pager']):
33620
cc047a733f69 ui: enable pager always for explicit --pager=on (issue5580)
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 33499
diff changeset
  1166
            # ui.pager() expects 'internal-always-' prefix in this case
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1167
            ui.pager(b'internal-always-' + cmd)
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1168
        elif options[b'pager'] != b'auto':
34638
021607b4ef49 dispatch: when --pager=no is passed, also disable pager on req.repo.ui
Jun Wu <quark@fb.com>
parents: 34533
diff changeset
  1169
            for ui_ in uis:
021607b4ef49 dispatch: when --pager=no is passed, also disable pager on req.repo.ui
Jun Wu <quark@fb.com>
parents: 34533
diff changeset
  1170
                ui_.disablepager()
32383
f928d53b687c dispatch: setup color before pager for correct console information on windows
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 32054
diff changeset
  1171
40729
c93d046d4300 extensions: add "uipopulate" hook, called per instance, not per process
Yuya Nishihara <yuya@tcha.org>
parents: 40651
diff changeset
  1172
        # configs are fully loaded, set up the ui instances
c93d046d4300 extensions: add "uipopulate" hook, called per instance, not per process
Yuya Nishihara <yuya@tcha.org>
parents: 40651
diff changeset
  1173
        for ui_ in uis:
c93d046d4300 extensions: add "uipopulate" hook, called per instance, not per process
Yuya Nishihara <yuya@tcha.org>
parents: 40651
diff changeset
  1174
            extensions.populateui(ui_)
c93d046d4300 extensions: add "uipopulate" hook, called per instance, not per process
Yuya Nishihara <yuya@tcha.org>
parents: 40651
diff changeset
  1175
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1176
        if options[b'version']:
30934
6d642ecf1a89 dispatch: start profiling earlier
Bryan O'Sullivan <bryano@fb.com>
parents: 30933
diff changeset
  1177
            return commands.version_(ui)
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1178
        if options[b'help']:
30934
6d642ecf1a89 dispatch: start profiling earlier
Bryan O'Sullivan <bryano@fb.com>
parents: 30933
diff changeset
  1179
            return commands.help_(ui, cmd, command=cmd is not None)
6d642ecf1a89 dispatch: start profiling earlier
Bryan O'Sullivan <bryano@fb.com>
parents: 30933
diff changeset
  1180
        elif not cmd:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1181
            return commands.help_(ui, b'shortlist')
5178
18a9fbb5cd78 dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
  1182
30005
dfd97e60044c dispatch: change indentation level in _dispatch()
Arun Kulshreshtha <kulshrax@fb.com>
parents: 29884
diff changeset
  1183
        repo = None
dfd97e60044c dispatch: change indentation level in _dispatch()
Arun Kulshreshtha <kulshrax@fb.com>
parents: 29884
diff changeset
  1184
        cmdpats = args[:]
43706
ac8fd215a776 dispatch: add some assertions to give pytype a helping hand
Augie Fackler <augie@google.com>
parents: 43506
diff changeset
  1185
        assert func is not None  # help out pytype
30485
acd30a959980 dispatch: stop supporting non-use of @command
Augie Fackler <augie@google.com>
parents: 30473
diff changeset
  1186
        if not func.norepo:
30005
dfd97e60044c dispatch: change indentation level in _dispatch()
Arun Kulshreshtha <kulshrax@fb.com>
parents: 29884
diff changeset
  1187
            # use the repo from the request only if we don't have -R
dfd97e60044c dispatch: change indentation level in _dispatch()
Arun Kulshreshtha <kulshrax@fb.com>
parents: 29884
diff changeset
  1188
            if not rpath and not cwd:
dfd97e60044c dispatch: change indentation level in _dispatch()
Arun Kulshreshtha <kulshrax@fb.com>
parents: 29884
diff changeset
  1189
                repo = req.repo
14510
eccbb9980ada dispatch: add repo to the request
Idan Kamara <idankk86@gmail.com>
parents: 14439
diff changeset
  1190
30005
dfd97e60044c dispatch: change indentation level in _dispatch()
Arun Kulshreshtha <kulshrax@fb.com>
parents: 29884
diff changeset
  1191
            if repo:
dfd97e60044c dispatch: change indentation level in _dispatch()
Arun Kulshreshtha <kulshrax@fb.com>
parents: 29884
diff changeset
  1192
                # set the descriptors of the repo ui to those of ui
dfd97e60044c dispatch: change indentation level in _dispatch()
Arun Kulshreshtha <kulshrax@fb.com>
parents: 29884
diff changeset
  1193
                repo.ui.fin = ui.fin
dfd97e60044c dispatch: change indentation level in _dispatch()
Arun Kulshreshtha <kulshrax@fb.com>
parents: 29884
diff changeset
  1194
                repo.ui.fout = ui.fout
dfd97e60044c dispatch: change indentation level in _dispatch()
Arun Kulshreshtha <kulshrax@fb.com>
parents: 29884
diff changeset
  1195
                repo.ui.ferr = ui.ferr
40587
5542bc9125c9 dispatch: pass around ui.fmsg channel
Yuya Nishihara <yuya@tcha.org>
parents: 40414
diff changeset
  1196
                repo.ui.fmsg = ui.fmsg
30005
dfd97e60044c dispatch: change indentation level in _dispatch()
Arun Kulshreshtha <kulshrax@fb.com>
parents: 29884
diff changeset
  1197
            else:
dfd97e60044c dispatch: change indentation level in _dispatch()
Arun Kulshreshtha <kulshrax@fb.com>
parents: 29884
diff changeset
  1198
                try:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41193
diff changeset
  1199
                    repo = hg.repository(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41193
diff changeset
  1200
                        ui,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41193
diff changeset
  1201
                        path=path,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41193
diff changeset
  1202
                        presetupfuncs=req.prereposetups,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41193
diff changeset
  1203
                        intents=func.intents,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41193
diff changeset
  1204
                    )
30005
dfd97e60044c dispatch: change indentation level in _dispatch()
Arun Kulshreshtha <kulshrax@fb.com>
parents: 29884
diff changeset
  1205
                    if not repo.local():
45911
8939062597f0 errors: raise InputError on bad repo arguments
Martin von Zweigbergk <martinvonz@google.com>
parents: 45909
diff changeset
  1206
                        raise error.InputError(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1207
                            _(b"repository '%s' is not local") % path
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41193
diff changeset
  1208
                        )
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41193
diff changeset
  1209
                    repo.ui.setconfig(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1210
                        b"bundle", b"mainreporoot", repo.root, b'repo'
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41193
diff changeset
  1211
                    )
30005
dfd97e60044c dispatch: change indentation level in _dispatch()
Arun Kulshreshtha <kulshrax@fb.com>
parents: 29884
diff changeset
  1212
                except error.RequirementError:
26142
7332bf4ae959 dispatch: error out on invalid -R path even if optionalrepo (issue4805) (BC)
Yuya Nishihara <yuya@tcha.org>
parents: 25932
diff changeset
  1213
                    raise
30005
dfd97e60044c dispatch: change indentation level in _dispatch()
Arun Kulshreshtha <kulshrax@fb.com>
parents: 29884
diff changeset
  1214
                except error.RepoError:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41193
diff changeset
  1215
                    if rpath:  # invalid -R path
30005
dfd97e60044c dispatch: change indentation level in _dispatch()
Arun Kulshreshtha <kulshrax@fb.com>
parents: 29884
diff changeset
  1216
                        raise
30485
acd30a959980 dispatch: stop supporting non-use of @command
Augie Fackler <augie@google.com>
parents: 30473
diff changeset
  1217
                    if not func.optionalrepo:
acd30a959980 dispatch: stop supporting non-use of @command
Augie Fackler <augie@google.com>
parents: 30473
diff changeset
  1218
                        if func.inferrepo and args and not path:
30005
dfd97e60044c dispatch: change indentation level in _dispatch()
Arun Kulshreshtha <kulshrax@fb.com>
parents: 29884
diff changeset
  1219
                            # try to infer -R from command args
35149
e6487522ef92 py3: use pycompat.maplist() instead of map()
Pulkit Goyal <7895pulkit@gmail.com>
parents: 35145
diff changeset
  1220
                            repos = pycompat.maplist(cmdutil.findrepo, args)
30005
dfd97e60044c dispatch: change indentation level in _dispatch()
Arun Kulshreshtha <kulshrax@fb.com>
parents: 29884
diff changeset
  1221
                            guess = repos[0]
dfd97e60044c dispatch: change indentation level in _dispatch()
Arun Kulshreshtha <kulshrax@fb.com>
parents: 29884
diff changeset
  1222
                            if guess and repos.count(guess) == len(repos):
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1223
                                req.args = [b'--repository', guess] + fullargs
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1224
                                req.earlyoptions[b'repository'] = guess
30005
dfd97e60044c dispatch: change indentation level in _dispatch()
Arun Kulshreshtha <kulshrax@fb.com>
parents: 29884
diff changeset
  1225
                                return _dispatch(req)
dfd97e60044c dispatch: change indentation level in _dispatch()
Arun Kulshreshtha <kulshrax@fb.com>
parents: 29884
diff changeset
  1226
                        if not path:
45911
8939062597f0 errors: raise InputError on bad repo arguments
Martin von Zweigbergk <martinvonz@google.com>
parents: 45909
diff changeset
  1227
                            raise error.InputError(
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41193
diff changeset
  1228
                                _(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1229
                                    b"no repository found in"
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1230
                                    b" '%s' (.hg not found)"
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41193
diff changeset
  1231
                                )
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41193
diff changeset
  1232
                                % encoding.getcwd()
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41193
diff changeset
  1233
                            )
30005
dfd97e60044c dispatch: change indentation level in _dispatch()
Arun Kulshreshtha <kulshrax@fb.com>
parents: 29884
diff changeset
  1234
                        raise
dfd97e60044c dispatch: change indentation level in _dispatch()
Arun Kulshreshtha <kulshrax@fb.com>
parents: 29884
diff changeset
  1235
            if repo:
dfd97e60044c dispatch: change indentation level in _dispatch()
Arun Kulshreshtha <kulshrax@fb.com>
parents: 29884
diff changeset
  1236
                ui = repo.ui
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1237
                if options[b'hidden']:
30005
dfd97e60044c dispatch: change indentation level in _dispatch()
Arun Kulshreshtha <kulshrax@fb.com>
parents: 29884
diff changeset
  1238
                    repo = repo.unfiltered()
dfd97e60044c dispatch: change indentation level in _dispatch()
Arun Kulshreshtha <kulshrax@fb.com>
parents: 29884
diff changeset
  1239
            args.insert(0, repo)
dfd97e60044c dispatch: change indentation level in _dispatch()
Arun Kulshreshtha <kulshrax@fb.com>
parents: 29884
diff changeset
  1240
        elif rpath:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1241
            ui.warn(_(b"warning: --repository ignored\n"))
7388
5751631246de dispatch: generalize signature checking for extension command wrapping
Matt Mackall <mpm@selenic.com>
parents: 7280
diff changeset
  1242
31492
3c77414a0f9c dispatch: consolidate formatting of arguments
Augie Fackler <augie@google.com>
parents: 31491
diff changeset
  1243
        msg = _formatargs(fullargs)
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1244
        ui.log(b"command", b'%s\n', msg)
30586
2d555d753f0e py3: make keys of keyword arguments strings
Pulkit Goyal <7895pulkit@gmail.com>
parents: 30576
diff changeset
  1245
        strcmdopt = pycompat.strkwargs(cmdoptions)
2d555d753f0e py3: make keys of keyword arguments strings
Pulkit Goyal <7895pulkit@gmail.com>
parents: 30576
diff changeset
  1246
        d = lambda: util.checksignature(func)(ui, *args, **strcmdopt)
30005
dfd97e60044c dispatch: change indentation level in _dispatch()
Arun Kulshreshtha <kulshrax@fb.com>
parents: 29884
diff changeset
  1247
        try:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41193
diff changeset
  1248
            return runcommand(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41193
diff changeset
  1249
                lui, repo, cmd, fullargs, ui, options, d, cmdpats, cmdoptions
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41193
diff changeset
  1250
            )
30005
dfd97e60044c dispatch: change indentation level in _dispatch()
Arun Kulshreshtha <kulshrax@fb.com>
parents: 29884
diff changeset
  1251
        finally:
dfd97e60044c dispatch: change indentation level in _dispatch()
Arun Kulshreshtha <kulshrax@fb.com>
parents: 29884
diff changeset
  1252
            if repo and repo != req.repo:
dfd97e60044c dispatch: change indentation level in _dispatch()
Arun Kulshreshtha <kulshrax@fb.com>
parents: 29884
diff changeset
  1253
                repo.close()
5178
18a9fbb5cd78 dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
  1254
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41193
diff changeset
  1255
5178
18a9fbb5cd78 dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
  1256
def _runcommand(ui, options, cmd, cmdfunc):
29784
e3501546f7e4 profiling: add a context manager that no-ops if profiling isn't enabled
Gregory Szorc <gregory.szorc@gmail.com>
parents: 29783
diff changeset
  1257
    """Run a command function, possibly with profiling enabled."""
30006
b19c2679289c dispatch: make hg --profile wrap reposetup
Arun Kulshreshtha <kulshrax@fb.com>
parents: 30005
diff changeset
  1258
    try:
43238
101ae8bbfa02 cleanup: hgdemandimport.tracing accepts strings, not bytes
Augie Fackler <augie@google.com>
parents: 43117
diff changeset
  1259
        with tracing.log("Running %s command" % cmd):
39512
ec0a2601bc76 tracing: trace command function execution
Boris Feld <boris.feld@octobus.net>
parents: 39255
diff changeset
  1260
            return cmdfunc()
30006
b19c2679289c dispatch: make hg --profile wrap reposetup
Arun Kulshreshtha <kulshrax@fb.com>
parents: 30005
diff changeset
  1261
    except error.SignatureError:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1262
        raise error.CommandError(cmd, _(b'invalid arguments'))
28784
09750b1231c2 dispatch: factor out command failure handling into a function
Martijn Pieters <mjpieters@fb.com>
parents: 28695
diff changeset
  1263
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41193
diff changeset
  1264
28821
d3369dc6c1d0 dispatch: split out warning message generation to separate function
Martijn Pieters <mjpieters@fb.com>
parents: 28784
diff changeset
  1265
def _exceptionwarning(ui):
d3369dc6c1d0 dispatch: split out warning message generation to separate function
Martijn Pieters <mjpieters@fb.com>
parents: 28784
diff changeset
  1266
    """Produce a warning message for the current active exception"""
28784
09750b1231c2 dispatch: factor out command failure handling into a function
Martijn Pieters <mjpieters@fb.com>
parents: 28695
diff changeset
  1267
09750b1231c2 dispatch: factor out command failure handling into a function
Martijn Pieters <mjpieters@fb.com>
parents: 28695
diff changeset
  1268
    # For compatibility checking, we discard the portion of the hg
09750b1231c2 dispatch: factor out command failure handling into a function
Martijn Pieters <mjpieters@fb.com>
parents: 28695
diff changeset
  1269
    # version after the + on the assumption that if a "normal
09750b1231c2 dispatch: factor out command failure handling into a function
Martijn Pieters <mjpieters@fb.com>
parents: 28695
diff changeset
  1270
    # user" is running a build with a + in it the packager
09750b1231c2 dispatch: factor out command failure handling into a function
Martijn Pieters <mjpieters@fb.com>
parents: 28695
diff changeset
  1271
    # probably built from fairly close to a tag and anyone with a
09750b1231c2 dispatch: factor out command failure handling into a function
Martijn Pieters <mjpieters@fb.com>
parents: 28695
diff changeset
  1272
    # 'make local' copy of hg (where the version number can be out
09750b1231c2 dispatch: factor out command failure handling into a function
Martijn Pieters <mjpieters@fb.com>
parents: 28695
diff changeset
  1273
    # of date) will be clueful enough to notice the implausible
09750b1231c2 dispatch: factor out command failure handling into a function
Martijn Pieters <mjpieters@fb.com>
parents: 28695
diff changeset
  1274
    # version number and try updating.
09750b1231c2 dispatch: factor out command failure handling into a function
Martijn Pieters <mjpieters@fb.com>
parents: 28695
diff changeset
  1275
    ct = util.versiontuple(n=2)
45951
c26cb33e5219 dispatch: print the version of the extension being blamed in a bug report
Matt Harbison <matt_harbison@yahoo.com>
parents: 45942
diff changeset
  1276
    worst = None, ct, b'', b''
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1277
    if ui.config(b'ui', b'supportcontact') is None:
28784
09750b1231c2 dispatch: factor out command failure handling into a function
Martijn Pieters <mjpieters@fb.com>
parents: 28695
diff changeset
  1278
        for name, mod in extensions.extensions():
35899
d5457d94e1c9 py3: replace "if ispy3" by pycompat.sysbytes() or util.forcebytestr()
Yuya Nishihara <yuya@tcha.org>
parents: 35898
diff changeset
  1279
            # 'testedwith' should be bytes, but not all extensions are ported
d5457d94e1c9 py3: replace "if ispy3" by pycompat.sysbytes() or util.forcebytestr()
Yuya Nishihara <yuya@tcha.org>
parents: 35898
diff changeset
  1280
            # to py3 and we don't want UnicodeException because of that.
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1281
            testedwith = stringutil.forcebytestr(
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1282
                getattr(mod, 'testedwith', b'')
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1283
            )
45951
c26cb33e5219 dispatch: print the version of the extension being blamed in a bug report
Matt Harbison <matt_harbison@yahoo.com>
parents: 45942
diff changeset
  1284
            version = extensions.moduleversion(mod)
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1285
            report = getattr(mod, 'buglink', _(b'the extension author.'))
28784
09750b1231c2 dispatch: factor out command failure handling into a function
Martijn Pieters <mjpieters@fb.com>
parents: 28695
diff changeset
  1286
            if not testedwith.strip():
09750b1231c2 dispatch: factor out command failure handling into a function
Martijn Pieters <mjpieters@fb.com>
parents: 28695
diff changeset
  1287
                # We found an untested extension. It's likely the culprit.
45951
c26cb33e5219 dispatch: print the version of the extension being blamed in a bug report
Matt Harbison <matt_harbison@yahoo.com>
parents: 45942
diff changeset
  1288
                worst = name, b'unknown', report, version
28784
09750b1231c2 dispatch: factor out command failure handling into a function
Martijn Pieters <mjpieters@fb.com>
parents: 28695
diff changeset
  1289
                break
09750b1231c2 dispatch: factor out command failure handling into a function
Martijn Pieters <mjpieters@fb.com>
parents: 28695
diff changeset
  1290
09750b1231c2 dispatch: factor out command failure handling into a function
Martijn Pieters <mjpieters@fb.com>
parents: 28695
diff changeset
  1291
            # Never blame on extensions bundled with Mercurial.
29884
ed793f41e83f extensions: use ismoduleinternal() thoroughly
Yuya Nishihara <yuya@tcha.org>
parents: 29846
diff changeset
  1292
            if extensions.ismoduleinternal(mod):
28784
09750b1231c2 dispatch: factor out command failure handling into a function
Martijn Pieters <mjpieters@fb.com>
parents: 28695
diff changeset
  1293
                continue
09750b1231c2 dispatch: factor out command failure handling into a function
Martijn Pieters <mjpieters@fb.com>
parents: 28695
diff changeset
  1294
09750b1231c2 dispatch: factor out command failure handling into a function
Martijn Pieters <mjpieters@fb.com>
parents: 28695
diff changeset
  1295
            tested = [util.versiontuple(t, 2) for t in testedwith.split()]
09750b1231c2 dispatch: factor out command failure handling into a function
Martijn Pieters <mjpieters@fb.com>
parents: 28695
diff changeset
  1296
            if ct in tested:
09750b1231c2 dispatch: factor out command failure handling into a function
Martijn Pieters <mjpieters@fb.com>
parents: 28695
diff changeset
  1297
                continue
09750b1231c2 dispatch: factor out command failure handling into a function
Martijn Pieters <mjpieters@fb.com>
parents: 28695
diff changeset
  1298
09750b1231c2 dispatch: factor out command failure handling into a function
Martijn Pieters <mjpieters@fb.com>
parents: 28695
diff changeset
  1299
            lower = [t for t in tested if t < ct]
09750b1231c2 dispatch: factor out command failure handling into a function
Martijn Pieters <mjpieters@fb.com>
parents: 28695
diff changeset
  1300
            nearest = max(lower or tested)
09750b1231c2 dispatch: factor out command failure handling into a function
Martijn Pieters <mjpieters@fb.com>
parents: 28695
diff changeset
  1301
            if worst[0] is None or nearest < worst[1]:
45951
c26cb33e5219 dispatch: print the version of the extension being blamed in a bug report
Matt Harbison <matt_harbison@yahoo.com>
parents: 45942
diff changeset
  1302
                worst = name, nearest, report, version
28784
09750b1231c2 dispatch: factor out command failure handling into a function
Martijn Pieters <mjpieters@fb.com>
parents: 28695
diff changeset
  1303
    if worst[0] is not None:
45951
c26cb33e5219 dispatch: print the version of the extension being blamed in a bug report
Matt Harbison <matt_harbison@yahoo.com>
parents: 45942
diff changeset
  1304
        name, testedwith, report, version = worst
31179
49ad6bf63107 dispatch: allow testedwith to be bytes or str
Augie Fackler <raf@durin42.com>
parents: 31110
diff changeset
  1305
        if not isinstance(testedwith, (bytes, str)):
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1306
            testedwith = b'.'.join(
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41193
diff changeset
  1307
                [stringutil.forcebytestr(c) for c in testedwith]
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41193
diff changeset
  1308
            )
45951
c26cb33e5219 dispatch: print the version of the extension being blamed in a bug report
Matt Harbison <matt_harbison@yahoo.com>
parents: 45942
diff changeset
  1309
        extver = version or _(b"(version N/A)")
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41193
diff changeset
  1310
        warning = _(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1311
            b'** Unknown exception encountered with '
45952
a2104b9b1787 dispatch: quote the extension when printing the bug report
Matt Harbison <matt_harbison@yahoo.com>
parents: 45951
diff changeset
  1312
            b'possibly-broken third-party extension "%s" %s\n'
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1313
            b'** which supports versions %s of Mercurial.\n'
45952
a2104b9b1787 dispatch: quote the extension when printing the bug report
Matt Harbison <matt_harbison@yahoo.com>
parents: 45951
diff changeset
  1314
            b'** Please disable "%s" and try your action again.\n'
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1315
            b'** If that fixes the bug please report it to %s\n'
45951
c26cb33e5219 dispatch: print the version of the extension being blamed in a bug report
Matt Harbison <matt_harbison@yahoo.com>
parents: 45942
diff changeset
  1316
        ) % (name, extver, testedwith, name, stringutil.forcebytestr(report))
28784
09750b1231c2 dispatch: factor out command failure handling into a function
Martijn Pieters <mjpieters@fb.com>
parents: 28695
diff changeset
  1317
    else:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1318
        bugtracker = ui.config(b'ui', b'supportcontact')
28784
09750b1231c2 dispatch: factor out command failure handling into a function
Martijn Pieters <mjpieters@fb.com>
parents: 28695
diff changeset
  1319
        if bugtracker is None:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1320
            bugtracker = _(b"https://mercurial-scm.org/wiki/BugTracker")
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41193
diff changeset
  1321
        warning = (
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41193
diff changeset
  1322
            _(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1323
                b"** unknown exception encountered, "
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1324
                b"please report by visiting\n** "
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41193
diff changeset
  1325
            )
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41193
diff changeset
  1326
            + bugtracker
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1327
            + b'\n'
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41193
diff changeset
  1328
        )
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1329
    sysversion = pycompat.sysbytes(sys.version).replace(b'\n', b'')
45954
a120d1c9c704 dispatch: print the version of each extension in the bug report, if available
Matt Harbison <matt_harbison@yahoo.com>
parents: 45953
diff changeset
  1330
a120d1c9c704 dispatch: print the version of each extension in the bug report, if available
Matt Harbison <matt_harbison@yahoo.com>
parents: 45953
diff changeset
  1331
    def ext_with_ver(x):
a120d1c9c704 dispatch: print the version of each extension in the bug report, if available
Matt Harbison <matt_harbison@yahoo.com>
parents: 45953
diff changeset
  1332
        ext = x[0]
a120d1c9c704 dispatch: print the version of each extension in the bug report, if available
Matt Harbison <matt_harbison@yahoo.com>
parents: 45953
diff changeset
  1333
        ver = extensions.moduleversion(x[1])
a120d1c9c704 dispatch: print the version of each extension in the bug report, if available
Matt Harbison <matt_harbison@yahoo.com>
parents: 45953
diff changeset
  1334
        if ver:
a120d1c9c704 dispatch: print the version of each extension in the bug report, if available
Matt Harbison <matt_harbison@yahoo.com>
parents: 45953
diff changeset
  1335
            ext += b' ' + ver
a120d1c9c704 dispatch: print the version of each extension in the bug report, if available
Matt Harbison <matt_harbison@yahoo.com>
parents: 45953
diff changeset
  1336
        return ext
a120d1c9c704 dispatch: print the version of each extension in the bug report, if available
Matt Harbison <matt_harbison@yahoo.com>
parents: 45953
diff changeset
  1337
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41193
diff changeset
  1338
    warning += (
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1339
        (_(b"** Python %s\n") % sysversion)
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1340
        + (_(b"** Mercurial Distributed SCM (version %s)\n") % util.version())
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41193
diff changeset
  1341
        + (
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1342
            _(b"** Extensions loaded: %s\n")
45954
a120d1c9c704 dispatch: print the version of each extension in the bug report, if available
Matt Harbison <matt_harbison@yahoo.com>
parents: 45953
diff changeset
  1343
            % b", ".join(
a120d1c9c704 dispatch: print the version of each extension in the bug report, if available
Matt Harbison <matt_harbison@yahoo.com>
parents: 45953
diff changeset
  1344
                [ext_with_ver(x) for x in sorted(extensions.extensions())]
a120d1c9c704 dispatch: print the version of each extension in the bug report, if available
Matt Harbison <matt_harbison@yahoo.com>
parents: 45953
diff changeset
  1345
            )
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41193
diff changeset
  1346
        )
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41193
diff changeset
  1347
    )
28821
d3369dc6c1d0 dispatch: split out warning message generation to separate function
Martijn Pieters <mjpieters@fb.com>
parents: 28784
diff changeset
  1348
    return warning
d3369dc6c1d0 dispatch: split out warning message generation to separate function
Martijn Pieters <mjpieters@fb.com>
parents: 28784
diff changeset
  1349
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41193
diff changeset
  1350
28821
d3369dc6c1d0 dispatch: split out warning message generation to separate function
Martijn Pieters <mjpieters@fb.com>
parents: 28784
diff changeset
  1351
def handlecommandexception(ui):
d3369dc6c1d0 dispatch: split out warning message generation to separate function
Martijn Pieters <mjpieters@fb.com>
parents: 28784
diff changeset
  1352
    """Produce a warning message for broken commands
d3369dc6c1d0 dispatch: split out warning message generation to separate function
Martijn Pieters <mjpieters@fb.com>
parents: 28784
diff changeset
  1353
d3369dc6c1d0 dispatch: split out warning message generation to separate function
Martijn Pieters <mjpieters@fb.com>
parents: 28784
diff changeset
  1354
    Called when handling an exception; the exception is reraised if
d3369dc6c1d0 dispatch: split out warning message generation to separate function
Martijn Pieters <mjpieters@fb.com>
parents: 28784
diff changeset
  1355
    this function returns False, ignored otherwise.
d3369dc6c1d0 dispatch: split out warning message generation to separate function
Martijn Pieters <mjpieters@fb.com>
parents: 28784
diff changeset
  1356
    """
d3369dc6c1d0 dispatch: split out warning message generation to separate function
Martijn Pieters <mjpieters@fb.com>
parents: 28784
diff changeset
  1357
    warning = _exceptionwarning(ui)
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41193
diff changeset
  1358
    ui.log(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1359
        b"commandexception",
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1360
        b"%s\n%s\n",
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41193
diff changeset
  1361
        warning,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41193
diff changeset
  1362
        pycompat.sysbytes(traceback.format_exc()),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41193
diff changeset
  1363
    )
28784
09750b1231c2 dispatch: factor out command failure handling into a function
Martijn Pieters <mjpieters@fb.com>
parents: 28695
diff changeset
  1364
    ui.warn(warning)
09750b1231c2 dispatch: factor out command failure handling into a function
Martijn Pieters <mjpieters@fb.com>
parents: 28695
diff changeset
  1365
    return False  # re-raise the exception