mercurial/dispatch.py
author Gregory Szorc <gregory.szorc@gmail.com>
Sun, 19 Apr 2020 14:16:24 -0700
branchstable
changeset 44745 6a6c15cea1fa
parent 44655 02fa5392bab6
child 45101 9e6b86a8f438
permissions -rw-r--r--
contrib: install PyOxidizer in Linux and Windows environments For Linux, this was trivial. For Windows, we need to teach the powershell script to install Rust as well. This was also pretty straightforward. Differential Revision: https://phab.mercurial-scm.org/D8468
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
#
18a9fbb5cd78 dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
     3
# Copyright 2005-2007 Matt Mackall <mpm@selenic.com>
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
27615
4030d3b79953 dispatch: use print function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27516
diff changeset
     8
from __future__ import absolute_import, print_function
25932
d491f289045f dispatch: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25834
diff changeset
     9
24221
4e240d6ab898 dispatch: offer near-edit-distance suggestions for {file,rev}set functions
Augie Fackler <augie@google.com>
parents: 24163
diff changeset
    10
import difflib
25932
d491f289045f dispatch: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25834
diff changeset
    11
import errno
30581
541949a10a68 fancyopts: switch from fancyopts.getopt.* to getopt.*
Pulkit Goyal <7895pulkit@gmail.com>
parents: 30564
diff changeset
    12
import getopt
44655
02fa5392bab6 dispatch: force \n for newlines on sys.std* streams (BC)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 44470
diff changeset
    13
import io
25932
d491f289045f dispatch: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25834
diff changeset
    14
import os
d491f289045f dispatch: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25834
diff changeset
    15
import pdb
d491f289045f dispatch: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25834
diff changeset
    16
import re
d491f289045f dispatch: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25834
diff changeset
    17
import signal
d491f289045f dispatch: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25834
diff changeset
    18
import sys
d491f289045f dispatch: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25834
diff changeset
    19
import traceback
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
d491f289045f dispatch: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25834
diff changeset
    22
from .i18n import _
43089
c59eb1560c44 py3: manually import getattr where it is needed
Gregory Szorc <gregory.szorc@gmail.com>
parents: 43080
diff changeset
    23
from .pycompat import getattr
25932
d491f289045f dispatch: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25834
diff changeset
    24
39283
4019b4542e61 dispatch: have dispatch.dispatch and dispatch._runcatch emit trace events
Augie Fackler <augie@google.com>
parents: 38828
diff changeset
    25
from hgdemandimport import tracing
4019b4542e61 dispatch: have dispatch.dispatch and dispatch._runcatch emit trace events
Augie Fackler <augie@google.com>
parents: 38828
diff changeset
    26
25932
d491f289045f dispatch: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25834
diff changeset
    27
