Mercurial > hg
annotate mercurial/ui.py @ 1535:7ae0ce7a3dc4
Add revlog.strip to truncate away revisions.
This updates the revlog data structures for index and nodemap in place
so the .d and .i files don't need to be reread after stripping away a revision.
author | mason@suse.com |
---|---|
date | Fri, 11 Nov 2005 18:20:24 -0800 |
parents | a4ba63e04134 |
children | 59b3639df0a9 |
rev | line source |
---|---|
207 | 1 # ui.py - user interface bits for mercurial |
2 # | |
3 # Copyright 2005 Matt Mackall <mpm@selenic.com> | |
4 # | |
5 # This software may be used and distributed according to the terms | |
6 # of the GNU General Public License, incorporated herein by reference. | |
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 |
1400
cf9a1233738a
i18n first part: make '_' available for files who need it
Benoit Boissinot <benoit.boissinot@ens-lyon.org
parents:
1292
diff
changeset
|
9 from i18n import gettext as _ |
613
5374955ec5b1
Demand-load most modules in the commands and ui modules.
Bryan O'Sullivan <bos@serpentine.com>
parents:
608
diff
changeset
|
10 from demandload import * |
5374955ec5b1
Demand-load most modules in the commands and ui modules.
Bryan O'Sullivan <bos@serpentine.com>
parents:
608
diff
changeset
|
11 demandload(globals(), "re socket sys util") |
207 | 12 |
13 class ui: | |
14 def __init__(self, verbose=False, debug=False, quiet=False, | |
15 interactive=True): | |
960 | 16 self.overlay = {} |
285 | 17 self.cdata = ConfigParser.SafeConfigParser() |
1473
7d66ce9895fa
make readconfig take a filename instead of a file pointer as argument
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1440
diff
changeset
|
18 self.readconfig(util.rcpath) |
285 | 19 |
20 self.quiet = self.configbool("ui", "quiet") | |
21 self.verbose = self.configbool("ui", "verbose") | |
22 self.debugflag = self.configbool("ui", "debug") | |
23 self.interactive = self.configbool("ui", "interactive", True) | |
24 | |
1071 | 25 self.updateopts(verbose, debug, quiet, interactive) |
26 | |
27 def updateopts(self, verbose=False, debug=False, quiet=False, | |
28 interactive=True): | |
285 | 29 self.quiet = (self.quiet or quiet) and not verbose and not debug |
30 self.verbose = (self.verbose or verbose) or debug | |
31 self.debugflag = (self.debugflag or debug) | |
32 self.interactive = (self.interactive and interactive) | |
33 | |
1473
7d66ce9895fa
make readconfig take a filename instead of a file pointer as argument
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1440
diff
changeset
|
34 def readconfig(self, fn): |
1483
a4ba63e04134
Fix traceback on bad system hgrc files
Soh Tk-r28629 <tksoh@freescale.com>
parents:
1473
diff
changeset
|
35 if isinstance(fn, basestring): |
a4ba63e04134
Fix traceback on bad system hgrc files
Soh Tk-r28629 <tksoh@freescale.com>
parents:
1473
diff
changeset
|
36 fn = [fn] |
a4ba63e04134
Fix traceback on bad system hgrc files
Soh Tk-r28629 <tksoh@freescale.com>
parents:
1473
diff
changeset
|
37 for f in fn: |
a4ba63e04134
Fix traceback on bad system hgrc files
Soh Tk-r28629 <tksoh@freescale.com>
parents:
1473
diff
changeset
|
38 try: |
a4ba63e04134
Fix traceback on bad system hgrc files
Soh Tk-r28629 <tksoh@freescale.com>
parents:
1473
diff
changeset
|
39 self.cdata.read(f) |
a4ba63e04134
Fix traceback on bad system hgrc files
Soh Tk-r28629 <tksoh@freescale.com>
parents:
1473
diff
changeset
|
40 except ConfigParser.ParsingError, inst: |
a4ba63e04134
Fix traceback on bad system hgrc files
Soh Tk-r28629 <tksoh@freescale.com>
parents:
1473
diff
changeset
|
41 raise util.Abort(_("Failed to parse %s\n%s") % (f, inst)) |
337 | 42 |
960 | 43 def setconfig(self, section, name, val): |
44 self.overlay[(section, name)] = val | |
45 | |
46 def config(self, section, name, default=None): | |
47 if self.overlay.has_key((section, name)): | |
48 return self.overlay[(section, name)] | |
49 if self.cdata.has_option(section, name): | |
50 return self.cdata.get(section, name) | |
285 | 51 return default |
52 | |
960 | 53 def configbool(self, section, name, default=False): |
54 if self.overlay.has_key((section, name)): | |
55 return self.overlay[(section, name)] | |
56 if self.cdata.has_option(section, name): | |
57 return self.cdata.getboolean(section, name) | |
285 | 58 return default |
59 | |
60 def configitems(self, section): | |
61 if self.cdata.has_section(section): | |
62 return self.cdata.items(section) | |
63 return [] | |
64 | |
1028
25e7ea0f2cff
Add commands.debugconfig.
Bryan O'Sullivan <bos@serpentine.com>
parents:
981
diff
changeset
|
65 def walkconfig(self): |
25e7ea0f2cff
Add commands.debugconfig.
Bryan O'Sullivan <bos@serpentine.com>
parents:
981
diff
changeset
|
66 seen = {} |
25e7ea0f2cff
Add commands.debugconfig.
Bryan O'Sullivan <bos@serpentine.com>
parents:
981
diff
changeset
|
67 for (section, name), value in self.overlay.iteritems(): |
25e7ea0f2cff
Add commands.debugconfig.
Bryan O'Sullivan <bos@serpentine.com>
parents:
981
diff
changeset
|
68 yield section, name, value |
25e7ea0f2cff
Add commands.debugconfig.
Bryan O'Sullivan <bos@serpentine.com>
parents:
981
diff
changeset
|
69 seen[section, name] = 1 |
25e7ea0f2cff
Add commands.debugconfig.
Bryan O'Sullivan <bos@serpentine.com>
parents:
981
diff
changeset
|
70 for section in self.cdata.sections(): |
25e7ea0f2cff
Add commands.debugconfig.
Bryan O'Sullivan <bos@serpentine.com>
parents:
981
diff
changeset
|
71 for name, value in self.cdata.items(section): |
25e7ea0f2cff
Add commands.debugconfig.
Bryan O'Sullivan <bos@serpentine.com>
parents:
981
diff
changeset
|
72 if (section, name) in seen: continue |
25e7ea0f2cff
Add commands.debugconfig.
Bryan O'Sullivan <bos@serpentine.com>
parents:
981
diff
changeset
|
73 yield section, name, value.replace('\n', '\\n') |
25e7ea0f2cff
Add commands.debugconfig.
Bryan O'Sullivan <bos@serpentine.com>
parents:
981
diff
changeset
|
74 seen[section, name] = 1 |
25e7ea0f2cff
Add commands.debugconfig.
Bryan O'Sullivan <bos@serpentine.com>
parents:
981
diff
changeset
|
75 |
1071 | 76 def extensions(self): |
77 return self.configitems("extensions") | |
78 | |
608
d2994b5298fb
Add username/merge/editor to .hgrc
Matt Mackall <mpm@selenic.com>
parents:
565
diff
changeset
|
79 def username(self): |
691
61c6b4178b9e
HG environment variables take precedence over hgrc
mpm@selenic.com
parents:
662
diff
changeset
|
80 return (os.environ.get("HGUSER") or |
61c6b4178b9e
HG environment variables take precedence over hgrc
mpm@selenic.com
parents:
662
diff
changeset
|
81 self.config("ui", "username") or |
608
d2994b5298fb
Add username/merge/editor to .hgrc
Matt Mackall <mpm@selenic.com>
parents:
565
diff
changeset
|
82 os.environ.get("EMAIL") or |
d2994b5298fb
Add username/merge/editor to .hgrc
Matt Mackall <mpm@selenic.com>
parents:
565
diff
changeset
|
83 (os.environ.get("LOGNAME", |
d2994b5298fb
Add username/merge/editor to .hgrc
Matt Mackall <mpm@selenic.com>
parents:
565
diff
changeset
|
84 os.environ.get("USERNAME", "unknown")) |
d2994b5298fb
Add username/merge/editor to .hgrc
Matt Mackall <mpm@selenic.com>
parents:
565
diff
changeset
|
85 + '@' + socket.getfqdn())) |
d2994b5298fb
Add username/merge/editor to .hgrc
Matt Mackall <mpm@selenic.com>
parents:
565
diff
changeset
|
86 |
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
|
87 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
|
88 """Return a short representation of a user name or email address.""" |
1147 | 89 if not self.verbose: |
90 f = user.find('@') | |
91 if f >= 0: | |
92 user = user[:f] | |
93 f = user.find('<') | |
94 if f >= 0: | |
95 user = user[f+1:] | |
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
|
96 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
|
97 |
1440 | 98 def expandpath(self, loc, root=""): |
506 | 99 paths = {} |
100 for name, path in self.configitems("paths"): | |
1440 | 101 m = path.find("://") |
102 if m == -1: | |
103 path = os.path.join(root, path) | |
506 | 104 paths[name] = path |
105 | |
106 return paths.get(loc, loc) | |
107 | |
207 | 108 def write(self, *args): |
109 for a in args: | |
110 sys.stdout.write(str(a)) | |
565 | 111 |
112 def write_err(self, *args): | |
113 sys.stdout.flush() | |
114 for a in args: | |
115 sys.stderr.write(str(a)) | |
116 | |
207 | 117 def readline(self): |
118 return sys.stdin.readline()[:-1] | |
1062 | 119 def prompt(self, msg, pat, default="y"): |
207 | 120 if not self.interactive: return default |
121 while 1: | |
122 self.write(msg, " ") | |
123 r = self.readline() | |
124 if re.match(pat, r): | |
125 return r | |
126 else: | |
1402
9d2c2e6b32b5
i18n part2: use '_' for all strings who are part of the user interface
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1400
diff
changeset
|
127 self.write(_("unrecognized response\n")) |
207 | 128 def status(self, *msg): |
129 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
|
130 def warn(self, *msg): |
565 | 131 self.write_err(*msg) |
207 | 132 def note(self, *msg): |
133 if self.verbose: self.write(*msg) | |
134 def debug(self, *msg): | |
135 if self.debugflag: self.write(*msg) | |
136 def edit(self, text): | |
249 | 137 import tempfile |
207 | 138 (fd, name) = tempfile.mkstemp("hg") |
139 f = os.fdopen(fd, "w") | |
140 f.write(text) | |
141 f.close() | |
142 | |
691
61c6b4178b9e
HG environment variables take precedence over hgrc
mpm@selenic.com
parents:
662
diff
changeset
|
143 editor = (os.environ.get("HGEDITOR") or |
61c6b4178b9e
HG environment variables take precedence over hgrc
mpm@selenic.com
parents:
662
diff
changeset
|
144 self.config("ui", "editor") or |
608
d2994b5298fb
Add username/merge/editor to .hgrc
Matt Mackall <mpm@selenic.com>
parents:
565
diff
changeset
|
145 os.environ.get("EDITOR", "vi")) |
d2994b5298fb
Add username/merge/editor to .hgrc
Matt Mackall <mpm@selenic.com>
parents:
565
diff
changeset
|
146 |
662
b55a78595ef6
Pass username to hgeditor, remove temporary file
Radoslaw "AstralStorm" Szkodzinski <astralstorm@gorzow.mm.pl>
parents:
613
diff
changeset
|
147 os.environ["HGUSER"] = self.username() |
1402
9d2c2e6b32b5
i18n part2: use '_' for all strings who are part of the user interface
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1400
diff
changeset
|
148 util.system("%s %s" % (editor, name), errprefix=_("edit failed")) |
207 | 149 |
150 t = open(name).read() | |
151 t = re.sub("(?m)^HG:.*\n", "", t) | |
152 | |
662
b55a78595ef6
Pass username to hgeditor, remove temporary file
Radoslaw "AstralStorm" Szkodzinski <astralstorm@gorzow.mm.pl>
parents:
613
diff
changeset
|
153 os.unlink(name) |
b55a78595ef6
Pass username to hgeditor, remove temporary file
Radoslaw "AstralStorm" Szkodzinski <astralstorm@gorzow.mm.pl>
parents:
613
diff
changeset
|
154 |
207 | 155 return t |