/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

  • Committer: Martin Pool
  • Date: 2010-02-23 02:32:52 UTC
  • mto: This revision was merged to the branch mainline in revision 5054.
  • Revision ID: mbp@sourcefrog.net-20100223023252-zk4ds0sbeuga82et
Clarify Launchpad setup example

Show diffs side-by-side

added added

removed removed

Lines of Context:
193
193
            interpreted as a boolean. Returns True or False otherwise.
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
 
196
        return ui.bool_from_string(s)
205
197
 
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.
257
249
 
258
250
        Something similar to 'Martin Pool <mbp@sourcefrog.net>'
259
251
 
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)
 
257
        created.
264
258
 
265
259
        TODO: Check it's reasonably well-formed.
266
260
        """
276
270
        if v:
277
271
            return v.decode(osutils.get_user_encoding())
278
272
 
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()
 
273
        name, email = _auto_user_id()
 
274
        if name:
 
275
            return '%s <%s>' % (name, email)
 
276
        else:
 
277
            return email
287
278
 
288
279
    def signature_checking(self):
289
280
        """What is the current policy for signature checking?."""
477
468
    def _get_nickname(self):
478
469
        return self.get_user_option('nickname')
479
470
 
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
471
 
489
472
class GlobalConfig(IniBasedConfig):
490
473
    """The configuration that should be used for a specific location."""
526
509
        self._get_parser().setdefault(section, {})[option] = value
527
510
        self._write_config_file()
528
511
 
 
512
    def _write_config_file(self):
 
513
        f = open(self._get_filename(), 'wb')
 
514
        self._get_parser().write(f)
 
515
        f.close()
 
516
 
529
517
 
530
518
class LocationConfig(IniBasedConfig):
531
519
    """A configuration object that gives the policy for a location."""
665
653
        self._get_parser()[location][option]=value
666
654
        # the allowed values of store match the config policies
667
655
        self._set_option_policy(location, option, store)
668
 
        self._write_config_file()
 
656
        self._get_parser().write(file(self._get_filename(), 'wb'))
669
657
 
670
658
 
671
659
class BranchConfig(Config):
822
810
            os.mkdir(parent_dir)
823
811
        trace.mutter('creating config directory: %r', path)
824
812
        os.mkdir(path)
825
 
        osutils.copy_ownership_from_path(path)
826
813
 
827
814
 
828
815
def config_dir():
843
830
                                  ' or HOME set')
844
831
        return osutils.pathjoin(base, 'bazaar', '2.0')
845
832
    else:
 
833
        # cygwin, linux, and darwin all have a $HOME directory
846
834
        if base is None:
847
835
            base = os.path.expanduser("~")
848
836
        return osutils.pathjoin(base, ".bazaar")
900
888
        return os.path.expanduser('~/.cache')
901
889
 
902
890
 
 
891
def _auto_user_id():
 
892
    """Calculate automatic user identification.
 
893
 
 
894
    Returns (realname, email).
 
895
 
 
896
    Only used when none is set in the environment or the id file.
 
897
 
 
898
    This previously used the FQDN as the default domain, but that can
 
899
    be very slow on machines where DNS is broken.  So now we simply
 
900
    use the hostname.
 
901
    """
 
902
    import socket
 
903
 
 
904
    if sys.platform == 'win32':
 
905
        name = win32utils.get_user_name_unicode()
 
906
        if name is None:
 
907
            raise errors.BzrError("Cannot autodetect user name.\n"
 
908
                                  "Please, set your name with command like:\n"
 
909
                                  'bzr whoami "Your Name <name@domain.com>"')
 
910
        host = win32utils.get_host_name_unicode()
 
911
        if host is None:
 
912
            host = socket.gethostname()
 
913
        return name, (name + '@' + host)
 
914
 
 
915
    try:
 
916
        import pwd
 
917
        uid = os.getuid()
 
918
        try:
 
919
            w = pwd.getpwuid(uid)
 
920
        except KeyError:
 
921
            raise errors.BzrCommandError('Unable to determine your name.  '
 
922
                'Please use "bzr whoami" to set it.')
 
923
 
 
924
        # we try utf-8 first, because on many variants (like Linux),
 
925
        # /etc/passwd "should" be in utf-8, and because it's unlikely to give
 
926
        # false positives.  (many users will have their user encoding set to
 
927
        # latin-1, which cannot raise UnicodeError.)
 
928
        try:
 
929
            gecos = w.pw_gecos.decode('utf-8')
 
930
            encoding = 'utf-8'
 
931
        except UnicodeError:
 
932
            try:
 
933
                encoding = osutils.get_user_encoding()
 
934
                gecos = w.pw_gecos.decode(encoding)
 
935
            except UnicodeError:
 
936
                raise errors.BzrCommandError('Unable to determine your name.  '
 
937
                   'Use "bzr whoami" to set it.')
 
938
        try:
 
939
            username = w.pw_name.decode(encoding)
 
940
        except UnicodeError:
 
941
            raise errors.BzrCommandError('Unable to determine your name.  '
 
942
                'Use "bzr whoami" to set it.')
 
943
 
 
944
        comma = gecos.find(',')
 
945
        if comma == -1:
 
946
            realname = gecos
 
947
        else:
 
948
            realname = gecos[:comma]
 
949
        if not realname:
 
950
            realname = username
 
951
 
 
952
    except ImportError:
 
953
        import getpass
 
954
        try:
 
955
            user_encoding = osutils.get_user_encoding()
 
956
            realname = username = getpass.getuser().decode(user_encoding)
 
957
        except UnicodeDecodeError:
 
958
            raise errors.BzrError("Can't decode username as %s." % \
 
959
                    user_encoding)
 
960
 
 
961
    return realname, (username + '@' + socket.gethostname())
 
962
 
 
963
 
903
964
def parse_username(username):
904
965
    """Parse e-mail username and return a (name, address) tuple."""
905
966
    match = re.match(r'(.*?)\s*<?([\w+.-]+@[\w+.-]+)>?', username)
991
1052
        """Save the config file, only tests should use it for now."""
992
1053
        conf_dir = os.path.dirname(self._filename)
993
1054
        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()
 
1055
        self._get_config().write(file(self._filename, 'wb'))
999
1056
 
1000
1057
    def _set_option(self, section_name, option_name, value):
1001
1058
        """Set an authentication configuration option"""
1349
1406
 
1350
1407
 
1351
1408
class PlainTextCredentialStore(CredentialStore):
1352
 
    __doc__ = """Plain text credential store for the authentication.conf file"""
 
1409
    """Plain text credential store for the authentication.conf file."""
1353
1410
 
1354
1411
    def decode_password(self, credentials):
1355
1412
        """See CredentialStore.decode_password."""
1449
1506
            return StringIO()
1450
1507
 
1451
1508
    def _get_configobj(self):
1452
 
        f = self._get_config_file()
1453
 
        try:
1454
 
            return ConfigObj(f, encoding='utf-8')
1455
 
        finally:
1456
 
            f.close()
 
1509
        return ConfigObj(self._get_config_file(), encoding='utf-8')
1457
1510
 
1458
1511
    def _set_configobj(self, configobj):
1459
1512
        out_file = StringIO()