/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
  • Date: 2010-04-14 00:11:32 UTC
  • mto: This revision was merged to the branch mainline in revision 5164.
  • Revision ID: gzlist@googlemail.com-20100414001132-6m1ru11mbfu87x6m
Fix os.utime test failures, three on FAT filesystems and one with readonly files

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