~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to bzrlib/config.py

  • Committer: Andrew Bennetts
  • Date: 2010-06-27 05:25:03 UTC
  • mto: This revision was merged to the branch mainline in revision 5322.
  • Revision ID: andrew.bennetts@canonical.com-20100627052503-rat7ch559a215swk
Implement __sizeof__ in StaticTuple.

Show diffs side-by-side

added added

removed removed

Lines of Context:
257
257
 
258
258
        Something similar to 'Martin Pool <mbp@sourcefrog.net>'
259
259
 
260
 
        $BZR_EMAIL can be set to override this (as well as the
261
 
        deprecated $BZREMAIL), then
 
260
        $BZR_EMAIL can be set to override this, then
262
261
        the concrete policy type is checked, and finally
263
262
        $EMAIL is examined.
264
 
        If none is found, a reasonable default is (hopefully)
265
 
        created.
 
263
        If no username can be found, errors.NoWhoami exception is raised.
266
264
 
267
265
        TODO: Check it's reasonably well-formed.
268
266
        """
278
276
        if v:
279
277
            return v.decode(osutils.get_user_encoding())
280
278
 
281
 
        name, email = _auto_user_id()
282
 
        if name:
283
 
            return '%s <%s>' % (name, email)
284
 
        else:
285
 
            return email
 
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()
286
287
 
287
288
    def signature_checking(self):
288
289
        """What is the current policy for signature checking?."""
476
477
    def _get_nickname(self):
477
478
        return self.get_user_option('nickname')
478
479
 
 
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
 
479
488
 
480
489
class GlobalConfig(IniBasedConfig):
481
490
    """The configuration that should be used for a specific location."""
517
526
        self._get_parser().setdefault(section, {})[option] = value
518
527
        self._write_config_file()
519
528
 
520
 
    def _write_config_file(self):
521
 
        path = self._get_filename()
522
 
        f = open(path, 'wb')
523
 
        osutils.copy_ownership_from_path(path)
524
 
        self._get_parser().write(f)
525
 
        f.close()
526
 
 
527
529
 
528
530
class LocationConfig(IniBasedConfig):
529
531
    """A configuration object that gives the policy for a location."""
663
665
        self._get_parser()[location][option]=value
664
666
        # the allowed values of store match the config policies
665
667
        self._set_option_policy(location, option, store)
666
 
        self._get_parser().write(file(self._get_filename(), 'wb'))
 
668
        self._write_config_file()
667
669
 
668
670
 
669
671
class BranchConfig(Config):
841
843
                                  ' or HOME set')
842
844
        return osutils.pathjoin(base, 'bazaar', '2.0')
843
845
    else:
844
 
        # cygwin, linux, and darwin all have a $HOME directory
845
846
        if base is None:
846
847
            base = os.path.expanduser("~")
847
848
        return osutils.pathjoin(base, ".bazaar")
899
900
        return os.path.expanduser('~/.cache')
900
901
 
901
902
 
902
 
def _auto_user_id():
903
 
    """Calculate automatic user identification.
904
 
 
905
 
    Returns (realname, email).
906
 
 
907
 
    Only used when none is set in the environment or the id file.
908
 
 
909
 
    This previously used the FQDN as the default domain, but that can
910
 
    be very slow on machines where DNS is broken.  So now we simply
911
 
    use the hostname.
912
 
    """
913
 
    import socket
914
 
 
915
 
    if sys.platform == 'win32':
916
 
        name = win32utils.get_user_name_unicode()
917
 
        if name is None:
918
 
            raise errors.BzrError("Cannot autodetect user name.\n"
919
 
                                  "Please, set your name with command like:\n"
920
 
                                  'bzr whoami "Your Name <name@domain.com>"')
921
 
        host = win32utils.get_host_name_unicode()
922
 
        if host is None:
923
 
            host = socket.gethostname()
924
 
        return name, (name + '@' + host)
925
 
 
926
 
    try:
927
 
        import pwd
928
 
        uid = os.getuid()
929
 
        try:
930
 
            w = pwd.getpwuid(uid)
931
 
        except KeyError:
932
 
            raise errors.BzrCommandError('Unable to determine your name.  '
933
 
                'Please use "bzr whoami" to set it.')
934
 
 
935
 
        # we try utf-8 first, because on many variants (like Linux),
936
 
        # /etc/passwd "should" be in utf-8, and because it's unlikely to give
937
 
        # false positives.  (many users will have their user encoding set to
938
 
        # latin-1, which cannot raise UnicodeError.)
939
 
        try:
940
 
            gecos = w.pw_gecos.decode('utf-8')
941
 
            encoding = 'utf-8'
942
 
        except UnicodeError:
943
 
            try:
944
 
                encoding = osutils.get_user_encoding()
945
 
                gecos = w.pw_gecos.decode(encoding)
946
 
            except UnicodeError:
947
 
                raise errors.BzrCommandError('Unable to determine your name.  '
948
 
                   'Use "bzr whoami" to set it.')
949
 
        try:
950
 
            username = w.pw_name.decode(encoding)
951
 
        except UnicodeError:
952
 
            raise errors.BzrCommandError('Unable to determine your name.  '
953
 
                'Use "bzr whoami" to set it.')
954
 
 
955
 
        comma = gecos.find(',')
956
 
        if comma == -1:
957
 
            realname = gecos
958
 
        else:
959
 
            realname = gecos[:comma]
960
 
        if not realname:
961
 
            realname = username
962
 
 
963
 
    except ImportError:
964
 
        import getpass
965
 
        try:
966
 
            user_encoding = osutils.get_user_encoding()
967
 
            realname = username = getpass.getuser().decode(user_encoding)
968
 
        except UnicodeDecodeError:
969
 
            raise errors.BzrError("Can't decode username as %s." % \
970
 
                    user_encoding)
971
 
 
972
 
    return realname, (username + '@' + socket.gethostname())
973
 
 
974
 
 
975
903
def parse_username(username):
976
904
    """Parse e-mail username and return a (name, address) tuple."""
977
905
    match = re.match(r'(.*?)\s*<?([\w+.-]+@[\w+.-]+)>?', username)
1063
991
        """Save the config file, only tests should use it for now."""
1064
992
        conf_dir = os.path.dirname(self._filename)
1065
993
        ensure_config_dir_exists(conf_dir)
1066
 
        self._get_config().write(file(self._filename, 'wb'))
 
994
        f = file(self._filename, 'wb')
 
995
        try:
 
996
            self._get_config().write(f)
 
997
        finally:
 
998
            f.close()
1067
999
 
1068
1000
    def _set_option(self, section_name, option_name, value):
1069
1001
        """Set an authentication configuration option"""
1517
1449
            return StringIO()
1518
1450
 
1519
1451
    def _get_configobj(self):
1520
 
        return ConfigObj(self._get_config_file(), encoding='utf-8')
 
1452
        f = self._get_config_file()
 
1453
        try:
 
1454
            return ConfigObj(f, encoding='utf-8')
 
1455
        finally:
 
1456
            f.close()
1521
1457
 
1522
1458
    def _set_configobj(self, configobj):
1523
1459
        out_file = StringIO()