190
190
"""Get a generic option as a boolean - no special process, no default.
192
192
:return None if the option doesn't exist or its value can't be
193
interpreted as a boolean. Returns True or False otherwise.
193
interpreted as a boolean. Returns True or False ortherwise.
195
195
s = self._get_user_option(option_name)
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 ','
196
return ui.bool_from_string(s)
218
198
def gpg_signing_command(self):
219
199
"""What program should be used to sign signatures?"""
258
238
Something similar to 'Martin Pool <mbp@sourcefrog.net>'
260
$BZR_EMAIL can be set to override this, then
240
$BZR_EMAIL can be set to override this (as well as the
241
deprecated $BZREMAIL), then
261
242
the concrete policy type is checked, and finally
262
243
$EMAIL is examined.
263
If no username can be found, errors.NoWhoami exception is raised.
244
If none is found, a reasonable default is (hopefully)
265
247
TODO: Check it's reasonably well-formed.
277
259
return v.decode(osutils.get_user_encoding())
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.
261
name, email = _auto_user_id()
263
return '%s <%s>' % (name, email)
288
267
def signature_checking(self):
289
268
"""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:
351
317
class IniBasedConfig(Config):
352
318
"""A configuration policy that draws from ini files."""
477
443
def _get_nickname(self):
478
444
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)
489
447
class GlobalConfig(IniBasedConfig):
490
448
"""The configuration that should be used for a specific location."""
526
484
self._get_parser().setdefault(section, {})[option] = value
527
485
self._write_config_file()
487
def _write_config_file(self):
488
f = open(self._get_filename(), 'wb')
489
self._get_parser().write(f)
530
493
class LocationConfig(IniBasedConfig):
531
494
"""A configuration object that gives the policy for a location."""
665
628
self._get_parser()[location][option]=value
666
629
# the allowed values of store match the config policies
667
630
self._set_option_policy(location, option, store)
668
self._write_config_file()
631
self._get_parser().write(file(self._get_filename(), 'wb'))
671
634
class BranchConfig(Config):
844
806
return osutils.pathjoin(base, 'bazaar', '2.0')
808
# cygwin, linux, and darwin all have a $HOME directory
847
810
base = os.path.expanduser("~")
848
811
return osutils.pathjoin(base, ".bazaar")
879
842
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
844
On Windows it's in the config directory; elsewhere in the XDG cache directory.
885
846
if sys.platform == 'win32':
886
847
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')
849
return osutils.pathjoin(xdg_cache_dir(), 'crash')
893
852
def xdg_cache_dir():
900
859
return os.path.expanduser('~/.cache')
863
"""Calculate automatic user identification.
865
Returns (realname, email).
867
Only used when none is set in the environment or the id file.
869
This previously used the FQDN as the default domain, but that can
870
be very slow on machines where DNS is broken. So now we simply
875
if sys.platform == 'win32':
876
name = win32utils.get_user_name_unicode()
878
raise errors.BzrError("Cannot autodetect user name.\n"
879
"Please, set your name with command like:\n"
880
'bzr whoami "Your Name <name@domain.com>"')
881
host = win32utils.get_host_name_unicode()
883
host = socket.gethostname()
884
return name, (name + '@' + host)
890
w = pwd.getpwuid(uid)
892
raise errors.BzrCommandError('Unable to determine your name. '
893
'Please use "bzr whoami" to set it.')
895
# we try utf-8 first, because on many variants (like Linux),
896
# /etc/passwd "should" be in utf-8, and because it's unlikely to give
897
# false positives. (many users will have their user encoding set to
898
# latin-1, which cannot raise UnicodeError.)
900
gecos = w.pw_gecos.decode('utf-8')
904
encoding = osutils.get_user_encoding()
905
gecos = w.pw_gecos.decode(encoding)
907
raise errors.BzrCommandError('Unable to determine your name. '
908
'Use "bzr whoami" to set it.')
910
username = w.pw_name.decode(encoding)
912
raise errors.BzrCommandError('Unable to determine your name. '
913
'Use "bzr whoami" to set it.')
915
comma = gecos.find(',')
919
realname = gecos[:comma]
926
user_encoding = osutils.get_user_encoding()
927
realname = username = getpass.getuser().decode(user_encoding)
928
except UnicodeDecodeError:
929
raise errors.BzrError("Can't decode username as %s." % \
932
return realname, (username + '@' + socket.gethostname())
903
935
def parse_username(username):
904
936
"""Parse e-mail username and return a (name, address) tuple."""
905
937
match = re.match(r'(.*?)\s*<?([\w+.-]+@[\w+.-]+)>?', username)
991
1023
"""Save the config file, only tests should use it for now."""
992
1024
conf_dir = os.path.dirname(self._filename)
993
1025
ensure_config_dir_exists(conf_dir)
994
f = file(self._filename, 'wb')
996
self._get_config().write(f)
1026
self._get_config().write(file(self._filename, 'wb'))
1000
1028
def _set_option(self, section_name, option_name, value):
1001
1029
"""Set an authentication configuration option"""
1351
1379
class PlainTextCredentialStore(CredentialStore):
1352
__doc__ = """Plain text credential store for the authentication.conf file"""
1380
"""Plain text credential store for the authentication.conf file."""
1354
1382
def decode_password(self, credentials):
1355
1383
"""See CredentialStore.decode_password."""
1449
1477
return StringIO()
1451
1479
def _get_configobj(self):
1452
f = self._get_config_file()
1454
return ConfigObj(f, encoding='utf-8')
1480
return ConfigObj(self._get_config_file(), encoding='utf-8')
1458
1482
def _set_configobj(self, configobj):
1459
1483
out_file = StringIO()