mercurial/ui.py
author Matt Harbison <matt_harbison@yahoo.com>
Sun, 11 Dec 2022 00:10:56 -0500
changeset 49797 0449fb7729d7
parent 49795 f1e820cda2f5
child 49798 a51328ba33ca
permissions -rw-r--r--
typing: add trivial type hints to mercurial/ui.py There's not really a pattern here; it's mostly obvious return types and in a few cases, obvious parameter types. Some other "obvious" functions are left out because of quirks in how the return value for the various config() functions are inferred cause pytype to complain.
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
207
ec327cf0d3a9 Move ui class to its own module
mpm@selenic.com
parents:
diff changeset
     1
# ui.py - user interface bits for mercurial
ec327cf0d3a9 Move ui class to its own module
mpm@selenic.com
parents:
diff changeset
     2
#
46819
d4ba4d51f85f contributor: change mentions of mpm to olivia
Raphaël Gomès <rgomes@octobus.net>
parents: 46721
diff changeset
     3
# Copyright 2005-2007 Olivia Mackall <olivia@selenic.com>
207
ec327cf0d3a9 Move ui class to its own module
mpm@selenic.com
parents:
diff changeset
     4
#
8225
46293a0c7e9f updated license to be explicit about GPL version 2
Martin Geisler <mg@lazybytes.net>
parents: 8222
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: 10243
diff changeset
     6
# GNU General Public License version 2 or any later version.
207
ec327cf0d3a9 Move ui class to its own module
mpm@selenic.com
parents:
diff changeset
     7
25989
2cc4e8385661 ui: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25660
diff changeset
     8
30976
e92daf156d5c ui: provide a mechanism to track and log blocked time
Simon Farnsworth <simonfar@fb.com>
parents: 30945
diff changeset
     9
import collections
30480
b0a8337ba9af ui: add configoverride context manager
Kostia Balytskyi <ikostia@fb.com>
parents: 30473
diff changeset
    10
import contextlib
45025
24b1a8eb73aa ui: add option to timestamp status and diagnostic messages
Joerg Sonnenberger <joerg@bec.de>
parents: 44992
diff changeset
    11
import datetime
25989
2cc4e8385661 ui: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25660
diff changeset
    12
import errno
25629
52e5f68d8363 devel-warn: move the develwarn function as a method of the ui object
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 25568
diff changeset
    13
import inspect
25989
2cc4e8385661 ui: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25660
diff changeset
    14
import os
27392
00aa37c65e0a ui: try to handle $$ more robustly in prompts (issue4970)
Matt Mackall <mpm@selenic.com>
parents: 26820
diff changeset
    15
import re
30992
61b4122019d3 pager: move pager-initiating code into core
Augie Fackler <augie@google.com>
parents: 30980
diff changeset
    16
import signal
25989
2cc4e8385661 ui: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25660
diff changeset
    17
import socket
30992
61b4122019d3 pager: move pager-initiating code into core
Augie Fackler <augie@google.com>
parents: 30980
diff changeset
    18
import subprocess
25989
2cc4e8385661 ui: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25660
diff changeset
    19
import sys
2cc4e8385661 ui: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25660
diff changeset
    20
import traceback
2cc4e8385661 ui: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25660
diff changeset
    21
49794
25fe689a4a64 typing: add type hints related to progress bars in mercurial/ui.py
Matt Harbison <matt_harbison@yahoo.com>
parents: 49793
diff changeset
    22
from typing import (
49797
0449fb7729d7 typing: add trivial type hints to mercurial/ui.py
Matt Harbison <matt_harbison@yahoo.com>
parents: 49795
diff changeset
    23
    Any,
0449fb7729d7 typing: add trivial type hints to mercurial/ui.py
Matt Harbison <matt_harbison@yahoo.com>
parents: 49795
diff changeset
    24
    Callable,
49795
f1e820cda2f5 typing: add type hints related to message output in mercurial/ui.py
Matt Harbison <matt_harbison@yahoo.com>
parents: 49794
diff changeset
    25
    Dict,
f1e820cda2f5 typing: add type hints related to message output in mercurial/ui.py
Matt Harbison <matt_harbison@yahoo.com>
parents: 49794
diff changeset
    26
    List,
49797
0449fb7729d7 typing: add trivial type hints to mercurial/ui.py
Matt Harbison <matt_harbison@yahoo.com>
parents: 49795
diff changeset
    27
    NoReturn,
49794
25fe689a4a64 typing: add type hints related to progress bars in mercurial/ui.py
Matt Harbison <matt_harbison@yahoo.com>
parents: 49793
diff changeset
    28
    Optional,
49795
f1e820cda2f5 typing: add type hints related to message output in mercurial/ui.py
Matt Harbison <matt_harbison@yahoo.com>
parents: 49794
diff changeset
    29
    Tuple,
49797
0449fb7729d7 typing: add trivial type hints to mercurial/ui.py
Matt Harbison <matt_harbison@yahoo.com>
parents: 49795
diff changeset
    30
    Type,
0449fb7729d7 typing: add trivial type hints to mercurial/ui.py
Matt Harbison <matt_harbison@yahoo.com>
parents: 49795
diff changeset
    31
    TypeVar,
49795
f1e820cda2f5 typing: add type hints related to message output in mercurial/ui.py
Matt Harbison <matt_harbison@yahoo.com>
parents: 49794
diff changeset
    32
    Union,
f1e820cda2f5 typing: add type hints related to message output in mercurial/ui.py
Matt Harbison <matt_harbison@yahoo.com>
parents: 49794
diff changeset
    33
    cast,
49794
25fe689a4a64 typing: add type hints related to progress bars in mercurial/ui.py
Matt Harbison <matt_harbison@yahoo.com>
parents: 49793
diff changeset
    34
)
25fe689a4a64 typing: add type hints related to progress bars in mercurial/ui.py
Matt Harbison <matt_harbison@yahoo.com>
parents: 49793
diff changeset
    35
25989
2cc4e8385661 ui: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25660
diff changeset
    36
from .i18n import _
2cc4e8385661 ui: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25660
diff changeset
    37
from .node import hex
43087
66f2cc210a29 py3: manually import pycompat.setattr where it is needed
Gregory Szorc <gregory.szorc@gmail.com>
parents: 43085
diff changeset
    38
from .pycompat import (
43089
c59eb1560c44 py3: manually import getattr where it is needed
Gregory Szorc <gregory.szorc@gmail.com>
parents: 43087
diff changeset
    39
    getattr,
43087
66f2cc210a29 py3: manually import pycompat.setattr where it is needed
Gregory Szorc <gregory.szorc@gmail.com>
parents: 43085
diff changeset
    40
    open,
66f2cc210a29 py3: manually import pycompat.setattr where it is needed
Gregory Szorc <gregory.szorc@gmail.com>
parents: 43085
diff changeset
    41
)
25989
2cc4e8385661 ui: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25660
diff changeset
    42
2cc4e8385661 ui: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25660
diff changeset
    43
from . import (
31087
894bdcdc75df color: move the 'colorlabel' call to the core 'ui' class
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 31083
diff changeset
    44
    color,
25989
2cc4e8385661 ui: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25660
diff changeset
    45
    config,
32984
6d983e8af49c configitems: introduce a central registry for config option
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 32967
diff changeset
    46
    configitems,
30277
e9fca89c6d58 py3: use encoding.environ in ui.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 29978
diff changeset
    47
    encoding,
25989
2cc4e8385661 ui: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25660
diff changeset
    48
    error,
2cc4e8385661 ui: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25660
diff changeset
    49
    formatter,
40994
ab92e2111408 ui: install logger that sends debug.extensions messages to stderr
Yuya Nishihara <yuya@tcha.org>
parents: 40761
diff changeset
    50
    loggingutil,
25989
2cc4e8385661 ui: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25660
diff changeset
    51
    progress,
30519
20a42325fdef py3: use pycompat.getcwd() instead of os.getcwd()
Pulkit Goyal <7895pulkit@gmail.com>
parents: 30480
diff changeset
    52
    pycompat,
31679
0f8ba0bc1154 rcutil: move scmutil.*rcpath to rcutil (API)
Jun Wu <quark@fb.com>
parents: 31624
diff changeset
    53
    rcutil,
25989
2cc4e8385661 ui: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25660
diff changeset
    54
    scmutil,
2cc4e8385661 ui: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25660
diff changeset
    55
    util,
2cc4e8385661 ui: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25660
diff changeset
    56
)
37084
f0b6fbea00cf stringutil: bulk-replace call sites to point to new module
Yuya Nishihara <yuya@tcha.org>
parents: 36910
diff changeset
    57
from .utils import (
f0b6fbea00cf stringutil: bulk-replace call sites to point to new module
Yuya Nishihara <yuya@tcha.org>
parents: 36910
diff changeset
    58
    dateutil,
37119
d4a2e0d5d042 procutil: bulk-replace util.std* to point to new module
Yuya Nishihara <yuya@tcha.org>
parents: 37084
diff changeset
    59
    procutil,
44030
5ac0e6f19eb4 ui: refactor `readconfig()` into a form that can consume resources
Matt Harbison <matt_harbison@yahoo.com>
parents: 44021
diff changeset
    60
    resourceutil,
37084
f0b6fbea00cf stringutil: bulk-replace call sites to point to new module
Yuya Nishihara <yuya@tcha.org>
parents: 36910
diff changeset
    61
    stringutil,
46906
33524c46a092 urlutil: extract `path` related code into a new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 46828
diff changeset
    62
    urlutil,
37084
f0b6fbea00cf stringutil: bulk-replace call sites to point to new module
Yuya Nishihara <yuya@tcha.org>
parents: 36910
diff changeset
    63
)
207
ec327cf0d3a9 Move ui class to its own module
mpm@selenic.com
parents:
diff changeset
    64
49797
0449fb7729d7 typing: add trivial type hints to mercurial/ui.py
Matt Harbison <matt_harbison@yahoo.com>
parents: 49795
diff changeset
    65
_ConfigItems = Dict[Tuple[bytes, bytes], object]  # {(section, name) : value}
49795
f1e820cda2f5 typing: add type hints related to message output in mercurial/ui.py
Matt Harbison <matt_harbison@yahoo.com>
parents: 49794
diff changeset
    66
# The **opts args of the various write() methods can be basically anything, but
f1e820cda2f5 typing: add type hints related to message output in mercurial/ui.py
Matt Harbison <matt_harbison@yahoo.com>
parents: 49794
diff changeset
    67
# there's no way to express it as "anything but str".  So type it to be the
f1e820cda2f5 typing: add type hints related to message output in mercurial/ui.py
Matt Harbison <matt_harbison@yahoo.com>
parents: 49794
diff changeset
    68
# handful of known types that are used.
f1e820cda2f5 typing: add type hints related to message output in mercurial/ui.py
Matt Harbison <matt_harbison@yahoo.com>
parents: 49794
diff changeset
    69
_MsgOpts = Union[bytes, bool, List["_PromptChoice"]]
f1e820cda2f5 typing: add type hints related to message output in mercurial/ui.py
Matt Harbison <matt_harbison@yahoo.com>
parents: 49794
diff changeset
    70
_PromptChoice = Tuple[bytes, bytes]
49797
0449fb7729d7 typing: add trivial type hints to mercurial/ui.py
Matt Harbison <matt_harbison@yahoo.com>
parents: 49795
diff changeset
    71
_Tui = TypeVar('_Tui', bound="ui")
49795
f1e820cda2f5 typing: add type hints related to message output in mercurial/ui.py
Matt Harbison <matt_harbison@yahoo.com>
parents: 49794
diff changeset
    72
29378
fea71f66ebff url: remember http password database in ui object
liscju <piotr.listkiewicz@gmail.com>
parents: 29366
diff changeset
    73
urlreq = util.urlreq
fea71f66ebff url: remember http password database in ui object
liscju <piotr.listkiewicz@gmail.com>
parents: 29366
diff changeset
    74
30979
fd598149112b ui: time calls to ui.system
Simon Farnsworth <simonfar@fb.com>
parents: 30978
diff changeset
    75
# for use with str.translate(None, _keepalnum), to keep just alphanumerics
49797
0449fb7729d7 typing: add trivial type hints to mercurial/ui.py
Matt Harbison <matt_harbison@yahoo.com>
parents: 49795
diff changeset
    76
_keepalnum: bytes = b''.join(
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42672
diff changeset
    77
    c for c in map(pycompat.bytechr, range(256)) if not c.isalnum()
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42672
diff changeset
    78
)
30979
fd598149112b ui: time calls to ui.system
Simon Farnsworth <simonfar@fb.com>
parents: 30978
diff changeset
    79
32872
9fcb6df413c9 ui: add support for a tweakdefaults knob
Augie Fackler <augie@google.com>
parents: 32579
diff changeset
    80
# The config knobs that will be altered (if unset) by ui.tweakdefaults.
49797
0449fb7729d7 typing: add trivial type hints to mercurial/ui.py
Matt Harbison <matt_harbison@yahoo.com>
parents: 49795
diff changeset
    81
tweakrc: bytes = b"""
32872
9fcb6df413c9 ui: add support for a tweakdefaults knob
Augie Fackler <augie@google.com>
parents: 32579
diff changeset
    82
[ui]
9fcb6df413c9 ui: add support for a tweakdefaults knob
Augie Fackler <augie@google.com>
parents: 32579
diff changeset
    83
# The rollback command is dangerous. As a rule, don't use it.
9fcb6df413c9 ui: add support for a tweakdefaults knob
Augie Fackler <augie@google.com>
parents: 32579
diff changeset
    84
rollback = False
35067
929858db4d22 tweakdefaults: turn on ui.statuscopies
Martin von Zweigbergk <martinvonz@google.com>
parents: 34957
diff changeset
    85
# Make `hg status` report copy information
929858db4d22 tweakdefaults: turn on ui.statuscopies
Martin von Zweigbergk <martinvonz@google.com>
parents: 34957
diff changeset
    86
statuscopies = yes
35306
03a83ace9816 ui: add curses interface to tweakdefaults
Augie Fackler <augie@google.com>
parents: 35186
diff changeset
    87
# Prefer curses UIs when available. Revert to plain-text with `text`.
03a83ace9816 ui: add curses interface to tweakdefaults
Augie Fackler <augie@google.com>
parents: 35186
diff changeset
    88
interface = curses
41493
97ab4cbb342e tweakdefaults: set ui.relative-paths instead of command.status.relative
Martin von Zweigbergk <martinvonz@google.com>
parents: 41484
diff changeset
    89
# Make compatible commands emit cwd-relative paths by default.
97ab4cbb342e tweakdefaults: set ui.relative-paths instead of command.status.relative
Martin von Zweigbergk <martinvonz@google.com>
parents: 41484
diff changeset
    90
relative-paths = yes
32872
9fcb6df413c9 ui: add support for a tweakdefaults knob
Augie Fackler <augie@google.com>
parents: 32579
diff changeset
    91
9fcb6df413c9 ui: add support for a tweakdefaults knob
Augie Fackler <augie@google.com>
parents: 32579
diff changeset
    92
[commands]
38652
bfcd5c7cbf9a grep: restore pre-9ef10437bb88 behavior, enable wdir search by tweakdefaults
Yuya Nishihara <yuya@tcha.org>
parents: 38623
diff changeset
    93
# Grep working directory by default.
bfcd5c7cbf9a grep: restore pre-9ef10437bb88 behavior, enable wdir search by tweakdefaults
Yuya Nishihara <yuya@tcha.org>
parents: 38623
diff changeset
    94
grep.all-files = True
34707
6cd8d8203204 tweakdefaults: make commands.update.check be `noconflict`
Augie Fackler <augie@google.com>
parents: 34645
diff changeset
    95
# Refuse to perform an `hg update` that would cause a file content merge
6cd8d8203204 tweakdefaults: make commands.update.check be `noconflict`
Augie Fackler <augie@google.com>
parents: 34645
diff changeset
    96
update.check = noconflict
36910
98487ad0cf8b tweakdefaults: add commands.status.verbose to tweakefaults
Pulkit Goyal <7895pulkit@gmail.com>
parents: 36834
diff changeset
    97
# Show conflicts information in `hg status`
98487ad0cf8b tweakdefaults: add commands.status.verbose to tweakefaults
Pulkit Goyal <7895pulkit@gmail.com>
parents: 36834
diff changeset
    98
status.verbose = True
42561
44e99811bea7 tweakdefaults: make hg resolve require --re-merge flag to re-merge
Valentin Gatien-Baron <valentin.gatienbaron@gmail.com>
parents: 42541
diff changeset
    99
# Make `hg resolve` with no action (like `-m`) fail instead of re-merging.
44e99811bea7 tweakdefaults: make hg resolve require --re-merge flag to re-merge
Valentin Gatien-Baron <valentin.gatienbaron@gmail.com>
parents: 42541
diff changeset
   100
resolve.explicit-re-merge = True
32872
9fcb6df413c9 ui: add support for a tweakdefaults knob
Augie Fackler <augie@google.com>
parents: 32579
diff changeset
   101
9fcb6df413c9 ui: add support for a tweakdefaults knob
Augie Fackler <augie@google.com>
parents: 32579
diff changeset
   102
[diff]
9fcb6df413c9 ui: add support for a tweakdefaults knob
Augie Fackler <augie@google.com>
parents: 32579
diff changeset
   103
git = 1
35307
4caafe280488 ui: add diff.showfunc to tweakdefaults
Augie Fackler <augie@google.com>
parents: 35306
diff changeset
   104
showfunc = 1
38623
92c845c097aa tweakdefaults: enable word-diff by default
Augie Fackler <augie@google.com>
parents: 38575
diff changeset
   105
word-diff = 1
32872
9fcb6df413c9 ui: add support for a tweakdefaults knob
Augie Fackler <augie@google.com>
parents: 32579
diff changeset
   106
"""
9fcb6df413c9 ui: add support for a tweakdefaults knob
Augie Fackler <augie@google.com>
parents: 32579
diff changeset
   107
49797
0449fb7729d7 typing: add trivial type hints to mercurial/ui.py
Matt Harbison <matt_harbison@yahoo.com>
parents: 49795
diff changeset
   108
samplehgrcs: Dict[bytes, bytes] = {
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   109
    b'user': b"""# example user config (see 'hg help config' for more info)
22419
fdfc9faca273 ui: move samplehgrcs from config
Matt Mackall <mpm@selenic.com>
parents: 22291
diff changeset
   110
[ui]
fdfc9faca273 ui: move samplehgrcs from config
Matt Mackall <mpm@selenic.com>
parents: 22291
diff changeset
   111
# name and email, e.g.
fdfc9faca273 ui: move samplehgrcs from config
Matt Mackall <mpm@selenic.com>
parents: 22291
diff changeset
   112
# username = Jane Doe <jdoe@example.com>
fdfc9faca273 ui: move samplehgrcs from config
Matt Mackall <mpm@selenic.com>
parents: 22291
diff changeset
   113
username =
fdfc9faca273 ui: move samplehgrcs from config
Matt Mackall <mpm@selenic.com>
parents: 22291
diff changeset
   114
34568
63c19b7fa100 ui: recommend tweakdefaults in the default hgrc template
Augie Fackler <augie@google.com>
parents: 34482
diff changeset
   115
# We recommend enabling tweakdefaults to get slight improvements to
63c19b7fa100 ui: recommend tweakdefaults in the default hgrc template
Augie Fackler <augie@google.com>
parents: 34482
diff changeset
   116
# the UI over time. Make sure to set HGPLAIN in the environment when
63c19b7fa100 ui: recommend tweakdefaults in the default hgrc template
Augie Fackler <augie@google.com>
parents: 34482
diff changeset
   117
# writing scripts!
63c19b7fa100 ui: recommend tweakdefaults in the default hgrc template
Augie Fackler <augie@google.com>
parents: 34482
diff changeset
   118
# tweakdefaults = True
63c19b7fa100 ui: recommend tweakdefaults in the default hgrc template
Augie Fackler <augie@google.com>
parents: 34482
diff changeset
   119
32093
4d438efb825a color: reflect the new default in the example hgrc
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 32078
diff changeset
   120
# uncomment to disable color in command output
32094
2de67783dd31 color: point to the global help in the example hgrc
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 32093
diff changeset
   121
# (see 'hg help color' for details)
32093
4d438efb825a color: reflect the new default in the example hgrc
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 32078
diff changeset
   122
# color = never
31124
791ea883fc44 config: suggest the 'ui.color' instead of the 'color' extension
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 31119
diff changeset
   123
32100
21eb863187ea pager: advertise the config option in the default hgrc
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 32097
diff changeset
   124
# uncomment to disable command output pagination
21eb863187ea pager: advertise the config option in the default hgrc
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 32097
diff changeset
   125
# (see 'hg help pager' for details)
32104
f06d23af6cdf pager: rename 'pager.enable' to 'ui.paginate'
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 32100
diff changeset
   126
# paginate = never
32100
21eb863187ea pager: advertise the config option in the default hgrc
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 32097
diff changeset
   127
22419
fdfc9faca273 ui: move samplehgrcs from config
Matt Mackall <mpm@selenic.com>
parents: 22291
diff changeset
   128
[extensions]
41998
018acb7a3490 samplehgrcs: clarify which lines should be uncommented
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 41829
diff changeset
   129
# uncomment the lines below to enable some popular extensions
29978
3d2ea1403c62 samplehgrcs: use single quotes in use warning
timeless <timeless@mozdev.org>
parents: 29762
diff changeset
   130
# (see 'hg help extensions' for more info)
22419
fdfc9faca273 ui: move samplehgrcs from config
Matt Mackall <mpm@selenic.com>
parents: 22291
diff changeset
   131
#
41999
ba064f95175e samplehgrcs: update the list of suggested extensions
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 41998
diff changeset
   132
# histedit =
ba064f95175e samplehgrcs: update the list of suggested extensions
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 41998
diff changeset
   133
# rebase =
ba064f95175e samplehgrcs: update the list of suggested extensions
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 41998
diff changeset
   134
# uncommit =
32097
601bfcddccdc config: drop pager from the recommended extension
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 32096
diff changeset
   135
""",
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   136
    b'cloned': b"""# example repository config (see 'hg help config' for more info)
22837
2be7d5ebd4d0 config: use the same hgrc for a cloned repo as for an uninitted repo
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 22836
diff changeset
   137
[paths]
2be7d5ebd4d0 config: use the same hgrc for a cloned repo as for an uninitted repo
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 22836
diff changeset
   138
default = %s
2be7d5ebd4d0 config: use the same hgrc for a cloned repo as for an uninitted repo
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 22836
diff changeset
   139
2be7d5ebd4d0 config: use the same hgrc for a cloned repo as for an uninitted repo
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 22836
diff changeset
   140
# path aliases to other clones of this repo in URLs or filesystem paths
29978
3d2ea1403c62 samplehgrcs: use single quotes in use warning
timeless <timeless@mozdev.org>
parents: 29762
diff changeset
   141
# (see 'hg help config.paths' for more info)
22837
2be7d5ebd4d0 config: use the same hgrc for a cloned repo as for an uninitted repo
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 22836
diff changeset
   142
#
31064
4431add9aef9 ui: replace obsolete default-push with default:pushurl (issue5485)
Rishabh Madan <rishabhmadan96@gmail.com>
parents: 30848
diff changeset
   143
# default:pushurl = ssh://jdoe@example.net/hg/jdoes-fork
4431add9aef9 ui: replace obsolete default-push with default:pushurl (issue5485)
Rishabh Madan <rishabhmadan96@gmail.com>
parents: 30848
diff changeset
   144
# my-fork         = ssh://jdoe@example.net/hg/jdoes-fork
4431add9aef9 ui: replace obsolete default-push with default:pushurl (issue5485)
Rishabh Madan <rishabhmadan96@gmail.com>
parents: 30848
diff changeset
   145
# my-clone        = /home/jdoe/jdoes-clone
22837
2be7d5ebd4d0 config: use the same hgrc for a cloned repo as for an uninitted repo
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 22836
diff changeset
   146
2be7d5ebd4d0 config: use the same hgrc for a cloned repo as for an uninitted repo
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 22836
diff changeset
   147
[ui]
2be7d5ebd4d0 config: use the same hgrc for a cloned repo as for an uninitted repo
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 22836
diff changeset
   148
# name and email (local to this repository, optional), e.g.
2be7d5ebd4d0 config: use the same hgrc for a cloned repo as for an uninitted repo
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 22836
diff changeset
   149
# username = Jane Doe <jdoe@example.com>
2be7d5ebd4d0 config: use the same hgrc for a cloned repo as for an uninitted repo
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 22836
diff changeset
   150
""",
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   151
    b'local': b"""# example repository config (see 'hg help config' for more info)
22836
5a831e4e6d7a config: give a more detailed sample repo config
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 22783
diff changeset
   152
[paths]
5a831e4e6d7a config: give a more detailed sample repo config
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 22783
diff changeset
   153
# path aliases to other clones of this repo in URLs or filesystem paths
29978
3d2ea1403c62 samplehgrcs: use single quotes in use warning
timeless <timeless@mozdev.org>
parents: 29762
diff changeset
   154
# (see 'hg help config.paths' for more info)
22836
5a831e4e6d7a config: give a more detailed sample repo config
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 22783
diff changeset
   155
#
31064
4431add9aef9 ui: replace obsolete default-push with default:pushurl (issue5485)
Rishabh Madan <rishabhmadan96@gmail.com>
parents: 30848
diff changeset
   156
# default         = http://example.com/hg/example-repo
4431add9aef9 ui: replace obsolete default-push with default:pushurl (issue5485)
Rishabh Madan <rishabhmadan96@gmail.com>
parents: 30848
diff changeset
   157
# default:pushurl = ssh://jdoe@example.net/hg/jdoes-fork
4431add9aef9 ui: replace obsolete default-push with default:pushurl (issue5485)
Rishabh Madan <rishabhmadan96@gmail.com>
parents: 30848
diff changeset
   158
# my-fork         = ssh://jdoe@example.net/hg/jdoes-fork
4431add9aef9 ui: replace obsolete default-push with default:pushurl (issue5485)
Rishabh Madan <rishabhmadan96@gmail.com>
parents: 30848
diff changeset
   159
# my-clone        = /home/jdoe/jdoes-clone
22836
5a831e4e6d7a config: give a more detailed sample repo config
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 22783
diff changeset
   160
5a831e4e6d7a config: give a more detailed sample repo config
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 22783
diff changeset
   161
[ui]
5a831e4e6d7a config: give a more detailed sample repo config
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 22783
diff changeset
   162
# name and email (local to this repository, optional), e.g.
5a831e4e6d7a config: give a more detailed sample repo config
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 22783
diff changeset
   163
# username = Jane Doe <jdoe@example.com>
22419
fdfc9faca273 ui: move samplehgrcs from config
Matt Mackall <mpm@selenic.com>
parents: 22291
diff changeset
   164
""",
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   165
    b'global': b"""# example system-wide hg config (see 'hg help config' for more info)
22419
fdfc9faca273 ui: move samplehgrcs from config
Matt Mackall <mpm@selenic.com>
parents: 22291
diff changeset
   166
31124
791ea883fc44 config: suggest the 'ui.color' instead of the 'color' extension
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 31119
diff changeset
   167
[ui]
32093
4d438efb825a color: reflect the new default in the example hgrc
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 32078
diff changeset
   168
# uncomment to disable color in command output
32094
2de67783dd31 color: point to the global help in the example hgrc
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 32093
diff changeset
   169
# (see 'hg help color' for details)
32093
4d438efb825a color: reflect the new default in the example hgrc
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 32078
diff changeset
   170
# color = never
31124
791ea883fc44 config: suggest the 'ui.color' instead of the 'color' extension
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 31119
diff changeset
   171
32100
21eb863187ea pager: advertise the config option in the default hgrc
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 32097
diff changeset
   172
# uncomment to disable command output pagination
21eb863187ea pager: advertise the config option in the default hgrc
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 32097
diff changeset
   173
# (see 'hg help pager' for details)
32104
f06d23af6cdf pager: rename 'pager.enable' to 'ui.paginate'
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 32100
diff changeset
   174
# paginate = never
32100
21eb863187ea pager: advertise the config option in the default hgrc
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 32097
diff changeset
   175
22419
fdfc9faca273 ui: move samplehgrcs from config
Matt Mackall <mpm@selenic.com>
parents: 22291
diff changeset
   176
[extensions]
41998
018acb7a3490 samplehgrcs: clarify which lines should be uncommented
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 41829
diff changeset
   177
# uncomment the lines below to enable some popular extensions
29978
3d2ea1403c62 samplehgrcs: use single quotes in use warning
timeless <timeless@mozdev.org>
parents: 29762
diff changeset
   178
# (see 'hg help extensions' for more info)
22419
fdfc9faca273 ui: move samplehgrcs from config
Matt Mackall <mpm@selenic.com>
parents: 22291
diff changeset
   179
#
fdfc9faca273 ui: move samplehgrcs from config
Matt Mackall <mpm@selenic.com>
parents: 22291
diff changeset
   180
# blackbox =
32096
726121fa86e1 config: use "churn" as an example extension
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 32094
diff changeset
   181
# churn =
32097
601bfcddccdc config: drop pager from the recommended extension
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 32096
diff changeset
   182
""",
22419
fdfc9faca273 ui: move samplehgrcs from config
Matt Mackall <mpm@selenic.com>
parents: 22291
diff changeset
   183
}
fdfc9faca273 ui: move samplehgrcs from config
Matt Mackall <mpm@selenic.com>
parents: 22291
diff changeset
   184
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42672
diff changeset
   185
34482
75de5d456b60 ui: convert to/from Optional[bytes] to Optional[str] in password manager
Augie Fackler <augie@google.com>
parents: 34426
diff changeset
   186
def _maybestrurl(maybebytes):
38575
152f4822d210 pycompat: move rapply() from util
Yuya Nishihara <yuya@tcha.org>
parents: 38526
diff changeset
   187
    return pycompat.rapply(pycompat.strurl, maybebytes)
34482
75de5d456b60 ui: convert to/from Optional[bytes] to Optional[str] in password manager
Augie Fackler <augie@google.com>
parents: 34426
diff changeset
   188
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42672
diff changeset
   189
34482
75de5d456b60 ui: convert to/from Optional[bytes] to Optional[str] in password manager
Augie Fackler <augie@google.com>
parents: 34426
diff changeset
   190
def _maybebytesurl(maybestr):
38575
152f4822d210 pycompat: move rapply() from util
Yuya Nishihara <yuya@tcha.org>
parents: 38526
diff changeset
   191
    return pycompat.rapply(pycompat.bytesurl, maybestr)
30945
8b83b626fb1e ui: remove urllib2 from being imported early
Kyle Lippincott <spectral@google.com>
parents: 30932
diff changeset
   192
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42672
diff changeset
   193
48946
642e31cb55f0 py3: use class X: instead of class X(object):
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48935
diff changeset
   194
class httppasswordmgrdbproxy:
30945
8b83b626fb1e ui: remove urllib2 from being imported early
Kyle Lippincott <spectral@google.com>
parents: 30932
diff changeset
   195
    """Delays loading urllib2 until it's needed."""
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42672
diff changeset
   196
49797
0449fb7729d7 typing: add trivial type hints to mercurial/ui.py
Matt Harbison <matt_harbison@yahoo.com>
parents: 49795
diff changeset
   197
    def __init__(self) -> None:
30945
8b83b626fb1e ui: remove urllib2 from being imported early
Kyle Lippincott <spectral@google.com>
parents: 30932
diff changeset
   198
        self._mgr = None
8b83b626fb1e ui: remove urllib2 from being imported early
Kyle Lippincott <spectral@google.com>
parents: 30932
diff changeset
   199
8b83b626fb1e ui: remove urllib2 from being imported early
Kyle Lippincott <spectral@google.com>
parents: 30932
diff changeset
   200
    def _get_mgr(self):
8b83b626fb1e ui: remove urllib2 from being imported early
Kyle Lippincott <spectral@google.com>
parents: 30932
diff changeset
   201
        if self._mgr is None:
8b83b626fb1e ui: remove urllib2 from being imported early
Kyle Lippincott <spectral@google.com>
parents: 30932
diff changeset
   202
            self._mgr = urlreq.httppasswordmgrwithdefaultrealm()
8b83b626fb1e ui: remove urllib2 from being imported early
Kyle Lippincott <spectral@google.com>
parents: 30932
diff changeset
   203
        return self._mgr
8b83b626fb1e ui: remove urllib2 from being imported early
Kyle Lippincott <spectral@google.com>
parents: 30932
diff changeset
   204
34426
ae2fcf7af409 httppasswordmgrdbproxy: specify exact arguments
Augie Fackler <augie@google.com>
parents: 34367
diff changeset
   205
    def add_password(self, realm, uris, user, passwd):
34482
75de5d456b60 ui: convert to/from Optional[bytes] to Optional[str] in password manager
Augie Fackler <augie@google.com>
parents: 34426
diff changeset
   206
        return self._get_mgr().add_password(
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42672
diff changeset
   207
            _maybestrurl(realm),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42672
diff changeset
   208
            _maybestrurl(uris),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42672
diff changeset
   209
            _maybestrurl(user),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42672
diff changeset
   210
            _maybestrurl(passwd),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42672
diff changeset
   211
        )
30945
8b83b626fb1e ui: remove urllib2 from being imported early
Kyle Lippincott <spectral@google.com>
parents: 30932
diff changeset
   212
34426
ae2fcf7af409 httppasswordmgrdbproxy: specify exact arguments
Augie Fackler <augie@google.com>
parents: 34367
diff changeset
   213
    def find_user_password(self, realm, uri):
35900
72de5c504833 py3: factor out helpers to apply string conversion recursively
Yuya Nishihara <yuya@tcha.org>
parents: 35897
diff changeset
   214
        mgr = self._get_mgr()
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42672
diff changeset
   215
        return _maybebytesurl(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42672
diff changeset
   216
            mgr.find_user_password(_maybestrurl(realm), _maybestrurl(uri))
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42672
diff changeset
   217
        )
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42672
diff changeset
   218
30945
8b83b626fb1e ui: remove urllib2 from being imported early
Kyle Lippincott <spectral@google.com>
parents: 30932
diff changeset
   219
49797
0449fb7729d7 typing: add trivial type hints to mercurial/ui.py
Matt Harbison <matt_harbison@yahoo.com>
parents: 49795
diff changeset
   220
def _catchterm(*args) -> NoReturn:
30992
61b4122019d3 pager: move pager-initiating code into core
Augie Fackler <augie@google.com>
parents: 30980
diff changeset
   221
    raise error.SignalInterrupt
30945
8b83b626fb1e ui: remove urllib2 from being imported early
Kyle Lippincott <spectral@google.com>
parents: 30932
diff changeset
   222
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42672
diff changeset
   223
32958
4a3f1d362e5f config: explicitly track the use of the standard default value
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 32872
diff changeset
   224
# unique object used to detect no default value has been provided when
4a3f1d362e5f config: explicitly track the use of the standard default value
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 32872
diff changeset
   225
# retrieving configuration value.
4a3f1d362e5f config: explicitly track the use of the standard default value
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 32872
diff changeset
   226
_unset = object()
4a3f1d362e5f config: explicitly track the use of the standard default value
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 32872
diff changeset
   227
34882
e9f320a40b44 ui: move request exit handlers to global state
Saurabh Singh <singhsrb@fb.com>
parents: 34858
diff changeset
   228
# _reqexithandlers: callbacks run at the end of a request
49797
0449fb7729d7 typing: add trivial type hints to mercurial/ui.py
Matt Harbison <matt_harbison@yahoo.com>
parents: 49795
diff changeset
   229
_reqexithandlers: List = []
34882
e9f320a40b44 ui: move request exit handlers to global state
Saurabh Singh <singhsrb@fb.com>
parents: 34858
diff changeset
   230
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42672
diff changeset
   231
48946
642e31cb55f0 py3: use class X: instead of class X(object):
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48935
diff changeset
   232
class ui:
49797
0449fb7729d7 typing: add trivial type hints to mercurial/ui.py
Matt Harbison <matt_harbison@yahoo.com>
parents: 49795
diff changeset
   233
    def __init__(self, src: Optional["ui"] = None) -> None:
30559
d83ca854fa21 ui: factor out ui.load() to create a ui without loading configs (API)
Yuya Nishihara <yuya@tcha.org>
parents: 30537
diff changeset
   234
        """Create a fresh new ui object if no src given
d83ca854fa21 ui: factor out ui.load() to create a ui without loading configs (API)
Yuya Nishihara <yuya@tcha.org>
parents: 30537
diff changeset
   235
d83ca854fa21 ui: factor out ui.load() to create a ui without loading configs (API)
Yuya Nishihara <yuya@tcha.org>
parents: 30537
diff changeset
   236
        Use uimod.ui.load() to create a ui which knows global and user configs.
d83ca854fa21 ui: factor out ui.load() to create a ui without loading configs (API)
Yuya Nishihara <yuya@tcha.org>
parents: 30537
diff changeset
   237
        In most cases, you should use ui.copy() to create a copy of an existing
d83ca854fa21 ui: factor out ui.load() to create a ui without loading configs (API)
Yuya Nishihara <yuya@tcha.org>
parents: 30537
diff changeset
   238
        ui object.
d83ca854fa21 ui: factor out ui.load() to create a ui without loading configs (API)
Yuya Nishihara <yuya@tcha.org>
parents: 30537
diff changeset
   239
        """
21132
350dc24a553d ui: pushbuffer can now also capture stderr
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 20788
diff changeset
   240
        # _buffers: used for temporary capture of output
8202
4746113269c7 ui: buffers -> _buffers
Matt Mackall <mpm@selenic.com>
parents: 8201
diff changeset
   241
        self._buffers = []
27106
6ef17697b03d ui: track label expansion when creating buffers
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27068
diff changeset
   242
        # 3-tuple describing how each buffer in the stack behaves.
6ef17697b03d ui: track label expansion when creating buffers
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27068
diff changeset
   243
        # Values are (capture stderr, capture subprocesses, apply labels).
21132
350dc24a553d ui: pushbuffer can now also capture stderr
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 20788
diff changeset
   244
        self._bufferstates = []
27106
6ef17697b03d ui: track label expansion when creating buffers
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27068
diff changeset
   245
        # When a buffer is active, defines whether we are expanding labels.
6ef17697b03d ui: track label expansion when creating buffers
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27068
diff changeset
   246
        # This exists to prevent an extra list lookup.
6ef17697b03d ui: track label expansion when creating buffers
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27068
diff changeset
   247
        self._bufferapplylabels = None
9851
9e7b2c49d25d Make it possible to debug failed hook imports via use of --traceback
Bryan O'Sullivan <bos@serpentine.com>
parents: 9786
diff changeset
   248
        self.quiet = self.verbose = self.debugflag = self.tracebackflag = False
8208
32a2a1e244f1 ui: make interactive a method
Matt Mackall <mpm@selenic.com>
parents: 8206
diff changeset
   249
        self._reportuntrusted = True
32984
6d983e8af49c configitems: introduce a central registry for config option
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 32967
diff changeset
   250
        self._knownconfig = configitems.coreitems
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42672
diff changeset
   251
        self._ocfg = config.config()  # overlay
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42672
diff changeset
   252
        self._tcfg = config.config()  # trusted
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42672
diff changeset
   253
        self._ucfg = config.config()  # untrusted
8478
d728f126c1b7 ui: use set instead of dict
Martin Geisler <mg@lazybytes.net>
parents: 8409
diff changeset
   254
        self._trustusers = set()
d728f126c1b7 ui: use set instead of dict
Martin Geisler <mg@lazybytes.net>
parents: 8409
diff changeset
   255
        self._trustgroups = set()
17048
15d4d475de9e ui: add a variable to control whether hooks should be called
Idan Kamara <idankk86@gmail.com>
parents: 16383
diff changeset
   256
        self.callhooks = True
47272
a671832a8e41 urlutil: move url "fixing" at the time of `ui.paths` initialization
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47233
diff changeset
   257
        # hold the root to use for each [paths] entry
a671832a8e41 urlutil: move url "fixing" at the time of `ui.paths` initialization
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47233
diff changeset
   258
        self._path_to_root = {}
29109
e9ce33c642e8 ui: add an instance flag to hold --insecure bit
Gregory Szorc <gregory.szorc@gmail.com>
parents: 29096
diff changeset
   259
        # Insecure server connections requested.
e9ce33c642e8 ui: add an instance flag to hold --insecure bit
Gregory Szorc <gregory.szorc@gmail.com>
parents: 29096
diff changeset
   260
        self.insecureconnections = False
30976
e92daf156d5c ui: provide a mechanism to track and log blocked time
Simon Farnsworth <simonfar@fb.com>
parents: 30945
diff changeset
   261
        # Blocked time
e92daf156d5c ui: provide a mechanism to track and log blocked time
Simon Farnsworth <simonfar@fb.com>
parents: 30945
diff changeset
   262
        self.logblockedtimes = False
31106
a185b903bda3 color: have the 'ui' object carry the '_colormode' directly
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 31094
diff changeset
   263
        # color mode: see mercurial/color.py for possible value
a185b903bda3 color: have the 'ui' object carry the '_colormode' directly
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 31094
diff changeset
   264
        self._colormode = None
31113
268caf97c38f color: move the dict with terminfo parameters on the ui object
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 31108
diff changeset
   265
        self._terminfoparams = {}
31115
f5131d4f512a color: move 'styles' definition on the 'ui' object
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 31114
diff changeset
   266
        self._styles = {}
38526
313a940d49a3 ui: add an uninterruptable context manager that can block SIGINT
Augie Fackler <augie@google.com>
parents: 38345
diff changeset
   267
        self._uninterruptible = False
45025
24b1a8eb73aa ui: add option to timestamp status and diagnostic messages
Joerg Sonnenberger <joerg@bec.de>
parents: 44992
diff changeset
   268
        self.showtimestamp = False
8136
6b5522cb2ad2 ui: refactor option setting
Matt Mackall <mpm@selenic.com>
parents: 8135
diff changeset
   269
8190
9b8ac5fb7760 ui: kill most users of parentui name and arg, replace with .copy()
Matt Mackall <mpm@selenic.com>
parents: 8189
diff changeset
   270
        if src:
40543
7bffbbe03e90 ui: hide fin/fout/ferr attributes behind @property functions
Yuya Nishihara <yuya@tcha.org>
parents: 40542
diff changeset
   271
            self._fout = src._fout
7bffbbe03e90 ui: hide fin/fout/ferr attributes behind @property functions
Yuya Nishihara <yuya@tcha.org>
parents: 40542
diff changeset
   272
            self._ferr = src._ferr
7bffbbe03e90 ui: hide fin/fout/ferr attributes behind @property functions
Yuya Nishihara <yuya@tcha.org>
parents: 40542
diff changeset
   273
            self._fin = src._fin
40587
5542bc9125c9 dispatch: pass around ui.fmsg channel
Yuya Nishihara <yuya@tcha.org>
parents: 40578
diff changeset
   274
            self._fmsg = src._fmsg
40547
840cd57cde32 ui: add config knob to redirect status messages to stderr (API)
Yuya Nishihara <yuya@tcha.org>
parents: 40543
diff changeset
   275
            self._fmsgout = src._fmsgout
840cd57cde32 ui: add config knob to redirect status messages to stderr (API)
Yuya Nishihara <yuya@tcha.org>
parents: 40543
diff changeset
   276
            self._fmsgerr = src._fmsgerr
39809
23a00bc90a3c chgserver: do not send system() back to client if stdio redirected (issue5992)
Yuya Nishihara <yuya@tcha.org>
parents: 38762
diff changeset
   277
            self._finoutredirected = src._finoutredirected
40730
55b053af7196 ui: manage logger instances and event filtering by core ui
Yuya Nishihara <yuya@tcha.org>
parents: 40678
diff changeset
   278
            self._loggers = src._loggers.copy()
30992
61b4122019d3 pager: move pager-initiating code into core
Augie Fackler <augie@google.com>
parents: 30980
diff changeset
   279
            self.pageractive = src.pageractive
31026
9c827087df38 ui: rename neverpager to disablepager
Augie Fackler <augie@google.com>
parents: 31014
diff changeset
   280
            self._disablepager = src._disablepager
32872
9fcb6df413c9 ui: add support for a tweakdefaults knob
Augie Fackler <augie@google.com>
parents: 32579
diff changeset
   281
            self._tweaked = src._tweaked
14612
4e1ccd4c2b6d ui: add I/O descriptors
Idan Kamara <idankk86@gmail.com>
parents: 14515
diff changeset
   282
8203
3377fa11af67 ui: privatize cdata vars
Matt Mackall <mpm@selenic.com>
parents: 8202
diff changeset
   283
            self._tcfg = src._tcfg.copy()
3377fa11af67 ui: privatize cdata vars
Matt Mackall <mpm@selenic.com>
parents: 8202
diff changeset
   284
            self._ucfg = src._ucfg.copy()
3377fa11af67 ui: privatize cdata vars
Matt Mackall <mpm@selenic.com>
parents: 8202
diff changeset
   285
            self._ocfg = src._ocfg.copy()
8201
7cf2b987acd3 ui: trusted_users -> _trustusers, trusted_groups -> _trustgroups
Matt Mackall <mpm@selenic.com>
parents: 8200
diff changeset
   286
            self._trustusers = src._trustusers.copy()
7cf2b987acd3 ui: trusted_users -> _trustusers, trusted_groups -> _trustgroups
Matt Mackall <mpm@selenic.com>
parents: 8200
diff changeset
   287
            self._trustgroups = src._trustgroups.copy()
9887
38170eeed18c ui: add environ property to access os.environ or wsgirequest.environ
Sune Foldager <cryo@cyanite.org>
parents: 9851
diff changeset
   288
            self.environ = src.environ
17048
15d4d475de9e ui: add a variable to control whether hooks should be called
Idan Kamara <idankk86@gmail.com>
parents: 16383
diff changeset
   289
            self.callhooks = src.callhooks
47272
a671832a8e41 urlutil: move url "fixing" at the time of `ui.paths` initialization
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47233
diff changeset
   290
            self._path_to_root = src._path_to_root
29109
e9ce33c642e8 ui: add an instance flag to hold --insecure bit
Gregory Szorc <gregory.szorc@gmail.com>
parents: 29096
diff changeset
   291
            self.insecureconnections = src.insecureconnections
31106
a185b903bda3 color: have the 'ui' object carry the '_colormode' directly
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 31094
diff changeset
   292
            self._colormode = src._colormode
31113
268caf97c38f color: move the dict with terminfo parameters on the ui object
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 31108
diff changeset
   293
            self._terminfoparams = src._terminfoparams.copy()
31115
f5131d4f512a color: move 'styles' definition on the 'ui' object
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 31114
diff changeset
   294
            self._styles = src._styles.copy()
31106
a185b903bda3 color: have the 'ui' object carry the '_colormode' directly
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 31094
diff changeset
   295
8143
507c49e297e1 ui: simplify init, kill dupconfig
Matt Mackall <mpm@selenic.com>
parents: 8142
diff changeset
   296
            self.fixconfig()
29378
fea71f66ebff url: remember http password database in ui object
liscju <piotr.listkiewicz@gmail.com>
parents: 29366
diff changeset
   297
fea71f66ebff url: remember http password database in ui object
liscju <piotr.listkiewicz@gmail.com>
parents: 29366
diff changeset
   298
            self.httppasswordmgrdb = src.httppasswordmgrdb
30976
e92daf156d5c ui: provide a mechanism to track and log blocked time
Simon Farnsworth <simonfar@fb.com>
parents: 30945
diff changeset
   299
            self._blockedtimes = src._blockedtimes
8143
507c49e297e1 ui: simplify init, kill dupconfig
Matt Mackall <mpm@selenic.com>
parents: 8142
diff changeset
   300
        else:
40543
7bffbbe03e90 ui: hide fin/fout/ferr attributes behind @property functions
Yuya Nishihara <yuya@tcha.org>
parents: 40542
diff changeset
   301
            self._fout = procutil.stdout
7bffbbe03e90 ui: hide fin/fout/ferr attributes behind @property functions
Yuya Nishihara <yuya@tcha.org>
parents: 40542
diff changeset
   302
            self._ferr = procutil.stderr
7bffbbe03e90 ui: hide fin/fout/ferr attributes behind @property functions
Yuya Nishihara <yuya@tcha.org>
parents: 40542
diff changeset
   303
            self._fin = procutil.stdin
40587
5542bc9125c9 dispatch: pass around ui.fmsg channel
Yuya Nishihara <yuya@tcha.org>
parents: 40578
diff changeset
   304
            self._fmsg = None
40547
840cd57cde32 ui: add config knob to redirect status messages to stderr (API)
Yuya Nishihara <yuya@tcha.org>
parents: 40543
diff changeset
   305
            self._fmsgout = self.fout  # configurable
840cd57cde32 ui: add config knob to redirect status messages to stderr (API)
Yuya Nishihara <yuya@tcha.org>
parents: 40543
diff changeset
   306
            self._fmsgerr = self.ferr  # configurable
39809
23a00bc90a3c chgserver: do not send system() back to client if stdio redirected (issue5992)
Yuya Nishihara <yuya@tcha.org>
parents: 38762
diff changeset
   307
            self._finoutredirected = False
40730
55b053af7196 ui: manage logger instances and event filtering by core ui
Yuya Nishihara <yuya@tcha.org>
parents: 40678
diff changeset
   308
            self._loggers = {}
30992
61b4122019d3 pager: move pager-initiating code into core
Augie Fackler <augie@google.com>
parents: 30980
diff changeset
   309
            self.pageractive = False
31026
9c827087df38 ui: rename neverpager to disablepager
Augie Fackler <augie@google.com>
parents: 31014
diff changeset
   310
            self._disablepager = False
32872
9fcb6df413c9 ui: add support for a tweakdefaults knob
Augie Fackler <augie@google.com>
parents: 32579
diff changeset
   311
            self._tweaked = False
14612
4e1ccd4c2b6d ui: add I/O descriptors
Idan Kamara <idankk86@gmail.com>
parents: 14515
diff changeset
   312
9887
38170eeed18c ui: add environ property to access os.environ or wsgirequest.environ
Sune Foldager <cryo@cyanite.org>
parents: 9851
diff changeset
   313
            # shared read-only environment
30637
344e68882cd3 py3: replace os.environ with encoding.environ (part 4 of 5)
Pulkit Goyal <7895pulkit@gmail.com>
parents: 30618
diff changeset
   314
            self.environ = encoding.environ
8222
d30a21594812 more whitespace cleanup and some other style nits
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 8220
diff changeset
   315
30945
8b83b626fb1e ui: remove urllib2 from being imported early
Kyle Lippincott <spectral@google.com>
parents: 30932
diff changeset
   316
            self.httppasswordmgrdb = httppasswordmgrdbproxy()
30976
e92daf156d5c ui: provide a mechanism to track and log blocked time
Simon Farnsworth <simonfar@fb.com>
parents: 30945
diff changeset
   317
            self._blockedtimes = collections.defaultdict(int)
29378
fea71f66ebff url: remember http password database in ui object
liscju <piotr.listkiewicz@gmail.com>
parents: 29366
diff changeset
   318
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   319
        allowed = self.configlist(b'experimental', b'exportableenviron')
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   320
        if b'*' in allowed:
30832
da5fa0f13a41 ui: introduce an experimental dict of exportable environment variables
Matt Harbison <matt_harbison@yahoo.com>
parents: 30814
diff changeset
   321
            self._exportableenviron = self.environ
da5fa0f13a41 ui: introduce an experimental dict of exportable environment variables
Matt Harbison <matt_harbison@yahoo.com>
parents: 30814
diff changeset
   322
        else:
da5fa0f13a41 ui: introduce an experimental dict of exportable environment variables
Matt Harbison <matt_harbison@yahoo.com>
parents: 30814
diff changeset
   323
            self._exportableenviron = {}
da5fa0f13a41 ui: introduce an experimental dict of exportable environment variables
Matt Harbison <matt_harbison@yahoo.com>
parents: 30814
diff changeset
   324
            for k in allowed:
da5fa0f13a41 ui: introduce an experimental dict of exportable environment variables
Matt Harbison <matt_harbison@yahoo.com>
parents: 30814
diff changeset
   325
                if k in self.environ:
da5fa0f13a41 ui: introduce an experimental dict of exportable environment variables
Matt Harbison <matt_harbison@yahoo.com>
parents: 30814
diff changeset
   326
                    self._exportableenviron[k] = self.environ[k]
da5fa0f13a41 ui: introduce an experimental dict of exportable environment variables
Matt Harbison <matt_harbison@yahoo.com>
parents: 30814
diff changeset
   327
49797
0449fb7729d7 typing: add trivial type hints to mercurial/ui.py
Matt Harbison <matt_harbison@yahoo.com>
parents: 49795
diff changeset
   328
    def _new_source(self) -> None:
46622
a3dced4b7b04 config: track the "level" of a value
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 46620
diff changeset
   329
        self._ocfg.new_source()
a3dced4b7b04 config: track the "level" of a value
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 46620
diff changeset
   330
        self._tcfg.new_source()
a3dced4b7b04 config: track the "level" of a value
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 46620
diff changeset
   331
        self._ucfg.new_source()
a3dced4b7b04 config: track the "level" of a value
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 46620
diff changeset
   332
30559
d83ca854fa21 ui: factor out ui.load() to create a ui without loading configs (API)
Yuya Nishihara <yuya@tcha.org>
parents: 30537
diff changeset
   333
    @classmethod
49797
0449fb7729d7 typing: add trivial type hints to mercurial/ui.py
Matt Harbison <matt_harbison@yahoo.com>
parents: 49795
diff changeset
   334
    def load(cls: Type[_Tui]) -> _Tui:
30559
d83ca854fa21 ui: factor out ui.load() to create a ui without loading configs (API)
Yuya Nishihara <yuya@tcha.org>
parents: 30537
diff changeset
   335
        """Create a ui and load global and user configs"""
d83ca854fa21 ui: factor out ui.load() to create a ui without loading configs (API)
Yuya Nishihara <yuya@tcha.org>
parents: 30537
diff changeset
   336
        u = cls()
31685
d83e51654c8a rcutil: let environ override system configs (BC)
Jun Wu <quark@fb.com>
parents: 31683
diff changeset
   337
        # we always trust global config files and environment variables
31683
00e569a2da97 rcutil: let rccomponents return different types of configs (API)
Jun Wu <quark@fb.com>
parents: 31682
diff changeset
   338
        for t, f in rcutil.rccomponents():
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   339
            if t == b'path':
31683
00e569a2da97 rcutil: let rccomponents return different types of configs (API)
Jun Wu <quark@fb.com>
parents: 31682
diff changeset
   340
                u.readconfig(f, trust=True)
44031
1864efbe90d9 ui: add the ability to apply `defaultrc` configs from resources
Matt Harbison <matt_harbison@yahoo.com>
parents: 44030
diff changeset
   341
            elif t == b'resource':
1864efbe90d9 ui: add the ability to apply `defaultrc` configs from resources
Matt Harbison <matt_harbison@yahoo.com>
parents: 44030
diff changeset
   342
                u.read_resource_config(f, trust=True)
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   343
            elif t == b'items':
46622
a3dced4b7b04 config: track the "level" of a value
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 46620
diff changeset
   344
                u._new_source()
31685
d83e51654c8a rcutil: let environ override system configs (BC)
Jun Wu <quark@fb.com>
parents: 31683
diff changeset
   345
                sections = set()
d83e51654c8a rcutil: let environ override system configs (BC)
Jun Wu <quark@fb.com>
parents: 31683
diff changeset
   346
                for section, name, value, source in f:
d83e51654c8a rcutil: let environ override system configs (BC)
Jun Wu <quark@fb.com>
parents: 31683
diff changeset
   347
                    # do not set u._ocfg
d83e51654c8a rcutil: let environ override system configs (BC)
Jun Wu <quark@fb.com>
parents: 31683
diff changeset
   348
                    # XXX clean this up once immutable config object is a thing
d83e51654c8a rcutil: let environ override system configs (BC)
Jun Wu <quark@fb.com>
parents: 31683
diff changeset
   349
                    u._tcfg.set(section, name, value, source)
d83e51654c8a rcutil: let environ override system configs (BC)
Jun Wu <quark@fb.com>
parents: 31683
diff changeset
   350
                    u._ucfg.set(section, name, value, source)
d83e51654c8a rcutil: let environ override system configs (BC)
Jun Wu <quark@fb.com>
parents: 31683
diff changeset
   351
                    sections.add(section)
d83e51654c8a rcutil: let environ override system configs (BC)
Jun Wu <quark@fb.com>
parents: 31683
diff changeset
   352
                for section in sections:
d83e51654c8a rcutil: let environ override system configs (BC)
Jun Wu <quark@fb.com>
parents: 31683
diff changeset
   353
                    u.fixconfig(section=section)
31683
00e569a2da97 rcutil: let rccomponents return different types of configs (API)
Jun Wu <quark@fb.com>
parents: 31682
diff changeset
   354
            else:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   355
                raise error.ProgrammingError(b'unknown rctype: %s' % t)
32872
9fcb6df413c9 ui: add support for a tweakdefaults knob
Augie Fackler <augie@google.com>
parents: 32579
diff changeset
   356
        u._maybetweakdefaults()
46622
a3dced4b7b04 config: track the "level" of a value
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 46620
diff changeset
   357
        u._new_source()  # anything after that is a different level
30559
d83ca854fa21 ui: factor out ui.load() to create a ui without loading configs (API)
Yuya Nishihara <yuya@tcha.org>
parents: 30537
diff changeset
   358
        return u
d83ca854fa21 ui: factor out ui.load() to create a ui without loading configs (API)
Yuya Nishihara <yuya@tcha.org>
parents: 30537
diff changeset
   359
49797
0449fb7729d7 typing: add trivial type hints to mercurial/ui.py
Matt Harbison <matt_harbison@yahoo.com>
parents: 49795
diff changeset
   360
    def _maybetweakdefaults(self) -> None:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   361
        if not self.configbool(b'ui', b'tweakdefaults'):
32872
9fcb6df413c9 ui: add support for a tweakdefaults knob
Augie Fackler <augie@google.com>
parents: 32579
diff changeset
   362
            return
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   363
        if self._tweaked or self.plain(b'tweakdefaults'):
32872
9fcb6df413c9 ui: add support for a tweakdefaults knob
Augie Fackler <augie@google.com>
parents: 32579
diff changeset
   364
            return
9fcb6df413c9 ui: add support for a tweakdefaults knob
Augie Fackler <augie@google.com>
parents: 32579
diff changeset
   365
9fcb6df413c9 ui: add support for a tweakdefaults knob
Augie Fackler <augie@google.com>
parents: 32579
diff changeset
   366
        # Note: it is SUPER IMPORTANT that you set self._tweaked to
9fcb6df413c9 ui: add support for a tweakdefaults knob
Augie Fackler <augie@google.com>
parents: 32579
diff changeset
   367
        # True *before* any calls to setconfig(), otherwise you'll get
9fcb6df413c9 ui: add support for a tweakdefaults knob
Augie Fackler <augie@google.com>
parents: 32579
diff changeset
   368
        # infinite recursion between setconfig and this method.
9fcb6df413c9 ui: add support for a tweakdefaults knob
Augie Fackler <augie@google.com>
parents: 32579
diff changeset
   369
        #
9fcb6df413c9 ui: add support for a tweakdefaults knob
Augie Fackler <augie@google.com>
parents: 32579
diff changeset
   370
        # TODO: We should extract an inner method in setconfig() to
9fcb6df413c9 ui: add support for a tweakdefaults knob
Augie Fackler <augie@google.com>
parents: 32579
diff changeset
   371
        # avoid this weirdness.
9fcb6df413c9 ui: add support for a tweakdefaults knob
Augie Fackler <augie@google.com>
parents: 32579
diff changeset
   372
        self._tweaked = True
9fcb6df413c9 ui: add support for a tweakdefaults knob
Augie Fackler <augie@google.com>
parents: 32579
diff changeset
   373
        tmpcfg = config.config()
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   374
        tmpcfg.parse(b'<tweakdefaults>', tweakrc)
32872
9fcb6df413c9 ui: add support for a tweakdefaults knob
Augie Fackler <augie@google.com>
parents: 32579
diff changeset
   375
        for section in tmpcfg:
9fcb6df413c9 ui: add support for a tweakdefaults knob
Augie Fackler <augie@google.com>
parents: 32579
diff changeset
   376
            for name, value in tmpcfg.items(section):
9fcb6df413c9 ui: add support for a tweakdefaults knob
Augie Fackler <augie@google.com>
parents: 32579
diff changeset
   377
                if not self.hasconfig(section, name):
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   378
                    self.setconfig(section, name, value, b"<tweakdefaults>")
32872
9fcb6df413c9 ui: add support for a tweakdefaults knob
Augie Fackler <augie@google.com>
parents: 32579
diff changeset
   379
49797
0449fb7729d7 typing: add trivial type hints to mercurial/ui.py
Matt Harbison <matt_harbison@yahoo.com>
parents: 49795
diff changeset
   380
    def copy(self: _Tui) -> _Tui:
8220
6e6ebeb52899 ui: ui.copy() now takes the ui class into account
Ronny Pfannschmidt <Ronny.Pfannschmidt@gmx.de>
parents: 8208
diff changeset
   381
        return self.__class__(self)
1839
876e4e6ad82b Create local ui object per repository, so .hg/hgrc don't get mixed.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1637
diff changeset
   382
49797
0449fb7729d7 typing: add trivial type hints to mercurial/ui.py
Matt Harbison <matt_harbison@yahoo.com>
parents: 49795
diff changeset
   383
    def resetstate(self) -> None:
29366
d269e7db2f55 ui: provide official way to reset internal state per command
Yuya Nishihara <yuya@tcha.org>
parents: 29109
diff changeset
   384
        """Clear internal state that shouldn't persist across commands"""
d269e7db2f55 ui: provide official way to reset internal state per command
Yuya Nishihara <yuya@tcha.org>
parents: 29109
diff changeset
   385
        if self._progbar:
d269e7db2f55 ui: provide official way to reset internal state per command
Yuya Nishihara <yuya@tcha.org>
parents: 29109
diff changeset
   386
            self._progbar.resetstate()  # reset last-print time of progress bar
30945
8b83b626fb1e ui: remove urllib2 from being imported early
Kyle Lippincott <spectral@google.com>
parents: 30932
diff changeset
   387
        self.httppasswordmgrdb = httppasswordmgrdbproxy()
29366
d269e7db2f55 ui: provide official way to reset internal state per command
Yuya Nishihara <yuya@tcha.org>
parents: 29109
diff changeset
   388
30976
e92daf156d5c ui: provide a mechanism to track and log blocked time
Simon Farnsworth <simonfar@fb.com>
parents: 30945
diff changeset
   389
    @contextlib.contextmanager
49797
0449fb7729d7 typing: add trivial type hints to mercurial/ui.py
Matt Harbison <matt_harbison@yahoo.com>
parents: 49795
diff changeset
   390
    def timeblockedsection(self, key: bytes):
30978
fdecd24ca4dc ui: log time spent blocked on stdio
Simon Farnsworth <simonfar@fb.com>
parents: 30976
diff changeset
   391
        # this is open-coded below - search for timeblockedsection to find them
30976
e92daf156d5c ui: provide a mechanism to track and log blocked time
Simon Farnsworth <simonfar@fb.com>
parents: 30945
diff changeset
   392
        starttime = util.timer()
e92daf156d5c ui: provide a mechanism to track and log blocked time
Simon Farnsworth <simonfar@fb.com>
parents: 30945
diff changeset
   393
        try:
e92daf156d5c ui: provide a mechanism to track and log blocked time
Simon Farnsworth <simonfar@fb.com>
parents: 30945
diff changeset
   394
            yield
e92daf156d5c ui: provide a mechanism to track and log blocked time
Simon Farnsworth <simonfar@fb.com>
parents: 30945
diff changeset
   395
        finally:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   396
            self._blockedtimes[key + b'_blocked'] += (
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42672
diff changeset
   397
                util.timer() - starttime
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42672
diff changeset
   398
            ) * 1000
29366
d269e7db2f55 ui: provide official way to reset internal state per command
Yuya Nishihara <yuya@tcha.org>
parents: 29109
diff changeset
   399
38526
313a940d49a3 ui: add an uninterruptable context manager that can block SIGINT
Augie Fackler <augie@google.com>
parents: 38345
diff changeset
   400
    @contextlib.contextmanager
41076
8ecb17b7f432 procutil: correct spelling of uninterruptable -> uninterruptible
Kyle Lippincott <spectral@google.com>
parents: 41063
diff changeset
   401
    def uninterruptible(self):
38526
313a940d49a3 ui: add an uninterruptable context manager that can block SIGINT
Augie Fackler <augie@google.com>
parents: 38345
diff changeset
   402
        """Mark an operation as unsafe.
313a940d49a3 ui: add an uninterruptable context manager that can block SIGINT
Augie Fackler <augie@google.com>
parents: 38345
diff changeset
   403
313a940d49a3 ui: add an uninterruptable context manager that can block SIGINT
Augie Fackler <augie@google.com>
parents: 38345
diff changeset
   404
        Most operations on a repository are safe to interrupt, but a
313a940d49a3 ui: add an uninterruptable context manager that can block SIGINT
Augie Fackler <augie@google.com>
parents: 38345
diff changeset
   405
        few are risky (for example repair.strip). This context manager
313a940d49a3 ui: add an uninterruptable context manager that can block SIGINT
Augie Fackler <augie@google.com>
parents: 38345
diff changeset
   406
        lets you advise Mercurial that something risky is happening so
313a940d49a3 ui: add an uninterruptable context manager that can block SIGINT
Augie Fackler <augie@google.com>
parents: 38345
diff changeset
   407
        that control-C etc can be blocked if desired.
313a940d49a3 ui: add an uninterruptable context manager that can block SIGINT
Augie Fackler <augie@google.com>
parents: 38345
diff changeset
   408
        """
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   409
        enabled = self.configbool(b'experimental', b'nointerrupt')
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42672
diff changeset
   410
        if enabled and self.configbool(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   411
            b'experimental', b'nointerrupt-interactiveonly'
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42672
diff changeset
   412
        ):
38526
313a940d49a3 ui: add an uninterruptable context manager that can block SIGINT
Augie Fackler <augie@google.com>
parents: 38345
diff changeset
   413
            enabled = self.interactive()
313a940d49a3 ui: add an uninterruptable context manager that can block SIGINT
Augie Fackler <augie@google.com>
parents: 38345
diff changeset
   414
        if self._uninterruptible or not enabled:
313a940d49a3 ui: add an uninterruptable context manager that can block SIGINT
Augie Fackler <augie@google.com>
parents: 38345
diff changeset
   415
            # if nointerrupt support is turned off, the process isn't
41076
8ecb17b7f432 procutil: correct spelling of uninterruptable -> uninterruptible
Kyle Lippincott <spectral@google.com>
parents: 41063
diff changeset
   416
            # interactive, or we're already in an uninterruptible
38526
313a940d49a3 ui: add an uninterruptable context manager that can block SIGINT
Augie Fackler <augie@google.com>
parents: 38345
diff changeset
   417
            # block, do nothing.
313a940d49a3 ui: add an uninterruptable context manager that can block SIGINT
Augie Fackler <augie@google.com>
parents: 38345
diff changeset
   418
            yield
313a940d49a3 ui: add an uninterruptable context manager that can block SIGINT
Augie Fackler <augie@google.com>
parents: 38345
diff changeset
   419
            return
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42672
diff changeset
   420
38526
313a940d49a3 ui: add an uninterruptable context manager that can block SIGINT
Augie Fackler <augie@google.com>
parents: 38345
diff changeset
   421
        def warn():
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   422
            self.warn(_(b"shutting down cleanly\n"))
38526
313a940d49a3 ui: add an uninterruptable context manager that can block SIGINT
Augie Fackler <augie@google.com>
parents: 38345
diff changeset
   423
            self.warn(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   424
                _(b"press ^C again to terminate immediately (dangerous)\n")
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42672
diff changeset
   425
            )
38526
313a940d49a3 ui: add an uninterruptable context manager that can block SIGINT
Augie Fackler <augie@google.com>
parents: 38345
diff changeset
   426
            return True
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42672
diff changeset
   427
41076
8ecb17b7f432 procutil: correct spelling of uninterruptable -> uninterruptible
Kyle Lippincott <spectral@google.com>
parents: 41063
diff changeset
   428
        with procutil.uninterruptible(warn):
38526
313a940d49a3 ui: add an uninterruptable context manager that can block SIGINT
Augie Fackler <augie@google.com>
parents: 38345
diff changeset
   429
            try:
313a940d49a3 ui: add an uninterruptable context manager that can block SIGINT
Augie Fackler <augie@google.com>
parents: 38345
diff changeset
   430
                self._uninterruptible = True
313a940d49a3 ui: add an uninterruptable context manager that can block SIGINT
Augie Fackler <augie@google.com>
parents: 38345
diff changeset
   431
                yield
313a940d49a3 ui: add an uninterruptable context manager that can block SIGINT
Augie Fackler <augie@google.com>
parents: 38345
diff changeset
   432
            finally:
313a940d49a3 ui: add an uninterruptable context manager that can block SIGINT
Augie Fackler <augie@google.com>
parents: 38345
diff changeset
   433
                self._uninterruptible = False
313a940d49a3 ui: add an uninterruptable context manager that can block SIGINT
Augie Fackler <augie@google.com>
parents: 38345
diff changeset
   434
49797
0449fb7729d7 typing: add trivial type hints to mercurial/ui.py
Matt Harbison <matt_harbison@yahoo.com>
parents: 49795
diff changeset
   435
    def formatter(self, topic: bytes, opts):
32579
012e0da5b759 formatter: add option to redirect output to file object
Yuya Nishihara <yuya@tcha.org>
parents: 32462
diff changeset
   436
        return formatter.formatter(self, self, topic, opts)
16135
ae5f92e154d3 ui: add formatter method
Matt Mackall <mpm@selenic.com>
parents: 15919
diff changeset
   437
49797
0449fb7729d7 typing: add trivial type hints to mercurial/ui.py
Matt Harbison <matt_harbison@yahoo.com>
parents: 49795
diff changeset
   438
    def _trusted(self, fp, f: bytes) -> bool:
3677
1a0fa3914c46 Avoid looking up usernames if the current user owns the .hgrc file
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 3676
diff changeset
   439
        st = util.fstat(fp)
8657
3fa92c618624 posix: do not use fstat in isowner
Martin Geisler <mg@lazybytes.net>
parents: 8656
diff changeset
   440
        if util.isowner(st):
3677
1a0fa3914c46 Avoid looking up usernames if the current user owns the .hgrc file
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 3676
diff changeset
   441
            return True
8141
e40b629bedd1 ui: cleanup _is_trusted a bit
Matt Mackall <mpm@selenic.com>
parents: 8140
diff changeset
   442
8201
7cf2b987acd3 ui: trusted_users -> _trustusers, trusted_groups -> _trustgroups
Matt Mackall <mpm@selenic.com>
parents: 8200
diff changeset
   443
        tusers, tgroups = self._trustusers, self._trustgroups
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   444
        if b'*' in tusers or b'*' in tgroups:
8141
e40b629bedd1 ui: cleanup _is_trusted a bit
Matt Mackall <mpm@selenic.com>
parents: 8140
diff changeset
   445
            return True
e40b629bedd1 ui: cleanup _is_trusted a bit
Matt Mackall <mpm@selenic.com>
parents: 8140
diff changeset
   446
e40b629bedd1 ui: cleanup _is_trusted a bit
Matt Mackall <mpm@selenic.com>
parents: 8140
diff changeset
   447
        user = util.username(st.st_uid)
e40b629bedd1 ui: cleanup _is_trusted a bit
Matt Mackall <mpm@selenic.com>
parents: 8140
diff changeset
   448
        group = util.groupname(st.st_gid)
e40b629bedd1 ui: cleanup _is_trusted a bit
Matt Mackall <mpm@selenic.com>
parents: 8140
diff changeset
   449
        if user in tusers or group in tgroups or user == util.username():
e40b629bedd1 ui: cleanup _is_trusted a bit
Matt Mackall <mpm@selenic.com>
parents: 8140
diff changeset
   450
            return True
e40b629bedd1 ui: cleanup _is_trusted a bit
Matt Mackall <mpm@selenic.com>
parents: 8140
diff changeset
   451
8204
797586be575d ui: report_untrusted fixes
Matt Mackall <mpm@selenic.com>
parents: 8203
diff changeset
   452
        if self._reportuntrusted:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42672
diff changeset
   453
            self.warn(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   454
                _(
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   455
                    b'not trusting file %s from untrusted '
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   456
                    b'user %s, group %s\n'
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   457
                )
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42672
diff changeset
   458
                % (f, user, group)
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42672
diff changeset
   459
            )
8141
e40b629bedd1 ui: cleanup _is_trusted a bit
Matt Mackall <mpm@selenic.com>
parents: 8140
diff changeset
   460
        return False
3551
3b07e223534b Only read .hg/hgrc files from trusted users/groups
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 3489
diff changeset
   461
44030
5ac0e6f19eb4 ui: refactor `readconfig()` into a form that can consume resources
Matt Harbison <matt_harbison@yahoo.com>
parents: 44021
diff changeset
   462
    def read_resource_config(
5ac0e6f19eb4 ui: refactor `readconfig()` into a form that can consume resources
Matt Harbison <matt_harbison@yahoo.com>
parents: 44021
diff changeset
   463
        self, name, root=None, trust=False, sections=None, remap=None
49797
0449fb7729d7 typing: add trivial type hints to mercurial/ui.py
Matt Harbison <matt_harbison@yahoo.com>
parents: 49795
diff changeset
   464
    ) -> None:
44030
5ac0e6f19eb4 ui: refactor `readconfig()` into a form that can consume resources
Matt Harbison <matt_harbison@yahoo.com>
parents: 44021
diff changeset
   465
        try:
5ac0e6f19eb4 ui: refactor `readconfig()` into a form that can consume resources
Matt Harbison <matt_harbison@yahoo.com>
parents: 44021
diff changeset
   466
            fp = resourceutil.open_resource(name[0], name[1])
5ac0e6f19eb4 ui: refactor `readconfig()` into a form that can consume resources
Matt Harbison <matt_harbison@yahoo.com>
parents: 44021
diff changeset
   467
        except IOError:
5ac0e6f19eb4 ui: refactor `readconfig()` into a form that can consume resources
Matt Harbison <matt_harbison@yahoo.com>
parents: 44021
diff changeset
   468
            if not sections:  # ignore unless we were looking for something
5ac0e6f19eb4 ui: refactor `readconfig()` into a form that can consume resources
Matt Harbison <matt_harbison@yahoo.com>
parents: 44021
diff changeset
   469
                return
5ac0e6f19eb4 ui: refactor `readconfig()` into a form that can consume resources
Matt Harbison <matt_harbison@yahoo.com>
parents: 44021
diff changeset
   470
            raise
5ac0e6f19eb4 ui: refactor `readconfig()` into a form that can consume resources
Matt Harbison <matt_harbison@yahoo.com>
parents: 44021
diff changeset
   471
5ac0e6f19eb4 ui: refactor `readconfig()` into a form that can consume resources
Matt Harbison <matt_harbison@yahoo.com>
parents: 44021
diff changeset
   472
        self._readconfig(
5ac0e6f19eb4 ui: refactor `readconfig()` into a form that can consume resources
Matt Harbison <matt_harbison@yahoo.com>
parents: 44021
diff changeset
   473
            b'resource:%s.%s' % name, fp, root, trust, sections, remap
5ac0e6f19eb4 ui: refactor `readconfig()` into a form that can consume resources
Matt Harbison <matt_harbison@yahoo.com>
parents: 44021
diff changeset
   474
        )
5ac0e6f19eb4 ui: refactor `readconfig()` into a form that can consume resources
Matt Harbison <matt_harbison@yahoo.com>
parents: 44021
diff changeset
   475
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42672
diff changeset
   476
    def readconfig(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42672
diff changeset
   477
        self, filename, root=None, trust=False, sections=None, remap=None
49797
0449fb7729d7 typing: add trivial type hints to mercurial/ui.py
Matt Harbison <matt_harbison@yahoo.com>
parents: 49795
diff changeset
   478
    ) -> None:
8142
912bfef12ba6 ui: fold readsections into readconfig
Matt Mackall <mpm@selenic.com>
parents: 8141
diff changeset
   479
        try:
43506
9f70512ae2cf cleanup: remove pointless r-prefixes on single-quoted strings
Augie Fackler <augie@google.com>
parents: 43377
diff changeset
   480
            fp = open(filename, 'rb')
8142
912bfef12ba6 ui: fold readsections into readconfig
Matt Mackall <mpm@selenic.com>
parents: 8141
diff changeset
   481
        except IOError:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42672
diff changeset
   482
            if not sections:  # ignore unless we were looking for something
8142
912bfef12ba6 ui: fold readsections into readconfig
Matt Mackall <mpm@selenic.com>
parents: 8141
diff changeset
   483
                return
912bfef12ba6 ui: fold readsections into readconfig
Matt Mackall <mpm@selenic.com>
parents: 8141
diff changeset
   484
            raise
8139
9302404b60f3 ui: always have ucdata
Matt Mackall <mpm@selenic.com>
parents: 8138
diff changeset
   485
44030
5ac0e6f19eb4 ui: refactor `readconfig()` into a form that can consume resources
Matt Harbison <matt_harbison@yahoo.com>
parents: 44021
diff changeset
   486
        self._readconfig(filename, fp, root, trust, sections, remap)
5ac0e6f19eb4 ui: refactor `readconfig()` into a form that can consume resources
Matt Harbison <matt_harbison@yahoo.com>
parents: 44021
diff changeset
   487
5ac0e6f19eb4 ui: refactor `readconfig()` into a form that can consume resources
Matt Harbison <matt_harbison@yahoo.com>
parents: 44021
diff changeset
   488
    def _readconfig(
5ac0e6f19eb4 ui: refactor `readconfig()` into a form that can consume resources
Matt Harbison <matt_harbison@yahoo.com>
parents: 44021
diff changeset
   489
        self, filename, fp, root=None, trust=False, sections=None, remap=None
49797
0449fb7729d7 typing: add trivial type hints to mercurial/ui.py
Matt Harbison <matt_harbison@yahoo.com>
parents: 49795
diff changeset
   490
    ) -> None:
43910
c41ed5d4f770 config: close file even if we fail to read it
Martin von Zweigbergk <martinvonz@google.com>
parents: 43909
diff changeset
   491
        with fp:
c41ed5d4f770 config: close file even if we fail to read it
Martin von Zweigbergk <martinvonz@google.com>
parents: 43909
diff changeset
   492
            cfg = config.config()
c41ed5d4f770 config: close file even if we fail to read it
Martin von Zweigbergk <martinvonz@google.com>
parents: 43909
diff changeset
   493
            trusted = sections or trust or self._trusted(fp, filename)
3552
9b52239dc740 save settings from untrusted config files in a separate configparser
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 3551
diff changeset
   494
43910
c41ed5d4f770 config: close file even if we fail to read it
Martin von Zweigbergk <martinvonz@google.com>
parents: 43909
diff changeset
   495
            try:
c41ed5d4f770 config: close file even if we fail to read it
Martin von Zweigbergk <martinvonz@google.com>
parents: 43909
diff changeset
   496
                cfg.read(filename, fp, sections=sections, remap=remap)
45894
9dc1351d0b5f errors: raise ConfigError on failure to parse config file
Martin von Zweigbergk <martinvonz@google.com>
parents: 45889
diff changeset
   497
            except error.ConfigError as inst:
43910
c41ed5d4f770 config: close file even if we fail to read it
Martin von Zweigbergk <martinvonz@google.com>
parents: 43909
diff changeset
   498
                if trusted:
c41ed5d4f770 config: close file even if we fail to read it
Martin von Zweigbergk <martinvonz@google.com>
parents: 43909
diff changeset
   499
                    raise
45889
e5a0efd26f7a config: clean up message about ignored untrusted config
Martin von Zweigbergk <martinvonz@google.com>
parents: 45877
diff changeset
   500
                self.warn(
e5a0efd26f7a config: clean up message about ignored untrusted config
Martin von Zweigbergk <martinvonz@google.com>
parents: 45877
diff changeset
   501
                    _(b'ignored %s: %s\n') % (inst.location, inst.message)
e5a0efd26f7a config: clean up message about ignored untrusted config
Martin von Zweigbergk <martinvonz@google.com>
parents: 45877
diff changeset
   502
                )
3552
9b52239dc740 save settings from untrusted config files in a separate configparser
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 3551
diff changeset
   503
44126
e2278581b1c6 config: add a function to insert non-file based, but overridable settings
Matt Harbison <matt_harbison@yahoo.com>
parents: 44031
diff changeset
   504
        self._applyconfig(cfg, trusted, root)
e2278581b1c6 config: add a function to insert non-file based, but overridable settings
Matt Harbison <matt_harbison@yahoo.com>
parents: 44031
diff changeset
   505
49797
0449fb7729d7 typing: add trivial type hints to mercurial/ui.py
Matt Harbison <matt_harbison@yahoo.com>
parents: 49795
diff changeset
   506
    def applyconfig(
0449fb7729d7 typing: add trivial type hints to mercurial/ui.py
Matt Harbison <matt_harbison@yahoo.com>
parents: 49795
diff changeset
   507
        self, configitems: _ConfigItems, source=b"", root=None
0449fb7729d7 typing: add trivial type hints to mercurial/ui.py
Matt Harbison <matt_harbison@yahoo.com>
parents: 49795
diff changeset
   508
    ) -> None:
44126
e2278581b1c6 config: add a function to insert non-file based, but overridable settings
Matt Harbison <matt_harbison@yahoo.com>
parents: 44031
diff changeset
   509
        """Add configitems from a non-file source.  Unlike with ``setconfig()``,
e2278581b1c6 config: add a function to insert non-file based, but overridable settings
Matt Harbison <matt_harbison@yahoo.com>
parents: 44031
diff changeset
   510
        they can be overridden by subsequent config file reads.  The items are
e2278581b1c6 config: add a function to insert non-file based, but overridable settings
Matt Harbison <matt_harbison@yahoo.com>
parents: 44031
diff changeset
   511
        in the same format as ``configoverride()``, namely a dict of the
e2278581b1c6 config: add a function to insert non-file based, but overridable settings
Matt Harbison <matt_harbison@yahoo.com>
parents: 44031
diff changeset
   512
        following structures: {(section, name) : value}
e2278581b1c6 config: add a function to insert non-file based, but overridable settings
Matt Harbison <matt_harbison@yahoo.com>
parents: 44031
diff changeset
   513
e2278581b1c6 config: add a function to insert non-file based, but overridable settings
Matt Harbison <matt_harbison@yahoo.com>
parents: 44031
diff changeset
   514
        Typically this is used by extensions that inject themselves into the
e2278581b1c6 config: add a function to insert non-file based, but overridable settings
Matt Harbison <matt_harbison@yahoo.com>
parents: 44031
diff changeset
   515
        config file load procedure by monkeypatching ``localrepo.loadhgrc()``.
e2278581b1c6 config: add a function to insert non-file based, but overridable settings
Matt Harbison <matt_harbison@yahoo.com>
parents: 44031
diff changeset
   516
        """
e2278581b1c6 config: add a function to insert non-file based, but overridable settings
Matt Harbison <matt_harbison@yahoo.com>
parents: 44031
diff changeset
   517
        cfg = config.config()
e2278581b1c6 config: add a function to insert non-file based, but overridable settings
Matt Harbison <matt_harbison@yahoo.com>
parents: 44031
diff changeset
   518
e2278581b1c6 config: add a function to insert non-file based, but overridable settings
Matt Harbison <matt_harbison@yahoo.com>
parents: 44031
diff changeset
   519
        for (section, name), value in configitems.items():
e2278581b1c6 config: add a function to insert non-file based, but overridable settings
Matt Harbison <matt_harbison@yahoo.com>
parents: 44031
diff changeset
   520
            cfg.set(section, name, value, source)
e2278581b1c6 config: add a function to insert non-file based, but overridable settings
Matt Harbison <matt_harbison@yahoo.com>
parents: 44031
diff changeset
   521
e2278581b1c6 config: add a function to insert non-file based, but overridable settings
Matt Harbison <matt_harbison@yahoo.com>
parents: 44031
diff changeset
   522
        self._applyconfig(cfg, True, root)
e2278581b1c6 config: add a function to insert non-file based, but overridable settings
Matt Harbison <matt_harbison@yahoo.com>
parents: 44031
diff changeset
   523
49797
0449fb7729d7 typing: add trivial type hints to mercurial/ui.py
Matt Harbison <matt_harbison@yahoo.com>
parents: 49795
diff changeset
   524
    def _applyconfig(self, cfg, trusted, root) -> None:
10455
40dfd46d098f ui: add HGPLAIN environment variable for easier scripting
Brodie Rao <me+hg@dackz.net>
parents: 10426
diff changeset
   525
        if self.plain():
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42672
diff changeset
   526
            for k in (
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   527
                b'debug',
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   528
                b'fallbackencoding',
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   529
                b'quiet',
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   530
                b'slash',
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   531
                b'logtemplate',
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   532
                b'message-output',
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   533
                b'statuscopies',
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   534
                b'style',
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   535
                b'traceback',
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   536
                b'verbose',
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42672
diff changeset
   537
            ):
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   538
                if k in cfg[b'ui']:
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   539
                    del cfg[b'ui'][k]
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   540
            for k, v in cfg.items(b'defaults'):
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   541
                del cfg[b'defaults'][k]
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   542
            for k, v in cfg.items(b'commands'):
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   543
                del cfg[b'commands'][k]
45765
ed84a4d48910 config: add a new [command-templates] section for templates defined by hg
Martin von Zweigbergk <martinvonz@google.com>
parents: 45061
diff changeset
   544
            for k, v in cfg.items(b'command-templates'):
ed84a4d48910 config: add a new [command-templates] section for templates defined by hg
Martin von Zweigbergk <martinvonz@google.com>
parents: 45061
diff changeset
   545
                del cfg[b'command-templates'][k]
14373
a599431b0ab6 ui: enable alias exception when reading config in plain mode
"Yann E. MORIN" <yann.morin.1998@anciens.enib.fr>
parents: 14372
diff changeset
   546
        # Don't remove aliases from the configuration if in the exceptionlist
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   547
        if self.plain(b'alias'):
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   548
            for k, v in cfg.items(b'alias'):
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   549
                del cfg[b'alias'][k]
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   550
        if self.plain(b'revsetalias'):
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   551
            for k, v in cfg.items(b'revsetalias'):
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   552
                del cfg[b'revsetalias'][k]
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   553
        if self.plain(b'templatealias'):
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   554
            for k, v in cfg.items(b'templatealias'):
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   555
                del cfg[b'templatealias'][k]
10455
40dfd46d098f ui: add HGPLAIN environment variable for easier scripting
Brodie Rao <me+hg@dackz.net>
parents: 10426
diff changeset
   556
8142
912bfef12ba6 ui: fold readsections into readconfig
Matt Mackall <mpm@selenic.com>
parents: 8141
diff changeset
   557
        if trusted:
8203
3377fa11af67 ui: privatize cdata vars
Matt Mackall <mpm@selenic.com>
parents: 8202
diff changeset
   558
            self._tcfg.update(cfg)
3377fa11af67 ui: privatize cdata vars
Matt Mackall <mpm@selenic.com>
parents: 8202
diff changeset
   559
            self._tcfg.update(self._ocfg)
3377fa11af67 ui: privatize cdata vars
Matt Mackall <mpm@selenic.com>
parents: 8202
diff changeset
   560
        self._ucfg.update(cfg)
3377fa11af67 ui: privatize cdata vars
Matt Mackall <mpm@selenic.com>
parents: 8202
diff changeset
   561
        self._ucfg.update(self._ocfg)
8139
9302404b60f3 ui: always have ucdata
Matt Mackall <mpm@selenic.com>
parents: 8138
diff changeset
   562
3347
bce7c1b4c1c8 ui.py: normalize settings every time the configuration changes
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 3346
diff changeset
   563
        if root is None:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   564
            root = os.path.expanduser(b'~')
3347
bce7c1b4c1c8 ui.py: normalize settings every time the configuration changes
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 3346
diff changeset
   565
        self.fixconfig(root=root)
3014
01454af644b8 load extensions only after the ui object has been completely initialized
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 3013
diff changeset
   566
49797
0449fb7729d7 typing: add trivial type hints to mercurial/ui.py
Matt Harbison <matt_harbison@yahoo.com>
parents: 49795
diff changeset
   567
    def fixconfig(self, root=None, section=None) -> None:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   568
        if section in (None, b'paths'):
12764
ad2506f097d3 ui: only fix config if the relevant section has changed
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents: 12689
diff changeset
   569
            # expand vars and ~
ad2506f097d3 ui: only fix config if the relevant section has changed
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents: 12689
diff changeset
   570
            # translate paths relative to root (or home) into absolute paths
39818
24e493ec2229 py3: rename pycompat.getcwd() to encoding.getcwd() (API)
Matt Harbison <matt_harbison@yahoo.com>
parents: 39662
diff changeset
   571
            root = root or encoding.getcwd()
12764
ad2506f097d3 ui: only fix config if the relevant section has changed
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents: 12689
diff changeset
   572
            for c in self._tcfg, self._ucfg, self._ocfg:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   573
                for n, p in c.items(b'paths'):
47272
a671832a8e41 urlutil: move url "fixing" at the time of `ui.paths` initialization
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47233
diff changeset
   574
                    old_p = p
a671832a8e41 urlutil: move url "fixing" at the time of `ui.paths` initialization
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47233
diff changeset
   575
                    s = self.configsource(b'paths', n) or b'none'
a671832a8e41 urlutil: move url "fixing" at the time of `ui.paths` initialization
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47233
diff changeset
   576
                    root_key = (n, p, s)
a671832a8e41 urlutil: move url "fixing" at the time of `ui.paths` initialization
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47233
diff changeset
   577
                    if root_key not in self._path_to_root:
a671832a8e41 urlutil: move url "fixing" at the time of `ui.paths` initialization
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47233
diff changeset
   578
                        self._path_to_root[root_key] = root
29412
b62bce819d0c ui: don't fixup [paths] sub-options
Gregory Szorc <gregory.szorc@gmail.com>
parents: 29378
diff changeset
   579
                    # Ignore sub-options.
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   580
                    if b':' in n:
29412
b62bce819d0c ui: don't fixup [paths] sub-options
Gregory Szorc <gregory.szorc@gmail.com>
parents: 29378
diff changeset
   581
                        continue
12764
ad2506f097d3 ui: only fix config if the relevant section has changed
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents: 12689
diff changeset
   582
                    if not p:
ad2506f097d3 ui: only fix config if the relevant section has changed
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents: 12689
diff changeset
   583
                        continue
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   584
                    if b'%%' in p:
47272
a671832a8e41 urlutil: move url "fixing" at the time of `ui.paths` initialization
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47233
diff changeset
   585
                        if s is None:
a671832a8e41 urlutil: move url "fixing" at the time of `ui.paths` initialization
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47233
diff changeset
   586
                            s = 'none'
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42672
diff changeset
   587
                        self.warn(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   588
                            _(b"(deprecated '%%' in path %s=%s from %s)\n")
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42672
diff changeset
   589
                            % (n, p, s)
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42672
diff changeset
   590
                        )
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   591
                        p = p.replace(b'%%', b'%')
47272
a671832a8e41 urlutil: move url "fixing" at the time of `ui.paths` initialization
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47233
diff changeset
   592
                    if p != old_p:
a671832a8e41 urlutil: move url "fixing" at the time of `ui.paths` initialization
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47233
diff changeset
   593
                        c.alter(b"paths", n, p)
3347
bce7c1b4c1c8 ui.py: normalize settings every time the configuration changes
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 3346
diff changeset
   594
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   595
        if section in (None, b'ui'):
12764
ad2506f097d3 ui: only fix config if the relevant section has changed
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents: 12689
diff changeset
   596
            # update ui options
40547
840cd57cde32 ui: add config knob to redirect status messages to stderr (API)
Yuya Nishihara <yuya@tcha.org>
parents: 40543
diff changeset
   597
            self._fmsgout, self._fmsgerr = _selectmsgdests(self)
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   598
            self.debugflag = self.configbool(b'ui', b'debug')
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   599
            self.verbose = self.debugflag or self.configbool(b'ui', b'verbose')
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   600
            self.quiet = not self.debugflag and self.configbool(b'ui', b'quiet')
12764
ad2506f097d3 ui: only fix config if the relevant section has changed
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents: 12689
diff changeset
   601
            if self.verbose and self.quiet:
ad2506f097d3 ui: only fix config if the relevant section has changed
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents: 12689
diff changeset
   602
                self.quiet = self.verbose = False
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42672
diff changeset
   603
            self._reportuntrusted = self.debugflag or self.configbool(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   604
                b"ui", b"report_untrusted"
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42672
diff changeset
   605
            )
45025
24b1a8eb73aa ui: add option to timestamp status and diagnostic messages
Joerg Sonnenberger <joerg@bec.de>
parents: 44992
diff changeset
   606
            self.showtimestamp = self.configbool(b'ui', b'timestamp-output')
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   607
            self.tracebackflag = self.configbool(b'ui', b'traceback')
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   608
            self.logblockedtimes = self.configbool(b'ui', b'logblockedtimes')
3350
ab900698b832 update ui.quiet/verbose/debug/interactive every time the config changes
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 3349
diff changeset
   609
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   610
        if section in (None, b'trusted'):
12764
ad2506f097d3 ui: only fix config if the relevant section has changed
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents: 12689
diff changeset
   611
            # update trust information
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   612
            self._trustusers.update(self.configlist(b'trusted', b'users'))
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   613
            self._trustgroups.update(self.configlist(b'trusted', b'groups'))
3551
3b07e223534b Only read .hg/hgrc files from trusted users/groups
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 3489
diff changeset
   614
40994
ab92e2111408 ui: install logger that sends debug.extensions messages to stderr
Yuya Nishihara <yuya@tcha.org>
parents: 40761
diff changeset
   615
        if section in (None, b'devel', b'ui') and self.debugflag:
ab92e2111408 ui: install logger that sends debug.extensions messages to stderr
Yuya Nishihara <yuya@tcha.org>
parents: 40761
diff changeset
   616
            tracked = set()
ab92e2111408 ui: install logger that sends debug.extensions messages to stderr
Yuya Nishihara <yuya@tcha.org>
parents: 40761
diff changeset
   617
            if self.configbool(b'devel', b'debug.extensions'):
ab92e2111408 ui: install logger that sends debug.extensions messages to stderr
Yuya Nishihara <yuya@tcha.org>
parents: 40761
diff changeset
   618
                tracked.add(b'extension')
ab92e2111408 ui: install logger that sends debug.extensions messages to stderr
Yuya Nishihara <yuya@tcha.org>
parents: 40761
diff changeset
   619
            if tracked:
ab92e2111408 ui: install logger that sends debug.extensions messages to stderr
Yuya Nishihara <yuya@tcha.org>
parents: 40761
diff changeset
   620
                logger = loggingutil.fileobjectlogger(self._ferr, tracked)
ab92e2111408 ui: install logger that sends debug.extensions messages to stderr
Yuya Nishihara <yuya@tcha.org>
parents: 40761
diff changeset
   621
                self.setlogger(b'debug', logger)
ab92e2111408 ui: install logger that sends debug.extensions messages to stderr
Yuya Nishihara <yuya@tcha.org>
parents: 40761
diff changeset
   622
15919
69e792cf7851 config: have a way to backup and restore value in config
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 15407
diff changeset
   623
    def backupconfig(self, section, item):
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42672
diff changeset
   624
        return (
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42672
diff changeset
   625
            self._ocfg.backup(section, item),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42672
diff changeset
   626
            self._tcfg.backup(section, item),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42672
diff changeset
   627
            self._ucfg.backup(section, item),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42672
diff changeset
   628
        )
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42672
diff changeset
   629
49797
0449fb7729d7 typing: add trivial type hints to mercurial/ui.py
Matt Harbison <matt_harbison@yahoo.com>
parents: 49795
diff changeset
   630
    def restoreconfig(self, data) -> None:
15919
69e792cf7851 config: have a way to backup and restore value in config
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 15407
diff changeset
   631
        self._ocfg.restore(data[0])
69e792cf7851 config: have a way to backup and restore value in config
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 15407
diff changeset
   632
        self._tcfg.restore(data[1])
69e792cf7851 config: have a way to backup and restore value in config
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 15407
diff changeset
   633
        self._ucfg.restore(data[2])
69e792cf7851 config: have a way to backup and restore value in config
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 15407
diff changeset
   634
49797
0449fb7729d7 typing: add trivial type hints to mercurial/ui.py
Matt Harbison <matt_harbison@yahoo.com>
parents: 49795
diff changeset
   635
    def setconfig(self, section, name, value, source=b'') -> None:
20787
be179da10d5f config: backout 77f1f206e135 - 743daa601445 removed the only use of overlay
Mads Kiilerich <madski@unity3d.com>
parents: 20606
diff changeset
   636
        for cfg in (self._ocfg, self._tcfg, self._ucfg):
20788
f144928dd058 config: give a useful hint of source for the most common command line settings
Mads Kiilerich <madski@unity3d.com>
parents: 20787
diff changeset
   637
            cfg.set(section, name, value, source)
12764
ad2506f097d3 ui: only fix config if the relevant section has changed
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents: 12689
diff changeset
   638
        self.fixconfig(section=section)
32872
9fcb6df413c9 ui: add support for a tweakdefaults knob
Augie Fackler <augie@google.com>
parents: 32579
diff changeset
   639
        self._maybetweakdefaults()
960
abfb5cc97fcd Add ui.setconfig overlay
mpm@selenic.com
parents: 953
diff changeset
   640
8199
e9f90e5989d9 ui: _get_cdata -> _data
Matt Mackall <mpm@selenic.com>
parents: 8198
diff changeset
   641
    def _data(self, untrusted):
8203
3377fa11af67 ui: privatize cdata vars
Matt Mackall <mpm@selenic.com>
parents: 8202
diff changeset
   642
        return untrusted and self._ucfg or self._tcfg
3552
9b52239dc740 save settings from untrusted config files in a separate configparser
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 3551
diff changeset
   643
8182
b97abc7c1135 showconfig: show source file and line with --debug
Matt Mackall <mpm@selenic.com>
parents: 8175
diff changeset
   644
    def configsource(self, section, name, untrusted=False):
30618
201b44c8875c ui: do not translate empty configsource() to 'none' (API)
Yuya Nishihara <yuya@tcha.org>
parents: 30569
diff changeset
   645
        return self._data(untrusted).source(section, name)
8182
b97abc7c1135 showconfig: show source file and line with --debug
Matt Mackall <mpm@selenic.com>
parents: 8175
diff changeset
   646
32958
4a3f1d362e5f config: explicitly track the use of the standard default value
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 32872
diff changeset
   647
    def config(self, section, name, default=_unset, untrusted=False):
33058
1aa05203f7f6 config: extract the core config logic into a private method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 32989
diff changeset
   648
        """return the plain string version of a config"""
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42672
diff changeset
   649
        value = self._config(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42672
diff changeset
   650
            section, name, default=default, untrusted=untrusted
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42672
diff changeset
   651
        )
33058
1aa05203f7f6 config: extract the core config logic into a private method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 32989
diff changeset
   652
        if value is _unset:
1aa05203f7f6 config: extract the core config logic into a private method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 32989
diff changeset
   653
            return None
1aa05203f7f6 config: extract the core config logic into a private method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 32989
diff changeset
   654
        return value
1aa05203f7f6 config: extract the core config logic into a private method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 32989
diff changeset
   655
1aa05203f7f6 config: extract the core config logic into a private method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 32989
diff changeset
   656
    def _config(self, section, name, default=_unset, untrusted=False):
34947
ff2110eadbfa configitems: relax warning about unwanted default value
Yuya Nishihara <yuya@tcha.org>
parents: 34882
diff changeset
   657
        value = itemdefault = default
33329
e714159860fd configitems: add alias support in config
David Demelier <demelier.david@gmail.com>
parents: 33150
diff changeset
   658
        item = self._knownconfig.get(section, {}).get(name)
e714159860fd configitems: add alias support in config
David Demelier <demelier.david@gmail.com>
parents: 33150
diff changeset
   659
        alternates = [(section, name)]
e714159860fd configitems: add alias support in config
David Demelier <demelier.david@gmail.com>
parents: 33150
diff changeset
   660
e714159860fd configitems: add alias support in config
David Demelier <demelier.david@gmail.com>
parents: 33150
diff changeset
   661
        if item is not None:
e714159860fd configitems: add alias support in config
David Demelier <demelier.david@gmail.com>
parents: 33150
diff changeset
   662
            alternates.extend(item.alias)
34947
ff2110eadbfa configitems: relax warning about unwanted default value
Yuya Nishihara <yuya@tcha.org>
parents: 34882
diff changeset
   663
            if callable(item.default):
ff2110eadbfa configitems: relax warning about unwanted default value
Yuya Nishihara <yuya@tcha.org>
parents: 34882
diff changeset
   664
                itemdefault = item.default()
ff2110eadbfa configitems: relax warning about unwanted default value
Yuya Nishihara <yuya@tcha.org>
parents: 34882
diff changeset
   665
            else:
ff2110eadbfa configitems: relax warning about unwanted default value
Yuya Nishihara <yuya@tcha.org>
parents: 34882
diff changeset
   666
                itemdefault = item.default
34858
85a2db47ad50 configitems: adds a developer warning when accessing undeclared configuration
Boris Feld <boris.feld@octobus.net>
parents: 34849
diff changeset
   667
        else:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   668
            msg = b"accessing unregistered config item: '%s.%s'"
34858
85a2db47ad50 configitems: adds a developer warning when accessing undeclared configuration
Boris Feld <boris.feld@octobus.net>
parents: 34849
diff changeset
   669
            msg %= (section, name)
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   670
            self.develwarn(msg, 2, b'warn-config-unknown')
33329
e714159860fd configitems: add alias support in config
David Demelier <demelier.david@gmail.com>
parents: 33150
diff changeset
   671
e714159860fd configitems: add alias support in config
David Demelier <demelier.david@gmail.com>
parents: 33150
diff changeset
   672
        if default is _unset:
e714159860fd configitems: add alias support in config
David Demelier <demelier.david@gmail.com>
parents: 33150
diff changeset
   673
            if item is None:
e714159860fd configitems: add alias support in config
David Demelier <demelier.david@gmail.com>
parents: 33150
diff changeset
   674
                value = default
33471
d74141ccfd8b configitems: handle case were the default value is not static
Boris Feld <boris.feld@octobus.net>
parents: 33329
diff changeset
   675
            elif item.default is configitems.dynamicdefault:
d74141ccfd8b configitems: handle case were the default value is not static
Boris Feld <boris.feld@octobus.net>
parents: 33329
diff changeset
   676
                value = None
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   677
                msg = b"config item requires an explicit default value: '%s.%s'"
33471
d74141ccfd8b configitems: handle case were the default value is not static
Boris Feld <boris.feld@octobus.net>
parents: 33329
diff changeset
   678
                msg %= (section, name)
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   679
                self.develwarn(msg, 2, b'warn-config-default')
33329
e714159860fd configitems: add alias support in config
David Demelier <demelier.david@gmail.com>
parents: 33150
diff changeset
   680
            else:
34947
ff2110eadbfa configitems: relax warning about unwanted default value
Yuya Nishihara <yuya@tcha.org>
parents: 34882
diff changeset
   681
                value = itemdefault
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42672
diff changeset
   682
        elif (
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42672
diff changeset
   683
            item is not None
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42672
diff changeset
   684
            and item.default is not configitems.dynamicdefault
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42672
diff changeset
   685
            and default != itemdefault
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42672
diff changeset
   686
        ):
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42672
diff changeset
   687
            msg = (
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   688
                b"specifying a mismatched default value for a registered "
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   689
                b"config item: '%s.%s' '%s'"
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42672
diff changeset
   690
            )
36126
8f5c7f906f9b ui: use pycompat.bytestr() to get a bytes-repr of config default
Augie Fackler <augie@google.com>
parents: 35961
diff changeset
   691
            msg %= (section, name, pycompat.bytestr(default))
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   692
            self.develwarn(msg, 2, b'warn-config-default')
32989
149b68224b08 configitems: issue a devel warning when overriding default config
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 32985
diff changeset
   693
46623
b91a695b3b08 config: use level to properly deal with value priority
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 46622
diff changeset
   694
        candidates = []
b91a695b3b08 config: use level to properly deal with value priority
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 46622
diff changeset
   695
        config = self._data(untrusted)
33329
e714159860fd configitems: add alias support in config
David Demelier <demelier.david@gmail.com>
parents: 33150
diff changeset
   696
        for s, n in alternates:
46623
b91a695b3b08 config: use level to properly deal with value priority
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 46622
diff changeset
   697
            candidate = config.get(s, n, None)
33058
1aa05203f7f6 config: extract the core config logic into a private method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 32989
diff changeset
   698
            if candidate is not None:
46623
b91a695b3b08 config: use level to properly deal with value priority
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 46622
diff changeset
   699
                candidates.append((s, n, candidate))
b91a695b3b08 config: use level to properly deal with value priority
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 46622
diff changeset
   700
        if candidates:
b91a695b3b08 config: use level to properly deal with value priority
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 46622
diff changeset
   701
b91a695b3b08 config: use level to properly deal with value priority
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 46622
diff changeset
   702
            def level(x):
b91a695b3b08 config: use level to properly deal with value priority
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 46622
diff changeset
   703
                return config.level(x[0], x[1])
b91a695b3b08 config: use level to properly deal with value priority
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 46622
diff changeset
   704
b91a695b3b08 config: use level to properly deal with value priority
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 46622
diff changeset
   705
            value = max(candidates, key=level)[2]
15035
cc669e4fec95 ui: allow alternatives for config options
Matt Mackall <mpm@selenic.com>
parents: 15002
diff changeset
   706
8204
797586be575d ui: report_untrusted fixes
Matt Mackall <mpm@selenic.com>
parents: 8203
diff changeset
   707
        if self.debugflag and not untrusted and self._reportuntrusted:
33329
e714159860fd configitems: add alias support in config
David Demelier <demelier.david@gmail.com>
parents: 33150
diff changeset
   708
            for s, n in alternates:
e714159860fd configitems: add alias support in config
David Demelier <demelier.david@gmail.com>
parents: 33150
diff changeset
   709
                uvalue = self._ucfg.get(s, n)
19536
ab3cf67740d6 ui.config: fix bug in config alternatives from cc669e4fec95
Augie Fackler <durin42@gmail.com>
parents: 19226
diff changeset
   710
                if uvalue is not None and uvalue != value:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42672
diff changeset
   711
                    self.debug(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   712
                        b"ignoring untrusted configuration option "
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   713
                        b"%s.%s = %s\n" % (s, n, uvalue)
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42672
diff changeset
   714
                    )
3552
9b52239dc740 save settings from untrusted config files in a separate configparser
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 3551
diff changeset
   715
        return value
3341
a7cec14c9b40 ui.py: move common code out of config and configbool
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 3340
diff changeset
   716
46267
b9b37418ac7e ui: add a "config_default" method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 46030
diff changeset
   717
    def config_default(self, section, name):
b9b37418ac7e ui: add a "config_default" method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 46030
diff changeset
   718
        """return the default value for a config option
b9b37418ac7e ui: add a "config_default" method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 46030
diff changeset
   719
b9b37418ac7e ui: add a "config_default" method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 46030
diff changeset
   720
        The default is returned "raw", for example if it is a callable, the
b9b37418ac7e ui: add a "config_default" method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 46030
diff changeset
   721
        callable was not called.
b9b37418ac7e ui: add a "config_default" method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 46030
diff changeset
   722
        """
b9b37418ac7e ui: add a "config_default" method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 46030
diff changeset
   723
        item = self._knownconfig.get(section, {}).get(name)
b9b37418ac7e ui: add a "config_default" method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 46030
diff changeset
   724
b9b37418ac7e ui: add a "config_default" method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 46030
diff changeset
   725
        if item is None:
b9b37418ac7e ui: add a "config_default" method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 46030
diff changeset
   726
            raise KeyError((section, name))
b9b37418ac7e ui: add a "config_default" method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 46030
diff changeset
   727
        return item.default
b9b37418ac7e ui: add a "config_default" method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 46030
diff changeset
   728
32967
cd2fd1765654 config: use the new '_unset' value for 'configsuboptions'
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 32966
diff changeset
   729
    def configsuboptions(self, section, name, default=_unset, untrusted=False):
27252
dccbebcff075 ui: add method to return option and all sub-options
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27153
diff changeset
   730
        """Get a config option and all sub-options.
dccbebcff075 ui: add method to return option and all sub-options
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27153
diff changeset
   731
dccbebcff075 ui: add method to return option and all sub-options
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27153
diff changeset
   732
        Some config options have sub-options that are declared with the
dccbebcff075 ui: add method to return option and all sub-options
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27153
diff changeset
   733
        format "key:opt = value". This method is used to return the main
dccbebcff075 ui: add method to return option and all sub-options
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27153
diff changeset
   734
        option and all its declared sub-options.
dccbebcff075 ui: add method to return option and all sub-options
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27153
diff changeset
   735
dccbebcff075 ui: add method to return option and all sub-options
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27153
diff changeset
   736
        Returns a 2-tuple of ``(option, sub-options)``, where `sub-options``
dccbebcff075 ui: add method to return option and all sub-options
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27153
diff changeset
   737
        is a dict of defined sub-options where keys and values are strings.
dccbebcff075 ui: add method to return option and all sub-options
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27153
diff changeset
   738
        """
32966
61a8321c9962 config: use the 'config' method in 'configsuboptions'
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 32965
diff changeset
   739
        main = self.config(section, name, default, untrusted=untrusted)
27252
dccbebcff075 ui: add method to return option and all sub-options
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27153
diff changeset
   740
        data = self._data(untrusted)
dccbebcff075 ui: add method to return option and all sub-options
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27153
diff changeset
   741
        sub = {}
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   742
        prefix = b'%s:' % name
27252
dccbebcff075 ui: add method to return option and all sub-options
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27153
diff changeset
   743
        for k, v in data.items(section):
dccbebcff075 ui: add method to return option and all sub-options
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27153
diff changeset
   744
            if k.startswith(prefix):
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42672
diff changeset
   745
                sub[k[len(prefix) :]] = v
27252
dccbebcff075 ui: add method to return option and all sub-options
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27153
diff changeset
   746
dccbebcff075 ui: add method to return option and all sub-options
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27153
diff changeset
   747
        if self.debugflag and not untrusted and self._reportuntrusted:
dccbebcff075 ui: add method to return option and all sub-options
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27153
diff changeset
   748
            for k, v in sub.items():
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   749
                uvalue = self._ucfg.get(section, b'%s:%s' % (name, k))
27252
dccbebcff075 ui: add method to return option and all sub-options
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27153
diff changeset
   750
                if uvalue is not None and uvalue != v:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42672
diff changeset
   751
                    self.debug(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   752
                        b'ignoring untrusted configuration option '
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   753
                        b'%s:%s.%s = %s\n' % (section, name, k, uvalue)
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42672
diff changeset
   754
                    )
27252
dccbebcff075 ui: add method to return option and all sub-options
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27153
diff changeset
   755
dccbebcff075 ui: add method to return option and all sub-options
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27153
diff changeset
   756
        return main, sub
dccbebcff075 ui: add method to return option and all sub-options
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27153
diff changeset
   757
32965
36e16797df32 config: use the new '_unset' value for 'configpath'
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 32964
diff changeset
   758
    def configpath(self, section, name, default=_unset, untrusted=False):
43787
be8552f25cab cleanup: fix docstring formatting
Matt Harbison <matt_harbison@yahoo.com>
parents: 43506
diff changeset
   759
        """get a path config item, expanded relative to repo root or config
be8552f25cab cleanup: fix docstring formatting
Matt Harbison <matt_harbison@yahoo.com>
parents: 43506
diff changeset
   760
        file"""
13238
1b591f9b7fd2 ui: add configpath helper
Matt Mackall <mpm@selenic.com>
parents: 13031
diff changeset
   761
        v = self.config(section, name, default, untrusted)
14923
351624f8f523 ui: providing no default value to configpath should not raise an Error
Simon Heimberg <simohe@besonet.ch>
parents: 14922
diff changeset
   762
        if v is None:
351624f8f523 ui: providing no default value to configpath should not raise an Error
Simon Heimberg <simohe@besonet.ch>
parents: 14922
diff changeset
   763
            return None
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   764
        if not os.path.isabs(v) or b"://" not in v:
13238
1b591f9b7fd2 ui: add configpath helper
Matt Mackall <mpm@selenic.com>
parents: 13031
diff changeset
   765
            src = self.configsource(section, name, untrusted)
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   766
            if b':' in src:
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   767
                base = os.path.dirname(src.rsplit(b':')[0])
13238
1b591f9b7fd2 ui: add configpath helper
Matt Mackall <mpm@selenic.com>
parents: 13031
diff changeset
   768
                v = os.path.join(base, os.path.expanduser(v))
1b591f9b7fd2 ui: add configpath helper
Matt Mackall <mpm@selenic.com>
parents: 13031
diff changeset
   769
        return v
1b591f9b7fd2 ui: add configpath helper
Matt Mackall <mpm@selenic.com>
parents: 13031
diff changeset
   770
32959
b39dafe681df config: use the new '_unset' value for 'configbool'
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 32958
diff changeset
   771
    def configbool(self, section, name, default=_unset, untrusted=False):
14171
fa2b596db182 ui: add configint function and tests
Sune Foldager <cryo@cyanite.org>
parents: 14076
diff changeset
   772
        """parse a configuration element as a boolean
fa2b596db182 ui: add configint function and tests
Sune Foldager <cryo@cyanite.org>
parents: 14076
diff changeset
   773
34131
0fa781320203 doctest: bulk-replace string literals with b'' for Python 3
Yuya Nishihara <yuya@tcha.org>
parents: 34054
diff changeset
   774
        >>> u = ui(); s = b'foo'
0fa781320203 doctest: bulk-replace string literals with b'' for Python 3
Yuya Nishihara <yuya@tcha.org>
parents: 34054
diff changeset
   775
        >>> u.setconfig(s, b'true', b'yes')
0fa781320203 doctest: bulk-replace string literals with b'' for Python 3
Yuya Nishihara <yuya@tcha.org>
parents: 34054
diff changeset
   776
        >>> u.configbool(s, b'true')
14171
fa2b596db182 ui: add configint function and tests
Sune Foldager <cryo@cyanite.org>
parents: 14076
diff changeset
   777
        True
34131
0fa781320203 doctest: bulk-replace string literals with b'' for Python 3
Yuya Nishihara <yuya@tcha.org>
parents: 34054
diff changeset
   778
        >>> u.setconfig(s, b'false', b'no')
0fa781320203 doctest: bulk-replace string literals with b'' for Python 3
Yuya Nishihara <yuya@tcha.org>
parents: 34054
diff changeset
   779
        >>> u.configbool(s, b'false')
14171
fa2b596db182 ui: add configint function and tests
Sune Foldager <cryo@cyanite.org>
parents: 14076
diff changeset
   780
        False
34131
0fa781320203 doctest: bulk-replace string literals with b'' for Python 3
Yuya Nishihara <yuya@tcha.org>
parents: 34054
diff changeset
   781
        >>> u.configbool(s, b'unknown')
14171
fa2b596db182 ui: add configint function and tests
Sune Foldager <cryo@cyanite.org>
parents: 14076
diff changeset
   782
        False
34131
0fa781320203 doctest: bulk-replace string literals with b'' for Python 3
Yuya Nishihara <yuya@tcha.org>
parents: 34054
diff changeset
   783
        >>> u.configbool(s, b'unknown', True)
14171
fa2b596db182 ui: add configint function and tests
Sune Foldager <cryo@cyanite.org>
parents: 14076
diff changeset
   784
        True
34131
0fa781320203 doctest: bulk-replace string literals with b'' for Python 3
Yuya Nishihara <yuya@tcha.org>
parents: 34054
diff changeset
   785
        >>> u.setconfig(s, b'invalid', b'somevalue')
0fa781320203 doctest: bulk-replace string literals with b'' for Python 3
Yuya Nishihara <yuya@tcha.org>
parents: 34054
diff changeset
   786
        >>> u.configbool(s, b'invalid')
14171
fa2b596db182 ui: add configint function and tests
Sune Foldager <cryo@cyanite.org>
parents: 14076
diff changeset
   787
        Traceback (most recent call last):
fa2b596db182 ui: add configint function and tests
Sune Foldager <cryo@cyanite.org>
parents: 14076
diff changeset
   788
            ...
fa2b596db182 ui: add configint function and tests
Sune Foldager <cryo@cyanite.org>
parents: 14076
diff changeset
   789
        ConfigError: foo.invalid is not a boolean ('somevalue')
fa2b596db182 ui: add configint function and tests
Sune Foldager <cryo@cyanite.org>
parents: 14076
diff changeset
   790
        """
fa2b596db182 ui: add configint function and tests
Sune Foldager <cryo@cyanite.org>
parents: 14076
diff changeset
   791
33059
1dc2ffe0123b config: use '_config' within 'configbool'
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 33058
diff changeset
   792
        v = self._config(section, name, default, untrusted=untrusted)
8527
f9a80054dd3c use 'x is None' instead of 'x == None'
Martin Geisler <mg@lazybytes.net>
parents: 8478
diff changeset
   793
        if v is None:
33059
1dc2ffe0123b config: use '_config' within 'configbool'
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 33058
diff changeset
   794
            return v
1dc2ffe0123b config: use '_config' within 'configbool'
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 33058
diff changeset
   795
        if v is _unset:
32959
b39dafe681df config: use the new '_unset' value for 'configbool'
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 32958
diff changeset
   796
            if default is _unset:
b39dafe681df config: use the new '_unset' value for 'configbool'
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 32958
diff changeset
   797
                return False
8144
fca54469480e ui: introduce new config parser
Matt Mackall <mpm@selenic.com>
parents: 8143
diff changeset
   798
            return default
10243
cd3e5c47d663 ui: just return it if it's already a bool
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 10220
diff changeset
   799
        if isinstance(v, bool):
cd3e5c47d663 ui: just return it if it's already a bool
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 10220
diff changeset
   800
            return v
37084
f0b6fbea00cf stringutil: bulk-replace call sites to point to new module
Yuya Nishihara <yuya@tcha.org>
parents: 36910
diff changeset
   801
        b = stringutil.parsebool(v)
12087
a88a4720c2f0 parsebool: create new function and use it for config parsing
Augie Fackler <durin42@gmail.com>
parents: 11984
diff changeset
   802
        if b is None:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42672
diff changeset
   803
            raise error.ConfigError(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   804
                _(b"%s.%s is not a boolean ('%s')") % (section, name, v)
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42672
diff changeset
   805
            )
12087
a88a4720c2f0 parsebool: create new function and use it for config parsing
Augie Fackler <durin42@gmail.com>
parents: 11984
diff changeset
   806
        return b
3552
9b52239dc740 save settings from untrusted config files in a separate configparser
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 3551
diff changeset
   807
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42672
diff changeset
   808
    def configwith(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42672
diff changeset
   809
        self, convert, section, name, default=_unset, desc=None, untrusted=False
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42672
diff changeset
   810
    ):
30926
120682fce099 ui: add a configwith method
Bryan O'Sullivan <bryano@fb.com>
parents: 30925
diff changeset
   811
        """parse a configuration element with a conversion function
120682fce099 ui: add a configwith method
Bryan O'Sullivan <bryano@fb.com>
parents: 30925
diff changeset
   812
34131
0fa781320203 doctest: bulk-replace string literals with b'' for Python 3
Yuya Nishihara <yuya@tcha.org>
parents: 34054
diff changeset
   813
        >>> u = ui(); s = b'foo'
0fa781320203 doctest: bulk-replace string literals with b'' for Python 3
Yuya Nishihara <yuya@tcha.org>
parents: 34054
diff changeset
   814
        >>> u.setconfig(s, b'float1', b'42')
0fa781320203 doctest: bulk-replace string literals with b'' for Python 3
Yuya Nishihara <yuya@tcha.org>
parents: 34054
diff changeset
   815
        >>> u.configwith(float, s, b'float1')
30926
120682fce099 ui: add a configwith method
Bryan O'Sullivan <bryano@fb.com>
parents: 30925
diff changeset
   816
        42.0
34131
0fa781320203 doctest: bulk-replace string literals with b'' for Python 3
Yuya Nishihara <yuya@tcha.org>
parents: 34054
diff changeset
   817
        >>> u.setconfig(s, b'float2', b'-4.25')
0fa781320203 doctest: bulk-replace string literals with b'' for Python 3
Yuya Nishihara <yuya@tcha.org>
parents: 34054
diff changeset
   818
        >>> u.configwith(float, s, b'float2')
30932
f61c5680a862 ui: fix configwith doctest
Jun Wu <quark@fb.com>
parents: 30927
diff changeset
   819
        -4.25
34131
0fa781320203 doctest: bulk-replace string literals with b'' for Python 3
Yuya Nishihara <yuya@tcha.org>
parents: 34054
diff changeset
   820
        >>> u.configwith(float, s, b'unknown', 7)
32960
6ff6eb33f353 config: use the new '_unset' value for 'configwith'
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 32959
diff changeset
   821
        7.0
34131
0fa781320203 doctest: bulk-replace string literals with b'' for Python 3
Yuya Nishihara <yuya@tcha.org>
parents: 34054
diff changeset
   822
        >>> u.setconfig(s, b'invalid', b'somevalue')
0fa781320203 doctest: bulk-replace string literals with b'' for Python 3
Yuya Nishihara <yuya@tcha.org>
parents: 34054
diff changeset
   823
        >>> u.configwith(float, s, b'invalid')
30926
120682fce099 ui: add a configwith method
Bryan O'Sullivan <bryano@fb.com>
parents: 30925
diff changeset
   824
        Traceback (most recent call last):
120682fce099 ui: add a configwith method
Bryan O'Sullivan <bryano@fb.com>
parents: 30925
diff changeset
   825
            ...
120682fce099 ui: add a configwith method
Bryan O'Sullivan <bryano@fb.com>
parents: 30925
diff changeset
   826
        ConfigError: foo.invalid is not a valid float ('somevalue')
34131
0fa781320203 doctest: bulk-replace string literals with b'' for Python 3
Yuya Nishihara <yuya@tcha.org>
parents: 34054
diff changeset
   827
        >>> u.configwith(float, s, b'invalid', desc=b'womble')
30926
120682fce099 ui: add a configwith method
Bryan O'Sullivan <bryano@fb.com>
parents: 30925
diff changeset
   828
        Traceback (most recent call last):
120682fce099 ui: add a configwith method
Bryan O'Sullivan <bryano@fb.com>
parents: 30925
diff changeset
   829
            ...
120682fce099 ui: add a configwith method
Bryan O'Sullivan <bryano@fb.com>
parents: 30925
diff changeset
   830
        ConfigError: foo.invalid is not a valid womble ('somevalue')
120682fce099 ui: add a configwith method
Bryan O'Sullivan <bryano@fb.com>
parents: 30925
diff changeset
   831
        """
120682fce099 ui: add a configwith method
Bryan O'Sullivan <bryano@fb.com>
parents: 30925
diff changeset
   832
32960
6ff6eb33f353 config: use the new '_unset' value for 'configwith'
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 32959
diff changeset
   833
        v = self.config(section, name, default, untrusted)
30926
120682fce099 ui: add a configwith method
Bryan O'Sullivan <bryano@fb.com>
parents: 30925
diff changeset
   834
        if v is None:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42672
diff changeset
   835
            return v  # do not attempt to convert None
30926
120682fce099 ui: add a configwith method
Bryan O'Sullivan <bryano@fb.com>
parents: 30925
diff changeset
   836
        try:
120682fce099 ui: add a configwith method
Bryan O'Sullivan <bryano@fb.com>
parents: 30925
diff changeset
   837
            return convert(v)
32462
bb18728ea617 util: raise ParseError when parsing dates (BC)
Boris Feld <boris.feld@octobus.net>
parents: 32449
diff changeset
   838
        except (ValueError, error.ParseError):
30926
120682fce099 ui: add a configwith method
Bryan O'Sullivan <bryano@fb.com>
parents: 30925
diff changeset
   839
            if desc is None:
34208
0a2fd3bfc704 py3: convert function name to bytes in ui.configwith()
Yuya Nishihara <yuya@tcha.org>
parents: 34131
diff changeset
   840
                desc = pycompat.sysbytes(convert.__name__)
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42672
diff changeset
   841
            raise error.ConfigError(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   842
                _(b"%s.%s is not a valid %s ('%s')") % (section, name, desc, v)
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42672
diff changeset
   843
            )
30926
120682fce099 ui: add a configwith method
Bryan O'Sullivan <bryano@fb.com>
parents: 30925
diff changeset
   844
32961
24111157f967 config: use the new '_unset' value for 'configint'
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 32960
diff changeset
   845
    def configint(self, section, name, default=_unset, untrusted=False):
14171
fa2b596db182 ui: add configint function and tests
Sune Foldager <cryo@cyanite.org>
parents: 14076
diff changeset
   846
        """parse a configuration element as an integer
fa2b596db182 ui: add configint function and tests
Sune Foldager <cryo@cyanite.org>
parents: 14076
diff changeset
   847
34131
0fa781320203 doctest: bulk-replace string literals with b'' for Python 3
Yuya Nishihara <yuya@tcha.org>
parents: 34054
diff changeset
   848
        >>> u = ui(); s = b'foo'
0fa781320203 doctest: bulk-replace string literals with b'' for Python 3
Yuya Nishihara <yuya@tcha.org>
parents: 34054
diff changeset
   849
        >>> u.setconfig(s, b'int1', b'42')
0fa781320203 doctest: bulk-replace string literals with b'' for Python 3
Yuya Nishihara <yuya@tcha.org>
parents: 34054
diff changeset
   850
        >>> u.configint(s, b'int1')
14171
fa2b596db182 ui: add configint function and tests
Sune Foldager <cryo@cyanite.org>
parents: 14076
diff changeset
   851
        42
34131
0fa781320203 doctest: bulk-replace string literals with b'' for Python 3
Yuya Nishihara <yuya@tcha.org>
parents: 34054
diff changeset
   852
        >>> u.setconfig(s, b'int2', b'-42')
0fa781320203 doctest: bulk-replace string literals with b'' for Python 3
Yuya Nishihara <yuya@tcha.org>
parents: 34054
diff changeset
   853
        >>> u.configint(s, b'int2')
14171
fa2b596db182 ui: add configint function and tests
Sune Foldager <cryo@cyanite.org>
parents: 14076
diff changeset
   854
        -42
34131
0fa781320203 doctest: bulk-replace string literals with b'' for Python 3
Yuya Nishihara <yuya@tcha.org>
parents: 34054
diff changeset
   855
        >>> u.configint(s, b'unknown', 7)
14171
fa2b596db182 ui: add configint function and tests
Sune Foldager <cryo@cyanite.org>
parents: 14076
diff changeset
   856
        7
34131
0fa781320203 doctest: bulk-replace string literals with b'' for Python 3
Yuya Nishihara <yuya@tcha.org>
parents: 34054
diff changeset
   857
        >>> u.setconfig(s, b'invalid', b'somevalue')
0fa781320203 doctest: bulk-replace string literals with b'' for Python 3
Yuya Nishihara <yuya@tcha.org>
parents: 34054
diff changeset
   858
        >>> u.configint(s, b'invalid')
14171
fa2b596db182 ui: add configint function and tests
Sune Foldager <cryo@cyanite.org>
parents: 14076
diff changeset
   859
        Traceback (most recent call last):
fa2b596db182 ui: add configint function and tests
Sune Foldager <cryo@cyanite.org>
parents: 14076
diff changeset
   860
            ...
30927
8fa3ab6221b9 ui: rewrite configint in terms of configwith
Bryan O'Sullivan <bryano@fb.com>
parents: 30926
diff changeset
   861
        ConfigError: foo.invalid is not a valid integer ('somevalue')
14171
fa2b596db182 ui: add configint function and tests
Sune Foldager <cryo@cyanite.org>
parents: 14076
diff changeset
   862
        """
fa2b596db182 ui: add configint function and tests
Sune Foldager <cryo@cyanite.org>
parents: 14076
diff changeset
   863
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42672
diff changeset
   864
        return self.configwith(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   865
            int, section, name, default, b'integer', untrusted
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42672
diff changeset
   866
        )
14171
fa2b596db182 ui: add configint function and tests
Sune Foldager <cryo@cyanite.org>
parents: 14076
diff changeset
   867
32962
0bf986cfa82b config: use the new '_unset' value for 'configbytes'
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 32961
diff changeset
   868
    def configbytes(self, section, name, default=_unset, untrusted=False):
19065
2c4cd1c42365 ui: add a configbytes method, for space configuration
Bryan O'Sullivan <bryano@fb.com>
parents: 18966
diff changeset
   869
        """parse a configuration element as a quantity in bytes
2c4cd1c42365 ui: add a configbytes method, for space configuration
Bryan O'Sullivan <bryano@fb.com>
parents: 18966
diff changeset
   870
2c4cd1c42365 ui: add a configbytes method, for space configuration
Bryan O'Sullivan <bryano@fb.com>
parents: 18966
diff changeset
   871
        Units can be specified as b (bytes), k or kb (kilobytes), m or
2c4cd1c42365 ui: add a configbytes method, for space configuration
Bryan O'Sullivan <bryano@fb.com>
parents: 18966
diff changeset
   872
        mb (megabytes), g or gb (gigabytes).
2c4cd1c42365 ui: add a configbytes method, for space configuration
Bryan O'Sullivan <bryano@fb.com>
parents: 18966
diff changeset
   873
34131
0fa781320203 doctest: bulk-replace string literals with b'' for Python 3
Yuya Nishihara <yuya@tcha.org>
parents: 34054
diff changeset
   874
        >>> u = ui(); s = b'foo'
0fa781320203 doctest: bulk-replace string literals with b'' for Python 3
Yuya Nishihara <yuya@tcha.org>
parents: 34054
diff changeset
   875
        >>> u.setconfig(s, b'val1', b'42')
0fa781320203 doctest: bulk-replace string literals with b'' for Python 3
Yuya Nishihara <yuya@tcha.org>
parents: 34054
diff changeset
   876
        >>> u.configbytes(s, b'val1')
19065
2c4cd1c42365 ui: add a configbytes method, for space configuration
Bryan O'Sullivan <bryano@fb.com>
parents: 18966
diff changeset
   877
        42
34131
0fa781320203 doctest: bulk-replace string literals with b'' for Python 3
Yuya Nishihara <yuya@tcha.org>
parents: 34054
diff changeset
   878
        >>> u.setconfig(s, b'val2', b'42.5 kb')
0fa781320203 doctest: bulk-replace string literals with b'' for Python 3
Yuya Nishihara <yuya@tcha.org>
parents: 34054
diff changeset
   879
        >>> u.configbytes(s, b'val2')
19065
2c4cd1c42365 ui: add a configbytes method, for space configuration
Bryan O'Sullivan <bryano@fb.com>
parents: 18966
diff changeset
   880
        43520
34131
0fa781320203 doctest: bulk-replace string literals with b'' for Python 3
Yuya Nishihara <yuya@tcha.org>
parents: 34054
diff changeset
   881
        >>> u.configbytes(s, b'unknown', b'7 MB')
19065
2c4cd1c42365 ui: add a configbytes method, for space configuration
Bryan O'Sullivan <bryano@fb.com>
parents: 18966
diff changeset
   882
        7340032
34131
0fa781320203 doctest: bulk-replace string literals with b'' for Python 3
Yuya Nishihara <yuya@tcha.org>
parents: 34054
diff changeset
   883
        >>> u.setconfig(s, b'invalid', b'somevalue')
0fa781320203 doctest: bulk-replace string literals with b'' for Python 3
Yuya Nishihara <yuya@tcha.org>
parents: 34054
diff changeset
   884
        >>> u.configbytes(s, b'invalid')
19065
2c4cd1c42365 ui: add a configbytes method, for space configuration
Bryan O'Sullivan <bryano@fb.com>
parents: 18966
diff changeset
   885
        Traceback (most recent call last):
2c4cd1c42365 ui: add a configbytes method, for space configuration
Bryan O'Sullivan <bryano@fb.com>
parents: 18966
diff changeset
   886
            ...
2c4cd1c42365 ui: add a configbytes method, for space configuration
Bryan O'Sullivan <bryano@fb.com>
parents: 18966
diff changeset
   887
        ConfigError: foo.invalid is not a byte quantity ('somevalue')
2c4cd1c42365 ui: add a configbytes method, for space configuration
Bryan O'Sullivan <bryano@fb.com>
parents: 18966
diff changeset
   888
        """
2c4cd1c42365 ui: add a configbytes method, for space configuration
Bryan O'Sullivan <bryano@fb.com>
parents: 18966
diff changeset
   889
33060
e70cbae4c4e6 config: use '_config' within 'configbytes'
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 33059
diff changeset
   890
        value = self._config(section, name, default, untrusted)
e70cbae4c4e6 config: use '_config' within 'configbytes'
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 33059
diff changeset
   891
        if value is _unset:
32962
0bf986cfa82b config: use the new '_unset' value for 'configbytes'
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 32961
diff changeset
   892
            if default is _unset:
0bf986cfa82b config: use the new '_unset' value for 'configbytes'
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 32961
diff changeset
   893
                default = 0
19195
9311cd5c09ed ui: use util.sizetoint in configbytes
Bryan O'Sullivan <bryano@fb.com>
parents: 19085
diff changeset
   894
            value = default
33585
d90f9e4704de ui: fix configbytes isinstance check to look for bytes and not str
Augie Fackler <augie@google.com>
parents: 33499
diff changeset
   895
        if not isinstance(value, bytes):
32962
0bf986cfa82b config: use the new '_unset' value for 'configbytes'
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 32961
diff changeset
   896
            return value
19065
2c4cd1c42365 ui: add a configbytes method, for space configuration
Bryan O'Sullivan <bryano@fb.com>
parents: 18966
diff changeset
   897
        try:
19195
9311cd5c09ed ui: use util.sizetoint in configbytes
Bryan O'Sullivan <bryano@fb.com>
parents: 19085
diff changeset
   898
            return util.sizetoint(value)
9311cd5c09ed ui: use util.sizetoint in configbytes
Bryan O'Sullivan <bryano@fb.com>
parents: 19085
diff changeset
   899
        except error.ParseError:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42672
diff changeset
   900
            raise error.ConfigError(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   901
                _(b"%s.%s is not a byte quantity ('%s')")
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42672
diff changeset
   902
                % (section, name, value)
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42672
diff changeset
   903
            )
19065
2c4cd1c42365 ui: add a configbytes method, for space configuration
Bryan O'Sullivan <bryano@fb.com>
parents: 18966
diff changeset
   904
32963
88b3a38d39e3 config: use the new '_unset' value for 'configlist'
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 32962
diff changeset
   905
    def configlist(self, section, name, default=_unset, untrusted=False):
14171
fa2b596db182 ui: add configint function and tests
Sune Foldager <cryo@cyanite.org>
parents: 14076
diff changeset
   906
        """parse a configuration element as a list of comma/space separated
fa2b596db182 ui: add configint function and tests
Sune Foldager <cryo@cyanite.org>
parents: 14076
diff changeset
   907
        strings
fa2b596db182 ui: add configint function and tests
Sune Foldager <cryo@cyanite.org>
parents: 14076
diff changeset
   908
34131
0fa781320203 doctest: bulk-replace string literals with b'' for Python 3
Yuya Nishihara <yuya@tcha.org>
parents: 34054
diff changeset
   909
        >>> u = ui(); s = b'foo'
0fa781320203 doctest: bulk-replace string literals with b'' for Python 3
Yuya Nishihara <yuya@tcha.org>
parents: 34054
diff changeset
   910
        >>> u.setconfig(s, b'list1', b'this,is "a small" ,test')
0fa781320203 doctest: bulk-replace string literals with b'' for Python 3
Yuya Nishihara <yuya@tcha.org>
parents: 34054
diff changeset
   911
        >>> u.configlist(s, b'list1')
14171
fa2b596db182 ui: add configint function and tests
Sune Foldager <cryo@cyanite.org>
parents: 14076
diff changeset
   912
        ['this', 'is', 'a small', 'test']
34957
58e7791e243b ui: add configlist doctest to document a bit more of the whitespace behavior
Augie Fackler <augie@google.com>
parents: 34947
diff changeset
   913
        >>> u.setconfig(s, b'list2', b'this, is "a small" , test ')
58e7791e243b ui: add configlist doctest to document a bit more of the whitespace behavior
Augie Fackler <augie@google.com>
parents: 34947
diff changeset
   914
        >>> u.configlist(s, b'list2')
58e7791e243b ui: add configlist doctest to document a bit more of the whitespace behavior
Augie Fackler <augie@google.com>
parents: 34947
diff changeset
   915
        ['this', 'is', 'a small', 'test']
14171
fa2b596db182 ui: add configint function and tests
Sune Foldager <cryo@cyanite.org>
parents: 14076
diff changeset
   916
        """
31481
a7c687c35119 ui: move configlist parser to config.py
Jun Wu <quark@fb.com>
parents: 31479
diff changeset
   917
        # default is not always a list
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42672
diff changeset
   918
        v = self.configwith(
47189
b0e92313107e parselist: move the function from config to stringutil
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47029
diff changeset
   919
            stringutil.parselist, section, name, default, b'list', untrusted
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42672
diff changeset
   920
        )
32963
88b3a38d39e3 config: use the new '_unset' value for 'configlist'
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 32962
diff changeset
   921
        if isinstance(v, bytes):
47189
b0e92313107e parselist: move the function from config to stringutil
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47029
diff changeset
   922
            return stringutil.parselist(v)
32963
88b3a38d39e3 config: use the new '_unset' value for 'configlist'
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 32962
diff changeset
   923
        elif v is None:
88b3a38d39e3 config: use the new '_unset' value for 'configlist'
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 32962
diff changeset
   924
            return []
88b3a38d39e3 config: use the new '_unset' value for 'configlist'
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 32962
diff changeset
   925
        return v
2499
894435215344 Added ui.configlist method to get comma/space separated lists of strings.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 2498
diff changeset
   926
32964
6599b7372387 config: use the new '_unset' value for 'configdate'
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 32963
diff changeset
   927
    def configdate(self, section, name, default=_unset, untrusted=False):
32408
420e93b0d9dc ui: add the possiblity to get a date config field
Boris Feld <boris.feld@octobus.net>
parents: 32105
diff changeset
   928
        """parse a configuration element as a tuple of ints
420e93b0d9dc ui: add the possiblity to get a date config field
Boris Feld <boris.feld@octobus.net>
parents: 32105
diff changeset
   929
34131
0fa781320203 doctest: bulk-replace string literals with b'' for Python 3
Yuya Nishihara <yuya@tcha.org>
parents: 34054
diff changeset
   930
        >>> u = ui(); s = b'foo'
0fa781320203 doctest: bulk-replace string literals with b'' for Python 3
Yuya Nishihara <yuya@tcha.org>
parents: 34054
diff changeset
   931
        >>> u.setconfig(s, b'date', b'0 0')
0fa781320203 doctest: bulk-replace string literals with b'' for Python 3
Yuya Nishihara <yuya@tcha.org>
parents: 34054
diff changeset
   932
        >>> u.configdate(s, b'date')
32408
420e93b0d9dc ui: add the possiblity to get a date config field
Boris Feld <boris.feld@octobus.net>
parents: 32105
diff changeset
   933
        (0, 0)
420e93b0d9dc ui: add the possiblity to get a date config field
Boris Feld <boris.feld@octobus.net>
parents: 32105
diff changeset
   934
        """
420e93b0d9dc ui: add the possiblity to get a date config field
Boris Feld <boris.feld@octobus.net>
parents: 32105
diff changeset
   935
        if self.config(section, name, default, untrusted):
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42672
diff changeset
   936
            return self.configwith(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   937
                dateutil.parsedate, section, name, default, b'date', untrusted
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42672
diff changeset
   938
            )
32964
6599b7372387 config: use the new '_unset' value for 'configdate'
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 32963
diff changeset
   939
        if default is _unset:
6599b7372387 config: use the new '_unset' value for 'configdate'
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 32963
diff changeset
   940
            return None
32408
420e93b0d9dc ui: add the possiblity to get a date config field
Boris Feld <boris.feld@octobus.net>
parents: 32105
diff changeset
   941
        return default
420e93b0d9dc ui: add the possiblity to get a date config field
Boris Feld <boris.feld@octobus.net>
parents: 32105
diff changeset
   942
42672
51a2e3102db2 config: add defaultvalue template keyword
Navaneeth Suresh <navaneeths1998@gmail.com>
parents: 42561
diff changeset
   943
    def configdefault(self, section, name):
51a2e3102db2 config: add defaultvalue template keyword
Navaneeth Suresh <navaneeths1998@gmail.com>
parents: 42561
diff changeset
   944
        """returns the default value of the config item"""
51a2e3102db2 config: add defaultvalue template keyword
Navaneeth Suresh <navaneeths1998@gmail.com>
parents: 42561
diff changeset
   945
        item = self._knownconfig.get(section, {}).get(name)
51a2e3102db2 config: add defaultvalue template keyword
Navaneeth Suresh <navaneeths1998@gmail.com>
parents: 42561
diff changeset
   946
        itemdefault = None
51a2e3102db2 config: add defaultvalue template keyword
Navaneeth Suresh <navaneeths1998@gmail.com>
parents: 42561
diff changeset
   947
        if item is not None:
51a2e3102db2 config: add defaultvalue template keyword
Navaneeth Suresh <navaneeths1998@gmail.com>
parents: 42561
diff changeset
   948
            if callable(item.default):
51a2e3102db2 config: add defaultvalue template keyword
Navaneeth Suresh <navaneeths1998@gmail.com>
parents: 42561
diff changeset
   949
                itemdefault = item.default()
51a2e3102db2 config: add defaultvalue template keyword
Navaneeth Suresh <navaneeths1998@gmail.com>
parents: 42561
diff changeset
   950
            else:
51a2e3102db2 config: add defaultvalue template keyword
Navaneeth Suresh <navaneeths1998@gmail.com>
parents: 42561
diff changeset
   951
                itemdefault = item.default
51a2e3102db2 config: add defaultvalue template keyword
Navaneeth Suresh <navaneeths1998@gmail.com>
parents: 42561
diff changeset
   952
        return itemdefault
51a2e3102db2 config: add defaultvalue template keyword
Navaneeth Suresh <navaneeths1998@gmail.com>
parents: 42561
diff changeset
   953
27696
e70c97cc9243 config: add hasconfig method and supporting plumbing
Bryan O'Sullivan <bos@serpentine.com>
parents: 27563
diff changeset
   954
    def hasconfig(self, section, name, untrusted=False):
e70c97cc9243 config: add hasconfig method and supporting plumbing
Bryan O'Sullivan <bos@serpentine.com>
parents: 27563
diff changeset
   955
        return self._data(untrusted).hasitem(section, name)
e70c97cc9243 config: add hasconfig method and supporting plumbing
Bryan O'Sullivan <bos@serpentine.com>
parents: 27563
diff changeset
   956
4487
1b5b98837bb5 ui: Rename has_config to has_section.
Bryan O'Sullivan <bos@serpentine.com>
parents: 4258
diff changeset
   957
    def has_section(self, section, untrusted=False):
2343
af81d8770620 add ui.has_config method.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2335
diff changeset
   958
        '''tell whether section exists in config.'''
8199
e9f90e5989d9 ui: _get_cdata -> _data
Matt Mackall <mpm@selenic.com>
parents: 8198
diff changeset
   959
        return section in self._data(untrusted)
3552
9b52239dc740 save settings from untrusted config files in a separate configparser
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 3551
diff changeset
   960
27253
f43988e5954c ui: optionally ignore sub-options from configitems()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27252
diff changeset
   961
    def configitems(self, section, untrusted=False, ignoresub=False):
8199
e9f90e5989d9 ui: _get_cdata -> _data
Matt Mackall <mpm@selenic.com>
parents: 8198
diff changeset
   962
        items = self._data(untrusted).items(section)
27253
f43988e5954c ui: optionally ignore sub-options from configitems()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27252
diff changeset
   963
        if ignoresub:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   964
            items = [i for i in items if b':' not in i[0]]
8204
797586be575d ui: report_untrusted fixes
Matt Mackall <mpm@selenic.com>
parents: 8203
diff changeset
   965
        if self.debugflag and not untrusted and self._reportuntrusted:
8222
d30a21594812 more whitespace cleanup and some other style nits
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 8220
diff changeset
   966
            for k, v in self._ucfg.items(section):
8203
3377fa11af67 ui: privatize cdata vars
Matt Mackall <mpm@selenic.com>
parents: 8202
diff changeset
   967
                if self._tcfg.get(section, k) != v:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42672
diff changeset
   968
                    self.debug(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   969
                        b"ignoring untrusted configuration option "
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   970
                        b"%s.%s = %s\n" % (section, k, v)
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42672
diff changeset
   971
                    )
8144
fca54469480e ui: introduce new config parser
Matt Mackall <mpm@selenic.com>
parents: 8143
diff changeset
   972
        return items
285
5a1e6d27f399 ui: add configuration file support
mpm@selenic.com
parents: 249
diff changeset
   973
47415
b1b3127227be config: add an experimental option to list all known config
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47412
diff changeset
   974
    def walkconfig(self, untrusted=False, all_known=False):
b1b3127227be config: add an experimental option to list all known config
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47412
diff changeset
   975
        defined = self._walk_config(untrusted)
b1b3127227be config: add an experimental option to list all known config
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47412
diff changeset
   976
        if not all_known:
b1b3127227be config: add an experimental option to list all known config
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47412
diff changeset
   977
            for d in defined:
b1b3127227be config: add an experimental option to list all known config
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47412
diff changeset
   978
                yield d
b1b3127227be config: add an experimental option to list all known config
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47412
diff changeset
   979
            return
b1b3127227be config: add an experimental option to list all known config
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47412
diff changeset
   980
        known = self._walk_known()
b1b3127227be config: add an experimental option to list all known config
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47412
diff changeset
   981
        current_defined = next(defined, None)
b1b3127227be config: add an experimental option to list all known config
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47412
diff changeset
   982
        current_known = next(known, None)
b1b3127227be config: add an experimental option to list all known config
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47412
diff changeset
   983
        while current_defined is not None or current_known is not None:
b1b3127227be config: add an experimental option to list all known config
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47412
diff changeset
   984
            if current_defined is None:
b1b3127227be config: add an experimental option to list all known config
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47412
diff changeset
   985
                yield current_known
b1b3127227be config: add an experimental option to list all known config
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47412
diff changeset
   986
                current_known = next(known, None)
b1b3127227be config: add an experimental option to list all known config
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47412
diff changeset
   987
            elif current_known is None:
b1b3127227be config: add an experimental option to list all known config
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47412
diff changeset
   988
                yield current_defined
b1b3127227be config: add an experimental option to list all known config
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47412
diff changeset
   989
                current_defined = next(defined, None)
b1b3127227be config: add an experimental option to list all known config
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47412
diff changeset
   990
            elif current_known[0:2] == current_defined[0:2]:
b1b3127227be config: add an experimental option to list all known config
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47412
diff changeset
   991
                yield current_defined
b1b3127227be config: add an experimental option to list all known config
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47412
diff changeset
   992
                current_defined = next(defined, None)
b1b3127227be config: add an experimental option to list all known config
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47412
diff changeset
   993
                current_known = next(known, None)
b1b3127227be config: add an experimental option to list all known config
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47412
diff changeset
   994
            elif current_known[0:2] < current_defined[0:2]:
b1b3127227be config: add an experimental option to list all known config
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47412
diff changeset
   995
                yield current_known
b1b3127227be config: add an experimental option to list all known config
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47412
diff changeset
   996
                current_known = next(known, None)
b1b3127227be config: add an experimental option to list all known config
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47412
diff changeset
   997
            else:
b1b3127227be config: add an experimental option to list all known config
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47412
diff changeset
   998
                yield current_defined
b1b3127227be config: add an experimental option to list all known config
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47412
diff changeset
   999
                current_defined = next(defined, None)
b1b3127227be config: add an experimental option to list all known config
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47412
diff changeset
  1000
b1b3127227be config: add an experimental option to list all known config
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47412
diff changeset
  1001
    def _walk_known(self):
b1b3127227be config: add an experimental option to list all known config
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47412
diff changeset
  1002
        for section, items in sorted(self._knownconfig.items()):
b1b3127227be config: add an experimental option to list all known config
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47412
diff changeset
  1003
            for k, i in sorted(items.items()):
b1b3127227be config: add an experimental option to list all known config
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47412
diff changeset
  1004
                # We don't have a way to display generic well, so skip them
b1b3127227be config: add an experimental option to list all known config
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47412
diff changeset
  1005
                if i.generic:
b1b3127227be config: add an experimental option to list all known config
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47412
diff changeset
  1006
                    continue
b1b3127227be config: add an experimental option to list all known config
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47412
diff changeset
  1007
                if callable(i.default):
b1b3127227be config: add an experimental option to list all known config
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47412
diff changeset
  1008
                    default = i.default()
b1b3127227be config: add an experimental option to list all known config
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47412
diff changeset
  1009
                elif i.default is configitems.dynamicdefault:
b1b3127227be config: add an experimental option to list all known config
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47412
diff changeset
  1010
                    default = b'<DYNAMIC>'
b1b3127227be config: add an experimental option to list all known config
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47412
diff changeset
  1011
                else:
b1b3127227be config: add an experimental option to list all known config
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47412
diff changeset
  1012
                    default = i.default
b1b3127227be config: add an experimental option to list all known config
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47412
diff changeset
  1013
                yield section, i.name, default
b1b3127227be config: add an experimental option to list all known config
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47412
diff changeset
  1014
b1b3127227be config: add an experimental option to list all known config
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47412
diff changeset
  1015
    def _walk_config(self, untrusted):
8203
3377fa11af67 ui: privatize cdata vars
Matt Mackall <mpm@selenic.com>
parents: 8202
diff changeset
  1016
        cfg = self._data(untrusted)
3377fa11af67 ui: privatize cdata vars
Matt Mackall <mpm@selenic.com>
parents: 8202
diff changeset
  1017
        for section in cfg.sections():
3552
9b52239dc740 save settings from untrusted config files in a separate configparser
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 3551
diff changeset
  1018
            for name, value in self.configitems(section, untrusted):
13576
edd06611a7c6 ui: yield unchanged values in walkconfig
Martin Geisler <mg@aragost.com>
parents: 13493
diff changeset
  1019
                yield section, name, value
1028
25e7ea0f2cff Add commands.debugconfig.
Bryan O'Sullivan <bos@serpentine.com>
parents: 981
diff changeset
  1020
49797
0449fb7729d7 typing: add trivial type hints to mercurial/ui.py
Matt Harbison <matt_harbison@yahoo.com>
parents: 49795
diff changeset
  1021
    def plain(self, feature: Optional[bytes] = None) -> bool:
45942
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 45929
diff changeset
  1022
        """is plain mode active?
11325
22a737306ba5 ui: document the formatted(), interactive() & plain() functions.
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 11324
diff changeset
  1023
13849
9f97de157aad HGPLAIN: allow exceptions to plain mode, like i18n, via HGPLAINEXCEPT
Brodie Rao <brodie@bitheap.org>
parents: 13827
diff changeset
  1024
        Plain mode means that all configuration variables which affect
9f97de157aad HGPLAIN: allow exceptions to plain mode, like i18n, via HGPLAINEXCEPT
Brodie Rao <brodie@bitheap.org>
parents: 13827
diff changeset
  1025
        the behavior and output of Mercurial should be
9f97de157aad HGPLAIN: allow exceptions to plain mode, like i18n, via HGPLAINEXCEPT
Brodie Rao <brodie@bitheap.org>
parents: 13827
diff changeset
  1026
        ignored. Additionally, the output should be stable,
9f97de157aad HGPLAIN: allow exceptions to plain mode, like i18n, via HGPLAINEXCEPT
Brodie Rao <brodie@bitheap.org>
parents: 13827
diff changeset
  1027
        reproducible and suitable for use in scripts or applications.
9f97de157aad HGPLAIN: allow exceptions to plain mode, like i18n, via HGPLAINEXCEPT
Brodie Rao <brodie@bitheap.org>
parents: 13827
diff changeset
  1028
9f97de157aad HGPLAIN: allow exceptions to plain mode, like i18n, via HGPLAINEXCEPT
Brodie Rao <brodie@bitheap.org>
parents: 13827
diff changeset
  1029
        The only way to trigger plain mode is by setting either the
9f97de157aad HGPLAIN: allow exceptions to plain mode, like i18n, via HGPLAINEXCEPT
Brodie Rao <brodie@bitheap.org>
parents: 13827
diff changeset
  1030
        `HGPLAIN' or `HGPLAINEXCEPT' environment variables.
11325
22a737306ba5 ui: document the formatted(), interactive() & plain() functions.
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 11324
diff changeset
  1031
14372
be0daa0eeb3e ui: test plain mode against exceptions
"Yann E. MORIN" <yann.morin.1998@anciens.enib.fr>
parents: 14171
diff changeset
  1032
        The return value can either be
be0daa0eeb3e ui: test plain mode against exceptions
"Yann E. MORIN" <yann.morin.1998@anciens.enib.fr>
parents: 14171
diff changeset
  1033
        - False if HGPLAIN is not set, or feature is in HGPLAINEXCEPT
35170
c9740b69b9b7 dispatch: add HGPLAIN=+strictflags to restrict early parsing of global options
Yuya Nishihara <yuya@tcha.org>
parents: 34947
diff changeset
  1034
        - False if feature is disabled by default and not included in HGPLAIN
14372
be0daa0eeb3e ui: test plain mode against exceptions
"Yann E. MORIN" <yann.morin.1998@anciens.enib.fr>
parents: 14171
diff changeset
  1035
        - True otherwise
45942
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 45929
diff changeset
  1036
        """
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42672
diff changeset
  1037
        if (
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1038
            b'HGPLAIN' not in encoding.environ
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1039
            and b'HGPLAINEXCEPT' not in encoding.environ
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42672
diff changeset
  1040
        ):
13849
9f97de157aad HGPLAIN: allow exceptions to plain mode, like i18n, via HGPLAINEXCEPT
Brodie Rao <brodie@bitheap.org>
parents: 13827
diff changeset
  1041
            return False
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42672
diff changeset
  1042
        exceptions = (
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1043
            encoding.environ.get(b'HGPLAINEXCEPT', b'').strip().split(b',')
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42672
diff changeset
  1044
        )
35170
c9740b69b9b7 dispatch: add HGPLAIN=+strictflags to restrict early parsing of global options
Yuya Nishihara <yuya@tcha.org>
parents: 34947
diff changeset
  1045
        # TODO: add support for HGPLAIN=+feature,-feature syntax
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1046
        if b'+strictflags' not in encoding.environ.get(b'HGPLAIN', b'').split(
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1047
            b','
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1048
        ):
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1049
            exceptions.append(b'strictflags')
14372
be0daa0eeb3e ui: test plain mode against exceptions
"Yann E. MORIN" <yann.morin.1998@anciens.enib.fr>
parents: 14171
diff changeset
  1050
        if feature and exceptions:
be0daa0eeb3e ui: test plain mode against exceptions
"Yann E. MORIN" <yann.morin.1998@anciens.enib.fr>
parents: 14171
diff changeset
  1051
            return feature not in exceptions
be0daa0eeb3e ui: test plain mode against exceptions
"Yann E. MORIN" <yann.morin.1998@anciens.enib.fr>
parents: 14171
diff changeset
  1052
        return True
10455
40dfd46d098f ui: add HGPLAIN environment variable for easier scripting
Brodie Rao <me+hg@dackz.net>
parents: 10426
diff changeset
  1053
34849
9f2891fb426c ui: add the possibility to returns None as username in ui
Boris Feld <boris.feld@octobus.net>
parents: 34707
diff changeset
  1054
    def username(self, acceptempty=False):
1985
c577689006fa Adapted behaviour of ui.username() to documentation and mention it explicitly:
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1984
diff changeset
  1055
        """Return default username to be used in commits.
c577689006fa Adapted behaviour of ui.username() to documentation and mention it explicitly:
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1984
diff changeset
  1056
c577689006fa Adapted behaviour of ui.username() to documentation and mention it explicitly:
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1984
diff changeset
  1057
        Searched in this order: $HGUSER, [ui] section of hgrcs, $EMAIL
c577689006fa Adapted behaviour of ui.username() to documentation and mention it explicitly:
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1984
diff changeset
  1058
        and stop searching if one of these is set.
34849
9f2891fb426c ui: add the possibility to returns None as username in ui
Boris Feld <boris.feld@octobus.net>
parents: 34707
diff changeset
  1059
        If not found and acceptempty is True, returns None.
6862
7192876ac329 ui: add an option to prompt for the username when it isn't provided
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 6762
diff changeset
  1060
        If not found and ui.askusername is True, ask the user, else use
7192876ac329 ui: add an option to prompt for the username when it isn't provided
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 6762
diff changeset
  1061
        ($LOGNAME or $USER or $LNAME or $USERNAME) + "@full.hostname".
34849
9f2891fb426c ui: add the possibility to returns None as username in ui
Boris Feld <boris.feld@octobus.net>
parents: 34707
diff changeset
  1062
        If no username could be found, raise an Abort error.
1985
c577689006fa Adapted behaviour of ui.username() to documentation and mention it explicitly:
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1984
diff changeset
  1063
        """
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1064
        user = encoding.environ.get(b"HGUSER")
1985
c577689006fa Adapted behaviour of ui.username() to documentation and mention it explicitly:
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1984
diff changeset
  1065
        if user is None:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1066
            user = self.config(b"ui", b"username")
11225
d6dbd5e4ee72 ui.username(): expand environment variables in username configuration value.
Chad Dombrova <chadrik@gmail.com>
parents: 11036
diff changeset
  1067
            if user is not None:
d6dbd5e4ee72 ui.username(): expand environment variables in username configuration value.
Chad Dombrova <chadrik@gmail.com>
parents: 11036
diff changeset
  1068
                user = os.path.expandvars(user)
1985
c577689006fa Adapted behaviour of ui.username() to documentation and mention it explicitly:
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1984
diff changeset
  1069
        if user is None:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1070
            user = encoding.environ.get(b"EMAIL")
34849
9f2891fb426c ui: add the possibility to returns None as username in ui
Boris Feld <boris.feld@octobus.net>
parents: 34707
diff changeset
  1071
        if user is None and acceptempty:
9f2891fb426c ui: add the possibility to returns None as username in ui
Boris Feld <boris.feld@octobus.net>
parents: 34707
diff changeset
  1072
            return user
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1073
        if user is None and self.configbool(b"ui", b"askusername"):
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1074
            user = self.prompt(_(b"enter a commit username:"), default=None)
9613
c63c336ee2f7 ui: only use "user@host" as username in noninteractive mode
Martin Geisler <mg@lazybytes.net>
parents: 9610
diff changeset
  1075
        if user is None and not self.interactive():
3721
98f2507c5551 only print a warning when no username is specified
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 3678
diff changeset
  1076
            try:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1077
                user = b'%s@%s' % (
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42672
diff changeset
  1078
                    procutil.getuser(),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42672
diff changeset
  1079
                    encoding.strtolocal(socket.getfqdn()),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42672
diff changeset
  1080
                )
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1081
                self.warn(_(b"no username found, using '%s' instead\n") % user)
3721
98f2507c5551 only print a warning when no username is specified
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 3678
diff changeset
  1082
            except KeyError:
4044
78a0dd93db0b Abort on empty username so specifying a username can be forced.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 3984
diff changeset
  1083
                pass
78a0dd93db0b Abort on empty username so specifying a username can be forced.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 3984
diff changeset
  1084
        if not user:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42672
diff changeset
  1085
            raise error.Abort(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1086
                _(b'no username supplied'),
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1087
                hint=_(b"use 'hg config --edit' " b'to set your username'),
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42672
diff changeset
  1088
            )
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1089
        if b"\n" in user:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42672
diff changeset
  1090
            raise error.Abort(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1091
                _(b"username %r contains a newline\n") % pycompat.bytestr(user)
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42672
diff changeset
  1092
            )
1985
c577689006fa Adapted behaviour of ui.username() to documentation and mention it explicitly:
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1984
diff changeset
  1093
        return user
608
d2994b5298fb Add username/merge/editor to .hgrc
Matt Mackall <mpm@selenic.com>
parents: 565
diff changeset
  1094
49797
0449fb7729d7 typing: add trivial type hints to mercurial/ui.py
Matt Harbison <matt_harbison@yahoo.com>
parents: 49795
diff changeset
  1095
    def shortuser(self, user: bytes) -> bytes:
1129
ee4f60abad93 Move generating short username to display in hg/hgweb annotate to ui module.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1071
diff changeset
  1096
        """Return a short representation of a user name or email address."""
10282
08a0f04b56bd many, many trivial check-code fixups
Matt Mackall <mpm@selenic.com>
parents: 10264
diff changeset
  1097
        if not self.verbose:
37084
f0b6fbea00cf stringutil: bulk-replace call sites to point to new module
Yuya Nishihara <yuya@tcha.org>
parents: 36910
diff changeset
  1098
            user = stringutil.shortuser(user)
1129
ee4f60abad93 Move generating short username to display in hg/hgweb annotate to ui module.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1071
diff changeset
  1099
        return user
ee4f60abad93 Move generating short username to display in hg/hgweb annotate to ui module.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1071
diff changeset
  1100
2494
73ac95671788 push, outgoing, bundle: fall back to "default" if "default-push" not defined
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2470
diff changeset
  1101
    def expandpath(self, loc, default=None):
1892
622ee75cb4c9 Directory names take precedence over symbolic names consistently.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1882
diff changeset
  1102
        """Return repository location relative to cwd or from [paths]"""
46965
b03527bdac01 ui: deprecated `ui.expandpath`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 46907
diff changeset
  1103
        msg = b'ui.expandpath is deprecated, use `get_*` functions from urlutil'
b03527bdac01 ui: deprecated `ui.expandpath`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 46907
diff changeset
  1104
        self.deprecwarn(msg, b'6.0')
26189
663fbc336e22 ui: change default path fallback mechanism (issue4796)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26076
diff changeset
  1105
        try:
46720
66fb04552122 ui: pass a `ui` object to `paths.getpath`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 46623
diff changeset
  1106
            p = self.getpath(loc)
26189
663fbc336e22 ui: change default path fallback mechanism (issue4796)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26076
diff changeset
  1107
            if p:
663fbc336e22 ui: change default path fallback mechanism (issue4796)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26076
diff changeset
  1108
                return p.rawloc
663fbc336e22 ui: change default path fallback mechanism (issue4796)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26076
diff changeset
  1109
        except error.RepoError:
663fbc336e22 ui: change default path fallback mechanism (issue4796)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26076
diff changeset
  1110
            pass
663fbc336e22 ui: change default path fallback mechanism (issue4796)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26076
diff changeset
  1111
663fbc336e22 ui: change default path fallback mechanism (issue4796)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26076
diff changeset
  1112
        if default:
663fbc336e22 ui: change default path fallback mechanism (issue4796)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26076
diff changeset
  1113
            try:
46720
66fb04552122 ui: pass a `ui` object to `paths.getpath`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 46623
diff changeset
  1114
                p = self.getpath(default)
26189
663fbc336e22 ui: change default path fallback mechanism (issue4796)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26076
diff changeset
  1115
                if p:
663fbc336e22 ui: change default path fallback mechanism (issue4796)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26076
diff changeset
  1116
                    return p.rawloc
663fbc336e22 ui: change default path fallback mechanism (issue4796)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26076
diff changeset
  1117
            except error.RepoError:
663fbc336e22 ui: change default path fallback mechanism (issue4796)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26076
diff changeset
  1118
                pass
663fbc336e22 ui: change default path fallback mechanism (issue4796)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26076
diff changeset
  1119
24250
9c32eea2ca04 ui: represent paths as classes
Gregory Szorc <gregory.szorc@gmail.com>
parents: 23269
diff changeset
  1120
        return loc
9c32eea2ca04 ui: represent paths as classes
Gregory Szorc <gregory.szorc@gmail.com>
parents: 23269
diff changeset
  1121
9c32eea2ca04 ui: represent paths as classes
Gregory Szorc <gregory.szorc@gmail.com>
parents: 23269
diff changeset
  1122
    @util.propertycache
9c32eea2ca04 ui: represent paths as classes
Gregory Szorc <gregory.szorc@gmail.com>
parents: 23269
diff changeset
  1123
    def paths(self):
46906
33524c46a092 urlutil: extract `path` related code into a new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 46828
diff changeset
  1124
        return urlutil.paths(self)
506
1f81ebff98c9 [PATCH] Add ui.expandpath command
mpm@selenic.com
parents: 350
diff changeset
  1125
46720
66fb04552122 ui: pass a `ui` object to `paths.getpath`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 46623
diff changeset
  1126
    def getpath(self, *args, **kwargs):
66fb04552122 ui: pass a `ui` object to `paths.getpath`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 46623
diff changeset
  1127
        """see paths.getpath for details
66fb04552122 ui: pass a `ui` object to `paths.getpath`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 46623
diff changeset
  1128
66fb04552122 ui: pass a `ui` object to `paths.getpath`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 46623
diff changeset
  1129
        This method exist as `getpath` need a ui for potential warning message.
66fb04552122 ui: pass a `ui` object to `paths.getpath`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 46623
diff changeset
  1130
        """
47029
9ea75ea23534 urlutil: deprecate `getpath`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 46965
diff changeset
  1131
        msg = b'ui.getpath is deprecated, use `get_*` functions from urlutil'
47412
c887bab2dccf py3: byteify the version string passed to the deprecation warning method
Matt Harbison <matt_harbison@yahoo.com>
parents: 47272
diff changeset
  1132
        self.deprecwarn(msg, b'6.0')
46720
66fb04552122 ui: pass a `ui` object to `paths.getpath`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 46623
diff changeset
  1133
        return self.paths.getpath(self, *args, **kwargs)
66fb04552122 ui: pass a `ui` object to `paths.getpath`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 46623
diff changeset
  1134
40543
7bffbbe03e90 ui: hide fin/fout/ferr attributes behind @property functions
Yuya Nishihara <yuya@tcha.org>
parents: 40542
diff changeset
  1135
    @property
7bffbbe03e90 ui: hide fin/fout/ferr attributes behind @property functions
Yuya Nishihara <yuya@tcha.org>
parents: 40542
diff changeset
  1136
    def fout(self):
7bffbbe03e90 ui: hide fin/fout/ferr attributes behind @property functions
Yuya Nishihara <yuya@tcha.org>
parents: 40542
diff changeset
  1137
        return self._fout
7bffbbe03e90 ui: hide fin/fout/ferr attributes behind @property functions
Yuya Nishihara <yuya@tcha.org>
parents: 40542
diff changeset
  1138
7bffbbe03e90 ui: hide fin/fout/ferr attributes behind @property functions
Yuya Nishihara <yuya@tcha.org>
parents: 40542
diff changeset
  1139
    @fout.setter
7bffbbe03e90 ui: hide fin/fout/ferr attributes behind @property functions
Yuya Nishihara <yuya@tcha.org>
parents: 40542
diff changeset
  1140
    def fout(self, f):
7bffbbe03e90 ui: hide fin/fout/ferr attributes behind @property functions
Yuya Nishihara <yuya@tcha.org>
parents: 40542
diff changeset
  1141
        self._fout = f
40547
840cd57cde32 ui: add config knob to redirect status messages to stderr (API)
Yuya Nishihara <yuya@tcha.org>
parents: 40543
diff changeset
  1142
        self._fmsgout, self._fmsgerr = _selectmsgdests(self)
40543
7bffbbe03e90 ui: hide fin/fout/ferr attributes behind @property functions
Yuya Nishihara <yuya@tcha.org>
parents: 40542
diff changeset
  1143
7bffbbe03e90 ui: hide fin/fout/ferr attributes behind @property functions
Yuya Nishihara <yuya@tcha.org>
parents: 40542
diff changeset
  1144
    @property
7bffbbe03e90 ui: hide fin/fout/ferr attributes behind @property functions
Yuya Nishihara <yuya@tcha.org>
parents: 40542
diff changeset
  1145
    def ferr(self):
7bffbbe03e90 ui: hide fin/fout/ferr attributes behind @property functions
Yuya Nishihara <yuya@tcha.org>
parents: 40542
diff changeset
  1146
        return self._ferr
7bffbbe03e90 ui: hide fin/fout/ferr attributes behind @property functions
Yuya Nishihara <yuya@tcha.org>
parents: 40542
diff changeset
  1147
7bffbbe03e90 ui: hide fin/fout/ferr attributes behind @property functions
Yuya Nishihara <yuya@tcha.org>
parents: 40542
diff changeset
  1148
    @ferr.setter
7bffbbe03e90 ui: hide fin/fout/ferr attributes behind @property functions
Yuya Nishihara <yuya@tcha.org>
parents: 40542
diff changeset
  1149
    def ferr(self, f):
7bffbbe03e90 ui: hide fin/fout/ferr attributes behind @property functions
Yuya Nishihara <yuya@tcha.org>
parents: 40542
diff changeset
  1150
        self._ferr = f
40547
840cd57cde32 ui: add config knob to redirect status messages to stderr (API)
Yuya Nishihara <yuya@tcha.org>
parents: 40543
diff changeset
  1151
        self._fmsgout, self._fmsgerr = _selectmsgdests(self)
40543
7bffbbe03e90 ui: hide fin/fout/ferr attributes behind @property functions
Yuya Nishihara <yuya@tcha.org>
parents: 40542
diff changeset
  1152
7bffbbe03e90 ui: hide fin/fout/ferr attributes behind @property functions
Yuya Nishihara <yuya@tcha.org>
parents: 40542
diff changeset
  1153
    @property
7bffbbe03e90 ui: hide fin/fout/ferr attributes behind @property functions
Yuya Nishihara <yuya@tcha.org>
parents: 40542
diff changeset
  1154
    def fin(self):
7bffbbe03e90 ui: hide fin/fout/ferr attributes behind @property functions
Yuya Nishihara <yuya@tcha.org>
parents: 40542
diff changeset
  1155
        return self._fin
7bffbbe03e90 ui: hide fin/fout/ferr attributes behind @property functions
Yuya Nishihara <yuya@tcha.org>
parents: 40542
diff changeset
  1156
7bffbbe03e90 ui: hide fin/fout/ferr attributes behind @property functions
Yuya Nishihara <yuya@tcha.org>
parents: 40542
diff changeset
  1157
    @fin.setter
7bffbbe03e90 ui: hide fin/fout/ferr attributes behind @property functions
Yuya Nishihara <yuya@tcha.org>
parents: 40542
diff changeset
  1158
    def fin(self, f):
7bffbbe03e90 ui: hide fin/fout/ferr attributes behind @property functions
Yuya Nishihara <yuya@tcha.org>
parents: 40542
diff changeset
  1159
        self._fin = f
7bffbbe03e90 ui: hide fin/fout/ferr attributes behind @property functions
Yuya Nishihara <yuya@tcha.org>
parents: 40542
diff changeset
  1160
40587
5542bc9125c9 dispatch: pass around ui.fmsg channel
Yuya Nishihara <yuya@tcha.org>
parents: 40578
diff changeset
  1161
    @property
5542bc9125c9 dispatch: pass around ui.fmsg channel
Yuya Nishihara <yuya@tcha.org>
parents: 40578
diff changeset
  1162
    def fmsg(self):
5542bc9125c9 dispatch: pass around ui.fmsg channel
Yuya Nishihara <yuya@tcha.org>
parents: 40578
diff changeset
  1163
        """Stream dedicated for status/error messages; may be None if
5542bc9125c9 dispatch: pass around ui.fmsg channel
Yuya Nishihara <yuya@tcha.org>
parents: 40578
diff changeset
  1164
        fout/ferr are used"""
5542bc9125c9 dispatch: pass around ui.fmsg channel
Yuya Nishihara <yuya@tcha.org>
parents: 40578
diff changeset
  1165
        return self._fmsg
5542bc9125c9 dispatch: pass around ui.fmsg channel
Yuya Nishihara <yuya@tcha.org>
parents: 40578
diff changeset
  1166
5542bc9125c9 dispatch: pass around ui.fmsg channel
Yuya Nishihara <yuya@tcha.org>
parents: 40578
diff changeset
  1167
    @fmsg.setter
5542bc9125c9 dispatch: pass around ui.fmsg channel
Yuya Nishihara <yuya@tcha.org>
parents: 40578
diff changeset
  1168
    def fmsg(self, f):
5542bc9125c9 dispatch: pass around ui.fmsg channel
Yuya Nishihara <yuya@tcha.org>
parents: 40578
diff changeset
  1169
        self._fmsg = f
5542bc9125c9 dispatch: pass around ui.fmsg channel
Yuya Nishihara <yuya@tcha.org>
parents: 40578
diff changeset
  1170
        self._fmsgout, self._fmsgerr = _selectmsgdests(self)
5542bc9125c9 dispatch: pass around ui.fmsg channel
Yuya Nishihara <yuya@tcha.org>
parents: 40578
diff changeset
  1171
47437
7a430116f639 ui: add a context manager for silencing the ui (pushbuffer+popbuffer)
Martin von Zweigbergk <martinvonz@google.com>
parents: 47415
diff changeset
  1172
    @contextlib.contextmanager
49797
0449fb7729d7 typing: add trivial type hints to mercurial/ui.py
Matt Harbison <matt_harbison@yahoo.com>
parents: 49795
diff changeset
  1173
    def silent(
0449fb7729d7 typing: add trivial type hints to mercurial/ui.py
Matt Harbison <matt_harbison@yahoo.com>
parents: 49795
diff changeset
  1174
        self, error: bool = False, subproc: bool = False, labeled: bool = False
0449fb7729d7 typing: add trivial type hints to mercurial/ui.py
Matt Harbison <matt_harbison@yahoo.com>
parents: 49795
diff changeset
  1175
    ):
47437
7a430116f639 ui: add a context manager for silencing the ui (pushbuffer+popbuffer)
Martin von Zweigbergk <martinvonz@google.com>
parents: 47415
diff changeset
  1176
        self.pushbuffer(error=error, subproc=subproc, labeled=labeled)
7a430116f639 ui: add a context manager for silencing the ui (pushbuffer+popbuffer)
Martin von Zweigbergk <martinvonz@google.com>
parents: 47415
diff changeset
  1177
        try:
7a430116f639 ui: add a context manager for silencing the ui (pushbuffer+popbuffer)
Martin von Zweigbergk <martinvonz@google.com>
parents: 47415
diff changeset
  1178
            yield
7a430116f639 ui: add a context manager for silencing the ui (pushbuffer+popbuffer)
Martin von Zweigbergk <martinvonz@google.com>
parents: 47415
diff changeset
  1179
        finally:
7a430116f639 ui: add a context manager for silencing the ui (pushbuffer+popbuffer)
Martin von Zweigbergk <martinvonz@google.com>
parents: 47415
diff changeset
  1180
            self.popbuffer()
7a430116f639 ui: add a context manager for silencing the ui (pushbuffer+popbuffer)
Martin von Zweigbergk <martinvonz@google.com>
parents: 47415
diff changeset
  1181
49797
0449fb7729d7 typing: add trivial type hints to mercurial/ui.py
Matt Harbison <matt_harbison@yahoo.com>
parents: 49795
diff changeset
  1182
    def pushbuffer(
0449fb7729d7 typing: add trivial type hints to mercurial/ui.py
Matt Harbison <matt_harbison@yahoo.com>
parents: 49795
diff changeset
  1183
        self, error: bool = False, subproc: bool = False, labeled: bool = False
0449fb7729d7 typing: add trivial type hints to mercurial/ui.py
Matt Harbison <matt_harbison@yahoo.com>
parents: 49795
diff changeset
  1184
    ) -> None:
23139
e53f6b72a0e4 spelling: fixes from proofreading of spell checker issues
Mads Kiilerich <madski@unity3d.com>
parents: 23053
diff changeset
  1185
        """install a buffer to capture standard output of the ui object
21132
350dc24a553d ui: pushbuffer can now also capture stderr
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 20788
diff changeset
  1186
24848
2f88821856eb ui: allow capture of subprocess output
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 24687
diff changeset
  1187
        If error is True, the error output will be captured too.
2f88821856eb ui: allow capture of subprocess output
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 24687
diff changeset
  1188
2f88821856eb ui: allow capture of subprocess output
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 24687
diff changeset
  1189
        If subproc is True, output from subprocesses (typically hooks) will be
27106
6ef17697b03d ui: track label expansion when creating buffers
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27068
diff changeset
  1190
        captured too.
10815
32b213b9b22c ui: add ui.write() output labeling API
Brodie Rao <brodie@bitheap.org>
parents: 10567
diff changeset
  1191
32b213b9b22c ui: add ui.write() output labeling API
Brodie Rao <brodie@bitheap.org>
parents: 10567
diff changeset
  1192
        If labeled is True, any labels associated with buffered
32b213b9b22c ui: add ui.write() output labeling API
Brodie Rao <brodie@bitheap.org>
parents: 10567
diff changeset
  1193
        output will be handled. By default, this has no effect
32b213b9b22c ui: add ui.write() output labeling API
Brodie Rao <brodie@bitheap.org>
parents: 10567
diff changeset
  1194
        on the output returned, but extensions and GUI tools may
32b213b9b22c ui: add ui.write() output labeling API
Brodie Rao <brodie@bitheap.org>
parents: 10567
diff changeset
  1195
        handle this argument and returned styled output. If output
32b213b9b22c ui: add ui.write() output labeling API
Brodie Rao <brodie@bitheap.org>
parents: 10567
diff changeset
  1196
        is being buffered so it can be captured and parsed or
32b213b9b22c ui: add ui.write() output labeling API
Brodie Rao <brodie@bitheap.org>
parents: 10567
diff changeset
  1197
        processed, labeled should not be set to True.
27106
6ef17697b03d ui: track label expansion when creating buffers
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27068
diff changeset
  1198
        """
8202
4746113269c7 ui: buffers -> _buffers
Matt Mackall <mpm@selenic.com>
parents: 8201
diff changeset
  1199
        self._buffers.append([])
27106
6ef17697b03d ui: track label expansion when creating buffers
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27068
diff changeset
  1200
        self._bufferstates.append((error, subproc, labeled))
6ef17697b03d ui: track label expansion when creating buffers
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27068
diff changeset
  1201
        self._bufferapplylabels = labeled
3737
9f5c46c50118 add a simple nested buffering scheme to ui
Matt Mackall <mpm@selenic.com>
parents: 3721
diff changeset
  1202
49797
0449fb7729d7 typing: add trivial type hints to mercurial/ui.py
Matt Harbison <matt_harbison@yahoo.com>
parents: 49795
diff changeset
  1203
    def popbuffer(self) -> bytes:
27109
a93d53f79e6e ui: remove labeled argument from popbuffer
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27106
diff changeset
  1204
        '''pop the last buffer and return the buffered output'''
21132
350dc24a553d ui: pushbuffer can now also capture stderr
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 20788
diff changeset
  1205
        self._bufferstates.pop()
27106
6ef17697b03d ui: track label expansion when creating buffers
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27068
diff changeset
  1206
        if self._bufferstates:
6ef17697b03d ui: track label expansion when creating buffers
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27068
diff changeset
  1207
            self._bufferapplylabels = self._bufferstates[-1][2]
6ef17697b03d ui: track label expansion when creating buffers
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27068
diff changeset
  1208
        else:
6ef17697b03d ui: track label expansion when creating buffers
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27068
diff changeset
  1209
            self._bufferapplylabels = None
6ef17697b03d ui: track label expansion when creating buffers
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27068
diff changeset
  1210
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1211
        return b"".join(self._buffers.pop())
3737
9f5c46c50118 add a simple nested buffering scheme to ui
Matt Mackall <mpm@selenic.com>
parents: 3721
diff changeset
  1212
49797
0449fb7729d7 typing: add trivial type hints to mercurial/ui.py
Matt Harbison <matt_harbison@yahoo.com>
parents: 49795
diff changeset
  1213
    def _isbuffered(self, dest) -> bool:
40543
7bffbbe03e90 ui: hide fin/fout/ferr attributes behind @property functions
Yuya Nishihara <yuya@tcha.org>
parents: 40542
diff changeset
  1214
        if dest is self._fout:
40541
c2aea007130b ui: add inner function to select write destination
Yuya Nishihara <yuya@tcha.org>
parents: 40540
diff changeset
  1215
            return bool(self._buffers)
40543
7bffbbe03e90 ui: hide fin/fout/ferr attributes behind @property functions
Yuya Nishihara <yuya@tcha.org>
parents: 40542
diff changeset
  1216
        if dest is self._ferr:
40541
c2aea007130b ui: add inner function to select write destination
Yuya Nishihara <yuya@tcha.org>
parents: 40540
diff changeset
  1217
            return bool(self._bufferstates and self._bufferstates[-1][0])
c2aea007130b ui: add inner function to select write destination
Yuya Nishihara <yuya@tcha.org>
parents: 40540
diff changeset
  1218
        return False
c2aea007130b ui: add inner function to select write destination
Yuya Nishihara <yuya@tcha.org>
parents: 40540
diff changeset
  1219
49797
0449fb7729d7 typing: add trivial type hints to mercurial/ui.py
Matt Harbison <matt_harbison@yahoo.com>
parents: 49795
diff changeset
  1220
    def canwritewithoutlabels(self) -> bool:
35961
0ff41ced4c12 diff: improve ui.write performance when not coloring on Windows
Joerg Sonnenberger <joerg@bec.de>
parents: 35957
diff changeset
  1221
        '''check if write skips the label'''
0ff41ced4c12 diff: improve ui.write performance when not coloring on Windows
Joerg Sonnenberger <joerg@bec.de>
parents: 35957
diff changeset
  1222
        if self._buffers and not self._bufferapplylabels:
0ff41ced4c12 diff: improve ui.write performance when not coloring on Windows
Joerg Sonnenberger <joerg@bec.de>
parents: 35957
diff changeset
  1223
            return True
0ff41ced4c12 diff: improve ui.write performance when not coloring on Windows
Joerg Sonnenberger <joerg@bec.de>
parents: 35957
diff changeset
  1224
        return self._colormode is None
0ff41ced4c12 diff: improve ui.write performance when not coloring on Windows
Joerg Sonnenberger <joerg@bec.de>
parents: 35957
diff changeset
  1225
49797
0449fb7729d7 typing: add trivial type hints to mercurial/ui.py
Matt Harbison <matt_harbison@yahoo.com>
parents: 49795
diff changeset
  1226
    def canbatchlabeledwrites(self) -> bool:
35961
0ff41ced4c12 diff: improve ui.write performance when not coloring on Windows
Joerg Sonnenberger <joerg@bec.de>
parents: 35957
diff changeset
  1227
        '''check if write calls with labels are batchable'''
0ff41ced4c12 diff: improve ui.write performance when not coloring on Windows
Joerg Sonnenberger <joerg@bec.de>
parents: 35957
diff changeset
  1228
        # Windows color printing is special, see ``write``.
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1229
        return self._colormode != b'win32'
35961
0ff41ced4c12 diff: improve ui.write performance when not coloring on Windows
Joerg Sonnenberger <joerg@bec.de>
parents: 35957
diff changeset
  1230
49795
f1e820cda2f5 typing: add type hints related to message output in mercurial/ui.py
Matt Harbison <matt_harbison@yahoo.com>
parents: 49794
diff changeset
  1231
    def write(self, *args: bytes, **opts: _MsgOpts) -> None:
45942
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 45929
diff changeset
  1232
        """write args to output
10815
32b213b9b22c ui: add ui.write() output labeling API
Brodie Rao <brodie@bitheap.org>
parents: 10567
diff changeset
  1233
31091
ad074f900907 color: move 'write' logic to the core ui class
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 31090
diff changeset
  1234
        By default, this method simply writes to the buffer or stdout.
ad074f900907 color: move 'write' logic to the core ui class
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 31090
diff changeset
  1235
        Color mode can be set on the UI class to have the output decorated
ad074f900907 color: move 'write' logic to the core ui class
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 31090
diff changeset
  1236
        with color modifier before being written to stdout.
10815
32b213b9b22c ui: add ui.write() output labeling API
Brodie Rao <brodie@bitheap.org>
parents: 10567
diff changeset
  1237
31091
ad074f900907 color: move 'write' logic to the core ui class
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 31090
diff changeset
  1238
        The color used is controlled by an optional keyword argument, "label".
ad074f900907 color: move 'write' logic to the core ui class
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 31090
diff changeset
  1239
        This should be a string containing label names separated by space.
ad074f900907 color: move 'write' logic to the core ui class
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 31090
diff changeset
  1240
        Label names take the form of "topic.type". For example, ui.debug()
ad074f900907 color: move 'write' logic to the core ui class
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 31090
diff changeset
  1241
        issues a label of "ui.debug".
10815
32b213b9b22c ui: add ui.write() output labeling API
Brodie Rao <brodie@bitheap.org>
parents: 10567
diff changeset
  1242
43265
82879e06c926 ui: option to preserve the progress bar
Joerg Sonnenberger <joerg@bec.de>
parents: 43118
diff changeset
  1243
        Progress reports via stderr are normally cleared before writing as
82879e06c926 ui: option to preserve the progress bar
Joerg Sonnenberger <joerg@bec.de>
parents: 43118
diff changeset
  1244
        stdout and stderr go to the same terminal. This can be skipped with
82879e06c926 ui: option to preserve the progress bar
Joerg Sonnenberger <joerg@bec.de>
parents: 43118
diff changeset
  1245
        the optional keyword argument "keepprogressbar". The progress bar
82879e06c926 ui: option to preserve the progress bar
Joerg Sonnenberger <joerg@bec.de>
parents: 43118
diff changeset
  1246
        will continue to occupy a partial line on stderr in that case.
82879e06c926 ui: option to preserve the progress bar
Joerg Sonnenberger <joerg@bec.de>
parents: 43118
diff changeset
  1247
        This functionality is intended when Mercurial acts as data source
82879e06c926 ui: option to preserve the progress bar
Joerg Sonnenberger <joerg@bec.de>
parents: 43118
diff changeset
  1248
        in a pipe.
82879e06c926 ui: option to preserve the progress bar
Joerg Sonnenberger <joerg@bec.de>
parents: 43118
diff changeset
  1249
10815
32b213b9b22c ui: add ui.write() output labeling API
Brodie Rao <brodie@bitheap.org>
parents: 10567
diff changeset
  1250
        When labeling output for a specific command, a label of
32b213b9b22c ui: add ui.write() output labeling API
Brodie Rao <brodie@bitheap.org>
parents: 10567
diff changeset
  1251
        "cmdname.type" is recommended. For example, status issues
32b213b9b22c ui: add ui.write() output labeling API
Brodie Rao <brodie@bitheap.org>
parents: 10567
diff changeset
  1252
        a label of "status.modified" for modified files.
45942
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 45929
diff changeset
  1253
        """
41306
b4a3abdc790d ui: inline _write() into write() due to performance issue
Yuya Nishihara <yuya@tcha.org>
parents: 41305
diff changeset
  1254
        dest = self._fout
b4a3abdc790d ui: inline _write() into write() due to performance issue
Yuya Nishihara <yuya@tcha.org>
parents: 41305
diff changeset
  1255
b4a3abdc790d ui: inline _write() into write() due to performance issue
Yuya Nishihara <yuya@tcha.org>
parents: 41305
diff changeset
  1256
        # inlined _write() for speed
41308
26ee61c33dee ui: remove unreachable branches and function calls from write() (issue6059)
Yuya Nishihara <yuya@tcha.org>
parents: 41307
diff changeset
  1257
        if self._buffers:
43506
9f70512ae2cf cleanup: remove pointless r-prefixes on single-quoted strings
Augie Fackler <augie@google.com>
parents: 43377
diff changeset
  1258
            label = opts.get('label', b'')
41306
b4a3abdc790d ui: inline _write() into write() due to performance issue
Yuya Nishihara <yuya@tcha.org>
parents: 41305
diff changeset
  1259
            if label and self._bufferapplylabels:
b4a3abdc790d ui: inline _write() into write() due to performance issue
Yuya Nishihara <yuya@tcha.org>
parents: 41305
diff changeset
  1260
                self._buffers[-1].extend(self.label(a, label) for a in args)
b4a3abdc790d ui: inline _write() into write() due to performance issue
Yuya Nishihara <yuya@tcha.org>
parents: 41305
diff changeset
  1261
            else:
b4a3abdc790d ui: inline _write() into write() due to performance issue
Yuya Nishihara <yuya@tcha.org>
parents: 41305
diff changeset
  1262
                self._buffers[-1].extend(args)
41307
e8273eaa0726 ui: inline _writenobuf() into write() due to performance issue
Yuya Nishihara <yuya@tcha.org>
parents: 41306
diff changeset
  1263
            return
e8273eaa0726 ui: inline _writenobuf() into write() due to performance issue
Yuya Nishihara <yuya@tcha.org>
parents: 41306
diff changeset
  1264
43265
82879e06c926 ui: option to preserve the progress bar
Joerg Sonnenberger <joerg@bec.de>
parents: 43118
diff changeset
  1265
        # inlined _writenobuf() for speed
43506
9f70512ae2cf cleanup: remove pointless r-prefixes on single-quoted strings
Augie Fackler <augie@google.com>
parents: 43377
diff changeset
  1266
        if not opts.get('keepprogressbar', False):
43265
82879e06c926 ui: option to preserve the progress bar
Joerg Sonnenberger <joerg@bec.de>
parents: 43118
diff changeset
  1267
            self._progclear()
41307
e8273eaa0726 ui: inline _writenobuf() into write() due to performance issue
Yuya Nishihara <yuya@tcha.org>
parents: 41306
diff changeset
  1268
        msg = b''.join(args)
e8273eaa0726 ui: inline _writenobuf() into write() due to performance issue
Yuya Nishihara <yuya@tcha.org>
parents: 41306
diff changeset
  1269
e8273eaa0726 ui: inline _writenobuf() into write() due to performance issue
Yuya Nishihara <yuya@tcha.org>
parents: 41306
diff changeset
  1270
        # opencode timeblockedsection because this is a critical path
e8273eaa0726 ui: inline _writenobuf() into write() due to performance issue
Yuya Nishihara <yuya@tcha.org>
parents: 41306
diff changeset
  1271
        starttime = util.timer()
e8273eaa0726 ui: inline _writenobuf() into write() due to performance issue
Yuya Nishihara <yuya@tcha.org>
parents: 41306
diff changeset
  1272
        try:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1273
            if self._colormode == b'win32':
41307
e8273eaa0726 ui: inline _writenobuf() into write() due to performance issue
Yuya Nishihara <yuya@tcha.org>
parents: 41306
diff changeset
  1274
                # windows color printing is its own can of crab, defer to
e8273eaa0726 ui: inline _writenobuf() into write() due to performance issue
Yuya Nishihara <yuya@tcha.org>
parents: 41306
diff changeset
  1275
                # the color module and that is it.
e8273eaa0726 ui: inline _writenobuf() into write() due to performance issue
Yuya Nishihara <yuya@tcha.org>
parents: 41306
diff changeset
  1276
                color.win32print(self, dest.write, msg, **opts)
e8273eaa0726 ui: inline _writenobuf() into write() due to performance issue
Yuya Nishihara <yuya@tcha.org>
parents: 41306
diff changeset
  1277
            else:
e8273eaa0726 ui: inline _writenobuf() into write() due to performance issue
Yuya Nishihara <yuya@tcha.org>
parents: 41306
diff changeset
  1278
                if self._colormode is not None:
43506
9f70512ae2cf cleanup: remove pointless r-prefixes on single-quoted strings
Augie Fackler <augie@google.com>
parents: 43377
diff changeset
  1279
                    label = opts.get('label', b'')
41307
e8273eaa0726 ui: inline _writenobuf() into write() due to performance issue
Yuya Nishihara <yuya@tcha.org>
parents: 41306
diff changeset
  1280
                    msg = self.label(msg, label)
e8273eaa0726 ui: inline _writenobuf() into write() due to performance issue
Yuya Nishihara <yuya@tcha.org>
parents: 41306
diff changeset
  1281
                dest.write(msg)
e8273eaa0726 ui: inline _writenobuf() into write() due to performance issue
Yuya Nishihara <yuya@tcha.org>
parents: 41306
diff changeset
  1282
        except IOError as err:
e8273eaa0726 ui: inline _writenobuf() into write() due to performance issue
Yuya Nishihara <yuya@tcha.org>
parents: 41306
diff changeset
  1283
            raise error.StdioError(err)
e8273eaa0726 ui: inline _writenobuf() into write() due to performance issue
Yuya Nishihara <yuya@tcha.org>
parents: 41306
diff changeset
  1284
        finally:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1285
            self._blockedtimes[b'stdio_blocked'] += (
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42672
diff changeset
  1286
                util.timer() - starttime
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42672
diff changeset
  1287
            ) * 1000
40541
c2aea007130b ui: add inner function to select write destination
Yuya Nishihara <yuya@tcha.org>
parents: 40540
diff changeset
  1288
49795
f1e820cda2f5 typing: add type hints related to message output in mercurial/ui.py
Matt Harbison <matt_harbison@yahoo.com>
parents: 49794
diff changeset
  1289
    def write_err(self, *args: bytes, **opts: _MsgOpts) -> None:
40543
7bffbbe03e90 ui: hide fin/fout/ferr attributes behind @property functions
Yuya Nishihara <yuya@tcha.org>
parents: 40542
diff changeset
  1290
        self._write(self._ferr, *args, **opts)
40541
c2aea007130b ui: add inner function to select write destination
Yuya Nishihara <yuya@tcha.org>
parents: 40540
diff changeset
  1291
49795
f1e820cda2f5 typing: add type hints related to message output in mercurial/ui.py
Matt Harbison <matt_harbison@yahoo.com>
parents: 49794
diff changeset
  1292
    def _write(self, dest, *args: bytes, **opts: _MsgOpts) -> None:
41306
b4a3abdc790d ui: inline _write() into write() due to performance issue
Yuya Nishihara <yuya@tcha.org>
parents: 41305
diff changeset
  1293
        # update write() as well if you touch this code
40541
c2aea007130b ui: add inner function to select write destination
Yuya Nishihara <yuya@tcha.org>
parents: 40540
diff changeset
  1294
        if self._isbuffered(dest):
43506
9f70512ae2cf cleanup: remove pointless r-prefixes on single-quoted strings
Augie Fackler <augie@google.com>
parents: 43377
diff changeset
  1295
            label = opts.get('label', b'')
41305
ff927ecb12f9 ui: optimize buffered write with no label
Yuya Nishihara <yuya@tcha.org>
parents: 41285
diff changeset
  1296
            if label and self._bufferapplylabels:
31091
ad074f900907 color: move 'write' logic to the core ui class
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 31090
diff changeset
  1297
                self._buffers[-1].extend(self.label(a, label) for a in args)
ad074f900907 color: move 'write' logic to the core ui class
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 31090
diff changeset
  1298
            else:
ad074f900907 color: move 'write' logic to the core ui class
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 31090
diff changeset
  1299
                self._buffers[-1].extend(args)
35957
b62c4154bb28 ui: add explicit path to write prompt text bypassing buffers
Yuya Nishihara <yuya@tcha.org>
parents: 35956
diff changeset
  1300
        else:
40541
c2aea007130b ui: add inner function to select write destination
Yuya Nishihara <yuya@tcha.org>
parents: 40540
diff changeset
  1301
            self._writenobuf(dest, *args, **opts)
35957
b62c4154bb28 ui: add explicit path to write prompt text bypassing buffers
Yuya Nishihara <yuya@tcha.org>
parents: 35956
diff changeset
  1302
49795
f1e820cda2f5 typing: add type hints related to message output in mercurial/ui.py
Matt Harbison <matt_harbison@yahoo.com>
parents: 49794
diff changeset
  1303
    def _writenobuf(self, dest, *args: bytes, **opts: _MsgOpts) -> None:
41307
e8273eaa0726 ui: inline _writenobuf() into write() due to performance issue
Yuya Nishihara <yuya@tcha.org>
parents: 41306
diff changeset
  1304
        # update write() as well if you touch this code
43506
9f70512ae2cf cleanup: remove pointless r-prefixes on single-quoted strings
Augie Fackler <augie@google.com>
parents: 43377
diff changeset
  1305
        if not opts.get('keepprogressbar', False):
43265
82879e06c926 ui: option to preserve the progress bar
Joerg Sonnenberger <joerg@bec.de>
parents: 43118
diff changeset
  1306
            self._progclear()
40522
51091816a355 ui: simply concatenate messages before applying color labels
Yuya Nishihara <yuya@tcha.org>
parents: 40521
diff changeset
  1307
        msg = b''.join(args)
31090
e9f96ccf36a6 ui: extract the low level part of 'write' in a dedicated function
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 31087
diff changeset
  1308
31128
0bb3089fe735 ui: remove superfluous indent in _write()
Yuya Nishihara <yuya@tcha.org>
parents: 31124
diff changeset
  1309
        # opencode timeblockedsection because this is a critical path
0bb3089fe735 ui: remove superfluous indent in _write()
Yuya Nishihara <yuya@tcha.org>
parents: 31124
diff changeset
  1310
        starttime = util.timer()
0bb3089fe735 ui: remove superfluous indent in _write()
Yuya Nishihara <yuya@tcha.org>
parents: 31124
diff changeset
  1311
        try:
40543
7bffbbe03e90 ui: hide fin/fout/ferr attributes behind @property functions
Yuya Nishihara <yuya@tcha.org>
parents: 40542
diff changeset
  1312
            if dest is self._ferr and not getattr(self._fout, 'closed', False):
7bffbbe03e90 ui: hide fin/fout/ferr attributes behind @property functions
Yuya Nishihara <yuya@tcha.org>
parents: 40542
diff changeset
  1313
                self._fout.flush()
40589
054d0fcba2c4 commandserver: add experimental option to use separate message channel
Yuya Nishihara <yuya@tcha.org>
parents: 40587
diff changeset
  1314
            if getattr(dest, 'structured', False):
054d0fcba2c4 commandserver: add experimental option to use separate message channel
Yuya Nishihara <yuya@tcha.org>
parents: 40587
diff changeset
  1315
                # channel for machine-readable output with metadata, where
054d0fcba2c4 commandserver: add experimental option to use separate message channel
Yuya Nishihara <yuya@tcha.org>
parents: 40587
diff changeset
  1316
                # no extra colorization is necessary.
054d0fcba2c4 commandserver: add experimental option to use separate message channel
Yuya Nishihara <yuya@tcha.org>
parents: 40587
diff changeset
  1317
                dest.write(msg, **opts)
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1318
            elif self._colormode == b'win32':
40523
0c7b2035a604 ui: indent _writenobuf() to prepare moving bits from _write() functions
Yuya Nishihara <yuya@tcha.org>
parents: 40522
diff changeset
  1319
                # windows color printing is its own can of crab, defer to
0c7b2035a604 ui: indent _writenobuf() to prepare moving bits from _write() functions
Yuya Nishihara <yuya@tcha.org>
parents: 40522
diff changeset
  1320
                # the color module and that is it.
40540
06e841e72523 ui: remove _write() and _write_err() functions
Yuya Nishihara <yuya@tcha.org>
parents: 40539
diff changeset
  1321
                color.win32print(self, dest.write, msg, **opts)
40523
0c7b2035a604 ui: indent _writenobuf() to prepare moving bits from _write() functions
Yuya Nishihara <yuya@tcha.org>
parents: 40522
diff changeset
  1322
            else:
0c7b2035a604 ui: indent _writenobuf() to prepare moving bits from _write() functions
Yuya Nishihara <yuya@tcha.org>
parents: 40522
diff changeset
  1323
                if self._colormode is not None:
43506
9f70512ae2cf cleanup: remove pointless r-prefixes on single-quoted strings
Augie Fackler <augie@google.com>
parents: 43377
diff changeset
  1324
                    label = opts.get('label', b'')
40523
0c7b2035a604 ui: indent _writenobuf() to prepare moving bits from _write() functions
Yuya Nishihara <yuya@tcha.org>
parents: 40522
diff changeset
  1325
                    msg = self.label(msg, label)
40540
06e841e72523 ui: remove _write() and _write_err() functions
Yuya Nishihara <yuya@tcha.org>
parents: 40539
diff changeset
  1326
                dest.write(msg)
40539
04a9dd8da959 ui: move pre/post processes from low-level write()s to _writenobuf()
Yuya Nishihara <yuya@tcha.org>
parents: 40538
diff changeset
  1327
            # stderr may be buffered under win32 when redirected to files,
04a9dd8da959 ui: move pre/post processes from low-level write()s to _writenobuf()
Yuya Nishihara <yuya@tcha.org>
parents: 40538
diff changeset
  1328
            # including stdout.
44992
484e04dc7f42 ui: replace `self._ferr` with identical `dest`
Manuel Jacob <me@manueljacob.de>
parents: 44661
diff changeset
  1329
            if dest is self._ferr and not getattr(dest, 'closed', False):
40539
04a9dd8da959 ui: move pre/post processes from low-level write()s to _writenobuf()
Yuya Nishihara <yuya@tcha.org>
parents: 40538
diff changeset
  1330
                dest.flush()
31961
db823e38a61c stdio: raise StdioError if something goes wrong in ui._write
Bryan O'Sullivan <bryano@fb.com>
parents: 31958
diff changeset
  1331
        except IOError as err:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42672
diff changeset
  1332
            if dest is self._ferr and err.errno in (
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42672
diff changeset
  1333
                errno.EPIPE,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42672
diff changeset
  1334
                errno.EIO,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42672
diff changeset
  1335
                errno.EBADF,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42672
diff changeset
  1336
            ):
40539
04a9dd8da959 ui: move pre/post processes from low-level write()s to _writenobuf()
Yuya Nishihara <yuya@tcha.org>
parents: 40538
diff changeset
  1337
                # no way to report the error, so ignore it
04a9dd8da959 ui: move pre/post processes from low-level write()s to _writenobuf()
Yuya Nishihara <yuya@tcha.org>
parents: 40538
diff changeset
  1338
                return
31961
db823e38a61c stdio: raise StdioError if something goes wrong in ui._write
Bryan O'Sullivan <bryano@fb.com>
parents: 31958
diff changeset
  1339
            raise error.StdioError(err)
31128
0bb3089fe735 ui: remove superfluous indent in _write()
Yuya Nishihara <yuya@tcha.org>
parents: 31124
diff changeset
  1340
        finally:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1341
            self._blockedtimes[b'stdio_blocked'] += (
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42672
diff changeset
  1342
                util.timer() - starttime
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42672
diff changeset
  1343
            ) * 1000
565
9a80418646dd [PATCH] Make ui.warn write to stderr
mpm@selenic.com
parents: 515
diff changeset
  1344
49795
f1e820cda2f5 typing: add type hints related to message output in mercurial/ui.py
Matt Harbison <matt_harbison@yahoo.com>
parents: 49794
diff changeset
  1345
    def _writemsg(self, dest, *args: bytes, **opts: _MsgOpts) -> None:
45025
24b1a8eb73aa ui: add option to timestamp status and diagnostic messages
Joerg Sonnenberger <joerg@bec.de>
parents: 44992
diff changeset
  1346
        timestamp = self.showtimestamp and opts.get('type') in {
24b1a8eb73aa ui: add option to timestamp status and diagnostic messages
Joerg Sonnenberger <joerg@bec.de>
parents: 44992
diff changeset
  1347
            b'debug',
24b1a8eb73aa ui: add option to timestamp status and diagnostic messages
Joerg Sonnenberger <joerg@bec.de>
parents: 44992
diff changeset
  1348
            b'error',
24b1a8eb73aa ui: add option to timestamp status and diagnostic messages
Joerg Sonnenberger <joerg@bec.de>
parents: 44992
diff changeset
  1349
            b'note',
24b1a8eb73aa ui: add option to timestamp status and diagnostic messages
Joerg Sonnenberger <joerg@bec.de>
parents: 44992
diff changeset
  1350
            b'status',
24b1a8eb73aa ui: add option to timestamp status and diagnostic messages
Joerg Sonnenberger <joerg@bec.de>
parents: 44992
diff changeset
  1351
            b'warning',
24b1a8eb73aa ui: add option to timestamp status and diagnostic messages
Joerg Sonnenberger <joerg@bec.de>
parents: 44992
diff changeset
  1352
        }
24b1a8eb73aa ui: add option to timestamp status and diagnostic messages
Joerg Sonnenberger <joerg@bec.de>
parents: 44992
diff changeset
  1353
        if timestamp:
24b1a8eb73aa ui: add option to timestamp status and diagnostic messages
Joerg Sonnenberger <joerg@bec.de>
parents: 44992
diff changeset
  1354
            args = (
45033
b4b6ff83ed9c ui: fix Python 2.7 support for ui.timestamp-output
Joerg Sonnenberger <joerg@bec.de>
parents: 45025
diff changeset
  1355
                b'[%s] '
b4b6ff83ed9c ui: fix Python 2.7 support for ui.timestamp-output
Joerg Sonnenberger <joerg@bec.de>
parents: 45025
diff changeset
  1356
                % pycompat.bytestr(datetime.datetime.now().isoformat()),
45025
24b1a8eb73aa ui: add option to timestamp status and diagnostic messages
Joerg Sonnenberger <joerg@bec.de>
parents: 44992
diff changeset
  1357
            ) + args
40590
83dd8c63a0c6 ui: extract helpers to write message with type or label
Yuya Nishihara <yuya@tcha.org>
parents: 40589
diff changeset
  1358
        _writemsgwith(self._write, dest, *args, **opts)
45025
24b1a8eb73aa ui: add option to timestamp status and diagnostic messages
Joerg Sonnenberger <joerg@bec.de>
parents: 44992
diff changeset
  1359
        if timestamp:
24b1a8eb73aa ui: add option to timestamp status and diagnostic messages
Joerg Sonnenberger <joerg@bec.de>
parents: 44992
diff changeset
  1360
            dest.flush()
40590
83dd8c63a0c6 ui: extract helpers to write message with type or label
Yuya Nishihara <yuya@tcha.org>
parents: 40589
diff changeset
  1361
49795
f1e820cda2f5 typing: add type hints related to message output in mercurial/ui.py
Matt Harbison <matt_harbison@yahoo.com>
parents: 49794
diff changeset
  1362
    def _writemsgnobuf(self, dest, *args: bytes, **opts: _MsgOpts) -> None:
40590
83dd8c63a0c6 ui: extract helpers to write message with type or label
Yuya Nishihara <yuya@tcha.org>
parents: 40589
diff changeset
  1363
        _writemsgwith(self._writenobuf, dest, *args, **opts)
83dd8c63a0c6 ui: extract helpers to write message with type or label
Yuya Nishihara <yuya@tcha.org>
parents: 40589
diff changeset
  1364
49795
f1e820cda2f5 typing: add type hints related to message output in mercurial/ui.py
Matt Harbison <matt_harbison@yahoo.com>
parents: 49794
diff changeset
  1365
    def flush(self) -> None:
30978
fdecd24ca4dc ui: log time spent blocked on stdio
Simon Farnsworth <simonfar@fb.com>
parents: 30976
diff changeset
  1366
        # opencode timeblockedsection because this is a critical path
fdecd24ca4dc ui: log time spent blocked on stdio
Simon Farnsworth <simonfar@fb.com>
parents: 30976
diff changeset
  1367
        starttime = util.timer()
fdecd24ca4dc ui: log time spent blocked on stdio
Simon Farnsworth <simonfar@fb.com>
parents: 30976
diff changeset
  1368
        try:
31963
1bfb9a63b98e stdio: raise StdioError if something goes wrong in ui.flush
Bryan O'Sullivan <bryano@fb.com>
parents: 31962
diff changeset
  1369
            try:
40543
7bffbbe03e90 ui: hide fin/fout/ferr attributes behind @property functions
Yuya Nishihara <yuya@tcha.org>
parents: 40542
diff changeset
  1370
                self._fout.flush()
31963
1bfb9a63b98e stdio: raise StdioError if something goes wrong in ui.flush
Bryan O'Sullivan <bryano@fb.com>
parents: 31962
diff changeset
  1371
            except IOError as err:
33755
cde4cfeb6e3e ui: restore behavior to ignore some I/O errors (issue5658)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33627
diff changeset
  1372
                if err.errno not in (errno.EPIPE, errno.EIO, errno.EBADF):
cde4cfeb6e3e ui: restore behavior to ignore some I/O errors (issue5658)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33627
diff changeset
  1373
                    raise error.StdioError(err)
31963
1bfb9a63b98e stdio: raise StdioError if something goes wrong in ui.flush
Bryan O'Sullivan <bryano@fb.com>
parents: 31962
diff changeset
  1374
            finally:
1bfb9a63b98e stdio: raise StdioError if something goes wrong in ui.flush
Bryan O'Sullivan <bryano@fb.com>
parents: 31962
diff changeset
  1375
                try:
40543
7bffbbe03e90 ui: hide fin/fout/ferr attributes behind @property functions
Yuya Nishihara <yuya@tcha.org>
parents: 40542
diff changeset
  1376
                    self._ferr.flush()
31963
1bfb9a63b98e stdio: raise StdioError if something goes wrong in ui.flush
Bryan O'Sullivan <bryano@fb.com>
parents: 31962
diff changeset
  1377
                except IOError as err:
33755
cde4cfeb6e3e ui: restore behavior to ignore some I/O errors (issue5658)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33627
diff changeset
  1378
                    if err.errno not in (errno.EPIPE, errno.EIO, errno.EBADF):
cde4cfeb6e3e ui: restore behavior to ignore some I/O errors (issue5658)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33627
diff changeset
  1379
                        raise error.StdioError(err)
30978
fdecd24ca4dc ui: log time spent blocked on stdio
Simon Farnsworth <simonfar@fb.com>
parents: 30976
diff changeset
  1380
        finally:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1381
            self._blockedtimes[b'stdio_blocked'] += (
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42672
diff changeset
  1382
                util.timer() - starttime
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42672
diff changeset
  1383
            ) * 1000
1837
6f67a4c93493 make ui flush output. this makes error happen if printing to /dev/full.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 1637
diff changeset
  1384
49797
0449fb7729d7 typing: add trivial type hints to mercurial/ui.py
Matt Harbison <matt_harbison@yahoo.com>
parents: 49795
diff changeset
  1385
    def _isatty(self, fh) -> bool:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1386
        if self.configbool(b'ui', b'nontty'):
16751
2d432a1fc0db ui: add _isatty method to easily disable cooked I/O
Matt Mackall <mpm@selenic.com>
parents: 16703
diff changeset
  1387
            return False
37120
a8a902d7176e procutil: bulk-replace function calls to point to new module
Yuya Nishihara <yuya@tcha.org>
parents: 37119
diff changeset
  1388
        return procutil.isatty(fh)
1837
6f67a4c93493 make ui flush output. this makes error happen if printing to /dev/full.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 1637
diff changeset
  1389
41285
cf8677cd7286 ui: proxy protect/restorestdio() calls to update internal flag
Yuya Nishihara <yuya@tcha.org>
parents: 41284
diff changeset
  1390
    def protectfinout(self):
cf8677cd7286 ui: proxy protect/restorestdio() calls to update internal flag
Yuya Nishihara <yuya@tcha.org>
parents: 41284
diff changeset
  1391
        """Duplicate ui streams and redirect original if they are stdio
cf8677cd7286 ui: proxy protect/restorestdio() calls to update internal flag
Yuya Nishihara <yuya@tcha.org>
parents: 41284
diff changeset
  1392
cf8677cd7286 ui: proxy protect/restorestdio() calls to update internal flag
Yuya Nishihara <yuya@tcha.org>
parents: 41284
diff changeset
  1393
        Returns (fin, fout) which point to the original ui fds, but may be
cf8677cd7286 ui: proxy protect/restorestdio() calls to update internal flag
Yuya Nishihara <yuya@tcha.org>
parents: 41284
diff changeset
  1394
        copy of them. The returned streams can be considered "owned" in that
cf8677cd7286 ui: proxy protect/restorestdio() calls to update internal flag
Yuya Nishihara <yuya@tcha.org>
parents: 41284
diff changeset
  1395
        print(), exec(), etc. never reach to them.
cf8677cd7286 ui: proxy protect/restorestdio() calls to update internal flag
Yuya Nishihara <yuya@tcha.org>
parents: 41284
diff changeset
  1396
        """
cf8677cd7286 ui: proxy protect/restorestdio() calls to update internal flag
Yuya Nishihara <yuya@tcha.org>
parents: 41284
diff changeset
  1397
        if self._finoutredirected:
cf8677cd7286 ui: proxy protect/restorestdio() calls to update internal flag
Yuya Nishihara <yuya@tcha.org>
parents: 41284
diff changeset
  1398
            # if already redirected, protectstdio() would just create another
cf8677cd7286 ui: proxy protect/restorestdio() calls to update internal flag
Yuya Nishihara <yuya@tcha.org>
parents: 41284
diff changeset
  1399
            # nullfd pair, which is equivalent to returning self._fin/_fout.
cf8677cd7286 ui: proxy protect/restorestdio() calls to update internal flag
Yuya Nishihara <yuya@tcha.org>
parents: 41284
diff changeset
  1400
            return self._fin, self._fout
cf8677cd7286 ui: proxy protect/restorestdio() calls to update internal flag
Yuya Nishihara <yuya@tcha.org>
parents: 41284
diff changeset
  1401
        fin, fout = procutil.protectstdio(self._fin, self._fout)
cf8677cd7286 ui: proxy protect/restorestdio() calls to update internal flag
Yuya Nishihara <yuya@tcha.org>
parents: 41284
diff changeset
  1402
        self._finoutredirected = (fin, fout) != (self._fin, self._fout)
cf8677cd7286 ui: proxy protect/restorestdio() calls to update internal flag
Yuya Nishihara <yuya@tcha.org>
parents: 41284
diff changeset
  1403
        return fin, fout
cf8677cd7286 ui: proxy protect/restorestdio() calls to update internal flag
Yuya Nishihara <yuya@tcha.org>
parents: 41284
diff changeset
  1404
cf8677cd7286 ui: proxy protect/restorestdio() calls to update internal flag
Yuya Nishihara <yuya@tcha.org>
parents: 41284
diff changeset
  1405
    def restorefinout(self, fin, fout):
cf8677cd7286 ui: proxy protect/restorestdio() calls to update internal flag
Yuya Nishihara <yuya@tcha.org>
parents: 41284
diff changeset
  1406
        """Restore ui streams from possibly duplicated (fin, fout)"""
cf8677cd7286 ui: proxy protect/restorestdio() calls to update internal flag
Yuya Nishihara <yuya@tcha.org>
parents: 41284
diff changeset
  1407
        if (fin, fout) == (self._fin, self._fout):
cf8677cd7286 ui: proxy protect/restorestdio() calls to update internal flag
Yuya Nishihara <yuya@tcha.org>
parents: 41284
diff changeset
  1408
            return
cf8677cd7286 ui: proxy protect/restorestdio() calls to update internal flag
Yuya Nishihara <yuya@tcha.org>
parents: 41284
diff changeset
  1409
        procutil.restorestdio(self._fin, self._fout, fin, fout)
cf8677cd7286 ui: proxy protect/restorestdio() calls to update internal flag
Yuya Nishihara <yuya@tcha.org>
parents: 41284
diff changeset
  1410
        # protectfinout() won't create more than one duplicated streams,
cf8677cd7286 ui: proxy protect/restorestdio() calls to update internal flag
Yuya Nishihara <yuya@tcha.org>
parents: 41284
diff changeset
  1411
        # so we can just turn the redirection flag off.
cf8677cd7286 ui: proxy protect/restorestdio() calls to update internal flag
Yuya Nishihara <yuya@tcha.org>
parents: 41284
diff changeset
  1412
        self._finoutredirected = False
cf8677cd7286 ui: proxy protect/restorestdio() calls to update internal flag
Yuya Nishihara <yuya@tcha.org>
parents: 41284
diff changeset
  1413
41284
b0e3f2d7c143 ui: move protectedstdio() context manager from procutil
Yuya Nishihara <yuya@tcha.org>
parents: 41225
diff changeset
  1414
    @contextlib.contextmanager
b0e3f2d7c143 ui: move protectedstdio() context manager from procutil
Yuya Nishihara <yuya@tcha.org>
parents: 41225
diff changeset
  1415
    def protectedfinout(self):
b0e3f2d7c143 ui: move protectedstdio() context manager from procutil
Yuya Nishihara <yuya@tcha.org>
parents: 41225
diff changeset
  1416
        """Run code block with protected standard streams"""
41285
cf8677cd7286 ui: proxy protect/restorestdio() calls to update internal flag
Yuya Nishihara <yuya@tcha.org>
parents: 41284
diff changeset
  1417
        fin, fout = self.protectfinout()
41284
b0e3f2d7c143 ui: move protectedstdio() context manager from procutil
Yuya Nishihara <yuya@tcha.org>
parents: 41225
diff changeset
  1418
        try:
b0e3f2d7c143 ui: move protectedstdio() context manager from procutil
Yuya Nishihara <yuya@tcha.org>
parents: 41225
diff changeset
  1419
            yield fin, fout
b0e3f2d7c143 ui: move protectedstdio() context manager from procutil
Yuya Nishihara <yuya@tcha.org>
parents: 41225
diff changeset
  1420
        finally:
41285
cf8677cd7286 ui: proxy protect/restorestdio() calls to update internal flag
Yuya Nishihara <yuya@tcha.org>
parents: 41284
diff changeset
  1421
            self.restorefinout(fin, fout)
41284
b0e3f2d7c143 ui: move protectedstdio() context manager from procutil
Yuya Nishihara <yuya@tcha.org>
parents: 41225
diff changeset
  1422
49797
0449fb7729d7 typing: add trivial type hints to mercurial/ui.py
Matt Harbison <matt_harbison@yahoo.com>
parents: 49795
diff changeset
  1423
    def disablepager(self) -> None:
31026
9c827087df38 ui: rename neverpager to disablepager
Augie Fackler <augie@google.com>
parents: 31014
diff changeset
  1424
        self._disablepager = True
30994
3ed6e43998df ui: introduce neverpager() call
Augie Fackler <augie@google.com>
parents: 30992
diff changeset
  1425
49797
0449fb7729d7 typing: add trivial type hints to mercurial/ui.py
Matt Harbison <matt_harbison@yahoo.com>
parents: 49795
diff changeset
  1426
    def pager(self, command: bytes) -> None:
30992
61b4122019d3 pager: move pager-initiating code into core
Augie Fackler <augie@google.com>
parents: 30980
diff changeset
  1427
        """Start a pager for subsequent command output.
61b4122019d3 pager: move pager-initiating code into core
Augie Fackler <augie@google.com>
parents: 30980
diff changeset
  1428
61b4122019d3 pager: move pager-initiating code into core
Augie Fackler <augie@google.com>
parents: 30980
diff changeset
  1429
        Commands which produce a long stream of output should call
61b4122019d3 pager: move pager-initiating code into core
Augie Fackler <augie@google.com>
parents: 30980
diff changeset
  1430
        this function to activate the user's preferred pagination
61b4122019d3 pager: move pager-initiating code into core
Augie Fackler <augie@google.com>
parents: 30980
diff changeset
  1431
        mechanism (which may be no pager). Calling this function
61b4122019d3 pager: move pager-initiating code into core
Augie Fackler <augie@google.com>
parents: 30980
diff changeset
  1432
        precludes any future use of interactive functionality, such as
61b4122019d3 pager: move pager-initiating code into core
Augie Fackler <augie@google.com>
parents: 30980
diff changeset
  1433
        prompting the user or activating curses.
61b4122019d3 pager: move pager-initiating code into core
Augie Fackler <augie@google.com>
parents: 30980
diff changeset
  1434
61b4122019d3 pager: move pager-initiating code into core
Augie Fackler <augie@google.com>
parents: 30980
diff changeset
  1435
        Args:
61b4122019d3 pager: move pager-initiating code into core
Augie Fackler <augie@google.com>
parents: 30980
diff changeset
  1436
          command: The full, non-aliased name of the command. That is, "log"
61b4122019d3 pager: move pager-initiating code into core
Augie Fackler <augie@google.com>
parents: 30980
diff changeset
  1437
                   not "history, "summary" not "summ", etc.
61b4122019d3 pager: move pager-initiating code into core
Augie Fackler <augie@google.com>
parents: 30980
diff changeset
  1438
        """
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42672
diff changeset
  1439
        if self._disablepager or self.pageractive:
33620
cc047a733f69 ui: enable pager always for explicit --pager=on (issue5580)
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 33585
diff changeset
  1440
            # how pager should do is already determined
cc047a733f69 ui: enable pager always for explicit --pager=on (issue5580)
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 33585
diff changeset
  1441
            return
cc047a733f69 ui: enable pager always for explicit --pager=on (issue5580)
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 33585
diff changeset
  1442
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1443
        if not command.startswith(b'internal-always-') and (
33620
cc047a733f69 ui: enable pager always for explicit --pager=on (issue5580)
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 33585
diff changeset
  1444
            # explicit --pager=on (= 'internal-always-' prefix) should
cc047a733f69 ui: enable pager always for explicit --pager=on (issue5580)
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 33585
diff changeset
  1445
            # take precedence over disabling factors below
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1446
            command in self.configlist(b'pager', b'ignore')
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1447
            or not self.configbool(b'ui', b'paginate')
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1448
            or not self.configbool(b'pager', b'attend-' + command, True)
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1449
            or encoding.environ.get(b'TERM') == b'dumb'
30992
61b4122019d3 pager: move pager-initiating code into core
Augie Fackler <augie@google.com>
parents: 30980
diff changeset
  1450
            # TODO: if we want to allow HGPLAINEXCEPT=pager,
61b4122019d3 pager: move pager-initiating code into core
Augie Fackler <augie@google.com>
parents: 30980
diff changeset
  1451
            # formatted() will need some adjustment.
61b4122019d3 pager: move pager-initiating code into core
Augie Fackler <augie@google.com>
parents: 30980
diff changeset
  1452
            or not self.formatted()
61b4122019d3 pager: move pager-initiating code into core
Augie Fackler <augie@google.com>
parents: 30980
diff changeset
  1453
            or self.plain()
34021
31a2eb0f74e5 pager: do not start pager if `ui` has been `pushbuffer`-ed
Jun Wu <quark@fb.com>
parents: 33865
diff changeset
  1454
            or self._buffers
30992
61b4122019d3 pager: move pager-initiating code into core
Augie Fackler <augie@google.com>
parents: 30980
diff changeset
  1455
            # TODO: expose debugger-enabled on the UI object
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1456
            or b'--debugger' in pycompat.sysargv
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42672
diff changeset
  1457
        ):
30992
61b4122019d3 pager: move pager-initiating code into core
Augie Fackler <augie@google.com>
parents: 30980
diff changeset
  1458
            # We only want to paginate if the ui appears to be
61b4122019d3 pager: move pager-initiating code into core
Augie Fackler <augie@google.com>
parents: 30980
diff changeset
  1459
            # interactive, the user didn't say HGPLAIN or
61b4122019d3 pager: move pager-initiating code into core
Augie Fackler <augie@google.com>
parents: 30980
diff changeset
  1460
            # HGPLAINEXCEPT=pager, and the user didn't specify --debug.
61b4122019d3 pager: move pager-initiating code into core
Augie Fackler <augie@google.com>
parents: 30980
diff changeset
  1461
            return
61b4122019d3 pager: move pager-initiating code into core
Augie Fackler <augie@google.com>
parents: 30980
diff changeset
  1462
49075
7afa96d3b484 windows: disable pager when packaged with py2exe
Matt Harbison <matt_harbison@yahoo.com>
parents: 48946
diff changeset
  1463
        # py2exe doesn't appear to be able to use legacy I/O, and nothing is
7afa96d3b484 windows: disable pager when packaged with py2exe
Matt Harbison <matt_harbison@yahoo.com>
parents: 48946
diff changeset
  1464
        # output to the pager for paged commands.  Piping to `more` in cmd.exe
7afa96d3b484 windows: disable pager when packaged with py2exe
Matt Harbison <matt_harbison@yahoo.com>
parents: 48946
diff changeset
  1465
        # works, but is easy to forget.  Just disable pager for py2exe, but
7afa96d3b484 windows: disable pager when packaged with py2exe
Matt Harbison <matt_harbison@yahoo.com>
parents: 48946
diff changeset
  1466
        # leave it working for pyoxidizer and exewrapper builds.
7afa96d3b484 windows: disable pager when packaged with py2exe
Matt Harbison <matt_harbison@yahoo.com>
parents: 48946
diff changeset
  1467
        if pycompat.iswindows and getattr(sys, "frozen", None) == "console_exe":
7afa96d3b484 windows: disable pager when packaged with py2exe
Matt Harbison <matt_harbison@yahoo.com>
parents: 48946
diff changeset
  1468
            self.debug(b"pager is unavailable with py2exe packaging\n")
7afa96d3b484 windows: disable pager when packaged with py2exe
Matt Harbison <matt_harbison@yahoo.com>
parents: 48946
diff changeset
  1469
            return
7afa96d3b484 windows: disable pager when packaged with py2exe
Matt Harbison <matt_harbison@yahoo.com>
parents: 48946
diff changeset
  1470
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1471
        pagercmd = self.config(b'pager', b'pager', rcutil.fallbackpager)
31079
873ebdd6e84d pager: do not try to run an empty pager command
Yuya Nishihara <yuya@tcha.org>
parents: 31062
diff changeset
  1472
        if not pagercmd:
873ebdd6e84d pager: do not try to run an empty pager command
Yuya Nishihara <yuya@tcha.org>
parents: 31062
diff changeset
  1473
            return
873ebdd6e84d pager: do not try to run an empty pager command
Yuya Nishihara <yuya@tcha.org>
parents: 31062
diff changeset
  1474
31954
e518192d6bac pager: set some environment variables if they're not set
Jun Wu <quark@fb.com>
parents: 31778
diff changeset
  1475
        pagerenv = {}
e518192d6bac pager: set some environment variables if they're not set
Jun Wu <quark@fb.com>
parents: 31778
diff changeset
  1476
        for name, value in rcutil.defaultpagerenv().items():
e518192d6bac pager: set some environment variables if they're not set
Jun Wu <quark@fb.com>
parents: 31778
diff changeset
  1477
            if name not in encoding.environ:
e518192d6bac pager: set some environment variables if they're not set
Jun Wu <quark@fb.com>
parents: 31778
diff changeset
  1478
                pagerenv[name] = value
e518192d6bac pager: set some environment variables if they're not set
Jun Wu <quark@fb.com>
parents: 31778
diff changeset
  1479
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42672
diff changeset
  1480
        self.debug(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1481
            b'starting pager for command %s\n' % stringutil.pprint(command)
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42672
diff changeset
  1482
        )
31490
8122cc5cb543 pager: flush outputs before firing pager process
Yuya Nishihara <yuya@tcha.org>
parents: 31481
diff changeset
  1483
        self.flush()
31690
2d11d278279a ui: defer setting pager related properties until the pager has spawned
Matt Harbison <matt_harbison@yahoo.com>
parents: 31688
diff changeset
  1484
2d11d278279a ui: defer setting pager related properties until the pager has spawned
Matt Harbison <matt_harbison@yahoo.com>
parents: 31688
diff changeset
  1485
        wasformatted = self.formatted()
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1486
        if util.safehasattr(signal, b"SIGPIPE"):
30992
61b4122019d3 pager: move pager-initiating code into core
Augie Fackler <augie@google.com>
parents: 30980
diff changeset
  1487
            signal.signal(signal.SIGPIPE, _catchterm)
31954
e518192d6bac pager: set some environment variables if they're not set
Jun Wu <quark@fb.com>
parents: 31778
diff changeset
  1488
        if self._runpager(pagercmd, pagerenv):
31690
2d11d278279a ui: defer setting pager related properties until the pager has spawned
Matt Harbison <matt_harbison@yahoo.com>
parents: 31688
diff changeset
  1489
            self.pageractive = True
2d11d278279a ui: defer setting pager related properties until the pager has spawned
Matt Harbison <matt_harbison@yahoo.com>
parents: 31688
diff changeset
  1490
            # Preserve the formatted-ness of the UI. This is important
2d11d278279a ui: defer setting pager related properties until the pager has spawned
Matt Harbison <matt_harbison@yahoo.com>
parents: 31688
diff changeset
  1491
            # because we mess with stdout, which might confuse
2d11d278279a ui: defer setting pager related properties until the pager has spawned
Matt Harbison <matt_harbison@yahoo.com>
parents: 31688
diff changeset
  1492
            # auto-detection of things being formatted.
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1493
            self.setconfig(b'ui', b'formatted', wasformatted, b'pager')
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1494
            self.setconfig(b'ui', b'interactive', False, b'pager')
31691
c3ca0ad8ab9c ui: rerun color.setup() once the pager has spawned to honor 'color.pagermode'
Matt Harbison <matt_harbison@yahoo.com>
parents: 31690
diff changeset
  1495
c3ca0ad8ab9c ui: rerun color.setup() once the pager has spawned to honor 'color.pagermode'
Matt Harbison <matt_harbison@yahoo.com>
parents: 31690
diff changeset
  1496
            # If pagermode differs from color.mode, reconfigure color now that
c3ca0ad8ab9c ui: rerun color.setup() once the pager has spawned to honor 'color.pagermode'
Matt Harbison <matt_harbison@yahoo.com>
parents: 31690
diff changeset
  1497
            # pageractive is set.
c3ca0ad8ab9c ui: rerun color.setup() once the pager has spawned to honor 'color.pagermode'
Matt Harbison <matt_harbison@yahoo.com>
parents: 31690
diff changeset
  1498
            cm = self._colormode
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1499
            if cm != self.config(b'color', b'pagermode', cm):
31691
c3ca0ad8ab9c ui: rerun color.setup() once the pager has spawned to honor 'color.pagermode'
Matt Harbison <matt_harbison@yahoo.com>
parents: 31690
diff changeset
  1500
                color.setup(self)
31690
2d11d278279a ui: defer setting pager related properties until the pager has spawned
Matt Harbison <matt_harbison@yahoo.com>
parents: 31688
diff changeset
  1501
        else:
2d11d278279a ui: defer setting pager related properties until the pager has spawned
Matt Harbison <matt_harbison@yahoo.com>
parents: 31688
diff changeset
  1502
            # If the pager can't be spawned in dispatch when --pager=on is
2d11d278279a ui: defer setting pager related properties until the pager has spawned
Matt Harbison <matt_harbison@yahoo.com>
parents: 31688
diff changeset
  1503
            # given, don't try again when the command runs, to avoid a duplicate
2d11d278279a ui: defer setting pager related properties until the pager has spawned
Matt Harbison <matt_harbison@yahoo.com>
parents: 31688
diff changeset
  1504
            # warning about a missing pager command.
2d11d278279a ui: defer setting pager related properties until the pager has spawned
Matt Harbison <matt_harbison@yahoo.com>
parents: 31688
diff changeset
  1505
            self.disablepager()
30992
61b4122019d3 pager: move pager-initiating code into core
Augie Fackler <augie@google.com>
parents: 30980
diff changeset
  1506
49797
0449fb7729d7 typing: add trivial type hints to mercurial/ui.py
Matt Harbison <matt_harbison@yahoo.com>
parents: 49795
diff changeset
  1507
    def _runpager(self, command: bytes, env=None) -> bool:
30992
61b4122019d3 pager: move pager-initiating code into core
Augie Fackler <augie@google.com>
parents: 30980
diff changeset
  1508
        """Actually start the pager and set up file descriptors.
61b4122019d3 pager: move pager-initiating code into core
Augie Fackler <augie@google.com>
parents: 30980
diff changeset
  1509
61b4122019d3 pager: move pager-initiating code into core
Augie Fackler <augie@google.com>
parents: 30980
diff changeset
  1510
        This is separate in part so that extensions (like chg) can
61b4122019d3 pager: move pager-initiating code into core
Augie Fackler <augie@google.com>
parents: 30980
diff changeset
  1511
        override how a pager is invoked.
61b4122019d3 pager: move pager-initiating code into core
Augie Fackler <augie@google.com>
parents: 30980
diff changeset
  1512
        """
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1513
        if command == b'cat':
31479
96929bd6e58d pager: skip running the pager if it's set to 'cat'
Augie Fackler <augie@google.com>
parents: 31478
diff changeset
  1514
            # Save ourselves some work.
31690
2d11d278279a ui: defer setting pager related properties until the pager has spawned
Matt Harbison <matt_harbison@yahoo.com>
parents: 31688
diff changeset
  1515
            return False
31478
9335dc6b2a9c pager: avoid shell=True on subprocess.Popen for better errors (issue5491)
Augie Fackler <augie@google.com>
parents: 31472
diff changeset
  1516
        # If the command doesn't contain any of these characters, we
9335dc6b2a9c pager: avoid shell=True on subprocess.Popen for better errors (issue5491)
Augie Fackler <augie@google.com>
parents: 31472
diff changeset
  1517
        # assume it's a binary and exec it directly. This means for
9335dc6b2a9c pager: avoid shell=True on subprocess.Popen for better errors (issue5491)
Augie Fackler <augie@google.com>
parents: 31472
diff changeset
  1518
        # simple pager command configurations, we can degrade
9335dc6b2a9c pager: avoid shell=True on subprocess.Popen for better errors (issue5491)
Augie Fackler <augie@google.com>
parents: 31472
diff changeset
  1519
        # gracefully and tell the user about their broken pager.
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1520
        shell = any(c in command for c in b"|&;<>()$`\\\"' \t\n*?[#~=%")
31624
c60091fa1426 pager: improve support for various flavors of `more` on Windows
Matt Harbison <matt_harbison@yahoo.com>
parents: 31592
diff changeset
  1521
34645
75979c8d4572 codemod: use pycompat.iswindows
Jun Wu <quark@fb.com>
parents: 34616
diff changeset
  1522
        if pycompat.iswindows and not shell:
31624
c60091fa1426 pager: improve support for various flavors of `more` on Windows
Matt Harbison <matt_harbison@yahoo.com>
parents: 31592
diff changeset
  1523
            # Window's built-in `more` cannot be invoked with shell=False, but
c60091fa1426 pager: improve support for various flavors of `more` on Windows
Matt Harbison <matt_harbison@yahoo.com>
parents: 31592
diff changeset
  1524
            # its `more.com` can.  Hide this implementation detail from the
c60091fa1426 pager: improve support for various flavors of `more` on Windows
Matt Harbison <matt_harbison@yahoo.com>
parents: 31592
diff changeset
  1525
            # user so we can also get sane bad PAGER behavior.  MSYS has
c60091fa1426 pager: improve support for various flavors of `more` on Windows
Matt Harbison <matt_harbison@yahoo.com>
parents: 31592
diff changeset
  1526
            # `more.exe`, so do a cmd.exe style resolution of the executable to
c60091fa1426 pager: improve support for various flavors of `more` on Windows
Matt Harbison <matt_harbison@yahoo.com>
parents: 31592
diff changeset
  1527
            # determine which one to use.
37120
a8a902d7176e procutil: bulk-replace function calls to point to new module
Yuya Nishihara <yuya@tcha.org>
parents: 37119
diff changeset
  1528
            fullcmd = procutil.findexe(command)
31624
c60091fa1426 pager: improve support for various flavors of `more` on Windows
Matt Harbison <matt_harbison@yahoo.com>
parents: 31592
diff changeset
  1529
            if not fullcmd:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42672
diff changeset
  1530
                self.warn(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1531
                    _(b"missing pager command '%s', skipping pager\n") % command
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42672
diff changeset
  1532
                )
31690
2d11d278279a ui: defer setting pager related properties until the pager has spawned
Matt Harbison <matt_harbison@yahoo.com>
parents: 31688
diff changeset
  1533
                return False
31624
c60091fa1426 pager: improve support for various flavors of `more` on Windows
Matt Harbison <matt_harbison@yahoo.com>
parents: 31592
diff changeset
  1534
c60091fa1426 pager: improve support for various flavors of `more` on Windows
Matt Harbison <matt_harbison@yahoo.com>
parents: 31592
diff changeset
  1535
            command = fullcmd
c60091fa1426 pager: improve support for various flavors of `more` on Windows
Matt Harbison <matt_harbison@yahoo.com>
parents: 31592
diff changeset
  1536
31478
9335dc6b2a9c pager: avoid shell=True on subprocess.Popen for better errors (issue5491)
Augie Fackler <augie@google.com>
parents: 31472
diff changeset
  1537
        try:
9335dc6b2a9c pager: avoid shell=True on subprocess.Popen for better errors (issue5491)
Augie Fackler <augie@google.com>
parents: 31472
diff changeset
  1538
            pager = subprocess.Popen(
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42672
diff changeset
  1539
                procutil.tonativestr(command),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42672
diff changeset
  1540
                shell=shell,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42672
diff changeset
  1541
                bufsize=-1,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42672
diff changeset
  1542
                close_fds=procutil.closefds,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42672
diff changeset
  1543
                stdin=subprocess.PIPE,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42672
diff changeset
  1544
                stdout=procutil.stdout,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42672
diff changeset
  1545
                stderr=procutil.stderr,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42672
diff changeset
  1546
                env=procutil.tonativeenv(procutil.shellenviron(env)),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42672
diff changeset
  1547
            )
49306
2e726c934fcd py3: catch FileNotFoundError instead of checking errno == ENOENT
Manuel Jacob <me@manueljacob.de>
parents: 49075
diff changeset
  1548
        except FileNotFoundError:
2e726c934fcd py3: catch FileNotFoundError instead of checking errno == ENOENT
Manuel Jacob <me@manueljacob.de>
parents: 49075
diff changeset
  1549
            if not shell:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42672
diff changeset
  1550
                self.warn(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1551
                    _(b"missing pager command '%s', skipping pager\n") % command
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42672
diff changeset
  1552
                )
31690
2d11d278279a ui: defer setting pager related properties until the pager has spawned
Matt Harbison <matt_harbison@yahoo.com>
parents: 31688
diff changeset
  1553
                return False
31478
9335dc6b2a9c pager: avoid shell=True on subprocess.Popen for better errors (issue5491)
Augie Fackler <augie@google.com>
parents: 31472
diff changeset
  1554
            raise
30992
61b4122019d3 pager: move pager-initiating code into core
Augie Fackler <augie@google.com>
parents: 30980
diff changeset
  1555
61b4122019d3 pager: move pager-initiating code into core
Augie Fackler <augie@google.com>
parents: 30980
diff changeset
  1556
        # back up original file descriptors
37119
d4a2e0d5d042 procutil: bulk-replace util.std* to point to new module
Yuya Nishihara <yuya@tcha.org>
parents: 37084
diff changeset
  1557
        stdoutfd = os.dup(procutil.stdout.fileno())
d4a2e0d5d042 procutil: bulk-replace util.std* to point to new module
Yuya Nishihara <yuya@tcha.org>
parents: 37084
diff changeset
  1558
        stderrfd = os.dup(procutil.stderr.fileno())
30992
61b4122019d3 pager: move pager-initiating code into core
Augie Fackler <augie@google.com>
parents: 30980
diff changeset
  1559
37119
d4a2e0d5d042 procutil: bulk-replace util.std* to point to new module
Yuya Nishihara <yuya@tcha.org>
parents: 37084
diff changeset
  1560
        os.dup2(pager.stdin.fileno(), procutil.stdout.fileno())
d4a2e0d5d042 procutil: bulk-replace util.std* to point to new module
Yuya Nishihara <yuya@tcha.org>
parents: 37084
diff changeset
  1561
        if self._isatty(procutil.stderr):
d4a2e0d5d042 procutil: bulk-replace util.std* to point to new module
Yuya Nishihara <yuya@tcha.org>
parents: 37084
diff changeset
  1562
            os.dup2(pager.stdin.fileno(), procutil.stderr.fileno())
30992
61b4122019d3 pager: move pager-initiating code into core
Augie Fackler <augie@google.com>
parents: 30980
diff changeset
  1563
31958
de5c9d0e02ea atexit: switch to home-grown implementation
Bryan O'Sullivan <bryano@fb.com>
parents: 31956
diff changeset
  1564
        @self.atexit
30992
61b4122019d3 pager: move pager-initiating code into core
Augie Fackler <augie@google.com>
parents: 30980
diff changeset
  1565
        def killpager():
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1566
            if util.safehasattr(signal, b"SIGINT"):
30992
61b4122019d3 pager: move pager-initiating code into core
Augie Fackler <augie@google.com>
parents: 30980
diff changeset
  1567
                signal.signal(signal.SIGINT, signal.SIG_IGN)
61b4122019d3 pager: move pager-initiating code into core
Augie Fackler <augie@google.com>
parents: 30980
diff changeset
  1568
            # restore original fds, closing pager.stdin copies in the process
37119
d4a2e0d5d042 procutil: bulk-replace util.std* to point to new module
Yuya Nishihara <yuya@tcha.org>
parents: 37084
diff changeset
  1569
            os.dup2(stdoutfd, procutil.stdout.fileno())
d4a2e0d5d042 procutil: bulk-replace util.std* to point to new module
Yuya Nishihara <yuya@tcha.org>
parents: 37084
diff changeset
  1570
            os.dup2(stderrfd, procutil.stderr.fileno())
30992
61b4122019d3 pager: move pager-initiating code into core
Augie Fackler <augie@google.com>
parents: 30980
diff changeset
  1571
            pager.stdin.close()
61b4122019d3 pager: move pager-initiating code into core
Augie Fackler <augie@google.com>
parents: 30980
diff changeset
  1572
            pager.wait()
61b4122019d3 pager: move pager-initiating code into core
Augie Fackler <augie@google.com>
parents: 30980
diff changeset
  1573
31690
2d11d278279a ui: defer setting pager related properties until the pager has spawned
Matt Harbison <matt_harbison@yahoo.com>
parents: 31688
diff changeset
  1574
        return True
2d11d278279a ui: defer setting pager related properties until the pager has spawned
Matt Harbison <matt_harbison@yahoo.com>
parents: 31688
diff changeset
  1575
34882
e9f320a40b44 ui: move request exit handlers to global state
Saurabh Singh <singhsrb@fb.com>
parents: 34858
diff changeset
  1576
    @property
e9f320a40b44 ui: move request exit handlers to global state
Saurabh Singh <singhsrb@fb.com>
parents: 34858
diff changeset
  1577
    def _exithandlers(self):
e9f320a40b44 ui: move request exit handlers to global state
Saurabh Singh <singhsrb@fb.com>
parents: 34858
diff changeset
  1578
        return _reqexithandlers
e9f320a40b44 ui: move request exit handlers to global state
Saurabh Singh <singhsrb@fb.com>
parents: 34858
diff changeset
  1579
31956
c13ff31818b0 ui: add special-purpose atexit functionality
Bryan O'Sullivan <bryano@fb.com>
parents: 31954
diff changeset
  1580
    def atexit(self, func, *args, **kwargs):
45942
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 45929
diff changeset
  1581
        """register a function to run after dispatching a request
31956
c13ff31818b0 ui: add special-purpose atexit functionality
Bryan O'Sullivan <bryano@fb.com>
parents: 31954
diff changeset
  1582
45942
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 45929
diff changeset
  1583
        Handlers do not stay registered across request boundaries."""
31956
c13ff31818b0 ui: add special-purpose atexit functionality
Bryan O'Sullivan <bryano@fb.com>
parents: 31954
diff changeset
  1584
        self._exithandlers.append((func, args, kwargs))
c13ff31818b0 ui: add special-purpose atexit functionality
Bryan O'Sullivan <bryano@fb.com>
parents: 31954
diff changeset
  1585
        return func
c13ff31818b0 ui: add special-purpose atexit functionality
Bryan O'Sullivan <bryano@fb.com>
parents: 31954
diff changeset
  1586
49797
0449fb7729d7 typing: add trivial type hints to mercurial/ui.py
Matt Harbison <matt_harbison@yahoo.com>
parents: 49795
diff changeset
  1587
    def interface(self, feature: bytes) -> bytes:
28542
71e12fc53b80 ui: add new config flag for interface selection
Simon Farnsworth <simonfar@fb.com>
parents: 28498
diff changeset
  1588
        """what interface to use for interactive console features?
71e12fc53b80 ui: add new config flag for interface selection
Simon Farnsworth <simonfar@fb.com>
parents: 28498
diff changeset
  1589
71e12fc53b80 ui: add new config flag for interface selection
Simon Farnsworth <simonfar@fb.com>
parents: 28498
diff changeset
  1590
        The interface is controlled by the value of `ui.interface` but also by
71e12fc53b80 ui: add new config flag for interface selection
Simon Farnsworth <simonfar@fb.com>
parents: 28498
diff changeset
  1591
        the value of feature-specific configuration. For example:
71e12fc53b80 ui: add new config flag for interface selection
Simon Farnsworth <simonfar@fb.com>
parents: 28498
diff changeset
  1592
71e12fc53b80 ui: add new config flag for interface selection
Simon Farnsworth <simonfar@fb.com>
parents: 28498
diff changeset
  1593
        ui.interface.histedit = text
71e12fc53b80 ui: add new config flag for interface selection
Simon Farnsworth <simonfar@fb.com>
parents: 28498
diff changeset
  1594
        ui.interface.chunkselector = curses
71e12fc53b80 ui: add new config flag for interface selection
Simon Farnsworth <simonfar@fb.com>
parents: 28498
diff changeset
  1595
71e12fc53b80 ui: add new config flag for interface selection
Simon Farnsworth <simonfar@fb.com>
parents: 28498
diff changeset
  1596
        Here the features are "histedit" and "chunkselector".
71e12fc53b80 ui: add new config flag for interface selection
Simon Farnsworth <simonfar@fb.com>
parents: 28498
diff changeset
  1597
71e12fc53b80 ui: add new config flag for interface selection
Simon Farnsworth <simonfar@fb.com>
parents: 28498
diff changeset
  1598
        The configuration above means that the default interfaces for commands
71e12fc53b80 ui: add new config flag for interface selection
Simon Farnsworth <simonfar@fb.com>
parents: 28498
diff changeset
  1599
        is curses, the interface for histedit is text and the interface for
71e12fc53b80 ui: add new config flag for interface selection
Simon Farnsworth <simonfar@fb.com>
parents: 28498
diff changeset
  1600
        selecting chunk is crecord (the best curses interface available).
71e12fc53b80 ui: add new config flag for interface selection
Simon Farnsworth <simonfar@fb.com>
parents: 28498
diff changeset
  1601
30332
318a24b52eeb spelling: fixes of non-dictionary words
Mads Kiilerich <madski@unity3d.com>
parents: 30314
diff changeset
  1602
        Consider the following example:
28542
71e12fc53b80 ui: add new config flag for interface selection
Simon Farnsworth <simonfar@fb.com>
parents: 28498
diff changeset
  1603
        ui.interface = curses
71e12fc53b80 ui: add new config flag for interface selection
Simon Farnsworth <simonfar@fb.com>
parents: 28498
diff changeset
  1604
        ui.interface.histedit = text
71e12fc53b80 ui: add new config flag for interface selection
Simon Farnsworth <simonfar@fb.com>
parents: 28498
diff changeset
  1605
71e12fc53b80 ui: add new config flag for interface selection
Simon Farnsworth <simonfar@fb.com>
parents: 28498
diff changeset
  1606
        Then histedit will use the text interface and chunkselector will use
71e12fc53b80 ui: add new config flag for interface selection
Simon Farnsworth <simonfar@fb.com>
parents: 28498
diff changeset
  1607
        the default curses interface (crecord at the moment).
71e12fc53b80 ui: add new config flag for interface selection
Simon Farnsworth <simonfar@fb.com>
parents: 28498
diff changeset
  1608
        """
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1609
        alldefaults = frozenset([b"text", b"curses"])
28542
71e12fc53b80 ui: add new config flag for interface selection
Simon Farnsworth <simonfar@fb.com>
parents: 28498
diff changeset
  1610
71e12fc53b80 ui: add new config flag for interface selection
Simon Farnsworth <simonfar@fb.com>
parents: 28498
diff changeset
  1611
        featureinterfaces = {
45942
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 45929
diff changeset
  1612
            b"chunkselector": [
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 45929
diff changeset
  1613
                b"text",
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 45929
diff changeset
  1614
                b"curses",
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 45929
diff changeset
  1615
            ],
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 45929
diff changeset
  1616
            b"histedit": [
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 45929
diff changeset
  1617
                b"text",
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 45929
diff changeset
  1618
                b"curses",
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 45929
diff changeset
  1619
            ],
28542
71e12fc53b80 ui: add new config flag for interface selection
Simon Farnsworth <simonfar@fb.com>
parents: 28498
diff changeset
  1620
        }
71e12fc53b80 ui: add new config flag for interface selection
Simon Farnsworth <simonfar@fb.com>
parents: 28498
diff changeset
  1621
71e12fc53b80 ui: add new config flag for interface selection
Simon Farnsworth <simonfar@fb.com>
parents: 28498
diff changeset
  1622
        # Feature-specific interface
71e12fc53b80 ui: add new config flag for interface selection
Simon Farnsworth <simonfar@fb.com>
parents: 28498
diff changeset
  1623
        if feature not in featureinterfaces.keys():
71e12fc53b80 ui: add new config flag for interface selection
Simon Farnsworth <simonfar@fb.com>
parents: 28498
diff changeset
  1624
            # Programming error, not user error
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1625
            raise ValueError(b"Unknown feature requested %s" % feature)
28542
71e12fc53b80 ui: add new config flag for interface selection
Simon Farnsworth <simonfar@fb.com>
parents: 28498
diff changeset
  1626
71e12fc53b80 ui: add new config flag for interface selection
Simon Farnsworth <simonfar@fb.com>
parents: 28498
diff changeset
  1627
        availableinterfaces = frozenset(featureinterfaces[feature])
71e12fc53b80 ui: add new config flag for interface selection
Simon Farnsworth <simonfar@fb.com>
parents: 28498
diff changeset
  1628
        if alldefaults > availableinterfaces:
71e12fc53b80 ui: add new config flag for interface selection
Simon Farnsworth <simonfar@fb.com>
parents: 28498
diff changeset
  1629
            # Programming error, not user error. We need a use case to
71e12fc53b80 ui: add new config flag for interface selection
Simon Farnsworth <simonfar@fb.com>
parents: 28498
diff changeset
  1630
            # define the right thing to do here.
71e12fc53b80 ui: add new config flag for interface selection
Simon Farnsworth <simonfar@fb.com>
parents: 28498
diff changeset
  1631
            raise ValueError(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1632
                b"Feature %s does not handle all default interfaces" % feature
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42672
diff changeset
  1633
            )
28542
71e12fc53b80 ui: add new config flag for interface selection
Simon Farnsworth <simonfar@fb.com>
parents: 28498
diff changeset
  1634
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1635
        if self.plain() or encoding.environ.get(b'TERM') == b'dumb':
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1636
            return b"text"
28542
71e12fc53b80 ui: add new config flag for interface selection
Simon Farnsworth <simonfar@fb.com>
parents: 28498
diff changeset
  1637
71e12fc53b80 ui: add new config flag for interface selection
Simon Farnsworth <simonfar@fb.com>
parents: 28498
diff changeset
  1638
        # Default interface for all the features
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1639
        defaultinterface = b"text"
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1640
        i = self.config(b"ui", b"interface")
28542
71e12fc53b80 ui: add new config flag for interface selection
Simon Farnsworth <simonfar@fb.com>
parents: 28498
diff changeset
  1641
        if i in alldefaults:
49797
0449fb7729d7 typing: add trivial type hints to mercurial/ui.py
Matt Harbison <matt_harbison@yahoo.com>
parents: 49795
diff changeset
  1642
            defaultinterface = cast(bytes, i)  # cast to help pytype
28542
71e12fc53b80 ui: add new config flag for interface selection
Simon Farnsworth <simonfar@fb.com>
parents: 28498
diff changeset
  1643
49797
0449fb7729d7 typing: add trivial type hints to mercurial/ui.py
Matt Harbison <matt_harbison@yahoo.com>
parents: 49795
diff changeset
  1644
        choseninterface: bytes = defaultinterface
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1645
        f = self.config(b"ui", b"interface.%s" % feature)
28542
71e12fc53b80 ui: add new config flag for interface selection
Simon Farnsworth <simonfar@fb.com>
parents: 28498
diff changeset
  1646
        if f in availableinterfaces:
49797
0449fb7729d7 typing: add trivial type hints to mercurial/ui.py
Matt Harbison <matt_harbison@yahoo.com>
parents: 49795
diff changeset
  1647
            choseninterface = cast(bytes, f)  # cast to help pytype
28542
71e12fc53b80 ui: add new config flag for interface selection
Simon Farnsworth <simonfar@fb.com>
parents: 28498
diff changeset
  1648
71e12fc53b80 ui: add new config flag for interface selection
Simon Farnsworth <simonfar@fb.com>
parents: 28498
diff changeset
  1649
        if i is not None and defaultinterface != i:
71e12fc53b80 ui: add new config flag for interface selection
Simon Farnsworth <simonfar@fb.com>
parents: 28498
diff changeset
  1650
            if f is not None:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1651
                self.warn(_(b"invalid value for ui.interface: %s\n") % (i,))
28542
71e12fc53b80 ui: add new config flag for interface selection
Simon Farnsworth <simonfar@fb.com>
parents: 28498
diff changeset
  1652
            else:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42672
diff changeset
  1653
                self.warn(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1654
                    _(b"invalid value for ui.interface: %s (using %s)\n")
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42672
diff changeset
  1655
                    % (i, choseninterface)
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42672
diff changeset
  1656
                )
28542
71e12fc53b80 ui: add new config flag for interface selection
Simon Farnsworth <simonfar@fb.com>
parents: 28498
diff changeset
  1657
        if f is not None and choseninterface != f:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42672
diff changeset
  1658
            self.warn(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1659
                _(b"invalid value for ui.interface.%s: %s (using %s)\n")
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42672
diff changeset
  1660
                % (feature, f, choseninterface)
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42672
diff changeset
  1661
            )
28542
71e12fc53b80 ui: add new config flag for interface selection
Simon Farnsworth <simonfar@fb.com>
parents: 28498
diff changeset
  1662
71e12fc53b80 ui: add new config flag for interface selection
Simon Farnsworth <simonfar@fb.com>
parents: 28498
diff changeset
  1663
        return choseninterface
71e12fc53b80 ui: add new config flag for interface selection
Simon Farnsworth <simonfar@fb.com>
parents: 28498
diff changeset
  1664
8208
32a2a1e244f1 ui: make interactive a method
Matt Mackall <mpm@selenic.com>
parents: 8206
diff changeset
  1665
    def interactive(self):
45942
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 45929
diff changeset
  1666
        """is interactive input allowed?
11325
22a737306ba5 ui: document the formatted(), interactive() & plain() functions.
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 11324
diff changeset
  1667
22a737306ba5 ui: document the formatted(), interactive() & plain() functions.
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 11324
diff changeset
  1668
        An interactive session is a session where input can be reasonably read
22a737306ba5 ui: document the formatted(), interactive() & plain() functions.
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 11324
diff changeset
  1669
        from `sys.stdin'. If this function returns false, any attempt to read
22a737306ba5 ui: document the formatted(), interactive() & plain() functions.
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 11324
diff changeset
  1670
        from stdin should fail with an error, unless a sensible default has been
22a737306ba5 ui: document the formatted(), interactive() & plain() functions.
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 11324
diff changeset
  1671
        specified.
22a737306ba5 ui: document the formatted(), interactive() & plain() functions.
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 11324
diff changeset
  1672
22a737306ba5 ui: document the formatted(), interactive() & plain() functions.
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 11324
diff changeset
  1673
        Interactiveness is triggered by the value of the `ui.interactive'
22a737306ba5 ui: document the formatted(), interactive() & plain() functions.
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 11324
diff changeset
  1674
        configuration variable or - if it is unset - when `sys.stdin' points
22a737306ba5 ui: document the formatted(), interactive() & plain() functions.
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 11324
diff changeset
  1675
        to a terminal device.
22a737306ba5 ui: document the formatted(), interactive() & plain() functions.
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 11324
diff changeset
  1676
22a737306ba5 ui: document the formatted(), interactive() & plain() functions.
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 11324
diff changeset
  1677
        This function refers to input only; for output, see `ui.formatted()'.
45942
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 45929
diff changeset
  1678
        """
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1679
        i = self.configbool(b"ui", b"interactive")
8538
6419bc7b3d9c ui: honor interactive=off even if isatty()
Patrick Mezard <pmezard@gmail.com>
parents: 8527
diff changeset
  1680
        if i is None:
14515
76f295eaed86 util: add helper function isatty(fd) to check for tty-ness
Idan Kamara <idankk86@gmail.com>
parents: 14373
diff changeset
  1681
            # some environments replace stdin without implementing isatty
76f295eaed86 util: add helper function isatty(fd) to check for tty-ness
Idan Kamara <idankk86@gmail.com>
parents: 14373
diff changeset
  1682
            # usually those are non-interactive
40543
7bffbbe03e90 ui: hide fin/fout/ferr attributes behind @property functions
Yuya Nishihara <yuya@tcha.org>
parents: 40542
diff changeset
  1683
            return self._isatty(self._fin)
10077
89617aacb495 make ui.interactive() return false in case stdin lacks isatty
Ronny Pfannschmidt <Ronny.Pfannschmidt@gmx.de>
parents: 9887
diff changeset
  1684
8538
6419bc7b3d9c ui: honor interactive=off even if isatty()
Patrick Mezard <pmezard@gmail.com>
parents: 8527
diff changeset
  1685
        return i
8208
32a2a1e244f1 ui: make interactive a method
Matt Mackall <mpm@selenic.com>
parents: 8206
diff changeset
  1686
49797
0449fb7729d7 typing: add trivial type hints to mercurial/ui.py
Matt Harbison <matt_harbison@yahoo.com>
parents: 49795
diff changeset
  1687
    def termwidth(self) -> int:
45942
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 45929
diff changeset
  1688
        """how wide is the terminal in columns?"""
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1689
        if b'COLUMNS' in encoding.environ:
12689
c52c629ce19e termwidth: move to ui.ui from util
Augie Fackler <durin42@gmail.com>
parents: 12665
diff changeset
  1690
            try:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1691
                return int(encoding.environ[b'COLUMNS'])
12689
c52c629ce19e termwidth: move to ui.ui from util
Augie Fackler <durin42@gmail.com>
parents: 12665
diff changeset
  1692
            except ValueError:
c52c629ce19e termwidth: move to ui.ui from util
Augie Fackler <durin42@gmail.com>
parents: 12665
diff changeset
  1693
                pass
30314
365812902904 scmutil: extend termwidth() to return terminal height, renamed to termsize()
Yuya Nishihara <yuya@tcha.org>
parents: 30310
diff changeset
  1694
        return scmutil.termsize(self)[0]
12689
c52c629ce19e termwidth: move to ui.ui from util
Augie Fackler <durin42@gmail.com>
parents: 12665
diff changeset
  1695
11324
cdf6d861b207 ui: add ui.formatted configuration variable and accessor function.
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 11311
diff changeset
  1696
    def formatted(self):
45942
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 45929
diff changeset
  1697
        """should formatted output be used?
11325
22a737306ba5 ui: document the formatted(), interactive() & plain() functions.
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 11324
diff changeset
  1698
22a737306ba5 ui: document the formatted(), interactive() & plain() functions.
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 11324
diff changeset
  1699
        It is often desirable to format the output to suite the output medium.
22a737306ba5 ui: document the formatted(), interactive() & plain() functions.
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 11324
diff changeset
  1700
        Examples of this are truncating long lines or colorizing messages.
22a737306ba5 ui: document the formatted(), interactive() & plain() functions.
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 11324
diff changeset
  1701
        However, this is not often not desirable when piping output into other
22a737306ba5 ui: document the formatted(), interactive() & plain() functions.
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 11324
diff changeset
  1702
        utilities, e.g. `grep'.
22a737306ba5 ui: document the formatted(), interactive() & plain() functions.
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 11324
diff changeset
  1703
22a737306ba5 ui: document the formatted(), interactive() & plain() functions.
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 11324
diff changeset
  1704
        Formatted output is triggered by the value of the `ui.formatted'
22a737306ba5 ui: document the formatted(), interactive() & plain() functions.
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 11324
diff changeset
  1705
        configuration variable or - if it is unset - when `sys.stdout' points
22a737306ba5 ui: document the formatted(), interactive() & plain() functions.
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 11324
diff changeset
  1706
        to a terminal device. Please note that `ui.formatted' should be
22a737306ba5 ui: document the formatted(), interactive() & plain() functions.
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 11324
diff changeset
  1707
        considered an implementation detail; it is not intended for use outside
22a737306ba5 ui: document the formatted(), interactive() & plain() functions.
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 11324
diff changeset
  1708
        Mercurial or its extensions.
22a737306ba5 ui: document the formatted(), interactive() & plain() functions.
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 11324
diff changeset
  1709
22a737306ba5 ui: document the formatted(), interactive() & plain() functions.
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 11324
diff changeset
  1710
        This function refers to output only; for input, see `ui.interactive()'.
22a737306ba5 ui: document the formatted(), interactive() & plain() functions.
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 11324
diff changeset
  1711
        This function always returns false when in plain mode, see `ui.plain()'.
45942
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 45929
diff changeset
  1712
        """
11324
cdf6d861b207 ui: add ui.formatted configuration variable and accessor function.
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 11311
diff changeset
  1713
        if self.plain():
cdf6d861b207 ui: add ui.formatted configuration variable and accessor function.
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 11311
diff changeset
  1714
            return False
cdf6d861b207 ui: add ui.formatted configuration variable and accessor function.
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 11311
diff changeset
  1715
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1716
        i = self.configbool(b"ui", b"formatted")
11324
cdf6d861b207 ui: add ui.formatted configuration variable and accessor function.
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 11311
diff changeset
  1717
        if i is None:
14515
76f295eaed86 util: add helper function isatty(fd) to check for tty-ness
Idan Kamara <idankk86@gmail.com>
parents: 14373
diff changeset
  1718
            # some environments replace stdout without implementing isatty
76f295eaed86 util: add helper function isatty(fd) to check for tty-ness
Idan Kamara <idankk86@gmail.com>
parents: 14373
diff changeset
  1719
            # usually those are non-interactive
40543
7bffbbe03e90 ui: hide fin/fout/ferr attributes behind @property functions
Yuya Nishihara <yuya@tcha.org>
parents: 40542
diff changeset
  1720
            return self._isatty(self._fout)
11324
cdf6d861b207 ui: add ui.formatted configuration variable and accessor function.
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 11311
diff changeset
  1721
cdf6d861b207 ui: add ui.formatted configuration variable and accessor function.
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 11311
diff changeset
  1722
        return i
cdf6d861b207 ui: add ui.formatted configuration variable and accessor function.
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 11311
diff changeset
  1723
49795
f1e820cda2f5 typing: add type hints related to message output in mercurial/ui.py
Matt Harbison <matt_harbison@yahoo.com>
parents: 49794
diff changeset
  1724
    def _readline(
f1e820cda2f5 typing: add type hints related to message output in mercurial/ui.py
Matt Harbison <matt_harbison@yahoo.com>
parents: 49794
diff changeset
  1725
        self,
f1e820cda2f5 typing: add type hints related to message output in mercurial/ui.py
Matt Harbison <matt_harbison@yahoo.com>
parents: 49794
diff changeset
  1726
        prompt: bytes = b' ',
f1e820cda2f5 typing: add type hints related to message output in mercurial/ui.py
Matt Harbison <matt_harbison@yahoo.com>
parents: 49794
diff changeset
  1727
        promptopts: Optional[Dict[str, _MsgOpts]] = None,
f1e820cda2f5 typing: add type hints related to message output in mercurial/ui.py
Matt Harbison <matt_harbison@yahoo.com>
parents: 49794
diff changeset
  1728
    ) -> bytes:
36795
9b513888ea23 ui: do not use rawinput() when we have to replace sys.stdin/stdout
Yuya Nishihara <yuya@tcha.org>
parents: 36794
diff changeset
  1729
        # Replacing stdin/stdout temporarily is a hard problem on Python 3
9b513888ea23 ui: do not use rawinput() when we have to replace sys.stdin/stdout
Yuya Nishihara <yuya@tcha.org>
parents: 36794
diff changeset
  1730
        # because they have to be text streams with *no buffering*. Instead,
9b513888ea23 ui: do not use rawinput() when we have to replace sys.stdin/stdout
Yuya Nishihara <yuya@tcha.org>
parents: 36794
diff changeset
  1731
        # we use rawinput() only if call_readline() will be invoked by
9b513888ea23 ui: do not use rawinput() when we have to replace sys.stdin/stdout
Yuya Nishihara <yuya@tcha.org>
parents: 36794
diff changeset
  1732
        # PyOS_Readline(), so no I/O will be made at Python layer.
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42672
diff changeset
  1733
        usereadline = (
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42672
diff changeset
  1734
            self._isatty(self._fin)
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42672
diff changeset
  1735
            and self._isatty(self._fout)
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42672
diff changeset
  1736
            and procutil.isstdin(self._fin)
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42672
diff changeset
  1737
            and procutil.isstdout(self._fout)
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42672
diff changeset
  1738
        )
36794
fa53a1d1f16e ui: do not try readline support if fin/fout aren't standard streams
Yuya Nishihara <yuya@tcha.org>
parents: 36791
diff changeset
  1739
        if usereadline:
5036
ca0d02222d6a ui: get readline and prompt to behave better depending on interactivity
Bryan O'Sullivan <bos@serpentine.com>
parents: 4729
diff changeset
  1740
            try:
ca0d02222d6a ui: get readline and prompt to behave better depending on interactivity
Bryan O'Sullivan <bos@serpentine.com>
parents: 4729
diff changeset
  1741
                # magically add command line editing support, where
ca0d02222d6a ui: get readline and prompt to behave better depending on interactivity
Bryan O'Sullivan <bos@serpentine.com>
parents: 4729
diff changeset
  1742
                # available
ca0d02222d6a ui: get readline and prompt to behave better depending on interactivity
Bryan O'Sullivan <bos@serpentine.com>
parents: 4729
diff changeset
  1743
                import readline
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42672
diff changeset
  1744
5036
ca0d02222d6a ui: get readline and prompt to behave better depending on interactivity
Bryan O'Sullivan <bos@serpentine.com>
parents: 4729
diff changeset
  1745
                # force demandimport to really load the module
ca0d02222d6a ui: get readline and prompt to behave better depending on interactivity
Bryan O'Sullivan <bos@serpentine.com>
parents: 4729
diff changeset
  1746
                readline.read_history_file
7496
0a27d0db256d issue1419: catch strange readline import error on windows
Brendan Cully <brendan@kublai.com>
parents: 7320
diff changeset
  1747
                # windows sometimes raises something other than ImportError
0a27d0db256d issue1419: catch strange readline import error on windows
Brendan Cully <brendan@kublai.com>
parents: 7320
diff changeset
  1748
            except Exception:
36794
fa53a1d1f16e ui: do not try readline support if fin/fout aren't standard streams
Yuya Nishihara <yuya@tcha.org>
parents: 36791
diff changeset
  1749
                usereadline = False
14614
afccc64eea73 ui: use I/O descriptors internally
Idan Kamara <idankk86@gmail.com>
parents: 14612
diff changeset
  1750
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1751
        if self._colormode == b'win32' or not usereadline:
42119
2d428b859282 readline: provide styled prompt to readline (issue6070)
Kyle Lippincott <spectral@google.com>
parents: 41999
diff changeset
  1752
            if not promptopts:
2d428b859282 readline: provide styled prompt to readline (issue6070)
Kyle Lippincott <spectral@google.com>
parents: 41999
diff changeset
  1753
                promptopts = {}
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42672
diff changeset
  1754
            self._writemsgnobuf(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1755
                self._fmsgout, prompt, type=b'prompt', **promptopts
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42672
diff changeset
  1756
            )
42119
2d428b859282 readline: provide styled prompt to readline (issue6070)
Kyle Lippincott <spectral@google.com>
parents: 41999
diff changeset
  1757
            self.flush()
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1758
            prompt = b' '
42119
2d428b859282 readline: provide styled prompt to readline (issue6070)
Kyle Lippincott <spectral@google.com>
parents: 41999
diff changeset
  1759
        else:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1760
            prompt = self.label(prompt, b'ui.prompt') + b' '
42119
2d428b859282 readline: provide styled prompt to readline (issue6070)
Kyle Lippincott <spectral@google.com>
parents: 41999
diff changeset
  1761
22291
3b39e1522d8f ui: add brief comment why raw_input() needs dummy ' ' prompt string
Yuya Nishihara <yuya@tcha.org>
parents: 22205
diff changeset
  1762
        # prompt ' ' must exist; otherwise readline may delete entire line
3b39e1522d8f ui: add brief comment why raw_input() needs dummy ' ' prompt string
Yuya Nishihara <yuya@tcha.org>
parents: 22205
diff changeset
  1763
        # - http://bugs.python.org/issue12833
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1764
        with self.timeblockedsection(b'stdio'):
36795
9b513888ea23 ui: do not use rawinput() when we have to replace sys.stdin/stdout
Yuya Nishihara <yuya@tcha.org>
parents: 36794
diff changeset
  1765
            if usereadline:
43377
aaa046919043 ui: flush before prompting for input with readline
Gregory Szorc <gregory.szorc@gmail.com>
parents: 43265
diff changeset
  1766
                self.flush()
43118
57efd5bd2ca2 py3: decode prompt string before calling rawinput
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 43106
diff changeset
  1767
                prompt = encoding.strfromlocal(prompt)
48933
78f1de3f4be7 ui: use input() directly
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48875
diff changeset
  1768
                line = encoding.strtolocal(input(prompt))
36796
aa0fc12743c7 ui: adjust Windows workaround to new _readline() code
Yuya Nishihara <yuya@tcha.org>
parents: 36795
diff changeset
  1769
                # When stdin is in binary mode on Windows, it can cause
48933
78f1de3f4be7 ui: use input() directly
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48875
diff changeset
  1770
                # input() to emit an extra trailing carriage return
36796
aa0fc12743c7 ui: adjust Windows workaround to new _readline() code
Yuya Nishihara <yuya@tcha.org>
parents: 36795
diff changeset
  1771
                if pycompat.oslinesep == b'\r\n' and line.endswith(b'\r'):
aa0fc12743c7 ui: adjust Windows workaround to new _readline() code
Yuya Nishihara <yuya@tcha.org>
parents: 36795
diff changeset
  1772
                    line = line[:-1]
36795
9b513888ea23 ui: do not use rawinput() when we have to replace sys.stdin/stdout
Yuya Nishihara <yuya@tcha.org>
parents: 36794
diff changeset
  1773
            else:
42119
2d428b859282 readline: provide styled prompt to readline (issue6070)
Kyle Lippincott <spectral@google.com>
parents: 41999
diff changeset
  1774
                self._fout.write(pycompat.bytestr(prompt))
40543
7bffbbe03e90 ui: hide fin/fout/ferr attributes behind @property functions
Yuya Nishihara <yuya@tcha.org>
parents: 40542
diff changeset
  1775
                self._fout.flush()
7bffbbe03e90 ui: hide fin/fout/ferr attributes behind @property functions
Yuya Nishihara <yuya@tcha.org>
parents: 40542
diff changeset
  1776
                line = self._fin.readline()
36795
9b513888ea23 ui: do not use rawinput() when we have to replace sys.stdin/stdout
Yuya Nishihara <yuya@tcha.org>
parents: 36794
diff changeset
  1777
                if not line:
9b513888ea23 ui: do not use rawinput() when we have to replace sys.stdin/stdout
Yuya Nishihara <yuya@tcha.org>
parents: 36794
diff changeset
  1778
                    raise EOFError
36834
1527f40de3b3 ui: remove any combinations of CR|LF from prompt response
Yuya Nishihara <yuya@tcha.org>
parents: 36796
diff changeset
  1779
                line = line.rstrip(pycompat.oslinesep)
14614
afccc64eea73 ui: use I/O descriptors internally
Idan Kamara <idankk86@gmail.com>
parents: 14612
diff changeset
  1780
5613
2e76e5a23c2b workaround for raw_input() on Windows
Steve Borho <steve@borho.org>
parents: 5337
diff changeset
  1781
        return line
5036
ca0d02222d6a ui: get readline and prompt to behave better depending on interactivity
Bryan O'Sullivan <bos@serpentine.com>
parents: 4729
diff changeset
  1782
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1783
    def prompt(self, msg, default=b"y"):
9048
86b4a9b0ddda ui: extract choice from prompt
Simon Heimberg <simohe@besonet.ch>
parents: 8940
diff changeset
  1784
        """Prompt user with msg, read response.
86b4a9b0ddda ui: extract choice from prompt
Simon Heimberg <simohe@besonet.ch>
parents: 8940
diff changeset
  1785
        If ui is not interactive, the default is returned.
5751
bc475d1f74ca prompt: kill matchflags
Kirill Smelkov <kirr@mns.spb.ru>
parents: 5709
diff changeset
  1786
        """
40592
83e571ea06a9 commandserver: attach prompt default and choices to message
Yuya Nishihara <yuya@tcha.org>
parents: 40590
diff changeset
  1787
        return self._prompt(msg, default=default)
83e571ea06a9 commandserver: attach prompt default and choices to message
Yuya Nishihara <yuya@tcha.org>
parents: 40590
diff changeset
  1788
83e571ea06a9 commandserver: attach prompt default and choices to message
Yuya Nishihara <yuya@tcha.org>
parents: 40590
diff changeset
  1789
    def _prompt(self, msg, **opts):
43506
9f70512ae2cf cleanup: remove pointless r-prefixes on single-quoted strings
Augie Fackler <augie@google.com>
parents: 43377
diff changeset
  1790
        default = opts['default']
8208
32a2a1e244f1 ui: make interactive a method
Matt Mackall <mpm@selenic.com>
parents: 8206
diff changeset
  1791
        if not self.interactive():
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1792
            self._writemsg(self._fmsgout, msg, b' ', type=b'prompt', **opts)
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42672
diff changeset
  1793
            self._writemsg(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1794
                self._fmsgout, default or b'', b"\n", type=b'promptecho'
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42672
diff changeset
  1795
            )
7320
8dca507e56ce ui: log non-interactive default response to stdout when verbose
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 6862
diff changeset
  1796
            return default
9048
86b4a9b0ddda ui: extract choice from prompt
Simon Heimberg <simohe@besonet.ch>
parents: 8940
diff changeset
  1797
        try:
42119
2d428b859282 readline: provide styled prompt to readline (issue6070)
Kyle Lippincott <spectral@google.com>
parents: 41999
diff changeset
  1798
            r = self._readline(prompt=msg, promptopts=opts)
9048
86b4a9b0ddda ui: extract choice from prompt
Simon Heimberg <simohe@besonet.ch>
parents: 8940
diff changeset
  1799
            if not r:
22589
9ab18a912c44 ui: show prompt choice if input is not a tty but is forced to be interactive
Mads Kiilerich <madski@unity3d.com>
parents: 22419
diff changeset
  1800
                r = default
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1801
            if self.configbool(b'ui', b'promptecho'):
45758
14ac6a74e7e7 ui: fix echo back of ui.prompt() to not concatenate None as bytes
Yuya Nishihara <yuya@tcha.org>
parents: 45061
diff changeset
  1802
                self._writemsg(
14ac6a74e7e7 ui: fix echo back of ui.prompt() to not concatenate None as bytes
Yuya Nishihara <yuya@tcha.org>
parents: 45061
diff changeset
  1803
                    self._fmsgout, r or b'', b"\n", type=b'promptecho'
14ac6a74e7e7 ui: fix echo back of ui.prompt() to not concatenate None as bytes
Yuya Nishihara <yuya@tcha.org>
parents: 45061
diff changeset
  1804
                )
9048
86b4a9b0ddda ui: extract choice from prompt
Simon Heimberg <simohe@besonet.ch>
parents: 8940
diff changeset
  1805
            return r
86b4a9b0ddda ui: extract choice from prompt
Simon Heimberg <simohe@besonet.ch>
parents: 8940
diff changeset
  1806
        except EOFError:
26896
5e46123e6c35 error: add structured exception for EOF at prompt
Siddharth Agarwal <sid0@fb.com>
parents: 26820
diff changeset
  1807
            raise error.ResponseExpected()
9048
86b4a9b0ddda ui: extract choice from prompt
Simon Heimberg <simohe@besonet.ch>
parents: 8940
diff changeset
  1808
20265
e5803150ea1d ui: add "extractchoices()" to share the logic to extract choices from prompt
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 19886
diff changeset
  1809
    @staticmethod
49795
f1e820cda2f5 typing: add type hints related to message output in mercurial/ui.py
Matt Harbison <matt_harbison@yahoo.com>
parents: 49794
diff changeset
  1810
    def extractchoices(prompt: bytes) -> Tuple[bytes, List[_PromptChoice]]:
20265
e5803150ea1d ui: add "extractchoices()" to share the logic to extract choices from prompt
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 19886
diff changeset
  1811
        """Extract prompt message and list of choices from specified prompt.
e5803150ea1d ui: add "extractchoices()" to share the logic to extract choices from prompt
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 19886
diff changeset
  1812
e5803150ea1d ui: add "extractchoices()" to share the logic to extract choices from prompt
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 19886
diff changeset
  1813
        This returns tuple "(message, choices)", and "choices" is the
e5803150ea1d ui: add "extractchoices()" to share the logic to extract choices from prompt
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 19886
diff changeset
  1814
        list of tuple "(response character, text without &)".
27392
00aa37c65e0a ui: try to handle $$ more robustly in prompts (issue4970)
Matt Mackall <mpm@selenic.com>
parents: 26820
diff changeset
  1815
34131
0fa781320203 doctest: bulk-replace string literals with b'' for Python 3
Yuya Nishihara <yuya@tcha.org>
parents: 34054
diff changeset
  1816
        >>> ui.extractchoices(b"awake? $$ &Yes $$ &No")
27392
00aa37c65e0a ui: try to handle $$ more robustly in prompts (issue4970)
Matt Mackall <mpm@selenic.com>
parents: 26820
diff changeset
  1817
        ('awake? ', [('y', 'Yes'), ('n', 'No')])
34131
0fa781320203 doctest: bulk-replace string literals with b'' for Python 3
Yuya Nishihara <yuya@tcha.org>
parents: 34054
diff changeset
  1818
        >>> ui.extractchoices(b"line\\nbreak? $$ &Yes $$ &No")
27392
00aa37c65e0a ui: try to handle $$ more robustly in prompts (issue4970)
Matt Mackall <mpm@selenic.com>
parents: 26820
diff changeset
  1819
        ('line\\nbreak? ', [('y', 'Yes'), ('n', 'No')])
34131
0fa781320203 doctest: bulk-replace string literals with b'' for Python 3
Yuya Nishihara <yuya@tcha.org>
parents: 34054
diff changeset
  1820
        >>> ui.extractchoices(b"want lots of $$money$$?$$Ye&s$$N&o")
27392
00aa37c65e0a ui: try to handle $$ more robustly in prompts (issue4970)
Matt Mackall <mpm@selenic.com>
parents: 26820
diff changeset
  1821
        ('want lots of $$money$$?', [('s', 'Yes'), ('o', 'No')])
20265
e5803150ea1d ui: add "extractchoices()" to share the logic to extract choices from prompt
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 19886
diff changeset
  1822
        """
27392
00aa37c65e0a ui: try to handle $$ more robustly in prompts (issue4970)
Matt Mackall <mpm@selenic.com>
parents: 26820
diff changeset
  1823
00aa37c65e0a ui: try to handle $$ more robustly in prompts (issue4970)
Matt Mackall <mpm@selenic.com>
parents: 26820
diff changeset
  1824
        # Sadly, the prompt string may have been built with a filename
00aa37c65e0a ui: try to handle $$ more robustly in prompts (issue4970)
Matt Mackall <mpm@selenic.com>
parents: 26820
diff changeset
  1825
        # containing "$$" so let's try to find the first valid-looking
00aa37c65e0a ui: try to handle $$ more robustly in prompts (issue4970)
Matt Mackall <mpm@selenic.com>
parents: 26820
diff changeset
  1826
        # prompt to start parsing. Sadly, we also can't rely on
00aa37c65e0a ui: try to handle $$ more robustly in prompts (issue4970)
Matt Mackall <mpm@selenic.com>
parents: 26820
diff changeset
  1827
        # choices containing spaces, ASCII, or basically anything
00aa37c65e0a ui: try to handle $$ more robustly in prompts (issue4970)
Matt Mackall <mpm@selenic.com>
parents: 26820
diff changeset
  1828
        # except an ampersand followed by a character.
44021
6d3b67a837a6 cleanup: drop redundant character escapes from `[]` character sets
Matt Harbison <matt_harbison@yahoo.com>
parents: 43991
diff changeset
  1829
        m = re.match(br'(?s)(.+?)\$\$([^$]*&[^ $].*)', prompt)
49793
8147abc05794 pytype: stop excluding mercurial/ui.py
Matt Harbison <matt_harbison@yahoo.com>
parents: 49306
diff changeset
  1830
8147abc05794 pytype: stop excluding mercurial/ui.py
Matt Harbison <matt_harbison@yahoo.com>
parents: 49306
diff changeset
  1831
        assert m is not None  # help pytype
8147abc05794 pytype: stop excluding mercurial/ui.py
Matt Harbison <matt_harbison@yahoo.com>
parents: 49306
diff changeset
  1832
27392
00aa37c65e0a ui: try to handle $$ more robustly in prompts (issue4970)
Matt Mackall <mpm@selenic.com>
parents: 26820
diff changeset
  1833
        msg = m.group(1)
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1834
        choices = [p.strip(b' ') for p in m.group(2).split(b'$$')]
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42672
diff changeset
  1835
33714
d880a6bcef2f ui: refactor extractchoices so it doesn't break on Python 3
Augie Fackler <augie@google.com>
parents: 33687
diff changeset
  1836
        def choicetuple(s):
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1837
            ampidx = s.index(b'&')
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1838
            return s[ampidx + 1 : ampidx + 2].lower(), s.replace(b'&', b'', 1)
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42672
diff changeset
  1839
33714
d880a6bcef2f ui: refactor extractchoices so it doesn't break on Python 3
Augie Fackler <augie@google.com>
parents: 33687
diff changeset
  1840
        return (msg, [choicetuple(s) for s in choices])
20265
e5803150ea1d ui: add "extractchoices()" to share the logic to extract choices from prompt
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 19886
diff changeset
  1841
49795
f1e820cda2f5 typing: add type hints related to message output in mercurial/ui.py
Matt Harbison <matt_harbison@yahoo.com>
parents: 49794
diff changeset
  1842
    def promptchoice(self, prompt: bytes, default: int = 0) -> int:
19226
c58b6ab4c26f ui: merge prompt text components into a singe string
Matt Mackall <mpm@selenic.com>
parents: 19195
diff changeset
  1843
        """Prompt user with a message, read response, and ensure it matches
c58b6ab4c26f ui: merge prompt text components into a singe string
Matt Mackall <mpm@selenic.com>
parents: 19195
diff changeset
  1844
        one of the provided choices. The prompt is formatted as follows:
c58b6ab4c26f ui: merge prompt text components into a singe string
Matt Mackall <mpm@selenic.com>
parents: 19195
diff changeset
  1845
c58b6ab4c26f ui: merge prompt text components into a singe string
Matt Mackall <mpm@selenic.com>
parents: 19195
diff changeset
  1846
           "would you like fries with that (Yn)? $$ &Yes $$ &No"
c58b6ab4c26f ui: merge prompt text components into a singe string
Matt Mackall <mpm@selenic.com>
parents: 19195
diff changeset
  1847
c58b6ab4c26f ui: merge prompt text components into a singe string
Matt Mackall <mpm@selenic.com>
parents: 19195
diff changeset
  1848
        The index of the choice is returned. Responses are case
c58b6ab4c26f ui: merge prompt text components into a singe string
Matt Mackall <mpm@selenic.com>
parents: 19195
diff changeset
  1849
        insensitive. If ui is not interactive, the default is
c58b6ab4c26f ui: merge prompt text components into a singe string
Matt Mackall <mpm@selenic.com>
parents: 19195
diff changeset
  1850
        returned.
9048
86b4a9b0ddda ui: extract choice from prompt
Simon Heimberg <simohe@besonet.ch>
parents: 8940
diff changeset
  1851
        """
19226
c58b6ab4c26f ui: merge prompt text components into a singe string
Matt Mackall <mpm@selenic.com>
parents: 19195
diff changeset
  1852
20265
e5803150ea1d ui: add "extractchoices()" to share the logic to extract choices from prompt
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 19886
diff changeset
  1853
        msg, choices = self.extractchoices(prompt)
e5803150ea1d ui: add "extractchoices()" to share the logic to extract choices from prompt
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 19886
diff changeset
  1854
        resps = [r for r, t in choices]
5671
b5605d88dc27 Make ui.prompt repeat on "unrecognized response" again (issue897)
Thomas Arendsen Hein <thomas@intevation.de>
parents: 5337
diff changeset
  1855
        while True:
40592
83e571ea06a9 commandserver: attach prompt default and choices to message
Yuya Nishihara <yuya@tcha.org>
parents: 40590
diff changeset
  1856
            r = self._prompt(msg, default=resps[default], choices=choices)
9048
86b4a9b0ddda ui: extract choice from prompt
Simon Heimberg <simohe@besonet.ch>
parents: 8940
diff changeset
  1857
            if r.lower() in resps:
86b4a9b0ddda ui: extract choice from prompt
Simon Heimberg <simohe@besonet.ch>
parents: 8940
diff changeset
  1858
                return resps.index(r.lower())
40547
840cd57cde32 ui: add config knob to redirect status messages to stderr (API)
Yuya Nishihara <yuya@tcha.org>
parents: 40543
diff changeset
  1859
            # TODO: shouldn't it be a warning?
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1860
            self._writemsg(self._fmsgout, _(b"unrecognized response\n"))
9048
86b4a9b0ddda ui: extract choice from prompt
Simon Heimberg <simohe@besonet.ch>
parents: 8940
diff changeset
  1861
49795
f1e820cda2f5 typing: add type hints related to message output in mercurial/ui.py
Matt Harbison <matt_harbison@yahoo.com>
parents: 49794
diff changeset
  1862
    def getpass(
f1e820cda2f5 typing: add type hints related to message output in mercurial/ui.py
Matt Harbison <matt_harbison@yahoo.com>
parents: 49794
diff changeset
  1863
        self, prompt: Optional[bytes] = None, default: Optional[bytes] = None
f1e820cda2f5 typing: add type hints related to message output in mercurial/ui.py
Matt Harbison <matt_harbison@yahoo.com>
parents: 49794
diff changeset
  1864
    ) -> Optional[bytes]:
10282
08a0f04b56bd many, many trivial check-code fixups
Matt Mackall <mpm@selenic.com>
parents: 10264
diff changeset
  1865
        if not self.interactive():
08a0f04b56bd many, many trivial check-code fixups
Matt Mackall <mpm@selenic.com>
parents: 10264
diff changeset
  1866
            return default
7798
57fee79e5588 catch CTRL-D at password prompt
Steve Borho <steve@borho.org>
parents: 7600
diff changeset
  1867
        try:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42672
diff changeset
  1868
            self._writemsg(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42672
diff changeset
  1869
                self._fmsgerr,
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1870
                prompt or _(b'password: '),
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1871
                type=b'prompt',
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42672
diff changeset
  1872
                password=True,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42672
diff changeset
  1873
            )
21195
9336bc7dca8e cmdserver: forcibly use L channel to read password input (issue3161)
Yuya Nishihara <yuya@tcha.org>
parents: 21132
diff changeset
  1874
            # disable getpass() only if explicitly specified. it's still valid
9336bc7dca8e cmdserver: forcibly use L channel to read password input (issue3161)
Yuya Nishihara <yuya@tcha.org>
parents: 21132
diff changeset
  1875
            # to interact with tty even if fin is not a tty.
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1876
            with self.timeblockedsection(b'stdio'):
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1877
                if self.configbool(b'ui', b'nontty'):
40543
7bffbbe03e90 ui: hide fin/fout/ferr attributes behind @property functions
Yuya Nishihara <yuya@tcha.org>
parents: 40542
diff changeset
  1878
                    l = self._fin.readline()
30978
fdecd24ca4dc ui: log time spent blocked on stdio
Simon Farnsworth <simonfar@fb.com>
parents: 30976
diff changeset
  1879
                    if not l:
fdecd24ca4dc ui: log time spent blocked on stdio
Simon Farnsworth <simonfar@fb.com>
parents: 30976
diff changeset
  1880
                        raise EOFError
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1881
                    return l.rstrip(b'\n')
30978
fdecd24ca4dc ui: log time spent blocked on stdio
Simon Farnsworth <simonfar@fb.com>
parents: 30976
diff changeset
  1882
                else:
47079
5b3513177f2b util: avoid echoing the password to the console on Windows py3 (issue6446)
Matt Harbison <matt_harbison@yahoo.com>
parents: 46965
diff changeset
  1883
                    return util.get_password()
7798
57fee79e5588 catch CTRL-D at password prompt
Steve Borho <steve@borho.org>
parents: 7600
diff changeset
  1884
        except EOFError:
26896
5e46123e6c35 error: add structured exception for EOF at prompt
Siddharth Agarwal <sid0@fb.com>
parents: 26820
diff changeset
  1885
            raise error.ResponseExpected()
38768
afc4ad706f9c dispatch: making all hg abortions be output with a specific label
Rodrigo Damazio Bovendorp <rdamazio@google.com>
parents: 38767
diff changeset
  1886
49795
f1e820cda2f5 typing: add type hints related to message output in mercurial/ui.py
Matt Harbison <matt_harbison@yahoo.com>
parents: 49794
diff changeset
  1887
    def status(self, *msg: bytes, **opts: _MsgOpts) -> None:
45942
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 45929
diff changeset
  1888
        """write status message to output (if ui.quiet is False)
10815
32b213b9b22c ui: add ui.write() output labeling API
Brodie Rao <brodie@bitheap.org>
parents: 10567
diff changeset
  1889
32b213b9b22c ui: add ui.write() output labeling API
Brodie Rao <brodie@bitheap.org>
parents: 10567
diff changeset
  1890
        This adds an output label of "ui.status".
45942
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 45929
diff changeset
  1891
        """
10282
08a0f04b56bd many, many trivial check-code fixups
Matt Mackall <mpm@selenic.com>
parents: 10264
diff changeset
  1892
        if not self.quiet:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1893
            self._writemsg(self._fmsgout, type=b'status', *msg, **opts)
38768
afc4ad706f9c dispatch: making all hg abortions be output with a specific label
Rodrigo Damazio Bovendorp <rdamazio@google.com>
parents: 38767
diff changeset
  1894
49795
f1e820cda2f5 typing: add type hints related to message output in mercurial/ui.py
Matt Harbison <matt_harbison@yahoo.com>
parents: 49794
diff changeset
  1895
    def warn(self, *msg: bytes, **opts: _MsgOpts) -> None:
45942
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 45929
diff changeset
  1896
        """write warning message to output (stderr)
10815
32b213b9b22c ui: add ui.write() output labeling API
Brodie Rao <brodie@bitheap.org>
parents: 10567
diff changeset
  1897
32b213b9b22c ui: add ui.write() output labeling API
Brodie Rao <brodie@bitheap.org>
parents: 10567
diff changeset
  1898
        This adds an output label of "ui.warning".
45942
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 45929
diff changeset
  1899
        """
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1900
        self._writemsg(self._fmsgerr, type=b'warning', *msg, **opts)
38768
afc4ad706f9c dispatch: making all hg abortions be output with a specific label
Rodrigo Damazio Bovendorp <rdamazio@google.com>
parents: 38767
diff changeset
  1901
49795
f1e820cda2f5 typing: add type hints related to message output in mercurial/ui.py
Matt Harbison <matt_harbison@yahoo.com>
parents: 49794
diff changeset
  1902
    def error(self, *msg: bytes, **opts: _MsgOpts) -> None:
45942
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 45929
diff changeset
  1903
        """write error message to output (stderr)
38768
afc4ad706f9c dispatch: making all hg abortions be output with a specific label
Rodrigo Damazio Bovendorp <rdamazio@google.com>
parents: 38767
diff changeset
  1904
afc4ad706f9c dispatch: making all hg abortions be output with a specific label
Rodrigo Damazio Bovendorp <rdamazio@google.com>
parents: 38767
diff changeset
  1905
        This adds an output label of "ui.error".
45942
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 45929
diff changeset
  1906
        """
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1907
        self._writemsg(self._fmsgerr, type=b'error', *msg, **opts)
38768
afc4ad706f9c dispatch: making all hg abortions be output with a specific label
Rodrigo Damazio Bovendorp <rdamazio@google.com>
parents: 38767
diff changeset
  1908
49795
f1e820cda2f5 typing: add type hints related to message output in mercurial/ui.py
Matt Harbison <matt_harbison@yahoo.com>
parents: 49794
diff changeset
  1909
    def note(self, *msg: bytes, **opts: _MsgOpts) -> None:
45942
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 45929
diff changeset
  1910
        """write note to output (if ui.verbose is True)
10815
32b213b9b22c ui: add ui.write() output labeling API
Brodie Rao <brodie@bitheap.org>
parents: 10567
diff changeset
  1911
32b213b9b22c ui: add ui.write() output labeling API
Brodie Rao <brodie@bitheap.org>
parents: 10567
diff changeset
  1912
        This adds an output label of "ui.note".
45942
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 45929
diff changeset
  1913
        """
10282
08a0f04b56bd many, many trivial check-code fixups
Matt Mackall <mpm@selenic.com>
parents: 10264
diff changeset
  1914
        if self.verbose:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1915
            self._writemsg(self._fmsgout, type=b'note', *msg, **opts)
38768
afc4ad706f9c dispatch: making all hg abortions be output with a specific label
Rodrigo Damazio Bovendorp <rdamazio@google.com>
parents: 38767
diff changeset
  1916
49795
f1e820cda2f5 typing: add type hints related to message output in mercurial/ui.py
Matt Harbison <matt_harbison@yahoo.com>
parents: 49794
diff changeset
  1917
    def debug(self, *msg: bytes, **opts: _MsgOpts) -> None:
45942
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 45929
diff changeset
  1918
        """write debug message to output (if ui.debugflag is True)
10815
32b213b9b22c ui: add ui.write() output labeling API
Brodie Rao <brodie@bitheap.org>
parents: 10567
diff changeset
  1919
32b213b9b22c ui: add ui.write() output labeling API
Brodie Rao <brodie@bitheap.org>
parents: 10567
diff changeset
  1920
        This adds an output label of "ui.debug".
45942
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 45929
diff changeset
  1921
        """
10282
08a0f04b56bd many, many trivial check-code fixups
Matt Mackall <mpm@selenic.com>
parents: 10264
diff changeset
  1922
        if self.debugflag:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1923
            self._writemsg(self._fmsgout, type=b'debug', *msg, **opts)
40759
fdc6eb1d650d blackbox: send debug message to logger by core ui
Yuya Nishihara <yuya@tcha.org>
parents: 40730
diff changeset
  1924
            self.log(b'debug', b'%s', b''.join(msg))
26750
9f9ec4abe700 cmdutil: make in-memory changes visible to external editor (issue4378)
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 26587
diff changeset
  1925
43079
5209fc94b982 ui: define (write|status|warn|note)noi18n aliases
Gregory Szorc <gregory.szorc@gmail.com>
parents: 43077
diff changeset
  1926
    # Aliases to defeat check-code.
5209fc94b982 ui: define (write|status|warn|note)noi18n aliases
Gregory Szorc <gregory.szorc@gmail.com>
parents: 43077
diff changeset
  1927
    statusnoi18n = status
5209fc94b982 ui: define (write|status|warn|note)noi18n aliases
Gregory Szorc <gregory.szorc@gmail.com>
parents: 43077
diff changeset
  1928
    notenoi18n = note
5209fc94b982 ui: define (write|status|warn|note)noi18n aliases
Gregory Szorc <gregory.szorc@gmail.com>
parents: 43077
diff changeset
  1929
    warnnoi18n = warn
5209fc94b982 ui: define (write|status|warn|note)noi18n aliases
Gregory Szorc <gregory.szorc@gmail.com>
parents: 43077
diff changeset
  1930
    writenoi18n = write
5209fc94b982 ui: define (write|status|warn|note)noi18n aliases
Gregory Szorc <gregory.szorc@gmail.com>
parents: 43077
diff changeset
  1931
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42672
diff changeset
  1932
    def edit(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42672
diff changeset
  1933
        self,
49797
0449fb7729d7 typing: add trivial type hints to mercurial/ui.py
Matt Harbison <matt_harbison@yahoo.com>
parents: 49795
diff changeset
  1934
        text: bytes,
0449fb7729d7 typing: add trivial type hints to mercurial/ui.py
Matt Harbison <matt_harbison@yahoo.com>
parents: 49795
diff changeset
  1935
        user: bytes,
0449fb7729d7 typing: add trivial type hints to mercurial/ui.py
Matt Harbison <matt_harbison@yahoo.com>
parents: 49795
diff changeset
  1936
        extra: Optional[Dict[bytes, Any]] = None,  # TODO: value type of bytes?
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42672
diff changeset
  1937
        editform=None,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42672
diff changeset
  1938
        pending=None,
49797
0449fb7729d7 typing: add trivial type hints to mercurial/ui.py
Matt Harbison <matt_harbison@yahoo.com>
parents: 49795
diff changeset
  1939
        repopath: Optional[bytes] = None,
0449fb7729d7 typing: add trivial type hints to mercurial/ui.py
Matt Harbison <matt_harbison@yahoo.com>
parents: 49795
diff changeset
  1940
        action: Optional[bytes] = None,
0449fb7729d7 typing: add trivial type hints to mercurial/ui.py
Matt Harbison <matt_harbison@yahoo.com>
parents: 49795
diff changeset
  1941
    ) -> bytes:
34029
6e6452bc441d editor: use an unambiguous path suffix for editor files
Michael Bolin <mbolin@fb.com>
parents: 34021
diff changeset
  1942
        if action is None:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42672
diff changeset
  1943
            self.develwarn(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1944
                b'action is None but will soon be a required '
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1945
                b'parameter to ui.edit()'
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42672
diff changeset
  1946
            )
28635
87f92d6f0bc3 edit: allow to configure the suffix of the temporary filename
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 28633
diff changeset
  1947
        extra_defaults = {
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1948
            b'prefix': b'editor',
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1949
            b'suffix': b'.txt',
28635
87f92d6f0bc3 edit: allow to configure the suffix of the temporary filename
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 28633
diff changeset
  1950
        }
27153
3553e40d0770 ui: allow open editor with custom filename
Mykola Nikishov <mn@mn.com.ua>
parents: 27110
diff changeset
  1951
        if extra is not None:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1952
            if extra.get(b'suffix') is not None:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42672
diff changeset
  1953
                self.develwarn(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1954
                    b'extra.suffix is not None but will soon be '
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1955
                    b'ignored by ui.edit()'
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42672
diff changeset
  1956
                )
27153
3553e40d0770 ui: allow open editor with custom filename
Mykola Nikishov <mn@mn.com.ua>
parents: 27110
diff changeset
  1957
            extra_defaults.update(extra)
3553e40d0770 ui: allow open editor with custom filename
Mykola Nikishov <mn@mn.com.ua>
parents: 27110
diff changeset
  1958
        extra = extra_defaults
30835
bcad61a1f9a7 ui: add a parameter to set the temporary directory for edit
Sean Farley <sean@farley.io>
parents: 30832
diff changeset
  1959
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1960
        if action == b'diff':
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1961
            suffix = b'.diff'
34054
3c82b14d2838 editor: file created for diff action should have .diff suffix
Michael Bolin <mbolin@fb.com>
parents: 34029
diff changeset
  1962
        elif action:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1963
            suffix = b'.%s.hg.txt' % action
34029
6e6452bc441d editor: use an unambiguous path suffix for editor files
Michael Bolin <mbolin@fb.com>
parents: 34021
diff changeset
  1964
        else:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1965
            suffix = extra[b'suffix']
34029
6e6452bc441d editor: use an unambiguous path suffix for editor files
Michael Bolin <mbolin@fb.com>
parents: 34021
diff changeset
  1966
30848
7080652af6e6 ui: rename tmpdir parameter to more specific repopath
Sean Farley <sean@farley.io>
parents: 30835
diff changeset
  1967
        rdir = None
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1968
        if self.configbool(b'experimental', b'editortmpinhg'):
30848
7080652af6e6 ui: rename tmpdir parameter to more specific repopath
Sean Farley <sean@farley.io>
parents: 30835
diff changeset
  1969
            rdir = repopath
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42672
diff changeset
  1970
        (fd, name) = pycompat.mkstemp(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1971
            prefix=b'hg-' + extra[b'prefix'] + b'-', suffix=suffix, dir=rdir
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42672
diff changeset
  1972
        )
1984
df7436f439a0 Improved ui.edit():
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1983
diff changeset
  1973
        try:
43876
e5f69e3bb3f6 ui: use a context manager to handle file streams in edit()
Matt Harbison <matt_harbison@yahoo.com>
parents: 43787
diff changeset
  1974
            with os.fdopen(fd, 'wb') as f:
e5f69e3bb3f6 ui: use a context manager to handle file streams in edit()
Matt Harbison <matt_harbison@yahoo.com>
parents: 43787
diff changeset
  1975
                f.write(util.tonativeeol(text))
1984
df7436f439a0 Improved ui.edit():
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1983
diff changeset
  1976
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1977
            environ = {b'HGUSER': user}
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1978
            if b'transplant_source' in extra:
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1979
                environ.update(
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1980
                    {b'HGREVISION': hex(extra[b'transplant_source'])}
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1981
                )
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1982
            for label in (b'intermediate-source', b'source', b'rebase_source'):
20605
a8aa699a812a ui: edit(): rebase, graft: set HGREVISION environment variable for an editor
Alexander Drozdov <al.drozdov@gmail.com>
parents: 20603
diff changeset
  1983
                if label in extra:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1984
                    environ.update({b'HGREVISION': extra[label]})
20605
a8aa699a812a ui: edit(): rebase, graft: set HGREVISION environment variable for an editor
Alexander Drozdov <al.drozdov@gmail.com>
parents: 20603
diff changeset
  1985
                    break
22205
9fa429723f26 ui: invoke editor for committing with HGEDITFORM environment variable
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 21955
diff changeset
  1986
            if editform:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1987
                environ.update({b'HGEDITFORM': editform})
26750
9f9ec4abe700 cmdutil: make in-memory changes visible to external editor (issue4378)
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 26587
diff changeset
  1988
            if pending:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1989
                environ.update({b'HG_PENDING': pending})
20605
a8aa699a812a ui: edit(): rebase, graft: set HGREVISION environment variable for an editor
Alexander Drozdov <al.drozdov@gmail.com>
parents: 20603
diff changeset
  1990
5660
3c80ecdc1bcd Use VISUAL in addition to EDITOR when choosing the editor to use.
Osku Salerma <osku@iki.fi>
parents: 5613
diff changeset
  1991
            editor = self.geteditor()
207
ec327cf0d3a9 Move ui class to its own module
mpm@selenic.com
parents:
diff changeset
  1992
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42672
diff changeset
  1993
            self.system(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1994
                b"%s \"%s\"" % (editor, name),
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42672
diff changeset
  1995
                environ=environ,
45877
ac362d5a7893 errors: introduce CanceledError and use it in a few places
Martin von Zweigbergk <martinvonz@google.com>
parents: 45826
diff changeset
  1996
                onerr=error.CanceledError,
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1997
                errprefix=_(b"edit failed"),
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1998
                blockedtag=b'editor',
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42672
diff changeset
  1999
            )
608
d2994b5298fb Add username/merge/editor to .hgrc
Matt Mackall <mpm@selenic.com>
parents: 565
diff changeset
  2000
43876
e5f69e3bb3f6 ui: use a context manager to handle file streams in edit()
Matt Harbison <matt_harbison@yahoo.com>
parents: 43787
diff changeset
  2001
            with open(name, 'rb') as f:
e5f69e3bb3f6 ui: use a context manager to handle file streams in edit()
Matt Harbison <matt_harbison@yahoo.com>
parents: 43787
diff changeset
  2002
                t = util.fromnativeeol(f.read())
1984
df7436f439a0 Improved ui.edit():
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1983
diff changeset
  2003
        finally:
df7436f439a0 Improved ui.edit():
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1983
diff changeset
  2004
            os.unlink(name)
662
b55a78595ef6 Pass username to hgeditor, remove temporary file
Radoslaw "AstralStorm" Szkodzinski <astralstorm@gorzow.mm.pl>
parents: 613
diff changeset
  2005
207
ec327cf0d3a9 Move ui class to its own module
mpm@selenic.com
parents:
diff changeset
  2006
        return t
2200
9f43b6e24232 move mail sending code into core, so extensions can share it.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2166
diff changeset
  2007
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42672
diff changeset
  2008
    def system(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42672
diff changeset
  2009
        self,
49797
0449fb7729d7 typing: add trivial type hints to mercurial/ui.py
Matt Harbison <matt_harbison@yahoo.com>
parents: 49795
diff changeset
  2010
        cmd: bytes,
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42672
diff changeset
  2011
        environ=None,
49797
0449fb7729d7 typing: add trivial type hints to mercurial/ui.py
Matt Harbison <matt_harbison@yahoo.com>
parents: 49795
diff changeset
  2012
        cwd: Optional[bytes] = None,
0449fb7729d7 typing: add trivial type hints to mercurial/ui.py
Matt Harbison <matt_harbison@yahoo.com>
parents: 49795
diff changeset
  2013
        onerr: Optional[Callable[[bytes], Exception]] = None,
0449fb7729d7 typing: add trivial type hints to mercurial/ui.py
Matt Harbison <matt_harbison@yahoo.com>
parents: 49795
diff changeset
  2014
        errprefix: Optional[bytes] = None,
0449fb7729d7 typing: add trivial type hints to mercurial/ui.py
Matt Harbison <matt_harbison@yahoo.com>
parents: 49795
diff changeset
  2015
        blockedtag: Optional[bytes] = None,
0449fb7729d7 typing: add trivial type hints to mercurial/ui.py
Matt Harbison <matt_harbison@yahoo.com>
parents: 49795
diff changeset
  2016
    ) -> int:
45942
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 45929
diff changeset
  2017
        """execute shell command with appropriate output stream. command
23269
d9d8d2e0f701 ui: introduce util.system() wrapper to make sure ui.fout is used
Yuya Nishihara <yuya@tcha.org>
parents: 23139
diff changeset
  2018
        output will be redirected if fout is not stdout.
31108
3f8f53190d6a chg: deduplicate error handling of ui.system()
Yuya Nishihara <yuya@tcha.org>
parents: 31107
diff changeset
  2019
3f8f53190d6a chg: deduplicate error handling of ui.system()
Yuya Nishihara <yuya@tcha.org>
parents: 31107
diff changeset
  2020
        if command fails and onerr is None, return status, else raise onerr
3f8f53190d6a chg: deduplicate error handling of ui.system()
Yuya Nishihara <yuya@tcha.org>
parents: 31107
diff changeset
  2021
        object as exception.
45942
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 45929
diff changeset
  2022
        """
30979
fd598149112b ui: time calls to ui.system
Simon Farnsworth <simonfar@fb.com>
parents: 30978
diff changeset
  2023
        if blockedtag is None:
31535
d0f95ecca2ad ui: restrict length of autogenerated blocked tags
Simon Farnsworth <simonfar@fb.com>
parents: 31532
diff changeset
  2024
            # Long cmds tend to be because of an absolute path on cmd. Keep
d0f95ecca2ad ui: restrict length of autogenerated blocked tags
Simon Farnsworth <simonfar@fb.com>
parents: 31532
diff changeset
  2025
            # the tail end instead
d0f95ecca2ad ui: restrict length of autogenerated blocked tags
Simon Farnsworth <simonfar@fb.com>
parents: 31532
diff changeset
  2026
            cmdsuffix = cmd.translate(None, _keepalnum)[-85:]
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  2027
            blockedtag = b'unknown_system_' + cmdsuffix
40543
7bffbbe03e90 ui: hide fin/fout/ferr attributes behind @property functions
Yuya Nishihara <yuya@tcha.org>
parents: 40542
diff changeset
  2028
        out = self._fout
25149
3f0744eeaeaf cleanup: use __builtins__.any instead of util.any
Augie Fackler <augie@google.com>
parents: 25125
diff changeset
  2029
        if any(s[1] for s in self._bufferstates):
24848
2f88821856eb ui: allow capture of subprocess output
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 24687
diff changeset
  2030
            out = self
30979
fd598149112b ui: time calls to ui.system
Simon Farnsworth <simonfar@fb.com>
parents: 30978
diff changeset
  2031
        with self.timeblockedsection(blockedtag):
31108
3f8f53190d6a chg: deduplicate error handling of ui.system()
Yuya Nishihara <yuya@tcha.org>
parents: 31107
diff changeset
  2032
            rc = self._runsystem(cmd, environ=environ, cwd=cwd, out=out)
3f8f53190d6a chg: deduplicate error handling of ui.system()
Yuya Nishihara <yuya@tcha.org>
parents: 31107
diff changeset
  2033
        if rc and onerr:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  2034
            errmsg = b'%s %s' % (
44581
b746a22349f9 ui: use "procutil.shellsplit" to parse command
Micha Wiedenmann <mw-u2@posteo.de>
parents: 44159
diff changeset
  2035
                procutil.shellsplit(cmd)[0],
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42672
diff changeset
  2036
                procutil.explainexit(rc),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42672
diff changeset
  2037
            )
31108
3f8f53190d6a chg: deduplicate error handling of ui.system()
Yuya Nishihara <yuya@tcha.org>
parents: 31107
diff changeset
  2038
            if errprefix:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  2039
                errmsg = b'%s: %s' % (errprefix, errmsg)
31108
3f8f53190d6a chg: deduplicate error handling of ui.system()
Yuya Nishihara <yuya@tcha.org>
parents: 31107
diff changeset
  2040
            raise onerr(errmsg)
3f8f53190d6a chg: deduplicate error handling of ui.system()
Yuya Nishihara <yuya@tcha.org>
parents: 31107
diff changeset
  2041
        return rc
31107
fbce78c58f1e chg: refactor ui.system() to be partly overridden
Yuya Nishihara <yuya@tcha.org>
parents: 31106
diff changeset
  2042
49797
0449fb7729d7 typing: add trivial type hints to mercurial/ui.py
Matt Harbison <matt_harbison@yahoo.com>
parents: 49795
diff changeset
  2043
    def _runsystem(self, cmd: bytes, environ, cwd: Optional[bytes], out) -> int:
31107
fbce78c58f1e chg: refactor ui.system() to be partly overridden
Yuya Nishihara <yuya@tcha.org>
parents: 31106
diff changeset
  2044
        """actually execute the given shell command (can be overridden by
fbce78c58f1e chg: refactor ui.system() to be partly overridden
Yuya Nishihara <yuya@tcha.org>
parents: 31106
diff changeset
  2045
        extensions like chg)"""
37120
a8a902d7176e procutil: bulk-replace function calls to point to new module
Yuya Nishihara <yuya@tcha.org>
parents: 37119
diff changeset
  2046
        return procutil.system(cmd, environ=environ, cwd=cwd, out=out)
23269
d9d8d2e0f701 ui: introduce util.system() wrapper to make sure ui.fout is used
Yuya Nishihara <yuya@tcha.org>
parents: 23139
diff changeset
  2047
49797
0449fb7729d7 typing: add trivial type hints to mercurial/ui.py
Matt Harbison <matt_harbison@yahoo.com>
parents: 49795
diff changeset
  2048
    def traceback(self, exc=None, force: bool = False):
45942
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 45929
diff changeset
  2049
        """print exception traceback if traceback printing enabled or forced.
2335
f0680b2d1d64 add ui.print_exc(), make all traceback printing central.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2293
diff changeset
  2050
        only to call in exception handler. returns true if traceback
45942
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 45929
diff changeset
  2051
        printed."""
18966
5572f688e0a9 ui: add 'force' parameter to traceback() to override the current print setting
Matt Harbison <matt_harbison@yahoo.com>
parents: 18965
diff changeset
  2052
        if self.tracebackflag or force:
18965
0062508b1900 ui: add support for fully printing chained exception stacks in ui.traceback()
Matt Harbison <matt_harbison@yahoo.com>
parents: 18669
diff changeset
  2053
            if exc is None:
0062508b1900 ui: add support for fully printing chained exception stacks in ui.traceback()
Matt Harbison <matt_harbison@yahoo.com>
parents: 18669
diff changeset
  2054
                exc = sys.exc_info()
0062508b1900 ui: add support for fully printing chained exception stacks in ui.traceback()
Matt Harbison <matt_harbison@yahoo.com>
parents: 18669
diff changeset
  2055
            cause = getattr(exc[1], 'cause', None)
0062508b1900 ui: add support for fully printing chained exception stacks in ui.traceback()
Matt Harbison <matt_harbison@yahoo.com>
parents: 18669
diff changeset
  2056
0062508b1900 ui: add support for fully printing chained exception stacks in ui.traceback()
Matt Harbison <matt_harbison@yahoo.com>
parents: 18669
diff changeset
  2057
            if cause is not None:
0062508b1900 ui: add support for fully printing chained exception stacks in ui.traceback()
Matt Harbison <matt_harbison@yahoo.com>
parents: 18669
diff changeset
  2058
                causetb = traceback.format_tb(cause[2])
0062508b1900 ui: add support for fully printing chained exception stacks in ui.traceback()
Matt Harbison <matt_harbison@yahoo.com>
parents: 18669
diff changeset
  2059
                exctb = traceback.format_tb(exc[2])
0062508b1900 ui: add support for fully printing chained exception stacks in ui.traceback()
Matt Harbison <matt_harbison@yahoo.com>
parents: 18669
diff changeset
  2060
                exconly = traceback.format_exception_only(cause[0], cause[1])
0062508b1900 ui: add support for fully printing chained exception stacks in ui.traceback()
Matt Harbison <matt_harbison@yahoo.com>
parents: 18669
diff changeset
  2061
0062508b1900 ui: add support for fully printing chained exception stacks in ui.traceback()
Matt Harbison <matt_harbison@yahoo.com>
parents: 18669
diff changeset
  2062
                # exclude frame where 'exc' was chained and rethrown from exctb
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42672
diff changeset
  2063
                self.write_err(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  2064
                    b'Traceback (most recent call last):\n',
43877
e63b27fb0595 ui: convert exception data to bytes when printing chained exception info
Matt Harbison <matt_harbison@yahoo.com>
parents: 43876
diff changeset
  2065
                    encoding.strtolocal(''.join(exctb[:-1])),
e63b27fb0595 ui: convert exception data to bytes when printing chained exception info
Matt Harbison <matt_harbison@yahoo.com>
parents: 43876
diff changeset
  2066
                    encoding.strtolocal(''.join(causetb)),
e63b27fb0595 ui: convert exception data to bytes when printing chained exception info
Matt Harbison <matt_harbison@yahoo.com>
parents: 43876
diff changeset
  2067
                    encoding.strtolocal(''.join(exconly)),
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42672
diff changeset
  2068
                )
18965
0062508b1900 ui: add support for fully printing chained exception stacks in ui.traceback()
Matt Harbison <matt_harbison@yahoo.com>
parents: 18669
diff changeset
  2069
            else:
25568
c1ff82daed62 ui: flush stderr after printing a non-chained exception for Windows
Matt Harbison <matt_harbison@yahoo.com>
parents: 25519
diff changeset
  2070
                output = traceback.format_exception(exc[0], exc[1], exc[2])
43506
9f70512ae2cf cleanup: remove pointless r-prefixes on single-quoted strings
Augie Fackler <augie@google.com>
parents: 43377
diff changeset
  2071
                self.write_err(encoding.strtolocal(''.join(output)))
18966
5572f688e0a9 ui: add 'force' parameter to traceback() to override the current print setting
Matt Harbison <matt_harbison@yahoo.com>
parents: 18965
diff changeset
  2072
        return self.tracebackflag or force
5660
3c80ecdc1bcd Use VISUAL in addition to EDITOR when choosing the editor to use.
Osku Salerma <osku@iki.fi>
parents: 5613
diff changeset
  2073
3c80ecdc1bcd Use VISUAL in addition to EDITOR when choosing the editor to use.
Osku Salerma <osku@iki.fi>
parents: 5613
diff changeset
  2074
    def geteditor(self):
3c80ecdc1bcd Use VISUAL in addition to EDITOR when choosing the editor to use.
Osku Salerma <osku@iki.fi>
parents: 5613
diff changeset
  2075
        '''return editor to use'''
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  2076
        if pycompat.sysplatform == b'plan9':
16383
f5dd179bfa4a plan9: initial support for plan 9 from bell labs
Steven Stallion <sstallion@gmail.com>
parents: 16373
diff changeset
  2077
            # vi is the MIPS instruction simulator on Plan 9. We
f5dd179bfa4a plan9: initial support for plan 9 from bell labs
Steven Stallion <sstallion@gmail.com>
parents: 16373
diff changeset
  2078
            # instead default to E to plumb commit messages to
f5dd179bfa4a plan9: initial support for plan 9 from bell labs
Steven Stallion <sstallion@gmail.com>
parents: 16373
diff changeset
  2079
            # avoid confusion.
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  2080
            editor = b'E'
44594
c23877cb25a5 darwin: use vim, not vi, to avoid data-loss inducing posix behavior
Kyle Lippincott <spectral@google.com>
parents: 44126
diff changeset
  2081
        elif pycompat.isdarwin:
c23877cb25a5 darwin: use vim, not vi, to avoid data-loss inducing posix behavior
Kyle Lippincott <spectral@google.com>
parents: 44126
diff changeset
  2082
            # vi on darwin is POSIX compatible to a fault, and that includes
c23877cb25a5 darwin: use vim, not vi, to avoid data-loss inducing posix behavior
Kyle Lippincott <spectral@google.com>
parents: 44126
diff changeset
  2083
            # exiting non-zero if you make any mistake when running an ex
c23877cb25a5 darwin: use vim, not vi, to avoid data-loss inducing posix behavior
Kyle Lippincott <spectral@google.com>
parents: 44126
diff changeset
  2084
            # command. Proof: `vi -c ':unknown' -c ':qa'; echo $?` produces 1,
c23877cb25a5 darwin: use vim, not vi, to avoid data-loss inducing posix behavior
Kyle Lippincott <spectral@google.com>
parents: 44126
diff changeset
  2085
            # while s/vi/vim/ doesn't.
c23877cb25a5 darwin: use vim, not vi, to avoid data-loss inducing posix behavior
Kyle Lippincott <spectral@google.com>
parents: 44126
diff changeset
  2086
            editor = b'vim'
16383
f5dd179bfa4a plan9: initial support for plan 9 from bell labs
Steven Stallion <sstallion@gmail.com>
parents: 16373
diff changeset
  2087
        else:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  2088
            editor = b'vi'
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  2089
        return encoding.environ.get(b"HGEDITOR") or self.config(
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  2090
            b"ui", b"editor", editor
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42672
diff changeset
  2091
        )
9153
6adc899c98d0 Add ui.progress API
Matt Mackall <mpm@selenic.com>
parents: 9048
diff changeset
  2092
25499
0fa964d6fd48 progress: move all logic altering the ui object logic in mercurial.ui
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 25498
diff changeset
  2093
    @util.propertycache
49794
25fe689a4a64 typing: add type hints related to progress bars in mercurial/ui.py
Matt Harbison <matt_harbison@yahoo.com>
parents: 49793
diff changeset
  2094
    def _progbar(self) -> Optional[progress.progbar]:
25499
0fa964d6fd48 progress: move all logic altering the ui object logic in mercurial.ui
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 25498
diff changeset
  2095
        """setup the progbar singleton to the ui object"""
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42672
diff changeset
  2096
        if (
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42672
diff changeset
  2097
            self.quiet
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42672
diff changeset
  2098
            or self.debugflag
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  2099
            or self.configbool(b'progress', b'disable')
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42672
diff changeset
  2100
            or not progress.shouldprint(self)
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42672
diff changeset
  2101
        ):
25499
0fa964d6fd48 progress: move all logic altering the ui object logic in mercurial.ui
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 25498
diff changeset
  2102
            return None
0fa964d6fd48 progress: move all logic altering the ui object logic in mercurial.ui
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 25498
diff changeset
  2103
        return getprogbar(self)
0fa964d6fd48 progress: move all logic altering the ui object logic in mercurial.ui
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 25498
diff changeset
  2104
49794
25fe689a4a64 typing: add type hints related to progress bars in mercurial/ui.py
Matt Harbison <matt_harbison@yahoo.com>
parents: 49793
diff changeset
  2105
    def _progclear(self) -> None:
25499
0fa964d6fd48 progress: move all logic altering the ui object logic in mercurial.ui
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 25498
diff changeset
  2106
        """clear progress bar output if any. use it before any output"""
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42672
diff changeset
  2107
        if not haveprogbar():  # nothing loaded yet
25499
0fa964d6fd48 progress: move all logic altering the ui object logic in mercurial.ui
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 25498
diff changeset
  2108
            return
0fa964d6fd48 progress: move all logic altering the ui object logic in mercurial.ui
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 25498
diff changeset
  2109
        if self._progbar is not None and self._progbar.printed:
0fa964d6fd48 progress: move all logic altering the ui object logic in mercurial.ui
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 25498
diff changeset
  2110
            self._progbar.clear()
0fa964d6fd48 progress: move all logic altering the ui object logic in mercurial.ui
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 25498
diff changeset
  2111
49794
25fe689a4a64 typing: add type hints related to progress bars in mercurial/ui.py
Matt Harbison <matt_harbison@yahoo.com>
parents: 49793
diff changeset
  2112
    def makeprogress(
25fe689a4a64 typing: add type hints related to progress bars in mercurial/ui.py
Matt Harbison <matt_harbison@yahoo.com>
parents: 49793
diff changeset
  2113
        self, topic: bytes, unit: bytes = b"", total: Optional[int] = None
25fe689a4a64 typing: add type hints related to progress bars in mercurial/ui.py
Matt Harbison <matt_harbison@yahoo.com>
parents: 49793
diff changeset
  2114
    ) -> scmutil.progress:
41210
929999d963b8 progress: specify updatebar() function by constructor argument
Yuya Nishihara <yuya@tcha.org>
parents: 41142
diff changeset
  2115
        """Create a progress helper for the specified topic"""
929999d963b8 progress: specify updatebar() function by constructor argument
Yuya Nishihara <yuya@tcha.org>
parents: 41142
diff changeset
  2116
        if getattr(self._fmsgerr, 'structured', False):
929999d963b8 progress: specify updatebar() function by constructor argument
Yuya Nishihara <yuya@tcha.org>
parents: 41142
diff changeset
  2117
            # channel for machine-readable output with metadata, just send
929999d963b8 progress: specify updatebar() function by constructor argument
Yuya Nishihara <yuya@tcha.org>
parents: 41142
diff changeset
  2118
            # raw information
929999d963b8 progress: specify updatebar() function by constructor argument
Yuya Nishihara <yuya@tcha.org>
parents: 41142
diff changeset
  2119
            # TODO: consider porting some useful information (e.g. estimated
929999d963b8 progress: specify updatebar() function by constructor argument
Yuya Nishihara <yuya@tcha.org>
parents: 41142
diff changeset
  2120
            # time) from progbar. we might want to support update delay to
929999d963b8 progress: specify updatebar() function by constructor argument
Yuya Nishihara <yuya@tcha.org>
parents: 41142
diff changeset
  2121
            # reduce the cost of transferring progress messages.
929999d963b8 progress: specify updatebar() function by constructor argument
Yuya Nishihara <yuya@tcha.org>
parents: 41142
diff changeset
  2122
            def updatebar(topic, pos, item, unit, total):
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42672
diff changeset
  2123
                self._fmsgerr.write(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42672
diff changeset
  2124
                    None,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42672
diff changeset
  2125
                    type=b'progress',
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42672
diff changeset
  2126
                    topic=topic,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42672
diff changeset
  2127
                    pos=pos,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42672
diff changeset
  2128
                    item=item,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42672
diff changeset
  2129
                    unit=unit,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42672
diff changeset
  2130
                    total=total,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42672
diff changeset
  2131
                )
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42672
diff changeset
  2132
41210
929999d963b8 progress: specify updatebar() function by constructor argument
Yuya Nishihara <yuya@tcha.org>
parents: 41142
diff changeset
  2133
        elif self._progbar is not None:
929999d963b8 progress: specify updatebar() function by constructor argument
Yuya Nishihara <yuya@tcha.org>
parents: 41142
diff changeset
  2134
            updatebar = self._progbar.progress
929999d963b8 progress: specify updatebar() function by constructor argument
Yuya Nishihara <yuya@tcha.org>
parents: 41142
diff changeset
  2135
        else:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42672
diff changeset
  2136
41210
929999d963b8 progress: specify updatebar() function by constructor argument
Yuya Nishihara <yuya@tcha.org>
parents: 41142
diff changeset
  2137
            def updatebar(topic, pos, item, unit, total):
929999d963b8 progress: specify updatebar() function by constructor argument
Yuya Nishihara <yuya@tcha.org>
parents: 41142
diff changeset
  2138
                pass
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42672
diff changeset
  2139
41210
929999d963b8 progress: specify updatebar() function by constructor argument
Yuya Nishihara <yuya@tcha.org>
parents: 41142
diff changeset
  2140
        return scmutil.progress(self, updatebar, topic, unit, total)
38345
bec1212eceaa progress: create helper class for incrementing progress
Martin von Zweigbergk <martinvonz@google.com>
parents: 38164
diff changeset
  2141
40730
55b053af7196 ui: manage logger instances and event filtering by core ui
Yuya Nishihara <yuya@tcha.org>
parents: 40678
diff changeset
  2142
    def getlogger(self, name):
55b053af7196 ui: manage logger instances and event filtering by core ui
Yuya Nishihara <yuya@tcha.org>
parents: 40678
diff changeset
  2143
        """Returns a logger of the given name; or None if not registered"""
55b053af7196 ui: manage logger instances and event filtering by core ui
Yuya Nishihara <yuya@tcha.org>
parents: 40678
diff changeset
  2144
        return self._loggers.get(name)
55b053af7196 ui: manage logger instances and event filtering by core ui
Yuya Nishihara <yuya@tcha.org>
parents: 40678
diff changeset
  2145
49797
0449fb7729d7 typing: add trivial type hints to mercurial/ui.py
Matt Harbison <matt_harbison@yahoo.com>
parents: 49795
diff changeset
  2146
    def setlogger(self, name, logger) -> None:
40730
55b053af7196 ui: manage logger instances and event filtering by core ui
Yuya Nishihara <yuya@tcha.org>
parents: 40678
diff changeset
  2147
        """Install logger which can be identified later by the given name
55b053af7196 ui: manage logger instances and event filtering by core ui
Yuya Nishihara <yuya@tcha.org>
parents: 40678
diff changeset
  2148
55b053af7196 ui: manage logger instances and event filtering by core ui
Yuya Nishihara <yuya@tcha.org>
parents: 40678
diff changeset
  2149
        More than one loggers can be registered. Use extension or module
55b053af7196 ui: manage logger instances and event filtering by core ui
Yuya Nishihara <yuya@tcha.org>
parents: 40678
diff changeset
  2150
        name to uniquely identify the logger instance.
55b053af7196 ui: manage logger instances and event filtering by core ui
Yuya Nishihara <yuya@tcha.org>
parents: 40678
diff changeset
  2151
        """
55b053af7196 ui: manage logger instances and event filtering by core ui
Yuya Nishihara <yuya@tcha.org>
parents: 40678
diff changeset
  2152
        self._loggers[name] = logger
55b053af7196 ui: manage logger instances and event filtering by core ui
Yuya Nishihara <yuya@tcha.org>
parents: 40678
diff changeset
  2153
49797
0449fb7729d7 typing: add trivial type hints to mercurial/ui.py
Matt Harbison <matt_harbison@yahoo.com>
parents: 49795
diff changeset
  2154
    def log(self, event, msgfmt, *msgargs, **opts) -> None:
45942
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 45929
diff changeset
  2155
        """hook for logging facility extensions
11984
2db0fccc8143 ui: add logging hook
Matt Mackall <mpm@selenic.com>
parents: 11970
diff changeset
  2156
40678
c72a81bc2e82 ui: unify argument name of ui.log()
Yuya Nishihara <yuya@tcha.org>
parents: 40602
diff changeset
  2157
        event should be a readily-identifiable subsystem, which will
11984
2db0fccc8143 ui: add logging hook
Matt Mackall <mpm@selenic.com>
parents: 11970
diff changeset
  2158
        allow filtering.
26235
6c962145f523 ui: improve docs on ui.log
Augie Fackler <augie@google.com>
parents: 26189
diff changeset
  2159
40760
ffd574c144d2 ui: pass in formatted message to logger.log()
Yuya Nishihara <yuya@tcha.org>
parents: 40759
diff changeset
  2160
        msgfmt should be a newline-terminated format string to log, and
ffd574c144d2 ui: pass in formatted message to logger.log()
Yuya Nishihara <yuya@tcha.org>
parents: 40759
diff changeset
  2161
        *msgargs are %-formatted into it.
26235
6c962145f523 ui: improve docs on ui.log
Augie Fackler <augie@google.com>
parents: 26189
diff changeset
  2162
6c962145f523 ui: improve docs on ui.log
Augie Fackler <augie@google.com>
parents: 26189
diff changeset
  2163
        **opts currently has no defined meanings.
45942
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 45929
diff changeset
  2164
        """
40730
55b053af7196 ui: manage logger instances and event filtering by core ui
Yuya Nishihara <yuya@tcha.org>
parents: 40678
diff changeset
  2165
        if not self._loggers:
55b053af7196 ui: manage logger instances and event filtering by core ui
Yuya Nishihara <yuya@tcha.org>
parents: 40678
diff changeset
  2166
            return
48935
2cce2fa5bcf7 py3: replace pycompat.itervalues(x) with x.values()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48933
diff changeset
  2167
        activeloggers = [l for l in self._loggers.values() if l.tracked(event)]
40730
55b053af7196 ui: manage logger instances and event filtering by core ui
Yuya Nishihara <yuya@tcha.org>
parents: 40678
diff changeset
  2168
        if not activeloggers:
55b053af7196 ui: manage logger instances and event filtering by core ui
Yuya Nishihara <yuya@tcha.org>
parents: 40678
diff changeset
  2169
            return
40760
ffd574c144d2 ui: pass in formatted message to logger.log()
Yuya Nishihara <yuya@tcha.org>
parents: 40759
diff changeset
  2170
        msg = msgfmt % msgargs
40761
691c68bc1222 ui: pass in bytes opts dict to logger.log()
Yuya Nishihara <yuya@tcha.org>
parents: 40760
diff changeset
  2171
        opts = pycompat.byteskwargs(opts)
40759
fdc6eb1d650d blackbox: send debug message to logger by core ui
Yuya Nishihara <yuya@tcha.org>
parents: 40730
diff changeset
  2172
        # guard against recursion from e.g. ui.debug()
fdc6eb1d650d blackbox: send debug message to logger by core ui
Yuya Nishihara <yuya@tcha.org>
parents: 40730
diff changeset
  2173
        registeredloggers = self._loggers
fdc6eb1d650d blackbox: send debug message to logger by core ui
Yuya Nishihara <yuya@tcha.org>
parents: 40730
diff changeset
  2174
        self._loggers = {}
fdc6eb1d650d blackbox: send debug message to logger by core ui
Yuya Nishihara <yuya@tcha.org>
parents: 40730
diff changeset
  2175
        try:
fdc6eb1d650d blackbox: send debug message to logger by core ui
Yuya Nishihara <yuya@tcha.org>
parents: 40730
diff changeset
  2176
            for logger in activeloggers:
fdc6eb1d650d blackbox: send debug message to logger by core ui
Yuya Nishihara <yuya@tcha.org>
parents: 40730
diff changeset
  2177
                logger.log(self, event, msg, opts)
fdc6eb1d650d blackbox: send debug message to logger by core ui
Yuya Nishihara <yuya@tcha.org>
parents: 40730
diff changeset
  2178
        finally:
fdc6eb1d650d blackbox: send debug message to logger by core ui
Yuya Nishihara <yuya@tcha.org>
parents: 40730
diff changeset
  2179
            self._loggers = registeredloggers
11984
2db0fccc8143 ui: add logging hook
Matt Mackall <mpm@selenic.com>
parents: 11970
diff changeset
  2180
49795
f1e820cda2f5 typing: add type hints related to message output in mercurial/ui.py
Matt Harbison <matt_harbison@yahoo.com>
parents: 49794
diff changeset
  2181
    def label(self, msg: bytes, label: bytes) -> bytes:
45942
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 45929
diff changeset
  2182
        """style msg based on supplied label
10815
32b213b9b22c ui: add ui.write() output labeling API
Brodie Rao <brodie@bitheap.org>
parents: 10567
diff changeset
  2183
31087
894bdcdc75df color: move the 'colorlabel' call to the core 'ui' class
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 31083
diff changeset
  2184
        If some color mode is enabled, this will add the necessary control
894bdcdc75df color: move the 'colorlabel' call to the core 'ui' class
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 31083
diff changeset
  2185
        characters to apply such color. In addition, 'debug' color mode adds
894bdcdc75df color: move the 'colorlabel' call to the core 'ui' class
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 31083
diff changeset
  2186
        markup showing which label affects a piece of text.
10815
32b213b9b22c ui: add ui.write() output labeling API
Brodie Rao <brodie@bitheap.org>
parents: 10567
diff changeset
  2187
32b213b9b22c ui: add ui.write() output labeling API
Brodie Rao <brodie@bitheap.org>
parents: 10567
diff changeset
  2188
        ui.write(s, 'label') is equivalent to
32b213b9b22c ui: add ui.write() output labeling API
Brodie Rao <brodie@bitheap.org>
parents: 10567
diff changeset
  2189
        ui.write(ui.label(s, 'label')).
45942
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 45929
diff changeset
  2190
        """
31087
894bdcdc75df color: move the 'colorlabel' call to the core 'ui' class
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 31083
diff changeset
  2191
        if self._colormode is not None:
894bdcdc75df color: move the 'colorlabel' call to the core 'ui' class
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 31083
diff changeset
  2192
            return color.colorlabel(self, msg, label)
10815
32b213b9b22c ui: add ui.write() output labeling API
Brodie Rao <brodie@bitheap.org>
parents: 10567
diff changeset
  2193
        return msg
24250
9c32eea2ca04 ui: represent paths as classes
Gregory Szorc <gregory.szorc@gmail.com>
parents: 23269
diff changeset
  2194
49795
f1e820cda2f5 typing: add type hints related to message output in mercurial/ui.py
Matt Harbison <matt_harbison@yahoo.com>
parents: 49794
diff changeset
  2195
    def develwarn(
f1e820cda2f5 typing: add type hints related to message output in mercurial/ui.py
Matt Harbison <matt_harbison@yahoo.com>
parents: 49794
diff changeset
  2196
        self, msg: bytes, stacklevel: int = 1, config: Optional[bytes] = None
f1e820cda2f5 typing: add type hints related to message output in mercurial/ui.py
Matt Harbison <matt_harbison@yahoo.com>
parents: 49794
diff changeset
  2197
    ) -> None:
27274
82910fdc216f ui: add a 'stacklevel' argument to 'develwarn'
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 27266
diff changeset
  2198
        """issue a developer warning message
82910fdc216f ui: add a 'stacklevel' argument to 'develwarn'
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 27266
diff changeset
  2199
82910fdc216f ui: add a 'stacklevel' argument to 'develwarn'
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 27266
diff changeset
  2200
        Use 'stacklevel' to report the offender some layers further up in the
82910fdc216f ui: add a 'stacklevel' argument to 'develwarn'
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 27266
diff changeset
  2201
        stack.
82910fdc216f ui: add a 'stacklevel' argument to 'develwarn'
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 27266
diff changeset
  2202
        """
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  2203
        if not self.configbool(b'devel', b'all-warnings'):
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  2204
            if config is None or not self.configbool(b'devel', config):
29095
3f33831a9202 develwarn: move config gating inside the develwarn function
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 29082
diff changeset
  2205
                return
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  2206
        msg = b'devel-warn: ' + msg
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42672
diff changeset
  2207
        stacklevel += 1  # get in develwarn
25629
52e5f68d8363 devel-warn: move the develwarn function as a method of the ui object
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 25568
diff changeset
  2208
        if self.tracebackflag:
40543
7bffbbe03e90 ui: hide fin/fout/ferr attributes behind @property functions
Yuya Nishihara <yuya@tcha.org>
parents: 40542
diff changeset
  2209
            util.debugstacktrace(msg, stacklevel, self._ferr, self._fout)
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42672
diff changeset
  2210
            self.log(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  2211
                b'develwarn',
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  2212
                b'%s at:\n%s'
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  2213
                % (msg, b''.join(util.getstackframes(stacklevel))),
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42672
diff changeset
  2214
            )
25629
52e5f68d8363 devel-warn: move the develwarn function as a method of the ui object
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 25568
diff changeset
  2215
        else:
52e5f68d8363 devel-warn: move the develwarn function as a method of the ui object
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 25568
diff changeset
  2216
            curframe = inspect.currentframe()
52e5f68d8363 devel-warn: move the develwarn function as a method of the ui object
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 25568
diff changeset
  2217
            calframe = inspect.getouterframes(curframe, 2)
36127
df1760b58fda ui: convert stack traces to sysbytes before logging
Augie Fackler <augie@google.com>
parents: 36126
diff changeset
  2218
            fname, lineno, fmsg = calframe[stacklevel][1:4]
df1760b58fda ui: convert stack traces to sysbytes before logging
Augie Fackler <augie@google.com>
parents: 36126
diff changeset
  2219
            fname, fmsg = pycompat.sysbytes(fname), pycompat.sysbytes(fmsg)
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  2220
            self.write_err(b'%s at: %s:%d (%s)\n' % (msg, fname, lineno, fmsg))
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42672
diff changeset
  2221
            self.log(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  2222
                b'develwarn', b'%s at: %s:%d (%s)\n', msg, fname, lineno, fmsg
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42672
diff changeset
  2223
            )
43991
e3ce3731d621 ui: delete local variables instead of setting to `None`
Matt Harbison <matt_harbison@yahoo.com>
parents: 43910
diff changeset
  2224
e3ce3731d621 ui: delete local variables instead of setting to `None`
Matt Harbison <matt_harbison@yahoo.com>
parents: 43910
diff changeset
  2225
            # avoid cycles
e3ce3731d621 ui: delete local variables instead of setting to `None`
Matt Harbison <matt_harbison@yahoo.com>
parents: 43910
diff changeset
  2226
            del curframe
e3ce3731d621 ui: delete local variables instead of setting to `None`
Matt Harbison <matt_harbison@yahoo.com>
parents: 43910
diff changeset
  2227
            del calframe
25629
52e5f68d8363 devel-warn: move the develwarn function as a method of the ui object
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 25568
diff changeset
  2228
49795
f1e820cda2f5 typing: add type hints related to message output in mercurial/ui.py
Matt Harbison <matt_harbison@yahoo.com>
parents: 49794
diff changeset
  2229
    def deprecwarn(
f1e820cda2f5 typing: add type hints related to message output in mercurial/ui.py
Matt Harbison <matt_harbison@yahoo.com>
parents: 49794
diff changeset
  2230
        self, msg: bytes, version: bytes, stacklevel: int = 2
f1e820cda2f5 typing: add type hints related to message output in mercurial/ui.py
Matt Harbison <matt_harbison@yahoo.com>
parents: 49794
diff changeset
  2231
    ) -> None:
27275
f2cd240f2f7c ui: add a 'deprecwarn' helper to issue deprecation warnings
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 27274
diff changeset
  2232
        """issue a deprecation warning
f2cd240f2f7c ui: add a 'deprecwarn' helper to issue deprecation warnings
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 27274
diff changeset
  2233
f2cd240f2f7c ui: add a 'deprecwarn' helper to issue deprecation warnings
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 27274
diff changeset
  2234
        - msg: message explaining what is deprecated and how to upgrade,
f2cd240f2f7c ui: add a 'deprecwarn' helper to issue deprecation warnings
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 27274
diff changeset
  2235
        - version: last version where the API will be supported,
f2cd240f2f7c ui: add a 'deprecwarn' helper to issue deprecation warnings
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 27274
diff changeset
  2236
        """
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42672
diff changeset
  2237
        if not (
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  2238
            self.configbool(b'devel', b'all-warnings')
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  2239
            or self.configbool(b'devel', b'deprec-warn')
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42672
diff changeset
  2240
        ):
29082
77de985d7c91 deprecation: gate deprecation warning behind devel configuration
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 28962
diff changeset
  2241
            return
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42672
diff changeset
  2242
        msg += (
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  2243
            b"\n(compatibility will be dropped after Mercurial-%s,"
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  2244
            b" update your code.)"
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42672
diff changeset
  2245
        ) % version
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  2246
        self.develwarn(msg, stacklevel=stacklevel, config=b'deprec-warn')
25629
52e5f68d8363 devel-warn: move the develwarn function as a method of the ui object
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 25568
diff changeset
  2247
30832
da5fa0f13a41 ui: introduce an experimental dict of exportable environment variables
Matt Harbison <matt_harbison@yahoo.com>
parents: 30814
diff changeset
  2248
    def exportableenviron(self):
da5fa0f13a41 ui: introduce an experimental dict of exportable environment variables
Matt Harbison <matt_harbison@yahoo.com>
parents: 30814
diff changeset
  2249
        """The environment variables that are safe to export, e.g. through
da5fa0f13a41 ui: introduce an experimental dict of exportable environment variables
Matt Harbison <matt_harbison@yahoo.com>
parents: 30814
diff changeset
  2250
        hgweb.
da5fa0f13a41 ui: introduce an experimental dict of exportable environment variables
Matt Harbison <matt_harbison@yahoo.com>
parents: 30814
diff changeset
  2251
        """
da5fa0f13a41 ui: introduce an experimental dict of exportable environment variables
Matt Harbison <matt_harbison@yahoo.com>
parents: 30814
diff changeset
  2252
        return self._exportableenviron
da5fa0f13a41 ui: introduce an experimental dict of exportable environment variables
Matt Harbison <matt_harbison@yahoo.com>
parents: 30814
diff changeset
  2253
30480
b0a8337ba9af ui: add configoverride context manager
Kostia Balytskyi <ikostia@fb.com>
parents: 30473
diff changeset
  2254
    @contextlib.contextmanager
49797
0449fb7729d7 typing: add trivial type hints to mercurial/ui.py
Matt Harbison <matt_harbison@yahoo.com>
parents: 49795
diff changeset
  2255
    def configoverride(self, overrides: _ConfigItems, source: bytes = b""):
30480
b0a8337ba9af ui: add configoverride context manager
Kostia Balytskyi <ikostia@fb.com>
parents: 30473
diff changeset
  2256
        """Context manager for temporary config overrides
b0a8337ba9af ui: add configoverride context manager
Kostia Balytskyi <ikostia@fb.com>
parents: 30473
diff changeset
  2257
        `overrides` must be a dict of the following structure:
b0a8337ba9af ui: add configoverride context manager
Kostia Balytskyi <ikostia@fb.com>
parents: 30473
diff changeset
  2258
        {(section, name) : value}"""
b0a8337ba9af ui: add configoverride context manager
Kostia Balytskyi <ikostia@fb.com>
parents: 30473
diff changeset
  2259
        backups = {}
30537
4b0e6677eed1 ui: use try..finally in configoverride
Gregory Szorc <gregory.szorc@gmail.com>
parents: 30519
diff changeset
  2260
        try:
4b0e6677eed1 ui: use try..finally in configoverride
Gregory Szorc <gregory.szorc@gmail.com>
parents: 30519
diff changeset
  2261
            for (section, name), value in overrides.items():
4b0e6677eed1 ui: use try..finally in configoverride
Gregory Szorc <gregory.szorc@gmail.com>
parents: 30519
diff changeset
  2262
                backups[(section, name)] = self.backupconfig(section, name)
4b0e6677eed1 ui: use try..finally in configoverride
Gregory Szorc <gregory.szorc@gmail.com>
parents: 30519
diff changeset
  2263
                self.setconfig(section, name, value, source)
4b0e6677eed1 ui: use try..finally in configoverride
Gregory Szorc <gregory.szorc@gmail.com>
parents: 30519
diff changeset
  2264
            yield
4b0e6677eed1 ui: use try..finally in configoverride
Gregory Szorc <gregory.szorc@gmail.com>
parents: 30519
diff changeset
  2265
        finally:
4b0e6677eed1 ui: use try..finally in configoverride
Gregory Szorc <gregory.szorc@gmail.com>
parents: 30519
diff changeset
  2266
            for __, backup in backups.items():
4b0e6677eed1 ui: use try..finally in configoverride
Gregory Szorc <gregory.szorc@gmail.com>
parents: 30519
diff changeset
  2267
                self.restoreconfig(backup)
4b0e6677eed1 ui: use try..finally in configoverride
Gregory Szorc <gregory.szorc@gmail.com>
parents: 30519
diff changeset
  2268
            # just restoring ui.quiet config to the previous value is not enough
4b0e6677eed1 ui: use try..finally in configoverride
Gregory Szorc <gregory.szorc@gmail.com>
parents: 30519
diff changeset
  2269
            # as it does not update ui.quiet class member
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  2270
            if (b'ui', b'quiet') in overrides:
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  2271
                self.fixconfig(section=b'ui')
30480
b0a8337ba9af ui: add configoverride context manager
Kostia Balytskyi <ikostia@fb.com>
parents: 30473
diff changeset
  2272
49797
0449fb7729d7 typing: add trivial type hints to mercurial/ui.py
Matt Harbison <matt_harbison@yahoo.com>
parents: 49795
diff changeset
  2273
    def estimatememory(self) -> Optional[int]:
45061
02b17231f6c3 util: provide a helper function to estimate RAM size
Joerg Sonnenberger <joerg@bec.de>
parents: 45033
diff changeset
  2274
        """Provide an estimate for the available system memory in Bytes.
02b17231f6c3 util: provide a helper function to estimate RAM size
Joerg Sonnenberger <joerg@bec.de>
parents: 45033
diff changeset
  2275
02b17231f6c3 util: provide a helper function to estimate RAM size
Joerg Sonnenberger <joerg@bec.de>
parents: 45033
diff changeset
  2276
        This can be overriden via ui.available-memory. It returns None, if
02b17231f6c3 util: provide a helper function to estimate RAM size
Joerg Sonnenberger <joerg@bec.de>
parents: 45033
diff changeset
  2277
        no estimate can be computed.
02b17231f6c3 util: provide a helper function to estimate RAM size
Joerg Sonnenberger <joerg@bec.de>
parents: 45033
diff changeset
  2278
        """
02b17231f6c3 util: provide a helper function to estimate RAM size
Joerg Sonnenberger <joerg@bec.de>
parents: 45033
diff changeset
  2279
        value = self.config(b'ui', b'available-memory')
02b17231f6c3 util: provide a helper function to estimate RAM size
Joerg Sonnenberger <joerg@bec.de>
parents: 45033
diff changeset
  2280
        if value is not None:
02b17231f6c3 util: provide a helper function to estimate RAM size
Joerg Sonnenberger <joerg@bec.de>
parents: 45033
diff changeset
  2281
            try:
02b17231f6c3 util: provide a helper function to estimate RAM size
Joerg Sonnenberger <joerg@bec.de>
parents: 45033
diff changeset
  2282
                return util.sizetoint(value)
02b17231f6c3 util: provide a helper function to estimate RAM size
Joerg Sonnenberger <joerg@bec.de>
parents: 45033
diff changeset
  2283
            except error.ParseError:
02b17231f6c3 util: provide a helper function to estimate RAM size
Joerg Sonnenberger <joerg@bec.de>
parents: 45033
diff changeset
  2284
                raise error.ConfigError(
02b17231f6c3 util: provide a helper function to estimate RAM size
Joerg Sonnenberger <joerg@bec.de>
parents: 45033
diff changeset
  2285
                    _(b"ui.available-memory value is invalid ('%s')") % value
02b17231f6c3 util: provide a helper function to estimate RAM size
Joerg Sonnenberger <joerg@bec.de>
parents: 45033
diff changeset
  2286
                )
02b17231f6c3 util: provide a helper function to estimate RAM size
Joerg Sonnenberger <joerg@bec.de>
parents: 45033
diff changeset
  2287
        return util._estimatememory()
02b17231f6c3 util: provide a helper function to estimate RAM size
Joerg Sonnenberger <joerg@bec.de>
parents: 45033
diff changeset
  2288
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42672
diff changeset
  2289
25498
7a5335ed7e1a progress: move the singleton logic to the ui module
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 25363
diff changeset
  2290
# we instantiate one globally shared progress bar to avoid
7a5335ed7e1a progress: move the singleton logic to the ui module
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 25363
diff changeset
  2291
# competing progress bars when multiple UI objects get created
49794
25fe689a4a64 typing: add type hints related to progress bars in mercurial/ui.py
Matt Harbison <matt_harbison@yahoo.com>
parents: 49793
diff changeset
  2292
_progresssingleton: Optional[progress.progbar] = None
25498
7a5335ed7e1a progress: move the singleton logic to the ui module
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 25363
diff changeset
  2293
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42672
diff changeset
  2294
49794
25fe689a4a64 typing: add type hints related to progress bars in mercurial/ui.py
Matt Harbison <matt_harbison@yahoo.com>
parents: 49793
diff changeset
  2295
def getprogbar(ui: ui) -> progress.progbar:
25498
7a5335ed7e1a progress: move the singleton logic to the ui module
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 25363
diff changeset
  2296
    global _progresssingleton
7a5335ed7e1a progress: move the singleton logic to the ui module
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 25363
diff changeset
  2297
    if _progresssingleton is None:
7a5335ed7e1a progress: move the singleton logic to the ui module
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 25363
diff changeset
  2298
        # passing 'ui' object to the singleton is fishy,
7a5335ed7e1a progress: move the singleton logic to the ui module
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 25363
diff changeset
  2299
        # this is how the extension used to work but feel free to rework it.
7a5335ed7e1a progress: move the singleton logic to the ui module
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 25363
diff changeset
  2300
        _progresssingleton = progress.progbar(ui)
7a5335ed7e1a progress: move the singleton logic to the ui module
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 25363
diff changeset
  2301
    return _progresssingleton
34351
0e4bed5c5c38 ui: check for progress singleton when clearing progress bar (issue5684)
Mark Thomas <mbthomas@fb.com>
parents: 33755
diff changeset
  2302
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42672
diff changeset
  2303
49794
25fe689a4a64 typing: add type hints related to progress bars in mercurial/ui.py
Matt Harbison <matt_harbison@yahoo.com>
parents: 49793
diff changeset
  2304
def haveprogbar() -> bool:
34351
0e4bed5c5c38 ui: check for progress singleton when clearing progress bar (issue5684)
Mark Thomas <mbthomas@fb.com>
parents: 33755
diff changeset
  2305
    return _progresssingleton is not None
40547
840cd57cde32 ui: add config knob to redirect status messages to stderr (API)
Yuya Nishihara <yuya@tcha.org>
parents: 40543
diff changeset
  2306
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42672
diff changeset
  2307
49797
0449fb7729d7 typing: add trivial type hints to mercurial/ui.py
Matt Harbison <matt_harbison@yahoo.com>
parents: 49795
diff changeset
  2308
def _selectmsgdests(ui: ui):
40547
840cd57cde32 ui: add config knob to redirect status messages to stderr (API)
Yuya Nishihara <yuya@tcha.org>
parents: 40543
diff changeset
  2309
    name = ui.config(b'ui', b'message-output')
40589
054d0fcba2c4 commandserver: add experimental option to use separate message channel
Yuya Nishihara <yuya@tcha.org>
parents: 40587
diff changeset
  2310
    if name == b'channel':
054d0fcba2c4 commandserver: add experimental option to use separate message channel
Yuya Nishihara <yuya@tcha.org>
parents: 40587
diff changeset
  2311
        if ui.fmsg:
054d0fcba2c4 commandserver: add experimental option to use separate message channel
Yuya Nishihara <yuya@tcha.org>
parents: 40587
diff changeset
  2312
            return ui.fmsg, ui.fmsg
054d0fcba2c4 commandserver: add experimental option to use separate message channel
Yuya Nishihara <yuya@tcha.org>
parents: 40587
diff changeset
  2313
        else:
054d0fcba2c4 commandserver: add experimental option to use separate message channel
Yuya Nishihara <yuya@tcha.org>
parents: 40587
diff changeset
  2314
            # fall back to ferr if channel isn't ready so that status/error
054d0fcba2c4 commandserver: add experimental option to use separate message channel
Yuya Nishihara <yuya@tcha.org>
parents: 40587
diff changeset
  2315
            # messages can be printed
054d0fcba2c4 commandserver: add experimental option to use separate message channel
Yuya Nishihara <yuya@tcha.org>
parents: 40587
diff changeset
  2316
            return ui.ferr, ui.ferr
40547
840cd57cde32 ui: add config knob to redirect status messages to stderr (API)
Yuya Nishihara <yuya@tcha.org>
parents: 40543
diff changeset
  2317
    if name == b'stdio':
840cd57cde32 ui: add config knob to redirect status messages to stderr (API)
Yuya Nishihara <yuya@tcha.org>
parents: 40543
diff changeset
  2318
        return ui.fout, ui.ferr
840cd57cde32 ui: add config knob to redirect status messages to stderr (API)
Yuya Nishihara <yuya@tcha.org>
parents: 40543
diff changeset
  2319
    if name == b'stderr':
840cd57cde32 ui: add config knob to redirect status messages to stderr (API)
Yuya Nishihara <yuya@tcha.org>
parents: 40543
diff changeset
  2320
        return ui.ferr, ui.ferr
840cd57cde32 ui: add config knob to redirect status messages to stderr (API)
Yuya Nishihara <yuya@tcha.org>
parents: 40543
diff changeset
  2321
    raise error.Abort(b'invalid ui.message-output destination: %s' % name)
40590
83dd8c63a0c6 ui: extract helpers to write message with type or label
Yuya Nishihara <yuya@tcha.org>
parents: 40589
diff changeset
  2322
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42672
diff changeset
  2323
49795
f1e820cda2f5 typing: add type hints related to message output in mercurial/ui.py
Matt Harbison <matt_harbison@yahoo.com>
parents: 49794
diff changeset
  2324
def _writemsgwith(write, dest, *args: bytes, **opts: _MsgOpts) -> None:
40590
83dd8c63a0c6 ui: extract helpers to write message with type or label
Yuya Nishihara <yuya@tcha.org>
parents: 40589
diff changeset
  2325
    """Write ui message with the given ui._write*() function
83dd8c63a0c6 ui: extract helpers to write message with type or label
Yuya Nishihara <yuya@tcha.org>
parents: 40589
diff changeset
  2326
83dd8c63a0c6 ui: extract helpers to write message with type or label
Yuya Nishihara <yuya@tcha.org>
parents: 40589
diff changeset
  2327
    The specified message type is translated to 'ui.<type>' label if the dest
83dd8c63a0c6 ui: extract helpers to write message with type or label
Yuya Nishihara <yuya@tcha.org>
parents: 40589
diff changeset
  2328
    isn't a structured channel, so that the message will be colorized.
83dd8c63a0c6 ui: extract helpers to write message with type or label
Yuya Nishihara <yuya@tcha.org>
parents: 40589
diff changeset
  2329
    """
83dd8c63a0c6 ui: extract helpers to write message with type or label
Yuya Nishihara <yuya@tcha.org>
parents: 40589
diff changeset
  2330
    # TODO: maybe change 'type' to a mandatory option
43506
9f70512ae2cf cleanup: remove pointless r-prefixes on single-quoted strings
Augie Fackler <augie@google.com>
parents: 43377
diff changeset
  2331
    if 'type' in opts and not getattr(dest, 'structured', False):
9f70512ae2cf cleanup: remove pointless r-prefixes on single-quoted strings
Augie Fackler <augie@google.com>
parents: 43377
diff changeset
  2332
        opts['label'] = opts.get('label', b'') + b' ui.%s' % opts.pop('type')
40590
83dd8c63a0c6 ui: extract helpers to write message with type or label
Yuya Nishihara <yuya@tcha.org>
parents: 40589
diff changeset
  2333
    write(dest, *args, **opts)