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