/brz/remove-bazaar

To get this branch, use:
bzr branch http://gegoxaren.bato24.eu/bzr/brz/remove-bazaar

« back to all changes in this revision

Viewing changes to bzrlib/config.py

Add a NEWS entry and prepare submission.

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
 
# Copyright (C) 2005-2010 Canonical Ltd
 
1
# Copyright (C) 2005, 2007, 2008 Canonical Ltd
2
2
#   Authors: Robert Collins <robert.collins@canonical.com>
3
3
#            and others
4
4
#
190
190
        """Get a generic option as a boolean - no special process, no default.
191
191
 
192
192
        :return None if the option doesn't exist or its value can't be
193
 
            interpreted as a boolean. Returns True or False otherwise.
 
193
            interpreted as a boolean. Returns True or False ortherwise.
194
194
        """
195
195
        s = self._get_user_option(option_name)
196
 
        if s is None:
197
 
            # The option doesn't exist
198
 
            return None
199
 
        val = ui.bool_from_string(s)
200
 
        if val is None:
201
 
            # The value can't be interpreted as a boolean
202
 
            trace.warning('Value "%s" is not a boolean for "%s"',
203
 
                          s, option_name)
204
 
        return val
205
 
 
206
 
    def get_user_option_as_list(self, option_name):
207
 
        """Get a generic option as a list - no special process, no default.
208
 
 
209
 
        :return None if the option doesn't exist. Returns the value as a list
210
 
            otherwise.
211
 
        """
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 ','
215
 
            l = [l]
216
 
        return l
 
196
        return ui.bool_from_string(s)
217
197
 
218
198
    def gpg_signing_command(self):
219
199
        """What program should be used to sign signatures?"""
257
237
 
258
238
        Something similar to 'Martin Pool <mbp@sourcefrog.net>'
259
239
 
260
 
        $BZR_EMAIL can be set to override this, then
 
240
        $BZR_EMAIL can be set to override this (as well as the
 
241
        deprecated $BZREMAIL), then
261
242
        the concrete policy type is checked, and finally
262
243
        $EMAIL is examined.
263
 
        If no username can be found, errors.NoWhoami exception is raised.
 
244
        If none is found, a reasonable default is (hopefully)
 
245
        created.
264
246
 
265
247
        TODO: Check it's reasonably well-formed.
266
248
        """
276
258
        if v:
277
259
            return v.decode(osutils.get_user_encoding())
278
260
 
279
 
        raise errors.NoWhoami()
280
 
 
281
 
    def ensure_username(self):
282
 
        """Raise errors.NoWhoami if username is not set.
283
 
 
284
 
        This method relies on the username() function raising the error.
285
 
        """
286
 
        self.username()
 
261
        name, email = _auto_user_id()
 
262
        if name:
 
263
            return '%s <%s>' % (name, email)
 
264
        else:
 
265
            return email
287
266
 
288
267
    def signature_checking(self):
289
268
        """What is the current policy for signature checking?."""
334
313
                path = 'bzr'
335
314
            return path
336
315
 
337
 
    def suppress_warning(self, warning):
338
 
        """Should the warning be suppressed or emitted.
339
 
 
340
 
        :param warning: The name of the warning being tested.
341
 
 
342
 
        :returns: True if the warning should be suppressed, False otherwise.
343
 
        """
344
 
        warnings = self.get_user_option_as_list('suppress_warnings')
345
 
        if warnings is None or warning not in warnings:
346
 
            return False
347
 
        else:
348
 
            return True
349
 
 
350
316
 
351
317
class IniBasedConfig(Config):
352
318
    """A configuration policy that draws from ini files."""
477
443
    def _get_nickname(self):
478
444
        return self.get_user_option('nickname')
479
445
 
480
 
    def _write_config_file(self):
481
 
        f = file(self._get_filename(), "wb")
482
 
        try:
483
 
            osutils.copy_ownership_from_path(f.name)
484
 
            self._get_parser().write(f)
485
 
        finally:
486
 
            f.close()
487
 
 
488
446
 
489
447
class GlobalConfig(IniBasedConfig):
490
448
    """The configuration that should be used for a specific location."""
526
484
        self._get_parser().setdefault(section, {})[option] = value
527
485
        self._write_config_file()
528
486
 
 
487
    def _write_config_file(self):
 
488
        f = open(self._get_filename(), 'wb')
 
489
        self._get_parser().write(f)
 
490
        f.close()
 
491
 
529
492
 
530
493
class LocationConfig(IniBasedConfig):
531
494
    """A configuration object that gives the policy for a location."""
665
628
        self._get_parser()[location][option]=value
666
629
        # the allowed values of store match the config policies
667
630
        self._set_option_policy(location, option, store)
668
 
        self._write_config_file()
 
631
        self._get_parser().write(file(self._get_filename(), 'wb'))
669
632
 
670
633
 
671
634
class BranchConfig(Config):
822
785
            os.mkdir(parent_dir)
823
786
        trace.mutter('creating config directory: %r', path)
824
787
        os.mkdir(path)
825
 
        osutils.copy_ownership_from_path(path)
826
788
 
827
789
 
828
790
def config_dir():
843
805
                                  ' or HOME set')
844
806
        return osutils.pathjoin(base, 'bazaar', '2.0')
845
807
    else:
 
808
        # cygwin, linux, and darwin all have a $HOME directory
846
809
        if base is None:
847
810
            base = os.path.expanduser("~")
848
811
        return osutils.pathjoin(base, ".bazaar")
878
841
 
879
842
    This doesn't implicitly create it.
880
843
 
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
883
 
    $APPORT_CRASH_DIR.
 
844
    On Windows it's in the config directory; elsewhere in the XDG cache directory.
884
845
    """
