mercurial/ui.py
author Thomas Arendsen Hein <thomas@intevation.de>
Sun, 02 Apr 2006 22:12:56 +0200
changeset 2040 cd7711268774
parent 2033 e3280d350792
child 2072 74d3f5336b66
permissions -rw-r--r--
Don't enter an endless loop if remote hg doesn't answer, show remote noise. The endless loop is not only triggered if the remote shell is too noisy, but even if the local ssh command dies due to an error.
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
1866
89a6ce5ae510 inherit hgrc so "%" interpolation works.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 1840
diff changeset
     8
import 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 *
1989
0541768fa558 ignore EPIPE in ui.err_write
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 1985
diff changeset
    11
demandload(globals(), "errno os re socket sys tempfile util")
207
ec327cf0d3a9 Move ui class to its own module
mpm@selenic.com
parents:
diff changeset
    12
1559
59b3639df0a9 Convert all classes to new-style classes by deriving them from object.
Eric Hopper <hopper@omnifarious.org>
parents: 1483
diff changeset
    13
class ui(object):
207
ec327cf0d3a9 Move ui class to its own module
mpm@selenic.com
parents:
diff changeset
    14
    def __init__(self, verbose=False, debug=False, quiet=False,
1839
876e4e6ad82b Create local ui object per repository, so .hg/hgrc don't get mixed.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1637
diff changeset
    15
                 interactive=True, parentui=None):
960
abfb5cc97fcd Add ui.setconfig overlay
mpm@selenic.com
parents: 953
diff changeset
    16
        self.overlay = {}
1839
876e4e6ad82b Create local ui object per repository, so .hg/hgrc don't get mixed.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1637
diff changeset
    17
        if parentui is None:
1874
a84829140fb1 Inherit config from real parentui and don't use ConfigParser internals.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1866
diff changeset
    18
            # this is the parent of all ui children
a84829140fb1 Inherit config from real parentui and don't use ConfigParser internals.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1866
diff changeset
    19
            self.parentui = None
a84829140fb1 Inherit config from real parentui and don't use ConfigParser internals.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1866
diff changeset
    20
            self.cdata = ConfigParser.SafeConfigParser()
1951
696230e52e4d add HGRCPATH env var, list of places to look for hgrc files.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 1938
diff changeset
    21
            self.readconfig(util.rcpath())
285
5a1e6d27f399 ui: add configuration file support
mpm@selenic.com
parents: 249
diff changeset
    22
1839
876e4e6ad82b Create local ui object per repository, so .hg/hgrc don't get mixed.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1637
diff changeset
    23
            self.quiet = self.configbool("ui", "quiet")
876e4e6ad82b Create local ui object per repository, so .hg/hgrc don't get mixed.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1637
diff changeset
    24
            self.verbose = self.configbool("ui", "verbose")
876e4e6ad82b Create local ui object per repository, so .hg/hgrc don't get mixed.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1637
diff changeset
    25
            self.debugflag = self.configbool("ui", "debug")
876e4e6ad82b Create local ui object per repository, so .hg/hgrc don't get mixed.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1637
diff changeset
    26
            self.interactive = self.configbool("ui", "interactive", True)
285
5a1e6d27f399 ui: add configuration file support
mpm@selenic.com
parents: 249
diff changeset
    27
1839
876e4e6ad82b Create local ui object per repository, so .hg/hgrc don't get mixed.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1637
diff changeset
    28
            self.updateopts(verbose, debug, quiet, interactive)
876e4e6ad82b Create local ui object per repository, so .hg/hgrc don't get mixed.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1637
diff changeset
    29
            self.diffcache = None
2033
e3280d350792 Group changes done by the same developer on the same with --style=changelog
Thomas Arendsen Hein <thomas@intevation.de>
parents: 2013
diff changeset
    30
            self.header = []
e3280d350792 Group changes done by the same developer on the same with --style=changelog
Thomas Arendsen Hein <thomas@intevation.de>
parents: 2013
diff changeset
    31
            self.prev_header = []
1866
89a6ce5ae510 inherit hgrc so "%" interpolation works.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 1840
diff changeset
    32
        else:
1874
a84829140fb1 Inherit config from real parentui and don't use ConfigParser internals.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1866
diff changeset
    33
            # parentui may point to an ui object which is already a child
a84829140fb1 Inherit config from real parentui and don't use ConfigParser internals.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1866
diff changeset
    34
            self.parentui = parentui.parentui or parentui
a84829140fb1 Inherit config from real parentui and don't use ConfigParser internals.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1866
diff changeset
    35
            parent_cdata = self.parentui.cdata
a84829140fb1 Inherit config from real parentui and don't use ConfigParser internals.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1866
diff changeset
    36
            self.cdata = ConfigParser.SafeConfigParser(parent_cdata.defaults())
