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
path = self._get_filename()
514
f = osutils.open_with_ownership(path, 'wb')
515
self._get_parser().write(f)
531
519
class LocationConfig(IniBasedConfig):
532
520
"""A configuration object that gives the policy for a location."""
666
654
self._get_parser()[location][option]=value
667
655
# the allowed values of store match the config policies
668
656
self._set_option_policy(location, option, store)
669
self._write_config_file()
657
self._get_parser().write(file(self._get_filename(), 'wb'))
672
660
class BranchConfig(Config):
845
832
return osutils.pathjoin(base, 'bazaar', '2.0')
834
# cygwin, linux, and darwin all have a $HOME directory
848
836
base = os.path.expanduser("~")
849
837
return osutils.pathjoin(base, ".bazaar")
901
889
return os.path.expanduser('~/.cache')
893
"""Calculate automatic user identification.
895
Returns (realname, email).
897
Only used when none is set in the environment or the id file.
899
This previously used the FQDN as the default domain, but that can
900
be very slow on machines where DNS is broken. So now we simply
905
if sys.platform == 'win32':
906
name = win32utils.get_user_name_unicode()
908
raise errors.BzrError("Cannot autodetect user name.\n"
909
"Please, set your name with command like:\n"
910
'bzr whoami "Your Name <name@domain.com>"')
911
host = win32utils.get_host_name_unicode()
913
host = socket.gethostname()
914
return name, (name + '@' + host)
920
w = pwd.getpwuid(uid)
922
raise errors.BzrCommandError('Unable to determine your name. '
923
'Please use "bzr whoami" to set it.')
925
# we try utf-8 first, because on many variants (like Linux),
926
# /etc/passwd "should" be in utf-8, and because it's unlikely to give
927
# false positives. (many users will have their user encoding set to
928
# latin-1, which cannot raise UnicodeError.)
930
gecos = w.pw_gecos.decode('utf-8')
934
encoding = osutils.get_user_encoding()
935
gecos = w.pw_gecos.decode(encoding)
937
raise errors.BzrCommandError('Unable to determine your name. '
938
'Use "bzr whoami" to set it.')
940
username = w.pw_name.decode(encoding)
942
raise errors.BzrCommandError('Unable to determine your name. '
943
'Use "bzr whoami" to set it.')
945
comma = gecos.find(',')
949
realname = gecos[:comma]
956
user_encoding = osutils.get_user_encoding()
957
realname = username = getpass.getuser().decode(user_encoding)
958
except UnicodeDecodeError:
959
raise errors.BzrError("Can't decode username as %s." % \
962
return realname, (username + '@' + socket.gethostname())
904
965
def parse_username(username):
905
966
"""Parse e-mail username and return a (name, address) tuple."""
906
967
match = re.match(r'(.*?)\s*<?([\w+.-]+@[\w+.-]+)>?', username)
992
1053
"""Save the config file, only tests should use it for now."""
993
1054
conf_dir = os.path.dirname(self._filename)
994
1055
ensure_config_dir_exists(conf_dir)
995
f = file(self._filename, 'wb')
997
self._get_config().write(f)
1056
self._get_config().write(file(self._filename, 'wb'))
1001
1058
def _set_option(self, section_name, option_name, value):
1002
1059
"""Set an authentication configuration option"""
1352
1409
class PlainTextCredentialStore(CredentialStore):
1353
__doc__ = """Plain text credential store for the authentication.conf file"""
1410
"""Plain text credential store for the authentication.conf file."""
1355
1412
def decode_password(self, credentials):
1356
1413
"""See CredentialStore.decode_password."""
1450
1507
return StringIO()
1452
1509
def _get_configobj(self):
1453
f = self._get_config_file()
1455
return ConfigObj(f, encoding='utf-8')
1510
return ConfigObj(self._get_config_file(), encoding='utf-8')
1459
1512
def _set_configobj(self, configobj):
1460
1513
out_file = StringIO()