~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to bzrlib/config.py

  • Committer: Martin
  • Date: 2010-05-16 15:18:43 UTC
  • mfrom: (5235 +trunk)
  • mto: This revision was merged to the branch mainline in revision 5239.
  • Revision ID: gzlist@googlemail.com-20100516151843-lu53u7caehm3ie3i
Merge bzr.dev to resolve conflicts in NEWS and _chk_map_pyx

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
 
        return ui.bool_from_string(s)
 
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
197
205
 
198
206
    def get_user_option_as_list(self, option_name):
199
207
        """Get a generic option as a list - no special process, no default.
249
257
 
250
258
        Something similar to 'Martin Pool <mbp@sourcefrog.net>'
251
259
 
252
 
        $BZR_EMAIL can be set to override this (as well as the
253
 
        deprecated $BZREMAIL), then
 
260
        $BZR_EMAIL can be set to override this, then
254
261
        the concrete policy type is checked, and finally
255
262
        $EMAIL is examined.
256
 
        If none is found, a reasonable default is (hopefully)
257
 
        created.
 
263
        If no username can be found, errors.NoWhoami exception is raised.
258
264
 
259
265
        TODO: Check it's reasonably well-formed.
260
266
        """
270
276
        if v:
271
277
            return v.decode(osutils.get_user_encoding())
272
278
 
273
 
        name, email = _auto_user_id()
274
 
        if name:
275
 
            return '%s <%s>' % (name, email)
276
 
        else:
277
 
            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()
278
287
 
279
288
    def signature_checking(self):
280
289
        """What is the current policy for signature checking?."""
511
520
 
512
521
    def _write_config_file(self):
513
522
        path = self._get_filename()
514
 
        f = osutils.open_with_ownership(path, 'wb')
 
523
        f = open(path, 'wb')
 
524
        osutils.copy_ownership_from_path(path)
515
525
        self._get_parser().write(f)
516
526
        f.close()
517
527
 
810
820
                trace.mutter('creating config parent directory: %r', parent_dir)
811
821
            os.mkdir(parent_dir)
812
822
        trace.mutter('creating config directory: %r', path)
813
 
        osutils.mkdir_with_ownership(path)
 
823
        os.mkdir(path)
 
824
        osutils.copy_ownership_from_path(path)
814
825
 
815
826
 
816
827
def config_dir():
889
900
        return os.path.expanduser('~/.cache')
890
901
 
891
902
 
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
 
 
965
903
def parse_username(username):
966
904
    """Parse e-mail username and return a (name, address) tuple."""
967
905
    match = re.match(r'(.*?)\s*<?([\w+.-]+@[\w+.-]+)>?', username)
1407
1345
 
1408
1346
 
1409
1347
class PlainTextCredentialStore(CredentialStore):
1410
 
    """Plain text credential store for the authentication.conf file."""
 
1348
    __doc__ = """Plain text credential store for the authentication.conf file"""
1411
1349
 
1412
1350
    def decode_password(self, credentials):
1413
1351
        """See CredentialStore.decode_password."""