193
193
interpreted as a boolean. Returns True or False otherwise.
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"',
196
return ui.bool_from_string(s)
206
198
def get_user_option_as_list(self, option_name):
207
199
"""Get a generic option as a list - no special process, no default.
258
250
Something similar to 'Martin Pool <mbp@sourcefrog.net>'
260
$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
261
254
the concrete policy type is checked, and finally
262
255
$EMAIL is examined.
263
If no username can be found, errors.NoWhoami exception is raised.
256
If none is found, a reasonable default is (hopefully)
265
259
TODO: Check it's reasonably well-formed.
277
271
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.
273
name, email = _auto_user_id()
275
return '%s <%s>' % (name, email)
288
279
def signature_checking(self):
289
280
"""What is the current policy for signature checking?."""
477
468
def _get_nickname(self):
478
469
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
472
class GlobalConfig(IniBasedConfig):
490
473
"""The configuration that should be used for a specific location."""
526
509
self._get_parser().setdefault(section, {})[option] = value
527
510
self._write_config_file()
512
def _write_config_file(self):
513
f = open(self._get_filename(), 'wb')
514
self._get_parser().write(f)
530
518
class LocationConfig(IniBasedConfig):
531
519
"""A configuration object that gives the policy for a location."""
665
653
self._get_parser()[location][option]=value
666
654
# the allowed values of store match the config policies
667
655
self._set_option_policy(location, option, store)
668
self._write_config_file()
656
self._get_parser().write(file(self._get_filename(), 'wb'))
671
659
class BranchConfig(Config):
844
831
return osutils.pathjoin(base, 'bazaar', '2.0')
833
# cygwin, linux, and darwin all have a $HOME directory
847
835
base = os.path.expanduser("~")
848
836
return osutils.pathjoin(base, ".bazaar")
900
888
return os.path.expanduser('~/.cache')
892
"""Calculate automatic user identification.
894
Returns (realname, email).
896
Only used when none is set in the environment or the id file.
898
This previously used the FQDN as the default domain, but that can
899
be very slow on machines where DNS is broken. So now we simply
904
if sys.platform == 'win32':
905
name = win32utils.get_user_name_unicode()
907
raise errors.BzrError("Cannot autodetect user name.\n"
908
"Please, set your name with command like:\n"
909
'bzr whoami "Your Name <name@domain.com>"')
910
host = win32utils.get_host_name_unicode()
912
host = socket.gethostname()
913
return name, (name + '@' + host)
919
w = pwd.getpwuid(uid)
921
raise errors.BzrCommandError('Unable to determine your name. '
922
'Please use "bzr whoami" to set it.')
924
# we try utf-8 first, because on many variants (like Linux),
925
# /etc/passwd "should" be in utf-8, and because it's unlikely to give
926
# false positives. (many users will have their user encoding set to
927
# latin-1, which cannot raise UnicodeError.)
929
gecos = w.pw_gecos.decode('utf-8')
933
encoding = osutils.get_user_encoding()
934
gecos = w.pw_gecos.decode(encoding)
936
raise errors.BzrCommandError('Unable to determine your name. '
937
'Use "bzr whoami" to set it.')
939
username = w.pw_name.decode(encoding)
941
raise errors.BzrCommandError('Unable to determine your name. '
942
'Use "bzr whoami" to set it.')
944
comma = gecos.find(',')
948
realname = gecos[:comma]
955
user_encoding = osutils.get_user_encoding()
956
realname = username = getpass.getuser().decode(user_encoding)
957
except UnicodeDecodeError:
958
raise errors.BzrError("Can't decode username as %s." % \
961
return realname, (username + '@' + socket.gethostname())
903
964
def parse_username(username):
904
965
"""Parse e-mail username and return a (name, address) tuple."""
905
966
match = re.match(r'(.*?)\s*<?([\w+.-]+@[\w+.-]+)>?', username)
991
1052
"""Save the config file, only tests should use it for now."""
992
1053
conf_dir = os.path.dirname(self._filename)
993
1054
ensure_config_dir_exists(conf_dir)
994
f = file(self._filename, 'wb')
996
self._get_config().write(f)
1055
self._get_config().write(file(self._filename, 'wb'))
1000
1057
def _set_option(self, section_name, option_name, value):
1001
1058
"""Set an authentication configuration option"""
1351
1408
class PlainTextCredentialStore(CredentialStore):
1352
__doc__ = """Plain text credential store for the authentication.conf file"""
1409
"""Plain text credential store for the authentication.conf file."""
1354
1411
def decode_password(self, credentials):
1355
1412
"""See CredentialStore.decode_password."""
1449
1506
return StringIO()
1451
1508
def _get_configobj(self):
1452
f = self._get_config_file()
1454
return ConfigObj(f, encoding='utf-8')
1509
return ConfigObj(self._get_config_file(), encoding='utf-8')
1458
1511
def _set_configobj(self, configobj):
1459
1512
out_file = StringIO()