from . import (
d491f289045f dispatch: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25834
diff changeset
    28
    cmdutil,
30657
b2be4ccaff1d color: load 'colortable' from extension using an 'extraloader'
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 30591
diff changeset
    29
    color,
25932
d491f289045f dispatch: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25834
diff changeset
    30
    commands,
d491f289045f dispatch: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25834
diff changeset
    31
    demandimport,
d491f289045f dispatch: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25834
diff changeset
    32
    encoding,
d491f289045f dispatch: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25834
diff changeset
    33
    error,
d491f289045f dispatch: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25834
diff changeset
    34
    extensions,
d491f289045f dispatch: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25834
diff changeset
    35
    fancyopts,
31080
ab20491b1760 dispatch: rearrange 'unknown command' code to better employ pager
Augie Fackler <augie@google.com>
parents: 31047
diff changeset
    36
    help,
25932
d491f289045f dispatch: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25834
diff changeset
    37
    hg,
d491f289045f dispatch: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25834
diff changeset
    38
    hook,
29792
2654a0aac80d profiling: move profiling code from dispatch.py (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 29773
diff changeset
    39
    profiling,
30477
7f2b18c34c02 py3: use pycompat.sysargv in dispatch.run()
Pulkit Goyal <7895pulkit@gmail.com>
parents: 30411
diff changeset
    40
    pycompat,
44161
ef11dfc56674 config: also respect HGRCSKIPREPO in `dispatch._getlocal`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 44019
diff changeset
    41
    rcutil,
40490
444861dc1e55 help: displaying documented aliases by default
rdamazio@google.com
parents: 40402
diff changeset
    42
    registrar,
30529
4338f87dbf6f dispatch: move part of callcatch to scmutil
Jun Wu <quark@fb.com>
parents: 30528
diff changeset
    43
    scmutil,
25932
d491f289045f dispatch: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25834
diff changeset
    44
    ui as uimod,
d491f289045f dispatch: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25834
diff changeset
    45
    util,
d491f289045f dispatch: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25834
diff changeset
    46
)
5178
18a9fbb5cd78 dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
    47
37087
f0b6fbea00cf stringutil: bulk-replace call sites to point to new module
Yuya Nishihara <yuya@tcha.org>
parents: 36752
diff changeset
    48
from .utils import (
37122
d4a2e0d5d042 procutil: bulk-replace util.std* to point to new module
Yuya Nishihara <yuya@tcha.org>
parents: 37087
diff changeset
    49
    procutil,
37087
f0b6fbea00cf stringutil: bulk-replace call sites to point to new module
Yuya Nishihara <yuya@tcha.org>
parents: 36752
diff changeset
    50
    stringutil,
f0b6fbea00cf stringutil: bulk-replace call sites to point to new module
Yuya Nishihara <yuya@tcha.org>
parents: 36752
diff changeset
    51
)
f0b6fbea00cf stringutil: bulk-replace call sites to point to new module
Yuya Nishihara <yuya@tcha.org>
parents: 36752
diff changeset
    52
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41193
diff changeset
    53
14438
08bfec2ef031 dispatch: wrap dispatch related information in a request class
Idan Kamara <idankk86@gmail.com>
parents: 14286
diff changeset
    54
class request(object):
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41193
diff changeset
    55
    def __init__(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41193
diff changeset
    56
        self,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41193
diff changeset
    57
        args,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41193
diff changeset
    58
        ui=None,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41193
diff changeset
    59
        repo=None,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41193
diff changeset
    60
        fin=None,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41193
diff changeset
    61
        fout=None,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41193
diff changeset
    62
        ferr=None,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41193
diff changeset
    63
        fmsg=None,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41193
diff changeset
    64
        prereposetups=None,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41193
diff changeset
    65
    ):
14438
08bfec2ef031 dispatch: wrap dispatch related information in a request class
Idan Kamara <idankk86@gmail.com>
parents: 14286
diff changeset
    66
        self.args = args
14439
80c599eee3f3 dispatch: use the request to store the ui object
Idan Kamara <idankk86@gmail.com>
parents: 14438
diff changeset
    67
        self.ui = ui
14510
eccbb9980ada dispatch: add repo to the request
Idan Kamara <idankk86@gmail.com>
parents: 14439
diff changeset
    68
        self.repo = repo
14438
08bfec2ef031 dispatch: wrap dispatch related information in a request class
Idan Kamara <idankk86@gmail.com>
parents: 14286
diff changeset
    69
14613
ea8938d3a5aa dispatch: add I/O descriptors to the request
Idan Kamara <idankk86@gmail.com>
parents: 14601
diff changeset
    70
        # input/output/error streams
ea8938d3a5aa dispatch: add I/O descriptors to the request
Idan Kamara <idankk86@gmail.com>
parents: 14601
diff changeset
    71
        self.fin = fin
ea8938d3a5aa dispatch: add I/O descriptors to the request
Idan Kamara <idankk86@gmail.com>
parents: 14601
diff changeset
    72
        self.fout = fout
ea8938d3a5aa dispatch: add I/O descriptors to the request
Idan Kamara <idankk86@gmail.com>
parents: 14601
diff changeset
    73
        self.ferr = ferr
40634
5542bc9125c9 dispatch: pass around ui.fmsg channel
Yuya Nishihara <yuya@tcha.org>
parents: 40490
diff changeset
    74
        # separate stream for status/error messages
5542bc9125c9 dispatch: pass around ui.fmsg channel
Yuya Nishihara <yuya@tcha.org>
parents: 40490
diff changeset
    75
        self.fmsg = fmsg
14613
ea8938d3a5aa dispatch: add I/O descriptors to the request
Idan Kamara <idankk86@gmail.com>
parents: 14601
diff changeset
    76
35233
6e6d0a5b88e6 dispatch: replace _earlyreq*() with new fancyopts-based parser
Yuya Nishihara <yuya@tcha.org>
parents: 35232
diff changeset
    77
        # remember options pre-parsed by _earlyparseopts()
34982
d9aba3730d30 dispatch: abort if early boolean options can't be parsed
Yuya Nishihara <yuya@tcha.org>
parents: 34981
diff changeset
    78
        self.earlyoptions = {}
d9aba3730d30 dispatch: abort if early boolean options can't be parsed
Yuya Nishihara <yuya@tcha.org>
parents: 34981
diff changeset
    79
32418
71e735bd8170 dispatch: make request accept additional reposetups
Jun Wu <quark@fb.com>
parents: 32416
diff changeset
    80
        # reposetups which run before extensions, useful for chg to pre-fill
71e735bd8170 dispatch: make request accept additional reposetups
Jun Wu <quark@fb.com>
parents: 32416
diff changeset
    81
        # low-level repo state (for example, changelog) before extensions.
71e735bd8170 dispatch: make request accept additional reposetups
Jun Wu <quark@fb.com>
parents: 32416
diff changeset
    82
        self.prereposetups = prereposetups or []
71e735bd8170 dispatch: make request accept additional reposetups
Jun Wu <quark@fb.com>
parents: 32416
diff changeset
    83
40402
106adc261492 logtoprocess: sends the canonical command name to the subprocess
Boris Feld <boris.feld@octobus.net>
parents: 39823
diff changeset
    84
        # store the parsed and canonical command
106adc261492 logtoprocess: sends the canonical command name to the subprocess
Boris Feld <boris.feld@octobus.net>
parents: 39823
diff changeset
    85
        self.canonical_command = None
106adc261492 logtoprocess: sends the canonical command name to the subprocess
Boris Feld <boris.feld@octobus.net>
parents: 39823
diff changeset
    86
31956
c13ff31818b0 ui: add special-purpose atexit functionality
Bryan O'Sullivan <bryano@fb.com>
parents: 31634
diff changeset
    87
    def _runexithandlers(self):
c13ff31818b0 ui: add special-purpose atexit functionality
Bryan O'Sullivan <bryano@fb.com>
parents: 31634
diff changeset
    88
        exc = None
c13ff31818b0 ui: add special-purpose atexit functionality
Bryan O'Sullivan <bryano@fb.com>
parents: 31634
diff changeset
    89
        handlers = self.ui._exithandlers
c13ff31818b0 ui: add special-purpose atexit functionality
Bryan O'Sullivan <bryano@fb.com>
parents: 31634
diff changeset
    90
        try:
c13ff31818b0 ui: add special-purpose atexit functionality
Bryan O'Sullivan <bryano@fb.com>
parents: 31634
diff changeset
    91
            while handlers:
c13ff31818b0 ui: add special-purpose atexit functionality
Bryan O'Sullivan <bryano@fb.com>
parents: 31634
diff changeset
    92
                func, args, kwargs = handlers.pop()
c13ff31818b0 ui: add special-purpose atexit functionality
Bryan O'Sullivan <bryano@fb.com>
parents: 31634
diff changeset
    93
                try:
c13ff31818b0 ui: add special-purpose atexit functionality
Bryan O'Sullivan <bryano@fb.com>
parents: 31634
diff changeset
    94
                    func(*args, **kwargs)
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41193
diff changeset
    95
                except:  # re-raises below
31956
c13ff31818b0 ui: add special-purpose atexit functionality
Bryan O'Sullivan <bryano@fb.com>
parents: 31634
diff changeset
    96
                    if exc is None:
c13ff31818b0 ui: add special-purpose atexit functionality
Bryan O'Sullivan <bryano@fb.com>
parents: 31634
diff changeset
    97
                        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
    98
                    self.ui.warnnoi18n(b'error in exit handlers:\n')
31956
c13ff31818b0 ui: add special-purpose atexit functionality
Bryan O'Sullivan <bryano@fb.com>
parents: 31634
diff changeset
    99
                    self.ui.traceback(force=True)
c13ff31818b0 ui: add special-purpose atexit functionality
Bryan O'Sullivan <bryano@fb.com>
parents: 31634
diff changeset
   100
        finally:
c13ff31818b0 ui: add special-purpose atexit functionality
Bryan O'Sullivan <bryano@fb.com>
parents: 31634
diff changeset
   101
            if exc is not None:
c13ff31818b0 ui: add special-purpose atexit functionality
Bryan O'Sullivan <bryano@fb.com>
parents: 31634
diff changeset
   102
                raise exc
c13ff31818b0 ui: add special-purpose atexit functionality
Bryan O'Sullivan <bryano@fb.com>
parents: 31634
diff changeset
   103
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41193
diff changeset
   104
5178
18a9fbb5cd78 dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
   105
def run():
43807
be8552f25cab cleanup: fix docstring formatting
Matt Harbison <matt_harbison@yahoo.com>
parents: 43746
diff changeset
   106
    """run the command in sys.argv"""
37988
dc1ed7fe33e4 sshserver: do setbinary() by caller (API)
Yuya Nishihara <yuya@tcha.org>
parents: 37717
diff changeset
   107
    initstdio()
43238
101ae8bbfa02 cleanup: hgdemandimport.tracing accepts strings, not bytes
Augie Fackler <augie@google.com>
parents: 43117
diff changeset
   108
    with tracing.log('parse args into request'):
39283
4019b4542e61 dispatch: have dispatch.dispatch and dispatch._runcatch emit trace events
Augie Fackler <augie@google.com>
parents: 38828
diff changeset
   109
        req = request(pycompat.sysargv[1:])
31960
71dcd4a4fa2f stdio: catch StdioError in dispatch.run and clean up appropriately
Bryan O'Sullivan <bryano@fb.com>
parents: 31958
diff changeset
   110
    err = None
71dcd4a4fa2f stdio: catch StdioError in dispatch.run and clean up appropriately
Bryan O'Sullivan <bryano@fb.com>
parents: 31958
diff changeset
   111
    try:
38038
6f9ac3cb0987 dispatch: unify handling of None returned by a command function
Yuya Nishihara <yuya@tcha.org>
parents: 38037
diff changeset
   112
        status = dispatch(req)
34532
b09b3eaf9c96 py3: work around the scope of exception variable in dispatch.run()
Yuya Nishihara <yuya@tcha.org>
parents: 34486
diff changeset
   113
    except error.StdioError as e:
b09b3eaf9c96 py3: work around the scope of exception variable in dispatch.run()
Yuya Nishihara <yuya@tcha.org>
parents: 34486
diff changeset
   114
        err = e
31960
71dcd4a4fa2f stdio: catch StdioError in dispatch.run and clean up appropriately
Bryan O'Sullivan <bryano@fb.com>
parents: 31958
diff changeset
   115
        status = -1
38037
e9c588802529 dispatch: minor code refactor
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37988
diff changeset
   116
e9c588802529 dispatch: minor code refactor
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37988
diff changeset
   117
    # In all cases we try to flush stdio streams.
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   118
    if util.safehasattr(req.ui, b'fout'):
43746
ac8fd215a776 dispatch: add some assertions to give pytype a helping hand
Augie Fackler <augie@google.com>
parents: 43554
diff changeset
   119
        assert req.ui is not None  # help pytype
ac8fd215a776 dispatch: add some assertions to give pytype a helping hand
Augie Fackler <augie@google.com>
parents: 43554
diff changeset
   120
        assert req.ui.fout is not None  # help pytype
31960
71dcd4a4fa2f stdio: catch StdioError in dispatch.run and clean up appropriately
Bryan O'Sullivan <bryano@fb.com>
parents: 31958
diff changeset
   121
        try:
32707
12941a782928 dispatch: do not close stdout and stderr, just flush() instead
Yuya Nishihara <yuya@tcha.org>
parents: 32674
diff changeset
   122
            req.ui.fout.flush()
34532
b09b3eaf9c96 py3: work around the scope of exception variable in dispatch.run()
Yuya Nishihara <yuya@tcha.org>
parents: 34486
diff changeset
   123
        except IOError as e:
b09b3eaf9c96 py3: work around the scope of exception variable in dispatch.run()
Yuya Nishihara <yuya@tcha.org>
parents: 34486
diff changeset
   124
            err = e
31960
71dcd4a4fa2f stdio: catch StdioError in dispatch.run and clean up appropriately
Bryan O'Sullivan <bryano@fb.com>
parents: 31958
diff changeset
   125
            status = -1
38037
e9c588802529 dispatch: minor code refactor
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37988
diff changeset
   126
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   127
    if util.safehasattr(req.ui, b'ferr'):
43746
ac8fd215a776 dispatch: add some assertions to give pytype a helping hand
Augie Fackler <augie@google.com>
parents: 43554
diff changeset
   128
        assert req.ui is not None  # help pytype
ac8fd215a776 dispatch: add some assertions to give pytype a helping hand
Augie Fackler <augie@google.com>
parents: 43554
diff changeset
   129
        assert req.ui.ferr is not None  # help pytype
35653
48fe4f56a3b4 dispatch: handle IOError when writing to stderr
Gregory Szorc <gregory.szorc@gmail.com>
parents: 35470
diff changeset
   130
        try:
48fe4f56a3b4 dispatch: handle IOError when writing to stderr
Gregory Szorc <gregory.szorc@gmail.com>
parents: 35470
diff changeset
   131
            if err is not None and err.errno != errno.EPIPE:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41193
diff changeset
   132
                req.ui.ferr.write(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   133
                    b'abort: %s\n' % encoding.strtolocal(err.strerror)
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41193
diff changeset
   134
                )
35653
48fe4f56a3b4 dispatch: handle IOError when writing to stderr
Gregory Szorc <gregory.szorc@gmail.com>
parents: 35470
diff changeset
   135
            req.ui.ferr.flush()
48fe4f56a3b4 dispatch: handle IOError when writing to stderr
Gregory Szorc <gregory.szorc@gmail.com>
parents: 35470
diff changeset
   136
        # There's not much we can do about an I/O error here. So (possibly)
48fe4f56a3b4 dispatch: handle IOError when writing to stderr
Gregory Szorc <gregory.szorc@gmail.com>
parents: 35470
diff changeset
   137
        # change the status code and move on.
48fe4f56a3b4 dispatch: handle IOError when writing to stderr
Gregory Szorc <gregory.szorc@gmail.com>
parents: 35470
diff changeset
   138
        except IOError:
48fe4f56a3b4 dispatch: handle IOError when writing to stderr
Gregory Szorc <gregory.szorc@gmail.com>
parents: 35470
diff changeset
   139
            status = -1
36666
e8c361316803 py3: silence the final IOError by closing stdout/err slightly early
Yuya Nishihara <yuya@tcha.org>
parents: 36665
diff changeset
   140
e8c361316803 py3: silence the final IOError by closing stdout/err slightly early
Yuya Nishihara <yuya@tcha.org>
parents: 36665
diff changeset
   141
    _silencestdio()
31960
71dcd4a4fa2f stdio: catch StdioError in dispatch.run and clean up appropriately
Bryan O'Sullivan <bryano@fb.com>
parents: 31958
diff changeset
   142
    sys.exit(status & 255)
5178
18a9fbb5cd78 dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
   143
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41193
diff changeset
   144
36665
c263c684da91 py3: conditionalize initialization of stdio flags
Yuya Nishihara <yuya@tcha.org>
parents: 36533
diff changeset
   145
if pycompat.ispy3:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41193
diff changeset
   146
37988
dc1ed7fe33e4 sshserver: do setbinary() by caller (API)
Yuya Nishihara <yuya@tcha.org>
parents: 37717
diff changeset
   147
    def initstdio():
44655
02fa5392bab6 dispatch: force \n for newlines on sys.std* streams (BC)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 44470
diff changeset
   148
        # stdio streams on Python 3 are io.TextIOWrapper instances proxying another
02fa5392bab6 dispatch: force \n for newlines on sys.std* streams (BC)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 44470
diff changeset
   149
        # buffer. These streams will normalize \n to \r\n by default. Mercurial's
02fa5392bab6 dispatch: force \n for newlines on sys.std* streams (BC)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 44470
diff changeset
   150
        # preferred mechanism for writing output (ui.write()) uses io.BufferedWriter
02fa5392bab6 dispatch: force \n for newlines on sys.std* streams (BC)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 44470
diff changeset
   151
        # instances, which write to the underlying stdio file descriptor in binary
02fa5392bab6 dispatch: force \n for newlines on sys.std* streams (BC)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 44470
diff changeset
   152
        # mode. ui.write() uses \n for line endings and no line ending normalization
02fa5392bab6 dispatch: force \n for newlines on sys.std* streams (BC)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 44470
diff changeset
   153
        # is attempted through this interface. This "just works," even if the system
02fa5392bab6 dispatch: force \n for newlines on sys.std* streams (BC)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 44470
diff changeset
   154
        # preferred line ending is not \n.
02fa5392bab6 dispatch: force \n for newlines on sys.std* streams (BC)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 44470
diff changeset
   155
        #
02fa5392bab6 dispatch: force \n for newlines on sys.std* streams (BC)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 44470
diff changeset
   156
        # But some parts of Mercurial (e.g. hooks) can still send data to sys.stdout
02fa5392bab6 dispatch: force \n for newlines on sys.std* streams (BC)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 44470
diff changeset
   157
        # and sys.stderr. They will inherit the line ending normalization settings,
02fa5392bab6 dispatch: force \n for newlines on sys.std* streams (BC)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 44470
diff changeset
   158
        # potentially causing e.g. \r\n to be emitted. Since emitting \n should
02fa5392bab6 dispatch: force \n for newlines on sys.std* streams (BC)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 44470
diff changeset
   159
        # "just work," here we change the sys.* streams to disable line ending
02fa5392bab6 dispatch: force \n for newlines on sys.std* streams (BC)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 44470
diff changeset
   160
        # normalization, ensuring compatibility with our ui type.
02fa5392bab6 dispatch: force \n for newlines on sys.std* streams (BC)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 44470
diff changeset
   161
02fa5392bab6 dispatch: force \n for newlines on sys.std* streams (BC)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 44470
diff changeset
   162
        # write_through is new in Python 3.7.
02fa5392bab6 dispatch: force \n for newlines on sys.std* streams (BC)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 44470
diff changeset
   163
        kwargs = {
02fa5392bab6 dispatch: force \n for newlines on sys.std* streams (BC)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 44470
diff changeset
   164
            "newline": "\n",
02fa5392bab6 dispatch: force \n for newlines on sys.std* streams (BC)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 44470
diff changeset
   165
            "line_buffering": sys.stdout.line_buffering,
02fa5392bab6 dispatch: force \n for newlines on sys.std* streams (BC)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 44470
diff changeset
   166
        }
02fa5392bab6 dispatch: force \n for newlines on sys.std* streams (BC)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 44470
diff changeset
   167
        if util.safehasattr(sys.stdout, "write_through"):
02fa5392bab6 dispatch: force \n for newlines on sys.std* streams (BC)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 44470
diff changeset
   168
            kwargs["write_through"] = sys.stdout.write_through
02fa5392bab6 dispatch: force \n for newlines on sys.std* streams (BC)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 44470
diff changeset
   169
        sys.stdout = io.TextIOWrapper(
02fa5392bab6 dispatch: force \n for newlines on sys.std* streams (BC)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 44470
diff changeset
   170
            sys.stdout.buffer, sys.stdout.encoding, sys.stdout.errors, **kwargs
02fa5392bab6 dispatch: force \n for newlines on sys.std* streams (BC)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 44470
diff changeset
   171
        )
02fa5392bab6 dispatch: force \n for newlines on sys.std* streams (BC)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 44470
diff changeset
   172
02fa5392bab6 dispatch: force \n for newlines on sys.std* streams (BC)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 44470
diff changeset
   173
        kwargs = {
02fa5392bab6 dispatch: force \n for newlines on sys.std* streams (BC)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 44470
diff changeset
   174
            "newline": "\n",
02fa5392bab6 dispatch: force \n for newlines on sys.std* streams (BC)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 44470
diff changeset
   175
            "line_buffering": sys.stderr.line_buffering,
02fa5392bab6 dispatch: force \n for newlines on sys.std* streams (BC)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 44470
diff changeset
   176
        }
02fa5392bab6 dispatch: force \n for newlines on sys.std* streams (BC)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 44470
diff changeset
   177
        if util.safehasattr(sys.stderr, "write_through"):
02fa5392bab6 dispatch: force \n for newlines on sys.std* streams (BC)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 44470
diff changeset
   178
            kwargs["write_through"] = sys.stderr.write_through
02fa5392bab6 dispatch: force \n for newlines on sys.std* streams (BC)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 44470
diff changeset
   179
        sys.stderr = io.TextIOWrapper(
02fa5392bab6 dispatch: force \n for newlines on sys.std* streams (BC)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 44470
diff changeset
   180
            sys.stderr.buffer, sys.stderr.encoding, sys.stderr.errors, **kwargs
02fa5392bab6 dispatch: force \n for newlines on sys.std* streams (BC)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 44470
diff changeset
   181
        )
02fa5392bab6 dispatch: force \n for newlines on sys.std* streams (BC)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 44470
diff changeset
   182
02fa5392bab6 dispatch: force \n for newlines on sys.std* streams (BC)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 44470
diff changeset
   183
        # No write_through on read-only stream.
02fa5392bab6 dispatch: force \n for newlines on sys.std* streams (BC)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 44470
diff changeset
   184
        sys.stdin = io.TextIOWrapper(
02fa5392bab6 dispatch: force \n for newlines on sys.std* streams (BC)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 44470
diff changeset
   185
            sys.stdin.buffer,
02fa5392bab6 dispatch: force \n for newlines on sys.std* streams (BC)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 44470
diff changeset
   186
            sys.stdin.encoding,
02fa5392bab6 dispatch: force \n for newlines on sys.std* streams (BC)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 44470
diff changeset
   187
            sys.stdin.errors,
02fa5392bab6 dispatch: force \n for newlines on sys.std* streams (BC)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 44470
diff changeset
   188
            # None is universal newlines mode.
02fa5392bab6 dispatch: force \n for newlines on sys.std* streams (BC)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 44470
diff changeset
   189
            newline=None,
02fa5392bab6 dispatch: force \n for newlines on sys.std* streams (BC)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 44470
diff changeset
   190
            line_buffering=sys.stdin.line_buffering,
02fa5392bab6 dispatch: force \n for newlines on sys.std* streams (BC)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 44470
diff changeset
   191
        )
36666
e8c361316803 py3: silence the final IOError by closing stdout/err slightly early
Yuya Nishihara <yuya@tcha.org>
parents: 36665
diff changeset
   192
e8c361316803 py3: silence the final IOError by closing stdout/err slightly early
Yuya Nishihara <yuya@tcha.org>
parents: 36665
diff changeset
   193
    def _silencestdio():
e8c361316803 py3: silence the final IOError by closing stdout/err slightly early
Yuya Nishihara <yuya@tcha.org>
parents: 36665
diff changeset
   194
        for fp in (sys.stdout, sys.stderr):
e8c361316803 py3: silence the final IOError by closing stdout/err slightly early
Yuya Nishihara <yuya@tcha.org>
parents: 36665
diff changeset
   195
            # Check if the file is okay
e8c361316803 py3: silence the final IOError by closing stdout/err slightly early
Yuya Nishihara <yuya@tcha.org>
parents: 36665
diff changeset
   196
            try:
e8c361316803 py3: silence the final IOError by closing stdout/err slightly early
Yuya Nishihara <yuya@tcha.org>
parents: 36665
diff changeset
   197
                fp.flush()
e8c361316803 py3: silence the final IOError by closing stdout/err slightly early
Yuya Nishihara <yuya@tcha.org>
parents: 36665
diff changeset
   198
                continue
e8c361316803 py3: silence the final IOError by closing stdout/err slightly early
Yuya Nishihara <yuya@tcha.org>
parents: 36665
diff changeset
   199
            except IOError:
e8c361316803 py3: silence the final IOError by closing stdout/err slightly early
Yuya Nishihara <yuya@tcha.org>
parents: 36665
diff changeset
   200
                pass
e8c361316803 py3: silence the final IOError by closing stdout/err slightly early
Yuya Nishihara <yuya@tcha.org>
parents: 36665
diff changeset
   201
            # Otherwise mark it as closed to silence "Exception ignored in"
e8c361316803 py3: silence the final IOError by closing stdout/err slightly early
Yuya Nishihara <yuya@tcha.org>
parents: 36665
diff changeset
   202
            # message emitted by the interpreter finalizer. Be careful to
37122
d4a2e0d5d042 procutil: bulk-replace util.std* to point to new module
Yuya Nishihara <yuya@tcha.org>
parents: 37087
diff changeset
   203
            # not close procutil.stdout, which may be a fdopen-ed file object
d4a2e0d5d042 procutil: bulk-replace util.std* to point to new module
Yuya Nishihara <yuya@tcha.org>
parents: 37087
diff changeset
   204
            # and its close() actually closes the underlying file descriptor.
36666
e8c361316803 py3: silence the final IOError by closing stdout/err slightly early
Yuya Nishihara <yuya@tcha.org>
parents: 36665
diff changeset
   205
            try:
e8c361316803 py3: silence the final IOError by closing stdout/err slightly early
Yuya Nishihara <yuya@tcha.org>
parents: 36665
diff changeset
   206
                fp.close()
e8c361316803 py3: silence the final IOError by closing stdout/err slightly early
Yuya Nishihara <yuya@tcha.org>
parents: 36665
diff changeset
   207
            except IOError:
e8c361316803 py3: silence the final IOError by closing stdout/err slightly early
Yuya Nishihara <yuya@tcha.org>
parents: 36665
diff changeset
   208
                pass
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41193
diff changeset
   209
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41193
diff changeset
   210
36665
c263c684da91 py3: conditionalize initialization of stdio flags
Yuya Nishihara <yuya@tcha.org>
parents: 36533
diff changeset
   211
else:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41193
diff changeset
   212
37988
dc1ed7fe33e4 sshserver: do setbinary() by caller (API)
Yuya Nishihara <yuya@tcha.org>
parents: 37717
diff changeset
   213
    def initstdio():
36665
c263c684da91 py3: conditionalize initialization of stdio flags
Yuya Nishihara <yuya@tcha.org>
parents: 36533
diff changeset
   214
        for fp in (sys.stdin, sys.stdout, sys.stderr):
37123
a8a902d7176e procutil: bulk-replace function calls to point to new module
Yuya Nishihara <yuya@tcha.org>
parents: 37122
diff changeset
   215
            procutil.setbinary(fp)
34533
163fa0aea71e dispatch: move initialization of sys.std* files
Yuya Nishihara <yuya@tcha.org>
parents: 34532
diff changeset
   216
36666
e8c361316803 py3: silence the final IOError by closing stdout/err slightly early
Yuya Nishihara <yuya@tcha.org>
parents: 36665
diff changeset
   217
    def _silencestdio():
e8c361316803 py3: silence the final IOError by closing stdout/err slightly early
Yuya Nishihara <yuya@tcha.org>
parents: 36665
diff changeset
   218
        pass
e8c361316803 py3: silence the final IOError by closing stdout/err slightly early
Yuya Nishihara <yuya@tcha.org>
parents: 36665
diff changeset
   219
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41193
diff changeset
   220
24221
4e240d6ab898 dispatch: offer near-edit-distance suggestions for {file,rev}set functions
Augie Fackler <augie@google.com>
parents: 24163
diff changeset
   221
def _getsimilar(symbols, value):
4e240d6ab898 dispatch: offer near-edit-distance suggestions for {file,rev}set functions
Augie Fackler <augie@google.com>
parents: 24163
diff changeset
   222
    sim = lambda x: difflib.SequenceMatcher(None, value, x).ratio()
4e240d6ab898 dispatch: offer near-edit-distance suggestions for {file,rev}set functions
Augie Fackler <augie@google.com>
parents: 24163
diff changeset
   223
    # The cutoff for similarity here is pretty arbitrary. It should
4e240d6ab898 dispatch: offer near-edit-distance suggestions for {file,rev}set functions
Augie Fackler <augie@google.com>
parents: 24163
diff changeset
   224
    # probably be investigated and tweaked.
4e240d6ab898 dispatch: offer near-edit-distance suggestions for {file,rev}set functions
Augie Fackler <augie@google.com>
parents: 24163
diff changeset
   225
    return [s for s in symbols if sim(s) > 0.6]
4e240d6ab898 dispatch: offer near-edit-distance suggestions for {file,rev}set functions
Augie Fackler <augie@google.com>
parents: 24163
diff changeset
   226
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41193
diff changeset
   227
27623
b3376fba4ab9 dispatch: report similar names consistently
Bryan O'Sullivan <bos@serpentine.com>
parents: 27615
diff changeset
   228
def _reportsimilar(write, similar):
b3376fba4ab9 dispatch: report similar names consistently
Bryan O'Sullivan <bos@serpentine.com>
parents: 27615
diff changeset
   229
    if len(similar) == 1:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   230
        write(_(b"(did you mean %s?)\n") % similar[0])
27623
b3376fba4ab9 dispatch: report similar names consistently
Bryan O'Sullivan <bos@serpentine.com>
parents: 27615
diff changeset
   231
    elif similar:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   232
        ss = b", ".join(sorted(similar))
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   233
        write(_(b"(did you mean one of %s?)\n") % ss)
27623
b3376fba4ab9 dispatch: report similar names consistently
Bryan O'Sullivan <bos@serpentine.com>
parents: 27615
diff changeset
   234
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41193
diff changeset
   235
24039
2ee35b6ee4fb dispatch: consolidate formatting of ParseErrors
Augie Fackler <augie@google.com>
parents: 23871
diff changeset
   236
def _formatparse(write, inst):
24221
4e240d6ab898 dispatch: offer near-edit-distance suggestions for {file,rev}set functions
Augie Fackler <augie@google.com>
parents: 24163
diff changeset
   237
    similar = []
4e240d6ab898 dispatch: offer near-edit-distance suggestions for {file,rev}set functions
Augie Fackler <augie@google.com>
parents: 24163
diff changeset
   238
    if isinstance(inst, error.UnknownIdentifier):
4e240d6ab898 dispatch: offer near-edit-distance suggestions for {file,rev}set functions
Augie Fackler <augie@google.com>
parents: 24163
diff changeset
   239
        # make sure to check fileset first, as revset can invoke fileset
4e240d6ab898 dispatch: offer near-edit-distance suggestions for {file,rev}set functions
Augie Fackler <augie@google.com>
parents: 24163
diff changeset
   240
        similar = _getsimilar(inst.symbols, inst.function)
24039
2ee35b6ee4fb dispatch: consolidate formatting of ParseErrors
Augie Fackler <augie@google.com>
parents: 23871
diff changeset
   241
    if len(inst.args) > 1:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41193
diff changeset
   242
        write(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   243
            _(b"hg: parse error at %s: %s\n")
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41193
diff changeset
   244
            % (pycompat.bytestr(inst.args[1]), inst.args[0])
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41193
diff changeset
   245
        )
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   246
        if inst.args[0].startswith(b' '):
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   247
            write(_(b"unexpected leading whitespace\n"))
24039
2ee35b6ee4fb dispatch: consolidate formatting of ParseErrors
Augie Fackler <augie@google.com>
parents: 23871
diff changeset
   248
    else:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   249
        write(_(b"hg: parse error: %s\n") % inst.args[0])
27623
b3376fba4ab9 dispatch: report similar names consistently
Bryan O'Sullivan <bos@serpentine.com>
parents: 27615
diff changeset
   250
        _reportsimilar(write, similar)
28515
491eabd0df79 dispatch: extract common logic for handling ParseError
Jun Wu <quark@fb.com>
parents: 28447
diff changeset
   251
    if inst.hint:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   252
        write(_(b"(%s)\n") % inst.hint)
24039
2ee35b6ee4fb dispatch: consolidate formatting of ParseErrors
Augie Fackler <augie@google.com>
parents: 23871
diff changeset
   253
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41193
diff changeset
   254
31499
3c77414a0f9c dispatch: consolidate formatting of arguments
Augie Fackler <augie@google.com>
parents: 31498
diff changeset
   255
def _formatargs(args):
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   256
    return b' '.join(procutil.shellquote(a) for a in args)
31499
3c77414a0f9c dispatch: consolidate formatting of arguments
Augie Fackler <augie@google.com>
parents: 31498
diff changeset
   257
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41193
diff changeset
   258
14438
08bfec2ef031 dispatch: wrap dispatch related information in a request class
Idan Kamara <idankk86@gmail.com>
parents: 14286
diff changeset
   259
def dispatch(req):
38038
6f9ac3cb0987 dispatch: unify handling of None returned by a command function
Yuya Nishihara <yuya@tcha.org>
parents: 38037
diff changeset
   260
    """run the command specified in req.args; returns an integer status code"""
43238
101ae8bbfa02 cleanup: hgdemandimport.tracing accepts strings, not bytes
Augie Fackler <augie@google.com>
parents: 43117
diff changeset
   261
    with tracing.log('dispatch.dispatch'):
39283
4019b4542e61 dispatch: have dispatch.dispatch and dispatch._runcatch emit trace events
Augie Fackler <augie@google.com>
parents: 38828
diff changeset
   262
        if req.ferr:
4019b4542e61 dispatch: have dispatch.dispatch and dispatch._runcatch emit trace events
Augie Fackler <augie@google.com>
parents: 38828
diff changeset
   263
            ferr = req.ferr
4019b4542e61 dispatch: have dispatch.dispatch and dispatch._runcatch emit trace events
Augie Fackler <augie@google.com>
parents: 38828
diff changeset
   264
        elif req.ui:
4019b4542e61 dispatch: have dispatch.dispatch and dispatch._runcatch emit trace events
Augie Fackler <augie@google.com>
parents: 38828
diff changeset
   265
            ferr = req.ui.ferr
4019b4542e61 dispatch: have dispatch.dispatch and dispatch._runcatch emit trace events
Augie Fackler <augie@google.com>
parents: 38828
diff changeset
   266
        else:
4019b4542e61 dispatch: have dispatch.dispatch and dispatch._runcatch emit trace events
Augie Fackler <augie@google.com>
parents: 38828
diff changeset
   267
            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
   268
39283
4019b4542e61 dispatch: have dispatch.dispatch and dispatch._runcatch emit trace events
Augie Fackler <augie@google.com>
parents: 38828
diff changeset
   269
        try:
4019b4542e61 dispatch: have dispatch.dispatch and dispatch._runcatch emit trace events
Augie Fackler <augie@google.com>
parents: 38828
diff changeset
   270
            if not req.ui:
4019b4542e61 dispatch: have dispatch.dispatch and dispatch._runcatch emit trace events
Augie Fackler <augie@google.com>
parents: 38828
diff changeset
   271
                req.ui = uimod.ui.load()
4019b4542e61 dispatch: have dispatch.dispatch and dispatch._runcatch emit trace events
Augie Fackler <augie@google.com>
parents: 38828
diff changeset
   272
            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
   273
            if req.earlyoptions[b'traceback']:
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   274
                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
   275
39283
4019b4542e61 dispatch: have dispatch.dispatch and dispatch._runcatch emit trace events
Augie Fackler <augie@google.com>
parents: 38828
diff changeset
   276
            # set ui streams from the request
4019b4542e61 dispatch: have dispatch.dispatch and dispatch._runcatch emit trace events
Augie Fackler <augie@google.com>
parents: 38828
diff changeset
   277
            if req.fin:
4019b4542e61 dispatch: have dispatch.dispatch and dispatch._runcatch emit trace events
Augie Fackler <augie@google.com>
parents: 38828
diff changeset
   278
                req.ui.fin = req.fin
4019b4542e61 dispatch: have dispatch.dispatch and dispatch._runcatch emit trace events
Augie Fackler <augie@google.com>
parents: 38828
diff changeset
   279
            if req.fout:
4019b4542e61 dispatch: have dispatch.dispatch and dispatch._runcatch emit trace events
Augie Fackler <augie@google.com>
parents: 38828
diff changeset
   280
                req.ui.fout = req.fout
4019b4542e61 dispatch: have dispatch.dispatch and dispatch._runcatch emit trace events
Augie Fackler <augie@google.com>
parents: 38828
diff changeset
   281
            if req.ferr:
4019b4542e61 dispatch: have dispatch.dispatch and dispatch._runcatch emit trace events
Augie Fackler <augie@google.com>
parents: 38828
diff changeset
   282
                req.ui.ferr = req.ferr
40634
5542bc9125c9 dispatch: pass around ui.fmsg channel
Yuya Nishihara <yuya@tcha.org>
parents: 40490
diff changeset
   283
            if req.fmsg:
5542bc9125c9 dispatch: pass around ui.fmsg channel
Yuya Nishihara <yuya@tcha.org>
parents: 40490
diff changeset
   284
                req.ui.fmsg = req.fmsg
39283
4019b4542e61 dispatch: have dispatch.dispatch and dispatch._runcatch emit trace events
Augie Fackler <augie@google.com>
parents: 38828
diff changeset
   285
        except error.Abort as inst:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   286
            ferr.write(_(b"abort: %s\n") % inst)
39283
4019b4542e61 dispatch: have dispatch.dispatch and dispatch._runcatch emit trace events
Augie Fackler <augie@google.com>
parents: 38828
diff changeset
   287
            if inst.hint:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   288
                ferr.write(_(b"(%s)\n") % inst.hint)
39283
4019b4542e61 dispatch: have dispatch.dispatch and dispatch._runcatch emit trace events
Augie Fackler <augie@google.com>
parents: 38828
diff changeset
   289
            return -1
4019b4542e61 dispatch: have dispatch.dispatch and dispatch._runcatch emit trace events
Augie Fackler <augie@google.com>
parents: 38828
diff changeset
   290
        except error.ParseError as inst:
4019b4542e61 dispatch: have dispatch.dispatch and dispatch._runcatch emit trace events
Augie Fackler <augie@google.com>
parents: 38828
diff changeset
   291
            _formatparse(ferr.write, inst)
4019b4542e61 dispatch: have dispatch.dispatch and dispatch._runcatch emit trace events
Augie Fackler <augie@google.com>
parents: 38828
diff changeset
   292
            return -1
14615
9fba795dd030 dispatch: assign I/O descriptors from the request to the ui
Idan Kamara <idankk86@gmail.com>
parents: 14613
diff changeset
   293
39283
4019b4542e61 dispatch: have dispatch.dispatch and dispatch._runcatch emit trace events
Augie Fackler <augie@google.com>
parents: 38828
diff changeset
   294
        msg = _formatargs(req.args)
4019b4542e61 dispatch: have dispatch.dispatch and dispatch._runcatch emit trace events
Augie Fackler <augie@google.com>
parents: 38828
diff changeset
   295
        starttime = util.timer()
4019b4542e61 dispatch: have dispatch.dispatch and dispatch._runcatch emit trace events
Augie Fackler <augie@google.com>
parents: 38828
diff changeset
   296
        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
   297
        try:
39283
4019b4542e61 dispatch: have dispatch.dispatch and dispatch._runcatch emit trace events
Augie Fackler <augie@google.com>
parents: 38828
diff changeset
   298
            ret = _runcatch(req) or 0
4019b4542e61 dispatch: have dispatch.dispatch and dispatch._runcatch emit trace events
Augie Fackler <augie@google.com>
parents: 38828
diff changeset
   299
        except error.ProgrammingError as inst:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   300
            req.ui.error(_(b'** ProgrammingError: %s\n') % inst)
39283
4019b4542e61 dispatch: have dispatch.dispatch and dispatch._runcatch emit trace events
Augie Fackler <augie@google.com>
parents: 38828
diff changeset
   301
            if inst.hint:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   302
                req.ui.error(_(b'** (%s)\n') % inst.hint)
39283
4019b4542e61 dispatch: have dispatch.dispatch and dispatch._runcatch emit trace events
Augie Fackler <augie@google.com>
parents: 38828
diff changeset
   303
            raise
4019b4542e61 dispatch: have dispatch.dispatch and dispatch._runcatch emit trace events
Augie Fackler <augie@google.com>
parents: 38828
diff changeset
   304
        except KeyboardInterrupt as inst:
4019b4542e61 dispatch: have dispatch.dispatch and dispatch._runcatch emit trace events
Augie Fackler <augie@google.com>
parents: 38828
diff changeset
   305
            try:
4019b4542e61 dispatch: have dispatch.dispatch and dispatch._runcatch emit trace events
Augie Fackler <augie@google.com>
parents: 38828
diff changeset
   306
                if isinstance(inst, error.SignalInterrupt):
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   307
                    msg = _(b"killed!\n")
39283
4019b4542e61 dispatch: have dispatch.dispatch and dispatch._runcatch emit trace events
Augie Fackler <augie@google.com>
parents: 38828
diff changeset
   308
                else:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   309
                    msg = _(b"interrupted!\n")
39283
4019b4542e61 dispatch: have dispatch.dispatch and dispatch._runcatch emit trace events
Augie Fackler <augie@google.com>
parents: 38828
diff changeset
   310
                req.ui.error(msg)
4019b4542e61 dispatch: have dispatch.dispatch and dispatch._runcatch emit trace events
Augie Fackler <augie@google.com>
parents: 38828
diff changeset
   311
            except error.SignalInterrupt:
4019b4542e61 dispatch: have dispatch.dispatch and dispatch._runcatch emit trace events
Augie Fackler <augie@google.com>
parents: 38828
diff changeset
   312
                # 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: 38828
diff changeset
   313
                # 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: 38828
diff changeset
   314
                pass
4019b4542e61 dispatch: have dispatch.dispatch and dispatch._runcatch emit trace events
Augie Fackler <augie@google.com>
parents: 38828
diff changeset
   315
            except IOError as inst:
4019b4542e61 dispatch: have dispatch.dispatch and dispatch._runcatch emit trace events
Augie Fackler <augie@google.com>
parents: 38828
diff changeset
   316
                if inst.errno != errno.EPIPE:
4019b4542e61 dispatch: have dispatch.dispatch and dispatch._runcatch emit trace events
Augie Fackler <augie@google.com>
parents: 38828
diff changeset
   317
                    raise
4019b4542e61 dispatch: have dispatch.dispatch and dispatch._runcatch emit trace events
Augie Fackler <augie@google.com>
parents: 38828
diff changeset
   318
            ret = -1
4019b4542e61 dispatch: have dispatch.dispatch and dispatch._runcatch emit trace events
Augie Fackler <augie@google.com>
parents: 38828
diff changeset
   319
        finally:
4019b4542e61 dispatch: have dispatch.dispatch and dispatch._runcatch emit trace events
Augie Fackler <augie@google.com>
parents: 38828
diff changeset
   320
            duration = util.timer() - starttime
4019b4542e61 dispatch: have dispatch.dispatch and dispatch._runcatch emit trace events
Augie Fackler <augie@google.com>
parents: 38828
diff changeset
   321
            req.ui.flush()
4019b4542e61 dispatch: have dispatch.dispatch and dispatch._runcatch emit trace events
Augie Fackler <augie@google.com>
parents: 38828
diff changeset
   322
            if req.ui.logblockedtimes:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   323
                req.ui._blockedtimes[b'command_duration'] = duration * 1000
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41193
diff changeset
   324
                req.ui.log(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   325
                    b'uiblocked',
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   326
                    b'ui blocked ms\n',
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41193
diff changeset
   327
                    **pycompat.strkwargs(req.ui._blockedtimes)
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41193
diff changeset
   328
                )
40694
1243295fcc3a logtoprocess: update commandfinish options arguments
Boris Feld <boris.feld@octobus.net>
parents: 40634
diff changeset
   329
            return_code = ret & 255
1243295fcc3a logtoprocess: update commandfinish options arguments
Boris Feld <boris.feld@octobus.net>
parents: 40634
diff changeset
   330
            req.ui.log(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   331
                b"commandfinish",
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   332
                b"%s exited %d after %0.2f seconds\n",
40694
1243295fcc3a logtoprocess: update commandfinish options arguments
Boris Feld <boris.feld@octobus.net>
parents: 40634
diff changeset
   333
                msg,
1243295fcc3a logtoprocess: update commandfinish options arguments
Boris Feld <boris.feld@octobus.net>
parents: 40634
diff changeset
   334
                return_code,
1243295fcc3a logtoprocess: update commandfinish options arguments
Boris Feld <boris.feld@octobus.net>
parents: 40634
diff changeset
   335
                duration,
1243295fcc3a logtoprocess: update commandfinish options arguments
Boris Feld <boris.feld@octobus.net>
parents: 40634
diff changeset
   336
                return_code=return_code,
1243295fcc3a logtoprocess: update commandfinish options arguments
Boris Feld <boris.feld@octobus.net>
parents: 40634
diff changeset
   337
                duration=duration,
1243295fcc3a logtoprocess: update commandfinish options arguments
Boris Feld <boris.feld@octobus.net>
parents: 40634
diff changeset
   338
                canonical_command=req.canonical_command,
1243295fcc3a logtoprocess: update commandfinish options arguments
Boris Feld <boris.feld@octobus.net>
parents: 40634
diff changeset
   339
            )
39283
4019b4542e61 dispatch: have dispatch.dispatch and dispatch._runcatch emit trace events
Augie Fackler <augie@google.com>
parents: 38828
diff changeset
   340
            try:
4019b4542e61 dispatch: have dispatch.dispatch and dispatch._runcatch emit trace events
Augie Fackler <augie@google.com>
parents: 38828
diff changeset
   341
                req._runexithandlers()
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41193
diff changeset
   342
            except:  # exiting, so no re-raises
39283
4019b4542e61 dispatch: have dispatch.dispatch and dispatch._runcatch emit trace events
Augie Fackler <augie@google.com>
parents: 38828
diff changeset
   343
                ret = ret or -1
4019b4542e61 dispatch: have dispatch.dispatch and dispatch._runcatch emit trace events
Augie Fackler <augie@google.com>
parents: 38828
diff changeset
   344
        return ret
5178
18a9fbb5cd78 dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
   345
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41193
diff changeset
   346
14439
80c599eee3f3 dispatch: use the request to store the ui object
Idan Kamara <idankk86@gmail.com>
parents: 14438
diff changeset
   347
def _runcatch(req):
43238
101ae8bbfa02 cleanup: hgdemandimport.tracing accepts strings, not bytes
Augie Fackler <augie@google.com>
parents: 43117
diff changeset
   348
    with tracing.log('dispatch._runcatch'):
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41193
diff changeset
   349
39283
4019b4542e61 dispatch: have dispatch.dispatch and dispatch._runcatch emit trace events
Augie Fackler <augie@google.com>
parents: 38828
diff changeset
   350
        def catchterm(*args):
4019b4542e61 dispatch: have dispatch.dispatch and dispatch._runcatch emit trace events
Augie Fackler <augie@google.com>
parents: 38828
diff changeset
   351
            raise error.SignalInterrupt
5178
18a9fbb5cd78 dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
   352
39283
4019b4542e61 dispatch: have dispatch.dispatch and dispatch._runcatch emit trace events
Augie Fackler <augie@google.com>
parents: 38828
diff changeset
   353
        ui = req.ui
32050
77eaf9539499 dispatch: protect against malicious 'hg serve --stdio' invocations (sec)
Augie Fackler <augie@google.com>
parents: 30681
diff changeset
   354
        try:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   355
            for name in b'SIGBREAK', b'SIGHUP', b'SIGTERM':
39283
4019b4542e61 dispatch: have dispatch.dispatch and dispatch._runcatch emit trace events
Augie Fackler <augie@google.com>
parents: 38828
diff changeset
   356
                num = getattr(signal, name, None)
4019b4542e61 dispatch: have dispatch.dispatch and dispatch._runcatch emit trace events
Augie Fackler <augie@google.com>
parents: 38828
diff changeset
   357
                if num:
4019b4542e61 dispatch: have dispatch.dispatch and dispatch._runcatch emit trace events
Augie Fackler <augie@google.com>
parents: 38828
diff changeset
   358
                    signal.signal(num, catchterm)
4019b4542e61 dispatch: have dispatch.dispatch and dispatch._runcatch emit trace events
Augie Fackler <augie@google.com>
parents: 38828
diff changeset
   359
        except ValueError:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41193
diff changeset
   360
            pass  # happens if called in a thread
32050
77eaf9539499 dispatch: protect against malicious 'hg serve --stdio' invocations (sec)
Augie Fackler <augie@google.com>
parents: 30681
diff changeset
   361
39283
4019b4542e61 dispatch: have dispatch.dispatch and dispatch._runcatch emit trace events
Augie Fackler <augie@google.com>
parents: 38828
diff changeset
   362
        def _runcatchfunc():
4019b4542e61 dispatch: have dispatch.dispatch and dispatch._runcatch emit trace events
Augie Fackler <augie@google.com>
parents: 38828
diff changeset
   363
            realcmd = None
4019b4542e61 dispatch: have dispatch.dispatch and dispatch._runcatch emit trace events
Augie Fackler <augie@google.com>
parents: 38828
diff changeset
   364
            try:
4019b4542e61 dispatch: have dispatch.dispatch and dispatch._runcatch emit trace events
Augie Fackler <augie@google.com>
parents: 38828
diff changeset
   365
                cmdargs = fancyopts.fancyopts(
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41193
diff changeset
   366
                    req.args[:], commands.globalopts, {}
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41193
diff changeset
   367
                )
39283
4019b4542e61 dispatch: have dispatch.dispatch and dispatch._runcatch emit trace events
Augie Fackler <augie@google.com>
parents: 38828
diff changeset
   368
                cmd = cmdargs[0]
4019b4542e61 dispatch: have dispatch.dispatch and dispatch._runcatch emit trace events
Augie Fackler <augie@google.com>
parents: 38828
diff changeset
   369
                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: 38828
diff changeset
   370
                realcmd = aliases[0]
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41193
diff changeset
   371
            except (
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41193
diff changeset
   372
                error.UnknownCommand,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41193
diff changeset
   373
                error.AmbiguousCommand,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41193
diff changeset
   374
                IndexError,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41193
diff changeset
   375
                getopt.GetoptError,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41193
diff changeset
   376
            ):
39283
4019b4542e61 dispatch: have dispatch.dispatch and dispatch._runcatch emit trace events
Augie Fackler <augie@google.com>
parents: 38828
diff changeset
   377
                # 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: 38828
diff changeset
   378
                # 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: 38828
diff changeset
   379
                # 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: 38828
diff changeset
   380
                # 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: 38828
diff changeset
   381
                pass
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   382
            if realcmd == b'serve' and b'--stdio' in cmdargs:
39283
4019b4542e61 dispatch: have dispatch.dispatch and dispatch._runcatch emit trace events
Augie Fackler <augie@google.com>
parents: 38828
diff changeset
   383
                # 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: 38828
diff changeset
   384
                # 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: 38828
diff changeset
   385
                # 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: 38828
diff changeset
   386
                # 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: 38828
diff changeset
   387
                # 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: 38828
diff changeset
   388
                # 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: 38828
diff changeset
   389
                # --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: 38828
diff changeset
   390
                # name. This used to actually run the debugger.
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41193
diff changeset
   391
                if (
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41193
diff changeset
   392
                    len(req.args) != 4
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   393
                    or req.args[0] != b'-R'
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   394
                    or req.args[1].startswith(b'--')
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   395
                    or req.args[2] != b'serve'
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   396
                    or req.args[3] != b'--stdio'
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41193
diff changeset
   397
                ):
39283
4019b4542e61 dispatch: have dispatch.dispatch and dispatch._runcatch emit trace events
Augie Fackler <augie@google.com>
parents: 38828
diff changeset
   398
                    raise error.Abort(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   399
                        _(b'potentially unsafe serve --stdio invocation: %s')
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41193
diff changeset
   400
                        % (stringutil.pprint(req.args),)
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41193
diff changeset
   401
                    )
19639
09573ad59f7b dispatch: move command line --config argument parsing to _runcatch()
Sean Farley <sean.michael.farley@gmail.com>
parents: 19229
diff changeset
   402
39283
4019b4542e61 dispatch: have dispatch.dispatch and dispatch._runcatch emit trace events
Augie Fackler <augie@google.com>
parents: 38828
diff changeset
   403
            try:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   404
                debugger = b'pdb'
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   405
                debugtrace = {b'pdb': pdb.set_trace}
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   406
                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
   407
39283
4019b4542e61 dispatch: have dispatch.dispatch and dispatch._runcatch emit trace events
Augie Fackler <augie@google.com>
parents: 38828
diff changeset
   408
                # read --config before doing anything else
4019b4542e61 dispatch: have dispatch.dispatch and dispatch._runcatch emit trace events
Augie Fackler <augie@google.com>
parents: 38828
diff changeset
   409
                # (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
   410
                cfgs = _parseconfig(req.ui, req.earlyoptions[b'config'])
39283
4019b4542e61 dispatch: have dispatch.dispatch and dispatch._runcatch emit trace events
Augie Fackler <augie@google.com>
parents: 38828
diff changeset
   411
4019b4542e61 dispatch: have dispatch.dispatch and dispatch._runcatch emit trace events
Augie Fackler <augie@google.com>
parents: 38828
diff changeset
   412
                if req.repo:
4019b4542e61 dispatch: have dispatch.dispatch and dispatch._runcatch emit trace events
Augie Fackler <augie@google.com>
parents: 38828
diff changeset
   413
                    # 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: 38828
diff changeset
   414
                    # the repo ui
4019b4542e61 dispatch: have dispatch.dispatch and dispatch._runcatch emit trace events
Augie Fackler <augie@google.com>
parents: 38828
diff changeset
   415
                    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
   416
                        req.repo.ui.setconfig(
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   417
                            sec, name, val, source=b'--config'
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   418
                        )
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
   419
39283
4019b4542e61 dispatch: have dispatch.dispatch and dispatch._runcatch emit trace events
Augie Fackler <augie@google.com>
parents: 38828
diff changeset
   420
                # developer config: ui.debugger
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   421
                debugger = ui.config(b"ui", b"debugger")
39283
4019b4542e61 dispatch: have dispatch.dispatch and dispatch._runcatch emit trace events
Augie Fackler <augie@google.com>
parents: 38828
diff changeset
   422
                debugmod = pdb
4019b4542e61 dispatch: have dispatch.dispatch and dispatch._runcatch emit trace events
Augie Fackler <augie@google.com>
parents: 38828
diff changeset
   423
                if not debugger or ui.plain():
4019b4542e61 dispatch: have dispatch.dispatch and dispatch._runcatch emit trace events
Augie Fackler <augie@google.com>
parents: 38828
diff changeset
   424
                    # 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
   425
                    debugger = b'pdb'
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   426
                elif req.earlyoptions[b'debugger']:
39283
4019b4542e61 dispatch: have dispatch.dispatch and dispatch._runcatch emit trace events
Augie Fackler <augie@google.com>
parents: 38828
diff changeset
   427
                    # 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: 38828
diff changeset
   428
                    # 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: 38828
diff changeset
   429
                    # debugging has been requested
4019b4542e61 dispatch: have dispatch.dispatch and dispatch._runcatch emit trace events
Augie Fackler <augie@google.com>
parents: 38828
diff changeset
   430
                    with demandimport.deactivated():
4019b4542e61 dispatch: have dispatch.dispatch and dispatch._runcatch emit trace events
Augie Fackler <augie@google.com>
parents: 38828
diff changeset
   431
                        try:
4019b4542e61 dispatch: have dispatch.dispatch and dispatch._runcatch emit trace events
Augie Fackler <augie@google.com>
parents: 38828
diff changeset
   432
                            debugmod = __import__(debugger)
4019b4542e61 dispatch: have dispatch.dispatch and dispatch._runcatch emit trace events
Augie Fackler <augie@google.com>
parents: 38828
diff changeset
   433
                        except ImportError:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41193
diff changeset
   434
                            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
   435
39283
4019b4542e61 dispatch: have dispatch.dispatch and dispatch._runcatch emit trace events
Augie Fackler <augie@google.com>
parents: 38828
diff changeset
   436
                debugtrace[debugger] = debugmod.set_trace
4019b4542e61 dispatch: have dispatch.dispatch and dispatch._runcatch emit trace events
Augie Fackler <augie@google.com>
parents: 38828
diff changeset
   437
                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
   438
39283
4019b4542e61 dispatch: have dispatch.dispatch and dispatch._runcatch emit trace events
Augie Fackler <augie@google.com>
parents: 38828
diff changeset
   439
                # 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
   440
                if req.earlyoptions[b'debugger']:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41193
diff changeset
   441
                    ui.warn(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41193
diff changeset
   442
                        _(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   443
                            b"entering debugger - "
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   444
                            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
   445
                        )
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41193
diff changeset
   446
                    )
5178
18a9fbb5cd78 dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
   447
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41193
diff changeset
   448
                    if (
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   449
                        debugger != b'pdb'
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   450
                        and debugtrace[debugger] == debugtrace[b'pdb']
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41193
diff changeset
   451
                    ):
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41193
diff changeset
   452
                        ui.warn(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41193
diff changeset
   453
                            _(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   454
                                b"%s debugger specified "
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   455
                                b"but its module was not found\n"
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41193
diff changeset
   456
                            )
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41193
diff changeset
   457
                            % debugger
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41193
diff changeset
   458
                        )
39283
4019b4542e61 dispatch: have dispatch.dispatch and dispatch._runcatch emit trace events
Augie Fackler <augie@google.com>
parents: 38828
diff changeset
   459
                    with demandimport.deactivated():
4019b4542e61 dispatch: have dispatch.dispatch and dispatch._runcatch emit trace events
Augie Fackler <augie@google.com>
parents: 38828
diff changeset
   460
                        debugtrace[debugger]()
4019b4542e61 dispatch: have dispatch.dispatch and dispatch._runcatch emit trace events
Augie Fackler <augie@google.com>
parents: 38828
diff changeset
   461
                try:
4019b4542e61 dispatch: have dispatch.dispatch and dispatch._runcatch emit trace events
Augie Fackler <augie@google.com>
parents: 38828
diff changeset
   462
                    return _dispatch(req)
4019b4542e61 dispatch: have dispatch.dispatch and dispatch._runcatch emit trace events
Augie Fackler <augie@google.com>
parents: 38828
diff changeset
   463
                finally:
4019b4542e61 dispatch: have dispatch.dispatch and dispatch._runcatch emit trace events
Augie Fackler <augie@google.com>
parents: 38828
diff changeset
   464
                    ui.flush()
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41193
diff changeset
   465
            except:  # re-raises
39283
4019b4542e61 dispatch: have dispatch.dispatch and dispatch._runcatch emit trace events
Augie Fackler <augie@google.com>
parents: 38828
diff changeset
   466
                # 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
   467
                if req.earlyoptions[b'debugger']:
39283
4019b4542e61 dispatch: have dispatch.dispatch and dispatch._runcatch emit trace events
Augie Fackler <augie@google.com>
parents: 38828
diff changeset
   468
                    traceback.print_exc()
4019b4542e61 dispatch: have dispatch.dispatch and dispatch._runcatch emit trace events
Augie Fackler <augie@google.com>
parents: 38828
diff changeset
   469
                    debugmortem[debugger](sys.exc_info()[2])
4019b4542e61 dispatch: have dispatch.dispatch and dispatch._runcatch emit trace events
Augie Fackler <augie@google.com>
parents: 38828
diff changeset
   470
                raise
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41193
diff changeset
   471
39283
4019b4542e61 dispatch: have dispatch.dispatch and dispatch._runcatch emit trace events
Augie Fackler <augie@google.com>
parents: 38828
diff changeset
   472
        return _callcatch(ui, _runcatchfunc)
29773
39149b6036e6 dispatch: split global error handling out so it can be reused
Jun Wu <quark@fb.com>
parents: 29132
diff changeset
   473
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41193
diff changeset
   474
32040
0fb78cb90ca7 dispatch: mark callcatch() as a private function
Yuya Nishihara <yuya@tcha.org>
parents: 31960
diff changeset
   475
def _callcatch(ui, func):
30529
4338f87dbf6f dispatch: move part of callcatch to scmutil
Jun Wu <quark@fb.com>
parents: 30528
diff changeset
   476
    """like scmutil.callcatch but handles more high-level exceptions about
4338f87dbf6f dispatch: move part of callcatch to scmutil
Jun Wu <quark@fb.com>
parents: 30528
diff changeset
   477
    config parsing and commands. besides, use handlecommandexception to handle
4338f87dbf6f dispatch: move part of callcatch to scmutil
Jun Wu <quark@fb.com>
parents: 30528
diff changeset
   478
    uncaught exceptions.
29773
39149b6036e6 dispatch: split global error handling out so it can be reused
Jun Wu <quark@fb.com>
parents: 29132
diff changeset
   479
    """
39149b6036e6 dispatch: split global error handling out so it can be reused
Jun Wu <quark@fb.com>
parents: 29132
diff changeset
   480
    try:
30529
4338f87dbf6f dispatch: move part of callcatch to scmutil
Jun Wu <quark@fb.com>
parents: 30528
diff changeset
   481
        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
   482
    except error.AmbiguousCommand as inst:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41193
diff changeset
   483
        ui.warn(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   484
            _(b"hg: command '%s' is ambiguous:\n    %s\n")
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   485
            % (inst.args[0], b" ".join(inst.args[1]))
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41193
diff changeset
   486
        )
25660
328739ea70c3 global: mass rewrite to use modern exception syntax
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25329
diff changeset
   487
    except error.CommandError as inst:
7645
020a896a5292 dispatch: sort exception handlers
Matt Mackall <mpm@selenic.com>
parents: 7644
diff changeset
   488
        if inst.args[0]:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   489
            ui.pager(b'help')
32643
3ce53a499334 dispatch: convert exception payload to bytes more carefully
Augie Fackler <raf@durin42.com>
parents: 32599
diff changeset
   490
            msgbytes = pycompat.bytestr(inst.args[1])
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   491
            ui.warn(_(b"hg %s: %s\n") % (inst.args[0], msgbytes))
14286
005a540e9aee help: add -c/--command flag to only show command help (issue2799)
Martin Geisler <mg@aragost.com>
parents: 14265
diff changeset
   492
            commands.help_(ui, inst.args[0], full=False, command=True)
7645
020a896a5292 dispatch: sort exception handlers
Matt Mackall <mpm@selenic.com>
parents: 7644
diff changeset
   493
        else:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   494
            ui.warn(_(b"hg: %s\n") % inst.args[1])
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   495
            ui.warn(_(b"(use 'hg help -v' for a list of global options)\n"))
30529
4338f87dbf6f dispatch: move part of callcatch to scmutil
Jun Wu <quark@fb.com>
parents: 30528
diff changeset
   496
    except error.ParseError as inst:
4338f87dbf6f dispatch: move part of callcatch to scmutil
Jun Wu <quark@fb.com>
parents: 30528
diff changeset
   497
        _formatparse(ui.warn, inst)
4338f87dbf6f dispatch: move part of callcatch to scmutil
Jun Wu <quark@fb.com>
parents: 30528
diff changeset
   498
        return -1
25660
328739ea70c3 global: mass rewrite to use modern exception syntax
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25329
diff changeset
   499
    except error.UnknownCommand as inst:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   500
        nocmdmsg = _(b"hg: unknown command '%s'\n") % inst.args[0]
10364
de1e7099d100 dispatch: provide help for disabled extensions and commands
Brodie Rao <me+hg@dackz.net>
parents: 10282
diff changeset
   501
        try:
de1e7099d100 dispatch: provide help for disabled extensions and commands
Brodie Rao <me+hg@dackz.net>
parents: 10282
diff changeset
   502
            # 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
   503
            # (but don't check for extensions themselves)
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41193
diff changeset
   504
            formatted = help.formattedhelp(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41193
diff changeset
   505
                ui, commands, inst.args[0], unknowncmd=True
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41193
diff changeset
   506
            )
31080
ab20491b1760 dispatch: rearrange 'unknown command' code to better employ pager
Augie Fackler <augie@google.com>
parents: 31047
diff changeset
   507
            ui.warn(nocmdmsg)
ab20491b1760 dispatch: rearrange 'unknown command' code to better employ pager
Augie Fackler <augie@google.com>
parents: 31047
diff changeset
   508
            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
   509
        except (error.UnknownCommand, error.Abort):
24222
02d7b5cd373b dispatch: offer suggestions of similar-named commands
Augie Fackler <augie@google.com>
parents: 24221
diff changeset
   510
            suggested = False
02d7b5cd373b dispatch: offer suggestions of similar-named commands
Augie Fackler <augie@google.com>
parents: 24221
diff changeset
   511
            if len(inst.args) == 2:
02d7b5cd373b dispatch: offer suggestions of similar-named commands
Augie Fackler <augie@google.com>
parents: 24221
diff changeset
   512
                sim = _getsimilar(inst.args[1], inst.args[0])
02d7b5cd373b dispatch: offer suggestions of similar-named commands
Augie Fackler <augie@google.com>
parents: 24221
diff changeset
   513
                if sim:
31080
ab20491b1760 dispatch: rearrange 'unknown command' code to better employ pager
Augie Fackler <augie@google.com>
parents: 31047
diff changeset
   514
                    ui.warn(nocmdmsg)
27623
b3376fba4ab9 dispatch: report similar names consistently
Bryan O'Sullivan <bos@serpentine.com>
parents: 27615
diff changeset
   515
                    _reportsimilar(ui.warn, sim)
24222
02d7b5cd373b dispatch: offer suggestions of similar-named commands
Augie Fackler <augie@google.com>
parents: 24221
diff changeset
   516
                    suggested = True
02d7b5cd373b dispatch: offer suggestions of similar-named commands
Augie Fackler <augie@google.com>
parents: 24221
diff changeset
   517
            if not suggested:
31080
ab20491b1760 dispatch: rearrange 'unknown command' code to better employ pager
Augie Fackler <augie@google.com>
parents: 31047
diff changeset
   518
                ui.warn(nocmdmsg)
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   519
                ui.warn(_(b"(use 'hg help' for a list of commands)\n"))
30529
4338f87dbf6f dispatch: move part of callcatch to scmutil
Jun Wu <quark@fb.com>
parents: 30528
diff changeset
   520
    except IOError:
4338f87dbf6f dispatch: move part of callcatch to scmutil
Jun Wu <quark@fb.com>
parents: 30528
diff changeset
   521
        raise
7645
020a896a5292 dispatch: sort exception handlers
Matt Mackall <mpm@selenic.com>
parents: 7644
diff changeset
   522
    except KeyboardInterrupt:
28520
84cc72c5771e dispatch: catch KeyboardInterrupt more broadly
Yuya Nishihara <yuya@tcha.org>
parents: 28515
diff changeset
   523
        raise
30529
4338f87dbf6f dispatch: move part of callcatch to scmutil
Jun Wu <quark@fb.com>
parents: 30528
diff changeset
   524
    except:  # probably re-raises
28784
09750b1231c2 dispatch: factor out command failure handling into a function
Martijn Pieters <mjpieters@fb.com>
parents: 28695
diff changeset
   525
        if not handlecommandexception(ui):
09750b1231c2 dispatch: factor out command failure handling into a function
Martijn Pieters <mjpieters@fb.com>
parents: 28695
diff changeset
   526
            raise
5178
18a9fbb5cd78 dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
   527
18a9fbb5cd78 dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
   528
    return -1
18a9fbb5cd78 dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
   529
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41193
diff changeset
   530
14265
e4ab5ae193f2 add positional arguments to non-shell aliases
Alexander Solovyov <alexander@solovyov.net>
parents: 14096
diff changeset
   531
def aliasargs(fn, givenargs):
34104
5361771f9714 wrapfunction: use functools.partial if possible
Jun Wu <quark@fb.com>
parents: 34040
diff changeset
   532
    args = []
5361771f9714 wrapfunction: use functools.partial if possible
Jun Wu <quark@fb.com>
parents: 34040
diff changeset
   533
    # only care about alias 'args', ignore 'args' set by extensions.wrapfunction
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   534
    if not util.safehasattr(fn, b'_origfunc'):
34104
5361771f9714 wrapfunction: use functools.partial if possible
Jun Wu <quark@fb.com>
parents: 34040
diff changeset
   535
        args = getattr(fn, 'args', args)
16294
795d591b6ef5 alias: abort on missing positional args (issue3331)
Matt Mackall <mpm@selenic.com>
parents: 16277
diff changeset
   536
    if args:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   537
        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
   538
e4ab5ae193f2 add positional arguments to non-shell aliases
Alexander Solovyov <alexander@solovyov.net>
parents: 14096
diff changeset
   539
        nums = []
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41193
diff changeset
   540
14265
e4ab5ae193f2 add positional arguments to non-shell aliases
Alexander Solovyov <alexander@solovyov.net>
parents: 14096
diff changeset
   541
        def replacer(m):
e4ab5ae193f2 add positional arguments to non-shell aliases
Alexander Solovyov <alexander@solovyov.net>
parents: 14096
diff changeset
   542
            num = int(m.group(1)) - 1
e4ab5ae193f2 add positional arguments to non-shell aliases
Alexander Solovyov <alexander@solovyov.net>
parents: 14096
diff changeset
   543
            nums.append(num)
16277
1c2aaf05f7d7 aliases: use empty string for missing position parameters (issue3331)
Matt Mackall <mpm@selenic.com>
parents: 15781
diff changeset
   544
            if num < len(givenargs):
1c2aaf05f7d7 aliases: use empty string for missing position parameters (issue3331)
Matt Mackall <mpm@selenic.com>
parents: 15781
diff changeset
   545
                return givenargs[num]
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   546
            raise error.Abort(_(b'too few arguments for command alias'))
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41193
diff changeset
   547
31498
492c64afc54c py3: make the regular expression bytes to prevent TypeError
Pulkit Goyal <7895pulkit@gmail.com>
parents: 31314
diff changeset
   548
        cmd = re.sub(br'\$(\d+|\$)', replacer, cmd)
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41193
diff changeset
   549
        givenargs = [x for i, x in enumerate(givenargs) if i not in nums]
30681
caf7e1c5efe4 py3: have a bytes version of shlex.split()
Pulkit Goyal <7895pulkit@gmail.com>
parents: 30657
diff changeset
   550
        args = pycompat.shlexsplit(cmd)
14265
e4ab5ae193f2 add positional arguments to non-shell aliases
Alexander Solovyov <alexander@solovyov.net>
parents: 14096
diff changeset
   551
    return args + givenargs
8655
21688b8a594b Move alias into core
Brendan Cully <brendan@kublai.com>
parents: 8304
diff changeset
   552
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41193
diff changeset
   553
22158
bc2132dfc0a4 alias: expand "$@" as list of parameters quoted individually (BC) (issue4200)
Siddharth Agarwal <sid0@fb.com>
parents: 21961
diff changeset
   554
def aliasinterpolate(name, args, cmd):
bc2132dfc0a4 alias: expand "$@" as list of parameters quoted individually (BC) (issue4200)
Siddharth Agarwal <sid0@fb.com>
parents: 21961
diff changeset
   555
    '''interpolate args into cmd for shell aliases
bc2132dfc0a4 alias: expand "$@" as list of parameters quoted individually (BC) (issue4200)
Siddharth Agarwal <sid0@fb.com>
parents: 21961
diff changeset
   556
bc2132dfc0a4 alias: expand "$@" as list of parameters quoted individually (BC) (issue4200)
Siddharth Agarwal <sid0@fb.com>
parents: 21961
diff changeset
   557
    This also handles $0, $@ and "$@".
bc2132dfc0a4 alias: expand "$@" as list of parameters quoted individually (BC) (issue4200)
Siddharth Agarwal <sid0@fb.com>
parents: 21961
diff changeset
   558
    '''
bc2132dfc0a4 alias: expand "$@" as list of parameters quoted individually (BC) (issue4200)
Siddharth Agarwal <sid0@fb.com>
parents: 21961
diff changeset
   559
    # 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
   560
    # built to match prefix + patterns.
44470
9d2b2df2c2ba cleanup: run pyupgrade on our source tree to clean up varying things
Augie Fackler <augie@google.com>
parents: 44349
diff changeset
   561
    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
   562
    replacemap[b'$0'] = name
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   563
    replacemap[b'$$'] = b'$'
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   564
    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
   565
    # 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
   566
    # 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
   567
    # 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
   568
    # 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
   569
    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
   570
    # escape '\$' for regex
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   571
    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
   572
    r = re.compile(regex)
bc2132dfc0a4 alias: expand "$@" as list of parameters quoted individually (BC) (issue4200)
Siddharth Agarwal <sid0@fb.com>
parents: 21961
diff changeset
   573
    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
   574
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41193
diff changeset
   575
8655
21688b8a594b Move alias into core
Brendan Cully <brendan@kublai.com>
parents: 8304
diff changeset
   576
class cmdalias(object):
37137
6890b7e991a4 help: supporting both help and doc for aliases
Rodrigo Damazio <rdamazio@google.com>
parents: 37123
diff changeset
   577
    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
   578
        self.name = self.cmd = name
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   579
        self.cmdname = b''
8655
21688b8a594b Move alias into core
Brendan Cully <brendan@kublai.com>
parents: 8304
diff changeset
   580
        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
   581
        self.fn = None
29087
ad1bdea43965 dispatch: defer environment variable resolution in alias commands (BC)
Jun Wu <quark@fb.com>
parents: 28861
diff changeset
   582
        self.givenargs = []
8655
21688b8a594b Move alias into core
Brendan Cully <brendan@kublai.com>
parents: 8304
diff changeset
   583
        self.opts = []
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   584
        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
   585
        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
   586
        self.unknowncmd = False
28828
3640c1702c43 help: report source of aliases
timeless <timeless@mozdev.org>
parents: 28821
diff changeset
   587
        self.source = source
8655
21688b8a594b Move alias into core
Brendan Cully <brendan@kublai.com>
parents: 8304
diff changeset
   588
21688b8a594b Move alias into core
Brendan Cully <brendan@kublai.com>
parents: 8304
diff changeset
   589
        try:
12039
18e1e7520b67 alias: make shadowing behavior more consistent (issue2054)
Brodie Rao <brodie@bitheap.org>
parents: 11712
diff changeset
   590
            aliases, entry = cmdutil.findcmd(self.name, cmdtable)
43106
d783f945a701 py3: finish porting iteritems() to pycompat and remove source transformer
Gregory Szorc <gregory.szorc@gmail.com>
parents: 43089
diff changeset
   591
            for alias, e in pycompat.iteritems(cmdtable):
12039
18e1e7520b67 alias: make shadowing behavior more consistent (issue2054)
Brodie Rao <brodie@bitheap.org>
parents: 11712
diff changeset
   592
                if e is entry:
18e1e7520b67 alias: make shadowing behavior more consistent (issue2054)
Brodie Rao <brodie@bitheap.org>
parents: 11712
diff changeset
   593
                    self.cmd = alias
18e1e7520b67 alias: make shadowing behavior more consistent (issue2054)
Brodie Rao <brodie@bitheap.org>
parents: 11712
diff changeset
   594
                    break
8655
21688b8a594b Move alias into core
Brendan Cully <brendan@kublai.com>
parents: 8304
diff changeset
   595
            self.shadows = True
21688b8a594b Move alias into core
Brendan Cully <brendan@kublai.com>
parents: 8304
diff changeset
   596
        except error.UnknownCommand:
21688b8a594b Move alias into core
Brendan Cully <brendan@kublai.com>
parents: 8304
diff changeset
   597
            self.shadows = False
21688b8a594b Move alias into core
Brendan Cully <brendan@kublai.com>
parents: 8304
diff changeset
   598
21688b8a594b Move alias into core
Brendan Cully <brendan@kublai.com>
parents: 8304
diff changeset
   599
        if not self.definition:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   600
            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
   601
            return
21688b8a594b Move alias into core
Brendan Cully <brendan@kublai.com>
parents: 8304
diff changeset
   602
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   603
        if self.definition.startswith(b'!'):
37137
6890b7e991a4 help: supporting both help and doc for aliases
Rodrigo Damazio <rdamazio@google.com>
parents: 37123
diff changeset
   604
            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
   605
            self.shell = True
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41193
diff changeset
   606
11524
24965bb270b7 dispatch: add shell aliases
Steve Losh <steve@stevelosh.com>
parents: 11495
diff changeset
   607
            def fn(ui, *args):
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   608
                env = {b'HG_ARGS': b' '.join((self.name,) + args)}
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41193
diff changeset
   609
11989
f853873fc66d aliases: provide more flexible ways to work with shell alias arguments
Steve Losh <steve@stevelosh.com>
parents: 11985
diff changeset
   610
                def _checkvar(m):
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   611
                    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
   612
                        return m.group()
777cef34a890 dispatch: support for $ escaping in shell-alias definition
Roman Sokolov <sokolov.r.v@gmail.com>
parents: 13382
diff changeset
   613
                    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
   614
                        return m.group()
f853873fc66d aliases: provide more flexible ways to work with shell alias arguments
Steve Losh <steve@stevelosh.com>
parents: 11985
diff changeset
   615
                    else:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41193
diff changeset
   616
                        ui.debug(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   617
                            b"No argument found for substitution "
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   618
                            b"of %i variable in alias '%s' definition.\n"
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41193
diff changeset
   619
                            % (int(m.groups()[0]), self.name)
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41193
diff changeset
   620
                        )
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   621
                        return b''
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41193
diff changeset
   622
37137
6890b7e991a4 help: supporting both help and doc for aliases
Rodrigo Damazio <rdamazio@google.com>
parents: 37123
diff changeset
   623
                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
   624
                cmd = aliasinterpolate(self.name, args, cmd)
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41193
diff changeset
   625
                return ui.system(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   626
                    cmd, environ=env, blockedtag=b'alias_%s' % self.name
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41193
diff changeset
   627
                )
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41193
diff changeset
   628
11524
24965bb270b7 dispatch: add shell aliases
Steve Losh <steve@stevelosh.com>
parents: 11495
diff changeset
   629
            self.fn = fn
40490
444861dc1e55 help: displaying documented aliases by default
rdamazio@google.com
parents: 40402
diff changeset
   630
            self.alias = True
37137
6890b7e991a4 help: supporting both help and doc for aliases
Rodrigo Damazio <rdamazio@google.com>
parents: 37123
diff changeset
   631
            self._populatehelp(ui, name, shdef, self.fn)
11524
24965bb270b7 dispatch: add shell aliases
Steve Losh <steve@stevelosh.com>
parents: 11495
diff changeset
   632
            return
24965bb270b7 dispatch: add shell aliases
Steve Losh <steve@stevelosh.com>
parents: 11495
diff changeset
   633
21569
c5afb07c33d3 alias: handle shlex error in command aliases
Yuya Nishihara <yuya@tcha.org>
parents: 21556
diff changeset
   634
        try:
30681
caf7e1c5efe4 py3: have a bytes version of shlex.split()
Pulkit Goyal <7895pulkit@gmail.com>
parents: 30657
diff changeset
   635
            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
   636
        except ValueError as inst:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   637
            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
   638
                self.name,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41193
diff changeset
   639
                stringutil.forcebytestr(inst),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41193
diff changeset
   640
            )
