Mercurial > hg-stable
annotate mercurial/ui.py @ 38528:313a940d49a3
ui: add an uninterruptable context manager that can block SIGINT
The blocking of SIGINT is not done by default, but my hope is that we
will one day. This was inspired by Facebook's "nointerrupt" extension,
which is a bit more heavy-handed than this (whole commands are treated
as unsafe to interrupt). A future patch will enable this for varying
bits of Mercurial that are performing unsafe operations.
It's intentional that the KeyboardInterrupt is raised as the context
manager exits: during the span of the context manager interrupting
Mercurial could lead to data loss, but typically those spans are
fairly narrow, so we can let the unsafe block complete and then
terminate hg (which will leave the repo in a consistent state, even if
it's not the user's desired state).
.. api::
New context manager ``ui.uninterruptable()`` to mark portions of a command
as potentially unsafe places to interrupt Mercurial with Control-C or
similar.
Differential Revision: https://phab.mercurial-scm.org/D3716
author | Augie Fackler <augie@google.com> |
---|---|
date | Wed, 27 Jun 2018 10:47:14 -0400 |
parents | bec1212eceaa |
children | 152f4822d210 |
rev | line source |
---|---|
207 | 1 # ui.py - user interface bits for mercurial |
2 # | |
4635
63b9d2deed48
Updated copyright notices and add "and others" to "hg version"
Thomas Arendsen Hein <thomas@intevation.de>
parents:
4633
diff
changeset
|
3 # Copyright 2005-2007 Matt Mackall <mpm@selenic.com> |
207 | 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 | 6 # GNU General Public License version 2 or any later version. |
207 | 7 |
25989
2cc4e8385661
ui: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents:
25660
diff
changeset
|
8 from __future__ import absolute_import |
2cc4e8385661
ui: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents:
25660
diff
changeset
|
9 |
30996
e92daf156d5c
ui: provide a mechanism to track and log blocked time
Simon Farnsworth <simonfar@fb.com>
parents:
30965
diff
changeset
|
10 import collections |
30489
b0a8337ba9af
ui: add configoverride context manager
Kostia Balytskyi <ikostia@fb.com>
parents:
30482
diff
changeset
|
11 import contextlib |
25989
2cc4e8385661
ui: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents:
25660
diff
changeset
|
12 import errno |
2cc4e8385661
ui: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents:
25660
diff
changeset
|
13 import getpass |
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
|
14 import inspect |
25989
2cc4e8385661
ui: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents:
25660
diff
changeset
|
15 import os |
27392
00aa37c65e0a
ui: try to handle $$ more robustly in prompts (issue4970)
Matt Mackall <mpm@selenic.com>
parents:
26820
diff
changeset
|
16 import re |
31012
61b4122019d3
pager: move pager-initiating code into core
Augie Fackler <augie@google.com>
parents:
31000
diff
changeset
|
17 import signal |
25989
2cc4e8385661
ui: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents:
25660
diff
changeset
|
18 import socket |
31012
61b4122019d3
pager: move pager-initiating code into core
Augie Fackler <augie@google.com>
parents:
31000
diff
changeset
|
19 import subprocess |
25989
2cc4e8385661
ui: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents:
25660
diff
changeset
|
20 import sys |
2cc4e8385661
ui: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents:
25660
diff
changeset
|
21 import traceback |
2cc4e8385661
ui: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents:
25660
diff
changeset
|
22 |
2cc4e8385661
ui: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents:
25660
diff
changeset
|
23 from .i18n import _ |
2cc4e8385661
ui: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents:
25660
diff
changeset
|
24 from .node import hex |
2cc4e8385661
ui: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents:
25660
diff
changeset
|
25 |
2cc4e8385661
ui: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents:
25660
diff
changeset
|
26 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
|
27 color, |
25989
2cc4e8385661
ui: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents:
25660
diff
changeset
|
28 config, |
33002
6d983e8af49c
configitems: introduce a central registry for config option
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
32985
diff
changeset
|
29 configitems, |
30291
e9fca89c6d58
py3: use encoding.environ in ui.py
Pulkit Goyal <7895pulkit@gmail.com>
parents:
29982
diff
changeset
|
30 encoding, |
25989
2cc4e8385661
ui: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents:
25660
diff
changeset
|
31 error, |
2cc4e8385661
ui: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents:
25660
diff
changeset
|
32 formatter, |
2cc4e8385661
ui: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents:
25660
diff
changeset
|
33 progress, |
30528
20a42325fdef
py3: use pycompat.getcwd() instead of os.getcwd()
Pulkit Goyal <7895pulkit@gmail.com>
parents:
30489
diff
changeset
|
34 pycompat, |
31684
0f8ba0bc1154
rcutil: move scmutil.*rcpath to rcutil (API)
Jun Wu <quark@fb.com>
parents:
31629
diff
changeset
|
35 rcutil, |
25989
2cc4e8385661
ui: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents:
25660
diff
changeset
|
36 scmutil, |
2cc4e8385661
ui: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents:
25660
diff
changeset
|
37 util, |
2cc4e8385661
ui: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents:
25660
diff
changeset
|
38 ) |
37087
f0b6fbea00cf
stringutil: bulk-replace call sites to point to new module
Yuya Nishihara <yuya@tcha.org>
parents:
36916
diff
changeset
|
39 from .utils import ( |
f0b6fbea00cf
stringutil: bulk-replace call sites to point to new module
Yuya Nishihara <yuya@tcha.org>
parents:
36916
diff
changeset
|
40 dateutil, |
37122
d4a2e0d5d042
procutil: bulk-replace util.std* to point to new module
Yuya Nishihara <yuya@tcha.org>
parents:
37087
diff
changeset
|
41 procutil, |
37087
f0b6fbea00cf
stringutil: bulk-replace call sites to point to new module
Yuya Nishihara <yuya@tcha.org>
parents:
36916
diff
changeset
|
42 stringutil, |
f0b6fbea00cf
stringutil: bulk-replace call sites to point to new module
Yuya Nishihara <yuya@tcha.org>
parents:
36916
diff
changeset
|
43 ) |
207 | 44 |
29378
fea71f66ebff
url: remember http password database in ui object
liscju <piotr.listkiewicz@gmail.com>
parents:
29366
diff
changeset
|
45 urlreq = util.urlreq |
fea71f66ebff
url: remember http password database in ui object
liscju <piotr.listkiewicz@gmail.com>
parents:
29366
diff
changeset
|
46 |
30999
fd598149112b
ui: time calls to ui.system
Simon Farnsworth <simonfar@fb.com>
parents:
30998
diff
changeset
|
47 # for use with str.translate(None, _keepalnum), to keep just alphanumerics |
31263
64596338ba10
py3: factor out bytechr() function
Yuya Nishihara <yuya@tcha.org>
parents:
31188
diff
changeset
|
48 _keepalnum = ''.join(c for c in map(pycompat.bytechr, range(256)) |
64596338ba10
py3: factor out bytechr() function
Yuya Nishihara <yuya@tcha.org>
parents:
31188
diff
changeset
|
49 if not c.isalnum()) |
30999
fd598149112b
ui: time calls to ui.system
Simon Farnsworth <simonfar@fb.com>
parents:
30998
diff
changeset
|
50 |
32890
9fcb6df413c9
ui: add support for a tweakdefaults knob
Augie Fackler <augie@google.com>
parents:
32605
diff
changeset
|
51 # The config knobs that will be altered (if unset) by ui.tweakdefaults. |
35951
704095e27c5c
py3: add b'' to tweakdefaults config string
Pulkit Goyal <7895pulkit@gmail.com>
parents:
35940
diff
changeset
|
52 tweakrc = b""" |
32890
9fcb6df413c9
ui: add support for a tweakdefaults knob
Augie Fackler <augie@google.com>
parents:
32605
diff
changeset
|
53 [ui] |
9fcb6df413c9
ui: add support for a tweakdefaults knob
Augie Fackler <augie@google.com>
parents:
32605
diff
changeset
|
54 # 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
|
55 rollback = False |
35090
929858db4d22
tweakdefaults: turn on ui.statuscopies
Martin von Zweigbergk <martinvonz@google.com>
parents:
35013
diff
changeset
|
56 # Make `hg status` report copy information |
929858db4d22
tweakdefaults: turn on ui.statuscopies
Martin von Zweigbergk <martinvonz@google.com>
parents:
35013
diff
changeset
|
57 statuscopies = yes |
35315
03a83ace9816
ui: add curses interface to tweakdefaults
Augie Fackler <augie@google.com>
parents:
35197
diff
changeset
|
58 # 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
|
59 interface = curses |
32890
9fcb6df413c9
ui: add support for a tweakdefaults knob
Augie Fackler <augie@google.com>
parents:
32605
diff
changeset
|
60 |
9fcb6df413c9
ui: add support for a tweakdefaults knob
Augie Fackler <augie@google.com>
parents:
32605
diff
changeset
|
61 [commands] |
9fcb6df413c9
ui: add support for a tweakdefaults knob
Augie Fackler <augie@google.com>
parents:
32605
diff
changeset
|
62 # Make `hg status` emit cwd-relative paths by default. |
9fcb6df413c9
ui: add support for a tweakdefaults knob
Augie Fackler <augie@google.com>
parents:
32605
diff
changeset
|
63 status.relative = yes |
34707
6cd8d8203204
tweakdefaults: make commands.update.check be `noconflict`
Augie Fackler <augie@google.com>
parents:
34645
diff
changeset
|
64 # 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
|
65 update.check = noconflict |
36916
98487ad0cf8b
tweakdefaults: add commands.status.verbose to tweakefaults
Pulkit Goyal <7895pulkit@gmail.com>
parents:
36842
diff
changeset
|
66 # Show conflicts information in `hg status` |
98487ad0cf8b
tweakdefaults: add commands.status.verbose to tweakefaults
Pulkit Goyal <7895pulkit@gmail.com>
parents:
36842
diff
changeset
|
67 status.verbose = True |
38134
6acf41bb8d40
status: add default of --terse=u to tweakdefaults (BC)
Augie Fackler <augie@google.com>
parents:
37961
diff
changeset
|
68 # Collapse entire directories that contain only unknown files |
6acf41bb8d40
status: add default of --terse=u to tweakdefaults (BC)
Augie Fackler <augie@google.com>
parents:
37961
diff
changeset
|
69 status.terse = u |
32890
9fcb6df413c9
ui: add support for a tweakdefaults knob
Augie Fackler <augie@google.com>
parents:
32605
diff
changeset
|
70 |
9fcb6df413c9
ui: add support for a tweakdefaults knob
Augie Fackler <augie@google.com>
parents:
32605
diff
changeset
|
71 [diff] |
9fcb6df413c9
ui: add support for a tweakdefaults knob
Augie Fackler <augie@google.com>
parents:
32605
diff
changeset
|
72 git = 1 |
35316
4caafe280488
ui: add diff.showfunc to tweakdefaults
Augie Fackler <augie@google.com>
parents:
35315
diff
changeset
|
73 showfunc = 1 |
32890
9fcb6df413c9
ui: add support for a tweakdefaults knob
Augie Fackler <augie@google.com>
parents:
32605
diff
changeset
|
74 """ |
9fcb6df413c9
ui: add support for a tweakdefaults knob
Augie Fackler <augie@google.com>
parents:
32605
diff
changeset
|
75 |
22419
fdfc9faca273
ui: move samplehgrcs from config
Matt Mackall <mpm@selenic.com>
parents:
22291
diff
changeset
|
76 samplehgrcs = { |
fdfc9faca273
ui: move samplehgrcs from config
Matt Mackall <mpm@selenic.com>
parents:
22291
diff
changeset
|
77 'user': |
33713
6294654453ee
py3: use bytes IO to write sample hgrc
Yuya Nishihara <yuya@tcha.org>
parents:
33585
diff
changeset
|
78 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
|
79 [ui] |
fdfc9faca273
ui: move samplehgrcs from config
Matt Mackall <mpm@selenic.com>
parents:
22291
diff
changeset
|
80 # name and email, e.g. |
fdfc9faca273
ui: move samplehgrcs from config
Matt Mackall <mpm@selenic.com>
parents:
22291
diff
changeset
|
81 # username = Jane Doe <jdoe@example.com> |
fdfc9faca273
ui: move samplehgrcs from config
Matt Mackall <mpm@selenic.com>
parents:
22291
diff
changeset
|
82 username = |
fdfc9faca273
ui: move samplehgrcs from config
Matt Mackall <mpm@selenic.com>
parents:
22291
diff
changeset
|
83 |
34568
63c19b7fa100
ui: recommend tweakdefaults in the default hgrc template
Augie Fackler <augie@google.com>
parents:
34482
diff
changeset
|
84 # 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
|
85 # 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
|
86 # writing scripts! |
63c19b7fa100
ui: recommend tweakdefaults in the default hgrc template
Augie Fackler <augie@google.com>
parents:
34482
diff
changeset
|
87 # tweakdefaults = True |
63c19b7fa100
ui: recommend tweakdefaults in the default hgrc template
Augie Fackler <augie@google.com>
parents:
34482
diff
changeset
|
88 |
32093
4d438efb825a
color: reflect the new default in the example hgrc
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
32078
diff
changeset
|
89 # 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
|
90 # (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
|
91 # 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
|
92 |
32100
21eb863187ea
pager: advertise the config option in the default hgrc
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
32097
diff
changeset
|
93 # 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
|
94 # (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
|
95 # 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
|
96 |
22419
fdfc9faca273
ui: move samplehgrcs from config
Matt Mackall <mpm@selenic.com>
parents:
22291
diff
changeset
|
97 [extensions] |
fdfc9faca273
ui: move samplehgrcs from config
Matt Mackall <mpm@selenic.com>
parents:
22291
diff
changeset
|
98 # uncomment these lines to enable some popular extensions |
29982
3d2ea1403c62
samplehgrcs: use single quotes in use warning
timeless <timeless@mozdev.org>
parents:
29774
diff
changeset
|
99 # (see 'hg help extensions' for more info) |
22419
fdfc9faca273
ui: move samplehgrcs from config
Matt Mackall <mpm@selenic.com>
parents:
22291
diff
changeset
|
100 # |
32096
726121fa86e1
config: use "churn" as an example extension
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
32094
diff
changeset
|
101 # churn = |
32097
601bfcddccdc
config: drop pager from the recommended extension
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
32096
diff
changeset
|
102 """, |
22419
fdfc9faca273
ui: move samplehgrcs from config
Matt Mackall <mpm@selenic.com>
parents:
22291
diff
changeset
|
103 |
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
|
104 'cloned': |
33713
6294654453ee
py3: use bytes IO to write sample hgrc
Yuya Nishihara <yuya@tcha.org>
parents:
33585
diff
changeset
|
105 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
|
106 [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
|
107 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
|
108 |
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
|
109 # 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
|
110 # (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
|
111 # |
30879
4431add9aef9
ui: replace obsolete default-push with default:pushurl (issue5485)
Rishabh Madan <rishabhmadan96@gmail.com>
parents:
30848
diff
changeset
|
112 # 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
|
113 # 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
|
114 # 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
|
115 |
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
|
116 [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
|
117 # 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
|
118 # 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
|
119 """, |
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
|
120 |
22419
fdfc9faca273
ui: move samplehgrcs from config
Matt Mackall <mpm@selenic.com>
parents:
22291
diff
changeset
|
121 'local': |
33713
6294654453ee
py3: use bytes IO to write sample hgrc
Yuya Nishihara <yuya@tcha.org>
parents:
33585
diff
changeset
|
122 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
|
123 [paths] |
5a831e4e6d7a
config: give a more detailed sample repo config
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
22783
diff
changeset
|
124 # 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
|
125 # (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
|
126 # |
30879
4431add9aef9
ui: replace obsolete default-push with default:pushurl (issue5485)
Rishabh Madan <rishabhmadan96@gmail.com>
parents:
30848
diff
changeset
|
127 # 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
|
128 # 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
|
129 # 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
|
130 # 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
|
131 |
5a831e4e6d7a
config: give a more detailed sample repo config
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
22783
diff
changeset
|
132 [ui] |
5a831e4e6d7a
config: give a more detailed sample repo config
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
22783
diff
changeset
|
133 # 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
|
134 # username = Jane Doe <jdoe@example.com> |
22419
fdfc9faca273
ui: move samplehgrcs from config
Matt Mackall <mpm@selenic.com>
parents:
22291
diff
changeset
|
135 """, |
fdfc9faca273
ui: move samplehgrcs from config
Matt Mackall <mpm@selenic.com>
parents:
22291
diff
changeset
|
136 |
fdfc9faca273
ui: move samplehgrcs from config
Matt Mackall <mpm@selenic.com>
parents:
22291
diff
changeset
|
137 'global': |
33713
6294654453ee
py3: use bytes IO to write sample hgrc
Yuya Nishihara <yuya@tcha.org>
parents:
33585
diff
changeset
|
138 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
|
139 |
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
|
140 [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
|
141 # 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
|
142 # (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
|
143 # 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
|
144 |
32100
21eb863187ea
pager: advertise the config option in the default hgrc
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
32097
diff
changeset
|
145 # 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
|
146 # (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
|
147 # 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
|
148 |
22419
fdfc9faca273
ui: move samplehgrcs from config
Matt Mackall <mpm@selenic.com>
parents:
22291
diff
changeset
|
149 [extensions] |
fdfc9faca273
ui: move samplehgrcs from config
Matt Mackall <mpm@selenic.com>
parents:
22291
diff
changeset
|
150 # uncomment these lines to enable some popular extensions |
29982
3d2ea1403c62
samplehgrcs: use single quotes in use warning
timeless <timeless@mozdev.org>
parents:
29774
diff
changeset
|
151 # (see 'hg help extensions' for more info) |
22419
fdfc9faca273
ui: move samplehgrcs from config
Matt Mackall <mpm@selenic.com>
parents:
22291
diff
changeset
|
152 # |
fdfc9faca273
ui: move samplehgrcs from config
Matt Mackall <mpm@selenic.com>
parents:
22291
diff
changeset
|
153 # blackbox = |
32096
726121fa86e1
config: use "churn" as an example extension
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
32094
diff
changeset
|
154 # churn = |
32097
601bfcddccdc
config: drop pager from the recommended extension
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
32096
diff
changeset
|
155 """, |
22419
fdfc9faca273
ui: move samplehgrcs from config
Matt Mackall <mpm@selenic.com>
parents:
22291
diff
changeset
|
156 } |
fdfc9faca273
ui: move samplehgrcs from config
Matt Mackall <mpm@selenic.com>
parents:
22291
diff
changeset
|
157 |
34482
75de5d456b60
ui: convert to/from Optional[bytes] to Optional[str] in password manager
Augie Fackler <augie@google.com>
parents:
34427
diff
changeset
|
158 def _maybestrurl(maybebytes): |
35940
72de5c504833
py3: factor out helpers to apply string conversion recursively
Yuya Nishihara <yuya@tcha.org>
parents:
35937
diff
changeset
|
159 return util.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
|
160 |
75de5d456b60
ui: convert to/from Optional[bytes] to Optional[str] in password manager
Augie Fackler <augie@google.com>
parents:
34427
diff
changeset
|
161 def _maybebytesurl(maybestr): |
35940
72de5c504833
py3: factor out helpers to apply string conversion recursively
Yuya Nishihara <yuya@tcha.org>
parents:
35937
diff
changeset
|
162 return util.rapply(pycompat.bytesurl, maybestr) |
30965
8b83b626fb1e
ui: remove urllib2 from being imported early
Kyle Lippincott <spectral@google.com>
parents:
30952
diff
changeset
|
163 |
8b83b626fb1e
ui: remove urllib2 from being imported early
Kyle Lippincott <spectral@google.com>
parents:
30952
diff
changeset
|
164 class httppasswordmgrdbproxy(object): |
8b83b626fb1e
ui: remove urllib2 from being imported early
Kyle Lippincott <spectral@google.com>
parents:
30952
diff
changeset
|
165 """Delays loading urllib2 until it's needed.""" |
8b83b626fb1e
ui: remove urllib2 from being imported early
Kyle Lippincott <spectral@google.com>
parents:
30952
diff
changeset
|
166 def __init__(self): |
8b83b626fb1e
ui: remove urllib2 from being imported early
Kyle Lippincott <spectral@google.com>
parents:
30952
diff
changeset
|
167 self._mgr = None |
8b83b626fb1e
ui: remove urllib2 from being imported early
Kyle Lippincott <spectral@google.com>
parents:
30952
diff
changeset
|
168 |
8b83b626fb1e
ui: remove urllib2 from being imported early
Kyle Lippincott <spectral@google.com>
parents:
30952
diff
changeset
|
169 def _get_mgr(self): |
8b83b626fb1e
ui: remove urllib2 from being imported early
Kyle Lippincott <spectral@google.com>
parents:
30952
diff
changeset
|
170 if self._mgr is None: |
8b83b626fb1e
ui: remove urllib2 from being imported early
Kyle Lippincott <spectral@google.com>
parents:
30952
diff
changeset
|
171 self._mgr = urlreq.httppasswordmgrwithdefaultrealm() |
8b83b626fb1e
ui: remove urllib2 from being imported early
Kyle Lippincott <spectral@google.com>
parents:
30952
diff
changeset
|
172 return self._mgr |
8b83b626fb1e
ui: remove urllib2 from being imported early
Kyle Lippincott <spectral@google.com>
parents:
30952
diff
changeset
|
173 |
34427
ae2fcf7af409
httppasswordmgrdbproxy: specify exact arguments
Augie Fackler <augie@google.com>
parents:
34368
diff
changeset
|
174 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
|
175 return self._get_mgr().add_password( |
35940
72de5c504833
py3: factor out helpers to apply string conversion recursively
Yuya Nishihara <yuya@tcha.org>
parents:
35937
diff
changeset
|
176 _maybestrurl(realm), _maybestrurl(uris), |
34482
75de5d456b60
ui: convert to/from Optional[bytes] to Optional[str] in password manager
Augie Fackler <augie@google.com>
parents:
34427
diff
changeset
|
177 _maybestrurl(user), _maybestrurl(passwd)) |
30965
8b83b626fb1e
ui: remove urllib2 from being imported early
Kyle Lippincott <spectral@google.com>
parents:
30952
diff
changeset
|
178 |
34427
ae2fcf7af409
httppasswordmgrdbproxy: specify exact arguments
Augie Fackler <augie@google.com>
parents:
34368
diff
changeset
|
179 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
|
180 mgr = self._get_mgr() |
72de5c504833
py3: factor out helpers to apply string conversion recursively
Yuya Nishihara <yuya@tcha.org>
parents:
35937
diff
changeset
|
181 return _maybebytesurl(mgr.find_user_password(_maybestrurl(realm), |
72de5c504833
py3: factor out helpers to apply string conversion recursively
Yuya Nishihara <yuya@tcha.org>
parents:
35937
diff
changeset
|
182 _maybestrurl(uri))) |
30965
8b83b626fb1e
ui: remove urllib2 from being imported early
Kyle Lippincott <spectral@google.com>
parents:
30952
diff
changeset
|
183 |
31012
61b4122019d3
pager: move pager-initiating code into core
Augie Fackler <augie@google.com>
parents:
31000
diff
changeset
|
184 def _catchterm(*args): |
61b4122019d3
pager: move pager-initiating code into core
Augie Fackler <augie@google.com>
parents:
31000
diff
changeset
|
185 raise error.SignalInterrupt |
30965
8b83b626fb1e
ui: remove urllib2 from being imported early
Kyle Lippincott <spectral@google.com>
parents:
30952
diff
changeset
|
186 |
32976
4a3f1d362e5f
config: explicitly track the use of the standard default value
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
32890
diff
changeset
|
187 # 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
|
188 # 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
|
189 _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
|
190 |
34882
e9f320a40b44
ui: move request exit handlers to global state
Saurabh Singh <singhsrb@fb.com>
parents:
34858
diff
changeset
|
191 # _reqexithandlers: callbacks run at the end of a request |
e9f320a40b44
ui: move request exit handlers to global state
Saurabh Singh <singhsrb@fb.com>
parents:
34858
diff
changeset
|
192 _reqexithandlers = [] |
e9f320a40b44
ui: move request exit handlers to global state
Saurabh Singh <singhsrb@fb.com>
parents:
34858
diff
changeset
|
193 |
1559
59b3639df0a9
Convert all classes to new-style classes by deriving them from object.
Eric Hopper <hopper@omnifarious.org>
parents:
1483
diff
changeset
|
194 class ui(object): |
8190
9b8ac5fb7760
ui: kill most users of parentui name and arg, replace with .copy()
Matt Mackall <mpm@selenic.com>
parents:
8189
diff
changeset
|
195 def __init__(self, src=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
|
196 """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
|
197 |
d83ca854fa21
ui: factor out ui.load() to create a ui without loading configs (API)
Yuya Nishihara <yuya@tcha.org>
parents:
30546
diff
changeset
|
198 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
|
199 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
|
200 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
|
201 """ |
21132
350dc24a553d
ui: pushbuffer can now also capture stderr
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
20788
diff
changeset
|
202 # _buffers: used for temporary capture of output |
8202 | 203 self._buffers = [] |
27106
6ef17697b03d
ui: track label expansion when creating buffers
Gregory Szorc <gregory.szorc@gmail.com>
parents:
27068
diff
changeset
|
204 # 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
|
205 # 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
|
206 self._bufferstates = [] |
27106
6ef17697b03d
ui: track label expansion when creating buffers
Gregory Szorc <gregory.szorc@gmail.com>
parents:
27068
diff
changeset
|
207 # 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
|
208 # 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
|
209 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
|
210 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
|
211 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
|
212 self._knownconfig = configitems.coreitems |
8203 | 213 self._ocfg = config.config() # overlay |
214 self._tcfg = config.config() # trusted | |
215 self._ucfg = config.config() # untrusted | |
8478
d728f126c1b7
ui: use set instead of dict
Martin Geisler <mg@lazybytes.net>
parents:
8409
diff
changeset
|
216 self._trustusers = set() |
d728f126c1b7
ui: use set instead of dict
Martin Geisler <mg@lazybytes.net>
parents:
8409
diff
changeset
|
217 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
|
218 self.callhooks = True |
29109
e9ce33c642e8
ui: add an instance flag to hold --insecure bit
Gregory Szorc <gregory.szorc@gmail.com>
parents:
29096
diff
changeset
|
219 # Insecure server connections requested. |
e9ce33c642e8
ui: add an instance flag to hold --insecure bit
Gregory Szorc <gregory.szorc@gmail.com>
parents:
29096
diff
changeset
|
220 self.insecureconnections = False |
30996
e92daf156d5c
ui: provide a mechanism to track and log blocked time
Simon Farnsworth <simonfar@fb.com>
parents:
30965
diff
changeset
|
221 # Blocked time |
e92daf156d5c
ui: provide a mechanism to track and log blocked time
Simon Farnsworth <simonfar@fb.com>
parents:
30965
diff
changeset
|
222 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
|
223 # 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
|
224 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
|
225 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
|
226 self._styles = {} |
38528
313a940d49a3
ui: add an uninterruptable context manager that can block SIGINT
Augie Fackler <augie@google.com>
parents:
38351
diff
changeset
|
227 self._uninterruptible = False |
8136
6b5522cb2ad2
ui: refactor option setting
Matt Mackall <mpm@selenic.com>
parents:
8135
diff
changeset
|
228 |
8190
9b8ac5fb7760
ui: kill most users of parentui name and arg, replace with .copy()
Matt Mackall <mpm@selenic.com>
parents:
8189
diff
changeset
|
229 if src: |
14612 | 230 self.fout = src.fout |
231 self.ferr = src.ferr | |
232 self.fin = src.fin | |
31012
61b4122019d3
pager: move pager-initiating code into core
Augie Fackler <augie@google.com>
parents:
31000
diff
changeset
|
233 self.pageractive = src.pageractive |
31046
9c827087df38
ui: rename neverpager to disablepager
Augie Fackler <augie@google.com>
parents:
31034
diff
changeset
|
234 self._disablepager = src._disablepager |
32890
9fcb6df413c9
ui: add support for a tweakdefaults knob
Augie Fackler <augie@google.com>
parents:
32605
diff
changeset
|
235 self._tweaked = src._tweaked |
14612 | 236 |
8203 | 237 self._tcfg = src._tcfg.copy() |
238 self._ucfg = src._ucfg.copy() | |
239 self._ocfg = src._ocfg.copy() | |
8201
7cf2b987acd3
ui: trusted_users -> _trustusers, trusted_groups -> _trustgroups
Matt Mackall <mpm@selenic.com>
parents:
8200
diff
changeset
|
240 self._trustusers = src._trustusers.copy() |
7cf2b987acd3
ui: trusted_users -> _trustusers, trusted_groups -> _trustgroups
Matt Mackall <mpm@selenic.com>
parents:
8200
diff
changeset
|
241 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
|
242 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
|
243 self.callhooks = src.callhooks |
29109
e9ce33c642e8
ui: add an instance flag to hold --insecure bit
Gregory Szorc <gregory.szorc@gmail.com>
parents:
29096
diff
changeset
|
244 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
|
245 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
|
246 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
|
247 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
|
248 |
8143
507c49e297e1
ui: simplify init, kill dupconfig
Matt Mackall <mpm@selenic.com>
parents:
8142
diff
changeset
|
249 self.fixconfig() |
29378
fea71f66ebff
url: remember http password database in ui object
liscju <piotr.listkiewicz@gmail.com>
parents:
29366
diff
changeset
|
250 |
fea71f66ebff
url: remember http password database in ui object
liscju <piotr.listkiewicz@gmail.com>
parents:
29366
diff
changeset
|
251 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
|
252 self._blockedtimes = src._blockedtimes |
8143
507c49e297e1
ui: simplify init, kill dupconfig
Matt Mackall <mpm@selenic.com>
parents:
8142
diff
changeset
|
253 else: |
37122
d4a2e0d5d042
procutil: bulk-replace util.std* to point to new module
Yuya Nishihara <yuya@tcha.org>
parents:
37087
diff
changeset
|
254 self.fout = procutil.stdout |
d4a2e0d5d042
procutil: bulk-replace util.std* to point to new module
Yuya Nishihara <yuya@tcha.org>
parents:
37087
diff
changeset
|
255 self.ferr = procutil.stderr |
d4a2e0d5d042
procutil: bulk-replace util.std* to point to new module
Yuya Nishihara <yuya@tcha.org>
parents:
37087
diff
changeset
|
256 self.fin = procutil.stdin |
31012
61b4122019d3
pager: move pager-initiating code into core
Augie Fackler <augie@google.com>
parents:
31000
diff
changeset
|
257 self.pageractive = False |
31046
9c827087df38
ui: rename neverpager to disablepager
Augie Fackler <augie@google.com>
parents:
31034
diff
changeset
|
258 self._disablepager = False |
32890
9fcb6df413c9
ui: add support for a tweakdefaults knob
Augie Fackler <augie@google.com>
parents:
32605
diff
changeset
|
259 self._tweaked = False |
14612 | 260 |
9887
38170eeed18c
ui: add environ property to access os.environ or wsgirequest.environ
Sune Foldager <cryo@cyanite.org>
parents:
9851
diff
changeset
|
261 # 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
|
262 self.environ = encoding.environ |
8222
d30a21594812
more whitespace cleanup and some other style nits
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
8220
diff
changeset
|
263 |
30965
8b83b626fb1e
ui: remove urllib2 from being imported early
Kyle Lippincott <spectral@google.com>
parents:
30952
diff
changeset
|
264 self.httppasswordmgrdb = httppasswordmgrdbproxy() |
30996
e92daf156d5c
ui: provide a mechanism to track and log blocked time
Simon Farnsworth <simonfar@fb.com>
parents:
30965
diff
changeset
|
265 self._blockedtimes = collections.defaultdict(int) |
29378
fea71f66ebff
url: remember http password database in ui object
liscju <piotr.listkiewicz@gmail.com>
parents:
29366
diff
changeset
|
266 |
30832
da5fa0f13a41
ui: introduce an experimental dict of exportable environment variables
Matt Harbison <matt_harbison@yahoo.com>
parents:
30814
diff
changeset
|
267 allowed = self.configlist('experimental', 'exportableenviron') |
da5fa0f13a41
ui: introduce an experimental dict of exportable environment variables
Matt Harbison <matt_harbison@yahoo.com>
parents:
30814
diff
changeset
|
268 if '*' in allowed: |
da5fa0f13a41
ui: introduce an experimental dict of exportable environment variables
Matt Harbison <matt_harbison@yahoo.com>
parents:
30814
diff
changeset
|
269 self._exportableenviron = self.environ |
da5fa0f13a41
ui: introduce an experimental dict of exportable environment variables
Matt Harbison <matt_harbison@yahoo.com>
parents:
30814
diff
changeset
|
270 else: |
da5fa0f13a41
ui: introduce an experimental dict of exportable environment variables
Matt Harbison <matt_harbison@yahoo.com>
parents:
30814
diff
changeset
|
271 self._exportableenviron = {} |
da5fa0f13a41
ui: introduce an experimental dict of exportable environment variables
Matt Harbison <matt_harbison@yahoo.com>
parents:
30814
diff
changeset
|
272 for k in allowed: |
da5fa0f13a41
ui: introduce an experimental dict of exportable environment variables
Matt Harbison <matt_harbison@yahoo.com>
parents:
30814
diff
changeset
|
273 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
|
274 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
|
275 |
30564
d83ca854fa21
ui: factor out ui.load() to create a ui without loading configs (API)
Yuya Nishihara <yuya@tcha.org>
parents:
30546
diff
changeset
|
276 @classmethod |
d83ca854fa21
ui: factor out ui.load() to create a ui without loading configs (API)
Yuya Nishihara <yuya@tcha.org>
parents:
30546
diff
changeset
|
277 def load(cls): |
d83ca854fa21
ui: factor out ui.load() to create a ui without loading configs (API)
Yuya Nishihara <yuya@tcha.org>
parents:
30546
diff
changeset
|
278 """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
|
279 u = cls() |
31690
d83e51654c8a
rcutil: let environ override system configs (BC)
Jun Wu <quark@fb.com>
parents:
31688
diff
changeset
|
280 # 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
|
281 for t, f in rcutil.rccomponents(): |
00e569a2da97
rcutil: let rccomponents return different types of configs (API)
Jun Wu <quark@fb.com>
parents:
31687
diff
changeset
|
282 if t == 'path': |
00e569a2da97
rcutil: let rccomponents return different types of configs (API)
Jun Wu <quark@fb.com>
parents:
31687
diff
changeset
|
283 u.readconfig(f, trust=True) |
31690
d83e51654c8a
rcutil: let environ override system configs (BC)
Jun Wu <quark@fb.com>
parents:
31688
diff
changeset
|
284 elif t == 'items': |
d83e51654c8a
rcutil: let environ override system configs (BC)
Jun Wu <quark@fb.com>
parents:
31688
diff
changeset
|
285 sections = set() |
d83e51654c8a
rcutil: let environ override system configs (BC)
Jun Wu <quark@fb.com>
parents:
31688
diff
changeset
|
286 for section, name, value, source in f: |
d83e51654c8a
rcutil: let environ override system configs (BC)
Jun Wu <quark@fb.com>
parents:
31688
diff
changeset
|
287 # do not set u._ocfg |
d83e51654c8a
rcutil: let environ override system configs (BC)
Jun Wu <quark@fb.com>
parents:
31688
diff
changeset
|
288 # 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
|
289 u._tcfg.set(section, name, value, source) |
d83e51654c8a
rcutil: let environ override system configs (BC)
Jun Wu <quark@fb.com>
parents:
31688
diff
changeset
|
290 u._ucfg.set(section, name, value, source) |
d83e51654c8a
rcutil: let environ override system configs (BC)
Jun Wu <quark@fb.com>
parents:
31688
diff
changeset
|
291 sections.add(section) |
d83e51654c8a
rcutil: let environ override system configs (BC)
Jun Wu <quark@fb.com>
parents:
31688
diff
changeset
|
292 for section in sections: |
d83e51654c8a
rcutil: let environ override system configs (BC)
Jun Wu <quark@fb.com>
parents:
31688
diff
changeset
|
293 u.fixconfig(section=section) |
31688
00e569a2da97
rcutil: let rccomponents return different types of configs (API)
Jun Wu <quark@fb.com>
parents:
31687
diff
changeset
|
294 else: |
00e569a2da97
rcutil: let rccomponents return different types of configs (API)
Jun Wu <quark@fb.com>
parents:
31687
diff
changeset
|
295 raise error.ProgrammingError('unknown rctype: %s' % t) |
32890
9fcb6df413c9
ui: add support for a tweakdefaults knob
Augie Fackler <augie@google.com>
parents:
32605
diff
changeset
|
296 u._maybetweakdefaults() |
30564
d83ca854fa21
ui: factor out ui.load() to create a ui without loading configs (API)
Yuya Nishihara <yuya@tcha.org>
parents:
30546
diff
changeset
|
297 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
|
298 |
32890
9fcb6df413c9
ui: add support for a tweakdefaults knob
Augie Fackler <augie@google.com>
parents:
32605
diff
changeset
|
299 def _maybetweakdefaults(self): |
9fcb6df413c9
ui: add support for a tweakdefaults knob
Augie Fackler <augie@google.com>
parents:
32605
diff
changeset
|
300 if not self.configbool('ui', 'tweakdefaults'): |
9fcb6df413c9
ui: add support for a tweakdefaults knob
Augie Fackler <augie@google.com>
parents:
32605
diff
changeset
|
301 return |
9fcb6df413c9
ui: add support for a tweakdefaults knob
Augie Fackler <augie@google.com>
parents:
32605
diff
changeset
|
302 if self._tweaked or self.plain('tweakdefaults'): |
9fcb6df413c9
ui: add support for a tweakdefaults knob
Augie Fackler <augie@google.com>
parents:
32605
diff
changeset
|
303 return |
9fcb6df413c9
ui: add support for a tweakdefaults knob
Augie Fackler <augie@google.com>
parents:
32605
diff
changeset
|
304 |
9fcb6df413c9
ui: add support for a tweakdefaults knob
Augie Fackler <augie@google.com>
parents:
32605
diff
changeset
|
305 # 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
|
306 # 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
|
307 # infinite recursion between setconfig and this method. |
9fcb6df413c9
ui: add support for a tweakdefaults knob
Augie Fackler <augie@google.com>
parents:
32605
diff
changeset
|
308 # |
9fcb6df413c9
ui: add support for a tweakdefaults knob
Augie Fackler <augie@google.com>
parents:
32605
diff
changeset
|
309 # 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
|
310 # avoid this weirdness. |
9fcb6df413c9
ui: add support for a tweakdefaults knob
Augie Fackler <augie@google.com>
parents:
32605
diff
changeset
|
311 self._tweaked = True |
9fcb6df413c9
ui: add support for a tweakdefaults knob
Augie Fackler <augie@google.com>
parents:
32605
diff
changeset
|
312 tmpcfg = config.config() |
9fcb6df413c9
ui: add support for a tweakdefaults knob
Augie Fackler <augie@google.com>
parents:
32605
diff
changeset
|
313 tmpcfg.parse('<tweakdefaults>', tweakrc) |
9fcb6df413c9
ui: add support for a tweakdefaults knob
Augie Fackler <augie@google.com>
parents:
32605
diff
changeset
|
314 for section in tmpcfg: |
9fcb6df413c9
ui: add support for a tweakdefaults knob
Augie Fackler <augie@google.com>
parents:
32605
diff
changeset
|
315 for name, value in tmpcfg.items(section): |
9fcb6df413c9
ui: add support for a tweakdefaults knob
Augie Fackler <augie@google.com>
parents:
32605
diff
changeset
|
316 if not self.hasconfig(section, name): |
9fcb6df413c9
ui: add support for a tweakdefaults knob
Augie Fackler <augie@google.com>
parents:
32605
diff
changeset
|
317 self.setconfig(section, name, value, "<tweakdefaults>") |
9fcb6df413c9
ui: add support for a tweakdefaults knob
Augie Fackler <augie@google.com>
parents:
32605
diff
changeset
|
318 |
8189
d2899a856f9f
ui: replace parentui mechanism with repo.baseui
Matt Mackall <mpm@selenic.com>
parents:
8187
diff
changeset
|
319 def copy(self): |
8220
6e6ebeb52899
ui: ui.copy() now takes the ui class into account
Ronny Pfannschmidt <Ronny.Pfannschmidt@gmx.de>
parents:
8208
diff
changeset
|
320 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
|
321 |
29366
d269e7db2f55
ui: provide official way to reset internal state per command
Yuya Nishihara <yuya@tcha.org>
parents:
29109
diff
changeset
|
322 def resetstate(self): |
d269e7db2f55
ui: provide official way to reset internal state per command
Yuya Nishihara <yuya@tcha.org>
parents:
29109
diff
changeset
|
323 """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
|
324 if self._progbar: |
d269e7db2f55
ui: provide official way to reset internal state per command
Yuya Nishihara <yuya@tcha.org>
parents:
29109
diff
changeset
|
325 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
|
326 self.httppasswordmgrdb = httppasswordmgrdbproxy() |
29366
d269e7db2f55
ui: provide official way to reset internal state per command
Yuya Nishihara <yuya@tcha.org>
parents:
29109
diff
changeset
|
327 |
30996
e92daf156d5c
ui: provide a mechanism to track and log blocked time
Simon Farnsworth <simonfar@fb.com>
parents:
30965
diff
changeset
|
328 @contextlib.contextmanager |
e92daf156d5c
ui: provide a mechanism to track and log blocked time
Simon Farnsworth <simonfar@fb.com>
parents:
30965
diff
changeset
|
329 def timeblockedsection(self, key): |
30998
fdecd24ca4dc
ui: log time spent blocked on stdio
Simon Farnsworth <simonfar@fb.com>
parents:
30996
diff
changeset
|
330 # 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
|
331 starttime = util.timer() |
e92daf156d5c
ui: provide a mechanism to track and log blocked time
Simon Farnsworth <simonfar@fb.com>
parents:
30965
diff
changeset
|
332 try: |
e92daf156d5c
ui: provide a mechanism to track and log blocked time
Simon Farnsworth <simonfar@fb.com>
parents:
30965
diff
changeset
|
333 yield |
e92daf156d5c
ui: provide a mechanism to track and log blocked time
Simon Farnsworth <simonfar@fb.com>
parents:
30965
diff
changeset
|
334 finally: |
e92daf156d5c
ui: provide a mechanism to track and log blocked time
Simon Farnsworth <simonfar@fb.com>
parents:
30965
diff
changeset
|
335 self._blockedtimes[key + '_blocked'] += \ |
e92daf156d5c
ui: provide a mechanism to track and log blocked time
Simon Farnsworth <simonfar@fb.com>
parents:
30965
diff
changeset
|
336 (util.timer() - starttime) * 1000 |
29366
d269e7db2f55
ui: provide official way to reset internal state per command
Yuya Nishihara <yuya@tcha.org>
parents:
29109
diff
changeset
|
337 |
38528
313a940d49a3
ui: add an uninterruptable context manager that can block SIGINT
Augie Fackler <augie@google.com>
parents:
38351
diff
changeset
|
338 @contextlib.contextmanager |
313a940d49a3
ui: add an uninterruptable context manager that can block SIGINT
Augie Fackler <augie@google.com>
parents:
38351
diff
changeset
|
339 def uninterruptable(self): |
313a940d49a3
ui: add an uninterruptable context manager that can block SIGINT
Augie Fackler <augie@google.com>
parents:
38351
diff
changeset
|
340 """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
|
341 |
313a940d49a3
ui: add an uninterruptable context manager that can block SIGINT
Augie Fackler <augie@google.com>
parents:
38351
diff
changeset
|
342 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
|
343 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
|
344 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
|
345 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
|
346 """ |
313a940d49a3
ui: add an uninterruptable context manager that can block SIGINT
Augie Fackler <augie@google.com>
parents:
38351
diff
changeset
|
347 enabled = self.configbool('experimental', 'nointerrupt') |
313a940d49a3
ui: add an uninterruptable context manager that can block SIGINT
Augie Fackler <augie@google.com>
parents:
38351
diff
changeset
|
348 if (enabled and |
313a940d49a3
ui: add an uninterruptable context manager that can block SIGINT
Augie Fackler <augie@google.com>
parents:
38351
diff
changeset
|
349 self.configbool('experimental', 'nointerrupt-interactiveonly')): |
313a940d49a3
ui: add an uninterruptable context manager that can block SIGINT
Augie Fackler <augie@google.com>
parents:
38351
diff
changeset
|
350 enabled = self.interactive() |
313a940d49a3
ui: add an uninterruptable context manager that can block SIGINT
Augie Fackler <augie@google.com>
parents:
38351
diff
changeset
|
351 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
|
352 # if nointerrupt support is turned off, the process isn't |
313a940d49a3
ui: add an uninterruptable context manager that can block SIGINT
Augie Fackler <augie@google.com>
parents:
38351
diff
changeset
|
353 # interactive, or we're already in an uninterruptable |
313a940d49a3
ui: add an uninterruptable context manager that can block SIGINT
Augie Fackler <augie@google.com>
parents:
38351
diff
changeset
|
354 # block, do nothing. |
313a940d49a3
ui: add an uninterruptable context manager that can block SIGINT
Augie Fackler <augie@google.com>
parents:
38351
diff
changeset
|
355 yield |
313a940d49a3
ui: add an uninterruptable context manager that can block SIGINT
Augie Fackler <augie@google.com>
parents:
38351
diff
changeset
|
356 return |
313a940d49a3
ui: add an uninterruptable context manager that can block SIGINT
Augie Fackler <augie@google.com>
parents:
38351
diff
changeset
|
357 def warn(): |
313a940d49a3
ui: add an uninterruptable context manager that can block SIGINT
Augie Fackler <augie@google.com>
parents:
38351
diff
changeset
|
358 self.warn(_("shutting down cleanly\n")) |
313a940d49a3
ui: add an uninterruptable context manager that can block SIGINT
Augie Fackler <augie@google.com>
parents:
38351
diff
changeset
|
359 self.warn( |
313a940d49a3
ui: add an uninterruptable context manager that can block SIGINT
Augie Fackler <augie@google.com>
parents:
38351
diff
changeset
|
360 _("press ^C again to terminate immediately (dangerous)\n")) |
313a940d49a3
ui: add an uninterruptable context manager that can block SIGINT
Augie Fackler <augie@google.com>
parents:
38351
diff
changeset
|
361 return True |
313a940d49a3
ui: add an uninterruptable context manager that can block SIGINT
Augie Fackler <augie@google.com>
parents:
38351
diff
changeset
|
362 with procutil.uninterruptable(warn): |
313a940d49a3
ui: add an uninterruptable context manager that can block SIGINT
Augie Fackler <augie@google.com>
parents:
38351
diff
changeset
|
363 try: |
313a940d49a3
ui: add an uninterruptable context manager that can block SIGINT
Augie Fackler <augie@google.com>
parents:
38351
diff
changeset
|
364 self._uninterruptible = True |
313a940d49a3
ui: add an uninterruptable context manager that can block SIGINT
Augie Fackler <augie@google.com>
parents:
38351
diff
changeset
|
365 yield |
313a940d49a3
ui: add an uninterruptable context manager that can block SIGINT
Augie Fackler <augie@google.com>
parents:
38351
diff
changeset
|
366 finally: |
313a940d49a3
ui: add an uninterruptable context manager that can block SIGINT
Augie Fackler <augie@google.com>
parents:
38351
diff
changeset
|
367 self._uninterruptible = False |
313a940d49a3
ui: add an uninterruptable context manager that can block SIGINT
Augie Fackler <augie@google.com>
parents:
38351
diff
changeset
|
368 |
16135 | 369 def formatter(self, topic, opts): |
32605
012e0da5b759
formatter: add option to redirect output to file object
Yuya Nishihara <yuya@tcha.org>
parents:
32496
diff
changeset
|
370 return formatter.formatter(self, self, topic, opts) |
16135 | 371 |
14859
dccecfaebdd2
ui: rename _is_trusted to _trusted
Matt Mackall <mpm@selenic.com>
parents:
14738
diff
changeset
|
372 def _trusted(self, fp, f): |
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
|
373 st = util.fstat(fp) |
8657
3fa92c618624
posix: do not use fstat in isowner
Martin Geisler <mg@lazybytes.net>
parents:
8656
diff
changeset
|
374 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
|
375 return True |
8141
e40b629bedd1
ui: cleanup _is_trusted a bit
Matt Mackall <mpm@selenic.com>
parents:
8140
diff
changeset
|
376 |
8201
7cf2b987acd3
ui: trusted_users -> _trustusers, trusted_groups -> _trustgroups
Matt Mackall <mpm@selenic.com>
parents:
8200
diff
changeset
|
377 tusers, tgroups = self._trustusers, self._trustgroups |
8141
e40b629bedd1
ui: cleanup _is_trusted a bit
Matt Mackall <mpm@selenic.com>
parents:
8140
diff
changeset
|
378 if '*' in tusers or '*' in tgroups: |
e40b629bedd1
ui: cleanup _is_trusted a bit
Matt Mackall <mpm@selenic.com>
parents:
8140
diff
changeset
|
379 return True |
e40b629bedd1
ui: cleanup _is_trusted a bit
Matt Mackall <mpm@selenic.com>
parents:
8140
diff
changeset
|
380 |
e40b629bedd1
ui: cleanup _is_trusted a bit
Matt Mackall <mpm@selenic.com>
parents:
8140
diff
changeset
|
381 user = util.username(st.st_uid) |
e40b629bedd1
ui: cleanup _is_trusted a bit
Matt Mackall <mpm@selenic.com>
parents:
8140
diff
changeset
|
382 group = util.groupname(st.st_gid) |
e40b629bedd1
ui: cleanup _is_trusted a bit
Matt Mackall <mpm@selenic.com>
parents:
8140
diff
changeset
|
383 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
|
384 return True |
e40b629bedd1
ui: cleanup _is_trusted a bit
Matt Mackall <mpm@selenic.com>
parents:
8140
diff
changeset
|
385 |
8204 | 386 if self._reportuntrusted: |
16939
fa91ddfc3f36
ui: lowercase "not trusting file" warning message
Martin Geisler <mg@aragost.com>
parents:
16938
diff
changeset
|
387 self.warn(_('not trusting file %s from untrusted ' |
8141
e40b629bedd1
ui: cleanup _is_trusted a bit
Matt Mackall <mpm@selenic.com>
parents:
8140
diff
changeset
|
388 'user %s, group %s\n') % (f, user, group)) |
e40b629bedd1
ui: cleanup _is_trusted a bit
Matt Mackall <mpm@selenic.com>
parents:
8140
diff
changeset
|
389 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
|
390 |
8200 | 391 def readconfig(self, filename, root=None, trust=False, |
8345
dcebff8a25dd
hgwebdir: read --webdir-conf as actual configuration to ui (issue1586)
Alexander Solovyov <piranha@piranha.org.ua>
parents:
8312
diff
changeset
|
392 sections=None, remap=None): |
8142
912bfef12ba6
ui: fold readsections into readconfig
Matt Mackall <mpm@selenic.com>
parents:
8141
diff
changeset
|
393 try: |
30358
9df29b7c62cf
ui: explicitly open config files in binary mode
Augie Fackler <augie@google.com>
parents:
30342
diff
changeset
|
394 fp = open(filename, u'rb') |
8142
912bfef12ba6
ui: fold readsections into readconfig
Matt Mackall <mpm@selenic.com>
parents:
8141
diff
changeset
|
395 except IOError: |
912bfef12ba6
ui: fold readsections into readconfig
Matt Mackall <mpm@selenic.com>
parents:
8141
diff
changeset
|
396 if not sections: # ignore unless we were looking for something |
912bfef12ba6
ui: fold readsections into readconfig
Matt Mackall <mpm@selenic.com>
parents:
8141
diff
changeset
|
397 return |
912bfef12ba6
ui: fold readsections into readconfig
Matt Mackall <mpm@selenic.com>
parents:
8141
diff
changeset
|
398 raise |
8139 | 399 |
8203 | 400 cfg = config.config() |
14859
dccecfaebdd2
ui: rename _is_trusted to _trusted
Matt Mackall <mpm@selenic.com>
parents:
14738
diff
changeset
|
401 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
|
402 |
8142
912bfef12ba6
ui: fold readsections into readconfig
Matt Mackall <mpm@selenic.com>
parents:
8141
diff
changeset
|
403 try: |
8345
dcebff8a25dd
hgwebdir: read --webdir-conf as actual configuration to ui (issue1586)
Alexander Solovyov <piranha@piranha.org.ua>
parents:
8312
diff
changeset
|
404 cfg.read(filename, fp, sections=sections, remap=remap) |
15407
ee112eb69d2a
misc: adding missing file close() calls
Matt Mackall <mpm@selenic.com>
parents:
15089
diff
changeset
|
405 fp.close() |
25660
328739ea70c3
global: mass rewrite to use modern exception syntax
Gregory Szorc <gregory.szorc@gmail.com>
parents:
25629
diff
changeset
|
406 except error.ConfigError as inst: |
8142
912bfef12ba6
ui: fold readsections into readconfig
Matt Mackall <mpm@selenic.com>
parents:
8141
diff
changeset
|
407 if trusted: |
8144
fca54469480e
ui: introduce new config parser
Matt Mackall <mpm@selenic.com>
parents:
8143
diff
changeset
|
408 raise |
37087
f0b6fbea00cf
stringutil: bulk-replace call sites to point to new module
Yuya Nishihara <yuya@tcha.org>
parents:
36916
diff
changeset
|
409 self.warn(_("ignored: %s\n") % stringutil.forcebytestr(inst)) |
3552
9b52239dc740
save settings from untrusted config files in a separate configparser
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
3551
diff
changeset
|
410 |
10455
40dfd46d098f
ui: add HGPLAIN environment variable for easier scripting
Brodie Rao <me+hg@dackz.net>
parents:
10426
diff
changeset
|
411 if self.plain(): |
10507
79dd96774187
ui: unset ui.slash when HGPLAIN is set
Brodie Rao <me+hg@dackz.net>
parents:
10506
diff
changeset
|
412 for k in ('debug', 'fallbackencoding', 'quiet', 'slash', |
24663
7d01371e6358
commands: add ui.statuscopies config knob
Mathias De Maré <mathias.demare@gmail.com>
parents:
24250
diff
changeset
|
413 'logtemplate', 'statuscopies', 'style', |
10507
79dd96774187
ui: unset ui.slash when HGPLAIN is set
Brodie Rao <me+hg@dackz.net>
parents:
10506
diff
changeset
|
414 'traceback', 'verbose'): |
10455
40dfd46d098f
ui: add HGPLAIN environment variable for easier scripting
Brodie Rao <me+hg@dackz.net>
parents:
10426
diff
changeset
|
415 if k in cfg['ui']: |
40dfd46d098f
ui: add HGPLAIN environment variable for easier scripting
Brodie Rao <me+hg@dackz.net>
parents:
10426
diff
changeset
|
416 del cfg['ui'][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
|
417 for k, v in cfg.items('defaults'): |
a599431b0ab6
ui: enable alias exception when reading config in plain mode
"Yann E. MORIN" <yann.morin.1998@anciens.enib.fr>
parents:
14372
diff
changeset
|
418 del cfg['defaults'][k] |
31593
37a0ad669051
plain: ignore [commands] config
Martin von Zweigbergk <martinvonz@google.com>
parents:
31541
diff
changeset
|
419 for k, v in cfg.items('commands'): |
37a0ad669051
plain: ignore [commands] config
Martin von Zweigbergk <martinvonz@google.com>
parents:
31541
diff
changeset
|
420 del cfg['commands'][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
|
421 # Don't remove aliases from the configuration if in the exceptionlist |
a599431b0ab6
ui: enable alias exception when reading config in plain mode
"Yann E. MORIN" <yann.morin.1998@anciens.enib.fr>
parents:
14372
diff
changeset
|
422 if self.plain('alias'): |
10506
42afde35e9f7
ui: suppress aliases when HGPLAIN is set
Brodie Rao <me+hg@dackz.net>
parents:
10455
diff
changeset
|
423 for k, v in cfg.items('alias'): |
42afde35e9f7
ui: suppress aliases when HGPLAIN is set
Brodie Rao <me+hg@dackz.net>
parents:
10455
diff
changeset
|
424 del cfg['alias'][k] |
24883
09049042ab99
ui: disable revsetaliases in plain mode (BC)
Siddharth Agarwal <sid0@fb.com>
parents:
24848
diff
changeset
|
425 if self.plain('revsetalias'): |
09049042ab99
ui: disable revsetaliases in plain mode (BC)
Siddharth Agarwal <sid0@fb.com>
parents:
24848
diff
changeset
|
426 for k, v in cfg.items('revsetalias'): |
09049042ab99
ui: disable revsetaliases in plain mode (BC)
Siddharth Agarwal <sid0@fb.com>
parents:
24848
diff
changeset
|
427 del cfg['revsetalias'][k] |
28958
77e566fe31ec
ui: drop template aliases by HGPLAIN
Yuya Nishihara <yuya@tcha.org>
parents:
28635
diff
changeset
|
428 if self.plain('templatealias'): |
77e566fe31ec
ui: drop template aliases by HGPLAIN
Yuya Nishihara <yuya@tcha.org>
parents:
28635
diff
changeset
|
429 for k, v in cfg.items('templatealias'): |
77e566fe31ec
ui: drop template aliases by HGPLAIN
Yuya Nishihara <yuya@tcha.org>
parents:
28635
diff
changeset
|
430 del cfg['templatealias'][k] |
10455
40dfd46d098f
ui: add HGPLAIN environment variable for easier scripting
Brodie Rao <me+hg@dackz.net>
parents:
10426
diff
changeset
|
431 |
8142
912bfef12ba6
ui: fold readsections into readconfig
Matt Mackall <mpm@selenic.com>
parents:
8141
diff
changeset
|
432 if trusted: |
8203 | 433 self._tcfg.update(cfg) |
434 self._tcfg.update(self._ocfg) | |
435 self._ucfg.update(cfg) | |
436 self._ucfg.update(self._ocfg) | |
8139 | 437 |
3347
bce7c1b4c1c8
ui.py: normalize settings every time the configuration changes
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
3346
diff
changeset
|
438 if root is None: |
bce7c1b4c1c8
ui.py: normalize settings every time the configuration changes
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
3346
diff
changeset
|
439 root = os.path.expanduser('~') |
bce7c1b4c1c8
ui.py: normalize settings every time the configuration changes
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
3346
diff
changeset
|
440 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
|
441 |
12764
ad2506f097d3
ui: only fix config if the relevant section has changed
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents:
12689
diff
changeset
|
442 def fixconfig(self, root=None, section=None): |
ad2506f097d3
ui: only fix config if the relevant section has changed
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents:
12689
diff
changeset
|
443 if section in (None, 'paths'): |
ad2506f097d3
ui: only fix config if the relevant section has changed
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents:
12689
diff
changeset
|
444 # expand vars and ~ |
ad2506f097d3
ui: only fix config if the relevant section has changed
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents:
12689
diff
changeset
|
445 # translate paths relative to root (or home) into absolute paths |
30528
20a42325fdef
py3: use pycompat.getcwd() instead of os.getcwd()
Pulkit Goyal <7895pulkit@gmail.com>
parents:
30489
diff
changeset
|
446 root = root or pycompat.getcwd() |
12764
ad2506f097d3
ui: only fix config if the relevant section has changed
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents:
12689
diff
changeset
|
447 for c in self._tcfg, self._ucfg, self._ocfg: |
ad2506f097d3
ui: only fix config if the relevant section has changed
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents:
12689
diff
changeset
|
448 for n, p in c.items('paths'): |
29412
b62bce819d0c
ui: don't fixup [paths] sub-options
Gregory Szorc <gregory.szorc@gmail.com>
parents:
29378
diff
changeset
|
449 # Ignore sub-options. |
b62bce819d0c
ui: don't fixup [paths] sub-options
Gregory Szorc <gregory.szorc@gmail.com>
parents:
29378
diff
changeset
|
450 if ':' in n: |
b62bce819d0c
ui: don't fixup [paths] sub-options
Gregory Szorc <gregory.szorc@gmail.com>
parents:
29378
diff
changeset
|
451 continue |
12764
ad2506f097d3
ui: only fix config if the relevant section has changed
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents:
12689
diff
changeset
|
452 if not p: |
ad2506f097d3
ui: only fix config if the relevant section has changed
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents:
12689
diff
changeset
|
453 continue |
ad2506f097d3
ui: only fix config if the relevant section has changed
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents:
12689
diff
changeset
|
454 if '%%' in p: |
30623
201b44c8875c
ui: do not translate empty configsource() to 'none' (API)
Yuya Nishihara <yuya@tcha.org>
parents:
30574
diff
changeset
|
455 s = self.configsource('paths', n) or 'none' |
12764
ad2506f097d3
ui: only fix config if the relevant section has changed
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents:
12689
diff
changeset
|
456 self.warn(_("(deprecated '%%' in path %s=%s from %s)\n") |
30623
201b44c8875c
ui: do not translate empty configsource() to 'none' (API)
Yuya Nishihara <yuya@tcha.org>
parents:
30574
diff
changeset
|
457 % (n, p, s)) |
12764
ad2506f097d3
ui: only fix config if the relevant section has changed
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents:
12689
diff
changeset
|
458 p = p.replace('%%', '%') |
ad2506f097d3
ui: only fix config if the relevant section has changed
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents:
12689
diff
changeset
|
459 p = util.expandpath(p) |
14076
924c82157d46
url: move URL parsing functions into util to improve startup time
Brodie Rao <brodie@bitheap.org>
parents:
13984
diff
changeset
|
460 if not util.hasscheme(p) and not os.path.isabs(p): |
12764
ad2506f097d3
ui: only fix config if the relevant section has changed
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents:
12689
diff
changeset
|
461 p = os.path.normpath(os.path.join(root, p)) |
ad2506f097d3
ui: only fix config if the relevant section has changed
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents:
12689
diff
changeset
|
462 c.set("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
|
463 |
12764
ad2506f097d3
ui: only fix config if the relevant section has changed
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents:
12689
diff
changeset
|
464 if section in (None, 'ui'): |
ad2506f097d3
ui: only fix config if the relevant section has changed
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents:
12689
diff
changeset
|
465 # update ui options |
ad2506f097d3
ui: only fix config if the relevant section has changed
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents:
12689
diff
changeset
|
466 self.debugflag = self.configbool('ui', 'debug') |
ad2506f097d3
ui: only fix config if the relevant section has changed
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents:
12689
diff
changeset
|
467 self.verbose = self.debugflag or self.configbool('ui', 'verbose') |
ad2506f097d3
ui: only fix config if the relevant section has changed
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents:
12689
diff
changeset
|
468 self.quiet = not self.debugflag and self.configbool('ui', 'quiet') |
ad2506f097d3
ui: only fix config if the relevant section has changed
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents:
12689
diff
changeset
|
469 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
|
470 self.quiet = self.verbose = False |
13493
95b0d4c1c9e1
ui: always report untrusted hgrc files when debug enabled
Ry4an Brase <ry4an-hg@ry4an.org>
parents:
13238
diff
changeset
|
471 self._reportuntrusted = self.debugflag or self.configbool("ui", |
33499
0407a51b9d8c
codemod: register core configitems using a script
Jun Wu <quark@fb.com>
parents:
33471
diff
changeset
|
472 "report_untrusted") |
0407a51b9d8c
codemod: register core configitems using a script
Jun Wu <quark@fb.com>
parents:
33471
diff
changeset
|
473 self.tracebackflag = self.configbool('ui', 'traceback') |
30996
e92daf156d5c
ui: provide a mechanism to track and log blocked time
Simon Farnsworth <simonfar@fb.com>
parents:
30965
diff
changeset
|
474 self.logblockedtimes = self.configbool('ui', '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
|
475 |
12764
ad2506f097d3
ui: only fix config if the relevant section has changed
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents:
12689
diff
changeset
|
476 if section in (None, 'trusted'): |
ad2506f097d3
ui: only fix config if the relevant section has changed
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents:
12689
diff
changeset
|
477 # update trust information |
ad2506f097d3
ui: only fix config if the relevant section has changed
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents:
12689
diff
changeset
|
478 self._trustusers.update(self.configlist('trusted', 'users')) |
ad2506f097d3
ui: only fix config if the relevant section has changed
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents:
12689
diff
changeset
|
479 self._trustgroups.update(self.configlist('trusted', 'groups')) |
3551
3b07e223534b
Only read .hg/hgrc files from trusted users/groups
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
3489
diff
changeset
|
480 |
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
|
481 def backupconfig(self, section, item): |
69e792cf7851
config: have a way to backup and restore value in config
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
15407
diff
changeset
|
482 return (self._ocfg.backup(section, item), |
69e792cf7851
config: have a way to backup and restore value in config
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
15407
diff
changeset
|
483 self._tcfg.backup(section, item), |
69e792cf7851
config: have a way to backup and restore value in config
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
15407
diff
changeset
|
484 self._ucfg.backup(section, item),) |
69e792cf7851
config: have a way to backup and restore value in config
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
15407
diff
changeset
|
485 def restoreconfig(self, data): |
69e792cf7851
config: have a way to backup and restore value in config
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
15407
diff
changeset
|
486 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
|
487 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
|
488 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
|
489 |
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
|
490 def setconfig(self, section, name, value, source=''): |
20787
be179da10d5f
config: backout 77f1f206e135 - 743daa601445 removed the only use of overlay
Mads Kiilerich <madski@unity3d.com>
parents:
20606
diff
changeset
|
491 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
|
492 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
|
493 self.fixconfig(section=section) |
32890
9fcb6df413c9
ui: add support for a tweakdefaults knob
Augie Fackler <augie@google.com>
parents:
32605
diff
changeset
|
494 self._maybetweakdefaults() |
960 | 495 |
8199 | 496 def _data(self, untrusted): |
8203 | 497 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
|
498 |
8182
b97abc7c1135
showconfig: show source file and line with --debug
Matt Mackall <mpm@selenic.com>
parents:
8175
diff
changeset
|
499 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
|
500 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
|
501 |
32976
4a3f1d362e5f
config: explicitly track the use of the standard default value
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
32890
diff
changeset
|
502 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
|
503 """return the plain string version of a config""" |
1aa05203f7f6
config: extract the core config logic into a private method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
33005
diff
changeset
|
504 value = self._config(section, name, default=default, |
1aa05203f7f6
config: extract the core config logic into a private method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
33005
diff
changeset
|
505 untrusted=untrusted) |
1aa05203f7f6
config: extract the core config logic into a private method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
33005
diff
changeset
|
506 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
|
507 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
|
508 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
|
509 |
1aa05203f7f6
config: extract the core config logic into a private method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
33005
diff
changeset
|
510 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
|
511 value = itemdefault = default |
33329
e714159860fd
configitems: add alias support in config
David Demelier <demelier.david@gmail.com>
parents:
33156
diff
changeset
|
512 item = self._knownconfig.get(section, {}).get(name) |
e714159860fd
configitems: add alias support in config
David Demelier <demelier.david@gmail.com>
parents:
33156
diff
changeset
|
513 alternates = [(section, name)] |
e714159860fd
configitems: add alias support in config
David Demelier <demelier.david@gmail.com>
parents:
33156
diff
changeset
|
514 |
e714159860fd
configitems: add alias support in config
David Demelier <demelier.david@gmail.com>
parents:
33156
diff
changeset
|
515 if item is not None: |
e714159860fd
configitems: add alias support in config
David Demelier <demelier.david@gmail.com>
parents:
33156
diff
changeset
|
516 alternates.extend(item.alias) |
34947
ff2110eadbfa
configitems: relax warning about unwanted default value
Yuya Nishihara <yuya@tcha.org>
parents:
34882
diff
changeset
|
517 if callable(item.default): |
ff2110eadbfa
configitems: relax warning about unwanted default value
Yuya Nishihara <yuya@tcha.org>
parents:
34882
diff
changeset
|
518 itemdefault = item.default() |
ff2110eadbfa
configitems: relax warning about unwanted default value
Yuya Nishihara <yuya@tcha.org>
parents:
34882
diff
changeset
|
519 else: |
ff2110eadbfa
configitems: relax warning about unwanted default value
Yuya Nishihara <yuya@tcha.org>
parents:
34882
diff
changeset
|
520 itemdefault = item.default |
34858
85a2db47ad50
configitems: adds a developer warning when accessing undeclared configuration
Boris Feld <boris.feld@octobus.net>
parents:
34849
diff
changeset
|
521 else: |
85a2db47ad50
configitems: adds a developer warning when accessing undeclared configuration
Boris Feld <boris.feld@octobus.net>
parents:
34849
diff
changeset
|
522 msg = ("accessing unregistered config item: '%s.%s'") |
85a2db47ad50
configitems: adds a developer warning when accessing undeclared configuration
Boris Feld <boris.feld@octobus.net>
parents:
34849
diff
changeset
|
523 msg %= (section, name) |
85a2db47ad50
configitems: adds a developer warning when accessing undeclared configuration
Boris Feld <boris.feld@octobus.net>
parents:
34849
diff
changeset
|
524 self.develwarn(msg, 2, 'warn-config-unknown') |
33329
e714159860fd
configitems: add alias support in config
David Demelier <demelier.david@gmail.com>
parents:
33156
diff
changeset
|
525 |
e714159860fd
configitems: add alias support in config
David Demelier <demelier.david@gmail.com>
parents:
33156
diff
changeset
|
526 if default is _unset: |
e714159860fd
configitems: add alias support in config
David Demelier <demelier.david@gmail.com>
parents:
33156
diff
changeset
|
527 if item is None: |
e714159860fd
configitems: add alias support in config
David Demelier <demelier.david@gmail.com>
parents:
33156
diff
changeset
|
528 value = default |
33471
d74141ccfd8b
configitems: handle case were the default value is not static
Boris Feld <boris.feld@octobus.net>
parents:
33329
diff
changeset
|
529 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
|
530 value = None |
d74141ccfd8b
configitems: handle case were the default value is not static
Boris Feld <boris.feld@octobus.net>
parents:
33329
diff
changeset
|
531 msg = "config item requires an explicit default value: '%s.%s'" |
d74141ccfd8b
configitems: handle case were the default value is not static
Boris Feld <boris.feld@octobus.net>
parents:
33329
diff
changeset
|
532 msg %= (section, name) |
d74141ccfd8b
configitems: handle case were the default value is not static
Boris Feld <boris.feld@octobus.net>
parents:
33329
diff
changeset
|
533 self.develwarn(msg, 2, 'warn-config-default') |
33329
e714159860fd
configitems: add alias support in config
David Demelier <demelier.david@gmail.com>
parents:
33156
diff
changeset
|
534 else: |
34947
ff2110eadbfa
configitems: relax warning about unwanted default value
Yuya Nishihara <yuya@tcha.org>
parents:
34882
diff
changeset
|
535 value = itemdefault |
33471
d74141ccfd8b
configitems: handle case were the default value is not static
Boris Feld <boris.feld@octobus.net>
parents:
33329
diff
changeset
|
536 elif (item is not None |
34947
ff2110eadbfa
configitems: relax warning about unwanted default value
Yuya Nishihara <yuya@tcha.org>
parents:
34882
diff
changeset
|
537 and item.default is not configitems.dynamicdefault |
ff2110eadbfa
configitems: relax warning about unwanted default value
Yuya Nishihara <yuya@tcha.org>
parents:
34882
diff
changeset
|
538 and default != itemdefault): |
ff2110eadbfa
configitems: relax warning about unwanted default value
Yuya Nishihara <yuya@tcha.org>
parents:
34882
diff
changeset
|
539 msg = ("specifying a mismatched default value for a registered " |
33329
e714159860fd
configitems: add alias support in config
David Demelier <demelier.david@gmail.com>
parents:
33156
diff
changeset
|
540 "config item: '%s.%s' '%s'") |
36164
8f5c7f906f9b
ui: use pycompat.bytestr() to get a bytes-repr of config default
Augie Fackler <augie@google.com>
parents:
36000
diff
changeset
|
541 msg %= (section, name, pycompat.bytestr(default)) |
33329
e714159860fd
configitems: add alias support in config
David Demelier <demelier.david@gmail.com>
parents:
33156
diff
changeset
|
542 self.develwarn(msg, 2, '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
|
543 |
33329
e714159860fd
configitems: add alias support in config
David Demelier <demelier.david@gmail.com>
parents:
33156
diff
changeset
|
544 for s, n in alternates: |
e714159860fd
configitems: add alias support in config
David Demelier <demelier.david@gmail.com>
parents:
33156
diff
changeset
|
545 candidate = self._data(untrusted).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
|
546 if candidate is not None: |
1aa05203f7f6
config: extract the core config logic into a private method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
33005
diff
changeset
|
547 value = candidate |
33329
e714159860fd
configitems: add alias support in config
David Demelier <demelier.david@gmail.com>
parents:
33156
diff
changeset
|
548 section = s |
15035
cc669e4fec95
ui: allow alternatives for config options
Matt Mackall <mpm@selenic.com>
parents:
15002
diff
changeset
|
549 name = n |
cc669e4fec95
ui: allow alternatives for config options
Matt Mackall <mpm@selenic.com>
parents:
15002
diff
changeset
|
550 break |
cc669e4fec95
ui: allow alternatives for config options
Matt Mackall <mpm@selenic.com>
parents:
15002
diff
changeset
|
551 |
8204 | 552 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
|
553 for s, n in alternates: |
e714159860fd
configitems: add alias support in config
David Demelier <demelier.david@gmail.com>
parents:
33156
diff
changeset
|
554 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
|
555 if uvalue is not None and uvalue != value: |
ab3cf67740d6
ui.config: fix bug in config alternatives from cc669e4fec95
Augie Fackler <durin42@gmail.com>
parents:
19226
diff
changeset
|
556 self.debug("ignoring untrusted configuration option " |
33329
e714159860fd
configitems: add alias support in config
David Demelier <demelier.david@gmail.com>
parents:
33156
diff
changeset
|
557 "%s.%s = %s\n" % (s, n, uvalue)) |
3552
9b52239dc740
save settings from untrusted config files in a separate configparser
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
3551
diff
changeset
|
558 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
|
559 |
32985
cd2fd1765654
config: use the new '_unset' value for 'configsuboptions'
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
32984
diff
changeset
|
560 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
|
561 """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
|
562 |
dccbebcff075
ui: add method to return option and all sub-options
Gregory Szorc <gregory.szorc@gmail.com>
parents:
27153
diff
changeset
|
563 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
|
564 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
|
565 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
|
566 |
dccbebcff075
ui: add method to return option and all sub-options
Gregory Szorc <gregory.szorc@gmail.com>
parents:
27153
diff
changeset
|
567 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
|
568 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
|
569 """ |
32984
61a8321c9962
config: use the 'config' method in 'configsuboptions'
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
32983
diff
changeset
|
570 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
|
571 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
|
572 sub = {} |
dccbebcff075
ui: add method to return option and all sub-options
Gregory Szorc <gregory.szorc@gmail.com>
parents:
27153
diff
changeset
|
573 prefix = '%s:' % name |
dccbebcff075
ui: add method to return option and all sub-options
Gregory Szorc <gregory.szorc@gmail.com>
parents:
27153
diff
changeset
|
574 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
|
575 if k.startswith(prefix): |
dccbebcff075
ui: add method to return option and all sub-options
Gregory Szorc <gregory.szorc@gmail.com>
parents:
27153
diff
changeset
|
576 sub[k[len(prefix):]] = v |
dccbebcff075
ui: add method to return option and all sub-options
Gregory Szorc <gregory.szorc@gmail.com>
parents:
27153
diff
changeset
|
577 |
dccbebcff075
ui: add method to return option and all sub-options
Gregory Szorc <gregory.szorc@gmail.com>
parents:
27153
diff
changeset
|
578 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
|
579 for k, v in sub.items(): |
dccbebcff075
ui: add method to return option and all sub-options
Gregory Szorc <gregory.szorc@gmail.com>
parents:
27153
diff
changeset
|
580 uvalue = self._ucfg.get(section, '%s:%s' % (name, k)) |
dccbebcff075
ui: add method to return option and all sub-options
Gregory Szorc <gregory.szorc@gmail.com>
parents:
27153
diff
changeset
|
581 if uvalue is not None and uvalue != v: |
dccbebcff075
ui: add method to return option and all sub-options
Gregory Szorc <gregory.szorc@gmail.com>
parents:
27153
diff
changeset
|
582 self.debug('ignoring untrusted configuration option ' |
dccbebcff075
ui: add method to return option and all sub-options
Gregory Szorc <gregory.szorc@gmail.com>
parents:
27153
diff
changeset
|
583 '%s:%s.%s = %s\n' % (section, name, k, uvalue)) |
dccbebcff075
ui: add method to return option and all sub-options
Gregory Szorc <gregory.szorc@gmail.com>
parents:
27153
diff
changeset
|
584 |
dccbebcff075
ui: add method to return option and all sub-options
Gregory Szorc <gregory.szorc@gmail.com>
parents:
27153
diff
changeset
|
585 return main, sub |
dccbebcff075
ui: add method to return option and all sub-options
Gregory Szorc <gregory.szorc@gmail.com>
parents:
27153
diff
changeset
|
586 |
32983
36e16797df32
config: use the new '_unset' value for 'configpath'
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
32982
diff
changeset
|
587 def configpath(self, section, name, default=_unset, untrusted=False): |
14924
545e00279670
ui: config path relative to repo root
Simon Heimberg <simohe@besonet.ch>
parents:
14923
diff
changeset
|
588 'get a path config item, expanded relative to repo root or config file' |
13238 | 589 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
|
590 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
|
591 return None |
13238 | 592 if not os.path.isabs(v) or "://" not in v: |
593 src = self.configsource(section, name, untrusted) | |
594 if ':' in src: | |
14922
1bc970a77977
ui: fix error, base can not be a list
Simon Heimberg <simohe@besonet.ch>
parents:
14859
diff
changeset
|
595 base = os.path.dirname(src.rsplit(':')[0]) |
13238 | 596 v = os.path.join(base, os.path.expanduser(v)) |
597 return v | |
598 | |
32977
b39dafe681df
config: use the new '_unset' value for 'configbool'
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
32976
diff
changeset
|
599 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
|
600 """parse a configuration element as a boolean |
fa2b596db182
ui: add configint function and tests
Sune Foldager <cryo@cyanite.org>
parents:
14076
diff
changeset
|
601 |
34146
0fa781320203
doctest: bulk-replace string literals with b'' for Python 3
Yuya Nishihara <yuya@tcha.org>
parents:
34071
diff
changeset
|
602 >>> 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
|
603 >>> 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
|
604 >>> u.configbool(s, b'true') |
14171
fa2b596db182
ui: add configint function and tests
Sune Foldager <cryo@cyanite.org>
parents:
14076
diff
changeset
|
605 True |
34146
0fa781320203
doctest: bulk-replace string literals with b'' for Python 3
Yuya Nishihara <yuya@tcha.org>
parents:
34071
diff
changeset
|
606 >>> 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
|
607 >>> u.configbool(s, b'false') |
14171
fa2b596db182
ui: add configint function and tests
Sune Foldager <cryo@cyanite.org>
parents:
14076
diff
changeset
|
608 False |
34146
0fa781320203
doctest: bulk-replace string literals with b'' for Python 3
Yuya Nishihara <yuya@tcha.org>
parents:
34071
diff
changeset
|
609 >>> u.configbool(s, b'unknown') |
14171
fa2b596db182
ui: add configint function and tests
Sune Foldager <cryo@cyanite.org>
parents:
14076
diff
changeset
|
610 False |
34146
0fa781320203
doctest: bulk-replace string literals with b'' for Python 3
Yuya Nishihara <yuya@tcha.org>
parents:
34071
diff
changeset
|
611 >>> u.configbool(s, b'unknown', True) |
14171
fa2b596db182
ui: add configint function and tests
Sune Foldager <cryo@cyanite.org>
parents:
14076
diff
changeset
|
612 True |
34146
0fa781320203
doctest: bulk-replace string literals with b'' for Python 3
Yuya Nishihara <yuya@tcha.org>
parents:
34071
diff
changeset
|
613 >>> 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
|
614 >>> u.configbool(s, b'invalid') |
14171
fa2b596db182
ui: add configint function and tests
Sune Foldager <cryo@cyanite.org>
parents:
14076
diff
changeset
|
615 Traceback (most recent call last): |
fa2b596db182
ui: add configint function and tests
Sune Foldager <cryo@cyanite.org>
parents:
14076
diff
changeset
|
616 ... |
fa2b596db182
ui: add configint function and tests
Sune Foldager <cryo@cyanite.org>
parents:
14076
diff
changeset
|
617 ConfigError: foo.invalid is not a boolean ('somevalue') |
fa2b596db182
ui: add configint function and tests
Sune Foldager <cryo@cyanite.org>
parents:
14076
diff
changeset
|
618 """ |
fa2b596db182
ui: add configint function and tests
Sune Foldager <cryo@cyanite.org>
parents:
14076
diff
changeset
|
619 |
33071
1dc2ffe0123b
config: use '_config' within 'configbool'
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
33070
diff
changeset
|
620 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
|
621 if v is None: |
33071
1dc2ffe0123b
config: use '_config' within 'configbool'
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
33070
diff
changeset
|
622 return v |
1dc2ffe0123b
config: use '_config' within 'configbool'
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
33070
diff
changeset
|
623 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
|
624 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
|
625 return False |
8144
fca54469480e
ui: introduce new config parser
Matt Mackall <mpm@selenic.com>
parents:
8143
diff
changeset
|
626 return default |
10243
cd3e5c47d663
ui: just return it if it's already a bool
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
10220
diff
changeset
|
627 if isinstance(v, bool): |
cd3e5c47d663
ui: just return it if it's already a bool
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
10220
diff
changeset
|
628 return v |
37087
f0b6fbea00cf
stringutil: bulk-replace call sites to point to new module
Yuya Nishihara <yuya@tcha.org>
parents:
36916
diff
changeset
|
629 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
|
630 if b is None: |
14171
fa2b596db182
ui: add configint function and tests
Sune Foldager <cryo@cyanite.org>
parents:
14076
diff
changeset
|
631 raise error.ConfigError(_("%s.%s is not a boolean ('%s')") |
8144
fca54469480e
ui: introduce new config parser
Matt Mackall <mpm@selenic.com>
parents:
8143
diff
changeset
|
632 % (section, name, v)) |
12087
a88a4720c2f0
parsebool: create new function and use it for config parsing
Augie Fackler <durin42@gmail.com>
parents:
11984
diff
changeset
|
633 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
|
634 |
32978
6ff6eb33f353
config: use the new '_unset' value for 'configwith'
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
32977
diff
changeset
|
635 def configwith(self, convert, section, name, default=_unset, |
30946
120682fce099
ui: add a configwith method
Bryan O'Sullivan <bryano@fb.com>
parents:
30945
diff
changeset
|
636 desc=None, untrusted=False): |
120682fce099
ui: add a configwith method
Bryan O'Sullivan <bryano@fb.com>
parents:
30945
diff
changeset
|
637 """parse a configuration element with a conversion function |
120682fce099
ui: add a configwith method
Bryan O'Sullivan <bryano@fb.com>
parents:
30945
diff
changeset
|
638 |
34146
0fa781320203
doctest: bulk-replace string literals with b'' for Python 3
Yuya Nishihara <yuya@tcha.org>
parents:
34071
diff
changeset
|
639 >>> 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
|
640 >>> 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
|
641 >>> u.configwith(float, s, b'float1') |
30946
120682fce099
ui: add a configwith method
Bryan O'Sullivan <bryano@fb.com>
parents:
30945
diff
changeset
|
642 42.0 |
34146
0fa781320203
doctest: bulk-replace string literals with b'' for Python 3
Yuya Nishihara <yuya@tcha.org>
parents:
34071
diff
changeset
|
643 >>> 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
|
644 >>> u.configwith(float, s, b'float2') |
30952 | 645 -4.25 |
34146
0fa781320203
doctest: bulk-replace string literals with b'' for Python 3
Yuya Nishihara <yuya@tcha.org>
parents:
34071
diff
changeset
|
646 >>> 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
|
647 7.0 |
34146
0fa781320203
doctest: bulk-replace string literals with b'' for Python 3
Yuya Nishihara <yuya@tcha.org>
parents:
34071
diff
changeset
|
648 >>> 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
|
649 >>> u.configwith(float, s, b'invalid') |
30946
120682fce099
ui: add a configwith method
Bryan O'Sullivan <bryano@fb.com>
parents:
30945
diff
changeset
|
650 Traceback (most recent call last): |
120682fce099
ui: add a configwith method
Bryan O'Sullivan <bryano@fb.com>
parents:
30945
diff
changeset
|
651 ... |
120682fce099
ui: add a configwith method
Bryan O'Sullivan <bryano@fb.com>
parents:
30945
diff
changeset
|
652 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
|
653 >>> 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
|
654 Traceback (most recent call last): |
120682fce099
ui: add a configwith method
Bryan O'Sullivan <bryano@fb.com>
parents:
30945
diff
changeset
|
655 ... |
120682fce099
ui: add a configwith method
Bryan O'Sullivan <bryano@fb.com>
parents:
30945
diff
changeset
|
656 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
|
657 """ |
120682fce099
ui: add a configwith method
Bryan O'Sullivan <bryano@fb.com>
parents:
30945
diff
changeset
|
658 |
32978
6ff6eb33f353
config: use the new '_unset' value for 'configwith'
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
32977
diff
changeset
|
659 v = self.config(section, name, default, untrusted) |
30946
120682fce099
ui: add a configwith method
Bryan O'Sullivan <bryano@fb.com>
parents:
30945
diff
changeset
|
660 if v is None: |
32978
6ff6eb33f353
config: use the new '_unset' value for 'configwith'
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
32977
diff
changeset
|
661 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
|
662 try: |
120682fce099
ui: add a configwith method
Bryan O'Sullivan <bryano@fb.com>
parents:
30945
diff
changeset
|
663 return convert(v) |
32496
bb18728ea617
util: raise ParseError when parsing dates (BC)
Boris Feld <boris.feld@octobus.net>
parents:
32487
diff
changeset
|
664 except (ValueError, error.ParseError): |
30946
120682fce099
ui: add a configwith method
Bryan O'Sullivan <bryano@fb.com>
parents:
30945
diff
changeset
|
665 if desc is None: |
34215
0a2fd3bfc704
py3: convert function name to bytes in ui.configwith()
Yuya Nishihara <yuya@tcha.org>
parents:
34146
diff
changeset
|
666 desc = pycompat.sysbytes(convert.__name__) |
30946
120682fce099
ui: add a configwith method
Bryan O'Sullivan <bryano@fb.com>
parents:
30945
diff
changeset
|
667 raise error.ConfigError(_("%s.%s is not a valid %s ('%s')") |
120682fce099
ui: add a configwith method
Bryan O'Sullivan <bryano@fb.com>
parents:
30945
diff
changeset
|
668 % (section, name, desc, v)) |
120682fce099
ui: add a configwith method
Bryan O'Sullivan <bryano@fb.com>
parents:
30945
diff
changeset
|
669 |
32979
24111157f967
config: use the new '_unset' value for 'configint'
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
32978
diff
changeset
|
670 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
|
671 """parse a configuration element as an integer |
fa2b596db182
ui: add configint function and tests
Sune Foldager <cryo@cyanite.org>
parents:
14076
diff
changeset
|
672 |
34146
0fa781320203
doctest: bulk-replace string literals with b'' for Python 3
Yuya Nishihara <yuya@tcha.org>
parents:
34071
diff
changeset
|
673 >>> 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
|
674 >>> 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
|
675 >>> u.configint(s, b'int1') |
14171
fa2b596db182
ui: add configint function and tests
Sune Foldager <cryo@cyanite.org>
parents:
14076
diff
changeset
|
676 42 |
34146
0fa781320203
doctest: bulk-replace string literals with b'' for Python 3
Yuya Nishihara <yuya@tcha.org>
parents:
34071
diff
changeset
|
677 >>> 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
|
678 >>> u.configint(s, b'int2') |
14171
fa2b596db182
ui: add configint function and tests
Sune Foldager <cryo@cyanite.org>
parents:
14076
diff
changeset
|
679 -42 |
34146
0fa781320203
doctest: bulk-replace string literals with b'' for Python 3
Yuya Nishihara <yuya@tcha.org>
parents:
34071
diff
changeset
|
680 >>> u.configint(s, b'unknown', 7) |
14171
fa2b596db182
ui: add configint function and tests
Sune Foldager <cryo@cyanite.org>
parents:
14076
diff
changeset
|
681 7 |
34146
0fa781320203
doctest: bulk-replace string literals with b'' for Python 3
Yuya Nishihara <yuya@tcha.org>
parents:
34071
diff
changeset
|
682 >>> 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
|
683 >>> u.configint(s, b'invalid') |
14171
fa2b596db182
ui: add configint function and tests
Sune Foldager <cryo@cyanite.org>
parents:
14076
diff
changeset
|
684 Traceback (most recent call last): |
fa2b596db182
ui: add configint function and tests
Sune Foldager <cryo@cyanite.org>
parents:
14076
diff
changeset
|
685 ... |
30947
8fa3ab6221b9
ui: rewrite configint in terms of configwith
Bryan O'Sullivan <bryano@fb.com>
parents:
30946
diff
changeset
|
686 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
|
687 """ |
fa2b596db182
ui: add configint function and tests
Sune Foldager <cryo@cyanite.org>
parents:
14076
diff
changeset
|
688 |
30947
8fa3ab6221b9
ui: rewrite configint in terms of configwith
Bryan O'Sullivan <bryano@fb.com>
parents:
30946
diff
changeset
|
689 return self.configwith(int, section, name, default, 'integer', |
8fa3ab6221b9
ui: rewrite configint in terms of configwith
Bryan O'Sullivan <bryano@fb.com>
parents:
30946
diff
changeset
|
690 untrusted) |
14171
fa2b596db182
ui: add configint function and tests
Sune Foldager <cryo@cyanite.org>
parents:
14076
diff
changeset
|
691 |
32980
0bf986cfa82b
config: use the new '_unset' value for 'configbytes'
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
32979
diff
changeset
|
692 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
|
693 """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
|
694 |
2c4cd1c42365
ui: add a configbytes method, for space configuration
Bryan O'Sullivan <bryano@fb.com>
parents:
18966
diff
changeset
|
695 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
|
696 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
|
697 |
34146
0fa781320203
doctest: bulk-replace string literals with b'' for Python 3
Yuya Nishihara <yuya@tcha.org>
parents:
34071
diff
changeset
|
698 >>> 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
|
699 >>> 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
|
700 >>> 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
|
701 42 |
34146
0fa781320203
doctest: bulk-replace string literals with b'' for Python 3
Yuya Nishihara <yuya@tcha.org>
parents:
34071
diff
changeset
|
702 >>> 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
|
703 >>> 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
|
704 43520 |
34146
0fa781320203
doctest: bulk-replace string literals with b'' for Python 3
Yuya Nishihara <yuya@tcha.org>
parents:
34071
diff
changeset
|
705 >>> 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
|
706 7340032 |
34146
0fa781320203
doctest: bulk-replace string literals with b'' for Python 3
Yuya Nishihara <yuya@tcha.org>
parents:
34071
diff
changeset
|
707 >>> 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
|
708 >>> 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
|
709 Traceback (most recent call last): |
2c4cd1c42365
ui: add a configbytes method, for space configuration
Bryan O'Sullivan <bryano@fb.com>
parents:
18966
diff
changeset
|
710 ... |
2c4cd1c42365
ui: add a configbytes method, for space configuration
Bryan O'Sullivan <bryano@fb.com>
parents:
18966
diff
changeset
|
711 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
|
712 """ |
2c4cd1c42365
ui: add a configbytes method, for space configuration
Bryan O'Sullivan <bryano@fb.com>
parents:
18966
diff
changeset
|
713 |
33072
e70cbae4c4e6
config: use '_config' within 'configbytes'
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
33071
diff
changeset
|
714 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
|
715 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
|
716 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
|
717 default = 0 |
19195
9311cd5c09ed
ui: use util.sizetoint in configbytes
Bryan O'Sullivan <bryano@fb.com>
parents:
19085
diff
changeset
|
718 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
|
719 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
|
720 return value |
19065
2c4cd1c42365
ui: add a configbytes method, for space configuration
Bryan O'Sullivan <bryano@fb.com>
parents:
18966
diff
changeset
|
721 try: |
19195
9311cd5c09ed
ui: use util.sizetoint in configbytes
Bryan O'Sullivan <bryano@fb.com>
parents:
19085
diff
changeset
|
722 return util.sizetoint(value) |
9311cd5c09ed
ui: use util.sizetoint in configbytes
Bryan O'Sullivan <bryano@fb.com>
parents:
19085
diff
changeset
|
723 except error.ParseError: |
19065
2c4cd1c42365
ui: add a configbytes method, for space configuration
Bryan O'Sullivan <bryano@fb.com>
parents:
18966
diff
changeset
|
724 raise error.ConfigError(_("%s.%s is not a byte quantity ('%s')") |
19195
9311cd5c09ed
ui: use util.sizetoint in configbytes
Bryan O'Sullivan <bryano@fb.com>
parents:
19085
diff
changeset
|
725 % (section, name, value)) |
19065
2c4cd1c42365
ui: add a configbytes method, for space configuration
Bryan O'Sullivan <bryano@fb.com>
parents:
18966
diff
changeset
|
726 |
32981
88b3a38d39e3
config: use the new '_unset' value for 'configlist'
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
32980
diff
changeset
|
727 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
|
728 """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
|
729 strings |
fa2b596db182
ui: add configint function and tests
Sune Foldager <cryo@cyanite.org>
parents:
14076
diff
changeset
|
730 |
34146
0fa781320203
doctest: bulk-replace string literals with b'' for Python 3
Yuya Nishihara <yuya@tcha.org>
parents:
34071
diff
changeset
|
731 >>> 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
|
732 >>> 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
|
733 >>> u.configlist(s, b'list1') |
14171
fa2b596db182
ui: add configint function and tests
Sune Foldager <cryo@cyanite.org>
parents:
14076
diff
changeset
|
734 ['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
|
735 >>> 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
|
736 >>> 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
|
737 ['this', 'is', 'a small', 'test'] |
14171
fa2b596db182
ui: add configint function and tests
Sune Foldager <cryo@cyanite.org>
parents:
14076
diff
changeset
|
738 """ |
31488
a7c687c35119
ui: move configlist parser to config.py
Jun Wu <quark@fb.com>
parents:
31486
diff
changeset
|
739 # default is not always a list |
32981
88b3a38d39e3
config: use the new '_unset' value for 'configlist'
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
32980
diff
changeset
|
740 v = self.configwith(config.parselist, section, name, default, |
31488
a7c687c35119
ui: move configlist parser to config.py
Jun Wu <quark@fb.com>
parents:
31486
diff
changeset
|
741 'list', untrusted) |
32981
88b3a38d39e3
config: use the new '_unset' value for 'configlist'
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
32980
diff
changeset
|
742 if isinstance(v, bytes): |
88b3a38d39e3
config: use the new '_unset' value for 'configlist'
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
32980
diff
changeset
|
743 return config.parselist(v) |
88b3a38d39e3
config: use the new '_unset' value for 'configlist'
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
32980
diff
changeset
|
744 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
|
745 return [] |
88b3a38d39e3
config: use the new '_unset' value for 'configlist'
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
32980
diff
changeset
|
746 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
|
747 |
32982
6599b7372387
config: use the new '_unset' value for 'configdate'
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
32981
diff
changeset
|
748 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
|
749 """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
|
750 |
34146
0fa781320203
doctest: bulk-replace string literals with b'' for Python 3
Yuya Nishihara <yuya@tcha.org>
parents:
34071
diff
changeset
|
751 >>> 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
|
752 >>> 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
|
753 >>> 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
|
754 (0, 0) |
420e93b0d9dc
ui: add the possiblity to get a date config field
Boris Feld <boris.feld@octobus.net>
parents:
32105
diff
changeset
|
755 """ |
420e93b0d9dc
ui: add the possiblity to get a date config field
Boris Feld <boris.feld@octobus.net>
parents:
32105
diff
changeset
|
756 if self.config(section, name, default, untrusted): |
36636
c6061cadb400
util: extract all date-related utils in utils/dateutil module
Boris Feld <boris.feld@octobus.net>
parents:
36452
diff
changeset
|
757 return self.configwith(dateutil.parsedate, section, name, default, |
32446
420e93b0d9dc
ui: add the possiblity to get a date config field
Boris Feld <boris.feld@octobus.net>
parents:
32105
diff
changeset
|
758 'date', untrusted) |
32982
6599b7372387
config: use the new '_unset' value for 'configdate'
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
32981
diff
changeset
|
759 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
|
760 return None |
32446
420e93b0d9dc
ui: add the possiblity to get a date config field
Boris Feld <boris.feld@octobus.net>
parents:
32105
diff
changeset
|
761 return default |
420e93b0d9dc
ui: add the possiblity to get a date config field
Boris Feld <boris.feld@octobus.net>
parents:
32105
diff
changeset
|
762 |
27696
e70c97cc9243
config: add hasconfig method and supporting plumbing
Bryan O'Sullivan <bos@serpentine.com>
parents:
27563
diff
changeset
|
763 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
|
764 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
|
765 |
4487
1b5b98837bb5
ui: Rename has_config to has_section.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4258
diff
changeset
|
766 def has_section(self, section, untrusted=False): |
2343
af81d8770620
add ui.has_config method.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2335
diff
changeset
|
767 '''tell whether section exists in config.''' |
8199 | 768 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
|
769 |
27253
f43988e5954c
ui: optionally ignore sub-options from configitems()
Gregory Szorc <gregory.szorc@gmail.com>
parents:
27252
diff
changeset
|
770 def configitems(self, section, untrusted=False, ignoresub=False): |
8199 | 771 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
|
772 if ignoresub: |
37137
6890b7e991a4
help: supporting both help and doc for aliases
Rodrigo Damazio <rdamazio@google.com>
parents:
37123
diff
changeset
|
773 items = [i for i in items if ':' not in i[0]] |
8204 | 774 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
|
775 for k, v in self._ucfg.items(section): |
8203 | 776 if self._tcfg.get(section, k) != v: |
14708
8083f4d00bd1
i18n: remove translation of debug messages
David Soria Parra <dsp@php.net>
parents:
14614
diff
changeset
|
777 self.debug("ignoring untrusted configuration option " |
8083f4d00bd1
i18n: remove translation of debug messages
David Soria Parra <dsp@php.net>
parents:
14614
diff
changeset
|
778 "%s.%s = %s\n" % (section, k, v)) |
8144
fca54469480e
ui: introduce new config parser
Matt Mackall <mpm@selenic.com>
parents:
8143
diff
changeset
|
779 return items |
285 | 780 |
3552
9b52239dc740
save settings from untrusted config files in a separate configparser
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
3551
diff
changeset
|
781 def walkconfig(self, untrusted=False): |
8203 | 782 cfg = self._data(untrusted) |
783 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
|
784 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
|
785 yield section, name, value |
1028
25e7ea0f2cff
Add commands.debugconfig.
Bryan O'Sullivan <bos@serpentine.com>
parents:
981
diff
changeset
|
786 |
14372
be0daa0eeb3e
ui: test plain mode against exceptions
"Yann E. MORIN" <yann.morin.1998@anciens.enib.fr>
parents:
14171
diff
changeset
|
787 def plain(self, feature=None): |
11325
22a737306ba5
ui: document the formatted(), interactive() & plain() functions.
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents:
11324
diff
changeset
|
788 '''is plain mode active? |
22a737306ba5
ui: document the formatted(), interactive() & plain() functions.
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents:
11324
diff
changeset
|
789 |
13849
9f97de157aad
HGPLAIN: allow exceptions to plain mode, like i18n, via HGPLAINEXCEPT
Brodie Rao <brodie@bitheap.org>
parents:
13827
diff
changeset
|
790 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
|
791 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
|
792 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
|
793 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
|
794 |
9f97de157aad
HGPLAIN: allow exceptions to plain mode, like i18n, via HGPLAINEXCEPT
Brodie Rao <brodie@bitheap.org>
parents:
13827
diff
changeset
|
795 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
|
796 `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
|
797 |
14372
be0daa0eeb3e
ui: test plain mode against exceptions
"Yann E. MORIN" <yann.morin.1998@anciens.enib.fr>
parents:
14171
diff
changeset
|
798 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
|
799 - 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
|
800 - 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
|
801 - True otherwise |
11325
22a737306ba5
ui: document the formatted(), interactive() & plain() functions.
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents:
11324
diff
changeset
|
802 ''' |
30291
e9fca89c6d58
py3: use encoding.environ in ui.py
Pulkit Goyal <7895pulkit@gmail.com>
parents:
29982
diff
changeset
|
803 if ('HGPLAIN' not in encoding.environ and |
e9fca89c6d58
py3: use encoding.environ in ui.py
Pulkit Goyal <7895pulkit@gmail.com>
parents:
29982
diff
changeset
|
804 'HGPLAINEXCEPT' not in encoding.environ): |
13849
9f97de157aad
HGPLAIN: allow exceptions to plain mode, like i18n, via HGPLAINEXCEPT
Brodie Rao <brodie@bitheap.org>
parents:
13827
diff
changeset
|
805 return False |
30291
e9fca89c6d58
py3: use encoding.environ in ui.py
Pulkit Goyal <7895pulkit@gmail.com>
parents:
29982
diff
changeset
|
806 exceptions = encoding.environ.get('HGPLAINEXCEPT', |
e9fca89c6d58
py3: use encoding.environ in ui.py
Pulkit Goyal <7895pulkit@gmail.com>
parents:
29982
diff
changeset
|
807 '').strip().split(',') |
34996
c9740b69b9b7
dispatch: add HGPLAIN=+strictflags to restrict early parsing of global options
Yuya Nishihara <yuya@tcha.org>
parents:
34947
diff
changeset
|
808 # TODO: add support for HGPLAIN=+feature,-feature syntax |
c9740b69b9b7
dispatch: add HGPLAIN=+strictflags to restrict early parsing of global options
Yuya Nishihara <yuya@tcha.org>
parents:
34947
diff
changeset
|
809 if '+strictflags' not in encoding.environ.get('HGPLAIN', '').split(','): |
c9740b69b9b7
dispatch: add HGPLAIN=+strictflags to restrict early parsing of global options
Yuya Nishihara <yuya@tcha.org>
parents:
34947
diff
changeset
|
810 exceptions.append('strictflags') |
14372
be0daa0eeb3e
ui: test plain mode against exceptions
"Yann E. MORIN" <yann.morin.1998@anciens.enib.fr>
parents:
14171
diff
changeset
|
811 if feature and exceptions: |
be0daa0eeb3e
ui: test plain mode against exceptions
"Yann E. MORIN" <yann.morin.1998@anciens.enib.fr>
parents:
14171
diff
changeset
|
812 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
|
813 return True |
10455
40dfd46d098f
ui: add HGPLAIN environment variable for easier scripting
Brodie Rao <me+hg@dackz.net>
parents:
10426
diff
changeset
|
814 |
34849
9f2891fb426c
ui: add the possibility to returns None as username in ui
Boris Feld <boris.feld@octobus.net>
parents:
34707
diff
changeset
|
815 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
|
816 """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
|
817 |
c577689006fa
Adapted behaviour of ui.username() to documentation and mention it explicitly:
Thomas Arendsen Hein <thomas@intevation.de>
parents:
1984
diff
changeset
|
818 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
|
819 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
|
820 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
|
821 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
|
822 ($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
|
823 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
|
824 """ |
30291
e9fca89c6d58
py3: use encoding.environ in ui.py
Pulkit Goyal <7895pulkit@gmail.com>
parents:
29982
diff
changeset
|
825 user = encoding.environ.get("HGUSER") |
1985
c577689006fa
Adapted behaviour of ui.username() to documentation and mention it explicitly:
Thomas Arendsen Hein <thomas@intevation.de>
parents:
1984
diff
changeset
|
826 if user is None: |
33329
e714159860fd
configitems: add alias support in config
David Demelier <demelier.david@gmail.com>
parents:
33156
diff
changeset
|
827 user = self.config("ui", "username") |
11225
d6dbd5e4ee72
ui.username(): expand environment variables in username configuration value.
Chad Dombrova <chadrik@gmail.com>
parents:
11036
diff
changeset
|
828 if user is not None: |
d6dbd5e4ee72
ui.username(): expand environment variables in username configuration value.
Chad Dombrova <chadrik@gmail.com>
parents:
11036
diff
changeset
|
829 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
|
830 if user is None: |
30291
e9fca89c6d58
py3: use encoding.environ in ui.py
Pulkit Goyal <7895pulkit@gmail.com>
parents:
29982
diff
changeset
|
831 user = encoding.environ.get("EMAIL") |
34849
9f2891fb426c
ui: add the possibility to returns None as username in ui
Boris Feld <boris.feld@octobus.net>
parents:
34707
diff
changeset
|
832 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
|
833 return user |
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
|
834 if user is None and self.configbool("ui", "askusername"): |
7600 | 835 user = self.prompt(_("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
|
836 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
|
837 try: |
37123
a8a902d7176e
procutil: bulk-replace function calls to point to new module
Yuya Nishihara <yuya@tcha.org>
parents:
37122
diff
changeset
|
838 user = '%s@%s' % (procutil.getuser(), |
36792
e3732c3ab92d
py3: fix type of default username
Yuya Nishihara <yuya@tcha.org>
parents:
36755
diff
changeset
|
839 encoding.strtolocal(socket.getfqdn())) |
16940
6409a5c75125
ui: lowercase "no username" warning
Martin Geisler <mg@aragost.com>
parents:
16939
diff
changeset
|
840 self.warn(_("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
|
841 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
|
842 pass |
78a0dd93db0b
Abort on empty username so specifying a username can be forced.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
3984
diff
changeset
|
843 if not user: |
26587
56b2bcea2529
error: get Abort from 'error' instead of 'util'
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
26451
diff
changeset
|
844 raise error.Abort(_('no username supplied'), |
28962
ad2cd2ef25d9
config: use single quotes around command hint
timeless <timeless@mozdev.org>
parents:
28958
diff
changeset
|
845 hint=_("use 'hg config --edit' " |
20580
b75a23eec9c9
ui: fix extra space in username abort
Matt Mackall <mpm@selenic.com>
parents:
20574
diff
changeset
|
846 'to set your username')) |
6351
eed0a6a05096
ui: disallow newlines in usernames (issue1034)
Matt Mackall <mpm@selenic.com>
parents:
6333
diff
changeset
|
847 if "\n" in user: |
36266
ddeb7653b31c
py3: use pycompat.bytestr to convert str to bytes
Pulkit Goyal <7895pulkit@gmail.com>
parents:
36165
diff
changeset
|
848 raise error.Abort(_("username %r contains a newline\n") |
ddeb7653b31c
py3: use pycompat.bytestr to convert str to bytes
Pulkit Goyal <7895pulkit@gmail.com>
parents:
36165
diff
changeset
|
849 % pycompat.bytestr(user)) |
1985
c577689006fa
Adapted behaviour of ui.username() to documentation and mention it explicitly:
Thomas Arendsen Hein <thomas@intevation.de>
parents:
1984
diff
changeset
|
850 return user |
608
d2994b5298fb
Add username/merge/editor to .hgrc
Matt Mackall <mpm@selenic.com>
parents:
565
diff
changeset
|
851 |
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
|
852 def shortuser(self, 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
|
853 """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
|
854 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
|
855 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
|
856 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
|
857 |
2494
73ac95671788
push, outgoing, bundle: fall back to "default" if "default-push" not defined
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2470
diff
changeset
|
858 def expandpath(self, loc, default=None): |
1892
622ee75cb4c9
Directory names take precedence over symbolic names consistently.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
1882
diff
changeset
|
859 """Return repository location relative to cwd or from [paths]""" |
26189
663fbc336e22
ui: change default path fallback mechanism (issue4796)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
26076
diff
changeset
|
860 try: |
663fbc336e22
ui: change default path fallback mechanism (issue4796)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
26076
diff
changeset
|
861 p = self.paths.getpath(loc) |
663fbc336e22
ui: change default path fallback mechanism (issue4796)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
26076
diff
changeset
|
862 if p: |
663fbc336e22
ui: change default path fallback mechanism (issue4796)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
26076
diff
changeset
|
863 return p.rawloc |
663fbc336e22
ui: change default path fallback mechanism (issue4796)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
26076
diff
changeset
|
864 except error.RepoError: |
663fbc336e22
ui: change default path fallback mechanism (issue4796)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
26076
diff
changeset
|
865 pass |
663fbc336e22
ui: change default path fallback mechanism (issue4796)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
26076
diff
changeset
|
866 |
663fbc336e22
ui: change default path fallback mechanism (issue4796)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
26076
diff
changeset
|
867 if default: |
663fbc336e22
ui: change default path fallback mechanism (issue4796)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
26076
diff
changeset
|
868 try: |
663fbc336e22
ui: change default path fallback mechanism (issue4796)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
26076
diff
changeset
|
869 p = self.paths.getpath(default) |
663fbc336e22
ui: change default path fallback mechanism (issue4796)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
26076
diff
changeset
|
870 if p: |
663fbc336e22
ui: change default path fallback mechanism (issue4796)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
26076
diff
changeset
|
871 return p.rawloc |
663fbc336e22
ui: change default path fallback mechanism (issue4796)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
26076
diff
changeset
|
872 except error.RepoError: |
663fbc336e22
ui: change default path fallback mechanism (issue4796)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
26076
diff
changeset
|
873 pass |
663fbc336e22
ui: change default path fallback mechanism (issue4796)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
26076
diff
changeset
|
874 |
24250
9c32eea2ca04
ui: represent paths as classes
Gregory Szorc <gregory.szorc@gmail.com>
parents:
23269
diff
changeset
|
875 return loc |
9c32eea2ca04
ui: represent paths as classes
Gregory Szorc <gregory.szorc@gmail.com>
parents:
23269
diff
changeset
|
876 |
9c32eea2ca04
ui: represent paths as classes
Gregory Szorc <gregory.szorc@gmail.com>
parents:
23269
diff
changeset
|
877 @util.propertycache |
9c32eea2ca04
ui: represent paths as classes
Gregory Szorc <gregory.szorc@gmail.com>
parents:
23269
diff
changeset
|
878 def paths(self): |
9c32eea2ca04
ui: represent paths as classes
Gregory Szorc <gregory.szorc@gmail.com>
parents:
23269
diff
changeset
|
879 return paths(self) |
506 | 880 |
27106
6ef17697b03d
ui: track label expansion when creating buffers
Gregory Szorc <gregory.szorc@gmail.com>
parents:
27068
diff
changeset
|
881 def pushbuffer(self, error=False, subproc=False, labeled=False): |
23139
e53f6b72a0e4
spelling: fixes from proofreading of spell checker issues
Mads Kiilerich <madski@unity3d.com>
parents:
23053
diff
changeset
|
882 """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
|
883 |
24848
2f88821856eb
ui: allow capture of subprocess output
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
24687
diff
changeset
|
884 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
|
885 |
2f88821856eb
ui: allow capture of subprocess output
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
24687
diff
changeset
|
886 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
|
887 captured too. |
10815
32b213b9b22c
ui: add ui.write() output labeling API
Brodie Rao <brodie@bitheap.org>
parents:
10567
diff
changeset
|
888 |
32b213b9b22c
ui: add ui.write() output labeling API
Brodie Rao <brodie@bitheap.org>
parents:
10567
diff
changeset
|
889 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
|
890 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
|
891 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
|
892 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
|
893 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
|
894 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
|
895 """ |
8202 | 896 self._buffers.append([]) |
27106
6ef17697b03d
ui: track label expansion when creating buffers
Gregory Szorc <gregory.szorc@gmail.com>
parents:
27068
diff
changeset
|
897 self._bufferstates.append((error, subproc, labeled)) |
6ef17697b03d
ui: track label expansion when creating buffers
Gregory Szorc <gregory.szorc@gmail.com>
parents:
27068
diff
changeset
|
898 self._bufferapplylabels = labeled |
3737
9f5c46c50118
add a simple nested buffering scheme to ui
Matt Mackall <mpm@selenic.com>
parents:
3721
diff
changeset
|
899 |
27109
a93d53f79e6e
ui: remove labeled argument from popbuffer
Gregory Szorc <gregory.szorc@gmail.com>
parents:
27106
diff
changeset
|
900 def popbuffer(self): |
a93d53f79e6e
ui: remove labeled argument from popbuffer
Gregory Szorc <gregory.szorc@gmail.com>
parents:
27106
diff
changeset
|
901 '''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
|
902 self._bufferstates.pop() |
27106
6ef17697b03d
ui: track label expansion when creating buffers
Gregory Szorc <gregory.szorc@gmail.com>
parents:
27068
diff
changeset
|
903 if self._bufferstates: |
6ef17697b03d
ui: track label expansion when creating buffers
Gregory Szorc <gregory.szorc@gmail.com>
parents:
27068
diff
changeset
|
904 self._bufferapplylabels = self._bufferstates[-1][2] |
6ef17697b03d
ui: track label expansion when creating buffers
Gregory Szorc <gregory.szorc@gmail.com>
parents:
27068
diff
changeset
|
905 else: |
6ef17697b03d
ui: track label expansion when creating buffers
Gregory Szorc <gregory.szorc@gmail.com>
parents:
27068
diff
changeset
|
906 self._bufferapplylabels = None |
6ef17697b03d
ui: track label expansion when creating buffers
Gregory Szorc <gregory.szorc@gmail.com>
parents:
27068
diff
changeset
|
907 |
8202 | 908 return "".join(self._buffers.pop()) |
3737
9f5c46c50118
add a simple nested buffering scheme to ui
Matt Mackall <mpm@selenic.com>
parents:
3721
diff
changeset
|
909 |
36000
0ff41ced4c12
diff: improve ui.write performance when not coloring on Windows
Joerg Sonnenberger <joerg@bec.de>
parents:
35996
diff
changeset
|
910 def canwritewithoutlabels(self): |
0ff41ced4c12
diff: improve ui.write performance when not coloring on Windows
Joerg Sonnenberger <joerg@bec.de>
parents:
35996
diff
changeset
|
911 '''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
|
912 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
|
913 return True |
0ff41ced4c12
diff: improve ui.write performance when not coloring on Windows
Joerg Sonnenberger <joerg@bec.de>
parents:
35996
diff
changeset
|
914 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
|
915 |
0ff41ced4c12
diff: improve ui.write performance when not coloring on Windows
Joerg Sonnenberger <joerg@bec.de>
parents:
35996
diff
changeset
|
916 def canbatchlabeledwrites(self): |
0ff41ced4c12
diff: improve ui.write performance when not coloring on Windows
Joerg Sonnenberger <joerg@bec.de>
parents:
35996
diff
changeset
|
917 '''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
|
918 # Windows color printing is special, see ``write``. |
0ff41ced4c12
diff: improve ui.write performance when not coloring on Windows
Joerg Sonnenberger <joerg@bec.de>
parents:
35996
diff
changeset
|
919 return self._colormode != 'win32' |
0ff41ced4c12
diff: improve ui.write performance when not coloring on Windows
Joerg Sonnenberger <joerg@bec.de>
parents:
35996
diff
changeset
|
920 |
10815
32b213b9b22c
ui: add ui.write() output labeling API
Brodie Rao <brodie@bitheap.org>
parents:
10567
diff
changeset
|
921 def write(self, *args, **opts): |
32b213b9b22c
ui: add ui.write() output labeling API
Brodie Rao <brodie@bitheap.org>
parents:
10567
diff
changeset
|
922 '''write args to output |
32b213b9b22c
ui: add ui.write() output labeling API
Brodie Rao <brodie@bitheap.org>
parents:
10567
diff
changeset
|
923 |
31108
ad074f900907
color: move 'write' logic to the core ui class
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
31107
diff
changeset
|
924 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
|
925 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
|
926 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
|
927 |
31108
ad074f900907
color: move 'write' logic to the core ui class
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
31107
diff
changeset
|
928 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
|
929 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
|
930 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
|
931 issues a label of "ui.debug". |
10815
32b213b9b22c
ui: add ui.write() output labeling API
Brodie Rao <brodie@bitheap.org>
parents:
10567
diff
changeset
|
932 |
32b213b9b22c
ui: add ui.write() output labeling API
Brodie Rao <brodie@bitheap.org>
parents:
10567
diff
changeset
|
933 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
|
934 "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
|
935 a label of "status.modified" for modified files. |
32b213b9b22c
ui: add ui.write() output labeling API
Brodie Rao <brodie@bitheap.org>
parents:
10567
diff
changeset
|
936 ''' |
35996
b62c4154bb28
ui: add explicit path to write prompt text bypassing buffers
Yuya Nishihara <yuya@tcha.org>
parents:
35995
diff
changeset
|
937 if self._buffers: |
31108
ad074f900907
color: move 'write' logic to the core ui class
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
31107
diff
changeset
|
938 if self._bufferapplylabels: |
35382
4e377c43e80b
py3: handle keyword arguments correctly in ui.py
Pulkit Goyal <7895pulkit@gmail.com>
parents:
35316
diff
changeset
|
939 label = opts.get(r'label', '') |
31108
ad074f900907
color: move 'write' logic to the core ui class
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
31107
diff
changeset
|
940 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
|
941 else: |
ad074f900907
color: move 'write' logic to the core ui class
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
31107
diff
changeset
|
942 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
|
943 else: |
b62c4154bb28
ui: add explicit path to write prompt text bypassing buffers
Yuya Nishihara <yuya@tcha.org>
parents:
35995
diff
changeset
|
944 self._writenobuf(*args, **opts) |
b62c4154bb28
ui: add explicit path to write prompt text bypassing buffers
Yuya Nishihara <yuya@tcha.org>
parents:
35995
diff
changeset
|
945 |
b62c4154bb28
ui: add explicit path to write prompt text bypassing buffers
Yuya Nishihara <yuya@tcha.org>
parents:
35995
diff
changeset
|
946 def _writenobuf(self, *args, **opts): |
b62c4154bb28
ui: add explicit path to write prompt text bypassing buffers
Yuya Nishihara <yuya@tcha.org>
parents:
35995
diff
changeset
|
947 if self._colormode == 'win32': |
31108
ad074f900907
color: move 'write' logic to the core ui class
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
31107
diff
changeset
|
948 # windows color printing is its own can of crab, defer to |
ad074f900907
color: move 'write' logic to the core ui class
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
31107
diff
changeset
|
949 # the color module and that is it. |
31131
1613c55ad3d6
color: pass 'ui' to 'win32print'
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
31130
diff
changeset
|
950 color.win32print(self, self._write, *args, **opts) |
3737
9f5c46c50118
add a simple nested buffering scheme to ui
Matt Mackall <mpm@selenic.com>
parents:
3721
diff
changeset
|
951 else: |
31108
ad074f900907
color: move 'write' logic to the core ui class
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
31107
diff
changeset
|
952 msgs = args |
ad074f900907
color: move 'write' logic to the core ui class
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
31107
diff
changeset
|
953 if self._colormode is not None: |
35382
4e377c43e80b
py3: handle keyword arguments correctly in ui.py
Pulkit Goyal <7895pulkit@gmail.com>
parents:
35316
diff
changeset
|
954 label = opts.get(r'label', '') |
31108
ad074f900907
color: move 'write' logic to the core ui class
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
31107
diff
changeset
|
955 msgs = [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
|
956 self._write(*msgs, **opts) |
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
|
957 |
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
|
958 def _write(self, *msgs, **opts): |
31143
0bb3089fe735
ui: remove superfluous indent in _write()
Yuya Nishihara <yuya@tcha.org>
parents:
31139
diff
changeset
|
959 self._progclear() |
0bb3089fe735
ui: remove superfluous indent in _write()
Yuya Nishihara <yuya@tcha.org>
parents:
31139
diff
changeset
|
960 # opencode timeblockedsection because this is a critical path |
0bb3089fe735
ui: remove superfluous indent in _write()
Yuya Nishihara <yuya@tcha.org>
parents:
31139
diff
changeset
|
961 starttime = util.timer() |
0bb3089fe735
ui: remove superfluous indent in _write()
Yuya Nishihara <yuya@tcha.org>
parents:
31139
diff
changeset
|
962 try: |
35929
e49c39ffeac2
ui: improve performance for multi-component writes
Joerg Sonnenberger <joerg@bec.de>
parents:
35382
diff
changeset
|
963 self.fout.write(''.join(msgs)) |
31961
db823e38a61c
stdio: raise StdioError if something goes wrong in ui._write
Bryan O'Sullivan <bryano@fb.com>
parents:
31958
diff
changeset
|
964 except IOError as err: |
db823e38a61c
stdio: raise StdioError if something goes wrong in ui._write
Bryan O'Sullivan <bryano@fb.com>
parents:
31958
diff
changeset
|
965 raise error.StdioError(err) |
31143
0bb3089fe735
ui: remove superfluous indent in _write()
Yuya Nishihara <yuya@tcha.org>
parents:
31139
diff
changeset
|
966 finally: |
0bb3089fe735
ui: remove superfluous indent in _write()
Yuya Nishihara <yuya@tcha.org>
parents:
31139
diff
changeset
|
967 self._blockedtimes['stdio_blocked'] += \ |
0bb3089fe735
ui: remove superfluous indent in _write()
Yuya Nishihara <yuya@tcha.org>
parents:
31139
diff
changeset
|
968 (util.timer() - starttime) * 1000 |
565 | 969 |
10815
32b213b9b22c
ui: add ui.write() output labeling API
Brodie Rao <brodie@bitheap.org>
parents:
10567
diff
changeset
|
970 def write_err(self, *args, **opts): |
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
|
971 self._progclear() |
31109
cb759f7f940d
ui: extract buffer write from protect and timed 'write_err' output
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
31108
diff
changeset
|
972 if self._bufferstates and self._bufferstates[-1][0]: |
31111
0c003943134f
color: move 'write-err' logic to the core ui class
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
31110
diff
changeset
|
973 self.write(*args, **opts) |
0c003943134f
color: move 'write-err' logic to the core ui class
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
31110
diff
changeset
|
974 elif self._colormode == 'win32': |
0c003943134f
color: move 'write-err' logic to the core ui class
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
31110
diff
changeset
|
975 # windows color printing is its own can of crab, defer to |
0c003943134f
color: move 'write-err' logic to the core ui class
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
31110
diff
changeset
|
976 # the color module and that is it. |
31131
1613c55ad3d6
color: pass 'ui' to 'win32print'
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
31130
diff
changeset
|
977 color.win32print(self, self._write_err, *args, **opts) |
31111
0c003943134f
color: move 'write-err' logic to the core ui class
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
31110
diff
changeset
|
978 else: |
0c003943134f
color: move 'write-err' logic to the core ui class
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
31110
diff
changeset
|
979 msgs = args |
0c003943134f
color: move 'write-err' logic to the core ui class
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
31110
diff
changeset
|
980 if self._colormode is not None: |
35382
4e377c43e80b
py3: handle keyword arguments correctly in ui.py
Pulkit Goyal <7895pulkit@gmail.com>
parents:
35316
diff
changeset
|
981 label = opts.get(r'label', '') |
31111
0c003943134f
color: move 'write-err' logic to the core ui class
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
31110
diff
changeset
|
982 msgs = [self.label(a, label) for a in args] |
0c003943134f
color: move 'write-err' logic to the core ui class
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
31110
diff
changeset
|
983 self._write_err(*msgs, **opts) |
31110
15d6488554b9
ui: extract low level part of 'write_err' in its own method
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
31109
diff
changeset
|
984 |
15d6488554b9
ui: extract low level part of 'write_err' in its own method
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
31109
diff
changeset
|
985 def _write_err(self, *msgs, **opts): |
1989
0541768fa558
ignore EPIPE in ui.err_write
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1985
diff
changeset
|
986 try: |
30998
fdecd24ca4dc
ui: log time spent blocked on stdio
Simon Farnsworth <simonfar@fb.com>
parents:
30996
diff
changeset
|
987 with self.timeblockedsection('stdio'): |
fdecd24ca4dc
ui: log time spent blocked on stdio
Simon Farnsworth <simonfar@fb.com>
parents:
30996
diff
changeset
|
988 if not getattr(self.fout, 'closed', False): |
fdecd24ca4dc
ui: log time spent blocked on stdio
Simon Farnsworth <simonfar@fb.com>
parents:
30996
diff
changeset
|
989 self.fout.flush() |
31110
15d6488554b9
ui: extract low level part of 'write_err' in its own method
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
31109
diff
changeset
|
990 for a in msgs: |
30998
fdecd24ca4dc
ui: log time spent blocked on stdio
Simon Farnsworth <simonfar@fb.com>
parents:
30996
diff
changeset
|
991 self.ferr.write(a) |
fdecd24ca4dc
ui: log time spent blocked on stdio
Simon Farnsworth <simonfar@fb.com>
parents:
30996
diff
changeset
|
992 # stderr may be buffered under win32 when redirected to files, |
fdecd24ca4dc
ui: log time spent blocked on stdio
Simon Farnsworth <simonfar@fb.com>
parents:
30996
diff
changeset
|
993 # including stdout. |
fdecd24ca4dc
ui: log time spent blocked on stdio
Simon Farnsworth <simonfar@fb.com>
parents:
30996
diff
changeset
|
994 if not getattr(self.ferr, 'closed', False): |
fdecd24ca4dc
ui: log time spent blocked on stdio
Simon Farnsworth <simonfar@fb.com>
parents:
30996
diff
changeset
|
995 self.ferr.flush() |
25660
328739ea70c3
global: mass rewrite to use modern exception syntax
Gregory Szorc <gregory.szorc@gmail.com>
parents:
25629
diff
changeset
|
996 except IOError as inst: |
33668
cde4cfeb6e3e
ui: restore behavior to ignore some I/O errors (issue5658)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33625
diff
changeset
|
997 if inst.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
|
998 raise error.StdioError(inst) |
565 | 999 |
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
|
1000 def flush(self): |
30998
fdecd24ca4dc
ui: log time spent blocked on stdio
Simon Farnsworth <simonfar@fb.com>
parents:
30996
diff
changeset
|
1001 # 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
|
1002 starttime = util.timer() |
fdecd24ca4dc
ui: log time spent blocked on stdio
Simon Farnsworth <simonfar@fb.com>
parents:
30996
diff
changeset
|
1003 try: |
31963
1bfb9a63b98e
stdio: raise StdioError if something goes wrong in ui.flush
Bryan O'Sullivan <bryano@fb.com>
parents:
31962
diff
changeset
|
1004 try: |
1bfb9a63b98e
stdio: raise StdioError if something goes wrong in ui.flush
Bryan O'Sullivan <bryano@fb.com>
parents:
31962
diff
changeset
|
1005 self.fout.flush() |
1bfb9a63b98e
stdio: raise StdioError if something goes wrong in ui.flush
Bryan O'Sullivan <bryano@fb.com>
parents:
31962
diff
changeset
|
1006 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
|
1007 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
|
1008 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
|
1009 finally: |
1bfb9a63b98e
stdio: raise StdioError if something goes wrong in ui.flush
Bryan O'Sullivan <bryano@fb.com>
parents:
31962
diff
changeset
|
1010 try: |
1bfb9a63b98e
stdio: raise StdioError if something goes wrong in ui.flush
Bryan O'Sullivan <bryano@fb.com>
parents:
31962
diff
changeset
|
1011 self.ferr.flush() |
1bfb9a63b98e
stdio: raise StdioError if something goes wrong in ui.flush
Bryan O'Sullivan <bryano@fb.com>
parents:
31962
diff
changeset
|
1012 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
|
1013 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
|
1014 raise error.StdioError(err) |
30998
fdecd24ca4dc
ui: log time spent blocked on stdio
Simon Farnsworth <simonfar@fb.com>
parents:
30996
diff
changeset
|
1015 finally: |
fdecd24ca4dc
ui: log time spent blocked on stdio
Simon Farnsworth <simonfar@fb.com>
parents:
30996
diff
changeset
|
1016 self._blockedtimes['stdio_blocked'] += \ |
fdecd24ca4dc
ui: log time spent blocked on stdio
Simon Farnsworth <simonfar@fb.com>
parents:
30996
diff
changeset
|
1017 (util.timer() - starttime) * 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
|
1018 |
16751
2d432a1fc0db
ui: add _isatty method to easily disable cooked I/O
Matt Mackall <mpm@selenic.com>
parents:
16703
diff
changeset
|
1019 def _isatty(self, fh): |
33499
0407a51b9d8c
codemod: register core configitems using a script
Jun Wu <quark@fb.com>
parents:
33471
diff
changeset
|
1020 if self.configbool('ui', 'nontty'): |
16751
2d432a1fc0db
ui: add _isatty method to easily disable cooked I/O
Matt Mackall <mpm@selenic.com>
parents:
16703
diff
changeset
|
1021 return False |
37123
a8a902d7176e
procutil: bulk-replace function calls to point to new module
Yuya Nishihara <yuya@tcha.org>
parents:
37122
diff
changeset
|
1022 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
|
1023 |
31046
9c827087df38
ui: rename neverpager to disablepager
Augie Fackler <augie@google.com>
parents:
31034
diff
changeset
|
1024 def disablepager(self): |
9c827087df38
ui: rename neverpager to disablepager
Augie Fackler <augie@google.com>
parents:
31034
diff
changeset
|
1025 self._disablepager = True |
31014
3ed6e43998df
ui: introduce neverpager() call
Augie Fackler <augie@google.com>
parents:
31012
diff
changeset
|
1026 |
31012
61b4122019d3
pager: move pager-initiating code into core
Augie Fackler <augie@google.com>
parents:
31000
diff
changeset
|
1027 def pager(self, command): |
61b4122019d3
pager: move pager-initiating code into core
Augie Fackler <augie@google.com>
parents:
31000
diff
changeset
|
1028 """Start a pager for subsequent command output. |
61b4122019d3
pager: move pager-initiating code into core
Augie Fackler <augie@google.com>
parents:
31000
diff
changeset
|
1029 |
61b4122019d3
pager: move pager-initiating code into core
Augie Fackler <augie@google.com>
parents:
31000
diff
changeset
|
1030 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
|
1031 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
|
1032 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
|
1033 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
|
1034 prompting the user or activating curses. |
61b4122019d3
pager: move pager-initiating code into core
Augie Fackler <augie@google.com>
parents:
31000
diff
changeset
|
1035 |
61b4122019d3
pager: move pager-initiating code into core
Augie Fackler <augie@google.com>
parents:
31000
diff
changeset
|
1036 Args: |
61b4122019d3
pager: move pager-initiating code into core
Augie Fackler <augie@google.com>
parents:
31000
diff
changeset
|
1037 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
|
1038 not "history, "summary" not "summ", etc. |
61b4122019d3
pager: move pager-initiating code into core
Augie Fackler <augie@google.com>
parents:
31000
diff
changeset
|
1039 """ |
31046
9c827087df38
ui: rename neverpager to disablepager
Augie Fackler <augie@google.com>
parents:
31034
diff
changeset
|
1040 if (self._disablepager |
33618
cc047a733f69
ui: enable pager always for explicit --pager=on (issue5580)
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
33585
diff
changeset
|
1041 or self.pageractive): |
cc047a733f69
ui: enable pager always for explicit --pager=on (issue5580)
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
33585
diff
changeset
|
1042 # 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
|
1043 return |
cc047a733f69
ui: enable pager always for explicit --pager=on (issue5580)
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
33585
diff
changeset
|
1044 |
cc047a733f69
ui: enable pager always for explicit --pager=on (issue5580)
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
33585
diff
changeset
|
1045 if not command.startswith('internal-always-') and ( |
cc047a733f69
ui: enable pager always for explicit --pager=on (issue5580)
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
33585
diff
changeset
|
1046 # 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
|
1047 # take precedence over disabling factors below |
cc047a733f69
ui: enable pager always for explicit --pager=on (issue5580)
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
33585
diff
changeset
|
1048 command in self.configlist('pager', 'ignore') |
33499
0407a51b9d8c
codemod: register core configitems using a script
Jun Wu <quark@fb.com>
parents:
33471
diff
changeset
|
1049 or not self.configbool('ui', 'paginate') |
31017
29a4a8d01bc9
ui: respect historic pager.attend-$COMMAND=no
Augie Fackler <augie@google.com>
parents:
31015
diff
changeset
|
1050 or not self.configbool('pager', 'attend-' + command, True) |
31012
61b4122019d3
pager: move pager-initiating code into core
Augie Fackler <augie@google.com>
parents:
31000
diff
changeset
|
1051 # 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
|
1052 # formatted() will need some adjustment. |
61b4122019d3
pager: move pager-initiating code into core
Augie Fackler <augie@google.com>
parents:
31000
diff
changeset
|
1053 or not self.formatted() |
61b4122019d3
pager: move pager-initiating code into core
Augie Fackler <augie@google.com>
parents:
31000
diff
changeset
|
1054 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
|
1055 or self._buffers |
31012
61b4122019d3
pager: move pager-initiating code into core
Augie Fackler <augie@google.com>
parents:
31000
diff
changeset
|
1056 # TODO: expose debugger-enabled on the UI object |
31350
66f1c244b43a
ui: check for --debugger in sys.argv using r-string to avoid bytes on py3
Augie Fackler <augie@google.com>
parents:
31263
diff
changeset
|
1057 or '--debugger' in pycompat.sysargv): |
31012
61b4122019d3
pager: move pager-initiating code into core
Augie Fackler <augie@google.com>
parents:
31000
diff
changeset
|
1058 # 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
|
1059 # 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
|
1060 # 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
|
1061 return |
61b4122019d3
pager: move pager-initiating code into core
Augie Fackler <augie@google.com>
parents:
31000
diff
changeset
|
1062 |
32078
bf5e13e38390
pager: use less as a fallback on Unix
Yuya Nishihara <yuya@tcha.org>
parents:
31963
diff
changeset
|
1063 pagercmd = self.config('pager', 'pager', rcutil.fallbackpager) |
31096
873ebdd6e84d
pager: do not try to run an empty pager command
Yuya Nishihara <yuya@tcha.org>
parents:
31082
diff
changeset
|
1064 if not pagercmd: |
873ebdd6e84d
pager: do not try to run an empty pager command
Yuya Nishihara <yuya@tcha.org>
parents:
31082
diff
changeset
|
1065 return |
873ebdd6e84d
pager: do not try to run an empty pager command
Yuya Nishihara <yuya@tcha.org>
parents:
31082
diff
changeset
|
1066 |
31954
e518192d6bac
pager: set some environment variables if they're not set
Jun Wu <quark@fb.com>
parents:
31781
diff
changeset
|
1067 pagerenv = {} |
e518192d6bac
pager: set some environment variables if they're not set
Jun Wu <quark@fb.com>
parents:
31781
diff
changeset
|
1068 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
|
1069 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
|
1070 pagerenv[name] = value |
e518192d6bac
pager: set some environment variables if they're not set
Jun Wu <quark@fb.com>
parents:
31781
diff
changeset
|
1071 |
31096
873ebdd6e84d
pager: do not try to run an empty pager command
Yuya Nishihara <yuya@tcha.org>
parents:
31082
diff
changeset
|
1072 self.debug('starting pager for command %r\n' % command) |
31497
8122cc5cb543
pager: flush outputs before firing pager process
Yuya Nishihara <yuya@tcha.org>
parents:
31488
diff
changeset
|
1073 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
|
1074 |
2d11d278279a
ui: defer setting pager related properties until the pager has spawned
Matt Harbison <matt_harbison@yahoo.com>
parents:
31693
diff
changeset
|
1075 wasformatted = self.formatted() |
31012
61b4122019d3
pager: move pager-initiating code into core
Augie Fackler <augie@google.com>
parents:
31000
diff
changeset
|
1076 if util.safehasattr(signal, "SIGPIPE"): |
61b4122019d3
pager: move pager-initiating code into core
Augie Fackler <augie@google.com>
parents:
31000
diff
changeset
|
1077 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
|
1078 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
|
1079 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
|
1080 # 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
|
1081 # 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
|
1082 # auto-detection of things being formatted. |
2d11d278279a
ui: defer setting pager related properties until the pager has spawned
Matt Harbison <matt_harbison@yahoo.com>
parents:
31693
diff
changeset
|
1083 self.setconfig('ui', 'formatted', wasformatted, 'pager') |
2d11d278279a
ui: defer setting pager related properties until the pager has spawned
Matt Harbison <matt_harbison@yahoo.com>
parents:
31693
diff
changeset
|
1084 self.setconfig('ui', 'interactive', False, '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
|
1085 |
c3ca0ad8ab9c
ui: rerun color.setup() once the pager has spawned to honor 'color.pagermode'
Matt Harbison <matt_harbison@yahoo.com>
parents:
31695
diff
changeset
|
1086 # 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
|
1087 # 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
|
1088 cm = self._colormode |
c3ca0ad8ab9c
ui: rerun color.setup() once the pager has spawned to honor 'color.pagermode'
Matt Harbison <matt_harbison@yahoo.com>
parents:
31695
diff
changeset
|
1089 if cm != self.config('color', 'pagermode', cm): |
c3ca0ad8ab9c
ui: rerun color.setup() once the pager has spawned to honor 'color.pagermode'
Matt Harbison <matt_harbison@yahoo.com>
parents:
31695
diff
changeset
|
1090 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
|
1091 else: |
2d11d278279a
ui: defer setting pager related properties until the pager has spawned
Matt Harbison <matt_harbison@yahoo.com>
parents:
31693
diff
changeset
|
1092 # 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
|
1093 # 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
|
1094 # 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
|
1095 self.disablepager() |
31012
61b4122019d3
pager: move pager-initiating code into core
Augie Fackler <augie@google.com>
parents:
31000
diff
changeset
|
1096 |
31954
e518192d6bac
pager: set some environment variables if they're not set
Jun Wu <quark@fb.com>
parents:
31781
diff
changeset
|
1097 def _runpager(self, command, env=None): |
31012
61b4122019d3
pager: move pager-initiating code into core
Augie Fackler <augie@google.com>
parents:
31000
diff
changeset
|
1098 """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
|
1099 |
61b4122019d3
pager: move pager-initiating code into core
Augie Fackler <augie@google.com>
parents:
31000
diff
changeset
|
1100 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
|
1101 override how a pager is invoked. |
61b4122019d3
pager: move pager-initiating code into core
Augie Fackler <augie@google.com>
parents:
31000
diff
changeset
|
1102 """ |
31486
96929bd6e58d
pager: skip running the pager if it's set to 'cat'
Augie Fackler <augie@google.com>
parents:
31485
diff
changeset
|
1103 if command == 'cat': |
96929bd6e58d
pager: skip running the pager if it's set to 'cat'
Augie Fackler <augie@google.com>
parents:
31485
diff
changeset
|
1104 # 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
|
1105 return False |
31485
9335dc6b2a9c
pager: avoid shell=True on subprocess.Popen for better errors (issue5491)
Augie Fackler <augie@google.com>
parents:
31481
diff
changeset
|
1106 # 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
|
1107 # 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
|
1108 # 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
|
1109 # gracefully and tell the user about their broken pager. |
9335dc6b2a9c
pager: avoid shell=True on subprocess.Popen for better errors (issue5491)
Augie Fackler <augie@google.com>
parents:
31481
diff
changeset
|
1110 shell = any(c in command for c in "|&;<>()$`\\\"' \t\n*?[#~=%") |
31629
c60091fa1426
pager: improve support for various flavors of `more` on Windows
Matt Harbison <matt_harbison@yahoo.com>
parents:
31597
diff
changeset
|
1111 |
34645 | 1112 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
|
1113 # 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
|
1114 # 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
|
1115 # 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
|
1116 # `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
|
1117 # 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
|
1118 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
|
1119 if not fullcmd: |
c60091fa1426
pager: improve support for various flavors of `more` on Windows
Matt Harbison <matt_harbison@yahoo.com>
parents:
31597
diff
changeset
|
1120 self.warn(_("missing pager command '%s', skipping pager\n") |
c60091fa1426
pager: improve support for various flavors of `more` on Windows
Matt Harbison <matt_harbison@yahoo.com>
parents:
31597
diff
changeset
|
1121 % command) |
31695
2d11d278279a
ui: defer setting pager related properties until the pager has spawned
Matt Harbison <matt_harbison@yahoo.com>
parents:
31693
diff
changeset
|
1122 return False |
31629
c60091fa1426
pager: improve support for various flavors of `more` on Windows
Matt Harbison <matt_harbison@yahoo.com>
parents:
31597
diff
changeset
|
1123 |
c60091fa1426
pager: improve support for various flavors of `more` on Windows
Matt Harbison <matt_harbison@yahoo.com>
parents:
31597
diff
changeset
|
1124 command = fullcmd |
c60091fa1426
pager: improve support for various flavors of `more` on Windows
Matt Harbison <matt_harbison@yahoo.com>
parents:
31597
diff
changeset
|
1125 |
31485
9335dc6b2a9c
pager: avoid shell=True on subprocess.Popen for better errors (issue5491)
Augie Fackler <augie@google.com>
parents:
31481
diff
changeset
|
1126 try: |
9335dc6b2a9c
pager: avoid shell=True on subprocess.Popen for better errors (issue5491)
Augie Fackler <augie@google.com>
parents:
31481
diff
changeset
|
1127 pager = subprocess.Popen( |
9335dc6b2a9c
pager: avoid shell=True on subprocess.Popen for better errors (issue5491)
Augie Fackler <augie@google.com>
parents:
31481
diff
changeset
|
1128 command, shell=shell, bufsize=-1, |
37123
a8a902d7176e
procutil: bulk-replace function calls to point to new module
Yuya Nishihara <yuya@tcha.org>
parents:
37122
diff
changeset
|
1129 close_fds=procutil.closefds, stdin=subprocess.PIPE, |
37122
d4a2e0d5d042
procutil: bulk-replace util.std* to point to new module
Yuya Nishihara <yuya@tcha.org>
parents:
37087
diff
changeset
|
1130 stdout=procutil.stdout, stderr=procutil.stderr, |
37123
a8a902d7176e
procutil: bulk-replace function calls to point to new module
Yuya Nishihara <yuya@tcha.org>
parents:
37122
diff
changeset
|
1131 env=procutil.shellenviron(env)) |
31485
9335dc6b2a9c
pager: avoid shell=True on subprocess.Popen for better errors (issue5491)
Augie Fackler <augie@google.com>
parents:
31481
diff
changeset
|
1132 except OSError as e: |
9335dc6b2a9c
pager: avoid shell=True on subprocess.Popen for better errors (issue5491)
Augie Fackler <augie@google.com>
parents:
31481
diff
changeset
|
1133 if e.errno == errno.ENOENT and not shell: |
9335dc6b2a9c
pager: avoid shell=True on subprocess.Popen for better errors (issue5491)
Augie Fackler <augie@google.com>
parents:
31481
diff
changeset
|
1134 self.warn(_("missing pager command '%s', skipping pager\n") |
9335dc6b2a9c
pager: avoid shell=True on subprocess.Popen for better errors (issue5491)
Augie Fackler <augie@google.com>
parents:
31481
diff
changeset
|
1135 % command) |
31695
2d11d278279a
ui: defer setting pager related properties until the pager has spawned
Matt Harbison <matt_harbison@yahoo.com>
parents:
31693
diff
changeset
|
1136 return False |
31485
9335dc6b2a9c
pager: avoid shell=True on subprocess.Popen for better errors (issue5491)
Augie Fackler <augie@google.com>
parents:
31481
diff
changeset
|
1137 raise |
31012
61b4122019d3
pager: move pager-initiating code into core
Augie Fackler <augie@google.com>
parents:
31000
diff
changeset
|
1138 |
61b4122019d3
pager: move pager-initiating code into core
Augie Fackler <augie@google.com>
parents:
31000
diff
changeset
|
1139 # back up original file descriptors |
37122
d4a2e0d5d042
procutil: bulk-replace util.std* to point to new module
Yuya Nishihara <yuya@tcha.org>
parents:
37087
diff
changeset
|
1140 stdoutfd = os.dup(procutil.stdout.fileno()) |
d4a2e0d5d042
procutil: bulk-replace util.std* to point to new module
Yuya Nishihara <yuya@tcha.org>
parents:
37087
diff
changeset
|
1141 stderrfd = os.dup(procutil.stderr.fileno()) |
31012
61b4122019d3
pager: move pager-initiating code into core
Augie Fackler <augie@google.com>
parents:
31000
diff
changeset
|
1142 |
37122
d4a2e0d5d042
procutil: bulk-replace util.std* to point to new module
Yuya Nishihara <yuya@tcha.org>
parents:
37087
diff
changeset
|
1143 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
|
1144 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
|
1145 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
|
1146 |
31958
de5c9d0e02ea
atexit: switch to home-grown implementation
Bryan O'Sullivan <bryano@fb.com>
parents:
31956
diff
changeset
|
1147 @self.atexit |
31012
61b4122019d3
pager: move pager-initiating code into core
Augie Fackler <augie@google.com>
parents:
31000
diff
changeset
|
1148 def killpager(): |
61b4122019d3
pager: move pager-initiating code into core
Augie Fackler <augie@google.com>
parents:
31000
diff
changeset
|
1149 if util.safehasattr(signal, "SIGINT"): |
61b4122019d3
pager: move pager-initiating code into core
Augie Fackler <augie@google.com>
parents:
31000
diff
changeset
|
1150 signal.signal(signal.SIGINT, signal.SIG_IGN) |
61b4122019d3
pager: move pager-initiating code into core
Augie Fackler <augie@google.com>
parents:
31000
diff
changeset
|
1151 # restore original fds, closing pager.stdin copies in the process |
37122
d4a2e0d5d042
procutil: bulk-replace util.std* to point to new module
Yuya Nishihara <yuya@tcha.org>
parents:
37087
diff
changeset
|
1152 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
|
1153 os.dup2(stderrfd, procutil.stderr.fileno()) |
31012
61b4122019d3
pager: move pager-initiating code into core
Augie Fackler <augie@google.com>
parents:
31000
diff
changeset
|
1154 pager.stdin.close() |
61b4122019d3
pager: move pager-initiating code into core
Augie Fackler <augie@google.com>
parents:
31000
diff
changeset
|
1155 pager.wait() |
61b4122019d3
pager: move pager-initiating code into core
Augie Fackler <augie@google.com>
parents:
31000
diff
changeset
|
1156 |
31695
2d11d278279a
ui: defer setting pager related properties until the pager has spawned
Matt Harbison <matt_harbison@yahoo.com>
parents:
31693
diff
changeset
|
1157 return True |
2d11d278279a
ui: defer setting pager related properties until the pager has spawned
Matt Harbison <matt_harbison@yahoo.com>
parents:
31693
diff
changeset
|
1158 |
34882
e9f320a40b44
ui: move request exit handlers to global state
Saurabh Singh <singhsrb@fb.com>
parents:
34858
diff
changeset
|
1159 @property |
e9f320a40b44
ui: move request exit handlers to global state
Saurabh Singh <singhsrb@fb.com>
parents:
34858
diff
changeset
|
1160 def _exithandlers(self): |
e9f320a40b44
ui: move request exit handlers to global state
Saurabh Singh <singhsrb@fb.com>
parents:
34858
diff
changeset
|
1161 return _reqexithandlers |
e9f320a40b44
ui: move request exit handlers to global state
Saurabh Singh <singhsrb@fb.com>
parents:
34858
diff
changeset
|
1162 |
31956
c13ff31818b0
ui: add special-purpose atexit functionality
Bryan O'Sullivan <bryano@fb.com>
parents:
31954
diff
changeset
|
1163 def atexit(self, func, *args, **kwargs): |
c13ff31818b0
ui: add special-purpose atexit functionality
Bryan O'Sullivan <bryano@fb.com>
parents:
31954
diff
changeset
|
1164 '''register a function to run after dispatching a request |
c13ff31818b0
ui: add special-purpose atexit functionality
Bryan O'Sullivan <bryano@fb.com>
parents:
31954
diff
changeset
|
1165 |
c13ff31818b0
ui: add special-purpose atexit functionality
Bryan O'Sullivan <bryano@fb.com>
parents:
31954
diff
changeset
|
1166 Handlers do not stay registered across request boundaries.''' |
c13ff31818b0
ui: add special-purpose atexit functionality
Bryan O'Sullivan <bryano@fb.com>
parents:
31954
diff
changeset
|
1167 self._exithandlers.append((func, args, kwargs)) |
c13ff31818b0
ui: add special-purpose atexit functionality
Bryan O'Sullivan <bryano@fb.com>
parents:
31954
diff
changeset
|
1168 return func |
c13ff31818b0
ui: add special-purpose atexit functionality
Bryan O'Sullivan <bryano@fb.com>
parents:
31954
diff
changeset
|
1169 |
28542
71e12fc53b80
ui: add new config flag for interface selection
Simon Farnsworth <simonfar@fb.com>
parents:
28498
diff
changeset
|
1170 def interface(self, feature): |
71e12fc53b80
ui: add new config flag for interface selection
Simon Farnsworth <simonfar@fb.com>
parents:
28498
diff
changeset
|
1171 """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
|
1172 |
71e12fc53b80
ui: add new config flag for interface selection
Simon Farnsworth <simonfar@fb.com>
parents:
28498
diff
changeset
|
1173 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
|
1174 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
|
1175 |
71e12fc53b80
ui: add new config flag for interface selection
Simon Farnsworth <simonfar@fb.com>
parents:
28498
diff
changeset
|
1176 ui.interface.histedit = text |
71e12fc53b80
ui: add new config flag for interface selection
Simon Farnsworth <simonfar@fb.com>
parents:
28498
diff
changeset
|
1177 ui.interface.chunkselector = curses |
71e12fc53b80
ui: add new config flag for interface selection
Simon Farnsworth <simonfar@fb.com>
parents:
28498
diff
changeset
|
1178 |
71e12fc53b80
ui: add new config flag for interface selection
Simon Farnsworth <simonfar@fb.com>
parents:
28498
diff
changeset
|
1179 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
|
1180 |
71e12fc53b80
ui: add new config flag for interface selection
Simon Farnsworth <simonfar@fb.com>
parents:
28498
diff
changeset
|
1181 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
|
1182 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
|
1183 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
|
1184 |
30342
318a24b52eeb
spelling: fixes of non-dictionary words
Mads Kiilerich <madski@unity3d.com>
parents:
30327
diff
changeset
|
1185 Consider the following example: |
28542
71e12fc53b80
ui: add new config flag for interface selection
Simon Farnsworth <simonfar@fb.com>
parents:
28498
diff
changeset
|
1186 ui.interface = curses |
71e12fc53b80
ui: add new config flag for interface selection
Simon Farnsworth <simonfar@fb.com>
parents:
28498
diff
changeset
|
1187 ui.interface.histedit = text |
71e12fc53b80
ui: add new config flag for interface selection
Simon Farnsworth <simonfar@fb.com>
parents:
28498
diff
changeset
|
1188 |
71e12fc53b80
ui: add new config flag for interface selection
Simon Farnsworth <simonfar@fb.com>
parents:
28498
diff
changeset
|
1189 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
|
1190 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
|
1191 """ |
71e12fc53b80
ui: add new config flag for interface selection
Simon Farnsworth <simonfar@fb.com>
parents:
28498
diff
changeset
|
1192 alldefaults = frozenset(["text", "curses"]) |
71e12fc53b80
ui: add new config flag for interface selection
Simon Farnsworth <simonfar@fb.com>
parents:
28498
diff
changeset
|
1193 |
71e12fc53b80
ui: add new config flag for interface selection
Simon Farnsworth <simonfar@fb.com>
parents:
28498
diff
changeset
|
1194 featureinterfaces = { |
71e12fc53b80
ui: add new config flag for interface selection
Simon Farnsworth <simonfar@fb.com>
parents:
28498
diff
changeset
|
1195 "chunkselector": [ |
71e12fc53b80
ui: add new config flag for interface selection
Simon Farnsworth <simonfar@fb.com>
parents:
28498
diff
changeset
|
1196 "text", |
71e12fc53b80
ui: add new config flag for interface selection
Simon Farnsworth <simonfar@fb.com>
parents:
28498
diff
changeset
|
1197 "curses", |
71e12fc53b80
ui: add new config flag for interface selection
Simon Farnsworth <simonfar@fb.com>
parents:
28498
diff
changeset
|
1198 ] |
71e12fc53b80
ui: add new config flag for interface selection
Simon Farnsworth <simonfar@fb.com>
parents:
28498
diff
changeset
|
1199 } |
71e12fc53b80
ui: add new config flag for interface selection
Simon Farnsworth <simonfar@fb.com>
parents:
28498
diff
changeset
|
1200 |
71e12fc53b80
ui: add new config flag for interface selection
Simon Farnsworth <simonfar@fb.com>
parents:
28498
diff
changeset
|
1201 # Feature-specific interface |
71e12fc53b80
ui: add new config flag for interface selection
Simon Farnsworth <simonfar@fb.com>
parents:
28498
diff
changeset
|
1202 if feature not in featureinterfaces.keys(): |
71e12fc53b80
ui: add new config flag for interface selection
Simon Farnsworth <simonfar@fb.com>
parents:
28498
diff
changeset
|
1203 # Programming error, not user error |
71e12fc53b80
ui: add new config flag for interface selection
Simon Farnsworth <simonfar@fb.com>
parents:
28498
diff
changeset
|
1204 raise ValueError("Unknown feature requested %s" % feature) |
71e12fc53b80
ui: add new config flag for interface selection
Simon Farnsworth <simonfar@fb.com>
parents:
28498
diff
changeset
|
1205 |
71e12fc53b80
ui: add new config flag for interface selection
Simon Farnsworth <simonfar@fb.com>
parents:
28498
diff
changeset
|
1206 availableinterfaces = frozenset(featureinterfaces[feature]) |
71e12fc53b80
ui: add new config flag for interface selection
Simon Farnsworth <simonfar@fb.com>
parents:
28498
diff
changeset
|
1207 if alldefaults > availableinterfaces: |
71e12fc53b80
ui: add new config flag for interface selection
Simon Farnsworth <simonfar@fb.com>
parents:
28498
diff
changeset
|
1208 # 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
|
1209 # 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
|
1210 raise ValueError( |
71e12fc53b80
ui: add new config flag for interface selection
Simon Farnsworth <simonfar@fb.com>
parents:
28498
diff
changeset
|
1211 "Feature %s does not handle all default interfaces" % |
71e12fc53b80
ui: add new config flag for interface selection
Simon Farnsworth <simonfar@fb.com>
parents:
28498
diff
changeset
|
1212 feature) |
71e12fc53b80
ui: add new config flag for interface selection
Simon Farnsworth <simonfar@fb.com>
parents:
28498
diff
changeset
|
1213 |
71e12fc53b80
ui: add new config flag for interface selection
Simon Farnsworth <simonfar@fb.com>
parents:
28498
diff
changeset
|
1214 if self.plain(): |
71e12fc53b80
ui: add new config flag for interface selection
Simon Farnsworth <simonfar@fb.com>
parents:
28498
diff
changeset
|
1215 return "text" |
71e12fc53b80
ui: add new config flag for interface selection
Simon Farnsworth <simonfar@fb.com>
parents:
28498
diff
changeset
|
1216 |
71e12fc53b80
ui: add new config flag for interface selection
Simon Farnsworth <simonfar@fb.com>
parents:
28498
diff
changeset
|
1217 # Default interface for all the features |
71e12fc53b80
ui: add new config flag for interface selection
Simon Farnsworth <simonfar@fb.com>
parents:
28498
diff
changeset
|
1218 defaultinterface = "text" |
33499
0407a51b9d8c
codemod: register core configitems using a script
Jun Wu <quark@fb.com>
parents:
33471
diff
changeset
|
1219 i = self.config("ui", "interface") |
28542
71e12fc53b80
ui: add new config flag for interface selection
Simon Farnsworth <simonfar@fb.com>
parents:
28498
diff
changeset
|
1220 if i in alldefaults: |
71e12fc53b80
ui: add new config flag for interface selection
Simon Farnsworth <simonfar@fb.com>
parents:
28498
diff
changeset
|
1221 defaultinterface = i |
71e12fc53b80
ui: add new config flag for interface selection
Simon Farnsworth <simonfar@fb.com>
parents:
28498
diff
changeset
|
1222 |
71e12fc53b80
ui: add new config flag for interface selection
Simon Farnsworth <simonfar@fb.com>
parents:
28498
diff
changeset
|
1223 choseninterface = defaultinterface |
34616
c0dabec35019
configitems: register the 'ui.interface.chunkselector' config
Boris Feld <boris.feld@octobus.net>
parents:
34568
diff
changeset
|
1224 f = self.config("ui", "interface.%s" % feature) |
28542
71e12fc53b80
ui: add new config flag for interface selection
Simon Farnsworth <simonfar@fb.com>
parents:
28498
diff
changeset
|
1225 if f in availableinterfaces: |
71e12fc53b80
ui: add new config flag for interface selection
Simon Farnsworth <simonfar@fb.com>
parents:
28498
diff
changeset
|
1226 choseninterface = f |
71e12fc53b80
ui: add new config flag for interface selection
Simon Farnsworth <simonfar@fb.com>
parents:
28498
diff
changeset
|
1227 |
71e12fc53b80
ui: add new config flag for interface selection
Simon Farnsworth <simonfar@fb.com>
parents:
28498
diff
changeset
|
1228 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
|
1229 if f is not None: |
71e12fc53b80
ui: add new config flag for interface selection
Simon Farnsworth <simonfar@fb.com>
parents:
28498
diff
changeset
|
1230 self.warn(_("invalid value for ui.interface: %s\n") % |
71e12fc53b80
ui: add new config flag for interface selection
Simon Farnsworth <simonfar@fb.com>
parents:
28498
diff
changeset
|
1231 (i,)) |
71e12fc53b80
ui: add new config flag for interface selection
Simon Farnsworth <simonfar@fb.com>
parents:
28498
diff
changeset
|
1232 else: |
71e12fc53b80
ui: add new config flag for interface selection
Simon Farnsworth <simonfar@fb.com>
parents:
28498
diff
changeset
|
1233 self.warn(_("invalid value for ui.interface: %s (using %s)\n") % |
71e12fc53b80
ui: add new config flag for interface selection
Simon Farnsworth <simonfar@fb.com>
parents:
28498
diff
changeset
|
1234 (i, choseninterface)) |
71e12fc53b80
ui: add new config flag for interface selection
Simon Farnsworth <simonfar@fb.com>
parents:
28498
diff
changeset
|
1235 if f is not None and choseninterface != f: |
71e12fc53b80
ui: add new config flag for interface selection
Simon Farnsworth <simonfar@fb.com>
parents:
28498
diff
changeset
|
1236 self.warn(_("invalid value for ui.interface.%s: %s (using %s)\n") % |
71e12fc53b80
ui: add new config flag for interface selection
Simon Farnsworth <simonfar@fb.com>
parents:
28498
diff
changeset
|
1237 (feature, f, choseninterface)) |
71e12fc53b80
ui: add new config flag for interface selection
Simon Farnsworth <simonfar@fb.com>
parents:
28498
diff
changeset
|
1238 |
71e12fc53b80
ui: add new config flag for interface selection
Simon Farnsworth <simonfar@fb.com>
parents:
28498
diff
changeset
|
1239 return choseninterface |
71e12fc53b80
ui: add new config flag for interface selection
Simon Farnsworth <simonfar@fb.com>
parents:
28498
diff
changeset
|
1240 |
8208
32a2a1e244f1
ui: make interactive a method
Matt Mackall <mpm@selenic.com>
parents:
8206
diff
changeset
|
1241 def interactive(self): |
11325
22a737306ba5
ui: document the formatted(), interactive() & plain() functions.
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents:
11324
diff
changeset
|
1242 '''is interactive input allowed? |
22a737306ba5
ui: document the formatted(), interactive() & plain() functions.
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents:
11324
diff
changeset
|
1243 |
22a737306ba5
ui: document the formatted(), interactive() & plain() functions.
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents:
11324
diff
changeset
|
1244 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
|
1245 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
|
1246 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
|
1247 specified. |
22a737306ba5
ui: document the formatted(), interactive() & plain() functions.
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents:
11324
diff
changeset
|
1248 |
22a737306ba5
ui: document the formatted(), interactive() & plain() functions.
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents:
11324
diff
changeset
|
1249 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
|
1250 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
|
1251 to a terminal device. |
22a737306ba5
ui: document the formatted(), interactive() & plain() functions.
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents:
11324
diff
changeset
|
1252 |
22a737306ba5
ui: document the formatted(), interactive() & plain() functions.
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents:
11324
diff
changeset
|
1253 This function refers to input only; for output, see `ui.formatted()'. |
22a737306ba5
ui: document the formatted(), interactive() & plain() functions.
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents:
11324
diff
changeset
|
1254 ''' |
33073
c41cbe98822c
configitems: register 'ui.interactive'
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
33072
diff
changeset
|
1255 i = self.configbool("ui", "interactive") |
8538
6419bc7b3d9c
ui: honor interactive=off even if isatty()
Patrick Mezard <pmezard@gmail.com>
parents:
8527
diff
changeset
|
1256 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
|
1257 # 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
|
1258 # usually those are non-interactive |
16751
2d432a1fc0db
ui: add _isatty method to easily disable cooked I/O
Matt Mackall <mpm@selenic.com>
parents:
16703
diff
changeset
|
1259 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
|
1260 |
8538
6419bc7b3d9c
ui: honor interactive=off even if isatty()
Patrick Mezard <pmezard@gmail.com>
parents:
8527
diff
changeset
|
1261 return i |
8208
32a2a1e244f1
ui: make interactive a method
Matt Mackall <mpm@selenic.com>
parents:
8206
diff
changeset
|
1262 |
12689
c52c629ce19e
termwidth: move to ui.ui from util
Augie Fackler <durin42@gmail.com>
parents:
12665
diff
changeset
|
1263 def termwidth(self): |
c52c629ce19e
termwidth: move to ui.ui from util
Augie Fackler <durin42@gmail.com>
parents:
12665
diff
changeset
|
1264 '''how wide is the terminal in columns? |
c52c629ce19e
termwidth: move to ui.ui from util
Augie Fackler <durin42@gmail.com>
parents:
12665
diff
changeset
|
1265 ''' |
30291
e9fca89c6d58
py3: use encoding.environ in ui.py
Pulkit Goyal <7895pulkit@gmail.com>
parents:
29982
diff
changeset
|
1266 if 'COLUMNS' in encoding.environ: |
12689
c52c629ce19e
termwidth: move to ui.ui from util
Augie Fackler <durin42@gmail.com>
parents:
12665
diff
changeset
|
1267 try: |
30291
e9fca89c6d58
py3: use encoding.environ in ui.py
Pulkit Goyal <7895pulkit@gmail.com>
parents:
29982
diff
changeset
|
1268 return int(encoding.environ['COLUMNS']) |
12689
c52c629ce19e
termwidth: move to ui.ui from util
Augie Fackler <durin42@gmail.com>
parents:
12665
diff
changeset
|
1269 except ValueError: |
c52c629ce19e
termwidth: move to ui.ui from util
Augie Fackler <durin42@gmail.com>
parents:
12665
diff
changeset
|
1270 pass |
30327
365812902904
scmutil: extend termwidth() to return terminal height, renamed to termsize()
Yuya Nishihara <yuya@tcha.org>
parents:
30323
diff
changeset
|
1271 return scmutil.termsize(self)[0] |
12689
c52c629ce19e
termwidth: move to ui.ui from util
Augie Fackler <durin42@gmail.com>
parents:
12665
diff
changeset
|
1272 |
11324
cdf6d861b207
ui: add ui.formatted configuration variable and accessor function.
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents:
11311
diff
changeset
|
1273 def formatted(self): |
11325
22a737306ba5
ui: document the formatted(), interactive() & plain() functions.
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents:
11324
diff
changeset
|
1274 '''should formatted output be used? |
22a737306ba5
ui: document the formatted(), interactive() & plain() functions.
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents:
11324
diff
changeset
|
1275 |
22a737306ba5
ui: document the formatted(), interactive() & plain() functions.
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents:
11324
diff
changeset
|
1276 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
|
1277 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
|
1278 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
|
1279 utilities, e.g. `grep'. |
22a737306ba5
ui: document the formatted(), interactive() & plain() functions.
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents:
11324
diff
changeset
|
1280 |
22a737306ba5
ui: document the formatted(), interactive() & plain() functions.
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents:
11324
diff
changeset
|
1281 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
|
1282 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
|
1283 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
|
1284 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
|
1285 Mercurial or its extensions. |
22a737306ba5
ui: document the formatted(), interactive() & plain() functions.
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents:
11324
diff
changeset
|
1286 |
22a737306ba5
ui: document the formatted(), interactive() & plain() functions.
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents:
11324
diff
changeset
|
1287 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
|
1288 This function always returns false when in plain mode, see `ui.plain()'. |
22a737306ba5
ui: document the formatted(), interactive() & plain() functions.
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents:
11324
diff
changeset
|
1289 ''' |
11324
cdf6d861b207
ui: add ui.formatted configuration variable and accessor function.
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents:
11311
diff
changeset
|
1290 if self.plain(): |
cdf6d861b207
ui: add ui.formatted configuration variable and accessor function.
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents:
11311
diff
changeset
|
1291 return False |
cdf6d861b207
ui: add ui.formatted configuration variable and accessor function.
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents:
11311
diff
changeset
|
1292 |
33499
0407a51b9d8c
codemod: register core configitems using a script
Jun Wu <quark@fb.com>
parents:
33471
diff
changeset
|
1293 i = self.configbool("ui", "formatted") |
11324
cdf6d861b207
ui: add ui.formatted configuration variable and accessor function.
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents:
11311
diff
changeset
|
1294 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
|
1295 # 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
|
1296 # usually those are non-interactive |
16751
2d432a1fc0db
ui: add _isatty method to easily disable cooked I/O
Matt Mackall <mpm@selenic.com>
parents:
16703
diff
changeset
|
1297 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
|
1298 |
cdf6d861b207
ui: add ui.formatted configuration variable and accessor function.
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents:
11311
diff
changeset
|
1299 return i |
cdf6d861b207
ui: add ui.formatted configuration variable and accessor function.
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents:
11311
diff
changeset
|
1300 |
35995
fd54846e1f8e
ui: write prompt text in ui.prompt(), not in ui._readline()
Yuya Nishihara <yuya@tcha.org>
parents:
35963
diff
changeset
|
1301 def _readline(self): |
36803
9b513888ea23
ui: do not use rawinput() when we have to replace sys.stdin/stdout
Yuya Nishihara <yuya@tcha.org>
parents:
36802
diff
changeset
|
1302 # 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
|
1303 # 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
|
1304 # 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
|
1305 # PyOS_Readline(), so no I/O will be made at Python layer. |
36802
fa53a1d1f16e
ui: do not try readline support if fin/fout aren't standard streams
Yuya Nishihara <yuya@tcha.org>
parents:
36799
diff
changeset
|
1306 usereadline = (self._isatty(self.fin) and self._isatty(self.fout) |
37123
a8a902d7176e
procutil: bulk-replace function calls to point to new module
Yuya Nishihara <yuya@tcha.org>
parents:
37122
diff
changeset
|
1307 and procutil.isstdin(self.fin) |
a8a902d7176e
procutil: bulk-replace function calls to point to new module
Yuya Nishihara <yuya@tcha.org>
parents:
37122
diff
changeset
|
1308 and procutil.isstdout(self.fout)) |
36802
fa53a1d1f16e
ui: do not try readline support if fin/fout aren't standard streams
Yuya Nishihara <yuya@tcha.org>
parents:
36799
diff
changeset
|
1309 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
|
1310 try: |
ca0d02222d6a
ui: get readline and prompt to behave better depending on interactivity
Bryan O'Sullivan <bos@serpentine.com>
parents:
4729
diff
changeset
|
1311 # 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
|
1312 # available |
ca0d02222d6a
ui: get readline and prompt to behave better depending on interactivity
Bryan O'Sullivan <bos@serpentine.com>
parents:
4729
diff
changeset
|
1313 import readline |
ca0d02222d6a
ui: get readline and prompt to behave better depending on interactivity
Bryan O'Sullivan <bos@serpentine.com>
parents:
4729
diff
changeset
|
1314 # 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
|
1315 readline.read_history_file |
7496
0a27d0db256d
issue1419: catch strange readline import error on windows
Brendan Cully <brendan@kublai.com>
parents:
7320
diff
changeset
|
1316 # 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
|
1317 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
|
1318 usereadline = False |
14614
afccc64eea73
ui: use I/O descriptors internally
Idan Kamara <idankk86@gmail.com>
parents:
14612
diff
changeset
|
1319 |
22291
3b39e1522d8f
ui: add brief comment why raw_input() needs dummy ' ' prompt string
Yuya Nishihara <yuya@tcha.org>
parents:
22205
diff
changeset
|
1320 # 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
|
1321 # - http://bugs.python.org/issue12833 |
30998
fdecd24ca4dc
ui: log time spent blocked on stdio
Simon Farnsworth <simonfar@fb.com>
parents:
30996
diff
changeset
|
1322 with self.timeblockedsection('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
|
1323 if usereadline: |
36799
30742c216abb
ui: inline util.bytesinput() into ui._readline()
Yuya Nishihara <yuya@tcha.org>
parents:
36792
diff
changeset
|
1324 line = encoding.strtolocal(pycompat.rawinput(r' ')) |
36804
aa0fc12743c7
ui: adjust Windows workaround to new _readline() code
Yuya Nishihara <yuya@tcha.org>
parents:
36803
diff
changeset
|
1325 # When stdin is in binary mode on Windows, it can cause |
aa0fc12743c7
ui: adjust Windows workaround to new _readline() code
Yuya Nishihara <yuya@tcha.org>
parents:
36803
diff
changeset
|
1326 # raw_input() to emit an extra trailing carriage return |
aa0fc12743c7
ui: adjust Windows workaround to new _readline() code
Yuya Nishihara <yuya@tcha.org>
parents:
36803
diff
changeset
|
1327 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
|
1328 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
|
1329 else: |
9b513888ea23
ui: do not use rawinput() when we have to replace sys.stdin/stdout
Yuya Nishihara <yuya@tcha.org>
parents:
36802
diff
changeset
|
1330 self.fout.write(b' ') |
9b513888ea23
ui: do not use rawinput() when we have to replace sys.stdin/stdout
Yuya Nishihara <yuya@tcha.org>
parents:
36802
diff
changeset
|
1331 self.fout.flush() |
9b513888ea23
ui: do not use rawinput() when we have to replace sys.stdin/stdout
Yuya Nishihara <yuya@tcha.org>
parents:
36802
diff
changeset
|
1332 line = self.fin.readline() |
9b513888ea23
ui: do not use rawinput() when we have to replace sys.stdin/stdout
Yuya Nishihara <yuya@tcha.org>
parents:
36802
diff
changeset
|
1333 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
|
1334 raise EOFError |
36842
1527f40de3b3
ui: remove any combinations of CR|LF from prompt response
Yuya Nishihara <yuya@tcha.org>
parents:
36804
diff
changeset
|
1335 line = line.rstrip(pycompat.oslinesep) |
14614
afccc64eea73
ui: use I/O descriptors internally
Idan Kamara <idankk86@gmail.com>
parents:
14612
diff
changeset
|
1336 |
5613
2e76e5a23c2b
workaround for raw_input() on Windows
Steve Borho <steve@borho.org>
parents:
5337
diff
changeset
|
1337 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
|
1338 |
9048
86b4a9b0ddda
ui: extract choice from prompt
Simon Heimberg <simohe@besonet.ch>
parents:
8940
diff
changeset
|
1339 def prompt(self, msg, default="y"): |
86b4a9b0ddda
ui: extract choice from prompt
Simon Heimberg <simohe@besonet.ch>
parents:
8940
diff
changeset
|
1340 """Prompt user with msg, read response. |
86b4a9b0ddda
ui: extract choice from prompt
Simon Heimberg <simohe@besonet.ch>
parents:
8940
diff
changeset
|
1341 If ui is not interactive, the default is returned. |
5751 | 1342 """ |
8208
32a2a1e244f1
ui: make interactive a method
Matt Mackall <mpm@selenic.com>
parents:
8206
diff
changeset
|
1343 if not self.interactive(): |
28039
89003c49315c
ui: fix crash by non-interactive prompt echo for user name
Yuya Nishihara <yuya@tcha.org>
parents:
27696
diff
changeset
|
1344 self.write(msg, ' ', default or '', "\n") |
7320
8dca507e56ce
ui: log non-interactive default response to stdout when verbose
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents:
6862
diff
changeset
|
1345 return default |
35996
b62c4154bb28
ui: add explicit path to write prompt text bypassing buffers
Yuya Nishihara <yuya@tcha.org>
parents:
35995
diff
changeset
|
1346 self._writenobuf(msg, label='ui.prompt') |
35995
fd54846e1f8e
ui: write prompt text in ui.prompt(), not in ui._readline()
Yuya Nishihara <yuya@tcha.org>
parents:
35963
diff
changeset
|
1347 self.flush() |
9048
86b4a9b0ddda
ui: extract choice from prompt
Simon Heimberg <simohe@besonet.ch>
parents:
8940
diff
changeset
|
1348 try: |
35995
fd54846e1f8e
ui: write prompt text in ui.prompt(), not in ui._readline()
Yuya Nishihara <yuya@tcha.org>
parents:
35963
diff
changeset
|
1349 r = self._readline() |
9048
86b4a9b0ddda
ui: extract choice from prompt
Simon Heimberg <simohe@besonet.ch>
parents:
8940
diff
changeset
|
1350 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
|
1351 r = default |
23053
5ba11ab48fcf
ui: separate option to show prompt echo, enabled only in tests (issue4417)
Yuya Nishihara <yuya@tcha.org>
parents:
22837
diff
changeset
|
1352 if self.configbool('ui', 'promptecho'): |
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
|
1353 self.write(r, "\n") |
9048
86b4a9b0ddda
ui: extract choice from prompt
Simon Heimberg <simohe@besonet.ch>
parents:
8940
diff
changeset
|
1354 return r |
86b4a9b0ddda
ui: extract choice from prompt
Simon Heimberg <simohe@besonet.ch>
parents:
8940
diff
changeset
|
1355 except EOFError: |
26896
5e46123e6c35
error: add structured exception for EOF at prompt
Siddharth Agarwal <sid0@fb.com>
parents:
26820
diff
changeset
|
1356 raise error.ResponseExpected() |
9048
86b4a9b0ddda
ui: extract choice from prompt
Simon Heimberg <simohe@besonet.ch>
parents:
8940
diff
changeset
|
1357 |
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
|
1358 @staticmethod |
e5803150ea1d
ui: add "extractchoices()" to share the logic to extract choices from prompt
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
19886
diff
changeset
|
1359 def 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
|
1360 """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
|
1361 |
e5803150ea1d
ui: add "extractchoices()" to share the logic to extract choices from prompt
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
19886
diff
changeset
|
1362 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
|
1363 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
|
1364 |
34146
0fa781320203
doctest: bulk-replace string literals with b'' for Python 3
Yuya Nishihara <yuya@tcha.org>
parents:
34071
diff
changeset
|
1365 >>> 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
|
1366 ('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
|
1367 >>> 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
|
1368 ('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
|
1369 >>> 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
|
1370 ('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
|
1371 """ |
27392
00aa37c65e0a
ui: try to handle $$ more robustly in prompts (issue4970)
Matt Mackall <mpm@selenic.com>
parents:
26820
diff
changeset
|
1372 |
00aa37c65e0a
ui: try to handle $$ more robustly in prompts (issue4970)
Matt Mackall <mpm@selenic.com>
parents:
26820
diff
changeset
|
1373 # 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
|
1374 # 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
|
1375 # 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
|
1376 # 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
|
1377 # except an ampersand followed by a character. |
33108
d9962854a4a2
py3: add b'' to make the regex pattern bytes
Pulkit Goyal <7895pulkit@gmail.com>
parents:
33073
diff
changeset
|
1378 m = re.match(br'(?s)(.+?)\$\$([^\$]*&[^ \$].*)', prompt) |
27392
00aa37c65e0a
ui: try to handle $$ more robustly in prompts (issue4970)
Matt Mackall <mpm@selenic.com>
parents:
26820
diff
changeset
|
1379 msg = m.group(1) |
00aa37c65e0a
ui: try to handle $$ more robustly in prompts (issue4970)
Matt Mackall <mpm@selenic.com>
parents:
26820
diff
changeset
|
1380 choices = [p.strip(' ') for p in m.group(2).split('$$')] |
33740
d880a6bcef2f
ui: refactor extractchoices so it doesn't break on Python 3
Augie Fackler <augie@google.com>
parents:
33713
diff
changeset
|
1381 def choicetuple(s): |
d880a6bcef2f
ui: refactor extractchoices so it doesn't break on Python 3
Augie Fackler <augie@google.com>
parents:
33713
diff
changeset
|
1382 ampidx = s.index('&') |
d880a6bcef2f
ui: refactor extractchoices so it doesn't break on Python 3
Augie Fackler <augie@google.com>
parents:
33713
diff
changeset
|
1383 return s[ampidx + 1:ampidx + 2].lower(), s.replace('&', '', 1) |
d880a6bcef2f
ui: refactor extractchoices so it doesn't break on Python 3
Augie Fackler <augie@google.com>
parents:
33713
diff
changeset
|
1384 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
|
1385 |
19226
c58b6ab4c26f
ui: merge prompt text components into a singe string
Matt Mackall <mpm@selenic.com>
parents:
19195
diff
changeset
|
1386 def promptchoice(self, prompt, default=0): |
c58b6ab4c26f
ui: merge prompt text components into a singe string
Matt Mackall <mpm@selenic.com>
parents:
19195
diff
changeset
|
1387 """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
|
1388 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
|
1389 |
c58b6ab4c26f
ui: merge prompt text components into a singe string
Matt Mackall <mpm@selenic.com>
parents:
19195
diff
changeset
|
1390 "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
|
1391 |
c58b6ab4c26f
ui: merge prompt text components into a singe string
Matt Mackall <mpm@selenic.com>
parents:
19195
diff
changeset
|
1392 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
|
1393 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
|
1394 returned. |
9048
86b4a9b0ddda
ui: extract choice from prompt
Simon Heimberg <simohe@besonet.ch>
parents:
8940
diff
changeset
|
1395 """ |
19226
c58b6ab4c26f
ui: merge prompt text components into a singe string
Matt Mackall <mpm@selenic.com>
parents:
19195
diff
changeset
|
1396 |
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
|
1397 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
|
1398 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
|
1399 while True: |
9048
86b4a9b0ddda
ui: extract choice from prompt
Simon Heimberg <simohe@besonet.ch>
parents:
8940
diff
changeset
|
1400 r = self.prompt(msg, resps[default]) |
86b4a9b0ddda
ui: extract choice from prompt
Simon Heimberg <simohe@besonet.ch>
parents:
8940
diff
changeset
|
1401 if r.lower() in resps: |
86b4a9b0ddda
ui: extract choice from prompt
Simon Heimberg <simohe@besonet.ch>
parents:
8940
diff
changeset
|
1402 return resps.index(r.lower()) |
86b4a9b0ddda
ui: extract choice from prompt
Simon Heimberg <simohe@besonet.ch>
parents:
8940
diff
changeset
|
1403 self.write(_("unrecognized response\n")) |
86b4a9b0ddda
ui: extract choice from prompt
Simon Heimberg <simohe@besonet.ch>
parents:
8940
diff
changeset
|
1404 |
2281
7761597b5da3
prompt user for http authentication info
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2206
diff
changeset
|
1405 def getpass(self, prompt=None, default=None): |
10282
08a0f04b56bd
many, many trivial check-code fixups
Matt Mackall <mpm@selenic.com>
parents:
10264
diff
changeset
|
1406 if not self.interactive(): |
08a0f04b56bd
many, many trivial check-code fixups
Matt Mackall <mpm@selenic.com>
parents:
10264
diff
changeset
|
1407 return default |
7798
57fee79e5588
catch CTRL-D at password prompt
Steve Borho <steve@borho.org>
parents:
7600
diff
changeset
|
1408 try: |
19880
ba2be32d14f2
ui: send password prompts to stderr again (issue4056)
Matt Mackall <mpm@selenic.com>
parents:
19226
diff
changeset
|
1409 self.write_err(self.label(prompt or _('password: '), 'ui.prompt')) |
21195
9336bc7dca8e
cmdserver: forcibly use L channel to read password input (issue3161)
Yuya Nishihara <yuya@tcha.org>
parents:
21132
diff
changeset
|
1410 # 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
|
1411 # to interact with tty even if fin is not a tty. |
30998
fdecd24ca4dc
ui: log time spent blocked on stdio
Simon Farnsworth <simonfar@fb.com>
parents:
30996
diff
changeset
|
1412 with self.timeblockedsection('stdio'): |
fdecd24ca4dc
ui: log time spent blocked on stdio
Simon Farnsworth <simonfar@fb.com>
parents:
30996
diff
changeset
|
1413 if self.configbool('ui', 'nontty'): |
fdecd24ca4dc
ui: log time spent blocked on stdio
Simon Farnsworth <simonfar@fb.com>
parents:
30996
diff
changeset
|
1414 l = self.fin.readline() |
fdecd24ca4dc
ui: log time spent blocked on stdio
Simon Farnsworth <simonfar@fb.com>
parents:
30996
diff
changeset
|
1415 if not l: |
fdecd24ca4dc
ui: log time spent blocked on stdio
Simon Farnsworth <simonfar@fb.com>
parents:
30996
diff
changeset
|
1416 raise EOFError |
fdecd24ca4dc
ui: log time spent blocked on stdio
Simon Farnsworth <simonfar@fb.com>
parents:
30996
diff
changeset
|
1417 return l.rstrip('\n') |
fdecd24ca4dc
ui: log time spent blocked on stdio
Simon Farnsworth <simonfar@fb.com>
parents:
30996
diff
changeset
|
1418 else: |
fdecd24ca4dc
ui: log time spent blocked on stdio
Simon Farnsworth <simonfar@fb.com>
parents:
30996
diff
changeset
|
1419 return getpass.getpass('') |
7798
57fee79e5588
catch CTRL-D at password prompt
Steve Borho <steve@borho.org>
parents:
7600
diff
changeset
|
1420 except EOFError: |
26896
5e46123e6c35
error: add structured exception for EOF at prompt
Siddharth Agarwal <sid0@fb.com>
parents:
26820
diff
changeset
|
1421 raise error.ResponseExpected() |
10815
32b213b9b22c
ui: add ui.write() output labeling API
Brodie Rao <brodie@bitheap.org>
parents:
10567
diff
changeset
|
1422 def status(self, *msg, **opts): |
32b213b9b22c
ui: add ui.write() output labeling API
Brodie Rao <brodie@bitheap.org>
parents:
10567
diff
changeset
|
1423 '''write status message to output (if ui.quiet is False) |
32b213b9b22c
ui: add ui.write() output labeling API
Brodie Rao <brodie@bitheap.org>
parents:
10567
diff
changeset
|
1424 |
32b213b9b22c
ui: add ui.write() output labeling API
Brodie Rao <brodie@bitheap.org>
parents:
10567
diff
changeset
|
1425 This adds an output label of "ui.status". |
32b213b9b22c
ui: add ui.write() output labeling API
Brodie Rao <brodie@bitheap.org>
parents:
10567
diff
changeset
|
1426 ''' |
10282
08a0f04b56bd
many, many trivial check-code fixups
Matt Mackall <mpm@selenic.com>
parents:
10264
diff
changeset
|
1427 if not self.quiet: |
31187
a7cabac20b62
ui: fix opts labeling on ui.warn et al for Python 3
Augie Fackler <raf@durin42.com>
parents:
31166
diff
changeset
|
1428 opts[r'label'] = opts.get(r'label', '') + ' ui.status' |
10815
32b213b9b22c
ui: add ui.write() output labeling API
Brodie Rao <brodie@bitheap.org>
parents:
10567
diff
changeset
|
1429 self.write(*msg, **opts) |
32b213b9b22c
ui: add ui.write() output labeling API
Brodie Rao <brodie@bitheap.org>
parents:
10567
diff
changeset
|
1430 def warn(self, *msg, **opts): |
32b213b9b22c
ui: add ui.write() output labeling API
Brodie Rao <brodie@bitheap.org>
parents:
10567
diff
changeset
|
1431 '''write warning message to output (stderr) |
32b213b9b22c
ui: add ui.write() output labeling API
Brodie Rao <brodie@bitheap.org>
parents:
10567
diff
changeset
|
1432 |
32b213b9b22c
ui: add ui.write() output labeling API
Brodie Rao <brodie@bitheap.org>
parents:
10567
diff
changeset
|
1433 This adds an output label of "ui.warning". |
32b213b9b22c
ui: add ui.write() output labeling API
Brodie Rao <brodie@bitheap.org>
parents:
10567
diff
changeset
|
1434 ''' |
31187
a7cabac20b62
ui: fix opts labeling on ui.warn et al for Python 3
Augie Fackler <raf@durin42.com>
parents:
31166
diff
changeset
|
1435 opts[r'label'] = opts.get(r'label', '') + ' ui.warning' |
10815
32b213b9b22c
ui: add ui.write() output labeling API
Brodie Rao <brodie@bitheap.org>
parents:
10567
diff
changeset
|
1436 self.write_err(*msg, **opts) |
32b213b9b22c
ui: add ui.write() output labeling API
Brodie Rao <brodie@bitheap.org>
parents:
10567
diff
changeset
|
1437 def note(self, *msg, **opts): |
32b213b9b22c
ui: add ui.write() output labeling API
Brodie Rao <brodie@bitheap.org>
parents:
10567
diff
changeset
|
1438 '''write note to output (if ui.verbose is True) |
32b213b9b22c
ui: add ui.write() output labeling API
Brodie Rao <brodie@bitheap.org>
parents:
10567
diff
changeset
|
1439 |
32b213b9b22c
ui: add ui.write() output labeling API
Brodie Rao <brodie@bitheap.org>
parents:
10567
diff
changeset
|
1440 This adds an output label of "ui.note". |
32b213b9b22c
ui: add ui.write() output labeling API
Brodie Rao <brodie@bitheap.org>
parents:
10567
diff
changeset
|
1441 ''' |
10282
08a0f04b56bd
many, many trivial check-code fixups
Matt Mackall <mpm@selenic.com>
parents:
10264
diff
changeset
|
1442 if self.verbose: |
31187
a7cabac20b62
ui: fix opts labeling on ui.warn et al for Python 3
Augie Fackler <raf@durin42.com>
parents:
31166
diff
changeset
|
1443 opts[r'label'] = opts.get(r'label', '') + ' ui.note' |
10815
32b213b9b22c
ui: add ui.write() output labeling API
Brodie Rao <brodie@bitheap.org>
parents:
10567
diff
changeset
|
1444 self.write(*msg, **opts) |
32b213b9b22c
ui: add ui.write() output labeling API
Brodie Rao <brodie@bitheap.org>
parents:
10567
diff
changeset
|
1445 def debug(self, *msg, **opts): |
32b213b9b22c
ui: add ui.write() output labeling API
Brodie Rao <brodie@bitheap.org>
parents:
10567
diff
changeset
|
1446 '''write debug message to output (if ui.debugflag is True) |
32b213b9b22c
ui: add ui.write() output labeling API
Brodie Rao <brodie@bitheap.org>
parents:
10567
diff
changeset
|
1447 |
32b213b9b22c
ui: add ui.write() output labeling API
Brodie Rao <brodie@bitheap.org>
parents:
10567
diff
changeset
|
1448 This adds an output label of "ui.debug". |
32b213b9b22c
ui: add ui.write() output labeling API
Brodie Rao <brodie@bitheap.org>
parents:
10567
diff
changeset
|
1449 ''' |
10282
08a0f04b56bd
many, many trivial check-code fixups
Matt Mackall <mpm@selenic.com>
parents:
10264
diff
changeset
|
1450 if self.debugflag: |
31187
a7cabac20b62
ui: fix opts labeling on ui.warn et al for Python 3
Augie Fackler <raf@durin42.com>
parents:
31166
diff
changeset
|
1451 opts[r'label'] = opts.get(r'label', '') + ' ui.debug' |
10815
32b213b9b22c
ui: add ui.write() output labeling API
Brodie Rao <brodie@bitheap.org>
parents:
10567
diff
changeset
|
1452 self.write(*msg, **opts) |
26750
9f9ec4abe700
cmdutil: make in-memory changes visible to external editor (issue4378)
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
26587
diff
changeset
|
1453 |
30835
bcad61a1f9a7
ui: add a parameter to set the temporary directory for edit
Sean Farley <sean@farley.io>
parents:
30832
diff
changeset
|
1454 def edit(self, text, user, extra=None, editform=None, pending=None, |
34046
6e6452bc441d
editor: use an unambiguous path suffix for editor files
Michael Bolin <mbolin@fb.com>
parents:
34039
diff
changeset
|
1455 repopath=None, action=None): |
6e6452bc441d
editor: use an unambiguous path suffix for editor files
Michael Bolin <mbolin@fb.com>
parents:
34039
diff
changeset
|
1456 if action is None: |
6e6452bc441d
editor: use an unambiguous path suffix for editor files
Michael Bolin <mbolin@fb.com>
parents:
34039
diff
changeset
|
1457 self.develwarn('action is None but will soon be a required ' |
6e6452bc441d
editor: use an unambiguous path suffix for editor files
Michael Bolin <mbolin@fb.com>
parents:
34039
diff
changeset
|
1458 'parameter to ui.edit()') |
28635
87f92d6f0bc3
edit: allow to configure the suffix of the temporary filename
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
28633
diff
changeset
|
1459 extra_defaults = { |
87f92d6f0bc3
edit: allow to configure the suffix of the temporary filename
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
28633
diff
changeset
|
1460 'prefix': 'editor', |
87f92d6f0bc3
edit: allow to configure the suffix of the temporary filename
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
28633
diff
changeset
|
1461 'suffix': '.txt', |
87f92d6f0bc3
edit: allow to configure the suffix of the temporary filename
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
28633
diff
changeset
|
1462 } |
27153
3553e40d0770
ui: allow open editor with custom filename
Mykola Nikishov <mn@mn.com.ua>
parents:
27110
diff
changeset
|
1463 if extra is not None: |
34046
6e6452bc441d
editor: use an unambiguous path suffix for editor files
Michael Bolin <mbolin@fb.com>
parents:
34039
diff
changeset
|
1464 if extra.get('suffix') is not None: |
6e6452bc441d
editor: use an unambiguous path suffix for editor files
Michael Bolin <mbolin@fb.com>
parents:
34039
diff
changeset
|
1465 self.develwarn('extra.suffix is not None but will soon be ' |
6e6452bc441d
editor: use an unambiguous path suffix for editor files
Michael Bolin <mbolin@fb.com>
parents:
34039
diff
changeset
|
1466 'ignored by ui.edit()') |
27153
3553e40d0770
ui: allow open editor with custom filename
Mykola Nikishov <mn@mn.com.ua>
parents:
27110
diff
changeset
|
1467 extra_defaults.update(extra) |
3553e40d0770
ui: allow open editor with custom filename
Mykola Nikishov <mn@mn.com.ua>
parents:
27110
diff
changeset
|
1468 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
|
1469 |
34071
3c82b14d2838
editor: file created for diff action should have .diff suffix
Michael Bolin <mbolin@fb.com>
parents:
34046
diff
changeset
|
1470 if action == 'diff': |
3c82b14d2838
editor: file created for diff action should have .diff suffix
Michael Bolin <mbolin@fb.com>
parents:
34046
diff
changeset
|
1471 suffix = '.diff' |
3c82b14d2838
editor: file created for diff action should have .diff suffix
Michael Bolin <mbolin@fb.com>
parents:
34046
diff
changeset
|
1472 elif action: |
34046
6e6452bc441d
editor: use an unambiguous path suffix for editor files
Michael Bolin <mbolin@fb.com>
parents:
34039
diff
changeset
|
1473 suffix = '.%s.hg.txt' % action |
6e6452bc441d
editor: use an unambiguous path suffix for editor files
Michael Bolin <mbolin@fb.com>
parents:
34039
diff
changeset
|
1474 else: |
6e6452bc441d
editor: use an unambiguous path suffix for editor files
Michael Bolin <mbolin@fb.com>
parents:
34039
diff
changeset
|
1475 suffix = extra['suffix'] |
6e6452bc441d
editor: use an unambiguous path suffix for editor files
Michael Bolin <mbolin@fb.com>
parents:
34039
diff
changeset
|
1476 |
30848
7080652af6e6
ui: rename tmpdir parameter to more specific repopath
Sean Farley <sean@farley.io>
parents:
30835
diff
changeset
|
1477 rdir = None |
30835
bcad61a1f9a7
ui: add a parameter to set the temporary directory for edit
Sean Farley <sean@farley.io>
parents:
30832
diff
changeset
|
1478 if self.configbool('experimental', 'editortmpinhg'): |
30848
7080652af6e6
ui: rename tmpdir parameter to more specific repopath
Sean Farley <sean@farley.io>
parents:
30835
diff
changeset
|
1479 rdir = repopath |
38197
aac4be30e250
py3: wrap tempfile.mkstemp() to use bytes path
Yuya Nishihara <yuya@tcha.org>
parents:
38134
diff
changeset
|
1480 (fd, name) = pycompat.mkstemp(prefix='hg-' + extra['prefix'] + '-', |
34046
6e6452bc441d
editor: use an unambiguous path suffix for editor files
Michael Bolin <mbolin@fb.com>
parents:
34039
diff
changeset
|
1481 suffix=suffix, |
30848
7080652af6e6
ui: rename tmpdir parameter to more specific repopath
Sean Farley <sean@farley.io>
parents:
30835
diff
changeset
|
1482 dir=rdir) |
1984
df7436f439a0
Improved ui.edit():
Thomas Arendsen Hein <thomas@intevation.de>
parents:
1983
diff
changeset
|
1483 try: |
31781
ac69675fff1c
ui: use bytes IO and convert EOL manually in ui.editor()
Yuya Nishihara <yuya@tcha.org>
parents:
31778
diff
changeset
|
1484 f = os.fdopen(fd, r'wb') |
ac69675fff1c
ui: use bytes IO and convert EOL manually in ui.editor()
Yuya Nishihara <yuya@tcha.org>
parents:
31778
diff
changeset
|
1485 f.write(util.tonativeeol(text)) |
1984
df7436f439a0
Improved ui.edit():
Thomas Arendsen Hein <thomas@intevation.de>
parents:
1983
diff
changeset
|
1486 f.close() |
df7436f439a0
Improved ui.edit():
Thomas Arendsen Hein <thomas@intevation.de>
parents:
1983
diff
changeset
|
1487 |
20605
a8aa699a812a
ui: edit(): rebase, graft: set HGREVISION environment variable for an editor
Alexander Drozdov <al.drozdov@gmail.com>
parents:
20603
diff
changeset
|
1488 environ = {'HGUSER': user} |
20606
be140ebd506b
ui: edit(): transplant: set HGREVISION environment variable for an editor
Alexander Drozdov <al.drozdov@gmail.com>
parents:
20605
diff
changeset
|
1489 if 'transplant_source' in extra: |
be140ebd506b
ui: edit(): transplant: set HGREVISION environment variable for an editor
Alexander Drozdov <al.drozdov@gmail.com>
parents:
20605
diff
changeset
|
1490 environ.update({'HGREVISION': hex(extra['transplant_source'])}) |
24687
28d76bc069db
editor: prefer 'intermediate-source' extra to use for HGREVISION environment variable
Alexander Drozdov <al.drozdov@gmail.com>
parents:
24663
diff
changeset
|
1491 for label in ('intermediate-source', 'source', '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
|
1492 if label in extra: |
a8aa699a812a
ui: edit(): rebase, graft: set HGREVISION environment variable for an editor
Alexander Drozdov <al.drozdov@gmail.com>
parents:
20603
diff
changeset
|
1493 environ.update({'HGREVISION': extra[label]}) |
a8aa699a812a
ui: edit(): rebase, graft: set HGREVISION environment variable for an editor
Alexander Drozdov <al.drozdov@gmail.com>
parents:
20603
diff
changeset
|
1494 break |
22205
9fa429723f26
ui: invoke editor for committing with HGEDITFORM environment variable
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
21955
diff
changeset
|
1495 if editform: |
9fa429723f26
ui: invoke editor for committing with HGEDITFORM environment variable
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
21955
diff
changeset
|
1496 environ.update({'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
|
1497 if pending: |
9f9ec4abe700
cmdutil: make in-memory changes visible to external editor (issue4378)
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
26587
diff
changeset
|
1498 environ.update({'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
|
1499 |
5660
3c80ecdc1bcd
Use VISUAL in addition to EDITOR when choosing the editor to use.
Osku Salerma <osku@iki.fi>
parents:
5613
diff
changeset
|
1500 editor = self.geteditor() |
207 | 1501 |
23269
d9d8d2e0f701
ui: introduce util.system() wrapper to make sure ui.fout is used
Yuya Nishihara <yuya@tcha.org>
parents:
23139
diff
changeset
|
1502 self.system("%s \"%s\"" % (editor, name), |
20605
a8aa699a812a
ui: edit(): rebase, graft: set HGREVISION environment variable for an editor
Alexander Drozdov <al.drozdov@gmail.com>
parents:
20603
diff
changeset
|
1503 environ=environ, |
31000
60b5db2ab586
ui: give editor() a tag of its own
Simon Farnsworth <simonfar@fb.com>
parents:
30999
diff
changeset
|
1504 onerr=error.Abort, errprefix=_("edit failed"), |
60b5db2ab586
ui: give editor() a tag of its own
Simon Farnsworth <simonfar@fb.com>
parents:
30999
diff
changeset
|
1505 blockedtag='editor') |
608
d2994b5298fb
Add username/merge/editor to .hgrc
Matt Mackall <mpm@selenic.com>
parents:
565
diff
changeset
|
1506 |
31781
ac69675fff1c
ui: use bytes IO and convert EOL manually in ui.editor()
Yuya Nishihara <yuya@tcha.org>
parents:
31778
diff
changeset
|
1507 f = open(name, r'rb') |
ac69675fff1c
ui: use bytes IO and convert EOL manually in ui.editor()
Yuya Nishihara <yuya@tcha.org>
parents:
31778
diff
changeset
|
1508 t = util.fromnativeeol(f.read()) |
1984
df7436f439a0
Improved ui.edit():
Thomas Arendsen Hein <thomas@intevation.de>
parents:
1983
diff
changeset
|
1509 f.close() |
df7436f439a0
Improved ui.edit():
Thomas Arendsen Hein <thomas@intevation.de>
parents:
1983
diff
changeset
|
1510 finally: |
df7436f439a0
Improved ui.edit():
Thomas Arendsen Hein <thomas@intevation.de>
parents:
1983
diff
changeset
|
1511 os.unlink(name) |
662
b55a78595ef6
Pass username to hgeditor, remove temporary file
Radoslaw "AstralStorm" Szkodzinski <astralstorm@gorzow.mm.pl>
parents:
613
diff
changeset
|
1512 |
207 | 1513 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
|
1514 |
30999
fd598149112b
ui: time calls to ui.system
Simon Farnsworth <simonfar@fb.com>
parents:
30998
diff
changeset
|
1515 def system(self, cmd, environ=None, cwd=None, onerr=None, errprefix=None, |
fd598149112b
ui: time calls to ui.system
Simon Farnsworth <simonfar@fb.com>
parents:
30998
diff
changeset
|
1516 blockedtag=None): |
23269
d9d8d2e0f701
ui: introduce util.system() wrapper to make sure ui.fout is used
Yuya Nishihara <yuya@tcha.org>
parents:
23139
diff
changeset
|
1517 '''execute shell command with appropriate output stream. command |
d9d8d2e0f701
ui: introduce util.system() wrapper to make sure ui.fout is used
Yuya Nishihara <yuya@tcha.org>
parents:
23139
diff
changeset
|
1518 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
|
1519 |
3f8f53190d6a
chg: deduplicate error handling of ui.system()
Yuya Nishihara <yuya@tcha.org>
parents:
31124
diff
changeset
|
1520 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
|
1521 object as exception. |
23269
d9d8d2e0f701
ui: introduce util.system() wrapper to make sure ui.fout is used
Yuya Nishihara <yuya@tcha.org>
parents:
23139
diff
changeset
|
1522 ''' |
30999
fd598149112b
ui: time calls to ui.system
Simon Farnsworth <simonfar@fb.com>
parents:
30998
diff
changeset
|
1523 if blockedtag is None: |
31541
d0f95ecca2ad
ui: restrict length of autogenerated blocked tags
Simon Farnsworth <simonfar@fb.com>
parents:
31538
diff
changeset
|
1524 # 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
|
1525 # the tail end instead |
d0f95ecca2ad
ui: restrict length of autogenerated blocked tags
Simon Farnsworth <simonfar@fb.com>
parents:
31538
diff
changeset
|
1526 cmdsuffix = cmd.translate(None, _keepalnum)[-85:] |
d0f95ecca2ad
ui: restrict length of autogenerated blocked tags
Simon Farnsworth <simonfar@fb.com>
parents:
31538
diff
changeset
|
1527 blockedtag = 'unknown_system_' + cmdsuffix |
24848
2f88821856eb
ui: allow capture of subprocess output
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
24687
diff
changeset
|
1528 out = self.fout |
25149
3f0744eeaeaf
cleanup: use __builtins__.any instead of util.any
Augie Fackler <augie@google.com>
parents:
25125
diff
changeset
|
1529 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
|
1530 out = self |
30999
fd598149112b
ui: time calls to ui.system
Simon Farnsworth <simonfar@fb.com>
parents:
30998
diff
changeset
|
1531 with self.timeblockedsection(blockedtag): |
31125
3f8f53190d6a
chg: deduplicate error handling of ui.system()
Yuya Nishihara <yuya@tcha.org>
parents:
31124
diff
changeset
|
1532 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
|
1533 if rc and onerr: |
3f8f53190d6a
chg: deduplicate error handling of ui.system()
Yuya Nishihara <yuya@tcha.org>
parents:
31124
diff
changeset
|
1534 errmsg = '%s %s' % (os.path.basename(cmd.split(None, 1)[0]), |
37463
bbd240f81ac5
procutil: make explainexit() simply return a message (API)
Yuya Nishihara <yuya@tcha.org>
parents:
37137
diff
changeset
|
1535 procutil.explainexit(rc)) |
31125
3f8f53190d6a
chg: deduplicate error handling of ui.system()
Yuya Nishihara <yuya@tcha.org>
parents:
31124
diff
changeset
|
1536 if errprefix: |
3f8f53190d6a
chg: deduplicate error handling of ui.system()
Yuya Nishihara <yuya@tcha.org>
parents:
31124
diff
changeset
|
1537 errmsg = '%s: %s' % (errprefix, errmsg) |
3f8f53190d6a
chg: deduplicate error handling of ui.system()
Yuya Nishihara <yuya@tcha.org>
parents:
31124
diff
changeset
|
1538 raise onerr(errmsg) |
3f8f53190d6a
chg: deduplicate error handling of ui.system()
Yuya Nishihara <yuya@tcha.org>
parents:
31124
diff
changeset
|
1539 return rc |
31124
fbce78c58f1e
chg: refactor ui.system() to be partly overridden
Yuya Nishihara <yuya@tcha.org>
parents:
31123
diff
changeset
|
1540 |
31125
3f8f53190d6a
chg: deduplicate error handling of ui.system()
Yuya Nishihara <yuya@tcha.org>
parents:
31124
diff
changeset
|
1541 def _runsystem(self, cmd, environ, cwd, out): |
31124
fbce78c58f1e
chg: refactor ui.system() to be partly overridden
Yuya Nishihara <yuya@tcha.org>
parents:
31123
diff
changeset
|
1542 """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
|
1543 extensions like chg)""" |
37123
a8a902d7176e
procutil: bulk-replace function calls to point to new module
Yuya Nishihara <yuya@tcha.org>
parents:
37122
diff
changeset
|
1544 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
|
1545 |
18966
5572f688e0a9
ui: add 'force' parameter to traceback() to override the current print setting
Matt Harbison <matt_harbison@yahoo.com>
parents:
18965
diff
changeset
|
1546 def traceback(self, exc=None, force=False): |
5572f688e0a9
ui: add 'force' parameter to traceback() to override the current print setting
Matt Harbison <matt_harbison@yahoo.com>
parents:
18965
diff
changeset
|
1547 '''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
|
1548 only to call in exception handler. returns true if traceback |
f0680b2d1d64
add ui.print_exc(), make all traceback printing central.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2293
diff
changeset
|
1549 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
|
1550 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
|
1551 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
|
1552 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
|
1553 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
|
1554 |
0062508b1900
ui: add support for fully printing chained exception stacks in ui.traceback()
Matt Harbison <matt_harbison@yahoo.com>
parents:
18669
diff
changeset
|
1555 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
|
1556 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
|
1557 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
|
1558 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
|
1559 |
0062508b1900
ui: add support for fully printing chained exception stacks in ui.traceback()
Matt Harbison <matt_harbison@yahoo.com>
parents:
18669
diff
changeset
|
1560 # exclude frame where 'exc' was chained and rethrown from exctb |
0062508b1900
ui: add support for fully printing chained exception stacks in ui.traceback()
Matt Harbison <matt_harbison@yahoo.com>
parents:
18669
diff
changeset
|
1561 self.write_err('Traceback (most recent call last):\n', |
0062508b1900
ui: add support for fully printing chained exception stacks in ui.traceback()
Matt Harbison <matt_harbison@yahoo.com>
parents:
18669
diff
changeset
|
1562 ''.join(exctb[:-1]), |
0062508b1900
ui: add support for fully printing chained exception stacks in ui.traceback()
Matt Harbison <matt_harbison@yahoo.com>
parents:
18669
diff
changeset
|
1563 ''.join(causetb), |
0062508b1900
ui: add support for fully printing chained exception stacks in ui.traceback()
Matt Harbison <matt_harbison@yahoo.com>
parents:
18669
diff
changeset
|
1564 ''.join(exconly)) |
0062508b1900
ui: add support for fully printing chained exception stacks in ui.traceback()
Matt Harbison <matt_harbison@yahoo.com>
parents:
18669
diff
changeset
|
1565 else: |
25568
c1ff82daed62
ui: flush stderr after printing a non-chained exception for Windows
Matt Harbison <matt_harbison@yahoo.com>
parents:
25519
diff
changeset
|
1566 output = traceback.format_exception(exc[0], exc[1], exc[2]) |
35937
4b1c04082cdc
py3: replace "if ispy3" by encoding.strtolocal()
Yuya Nishihara <yuya@tcha.org>
parents:
35929
diff
changeset
|
1567 self.write_err(encoding.strtolocal(r''.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
|
1568 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
|
1569 |
3c80ecdc1bcd
Use VISUAL in addition to EDITOR when choosing the editor to use.
Osku Salerma <osku@iki.fi>
parents:
5613
diff
changeset
|
1570 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
|
1571 '''return editor to use''' |
30646
16b5df5792a8
py3: replace sys.platform with pycompat.sysplatform (part 1 of 2)
Pulkit Goyal <7895pulkit@gmail.com>
parents:
30642
diff
changeset
|
1572 if pycompat.sysplatform == 'plan9': |
16383
f5dd179bfa4a
plan9: initial support for plan 9 from bell labs
Steven Stallion <sstallion@gmail.com>
parents:
16373
diff
changeset
|
1573 # 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
|
1574 # 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
|
1575 # avoid confusion. |
f5dd179bfa4a
plan9: initial support for plan 9 from bell labs
Steven Stallion <sstallion@gmail.com>
parents:
16373
diff
changeset
|
1576 editor = 'E' |
f5dd179bfa4a
plan9: initial support for plan 9 from bell labs
Steven Stallion <sstallion@gmail.com>
parents:
16373
diff
changeset
|
1577 else: |
f5dd179bfa4a
plan9: initial support for plan 9 from bell labs
Steven Stallion <sstallion@gmail.com>
parents:
16373
diff
changeset
|
1578 editor = 'vi' |
30291
e9fca89c6d58
py3: use encoding.environ in ui.py
Pulkit Goyal <7895pulkit@gmail.com>
parents:
29982
diff
changeset
|
1579 return (encoding.environ.get("HGEDITOR") or |
31692 | 1580 self.config("ui", "editor", editor)) |
9153 | 1581 |
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
|
1582 @util.propertycache |
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
|
1583 def _progbar(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
|
1584 """setup the progbar singleton to the ui object""" |
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
|
1585 if (self.quiet or self.debugflag |
33499
0407a51b9d8c
codemod: register core configitems using a script
Jun Wu <quark@fb.com>
parents:
33471
diff
changeset
|
1586 or self.configbool('progress', 'disable') |
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
|
1587 or not progress.shouldprint(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
|
1588 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
|
1589 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
|
1590 |
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
|
1591 def _progclear(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
|
1592 """clear progress bar output if any. use it before any output""" |
33683
0e4bed5c5c38
ui: check for progress singleton when clearing progress bar (issue5684)
Mark Thomas <mbthomas@fb.com>
parents:
33668
diff
changeset
|
1593 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
|
1594 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
|
1595 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
|
1596 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
|
1597 |
9153 | 1598 def progress(self, topic, pos, item="", unit="", total=None): |
1599 '''show a progress message | |
1600 | |
28598
c30d5ca4945b
progress: update comment to reflect implementation
timeless <timeless@mozdev.org>
parents:
28542
diff
changeset
|
1601 By default a textual progress bar will be displayed if an operation |
c30d5ca4945b
progress: update comment to reflect implementation
timeless <timeless@mozdev.org>
parents:
28542
diff
changeset
|
1602 takes too long. 'topic' is the current operation, 'item' is a |
17424
e7cfe3587ea4
fix trivial spelling errors
Mads Kiilerich <mads@kiilerich.com>
parents:
17059
diff
changeset
|
1603 non-numeric marker of the current position (i.e. the currently |
e7cfe3587ea4
fix trivial spelling errors
Mads Kiilerich <mads@kiilerich.com>
parents:
17059
diff
changeset
|
1604 in-process file), 'pos' is the current numeric position (i.e. |
9398
3fb8c6dbeeec
ui: fix NameError in ui.progress due to unit/units typo
Brodie Rao <me+hg@dackz.net>
parents:
9312
diff
changeset
|
1605 revision, bytes, etc.), unit is a corresponding unit label, |
9153 | 1606 and total is the highest expected pos. |
1607 | |
10425
f8a9de664a1c
ui.progress: clarify termination requirement
Augie Fackler <durin42@gmail.com>
parents:
10383
diff
changeset
|
1608 Multiple nested topics may be active at a time. |
f8a9de664a1c
ui.progress: clarify termination requirement
Augie Fackler <durin42@gmail.com>
parents:
10383
diff
changeset
|
1609 |
f8a9de664a1c
ui.progress: clarify termination requirement
Augie Fackler <durin42@gmail.com>
parents:
10383
diff
changeset
|
1610 All topics should be marked closed by setting pos to None at |
f8a9de664a1c
ui.progress: clarify termination requirement
Augie Fackler <durin42@gmail.com>
parents:
10383
diff
changeset
|
1611 termination. |
9153 | 1612 ''' |
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
|
1613 if self._progbar is not 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
|
1614 self._progbar.progress(topic, pos, item=item, unit=unit, |
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
|
1615 total=total) |
25125
bd625cd4e5e7
progress: get the extremely verbose output out of default debug
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
24883
diff
changeset
|
1616 if pos is None or not self.configbool('progress', 'debug'): |
9153 | 1617 return |
1618 | |
9398
3fb8c6dbeeec
ui: fix NameError in ui.progress due to unit/units typo
Brodie Rao <me+hg@dackz.net>
parents:
9312
diff
changeset
|
1619 if unit: |
3fb8c6dbeeec
ui: fix NameError in ui.progress due to unit/units typo
Brodie Rao <me+hg@dackz.net>
parents:
9312
diff
changeset
|
1620 unit = ' ' + unit |
9153 | 1621 if item: |
1622 item = ' ' + item | |
1623 | |
1624 if total: | |
1625 pct = 100.0 * pos / total | |
34278
a254c669b475
ui: fix progress debug log format strings to work on Python 3
Augie Fackler <augie@google.com>
parents:
34215
diff
changeset
|
1626 self.debug('%s:%s %d/%d%s (%4.2f%%)\n' |
9398
3fb8c6dbeeec
ui: fix NameError in ui.progress due to unit/units typo
Brodie Rao <me+hg@dackz.net>
parents:
9312
diff
changeset
|
1627 % (topic, item, pos, total, unit, pct)) |
9153 | 1628 else: |
34278
a254c669b475
ui: fix progress debug log format strings to work on Python 3
Augie Fackler <augie@google.com>
parents:
34215
diff
changeset
|
1629 self.debug('%s:%s %d%s\n' % (topic, item, pos, unit)) |
10815
32b213b9b22c
ui: add ui.write() output labeling API
Brodie Rao <brodie@bitheap.org>
parents:
10567
diff
changeset
|
1630 |
38351
bec1212eceaa
progress: create helper class for incrementing progress
Martin von Zweigbergk <martinvonz@google.com>
parents:
38197
diff
changeset
|
1631 def makeprogress(self, topic, unit="", total=None): |
bec1212eceaa
progress: create helper class for incrementing progress
Martin von Zweigbergk <martinvonz@google.com>
parents:
38197
diff
changeset
|
1632 '''exists only so low-level modules won't need to import scmutil''' |
bec1212eceaa
progress: create helper class for incrementing progress
Martin von Zweigbergk <martinvonz@google.com>
parents:
38197
diff
changeset
|
1633 return scmutil.progress(self, topic, unit, total) |
bec1212eceaa
progress: create helper class for incrementing progress
Martin von Zweigbergk <martinvonz@google.com>
parents:
38197
diff
changeset
|
1634 |
18669
18242716a014
blackbox: adds a blackbox extension
Durham Goode <durham@fb.com>
parents:
18054
diff
changeset
|
1635 def log(self, service, *msg, **opts): |
11984 | 1636 '''hook for logging facility extensions |
1637 | |
1638 service should be a readily-identifiable subsystem, which will | |
1639 allow filtering. | |
26235
6c962145f523
ui: improve docs on ui.log
Augie Fackler <augie@google.com>
parents:
26189
diff
changeset
|
1640 |
6c962145f523
ui: improve docs on ui.log
Augie Fackler <augie@google.com>
parents:
26189
diff
changeset
|
1641 *msg should be a newline-terminated format string to log, and |
6c962145f523
ui: improve docs on ui.log
Augie Fackler <augie@google.com>
parents:
26189
diff
changeset
|
1642 then any values to %-format into that format string. |
6c962145f523
ui: improve docs on ui.log
Augie Fackler <augie@google.com>
parents:
26189
diff
changeset
|
1643 |
6c962145f523
ui: improve docs on ui.log
Augie Fackler <augie@google.com>
parents:
26189
diff
changeset
|
1644 **opts currently has no defined meanings. |
11984 | 1645 ''' |
1646 | |
10815
32b213b9b22c
ui: add ui.write() output labeling API
Brodie Rao <brodie@bitheap.org>
parents:
10567
diff
changeset
|
1647 def label(self, msg, label): |
32b213b9b22c
ui: add ui.write() output labeling API
Brodie Rao <brodie@bitheap.org>
parents:
10567
diff
changeset
|
1648 '''style msg based on supplied label |
32b213b9b22c
ui: add ui.write() output labeling API
Brodie Rao <brodie@bitheap.org>
parents:
10567
diff
changeset
|
1649 |
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
|
1650 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
|
1651 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
|
1652 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
|
1653 |
32b213b9b22c
ui: add ui.write() output labeling API
Brodie Rao <brodie@bitheap.org>
parents:
10567
diff
changeset
|
1654 ui.write(s, 'label') is equivalent to |
32b213b9b22c
ui: add ui.write() output labeling API
Brodie Rao <brodie@bitheap.org>
parents:
10567
diff
changeset
|
1655 ui.write(ui.label(s, 'label')). |
32b213b9b22c
ui: add ui.write() output labeling API
Brodie Rao <brodie@bitheap.org>
parents:
10567
diff
changeset
|
1656 ''' |
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
|
1657 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
|
1658 return color.colorlabel(self, msg, label) |
10815
32b213b9b22c
ui: add ui.write() output labeling API
Brodie Rao <brodie@bitheap.org>
parents:
10567
diff
changeset
|
1659 return msg |
24250
9c32eea2ca04
ui: represent paths as classes
Gregory Szorc <gregory.szorc@gmail.com>
parents:
23269
diff
changeset
|
1660 |
29095
3f33831a9202
develwarn: move config gating inside the develwarn function
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
29082
diff
changeset
|
1661 def develwarn(self, msg, stacklevel=1, config=None): |
27274
82910fdc216f
ui: add a 'stacklevel' argument to 'develwarn'
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
27266
diff
changeset
|
1662 """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
|
1663 |
82910fdc216f
ui: add a 'stacklevel' argument to 'develwarn'
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
27266
diff
changeset
|
1664 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
|
1665 stack. |
82910fdc216f
ui: add a 'stacklevel' argument to 'develwarn'
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
27266
diff
changeset
|
1666 """ |
29095
3f33831a9202
develwarn: move config gating inside the develwarn function
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
29082
diff
changeset
|
1667 if not self.configbool('devel', 'all-warnings'): |
35148
fa2395db68c6
develwarn: do not emit warning if "config" is unspecified
Kyle Lippincott <spectral@google.com>
parents:
35090
diff
changeset
|
1668 if config is None or not self.configbool('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
|
1669 return |
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
|
1670 msg = 'devel-warn: ' + msg |
27274
82910fdc216f
ui: add a 'stacklevel' argument to 'develwarn'
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
27266
diff
changeset
|
1671 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
|
1672 if self.tracebackflag: |
27274
82910fdc216f
ui: add a 'stacklevel' argument to 'develwarn'
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
27266
diff
changeset
|
1673 util.debugstacktrace(msg, stacklevel, self.ferr, self.fout) |
28498 | 1674 self.log('develwarn', '%s at:\n%s' % |
1675 (msg, ''.join(util.getstackframes(stacklevel)))) | |
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
|
1676 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
|
1677 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
|
1678 calframe = inspect.getouterframes(curframe, 2) |
36165
df1760b58fda
ui: convert stack traces to sysbytes before logging
Augie Fackler <augie@google.com>
parents:
36164
diff
changeset
|
1679 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
|
1680 fname, fmsg = pycompat.sysbytes(fname), pycompat.sysbytes(fmsg) |
df1760b58fda
ui: convert stack traces to sysbytes before logging
Augie Fackler <augie@google.com>
parents:
36164
diff
changeset
|
1681 self.write_err('%s at: %s:%d (%s)\n' |
df1760b58fda
ui: convert stack traces to sysbytes before logging
Augie Fackler <augie@google.com>
parents:
36164
diff
changeset
|
1682 % (msg, fname, lineno, fmsg)) |
df1760b58fda
ui: convert stack traces to sysbytes before logging
Augie Fackler <augie@google.com>
parents:
36164
diff
changeset
|
1683 self.log('develwarn', '%s at: %s:%d (%s)\n', |
df1760b58fda
ui: convert stack traces to sysbytes before logging
Augie Fackler <augie@google.com>
parents:
36164
diff
changeset
|
1684 msg, fname, lineno, fmsg) |
29774
96bd27eb23f0
ui: drop values returned by inspect.*frame*() to avoid cycles
Jun Wu <quark@fb.com>
parents:
29413
diff
changeset
|
1685 curframe = calframe = None # avoid cycles |
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
|
1686 |
35963
efbd04238029
cmdutil: convert _revertprefetch() to a generic stored file hook (API)
Matt Harbison <matt_harbison@yahoo.com>
parents:
35951
diff
changeset
|
1687 def deprecwarn(self, msg, version, stacklevel=2): |
27275
f2cd240f2f7c
ui: add a 'deprecwarn' helper to issue deprecation warnings
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
27274
diff
changeset
|
1688 """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
|
1689 |
f2cd240f2f7c
ui: add a 'deprecwarn' helper to issue deprecation warnings
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
27274
diff
changeset
|
1690 - 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
|
1691 - 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
|
1692 """ |
29082
77de985d7c91
deprecation: gate deprecation warning behind devel configuration
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
28962
diff
changeset
|
1693 if not (self.configbool('devel', 'all-warnings') |
77de985d7c91
deprecation: gate deprecation warning behind devel configuration
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
28962
diff
changeset
|
1694 or self.configbool('devel', 'deprec-warn')): |
77de985d7c91
deprecation: gate deprecation warning behind devel configuration
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
28962
diff
changeset
|
1695 return |
27275
f2cd240f2f7c
ui: add a 'deprecwarn' helper to issue deprecation warnings
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
27274
diff
changeset
|
1696 msg += ("\n(compatibility will be dropped after Mercurial-%s," |
f2cd240f2f7c
ui: add a 'deprecwarn' helper to issue deprecation warnings
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
27274
diff
changeset
|
1697 " update your code.)") % version |
35963
efbd04238029
cmdutil: convert _revertprefetch() to a generic stored file hook (API)
Matt Harbison <matt_harbison@yahoo.com>
parents:
35951
diff
changeset
|
1698 self.develwarn(msg, stacklevel=stacklevel, config='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
|
1699 |
30832
da5fa0f13a41
ui: introduce an experimental dict of exportable environment variables
Matt Harbison <matt_harbison@yahoo.com>
parents:
30814
diff
changeset
|
1700 def exportableenviron(self): |
da5fa0f13a41
ui: introduce an experimental dict of exportable environment variables
Matt Harbison <matt_harbison@yahoo.com>
parents:
30814
diff
changeset
|
1701 """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
|
1702 hgweb. |
da5fa0f13a41
ui: introduce an experimental dict of exportable environment variables
Matt Harbison <matt_harbison@yahoo.com>
parents:
30814
diff
changeset
|
1703 """ |
da5fa0f13a41
ui: introduce an experimental dict of exportable environment variables
Matt Harbison <matt_harbison@yahoo.com>
parents:
30814
diff
changeset
|
1704 return self._exportableenviron |
da5fa0f13a41
ui: introduce an experimental dict of exportable environment variables
Matt Harbison <matt_harbison@yahoo.com>
parents:
30814
diff
changeset
|
1705 |
30489
b0a8337ba9af
ui: add configoverride context manager
Kostia Balytskyi <ikostia@fb.com>
parents:
30482
diff
changeset
|
1706 @contextlib.contextmanager |
b0a8337ba9af
ui: add configoverride context manager
Kostia Balytskyi <ikostia@fb.com>
parents:
30482
diff
changeset
|
1707 def configoverride(self, overrides, source=""): |
b0a8337ba9af
ui: add configoverride context manager
Kostia Balytskyi <ikostia@fb.com>
parents:
30482
diff
changeset
|
1708 """Context manager for temporary config overrides |
b0a8337ba9af
ui: add configoverride context manager
Kostia Balytskyi <ikostia@fb.com>
parents:
30482
diff
changeset
|
1709 `overrides` must be a dict of the following structure: |
b0a8337ba9af
ui: add configoverride context manager
Kostia Balytskyi <ikostia@fb.com>
parents:
30482
diff
changeset
|
1710 {(section, name) : value}""" |
b0a8337ba9af
ui: add configoverride context manager
Kostia Balytskyi <ikostia@fb.com>
parents:
30482
diff
changeset
|
1711 backups = {} |
30546
4b0e6677eed1
ui: use try..finally in configoverride
Gregory Szorc <gregory.szorc@gmail.com>
parents:
30528
diff
changeset
|
1712 try: |
4b0e6677eed1
ui: use try..finally in configoverride
Gregory Szorc <gregory.szorc@gmail.com>
parents:
30528
diff
changeset
|
1713 for (section, name), value in overrides.items(): |
4b0e6677eed1
ui: use try..finally in configoverride
Gregory Szorc <gregory.szorc@gmail.com>
parents:
30528
diff
changeset
|
1714 backups[(section, name)] = self.backupconfig(section, name) |
4b0e6677eed1
ui: use try..finally in configoverride
Gregory Szorc <gregory.szorc@gmail.com>
parents:
30528
diff
changeset
|
1715 self.setconfig(section, name, value, source) |
4b0e6677eed1
ui: use try..finally in configoverride
Gregory Szorc <gregory.szorc@gmail.com>
parents:
30528
diff
changeset
|
1716 yield |
4b0e6677eed1
ui: use try..finally in configoverride
Gregory Szorc <gregory.szorc@gmail.com>
parents:
30528
diff
changeset
|
1717 finally: |
4b0e6677eed1
ui: use try..finally in configoverride
Gregory Szorc <gregory.szorc@gmail.com>
parents:
30528
diff
changeset
|
1718 for __, backup in backups.items(): |
4b0e6677eed1
ui: use try..finally in configoverride
Gregory Szorc <gregory.szorc@gmail.com>
parents:
30528
diff
changeset
|
1719 self.restoreconfig(backup) |
4b0e6677eed1
ui: use try..finally in configoverride
Gregory Szorc <gregory.szorc@gmail.com>
parents:
30528
diff
changeset
|
1720 # 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
|
1721 # as it does not update ui.quiet class member |
4b0e6677eed1
ui: use try..finally in configoverride
Gregory Szorc <gregory.szorc@gmail.com>
parents:
30528
diff
changeset
|
1722 if ('ui', 'quiet') in overrides: |
4b0e6677eed1
ui: use try..finally in configoverride
Gregory Szorc <gregory.szorc@gmail.com>
parents:
30528
diff
changeset
|
1723 self.fixconfig(section='ui') |
30489
b0a8337ba9af
ui: add configoverride context manager
Kostia Balytskyi <ikostia@fb.com>
parents:
30482
diff
changeset
|
1724 |
24250
9c32eea2ca04
ui: represent paths as classes
Gregory Szorc <gregory.szorc@gmail.com>
parents:
23269
diff
changeset
|
1725 class paths(dict): |
9c32eea2ca04
ui: represent paths as classes
Gregory Szorc <gregory.szorc@gmail.com>
parents:
23269
diff
changeset
|
1726 """Represents a collection of paths and their configs. |
9c32eea2ca04
ui: represent paths as classes
Gregory Szorc <gregory.szorc@gmail.com>
parents:
23269
diff
changeset
|
1727 |
9c32eea2ca04
ui: represent paths as classes
Gregory Szorc <gregory.szorc@gmail.com>
parents:
23269
diff
changeset
|
1728 Data is initially derived from ui instances and the config files they have |
9c32eea2ca04
ui: represent paths as classes
Gregory Szorc <gregory.szorc@gmail.com>
parents:
23269
diff
changeset
|
1729 loaded. |
9c32eea2ca04
ui: represent paths as classes
Gregory Szorc <gregory.szorc@gmail.com>
parents:
23269
diff
changeset
|
1730 """ |
9c32eea2ca04
ui: represent paths as classes
Gregory Szorc <gregory.szorc@gmail.com>
parents:
23269
diff
changeset
|
1731 def __init__(self, ui): |
9c32eea2ca04
ui: represent paths as classes
Gregory Szorc <gregory.szorc@gmail.com>
parents:
23269
diff
changeset
|
1732 dict.__init__(self) |
9c32eea2ca04
ui: represent paths as classes
Gregory Szorc <gregory.szorc@gmail.com>
parents:
23269
diff
changeset
|
1733 |
27266
4dccc37b87bd
ui: support declaring path push urls as sub-options
Gregory Szorc <gregory.szorc@gmail.com>
parents:
27265
diff
changeset
|
1734 for name, loc in ui.configitems('paths', ignoresub=True): |
24250
9c32eea2ca04
ui: represent paths as classes
Gregory Szorc <gregory.szorc@gmail.com>
parents:
23269
diff
changeset
|
1735 # No location is the same as not existing. |
9c32eea2ca04
ui: represent paths as classes
Gregory Szorc <gregory.szorc@gmail.com>
parents:
23269
diff
changeset
|
1736 if not loc: |
9c32eea2ca04
ui: represent paths as classes
Gregory Szorc <gregory.szorc@gmail.com>
parents:
23269
diff
changeset
|
1737 continue |
27266
4dccc37b87bd
ui: support declaring path push urls as sub-options
Gregory Szorc <gregory.szorc@gmail.com>
parents:
27265
diff
changeset
|
1738 loc, sub = ui.configsuboptions('paths', name) |
4dccc37b87bd
ui: support declaring path push urls as sub-options
Gregory Szorc <gregory.szorc@gmail.com>
parents:
27265
diff
changeset
|
1739 self[name] = path(ui, name, rawloc=loc, suboptions=sub) |
24250
9c32eea2ca04
ui: represent paths as classes
Gregory Szorc <gregory.szorc@gmail.com>
parents:
23269
diff
changeset
|
1740 |
9c32eea2ca04
ui: represent paths as classes
Gregory Szorc <gregory.szorc@gmail.com>
parents:
23269
diff
changeset
|
1741 def getpath(self, name, default=None): |
27561
723413ee000e
paths: make getpath() accept multiple defaults
Yuya Nishihara <yuya@tcha.org>
parents:
27500
diff
changeset
|
1742 """Return a ``path`` from a string, falling back to default. |
26056
5f2a4fc3c4fa
ui: move URL and path detection into path API
Gregory Szorc <gregory.szorc@gmail.com>
parents:
25989
diff
changeset
|
1743 |
5f2a4fc3c4fa
ui: move URL and path detection into path API
Gregory Szorc <gregory.szorc@gmail.com>
parents:
25989
diff
changeset
|
1744 ``name`` can be a named path or locations. Locations are filesystem |
5f2a4fc3c4fa
ui: move URL and path detection into path API
Gregory Szorc <gregory.szorc@gmail.com>
parents:
25989
diff
changeset
|
1745 paths or URIs. |
24250
9c32eea2ca04
ui: represent paths as classes
Gregory Szorc <gregory.szorc@gmail.com>
parents:
23269
diff
changeset
|
1746 |
26189
663fbc336e22
ui: change default path fallback mechanism (issue4796)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
26076
diff
changeset
|
1747 Returns None if ``name`` is not a registered path, a URI, or a local |
663fbc336e22
ui: change default path fallback mechanism (issue4796)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
26076
diff
changeset
|
1748 path to a repo. |
24250
9c32eea2ca04
ui: represent paths as classes
Gregory Szorc <gregory.szorc@gmail.com>
parents:
23269
diff
changeset
|
1749 """ |
26189
663fbc336e22
ui: change default path fallback mechanism (issue4796)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
26076
diff
changeset
|
1750 # Only fall back to default if no path was requested. |
663fbc336e22
ui: change default path fallback mechanism (issue4796)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
26076
diff
changeset
|
1751 if name is None: |
27561
723413ee000e
paths: make getpath() accept multiple defaults
Yuya Nishihara <yuya@tcha.org>
parents:
27500
diff
changeset
|
1752 if not default: |
723413ee000e
paths: make getpath() accept multiple defaults
Yuya Nishihara <yuya@tcha.org>
parents:
27500
diff
changeset
|
1753 default = () |
723413ee000e
paths: make getpath() accept multiple defaults
Yuya Nishihara <yuya@tcha.org>
parents:
27500
diff
changeset
|
1754 elif not isinstance(default, (tuple, list)): |
723413ee000e
paths: make getpath() accept multiple defaults
Yuya Nishihara <yuya@tcha.org>
parents:
27500
diff
changeset
|
1755 default = (default,) |
723413ee000e
paths: make getpath() accept multiple defaults
Yuya Nishihara <yuya@tcha.org>
parents:
27500
diff
changeset
|
1756 for k in default: |
26189
663fbc336e22
ui: change default path fallback mechanism (issue4796)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
26076
diff
changeset
|
1757 try: |
27561
723413ee000e
paths: make getpath() accept multiple defaults
Yuya Nishihara <yuya@tcha.org>
parents:
27500
diff
changeset
|
1758 return self[k] |
26189
663fbc336e22
ui: change default path fallback mechanism (issue4796)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
26076
diff
changeset
|
1759 except KeyError: |
27561
723413ee000e
paths: make getpath() accept multiple defaults
Yuya Nishihara <yuya@tcha.org>
parents:
27500
diff
changeset
|
1760 continue |
723413ee000e
paths: make getpath() accept multiple defaults
Yuya Nishihara <yuya@tcha.org>
parents:
27500
diff
changeset
|
1761 return None |
26189
663fbc336e22
ui: change default path fallback mechanism (issue4796)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
26076
diff
changeset
|
1762 |
663fbc336e22
ui: change default path fallback mechanism (issue4796)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
26076
diff
changeset
|
1763 # Most likely empty string. |
663fbc336e22
ui: change default path fallback mechanism (issue4796)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
26076
diff
changeset
|
1764 # This may need to raise in the future. |
663fbc336e22
ui: change default path fallback mechanism (issue4796)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
26076
diff
changeset
|
1765 if not name: |
663fbc336e22
ui: change default path fallback mechanism (issue4796)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
26076
diff
changeset
|
1766 return None |
663fbc336e22
ui: change default path fallback mechanism (issue4796)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
26076
diff
changeset
|
1767 |
24250
9c32eea2ca04
ui: represent paths as classes
Gregory Szorc <gregory.szorc@gmail.com>
parents:
23269
diff
changeset
|
1768 try: |
9c32eea2ca04
ui: represent paths as classes
Gregory Szorc <gregory.szorc@gmail.com>
parents:
23269
diff
changeset
|
1769 return self[name] |
9c32eea2ca04
ui: represent paths as classes
Gregory Szorc <gregory.szorc@gmail.com>
parents:
23269
diff
changeset
|
1770 except KeyError: |
26056
5f2a4fc3c4fa
ui: move URL and path detection into path API
Gregory Szorc <gregory.szorc@gmail.com>
parents:
25989
diff
changeset
|
1771 # Try to resolve as a local path or URI. |
5f2a4fc3c4fa
ui: move URL and path detection into path API
Gregory Szorc <gregory.szorc@gmail.com>
parents:
25989
diff
changeset
|
1772 try: |
27265
47539ea08bdb
ui: pass ui instance to path.__init__
Gregory Szorc <gregory.szorc@gmail.com>
parents:
27264
diff
changeset
|
1773 # We don't pass sub-options in, so no need to pass ui instance. |
47539ea08bdb
ui: pass ui instance to path.__init__
Gregory Szorc <gregory.szorc@gmail.com>
parents:
27264
diff
changeset
|
1774 return path(None, None, rawloc=name) |
26056
5f2a4fc3c4fa
ui: move URL and path detection into path API
Gregory Szorc <gregory.szorc@gmail.com>
parents:
25989
diff
changeset
|
1775 except ValueError: |
26189
663fbc336e22
ui: change default path fallback mechanism (issue4796)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
26076
diff
changeset
|
1776 raise error.RepoError(_('repository %s does not exist') % |
663fbc336e22
ui: change default path fallback mechanism (issue4796)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
26076
diff
changeset
|
1777 name) |
26056
5f2a4fc3c4fa
ui: move URL and path detection into path API
Gregory Szorc <gregory.szorc@gmail.com>
parents:
25989
diff
changeset
|
1778 |
27266
4dccc37b87bd
ui: support declaring path push urls as sub-options
Gregory Szorc <gregory.szorc@gmail.com>
parents:
27265
diff
changeset
|
1779 _pathsuboptions = {} |
4dccc37b87bd
ui: support declaring path push urls as sub-options
Gregory Szorc <gregory.szorc@gmail.com>
parents:
27265
diff
changeset
|
1780 |
4dccc37b87bd
ui: support declaring path push urls as sub-options
Gregory Szorc <gregory.szorc@gmail.com>
parents:
27265
diff
changeset
|
1781 def pathsuboption(option, attr): |
4dccc37b87bd
ui: support declaring path push urls as sub-options
Gregory Szorc <gregory.szorc@gmail.com>
parents:
27265
diff
changeset
|
1782 """Decorator used to declare a path sub-option. |
4dccc37b87bd
ui: support declaring path push urls as sub-options
Gregory Szorc <gregory.szorc@gmail.com>
parents:
27265
diff
changeset
|
1783 |
4dccc37b87bd
ui: support declaring path push urls as sub-options
Gregory Szorc <gregory.szorc@gmail.com>
parents:
27265
diff
changeset
|
1784 Arguments are the sub-option name and the attribute it should set on |
4dccc37b87bd
ui: support declaring path push urls as sub-options
Gregory Szorc <gregory.szorc@gmail.com>
parents:
27265
diff
changeset
|
1785 ``path`` instances. |
4dccc37b87bd
ui: support declaring path push urls as sub-options
Gregory Szorc <gregory.szorc@gmail.com>
parents:
27265
diff
changeset
|
1786 |
4dccc37b87bd
ui: support declaring path push urls as sub-options
Gregory Szorc <gregory.szorc@gmail.com>
parents:
27265
diff
changeset
|
1787 The decorated function will receive as arguments a ``ui`` instance, |
4dccc37b87bd
ui: support declaring path push urls as sub-options
Gregory Szorc <gregory.szorc@gmail.com>
parents:
27265
diff
changeset
|
1788 ``path`` instance, and the string value of this option from the config. |
4dccc37b87bd
ui: support declaring path push urls as sub-options
Gregory Szorc <gregory.szorc@gmail.com>
parents:
27265
diff
changeset
|
1789 The function should return the value that will be set on the ``path`` |
4dccc37b87bd
ui: support declaring path push urls as sub-options
Gregory Szorc <gregory.szorc@gmail.com>
parents:
27265
diff
changeset
|
1790 instance. |
4dccc37b87bd
ui: support declaring path push urls as sub-options
Gregory Szorc <gregory.szorc@gmail.com>
parents:
27265
diff
changeset
|
1791 |
4dccc37b87bd
ui: support declaring path push urls as sub-options
Gregory Szorc <gregory.szorc@gmail.com>
parents:
27265
diff
changeset
|
1792 This decorator can be used to perform additional verification of |
4dccc37b87bd
ui: support declaring path push urls as sub-options
Gregory Szorc <gregory.szorc@gmail.com>
parents:
27265
diff
changeset
|
1793 sub-options and to change the type of sub-options. |
4dccc37b87bd
ui: support declaring path push urls as sub-options
Gregory Szorc <gregory.szorc@gmail.com>
parents:
27265
diff
changeset
|
1794 """ |
4dccc37b87bd
ui: support declaring path push urls as sub-options
Gregory Szorc <gregory.szorc@gmail.com>
parents:
27265
diff
changeset
|
1795 def register(func): |
4dccc37b87bd
ui: support declaring path push urls as sub-options
Gregory Szorc <gregory.szorc@gmail.com>
parents:
27265
diff
changeset
|
1796 _pathsuboptions[option] = (attr, func) |
4dccc37b87bd
ui: support declaring path push urls as sub-options
Gregory Szorc <gregory.szorc@gmail.com>
parents:
27265
diff
changeset
|
1797 return func |
4dccc37b87bd
ui: support declaring path push urls as sub-options
Gregory Szorc <gregory.szorc@gmail.com>
parents:
27265
diff
changeset
|
1798 return register |
4dccc37b87bd
ui: support declaring path push urls as sub-options
Gregory Szorc <gregory.szorc@gmail.com>
parents:
27265
diff
changeset
|
1799 |
4dccc37b87bd
ui: support declaring path push urls as sub-options
Gregory Szorc <gregory.szorc@gmail.com>
parents:
27265
diff
changeset
|
1800 @pathsuboption('pushurl', 'pushloc') |
4dccc37b87bd
ui: support declaring path push urls as sub-options
Gregory Szorc <gregory.szorc@gmail.com>
parents:
27265
diff
changeset
|
1801 def pushurlpathoption(ui, path, value): |
4dccc37b87bd
ui: support declaring path push urls as sub-options
Gregory Szorc <gregory.szorc@gmail.com>
parents:
27265
diff
changeset
|
1802 u = util.url(value) |
4dccc37b87bd
ui: support declaring path push urls as sub-options
Gregory Szorc <gregory.szorc@gmail.com>
parents:
27265
diff
changeset
|
1803 # Actually require a URL. |
4dccc37b87bd
ui: support declaring path push urls as sub-options
Gregory Szorc <gregory.szorc@gmail.com>
parents:
27265
diff
changeset
|
1804 if not u.scheme: |
4dccc37b87bd
ui: support declaring path push urls as sub-options
Gregory Szorc <gregory.szorc@gmail.com>
parents:
27265
diff
changeset
|
1805 ui.warn(_('(paths.%s:pushurl not a URL; ignoring)\n') % path.name) |
4dccc37b87bd
ui: support declaring path push urls as sub-options
Gregory Szorc <gregory.szorc@gmail.com>
parents:
27265
diff
changeset
|
1806 return None |
4dccc37b87bd
ui: support declaring path push urls as sub-options
Gregory Szorc <gregory.szorc@gmail.com>
parents:
27265
diff
changeset
|
1807 |
4dccc37b87bd
ui: support declaring path push urls as sub-options
Gregory Szorc <gregory.szorc@gmail.com>
parents:
27265
diff
changeset
|
1808 # Don't support the #foo syntax in the push URL to declare branch to |
4dccc37b87bd
ui: support declaring path push urls as sub-options
Gregory Szorc <gregory.szorc@gmail.com>
parents:
27265
diff
changeset
|
1809 # push. |
4dccc37b87bd
ui: support declaring path push urls as sub-options
Gregory Szorc <gregory.szorc@gmail.com>
parents:
27265
diff
changeset
|
1810 if u.fragment: |
4dccc37b87bd
ui: support declaring path push urls as sub-options
Gregory Szorc <gregory.szorc@gmail.com>
parents:
27265
diff
changeset
|
1811 ui.warn(_('("#fragment" in paths.%s:pushurl not supported; ' |
4dccc37b87bd
ui: support declaring path push urls as sub-options
Gregory Szorc <gregory.szorc@gmail.com>
parents:
27265
diff
changeset
|
1812 'ignoring)\n') % path.name) |
4dccc37b87bd
ui: support declaring path push urls as sub-options
Gregory Szorc <gregory.szorc@gmail.com>
parents:
27265
diff
changeset
|
1813 u.fragment = None |
4dccc37b87bd
ui: support declaring path push urls as sub-options
Gregory Szorc <gregory.szorc@gmail.com>
parents:
27265
diff
changeset
|
1814 |
36754
8988c34bd018
py3: don't use str() to stringify pushloc
Yuya Nishihara <yuya@tcha.org>
parents:
36636
diff
changeset
|
1815 return bytes(u) |
27266
4dccc37b87bd
ui: support declaring path push urls as sub-options
Gregory Szorc <gregory.szorc@gmail.com>
parents:
27265
diff
changeset
|
1816 |
29413
31d3ab7985b8
ui: path option to declare which revisions to push by default
Gregory Szorc <gregory.szorc@gmail.com>
parents:
29412
diff
changeset
|
1817 @pathsuboption('pushrev', 'pushrev') |
31d3ab7985b8
ui: path option to declare which revisions to push by default
Gregory Szorc <gregory.szorc@gmail.com>
parents:
29412
diff
changeset
|
1818 def pushrevpathoption(ui, path, value): |
31d3ab7985b8
ui: path option to declare which revisions to push by default
Gregory Szorc <gregory.szorc@gmail.com>
parents:
29412
diff
changeset
|
1819 return value |
31d3ab7985b8
ui: path option to declare which revisions to push by default
Gregory Szorc <gregory.szorc@gmail.com>
parents:
29412
diff
changeset
|
1820 |
24250
9c32eea2ca04
ui: represent paths as classes
Gregory Szorc <gregory.szorc@gmail.com>
parents:
23269
diff
changeset
|
1821 class path(object): |
9c32eea2ca04
ui: represent paths as classes
Gregory Szorc <gregory.szorc@gmail.com>
parents:
23269
diff
changeset
|
1822 """Represents an individual path and its configuration.""" |
9c32eea2ca04
ui: represent paths as classes
Gregory Szorc <gregory.szorc@gmail.com>
parents:
23269
diff
changeset
|
1823 |
27266
4dccc37b87bd
ui: support declaring path push urls as sub-options
Gregory Szorc <gregory.szorc@gmail.com>
parents:
27265
diff
changeset
|
1824 def __init__(self, ui, name, rawloc=None, suboptions=None): |
24250
9c32eea2ca04
ui: represent paths as classes
Gregory Szorc <gregory.szorc@gmail.com>
parents:
23269
diff
changeset
|
1825 """Construct a path from its config options. |
9c32eea2ca04
ui: represent paths as classes
Gregory Szorc <gregory.szorc@gmail.com>
parents:
23269
diff
changeset
|
1826 |
27265
47539ea08bdb
ui: pass ui instance to path.__init__
Gregory Szorc <gregory.szorc@gmail.com>
parents:
27264
diff
changeset
|
1827 ``ui`` is the ``ui`` instance the path is coming from. |
24250
9c32eea2ca04
ui: represent paths as classes
Gregory Szorc <gregory.szorc@gmail.com>
parents:
23269
diff
changeset
|
1828 ``name`` is the symbolic name of the path. |
9c32eea2ca04
ui: represent paths as classes
Gregory Szorc <gregory.szorc@gmail.com>
parents:
23269
diff
changeset
|
1829 ``rawloc`` is the raw location, as defined in the config. |
26064
1b1ab6ff58c4
ui: capture push location on path instances
Gregory Szorc <gregory.szorc@gmail.com>
parents:
26056
diff
changeset
|
1830 ``pushloc`` is the raw locations pushes should be made to. |
26056
5f2a4fc3c4fa
ui: move URL and path detection into path API
Gregory Szorc <gregory.szorc@gmail.com>
parents:
25989
diff
changeset
|
1831 |
5f2a4fc3c4fa
ui: move URL and path detection into path API
Gregory Szorc <gregory.szorc@gmail.com>
parents:
25989
diff
changeset
|
1832 If ``name`` is not defined, we require that the location be a) a local |
5f2a4fc3c4fa
ui: move URL and path detection into path API
Gregory Szorc <gregory.szorc@gmail.com>
parents:
25989
diff
changeset
|
1833 filesystem path with a .hg directory or b) a URL. If not, |
5f2a4fc3c4fa
ui: move URL and path detection into path API
Gregory Szorc <gregory.szorc@gmail.com>
parents:
25989
diff
changeset
|
1834 ``ValueError`` is raised. |
24250
9c32eea2ca04
ui: represent paths as classes
Gregory Szorc <gregory.szorc@gmail.com>
parents:
23269
diff
changeset
|
1835 """ |
26056
5f2a4fc3c4fa
ui: move URL and path detection into path API
Gregory Szorc <gregory.szorc@gmail.com>
parents:
25989
diff
changeset
|
1836 if not rawloc: |
5f2a4fc3c4fa
ui: move URL and path detection into path API
Gregory Szorc <gregory.szorc@gmail.com>
parents:
25989
diff
changeset
|
1837 raise ValueError('rawloc must be defined') |
5f2a4fc3c4fa
ui: move URL and path detection into path API
Gregory Szorc <gregory.szorc@gmail.com>
parents:
25989
diff
changeset
|
1838 |
5f2a4fc3c4fa
ui: move URL and path detection into path API
Gregory Szorc <gregory.szorc@gmail.com>
parents:
25989
diff
changeset
|
1839 # Locations may define branches via syntax <base>#<branch>. |
5f2a4fc3c4fa
ui: move URL and path detection into path API
Gregory Szorc <gregory.szorc@gmail.com>
parents:
25989
diff
changeset
|
1840 u = util.url(rawloc) |
5f2a4fc3c4fa
ui: move URL and path detection into path API
Gregory Szorc <gregory.szorc@gmail.com>
parents:
25989
diff
changeset
|
1841 branch = None |
5f2a4fc3c4fa
ui: move URL and path detection into path API
Gregory Szorc <gregory.szorc@gmail.com>
parents:
25989
diff
changeset
|
1842 if u.fragment: |
5f2a4fc3c4fa
ui: move URL and path detection into path API
Gregory Szorc <gregory.szorc@gmail.com>
parents:
25989
diff
changeset
|
1843 branch = u.fragment |
5f2a4fc3c4fa
ui: move URL and path detection into path API
Gregory Szorc <gregory.szorc@gmail.com>
parents:
25989
diff
changeset
|
1844 u.fragment = None |
5f2a4fc3c4fa
ui: move URL and path detection into path API
Gregory Szorc <gregory.szorc@gmail.com>
parents:
25989
diff
changeset
|
1845 |
5f2a4fc3c4fa
ui: move URL and path detection into path API
Gregory Szorc <gregory.szorc@gmail.com>
parents:
25989
diff
changeset
|
1846 self.url = u |
5f2a4fc3c4fa
ui: move URL and path detection into path API
Gregory Szorc <gregory.szorc@gmail.com>
parents:
25989
diff
changeset
|
1847 self.branch = branch |
5f2a4fc3c4fa
ui: move URL and path detection into path API
Gregory Szorc <gregory.szorc@gmail.com>
parents:
25989
diff
changeset
|
1848 |
24250
9c32eea2ca04
ui: represent paths as classes
Gregory Szorc <gregory.szorc@gmail.com>
parents:
23269
diff
changeset
|
1849 self.name = name |
26056
5f2a4fc3c4fa
ui: move URL and path detection into path API
Gregory Szorc <gregory.szorc@gmail.com>
parents:
25989
diff
changeset
|
1850 self.rawloc = rawloc |
31359
2eee8ad77726
ui: portably bytestring-ify url object
Augie Fackler <augie@google.com>
parents:
31350
diff
changeset
|
1851 self.loc = '%s' % u |
26056
5f2a4fc3c4fa
ui: move URL and path detection into path API
Gregory Szorc <gregory.szorc@gmail.com>
parents:
25989
diff
changeset
|
1852 |
5f2a4fc3c4fa
ui: move URL and path detection into path API
Gregory Szorc <gregory.szorc@gmail.com>
parents:
25989
diff
changeset
|
1853 # When given a raw location but not a symbolic name, validate the |
5f2a4fc3c4fa
ui: move URL and path detection into path API
Gregory Szorc <gregory.szorc@gmail.com>
parents:
25989
diff
changeset
|
1854 # location is valid. |
26076
cebf7e48365e
paths: move path validation logic to its own function
Durham Goode <durham@fb.com>
parents:
26064
diff
changeset
|
1855 if not name and not u.scheme and not self._isvalidlocalpath(self.loc): |
26056
5f2a4fc3c4fa
ui: move URL and path detection into path API
Gregory Szorc <gregory.szorc@gmail.com>
parents:
25989
diff
changeset
|
1856 raise ValueError('location is not a URL or path to a local ' |
5f2a4fc3c4fa
ui: move URL and path detection into path API
Gregory Szorc <gregory.szorc@gmail.com>
parents:
25989
diff
changeset
|
1857 'repo: %s' % rawloc) |
25498
7a5335ed7e1a
progress: move the singleton logic to the ui module
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
25363
diff
changeset
|
1858 |
27266
4dccc37b87bd
ui: support declaring path push urls as sub-options
Gregory Szorc <gregory.szorc@gmail.com>
parents:
27265
diff
changeset
|
1859 suboptions = suboptions or {} |
4dccc37b87bd
ui: support declaring path push urls as sub-options
Gregory Szorc <gregory.szorc@gmail.com>
parents:
27265
diff
changeset
|
1860 |
4dccc37b87bd
ui: support declaring path push urls as sub-options
Gregory Szorc <gregory.szorc@gmail.com>
parents:
27265
diff
changeset
|
1861 # Now process the sub-options. If a sub-option is registered, its |
4dccc37b87bd
ui: support declaring path push urls as sub-options
Gregory Szorc <gregory.szorc@gmail.com>
parents:
27265
diff
changeset
|
1862 # attribute will always be present. The value will be None if there |
4dccc37b87bd
ui: support declaring path push urls as sub-options
Gregory Szorc <gregory.szorc@gmail.com>
parents:
27265
diff
changeset
|
1863 # was no valid sub-option. |
4dccc37b87bd
ui: support declaring path push urls as sub-options
Gregory Szorc <gregory.szorc@gmail.com>
parents:
27265
diff
changeset
|
1864 for suboption, (attr, func) in _pathsuboptions.iteritems(): |
4dccc37b87bd
ui: support declaring path push urls as sub-options
Gregory Szorc <gregory.szorc@gmail.com>
parents:
27265
diff
changeset
|
1865 if suboption not in suboptions: |
4dccc37b87bd
ui: support declaring path push urls as sub-options
Gregory Szorc <gregory.szorc@gmail.com>
parents:
27265
diff
changeset
|
1866 setattr(self, attr, None) |
4dccc37b87bd
ui: support declaring path push urls as sub-options
Gregory Szorc <gregory.szorc@gmail.com>
parents:
27265
diff
changeset
|
1867 continue |
4dccc37b87bd
ui: support declaring path push urls as sub-options
Gregory Szorc <gregory.szorc@gmail.com>
parents:
27265
diff
changeset
|
1868 |
4dccc37b87bd
ui: support declaring path push urls as sub-options
Gregory Szorc <gregory.szorc@gmail.com>
parents:
27265
diff
changeset
|
1869 value = func(ui, self, suboptions[suboption]) |
4dccc37b87bd
ui: support declaring path push urls as sub-options
Gregory Szorc <gregory.szorc@gmail.com>
parents:
27265
diff
changeset
|
1870 setattr(self, attr, value) |
4dccc37b87bd
ui: support declaring path push urls as sub-options
Gregory Szorc <gregory.szorc@gmail.com>
parents:
27265
diff
changeset
|
1871 |
26076
cebf7e48365e
paths: move path validation logic to its own function
Durham Goode <durham@fb.com>
parents:
26064
diff
changeset
|
1872 def _isvalidlocalpath(self, path): |
cebf7e48365e
paths: move path validation logic to its own function
Durham Goode <durham@fb.com>
parents:
26064
diff
changeset
|
1873 """Returns True if the given path is a potentially valid repository. |
cebf7e48365e
paths: move path validation logic to its own function
Durham Goode <durham@fb.com>
parents:
26064
diff
changeset
|
1874 This is its own function so that extensions can change the definition of |
cebf7e48365e
paths: move path validation logic to its own function
Durham Goode <durham@fb.com>
parents:
26064
diff
changeset
|
1875 'valid' in this case (like when pulling from a git repo into a hg |
cebf7e48365e
paths: move path validation logic to its own function
Durham Goode <durham@fb.com>
parents:
26064
diff
changeset
|
1876 one).""" |
cebf7e48365e
paths: move path validation logic to its own function
Durham Goode <durham@fb.com>
parents:
26064
diff
changeset
|
1877 return os.path.isdir(os.path.join(path, '.hg')) |
cebf7e48365e
paths: move path validation logic to its own function
Durham Goode <durham@fb.com>
parents:
26064
diff
changeset
|
1878 |
26064
1b1ab6ff58c4
ui: capture push location on path instances
Gregory Szorc <gregory.szorc@gmail.com>
parents:
26056
diff
changeset
|
1879 @property |
27266
4dccc37b87bd
ui: support declaring path push urls as sub-options
Gregory Szorc <gregory.szorc@gmail.com>
parents:
27265
diff
changeset
|
1880 def suboptions(self): |
4dccc37b87bd
ui: support declaring path push urls as sub-options
Gregory Szorc <gregory.szorc@gmail.com>
parents:
27265
diff
changeset
|
1881 """Return sub-options and their values for this path. |
4dccc37b87bd
ui: support declaring path push urls as sub-options
Gregory Szorc <gregory.szorc@gmail.com>
parents:
27265
diff
changeset
|
1882 |
4dccc37b87bd
ui: support declaring path push urls as sub-options
Gregory Szorc <gregory.szorc@gmail.com>
parents:
27265
diff
changeset
|
1883 This is intended to be used for presentation purposes. |
4dccc37b87bd
ui: support declaring path push urls as sub-options
Gregory Szorc <gregory.szorc@gmail.com>
parents:
27265
diff
changeset
|
1884 """ |
4dccc37b87bd
ui: support declaring path push urls as sub-options
Gregory Szorc <gregory.szorc@gmail.com>
parents:
27265
diff
changeset
|
1885 d = {} |
4dccc37b87bd
ui: support declaring path push urls as sub-options
Gregory Szorc <gregory.szorc@gmail.com>
parents:
27265
diff
changeset
|
1886 for subopt, (attr, _func) in _pathsuboptions.iteritems(): |
4dccc37b87bd
ui: support declaring path push urls as sub-options
Gregory Szorc <gregory.szorc@gmail.com>
parents:
27265
diff
changeset
|
1887 value = getattr(self, attr) |
4dccc37b87bd
ui: support declaring path push urls as sub-options
Gregory Szorc <gregory.szorc@gmail.com>
parents:
27265
diff
changeset
|
1888 if value is not None: |
4dccc37b87bd
ui: support declaring path push urls as sub-options
Gregory Szorc <gregory.szorc@gmail.com>
parents:
27265
diff
changeset
|
1889 d[subopt] = value |
4dccc37b87bd
ui: support declaring path push urls as sub-options
Gregory Szorc <gregory.szorc@gmail.com>
parents:
27265
diff
changeset
|
1890 return d |
26064
1b1ab6ff58c4
ui: capture push location on path instances
Gregory Szorc <gregory.szorc@gmail.com>
parents:
26056
diff
changeset
|
1891 |
25498
7a5335ed7e1a
progress: move the singleton logic to the ui module
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
25363
diff
changeset
|
1892 # 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
|
1893 # competing progress bars when multiple UI objects get created |
7a5335ed7e1a
progress: move the singleton logic to the ui module
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
25363
diff
changeset
|
1894 _progresssingleton = None |
7a5335ed7e1a
progress: move the singleton logic to the ui module
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
25363
diff
changeset
|
1895 |
7a5335ed7e1a
progress: move the singleton logic to the ui module
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
25363
diff
changeset
|
1896 def getprogbar(ui): |
7a5335ed7e1a
progress: move the singleton logic to the ui module
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
25363
diff
changeset
|
1897 global _progresssingleton |
7a5335ed7e1a
progress: move the singleton logic to the ui module
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
25363
diff
changeset
|
1898 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
|
1899 # 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
|
1900 # 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
|
1901 _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
|
1902 return _progresssingleton |
33683
0e4bed5c5c38
ui: check for progress singleton when clearing progress bar (issue5684)
Mark Thomas <mbthomas@fb.com>
parents:
33668
diff
changeset
|
1903 |
0e4bed5c5c38
ui: check for progress singleton when clearing progress bar (issue5684)
Mark Thomas <mbthomas@fb.com>
parents:
33668
diff
changeset
|
1904 def haveprogbar(): |
0e4bed5c5c38
ui: check for progress singleton when clearing progress bar (issue5684)
Mark Thomas <mbthomas@fb.com>
parents:
33668
diff
changeset
|
1905 return _progresssingleton is not None |