a84829140fb1 Inherit config from real parentui and don't use ConfigParser internals.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1866
diff changeset
    37
            # make interpolation work
a84829140fb1 Inherit config from real parentui and don't use ConfigParser internals.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1866
diff changeset
    38
            for section in parent_cdata.sections():
a84829140fb1 Inherit config from real parentui and don't use ConfigParser internals.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1866
diff changeset
    39
                self.cdata.add_section(section)
a84829140fb1 Inherit config from real parentui and don't use ConfigParser internals.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1866
diff changeset
    40
                for name, value in parent_cdata.items(section, raw=True):
a84829140fb1 Inherit config from real parentui and don't use ConfigParser internals.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1866
diff changeset
    41
                    self.cdata.set(section, name, value)
1839
876e4e6ad82b Create local ui object per repository, so .hg/hgrc don't get mixed.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1637
diff changeset
    42
876e4e6ad82b Create local ui object per repository, so .hg/hgrc don't get mixed.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1637
diff changeset
    43
    def __getattr__(self, key):
876e4e6ad82b Create local ui object per repository, so .hg/hgrc don't get mixed.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1637
diff changeset
    44
        return getattr(self.parentui, key)
1071
8f0ac653f85e Add support for extension modules
mason@suse.com
parents: 1062
diff changeset
    45
8f0ac653f85e Add support for extension modules
mason@suse.com
parents: 1062
diff changeset
    46
    def updateopts(self, verbose=False, debug=False, quiet=False,
8f0ac653f85e Add support for extension modules
mason@suse.com
parents: 1062
diff changeset
    47
                 interactive=True):
285
5a1e6d27f399 ui: add configuration file support
mpm@selenic.com
parents: 249
diff changeset
    48
        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
    49
        self.verbose = (self.verbose or verbose) or debug
5a1e6d27f399 ui: add configuration file support
mpm@selenic.com
parents: 249
diff changeset
    50
        self.debugflag = (self.debugflag or debug)
5a1e6d27f399 ui: add configuration file support
mpm@selenic.com
parents: 249
diff changeset
    51
        self.interactive = (self.interactive and interactive)
5a1e6d27f399 ui: add configuration file support
mpm@selenic.com
parents: 249
diff changeset
    52
1893
6569651a4f1e Read paths specified in .hg/hgrc relative to repo root, otherwise to home dir.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1892
diff changeset
    53
    def readconfig(self, fn, root=None):
1483
a4ba63e04134 Fix traceback on bad system hgrc files
Soh Tk-r28629 <tksoh@freescale.com>
parents: 1473
diff changeset
    54
        if isinstance(fn, basestring):
a4ba63e04134 Fix traceback on bad system hgrc files
Soh Tk-r28629 <tksoh@freescale.com>
parents: 1473
diff changeset
    55
            fn = [fn]
a4ba63e04134 Fix traceback on bad system hgrc files
Soh Tk-r28629 <tksoh@freescale.com>
parents: 1473
diff changeset
    56
        for f in fn:
a4ba63e04134 Fix traceback on bad system hgrc files
Soh Tk-r28629 <tksoh@freescale.com>
parents: 1473
diff changeset
    57
            try:
a4ba63e04134 Fix traceback on bad system hgrc files
Soh Tk-r28629 <tksoh@freescale.com>
parents: 1473
diff changeset
    58
                self.cdata.read(f)
a4ba63e04134 Fix traceback on bad system hgrc files
Soh Tk-r28629 <tksoh@freescale.com>
parents: 1473
diff changeset
    59
            except ConfigParser.ParsingError, inst:
a4ba63e04134 Fix traceback on bad system hgrc files
Soh Tk-r28629 <tksoh@freescale.com>
parents: 1473
diff changeset
    60
                raise util.Abort(_("Failed to parse %s\n%s") % (f, inst))
1893
6569651a4f1e Read paths specified in .hg/hgrc relative to repo root, otherwise to home dir.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1892
diff changeset
    61
        # translate paths relative to root (or home) into absolute paths
6569651a4f1e Read paths specified in .hg/hgrc relative to repo root, otherwise to home dir.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1892
diff changeset
    62
        if root is None:
6569651a4f1e Read paths specified in .hg/hgrc relative to repo root, otherwise to home dir.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1892
diff changeset
    63
            root = os.path.expanduser('~')
6569651a4f1e Read paths specified in .hg/hgrc relative to repo root, otherwise to home dir.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1892
diff changeset
    64
        for name, path in self.configitems("paths"):
1921
acce3f7e1779 Don't expand empty [paths] so later interpolation can do the right thing.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1893
diff changeset
    65
            if path and path.find("://") == -1 and not os.path.isabs(path):
