~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to bzrlib/trace.py

(jam) Switch from Transport.get() to .get_bytes(),
        close open file handles.

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
 
# Copyright (C) 2005, 2006, 2007, 2008 Canonical Ltd
 
1
# Copyright (C) 2005, 2006, 2007, 2008, 2009 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
59
59
import logging
60
60
import os
61
61
import sys
62
 
import re
63
62
import time
64
63
 
65
64
from bzrlib.lazy_import import lazy_import
72
71
 
73
72
import bzrlib
74
73
 
 
74
from bzrlib.symbol_versioning import (
 
75
    deprecated_function,
 
76
    deprecated_in,
 
77
    )
 
78
 
75
79
lazy_import(globals(), """
76
80
from bzrlib import (
77
81
    debug,
123
127
    _bzr_logger.warning(*args, **kwargs)
124
128
 
125
129
 
126
 
# configure convenient aliases for output routines
127
 
#
128
 
# TODO: deprecate them, have one name for each.
129
 
info = note
130
 
log_error = _bzr_logger.error
131
 
error =     _bzr_logger.error
132
 
 
133
 
 
134
 
_last_mutter_flush_time = None
 
130
@deprecated_function(deprecated_in((2, 1, 0)))
 
131
def info(*args, **kwargs):
 
132
    """Deprecated: use trace.note instead."""
 
133
    note(*args, **kwargs)
 
134
 
 
135
 
 
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)
 
140
 
 
141
 
 
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)
 
146
 
 
147
 
 
148
def show_error(msg):
 
149
    """Show an error message to the user.
 
150
 
 
151
    Don't use this for exceptions, use report_exception instead.
 
152
    """
 
153
    _bzr_logger.error(*args, **kwargs)
 
154
 
135
155
 
136
156
def mutter(fmt, *args):
137
 
    global _last_mutter_flush_time
138
157
    if _trace_file is None:
139
158
        return
 
159
    # XXX: Don't check this every time; instead anyone who closes the file
 
160
    # ought to deregister it.  We can tolerate None.
140
161
    if (getattr(_trace_file, 'closed', None) is not None) and _trace_file.closed:
141
162
        return
142
163
 
159
180
    timestamp = '%0.3f  ' % (now - _bzr_log_start_time,)
160
181
    out = timestamp + out + '\n'
161
182
    _trace_file.write(out)
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:
169
 
            flush()
170
 
        _last_mutter_flush_time = now
 
183
    # there's no explicit flushing; the file is typically line buffered.
171
184
 
172
185
 
173
186
def mutter_callsite(stacklevel, fmt, *args):
228
241
    _bzr_log_filename = _get_bzr_log_filename()
229
242
    _rollover_trace_maybe(_bzr_log_filename)
230
243
    try:
231
 
        bzr_log_file = open(_bzr_log_filename, 'at', 1) # line buffered
 
244
        bzr_log_file = open(_bzr_log_filename, 'at', buffering=0) # unbuffered
232
245
        # bzr_log_file.tell() on windows always return 0 until some writing done
233
246
        bzr_log_file.write('\n')
234
247
        if bzr_log_file.tell() <= 2:
422
435
 
423
436
    :return: The appropriate exit code for this error.
424
437
    """
425
 
    exc_type, exc_object, exc_tb = exc_info
426
438
    # Log the full traceback to ~/.bzr.log
427
439
    log_exception_quietly()
 
440
    if 'error' in debug.debug_flags:
 
441
        print_exception(exc_info, err_file)
 
442
        return errors.EXIT_ERROR
 
443
    exc_type, exc_object, exc_tb = exc_info
428
444
    if (isinstance(exc_object, IOError)
429
445
        and getattr(exc_object, 'errno', None) == errno.EPIPE):
430
446
        err_file.write("bzr: broken pipe\n")
471
487
    :param advice: Extra advice to the user to be printed following the
472
488
        exception.
473
489
    """
474
 
    if 'error' in debug.debug_flags:
475
 
        print_exception(exc_info, err_file)
476
 
        return
477
490
    err_file.write("bzr: ERROR: %s\n" % (exc_info[1],))
478
491
    if advice:
479
492
        err_file.write("%s\n" % (advice,))