21569
c5afb07c33d3 alias: handle shlex error in command aliases
Yuya Nishihara <yuya@tcha.org>
parents: 21556
diff changeset
   641
            return
35234
7ce0ba3a1c32 dispatch: replace _earlygetopt(strip=True) with new parser
Yuya Nishihara <yuya@tcha.org>
parents: 35233
diff changeset
   642
        earlyopts, args = _earlysplitopts(args)
7ce0ba3a1c32 dispatch: replace _earlygetopt(strip=True) with new parser
Yuya Nishihara <yuya@tcha.org>
parents: 35233
diff changeset
   643
        if earlyopts:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41193
diff changeset
   644
            self.badalias = _(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   645
                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
   646
                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
   647
            ) % (self.name, b'/'.join(pycompat.ziplist(*earlyopts)[0]))
35234
7ce0ba3a1c32 dispatch: replace _earlygetopt(strip=True) with new parser
Yuya Nishihara <yuya@tcha.org>
parents: 35233
diff changeset
   648
            return
12092
4982fa38e544 alias: print what command is being shadowed in debug message
Brodie Rao <brodie@bitheap.org>
parents: 12070
diff changeset
   649
        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
   650
        self.givenargs = args
8655
21688b8a594b Move alias into core
Brendan Cully <brendan@kublai.com>
parents: 8304
diff changeset
   651