1893
6569651a4f1e Read paths specified in .hg/hgrc relative to repo root, otherwise to home dir.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1892
diff changeset
    66
                self.cdata.set("paths", name, os.path.join(root, path))
337
c3d873ef4b31 Add support for .hg/hgrc file
mpm@selenic.com
parents: 285
diff changeset
    67
960
abfb5cc97fcd Add ui.setconfig overlay
mpm@selenic.com
parents: 953
diff changeset
    68
    def setconfig(self, section, name, val):
abfb5cc97fcd Add ui.setconfig overlay
mpm@selenic.com
parents: 953
diff changeset
    69
        self.overlay[(section, name)] = val
abfb5cc97fcd Add ui.setconfig overlay
mpm@selenic.com
parents: 953
diff changeset
    70
abfb5cc97fcd Add ui.setconfig overlay
mpm@selenic.com
parents: 953
diff changeset
    71
    def config(self, section, name, default=None):
abfb5cc97fcd Add ui.setconfig overlay
mpm@selenic.com
parents: 953
diff changeset
    72
        if self.overlay.has_key((section, name)):
abfb5cc97fcd Add ui.setconfig overlay
mpm@selenic.com
parents: 953
diff changeset
    73
            return self.overlay[(section, name)]
abfb5cc97fcd Add ui.setconfig overlay
mpm@selenic.com
parents: 953
diff changeset
    74
        if self.cdata.has_option(section, name):
1876
2e0fd78587bd Catch hgrc interpolation errors nicely.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1874
diff changeset
    75
            try:
2e0fd78587bd Catch hgrc interpolation errors nicely.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1874
diff changeset
    76
                return self.cdata.get(section, name)
2e0fd78587bd Catch hgrc interpolation errors nicely.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1874
diff changeset
    77
            except ConfigParser.InterpolationError, inst:
2e0fd78587bd Catch hgrc interpolation errors nicely.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1874
diff changeset
    78
                raise util.Abort(_("Error in configuration:\n%s") % inst)
1839
876e4e6ad82b Create local ui object per repository, so .hg/hgrc don't get mixed.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1637
diff changeset
    79
        if self.parentui is None:
876e4e6ad82b Create local ui object per repository, so .hg/hgrc don't get mixed.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1637
diff changeset
    80
            return default
876e4e6ad82b Create local ui object per repository, so .hg/hgrc don't get mixed.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1637
diff changeset
    81
        else:
876e4e6ad82b Create local ui object per repository, so .hg/hgrc don't get mixed.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1637
diff changeset
    82
            return self.parentui.config(section, name, default)
285
5a1e6d27f399 ui: add configuration file support
mpm@selenic.com
parents: 249
diff changeset
    83
960
abfb5cc97fcd Add ui.setconfig overlay
mpm@selenic.com
parents: 953
diff changeset
    84
    def configbool(self, section, name, default=False):
abfb5cc97fcd Add ui.setconfig overlay
mpm@selenic.com
parents: 953
diff changeset
    85
        if self.overlay.has_key((section, name)):
abfb5cc97fcd Add ui.setconfig overlay
mpm@selenic.com
parents: 953
diff changeset
    86
            return self.overlay[(section, name)]
abfb5cc97fcd Add ui.setconfig overlay
mpm@selenic.com
parents: 953
diff changeset
    87
        if self.cdata.has_option(section, name):
1876
2e0fd78587bd Catch hgrc interpolation errors nicely.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1874
diff changeset
    88
            try:
2e0fd78587bd Catch hgrc interpolation errors nicely.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1874
diff changeset
    89
                return self.cdata.getboolean(section, name)
2e0fd78587bd Catch hgrc interpolation errors nicely.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1874
diff changeset
    90
            except ConfigParser.InterpolationError, inst:
2e0fd78587bd Catch hgrc interpolation errors nicely.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1874
diff changeset
    91
                raise util.Abort(_("Error in configuration:\n%s") % inst)
1839
876e4e6ad82b Create local ui object per repository, so .hg/hgrc don't get mixed.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1637
diff changeset
    92
        if self.parentui is None:
876e4e6ad82b Create local ui object per repository, so .hg/hgrc don't get mixed.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1637
diff changeset
    93
            return default
876e4e6ad82b Create local ui object per repository, so .hg/hgrc don't get mixed.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1637
diff changeset
    94
        else:
876e4e6ad82b Create local ui object per repository, so .hg/hgrc don't get mixed.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1637
diff changeset
    95
            return self.parentui.configbool(section, name, default)
285
5a1e6d27f399 ui: add configuration file support
mpm@selenic.com
parents: 249
diff changeset
    96
