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