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?."""
519
510
self._write_config_file()
521
512
def _write_config_file(self):
522
path = self._get_filename()
524
osutils.copy_ownership_from_path(path)
513
f = open(self._get_filename(), 'wb')
525
514
self._get_parser().write(f)
879
867
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
869
On Windows it's in the config directory; elsewhere in the XDG cache directory.
885
871
if sys.platform == 'win32':
886
872
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')
874
return osutils.pathjoin(xdg_cache_dir(), 'crash')
893
877
def xdg_cache_dir():
900
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())
903
960
def parse_username(username):
904
961
"""Parse e-mail username and return a (name, address) tuple."""
905
962
match = re.match(r'(.*?)\s*<?([\w+.-]+@[\w+.-]+)>?', username)
1347
1404
class PlainTextCredentialStore(CredentialStore):
1348
__doc__ = """Plain text credential store for the authentication.conf file"""
1405
"""Plain text credential store for the authentication.conf file."""
1350
1407
def decode_password(self, credentials):
1351
1408
"""See CredentialStore.decode_password."""