5a1e6d27f399 ui: add configuration file support
mpm@selenic.com
parents: 249
diff changeset
    97
    def configitems(self, section):
1839
876e4e6ad82b Create local ui object per repository, so .hg/hgrc don't get mixed.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1637
diff changeset
    98
        items = {}
876e4e6ad82b Create local ui object per repository, so .hg/hgrc don't get mixed.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1637
diff changeset
    99
        if self.parentui is not None:
876e4e6ad82b Create local ui object per repository, so .hg/hgrc don't get mixed.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1637
diff changeset
   100
            items = dict(self.parentui.configitems(section))
285
5a1e6d27f399 ui: add configuration file support
mpm@selenic.com
parents: 249
diff changeset
   101
        if self.cdata.has_section(section):
1876
2e0fd78587bd Catch hgrc interpolation errors nicely.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1874
diff changeset
   102
            try:
2e0fd78587bd Catch hgrc interpolation errors nicely.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1874
diff changeset
   103
                items.update(dict(self.cdata.items(section)))
2e0fd78587bd Catch hgrc interpolation errors nicely.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1874
diff changeset
   104
            except ConfigParser.InterpolationError, inst:
2e0fd78587bd Catch hgrc interpolation errors nicely.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1874
diff changeset
   105
                raise util.Abort(_("Error in configuration:\n%s") % inst)
1839
876e4e6ad82b Create local ui object per repository, so .hg/hgrc don't get mixed.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1637
diff changeset
   106
        x = items.items()
876e4e6ad82b Create local ui object per repository, so .hg/hgrc don't get mixed.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1637
diff changeset
   107
        x.sort()
876e4e6ad82b Create local ui object per repository, so .hg/hgrc don't get mixed.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1637
diff changeset
   108
        return x
285
5a1e6d27f399 ui: add configuration file support
mpm@selenic.com
parents: 249
diff changeset
   109
1839
876e4e6ad82b Create local ui object per repository, so .hg/hgrc don't get mixed.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1637
diff changeset
   110
    def walkconfig(self, seen=None):
876e4e6ad82b Create local ui object per repository, so .hg/hgrc don't get mixed.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1637
diff changeset
   111
        if seen is None:
876e4e6ad82b Create local ui object per repository, so .hg/hgrc don't get mixed.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1637
diff changeset
   112
            seen = {}
1028
25e7ea0f2cff Add commands.debugconfig.
Bryan O'Sullivan <bos@serpentine.com>
parents: 981
diff changeset
   113
        for (section, name), value in self.overlay.iteritems():
25e7ea0f2cff Add commands.debugconfig.
Bryan O'Sullivan <bos@serpentine.com>
parents: 981
diff changeset
   114
            yield section, name, value
25e7ea0f2cff Add commands.debugconfig.
Bryan O'Sullivan <bos@serpentine.com>
parents: 981
diff changeset
   115
            seen[section, name] = 1
25e7ea0f2cff Add commands.debugconfig.
Bryan O'Sullivan <bos@serpentine.com>
parents: 981
diff changeset
   116
        for section in self.cdata.sections():
25e7ea0f2cff Add commands.debugconfig.
Bryan O'Sullivan <bos@serpentine.com>
parents: 981
diff changeset
   117
            for name, value in self.cdata.items(section):
25e7ea0f2cff Add commands.debugconfig.
Bryan O'Sullivan <bos@serpentine.com>
parents: 981
diff changeset
   118
                if (section, name) in seen: continue
25e7ea0f2cff Add commands.debugconfig.
Bryan O'Sullivan <bos@serpentine.com>
parents: 981
diff changeset
   119
                yield section, name, value.replace('\n', '\\n')
25e7ea0f2cff Add commands.debugconfig.
Bryan O'Sullivan <bos@serpentine.com>
parents: 981
diff changeset
   120
                seen[section, name] = 1
1839
876e4e6ad82b Create local ui object per repository, so .hg/hgrc don't get mixed.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1637
diff changeset
   121
        if self.parentui is not None:
876e4e6ad82b Create local ui object per repository, so .hg/hgrc don't get mixed.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1637
diff changeset
   122
            for parent in self.parentui.walkconfig(seen):
876e4e6ad82b Create local ui object per repository, so .hg/hgrc don't get mixed.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1637
diff changeset
   123
                yield parent
1028
25e7ea0f2cff Add commands.debugconfig.
Bryan O'Sullivan <bos@serpentine.com>
parents: 981
diff changeset
   124
1071
8f0ac653f85e Add support for extension modules
mason@suse.com
parents: 1062
diff changeset
   125
    def extensions(self):
8f0ac653f85e Add support for extension modules
mason@suse.com
parents: 1062
diff changeset
   126
        return self.configitems("extensions")
