~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to bzrlib/trace.py

  • Committer: Robert Collins
  • Date: 2007-07-04 08:08:13 UTC
  • mfrom: (2572 +trunk)
  • mto: This revision was merged to the branch mainline in revision 2587.
  • Revision ID: robertc@robertcollins.net-20070704080813-wzebx0r88fvwj5rq
Merge bzr.dev.

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
 
# Copyright (C) 2005, 2006 by Canonical Ltd
 
1
# Copyright (C) 2005, 2006 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
55
53
import os
56
54
import sys
57
55
import re
 
56
 
 
57
from bzrlib.lazy_import import lazy_import
 
58
lazy_import(globals(), """
 
59
import errno
58
60
import logging
 
61
""")
59
62
 
60
63
import bzrlib
61
 
from bzrlib.errors import BzrError, BzrNewError
62
64
from bzrlib.symbol_versioning import (deprecated_function,
63
65
        zero_nine,
64
66
        )
65
67
 
 
68
lazy_import(globals(), """
 
69
from bzrlib import debug
 
70
""")
 
71
 
66
72
_file_handler = None
67
73
_stderr_handler = None
68
74
_stderr_quiet = False
69
75
_trace_file = None
70
76
_trace_depth = 0
71
77
_bzr_log_file = None
 
78
_bzr_log_filename = None
72
79
 
73
80
 
74
81
# configure convenient aliases for output routines
116
123
    _trace_file.write(out)
117
124
    # TODO: jam 20051227 Consider flushing the trace file to help debugging
118
125
    #_trace_file.flush()
119
 
debug = mutter
120
126
 
121
127
 
122
128
def _rollover_trace_maybe(trace_fname):
132
138
        return
133
139
 
134
140
 
135
 
def open_tracefile(tracefilename='~/.bzr.log'):
 
141
def open_tracefile(tracefilename=None):
136
142
    # Messages are always written to here, so that we have some
137
143
    # information if something goes wrong.  In a future version this
138
144
    # file will be removed on successful completion.
139
 
    global _file_handler, _bzr_log_file
 
145
    global _file_handler, _bzr_log_file, _bzr_log_filename
140
146
    import codecs
141
147
 
142
 
    trace_fname = os.path.join(os.path.expanduser(tracefilename))
143
 
    _rollover_trace_maybe(trace_fname)
 
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)
144
158
    try:
145
159
        LINE_BUFFERED = 1
146
160
        #tf = codecs.open(trace_fname, 'at', 'utf8', buffering=LINE_BUFFERED)
147
 
        tf = open(trace_fname, 'at', LINE_BUFFERED)
 
161
        tf = open(_bzr_log_filename, 'at', LINE_BUFFERED)
148
162
        _bzr_log_file = tf
149
 
        if tf.tell() == 0:
150
 
            tf.write("\nthis is a debug log for diagnosing/reporting problems in bzr\n")
 
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")
151
167
            tf.write("you can delete or truncate this file, or include sections in\n")
152
 
            tf.write("bug reports to bazaar-ng@lists.canonical.com\n\n")
 
168
            tf.write("bug reports to bazaar@lists.canonical.com\n\n")
153
169
        _file_handler = logging.StreamHandler(tf)
154
170
        fmt = r'[%(process)5d] %(asctime)s.%(msecs)03d %(levelname)s: %(message)s'
155
171
        datefmt = r'%a %H:%M:%S'
166
182
 
167
183
    The exception string representation is used as the error
168
184
    summary, unless msg is given.
 
185
 
 
186
    Please see log_exception_quietly() for the replacement API.
169
187
    """
170
188
    if msg:
171
189
        error(msg)
180
198
    errors loading plugins.
181
199
    """
182
200
    import traceback
183
 
    debug(traceback.format_exc())
 
201
    mutter(traceback.format_exc())
184
202
 
185
203
 
186
204
def enable_default_logging():
267
285
        print >>err_file, "bzr: broken pipe"
268
286
    elif isinstance(exc_object, KeyboardInterrupt):
269
287
        print >>err_file, "bzr: interrupted"
270
 
    elif getattr(exc_object, 'is_user_error', False):
 
288
    elif not getattr(exc_object, 'internal_error', True):
271
289
        report_user_error(exc_info, err_file)
272
290
    elif isinstance(exc_object, (OSError, IOError)):
273
291
        # Might be nice to catch all of these and show them as something more
279
297
 
280
298
# TODO: Should these be specially encoding the output?
281
299
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
282
307
    print >>err_file, "bzr: ERROR:", str(exc_info[1])
283
308
 
284
309
 
297
322
                        sys.platform)
298
323
    print >>err_file, 'arguments: %r' % sys.argv
299
324
    print >>err_file
300
 
    print >>err_file, "** please send this report to bazaar-ng@lists.ubuntu.com"
 
325
    print >>err_file, "** please send this report to bazaar@lists.ubuntu.com"