bzr branch
http://gegoxaren.bato24.eu/bzr/brz/remove-bazaar
| 2713.2.1
by Martin Pool Return exitcode 4 if an internal error occurs | 1 | # Copyright (C) 2005, 2006, 2007 Canonical Ltd
 | 
| 1740.5.1
by Martin Pool When an unhandled exception occurs, write the traceback to stderr. | 2 | #
 | 
| 3 | # This program is free software; you can redistribute it and/or modify
 | |
| 4 | # it under the terms of the GNU General Public License as published by
 | |
| 5 | # the Free Software Foundation; either version 2 of the License, or
 | |
| 6 | # (at your option) any later version.
 | |
| 7 | #
 | |
| 8 | # This program is distributed in the hope that it will be useful,
 | |
| 9 | # but WITHOUT ANY WARRANTY; without even the implied warranty of
 | |
| 10 | # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 | |
| 11 | # GNU General Public License for more details.
 | |
| 12 | #
 | |
| 13 | # You should have received a copy of the GNU General Public License
 | |
| 14 | # along with this program; if not, write to the Free Software
 | |
| 15 | # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
 | |
| 1
by mbp at sourcefrog import from baz patch-364 | 16 | |
| 1185.33.6
by Martin Pool Code and tests for shorter formatting of error messages | 17 | """Messages and logging for bazaar-ng.
 | 
| 18 | ||
| 19 | Messages are supplied by callers as a string-formatting template, plus values
 | |
| 20 | to be inserted into it.  The actual %-formatting is deferred to the log
 | |
| 21 | library so that it doesn't need to be done for messages that won't be emitted.
 | |
| 22 | ||
| 23 | Messages are classified by severity levels: critical, error, warning, info,
 | |
| 24 | and debug.
 | |
| 25 | ||
| 26 | They can be sent to two places: to stderr, and to ~/.bzr.log.  For purposes
 | |
| 27 | such as running the test suite, they can also be redirected away from both of
 | |
| 28 | those two places to another location.
 | |
| 29 | ||
| 30 | ~/.bzr.log gets all messages, and full tracebacks for uncaught exceptions.
 | |
| 1185.33.51
by Martin Pool Fix trace of non-ascii messages, and add test. | 31 | This trace file is always in UTF-8, regardless of the user's default encoding,
 | 
| 32 | so that we can always rely on writing any message.
 | |
| 1185.33.6
by Martin Pool Code and tests for shorter formatting of error messages | 33 | |
| 34 | Output to stderr depends on the mode chosen by the user.  By default, messages
 | |
| 35 | of info and above are sent out, which results in progress messages such as the
 | |
| 36 | list of files processed by add and commit.  In quiet mode, only warnings and
 | |
| 37 | above are shown.  In debug mode, stderr gets debug messages too.
 | |
| 38 | ||
| 39 | Errors that terminate an operation are generally passed back as exceptions;
 | |
| 40 | others may be just emitted as messages.
 | |
| 41 | ||
| 42 | Exceptions are reported in a brief form to stderr so as not to look scary.
 | |
| 43 | BzrErrors are required to be able to format themselves into a properly
 | |
| 1759.2.1
by Jelmer Vernooij Fix some types (found using aspell). | 44 | explanatory message.  This is not true for builtin exceptions such as
 | 
| 1185.33.6
by Martin Pool Code and tests for shorter formatting of error messages | 45 | KeyError, which typically just str to "0".  They're printed in a different
 | 
| 46 | form.
 | |
| 344
by Martin Pool - It's not an error to use the library without | 47 | """
 | 
| 48 | ||
| 1185.16.74
by Martin Pool doc | 49 | # FIXME: Unfortunately it turns out that python's logging module
 | 
| 50 | # is quite expensive, even when the message is not printed by any handlers.
 | |
| 51 | # We should perhaps change back to just simply doing it here.
 | |
