154
153
"""Get the users pop up editor."""
155
154
raise NotImplementedError
157
def get_change_editor(self, old_tree, new_tree):
158
from bzrlib import diff
159
cmd = self._get_change_editor()
162
return diff.DiffFromTool.from_string(cmd, old_tree, new_tree,
166
156
def get_mail_client(self):
167
157
"""Get a mail client to use"""
168
158
selected_client = self.get_user_option('mail_client')
191
181
"""Get a generic option as a boolean - no special process, no default.
193
183
:return None if the option doesn't exist or its value can't be
194
interpreted as a boolean. Returns True or False otherwise.
184
interpreted as a boolean. Returns True or False ortherwise.
196
186
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"',
207
def get_user_option_as_list(self, option_name):
208
"""Get a generic option as a list - no special process, no default.
210
:return None if the option doesn't exist. Returns the value as a list
213
l = self._get_user_option(option_name)
214
if isinstance(l, (str, unicode)):
215
# A single value, most probably the user forgot the final ','
187
return ui.bool_from_string(s)
219
189
def gpg_signing_command(self):
220
190
"""What program should be used to sign signatures?"""
259
229
Something similar to 'Martin Pool <mbp@sourcefrog.net>'
261
$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
262
233
the concrete policy type is checked, and finally
263
234
$EMAIL is examined.
264
If no username can be found, errors.NoWhoami exception is raised.
235
If none is found, a reasonable default is (hopefully)
266
238
TODO: Check it's reasonably well-formed.
278
250
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.
252
name, email = _auto_user_id()
254
return '%s <%s>' % (name, email)
289
258
def signature_checking(self):
290
259
"""What is the current policy for signature checking?."""
338
def suppress_warning(self, warning):
339
"""Should the warning be suppressed or emitted.
341
:param warning: The name of the warning being tested.
343
:returns: True if the warning should be suppressed, False otherwise.
345
warnings = self.get_user_option_as_list('suppress_warnings')
346
if warnings is None or warning not in warnings:
352
308
class IniBasedConfig(Config):
353
309
"""A configuration policy that draws from ini files."""
390
346
"""Return the policy for the given (section, option_name) pair."""
391
347
return POLICY_NONE
393
def _get_change_editor(self):
394
return self.get_user_option('change_editor')
396
349
def _get_signature_checking(self):
397
350
"""See Config._get_signature_checking."""
398
351
policy = self._get_user_option('check_signatures')
478
431
def _get_nickname(self):
479
432
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
435
class GlobalConfig(IniBasedConfig):
491
436
"""The configuration that should be used for a specific location."""
527
472
self._get_parser().setdefault(section, {})[option] = value
528
473
self._write_config_file()
475
def _write_config_file(self):
476
f = open(self._get_filename(), 'wb')
477
self._get_parser().write(f)
531
481
class LocationConfig(IniBasedConfig):
532
482
"""A configuration object that gives the policy for a location."""
666
616
self._get_parser()[location][option]=value
667
617
# the allowed values of store match the config policies
668
618
self._set_option_policy(location, option, store)
669
self._write_config_file()
619
self._get_parser().write(file(self._get_filename(), 'wb'))
672
622
class BranchConfig(Config):
730
680
return self._get_best_value('_get_user_id')
732
def _get_change_editor(self):
733
return self._get_best_value('_get_change_editor')
735
682
def _get_signature_checking(self):
736
683
"""See Config._get_signature_checking."""
737
684
return self._get_best_value('_get_signature_checking')
845
791
return osutils.pathjoin(base, 'bazaar', '2.0')
793
# cygwin, linux, and darwin all have a $HOME directory
848
795
base = os.path.expanduser("~")
849
796
return osutils.pathjoin(base, ".bazaar")
880
827
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
829
On Windows it's in the config directory; elsewhere in the XDG cache directory.
886
831
if sys.platform == 'win32':
887
832
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')
834
return osutils.pathjoin(xdg_cache_dir(), 'crash')
894
837
def xdg_cache_dir():
901
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())
904
920
def parse_username(username):
905
921
"""Parse e-mail username and return a (name, address) tuple."""
906
922
match = re.match(r'(.*?)\s*<?([\w+.-]+@[\w+.-]+)>?', username)
992
1008
"""Save the config file, only tests should use it for now."""
993
1009
conf_dir = os.path.dirname(self._filename)
994
1010
ensure_config_dir_exists(conf_dir)
995
f = file(self._filename, 'wb')
997
self._get_config().write(f)
1011
self._get_config().write(file(self._filename, 'wb'))
1001
1013
def _set_option(self, section_name, option_name, value):
1002
1014
"""Set an authentication configuration option"""
1352
1364
class PlainTextCredentialStore(CredentialStore):
1353
__doc__ = """Plain text credential store for the authentication.conf file"""
1365
"""Plain text credential store for the authentication.conf file."""
1355
1367
def decode_password(self, credentials):
1356
1368
"""See CredentialStore.decode_password."""
1446
1458
def _get_config_file(self):
1448
return StringIO(self._transport.get_bytes(self._filename))
1460
return self._transport.get(self._filename)
1449
1461
except errors.NoSuchFile:
1450
1462
return StringIO()
1452
1464
def _get_configobj(self):
1453
f = self._get_config_file()
1455
return ConfigObj(f, encoding='utf-8')
1465
return ConfigObj(self._get_config_file(), encoding='utf-8')
1459
1467
def _set_configobj(self, configobj):
1460
1468
out_file = StringIO()