~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to bzrlib/trace.py

  • Committer: Jelmer Vernooij
  • Date: 2009-10-27 21:54:26 UTC
  • mfrom: (4771 +trunk)
  • mto: This revision was merged to the branch mainline in revision 4833.
  • Revision ID: jelmer@samba.org-20091027215426-72164bkd4mq9dsd4
merge bzr.dev.

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
 
# Copyright (C) 2005, 2006, 2007, 2008, 2009 Canonical Ltd
 
1
# Copyright (C) 2005, 2006, 2007, 2008 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
153
153
    _bzr_logger.error(*args, **kwargs)
154
154
 
155
155
 
 
156
_last_mutter_flush_time = None
 
157
 
 
158
 
156
159
def mutter(fmt, *args):
 
160
    global _last_mutter_flush_time
157
161
    if _trace_file is None:
158
162
        return
159
 
    # XXX: Don't check this every time; instead anyone who closes the file
160
 
    # ought to deregister it.  We can tolerate None.
161
163
    if (getattr(_trace_file, 'closed', None) is not None) and _trace_file.closed:
162
164
        return
163
165
 
180
182
    timestamp = '%0.3f  ' % (now - _bzr_log_start_time,)
181
183
    out = timestamp + out + '\n'
182
184
    _trace_file.write(out)
183
 
    # there's no explicit flushing; the file is typically line buffered.
 
185
    # We flush if we haven't flushed for a few seconds. We don't want to flush
 
186
    # on every mutter, but when a command takes a while, it can be nice to see
 
187
    # updates in the debug log.
 
188
    if (_last_mutter_flush_time is None
 
189
        or (now - _last_mutter_flush_time) > 2.0):
 
190
        flush = getattr(_trace_file, 'flush', None)
 
191
        if flush is not None:
 
192
            flush()
 
193
        _last_mutter_flush_time = now
184
194
 
185
195
 
186
196
def mutter_callsite(stacklevel, fmt, *args):
241
251
    _bzr_log_filename = _get_bzr_log_filename()
242
252
    _rollover_trace_maybe(_bzr_log_filename)
243
253
    try:
244
 
        bzr_log_file = open(_bzr_log_filename, 'at', buffering=0) # unbuffered
 
254
        bzr_log_file = open(_bzr_log_filename, 'at', 1) # line buffered
245
255
        # bzr_log_file.tell() on windows always return 0 until some writing done
246
256
        bzr_log_file.write('\n')
247
257
        if bzr_log_file.tell() <= 2:
250
260
            bzr_log_file.write("bug reports to https://bugs.launchpad.net/bzr/+filebug\n\n")
251
261
        return bzr_log_file
252
262
    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,))
 
263
        warning("failed to open trace file: %s" % (e))
259
264
    # TODO: What should happen if we fail to open the trace file?  Maybe the
260
265
    # objects should be pointed at /dev/null or the equivalent?  Currently
261
266
    # returns None which will cause failures later.
440
445
 
441
446
    :return: The appropriate exit code for this error.
442
447
    """
 
448
    exc_type, exc_object, exc_tb = exc_info
443
449
    # Log the full traceback to ~/.bzr.log
444
450
    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
451
    if (isinstance(exc_object, IOError)
450
452
        and getattr(exc_object, 'errno', None) == errno.EPIPE):
451
453
        err_file.write("bzr: broken pipe\n")
492
494
    :param advice: Extra advice to the user to be printed following the
493
495
        exception.
494
496
    """
 
497
    if 'error' in debug.debug_flags:
 
498
        print_exception(exc_info, err_file)
 
499
        return
495
500
    err_file.write("bzr: ERROR: %s\n" % (exc_info[1],))
496
501
    if advice:
497
502
        err_file.write("%s\n" % (advice,))