153
154
"""Get the users pop up editor."""
154
155
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,
156
166
def get_mail_client(self):
157
167
"""Get a mail client to use"""
158
168
selected_client = self.get_user_option('mail_client')
181
191
"""Get a generic option as a boolean - no special process, no default.
183
193
:return None if the option doesn't exist or its value can't be
184
interpreted as a boolean. Returns True or False ortherwise.
194
interpreted as a boolean. Returns True or False otherwise.
186
196
s = self._get_user_option(option_name)
187
return ui.bool_from_string(s)
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 ','
189
219
def gpg_signing_command(self):
190
220
"""What program should be used to sign signatures?"""
229
259
Something similar to 'Martin Pool <mbp@sourcefrog.net>'
231
$BZR_EMAIL can be set to override this (as well as the
232
deprecated $BZREMAIL), then
261
$BZR_EMAIL can be set to override this, then
233
262
the concrete policy type is checked, and finally
234
263
$EMAIL is examined.
235
If none is found, a reasonable default is (hopefully)
264
If no username can be found, errors.NoWhoami exception is raised.
238
266
TODO: Check it's reasonably well-formed.
250
278
return v.decode(osutils.get_user_encoding())
252
name, email = _auto_user_id()
254
return '%s <%s>' % (name, email)
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.
258
289
def signature_checking(self):
259
290
"""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:
308
352
class IniBasedConfig(Config):
309
353
"""A configuration policy that draws from ini files."""
431
478
def _get_nickname(self):
432
479
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)
435
490
class GlobalConfig(IniBasedConfig):
436
491
"""The configuration that should be used for a specific location."""
472
527
self._get_parser().setdefault(section, {})[option] = value
473
528
self._write_config_file()
475
def _write_config_file(self):
476
f = open(self._get_filename(), 'wb')
477
self._get_parser().write(f)
481
531
class LocationConfig(IniBasedConfig):
482
532
"""A configuration object that gives the policy for a location."""
616
666
self._get_parser()[location][option]=value
617
667
# the allowed values of store match the config policies
618
668
self._set_option_policy(location, option, store)
619
self._get_parser().write(file(self._get_filename(), 'wb'))
669
self._write_config_file()
622
672
class BranchConfig(Config):
821
874
return osutils.pathjoin(config_dir(), 'ignore')
825
"""Calculate automatic user identification.
827
Returns (realname, email).
829
Only used when none is set in the environment or the id file.
831
This previously used the FQDN as the default domain, but that can
832
be very slow on machines where DNS is broken. So now we simply
878
"""Return the directory name to store crash files.
880
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
837
886
if sys.platform == 'win32':
838
name = win32utils.get_user_name_unicode()
840
raise errors.BzrError("Cannot autodetect user name.\n"
841
"Please, set your name with command like:\n"
842
'bzr whoami "Your Name <name@domain.com>"')
843
host = win32utils.get_host_name_unicode()
845
host = socket.gethostname()
846
return name, (name + '@' + host)
852
w = pwd.getpwuid(uid)
854
raise errors.BzrCommandError('Unable to determine your name. '
855
'Please use "bzr whoami" to set it.')
857
# we try utf-8 first, because on many variants (like Linux),
858
# /etc/passwd "should" be in utf-8, and because it's unlikely to give
859
# false positives. (many users will have their user encoding set to
860
# latin-1, which cannot raise UnicodeError.)
862
gecos = w.pw_gecos.decode('utf-8')
866
encoding = osutils.get_user_encoding()
867
gecos = w.pw_gecos.decode(encoding)
869
raise errors.BzrCommandError('Unable to determine your name. '
870
'Use "bzr whoami" to set it.')
872
username = w.pw_name.decode(encoding)
874
raise errors.BzrCommandError('Unable to determine your name. '
875
'Use "bzr whoami" to set it.')
877
comma = gecos.find(',')
881
realname = gecos[:comma]
888
user_encoding = osutils.get_user_encoding()
889
realname = username = getpass.getuser().decode(user_encoding)
890
except UnicodeDecodeError:
891
raise errors.BzrError("Can't decode username as %s." % \
894
return realname, (username + '@' + socket.gethostname())
887
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')
895
# See http://standards.freedesktop.org/basedir-spec/latest/ar01s03.html
896
# Possibly this should be different on Windows?
897
e = os.environ.get('XDG_CACHE_DIR', None)
901
return os.path.expanduser('~/.cache')
897
904
def parse_username(username):
985
992
"""Save the config file, only tests should use it for now."""
986
993
conf_dir = os.path.dirname(self._filename)
987
994
ensure_config_dir_exists(conf_dir)
988
self._get_config().write(file(self._filename, 'wb'))
995
f = file(self._filename, 'wb')
997
self._get_config().write(f)
990
1001
def _set_option(self, section_name, option_name, value):
991
1002
"""Set an authentication configuration option"""
1435
1446
def _get_config_file(self):
1437
return self._transport.get(self._filename)
1448
return StringIO(self._transport.get_bytes(self._filename))
1438
1449
except errors.NoSuchFile:
1439
1450
return StringIO()
1441
1452
def _get_configobj(self):
1442
return ConfigObj(self._get_config_file(), encoding='utf-8')
1453
f = self._get_config_file()
1455
return ConfigObj(f, encoding='utf-8')
1444
1459
def _set_configobj(self, configobj):
1445
1460
out_file = StringIO()