1
# Copyright (C) 2005, 2006, 2007, 2008, 2009 Canonical Ltd
1
# Copyright (C) 2005, 2006, 2007, 2008 Canonical Ltd
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
127
123
_bzr_logger.warning(*args, **kwargs)
130
@deprecated_function(deprecated_in((2, 1, 0)))
131
def info(*args, **kwargs):
132
"""Deprecated: use trace.note instead."""
133
note(*args, **kwargs)
136
@deprecated_function(deprecated_in((2, 1, 0)))
137
def log_error(*args, **kwargs):
138
"""Deprecated: use bzrlib.trace.show_error instead"""
139
_bzr_logger.error(*args, **kwargs)
142
@deprecated_function(deprecated_in((2, 1, 0)))
143
def error(*args, **kwargs):
144
"""Deprecated: use bzrlib.trace.show_error instead"""
145
_bzr_logger.error(*args, **kwargs)
149
"""Show an error message to the user.
151
Don't use this for exceptions, use report_exception instead.
153
_bzr_logger.error(*args, **kwargs)
126
# configure convenient aliases for output routines
128
# TODO: deprecate them, have one name for each.
130
log_error = _bzr_logger.error
131
error = _bzr_logger.error
134
_last_mutter_flush_time = None
156
136
def mutter(fmt, *args):
137
global _last_mutter_flush_time
157
138
if _trace_file is None:
159
# XXX: Don't check this every time; instead anyone who closes the file
160
# ought to deregister it. We can tolerate None.
161
140
if (getattr(_trace_file, 'closed', None) is not None) and _trace_file.closed:
180
159
timestamp = '%0.3f ' % (now - _bzr_log_start_time,)
181
160
out = timestamp + out + '\n'
182
161
_trace_file.write(out)
183
# there's no explicit flushing; the file is typically line buffered.
162
# We flush if we haven't flushed for a few seconds. We don't want to flush
163
# on every mutter, but when a command takes a while, it can be nice to see
164
# updates in the debug log.
165
if (_last_mutter_flush_time is None
166
or (now - _last_mutter_flush_time) > 2.0):
167
flush = getattr(_trace_file, 'flush', None)
168
if flush is not None:
170
_last_mutter_flush_time = now
186
173
def mutter_callsite(stacklevel, fmt, *args):
241
228
_bzr_log_filename = _get_bzr_log_filename()
242
229
_rollover_trace_maybe(_bzr_log_filename)
244
bzr_log_file = open(_bzr_log_filename, 'at', buffering=0) # unbuffered
231
bzr_log_file = open(_bzr_log_filename, 'at', 1) # line buffered
245
232
# bzr_log_file.tell() on windows always return 0 until some writing done
246
233
bzr_log_file.write('\n')
247
234
if bzr_log_file.tell() <= 2:
250
237
bzr_log_file.write("bug reports to https://bugs.launchpad.net/bzr/+filebug\n\n")
251
238
return bzr_log_file
252
239
except IOError, e:
253
# If we are failing to open the log, then most likely logging has not
254
# been set up yet. So we just write to stderr rather than using
255
# 'warning()'. If we using warning(), users get the unhelpful 'no
256
# handlers registered for "bzr"' when something goes wrong on the
257
# server. (bug #503886)
258
sys.stderr.write("failed to open trace file: %s\n" % (e,))
240
warning("failed to open trace file: %s" % (e))
259
241
# TODO: What should happen if we fail to open the trace file? Maybe the
260
242
# objects should be pointed at /dev/null or the equivalent? Currently
261
243
# returns None which will cause failures later.
441
423
:return: The appropriate exit code for this error.
425
exc_type, exc_object, exc_tb = exc_info
443
426
# Log the full traceback to ~/.bzr.log
444
427
log_exception_quietly()
445
if 'error' in debug.debug_flags:
446
print_exception(exc_info, err_file)
447
return errors.EXIT_ERROR
448
exc_type, exc_object, exc_tb = exc_info
449
428
if (isinstance(exc_object, IOError)
450
429
and getattr(exc_object, 'errno', None) == errno.EPIPE):
451
430
err_file.write("bzr: broken pipe\n")
453
432
elif isinstance(exc_object, KeyboardInterrupt):
454
433
err_file.write("bzr: interrupted\n")
455
434
return errors.EXIT_ERROR
456
elif isinstance(exc_object, MemoryError):
457
err_file.write("bzr: out of memory\n")
458
return errors.EXIT_ERROR
459
435
elif isinstance(exc_object, ImportError) \
460
436
and str(exc_object).startswith("No module named "):
461
437
report_user_error(exc_info, err_file,
492
468
:param advice: Extra advice to the user to be printed following the
471
if 'error' in debug.debug_flags:
472
print_exception(exc_info, err_file)
495
474
err_file.write("bzr: ERROR: %s\n" % (exc_info[1],))
497
476
err_file.write("%s\n" % (advice,))
500
479
def report_bug(exc_info, err_file):
501
480
"""Report an exception that probably indicates a bug in bzr"""
502
from bzrlib.crash import report_bug
503
report_bug(exc_info, err_file)
481
print_exception(exc_info, err_file)
483
err_file.write('bzr %s on python %s (%s)\n' % \
485
bzrlib._format_version_tuple(sys.version_info),
487
err_file.write('arguments: %r\n' % sys.argv)
489
'encoding: %r, fsenc: %r, lang: %r\n' % (
490
osutils.get_user_encoding(), sys.getfilesystemencoding(),
491
os.environ.get('LANG')))
492
err_file.write("plugins:\n")
493
for name, a_plugin in sorted(plugin.plugins().items()):
494
err_file.write(" %-20s %s [%s]\n" %
495
(name, a_plugin.path(), a_plugin.__version__))
498
*** Bazaar has encountered an internal error.
499
Please report a bug at https://bugs.launchpad.net/bzr/+filebug
500
including this traceback, and a description of what you
501
were doing when the error occurred.