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