ui.py
117 lines
| 3.8 KiB
| text/x-python
|
PythonLexer
/ mercurial / ui.py
mpm@selenic.com
|
r207 | # ui.py - user interface bits for mercurial | ||
# | ||||
# Copyright 2005 Matt Mackall <mpm@selenic.com> | ||||
# | ||||
# This software may be used and distributed according to the terms | ||||
# of the GNU General Public License, incorporated herein by reference. | ||||
Bryan O'Sullivan
|
r613 | import os, ConfigParser | ||
from demandload import * | ||||
demandload(globals(), "re socket sys util") | ||||
mpm@selenic.com
|
r207 | |||
class ui: | ||||
def __init__(self, verbose=False, debug=False, quiet=False, | ||||
interactive=True): | ||||
mpm@selenic.com
|
r960 | self.overlay = {} | ||
mpm@selenic.com
|
r285 | self.cdata = ConfigParser.SafeConfigParser() | ||
Thomas Arendsen Hein
|
r951 | self.cdata.read([os.path.normpath(hgrc) for hgrc in | ||
"/etc/mercurial/hgrc", os.path.expanduser("~/.hgrc")]) | ||||
mpm@selenic.com
|
r285 | |||
self.quiet = self.configbool("ui", "quiet") | ||||
self.verbose = self.configbool("ui", "verbose") | ||||
self.debugflag = self.configbool("ui", "debug") | ||||
self.interactive = self.configbool("ui", "interactive", True) | ||||
self.quiet = (self.quiet or quiet) and not verbose and not debug | ||||
self.verbose = (self.verbose or verbose) or debug | ||||
self.debugflag = (self.debugflag or debug) | ||||
self.interactive = (self.interactive and interactive) | ||||
mpm@selenic.com
|
r337 | def readconfig(self, fp): | ||
self.cdata.readfp(fp) | ||||
mpm@selenic.com
|
r960 | def setconfig(self, section, name, val): | ||
self.overlay[(section, name)] = val | ||||
def config(self, section, name, default=None): | ||||
if self.overlay.has_key((section, name)): | ||||
return self.overlay[(section, name)] | ||||
if self.cdata.has_option(section, name): | ||||
return self.cdata.get(section, name) | ||||
mpm@selenic.com
|
r285 | return default | ||
mpm@selenic.com
|
r960 | def configbool(self, section, name, default=False): | ||
if self.overlay.has_key((section, name)): | ||||
return self.overlay[(section, name)] | ||||
if self.cdata.has_option(section, name): | ||||
return self.cdata.getboolean(section, name) | ||||
mpm@selenic.com
|
r285 | return default | ||
def configitems(self, section): | ||||
if self.cdata.has_section(section): | ||||
return self.cdata.items(section) | ||||
return [] | ||||
Matt Mackall
|
r608 | def username(self): | ||
mpm@selenic.com
|
r691 | return (os.environ.get("HGUSER") or | ||
self.config("ui", "username") or | ||||
Matt Mackall
|
r608 | os.environ.get("EMAIL") or | ||
(os.environ.get("LOGNAME", | ||||
os.environ.get("USERNAME", "unknown")) | ||||
+ '@' + socket.getfqdn())) | ||||
mpm@selenic.com
|
r506 | def expandpath(self, loc): | ||
paths = {} | ||||
for name, path in self.configitems("paths"): | ||||
paths[name] = path | ||||
return paths.get(loc, loc) | ||||
mpm@selenic.com
|
r207 | def write(self, *args): | ||
for a in args: | ||||
sys.stdout.write(str(a)) | ||||
mpm@selenic.com
|
r565 | |||
def write_err(self, *args): | ||||
sys.stdout.flush() | ||||
for a in args: | ||||
sys.stderr.write(str(a)) | ||||
mpm@selenic.com
|
r207 | def readline(self): | ||
return sys.stdin.readline()[:-1] | ||||
def prompt(self, msg, pat, default = "y"): | ||||
if not self.interactive: return default | ||||
while 1: | ||||
self.write(msg, " ") | ||||
r = self.readline() | ||||
if re.match(pat, r): | ||||
return r | ||||
else: | ||||
self.write("unrecognized response\n") | ||||
def status(self, *msg): | ||||
if not self.quiet: self.write(*msg) | ||||
Thomas Arendsen Hein
|
r234 | def warn(self, *msg): | ||
mpm@selenic.com
|
r565 | self.write_err(*msg) | ||
mpm@selenic.com
|
r207 | def note(self, *msg): | ||
if self.verbose: self.write(*msg) | ||||
def debug(self, *msg): | ||||
if self.debugflag: self.write(*msg) | ||||
def edit(self, text): | ||||
mpm@selenic.com
|
r249 | import tempfile | ||
mpm@selenic.com
|
r207 | (fd, name) = tempfile.mkstemp("hg") | ||
f = os.fdopen(fd, "w") | ||||
f.write(text) | ||||
f.close() | ||||
mpm@selenic.com
|
r691 | editor = (os.environ.get("HGEDITOR") or | ||
self.config("ui", "editor") or | ||||
Matt Mackall
|
r608 | os.environ.get("EDITOR", "vi")) | ||
Radoslaw "AstralStorm" Szkodzinski
|
r662 | os.environ["HGUSER"] = self.username() | ||
mpm@selenic.com
|
r508 | util.system("%s %s" % (editor, name), errprefix = "edit failed") | ||
mpm@selenic.com
|
r207 | |||
t = open(name).read() | ||||
t = re.sub("(?m)^HG:.*\n", "", t) | ||||
Radoslaw "AstralStorm" Szkodzinski
|
r662 | os.unlink(name) | ||
mpm@selenic.com
|
r207 | return t | ||