885
846
    if sys.platform == 'win32':
886
847
        return osutils.pathjoin(config_dir(), 'Crash')
887
848
    else:
888
 
        # XXX: hardcoded in apport_python_hook.py; therefore here too -- mbp
889
 
        # 2010-01-31
890
 
        return os.environ.get('APPORT_CRASH_DIR', '/var/crash')
 
849
        return osutils.pathjoin(xdg_cache_dir(), 'crash')
891
850
 
892
851
 
893
852
def xdg_cache_dir():
900
859
        return os.path.expanduser('~/.cache')
901
860
 
902
861
 
 
862
def _auto_user_id():
 
863
    """Calculate automatic user identification.
 
864
 
 
865
    Returns (realname, email).
 
866
 
 
867
    Only used when none is set in the environment or the id file.
 
868
 
 
869
    This previously used the FQDN as the default domain, but that can
 
870
    be very slow on machines where DNS is broken.  So now we simply
 
871
    use the hostname.
 
872
    """
 
873
    import socket
 
874
 
 
875
    if sys.platform == 'win32':
 
876
        name = win32utils.get_user_name_unicode()
 
877
        if name is None:
 
878
            raise errors.BzrError("Cannot autodetect user name.\n"
 
879
                                  "Please, set your name with command like:\n"
 
880
                                  'bzr whoami "Your Name <name@domain.com>"')
 
881
        host = win32utils.get_host_name_unicode()
 
882
        if host is None:
 
883
            host = socket.gethostname()
 
884
        return name, (name + '@' + host)
 
885
 
 
886
    try:
 
887
        import pwd
 
888
        uid = os.getuid()
 
889
        try:
 
890
            w = pwd.getpwuid(uid)
 
891
        except KeyError:
 
892
            raise errors.BzrCommandError('Unable to determine your name.  '
 
893
                'Please use "bzr whoami" to set it.')
 
894
 
 
895
        # we try utf-8 first, because on many variants (like Linux),
 
896
        # /etc/passwd "should" be in utf-8, and because it's unlikely to give
 
897
        # false positives.  (many users will have their user encoding set to
 
898
        # latin-1, which cannot raise UnicodeError.)
 
899
        try:
 
900
            gecos = w.pw_gecos.decode('utf-8')
 
901
            encoding = 'utf-8'
 
902
        except UnicodeError:
 
903
            try:
 
904
                encoding = osutils.get_user_encoding()
 
905
                gecos = w.pw_gecos.decode(encoding)
 
906
            except UnicodeError:
 
907
                raise errors.BzrCommandError('Unable to determine your name.  '
 
908
                   'Use "bzr whoami" to set it.')
 
909
        try:
 
910
            username = w.pw_name.decode(encoding)
 
911
        except UnicodeError:
 
912
            raise errors.BzrCommandError('Unable to determine your name.  '
 
913
                'Use "bzr whoami" to set it.')
 
914
 
 
915
        comma = gecos.find(',')
 
916
        if comma == -1:
 
917
            realname = gecos
 
918
        else:
 
919
            realname = gecos[:comma]
 
920
        if not realname:
 
921
            realname = username
 
922
 
 
923
    except ImportError:
 
924
        import getpass
 
925
        try:
 
926
            user_encoding = osutils.get_user_encoding()
 
927
            realname = username = getpass.getuser().decode(user_encoding)
 
928
        except UnicodeDecodeError:
 
929
            raise errors.BzrError("Can't decode username as %s." % \
 
930
                    user_encoding)
 
931
 
 
932
    return realname, (username + '@' + socket.gethostname())
 
933
 
 
934
 
903
935
def parse_username(username):
904
936
    """Parse e-mail username and return a (name, address) tuple."""
905
937
    match = re.match(r'(.*?)\s*<?([\w+.-]+@[\w+.-]+)>?', username)
991
1023
        """Save the config file, only tests should use it for now."""
992
1024
        conf_dir = os.path.dirname(self._filename)
993
1025
        ensure_config_dir_exists(conf_dir)
994
 
        f = file(self._filename, 'wb')
995
 
        try:
996
 
            self._get_config().write(f)
997
 
        finally:
998
 
            f.close()
 
1026
        self._get_config().write(file(self._filename, 'wb'))
999
1027
 
1000
1028
    def _set_option(self, section_name, option_name, value):
1001
1029
        """Set an authentication configuration option"""
1349
1377
 
1350
1378
 
1351
1379
class PlainTextCredentialStore(CredentialStore):
1352
 
    __doc__ = """Plain text credential store for the authentication.conf file"""
 
1380
    """Plain text credential store for the authentication.conf file."""
1353
1381
 
1354
1382
    def decode_password(self, credentials):
1355
1383
        """See CredentialStore.decode_password."""
1449
1477
            return StringIO()
1450
1478
 
1451
1479
    def _get_configobj(self):
1452
 
        f = self._get_config_file()
1453
 
        try:
1454
 
            return ConfigObj(f, encoding='utf-8')
1455
 
        finally:
1456
 
            f.close()
 
1480
        return ConfigObj(self._get_config_file(), encoding='utf-8')
1457
1481
 
1458
1482
    def _set_configobj(self, configobj):
1459
1483
        out_file = StringIO()