~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to bzrlib/trace.py

  • Committer: Alexander Belchenko
  • Date: 2006-07-31 16:12:57 UTC
  • mto: (1711.2.111 jam-integration)
  • mto: This revision was merged to the branch mainline in revision 1906.
  • Revision ID: bialix@ukr.net-20060731161257-91a231523255332c
new official bzr.ico

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
75
68
_trace_file = None
76
69
_trace_depth = 0
77
70
_bzr_log_file = None
78
 
_bzr_log_filename = None
79
71
 
80
72
 
81
73
# configure convenient aliases for output routines
101
93
def mutter(fmt, *args):
102
94
    if _trace_file is None:
103
95
        return
104
 
    if (getattr(_trace_file, 'closed', None) is not None) and _trace_file.closed:
 
96
    if hasattr(_trace_file, 'closed') and _trace_file.closed:
105
97
        return
106
 
 
107
 
    if isinstance(fmt, unicode):
108
 
        fmt = fmt.encode('utf8')
109
 
 
110
98
    if len(args) > 0:
111
99
        # It seems that if we do ascii % (unicode, ascii) we can
112
100
        # get a unicode cannot encode ascii error, so make sure that "fmt"
113
101
        # is a unicode string
114
 
        real_args = []
115
 
        for arg in args:
116
 
            if isinstance(arg, unicode):
117
 
                arg = arg.encode('utf8')
118
 
            real_args.append(arg)
119
 
        out = fmt % tuple(real_args)
 
102
        out = unicode(fmt) % args
120
103
    else:
121
104
        out = fmt
122
105
    out += '\n'
123
 
    _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))
124
111
    # TODO: jam 20051227 Consider flushing the trace file to help debugging
125
112
    #_trace_file.flush()
 
113
debug = mutter
126
114
 
127
115
 
128
116
def _rollover_trace_maybe(trace_fname):
138
126
        return
139
127
 
140
128
 
141
 
def open_tracefile(tracefilename=None):
 
129
def open_tracefile(tracefilename='~/.bzr.log'):
142
130
    # Messages are always written to here, so that we have some
143
131
    # information if something goes wrong.  In a future version this
144
132
    # file will be removed on successful completion.
145
 
    global _file_handler, _bzr_log_file, _bzr_log_filename
 
133
    global _file_handler, _bzr_log_file
146
134
    import codecs
147
135
 
148
 
    if tracefilename is None:
149
 
        if sys.platform == 'win32':
150
 
            from bzrlib import win32utils
151
 
            home = win32utils.get_home_location()
152
 
        else:
153
 
            home = os.path.expanduser('~')
154
 
        _bzr_log_filename = os.path.join(home, '.bzr.log')
155
 
 
156
 
    _bzr_log_filename = os.path.expanduser(_bzr_log_filename)
157
 
    _rollover_trace_maybe(_bzr_log_filename)
 
136
    trace_fname = os.path.join(os.path.expanduser(tracefilename))
 
137
    _rollover_trace_maybe(trace_fname)
158
138
    try:
159
139
        LINE_BUFFERED = 1
160
 
        #tf = codecs.open(trace_fname, 'at', 'utf8', buffering=LINE_BUFFERED)
161
 
        tf = open(_bzr_log_filename, 'at', LINE_BUFFERED)
 
140
        tf = codecs.open(trace_fname, 'at', 'utf8', buffering=LINE_BUFFERED)
162
141
        _bzr_log_file = tf
163
 
        # tf.tell() on windows always return 0 until some writing done
164
 
        tf.write('\n')
165
 
        if tf.tell() <= 2:
166
 
            tf.write("this is a debug log for diagnosing/reporting problems in bzr\n")
 
142
        if tf.tell() == 0:
 
143
            tf.write("\nthis is a debug log for diagnosing/reporting problems in bzr\n")
167
144
            tf.write("you can delete or truncate this file, or include sections in\n")
168
 
            tf.write("bug reports to bazaar@lists.canonical.com\n\n")
 
145
            tf.write("bug reports to bazaar-ng@lists.canonical.com\n\n")
169
146
        _file_handler = logging.StreamHandler(tf)
170
147
        fmt = r'[%(process)5d] %(asctime)s.%(msecs)03d %(levelname)s: %(message)s'
171
148
        datefmt = r'%a %H:%M:%S'
182
159
 
183
160
    The exception string representation is used as the error
184
161
    summary, unless msg is given.
185
 
 
186
 
    Please see log_exception_quietly() for the replacement API.
187
162
    """
188
163
    if msg:
189
164
        error(msg)
 
165
    else:
 
166
        exc_str = format_exception_short(sys.exc_info())
 
167
        error(exc_str)
190
168
    log_exception_quietly()
191
169
 
192
170
 
198
176
    errors loading plugins.
199
177
    """
200
178
    import traceback
201
 
    mutter(traceback.format_exc())
 
179
    debug(traceback.format_exc())
202
180
 
203
181
 
204
182
def enable_default_logging():
285
263
        print >>err_file, "bzr: broken pipe"
286
264
    elif isinstance(exc_object, KeyboardInterrupt):
287
265
        print >>err_file, "bzr: interrupted"
288
 
    elif not getattr(exc_object, 'internal_error', True):
 
266
    elif getattr(exc_object, 'is_user_error', False):
289
267
        report_user_error(exc_info, err_file)
290
268
    elif isinstance(exc_object, (OSError, IOError)):
291
269
        # Might be nice to catch all of these and show them as something more
297
275
 
298
276
# TODO: Should these be specially encoding the output?
299
277
def report_user_error(exc_info, err_file):
300
 
    """Report to err_file an error that's not an internal error.
301
 
 
302
 
    These don't get a traceback unless -Derror was given.
303
 
    """
304
 
    if 'error' in debug.debug_flags:
305
 
        report_bug(exc_info, err_file)
306
 
        return
307
278
    print >>err_file, "bzr: ERROR:", str(exc_info[1])
308
279
 
309
280
 
311
282
    """Report an exception that probably indicates a bug in bzr"""
312
283
    import traceback
313
284
    exc_type, exc_object, exc_tb = exc_info
314
 
    print >>err_file, "bzr: ERROR: %s.%s: %s" % (
315
 
        exc_type.__module__, exc_type.__name__, exc_object)
 
285
    print >>err_file, "bzr: ERROR: %s: %s" % (exc_type, exc_object)
316
286
    print >>err_file
317
287
    traceback.print_exception(exc_type, exc_object, exc_tb, file=err_file)
318
288
    print >>err_file
322
292
                        sys.platform)
323
293
    print >>err_file, 'arguments: %r' % sys.argv
324
294
    print >>err_file
325
 
    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"