21688b8a594b Move alias into core
Brendan Cully <brendan@kublai.com>
parents: 8304
diff changeset
   652
        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
   653
            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
   654
            if len(tableentry) > 2:
37137
6890b7e991a4 help: supporting both help and doc for aliases
Rodrigo Damazio <rdamazio@google.com>
parents: 37123
diff changeset
   655
                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
   656
            else:
8bce1e0d2801 alias: do not crash when aliased command has no usage help text
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents: 9825
diff changeset
   657
                self.fn, self.opts = tableentry
37137
6890b7e991a4 help: supporting both help and doc for aliases
Rodrigo Damazio <rdamazio@google.com>
parents: 37123
diff changeset
   658
                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
   659
40490
444861dc1e55 help: displaying documented aliases by default
rdamazio@google.com
parents: 40402
diff changeset
   660
            self.alias = True
37137
6890b7e991a4 help: supporting both help and doc for aliases
Rodrigo Damazio <rdamazio@google.com>
parents: 37123
diff changeset
   661
            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
   662
8655
21688b8a594b Move alias into core
Brendan Cully <brendan@kublai.com>
parents: 8304
diff changeset
   663
        except error.UnknownCommand:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   664
            self.badalias = _(
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   665
                b"alias '%s' resolves to unknown command '%s'"
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   666
            ) % (self.name, cmd,)
