annotate mercurial/ui.py @ 766:b444a7e053f1

Get addremove to use new walk code. It is now more verbose than it used to be. If given file names, it prints nothing, as before. But if given patterns or nothing, it prints the names of the files it is operating on, to remove that air of mystery. It also now operates at or below the current directory.
author Bryan O'Sullivan <bos@serpentine.com>
date Fri, 22 Jul 2005 19:45:48 -0800
parents 61c6b4178b9e
children 859de3ebc041 52d8d81e72ad 4f81068ed8cd
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 #
ec327cf0d3a9 Move ui class to its own module
mpm@selenic.com
parents:
diff changeset
3 # Copyright 2005 Matt Mackall <mpm@selenic.com>
ec327cf0d3a9 Move ui class to its own module
mpm@selenic.com
parents:
diff changeset
4 #
ec327cf0d3a9 Move ui class to its own module
mpm@selenic.com
parents:
diff changeset
5 # This software may be used and distributed according to the terms
ec327cf0d3a9 Move ui class to its own module
mpm@selenic.com
parents:
diff changeset
6 # of the GNU General Public License, incorporated herein by reference.
ec327cf0d3a9 Move ui class to its own module
mpm@selenic.com
parents:
diff changeset
7
613
5374955ec5b1 Demand-load most modules in the commands and ui modules.
Bryan O'Sullivan <bos@serpentine.com>
parents: 608
diff changeset
8 import os, ConfigParser
5374955ec5b1 Demand-load most modules in the commands and ui modules.
Bryan O'Sullivan <bos@serpentine.com>
parents: 608
diff changeset
9 from demandload import *
5374955ec5b1 Demand-load most modules in the commands and ui modules.
Bryan O'Sullivan <bos@serpentine.com>
parents: 608
diff changeset
10 demandload(globals(), "re socket sys util")
207
ec327cf0d3a9 Move ui class to its own module
mpm@selenic.com
parents:
diff changeset
11
ec327cf0d3a9 Move ui class to its own module
mpm@selenic.com
parents:
diff changeset
12 class ui:
ec327cf0d3a9 Move ui class to its own module
mpm@selenic.com
parents:
diff changeset
13 def __init__(self, verbose=False, debug=False, quiet=False,
ec327cf0d3a9 Move ui class to its own module
mpm@selenic.com
parents:
diff changeset
14 interactive=True):
285
5a1e6d27f399 ui: add configuration file support
mpm@selenic.com
parents: 249
diff changeset
15 self.cdata = ConfigParser.SafeConfigParser()
5a1e6d27f399 ui: add configuration file support
mpm@selenic.com
parents: 249
diff changeset
16 self.cdata.read(os.path.expanduser("~/.hgrc"))
5a1e6d27f399 ui: add configuration file support
mpm@selenic.com
parents: 249
diff changeset
17
5a1e6d27f399 ui: add configuration file support
mpm@selenic.com
parents: 249
diff changeset
18 self.quiet = self.configbool("ui", "quiet")
5a1e6d27f399 ui: add configuration file support
mpm@selenic.com
parents: 249
diff changeset
19 self.verbose = self.configbool("ui", "verbose")
5a1e6d27f399 ui: add configuration file support
mpm@selenic.com
parents: 249
diff changeset
20 self.debugflag = self.configbool("ui", "debug")
5a1e6d27f399 ui: add configuration file support
mpm@selenic.com
parents: 249
diff changeset
21 self.interactive = self.configbool("ui", "interactive", True)
5a1e6d27f399 ui: add configuration file support
mpm@selenic.com
parents: 249
diff changeset
22
5a1e6d27f399 ui: add configuration file support
mpm@selenic.com
parents: 249
diff changeset
23 self.quiet = (self.quiet or quiet) and not verbose and not debug
5a1e6d27f399 ui: add configuration file support
mpm@selenic.com
parents: 249
diff changeset
24 self.verbose = (self.verbose or verbose) or debug
5a1e6d27f399 ui: add configuration file support
mpm@selenic.com
parents: 249
diff changeset
25 self.debugflag = (self.debugflag or debug)
5a1e6d27f399 ui: add configuration file support
mpm@selenic.com
parents: 249
diff changeset
26 self.interactive = (self.interactive and interactive)
5a1e6d27f399 ui: add configuration file support
mpm@selenic.com
parents: 249
diff changeset
27
337
c3d873ef4b31 Add support for .hg/hgrc file
mpm@selenic.com
parents: 285
diff changeset
28 def readconfig(self, fp):
c3d873ef4b31 Add support for .hg/hgrc file
mpm@selenic.com
parents: 285
diff changeset
29 self.cdata.readfp(fp)
c3d873ef4b31 Add support for .hg/hgrc file
mpm@selenic.com
parents: 285
diff changeset
30
285
5a1e6d27f399 ui: add configuration file support
mpm@selenic.com
parents: 249
diff changeset
31 def config(self, section, val, default=None):
5a1e6d27f399 ui: add configuration file support
mpm@selenic.com
parents: 249
diff changeset
32 if self.cdata.has_option(section, val):
5a1e6d27f399 ui: add configuration file support
mpm@selenic.com
parents: 249
diff changeset
33 return self.cdata.get(section, val)
5a1e6d27f399 ui: add configuration file support
mpm@selenic.com
parents: 249
diff changeset
34 return default
5a1e6d27f399 ui: add configuration file support
mpm@selenic.com
parents: 249
diff changeset
35
5a1e6d27f399 ui: add configuration file support
mpm@selenic.com
parents: 249
diff changeset
36 def configbool(self, section, val, default=False):
5a1e6d27f399 ui: add configuration file support
mpm@selenic.com
parents: 249
diff changeset
37 if self.cdata.has_option(section, val):
5a1e6d27f399 ui: add configuration file support
mpm@selenic.com
parents: 249
diff changeset
38 return self.cdata.getboolean(section, val)
5a1e6d27f399 ui: add configuration file support
mpm@selenic.com
parents: 249
diff changeset
39 return default
5a1e6d27f399 ui: add configuration file support
mpm@selenic.com
parents: 249
diff changeset
40
5a1e6d27f399 ui: add configuration file support
mpm@selenic.com
parents: 249
diff changeset
41 def configitems(self, section):
5a1e6d27f399 ui: add configuration file support
mpm@selenic.com
parents: 249
diff changeset
42 if self.cdata.has_section(section):
5a1e6d27f399 ui: add configuration file support
mpm@selenic.com
parents: 249
diff changeset
43 return self.cdata.items(section)
5a1e6d27f399 ui: add configuration file support
mpm@selenic.com
parents: 249
diff changeset
44 return []
5a1e6d27f399 ui: add configuration file support
mpm@selenic.com
parents: 249
diff changeset
45
608
d2994b5298fb Add username/merge/editor to .hgrc
Matt Mackall <mpm@selenic.com>
parents: 565
diff changeset
46 def username(self):
691
61c6b4178b9e HG environment variables take precedence over hgrc
mpm@selenic.com
parents: 662
diff changeset
47 return (os.environ.get("HGUSER") or
61c6b4178b9e HG environment variables take precedence over hgrc
mpm@selenic.com
parents: 662
diff changeset
48 self.config("ui", "username") or
608
d2994b5298fb Add username/merge/editor to .hgrc
Matt Mackall <mpm@selenic.com>
parents: 565
diff changeset
49 os.environ.get("EMAIL") or
d2994b5298fb Add username/merge/editor to .hgrc
Matt Mackall <mpm@selenic.com>
parents: 565
diff changeset
50 (os.environ.get("LOGNAME",
d2994b5298fb Add username/merge/editor to .hgrc
Matt Mackall <mpm@selenic.com>
parents: 565
diff changeset
51 os.environ.get("USERNAME", "unknown"))
d2994b5298fb Add username/merge/editor to .hgrc
Matt Mackall <mpm@selenic.com>
parents: 565
diff changeset
52 + '@' + socket.getfqdn()))
d2994b5298fb Add username/merge/editor to .hgrc
Matt Mackall <mpm@selenic.com>
parents: 565
diff changeset
53
506
1f81ebff98c9 [PATCH] Add ui.expandpath command
mpm@selenic.com
parents: 350
diff changeset
54 def expandpath(self, loc):
1f81ebff98c9 [PATCH] Add ui.expandpath command
mpm@selenic.com
parents: 350
diff changeset
55 paths = {}
1f81ebff98c9 [PATCH] Add ui.expandpath command
mpm@selenic.com
parents: 350
diff changeset
56 for name, path in self.configitems("paths"):
1f81ebff98c9 [PATCH] Add ui.expandpath command
mpm@selenic.com
parents: 350
diff changeset
57 paths[name] = path
1f81ebff98c9 [PATCH] Add ui.expandpath command
mpm@selenic.com
parents: 350
diff changeset
58
1f81ebff98c9 [PATCH] Add ui.expandpath command
mpm@selenic.com
parents: 350
diff changeset
59 return paths.get(loc, loc)
1f81ebff98c9 [PATCH] Add ui.expandpath command
mpm@selenic.com
parents: 350
diff changeset
60
207
ec327cf0d3a9 Move ui class to its own module
mpm@selenic.com
parents:
diff changeset
61 def write(self, *args):
ec327cf0d3a9 Move ui class to its own module
mpm@selenic.com
parents:
diff changeset
62 for a in args:
ec327cf0d3a9 Move ui class to its own module
mpm@selenic.com
parents:
diff changeset
63 sys.stdout.write(str(a))
565
9a80418646dd [PATCH] Make ui.warn write to stderr
mpm@selenic.com
parents: 515
diff changeset
64
9a80418646dd [PATCH] Make ui.warn write to stderr
mpm@selenic.com
parents: 515
diff changeset
65 def write_err(self, *args):
9a80418646dd [PATCH] Make ui.warn write to stderr
mpm@selenic.com
parents: 515
diff changeset
66 sys.stdout.flush()
9a80418646dd [PATCH] Make ui.warn write to stderr
mpm@selenic.com
parents: 515
diff changeset
67 for a in args:
9a80418646dd [PATCH] Make ui.warn write to stderr
mpm@selenic.com
parents: 515
diff changeset
68 sys.stderr.write(str(a))
9a80418646dd [PATCH] Make ui.warn write to stderr
mpm@selenic.com
parents: 515
diff changeset
69
207
ec327cf0d3a9 Move ui class to its own module
mpm@selenic.com
parents:
diff changeset
70 def readline(self):
ec327cf0d3a9 Move ui class to its own module
mpm@selenic.com
parents:
diff changeset
71 return sys.stdin.readline()[:-1]
ec327cf0d3a9 Move ui class to its own module
mpm@selenic.com
parents:
diff changeset
72 def prompt(self, msg, pat, default = "y"):
ec327cf0d3a9 Move ui class to its own module
mpm@selenic.com
parents:
diff changeset
73 if not self.interactive: return default
ec327cf0d3a9 Move ui class to its own module
mpm@selenic.com
parents:
diff changeset
74 while 1:
ec327cf0d3a9 Move ui class to its own module
mpm@selenic.com
parents:
diff changeset
75 self.write(msg, " ")
ec327cf0d3a9 Move ui class to its own module
mpm@selenic.com
parents:
diff changeset
76 r = self.readline()
ec327cf0d3a9 Move ui class to its own module
mpm@selenic.com
parents:
diff changeset
77 if re.match(pat, r):
ec327cf0d3a9 Move ui class to its own module
mpm@selenic.com
parents:
diff changeset
78 return r
ec327cf0d3a9 Move ui class to its own module
mpm@selenic.com
parents:
diff changeset
79 else:
ec327cf0d3a9 Move ui class to its own module
mpm@selenic.com
parents:
diff changeset
80 self.write("unrecognized response\n")
ec327cf0d3a9 Move ui class to its own module
mpm@selenic.com
parents:
diff changeset
81 def status(self, *msg):
ec327cf0d3a9 Move ui class to its own module
mpm@selenic.com
parents:
diff changeset
82 if not self.quiet: 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
83 def warn(self, *msg):
565
9a80418646dd [PATCH] Make ui.warn write to stderr
mpm@selenic.com
parents: 515
diff changeset
84 self.write_err(*msg)
207
ec327cf0d3a9 Move ui class to its own module
mpm@selenic.com
parents:
diff changeset
85 def note(self, *msg):
ec327cf0d3a9 Move ui class to its own module
mpm@selenic.com
parents:
diff changeset
86 if self.verbose: self.write(*msg)
ec327cf0d3a9 Move ui class to its own module
mpm@selenic.com
parents:
diff changeset
87 def debug(self, *msg):
ec327cf0d3a9 Move ui class to its own module
mpm@selenic.com
parents:
diff changeset
88 if self.debugflag: self.write(*msg)
ec327cf0d3a9 Move ui class to its own module
mpm@selenic.com
parents:
diff changeset
89 def edit(self, text):
249
619e775aa7f9 import and startup cleanups
mpm@selenic.com
parents: 241
diff changeset
90 import tempfile
207
ec327cf0d3a9 Move ui class to its own module
mpm@selenic.com
parents:
diff changeset
91 (fd, name) = tempfile.mkstemp("hg")
ec327cf0d3a9 Move ui class to its own module
mpm@selenic.com
parents:
diff changeset
92 f = os.fdopen(fd, "w")
ec327cf0d3a9 Move ui class to its own module
mpm@selenic.com
parents:
diff changeset
93 f.write(text)
ec327cf0d3a9 Move ui class to its own module
mpm@selenic.com
parents:
diff changeset
94 f.close()
ec327cf0d3a9 Move ui class to its own module
mpm@selenic.com
parents:
diff changeset
95
691
61c6b4178b9e HG environment variables take precedence over hgrc
mpm@selenic.com
parents: 662
diff changeset
96 editor = (os.environ.get("HGEDITOR") or
61c6b4178b9e HG environment variables take precedence over hgrc
mpm@selenic.com
parents: 662
diff changeset
97 self.config("ui", "editor") or
608
d2994b5298fb Add username/merge/editor to .hgrc
Matt Mackall <mpm@selenic.com>
parents: 565
diff changeset
98 os.environ.get("EDITOR", "vi"))
d2994b5298fb Add username/merge/editor to .hgrc
Matt Mackall <mpm@selenic.com>
parents: 565
diff changeset
99
662
b55a78595ef6 Pass username to hgeditor, remove temporary file
Radoslaw "AstralStorm" Szkodzinski <astralstorm@gorzow.mm.pl>
parents: 613
diff changeset
100 os.environ["HGUSER"] = self.username()
508
42a660abaf75 [PATCH] Harden os.system
mpm@selenic.com
parents: 506
diff changeset
101 util.system("%s %s" % (editor, name), errprefix = "edit failed")
207
ec327cf0d3a9 Move ui class to its own module
mpm@selenic.com
parents:
diff changeset
102
ec327cf0d3a9 Move ui class to its own module
mpm@selenic.com
parents:
diff changeset
103 t = open(name).read()
ec327cf0d3a9 Move ui class to its own module
mpm@selenic.com
parents:
diff changeset
104 t = re.sub("(?m)^HG:.*\n", "", t)
ec327cf0d3a9 Move ui class to its own module
mpm@selenic.com
parents:
diff changeset
105
662
b55a78595ef6 Pass username to hgeditor, remove temporary file
Radoslaw "AstralStorm" Szkodzinski <astralstorm@gorzow.mm.pl>
parents: 613
diff changeset
106 os.unlink(name)
b55a78595ef6 Pass username to hgeditor, remove temporary file
Radoslaw "AstralStorm" Szkodzinski <astralstorm@gorzow.mm.pl>
parents: 613
diff changeset
107
207
ec327cf0d3a9 Move ui class to its own module
mpm@selenic.com
parents:
diff changeset
108 return t