annotate mercurial/ui.py @ 2873:4ec58b157265

refactor text diff/patch code. rename commands.dodiff to patch.diff. rename commands.doexport to patch.export. move some functions from commands to new mercurial.cmdutil module. turn list of diff options into mdiff.diffopts class. patch.diff and patch.export now has clean api for call from 3rd party python code.
author Vadim Gelfer <vadim.gelfer@gmail.com>
date Sat, 12 Aug 2006 16:13:27 -0700
parents 345bac2bc4ec
children 8b02af865990 3848488244fc
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 #
2858
345bac2bc4ec update copyrights.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2738
diff changeset
3 # Copyright 2005, 2006 Matt Mackall <mpm@selenic.com>
207
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
1400
cf9a1233738a i18n first part: make '_' available for files who need it
Benoit Boissinot <benoit.boissinot@ens-lyon.org
parents: 1292
diff changeset
8 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
9 from demandload import *
2292
903ab41ac7eb allow to send email using sendmail.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2286
diff changeset
10 demandload(globals(), "errno getpass os re smtplib socket sys tempfile")
2873
4ec58b157265 refactor text diff/patch code.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2858
diff changeset
11 demandload(globals(), "ConfigParser mdiff templater traceback 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,
2166
d0c02b4dce9a do not check sys.argv from localrepo when running hooks.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2072
diff changeset
15 interactive=True, traceback=False, 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)
2166
d0c02b4dce9a do not check sys.argv from localrepo when running hooks.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2072
diff changeset
27 self.traceback = traceback
285
5a1e6d27f399 ui: add configuration file support
mpm@selenic.com
parents: 249
diff changeset
28
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
29 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
30 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
31 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
32 self.prev_header = []
2072
74d3f5336b66 Implement revlogng.
mason@suse.com
parents: 2033
diff changeset
33 self.revlogopts = self.configrevlog()
1866
89a6ce5ae510 inherit hgrc so "%" interpolation works.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 1840
diff changeset
34 else:
1874
a84829140fb1 Inherit config from real parentui and don't use ConfigParser internals.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1866
diff changeset
35 # 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
36 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
37 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
38 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
39 # 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
40 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
41 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
42 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
43 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
44
876e4e6ad82b Create local ui object per repository, so .hg/hgrc don't get mixed.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1637
diff changeset
45 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
46 return getattr(self.parentui, key)
1071
8f0ac653f85e Add support for extension modules
mason@suse.com
parents: 1062
diff changeset
47
8f0ac653f85e Add support for extension modules
mason@suse.com
parents: 1062
diff changeset
48 def updateopts(self, verbose=False, debug=False, quiet=False,
2293
3dc6f2501dbc add --config global option. allows to set hgrc option on command line.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2292
diff changeset
49 interactive=True, traceback=False, config=[]):
285
5a1e6d27f399 ui: add configuration file support
mpm@selenic.com
parents: 249
diff changeset
50 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
51 self.verbose = (self.verbose or verbose) or debug
5a1e6d27f399 ui: add configuration file support
mpm@selenic.com
parents: 249
diff changeset
52 self.debugflag = (self.debugflag or debug)
5a1e6d27f399 ui: add configuration file support
mpm@selenic.com
parents: 249
diff changeset
53 self.interactive = (self.interactive and interactive)
2166
d0c02b4dce9a do not check sys.argv from localrepo when running hooks.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2072
diff changeset
54 self.traceback = self.traceback or traceback
2293
3dc6f2501dbc add --config global option. allows to set hgrc option on command line.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2292
diff changeset
55 for cfg in config:
3dc6f2501dbc add --config global option. allows to set hgrc option on command line.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2292
diff changeset
56 try:
3dc6f2501dbc add --config global option. allows to set hgrc option on command line.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2292
diff changeset
57 name, value = cfg.split('=', 1)
3dc6f2501dbc add --config global option. allows to set hgrc option on command line.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2292
diff changeset
58 section, name = name.split('.', 1)
3dc6f2501dbc add --config global option. allows to set hgrc option on command line.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2292
diff changeset
59 if not self.cdata.has_section(section):
3dc6f2501dbc add --config global option. allows to set hgrc option on command line.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2292
diff changeset
60 self.cdata.add_section(section)
3dc6f2501dbc add --config global option. allows to set hgrc option on command line.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2292
diff changeset
61 if not section or not name:
3dc6f2501dbc add --config global option. allows to set hgrc option on command line.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2292
diff changeset
62 raise IndexError
3dc6f2501dbc add --config global option. allows to set hgrc option on command line.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2292
diff changeset
63 self.cdata.set(section, name, value)
3dc6f2501dbc add --config global option. allows to set hgrc option on command line.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2292
diff changeset
64 except (IndexError, ValueError):
3dc6f2501dbc add --config global option. allows to set hgrc option on command line.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2292
diff changeset
65 raise util.Abort(_('malformed --config option: %s') % cfg)
285
5a1e6d27f399 ui: add configuration file support
mpm@selenic.com
parents: 249
diff changeset
66
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
67 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
68 if isinstance(fn, basestring):
a4ba63e04134 Fix traceback on bad system hgrc files
Soh Tk-r28629 <tksoh@freescale.com>
parents: 1473
diff changeset
69 fn = [fn]
a4ba63e04134 Fix traceback on bad system hgrc files
Soh Tk-r28629 <tksoh@freescale.com>
parents: 1473
diff changeset
70 for f in fn:
a4ba63e04134 Fix traceback on bad system hgrc files
Soh Tk-r28629 <tksoh@freescale.com>
parents: 1473
diff changeset
71 try:
a4ba63e04134 Fix traceback on bad system hgrc files
Soh Tk-r28629 <tksoh@freescale.com>
parents: 1473
diff changeset
72 self.cdata.read(f)
a4ba63e04134 Fix traceback on bad system hgrc files
Soh Tk-r28629 <tksoh@freescale.com>
parents: 1473
diff changeset
73 except ConfigParser.ParsingError, inst:
a4ba63e04134 Fix traceback on bad system hgrc files
Soh Tk-r28629 <tksoh@freescale.com>
parents: 1473
diff changeset
74 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
75 # 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
76 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
77 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
78 for name, path in self.configitems("paths"):
2579
0875cda033fd use __contains__, index or split instead of str.find
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 2502
diff changeset
79 if path and "://" not in path 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
80 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
81
960
abfb5cc97fcd Add ui.setconfig overlay
mpm@selenic.com
parents: 953
diff changeset
82 def setconfig(self, section, name, val):
abfb5cc97fcd Add ui.setconfig overlay
mpm@selenic.com
parents: 953
diff changeset
83 self.overlay[(section, name)] = val
abfb5cc97fcd Add ui.setconfig overlay
mpm@selenic.com
parents: 953
diff changeset
84
abfb5cc97fcd Add ui.setconfig overlay
mpm@selenic.com
parents: 953
diff changeset
85 def config(self, section, name, default=None):
abfb5cc97fcd Add ui.setconfig overlay
mpm@selenic.com
parents: 953
diff changeset
86 if self.overlay.has_key((section, name)):
abfb5cc97fcd Add ui.setconfig overlay
mpm@selenic.com
parents: 953
diff changeset
87 return self.overlay[(section, name)]
abfb5cc97fcd Add ui.setconfig overlay
mpm@selenic.com
parents: 953
diff changeset
88 if self.cdata.has_option(section, name):
1876
2e0fd78587bd Catch hgrc interpolation errors nicely.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1874
diff changeset
89 try:
2e0fd78587bd Catch hgrc interpolation errors nicely.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1874
diff changeset
90 return self.cdata.get(section, name)
2e0fd78587bd Catch hgrc interpolation errors nicely.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1874
diff changeset
91 except ConfigParser.InterpolationError, inst:
2e0fd78587bd Catch hgrc interpolation errors nicely.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1874
diff changeset
92 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
93 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
94 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
95 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
96 return self.parentui.config(section, name, default)
285
5a1e6d27f399 ui: add configuration file support
mpm@selenic.com
parents: 249
diff changeset
97
2499
894435215344 Added ui.configlist method to get comma/space separated lists of strings.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 2498
diff changeset
98 def configlist(self, section, name, default=None):
894435215344 Added ui.configlist method to get comma/space separated lists of strings.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 2498
diff changeset
99 """Return a list of comma/space separated strings"""
894435215344 Added ui.configlist method to get comma/space separated lists of strings.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 2498
diff changeset
100 result = self.config(section, name)
894435215344 Added ui.configlist method to get comma/space separated lists of strings.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 2498
diff changeset
101 if result is None:
2502
18cf95ad3666 Allow using default values with ui.configlist, too, and add a test for this.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 2499
diff changeset
102 result = default or []
18cf95ad3666 Allow using default values with ui.configlist, too, and add a test for this.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 2499
diff changeset
103 if isinstance(result, basestring):
18cf95ad3666 Allow using default values with ui.configlist, too, and add a test for this.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 2499
diff changeset
104 result = result.replace(",", " ").split()
18cf95ad3666 Allow using default values with ui.configlist, too, and add a test for this.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 2499
diff changeset
105 return result
2499
894435215344 Added ui.configlist method to get comma/space separated lists of strings.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 2498
diff changeset
106
960
abfb5cc97fcd Add ui.setconfig overlay
mpm@selenic.com
parents: 953
diff changeset
107 def configbool(self, section, name, default=False):
abfb5cc97fcd Add ui.setconfig overlay
mpm@selenic.com
parents: 953
diff changeset
108 if self.overlay.has_key((section, name)):
abfb5cc97fcd Add ui.setconfig overlay
mpm@selenic.com
parents: 953
diff changeset
109 return self.overlay[(section, name)]
abfb5cc97fcd Add ui.setconfig overlay
mpm@selenic.com
parents: 953
diff changeset
110 if self.cdata.has_option(section, name):
1876
2e0fd78587bd Catch hgrc interpolation errors nicely.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1874
diff changeset
111 try:
2e0fd78587bd Catch hgrc interpolation errors nicely.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1874
diff changeset
112 return self.cdata.getboolean(section, name)
2e0fd78587bd Catch hgrc interpolation errors nicely.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1874
diff changeset
113 except ConfigParser.InterpolationError, inst:
2e0fd78587bd Catch hgrc interpolation errors nicely.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1874
diff changeset
114 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
115 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
116 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
117 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
118 return self.parentui.configbool(section, name, default)
285
5a1e6d27f399 ui: add configuration file support
mpm@selenic.com
parents: 249
diff changeset
119
2343
af81d8770620 add ui.has_config method.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2335
diff changeset
120 def has_config(self, section):
af81d8770620 add ui.has_config method.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2335
diff changeset
121 '''tell whether section exists in config.'''
af81d8770620 add ui.has_config method.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2335
diff changeset
122 return self.cdata.has_section(section)
af81d8770620 add ui.has_config method.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2335
diff changeset
123
285
5a1e6d27f399 ui: add configuration file support
mpm@selenic.com
parents: 249
diff changeset
124 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
125 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
126 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
127 items = dict(self.parentui.configitems(section))
285
5a1e6d27f399 ui: add configuration file support
mpm@selenic.com
parents: 249
diff changeset
128 if self.cdata.has_section(section):
1876
2e0fd78587bd Catch hgrc interpolation errors nicely.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1874
diff changeset
129 try:
2e0fd78587bd Catch hgrc interpolation errors nicely.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1874
diff changeset
130 items.update(dict(self.cdata.items(section)))
2e0fd78587bd Catch hgrc interpolation errors nicely.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1874
diff changeset
131 except ConfigParser.InterpolationError, inst:
2e0fd78587bd Catch hgrc interpolation errors nicely.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1874
diff changeset
132 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
133 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
134 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
135 return x
285
5a1e6d27f399 ui: add configuration file support
mpm@selenic.com
parents: 249
diff changeset
136
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
137 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
138 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
139 seen = {}
1028
25e7ea0f2cff Add commands.debugconfig.
Bryan O'Sullivan <bos@serpentine.com>
parents: 981
diff changeset
140 for (section, name), value in self.overlay.iteritems():
25e7ea0f2cff Add commands.debugconfig.
Bryan O'Sullivan <bos@serpentine.com>
parents: 981
diff changeset
141 yield section, name, value
25e7ea0f2cff Add commands.debugconfig.
Bryan O'Sullivan <bos@serpentine.com>
parents: 981
diff changeset
142 seen[section, name] = 1
25e7ea0f2cff Add commands.debugconfig.
Bryan O'Sullivan <bos@serpentine.com>
parents: 981
diff changeset
143 for section in self.cdata.sections():
25e7ea0f2cff Add commands.debugconfig.
Bryan O'Sullivan <bos@serpentine.com>
parents: 981
diff changeset
144 for name, value in self.cdata.items(section):
25e7ea0f2cff Add commands.debugconfig.
Bryan O'Sullivan <bos@serpentine.com>
parents: 981
diff changeset
145 if (section, name) in seen: continue
25e7ea0f2cff Add commands.debugconfig.
Bryan O'Sullivan <bos@serpentine.com>
parents: 981
diff changeset
146 yield section, name, value.replace('\n', '\\n')
25e7ea0f2cff Add commands.debugconfig.
Bryan O'Sullivan <bos@serpentine.com>
parents: 981
diff changeset
147 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
148 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
149 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
150 yield parent
1028
25e7ea0f2cff Add commands.debugconfig.
Bryan O'Sullivan <bos@serpentine.com>
parents: 981
diff changeset
151
1071
8f0ac653f85e Add support for extension modules
mason@suse.com
parents: 1062
diff changeset
152 def extensions(self):
2403
9b0747207925 Further cleanup of ui.py (changeset 74d569332f8b used one-char variable names).
Thomas Arendsen Hein <thomas@intevation.de>
parents: 2390
diff changeset
153 result = self.configitems("extensions")
9b0747207925 Further cleanup of ui.py (changeset 74d569332f8b used one-char variable names).
Thomas Arendsen Hein <thomas@intevation.de>
parents: 2390
diff changeset
154 for i, (key, value) in enumerate(result):
9b0747207925 Further cleanup of ui.py (changeset 74d569332f8b used one-char variable names).
Thomas Arendsen Hein <thomas@intevation.de>
parents: 2390
diff changeset
155 if value:
9b0747207925 Further cleanup of ui.py (changeset 74d569332f8b used one-char variable names).
Thomas Arendsen Hein <thomas@intevation.de>
parents: 2390
diff changeset
156 result[i] = (key, os.path.expanduser(value))
9b0747207925 Further cleanup of ui.py (changeset 74d569332f8b used one-char variable names).
Thomas Arendsen Hein <thomas@intevation.de>
parents: 2390
diff changeset
157 return result
1071
8f0ac653f85e Add support for extension modules
mason@suse.com
parents: 1062
diff changeset
158
2003
62647394e368 Implementation of per-user .hgignore.
mcmillen@cs.cmu.edu
parents: 1989
diff changeset
159 def hgignorefiles(self):
2403
9b0747207925 Further cleanup of ui.py (changeset 74d569332f8b used one-char variable names).
Thomas Arendsen Hein <thomas@intevation.de>
parents: 2390
diff changeset
160 result = []
9b0747207925 Further cleanup of ui.py (changeset 74d569332f8b used one-char variable names).
Thomas Arendsen Hein <thomas@intevation.de>
parents: 2390
diff changeset
161 for key, value in self.configitems("ui"):
9b0747207925 Further cleanup of ui.py (changeset 74d569332f8b used one-char variable names).
Thomas Arendsen Hein <thomas@intevation.de>
parents: 2390
diff changeset
162 if key == 'ignore' or key.startswith('ignore.'):
9b0747207925 Further cleanup of ui.py (changeset 74d569332f8b used one-char variable names).
Thomas Arendsen Hein <thomas@intevation.de>
parents: 2390
diff changeset
163 result.append(os.path.expanduser(value))
9b0747207925 Further cleanup of ui.py (changeset 74d569332f8b used one-char variable names).
Thomas Arendsen Hein <thomas@intevation.de>
parents: 2390
diff changeset
164 return result
2003
62647394e368 Implementation of per-user .hgignore.
mcmillen@cs.cmu.edu
parents: 1989
diff changeset
165
2072
74d3f5336b66 Implement revlogng.
mason@suse.com
parents: 2033
diff changeset
166 def configrevlog(self):
2403
9b0747207925 Further cleanup of ui.py (changeset 74d569332f8b used one-char variable names).
Thomas Arendsen Hein <thomas@intevation.de>
parents: 2390
diff changeset
167 result = {}
9b0747207925 Further cleanup of ui.py (changeset 74d569332f8b used one-char variable names).
Thomas Arendsen Hein <thomas@intevation.de>
parents: 2390
diff changeset
168 for key, value in self.configitems("revlog"):
9b0747207925 Further cleanup of ui.py (changeset 74d569332f8b used one-char variable names).
Thomas Arendsen Hein <thomas@intevation.de>
parents: 2390
diff changeset
169 result[key.lower()] = value
9b0747207925 Further cleanup of ui.py (changeset 74d569332f8b used one-char variable names).
Thomas Arendsen Hein <thomas@intevation.de>
parents: 2390
diff changeset
170 return result
2388
74d569332f8b Cleanup: unifiy the coding style in the ui.py configitems forwarders.
Markus F.X.J. Oberhumer <markus@oberhumer.com>
parents: 2343
diff changeset
171
2873
4ec58b157265 refactor text diff/patch code.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2858
diff changeset
172 def diffopts(self, opts={}):
4ec58b157265 refactor text diff/patch code.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2858
diff changeset
173 return mdiff.diffopts(
4ec58b157265 refactor text diff/patch code.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2858
diff changeset
174 text=opts.get('text'),
4ec58b157265 refactor text diff/patch code.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2858
diff changeset
175 showfunc=(opts.get('show_function') or
4ec58b157265 refactor text diff/patch code.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2858
diff changeset
176 self.configbool('diff', 'showfunc', None)),
4ec58b157265 refactor text diff/patch code.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2858
diff changeset
177 ignorews=(opts.get('ignore_all_space') or
4ec58b157265 refactor text diff/patch code.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2858
diff changeset
178 self.configbool('diff', 'ignorews', None)),
4ec58b157265 refactor text diff/patch code.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2858
diff changeset
179 ignorewsamount=(opts.get('ignore_space_change') or
4ec58b157265 refactor text diff/patch code.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2858
diff changeset
180 self.configbool('diff', 'ignorewsamount', None)),
4ec58b157265 refactor text diff/patch code.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2858
diff changeset
181 ignoreblanklines=(opts.get('ignore_blank_lines') or
4ec58b157265 refactor text diff/patch code.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2858
diff changeset
182 self.configbool('diff', 'ignoreblanklines', None)))
1637
3b1b44b917f4 Add new bdiff based unidiff generation.
mason@suse.com
parents: 1609
diff changeset
183
608
d2994b5298fb Add username/merge/editor to .hgrc
Matt Mackall <mpm@selenic.com>
parents: 565
diff changeset
184 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
185 """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
186
c577689006fa Adapted behaviour of ui.username() to documentation and mention it explicitly:
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1984
diff changeset
187 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
188 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
189 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
190 the commit user elsewhere, e.g. with line option or repo hgrc.
2343
af81d8770620 add ui.has_config method.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2335
diff changeset
191 If not found, use ($LOGNAME or $USER or $LNAME or
af81d8770620 add ui.has_config method.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2335
diff changeset
192 $USERNAME) +"@full.hostname".
1985
c577689006fa Adapted behaviour of ui.username() to documentation and mention it explicitly:
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1984
diff changeset
193 """
c577689006fa Adapted behaviour of ui.username() to documentation and mention it explicitly:
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1984
diff changeset
194 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
195 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
196 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
197 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
198 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
199 if user is None:
2343
af81d8770620 add ui.has_config method.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2335
diff changeset
200 try:
2645
e6a41cbaa260 fix windows username problem.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2624
diff changeset
201 user = '%s@%s' % (util.getuser(), socket.getfqdn())
2343
af81d8770620 add ui.has_config method.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2335
diff changeset
202 except KeyError:
af81d8770620 add ui.has_config method.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2335
diff changeset
203 raise util.Abort(_("Please specify a username."))
1985
c577689006fa Adapted behaviour of ui.username() to documentation and mention it explicitly:
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1984
diff changeset
204 return user
608
d2994b5298fb Add username/merge/editor to .hgrc
Matt Mackall <mpm@selenic.com>
parents: 565
diff changeset
205
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
206 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
207 """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
208 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
209 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
210
2494
73ac95671788 push, outgoing, bundle: fall back to "default" if "default-push" not defined
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2470
diff changeset
211 def expandpath(self, loc, default=None):
1892
622ee75cb4c9 Directory names take precedence over symbolic names consistently.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1882
diff changeset
212 """Return repository location relative to cwd or from [paths]"""
2624
46e52bbb9b1a expand the path if destination is not a directory
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 2598
diff changeset
213 if "://" in loc or os.path.isdir(loc):
1892
622ee75cb4c9 Directory names take precedence over symbolic names consistently.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1882
diff changeset
214 return loc
622ee75cb4c9 Directory names take precedence over symbolic names consistently.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1882
diff changeset
215
2495
4a2a4d988ead make ui.expandpath better with default path.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2494
diff changeset
216 path = self.config("paths", loc)
4a2a4d988ead make ui.expandpath better with default path.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2494
diff changeset
217 if not path and default is not None:
4a2a4d988ead make ui.expandpath better with default path.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2494
diff changeset
218 path = self.config("paths", default)
2498
1e2ec4fd16df Fix ui.expandpath problem and broken test introduced by 4a2a4d988ead.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 2495
diff changeset
219 return path or loc
506
1f81ebff98c9 [PATCH] Add ui.expandpath command
mpm@selenic.com
parents: 350
diff changeset
220
207
ec327cf0d3a9 Move ui class to its own module
mpm@selenic.com
parents:
diff changeset
221 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
222 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
223 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
224 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
225 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
226 self.header = []
207
ec327cf0d3a9 Move ui class to its own module
mpm@selenic.com
parents:
diff changeset
227 for a in args:
ec327cf0d3a9 Move ui class to its own module
mpm@selenic.com
parents:
diff changeset
228 sys.stdout.write(str(a))
565
9a80418646dd [PATCH] Make ui.warn write to stderr
mpm@selenic.com
parents: 515
diff changeset
229
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
230 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
231 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
232 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
233
565
9a80418646dd [PATCH] Make ui.warn write to stderr
mpm@selenic.com
parents: 515
diff changeset
234 def write_err(self, *args):
1989
0541768fa558 ignore EPIPE in ui.err_write
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 1985
diff changeset
235 try:
0541768fa558 ignore EPIPE in ui.err_write
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 1985
diff changeset
236 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
237 for a in args:
0541768fa558 ignore EPIPE in ui.err_write
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 1985
diff changeset
238 sys.stderr.write(str(a))
0541768fa558 ignore EPIPE in ui.err_write
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 1985
diff changeset
239 except IOError, inst:
0541768fa558 ignore EPIPE in ui.err_write
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 1985
diff changeset
240 if inst.errno != errno.EPIPE:
0541768fa558 ignore EPIPE in ui.err_write
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 1985
diff changeset
241 raise
565
9a80418646dd [PATCH] Make ui.warn write to stderr
mpm@selenic.com
parents: 515
diff changeset
242
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
243 def flush(self):
2013
65634e1038dd Fix error on Windows if "hg log | more" exits.
Eung-Ju Park <eungju@gmail.com>
parents: 2003
diff changeset
244 try: sys.stdout.flush()
65634e1038dd Fix error on Windows if "hg log | more" exits.
Eung-Ju Park <eungju@gmail.com>
parents: 2003
diff changeset
245 except: pass
65634e1038dd Fix error on Windows if "hg log | more" exits.
Eung-Ju Park <eungju@gmail.com>
parents: 2003
diff changeset
246 try: sys.stderr.flush()
65634e1038dd Fix error on Windows if "hg log | more" exits.
Eung-Ju Park <eungju@gmail.com>
parents: 2003
diff changeset
247 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
248
207
ec327cf0d3a9 Move ui class to its own module
mpm@selenic.com
parents:
diff changeset
249 def readline(self):
ec327cf0d3a9 Move ui class to its own module
mpm@selenic.com
parents:
diff changeset
250 return sys.stdin.readline()[:-1]
2281
7761597b5da3 prompt user for http authentication info
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2206
diff changeset
251 def prompt(self, msg, pat=None, default="y"):
207
ec327cf0d3a9 Move ui class to its own module
mpm@selenic.com
parents:
diff changeset
252 if not self.interactive: return default
ec327cf0d3a9 Move ui class to its own module
mpm@selenic.com
parents:
diff changeset
253 while 1:
ec327cf0d3a9 Move ui class to its own module
mpm@selenic.com
parents:
diff changeset
254 self.write(msg, " ")
ec327cf0d3a9 Move ui class to its own module
mpm@selenic.com
parents:
diff changeset
255 r = self.readline()
2281
7761597b5da3 prompt user for http authentication info
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2206
diff changeset
256 if not pat or re.match(pat, r):
207
ec327cf0d3a9 Move ui class to its own module
mpm@selenic.com
parents:
diff changeset
257 return r
ec327cf0d3a9 Move ui class to its own module
mpm@selenic.com
parents:
diff changeset
258 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
259 self.write(_("unrecognized response\n"))
2281
7761597b5da3 prompt user for http authentication info
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2206
diff changeset
260 def getpass(self, prompt=None, default=None):
7761597b5da3 prompt user for http authentication info
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2206
diff changeset
261 if not self.interactive: return default
7761597b5da3 prompt user for http authentication info
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2206
diff changeset
262 return getpass.getpass(prompt or _('password: '))
207
ec327cf0d3a9 Move ui class to its own module
mpm@selenic.com
parents:
diff changeset
263 def status(self, *msg):
ec327cf0d3a9 Move ui class to its own module
mpm@selenic.com
parents:
diff changeset
264 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
265 def warn(self, *msg):
565
9a80418646dd [PATCH] Make ui.warn write to stderr
mpm@selenic.com
parents: 515
diff changeset
266 self.write_err(*msg)
207
ec327cf0d3a9 Move ui class to its own module
mpm@selenic.com
parents:
diff changeset
267 def note(self, *msg):
ec327cf0d3a9 Move ui class to its own module
mpm@selenic.com
parents:
diff changeset
268 if self.verbose: self.write(*msg)
ec327cf0d3a9 Move ui class to its own module
mpm@selenic.com
parents:
diff changeset
269 def debug(self, *msg):
ec327cf0d3a9 Move ui class to its own module
mpm@selenic.com
parents:
diff changeset
270 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
271 def edit(self, text, user):
2206
c74e91e81f70 Use text rather than binary mode for editing commit messages
Stephen Darnell <stephen@darnell.plus.com>
parents: 2201
diff changeset
272 (fd, name) = tempfile.mkstemp(prefix="hg-editor-", suffix=".txt",
c74e91e81f70 Use text rather than binary mode for editing commit messages
Stephen Darnell <stephen@darnell.plus.com>
parents: 2201
diff changeset
273 text=True)
1984
df7436f439a0 Improved ui.edit():
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1983
diff changeset
274 try:
df7436f439a0 Improved ui.edit():
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1983
diff changeset
275 f = os.fdopen(fd, "w")
df7436f439a0 Improved ui.edit():
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1983
diff changeset
276 f.write(text)
df7436f439a0 Improved ui.edit():
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1983
diff changeset
277 f.close()
df7436f439a0 Improved ui.edit():
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1983
diff changeset
278
df7436f439a0 Improved ui.edit():
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1983
diff changeset
279 editor = (os.environ.get("HGEDITOR") or
df7436f439a0 Improved ui.edit():
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1983
diff changeset
280 self.config("ui", "editor") or
df7436f439a0 Improved ui.edit():
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1983
diff changeset
281 os.environ.get("EDITOR", "vi"))
207
ec327cf0d3a9 Move ui class to its own module
mpm@selenic.com
parents:
diff changeset
282
1984
df7436f439a0 Improved ui.edit():
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1983
diff changeset
283 util.system("%s \"%s\"" % (editor, name),
df7436f439a0 Improved ui.edit():
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1983
diff changeset
284 environ={'HGUSER': user},
df7436f439a0 Improved ui.edit():
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1983
diff changeset
285 onerr=util.Abort, errprefix=_("edit failed"))
608
d2994b5298fb Add username/merge/editor to .hgrc
Matt Mackall <mpm@selenic.com>
parents: 565
diff changeset
286
1984
df7436f439a0 Improved ui.edit():
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1983
diff changeset
287 f = open(name)
df7436f439a0 Improved ui.edit():
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1983
diff changeset
288 t = f.read()
df7436f439a0 Improved ui.edit():
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1983
diff changeset
289 f.close()
df7436f439a0 Improved ui.edit():
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1983
diff changeset
290 t = re.sub("(?m)^HG:.*\n", "", t)
df7436f439a0 Improved ui.edit():
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1983
diff changeset
291 finally:
df7436f439a0 Improved ui.edit():
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1983
diff changeset
292 os.unlink(name)
662
b55a78595ef6 Pass username to hgeditor, remove temporary file
Radoslaw "AstralStorm" Szkodzinski <astralstorm@gorzow.mm.pl>
parents: 613
diff changeset
293
207
ec327cf0d3a9 Move ui class to its own module
mpm@selenic.com
parents:
diff changeset
294 return t
2200
9f43b6e24232 move mail sending code into core, so extensions can share it.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2166
diff changeset
295
9f43b6e24232 move mail sending code into core, so extensions can share it.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2166
diff changeset
296 def sendmail(self):
2292
903ab41ac7eb allow to send email using sendmail.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2286
diff changeset
297 '''send mail message. object returned has one method, sendmail.
903ab41ac7eb allow to send email using sendmail.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2286
diff changeset
298 call as sendmail(sender, list-of-recipients, msg).'''
903ab41ac7eb allow to send email using sendmail.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2286
diff changeset
299
903ab41ac7eb allow to send email using sendmail.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2286
diff changeset
300 def smtp():
903ab41ac7eb allow to send email using sendmail.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2286
diff changeset
301 '''send mail using smtp.'''
903ab41ac7eb allow to send email using sendmail.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2286
diff changeset
302
2583
6e5427447f4c adding local_hostname option to smtp configuration
Valentino Volonghi aka dialtone <dialtone@divmod.com>
parents: 2502
diff changeset
303 local_hostname = self.config('smtp', 'local_hostname')
6e5427447f4c adding local_hostname option to smtp configuration
Valentino Volonghi aka dialtone <dialtone@divmod.com>
parents: 2502
diff changeset
304 s = smtplib.SMTP(local_hostname=local_hostname)
2292
903ab41ac7eb allow to send email using sendmail.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2286
diff changeset
305 mailhost = self.config('smtp', 'host')
903ab41ac7eb allow to send email using sendmail.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2286
diff changeset
306 if not mailhost:
903ab41ac7eb allow to send email using sendmail.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2286
diff changeset
307 raise util.Abort(_('no [smtp]host in hgrc - cannot send mail'))
903ab41ac7eb allow to send email using sendmail.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2286
diff changeset
308 mailport = int(self.config('smtp', 'port', 25))
903ab41ac7eb allow to send email using sendmail.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2286
diff changeset
309 self.note(_('sending mail: smtp host %s, port %s\n') %
903ab41ac7eb allow to send email using sendmail.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2286
diff changeset
310 (mailhost, mailport))
903ab41ac7eb allow to send email using sendmail.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2286
diff changeset
311 s.connect(host=mailhost, port=mailport)
903ab41ac7eb allow to send email using sendmail.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2286
diff changeset
312 if self.configbool('smtp', 'tls'):
903ab41ac7eb allow to send email using sendmail.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2286
diff changeset
313 self.note(_('(using tls)\n'))
903ab41ac7eb allow to send email using sendmail.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2286
diff changeset
314 s.ehlo()
903ab41ac7eb allow to send email using sendmail.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2286
diff changeset
315 s.starttls()
903ab41ac7eb allow to send email using sendmail.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2286
diff changeset
316 s.ehlo()
903ab41ac7eb allow to send email using sendmail.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2286
diff changeset
317 username = self.config('smtp', 'username')
903ab41ac7eb allow to send email using sendmail.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2286
diff changeset
318 password = self.config('smtp', 'password')
903ab41ac7eb allow to send email using sendmail.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2286
diff changeset
319 if username and password:
903ab41ac7eb allow to send email using sendmail.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2286
diff changeset
320 self.note(_('(authenticating to mail server as %s)\n') %
903ab41ac7eb allow to send email using sendmail.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2286
diff changeset
321 (username))
903ab41ac7eb allow to send email using sendmail.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2286
diff changeset
322 s.login(username, password)
903ab41ac7eb allow to send email using sendmail.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2286
diff changeset
323 return s
903ab41ac7eb allow to send email using sendmail.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2286
diff changeset
324
903ab41ac7eb allow to send email using sendmail.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2286
diff changeset
325 class sendmail(object):
903ab41ac7eb allow to send email using sendmail.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2286
diff changeset
326 '''send mail using sendmail.'''
903ab41ac7eb allow to send email using sendmail.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2286
diff changeset
327
903ab41ac7eb allow to send email using sendmail.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2286
diff changeset
328 def __init__(self, ui, program):
903ab41ac7eb allow to send email using sendmail.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2286
diff changeset
329 self.ui = ui
903ab41ac7eb allow to send email using sendmail.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2286
diff changeset
330 self.program = program
903ab41ac7eb allow to send email using sendmail.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2286
diff changeset
331
903ab41ac7eb allow to send email using sendmail.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2286
diff changeset
332 def sendmail(self, sender, recipients, msg):
903ab41ac7eb allow to send email using sendmail.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2286
diff changeset
333 cmdline = '%s -f %s %s' % (
903ab41ac7eb allow to send email using sendmail.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2286
diff changeset
334 self.program, templater.email(sender),
903ab41ac7eb allow to send email using sendmail.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2286
diff changeset
335 ' '.join(map(templater.email, recipients)))
903ab41ac7eb allow to send email using sendmail.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2286
diff changeset
336 self.ui.note(_('sending mail: %s\n') % cmdline)
903ab41ac7eb allow to send email using sendmail.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2286
diff changeset
337 fp = os.popen(cmdline, 'w')
903ab41ac7eb allow to send email using sendmail.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2286
diff changeset
338 fp.write(msg)
903ab41ac7eb allow to send email using sendmail.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2286
diff changeset
339 ret = fp.close()
903ab41ac7eb allow to send email using sendmail.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2286
diff changeset
340 if ret:
903ab41ac7eb allow to send email using sendmail.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2286
diff changeset
341 raise util.Abort('%s %s' % (
903ab41ac7eb allow to send email using sendmail.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2286
diff changeset
342 os.path.basename(self.program.split(None, 1)[0]),
903ab41ac7eb allow to send email using sendmail.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2286
diff changeset
343 util.explain_exit(ret)[0]))
903ab41ac7eb allow to send email using sendmail.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2286
diff changeset
344
903ab41ac7eb allow to send email using sendmail.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2286
diff changeset
345 method = self.config('email', 'method', 'smtp')
903ab41ac7eb allow to send email using sendmail.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2286
diff changeset
346 if method == 'smtp':
903ab41ac7eb allow to send email using sendmail.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2286
diff changeset
347 mail = smtp()
903ab41ac7eb allow to send email using sendmail.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2286
diff changeset
348 else:
903ab41ac7eb allow to send email using sendmail.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2286
diff changeset
349 mail = sendmail(self, method)
903ab41ac7eb allow to send email using sendmail.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2286
diff changeset
350 return mail
2335
f0680b2d1d64 add ui.print_exc(), make all traceback printing central.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2293
diff changeset
351
f0680b2d1d64 add ui.print_exc(), make all traceback printing central.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2293
diff changeset
352 def print_exc(self):
f0680b2d1d64 add ui.print_exc(), make all traceback printing central.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2293
diff changeset
353 '''print exception traceback if traceback printing enabled.
f0680b2d1d64 add ui.print_exc(), make all traceback printing central.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2293
diff changeset
354 only to call in exception handler. returns true if traceback
f0680b2d1d64 add ui.print_exc(), make all traceback printing central.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2293
diff changeset
355 printed.'''
f0680b2d1d64 add ui.print_exc(), make all traceback printing central.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2293
diff changeset
356 if self.traceback:
f0680b2d1d64 add ui.print_exc(), make all traceback printing central.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2293
diff changeset
357 traceback.print_exc()
f0680b2d1d64 add ui.print_exc(), make all traceback printing central.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2293
diff changeset
358 return self.traceback