153
153
"""Get the users pop up editor."""
154
154
raise NotImplementedError
156
def get_change_editor(self, old_tree, new_tree):
157
from bzrlib import diff
158
cmd = self._get_change_editor()
161
return diff.DiffFromTool.from_string(cmd, old_tree, new_tree,
165
156
def get_mail_client(self):
166
157
"""Get a mail client to use"""
167
158
selected_client = self.get_user_option('mail_client')
190
181
"""Get a generic option as a boolean - no special process, no default.
192
183
:return None if the option doesn't exist or its value can't be
193
interpreted as a boolean. Returns True or False otherwise.
184
interpreted as a boolean. Returns True or False ortherwise.
195
186
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"',
206
def get_user_option_as_list(self, option_name):
207
"""Get a generic option as a list - no special process, no default.
209
:return None if the option doesn't exist. Returns the value as a list
212
l = self._get_user_option(option_name)
213
if isinstance(l, (str, unicode)):
214
# A single value, most probably the user forgot the final ','
187
return ui.bool_from_string(s)
218
189
def gpg_signing_command(self):
219
190
"""What program should be used to sign signatures?"""
258
229
Something similar to 'Martin Pool <mbp@sourcefrog.net>'
260
$BZR_EMAIL can be set to override this, then
231
$BZR_EMAIL can be set to override this (as well as the
232
deprecated $BZREMAIL), then
261
233
the concrete policy type is checked, and finally
262
234
$EMAIL is examined.
263
If no username can be found, errors.NoWhoami exception is raised.
235
If none is found, a reasonable default is (hopefully)
265
238
TODO: Check it's reasonably well-formed.
277
250
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.
252
name, email = _auto_user_id()
254
return '%s <%s>' % (name, email)
288
258
def signature_checking(self):
289
259
"""What is the current policy for signature checking?."""
337
def suppress_warning(self, warning):
338
"""Should the warning be suppressed or emitted.
340
:param warning: The name of the warning being tested.
342
:returns: True if the warning should be suppressed, False otherwise.
344
warnings = self.get_user_option_as_list('suppress_warnings')
345
if warnings is None or warning not in warnings:
351
308
class IniBasedConfig(Config):
352
309
"""A configuration policy that draws from ini files."""
389
346
"""Return the policy for the given (section, option_name) pair."""
390
347
return POLICY_NONE
392
def _get_change_editor(self):
393
return self.get_user_option('change_editor')
395
349
def _get_signature_checking(self):
396
350
"""See Config._get_signature_checking."""
397
351
policy = self._get_user_option('check_signatures')
519
473
self._write_config_file()
521
475
def _write_config_file(self):
522
path = self._get_filename()
524
osutils.copy_ownership_from_path(path)
476
f = open(self._get_filename(), 'wb')
525
477
self._get_parser().write(f)
728
680
return self._get_best_value('_get_user_id')
730
def _get_change_editor(self):
731
return self._get_best_value('_get_change_editor')
733
682
def _get_signature_checking(self):
734
683
"""See Config._get_signature_checking."""
735
684
return self._get_best_value('_get_signature_checking')
879
827
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
829
On Windows it's in the config directory; elsewhere in the XDG cache directory.
885
831
if sys.platform == 'win32':
886
832
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')
834
return osutils.pathjoin(xdg_cache_dir(), 'crash')
893
837
def xdg_cache_dir():
900
844
return os.path.expanduser('~/.cache')
848
"""Calculate automatic user identification.
850
Returns (realname, email).
852
Only used when none is set in the environment or the id file.
854
This previously used the FQDN as the default domain, but that can
855
be very slow on machines where DNS is broken. So now we simply
860
if sys.platform == 'win32':
861
name = win32utils.get_user_name_unicode()
863
raise errors.BzrError("Cannot autodetect user name.\n"
864
"Please, set your name with command like:\n"
865
'bzr whoami "Your Name <name@domain.com>"')
866
host = win32utils.get_host_name_unicode()
868
host = socket.gethostname()
869
return name, (name + '@' + host)
875
w = pwd.getpwuid(uid)
877
raise errors.BzrCommandError('Unable to determine your name. '
878
'Please use "bzr whoami" to set it.')
880
# we try utf-8 first, because on many variants (like Linux),
881
# /etc/passwd "should" be in utf-8, and because it's unlikely to give
882
# false positives. (many users will have their user encoding set to
883
# latin-1, which cannot raise UnicodeError.)
885
gecos = w.pw_gecos.decode('utf-8')
889
encoding = osutils.get_user_encoding()
890
gecos = w.pw_gecos.decode(encoding)
892
raise errors.BzrCommandError('Unable to determine your name. '
893
'Use "bzr whoami" to set it.')
895
username = w.pw_name.decode(encoding)
897
raise errors.BzrCommandError('Unable to determine your name. '
898
'Use "bzr whoami" to set it.')
900
comma = gecos.find(',')
904
realname = gecos[:comma]
911
user_encoding = osutils.get_user_encoding()
912
realname = username = getpass.getuser().decode(user_encoding)
913
except UnicodeDecodeError:
914
raise errors.BzrError("Can't decode username as %s." % \
917
return realname, (username + '@' + socket.gethostname())
903
920
def parse_username(username):
904
921
"""Parse e-mail username and return a (name, address) tuple."""
905
922
match = re.match(r'(.*?)\s*<?([\w+.-]+@[\w+.-]+)>?', username)
1347
1364
class PlainTextCredentialStore(CredentialStore):
1348
__doc__ = """Plain text credential store for the authentication.conf file"""
1365
"""Plain text credential store for the authentication.conf file."""
1350
1367
def decode_password(self, credentials):
1351
1368
"""See CredentialStore.decode_password."""