annotate mercurial/ui.py @ 10421:452b6195e94c

ui: look before you leap on sys.stderr.closed (and look nicer) f83291e5643e introduced a fix if sys.stdout.closed does not exist. This change uses a getattr with default instead of hasattr (which just calls getattr) and accessing the attribute. Additionally it applies the same fix for sys.stderr.closed as this is not available in the bpython shell (reported by Roger Gammans).
author Thomas Arendsen Hein <thomas@intevation.de>
date Fri, 12 Feb 2010 15:46:48 +0100
parents f83291e5643e
children 5a3a916aad58
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
207
ec327cf0d3a9 Move ui class to its own module
mpm@selenic.com
parents:
diff changeset
1 # ui.py - user interface bits for mercurial
ec327cf0d3a9 Move ui class to its own module
mpm@selenic.com
parents:
diff changeset
2 #
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
ec327cf0d3a9 Move ui class to its own module
mpm@selenic.com
parents:
diff changeset
4 #
8225
46293a0c7e9f updated license to be explicit about GPL version 2
Martin Geisler <mg@lazybytes.net>
parents: 8222
diff changeset
5 # This software may be used and distributed according to the terms of the
10263
25e572394f5c Update license to GPLv2+
Matt Mackall <mpm@selenic.com>
parents: 10243
diff changeset
6 # GNU General Public License version 2 or any later version.
207
ec327cf0d3a9 Move ui class to its own module
mpm@selenic.com
parents:
diff changeset
7
3891
6b4127c7d52a Simplify i18n imports
Matt Mackall <mpm@selenic.com>
parents: 3889
diff changeset
8 from i18n import _
8656
284fda4cd093 removed unused imports
Martin Geisler <mg@lazybytes.net>
parents: 8642
diff changeset
9 import errno, getpass, os, socket, sys, tempfile, traceback
8312
b87a50b7125c separate import lines from mercurial and general python modules
Simon Heimberg <simohe@besonet.ch>
parents: 8259
diff changeset
10 import config, util, error
207
ec327cf0d3a9 Move ui class to its own module
mpm@selenic.com
parents:
diff changeset
11
8222
d30a21594812 more whitespace cleanup and some other style nits
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 8220
diff changeset
12 _booleans = {'1': True, 'yes': True, 'true': True, 'on': True,
d30a21594812 more whitespace cleanup and some other style nits
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 8220
diff changeset
13 '0': False, 'no': False, 'false': False, 'off': False}
3344
d9b3d3d34749 ui.py: change the overlay from a dict to a SafeConfigParser.
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 3343
diff changeset
14
1559
59b3639df0a9 Convert all classes to new-style classes by deriving them from object.
Eric Hopper <hopper@omnifarious.org>
parents: 1483
diff changeset
15 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
16 def __init__(self, src=None):
8202
4746113269c7 ui: buffers -> _buffers
Matt Mackall <mpm@selenic.com>
parents: 8201
diff changeset
17 self._buffers = []
9851
9e7b2c49d25d Make it possible to debug failed hook imports via use of --traceback
Bryan O'Sullivan <bos@serpentine.com>
parents: 9786
diff changeset
18 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
19 self._reportuntrusted = True
8203
3377fa11af67 ui: privatize cdata vars
Matt Mackall <mpm@selenic.com>
parents: 8202
diff changeset
20 self._ocfg = config.config() # overlay
3377fa11af67 ui: privatize cdata vars
Matt Mackall <mpm@selenic.com>
parents: 8202
diff changeset
21 self._tcfg = config.config() # trusted
3377fa11af67 ui: privatize cdata vars
Matt Mackall <mpm@selenic.com>
parents: 8202
diff changeset
22 self._ucfg = config.config() # untrusted
8478
d728f126c1b7 ui: use set instead of dict
Martin Geisler <mg@lazybytes.net>
parents: 8409
diff changeset
23 self._trustusers = set()
d728f126c1b7 ui: use set instead of dict
Martin Geisler <mg@lazybytes.net>
parents: 8409
diff changeset
24 self._trustgroups = set()
8136
6b5522cb2ad2 ui: refactor option setting
Matt Mackall <mpm@selenic.com>
parents: 8135
diff changeset
25
8190
9b8ac5fb7760 ui: kill most users of parentui name and arg, replace with .copy()
Matt Mackall <mpm@selenic.com>
parents: 8189
diff changeset
26 if src:
8203
3377fa11af67 ui: privatize cdata vars
Matt Mackall <mpm@selenic.com>
parents: 8202
diff changeset
27 self._tcfg = src._tcfg.copy()
3377fa11af67 ui: privatize cdata vars
Matt Mackall <mpm@selenic.com>
parents: 8202
diff changeset
28 self._ucfg = src._ucfg.copy()
3377fa11af67 ui: privatize cdata vars
Matt Mackall <mpm@selenic.com>
parents: 8202
diff changeset
29 self._ocfg = src._ocfg.copy()
8201
7cf2b987acd3 ui: trusted_users -> _trustusers, trusted_groups -> _trustgroups
Matt Mackall <mpm@selenic.com>
parents: 8200
diff changeset
30 self._trustusers = src._trustusers.copy()
7cf2b987acd3 ui: trusted_users -> _trustusers, trusted_groups -> _trustgroups
Matt Mackall <mpm@selenic.com>
parents: 8200
diff changeset
31 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
32 self.environ = src.environ
8143
507c49e297e1 ui: simplify init, kill dupconfig
Matt Mackall <mpm@selenic.com>
parents: 8142
diff changeset
33 self.fixconfig()
507c49e297e1 ui: simplify init, kill dupconfig
Matt Mackall <mpm@selenic.com>
parents: 8142
diff changeset
34 else:
9887
38170eeed18c ui: add environ property to access os.environ or wsgirequest.environ
Sune Foldager <cryo@cyanite.org>
parents: 9851
diff changeset
35 # shared read-only environment
38170eeed18c ui: add environ property to access os.environ or wsgirequest.environ
Sune Foldager <cryo@cyanite.org>
parents: 9851
diff changeset
36 self.environ = os.environ
3676
d94664748bc1 Use a variable to explicitly trust global config files
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 3646
diff changeset
37 # we always trust global config files
8142
912bfef12ba6 ui: fold readsections into readconfig
Matt Mackall <mpm@selenic.com>
parents: 8141
diff changeset
38 for f in util.rcpath():
8200
865d2c646f29 ui: assumetrusted -> trust
Matt Mackall <mpm@selenic.com>
parents: 8199
diff changeset
39 self.readconfig(f, trust=True)
8222
d30a21594812 more whitespace cleanup and some other style nits
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 8220
diff changeset
40
8189
d2899a856f9f ui: replace parentui mechanism with repo.baseui
Matt Mackall <mpm@selenic.com>
parents: 8187
diff changeset
41 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
42 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
43
8141
e40b629bedd1 ui: cleanup _is_trusted a bit
Matt Mackall <mpm@selenic.com>
parents: 8140
diff changeset
44 def _is_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
45 st = util.fstat(fp)
8657
3fa92c618624 posix: do not use fstat in isowner
Martin Geisler <mg@lazybytes.net>
parents: 8656
diff changeset
46 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
47 return True
8141
e40b629bedd1 ui: cleanup _is_trusted a bit
Matt Mackall <mpm@selenic.com>
parents: 8140
diff changeset
48
8201
7cf2b987acd3 ui: trusted_users -> _trustusers, trusted_groups -> _trustgroups
Matt Mackall <mpm@selenic.com>
parents: 8200
diff changeset
49 tusers, tgroups = self._trustusers, self._trustgroups
8141
e40b629bedd1 ui: cleanup _is_trusted a bit
Matt Mackall <mpm@selenic.com>
parents: 8140
diff changeset
50 if '*' in tusers or '*' in tgroups:
e40b629bedd1 ui: cleanup _is_trusted a bit
Matt Mackall <mpm@selenic.com>
parents: 8140
diff changeset
51 return True
e40b629bedd1 ui: cleanup _is_trusted a bit
Matt Mackall <mpm@selenic.com>
parents: 8140
diff changeset
52
e40b629bedd1 ui: cleanup _is_trusted a bit
Matt Mackall <mpm@selenic.com>
parents: 8140
diff changeset
53 user = util.username(st.st_uid)
e40b629bedd1 ui: cleanup _is_trusted a bit
Matt Mackall <mpm@selenic.com>
parents: 8140
diff changeset
54 group = util.groupname(st.st_gid)
e40b629bedd1 ui: cleanup _is_trusted a bit
Matt Mackall <mpm@selenic.com>
parents: 8140
diff changeset
55 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
56 return True
e40b629bedd1 ui: cleanup _is_trusted a bit
Matt Mackall <mpm@selenic.com>
parents: 8140
diff changeset
57
8204
797586be575d ui: report_untrusted fixes
Matt Mackall <mpm@selenic.com>
parents: 8203
diff changeset
58 if self._reportuntrusted:
8141
e40b629bedd1 ui: cleanup _is_trusted a bit
Matt Mackall <mpm@selenic.com>
parents: 8140
diff changeset
59 self.warn(_('Not trusting file %s from untrusted '
e40b629bedd1 ui: cleanup _is_trusted a bit
Matt Mackall <mpm@selenic.com>
parents: 8140
diff changeset
60 'user %s, group %s\n') % (f, user, group))
e40b629bedd1 ui: cleanup _is_trusted a bit
Matt Mackall <mpm@selenic.com>
parents: 8140
diff changeset
61 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
62
8200
865d2c646f29 ui: assumetrusted -> trust
Matt Mackall <mpm@selenic.com>
parents: 8199
diff changeset
63 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
64 sections=None, remap=None):
8142
912bfef12ba6 ui: fold readsections into readconfig
Matt Mackall <mpm@selenic.com>
parents: 8141
diff changeset
65 try:
912bfef12ba6 ui: fold readsections into readconfig
Matt Mackall <mpm@selenic.com>
parents: 8141
diff changeset
66 fp = open(filename)
912bfef12ba6 ui: fold readsections into readconfig
Matt Mackall <mpm@selenic.com>
parents: 8141
diff changeset
67 except IOError:
912bfef12ba6 ui: fold readsections into readconfig
Matt Mackall <mpm@selenic.com>
parents: 8141
diff changeset
68 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
69 return
912bfef12ba6 ui: fold readsections into readconfig
Matt Mackall <mpm@selenic.com>
parents: 8141
diff changeset
70 raise
8139
9302404b60f3 ui: always have ucdata
Matt Mackall <mpm@selenic.com>
parents: 8138
diff changeset
71
8203
3377fa11af67 ui: privatize cdata vars
Matt Mackall <mpm@selenic.com>
parents: 8202
diff changeset
72 cfg = config.config()
8200
865d2c646f29 ui: assumetrusted -> trust
Matt Mackall <mpm@selenic.com>
parents: 8199
diff changeset
73 trusted = sections or trust or self._is_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
74
8142
912bfef12ba6 ui: fold readsections into readconfig
Matt Mackall <mpm@selenic.com>
parents: 8141
diff changeset
75 try:
8345
dcebff8a25dd hgwebdir: read --webdir-conf as actual configuration to ui (issue1586)
Alexander Solovyov <piranha@piranha.org.ua>
parents: 8312
diff changeset
76 cfg.read(filename, fp, sections=sections, remap=remap)
8144
fca54469480e ui: introduce new config parser
Matt Mackall <mpm@selenic.com>
parents: 8143
diff changeset
77 except error.ConfigError, inst:
8142
912bfef12ba6 ui: fold readsections into readconfig
Matt Mackall <mpm@selenic.com>
parents: 8141
diff changeset
78 if trusted:
8144
fca54469480e ui: introduce new config parser
Matt Mackall <mpm@selenic.com>
parents: 8143
diff changeset
79 raise
fca54469480e ui: introduce new config parser
Matt Mackall <mpm@selenic.com>
parents: 8143
diff changeset
80 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
81
8142
912bfef12ba6 ui: fold readsections into readconfig
Matt Mackall <mpm@selenic.com>
parents: 8141
diff changeset
82 if trusted:
8203
3377fa11af67 ui: privatize cdata vars
Matt Mackall <mpm@selenic.com>
parents: 8202
diff changeset
83 self._tcfg.update(cfg)
3377fa11af67 ui: privatize cdata vars
Matt Mackall <mpm@selenic.com>
parents: 8202
diff changeset
84 self._tcfg.update(self._ocfg)
3377fa11af67 ui: privatize cdata vars
Matt Mackall <mpm@selenic.com>
parents: 8202
diff changeset
85 self._ucfg.update(cfg)
3377fa11af67 ui: privatize cdata vars
Matt Mackall <mpm@selenic.com>
parents: 8202
diff changeset
86 self._ucfg.update(self._ocfg)
8139
9302404b60f3 ui: always have ucdata
Matt Mackall <mpm@selenic.com>
parents: 8138
diff changeset
87
3347
bce7c1b4c1c8 ui.py: normalize settings every time the configuration changes
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 3346
diff changeset
88 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
89 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
90 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
91
8197
d94f17c27505 ui: simplify fixconfig
Matt Mackall <mpm@selenic.com>
parents: 8196
diff changeset
92 def fixconfig(self, root=None):
3347
bce7c1b4c1c8 ui.py: normalize settings every time the configuration changes
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 3346
diff changeset
93 # translate paths relative to root (or home) into absolute paths
8197
d94f17c27505 ui: simplify fixconfig
Matt Mackall <mpm@selenic.com>
parents: 8196
diff changeset
94 root = root or os.getcwd()
8203
3377fa11af67 ui: privatize cdata vars
Matt Mackall <mpm@selenic.com>
parents: 8202
diff changeset
95 for c in self._tcfg, self._ucfg, self._ocfg:
8197
d94f17c27505 ui: simplify fixconfig
Matt Mackall <mpm@selenic.com>
parents: 8196
diff changeset
96 for n, p in c.items('paths'):
d94f17c27505 ui: simplify fixconfig
Matt Mackall <mpm@selenic.com>
parents: 8196
diff changeset
97 if p and "://" not in p and not os.path.isabs(p):
d94f17c27505 ui: simplify fixconfig
Matt Mackall <mpm@selenic.com>
parents: 8196
diff changeset
98 c.set("paths", n, os.path.normpath(os.path.join(root, p)))
3347
bce7c1b4c1c8 ui.py: normalize settings every time the configuration changes
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 3346
diff changeset
99
8138
0ffb8f791b7c ui: fold verbosity_constraints into fixconfig, simplify
Matt Mackall <mpm@selenic.com>
parents: 8137
diff changeset
100 # update ui options
8197
d94f17c27505 ui: simplify fixconfig
Matt Mackall <mpm@selenic.com>
parents: 8196
diff changeset
101 self.debugflag = self.configbool('ui', 'debug')
d94f17c27505 ui: simplify fixconfig
Matt Mackall <mpm@selenic.com>
parents: 8196
diff changeset
102 self.verbose = self.debugflag or self.configbool('ui', 'verbose')
d94f17c27505 ui: simplify fixconfig
Matt Mackall <mpm@selenic.com>
parents: 8196
diff changeset
103 self.quiet = not self.debugflag and self.configbool('ui', 'quiet')
d94f17c27505 ui: simplify fixconfig
Matt Mackall <mpm@selenic.com>
parents: 8196
diff changeset
104 if self.verbose and self.quiet:
d94f17c27505 ui: simplify fixconfig
Matt Mackall <mpm@selenic.com>
parents: 8196
diff changeset
105 self.quiet = self.verbose = False
8204
797586be575d ui: report_untrusted fixes
Matt Mackall <mpm@selenic.com>
parents: 8203
diff changeset
106 self._reportuntrusted = self.configbool("ui", "report_untrusted", True)
9851
9e7b2c49d25d Make it possible to debug failed hook imports via use of --traceback
Bryan O'Sullivan <bos@serpentine.com>
parents: 9786
diff changeset
107 self.tracebackflag = self.configbool('ui', 'traceback', False)
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
108
3551
3b07e223534b Only read .hg/hgrc files from trusted users/groups
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 3489
diff changeset
109 # update trust information
8478
d728f126c1b7 ui: use set instead of dict
Martin Geisler <mg@lazybytes.net>
parents: 8409
diff changeset
110 self._trustusers.update(self.configlist('trusted', 'users'))
d728f126c1b7 ui: use set instead of dict
Martin Geisler <mg@lazybytes.net>
parents: 8409
diff changeset
111 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
112
3344
d9b3d3d34749 ui.py: change the overlay from a dict to a SafeConfigParser.
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 3343
diff changeset
113 def setconfig(self, section, name, value):
8203
3377fa11af67 ui: privatize cdata vars
Matt Mackall <mpm@selenic.com>
parents: 8202
diff changeset
114 for cfg in (self._ocfg, self._tcfg, self._ucfg):
3377fa11af67 ui: privatize cdata vars
Matt Mackall <mpm@selenic.com>
parents: 8202
diff changeset
115 cfg.set(section, name, value)
8197
d94f17c27505 ui: simplify fixconfig
Matt Mackall <mpm@selenic.com>
parents: 8196
diff changeset
116 self.fixconfig()
960
abfb5cc97fcd Add ui.setconfig overlay
mpm@selenic.com
parents: 953
diff changeset
117
8199
e9f90e5989d9 ui: _get_cdata -> _data
Matt Mackall <mpm@selenic.com>
parents: 8198
diff changeset
118 def _data(self, untrusted):
8203
3377fa11af67 ui: privatize cdata vars
Matt Mackall <mpm@selenic.com>
parents: 8202
diff changeset
119 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
120
8182
b97abc7c1135 showconfig: show source file and line with --debug
Matt Mackall <mpm@selenic.com>
parents: 8175
diff changeset
121 def configsource(self, section, name, untrusted=False):
8199
e9f90e5989d9 ui: _get_cdata -> _data
Matt Mackall <mpm@selenic.com>
parents: 8198
diff changeset
122 return self._data(untrusted).source(section, name) or 'none'
8182
b97abc7c1135 showconfig: show source file and line with --debug
Matt Mackall <mpm@selenic.com>
parents: 8175
diff changeset
123
8144
fca54469480e ui: introduce new config parser
Matt Mackall <mpm@selenic.com>
parents: 8143
diff changeset
124 def config(self, section, name, default=None, untrusted=False):
8199
e9f90e5989d9 ui: _get_cdata -> _data
Matt Mackall <mpm@selenic.com>
parents: 8198
diff changeset
125 value = self._data(untrusted).get(section, name, default)
8204
797586be575d ui: report_untrusted fixes
Matt Mackall <mpm@selenic.com>
parents: 8203
diff changeset
126 if self.debugflag and not untrusted and self._reportuntrusted:
8203
3377fa11af67 ui: privatize cdata vars
Matt Mackall <mpm@selenic.com>
parents: 8202
diff changeset
127 uvalue = self._ucfg.get(section, name)
3552
9b52239dc740 save settings from untrusted config files in a separate configparser
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 3551
diff changeset
128 if uvalue is not None and uvalue != value:
8204
797586be575d ui: report_untrusted fixes
Matt Mackall <mpm@selenic.com>
parents: 8203
diff changeset
129 self.debug(_("ignoring untrusted configuration option "
8222
d30a21594812 more whitespace cleanup and some other style nits
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 8220
diff changeset
130 "%s.%s = %s\n") % (section, name, 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
131 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
132
3552
9b52239dc740 save settings from untrusted config files in a separate configparser
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 3551
diff changeset
133 def configbool(self, section, name, default=False, untrusted=False):
8144
fca54469480e ui: introduce new config parser
Matt Mackall <mpm@selenic.com>
parents: 8143
diff changeset
134 v = self.config(section, name, None, untrusted)
8527
f9a80054dd3c use 'x is None' instead of 'x == None'
Martin Geisler <mg@lazybytes.net>
parents: 8478
diff changeset
135 if v is None:
8144
fca54469480e ui: introduce new config parser
Matt Mackall <mpm@selenic.com>
parents: 8143
diff changeset
136 return default
10243
cd3e5c47d663 ui: just return it if it's already a bool
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 10220
diff changeset
137 if isinstance(v, bool):
cd3e5c47d663 ui: just return it if it's already a bool
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 10220
diff changeset
138 return v
8144
fca54469480e ui: introduce new config parser
Matt Mackall <mpm@selenic.com>
parents: 8143
diff changeset
139 if v.lower() not in _booleans:
fca54469480e ui: introduce new config parser
Matt Mackall <mpm@selenic.com>
parents: 8143
diff changeset
140 raise error.ConfigError(_("%s.%s not a boolean ('%s')")
fca54469480e ui: introduce new config parser
Matt Mackall <mpm@selenic.com>
parents: 8143
diff changeset
141 % (section, name, v))
fca54469480e ui: introduce new config parser
Matt Mackall <mpm@selenic.com>
parents: 8143
diff changeset
142 return _booleans[v.lower()]
3552
9b52239dc740 save settings from untrusted config files in a separate configparser
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 3551
diff changeset
143
9b52239dc740 save settings from untrusted config files in a separate configparser
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 3551
diff changeset
144 def configlist(self, section, name, default=None, untrusted=False):
2499
894435215344 Added ui.configlist method to get comma/space separated lists of strings.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 2498
diff changeset
145 """Return a list of comma/space separated strings"""
3552
9b52239dc740 save settings from untrusted config files in a separate configparser
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 3551
diff changeset
146 result = self.config(section, name, untrusted=untrusted)
2499
894435215344 Added ui.configlist method to get comma/space separated lists of strings.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 2498
diff changeset
147 if result is None:
2502
18cf95ad3666 Allow using default values with ui.configlist, too, and add a test for this.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 2499
diff changeset
148 result = default or []
18cf95ad3666 Allow using default values with ui.configlist, too, and add a test for this.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 2499
diff changeset
149 if isinstance(result, basestring):
18cf95ad3666 Allow using default values with ui.configlist, too, and add a test for this.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 2499
diff changeset
150 result = result.replace(",", " ").split()
18cf95ad3666 Allow using default values with ui.configlist, too, and add a test for this.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 2499
diff changeset
151 return result
2499
894435215344 Added ui.configlist method to get comma/space separated lists of strings.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 2498
diff changeset
152
4487
1b5b98837bb5 ui: Rename has_config to has_section.
Bryan O'Sullivan <bos@serpentine.com>
parents: 4258
diff changeset
153 def has_section(self, section, untrusted=False):
2343
af81d8770620 add ui.has_config method.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2335
diff changeset
154 '''tell whether section exists in config.'''
8199
e9f90e5989d9 ui: _get_cdata -> _data
Matt Mackall <mpm@selenic.com>
parents: 8198
diff changeset
155 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
156
9b52239dc740 save settings from untrusted config files in a separate configparser
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 3551
diff changeset
157 def configitems(self, section, untrusted=False):
8199
e9f90e5989d9 ui: _get_cdata -> _data
Matt Mackall <mpm@selenic.com>
parents: 8198
diff changeset
158 items = self._data(untrusted).items(section)
8204
797586be575d ui: report_untrusted fixes
Matt Mackall <mpm@selenic.com>
parents: 8203
diff changeset
159 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
160 for k, v in self._ucfg.items(section):
8203
3377fa11af67 ui: privatize cdata vars
Matt Mackall <mpm@selenic.com>
parents: 8202
diff changeset
161 if self._tcfg.get(section, k) != v:
8204
797586be575d ui: report_untrusted fixes
Matt Mackall <mpm@selenic.com>
parents: 8203
diff changeset
162 self.debug(_("ignoring untrusted configuration option "
8144
fca54469480e ui: introduce new config parser
Matt Mackall <mpm@selenic.com>
parents: 8143
diff changeset
163 "%s.%s = %s\n") % (section, k, v))
fca54469480e ui: introduce new config parser
Matt Mackall <mpm@selenic.com>
parents: 8143
diff changeset
164 return items
285
5a1e6d27f399 ui: add configuration file support
mpm@selenic.com
parents: 249
diff changeset
165
3552
9b52239dc740 save settings from untrusted config files in a separate configparser
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 3551
diff changeset
166 def walkconfig(self, untrusted=False):
8203
3377fa11af67 ui: privatize cdata vars
Matt Mackall <mpm@selenic.com>
parents: 8202
diff changeset
167 cfg = self._data(untrusted)
3377fa11af67 ui: privatize cdata vars
Matt Mackall <mpm@selenic.com>
parents: 8202
diff changeset
168 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
169 for name, value in self.configitems(section, untrusted):
4085
719488a98ebe Fix hg showconfig traceback with values that aren't strings
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 4045
diff changeset
170 yield section, name, str(value).replace('\n', '\\n')
1028
25e7ea0f2cff Add commands.debugconfig.
Bryan O'Sullivan <bos@serpentine.com>
parents: 981
diff changeset
171
608
d2994b5298fb Add username/merge/editor to .hgrc
Matt Mackall <mpm@selenic.com>
parents: 565
diff changeset
172 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
173 """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
174
c577689006fa Adapted behaviour of ui.username() to documentation and mention it explicitly:
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1984
diff changeset
175 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
176 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
177 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
178 ($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
179 """
c577689006fa Adapted behaviour of ui.username() to documentation and mention it explicitly:
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1984
diff changeset
180 user = os.environ.get("HGUSER")
c577689006fa Adapted behaviour of ui.username() to documentation and mention it explicitly:
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1984
diff changeset
181 if user is None:
c577689006fa Adapted behaviour of ui.username() to documentation and mention it explicitly:
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1984
diff changeset
182 user = self.config("ui", "username")
c577689006fa Adapted behaviour of ui.username() to documentation and mention it explicitly:
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1984
diff changeset
183 if user is None:
c577689006fa Adapted behaviour of ui.username() to documentation and mention it explicitly:
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1984
diff changeset
184 user = os.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
185 if user is None and self.configbool("ui", "askusername"):
7600
f7739cf3833c lowercase prompts
Martin Geisler <mg@daimi.au.dk>
parents: 7497
diff changeset
186 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
187 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
188 try:
98f2507c5551 only print a warning when no username is specified
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 3678
diff changeset
189 user = '%s@%s' % (util.getuser(), socket.getfqdn())
4044
78a0dd93db0b Abort on empty username so specifying a username can be forced.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 3984
diff changeset
190 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
191 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
192 pass
78a0dd93db0b Abort on empty username so specifying a username can be forced.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 3984
diff changeset
193 if not user:
9786
951730b2b8ba ui: refer to "hg help config" when no username is set
Martin Geisler <mg@lazybytes.net>
parents: 9749
diff changeset
194 raise util.Abort(_('no username supplied (see "hg help config")'))
6351
eed0a6a05096 ui: disallow newlines in usernames (issue1034)
Matt Mackall <mpm@selenic.com>
parents: 6333
diff changeset
195 if "\n" in user:
7470
1d58c0491d5e use repr() instead of backticks
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 7320
diff changeset
196 raise util.Abort(_("username %s contains a newline\n") % 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
197 return user
608
d2994b5298fb Add username/merge/editor to .hgrc
Matt Mackall <mpm@selenic.com>
parents: 565
diff changeset
198
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
199 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
200 """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
201 if not self.verbose:
08a0f04b56bd many, many trivial check-code fixups
Matt Mackall <mpm@selenic.com>
parents: 10264
diff changeset
202 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
203 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
204
8196
b7c85a809a54 ui: fix-up and warn about deprecated %%
Matt Mackall <mpm@selenic.com>
parents: 8193
diff changeset
205 def _path(self, loc):
b7c85a809a54 ui: fix-up and warn about deprecated %%
Matt Mackall <mpm@selenic.com>
parents: 8193
diff changeset
206 p = self.config('paths', loc)
9610
d78fe60f6bda make path expanding more consistent
Alexander Solovyov <piranha@piranha.org.ua>
parents: 9436
diff changeset
207 if p:
d78fe60f6bda make path expanding more consistent
Alexander Solovyov <piranha@piranha.org.ua>
parents: 9436
diff changeset
208 if '%%' in p:
d78fe60f6bda make path expanding more consistent
Alexander Solovyov <piranha@piranha.org.ua>
parents: 9436
diff changeset
209 self.warn("(deprecated '%%' in path %s=%s from %s)\n" %
d78fe60f6bda make path expanding more consistent
Alexander Solovyov <piranha@piranha.org.ua>
parents: 9436
diff changeset
210 (loc, p, self.configsource('paths', loc)))
d78fe60f6bda make path expanding more consistent
Alexander Solovyov <piranha@piranha.org.ua>
parents: 9436
diff changeset
211 p = p.replace('%%', '%')
d78fe60f6bda make path expanding more consistent
Alexander Solovyov <piranha@piranha.org.ua>
parents: 9436
diff changeset
212 p = util.expandpath(p)
8196
b7c85a809a54 ui: fix-up and warn about deprecated %%
Matt Mackall <mpm@selenic.com>
parents: 8193
diff changeset
213 return p
b7c85a809a54 ui: fix-up and warn about deprecated %%
Matt Mackall <mpm@selenic.com>
parents: 8193
diff changeset
214
2494
73ac95671788 push, outgoing, bundle: fall back to "default" if "default-push" not defined
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2470
diff changeset
215 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
216 """Return repository location relative to cwd or from [paths]"""
4216
76d541c6f3c0 Only hg repositories override [paths], not simple directories (fixes issue510)
Thomas Arendsen Hein <thomas@intevation.de>
parents: 4044
diff changeset
217 if "://" in loc or os.path.isdir(os.path.join(loc, '.hg')):
1892
622ee75cb4c9 Directory names take precedence over symbolic names consistently.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1882
diff changeset
218 return loc
622ee75cb4c9 Directory names take precedence over symbolic names consistently.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1882
diff changeset
219
8196
b7c85a809a54 ui: fix-up and warn about deprecated %%
Matt Mackall <mpm@selenic.com>
parents: 8193
diff changeset
220 path = self._path(loc)
2495
4a2a4d988ead make ui.expandpath better with default path.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2494
diff changeset
221 if not path and default is not None:
8196
b7c85a809a54 ui: fix-up and warn about deprecated %%
Matt Mackall <mpm@selenic.com>
parents: 8193
diff changeset
222 path = self._path(default)
2498
1e2ec4fd16df Fix ui.expandpath problem and broken test introduced by 4a2a4d988ead.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 2495
diff changeset
223 return path or loc
506
1f81ebff98c9 [PATCH] Add ui.expandpath command
mpm@selenic.com
parents: 350
diff changeset
224
3737
9f5c46c50118 add a simple nested buffering scheme to ui
Matt Mackall <mpm@selenic.com>
parents: 3721
diff changeset
225 def pushbuffer(self):
8202
4746113269c7 ui: buffers -> _buffers
Matt Mackall <mpm@selenic.com>
parents: 8201
diff changeset
226 self._buffers.append([])
3737
9f5c46c50118 add a simple nested buffering scheme to ui
Matt Mackall <mpm@selenic.com>
parents: 3721
diff changeset
227
9f5c46c50118 add a simple nested buffering scheme to ui
Matt Mackall <mpm@selenic.com>
parents: 3721
diff changeset
228 def popbuffer(self):
8202
4746113269c7 ui: buffers -> _buffers
Matt Mackall <mpm@selenic.com>
parents: 8201
diff changeset
229 return "".join(self._buffers.pop())
3737
9f5c46c50118 add a simple nested buffering scheme to ui
Matt Mackall <mpm@selenic.com>
parents: 3721
diff changeset
230
207
ec327cf0d3a9 Move ui class to its own module
mpm@selenic.com
parents:
diff changeset
231 def write(self, *args):
8202
4746113269c7 ui: buffers -> _buffers
Matt Mackall <mpm@selenic.com>
parents: 8201
diff changeset
232 if self._buffers:
4746113269c7 ui: buffers -> _buffers
Matt Mackall <mpm@selenic.com>
parents: 8201
diff changeset
233 self._buffers[-1].extend([str(a) for a in args])
3737
9f5c46c50118 add a simple nested buffering scheme to ui
Matt Mackall <mpm@selenic.com>
parents: 3721
diff changeset
234 else:
9f5c46c50118 add a simple nested buffering scheme to ui
Matt Mackall <mpm@selenic.com>
parents: 3721
diff changeset
235 for a in args:
9f5c46c50118 add a simple nested buffering scheme to ui
Matt Mackall <mpm@selenic.com>
parents: 3721
diff changeset
236 sys.stdout.write(str(a))
565
9a80418646dd [PATCH] Make ui.warn write to stderr
mpm@selenic.com
parents: 515
diff changeset
237
9a80418646dd [PATCH] Make ui.warn write to stderr
mpm@selenic.com
parents: 515
diff changeset
238 def write_err(self, *args):
1989
0541768fa558 ignore EPIPE in ui.err_write
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 1985
diff changeset
239 try:
10421
452b6195e94c ui: look before you leap on sys.stderr.closed (and look nicer)
Thomas Arendsen Hein <thomas@intevation.de>
parents: 10383
diff changeset
240 if not getattr(sys.stdout, 'closed', False):
10282
08a0f04b56bd many, many trivial check-code fixups
Matt Mackall <mpm@selenic.com>
parents: 10264
diff changeset
241 sys.stdout.flush()
1989
0541768fa558 ignore EPIPE in ui.err_write
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 1985
diff changeset
242 for a in args:
0541768fa558 ignore EPIPE in ui.err_write
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 1985
diff changeset
243 sys.stderr.write(str(a))
4023
6ea8a3b805ee Flush stderr after write.
Patrick Mezard <pmezard@gmail.com>
parents: 3989
diff changeset
244 # stderr may be buffered under win32 when redirected to files,
6ea8a3b805ee Flush stderr after write.
Patrick Mezard <pmezard@gmail.com>
parents: 3989
diff changeset
245 # including stdout.
10421
452b6195e94c ui: look before you leap on sys.stderr.closed (and look nicer)
Thomas Arendsen Hein <thomas@intevation.de>
parents: 10383
diff changeset
246 if not getattr(sys.stderr, 'closed', False):
10282
08a0f04b56bd many, many trivial check-code fixups
Matt Mackall <mpm@selenic.com>
parents: 10264
diff changeset
247 sys.stderr.flush()
1989
0541768fa558 ignore EPIPE in ui.err_write
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 1985
diff changeset
248 except IOError, inst:
0541768fa558 ignore EPIPE in ui.err_write
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 1985
diff changeset
249 if inst.errno != errno.EPIPE:
0541768fa558 ignore EPIPE in ui.err_write
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 1985
diff changeset
250 raise
565
9a80418646dd [PATCH] Make ui.warn write to stderr
mpm@selenic.com
parents: 515
diff changeset
251
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
252 def flush(self):
2013
65634e1038dd Fix error on Windows if "hg log | more" exits.
Eung-Ju Park <eungju@gmail.com>
parents: 2003
diff changeset
253 try: sys.stdout.flush()
65634e1038dd Fix error on Windows if "hg log | more" exits.
Eung-Ju Park <eungju@gmail.com>
parents: 2003
diff changeset
254 except: pass
65634e1038dd Fix error on Windows if "hg log | more" exits.
Eung-Ju Park <eungju@gmail.com>
parents: 2003
diff changeset
255 try: sys.stderr.flush()
65634e1038dd Fix error on Windows if "hg log | more" exits.
Eung-Ju Park <eungju@gmail.com>
parents: 2003
diff changeset
256 except: pass
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
257
8208
32a2a1e244f1 ui: make interactive a method
Matt Mackall <mpm@selenic.com>
parents: 8206
diff changeset
258 def interactive(self):
8538
6419bc7b3d9c ui: honor interactive=off even if isatty()
Patrick Mezard <pmezard@gmail.com>
parents: 8527
diff changeset
259 i = self.configbool("ui", "interactive", None)
6419bc7b3d9c ui: honor interactive=off even if isatty()
Patrick Mezard <pmezard@gmail.com>
parents: 8527
diff changeset
260 if i is None:
10077
89617aacb495 make ui.interactive() return false in case stdin lacks isatty
Ronny Pfannschmidt <Ronny.Pfannschmidt@gmx.de>
parents: 9887
diff changeset
261 try:
89617aacb495 make ui.interactive() return false in case stdin lacks isatty
Ronny Pfannschmidt <Ronny.Pfannschmidt@gmx.de>
parents: 9887
diff changeset
262 return sys.stdin.isatty()
89617aacb495 make ui.interactive() return false in case stdin lacks isatty
Ronny Pfannschmidt <Ronny.Pfannschmidt@gmx.de>
parents: 9887
diff changeset
263 except AttributeError:
89617aacb495 make ui.interactive() return false in case stdin lacks isatty
Ronny Pfannschmidt <Ronny.Pfannschmidt@gmx.de>
parents: 9887
diff changeset
264 # some environments replace stdin without implementing isatty
89617aacb495 make ui.interactive() return false in case stdin lacks isatty
Ronny Pfannschmidt <Ronny.Pfannschmidt@gmx.de>
parents: 9887
diff changeset
265 # usually those are non-interactive
89617aacb495 make ui.interactive() return false in case stdin lacks isatty
Ronny Pfannschmidt <Ronny.Pfannschmidt@gmx.de>
parents: 9887
diff changeset
266 return False
89617aacb495 make ui.interactive() return false in case stdin lacks isatty
Ronny Pfannschmidt <Ronny.Pfannschmidt@gmx.de>
parents: 9887
diff changeset
267
8538
6419bc7b3d9c ui: honor interactive=off even if isatty()
Patrick Mezard <pmezard@gmail.com>
parents: 8527
diff changeset
268 return i
8208
32a2a1e244f1 ui: make interactive a method
Matt Mackall <mpm@selenic.com>
parents: 8206
diff changeset
269
5337
8c5ef3b87cb1 Don't try to determine interactivity if ui() called with interactive=False.
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 5154
diff changeset
270 def _readline(self, prompt=''):
8208
32a2a1e244f1 ui: make interactive a method
Matt Mackall <mpm@selenic.com>
parents: 8206
diff changeset
271 if sys.stdin.isatty():
5036
ca0d02222d6a ui: get readline and prompt to behave better depending on interactivity
Bryan O'Sullivan <bos@serpentine.com>
parents: 4729
diff changeset
272 try:
ca0d02222d6a ui: get readline and prompt to behave better depending on interactivity
Bryan O'Sullivan <bos@serpentine.com>
parents: 4729
diff changeset
273 # 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
274 # available
ca0d02222d6a ui: get readline and prompt to behave better depending on interactivity
Bryan O'Sullivan <bos@serpentine.com>
parents: 4729
diff changeset
275 import readline
ca0d02222d6a ui: get readline and prompt to behave better depending on interactivity
Bryan O'Sullivan <bos@serpentine.com>
parents: 4729
diff changeset
276 # 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
277 readline.read_history_file
7496
0a27d0db256d issue1419: catch strange readline import error on windows
Brendan Cully <brendan@kublai.com>
parents: 7320
diff changeset
278 # 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
279 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
280 pass
5613
2e76e5a23c2b workaround for raw_input() on Windows
Steve Borho <steve@borho.org>
parents: 5337
diff changeset
281 line = raw_input(prompt)
2e76e5a23c2b workaround for raw_input() on Windows
Steve Borho <steve@borho.org>
parents: 5337
diff changeset
282 # 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
283 # raw_input() to emit an extra trailing carriage return
2e76e5a23c2b workaround for raw_input() on Windows
Steve Borho <steve@borho.org>
parents: 5337
diff changeset
284 if os.linesep == '\r\n' and line and line[-1] == '\r':
2e76e5a23c2b workaround for raw_input() on Windows
Steve Borho <steve@borho.org>
parents: 5337
diff changeset
285 line = line[:-1]
2e76e5a23c2b workaround for raw_input() on Windows
Steve Borho <steve@borho.org>
parents: 5337
diff changeset
286 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
287
9048
86b4a9b0ddda ui: extract choice from prompt
Simon Heimberg <simohe@besonet.ch>
parents: 8940
diff changeset
288 def prompt(self, msg, default="y"):
86b4a9b0ddda ui: extract choice from prompt
Simon Heimberg <simohe@besonet.ch>
parents: 8940
diff changeset
289 """Prompt user with msg, read response.
86b4a9b0ddda ui: extract choice from prompt
Simon Heimberg <simohe@besonet.ch>
parents: 8940
diff changeset
290 If ui is not interactive, the default is returned.
5751
bc475d1f74ca prompt: kill matchflags
Kirill Smelkov <kirr@mns.spb.ru>
parents: 5709
diff changeset
291 """
8208
32a2a1e244f1 ui: make interactive a method
Matt Mackall <mpm@selenic.com>
parents: 8206
diff changeset
292 if not self.interactive():
8940
01ada7b1861d ui.prompt: Show prompt and selection in non-interactive mode
Mads Kiilerich <mads@kiilerich.com>
parents: 8657
diff changeset
293 self.write(msg, ' ', default, "\n")
7320
8dca507e56ce ui: log non-interactive default response to stdout when verbose
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 6862
diff changeset
294 return default
9048
86b4a9b0ddda ui: extract choice from prompt
Simon Heimberg <simohe@besonet.ch>
parents: 8940
diff changeset
295 try:
86b4a9b0ddda ui: extract choice from prompt
Simon Heimberg <simohe@besonet.ch>
parents: 8940
diff changeset
296 r = self._readline(msg + ' ')
86b4a9b0ddda ui: extract choice from prompt
Simon Heimberg <simohe@besonet.ch>
parents: 8940
diff changeset
297 if not r:
86b4a9b0ddda ui: extract choice from prompt
Simon Heimberg <simohe@besonet.ch>
parents: 8940
diff changeset
298 return default
86b4a9b0ddda ui: extract choice from prompt
Simon Heimberg <simohe@besonet.ch>
parents: 8940
diff changeset
299 return r
86b4a9b0ddda ui: extract choice from prompt
Simon Heimberg <simohe@besonet.ch>
parents: 8940
diff changeset
300 except EOFError:
86b4a9b0ddda ui: extract choice from prompt
Simon Heimberg <simohe@besonet.ch>
parents: 8940
diff changeset
301 raise util.Abort(_('response expected'))
86b4a9b0ddda ui: extract choice from prompt
Simon Heimberg <simohe@besonet.ch>
parents: 8940
diff changeset
302
86b4a9b0ddda ui: extract choice from prompt
Simon Heimberg <simohe@besonet.ch>
parents: 8940
diff changeset
303 def promptchoice(self, msg, choices, default=0):
86b4a9b0ddda ui: extract choice from prompt
Simon Heimberg <simohe@besonet.ch>
parents: 8940
diff changeset
304 """Prompt user with msg, read response, and ensure it matches
86b4a9b0ddda ui: extract choice from prompt
Simon Heimberg <simohe@besonet.ch>
parents: 8940
diff changeset
305 one of the provided choices. The index of the choice is returned.
86b4a9b0ddda ui: extract choice from prompt
Simon Heimberg <simohe@besonet.ch>
parents: 8940
diff changeset
306 choices is a sequence of acceptable responses with the format:
9312
c5f0825c1dbb kill trailing whitespace
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 9153
diff changeset
307 ('&None', 'E&xec', 'Sym&link') Responses are case insensitive.
9048
86b4a9b0ddda ui: extract choice from prompt
Simon Heimberg <simohe@besonet.ch>
parents: 8940
diff changeset
308 If ui is not interactive, the default is returned.
86b4a9b0ddda ui: extract choice from prompt
Simon Heimberg <simohe@besonet.ch>
parents: 8940
diff changeset
309 """
86b4a9b0ddda ui: extract choice from prompt
Simon Heimberg <simohe@besonet.ch>
parents: 8940
diff changeset
310 resps = [s[s.index('&')+1].lower() for s in choices]
5671
b5605d88dc27 Make ui.prompt repeat on "unrecognized response" again (issue897)
Thomas Arendsen Hein <thomas@intevation.de>
parents: 5337
diff changeset
311 while True:
9048
86b4a9b0ddda ui: extract choice from prompt
Simon Heimberg <simohe@besonet.ch>
parents: 8940
diff changeset
312 r = self.prompt(msg, resps[default])
86b4a9b0ddda ui: extract choice from prompt
Simon Heimberg <simohe@besonet.ch>
parents: 8940
diff changeset
313 if r.lower() in resps:
86b4a9b0ddda ui: extract choice from prompt
Simon Heimberg <simohe@besonet.ch>
parents: 8940
diff changeset
314 return resps.index(r.lower())
86b4a9b0ddda ui: extract choice from prompt
Simon Heimberg <simohe@besonet.ch>
parents: 8940
diff changeset
315 self.write(_("unrecognized response\n"))
86b4a9b0ddda ui: extract choice from prompt
Simon Heimberg <simohe@besonet.ch>
parents: 8940
diff changeset
316
2281
7761597b5da3 prompt user for http authentication info
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2206
diff changeset
317 def getpass(self, prompt=None, default=None):
10282
08a0f04b56bd many, many trivial check-code fixups
Matt Mackall <mpm@selenic.com>
parents: 10264
diff changeset
318 if not self.interactive():
08a0f04b56bd many, many trivial check-code fixups
Matt Mackall <mpm@selenic.com>
parents: 10264
diff changeset
319 return default
7798
57fee79e5588 catch CTRL-D at password prompt
Steve Borho <steve@borho.org>
parents: 7600
diff changeset
320 try:
57fee79e5588 catch CTRL-D at password prompt
Steve Borho <steve@borho.org>
parents: 7600
diff changeset
321 return getpass.getpass(prompt or _('password: '))
57fee79e5588 catch CTRL-D at password prompt
Steve Borho <steve@borho.org>
parents: 7600
diff changeset
322 except EOFError:
57fee79e5588 catch CTRL-D at password prompt
Steve Borho <steve@borho.org>
parents: 7600
diff changeset
323 raise util.Abort(_('response expected'))
207
ec327cf0d3a9 Move ui class to its own module
mpm@selenic.com
parents:
diff changeset
324 def status(self, *msg):
10282
08a0f04b56bd many, many trivial check-code fixups
Matt Mackall <mpm@selenic.com>
parents: 10264
diff changeset
325 if not self.quiet:
08a0f04b56bd many, many trivial check-code fixups
Matt Mackall <mpm@selenic.com>
parents: 10264
diff changeset
326 self.write(*msg)
234
3427806d5ab9 ui.warn can use more than one argument like the other ui methods.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 207
diff changeset
327 def warn(self, *msg):
565
9a80418646dd [PATCH] Make ui.warn write to stderr
mpm@selenic.com
parents: 515
diff changeset
328 self.write_err(*msg)
207
ec327cf0d3a9 Move ui class to its own module
mpm@selenic.com
parents:
diff changeset
329 def note(self, *msg):
10282
08a0f04b56bd many, many trivial check-code fixups
Matt Mackall <mpm@selenic.com>
parents: 10264
diff changeset
330 if self.verbose:
08a0f04b56bd many, many trivial check-code fixups
Matt Mackall <mpm@selenic.com>
parents: 10264
diff changeset
331 self.write(*msg)
207
ec327cf0d3a9 Move ui class to its own module
mpm@selenic.com
parents:
diff changeset
332 def debug(self, *msg):
10282
08a0f04b56bd many, many trivial check-code fixups
Matt Mackall <mpm@selenic.com>
parents: 10264
diff changeset
333 if self.debugflag:
08a0f04b56bd many, many trivial check-code fixups
Matt Mackall <mpm@selenic.com>
parents: 10264
diff changeset
334 self.write(*msg)
1983
ae12a81549a7 Pass correct username as $HGUSER to hgeditor if "commit -u" is used.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1951
diff changeset
335 def edit(self, text, user):
2206
c74e91e81f70 Use text rather than binary mode for editing commit messages
Stephen Darnell <stephen@darnell.plus.com>
parents: 2201
diff changeset
336 (fd, name) = tempfile.mkstemp(prefix="hg-editor-", suffix=".txt",
c74e91e81f70 Use text rather than binary mode for editing commit messages
Stephen Darnell <stephen@darnell.plus.com>
parents: 2201
diff changeset
337 text=True)
1984
df7436f439a0 Improved ui.edit():
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1983
diff changeset
338 try:
df7436f439a0 Improved ui.edit():
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1983
diff changeset
339 f = os.fdopen(fd, "w")
df7436f439a0 Improved ui.edit():
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1983
diff changeset
340 f.write(text)
df7436f439a0 Improved ui.edit():
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1983
diff changeset
341 f.close()
df7436f439a0 Improved ui.edit():
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1983
diff changeset
342
5660
3c80ecdc1bcd Use VISUAL in addition to EDITOR when choosing the editor to use.
Osku Salerma <osku@iki.fi>
parents: 5613
diff changeset
343 editor = self.geteditor()
207
ec327cf0d3a9 Move ui class to its own module
mpm@selenic.com
parents:
diff changeset
344
1984
df7436f439a0 Improved ui.edit():
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1983
diff changeset
345 util.system("%s \"%s\"" % (editor, name),
df7436f439a0 Improved ui.edit():
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1983
diff changeset
346 environ={'HGUSER': user},
df7436f439a0 Improved ui.edit():
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1983
diff changeset
347 onerr=util.Abort, errprefix=_("edit failed"))
608
d2994b5298fb Add username/merge/editor to .hgrc
Matt Mackall <mpm@selenic.com>
parents: 565
diff changeset
348
1984
df7436f439a0 Improved ui.edit():
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1983
diff changeset
349 f = open(name)
df7436f439a0 Improved ui.edit():
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1983
diff changeset
350 t = f.read()
df7436f439a0 Improved ui.edit():
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1983
diff changeset
351 f.close()
df7436f439a0 Improved ui.edit():
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1983
diff changeset
352 finally:
df7436f439a0 Improved ui.edit():
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1983
diff changeset
353 os.unlink(name)
662
b55a78595ef6 Pass username to hgeditor, remove temporary file
Radoslaw "AstralStorm" Szkodzinski <astralstorm@gorzow.mm.pl>
parents: 613
diff changeset
354
207
ec327cf0d3a9 Move ui class to its own module
mpm@selenic.com
parents:
diff changeset
355 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
356
9851
9e7b2c49d25d Make it possible to debug failed hook imports via use of --traceback
Bryan O'Sullivan <bos@serpentine.com>
parents: 9786
diff changeset
357 def traceback(self, exc=None):
2335
f0680b2d1d64 add ui.print_exc(), make all traceback printing central.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2293
diff changeset
358 '''print exception traceback if traceback printing enabled.
f0680b2d1d64 add ui.print_exc(), make all traceback printing central.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2293
diff changeset
359 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
360 printed.'''
9851
9e7b2c49d25d Make it possible to debug failed hook imports via use of --traceback
Bryan O'Sullivan <bos@serpentine.com>
parents: 9786
diff changeset
361 if self.tracebackflag:
9e7b2c49d25d Make it possible to debug failed hook imports via use of --traceback
Bryan O'Sullivan <bos@serpentine.com>
parents: 9786
diff changeset
362 if exc:
9e7b2c49d25d Make it possible to debug failed hook imports via use of --traceback
Bryan O'Sullivan <bos@serpentine.com>
parents: 9786
diff changeset
363 traceback.print_exception(exc[0], exc[1], exc[2])
9e7b2c49d25d Make it possible to debug failed hook imports via use of --traceback
Bryan O'Sullivan <bos@serpentine.com>
parents: 9786
diff changeset
364 else:
9e7b2c49d25d Make it possible to debug failed hook imports via use of --traceback
Bryan O'Sullivan <bos@serpentine.com>
parents: 9786
diff changeset
365 traceback.print_exc()
9e7b2c49d25d Make it possible to debug failed hook imports via use of --traceback
Bryan O'Sullivan <bos@serpentine.com>
parents: 9786
diff changeset
366 return self.tracebackflag
5660
3c80ecdc1bcd Use VISUAL in addition to EDITOR when choosing the editor to use.
Osku Salerma <osku@iki.fi>
parents: 5613
diff changeset
367
3c80ecdc1bcd Use VISUAL in addition to EDITOR when choosing the editor to use.
Osku Salerma <osku@iki.fi>
parents: 5613
diff changeset
368 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
369 '''return editor to use'''
3c80ecdc1bcd Use VISUAL in addition to EDITOR when choosing the editor to use.
Osku Salerma <osku@iki.fi>
parents: 5613
diff changeset
370 return (os.environ.get("HGEDITOR") or
3c80ecdc1bcd Use VISUAL in addition to EDITOR when choosing the editor to use.
Osku Salerma <osku@iki.fi>
parents: 5613
diff changeset
371 self.config("ui", "editor") or
3c80ecdc1bcd Use VISUAL in addition to EDITOR when choosing the editor to use.
Osku Salerma <osku@iki.fi>
parents: 5613
diff changeset
372 os.environ.get("VISUAL") or
3c80ecdc1bcd Use VISUAL in addition to EDITOR when choosing the editor to use.
Osku Salerma <osku@iki.fi>
parents: 5613
diff changeset
373 os.environ.get("EDITOR", "vi"))
9153
6adc899c98d0 Add ui.progress API
Matt Mackall <mpm@selenic.com>
parents: 9048
diff changeset
374
6adc899c98d0 Add ui.progress API
Matt Mackall <mpm@selenic.com>
parents: 9048
diff changeset
375 def progress(self, topic, pos, item="", unit="", total=None):
6adc899c98d0 Add ui.progress API
Matt Mackall <mpm@selenic.com>
parents: 9048
diff changeset
376 '''show a progress message
6adc899c98d0 Add ui.progress API
Matt Mackall <mpm@selenic.com>
parents: 9048
diff changeset
377
6adc899c98d0 Add ui.progress API
Matt Mackall <mpm@selenic.com>
parents: 9048
diff changeset
378 With stock hg, this is simply a debug message that is hidden
6adc899c98d0 Add ui.progress API
Matt Mackall <mpm@selenic.com>
parents: 9048
diff changeset
379 by default, but with extensions or GUI tools it may be
6adc899c98d0 Add ui.progress API
Matt Mackall <mpm@selenic.com>
parents: 9048
diff changeset
380 visible. 'topic' is the current operation, 'item' is a
6adc899c98d0 Add ui.progress API
Matt Mackall <mpm@selenic.com>
parents: 9048
diff changeset
381 non-numeric marker of the current position (ie the currently
6adc899c98d0 Add ui.progress API
Matt Mackall <mpm@selenic.com>
parents: 9048
diff changeset
382 in-process file), 'pos' is the current numeric position (ie
9398
3fb8c6dbeeec ui: fix NameError in ui.progress due to unit/units typo
Brodie Rao <me+hg@dackz.net>
parents: 9312
diff changeset
383 revision, bytes, etc.), unit is a corresponding unit label,
9153
6adc899c98d0 Add ui.progress API
Matt Mackall <mpm@selenic.com>
parents: 9048
diff changeset
384 and total is the highest expected pos.
6adc899c98d0 Add ui.progress API
Matt Mackall <mpm@selenic.com>
parents: 9048
diff changeset
385
6adc899c98d0 Add ui.progress API
Matt Mackall <mpm@selenic.com>
parents: 9048
diff changeset
386 Multiple nested topics may be active at a time. All topics
6adc899c98d0 Add ui.progress API
Matt Mackall <mpm@selenic.com>
parents: 9048
diff changeset
387 should be marked closed by setting pos to None at termination.
6adc899c98d0 Add ui.progress API
Matt Mackall <mpm@selenic.com>
parents: 9048
diff changeset
388 '''
6adc899c98d0 Add ui.progress API
Matt Mackall <mpm@selenic.com>
parents: 9048
diff changeset
389
6adc899c98d0 Add ui.progress API
Matt Mackall <mpm@selenic.com>
parents: 9048
diff changeset
390 if pos == None or not self.debugflag:
6adc899c98d0 Add ui.progress API
Matt Mackall <mpm@selenic.com>
parents: 9048
diff changeset
391 return
6adc899c98d0 Add ui.progress API
Matt Mackall <mpm@selenic.com>
parents: 9048
diff changeset
392
9398
3fb8c6dbeeec ui: fix NameError in ui.progress due to unit/units typo
Brodie Rao <me+hg@dackz.net>
parents: 9312
diff changeset
393 if unit:
3fb8c6dbeeec ui: fix NameError in ui.progress due to unit/units typo
Brodie Rao <me+hg@dackz.net>
parents: 9312
diff changeset
394 unit = ' ' + unit
9153
6adc899c98d0 Add ui.progress API
Matt Mackall <mpm@selenic.com>
parents: 9048
diff changeset
395 if item:
6adc899c98d0 Add ui.progress API
Matt Mackall <mpm@selenic.com>
parents: 9048
diff changeset
396 item = ' ' + item
6adc899c98d0 Add ui.progress API
Matt Mackall <mpm@selenic.com>
parents: 9048
diff changeset
397
6adc899c98d0 Add ui.progress API
Matt Mackall <mpm@selenic.com>
parents: 9048
diff changeset
398 if total:
6adc899c98d0 Add ui.progress API
Matt Mackall <mpm@selenic.com>
parents: 9048
diff changeset
399 pct = 100.0 * pos / total
10220
500d09be7ace ui: display progress with decimal notation
Patrick Mezard <pmezard@gmail.com>
parents: 9851
diff changeset
400 self.debug('%s:%s %s/%s%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
401 % (topic, item, pos, total, unit, pct))
9153
6adc899c98d0 Add ui.progress API
Matt Mackall <mpm@selenic.com>
parents: 9048
diff changeset
402 else:
9749
1b1b33ae5a24 Related to Issue919: ui.progress, apparently unused before now, is busted.
Jesse Glick <jesse.glick@sun.com>
parents: 9613
diff changeset
403 self.debug('%s:%s %s%s\n' % (topic, item, pos, unit))