~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to bzrlib/trace.py

  • Committer: Martin Pool
  • Date: 2006-08-10 01:16:16 UTC
  • mto: (1904.1.2 0.9)
  • mto: This revision was merged to the branch mainline in revision 1913.
  • Revision ID: mbp@sourcefrog.net-20060810011616-d74881eba696e746
compare_trees is deprecated in 0.9 not 0.10

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
 
# Copyright (C) 2005, 2006 Canonical Ltd
 
1
# Copyright (C) 2005, 2006 by Canonical Ltd
2
2
#
3
3
# This program is free software; you can redistribute it and/or modify
4
4
# it under the terms of the GNU General Public License as published by
50
50
# is quite expensive, even when the message is not printed by any handlers.
51
51
# We should perhaps change back to just simply doing it here.
52
52
 
 
53
 
 
54
import errno
53
55
import os
54
56
import sys
55
 
import re
56
 
 
57
 
from bzrlib.lazy_import import lazy_import
58
 
lazy_import(globals(), """
59
 
import errno
60
57
import logging
61
 
""")
62
58
 
63
59
import bzrlib
 
60
from bzrlib.errors import BzrError, BzrNewError
64
61
from bzrlib.symbol_versioning import (deprecated_function,
65
62
        zero_nine,
66
63
        )
67
64
 
68
 
lazy_import(globals(), """
69
 
from bzrlib import debug
70
 
""")
71
 
 
72
65
_file_handler = None
73
66
_stderr_handler = None
74
67
_stderr_quiet = False
100
93
def mutter(fmt, *args):
101
94
    if _trace_file is None:
102
95
        return
103
 
    if (getattr(_trace_file, 'closed', None) is not None) and _trace_file.closed:
 
96
    if hasattr(_trace_file, 'closed') and _trace_file.closed:
104
97
        return
105
 
 
106
 
    if isinstance(fmt, unicode):
107
 
        fmt = fmt.encode('utf8')
108
 
 
109
98
    if len(args) > 0:
110
99
        # It seems that if we do ascii % (unicode, ascii) we can
111
100
        # get a unicode cannot encode ascii error, so make sure that "fmt"
112
101
        # is a unicode string
113
 
        real_args = []
114
 
        for arg in args:
115
 
            if isinstance(arg, unicode):
116
 
                arg = arg.encode('utf8')
117
 
            real_args.append(arg)
118
 
        out = fmt % tuple(real_args)
 
102
        out = unicode(fmt) % args
119
103
    else:
120
104
        out = fmt
121
105
    out += '\n'
122
 
    _trace_file.write(out)
 
106
    try:
 
107
        _trace_file.write(out)
 
108
    except UnicodeError, e:
 
109
        warning('UnicodeError: %s', e)
 
110
        _trace_file.write(repr(out))
123
111
    # TODO: jam 20051227 Consider flushing the trace file to help debugging
124
112
    #_trace_file.flush()
 
113
debug = mutter
125
114
 
126
115
 
127
116
def _rollover_trace_maybe(trace_fname):
148
137
    _rollover_trace_maybe(trace_fname)
149
138
    try:
150
139
        LINE_BUFFERED = 1
151
 
        #tf = codecs.open(trace_fname, 'at', 'utf8', buffering=LINE_BUFFERED)
152
 
        tf = open(trace_fname, 'at', LINE_BUFFERED)
 
140
        tf = codecs.open(trace_fname, 'at', 'utf8', buffering=LINE_BUFFERED)
153
141
        _bzr_log_file = tf
154
142
        if tf.tell() == 0:
155
143
            tf.write("\nthis is a debug log for diagnosing/reporting problems in bzr\n")
156
144
            tf.write("you can delete or truncate this file, or include sections in\n")
157
 
            tf.write("bug reports to bazaar@lists.canonical.com\n\n")
 
145
            tf.write("bug reports to bazaar-ng@lists.canonical.com\n\n")
158
146
        _file_handler = logging.StreamHandler(tf)
159
147
        fmt = r'[%(process)5d] %(asctime)s.%(msecs)03d %(levelname)s: %(message)s'
160
148
        datefmt = r'%a %H:%M:%S'
174
162
    """
175
163
    if msg:
176
164
        error(msg)
 
165
    else:
 
166
        exc_str = format_exception_short(sys.exc_info())
 
167
        error(exc_str)
177
168
    log_exception_quietly()
178
169
 
179
170
 
185
176
    errors loading plugins.
186
177
    """
187
178
    import traceback
188
 
    mutter(traceback.format_exc())
 
179
    debug(traceback.format_exc())
189
180
 
190
181
 
191
182
def enable_default_logging():
272
263
        print >>err_file, "bzr: broken pipe"
273
264
    elif isinstance(exc_object, KeyboardInterrupt):
274
265
        print >>err_file, "bzr: interrupted"
275
 
    elif not getattr(exc_object, 'internal_error', True):
 
266
    elif getattr(exc_object, 'is_user_error', False):
276
267
        report_user_error(exc_info, err_file)
277
268
    elif isinstance(exc_object, (OSError, IOError)):
278
269
        # Might be nice to catch all of these and show them as something more
284
275
 
285
276
# TODO: Should these be specially encoding the output?
286
277
def report_user_error(exc_info, err_file):
287
 
    """Report to err_file an error that's not an internal error.
288
 
 
289
 
    These don't get a traceback unless -Derror was given.
290
 
    """
291
 
    if 'error' in debug.debug_flags:
292
 
        report_bug(exc_info, err_file)
293
 
        return
294
278
    print >>err_file, "bzr: ERROR:", str(exc_info[1])
295
279
 
296
280
 
298
282
    """Report an exception that probably indicates a bug in bzr"""
299
283
    import traceback
300
284
    exc_type, exc_object, exc_tb = exc_info
301
 
    print >>err_file, "bzr: ERROR: %s.%s: %s" % (
302
 
        exc_type.__module__, exc_type.__name__, exc_object)
 
285
    print >>err_file, "bzr: ERROR: %s: %s" % (exc_type, exc_object)
303
286
    print >>err_file
304
287
    traceback.print_exception(exc_type, exc_object, exc_tb, file=err_file)
305
288
    print >>err_file
309
292
                        sys.platform)
310
293
    print >>err_file, 'arguments: %r' % sys.argv
311
294
    print >>err_file
312
 
    print >>err_file, "** please send this report to bazaar@lists.ubuntu.com"
 
295
    print >>err_file, "** please send this report to bazaar-ng@lists.ubuntu.com"