8f0ac653f85e Add support for extension modules
mason@suse.com
parents: 1062
diff changeset
   127
2003
62647394e368 Implementation of per-user .hgignore.
mcmillen@cs.cmu.edu
parents: 1989
diff changeset
   128
    def hgignorefiles(self):
62647394e368 Implementation of per-user .hgignore.
mcmillen@cs.cmu.edu
parents: 1989
diff changeset
   129
        result = []
62647394e368 Implementation of per-user .hgignore.
mcmillen@cs.cmu.edu
parents: 1989
diff changeset
   130
        cfgitems = self.configitems("ui")
62647394e368 Implementation of per-user .hgignore.
mcmillen@cs.cmu.edu
parents: 1989
diff changeset
   131
        for key, value in cfgitems:
62647394e368 Implementation of per-user .hgignore.
mcmillen@cs.cmu.edu
parents: 1989
diff changeset
   132
            if key == 'ignore' or key.startswith('ignore.'):
62647394e368 Implementation of per-user .hgignore.
mcmillen@cs.cmu.edu
parents: 1989
diff changeset
   133
                path = os.path.expanduser(value)
62647394e368 Implementation of per-user .hgignore.
mcmillen@cs.cmu.edu
parents: 1989
diff changeset
   134
                result.append(path)
62647394e368 Implementation of per-user .hgignore.
mcmillen@cs.cmu.edu
parents: 1989
diff changeset
   135
        return result
62647394e368 Implementation of per-user .hgignore.
mcmillen@cs.cmu.edu
parents: 1989
diff changeset
   136
1637
3b1b44b917f4 Add new bdiff based unidiff generation.
mason@suse.com
parents: 1609
diff changeset
   137
    def diffopts(self):
3b1b44b917f4 Add new bdiff based unidiff generation.
mason@suse.com
parents: 1609
diff changeset
   138
        if self.diffcache:
3b1b44b917f4 Add new bdiff based unidiff generation.
mason@suse.com
parents: 1609
diff changeset
   139
            return self.diffcache
3b1b44b917f4 Add new bdiff based unidiff generation.
mason@suse.com
parents: 1609
diff changeset
   140
        ret = { 'showfunc' : True, 'ignorews' : False}
3b1b44b917f4 Add new bdiff based unidiff generation.
mason@suse.com
parents: 1609
diff changeset
   141
        for x in self.configitems("diff"):
3b1b44b917f4 Add new bdiff based unidiff generation.
mason@suse.com
parents: 1609
diff changeset
   142
            k = x[0].lower()
3b1b44b917f4 Add new bdiff based unidiff generation.
mason@suse.com
parents: 1609
diff changeset
   143
            v = x[1]
3b1b44b917f4 Add new bdiff based unidiff generation.
mason@suse.com
parents: 1609
diff changeset
   144
            if v:
3b1b44b917f4 Add new bdiff based unidiff generation.
mason@suse.com
parents: 1609
diff changeset
   145
                v = v.lower()
3b1b44b917f4 Add new bdiff based unidiff generation.
mason@suse.com
parents: 1609
diff changeset
   146
                if v == 'true':
3b1b44b917f4 Add new bdiff based unidiff generation.
mason@suse.com
parents: 1609
diff changeset
   147
                    value = True
3b1b44b917f4 Add new bdiff based unidiff generation.
mason@suse.com
parents: 1609
diff changeset
   148
                else:
3b1b44b917f4 Add new bdiff based unidiff generation.
mason@suse.com
parents: 1609
diff changeset
   149
                    value = False
3b1b44b917f4 Add new bdiff based unidiff generation.
mason@suse.com
parents: 1609
diff changeset
   150
                ret[k] = value
3b1b44b917f4 Add new bdiff based unidiff generation.
mason@suse.com
parents: 1609
diff changeset
   151
        self.diffcache = ret
3b1b44b917f4 Add new bdiff based unidiff generation.
mason@suse.com
parents: 1609
diff changeset
   152
        return ret
3b1b44b917f4 Add new bdiff based unidiff generation.
mason@suse.com
parents: 1609
diff changeset
   153
608
d2994b5298fb Add username/merge/editor to .hgrc
Matt Mackall <mpm@selenic.com>
parents: 565
diff changeset
   154
    def username(self):
