##// END OF EJS Templates
Fixed typo in gitweb templates.
Fixed typo in gitweb templates.

File last commit:

r3350:ab900698 default
r3364:537a93ca default
Show More
ui.py
323 lines | 11.5 KiB | text/x-python | PythonLexer
mpm@selenic.com
Move ui class to its own module...
r207 # ui.py - user interface bits for mercurial
#
Vadim Gelfer
update copyrights.
r2859 # Copyright 2005, 2006 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.
Benoit Boissinot
i18n first part: make '_' available for files who need it
r1400 from i18n import gettext as _
Bryan O'Sullivan
Demand-load most modules in the commands and ui modules....
r613 from demandload import *
Matt Mackall
Move ui.sendmail to mail.connect/sendmail
r2889 demandload(globals(), "errno getpass os re socket sys tempfile")
Vadim Gelfer
refactor text diff/patch code....
r2874 demandload(globals(), "ConfigParser mdiff templater 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):
new = ConfigParser.SafeConfigParser(orig.defaults())
updateconfig(orig, new)
return new
def updateconfig(source, dest):
for section in source.sections():
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):
mpm@selenic.com
Move ui class to its own module...
r207 def __init__(self, verbose=False, debug=False, quiet=False,
Alexis S. L. Carvalho
load extensions only after the ui object has been completely initialized...
r3014 interactive=True, traceback=False, parentui=None):
Alexis S. L. Carvalho
ui.py: change the overlay from a dict to a SafeConfigParser....
r3344 self.overlay = None
Alexis S. L. Carvalho
ui.py: don't let parent and child ui objects share header and prev_header
r3339 self.header = []
self.prev_header = []
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
load extensions only after the ui object has been completely initialized...
r3014 self.readhooks = []
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
Inherit config from real parentui and don't use ConfigParser internals....
r1874 self.cdata = ConfigParser.SafeConfigParser()
Vadim Gelfer
add HGRCPATH env var, list of places to look for hgrc files....
r1951 self.readconfig(util.rcpath())
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
ui.py: use correct parentui while copying readhooks
r3338 self.readhooks = self.parentui.readhooks[:]
Alexis S. L. Carvalho
ui.py: change the overlay from a dict to a SafeConfigParser....
r3344 self.cdata = dupconfig(self.parentui.cdata)
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
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
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:
Matt Mackall
Back out trusted hgrc change for now...
r3098 self.cdata.read(f)
Soh Tk-r28629
Fix traceback on bad system hgrc files
r1483 except ConfigParser.ParsingError, inst:
raise util.Abort(_("Failed to parse %s\n%s") % (f, inst))
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)
Vadim Gelfer
load extensions from every hgrc....
r2944 for hook in self.readhooks:
hook(self)
mpm@selenic.com
Add support for .hg/hgrc file...
r337
Alexis S. L. Carvalho
load extensions only after the ui object has been completely initialized...
r3014 def addreadhook(self, hook):
self.readhooks.append(hook)
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 []
for cdata in self.cdata, self.overlay:
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))
Alexis S. L. Carvalho
update ui.quiet/verbose/debug/interactive every time the config changes...
r3350 # update quiet/verbose/debug and interactive status
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':
self.interactive = self.configbool("ui", "interactive", True)
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:
self.overlay = ConfigParser.SafeConfigParser()
for cdata in (self.overlay, self.cdata):
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
ui.py: move common code out of config and configbool
r3341 def _config(self, section, name, default, funcname):
mpm@selenic.com
Add ui.setconfig overlay...
r960 if self.cdata.has_option(section, name):
Thomas Arendsen Hein
Catch hgrc interpolation errors nicely.
r1876 try:
Alexis S. L. Carvalho
ui.py: move common code out of config and configbool
r3341 func = getattr(self.cdata, funcname)
return func(section, name)
Thomas Arendsen Hein
Catch hgrc interpolation errors nicely.
r1876 except ConfigParser.InterpolationError, inst:
Thomas Arendsen Hein
Include section name and parameter name (if available) in config errors....
r3073 raise util.Abort(_("Error in configuration section [%s] "
"parameter '%s':\n%s")
% (section, name, inst))
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
def config(self, section, name, default=None):
return self._config(section, name, default, 'get')
def configbool(self, section, name, default=False):
return self._config(section, name, default, 'getboolean')
mpm@selenic.com
ui: add configuration file support...
r285
Thomas Arendsen Hein
Added ui.configlist method to get comma/space separated lists of strings....
r2499 def configlist(self, section, name, default=None):
"""Return a list of comma/space separated strings"""
result = self.config(section, name)
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
Vadim Gelfer
add ui.has_config method.
r2343 def has_config(self, section):
'''tell whether section exists in config.'''
return self.cdata.has_section(section)
mpm@selenic.com
ui: add configuration file support...
r285 def configitems(self, section):
Thomas Arendsen Hein
Create local ui object per repository, so .hg/hgrc don't get mixed....
r1839 items = {}
mpm@selenic.com
ui: add configuration file support...
r285 if self.cdata.has_section(section):
Thomas Arendsen Hein
Catch hgrc interpolation errors nicely.
r1876 try:
items.update(dict(self.cdata.items(section)))
except ConfigParser.InterpolationError, inst:
Thomas Arendsen Hein
Include section name and parameter name (if available) in config errors....
r3073 raise util.Abort(_("Error in configuration section [%s]:\n%s")
% (section, inst))
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
ui.py: don't query parentui.cdata when looking up config items....
r3343 def walkconfig(self):
Alexis S. L. Carvalho
ui.py: make walkconfig use configitems...
r3342 sections = self.cdata.sections()
sections.sort()
for section in sections:
for name, value in self.configitems(section):
yield section, name, value.replace('\n', '\\n')
Bryan O'Sullivan
Add commands.debugconfig....
r1028
mason@suse.com
Add support for extension modules...
r1071 def extensions(self):
Thomas Arendsen Hein
Further cleanup of ui.py (changeset 74d569332f8b used one-char variable names).
r2403 result = self.configitems("extensions")
for i, (key, value) in enumerate(result):
if value:
result[i] = (key, os.path.expanduser(value))
return result
mason@suse.com
Add support for extension modules...
r1071
mcmillen@cs.cmu.edu
Implementation of per-user .hgignore....
r2003 def hgignorefiles(self):
Thomas Arendsen Hein
Further cleanup of ui.py (changeset 74d569332f8b used one-char variable names).
r2403 result = []
for key, value in self.configitems("ui"):
if key == 'ignore' or key.startswith('ignore.'):
result.append(os.path.expanduser(value))
return result
mcmillen@cs.cmu.edu
Implementation of per-user .hgignore....
r2003
mason@suse.com
Implement revlogng....
r2072 def configrevlog(self):
Thomas Arendsen Hein
Further cleanup of ui.py (changeset 74d569332f8b used one-char variable names).
r2403 result = {}
for key, value in self.configitems("revlog"):
result[key.lower()] = value
return result
Markus F.X.J. Oberhumer
Cleanup: unifiy the coding style in the ui.py configitems forwarders....
r2388
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.
Abort if found username is an empty string to force specifying
the commit user elsewhere, e.g. with line option or repo hgrc.
Vadim Gelfer
add ui.has_config method.
r2343 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")
if user is None:
Vadim Gelfer
add ui.has_config method.
r2343 try:
Vadim Gelfer
fix windows username problem.
r2652 user = '%s@%s' % (util.getuser(), socket.getfqdn())
Vadim Gelfer
add ui.has_config method.
r2343 except KeyError:
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]"""
Benoit Boissinot
expand the path if destination is not a directory
r2624 if "://" in loc or os.path.isdir(loc):
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
mpm@selenic.com
Move ui class to its own module...
r207 def write(self, *args):
Thomas Arendsen Hein
Group changes done by the same developer on the same with --style=changelog...
r2033 if self.header:
if self.header != self.prev_header:
self.prev_header = self.header
self.write(*self.header)
self.header = []
mpm@selenic.com
Move ui class to its own module...
r207 for a in args:
sys.stdout.write(str(a))
mpm@selenic.com
[PATCH] Make ui.warn write to stderr...
r565
Thomas Arendsen Hein
Group changes done by the same developer on the same with --style=changelog...
r2033 def write_header(self, *args):
for a in args:
self.header.append(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))
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
mpm@selenic.com
Move ui class to its own module...
r207 def readline(self):
return sys.stdin.readline()[:-1]
Vadim Gelfer
prompt user for http authentication info...
r2281 def prompt(self, msg, pat=None, default="y"):
mpm@selenic.com
Move ui class to its own module...
r207 if not self.interactive: return default
while 1:
self.write(msg, " ")
r = self.readline()
Vadim Gelfer
prompt user for http authentication info...
r2281 if not pat or re.match(pat, r):
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"))
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()
editor = (os.environ.get("HGEDITOR") or
self.config("ui", "editor") or
os.environ.get("EDITOR", "vi"))
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