annotate mercurial/ui.py @ 460:6409d9a0df43

add dirstate debugging commands -----BEGIN PGP SIGNED MESSAGE----- Hash: SHA1 add dirstate debugging commands As I've played with various different merges and more recently rawcommit, I've found the following patch to be very very helpful in figuring out whether the dirstate is being left in a consistent or inconsistent state with respect to the current manifest. I attempted to deduce the invariants that were assumed by the current code, and then check it in this code. I may or may not have captured the design intent in this check; if not, I'd be very happy to hear more clearly what was intended, so that I can write tests to that expectation. Anyway, here's the patch. Not sure if it's a good idea to commit it to the mainline, or just leave it as a debugging aid. I attempted to package it so that it doesn't interfere with normal usage. Michael Fetterman (tweaked by mpm: remove -d magic) manifest hash: 869f5b5f954dc0f46ba27322359e811d5e21d71c -----BEGIN PGP SIGNATURE----- Version: GnuPG v1.4.0 (GNU/Linux) iD8DBQFCvP77ywK+sNU5EO8RArmtAKCCVuI2slANzWZ26P5edtH/ixdwNwCfZLWl 5P+V+C92II3usO4YW2MULKY= =/Pv4 -----END PGP SIGNATURE-----
author mpm@selenic.com
date Fri, 24 Jun 2005 22:51:39 -0800
parents b4e0e20646bb
children 1f81ebff98c9
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
285
5a1e6d27f399 ui: add configuration file support
mpm@selenic.com
parents: 249
diff changeset
8 import os, sys, re, ConfigParser
207
ec327cf0d3a9 Move ui class to its own module
mpm@selenic.com
parents:
diff changeset
9
ec327cf0d3a9 Move ui class to its own module
mpm@selenic.com
parents:
diff changeset
10 class ui:
ec327cf0d3a9 Move ui class to its own module
mpm@selenic.com
parents:
diff changeset
11 def __init__(self, verbose=False, debug=False, quiet=False,
ec327cf0d3a9 Move ui class to its own module
mpm@selenic.com
parents:
diff changeset
12 interactive=True):
285
5a1e6d27f399 ui: add configuration file support
mpm@selenic.com
parents: 249
diff changeset
13 self.cdata = ConfigParser.SafeConfigParser()
5a1e6d27f399 ui: add configuration file support
mpm@selenic.com
parents: 249
diff changeset
14 self.cdata.read(os.path.expanduser("~/.hgrc"))
5a1e6d27f399 ui: add configuration file support
mpm@selenic.com
parents: 249
diff changeset
15
5a1e6d27f399 ui: add configuration file support
mpm@selenic.com
parents: 249
diff changeset
16 self.quiet = self.configbool("ui", "quiet")
5a1e6d27f399 ui: add configuration file support
mpm@selenic.com
parents: 249
diff changeset
17 self.verbose = self.configbool("ui", "verbose")
5a1e6d27f399 ui: add configuration file support
mpm@selenic.com
parents: 249
diff changeset
18 self.debugflag = self.configbool("ui", "debug")
5a1e6d27f399 ui: add configuration file support
mpm@selenic.com
parents: 249
diff changeset
19 self.interactive = self.configbool("ui", "interactive", True)
5a1e6d27f399 ui: add configuration file support
mpm@selenic.com
parents: 249
diff changeset
20
5a1e6d27f399 ui: add configuration file support
mpm@selenic.com
parents: 249
diff changeset
21 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
22 self.verbose = (self.verbose or verbose) or debug
5a1e6d27f399 ui: add configuration file support
mpm@selenic.com
parents: 249
diff changeset
23 self.debugflag = (self.debugflag or debug)
5a1e6d27f399 ui: add configuration file support
mpm@selenic.com
parents: 249
diff changeset
24 self.interactive = (self.interactive and interactive)
5a1e6d27f399 ui: add configuration file support
mpm@selenic.com
parents: 249
diff changeset
25
337
c3d873ef4b31 Add support for .hg/hgrc file
mpm@selenic.com
parents: 285
diff changeset
26 def readconfig(self, fp):
c3d873ef4b31 Add support for .hg/hgrc file
mpm@selenic.com
parents: 285
diff changeset
27 self.cdata.readfp(fp)
c3d873ef4b31 Add support for .hg/hgrc file
mpm@selenic.com
parents: 285
diff changeset
28
285
5a1e6d27f399 ui: add configuration file support
mpm@selenic.com
parents: 249
diff changeset
29 def config(self, section, val, default=None):
5a1e6d27f399 ui: add configuration file support
mpm@selenic.com
parents: 249
diff changeset
30 if self.cdata.has_option(section, val):
5a1e6d27f399 ui: add configuration file support
mpm@selenic.com
parents: 249
diff changeset
31 return self.cdata.get(section, val)
5a1e6d27f399 ui: add configuration file support
mpm@selenic.com
parents: 249
diff changeset
32 return default
5a1e6d27f399 ui: add configuration file support
mpm@selenic.com
parents: 249
diff changeset
33
5a1e6d27f399 ui: add configuration file support
mpm@selenic.com
parents: 249
diff changeset
34 def configbool(self, section, val, default=False):
5a1e6d27f399 ui: add configuration file support
mpm@selenic.com
parents: 249
diff changeset
35 if self.cdata.has_option(section, val):
5a1e6d27f399 ui: add configuration file support
mpm@selenic.com
parents: 249
diff changeset
36 return self.cdata.getboolean(section, val)
5a1e6d27f399 ui: add configuration file support
mpm@selenic.com
parents: 249
diff changeset
37 return default
5a1e6d27f399 ui: add configuration file support
mpm@selenic.com
parents: 249
diff changeset
38
5a1e6d27f399 ui: add configuration file support
mpm@selenic.com
parents: 249
diff changeset
39 def configitems(self, section):
5a1e6d27f399 ui: add configuration file support
mpm@selenic.com
parents: 249
diff changeset
40 if self.cdata.has_section(section):
5a1e6d27f399 ui: add configuration file support
mpm@selenic.com
parents: 249
diff changeset
41 return self.cdata.items(section)
5a1e6d27f399 ui: add configuration file support
mpm@selenic.com
parents: 249
diff changeset
42 return []
5a1e6d27f399 ui: add configuration file support
mpm@selenic.com
parents: 249
diff changeset
43
207
ec327cf0d3a9 Move ui class to its own module
mpm@selenic.com
parents:
diff changeset
44 def write(self, *args):
ec327cf0d3a9 Move ui class to its own module
mpm@selenic.com
parents:
diff changeset
45 for a in args:
ec327cf0d3a9 Move ui class to its own module
mpm@selenic.com
parents:
diff changeset
46 sys.stdout.write(str(a))
ec327cf0d3a9 Move ui class to its own module
mpm@selenic.com
parents:
diff changeset
47 def readline(self):
ec327cf0d3a9 Move ui class to its own module
mpm@selenic.com
parents:
diff changeset
48 return sys.stdin.readline()[:-1]
ec327cf0d3a9 Move ui class to its own module
mpm@selenic.com
parents:
diff changeset
49 def prompt(self, msg, pat, default = "y"):
ec327cf0d3a9 Move ui class to its own module
mpm@selenic.com
parents:
diff changeset
50 if not self.interactive: return default
ec327cf0d3a9 Move ui class to its own module
mpm@selenic.com
parents:
diff changeset
51 while 1:
ec327cf0d3a9 Move ui class to its own module
mpm@selenic.com
parents:
diff changeset
52 self.write(msg, " ")
ec327cf0d3a9 Move ui class to its own module
mpm@selenic.com
parents:
diff changeset
53 r = self.readline()
ec327cf0d3a9 Move ui class to its own module
mpm@selenic.com
parents:
diff changeset
54 if re.match(pat, r):
ec327cf0d3a9 Move ui class to its own module
mpm@selenic.com
parents:
diff changeset
55 return r
ec327cf0d3a9 Move ui class to its own module
mpm@selenic.com
parents:
diff changeset
56 else:
ec327cf0d3a9 Move ui class to its own module
mpm@selenic.com
parents:
diff changeset
57 self.write("unrecognized response\n")
ec327cf0d3a9 Move ui class to its own module
mpm@selenic.com
parents:
diff changeset
58 def status(self, *msg):
ec327cf0d3a9 Move ui class to its own module
mpm@selenic.com
parents:
diff changeset
59 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
60 def warn(self, *msg):
207
ec327cf0d3a9 Move ui class to its own module
mpm@selenic.com
parents:
diff changeset
61 self.write(*msg)
ec327cf0d3a9 Move ui class to its own module
mpm@selenic.com
parents:
diff changeset
62 def note(self, *msg):
ec327cf0d3a9 Move ui class to its own module
mpm@selenic.com
parents:
diff changeset
63 if self.verbose: self.write(*msg)
ec327cf0d3a9 Move ui class to its own module
mpm@selenic.com
parents:
diff changeset
64 def debug(self, *msg):
ec327cf0d3a9 Move ui class to its own module
mpm@selenic.com
parents:
diff changeset
65 if self.debugflag: self.write(*msg)
ec327cf0d3a9 Move ui class to its own module
mpm@selenic.com
parents:
diff changeset
66 def edit(self, text):
249
619e775aa7f9 import and startup cleanups
mpm@selenic.com
parents: 241
diff changeset
67 import tempfile
207
ec327cf0d3a9 Move ui class to its own module
mpm@selenic.com
parents:
diff changeset
68 (fd, name) = tempfile.mkstemp("hg")
ec327cf0d3a9 Move ui class to its own module
mpm@selenic.com
parents:
diff changeset
69 f = os.fdopen(fd, "w")
ec327cf0d3a9 Move ui class to its own module
mpm@selenic.com
parents:
diff changeset
70 f.write(text)
ec327cf0d3a9 Move ui class to its own module
mpm@selenic.com
parents:
diff changeset
71 f.close()
ec327cf0d3a9 Move ui class to its own module
mpm@selenic.com
parents:
diff changeset
72
ec327cf0d3a9 Move ui class to its own module
mpm@selenic.com
parents:
diff changeset
73 editor = os.environ.get("HGEDITOR") or os.environ.get("EDITOR", "vi")
ec327cf0d3a9 Move ui class to its own module
mpm@selenic.com
parents:
diff changeset
74 r = os.system("%s %s" % (editor, name))
ec327cf0d3a9 Move ui class to its own module
mpm@selenic.com
parents:
diff changeset
75
ec327cf0d3a9 Move ui class to its own module
mpm@selenic.com
parents:
diff changeset
76 if r:
ec327cf0d3a9 Move ui class to its own module
mpm@selenic.com
parents:
diff changeset
77 raise "Edit failed!"
ec327cf0d3a9 Move ui class to its own module
mpm@selenic.com
parents:
diff changeset
78
ec327cf0d3a9 Move ui class to its own module
mpm@selenic.com
parents:
diff changeset
79 t = open(name).read()
ec327cf0d3a9 Move ui class to its own module
mpm@selenic.com
parents:
diff changeset
80 t = re.sub("(?m)^HG:.*\n", "", t)
ec327cf0d3a9 Move ui class to its own module
mpm@selenic.com
parents:
diff changeset
81
ec327cf0d3a9 Move ui class to its own module
mpm@selenic.com
parents:
diff changeset
82 return t
ec327cf0d3a9 Move ui class to its own module
mpm@selenic.com
parents:
diff changeset
83