1
# Copyright (C) 2009, 2010 Canonical Ltd
1
# Copyright (C) 2009-2011 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
20
20
A crash is an exception propagated up almost to the top level of Bazaar.
22
22
If we have apport <https://launchpad.net/apport/>, we store a report of the
23
crash using apport into it's /var/crash spool directory, from where the user
23
crash using apport into its /var/crash spool directory, from where the user
24
24
can either manually send it to Launchpad. In some cases (at least Ubuntu
25
25
development releases), Apport may pop up a window asking if they want
33
33
In principle apport can run on any platform though as of Feb 2010 there seem
34
34
to be some portability bugs.
36
To force this off in bzr turn set APPORT_DISBLE in the environment or
36
To force this off in bzr turn set APPORT_DISABLE in the environment or
84
84
"""Report a bug by just printing a message to the user."""
85
85
trace.print_exception(exc_info, err_file)
86
86
err_file.write('\n')
87
err_file.write('bzr %s on python %s (%s)\n' % \
89
bzrlib._format_version_tuple(sys.version_info),
90
platform.platform(aliased=1)))
91
err_file.write('arguments: %r\n' % sys.argv)
89
err_file.write(textwrap.fill(l,
90
width=78, subsequent_indent=' ') + '\n')
91
print_wrapped('bzr %s on python %s (%s)\n' % \
93
bzrlib._format_version_tuple(sys.version_info),
94
platform.platform(aliased=1)))
95
print_wrapped('arguments: %r\n' % sys.argv)
96
print_wrapped(textwrap.fill(
97
'plugins: ' + plugin.format_concise_plugin_list(),
99
subsequent_indent=' ',
93
102
'encoding: %r, fsenc: %r, lang: %r\n' % (
94
103
osutils.get_user_encoding(), sys.getfilesystemencoding(),
95
104
os.environ.get('LANG')))
96
err_file.write("plugins:\n")
97
err_file.write(_format_plugin_list())
105
# We used to show all the plugins here, but it's too verbose.
100
108
"*** Bazaar has encountered an internal error. This probably indicates a\n"
101
109
" bug in Bazaar. You can help us fix it by filing a bug report at\n"
102
110
" https://bugs.launchpad.net/bzr/+filebug\n"
112
120
# this function is based on apport_package_hook.py, but omitting some of the
113
121
# Ubuntu-specific policy about what to report and when
115
# if the import fails, the exception will be caught at a higher level and
116
# we'll report the error by other means
123
# This import is apparently not used, but we're doing it so that if the
124
# import fails, the exception will be caught at a higher level and we'll
125
# report the error by other means.
119
128
crash_filename = _write_apport_report_to_file(exc_info)
143
152
exc_type, exc_object, exc_tb = exc_info
146
# add_proc_info gets the executable and interpreter path, which is needed,
147
# plus some less useful stuff like the memory map
155
# add_proc_info sets the ExecutablePath, InterpreterPath, etc.
148
156
pr.add_proc_info()
157
# It also adds ProcMaps which for us is rarely useful and mostly noise, so
149
160
pr.add_user_info()
151
162
# Package and SourcePackage are needed so that apport will report about even
165
176
pr['PythonLoadedModules'] = _format_module_list()
166
177
pr['BzrDebugFlags'] = pprint.pformat(debug.debug_flags)
179
# actually we'd rather file directly against the upstream product, but
180
# apport does seem to count on there being one in there; we might need to
181
# redirect it elsewhere anyhow
182
pr['SourcePackage'] = 'bzr'
183
pr['Package'] = 'bzr'
185
# tell apport to file directly against the bzr package using
186
# <https://bugs.launchpad.net/bzr/+bug/391015>
188
# XXX: unfortunately apport may crash later if the crashdb definition
190
pr['CrashDb'] = 'bzr'
168
192
tb_file = StringIO()
169
193
traceback.print_exception(exc_type, exc_object, exc_tb, file=tb_file)
170
194
pr['Traceback'] = tb_file.getvalue()
242
266
def _format_plugin_list():
244
for name, a_plugin in sorted(plugin.plugins().items()):
245
plugin_lines.append(" %-20s %s [%s]" %
246
(name, a_plugin.path(), a_plugin.__version__))
247
return '\n'.join(plugin_lines)
267
return ''.join(plugin.describe_plugins(show_paths=True))
250
270
def _format_module_list():