mercurial/ui.py
author mpm@selenic.com
Fri, 10 Jun 2005 00:26:29 -0800
changeset 301 5add718d92db
parent 285 5a1e6d27f399
child 337 c3d873ef4b31
child 349 b2293093b89e
permissions -rw-r--r--
revlog: allow duplicates -----BEGIN PGP SIGNED MESSAGE----- Hash: SHA1 revlog: allow duplicates If two branches make the same change to the same parent, the result will be an identical hash. Git apparently does this all the time. Deal with it gracefully. manifest hash: c6217eab4b310e1ae529dd75ab90e717dbe5d55d -----BEGIN PGP SIGNATURE----- Version: GnuPG v1.4.0 (GNU/Linux) iD8DBQFCqU61ywK+sNU5EO8RAkFqAJ9KhWUQgjZbzzB/+mTkolH0GkT1awCfa+Mj ulbI4xCRZcvfQE492mcNwQA= =N6In -----END PGP SIGNATURE-----
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
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
5a1e6d27f399 ui: add configuration file support
mpm@selenic.com
parents: 249
diff changeset
    26
    def config(self, section, val, default=None):
5a1e6d27f399 ui: add configuration file support
mpm@selenic.com
parents: 249
diff changeset
    27
        if self.cdata.has_option(section, val):
5a1e6d27f399 ui: add configuration file support
mpm@selenic.com
parents: 249
diff changeset
    28
            return self.cdata.get(section, val)
5a1e6d27f399 ui: add configuration file support
mpm@selenic.com
parents: 249
diff changeset
    29
        return default
5a1e6d27f399 ui: add configuration file support
mpm@selenic.com
parents: 249
diff changeset
    30
5a1e6d27f399 ui: add configuration file support
mpm@selenic.com
parents: 249
diff changeset
    31
    def configbool(self, section, val, default=False):
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.getboolean(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 configitems(self, section):
5a1e6d27f399 ui: add configuration file support
mpm@selenic.com
parents: 249
diff changeset
    37
        if self.cdata.has_section(section):
5a1e6d27f399 ui: add configuration file support
mpm@selenic.com
parents: 249
diff changeset
    38
            return self.cdata.items(section)
5a1e6d27f399 ui: add configuration file support
mpm@selenic.com
parents: 249
diff changeset
    39
        return []
5a1e6d27f399 ui: add configuration file support
mpm@selenic.com
parents: 249
diff changeset
    40
207
ec327cf0d3a9 Move ui class to its own module
mpm@selenic.com
parents:
diff changeset
    41
    def write(self, *args):
ec327cf0d3a9 Move ui class to its own module
mpm@selenic.com
parents:
diff changeset
    42
        for a in args:
ec327cf0d3a9 Move ui class to its own module
mpm@selenic.com
parents:
diff changeset
    43
            sys.stdout.write(str(a))
ec327cf0d3a9 Move ui class to its own module
mpm@selenic.com
parents:
diff changeset
    44
    def readline(self):
ec327cf0d3a9 Move ui class to its own module
mpm@selenic.com
parents:
diff changeset
    45
        return sys.stdin.readline()[:-1]
ec327cf0d3a9 Move ui class to its own module
mpm@selenic.com
parents:
diff changeset
    46
    def prompt(self, msg, pat, default = "y"):
ec327cf0d3a9 Move ui class to its own module
mpm@selenic.com
parents:
diff changeset
    47
        if not self.interactive: return default
ec327cf0d3a9 Move ui class to its own module
mpm@selenic.com
parents:
diff changeset
    48
        while 1:
ec327cf0d3a9 Move ui class to its own module
mpm@selenic.com
parents:
diff changeset
    49
            self.write(msg, " ")
ec327cf0d3a9 Move ui class to its own module
mpm@selenic.com
parents:
diff changeset
    50
            r = self.readline()
ec327cf0d3a9 Move ui class to its own module
mpm@selenic.com
parents:
diff changeset
    51
            if re.match(pat, r):
ec327cf0d3a9 Move ui class to its own module
mpm@selenic.com
parents:
diff changeset
    52
                return r
ec327cf0d3a9 Move ui class to its own module
mpm@selenic.com
parents:
diff changeset
    53
            else:
ec327cf0d3a9 Move ui class to its own module
mpm@selenic.com
parents:
diff changeset
    54
                self.write("unrecognized response\n")
ec327cf0d3a9 Move ui class to its own module
mpm@selenic.com
parents:
diff changeset
    55
    def status(self, *msg):
ec327cf0d3a9 Move ui class to its own module
mpm@selenic.com
parents:
diff changeset
    56
        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
    57
    def warn(self, *msg):
207
ec327cf0d3a9 Move ui class to its own module
mpm@selenic.com
parents:
diff changeset
    58
        self.write(*msg)
ec327cf0d3a9 Move ui class to its own module
mpm@selenic.com
parents:
diff changeset
    59
    def note(self, *msg):
ec327cf0d3a9 Move ui class to its own module
mpm@selenic.com
parents:
diff changeset
    60
        if self.verbose: self.write(*msg)
ec327cf0d3a9 Move ui class to its own module
mpm@selenic.com
parents:
diff changeset
    61
    def debug(self, *msg):
ec327cf0d3a9 Move ui class to its own module
mpm@selenic.com
parents:
diff changeset
    62
        if self.debugflag: self.write(*msg)
ec327cf0d3a9 Move ui class to its own module
mpm@selenic.com
parents:
diff changeset
    63
    def edit(self, text):
249
619e775aa7f9 import and startup cleanups
mpm@selenic.com
parents: 241
diff changeset
    64
        import tempfile
207
ec327cf0d3a9 Move ui class to its own module
mpm@selenic.com
parents:
diff changeset
    65
        (fd, name) = tempfile.mkstemp("hg")
ec327cf0d3a9 Move ui class to its own module
mpm@selenic.com
parents:
diff changeset
    66
        f = os.fdopen(fd, "w")
ec327cf0d3a9 Move ui class to its own module
mpm@selenic.com
parents:
diff changeset
    67
        f.write(text)
ec327cf0d3a9 Move ui class to its own module
mpm@selenic.com
parents:
diff changeset
    68
        f.close()
ec327cf0d3a9 Move ui class to its own module
mpm@selenic.com
parents:
diff changeset
    69
ec327cf0d3a9 Move ui class to its own module
mpm@selenic.com
parents:
diff changeset
    70
        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
    71
        r = os.system("%s %s" % (editor, name))
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
        if r:
ec327cf0d3a9 Move ui class to its own module
mpm@selenic.com
parents:
diff changeset
    74
            raise "Edit failed!"
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
        t = open(name).read()
ec327cf0d3a9 Move ui class to its own module
mpm@selenic.com
parents:
diff changeset
    77
        t = re.sub("(?m)^HG:.*\n", "", t)
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
        return t
ec327cf0d3a9 Move ui class to its own module
mpm@selenic.com
parents:
diff changeset
    80