153
153
"""Get the users pop up editor."""
154
154
raise NotImplementedError
156
def get_change_editor(self, old_tree, new_tree):
157
from bzrlib import diff
158
cmd = self._get_change_editor()
161
return diff.DiffFromTool.from_string(cmd, old_tree, new_tree,
156
165
def get_mail_client(self):
157
166
"""Get a mail client to use"""
158
167
selected_client = self.get_user_option('mail_client')
181
190
"""Get a generic option as a boolean - no special process, no default.
183
192
:return None if the option doesn't exist or its value can't be
184
interpreted as a boolean. Returns True or False ortherwise.
193
interpreted as a boolean. Returns True or False otherwise.
186
195
s = self._get_user_option(option_name)
187
return ui.bool_from_string(s)
197
# The option doesn't exist
199
val = ui.bool_from_string(s)
201
# The value can't be interpreted as a boolean
202
trace.warning('Value "%s" is not a boolean for "%s"',
206
def get_user_option_as_list(self, option_name):
207
"""Get a generic option as a list - no special process, no default.
209
:return None if the option doesn't exist. Returns the value as a list
212
l = self._get_user_option(option_name)
213
if isinstance(l, (str, unicode)):
214
# A single value, most probably the user forgot the final ','
189
218
def gpg_signing_command(self):
190
219
"""What program should be used to sign signatures?"""
229
258
Something similar to 'Martin Pool <mbp@sourcefrog.net>'
231
$BZR_EMAIL can be set to override this (as well as the
232
deprecated $BZREMAIL), then
260
$BZR_EMAIL can be set to override this, then
233
261
the concrete policy type is checked, and finally
234
262
$EMAIL is examined.
235
If none is found, a reasonable default is (hopefully)
263
If no username can be found, errors.NoWhoami exception is raised.
238
265
TODO: Check it's reasonably well-formed.
250
277
return v.decode(osutils.get_user_encoding())
252
name, email = _auto_user_id()
254
return '%s <%s>' % (name, email)
279
raise errors.NoWhoami()
281
def ensure_username(self):
282
"""Raise errors.NoWhoami if username is not set.
284
This method relies on the username() function raising the error.
258
288
def signature_checking(self):
259
289
"""What is the current policy for signature checking?."""
337
def suppress_warning(self, warning):
338
"""Should the warning be suppressed or emitted.
340
:param warning: The name of the warning being tested.
342
:returns: True if the warning should be suppressed, False otherwise.
344
warnings = self.get_user_option_as_list('suppress_warnings')
345
if warnings is None or warning not in warnings:
308
351
class IniBasedConfig(Config):
309
352
"""A configuration policy that draws from ini files."""
431
477
def _get_nickname(self):
432
478
return self.get_user_option('nickname')
480
def _write_config_file(self):
481
f = file(self._get_filename(), "wb")
483
osutils.copy_ownership_from_path(f.name)
484
self._get_parser().write(f)
435
489
class GlobalConfig(IniBasedConfig):
436
490
"""The configuration that should be used for a specific location."""
472
526
self._get_parser().setdefault(section, {})[option] = value
473
527
self._write_config_file()
475
def _write_config_file(self):
476
f = open(self._get_filename(), 'wb')
477
self._get_parser().write(f)
481
530
class LocationConfig(IniBasedConfig):
482
531
"""A configuration object that gives the policy for a location."""
616
665
self._get_parser()[location][option]=value
617
666
# the allowed values of store match the config policies
618
667
self._set_option_policy(location, option, store)
619
self._get_parser().write(file(self._get_filename(), 'wb'))
668
self._write_config_file()
622
671
class BranchConfig(Config):
821
873
return osutils.pathjoin(config_dir(), 'ignore')
825
"""Calculate automatic user identification.
827
Returns (realname, email).
829
Only used when none is set in the environment or the id file.
831
This previously used the FQDN as the default domain, but that can
832
be very slow on machines where DNS is broken. So now we simply
877
"""Return the directory name to store crash files.
879
This doesn't implicitly create it.
881
On Windows it's in the config directory; elsewhere it's /var/crash
882
which may be monitored by apport. It can be overridden by
837
885
if sys.platform == 'win32':
838
name = win32utils.get_user_name_unicode()
840
raise errors.BzrError("Cannot autodetect user name.\n"
841
"Please, set your name with command like:\n"
842
'bzr whoami "Your Name <name@domain.com>"')
843
host = win32utils.get_host_name_unicode()
845
host = socket.gethostname()
846
return name, (name + '@' + host)
852
w = pwd.getpwuid(uid)
854
raise errors.BzrCommandError('Unable to determine your name. '
855
'Please use "bzr whoami" to set it.')
857
# we try utf-8 first, because on many variants (like Linux),
858
# /etc/passwd "should" be in utf-8, and because it's unlikely to give
859
# false positives. (many users will have their user encoding set to
860
# latin-1, which cannot raise UnicodeError.)
862
gecos = w.pw_gecos.decode('utf-8')
866
encoding = osutils.get_user_encoding()
867
gecos = w.pw_gecos.decode(encoding)
869
raise errors.BzrCommandError('Unable to determine your name. '
870
'Use "bzr whoami" to set it.')
872
username = w.pw_name.decode(encoding)
874
raise errors.BzrCommandError('Unable to determine your name. '
875
'Use "bzr whoami" to set it.')
877
comma = gecos.find(',')
881
realname = gecos[:comma]
888
user_encoding = osutils.get_user_encoding()
889
realname = username = getpass.getuser().decode(user_encoding)
890
except UnicodeDecodeError:
891
raise errors.BzrError("Can't decode username as %s." % \
894
return realname, (username + '@' + socket.gethostname())
886
return osutils.pathjoin(config_dir(), 'Crash')
888
# XXX: hardcoded in apport_python_hook.py; therefore here too -- mbp
890
return os.environ.get('APPORT_CRASH_DIR', '/var/crash')
894
# See http://standards.freedesktop.org/basedir-spec/latest/ar01s03.html
895
# Possibly this should be different on Windows?
896
e = os.environ.get('XDG_CACHE_DIR', None)
900
return os.path.expanduser('~/.cache')
897
903
def parse_username(username):
985
991
"""Save the config file, only tests should use it for now."""
986
992
conf_dir = os.path.dirname(self._filename)
987
993
ensure_config_dir_exists(conf_dir)
988
self._get_config().write(file(self._filename, 'wb'))
994
f = file(self._filename, 'wb')
996
self._get_config().write(f)
990
1000
def _set_option(self, section_name, option_name, value):
991
1001
"""Set an authentication configuration option"""
1435
1445
def _get_config_file(self):
1437
return self._transport.get(self._filename)
1447
return StringIO(self._transport.get_bytes(self._filename))
1438
1448
except errors.NoSuchFile:
1439
1449
return StringIO()
1441
1451
def _get_configobj(self):
1442
return ConfigObj(self._get_config_file(), encoding='utf-8')
1452
f = self._get_config_file()
1454
return ConfigObj(f, encoding='utf-8')
1444
1458
def _set_configobj(self, configobj):
1445
1459
out_file = StringIO()