1985
c577689006fa Adapted behaviour of ui.username() to documentation and mention it explicitly:
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1984
diff changeset
   155
        """Return default username to be used in commits.
c577689006fa Adapted behaviour of ui.username() to documentation and mention it explicitly:
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1984
diff changeset
   156
c577689006fa Adapted behaviour of ui.username() to documentation and mention it explicitly:
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1984
diff changeset
   157
        Searched in this order: $HGUSER, [ui] section of hgrcs, $EMAIL
c577689006fa Adapted behaviour of ui.username() to documentation and mention it explicitly:
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1984
diff changeset
   158
        and stop searching if one of these is set.
c577689006fa Adapted behaviour of ui.username() to documentation and mention it explicitly:
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1984
diff changeset
   159
        Abort if found username is an empty string to force specifying
c577689006fa Adapted behaviour of ui.username() to documentation and mention it explicitly:
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1984
diff changeset
   160
        the commit user elsewhere, e.g. with line option or repo hgrc.
c577689006fa Adapted behaviour of ui.username() to documentation and mention it explicitly:
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1984
diff changeset
   161
        If not found, use $LOGNAME or $USERNAME +"@full.hostname".
c577689006fa Adapted behaviour of ui.username() to documentation and mention it explicitly:
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1984
diff changeset
   162
        """
c577689006fa Adapted behaviour of ui.username() to documentation and mention it explicitly:
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1984
diff changeset
   163
        user = os.environ.get("HGUSER")
c577689006fa Adapted behaviour of ui.username() to documentation and mention it explicitly:
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1984
diff changeset
   164
        if user is None:
c577689006fa Adapted behaviour of ui.username() to documentation and mention it explicitly:
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1984
diff changeset
   165
            user = self.config("ui", "username")
c577689006fa Adapted behaviour of ui.username() to documentation and mention it explicitly:
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1984
diff changeset
   166
        if user is None:
c577689006fa Adapted behaviour of ui.username() to documentation and mention it explicitly:
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1984
diff changeset
   167
            user = os.environ.get("EMAIL")
c577689006fa Adapted behaviour of ui.username() to documentation and mention it explicitly:
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1984
diff changeset
   168
        if user is None:
c577689006fa Adapted behaviour of ui.username() to documentation and mention it explicitly:
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1984
diff changeset
   169
            user = os.environ.get("LOGNAME") or os.environ.get("USERNAME")
c577689006fa Adapted behaviour of ui.username() to documentation and mention it explicitly:
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1984
diff changeset
   170
            if user:
c577689006fa Adapted behaviour of ui.username() to documentation and mention it explicitly:
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1984
diff changeset
   171
                user = "%s@%s" % (user, socket.getfqdn())
c577689006fa Adapted behaviour of ui.username() to documentation and mention it explicitly:
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1984
diff changeset
   172
        if not user:
c577689006fa Adapted behaviour of ui.username() to documentation and mention it explicitly:
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1984
diff changeset
   173
            raise util.Abort(_("Please specify a username."))
c577689006fa Adapted behaviour of ui.username() to documentation and mention it explicitly:
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1984
diff changeset
   174
        return user
608
d2994b5298fb Add username/merge/editor to .hgrc
Matt Mackall <mpm@selenic.com>
parents: 565
diff changeset
   175
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
   176
    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
   177
        """Return a short representation of a user name or email address."""
1903
e4abeafd6eb1 move shortuser into util module.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 1637
diff changeset
   178
        if not self.verbose: user = util.shortuser(user)
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
   179
        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
   180
1893
6569651a4f1e Read paths specified in .hg/hgrc relative to repo root, otherwise to home dir.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1892
diff changeset
   181
    def expandpath(self, loc):
1892
622ee75cb4c9 Directory names take precedence over symbolic names consistently.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1882
diff changeset
   182
        """Return repository location relative to cwd or from [paths]"""
1893
6569651a4f1e Read paths specified in .hg/hgrc relative to repo root, otherwise to home dir.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1892
diff changeset
   183
        if loc.find("://") != -1 or os.path.exists(loc):
1892
622ee75cb4c9 Directory names take precedence over symbolic names consistently.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1882
diff changeset
   184
            return loc
622ee75cb4c9 Directory names take precedence over symbolic names consistently.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1882
diff changeset
   185
1893
6569651a4f1e Read paths specified in .hg/hgrc relative to repo root, otherwise to home dir.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1892
diff changeset
   186
        return self.config("paths", loc, loc)
506
1f81ebff98c9 [PATCH] Add ui.expandpath command
mpm@selenic.com
parents: 350
diff changeset
   187
207
ec327cf0d3a9 Move ui class to its own module
mpm@selenic.com
parents:
diff changeset
   188
    def write(self, *args):
2033
e3280d350792 Group changes done by the same developer on the same with --style=changelog
Thomas Arendsen Hein <thomas@intevation.de>
parents: 2013
diff changeset
   189
        if self.header:
e3280d350792 Group changes done by the same developer on the same with --style=changelog
Thomas Arendsen Hein <thomas@intevation.de>
parents: 2013
diff changeset
   190
            if self.header != self.prev_header:
