/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-01-15 05:33:28 UTC
  • mto: This revision was merged to the branch mainline in revision 5019.
  • Revision ID: mbp@sourcefrog.net-20100115053328-z8lykwv6zmkmkp9p
Further progress bar string-pulling

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
#
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?."""
519
510
        self._write_config_file()
520
511
 
521
512
    def _write_config_file(self):
522
 
        path = self._get_filename()
523
 
        f = open(path, 'wb')
524
 
        osutils.copy_ownership_from_path(path)
 
513
        f = open(self._get_filename(), 'wb')
525
514
        self._get_parser().write(f)
526
515
        f.close()
527
516
 
821
810
            os.mkdir(parent_dir)
822
811
        trace.mutter('creating config directory: %r', path)
823
812
        os.mkdir(path)
824
 
        osutils.copy_ownership_from_path(path)
825
813
 
826
814
 
827
815
def config_dir():
878
866
 
879
867
    This doesn't implicitly create it.
880
868
 
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.
 
869
    On Windows it's in the config directory; elsewhere in the XDG cache directory.
884
870
    """
885
871
    if sys.platform == 'win32':
886
872
        return osutils.pathjoin(config_dir(), 'Crash')
887
873
    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')
 
874
        return osutils.pathjoin(xdg_cache_dir(), 'crash')
891
875
 
892
876
 
893
877
def xdg_cache_dir():
900
884
        return os.path.expanduser('~/.cache')
901
885
 
902
886
 
 
887
def _auto_user_id():
 
888
    """Calculate automatic user identification.
 
889
 
 
890
    Returns (realname, email).
 
891
 
 
892
    Only used when none is set in the environment or the id file.
 
893
 
 
894
    This previously used the FQDN as the default domain, but that can
 
895
    be very slow on machines where DNS is broken.  So now we simply
 
896
    use the hostname.
 
897
    """
 
898
    import socket
 
899
 
 
900
    if sys.platform == 'win32':
 
901
        name = win32utils.get_user_name_unicode()
 
902
        if name is None:
 
903
            raise errors.BzrError("Cannot autodetect user name.\n"
 
904
                                  "Please, set your name with command like:\n"
 
905
                                  'bzr whoami "Your Name <name@domain.com>"')
 
906
        host = win32utils.get_host_name_unicode()
 
907
        if host is None:
 
908
            host = socket.gethostname()
 
909
        return name, (name + '@' + host)
 
910
 
 
911
    try:
 
912
        import pwd
 
913
        uid = os.getuid()
 
914
        try:
 
915
            w = pwd.getpwuid(uid)
 
916
        except KeyError:
 
917
            raise errors.BzrCommandError('Unable to determine your name.  '
 
918
                'Please use "bzr whoami" to set it.')
 
919
 
 
920
        # we try utf-8 first, because on many variants (like Linux),
 
921
        # /etc/passwd "should" be in utf-8, and because it's unlikely to give
 
922
        # false positives.  (many users will have their user encoding set to
 
923
        # latin-1, which cannot raise UnicodeError.)
 
924
        try:
 
925
            gecos = w.pw_gecos.decode('utf-8')
 
926
            encoding = 'utf-8'
 
927
        except UnicodeError:
 
928
            try:
 
929
                encoding = osutils.get_user_encoding()
 
930
                gecos = w.pw_gecos.decode(encoding)
 
931
            except UnicodeError:
 
932
                raise errors.BzrCommandError('Unable to determine your name.  '
 
933
                   'Use "bzr whoami" to set it.')
 
934
        try:
 
935
            username = w.pw_name.decode(encoding)
 
936
        except UnicodeError:
 
937
            raise errors.BzrCommandError('Unable to determine your name.  '
 
938
                'Use "bzr whoami" to set it.')
 
939
 
 
940
        comma = gecos.find(',')
 
941
        if comma == -1:
 
942
            realname = gecos
 
943
        else:
 
944
            realname = gecos[:comma]
 
945
        if not realname:
 
946
            realname = username
 
947
 
 
948
    except ImportError:
 
949
        import getpass
 
950
        try:
 
951
            user_encoding = osutils.get_user_encoding()
 
952
            realname = username = getpass.getuser().decode(user_encoding)
 
953
        except UnicodeDecodeError:
 
954
            raise errors.BzrError("Can't decode username as %s." % \
 
955
                    user_encoding)
 
956
 
 
957
    return realname, (username + '@' + socket.gethostname())
 
958
 
 
959
 
903
960
def parse_username(username):
904
961
    """Parse e-mail username and return a (name, address) tuple."""
905
962
    match = re.match(r'(.*?)\s*<?([\w+.-]+@[\w+.-]+)>?', username)
1345
1402
 
1346
1403
 
1347
1404
class PlainTextCredentialStore(CredentialStore):
1348
 
    __doc__ = """Plain text credential store for the authentication.conf file"""
 
1405
    """Plain text credential store for the authentication.conf file."""
1349
1406
 
1350
1407
    def decode_password(self, credentials):
1351
1408
        """See CredentialStore.decode_password."""