~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to bzrlib/config.py

  • Committer: Jelmer Vernooij
  • Date: 2010-08-29 14:37:51 UTC
  • mto: This revision was merged to the branch mainline in revision 5418.
  • Revision ID: jelmer@samba.org-20100829143751-9ry91e6u887gswiz
Move some bzrdir-specific tests to bzrlib.tests.per_bzrdir.

Show diffs side-by-side

added added

removed removed

Lines of Context:
74
74
 
75
75
import bzrlib
76
76
from bzrlib import (
 
77
    atomicfile,
77
78
    debug,
78
79
    errors,
79
80
    mail_client,
257
258
 
258
259
        Something similar to 'Martin Pool <mbp@sourcefrog.net>'
259
260
 
260
 
        $BZR_EMAIL can be set to override this (as well as the
261
 
        deprecated $BZREMAIL), then
 
261
        $BZR_EMAIL can be set to override this, then
262
262
        the concrete policy type is checked, and finally
263
263
        $EMAIL is examined.
264
 
        If none is found, a reasonable default is (hopefully)
265
 
        created.
 
264
        If no username can be found, errors.NoWhoami exception is raised.
266
265
 
267
266
        TODO: Check it's reasonably well-formed.
268
267
        """
278
277
        if v:
279
278
            return v.decode(osutils.get_user_encoding())
280
279
 
281
 
        name, email = _auto_user_id()
282
 
        if name:
283
 
            return '%s <%s>' % (name, email)
284
 
        else:
285
 
            return email
 
280
        raise errors.NoWhoami()
 
281
 
 
282
    def ensure_username(self):
 
283
        """Raise errors.NoWhoami if username is not set.
 
284
 
 
285
        This method relies on the username() function raising the error.
 
286
        """
 
287
        self.username()
286
288
 
287
289
    def signature_checking(self):
288
290
        """What is the current policy for signature checking?."""
476
478
    def _get_nickname(self):
477
479
        return self.get_user_option('nickname')
478
480
 
 
481
    def _write_config_file(self):
 
482
        filename = self._get_filename()
 
483
        atomic_file = atomicfile.AtomicFile(filename)
 
484
        self._get_parser().write(atomic_file)
 
485
        atomic_file.commit()
 
486
        atomic_file.close()
 
487
        osutils.copy_ownership_from_path(filename)
 
488
 
479
489
 
480
490
class GlobalConfig(IniBasedConfig):
481
491
    """The configuration that should be used for a specific location."""
517
527
        self._get_parser().setdefault(section, {})[option] = value
518
528
        self._write_config_file()
519
529
 
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
530
 
528
531
class LocationConfig(IniBasedConfig):
529
532
    """A configuration object that gives the policy for a location."""
663
666
        self._get_parser()[location][option]=value
664
667
        # the allowed values of store match the config policies
665
668
        self._set_option_policy(location, option, store)
666
 
        self._get_parser().write(file(self._get_filename(), 'wb'))
 
669
        self._write_config_file()
667
670
 
668
671
 
669
672
class BranchConfig(Config):
841
844
                                  ' or HOME set')
842
845
        return osutils.pathjoin(base, 'bazaar', '2.0')
843
846
    else:
844
 
        # cygwin, linux, and darwin all have a $HOME directory
845
847
        if base is None:
846
848
            base = os.path.expanduser("~")
847
849
        return osutils.pathjoin(base, ".bazaar")
899
901
        return os.path.expanduser('~/.cache')
900
902
 
901
903
 
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
904
def parse_username(username):
976
905
    """Parse e-mail username and return a (name, address) tuple."""
977
906
    match = re.match(r'(.*?)\s*<?([\w+.-]+@[\w+.-]+)>?', username)
1063
992
        """Save the config file, only tests should use it for now."""
1064
993
        conf_dir = os.path.dirname(self._filename)
1065
994
        ensure_config_dir_exists(conf_dir)
1066
 
        self._get_config().write(file(self._filename, 'wb'))
 
995
        f = file(self._filename, 'wb')
 
996
        try:
 
997
            self._get_config().write(f)
 
998
        finally:
 
999
            f.close()
1067
1000
 
1068
1001
    def _set_option(self, section_name, option_name, value):
1069
1002
        """Set an authentication configuration option"""
1517
1450
            return StringIO()
1518
1451
 
1519
1452
    def _get_configobj(self):
1520
 
        return ConfigObj(self._get_config_file(), encoding='utf-8')
 
1453
        f = self._get_config_file()
 
1454
        try:
 
1455
            return ConfigObj(f, encoding='utf-8')
 
1456
        finally:
 
1457
            f.close()
1521
1458
 
1522
1459
    def _set_configobj(self, configobj):
1523
1460
        out_file = StringIO()