e3280d350792 Group changes done by the same developer on the same with --style=changelog
Thomas Arendsen Hein <thomas@intevation.de>
parents: 2013
diff changeset
   191
                self.prev_header = self.header
e3280d350792 Group changes done by the same developer on the same with --style=changelog
Thomas Arendsen Hein <thomas@intevation.de>
parents: 2013
diff changeset
   192
                self.write(*self.header)
e3280d350792 Group changes done by the same developer on the same with --style=changelog
Thomas Arendsen Hein <thomas@intevation.de>
parents: 2013
diff changeset
   193
            self.header = []
207
ec327cf0d3a9 Move ui class to its own module
mpm@selenic.com
parents:
diff changeset
   194
        for a in args:
ec327cf0d3a9 Move ui class to its own module
mpm@selenic.com
parents:
diff changeset
   195
            sys.stdout.write(str(a))
565
9a80418646dd [PATCH] Make ui.warn write to stderr
mpm@selenic.com
parents: 515
diff changeset
   196
2033
e3280d350792 Group changes done by the same developer on the same with --style=changelog
Thomas Arendsen Hein <thomas@intevation.de>
parents: 2013
diff changeset
   197
    def write_header(self, *args):
e3280d350792 Group changes done by the same developer on the same with --style=changelog
Thomas Arendsen Hein <thomas@intevation.de>
parents: 2013
diff changeset
   198
        for a in args:
e3280d350792 Group changes done by the same developer on the same with --style=changelog
Thomas Arendsen Hein <thomas@intevation.de>
parents: 2013
diff changeset
   199
            self.header.append(str(a))
e3280d350792 Group changes done by the same developer on the same with --style=changelog
Thomas Arendsen Hein <thomas@intevation.de>
parents: 2013
diff changeset
   200
565
9a80418646dd [PATCH] Make ui.warn write to stderr
mpm@selenic.com
parents: 515
diff changeset
   201
    def write_err(self, *args):
1989
0541768fa558 ignore EPIPE in ui.err_write
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 1985
diff changeset
   202
        try:
0541768fa558 ignore EPIPE in ui.err_write
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 1985
diff changeset
   203
            if not sys.stdout.closed: sys.stdout.flush()
0541768fa558 ignore EPIPE in ui.err_write
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 1985
diff changeset
   204
            for a in args:
0541768fa558 ignore EPIPE in ui.err_write
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 1985
diff changeset
   205
                sys.stderr.write(str(a))
0541768fa558 ignore EPIPE in ui.err_write
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 1985
diff changeset
   206
        except IOError, inst:
0541768fa558 ignore EPIPE in ui.err_write
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 1985
diff changeset
   207
            if inst.errno != errno.EPIPE:
0541768fa558 ignore EPIPE in ui.err_write
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 1985
diff changeset
   208
                raise
565
9a80418646dd [PATCH] Make ui.warn write to stderr
mpm@selenic.com
parents: 515
diff changeset
   209
1837
6f67a4c93493 make ui flush output. this makes error happen if printing to /dev/full.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 1637
diff changeset
   210
    def flush(self):
2013
65634e1038dd Fix error on Windows if "hg log | more" exits.
Eung-Ju Park <eungju@gmail.com>
parents: 2003
diff changeset
   211
        try: sys.stdout.flush()
65634e1038dd Fix error on Windows if "hg log | more" exits.
Eung-Ju Park <eungju@gmail.com>
parents: 2003
diff changeset
   212
        except: pass
65634e1038dd Fix error on Windows if "hg log | more" exits.
Eung-Ju Park <eungju@gmail.com>
parents: 2003
diff changeset
   213
        try: sys.stderr.flush()
65634e1038dd Fix error on Windows if "hg log | more" exits.
Eung-Ju Park <eungju@gmail.com>
parents: 2003
diff changeset
   214
        except: pass
1837
6f67a4c93493 make ui flush output. this makes error happen if printing to /dev/full.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 1637
diff changeset
   215
207
ec327cf0d3a9 Move ui class to its own module
mpm@selenic.com
parents:
diff changeset
   216
    def readline(self):
ec327cf0d3a9 Move ui class to its own module
mpm@selenic.com
parents:
diff changeset
   217
        return sys.stdin.readline()[:-1]
1062
6d5a62a549fa pep-0008 cleanup
benoit.boissinot@ens-lyon.fr
parents: 1028
diff changeset
   218
    def prompt(self, msg, pat, default="y"):
207
ec327cf0d3a9 Move ui class to its own module
mpm@selenic.com
parents:
diff changeset
   219
        if not self.interactive: return default