22161
063628423fd1 alias: provide "unknowncmd" flag to tell help to look for disabled command
Yuya Nishihara <yuya@tcha.org>
parents: 22160
diff changeset
   667
            self.unknowncmd = True
8655
21688b8a594b Move alias into core
Brendan Cully <brendan@kublai.com>
parents: 8304
diff changeset
   668
        except error.AmbiguousCommand:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41193
diff changeset
   669
            self.badalias = _(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   670
                b"alias '%s' resolves to ambiguous command '%s'"
44349
a0ec05d93c8e cleanup: re-run black on the codebase
Augie Fackler <augie@google.com>
parents: 44161
diff changeset
   671
            ) % (self.name, cmd,)
8655
21688b8a594b Move alias into core
Brendan Cully <brendan@kublai.com>
parents: 8304
diff changeset
   672
37137
6890b7e991a4 help: supporting both help and doc for aliases
Rodrigo Damazio <rdamazio@google.com>
parents: 37123
diff changeset
   673
    def _populatehelp(self, ui, name, cmd, fn, defaulthelp=None):
37142
aa55c5354b8f alias: reject non-ascii characters in user help/doc strings
Yuya Nishihara <yuya@tcha.org>
parents: 37137
diff changeset
   674
        # 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: 37137
diff changeset
   675
        cfg = {}
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   676
        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
   677
            v = ui.config(b'alias', b'%s:%s' % (name, k), None)
37142
aa55c5354b8f alias: reject non-ascii characters in user help/doc strings
Yuya Nishihara <yuya@tcha.org>
parents: 37137
diff changeset
   678
            if v is None:
aa55c5354b8f alias: reject non-ascii characters in user help/doc strings
Yuya Nishihara <yuya@tcha.org>
parents: 37137
diff changeset
   679
                continue
aa55c5354b8f alias: reject non-ascii characters in user help/doc strings
Yuya Nishihara <yuya@tcha.org>
parents: 37137
diff changeset
   680
            if not encoding.isasciistr(v):
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41193
diff changeset
   681
                self.badalias = _(
43117
8ff1ecfadcd1 cleanup: join string literals that are already on one line
Martin von Zweigbergk <martinvonz@google.com>
parents: 43106
diff changeset
   682
                    b"non-ASCII character in alias definition '%s:%s'"
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41193
diff changeset
   683
                ) % (name, k)
37142
aa55c5354b8f alias: reject non-ascii characters in user help/doc strings
Yuya Nishihara <yuya@tcha.org>
parents: 37137
diff changeset
   684
                return
aa55c5354b8f alias: reject non-ascii characters in user help/doc strings
Yuya Nishihara <yuya@tcha.org>
parents: 37137
diff changeset
   685
            cfg[k] = v
aa55c5354b8f alias: reject non-ascii characters in user help/doc strings
Yuya Nishihara <yuya@tcha.org>
parents: 37137
diff changeset
   686
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   687
        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
   688
        if self.help and self.help.startswith(b"hg " + cmd):
37137
6890b7e991a4 help: supporting both help and doc for aliases
Rodrigo Damazio <rdamazio@google.com>
parents: 37123
diff changeset
   689
            # 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
   690
            self.help = self.help[4 + len(cmd) :]
37137
6890b7e991a4 help: supporting both help and doc for aliases
Rodrigo Damazio <rdamazio@google.com>
parents: 37123
diff changeset
   691
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   692
        self.owndoc = b'doc' in cfg
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   693
        doc = cfg.get(b'doc', pycompat.getdoc(fn))
37143
1d56c539794e py3: bytes/unicode dance on __doc__ of cmdalias
Yuya Nishihara <yuya@tcha.org>
parents: 37142
diff changeset
   694
        if doc is not None:
1d56c539794e py3: bytes/unicode dance on __doc__ of cmdalias
Yuya Nishihara <yuya@tcha.org>
parents: 37142
diff changeset
   695
            doc = pycompat.sysstr(doc)
1d56c539794e py3: bytes/unicode dance on __doc__ of cmdalias
Yuya Nishihara <yuya@tcha.org>
parents: 37142
diff changeset
   696
        self.__doc__ = doc
37137
6890b7e991a4 help: supporting both help and doc for aliases
Rodrigo Damazio <rdamazio@google.com>
parents: 37123
diff changeset
   697
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   698
        self.helpcategory = cfg.get(
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   699
            b'category', registrar.command.CATEGORY_NONE
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   700
        )
40490
444861dc1e55 help: displaying documented aliases by default
rdamazio@google.com
parents: 40402
diff changeset
   701
29087
ad1bdea43965 dispatch: defer environment variable resolution in alias commands (BC)
Jun Wu <quark@fb.com>
parents: 28861
diff changeset
   702
    @property
ad1bdea43965 dispatch: defer environment variable resolution in alias commands (BC)
Jun Wu <quark@fb.com>
parents: 28861
diff changeset
   703
    def args(self):
31634
2632df096fc0 dispatch: use pycompat.maplist() instead of map() to get a list
Pulkit Goyal <7895pulkit@gmail.com>
parents: 31509
diff changeset
   704
        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
   705
        return aliasargs(self.fn, args)
ad1bdea43965 dispatch: defer environment variable resolution in alias commands (BC)
Jun Wu <quark@fb.com>
parents: 28861
diff changeset
   706
28621
d856e85a8a7a dispatch: make cmdalias forward command attributes to function
Yuya Nishihara <yuya@tcha.org>
parents: 28538
diff changeset
   707
    def __getattr__(self, name):
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41193
diff changeset
   708
        adefaults = {
43554
9f70512ae2cf cleanup: remove pointless r-prefixes on single-quoted strings
Augie Fackler <augie@google.com>
parents: 43238
diff changeset
   709
            'norepo': True,
9f70512ae2cf cleanup: remove pointless r-prefixes on single-quoted strings
Augie Fackler <augie@google.com>
parents: 43238
diff changeset
   710
            'intents': set(),
9f70512ae2cf cleanup: remove pointless r-prefixes on single-quoted strings
Augie Fackler <augie@google.com>
parents: 43238
diff changeset
   711
            'optionalrepo': False,
9f70512ae2cf cleanup: remove pointless r-prefixes on single-quoted strings
Augie Fackler <augie@google.com>
parents: 43238
diff changeset
   712
            'inferrepo': False,
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41193
diff changeset
   713
        }
28621
d856e85a8a7a dispatch: make cmdalias forward command attributes to function
Yuya Nishihara <yuya@tcha.org>
parents: 28538
diff changeset
   714
        if name not in adefaults:
d856e85a8a7a dispatch: make cmdalias forward command attributes to function
Yuya Nishihara <yuya@tcha.org>
parents: 28538
diff changeset
   715
            raise AttributeError(name)
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   716
        if self.badalias or util.safehasattr(self, b'shell'):
28621
d856e85a8a7a dispatch: make cmdalias forward command attributes to function
Yuya Nishihara <yuya@tcha.org>
parents: 28538
diff changeset
   717
            return adefaults[name]
d856e85a8a7a dispatch: make cmdalias forward command attributes to function
Yuya Nishihara <yuya@tcha.org>
parents: 28538
diff changeset
   718
        return getattr(self.fn, name)
d856e85a8a7a dispatch: make cmdalias forward command attributes to function
Yuya Nishihara <yuya@tcha.org>
parents: 28538
diff changeset
   719
8655
21688b8a594b Move alias into core
Brendan Cully <brendan@kublai.com>
parents: 8304
diff changeset
   720
    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
   721
        if self.badalias:
22164
efd65e51bc0b alias: exit from bad definition by Abort
Yuya Nishihara <yuya@tcha.org>
parents: 22163
diff changeset
   722
            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
   723
            if self.unknowncmd:
10364
de1e7099d100 dispatch: provide help for disabled extensions and commands
Brodie Rao <me+hg@dackz.net>
parents: 10282
diff changeset
   724
                try:
de1e7099d100 dispatch: provide help for disabled extensions and commands
Brodie Rao <me+hg@dackz.net>
parents: 10282
diff changeset
   725
                    # 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
   726
                    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
   727
                    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
   728
                except error.UnknownCommand:
de1e7099d100 dispatch: provide help for disabled extensions and commands
Brodie Rao <me+hg@dackz.net>
parents: 10282
diff changeset
   729
                    pass
26587
56b2bcea2529 error: get Abort from 'error' instead of 'util'
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 26421
diff changeset
   730
            raise error.Abort(self.badalias, hint=hint)
8655
21688b8a594b Move alias into core
Brendan Cully <brendan@kublai.com>
parents: 8304
diff changeset
   731
        if self.shadows:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41193
diff changeset
   732
            ui.debug(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   733
                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
   734
            )
8655
21688b8a594b Move alias into core
Brendan Cully <brendan@kublai.com>
parents: 8304
diff changeset
   735
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41193
diff changeset
   736
        ui.log(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   737
            b'commandalias',
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   738
            b"alias '%s' expands to '%s'\n",
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41193
diff changeset
   739
            self.name,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41193
diff changeset
   740
            self.definition,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41193
diff changeset
   741
        )
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   742
        if util.safehasattr(self, b'shell'):
11989
f853873fc66d aliases: provide more flexible ways to work with shell alias arguments
Steve Losh <steve@stevelosh.com>
parents: 11985
diff changeset
   743
            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
   744
        else:
12093
cd895084a4cd alias: on --debug, print expansion when it has invalid arguments
Brodie Rao <brodie@bitheap.org>
parents: 12092
diff changeset
   745
            try:
21556
5e13507a3b4e alias: fix loss of non-zero return code in command aliases
Yuya Nishihara <yuya@tcha.org>
parents: 20829
diff changeset
   746
                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
   747
            except error.SignatureError:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   748
                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
   749
                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
   750
                raise
8655
21688b8a594b Move alias into core
Brendan Cully <brendan@kublai.com>
parents: 8304
diff changeset
   751
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41193
diff changeset
   752
34313
bd50aa1aa035 alias: make alias command lazily resolved
Jun Wu <quark@fb.com>
parents: 34312
diff changeset
   753
class lazyaliasentry(object):
bd50aa1aa035 alias: make alias command lazily resolved
Jun Wu <quark@fb.com>
parents: 34312
diff changeset
   754
    """like a typical command entry (func, opts, help), but is lazy"""
bd50aa1aa035 alias: make alias command lazily resolved
Jun Wu <quark@fb.com>
parents: 34312
diff changeset
   755
37137
6890b7e991a4 help: supporting both help and doc for aliases
Rodrigo Damazio <rdamazio@google.com>
parents: 37123
diff changeset
   756
    def __init__(self, ui, name, definition, cmdtable, source):
6890b7e991a4 help: supporting both help and doc for aliases
Rodrigo Damazio <rdamazio@google.com>
parents: 37123
diff changeset
   757
        self.ui = ui
34313
bd50aa1aa035 alias: make alias command lazily resolved
Jun Wu <quark@fb.com>
parents: 34312
diff changeset
   758
        self.name = name
bd50aa1aa035 alias: make alias command lazily resolved
Jun Wu <quark@fb.com>
parents: 34312
diff changeset
   759
        self.definition = definition
bd50aa1aa035 alias: make alias command lazily resolved
Jun Wu <quark@fb.com>
parents: 34312
diff changeset
   760
        self.cmdtable = cmdtable.copy()
bd50aa1aa035 alias: make alias command lazily resolved
Jun Wu <quark@fb.com>
parents: 34312
diff changeset
   761
        self.source = source
