193
194
interpreted as a boolean. Returns True or False otherwise.
195
196
s = self._get_user_option(option_name)
196
return ui.bool_from_string(s)
198
# The option doesn't exist
200
val = ui.bool_from_string(s)
202
# The value can't be interpreted as a boolean
203
trace.warning('Value "%s" is not a boolean for "%s"',
198
207
def get_user_option_as_list(self, option_name):
199
208
"""Get a generic option as a list - no special process, no default.
250
259
Something similar to 'Martin Pool <mbp@sourcefrog.net>'
252
$BZR_EMAIL can be set to override this (as well as the
253
deprecated $BZREMAIL), then
261
$BZR_EMAIL can be set to override this, then
254
262
the concrete policy type is checked, and finally
255
263
$EMAIL is examined.
256
If none is found, a reasonable default is (hopefully)
264
If no username can be found, errors.NoWhoami exception is raised.
259
266
TODO: Check it's reasonably well-formed.
271
278
return v.decode(osutils.get_user_encoding())
273
name, email = _auto_user_id()
275
return '%s <%s>' % (name, email)
280
raise errors.NoWhoami()
282
def ensure_username(self):
283
"""Raise errors.NoWhoami if username is not set.
285
This method relies on the username() function raising the error.
279
289
def signature_checking(self):
280
290
"""What is the current policy for signature checking?."""
468
478
def _get_nickname(self):
469
479
return self.get_user_option('nickname')
481
def _write_config_file(self):
482
filename = self._get_filename()
483
atomic_file = atomicfile.AtomicFile(filename)
484
self._get_parser().write(atomic_file)
487
osutils.copy_ownership_from_path(filename)
472
490
class GlobalConfig(IniBasedConfig):
473
491
"""The configuration that should be used for a specific location."""
509
527
self._get_parser().setdefault(section, {})[option] = value
510
528
self._write_config_file()
512
def _write_config_file(self):
513
f = open(self._get_filename(), 'wb')
514
self._get_parser().write(f)
518
531
class LocationConfig(IniBasedConfig):
519
532
"""A configuration object that gives the policy for a location."""
653
666
self._get_parser()[location][option]=value
654
667
# the allowed values of store match the config policies
655
668
self._set_option_policy(location, option, store)
656
self._get_parser().write(file(self._get_filename(), 'wb'))
669
self._write_config_file()
659
672
class BranchConfig(Config):
831
845
return osutils.pathjoin(base, 'bazaar', '2.0')
833
# cygwin, linux, and darwin all have a $HOME directory
835
848
base = os.path.expanduser("~")
836
849
return osutils.pathjoin(base, ".bazaar")
867
880
This doesn't implicitly create it.
869
On Windows it's in the config directory; elsewhere in the XDG cache directory.
882
On Windows it's in the config directory; elsewhere it's /var/crash
883
which may be monitored by apport. It can be overridden by
871
886
if sys.platform == 'win32':
872
887
return osutils.pathjoin(config_dir(), 'Crash')
874
return osutils.pathjoin(xdg_cache_dir(), 'crash')
889
# XXX: hardcoded in apport_python_hook.py; therefore here too -- mbp
891
return os.environ.get('APPORT_CRASH_DIR', '/var/crash')
877
894
def xdg_cache_dir():
884
901
return os.path.expanduser('~/.cache')
888
"""Calculate automatic user identification.
890
Returns (realname, email).
892
Only used when none is set in the environment or the id file.
894
This previously used the FQDN as the default domain, but that can
895
be very slow on machines where DNS is broken. So now we simply
900
if sys.platform == 'win32':
901
name = win32utils.get_user_name_unicode()
903
raise errors.BzrError("Cannot autodetect user name.\n"
904
"Please, set your name with command like:\n"
905
'bzr whoami "Your Name <name@domain.com>"')
906
host = win32utils.get_host_name_unicode()
908
host = socket.gethostname()
909
return name, (name + '@' + host)
915
w = pwd.getpwuid(uid)
917
raise errors.BzrCommandError('Unable to determine your name. '
918
'Please use "bzr whoami" to set it.')
920
# we try utf-8 first, because on many variants (like Linux),
921
# /etc/passwd "should" be in utf-8, and because it's unlikely to give
922
# false positives. (many users will have their user encoding set to
923
# latin-1, which cannot raise UnicodeError.)
925
gecos = w.pw_gecos.decode('utf-8')
929
encoding = osutils.get_user_encoding()
930
gecos = w.pw_gecos.decode(encoding)
932
raise errors.BzrCommandError('Unable to determine your name. '
933
'Use "bzr whoami" to set it.')
935
username = w.pw_name.decode(encoding)
937
raise errors.BzrCommandError('Unable to determine your name. '
938
'Use "bzr whoami" to set it.')
940
comma = gecos.find(',')
944
realname = gecos[:comma]
951
user_encoding = osutils.get_user_encoding()
952
realname = username = getpass.getuser().decode(user_encoding)
953
except UnicodeDecodeError:
954
raise errors.BzrError("Can't decode username as %s." % \
957
return realname, (username + '@' + socket.gethostname())
960
904
def parse_username(username):
961
905
"""Parse e-mail username and return a (name, address) tuple."""
962
906
match = re.match(r'(.*?)\s*<?([\w+.-]+@[\w+.-]+)>?', username)
1048
992
"""Save the config file, only tests should use it for now."""
1049
993
conf_dir = os.path.dirname(self._filename)
1050
994
ensure_config_dir_exists(conf_dir)
1051
self._get_config().write(file(self._filename, 'wb'))
995
f = file(self._filename, 'wb')
997
self._get_config().write(f)
1053
1001
def _set_option(self, section_name, option_name, value):
1054
1002
"""Set an authentication configuration option"""
1404
1352
class PlainTextCredentialStore(CredentialStore):
1405
"""Plain text credential store for the authentication.conf file."""
1353
__doc__ = """Plain text credential store for the authentication.conf file"""
1407
1355
def decode_password(self, credentials):
1408
1356
"""See CredentialStore.decode_password."""
1502
1450
return StringIO()
1504
1452
def _get_configobj(self):
1505
return ConfigObj(self._get_config_file(), encoding='utf-8')
1453
f = self._get_config_file()
1455
return ConfigObj(f, encoding='utf-8')
1507
1459
def _set_configobj(self, configobj):
1508
1460
out_file = StringIO()