~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to bzrlib/osutils.py

  • Committer: Canonical.com Patch Queue Manager
  • Date: 2007-01-05 02:40:18 UTC
  • mfrom: (2192.1.10 check-encoding)
  • Revision ID: pqm@pqm.ubuntu.com-20070105024018-b849a96645a25c39
(bialix) Before actually using encoding need to check that Python
 has corresponding codec

Show diffs side-by-side

added added

removed removed

Lines of Context:
25
25
 
26
26
from bzrlib.lazy_import import lazy_import
27
27
lazy_import(globals(), """
 
28
import codecs
28
29
from datetime import datetime
29
30
import errno
30
31
from ntpath import (abspath as _nt_abspath,
380
381
        output_encoding = bzrlib.user_encoding
381
382
        mutter('cp0 is invalid encoding.'
382
383
               ' encoding stdout as bzrlib.user_encoding %r', output_encoding)
 
384
    # check encoding
 
385
    try:
 
386
        codecs.lookup(output_encoding)
 
387
    except LookupError:
 
388
        sys.stderr.write('bzr: warning:'
 
389
                         ' unknown terminal encoding %s.\n'
 
390
                         '  Using encoding %s instead.\n'
 
391
                         % (output_encoding, bzrlib.user_encoding)
 
392
                        )
 
393
        output_encoding = bzrlib.user_encoding
 
394
 
383
395
    return output_encoding
384
396
 
385
397
 
1056
1068
_cached_user_encoding = None
1057
1069
 
1058
1070
 
1059
 
def get_user_encoding():
 
1071
def get_user_encoding(use_cache=True):
1060
1072
    """Find out what the preferred user encoding is.
1061
1073
 
1062
1074
    This is generally the encoding that is used for command line parameters
1063
1075
    and file contents. This may be different from the terminal encoding
1064
1076
    or the filesystem encoding.
1065
1077
 
 
1078
    :param  use_cache:  Enable cache for detected encoding.
 
1079
                        (This parameter is turned on by default,
 
1080
                        and required only for selftesting)
 
1081
 
1066
1082
    :return: A string defining the preferred user encoding
1067
1083
    """
1068
1084
    global _cached_user_encoding
1069
 
    if _cached_user_encoding is not None:
 
1085
    if _cached_user_encoding is not None and use_cache:
1070
1086
        return _cached_user_encoding
1071
1087
 
1072
1088
    if sys.platform == 'darwin':
1080
1096
        import locale
1081
1097
 
1082
1098
    try:
1083
 
        _cached_user_encoding = locale.getpreferredencoding()
 
1099
        user_encoding = locale.getpreferredencoding()
1084
1100
    except locale.Error, e:
1085
1101
        sys.stderr.write('bzr: warning: %s\n'
1086
1102
                         '  Could not determine what text encoding to use.\n'
1088
1104
                         '  doesn\'t support the locale set by $LANG (%s)\n'
1089
1105
                         "  Continuing with ascii encoding.\n"
1090
1106
                         % (e, os.environ.get('LANG')))
 
1107
        user_encoding = 'ascii'
1091
1108
 
1092
1109
    # Windows returns 'cp0' to indicate there is no code page. So we'll just
1093
1110
    # treat that as ASCII, and not support printing unicode characters to the
1094
1111
    # console.
1095
 
    if _cached_user_encoding in (None, 'cp0'):
1096
 
        _cached_user_encoding = 'ascii'
1097
 
    return _cached_user_encoding
 
1112
    if user_encoding in (None, 'cp0'):
 
1113
        user_encoding = 'ascii'
 
1114
    else:
 
1115
        # check encoding
 
1116
        try:
 
1117
            codecs.lookup(user_encoding)
 
1118
        except LookupError:
 
1119
            sys.stderr.write('bzr: warning:'
 
1120
                             ' unknown encoding %s.'
 
1121
                             ' Continuing with ascii encoding.\n'
 
1122
                             % user_encoding
 
1123
                            )
 
1124
            user_encoding = 'ascii'
 
1125
 
 
1126
    if use_cache:
 
1127
        _cached_user_encoding = user_encoding
 
1128
 
 
1129
    return user_encoding
1098
1130
 
1099
1131
 
1100
1132
def recv_all(socket, bytes):