40490
444861dc1e55 help: displaying documented aliases by default
rdamazio@google.com
parents: 40402
diff changeset
   762
        self.alias = True
34313
bd50aa1aa035 alias: make alias command lazily resolved
Jun Wu <quark@fb.com>
parents: 34312
diff changeset
   763
bd50aa1aa035 alias: make alias command lazily resolved
Jun Wu <quark@fb.com>
parents: 34312
diff changeset
   764
    @util.propertycache
bd50aa1aa035 alias: make alias command lazily resolved
Jun Wu <quark@fb.com>
parents: 34312
diff changeset
   765
    def _aliasdef(self):
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41193
diff changeset
   766
        return cmdalias(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41193
diff changeset
   767
            self.ui, self.name, self.definition, self.cmdtable, self.source
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41193
diff changeset
   768
        )
34313
bd50aa1aa035 alias: make alias command lazily resolved
Jun Wu <quark@fb.com>
parents: 34312
diff changeset
   769
bd50aa1aa035 alias: make alias command lazily resolved
Jun Wu <quark@fb.com>
parents: 34312
diff changeset
   770
    def __getitem__(self, n):
bd50aa1aa035 alias: make alias command lazily resolved
Jun Wu <quark@fb.com>
parents: 34312
diff changeset
   771
        aliasdef = self._aliasdef
bd50aa1aa035 alias: make alias command lazily resolved
Jun Wu <quark@fb.com>
parents: 34312
diff changeset
   772
        if n == 0:
bd50aa1aa035 alias: make alias command lazily resolved
Jun Wu <quark@fb.com>
parents: 34312
diff changeset
   773
            return aliasdef
bd50aa1aa035 alias: make alias command lazily resolved
Jun Wu <quark@fb.com>
parents: 34312
diff changeset
   774
        elif n == 1:
bd50aa1aa035 alias: make alias command lazily resolved
Jun Wu <quark@fb.com>
parents: 34312
diff changeset
   775
            return aliasdef.opts
bd50aa1aa035 alias: make alias command lazily resolved
Jun Wu <quark@fb.com>
parents: 34312
diff changeset
   776
        elif n == 2:
bd50aa1aa035 alias: make alias command lazily resolved
Jun Wu <quark@fb.com>
parents: 34312
diff changeset
   777
            return aliasdef.help
bd50aa1aa035 alias: make alias command lazily resolved
Jun Wu <quark@fb.com>
parents: 34312
diff changeset
   778
        else:
bd50aa1aa035 alias: make alias command lazily resolved
Jun Wu <quark@fb.com>
parents: 34312
diff changeset
   779
            raise IndexError
bd50aa1aa035 alias: make alias command lazily resolved
Jun Wu <quark@fb.com>
parents: 34312
diff changeset
   780
bd50aa1aa035 alias: make alias command lazily resolved
Jun Wu <quark@fb.com>
parents: 34312
diff changeset
   781
    def __iter__(self):
bd50aa1aa035 alias: make alias command lazily resolved
Jun Wu <quark@fb.com>
parents: 34312
diff changeset
   782
        for i in range(3):
bd50aa1aa035 alias: make alias command lazily resolved
Jun Wu <quark@fb.com>
parents: 34312
diff changeset
   783
            yield self[i]
bd50aa1aa035 alias: make alias command lazily resolved
Jun Wu <quark@fb.com>
parents: 34312
diff changeset
   784
bd50aa1aa035 alias: make alias command lazily resolved
Jun Wu <quark@fb.com>
parents: 34312
diff changeset
   785
    def __len__(self):
bd50aa1aa035 alias: make alias command lazily resolved
Jun Wu <quark@fb.com>
parents: 34312
diff changeset
   786
        return 3
bd50aa1aa035 alias: make alias command lazily resolved
Jun Wu <quark@fb.com>
parents: 34312
diff changeset
   787
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41193
diff changeset
   788
8655
21688b8a594b Move alias into core
Brendan Cully <brendan@kublai.com>
parents: 8304
diff changeset
   789
def addaliases(ui, cmdtable):
21688b8a594b Move alias into core
Brendan Cully <brendan@kublai.com>
parents: 8304
diff changeset
   790
    # aliases are processed after extensions have been loaded, so they
21688b8a594b Move alias into core
Brendan Cully <brendan@kublai.com>
parents: 8304
diff changeset
   791
    # 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
   792
    # 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
   793
    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
   794
        try:
34313
bd50aa1aa035 alias: make alias command lazily resolved
Jun Wu <quark@fb.com>
parents: 34312
diff changeset
   795
            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
   796
                continue
f4b7be3f8430 dispatch: don't rewrap aliases that have the same definition
Idan Kamara <idankk86@gmail.com>
parents: 14992
diff changeset
   797
        except (KeyError, AttributeError):
f4b7be3f8430 dispatch: don't rewrap aliases that have the same definition
Idan Kamara <idankk86@gmail.com>
parents: 14992
diff changeset
   798
            # 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
   799
            pass
f4b7be3f8430 dispatch: don't rewrap aliases that have the same definition
Idan Kamara <idankk86@gmail.com>
parents: 14992
diff changeset
   800
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   801
        source = ui.configsource(b'alias', alias)
37137
6890b7e991a4 help: supporting both help and doc for aliases
Rodrigo Damazio <rdamazio@google.com>
parents: 37123
diff changeset
   802
        entry = lazyaliasentry(ui, alias, definition, cmdtable, source)
34313
bd50aa1aa035 alias: make alias command lazily resolved
Jun Wu <quark@fb.com>
parents: 34312
diff changeset
   803
        cmdtable[alias] = entry
8655
21688b8a594b Move alias into core
Brendan Cully <brendan@kublai.com>
parents: 8304
diff changeset
   804
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41193
diff changeset
   805
5178
18a9fbb5cd78 dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
   806
def _parse(ui, args):
18a9fbb5cd78 dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
   807
    options = {}
18a9fbb5cd78 dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
   808
    cmdoptions = {}
18a9fbb5cd78 dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
   809
18a9fbb5cd78 dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
   810
    try:
18a9fbb5cd78 dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
   811
        args = fancyopts.fancyopts(args, commands.globalopts, options)
30581
541949a10a68 fancyopts: switch from fancyopts.getopt.* to getopt.*
Pulkit Goyal <7895pulkit@gmail.com>
parents: 30564
diff changeset
   812
    except getopt.GetoptError as inst:
37087
f0b6fbea00cf stringutil: bulk-replace call sites to point to new module
Yuya Nishihara <yuya@tcha.org>
parents: 36752
diff changeset
   813
        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
   814
18a9fbb5cd78 dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
   815
    if args:
18a9fbb5cd78 dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
   816
        cmd, args = args[0], args[1:]
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41193
diff changeset
   817
        aliases, entry = cmdutil.findcmd(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   818
            cmd, commands.table, ui.configbool(b"ui", b"strict")
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41193
diff changeset
   819
        )
5178
18a9fbb5cd78 dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
   820
        cmd = aliases[0]
14265
e4ab5ae193f2 add positional arguments to non-shell aliases
Alexander Solovyov <alexander@solovyov.net>
parents: 14096
diff changeset
   821
        args = aliasargs(entry[0], args)
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   822
        defaults = ui.config(b"defaults", cmd)
5178
18a9fbb5cd78 dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
   823
        if defaults:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41193
diff changeset
   824
            args = (
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41193
diff changeset
   825
                pycompat.maplist(util.expandpath, pycompat.shlexsplit(defaults))
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41193
diff changeset
   826
                + args
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41193
diff changeset
   827
            )
9875
d6a95c5f6ff9 dispatch: minor refactoring
Henri Wiechers <hwiechers@gmail.com>
parents: 9825
diff changeset
   828
        c = list(entry[1])
5178
18a9fbb5cd78 dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
   829
    else:
18a9fbb5cd78 dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
   830
        cmd = None
18a9fbb5cd78 dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
   831
        c = []
18a9fbb5cd78 dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
   832
18a9fbb5cd78 dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
   833
    # combine global options into local
18a9fbb5cd78 dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
   834
    for o in commands.globalopts:
18a9fbb5cd78 dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
   835
        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
   836
18a9fbb5cd78 dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
   837
    try:
29833
61a4cdc98307 dispatch: explicitly pass fancyopts optional arg as a keyword
Augie Fackler <augie@google.com>
parents: 29795
diff changeset
   838
        args = fancyopts.fancyopts(args, c, cmdoptions, gnu=True)
30581
541949a10a68 fancyopts: switch from fancyopts.getopt.* to getopt.*
Pulkit Goyal <7895pulkit@gmail.com>
parents: 30564
diff changeset
   839
    except getopt.GetoptError as inst:
37087
f0b6fbea00cf stringutil: bulk-replace call sites to point to new module
Yuya Nishihara <yuya@tcha.org>
parents: 36752
diff changeset
   840
        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
   841
18a9fbb5cd78 dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
   842
    # separate global options back out
18a9fbb5cd78 dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
   843
    for o in commands.globalopts:
18a9fbb5cd78 dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
   844
        n = o[1]
18a9fbb5cd78 dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
   845
        options[n] = cmdoptions[n]
18a9fbb5cd78 dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
   846
        del cmdoptions[n]
18a9fbb5cd78 dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
   847
9875
d6a95c5f6ff9 dispatch: minor refactoring
Henri Wiechers <hwiechers@gmail.com>
parents: 9825
diff changeset
   848
    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
   849
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41193
diff changeset
   850
8137
7fd0616b3d80 ui: kill updateopts
Matt Mackall <mpm@selenic.com>
parents: 8136
diff changeset
   851
def _parseconfig(ui, config):
5178
18a9fbb5cd78 dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
   852
    """parse the --config options from the command line"""
14753
10dcb3e7cb55 dispatch: return read config options
Idan Kamara <idankk86@gmail.com>
parents: 14752
diff changeset
   853
    configs = []
10dcb3e7cb55 dispatch: return read config options
Idan Kamara <idankk86@gmail.com>
parents: 14752
diff changeset
   854
5178
18a9fbb5cd78 dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
   855
    for cfg in config:
18a9fbb5cd78 dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
   856
        try:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   857
            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
   858
            section, name = name.split(b'.', 1)
5178
18a9fbb5cd78 dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
   859
            if not section or not name:
18a9fbb5cd78 dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
   860
                raise IndexError
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   861
            ui.setconfig(section, name, value, b'--config')
14753
10dcb3e7cb55 dispatch: return read config options
Idan Kamara <idankk86@gmail.com>
parents: 14752
diff changeset
   862
            configs.append((section, name, value))
5178
18a9fbb5cd78 dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
   863
        except (IndexError, ValueError):
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41193
diff changeset
   864
            raise error.Abort(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41193
diff changeset
   865
                _(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   866
                    b'malformed --config option: %r '
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   867
                    b'(use --config section.name=value)'
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41193
diff changeset
   868
                )
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41193
diff changeset
   869
                % pycompat.bytestr(cfg)
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41193
diff changeset
   870
            )
5178
18a9fbb5cd78 dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
   871
14753
10dcb3e7cb55 dispatch: return read config options
Idan Kamara <idankk86@gmail.com>
parents: 14752
diff changeset
   872
    return configs
10dcb3e7cb55 dispatch: return read config options
Idan Kamara <idankk86@gmail.com>
parents: 14752
diff changeset
   873
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41193
diff changeset
   874
35233
6e6d0a5b88e6 dispatch: replace _earlyreq*() with new fancyopts-based parser
Yuya Nishihara <yuya@tcha.org>
parents: 35232
diff changeset
   875
def _earlyparseopts(ui, args):
34996
c9740b69b9b7 dispatch: add HGPLAIN=+strictflags to restrict early parsing of global options
Yuya Nishihara <yuya@tcha.org>
parents: 34986
diff changeset
   876
    options = {}
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41193
diff changeset
   877
    fancyopts.fancyopts(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41193
diff changeset
   878
        args,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41193
diff changeset
   879
        commands.globalopts,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41193
diff changeset
   880
        options,
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   881
        gnu=not ui.plain(b'strictflags'),
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41193
diff changeset
   882
        early=True,
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   883
        optaliases={b'repository': [b'repo']},
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41193
diff changeset
   884
    )
34996
c9740b69b9b7 dispatch: add HGPLAIN=+strictflags to restrict early parsing of global options
Yuya Nishihara <yuya@tcha.org>
parents: 34986
diff changeset
   885
    return options
c9740b69b9b7 dispatch: add HGPLAIN=+strictflags to restrict early parsing of global options
Yuya Nishihara <yuya@tcha.org>
parents: 34986
diff changeset
   886
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41193
diff changeset
   887
35234
7ce0ba3a1c32 dispatch: replace _earlygetopt(strip=True) with new parser
Yuya Nishihara <yuya@tcha.org>
parents: 35233
diff changeset
   888
def _earlysplitopts(args):
7ce0ba3a1c32 dispatch: replace _earlygetopt(strip=True) with new parser
Yuya Nishihara <yuya@tcha.org>
parents: 35233
diff changeset
   889
    """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
   890
    shortoptions = b'R:'
35234
7ce0ba3a1c32 dispatch: replace _earlygetopt(strip=True) with new parser
Yuya Nishihara <yuya@tcha.org>
parents: 35233
diff changeset
   891
    # 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
   892
    longoptions = [b'cwd=', b'repository=', b'repo=', b'config=']
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41193
diff changeset
   893
    return fancyopts.earlygetopt(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41193
diff changeset
   894
        args, shortoptions, longoptions, gnu=True, keepsep=True
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41193
diff changeset
   895
    )
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41193
diff changeset
   896
5178
18a9fbb5cd78 dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
   897
11330
713ae78bb583 provide pre- and post- hooks with parsed command line arguments.
Chad Dombrova <chadrik@gmail.com>
parents: 11305
diff changeset
   898
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
   899
    # run pre-hook, and abort if it fails
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41193
diff changeset
   900
    hook.hook(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41193
diff changeset
   901
        lui,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41193
diff changeset
   902
        repo,
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   903
        b"pre-%s" % cmd,
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41193
diff changeset
   904
        True,
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   905
        args=b" ".join(fullargs),
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41193
diff changeset
   906
        pats=cmdpats,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41193
diff changeset
   907
        opts=cmdoptions,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41193
diff changeset
   908
    )
29129
e6dfb0e4eeef dispatch: add fail-* family of hooks
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 29114
diff changeset
   909
    try:
e6dfb0e4eeef dispatch: add fail-* family of hooks
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 29114
diff changeset
   910
        ret = _runcommand(ui, options, cmd, d)
e6dfb0e4eeef dispatch: add fail-* family of hooks
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 29114
diff changeset
   911
        # run post-hook, passing command result
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41193
diff changeset
   912
        hook.hook(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41193
diff changeset
   913
            lui,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41193
diff changeset
   914
            repo,
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   915
            b"post-%s" % cmd,
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41193
diff changeset
   916
            False,
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   917
            args=b" ".join(fullargs),
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41193
diff changeset
   918
            result=ret,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41193
diff changeset
   919
            pats=cmdpats,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41193
diff changeset
   920
            opts=cmdoptions,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41193
diff changeset
   921
        )
29129
e6dfb0e4eeef dispatch: add fail-* family of hooks
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 29114
diff changeset
   922
    except Exception:
e6dfb0e4eeef dispatch: add fail-* family of hooks
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 29114
diff changeset
   923
        # run failure hook and re-raise
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41193
diff changeset
   924
        hook.hook(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41193
diff changeset
   925
            lui,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41193
diff changeset
   926
            repo,
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   927
            b"fail-%s" % cmd,
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41193
diff changeset
   928
            False,
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   929
            args=b" ".join(fullargs),
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41193
diff changeset
   930
            pats=cmdpats,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41193
diff changeset
   931
            opts=cmdoptions,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41193
diff changeset
   932
        )
29129
e6dfb0e4eeef dispatch: add fail-* family of hooks
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 29114
diff changeset
   933
        raise
7819
14b703252f14 dispatch: extract command execution block into method
Bill Barry <after.fallout@gmail.com>
parents: 7772
diff changeset
   934
    return ret
14b703252f14 dispatch: extract command execution block into method
Bill Barry <after.fallout@gmail.com>
parents: 7772
diff changeset
   935
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41193
diff changeset
   936
28263
59509c6724c7 dispatch: add wd parameter to _getlocal
Jun Wu <quark@fb.com>
parents: 28081
diff changeset
   937
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
   938
    """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
   939
12536
208fc9ad6a48 alias: only allow global options before a shell alias, pass later ones through
Steve Losh <steve@stevelosh.com>
parents: 12276
diff changeset
   940
    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
   941
    """
28263
59509c6724c7 dispatch: add wd parameter to _getlocal
Jun Wu <quark@fb.com>
parents: 28081
diff changeset
   942
    if wd is None:
59509c6724c7 dispatch: add wd parameter to _getlocal
Jun Wu <quark@fb.com>
parents: 28081
diff changeset
   943
        try:
39823
24e493ec2229 py3: rename pycompat.getcwd() to encoding.getcwd() (API)
Matt Harbison <matt_harbison@yahoo.com>
parents: 39529
diff changeset
   944
            wd = encoding.getcwd()
28263
59509c6724c7 dispatch: add wd parameter to _getlocal
Jun Wu <quark@fb.com>
parents: 28081
diff changeset
   945
        except OSError as e:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41193
diff changeset
   946
            raise error.Abort(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   947
                _(b"error getting current working directory: %s")
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41193
diff changeset
   948
                % encoding.strtolocal(e.strerror)
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41193
diff changeset
   949
            )
44161
ef11dfc56674 config: also respect HGRCSKIPREPO in `dispatch._getlocal`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 44019
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()
44161
ef11dfc56674 config: also respect HGRCSKIPREPO in `dispatch._getlocal`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 44019
diff changeset
   956
        if rcutil.use_repo_hgrc():
ef11dfc56674 config: also respect HGRCSKIPREPO in `dispatch._getlocal`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 44019
diff changeset
   957
            lui.readconfig(os.path.join(path, b".hg", b"hgrc"), path)
5178
18a9fbb5cd78 dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
   958
34985
d3d35a55e03b dispatch: convert non-list option parsed by _earlygetopt() to string
Yuya Nishihara <yuya@tcha.org>
parents: 34984
diff changeset
   959
    if rpath:
d3d35a55e03b dispatch: convert non-list option parsed by _earlygetopt() to string
Yuya Nishihara <yuya@tcha.org>
parents: 34984
diff changeset
   960
        path = lui.expandpath(rpath)
8190
9b8ac5fb7760 ui: kill most users of parentui name and arg, replace with .copy()
Matt Mackall <mpm@selenic.com>
parents: 8144
diff changeset
   961
        lui = ui.copy()
44161
ef11dfc56674 config: also respect HGRCSKIPREPO in `dispatch._getlocal`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 44019
diff changeset
   962
        if rcutil.use_repo_hgrc():
ef11dfc56674 config: also respect HGRCSKIPREPO in `dispatch._getlocal`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 44019
diff changeset
   963
            lui.readconfig(os.path.join(path, b".hg", b"hgrc"), path)
5178
18a9fbb5cd78 dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
   964
12536
208fc9ad6a48 alias: only allow global options before a shell alias, pass later ones through
Steve Losh <steve@stevelosh.com>
parents: 12276
diff changeset
   965
    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
   966
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41193
diff changeset
   967
29132
12769703d4ba dispatch: always load extensions before running shell aliases (issue5230)
Jun Wu <quark@fb.com>
parents: 29129
diff changeset
   968
def _checkshellalias(lui, ui, args):
12769703d4ba dispatch: always load extensions before running shell aliases (issue5230)
Jun Wu <quark@fb.com>
parents: 29129
diff changeset
   969
    """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
   970
    options = {}