ec327cf0d3a9 Move ui class to its own module
mpm@selenic.com
parents:
diff changeset
   220
        while 1:
ec327cf0d3a9 Move ui class to its own module
mpm@selenic.com
parents:
diff changeset
   221
            self.write(msg, " ")
ec327cf0d3a9 Move ui class to its own module
mpm@selenic.com
parents:
diff changeset
   222
            r = self.readline()
ec327cf0d3a9 Move ui class to its own module
mpm@selenic.com
parents:
diff changeset
   223
            if re.match(pat, r):
ec327cf0d3a9 Move ui class to its own module
mpm@selenic.com
parents:
diff changeset
   224
                return r
ec327cf0d3a9 Move ui class to its own module
mpm@selenic.com
parents:
diff changeset
   225
            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
   226
                self.write(_("unrecognized response\n"))
207
ec327cf0d3a9 Move ui class to its own module
mpm@selenic.com
parents:
diff changeset
   227
    def status(self, *msg):
ec327cf0d3a9 Move ui class to its own module
mpm@selenic.com
parents:
diff changeset
   228
        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
   229
    def warn(self, *msg):
565
9a80418646dd [PATCH] Make ui.warn write to stderr
mpm@selenic.com
parents: 515
diff changeset
   230
        self.write_err(*msg)
207
ec327cf0d3a9 Move ui class to its own module
mpm@selenic.com
parents:
diff changeset
   231
    def note(self, *msg):
ec327cf0d3a9 Move ui class to its own module
mpm@selenic.com
parents:
diff changeset
   232
        if self.verbose: self.write(*msg)
ec327cf0d3a9 Move ui class to its own module
mpm@selenic.com
parents:
diff changeset
   233
    def debug(self, *msg):
ec327cf0d3a9 Move ui class to its own module
mpm@selenic.com
parents:
diff changeset
   234
        if self.debugflag: self.write(*msg)
1983
ae12a81549a7 Pass correct username as $HGUSER to hgeditor if "commit -u" is used.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1951
diff changeset
   235
    def edit(self, text, user):
1984
df7436f439a0 Improved ui.edit():
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1983
diff changeset
   236
        (fd, name) = tempfile.mkstemp(prefix="hg-editor-", suffix=".txt")
df7436f439a0 Improved ui.edit():
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1983
diff changeset
   237
        try:
df7436f439a0 Improved ui.edit():
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1983
diff changeset
   238
            f = os.fdopen(fd, "w")
df7436f439a0 Improved ui.edit():
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1983
diff changeset
   239
            f.write(text)
df7436f439a0 Improved ui.edit():
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1983
diff changeset
   240
            f.close()
df7436f439a0 Improved ui.edit():
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1983
diff changeset
   241
df7436f439a0 Improved ui.edit():
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1983
diff changeset
   242
            editor = (os.environ.get("HGEDITOR") or
df7436f439a0 Improved ui.edit():
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1983
diff changeset
   243
                    self.config("ui", "editor") or
df7436f439a0 Improved ui.edit():
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1983
diff changeset
   244
                    os.environ.get("EDITOR", "vi"))
207
ec327cf0d3a9 Move ui class to its own module
mpm@selenic.com
parents:
diff changeset
   245
1984
df7436f439a0 Improved ui.edit():
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1983
diff changeset
   246
            util.system("%s \"%s\"" % (editor, name),
df7436f439a0 Improved ui.edit():
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1983
diff changeset
   247
                        environ={'HGUSER': user},
df7436f439a0 Improved ui.edit():
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1983
diff changeset
   248
                        onerr=util.Abort, errprefix=_("edit failed"))
608
d2994b5298fb Add username/merge/editor to .hgrc
Matt Mackall <mpm@selenic.com>
parents: 565
diff changeset
   249
1984
df7436f439a0 Improved ui.edit():
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1983
diff changeset
   250
            f = open(name)
df7436f439a0 Improved ui.edit():
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1983
diff changeset
   251
            t = f.read()
df7436f439a0 Improved ui.edit():
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1983
diff changeset
   252
            f.close()
df7436f439a0 Improved ui.edit():
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1983
diff changeset
   253
            t = re.sub("(?m)^HG:.*\n", "", t)
df7436f439a0 Improved ui.edit():
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1983
diff changeset
   254
        finally:
df7436f439a0 Improved ui.edit():
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1983
diff changeset
   255
            os.unlink(name)
662
b55a78595ef6 Pass username to hgeditor, remove temporary file
Radoslaw "AstralStorm" Szkodzinski <astralstorm@gorzow.mm.pl>
parents: 613
diff changeset
   256
207
ec327cf0d3a9 Move ui class to its own module
mpm@selenic.com
parents:
diff changeset
   257
        return t