| 52 | ||
| 2978.1.1
by Alexander Belchenko Output to stderr with trace module now going through wrapper that takes care about terminal encoding. (#54173) | 53 | import codecs | 
| 54 | import logging | |
| 1740.5.3
by Martin Pool Cleanup more exception-formatting code | 55 | import os | 
| 1551.9.3
by Aaron Bentley Revert buggy apport changes | 56 | import sys | 
| 2123.1.1
by Robert Collins (Robert Collins) Extend the problem reporting command line UI to use | 57 | import re | 
| 3170.1.1
by Andrew Bennetts Add -Dtimes, which adds a timestamp to mutters (using the time since the first mutter). | 58 | import time | 
| 1996.3.29
by John Arbash Meinel don't import errors, and try to lazy import logging in bzrlib.trace | 59 | |
| 60 | from bzrlib.lazy_import import lazy_import | |
| 61 | lazy_import(globals(), """ | |
| 2725.1.1
by Robert Collins Add -Devil flag to highlight the use of problematic API calls. | 62 | from cStringIO import StringIO
 | 
| 1996.3.29
by John Arbash Meinel don't import errors, and try to lazy import logging in bzrlib.trace | 63 | import errno
 | 
| 2842.1.1
by Martin Pool Report locale, encodings and plugins in traceback | 64 | import locale
 | 
| 2725.1.1
by Robert Collins Add -Devil flag to highlight the use of problematic API calls. | 65 | import traceback
 | 
| 1996.3.29
by John Arbash Meinel don't import errors, and try to lazy import logging in bzrlib.trace | 66 | """) | 
| 1097
by Martin Pool - send trace messages out through python logging module | 67 | |
| 1185.33.8
by Martin Pool Cleanup exception formatting stuff | 68 | import bzrlib | 
| 1097
by Martin Pool - send trace messages out through python logging module | 69 | |
| 2095.5.2
by Martin Pool save commit message if commit fails (#32054) | 70 | lazy_import(globals(), """ | 
| 2713.2.1
by Martin Pool Return exitcode 4 if an internal error occurs | 71 | from bzrlib import (
 | 
| 72 |     debug,
 | |
| 73 |     errors,
 | |
| 2842.1.1
by Martin Pool Report locale, encodings and plugins in traceback | 74 |     osutils,
 | 
| 75 |     plugin,
 | |
| 2713.2.1
by Martin Pool Return exitcode 4 if an internal error occurs | 76 |     )
 | 
| 2095.5.2
by Martin Pool save commit message if commit fails (#32054) | 77 | """) | 
| 78 | ||
| 1101
by Martin Pool - add global definition to quieten pychecker | 79 | _file_handler = None | 
| 1111
by Martin Pool - add functions to enable and disable default logging, so that we can | 80 | _stderr_handler = None | 
| 2768.1.2
by Ian Clatworthy Make noise levels a scale, not just a boolean in trace.py | 81 | _verbosity_level = 0 | 
| 1185.43.7
by Martin Pool Do debug messages not through python logging | 82 | _trace_file = None | 
| 1534.11.7
by Robert Collins Test and correct the problem with nested test logs breaking further in-test logs. | 83 | _trace_depth = 0 | 
| 1185.43.7
by Martin Pool Do debug messages not through python logging | 84 | _bzr_log_file = None | 
| 2566.1.1
by Martin Pool Show bzr.log location in bzr --version output. | 85 | _bzr_log_filename = None | 
| 3195.1.1
by Andrew Bennetts Always include timestamps in the trace file (i.e. remove -Dtimes in favour of having it switched on permanently) | 86 | _start_time = bzrlib._start_time | 
| 1185.43.7
by Martin Pool Do debug messages not through python logging | 87 | |
| 1185.49.17
by John Arbash Meinel [merge] Robey Pointer - some sftp fixes, and an http patch | 88 | |
| 1097
by Martin Pool - send trace messages out through python logging module | 89 | # configure convenient aliases for output routines
 | 
| 90 | ||
| 91 | _bzr_logger = logging.getLogger('bzr') | |
| 92 | ||
| 2978.1.1
by Alexander Belchenko Output to stderr with trace module now going through wrapper that takes care about terminal encoding. (#54173) | 93 | |
| 1558.8.1
by Aaron Bentley Fix overall progress bar's interaction with 'note' and 'warning' | 94 | def note(*args, **kwargs): | 
| 1793.2.16
by Aaron Bentley More notes on 'note' | 95 |     # FIXME note always emits utf-8, regardless of the terminal encoding
 | 
| 1558.8.1
by Aaron Bentley Fix overall progress bar's interaction with 'note' and 'warning' | 96 | import bzrlib.ui | 
| 97 | bzrlib.ui.ui_factory.clear_term() | |
| 98 | _bzr_logger.info(*args, **kwargs) | |
| 99 | ||
| 100 | def warning(*args, **kwargs): | |
| 101 | import bzrlib.ui | |
| 102 | bzrlib.ui.ui_factory.clear_term() | |
| 103 | _bzr_logger.warning(*args, **kwargs) | |
| 104 | ||
| 105 | info = note | |
| 1097
by Martin Pool - send trace messages out through python logging module | 106 | log_error = _bzr_logger.error | 
| 107 | error = _bzr_logger.error | |
| 1185.43.7
by Martin Pool Do debug messages not through python logging | 108 | |
| 109 | ||
| 110 | def mutter(fmt, *args): | |
| 1185.43.10
by Martin Pool Remove need for BZR_DEBUG to get debug info in trace file. | 111 | if _trace_file is None: | 
| 112 |         return
 | |
| 1963.2.6
by Robey Pointer pychecker is on crack; go back to using 'is None'. | 113 | if (getattr(_trace_file, 'closed', None) is not None) and _trace_file.closed: | 
| 1185.43.10
by Martin Pool Remove need for BZR_DEBUG to get debug info in trace file. | 114 |         return
 | 
| 1948.1.9
by John Arbash Meinel Change mutter() so that it doesn't try so hard to write out perfect utf8, instead, rather than using a utf8 file, it changes unicode to utf8 manually | 115 | |
| 116 | if isinstance(fmt, unicode): | |
| 117 | fmt = fmt.encode('utf8') | |
| 118 | ||
| 1185.43.10
by Martin Pool Remove need for BZR_DEBUG to get debug info in trace file. | 119 | if len(args) > 0: | 
| 1685.1.2
by John Arbash Meinel Re-enabling the non_ascii tests after fixing trace.py, bzr ignore also does the right thing now | 120 |         # It seems that if we do ascii % (unicode, ascii) we can
 | 
| 121 |         # get a unicode cannot encode ascii error, so make sure that "fmt"
 | |
| 122 |         # is a unicode string
 | |
| 1948.1.9
by John Arbash Meinel Change mutter() so that it doesn't try so hard to write out perfect utf8, instead, rather than using a utf8 file, it changes unicode to utf8 manually | 123 | real_args = [] | 
| 124 | for arg in args: | |
| 125 | if isinstance(arg, unicode): | |
| 126 | arg = arg.encode('utf8') | |
| 127 | real_args.append(arg) | |
| 128 | out = fmt % tuple(real_args) | |
| 1185.43.10
by Martin Pool Remove need for BZR_DEBUG to get debug info in trace file. | 129 | else: | 
| 1185.33.51
by Martin Pool Fix trace of non-ascii messages, and add test. | 130 | out = fmt | 
| 3195.1.1
by Andrew Bennetts Always include timestamps in the trace file (i.e. remove -Dtimes in favour of having it switched on permanently) | 131 | timestamp = '%0.3f ' % (time.time() - _start_time,) | 
| 132 | out = timestamp + out + '\n' | |
| 1948.1.9
by John Arbash Meinel Change mutter() so that it doesn't try so hard to write out perfect utf8, instead, rather than using a utf8 file, it changes unicode to utf8 manually | 133 | _trace_file.write(out) | 
| 1185.85.5
by John Arbash Meinel mutter() should not fail because of unicode errors | 134 |     # TODO: jam 20051227 Consider flushing the trace file to help debugging
 | 
| 135 |     #_trace_file.flush()
 | |
| 1097
by Martin Pool - send trace messages out through python logging module | 136 | |
| 1185.43.10
by Martin Pool Remove need for BZR_DEBUG to get debug info in trace file. | 137 | |
| 2725.1.1
by Robert Collins Add -Devil flag to highlight the use of problematic API calls. | 138 | def mutter_callsite(stacklevel, fmt, *args): | 
| 139 | """Perform a mutter of fmt and args, logging the call trace. | |
| 140 | ||
| 141 |     :param stacklevel: The number of frames to show. None will show all
 | |
| 142 |         frames.
 | |
| 143 |     :param fmt: The format string to pass to mutter.
 | |
| 144 |     :param args: A list of substitution variables.
 | |
| 145 |     """
 | |
| 146 | outf = StringIO() | |
| 147 | traceback.print_stack(limit=stacklevel + 1, file=outf) | |
| 148 | formatted_lines = outf.getvalue().splitlines() | |
| 149 | formatted_stack = '\n'.join(formatted_lines[:-2]) | |
| 150 | mutter(fmt + "\nCalled from:\n%s", *(args + (formatted_stack,))) | |
| 151 | ||
| 152 | ||
| 261
by Martin Pool - auto-rollover of .bzr.log | 153 | def _rollover_trace_maybe(trace_fname): | 
| 359
by Martin Pool - pychecker fixups | 154 | import stat | 
| 261
by Martin Pool - auto-rollover of .bzr.log | 155 | try: | 
| 156 | size = os.stat(trace_fname)[stat.ST_SIZE] | |
| 333
by Martin Pool - allow trace file to grow up to 4MB | 157 | if size <= 4 << 20: | 
| 261
by Martin Pool - auto-rollover of .bzr.log | 158 |             return
 | 
| 159 | old_fname = trace_fname + '.old' | |
| 2851.3.1
by Martin Pool Add unit test for _rollover_trace_maybe | 160 | osutils.rename(trace_fname, old_fname) | 
| 261
by Martin Pool - auto-rollover of .bzr.log | 161 | except OSError: | 
| 162 |         return
 | |
| 163 | ||
| 164 | ||
| 2245.4.2
by Alexander Belchenko trace.py: open_tracefile(): win98-compatible detection of location for .bzr.log | 165 | def open_tracefile(tracefilename=None): | 
| 59
by mbp at sourcefrog lift out tracefile creation code | 166 |     # Messages are always written to here, so that we have some
 | 
| 167 |     # information if something goes wrong.  In a future version this
 | |
| 168 |     # file will be removed on successful completion.
 | |
| 2566.1.1
by Martin Pool Show bzr.log location in bzr --version output. | 169 | global _file_handler, _bzr_log_file, _bzr_log_filename | 
| 1773.4.1
by Martin Pool Add pyflakes makefile target; fix many warnings | 170 | import codecs | 
| 59
by mbp at sourcefrog lift out tracefile creation code | 171 | |
| 2245.4.2
by Alexander Belchenko trace.py: open_tracefile(): win98-compatible detection of location for .bzr.log | 172 | if tracefilename is None: | 
| 173 | if sys.platform == 'win32': | |
| 174 | from bzrlib import win32utils | |
| 175 | home = win32utils.get_home_location() | |
| 176 | else: | |
| 177 | home = os.path.expanduser('~') | |
| 2566.1.1
by Martin Pool Show bzr.log location in bzr --version output. | 178 | _bzr_log_filename = os.path.join(home, '.bzr.log') | 
| 2684.1.1
by Andrew Bennetts Fix bzrlib.opentracefile('foo'). | 179 | else: | 
| 180 | _bzr_log_filename = tracefilename | |
| 2245.4.2
by Alexander Belchenko trace.py: open_tracefile(): win98-compatible detection of location for .bzr.log | 181 | |
| 2566.1.1
by Martin Pool Show bzr.log location in bzr --version output. | 182 | _bzr_log_filename = os.path.expanduser(_bzr_log_filename) | 
| 183 | _rollover_trace_maybe(_bzr_log_filename) | |
| 403
by Martin Pool - Don't give an error if the trace file can't be opened | 184 | try: | 
| 1185.33.11
by Martin Pool Code format cleanups | 185 | LINE_BUFFERED = 1 | 
| 1948.1.9
by John Arbash Meinel Change mutter() so that it doesn't try so hard to write out perfect utf8, instead, rather than using a utf8 file, it changes unicode to utf8 manually | 186 |         #tf = codecs.open(trace_fname, 'at', 'utf8', buffering=LINE_BUFFERED)
 | 
| 2566.1.1
by Martin Pool Show bzr.log location in bzr --version output. | 187 | tf = open(_bzr_log_filename, 'at', LINE_BUFFERED) | 
| 1185.43.7
by Martin Pool Do debug messages not through python logging | 188 | _bzr_log_file = tf | 
| 2245.4.2
by Alexander Belchenko trace.py: open_tracefile(): win98-compatible detection of location for .bzr.log | 189 |         # tf.tell() on windows always return 0 until some writing done
 | 
| 190 | tf.write('\n') | |
| 191 | if tf.tell() <= 2: | |
| 192 | tf.write("this is a debug log for diagnosing/reporting problems in bzr\n") | |
| 1100
by Martin Pool - fix name error reported by Andrew Bennetts | 193 | tf.write("you can delete or truncate this file, or include sections in\n") | 
| 3092.2.1
by Martin Pool Ask people to report bugs to Launchpad, and mention more support options | 194 | tf.write("bug reports to https://bugs.launchpad.net/bzr/+filebug\n\n") | 
| 1097
by Martin Pool - send trace messages out through python logging module | 195 | _file_handler = logging.StreamHandler(tf) | 
| 196 | fmt = r'[%(process)5d] %(asctime)s.%(msecs)03d %(levelname)s: %(message)s' | |
| 3144.2.1
by Lukáš Lalinský Don't use weekday names in the trace file. | 197 | datefmt = r'%Y-%m-%d %H:%M:%S' | 
| 1097
by Martin Pool - send trace messages out through python logging module | 198 | _file_handler.setFormatter(logging.Formatter(fmt, datefmt)) | 
| 199 | _file_handler.setLevel(logging.DEBUG) | |
| 200 | logging.getLogger('').addHandler(_file_handler) | |
| 403
by Martin Pool - Don't give an error if the trace file can't be opened | 201 | except IOError, e: | 
| 202 | warning("failed to open trace file: %s" % (e)) | |
| 260
by Martin Pool - remove atexit() dependency for writing out execution times | 203 | |
| 1097
by Martin Pool - send trace messages out through python logging module | 204 | |
| 1185.16.82
by mbp at sourcefrog - give a quieter warning if a plugin can't be loaded | 205 | def log_exception_quietly(): | 
| 206 | """Log the last exception to the trace file only. | |
| 207 | ||
| 208 |     Used for exceptions that occur internally and that may be 
 | |
| 209 |     interesting to developers but not to users.  For example, 
 | |
| 210 |     errors loading plugins.
 | |
| 211 |     """
 | |
| 1185.33.11
by Martin Pool Code format cleanups | 212 | import traceback | 
| 2095.5.2
by Martin Pool save commit message if commit fails (#32054) | 213 | mutter(traceback.format_exc()) | 
| 1185.16.82
by mbp at sourcefrog - give a quieter warning if a plugin can't be loaded | 214 | |
| 215 | ||
| 1111
by Martin Pool - add functions to enable and disable default logging, so that we can | 216 | def enable_default_logging(): | 
| 217 | """Configure default logging to stderr and .bzr.log""" | |
| 1185.43.9
by Martin Pool Make logging of errors go through our trace functions | 218 |     # FIXME: if this is run twice, things get confused
 | 
| 1185.43.7
by Martin Pool Do debug messages not through python logging | 219 | global _stderr_handler, _file_handler, _trace_file, _bzr_log_file | 
| 2978.1.1
by Alexander Belchenko Output to stderr with trace module now going through wrapper that takes care about terminal encoding. (#54173) | 220 |     # create encoded wrapper around stderr
 | 
| 221 | stderr = codecs.getwriter(osutils.get_terminal_encoding())(sys.stderr, | |
| 222 | errors='replace') | |
| 223 | _stderr_handler = logging.StreamHandler(stderr) | |
| 1185.34.2
by Jelmer Vernooij Don't quite when tracefile can't be opened. Display warning | 224 | logging.getLogger('').addHandler(_stderr_handler) | 
| 1359
by Martin Pool - merge in new BZR_NOISY vs BZR_DEBUG stuff from main | 225 | _stderr_handler.setLevel(logging.INFO) | 
| 1185.34.2
by Jelmer Vernooij Don't quite when tracefile can't be opened. Display warning | 226 | if not _file_handler: | 
| 227 | open_tracefile() | |
| 1185.43.7
by Martin Pool Do debug messages not through python logging | 228 | _trace_file = _bzr_log_file | 
| 1185.34.2
by Jelmer Vernooij Don't quite when tracefile can't be opened. Display warning | 229 | if _file_handler: | 
| 1185.43.10
by Martin Pool Remove need for BZR_DEBUG to get debug info in trace file. | 230 | _file_handler.setLevel(logging.DEBUG) | 
| 1740.5.3
by Martin Pool Cleanup more exception-formatting code | 231 | _bzr_logger.setLevel(logging.DEBUG) | 
| 1359
by Martin Pool - merge in new BZR_NOISY vs BZR_DEBUG stuff from main | 232 | |
| 1185.33.42
by Martin Pool [patch] make --quiet a global option (robey) | 233 | |
| 2768.1.2
by Ian Clatworthy Make noise levels a scale, not just a boolean in trace.py | 234 | def set_verbosity_level(level): | 
| 235 | """Set the verbosity level. | |
| 236 | ||
| 237 |     :param level: -ve for quiet, 0 for normal, +ve for verbose
 | |
| 238 |     """
 | |
| 239 | global _verbosity_level | |
| 240 | _verbosity_level = level | |
| 241 | _update_logging_level(level < 0) | |
| 242 | ||
| 243 | ||
| 244 | def get_verbosity_level(): | |
| 245 | """Get the verbosity level. | |
| 246 | ||
| 247 |     See set_verbosity_level() for values.
 | |
| 248 |     """
 | |
| 2768.1.10
by Ian Clatworthy Add tests for new methods in trace.py | 249 | return _verbosity_level | 
| 2768.1.2
by Ian Clatworthy Make noise levels a scale, not just a boolean in trace.py | 250 | |
| 251 | ||
| 1185.33.42
by Martin Pool [patch] make --quiet a global option (robey) | 252 | def be_quiet(quiet=True): | 
| 2768.1.2
by Ian Clatworthy Make noise levels a scale, not just a boolean in trace.py | 253 |     # Perhaps this could be deprecated now ...
 | 
| 254 | if quiet: | |
| 255 | set_verbosity_level(-1) | |
| 256 | else: | |
| 257 | set_verbosity_level(0) | |
| 258 | ||
| 259 | ||
| 260 | def _update_logging_level(quiet=True): | |
| 261 | """Hide INFO messages if quiet.""" | |
| 1185.33.42
by Martin Pool [patch] make --quiet a global option (robey) | 262 | if quiet: | 
| 263 | _stderr_handler.setLevel(logging.WARNING) | |
| 264 | else: | |
| 265 | _stderr_handler.setLevel(logging.INFO) | |
| 266 | ||
| 267 | ||
| 268 | def is_quiet(): | |
| 2768.1.2
by Ian Clatworthy Make noise levels a scale, not just a boolean in trace.py | 269 | """Is the verbosity level negative?""" | 
| 270 | return _verbosity_level < 0 | |
| 271 | ||
| 272 | ||
| 273 | def is_verbose(): | |
| 274 | """Is the verbosity level positive?""" | |
| 275 | return _verbosity_level > 0 | |
| 1185.33.42
by Martin Pool [patch] make --quiet a global option (robey) | 276 | |
| 277 | ||
| 1111
by Martin Pool - add functions to enable and disable default logging, so that we can | 278 | def disable_default_logging(): | 
| 279 | """Turn off default log handlers. | |
| 280 | ||
| 281 |     This is intended to be used by the test framework, which doesn't
 | |
| 282 |     want leakage from the code-under-test into the main logs.
 | |
| 283 |     """
 | |
| 1112
by Martin Pool - disable standard logging to .bzr.log and stderr while running | 284 | |
| 285 | l = logging.getLogger('') | |
| 286 | l.removeHandler(_stderr_handler) | |
| 287 | if _file_handler: | |
| 288 | l.removeHandler(_file_handler) | |
| 1185.43.7
by Martin Pool Do debug messages not through python logging | 289 | _trace_file = None | 
| 1185.33.6
by Martin Pool Code and tests for shorter formatting of error messages | 290 | |
| 291 | ||
| 1185.33.13
by Martin Pool Hide more stuff in bzrlib.trace | 292 | def enable_test_log(to_file): | 
| 1534.4.25
by Robert Collins Add a --transport parameter to the test suite to set the default transport to be used in the test suite. | 293 | """Redirect logging to a temporary file for a test | 
| 294 |     
 | |
| 295 |     returns an opaque reference that should be passed to disable_test_log
 | |
| 1534.11.7
by Robert Collins Test and correct the problem with nested test logs breaking further in-test logs. | 296 |     after the test completes.
 | 
| 1534.4.25
by Robert Collins Add a --transport parameter to the test suite to set the default transport to be used in the test suite. | 297 |     """
 | 
| 1185.33.13
by Martin Pool Hide more stuff in bzrlib.trace | 298 | disable_default_logging() | 
| 1534.4.25
by Robert Collins Add a --transport parameter to the test suite to set the default transport to be used in the test suite. | 299 | global _trace_file | 
| 1534.11.7
by Robert Collins Test and correct the problem with nested test logs breaking further in-test logs. | 300 | global _trace_depth | 
| 1185.33.13
by Martin Pool Hide more stuff in bzrlib.trace | 301 | hdlr = logging.StreamHandler(to_file) | 
| 302 | hdlr.setLevel(logging.DEBUG) | |
| 303 | hdlr.setFormatter(logging.Formatter('%(levelname)8s %(message)s')) | |
| 1185.43.1
by Martin Pool Remove direct logging calls from selftest | 304 | _bzr_logger.addHandler(hdlr) | 
| 305 | _bzr_logger.setLevel(logging.DEBUG) | |
| 1534.11.7
by Robert Collins Test and correct the problem with nested test logs breaking further in-test logs. | 306 | result = hdlr, _trace_file, _trace_depth | 
| 1185.43.7
by Martin Pool Do debug messages not through python logging | 307 | _trace_file = to_file | 
| 1534.11.7
by Robert Collins Test and correct the problem with nested test logs breaking further in-test logs. | 308 | _trace_depth += 1 | 
| 1534.4.25
by Robert Collins Add a --transport parameter to the test suite to set the default transport to be used in the test suite. | 309 | return result | 
| 310 | ||
| 311 | ||
| 1534.11.7
by Robert Collins Test and correct the problem with nested test logs breaking further in-test logs. | 312 | def disable_test_log((test_log_hdlr, old_trace_file, old_trace_depth)): | 
| 1534.4.25
by Robert Collins Add a --transport parameter to the test suite to set the default transport to be used in the test suite. | 313 | _bzr_logger.removeHandler(test_log_hdlr) | 
| 1641.2.1
by Olaf Conradi Close logging handler on disabling the test log. This will remove the | 314 | test_log_hdlr.close() | 
| 1534.11.7
by Robert Collins Test and correct the problem with nested test logs breaking further in-test logs. | 315 | global _trace_file | 
| 316 | global _trace_depth | |
| 1534.4.25
by Robert Collins Add a --transport parameter to the test suite to set the default transport to be used in the test suite. | 317 | _trace_file = old_trace_file | 
| 1534.11.7
by Robert Collins Test and correct the problem with nested test logs breaking further in-test logs. | 318 | _trace_depth = old_trace_depth | 
| 319 | if not _trace_depth: | |
| 320 | enable_default_logging() | |
| 1185.33.13
by Martin Pool Hide more stuff in bzrlib.trace | 321 | |
| 322 | ||
| 1740.5.2
by Martin Pool Improved tests for display of exceptions. | 323 | def report_exception(exc_info, err_file): | 
| 2830.2.1
by Martin Pool If TestCase.run_bzr hits an internal exception, don't catch it but rather propagate up into the test suite | 324 | """Report an exception to err_file (typically stderr) and to .bzr.log. | 
| 2713.2.1
by Martin Pool Return exitcode 4 if an internal error occurs | 325 | |
| 326 |     This will show either a full traceback or a short message as appropriate.
 | |
| 327 | ||
| 328 |     :return: The appropriate exit code for this error.
 | |
| 329 |     """
 | |
| 1740.5.3
by Martin Pool Cleanup more exception-formatting code | 330 | exc_type, exc_object, exc_tb = exc_info | 
| 1711.2.86
by John Arbash Meinel Restore logging of full traceback. Helps with debugging tests. | 331 |     # Log the full traceback to ~/.bzr.log
 | 
| 332 | log_exception_quietly() | |
| 1740.5.3
by Martin Pool Cleanup more exception-formatting code | 333 | if (isinstance(exc_object, IOError) | 
| 334 | and getattr(exc_object, 'errno', None) == errno.EPIPE): | |
| 2911.6.1
by Blake Winton Change 'print >> f,'s to 'f.write('s. | 335 | err_file.write("bzr: broken pipe\n") | 
| 2713.2.1
by Martin Pool Return exitcode 4 if an internal error occurs | 336 | return errors.EXIT_ERROR | 
| 1740.5.3
by Martin Pool Cleanup more exception-formatting code | 337 | elif isinstance(exc_object, KeyboardInterrupt): | 
| 2911.6.1
by Blake Winton Change 'print >> f,'s to 'f.write('s. | 338 | err_file.write("bzr: interrupted\n") | 
| 2713.2.1
by Martin Pool Return exitcode 4 if an internal error occurs | 339 | return errors.EXIT_ERROR | 
| 2067.3.2
by Martin Pool Error cleanup review comments: | 340 | elif not getattr(exc_object, 'internal_error', True): | 
| 1740.5.6
by Martin Pool Clean up many exception classes. | 341 | report_user_error(exc_info, err_file) | 
| 2713.2.1
by Martin Pool Return exitcode 4 if an internal error occurs | 342 | return errors.EXIT_ERROR | 
| 1740.5.6
by Martin Pool Clean up many exception classes. | 343 | elif isinstance(exc_object, (OSError, IOError)): | 
| 344 |         # Might be nice to catch all of these and show them as something more
 | |
| 345 |         # specific, but there are too many cases at the moment.
 | |
| 1740.5.1
by Martin Pool When an unhandled exception occurs, write the traceback to stderr. | 346 | report_user_error(exc_info, err_file) | 
| 2713.2.1
by Martin Pool Return exitcode 4 if an internal error occurs | 347 | return errors.EXIT_ERROR | 
| 1740.5.1
by Martin Pool When an unhandled exception occurs, write the traceback to stderr. | 348 | else: | 
| 1551.9.3
by Aaron Bentley Revert buggy apport changes | 349 | report_bug(exc_info, err_file) | 
| 2713.2.1
by Martin Pool Return exitcode 4 if an internal error occurs | 350 | return errors.EXIT_INTERNAL_ERROR | 
| 1740.5.1
by Martin Pool When an unhandled exception occurs, write the traceback to stderr. | 351 | |
| 352 | ||
| 353 | # TODO: Should these be specially encoding the output?
 | |
| 354 | def report_user_error(exc_info, err_file): | |
| 2095.5.1
by Martin Pool Add new -Derror global option to always display tracebacks | 355 | """Report to err_file an error that's not an internal error. | 
| 356 | ||
| 357 |     These don't get a traceback unless -Derror was given.
 | |
| 358 |     """
 | |
| 2095.5.2
by Martin Pool save commit message if commit fails (#32054) | 359 | if 'error' in debug.debug_flags: | 
| 2095.5.1
by Martin Pool Add new -Derror global option to always display tracebacks | 360 | report_bug(exc_info, err_file) | 
| 361 |         return
 | |
| 2911.6.3
by Blake Winton Implemented suggestions from John Arbash Meinel. | 362 | err_file.write("bzr: ERROR: %s\n" % (exc_info[1],)) | 
| 1740.5.1
by Martin Pool When an unhandled exception occurs, write the traceback to stderr. | 363 | |
| 364 | ||
| 365 | def report_bug(exc_info, err_file): | |
| 1740.5.2
by Martin Pool Improved tests for display of exceptions. | 366 | """Report an exception that probably indicates a bug in bzr""" | 
| 1740.5.1
by Martin Pool When an unhandled exception occurs, write the traceback to stderr. | 367 | import traceback | 
| 368 | exc_type, exc_object, exc_tb = exc_info | |
| 2911.6.1
by Blake Winton Change 'print >> f,'s to 'f.write('s. | 369 | err_file.write("bzr: ERROR: %s.%s: %s\n" % ( | 
| 370 | exc_type.__module__, exc_type.__name__, exc_object)) | |
| 371 | err_file.write('\n') | |
| 1740.5.2
by Martin Pool Improved tests for display of exceptions. | 372 | traceback.print_exception(exc_type, exc_object, exc_tb, file=err_file) | 
| 2911.6.1
by Blake Winton Change 'print >> f,'s to 'f.write('s. | 373 | err_file.write('\n') | 
| 374 | err_file.write('bzr %s on python %s (%s)\n' % \ | |
| 1740.5.3
by Martin Pool Cleanup more exception-formatting code | 375 | (bzrlib.__version__, | 
| 376 | '.'.join(map(str, sys.version_info)), | |
| 2911.6.1
by Blake Winton Change 'print >> f,'s to 'f.write('s. | 377 | sys.platform)) | 
| 378 | err_file.write('arguments: %r\n' % sys.argv) | |
| 2842.1.1
by Martin Pool Report locale, encodings and plugins in traceback | 379 | err_file.write( | 
| 380 | 'encoding: %r, fsenc: %r, lang: %r\n' % ( | |
| 381 | osutils.get_user_encoding(), sys.getfilesystemencoding(), | |
| 382 | os.environ.get('LANG'))) | |
| 2842.1.2
by Martin Pool Also include plugin path and version in traceback | 383 | err_file.write("plugins:\n") | 
| 384 | for name, a_plugin in sorted(plugin.plugins().items()): | |
| 385 | err_file.write(" %-20s %s [%s]\n" % | |
| 386 | (name, a_plugin.path(), a_plugin.__version__)) | |
| 2842.1.1
by Martin Pool Report locale, encodings and plugins in traceback | 387 | err_file.write( | 
| 3092.2.1
by Martin Pool Ask people to report bugs to Launchpad, and mention more support options | 388 | """\
 | 
| 389 | *** Bazaar has encountered an internal error.
 | |
| 390 |     Please report a bug at https://bugs.launchpad.net/bzr/+filebug
 | |
| 391 |     including this traceback, and a description of what you
 | |
| 392 |     were doing when the error occurred.
 | |
| 393 | """) |