194
193
interpreted as a boolean. Returns True or False otherwise.
196
195
s = self._get_user_option(option_name)
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"',
196
return ui.bool_from_string(s)
207
198
def get_user_option_as_list(self, option_name):
208
199
"""Get a generic option as a list - no special process, no default.
259
250
Something similar to 'Martin Pool <mbp@sourcefrog.net>'
261
$BZR_EMAIL can be set to override this, then
252
$BZR_EMAIL can be set to override this (as well as the
253
deprecated $BZREMAIL), then
262
254
the concrete policy type is checked, and finally
263
255
$EMAIL is examined.
264
If no username can be found, errors.NoWhoami exception is raised.
256
If none is found, a reasonable default is (hopefully)
266
259
TODO: Check it's reasonably well-formed.
278
271
return v.decode(osutils.get_user_encoding())
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.
273
name, email = _auto_user_id()
275
return '%s <%s>' % (name, email)
289
279
def signature_checking(self):
290
280
"""What is the current policy for signature checking?."""
478
468
def _get_nickname(self):
479
469
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)
490
472
class GlobalConfig(IniBasedConfig):
491
473
"""The configuration that should be used for a specific location."""
527
509
self._get_parser().setdefault(section, {})[option] = value
528
510
self._write_config_file()
512
def _write_config_file(self):
513
f = open(self._get_filename(), 'wb')
514
self._get_parser().write(f)
531
518
class LocationConfig(IniBasedConfig):
532
519
"""A configuration object that gives the policy for a location."""
666
653
self._get_parser()[location][option]=value
667
654
# the allowed values of store match the config policies
668
655
self._set_option_policy(location, option, store)
669
self._write_config_file()
656
self._get_parser().write(file(self._get_filename(), 'wb'))
672
659
class BranchConfig(Config):
845
831
return osutils.pathjoin(base, 'bazaar', '2.0')
833
# cygwin, linux, and darwin all have a $HOME directory
848
835
base = os.path.expanduser("~")
849
836
return osutils.pathjoin(base, ".bazaar")
880
867
This doesn't implicitly create it.
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
869
On Windows it's in the config directory; elsewhere in the XDG cache directory.
886
871
if sys.platform == 'win32':
887
872
return osutils.pathjoin(config_dir(), 'Crash')
889
# XXX: hardcoded in apport_python_hook.py; therefore here too -- mbp
891
return os.environ.get('APPORT_CRASH_DIR', '/var/crash')
874
return osutils.pathjoin(xdg_cache_dir(), 'crash')
894
877
def xdg_cache_dir():
901
884
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())
904
960
def parse_username(username):
905
961
"""Parse e-mail username and return a (name, address) tuple."""
906
962
match = re.match(r'(.*?)\s*<?([\w+.-]+@[\w+.-]+)>?', username)
992
1048
"""Save the config file, only tests should use it for now."""
993
1049
conf_dir = os.path.dirname(self._filename)
994
1050
ensure_config_dir_exists(conf_dir)
995
f = file(self._filename, 'wb')
997
self._get_config().write(f)
1051
self._get_config().write(file(self._filename, 'wb'))
1001
1053
def _set_option(self, section_name, option_name, value):
1002
1054
"""Set an authentication configuration option"""
1352
1404
class PlainTextCredentialStore(CredentialStore):
1353
__doc__ = """Plain text credential store for the authentication.conf file"""
1405
"""Plain text credential store for the authentication.conf file."""
1355
1407
def decode_password(self, credentials):
1356
1408
"""See CredentialStore.decode_password."""
1450
1502
return StringIO()
1452
1504
def _get_configobj(self):
1453
f = self._get_config_file()
1455
return ConfigObj(f, encoding='utf-8')
1505
return ConfigObj(self._get_config_file(), encoding='utf-8')
1459
1507
def _set_configobj(self, configobj):
1460
1508
out_file = StringIO()