12748
d10369fefd01 alias: fail gracefully when invalid global options are given (issue2442)
Steve Losh <steve@stevelosh.com>
parents: 12637
diff changeset
   971
d10369fefd01 alias: fail gracefully when invalid global options are given (issue2442)
Steve Losh <steve@stevelosh.com>
parents: 12637
diff changeset
   972
    try:
d10369fefd01 alias: fail gracefully when invalid global options are given (issue2442)
Steve Losh <steve@stevelosh.com>
parents: 12637
diff changeset
   973
        args = fancyopts.fancyopts(args, commands.globalopts, options)
30581
541949a10a68 fancyopts: switch from fancyopts.getopt.* to getopt.*
Pulkit Goyal <7895pulkit@gmail.com>
parents: 30564
diff changeset
   974
    except getopt.GetoptError:
12748
d10369fefd01 alias: fail gracefully when invalid global options are given (issue2442)
Steve Losh <steve@stevelosh.com>
parents: 12637
diff changeset
   975
        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
   976
208fc9ad6a48 alias: only allow global options before a shell alias, pass later ones through
Steve Losh <steve@stevelosh.com>
parents: 12276
diff changeset
   977
    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
   978
        return
208fc9ad6a48 alias: only allow global options before a shell alias, pass later ones through
Steve Losh <steve@stevelosh.com>
parents: 12276
diff changeset
   979
29132
12769703d4ba dispatch: always load extensions before running shell aliases (issue5230)
Jun Wu <quark@fb.com>
parents: 29129
diff changeset
   980
    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
   981
208fc9ad6a48 alias: only allow global options before a shell alias, pass later ones through
Steve Losh <steve@stevelosh.com>
parents: 12276
diff changeset
   982
    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
   983
    try:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   984
        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
   985
        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
   986
    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
   987
        return
208fc9ad6a48 alias: only allow global options before a shell alias, pass later ones through
Steve Losh <steve@stevelosh.com>
parents: 12276
diff changeset
   988
208fc9ad6a48 alias: only allow global options before a shell alias, pass later ones through
Steve Losh <steve@stevelosh.com>
parents: 12276
diff changeset
   989
    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
   990
    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
   991
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   992
    if cmd and util.safehasattr(fn, b'shell'):
34986
02845f7441af dispatch: verify result of early command parsing
Yuya Nishihara <yuya@tcha.org>
parents: 34985
diff changeset
   993
        # shell alias shouldn't receive early options which are consumed by hg
35234
7ce0ba3a1c32 dispatch: replace _earlygetopt(strip=True) with new parser
Yuya Nishihara <yuya@tcha.org>
parents: 35233
diff changeset
   994
        _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
   995
        d = lambda: fn(ui, *args[1:])
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41193
diff changeset
   996
        return lambda: runcommand(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41193
diff changeset
   997
            lui, None, cmd, args[:1], ui, options, d, [], {}
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41193
diff changeset
   998
        )
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41193
diff changeset
   999
12536
208fc9ad6a48 alias: only allow global options before a shell alias, pass later ones through
Steve Losh <steve@stevelosh.com>
parents: 12276
diff changeset
  1000
14439
80c599eee3f3 dispatch: use the request to store the ui object
Idan Kamara <idankk86@gmail.com>
parents: 14438
diff changeset
  1001
def _dispatch(req):
14438
08bfec2ef031 dispatch: wrap dispatch related information in a request class
Idan Kamara <idankk86@gmail.com>
parents: 14286
diff changeset
  1002
    args = req.args
14439
80c599eee3f3 dispatch: use the request to store the ui object
Idan Kamara <idankk86@gmail.com>
parents: 14438
diff changeset
  1003
    ui = req.ui
80c599eee3f3 dispatch: use the request to store the ui object
Idan Kamara <idankk86@gmail.com>
parents: 14438
diff changeset
  1004
12536
208fc9ad6a48 alias: only allow global options before a shell alias, pass later ones through
Steve Losh <steve@stevelosh.com>
parents: 12276
diff changeset
  1005
    # check for cwd
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1006
    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
  1007
    if cwd:
34985
d3d35a55e03b dispatch: convert non-list option parsed by _earlygetopt() to string
Yuya Nishihara <yuya@tcha.org>
parents: 34984
diff changeset
  1008
        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
  1009
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1010
    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
  1011
    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
  1012
32331
bd872f64a8ba cleanup: use set literals
Martin von Zweigbergk <martinvonz@google.com>
parents: 32207
diff changeset
  1013
    uis = {ui, lui}
30953
69a3c6c8bf95 dispatch: move detection of profiling earlier during startup
Bryan O'Sullivan <bryano@fb.com>
parents: 30937
diff changeset
  1014
69a3c6c8bf95 dispatch: move detection of profiling earlier during startup
Bryan O'Sullivan <bryano@fb.com>
parents: 30937
diff changeset
  1015
    if req.repo:
69a3c6c8bf95 dispatch: move detection of profiling earlier during startup
Bryan O'Sullivan <bryano@fb.com>
parents: 30937
diff changeset
  1016
        uis.add(req.repo.ui)
69a3c6c8bf95 dispatch: move detection of profiling earlier during startup
Bryan O'Sullivan <bryano@fb.com>
parents: 30937
diff changeset
  1017
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41193
diff changeset
  1018
    if (
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1019
        req.earlyoptions[b'verbose']
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1020
        or req.earlyoptions[b'debug']
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1021
        or req.earlyoptions[b'quiet']
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41193
diff changeset
  1022
    ):
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1023
        for opt in (b'verbose', b'debug', b'quiet'):
38535
b86664c81833 debug: process --debug flag earlier
Boris Feld <boris.feld@octobus.net>
parents: 38143
diff changeset
  1024
            val = pycompat.bytestr(bool(req.earlyoptions[opt]))
b86664c81833 debug: process --debug flag earlier
Boris Feld <boris.feld@octobus.net>
parents: 38143
diff changeset
  1025
            for ui_ in uis:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1026
                ui_.setconfig(b'ui', opt, val, b'--' + opt)
38535
b86664c81833 debug: process --debug flag earlier
Boris Feld <boris.feld@octobus.net>
parents: 38143
diff changeset
  1027
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1028
    if req.earlyoptions[b'profile']:
30953
69a3c6c8bf95 dispatch: move detection of profiling earlier during startup
Bryan O'Sullivan <bryano@fb.com>
parents: 30937
diff changeset
  1029
        for ui_ in uis:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1030
            ui_.setconfig(b'profiling', b'enabled', b'true', b'--profile')
30953
69a3c6c8bf95 dispatch: move detection of profiling earlier during startup
Bryan O'Sullivan <bryano@fb.com>
parents: 30937
diff changeset
  1031
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1032
    profile = lui.configbool(b'profiling', b'enabled')
32808
eede022fc142 profile: drop maybeprofile
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 32807
diff changeset
  1033
    with profiling.profile(lui, enabled=profile) as profiler:
30954
6d642ecf1a89 dispatch: start profiling earlier
Bryan O'Sullivan <bryano@fb.com>
parents: 30953
diff changeset
  1034
        # Configure extensions in phases: uisetup, extsetup, cmdtable, and
33065
ef46d432e2e4 dispatch: remove unused _loaded
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 33064
diff changeset
  1035
        # reposetup
30954
6d642ecf1a89 dispatch: start profiling earlier
Bryan O'Sullivan <bryano@fb.com>
parents: 30953
diff changeset
  1036
        extensions.loadall(lui)
6d642ecf1a89 dispatch: start profiling earlier
Bryan O'Sullivan <bryano@fb.com>
parents: 30953
diff changeset
  1037
        # Propagate any changes to lui.__class__ by extensions
6d642ecf1a89 dispatch: start profiling earlier
Bryan O'Sullivan <bryano@fb.com>
parents: 30953
diff changeset
  1038
        ui.__class__ = lui.__class__
5828
863e237b58fb dispatch: allow extensions to provide setup code
Kirill Smelkov <kirr@mns.spb.ru>
parents: 5664
diff changeset
  1039
30954
6d642ecf1a89 dispatch: start profiling earlier
Bryan O'Sullivan <bryano@fb.com>
parents: 30953
diff changeset
  1040
        # (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
  1041
30954
6d642ecf1a89 dispatch: start profiling earlier
Bryan O'Sullivan <bryano@fb.com>
parents: 30953
diff changeset
  1042
        # (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
  1043
30954
6d642ecf1a89 dispatch: start profiling earlier
Bryan O'Sullivan <bryano@fb.com>
parents: 30953
diff changeset
  1044
        addaliases(lui, commands.table)
8655
21688b8a594b Move alias into core
Brendan Cully <brendan@kublai.com>
parents: 8304
diff changeset
  1045
30954
6d642ecf1a89 dispatch: start profiling earlier
Bryan O'Sullivan <bryano@fb.com>
parents: 30953
diff changeset
  1046
        # All aliases and commands are completely defined, now.
6d642ecf1a89 dispatch: start profiling earlier
Bryan O'Sullivan <bryano@fb.com>
parents: 30953
diff changeset
  1047
        # Check abbreviation/ambiguity of shell alias.
6d642ecf1a89 dispatch: start profiling earlier
Bryan O'Sullivan <bryano@fb.com>
parents: 30953
diff changeset
  1048
        shellaliasfn = _checkshellalias(lui, ui, args)
6d642ecf1a89 dispatch: start profiling earlier
Bryan O'Sullivan <bryano@fb.com>
parents: 30953
diff changeset
  1049
        if shellaliasfn:
40763
c93d046d4300 extensions: add "uipopulate" hook, called per instance, not per process
Yuya Nishihara <yuya@tcha.org>
parents: 40694
diff changeset
  1050
            # 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: 40694
diff changeset
  1051
            for ui_ in uis:
c93d046d4300 extensions: add "uipopulate" hook, called per instance, not per process
Yuya Nishihara <yuya@tcha.org>
parents: 40694
diff changeset
  1052
                extensions.populateui(ui_)
30010
b19c2679289c dispatch: make hg --profile wrap reposetup
Arun Kulshreshtha <kulshrax@fb.com>
parents: 30009
diff changeset
  1053
            return shellaliasfn()
22377
f98abe3146b2 dispatch: check shell alias again after loading extensions (issue4355)
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 22376
diff changeset
  1054
30954
6d642ecf1a89 dispatch: start profiling earlier
Bryan O'Sullivan <bryano@fb.com>
parents: 30953
diff changeset
  1055
        # check for fallback encoding
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1056
        fallback = lui.config(b'ui', b'fallbackencoding')
30954
6d642ecf1a89 dispatch: start profiling earlier
Bryan O'Sullivan <bryano@fb.com>
parents: 30953
diff changeset
  1057
        if fallback:
6d642ecf1a89 dispatch: start profiling earlier
Bryan O'Sullivan <bryano@fb.com>
parents: 30953
diff changeset
  1058
            encoding.fallbackencoding = fallback
5178
18a9fbb5cd78 dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
  1059
30954
6d642ecf1a89 dispatch: start profiling earlier
Bryan O'Sullivan <bryano@fb.com>
parents: 30953
diff changeset
  1060
        fullargs = args
6d642ecf1a89 dispatch: start profiling earlier
Bryan O'Sullivan <bryano@fb.com>
parents: 30953
diff changeset
  1061
        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
  1062
40402
106adc261492 logtoprocess: sends the canonical command name to the subprocess
Boris Feld <boris.feld@octobus.net>
parents: 39823
diff changeset
  1063
        # 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: 39823
diff changeset
  1064
        req.canonical_command = cmd
106adc261492 logtoprocess: sends the canonical command name to the subprocess
Boris Feld <boris.feld@octobus.net>
parents: 39823
diff changeset
  1065
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1066
        if options[b"config"] != req.earlyoptions[b"config"]:
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1067
            raise error.Abort(_(b"option --config may not be abbreviated!"))
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1068
        if options[b"cwd"] != req.earlyoptions[b"cwd"]:
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1069
            raise error.Abort(_(b"option --cwd may not be abbreviated!"))
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1070
        if options[b"repository"] != req.earlyoptions[b"repository"]:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41193
diff changeset
  1071
            raise error.Abort(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41193
diff changeset
  1072
                _(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1073
                    b"option -R has to be separated from other options (e.g. not "
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1074
                    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
  1075
                )
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41193
diff changeset
  1076
            )
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1077
        if options[b"debugger"] != req.earlyoptions[b"debugger"]:
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1078
            raise error.Abort(_(b"option --debugger may not be abbreviated!"))
34982
d9aba3730d30 dispatch: abort if early boolean options can't be parsed
Yuya Nishihara <yuya@tcha.org>
parents: 34981
diff changeset
  1079
        # 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
  1080
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1081
        if options[b"encoding"]:
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1082
            encoding.encoding = options[b"encoding"]
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1083
        if options[b"encodingmode"]:
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1084
            encoding.encodingmode = options[b"encodingmode"]
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1085
        if options[b"time"]:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41193
diff changeset
  1086
30954
6d642ecf1a89 dispatch: start profiling earlier
Bryan O'Sullivan <bryano@fb.com>
parents: 30953
diff changeset
  1087
            def get_times():
6d642ecf1a89 dispatch: start profiling earlier
Bryan O'Sullivan <bryano@fb.com>
parents: 30953
diff changeset
  1088
                t = os.times()
6d642ecf1a89 dispatch: start profiling earlier
Bryan O'Sullivan <bryano@fb.com>
parents: 30953
diff changeset
  1089
                if t[4] == 0.0:
44019
6b90f5c89cb4 py3: replace `time.clock()` with `time.perf_counter()`
Matt Harbison <matt_harbison@yahoo.com>
parents: 43807
diff changeset
  1090
                    # 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: 43807
diff changeset
  1091
                    t = (t[0], t[1], t[2], t[3], util.timer())
30954
6d642ecf1a89 dispatch: start profiling earlier
Bryan O'Sullivan <bryano@fb.com>
parents: 30953
diff changeset
  1092
                return t
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41193
diff changeset
  1093
30954
6d642ecf1a89 dispatch: start profiling earlier
Bryan O'Sullivan <bryano@fb.com>
parents: 30953
diff changeset
  1094
            s = get_times()
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41193
diff changeset
  1095
30954
6d642ecf1a89 dispatch: start profiling earlier
Bryan O'Sullivan <bryano@fb.com>
parents: 30953
diff changeset
  1096
            def print_time():
6d642ecf1a89 dispatch: start profiling earlier
Bryan O'Sullivan <bryano@fb.com>
parents: 30953
diff changeset
  1097
                t = get_times()
