##// END OF EJS Templates
test-hgweb-commands: replace all "XX years ago" occurences
test-hgweb-commands: replace all "XX years ago" occurences

File last commit:

r5671:b5605d88 default
r5687:ca7af19d default
Show More
ui.py
472 lines | 17.4 KiB | text/x-python | PythonLexer
mpm@selenic.com
Move ui class to its own module...
r207 # ui.py - user interface bits for mercurial
#
Thomas Arendsen Hein
Updated copyright notices and add "and others" to "hg version"
r4635 # Copyright 2005-2007 Matt Mackall <mpm@selenic.com>
mpm@selenic.com
Move ui class to its own module...
r207 #
# This software may be used and distributed according to the terms
# of the GNU General Public License, incorporated herein by reference.
Matt Mackall
Simplify i18n imports
r3891 from i18n import _
Matt Mackall
Replace demandload with new demandimport
r3877 import errno, getpass, os, re, socket, sys, tempfile
import ConfigParser, traceback, util
mpm@selenic.com
Move ui class to its own module...
r207
Alexis S. L. Carvalho
ui.py: change the overlay from a dict to a SafeConfigParser....
r3344 def dupconfig(orig):
Alexis S. L. Carvalho
Use a case-sensitive version of SafeConfigParser everywhere...
r3425 new = util.configparser(orig.defaults())
Alexis S. L. Carvalho
ui.py: change the overlay from a dict to a SafeConfigParser....
r3344 updateconfig(orig, new)
return new
Alexis S. L. Carvalho
add ui.readsections...
r3433 def updateconfig(source, dest, sections=None):
if not sections:
sections = source.sections()
for section in sections:
Alexis S. L. Carvalho
ui.py: change the overlay from a dict to a SafeConfigParser....
r3344 if not dest.has_section(section):
dest.add_section(section)
for name, value in source.items(section, raw=True):
dest.set(section, name, value)
Eric Hopper
Convert all classes to new-style classes by deriving them from object.
r1559 class ui(object):
Bryan O'Sullivan
ui: get readline and prompt to behave better depending on interactivity
r5036 _isatty = None
mpm@selenic.com
Move ui class to its own module...
r207 def __init__(self, verbose=False, debug=False, quiet=False,
Thomas Arendsen Hein
Turn of "Not trusting file" logging when running hgweb and hgwebdir...
r3557 interactive=True, traceback=False, report_untrusted=True,
parentui=None):
Alexis S. L. Carvalho
ui.py: change the overlay from a dict to a SafeConfigParser....
r3344 self.overlay = None
Matt Mackall
add a simple nested buffering scheme to ui
r3737 self.buffers = []
Thomas Arendsen Hein
Create local ui object per repository, so .hg/hgrc don't get mixed....
r1839 if parentui is None:
Thomas Arendsen Hein
Inherit config from real parentui and don't use ConfigParser internals....
r1874 # this is the parent of all ui children
self.parentui = None
Alexis S. L. Carvalho
update ui.quiet/verbose/debug/interactive every time the config changes...
r3350 self.quiet = quiet
self.verbose = verbose
self.debugflag = debug
self.interactive = interactive
self.traceback = traceback
Thomas Arendsen Hein
Turn of "Not trusting file" logging when running hgweb and hgwebdir...
r3557 self.report_untrusted = report_untrusted
Alexis S. L. Carvalho
Only read .hg/hgrc files from trusted users/groups...
r3551 self.trusted_users = {}
self.trusted_groups = {}
Alexis S. L. Carvalho
save settings from untrusted config files in a separate configparser...
r3552 # if ucdata is not None, its keys must be a superset of cdata's
Alexis S. L. Carvalho
Use a case-sensitive version of SafeConfigParser everywhere...
r3425 self.cdata = util.configparser()
Alexis S. L. Carvalho
save settings from untrusted config files in a separate configparser...
r3552 self.ucdata = None
Alexis S. L. Carvalho
Use a variable to explicitly trust global config files
r3676 # we always trust global config files
self.check_trusted = False
Vadim Gelfer
add HGRCPATH env var, list of places to look for hgrc files....
r1951 self.readconfig(util.rcpath())
Alexis S. L. Carvalho
Use a variable to explicitly trust global config files
r3676 self.check_trusted = True
Thomas Arendsen Hein
Create local ui object per repository, so .hg/hgrc don't get mixed....
r1839 self.updateopts(verbose, debug, quiet, interactive)
Vadim Gelfer
inherit hgrc so "%" interpolation works.
r1866 else:
Thomas Arendsen Hein
Inherit config from real parentui and don't use ConfigParser internals....
r1874 # parentui may point to an ui object which is already a child
self.parentui = parentui.parentui or parentui
Alexis S. L. Carvalho
Only read .hg/hgrc files from trusted users/groups...
r3551 self.trusted_users = parentui.trusted_users.copy()
self.trusted_groups = parentui.trusted_groups.copy()
Alexis S. L. Carvalho
ui.py: change the overlay from a dict to a SafeConfigParser....
r3344 self.cdata = dupconfig(self.parentui.cdata)
Alexis S. L. Carvalho
save settings from untrusted config files in a separate configparser...
r3552 if self.parentui.ucdata:
self.ucdata = dupconfig(self.parentui.ucdata)
Alexis S. L. Carvalho
ui.py: change the overlay from a dict to a SafeConfigParser....
r3344 if self.parentui.overlay:
self.overlay = dupconfig(self.parentui.overlay)
Thomas Arendsen Hein
Create local ui object per repository, so .hg/hgrc don't get mixed....
r1839
def __getattr__(self, key):
return getattr(self.parentui, key)
mason@suse.com
Add support for extension modules...
r1071
Bryan O'Sullivan
ui: get readline and prompt to behave better depending on interactivity
r5036 def isatty(self):
if ui._isatty is None:
Thomas Arendsen Hein
os.isatty isn't available on Windows, so use sys.stdin.isatty()
r5039 ui._isatty = sys.stdin.isatty()
Bryan O'Sullivan
ui: get readline and prompt to behave better depending on interactivity
r5036 return ui._isatty
mason@suse.com
Add support for extension modules...
r1071 def updateopts(self, verbose=False, debug=False, quiet=False,
Vadim Gelfer
add --config global option. allows to set hgrc option on command line....
r2293 interactive=True, traceback=False, config=[]):
Alexis S. L. Carvalho
move the parsing of --config options to commands.py
r3346 for section, name, value in config:
self.setconfig(section, name, value)
mpm@selenic.com
ui: add configuration file support...
r285
Alexis S. L. Carvalho
update ui.quiet/verbose/debug/interactive every time the config changes...
r3350 if quiet or verbose or debug:
self.setconfig('ui', 'quiet', str(bool(quiet)))
self.setconfig('ui', 'verbose', str(bool(verbose)))
self.setconfig('ui', 'debug', str(bool(debug)))
self.verbosity_constraints()
if not interactive:
self.setconfig('ui', 'interactive', 'False')
self.interactive = False
self.traceback = self.traceback or traceback
def verbosity_constraints(self):
self.quiet = self.configbool('ui', 'quiet')
self.verbose = self.configbool('ui', 'verbose')
self.debugflag = self.configbool('ui', 'debug')
Alexis S. L. Carvalho
ui.py: untangle updateopts...
r3349 if self.debugflag:
self.verbose = True
self.quiet = False
elif self.verbose and self.quiet:
Alexis S. L. Carvalho
update ui.quiet/verbose/debug/interactive every time the config changes...
r3350 self.quiet = self.verbose = False
Alexis S. L. Carvalho
ui.py: untangle updateopts...
r3349
Alexis S. L. Carvalho
Only read .hg/hgrc files from trusted users/groups...
r3551 def _is_trusted(self, fp, f, warn=True):
Alexis S. L. Carvalho
Use a variable to explicitly trust global config files
r3676 if not self.check_trusted:
return True
Alexis S. L. Carvalho
Avoid looking up usernames if the current user owns the .hgrc file...
r3677 st = util.fstat(fp)
if util.isowner(fp, st):
return True
Alexis S. L. Carvalho
Only read .hg/hgrc files from trusted users/groups...
r3551 tusers = self.trusted_users
tgroups = self.trusted_groups
Alexis S. L. Carvalho
Update trusted_users only after we've seen a file not owned by the user
r3678 if not tusers:
user = util.username()
if user is not None:
self.trusted_users[user] = 1
self.fixconfig(section='trusted')
Alexis S. L. Carvalho
Only read .hg/hgrc files from trusted users/groups...
r3551 if (tusers or tgroups) and '*' not in tusers and '*' not in tgroups:
user = util.username(st.st_uid)
group = util.groupname(st.st_gid)
if user not in tusers and group not in tgroups:
Thomas Arendsen Hein
Turn of "Not trusting file" logging when running hgweb and hgwebdir...
r3557 if warn and self.report_untrusted:
Alexis S. L. Carvalho
save settings from untrusted config files in a separate configparser...
r3552 self.warn(_('Not trusting file %s from untrusted '
Alexis S. L. Carvalho
Only read .hg/hgrc files from trusted users/groups...
r3551 'user %s, group %s\n') % (f, user, group))
return False
return True
Thomas Arendsen Hein
Read paths specified in .hg/hgrc relative to repo root, otherwise to home dir.
r1893 def readconfig(self, fn, root=None):
Soh Tk-r28629
Fix traceback on bad system hgrc files
r1483 if isinstance(fn, basestring):
fn = [fn]
for f in fn:
try:
Alexis S. L. Carvalho
Only read .hg/hgrc files from trusted users/groups...
r3551 fp = open(f)
except IOError:
continue
Alexis S. L. Carvalho
save settings from untrusted config files in a separate configparser...
r3552 cdata = self.cdata
trusted = self._is_trusted(fp, f)
if not trusted:
if self.ucdata is None:
self.ucdata = dupconfig(self.cdata)
cdata = self.ucdata
elif self.ucdata is not None:
# use a separate configparser, so that we don't accidentally
# override ucdata settings later on.
cdata = util.configparser()
Alexis S. L. Carvalho
Only read .hg/hgrc files from trusted users/groups...
r3551 try:
Alexis S. L. Carvalho
save settings from untrusted config files in a separate configparser...
r3552 cdata.readfp(fp, f)
Soh Tk-r28629
Fix traceback on bad system hgrc files
r1483 except ConfigParser.ParsingError, inst:
Alexis S. L. Carvalho
save settings from untrusted config files in a separate configparser...
r3552 msg = _("Failed to parse %s\n%s") % (f, inst)
if trusted:
raise util.Abort(msg)
self.warn(_("Ignored: %s\n") % msg)
if trusted:
if cdata != self.cdata:
updateconfig(cdata, self.cdata)
if self.ucdata is not None:
updateconfig(cdata, self.ucdata)
Alexis S. L. Carvalho
ui.py: change the overlay from a dict to a SafeConfigParser....
r3344 # override data from config files with data set with ui.setconfig
if self.overlay:
updateconfig(self.overlay, self.cdata)
Alexis S. L. Carvalho
ui.py: normalize settings every time the configuration changes...
r3347 if root is None:
root = os.path.expanduser('~')
self.fixconfig(root=root)
Alexis S. L. Carvalho
load extensions only after the ui object has been completely initialized...
r3014
Alexis S. L. Carvalho
add ui.readsections...
r3433 def readsections(self, filename, *sections):
Alexis S. L. Carvalho
save settings from untrusted config files in a separate configparser...
r3552 """Read filename and add only the specified sections to the config data
The settings are added to the trusted config data.
"""
Alexis S. L. Carvalho
add ui.readsections...
r3433 if not sections:
return
cdata = util.configparser()
try:
Patrick Mezard
ui: make readsections() abort when configuration cannot be read.
r4517 try:
fp = open(filename)
except IOError, inst:
Thomas Arendsen Hein
Cleanup of whitespace, indentation and line continuation.
r4633 raise util.Abort(_("unable to open %s: %s") %
(filename, getattr(inst, "strerror", inst)))
Patrick Mezard
ui: make readsections() abort when configuration cannot be read.
r4517 try:
cdata.readfp(fp, filename)
finally:
fp.close()
Alexis S. L. Carvalho
add ui.readsections...
r3433 except ConfigParser.ParsingError, inst:
Thomas Arendsen Hein
Cleanup of whitespace, indentation and line continuation.
r4633 raise util.Abort(_("failed to parse %s\n%s") % (filename, inst))
Alexis S. L. Carvalho
add ui.readsections...
r3433
for section in sections:
if not cdata.has_section(section):
cdata.add_section(section)
updateconfig(cdata, self.cdata, sections)
Alexis S. L. Carvalho
save settings from untrusted config files in a separate configparser...
r3552 if self.ucdata:
updateconfig(cdata, self.ucdata, sections)
Alexis S. L. Carvalho
add ui.readsections...
r3433
Alexis S. L. Carvalho
ui.py: normalize settings every time the configuration changes...
r3347 def fixconfig(self, section=None, name=None, value=None, root=None):
# translate paths relative to root (or home) into absolute paths
if section is None or section == 'paths':
if root is None:
root = os.getcwd()
items = section and [(name, value)] or []
Alexis S. L. Carvalho
save settings from untrusted config files in a separate configparser...
r3552 for cdata in self.cdata, self.ucdata, self.overlay:
Alexis S. L. Carvalho
ui.py: normalize settings every time the configuration changes...
r3347 if not cdata: continue
if not items and cdata.has_section('paths'):
pathsitems = cdata.items('paths')
else:
pathsitems = items
for n, path in pathsitems:
if path and "://" not in path and not os.path.isabs(path):
cdata.set("paths", n, os.path.join(root, path))
Thomas Arendsen Hein
New config option: ui.report_untrusted (defaults to True)
r4717 # update verbosity/interactive/report_untrusted settings
Alexis S. L. Carvalho
update ui.quiet/verbose/debug/interactive every time the config changes...
r3350 if section is None or section == 'ui':
if name is None or name in ('quiet', 'verbose', 'debug'):
self.verbosity_constraints()
if name is None or name == 'interactive':
Dirkjan Ochtman
Don't try to determine interactivity if ui() called with interactive=False....
r5337 interactive = self.configbool("ui", "interactive", None)
if interactive is None and self.interactive:
Bryan O'Sullivan
ui: get readline and prompt to behave better depending on interactivity
r5036 self.interactive = self.isatty()
Dirkjan Ochtman
Don't try to determine interactivity if ui() called with interactive=False....
r5337 else:
self.interactive = interactive
Thomas Arendsen Hein
New config option: ui.report_untrusted (defaults to True)
r4717 if name is None or name == 'report_untrusted':
self.report_untrusted = (
self.configbool("ui", "report_untrusted", True))
Alexis S. L. Carvalho
update ui.quiet/verbose/debug/interactive every time the config changes...
r3350
Alexis S. L. Carvalho
Only read .hg/hgrc files from trusted users/groups...
r3551 # update trust information
Alexis S. L. Carvalho
Update trusted_users only after we've seen a file not owned by the user
r3678 if (section is None or section == 'trusted') and self.trusted_users:
for user in self.configlist('trusted', 'users'):
Alexis S. L. Carvalho
Only read .hg/hgrc files from trusted users/groups...
r3551 self.trusted_users[user] = 1
Alexis S. L. Carvalho
Update trusted_users only after we've seen a file not owned by the user
r3678 for group in self.configlist('trusted', 'groups'):
self.trusted_groups[group] = 1
Alexis S. L. Carvalho
Only read .hg/hgrc files from trusted users/groups...
r3551
Alexis S. L. Carvalho
ui.py: change the overlay from a dict to a SafeConfigParser....
r3344 def setconfig(self, section, name, value):
if not self.overlay:
Alexis S. L. Carvalho
Use a case-sensitive version of SafeConfigParser everywhere...
r3425 self.overlay = util.configparser()
Alexis S. L. Carvalho
save settings from untrusted config files in a separate configparser...
r3552 for cdata in (self.overlay, self.cdata, self.ucdata):
if not cdata: continue
Alexis S. L. Carvalho
ui.py: change the overlay from a dict to a SafeConfigParser....
r3344 if not cdata.has_section(section):
cdata.add_section(section)
cdata.set(section, name, value)
Alexis S. L. Carvalho
ui.py: normalize settings every time the configuration changes...
r3347 self.fixconfig(section, name, value)
mpm@selenic.com
Add ui.setconfig overlay...
r960
Alexis S. L. Carvalho
save settings from untrusted config files in a separate configparser...
r3552 def _get_cdata(self, untrusted):
if untrusted and self.ucdata:
return self.ucdata
return self.cdata
def _config(self, section, name, default, funcname, untrusted, abort):
cdata = self._get_cdata(untrusted)
if cdata.has_option(section, name):
Thomas Arendsen Hein
Catch hgrc interpolation errors nicely.
r1876 try:
Alexis S. L. Carvalho
save settings from untrusted config files in a separate configparser...
r3552 func = getattr(cdata, funcname)
Alexis S. L. Carvalho
ui.py: move common code out of config and configbool
r3341 return func(section, name)
Thomas Arendsen Hein
Catch illegal boolean values in hgrc nicely....
r4729 except (ConfigParser.InterpolationError, ValueError), inst:
Alexis S. L. Carvalho
save settings from untrusted config files in a separate configparser...
r3552 msg = _("Error in configuration section [%s] "
"parameter '%s':\n%s") % (section, name, inst)
if abort:
raise util.Abort(msg)
self.warn(_("Ignored: %s\n") % msg)
Alexis S. L. Carvalho
ui.py: don't query parentui.cdata when looking up config items....
r3343 return default
Alexis S. L. Carvalho
ui.py: move common code out of config and configbool
r3341
Alexis S. L. Carvalho
save settings from untrusted config files in a separate configparser...
r3552 def _configcommon(self, section, name, default, funcname, untrusted):
value = self._config(section, name, default, funcname,
untrusted, abort=True)
if self.debugflag and not untrusted and self.ucdata:
uvalue = self._config(section, name, None, funcname,
untrusted=True, abort=False)
if uvalue is not None and uvalue != value:
self.warn(_("Ignoring untrusted configuration option "
"%s.%s = %s\n") % (section, name, uvalue))
return value
Alexis S. L. Carvalho
ui.py: move common code out of config and configbool
r3341
Alexis S. L. Carvalho
save settings from untrusted config files in a separate configparser...
r3552 def config(self, section, name, default=None, untrusted=False):
return self._configcommon(section, name, default, 'get', untrusted)
mpm@selenic.com
ui: add configuration file support...
r285
Alexis S. L. Carvalho
save settings from untrusted config files in a separate configparser...
r3552 def configbool(self, section, name, default=False, untrusted=False):
return self._configcommon(section, name, default, 'getboolean',
untrusted)
def configlist(self, section, name, default=None, untrusted=False):
Thomas Arendsen Hein
Added ui.configlist method to get comma/space separated lists of strings....
r2499 """Return a list of comma/space separated strings"""
Alexis S. L. Carvalho
save settings from untrusted config files in a separate configparser...
r3552 result = self.config(section, name, untrusted=untrusted)
Thomas Arendsen Hein
Added ui.configlist method to get comma/space separated lists of strings....
r2499 if result is None:
Thomas Arendsen Hein
Allow using default values with ui.configlist, too, and add a test for this.
r2502 result = default or []
if isinstance(result, basestring):
result = result.replace(",", " ").split()
return result
Thomas Arendsen Hein
Added ui.configlist method to get comma/space separated lists of strings....
r2499
Bryan O'Sullivan
ui: Rename has_config to has_section.
r4487 def has_section(self, section, untrusted=False):
Vadim Gelfer
add ui.has_config method.
r2343 '''tell whether section exists in config.'''
Alexis S. L. Carvalho
save settings from untrusted config files in a separate configparser...
r3552 cdata = self._get_cdata(untrusted)
return cdata.has_section(section)
Vadim Gelfer
add ui.has_config method.
r2343
Alexis S. L. Carvalho
save settings from untrusted config files in a separate configparser...
r3552 def _configitems(self, section, untrusted, abort):
Thomas Arendsen Hein
Create local ui object per repository, so .hg/hgrc don't get mixed....
r1839 items = {}
Alexis S. L. Carvalho
save settings from untrusted config files in a separate configparser...
r3552 cdata = self._get_cdata(untrusted)
if cdata.has_section(section):
Thomas Arendsen Hein
Catch hgrc interpolation errors nicely.
r1876 try:
Alexis S. L. Carvalho
save settings from untrusted config files in a separate configparser...
r3552 items.update(dict(cdata.items(section)))
Thomas Arendsen Hein
Catch hgrc interpolation errors nicely.
r1876 except ConfigParser.InterpolationError, inst:
Alexis S. L. Carvalho
save settings from untrusted config files in a separate configparser...
r3552 msg = _("Error in configuration section [%s]:\n"
"%s") % (section, inst)
if abort:
raise util.Abort(msg)
self.warn(_("Ignored: %s\n") % msg)
return items
def configitems(self, section, untrusted=False):
items = self._configitems(section, untrusted=untrusted, abort=True)
if self.debugflag and not untrusted and self.ucdata:
uitems = self._configitems(section, untrusted=True, abort=False)
keys = uitems.keys()
keys.sort()
for k in keys:
if uitems[k] != items.get(k):
self.warn(_("Ignoring untrusted configuration option "
"%s.%s = %s\n") % (section, k, uitems[k]))
Thomas Arendsen Hein
Create local ui object per repository, so .hg/hgrc don't get mixed....
r1839 x = items.items()
x.sort()
return x
mpm@selenic.com
ui: add configuration file support...
r285
Alexis S. L. Carvalho
save settings from untrusted config files in a separate configparser...
r3552 def walkconfig(self, untrusted=False):
cdata = self._get_cdata(untrusted)
sections = cdata.sections()
Alexis S. L. Carvalho
ui.py: make walkconfig use configitems...
r3342 sections.sort()
for section in sections:
Alexis S. L. Carvalho
save settings from untrusted config files in a separate configparser...
r3552 for name, value in self.configitems(section, untrusted):
Alexis S. L. Carvalho
Fix hg showconfig traceback with values that aren't strings
r4085 yield section, name, str(value).replace('\n', '\\n')
Bryan O'Sullivan
Add commands.debugconfig....
r1028
Matt Mackall
Add username/merge/editor to .hgrc...
r608 def username(self):
Thomas Arendsen Hein
Adapted behaviour of ui.username() to documentation and mention it explicitly:...
r1985 """Return default username to be used in commits.
Searched in this order: $HGUSER, [ui] section of hgrcs, $EMAIL
and stop searching if one of these is set.
Benoit Boissinot
only print a warning when no username is specified...
r3721 If not found, use ($LOGNAME or $USER or $LNAME or
$USERNAME) +"@full.hostname".
Thomas Arendsen Hein
Adapted behaviour of ui.username() to documentation and mention it explicitly:...
r1985 """
user = os.environ.get("HGUSER")
if user is None:
user = self.config("ui", "username")
if user is None:
user = os.environ.get("EMAIL")
Thomas Arendsen Hein
Abort on empty username so specifying a username can be forced....
r4044 if user is None:
Benoit Boissinot
only print a warning when no username is specified...
r3721 try:
user = '%s@%s' % (util.getuser(), socket.getfqdn())
Thomas Arendsen Hein
Abort on empty username so specifying a username can be forced....
r4044 self.warn(_("No username found, using '%s' instead\n") % user)
Benoit Boissinot
only print a warning when no username is specified...
r3721 except KeyError:
Thomas Arendsen Hein
Abort on empty username so specifying a username can be forced....
r4044 pass
if not user:
raise util.Abort(_("Please specify a username."))
Thomas Arendsen Hein
Adapted behaviour of ui.username() to documentation and mention it explicitly:...
r1985 return user
Matt Mackall
Add username/merge/editor to .hgrc...
r608
Thomas Arendsen Hein
Move generating short username to display in hg/hgweb annotate to ui module.
r1129 def shortuser(self, user):
"""Return a short representation of a user name or email address."""
Vadim Gelfer
move shortuser into util module.
r1903 if not self.verbose: user = util.shortuser(user)
Thomas Arendsen Hein
Move generating short username to display in hg/hgweb annotate to ui module.
r1129 return user
Vadim Gelfer
push, outgoing, bundle: fall back to "default" if "default-push" not defined
r2494 def expandpath(self, loc, default=None):
Thomas Arendsen Hein
Directory names take precedence over symbolic names consistently....
r1892 """Return repository location relative to cwd or from [paths]"""
Thomas Arendsen Hein
Only hg repositories override [paths], not simple directories (fixes issue510)
r4216 if "://" in loc or os.path.isdir(os.path.join(loc, '.hg')):
Thomas Arendsen Hein
Directory names take precedence over symbolic names consistently....
r1892 return loc
Vadim Gelfer
make ui.expandpath better with default path.
r2495 path = self.config("paths", loc)
if not path and default is not None:
path = self.config("paths", default)
Thomas Arendsen Hein
Fix ui.expandpath problem and broken test introduced by 4a2a4d988ead.
r2498 return path or loc
mpm@selenic.com
[PATCH] Add ui.expandpath command...
r506
Matt Mackall
add a simple nested buffering scheme to ui
r3737 def pushbuffer(self):
self.buffers.append([])
def popbuffer(self):
return "".join(self.buffers.pop())
mpm@selenic.com
Move ui class to its own module...
r207 def write(self, *args):
Matt Mackall
add a simple nested buffering scheme to ui
r3737 if self.buffers:
self.buffers[-1].extend([str(a) for a in args])
else:
for a in args:
sys.stdout.write(str(a))
mpm@selenic.com
[PATCH] Make ui.warn write to stderr...
r565
def write_err(self, *args):
Benoit Boissinot
ignore EPIPE in ui.err_write...
r1989 try:
if not sys.stdout.closed: sys.stdout.flush()
for a in args:
sys.stderr.write(str(a))
Patrick Mezard
Flush stderr after write....
r4023 # stderr may be buffered under win32 when redirected to files,
# including stdout.
if not sys.stderr.closed: sys.stderr.flush()
Benoit Boissinot
ignore EPIPE in ui.err_write...
r1989 except IOError, inst:
if inst.errno != errno.EPIPE:
raise
mpm@selenic.com
[PATCH] Make ui.warn write to stderr...
r565
Vadim Gelfer
make ui flush output. this makes error happen if printing to /dev/full....
r1837 def flush(self):
Eung-Ju Park
Fix error on Windows if "hg log | more" exits.
r2013 try: sys.stdout.flush()
except: pass
try: sys.stderr.flush()
except: pass
Vadim Gelfer
make ui flush output. this makes error happen if printing to /dev/full....
r1837
Dirkjan Ochtman
Don't try to determine interactivity if ui() called with interactive=False....
r5337 def _readline(self, prompt=''):
Bryan O'Sullivan
ui: get readline and prompt to behave better depending on interactivity
r5036 if self.isatty():
try:
# magically add command line editing support, where
# available
import readline
# force demandimport to really load the module
readline.read_history_file
except ImportError:
pass
Steve Borho
workaround for raw_input() on Windows...
r5613 line = raw_input(prompt)
# When stdin is in binary mode on Windows, it can cause
# raw_input() to emit an extra trailing carriage return
if os.linesep == '\r\n' and line and line[-1] == '\r':
line = line[:-1]
return line
Bryan O'Sullivan
ui: get readline and prompt to behave better depending on interactivity
r5036
Bryan O'Sullivan
record: improve docs, improve prompts
r5154 def prompt(self, msg, pat=None, default="y", matchflags=0):
mpm@selenic.com
Move ui class to its own module...
r207 if not self.interactive: return default
Bryan O'Sullivan
ui: get readline and prompt to behave better depending on interactivity
r5036 try:
Dirkjan Ochtman
Don't try to determine interactivity if ui() called with interactive=False....
r5337 r = self._readline(msg + ' ')
Bryan O'Sullivan
record: improve docs, improve prompts
r5154 if not pat or re.match(pat, r, matchflags):
mpm@selenic.com
Move ui class to its own module...
r207 return r
else:
Benoit Boissinot
i18n part2: use '_' for all strings who are part of the user interface
r1402 self.write(_("unrecognized response\n"))
Bryan O'Sullivan
ui: get readline and prompt to behave better depending on interactivity
r5036 except EOFError:
raise util.Abort(_('response expected'))
Vadim Gelfer
prompt user for http authentication info...
r2281 def getpass(self, prompt=None, default=None):
if not self.interactive: return default
return getpass.getpass(prompt or _('password: '))
mpm@selenic.com
Move ui class to its own module...
r207 def status(self, *msg):
if not self.quiet: self.write(*msg)
Thomas Arendsen Hein
ui.warn can use more than one argument like the other ui methods.
r234 def warn(self, *msg):
mpm@selenic.com
[PATCH] Make ui.warn write to stderr...
r565 self.write_err(*msg)
mpm@selenic.com
Move ui class to its own module...
r207 def note(self, *msg):
if self.verbose: self.write(*msg)
def debug(self, *msg):
if self.debugflag: self.write(*msg)
Thomas Arendsen Hein
Pass correct username as $HGUSER to hgeditor if "commit -u" is used....
r1983 def edit(self, text, user):
Stephen Darnell
Use text rather than binary mode for editing commit messages
r2206 (fd, name) = tempfile.mkstemp(prefix="hg-editor-", suffix=".txt",
text=True)
Thomas Arendsen Hein
Improved ui.edit():...
r1984 try:
f = os.fdopen(fd, "w")
f.write(text)
f.close()
Osku Salerma
Use VISUAL in addition to EDITOR when choosing the editor to use.
r5660 editor = self.geteditor()
mpm@selenic.com
Move ui class to its own module...
r207
Thomas Arendsen Hein
Improved ui.edit():...
r1984 util.system("%s \"%s\"" % (editor, name),
environ={'HGUSER': user},
onerr=util.Abort, errprefix=_("edit failed"))
Matt Mackall
Add username/merge/editor to .hgrc...
r608
Thomas Arendsen Hein
Improved ui.edit():...
r1984 f = open(name)
t = f.read()
f.close()
t = re.sub("(?m)^HG:.*\n", "", t)
finally:
os.unlink(name)
Radoslaw "AstralStorm" Szkodzinski
Pass username to hgeditor, remove temporary file...
r662
mpm@selenic.com
Move ui class to its own module...
r207 return t
Vadim Gelfer
move mail sending code into core, so extensions can share it....
r2200
Vadim Gelfer
add ui.print_exc(), make all traceback printing central.
r2335 def print_exc(self):
'''print exception traceback if traceback printing enabled.
only to call in exception handler. returns true if traceback
printed.'''
if self.traceback:
traceback.print_exc()
return self.traceback
Osku Salerma
Use VISUAL in addition to EDITOR when choosing the editor to use.
r5660
def geteditor(self):
'''return editor to use'''
return (os.environ.get("HGEDITOR") or
self.config("ui", "editor") or
os.environ.get("VISUAL") or
os.environ.get("EDITOR", "vi"))