6d642ecf1a89 dispatch: start profiling earlier
Bryan O'Sullivan <bryano@fb.com>
parents: 30953
diff changeset
  1098
                ui.warn(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1099
                    _(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
  1100
                    % (
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41193
diff changeset
  1101
                        t[4] - s[4],
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41193
diff changeset
  1102
                        t[0] - s[0],
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41193
diff changeset
  1103
                        t[2] - s[2],
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41193
diff changeset
  1104
                        t[1] - s[1],
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41193
diff changeset
  1105
                        t[3] - s[3],
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41193
diff changeset
  1106
                    )
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41193
diff changeset
  1107
                )
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41193
diff changeset
  1108
31958
de5c9d0e02ea atexit: switch to home-grown implementation
Bryan O'Sullivan <bryano@fb.com>
parents: 31956
diff changeset
  1109
            ui.atexit(print_time)
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1110
        if options[b"profile"]:
32807
545f69cd6042 profile: support --profile in alias and abbreviated version (--prof)
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 32707
diff changeset
  1111
            profiler.start()
5178
18a9fbb5cd78 dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
  1112
38535
b86664c81833 debug: process --debug flag earlier
Boris Feld <boris.feld@octobus.net>
parents: 38143
diff changeset
  1113
        # 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
  1114
        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
  1115
            for opt in (b'verbose', b'debug', b'quiet'):
38535
b86664c81833 debug: process --debug flag earlier
Boris Feld <boris.feld@octobus.net>
parents: 38143
diff changeset
  1116
                if options[opt] == req.earlyoptions[opt]:
b86664c81833 debug: process --debug flag earlier
Boris Feld <boris.feld@octobus.net>
parents: 38143
diff changeset
  1117
                    continue
35938
a2b3b5c5a25a py3: replace "if ispy3" by pycompat.bytestr()
Yuya Nishihara <yuya@tcha.org>
parents: 35653
diff changeset
  1118
                val = pycompat.bytestr(bool(options[opt]))
30954
6d642ecf1a89 dispatch: start profiling earlier
Bryan O'Sullivan <bryano@fb.com>
parents: 30953
diff changeset
  1119
                for ui_ in uis:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1120
                    ui_.setconfig(b'ui', opt, val, b'--' + opt)
30954
6d642ecf1a89 dispatch: start profiling earlier
Bryan O'Sullivan <bryano@fb.com>
parents: 30953
diff changeset
  1121
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1122
        if options[b'traceback']:
14752
99ace3cb7352 dispatch: set global options on the request repo.ui
Idan Kamara <idankk86@gmail.com>
parents: 14748
diff changeset
  1123
            for ui_ in uis:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1124
                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
  1125
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1126
        if options[b'noninteractive']:
30954
6d642ecf1a89 dispatch: start profiling earlier
Bryan O'Sullivan <bryano@fb.com>
parents: 30953
diff changeset
  1127
            for ui_ in uis:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1128
                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
  1129
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1130
        if cmdoptions.get(b'insecure', False):
30954
6d642ecf1a89 dispatch: start profiling earlier
Bryan O'Sullivan <bryano@fb.com>
parents: 30953
diff changeset
  1131
            for ui_ in uis:
6d642ecf1a89 dispatch: start profiling earlier
Bryan O'Sullivan <bryano@fb.com>
parents: 30953
diff changeset
  1132
                ui_.insecureconnections = True
13328
a939f08fae9c url: add --insecure option to bypass verification of ssl certificates
Yuya Nishihara <yuya@tcha.org>
parents: 12932
diff changeset
  1133
32125
f928d53b687c dispatch: setup color before pager for correct console information on windows
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 32054
diff changeset
  1134
        # 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
  1135
        # might cause incorrect console information
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1136
        coloropt = options[b'color']
31122
45be7590301d color: move triggering of the initialisation logic in core
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 31080
diff changeset
  1137
        for ui_ in uis:
31127
7fec37746417 color: add a 'ui.color' option to control color behavior
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 31122
diff changeset
  1138
            if coloropt:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1139
                ui_.setconfig(b'ui', b'color', coloropt, b'--color')
31127
7fec37746417 color: add a 'ui.color' option to control color behavior
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 31122
diff changeset
  1140
            color.setup(ui_)
31122
45be7590301d color: move triggering of the initialisation logic in core
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 31080
diff changeset
  1141
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1142
        if stringutil.parsebool(options[b'pager']):
33618
cc047a733f69 ui: enable pager always for explicit --pager=on (issue5580)
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 33499
diff changeset
  1143
            # 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
  1144
            ui.pager(b'internal-always-' + cmd)
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1145
        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
  1146
            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
  1147
                ui_.disablepager()
32125
f928d53b687c dispatch: setup color before pager for correct console information on windows
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 32054
diff changeset
  1148
40763
c93d046d4300 extensions: add "uipopulate" hook, called per instance, not per process
Yuya Nishihara <yuya@tcha.org>
parents: 40694
diff changeset
  1149
        # 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: 40694
diff changeset
  1150
        for ui_ in uis:
c93d046d4300 extensions: add "uipopulate" hook, called per instance, not per process
Yuya Nishihara <yuya@tcha.org>
parents: 40694
diff changeset
  1151
            extensions.populateui(ui_)
c93d046d4300 extensions: add "uipopulate" hook, called per instance, not per process
Yuya Nishihara <yuya@tcha.org>
parents: 40694
diff changeset
  1152
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1153
        if options[b'version']:
30954
6d642ecf1a89 dispatch: start profiling earlier
Bryan O'Sullivan <bryano@fb.com>
parents: 30953
diff changeset
  1154
            return commands.version_(ui)
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1155
        if options[b'help']:
30954
6d642ecf1a89 dispatch: start profiling earlier
Bryan O'Sullivan <bryano@fb.com>
parents: 30953
diff changeset
  1156
            return commands.help_(ui, cmd, command=cmd is not None)
6d642ecf1a89 dispatch: start profiling earlier
Bryan O'Sullivan <bryano@fb.com>
parents: 30953
diff changeset
  1157
        elif not cmd:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1158
            return commands.help_(ui, b'shortlist')
5178
18a9fbb5cd78 dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
  1159
30009
dfd97e60044c dispatch: change indentation level in _dispatch()
Arun Kulshreshtha <kulshrax@fb.com>
parents: 29888
diff changeset
  1160
        repo = None
dfd97e60044c dispatch: change indentation level in _dispatch()
Arun Kulshreshtha <kulshrax@fb.com>
parents: 29888
diff changeset
  1161
        cmdpats = args[:]
43746
ac8fd215a776 dispatch: add some assertions to give pytype a helping hand
Augie Fackler <augie@google.com>
parents: 43554
diff changeset
  1162
        assert func is not None  # help out pytype
30494
acd30a959980 dispatch: stop supporting non-use of @command
Augie Fackler <augie@google.com>
parents: 30482
diff changeset
  1163
        if not func.norepo:
30009
dfd97e60044c dispatch: change indentation level in _dispatch()
Arun Kulshreshtha <kulshrax@fb.com>
parents: 29888
diff changeset
  1164
            # 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: 29888
diff changeset
  1165
            if not rpath and not cwd:
dfd97e60044c dispatch: change indentation level in _dispatch()
Arun Kulshreshtha <kulshrax@fb.com>
parents: 29888
diff changeset
  1166
                repo = req.repo
14510
eccbb9980ada dispatch: add repo to the request
Idan Kamara <idankk86@gmail.com>
parents: 14439
diff changeset
  1167
30009
dfd97e60044c dispatch: change indentation level in _dispatch()
Arun Kulshreshtha <kulshrax@fb.com>
parents: 29888
diff changeset
  1168
            if repo:
dfd97e60044c dispatch: change indentation level in _dispatch()
Arun Kulshreshtha <kulshrax@fb.com>
parents: 29888
diff changeset
  1169
                # set the descriptors of the repo ui to those of ui
dfd97e60044c dispatch: change indentation level in _dispatch()
Arun Kulshreshtha <kulshrax@fb.com>
parents: 29888
diff changeset
  1170
                repo.ui.fin = ui.fin
dfd97e60044c dispatch: change indentation level in _dispatch()
Arun Kulshreshtha <kulshrax@fb.com>
parents: 29888
diff changeset
  1171
                repo.ui.fout = ui.fout
dfd97e60044c dispatch: change indentation level in _dispatch()
Arun Kulshreshtha <kulshrax@fb.com>
parents: 29888
diff changeset
  1172
                repo.ui.ferr = ui.ferr
40634
5542bc9125c9 dispatch: pass around ui.fmsg channel
Yuya Nishihara <yuya@tcha.org>
parents: 40490
diff changeset
  1173
                repo.ui.fmsg = ui.fmsg
30009
dfd97e60044c dispatch: change indentation level in _dispatch()
Arun Kulshreshtha <kulshrax@fb.com>
parents: 29888
diff changeset
  1174
            else:
dfd97e60044c dispatch: change indentation level in _dispatch()
Arun Kulshreshtha <kulshrax@fb.com>
parents: 29888
diff changeset
  1175
                try:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41193
diff changeset
  1176
                    repo = hg.repository(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41193
diff changeset
  1177
                        ui,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41193
diff changeset
  1178
                        path=path,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41193
diff changeset
  1179
                        presetupfuncs=req.prereposetups,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41193
diff changeset
  1180
                        intents=func.intents,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41193
diff changeset
  1181
                    )
30009
dfd97e60044c dispatch: change indentation level in _dispatch()
Arun Kulshreshtha <kulshrax@fb.com>
parents: 29888
diff changeset
  1182
                    if not repo.local():
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41193
diff changeset
  1183
                        raise error.Abort(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1184
                            _(b"repository '%s' is not local") % path
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41193
diff changeset
  1185
                        )
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41193
diff changeset
  1186
                    repo.ui.setconfig(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1187
                        b"bundle", b"mainreporoot", repo.root, b'repo'
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41193
diff changeset
  1188
                    )
30009
dfd97e60044c dispatch: change indentation level in _dispatch()
Arun Kulshreshtha <kulshrax@fb.com>
parents: 29888
diff changeset
  1189
                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
  1190
                    raise
30009
dfd97e60044c dispatch: change indentation level in _dispatch()
Arun Kulshreshtha <kulshrax@fb.com>
parents: 29888
diff changeset
  1191
                except error.RepoError:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41193
diff changeset
  1192
                    if rpath:  # invalid -R path
30009
dfd97e60044c dispatch: change indentation level in _dispatch()
Arun Kulshreshtha <kulshrax@fb.com>
parents: 29888
diff changeset
  1193
                        raise
30494
acd30a959980 dispatch: stop supporting non-use of @command
Augie Fackler <augie@google.com>
parents: 30482
diff changeset
  1194
                    if not func.optionalrepo:
acd30a959980 dispatch: stop supporting non-use of @command
Augie Fackler <augie@google.com>
parents: 30482
diff changeset
  1195
                        if func.inferrepo and args and not path:
30009
dfd97e60044c dispatch: change indentation level in _dispatch()
Arun Kulshreshtha <kulshrax@fb.com>
parents: 29888
diff changeset
  1196
                            # try to infer -R from command args
35170
e6487522ef92 py3: use pycompat.maplist() instead of map()
Pulkit Goyal <7895pulkit@gmail.com>
parents: 35166
diff changeset
  1197
                            repos = pycompat.maplist(cmdutil.findrepo, args)
30009
dfd97e60044c dispatch: change indentation level in _dispatch()
Arun Kulshreshtha <kulshrax@fb.com>
parents: 29888
diff changeset
  1198
                            guess = repos[0]
dfd97e60044c dispatch: change indentation level in _dispatch()
Arun Kulshreshtha <kulshrax@fb.com>
parents: 29888
diff changeset
  1199
                            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
  1200
                                req.args = [b'--repository', guess] + fullargs
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1201
                                req.earlyoptions[b'repository'] = guess
30009
dfd97e60044c dispatch: change indentation level in _dispatch()
Arun Kulshreshtha <kulshrax@fb.com>
parents: 29888
diff changeset
  1202
                                return _dispatch(req)
dfd97e60044c dispatch: change indentation level in _dispatch()
Arun Kulshreshtha <kulshrax@fb.com>
parents: 29888
diff changeset
  1203
                        if not path:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41193
diff changeset
  1204
                            raise error.RepoError(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41193
diff changeset
  1205
                                _(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1206
                                    b"no repository found in"
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1207
                                    b" '%s' (.hg not found)"
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
                                % encoding.getcwd()
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41193
diff changeset
  1210
                            )
30009
dfd97e60044c dispatch: change indentation level in _dispatch()
Arun Kulshreshtha <kulshrax@fb.com>
parents: 29888
diff changeset
  1211
                        raise
dfd97e60044c dispatch: change indentation level in _dispatch()
Arun Kulshreshtha <kulshrax@fb.com>
parents: 29888
diff changeset
  1212
            if repo:
dfd97e60044c dispatch: change indentation level in _dispatch()
Arun Kulshreshtha <kulshrax@fb.com>
parents: 29888
diff changeset
  1213
                ui = repo.ui
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1214
                if options[b'hidden']:
30009
dfd97e60044c dispatch: change indentation level in _dispatch()
Arun Kulshreshtha <kulshrax@fb.com>
parents: 29888
diff changeset
  1215
                    repo = repo.unfiltered()
dfd97e60044c dispatch: change indentation level in _dispatch()
Arun Kulshreshtha <kulshrax@fb.com>
parents: 29888
diff changeset
  1216
            args.insert(0, repo)
dfd97e60044c dispatch: change indentation level in _dispatch()
Arun Kulshreshtha <kulshrax@fb.com>
parents: 29888
diff changeset
  1217
        elif rpath:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1218
            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
  1219
31499
3c77414a0f9c dispatch: consolidate formatting of arguments
Augie Fackler <augie@google.com>
parents: 31498
diff changeset
  1220
        msg = _formatargs(fullargs)
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1221
        ui.log(b"command", b'%s\n', msg)
30591
2d555d753f0e py3: make keys of keyword arguments strings
Pulkit Goyal <7895pulkit@gmail.com>
parents: 30581
diff changeset
  1222
        strcmdopt = pycompat.strkwargs(cmdoptions)
2d555d753f0e py3: make keys of keyword arguments strings
Pulkit Goyal <7895pulkit@gmail.com>
parents: 30581
diff changeset
  1223
        d = lambda: util.checksignature(func)(ui, *args, **strcmdopt)
30009
dfd97e60044c dispatch: change indentation level in _dispatch()
Arun Kulshreshtha <kulshrax@fb.com>
parents: 29888
diff changeset
  1224
        try:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41193
diff changeset
  1225
            return runcommand(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41193
diff changeset
  1226
                lui, repo, cmd, fullargs, ui, options, d, cmdpats, cmdoptions
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41193
diff changeset
  1227
            )
30009
dfd97e60044c dispatch: change indentation level in _dispatch()
Arun Kulshreshtha <kulshrax@fb.com>
parents: 29888
diff changeset
  1228
        finally:
dfd97e60044c dispatch: change indentation level in _dispatch()
Arun Kulshreshtha <kulshrax@fb.com>
parents: 29888
diff changeset
  1229
            if repo and repo != req.repo:
dfd97e60044c dispatch: change indentation level in _dispatch()
Arun Kulshreshtha <kulshrax@fb.com>
parents: 29888
diff changeset
  1230
                repo.close()
5178
18a9fbb5cd78 dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
  1231
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41193
diff changeset
  1232
5178
18a9fbb5cd78 dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
  1233
def _runcommand(ui, options, cmd, cmdfunc):
29795
e3501546f7e4 profiling: add a context manager that no-ops if profiling isn't enabled
Gregory Szorc <gregory.szorc@gmail.com>
parents: 29794
diff changeset
  1234
    """Run a command function, possibly with profiling enabled."""
30010
b19c2679289c dispatch: make hg --profile wrap reposetup
Arun Kulshreshtha <kulshrax@fb.com>
parents: 30009
diff changeset
  1235
    try:
43238
101ae8bbfa02 cleanup: hgdemandimport.tracing accepts strings, not bytes
Augie Fackler <augie@google.com>
parents: 43117
diff changeset
  1236
        with tracing.log("Running %s command" % cmd):
39529
ec0a2601bc76 tracing: trace command function execution
Boris Feld <boris.feld@octobus.net>
parents: 39283
diff changeset
  1237
            return cmdfunc()
30010
b19c2679289c dispatch: make hg --profile wrap reposetup
Arun Kulshreshtha <kulshrax@fb.com>
parents: 30009
diff changeset
  1238
    except error.SignatureError:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1239
        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
  1240
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41193
diff changeset
  1241
28821
d3369dc6c1d0 dispatch: split out warning message generation to separate function
Martijn Pieters <mjpieters@fb.com>
parents: 28784
diff changeset
  1242
def _exceptionwarning(ui):
d3369dc6c1d0 dispatch: split out warning message generation to separate function
Martijn Pieters <mjpieters@fb.com>
parents: 28784
diff changeset
  1243
    """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
  1244
09750b1231c2 dispatch: factor out command failure handling into a function
Martijn Pieters <mjpieters@fb.com>
parents: 28695
diff changeset
  1245
    # 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
  1246
    # 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
  1247
    # 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
  1248
    # 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
  1249
    # '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
  1250
    # 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
  1251
    # version number and try updating.
09750b1231c2 dispatch: factor out command failure handling into a function
Martijn Pieters <mjpieters@fb.com>
parents: 28695
diff changeset
  1252
    ct = util.versiontuple(n=2)
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1253
    worst = None, ct, b''
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1254
    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
  1255
        for name, mod in extensions.extensions():
35939
d5457d94e1c9 py3: replace "if ispy3" by pycompat.sysbytes() or util.forcebytestr()
Yuya Nishihara <yuya@tcha.org>
parents: 35938
diff changeset
  1256
            # '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: 35938
diff changeset
  1257
            # 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
  1258
            testedwith = stringutil.forcebytestr(
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1259
                getattr(mod, 'testedwith', b'')
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1260
            )
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1261
            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
  1262
            if not testedwith.strip():
09750b1231c2 dispatch: factor out command failure handling into a function
Martijn Pieters <mjpieters@fb.com>
parents: 28695
diff changeset
  1263
                # We found an untested extension. It's likely the culprit.
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1264
                worst = name, b'unknown', report
28784
09750b1231c2 dispatch: factor out command failure handling into a function
Martijn Pieters <mjpieters@fb.com>
parents: 28695
diff changeset
  1265
                break
09750b1231c2 dispatch: factor out command failure handling into a function
Martijn Pieters <mjpieters@fb.com>
parents: 28695
diff changeset
  1266
09750b1231c2 dispatch: factor out command failure handling into a function
Martijn Pieters <mjpieters@fb.com>
parents: 28695
diff changeset
  1267
            # Never blame on extensions bundled with Mercurial.
29888
ed793f41e83f extensions: use ismoduleinternal() thoroughly
Yuya Nishihara <yuya@tcha.org>
parents: 29857
diff changeset
  1268
            if extensions.ismoduleinternal(mod):
28784
09750b1231c2 dispatch: factor out command failure handling into a function
Martijn Pieters <mjpieters@fb.com>
parents: 28695
diff changeset
  1269
                continue
09750b1231c2 dispatch: factor out command failure handling into a function
Martijn Pieters <mjpieters@fb.com>
parents: 28695
diff changeset
  1270
09750b1231c2 dispatch: factor out command failure handling into a function
Martijn Pieters <mjpieters@fb.com>
parents: 28695
diff changeset
  1271
            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
  1272
            if ct in tested:
09750b1231c2 dispatch: factor out command failure handling into a function
Martijn Pieters <mjpieters@fb.com>
parents: 28695
diff changeset
  1273
                continue
09750b1231c2 dispatch: factor out command failure handling into a function
Martijn Pieters <mjpieters@fb.com>
parents: 28695
diff changeset
  1274
09750b1231c2 dispatch: factor out command failure handling into a function
Martijn Pieters <mjpieters@fb.com>
parents: 28695
diff changeset
  1275
            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
  1276
            nearest = max(lower or tested)
09750b1231c2 dispatch: factor out command failure handling into a function
Martijn Pieters <mjpieters@fb.com>
parents: 28695
diff changeset
  1277
            if worst[0] is None or nearest < worst[1]:
09750b1231c2 dispatch: factor out command failure handling into a function
Martijn Pieters <mjpieters@fb.com>
parents: 28695
diff changeset
  1278
                worst = name, nearest, report
09750b1231c2 dispatch: factor out command failure handling into a function
Martijn Pieters <mjpieters@fb.com>
parents: 28695
diff changeset
  1279
    if worst[0] is not None:
09750b1231c2 dispatch: factor out command failure handling into a function
Martijn Pieters <mjpieters@fb.com>
parents: 28695
diff changeset
  1280
        name, testedwith, report = worst
31189
49ad6bf63107 dispatch: allow testedwith to be bytes or str
Augie Fackler <raf@durin42.com>
parents: 31127
diff changeset
  1281
        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
  1282
            testedwith = b'.'.join(
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41193
diff changeset
  1283
                [stringutil.forcebytestr(c) for c in testedwith]
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41193
diff changeset
  1284
            )
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41193
diff changeset
  1285
        warning = _(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1286
            b'** Unknown exception encountered with '
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1287
            b'possibly-broken third-party extension %s\n'
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1288
            b'** which supports versions %s of Mercurial.\n'
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1289
            b'** Please disable %s and try your action again.\n'
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1290
            b'** If that fixes the bug please report it to %s\n'
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41193
diff changeset
  1291
        ) % (name, 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
  1292
    else:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1293
        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
  1294
        if bugtracker is None:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1295
            bugtracker = _(b"https://mercurial-scm.org/wiki/BugTracker")
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41193
diff changeset
  1296
        warning = (
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41193
diff changeset
  1297
            _(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1298
                b"** unknown exception encountered, "
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1299
                b"please report by visiting\n** "
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41193
diff changeset
  1300
            )
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41193
diff changeset
  1301
            + bugtracker
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1302
            + b'\n'
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41193
diff changeset
  1303
        )
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1304
    sysversion = pycompat.sysbytes(sys.version).replace(b'\n', b'')
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41193
diff changeset
  1305
    warning += (
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1306
        (_(b"** Python %s\n") % sysversion)
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1307
        + (_(b"** Mercurial Distributed SCM (version %s)\n") % util.version())
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41193
diff changeset
  1308
        + (
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1309
            _(b"** Extensions loaded: %s\n")
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1310
            % b", ".join([x[0] for x in extensions.extensions()])
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41193
diff changeset
  1311
        )
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41193
diff changeset
  1312
    )
28821
d3369dc6c1d0 dispatch: split out warning message generation to separate function
Martijn Pieters <mjpieters@fb.com>
parents: 28784
diff changeset
  1313
    return warning
d3369dc6c1d0 dispatch: split out warning message generation to separate function
Martijn Pieters <mjpieters@fb.com>
parents: 28784
diff changeset
  1314
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41193
diff changeset
  1315
28821
d3369dc6c1d0 dispatch: split out warning message generation to separate function
Martijn Pieters <mjpieters@fb.com>
parents: 28784
diff changeset
  1316
def handlecommandexception(ui):
d3369dc6c1d0 dispatch: split out warning message generation to separate function
Martijn Pieters <mjpieters@fb.com>
parents: 28784
diff changeset
  1317
    """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
  1318
d3369dc6c1d0 dispatch: split out warning message generation to separate function
Martijn Pieters <mjpieters@fb.com>
parents: 28784
diff changeset
  1319
    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
  1320
    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
  1321
    """
d3369dc6c1d0 dispatch: split out warning message generation to separate function
Martijn Pieters <mjpieters@fb.com>
parents: 28784
diff changeset
  1322
    warning = _exceptionwarning(ui)
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41193
diff changeset
  1323
    ui.log(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1324
        b"commandexception",
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1325
        b"%s\n%s\n",
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41193
diff changeset
  1326
        warning,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41193
diff changeset
  1327
        pycompat.sysbytes(traceback.format_exc()),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41193
diff changeset
  1328
    )
28784
09750b1231c2 dispatch: factor out command failure handling into a function
Martijn Pieters <mjpieters@fb.com>
parents: 28695
diff changeset
  1329
    ui.warn(warning)
09750b1231c2 dispatch: factor out command failure handling into a function
Martijn Pieters <mjpieters@fb.com>
parents: 28695
diff changeset
  1330
    return False  # re-raise the exception