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
71
71
except ImportError, e:
72
72
trace.mutter("couldn't find apport bug-reporting library: %s" % e)
74
73
except Exception, e:
75
74
# this should only happen if apport is installed but it didn't
76
75
# work, eg because of an io error writing the crash file
77
stderr.write("bzr: failed to report crash using apport:\n "
76
trace.mutter("bzr: failed to report crash using apport: %r" % e)
77
trace.log_exception_quietly()
80
78
return report_bug_legacy(exc_info, stderr)
84
82
"""Report a bug by just printing a message to the user."""
85
83
trace.print_exception(exc_info, err_file)
86
84
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)
87
err_file.write(textwrap.fill(l,
88
width=78, subsequent_indent=' ') + '\n')
89
print_wrapped('bzr %s on python %s (%s)\n' % \
91
bzrlib._format_version_tuple(sys.version_info),
92
platform.platform(aliased=1)))
93
print_wrapped('arguments: %r\n' % sys.argv)
94
print_wrapped(textwrap.fill(
95
'plugins: ' + plugin.format_concise_plugin_list(),
97
subsequent_indent=' ',
93
100
'encoding: %r, fsenc: %r, lang: %r\n' % (
94
101
osutils.get_user_encoding(), sys.getfilesystemencoding(),
95
102
os.environ.get('LANG')))
96
err_file.write("plugins:\n")
97
err_file.write(_format_plugin_list())
103
# We used to show all the plugins here, but it's too verbose.
100
106
"*** Bazaar has encountered an internal error. This probably indicates a\n"
101
107
" bug in Bazaar. You can help us fix it by filing a bug report at\n"
102
108
" https://bugs.launchpad.net/bzr/+filebug\n"
112
118
# this function is based on apport_package_hook.py, but omitting some of the
113
119
# 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
121
# This import is apparently not used, but we're doing it so that if the
122
# import fails, the exception will be caught at a higher level and we'll
123
# report the error by other means.
119
126
crash_filename = _write_apport_report_to_file(exc_info)
143
150
exc_type, exc_object, exc_tb = exc_info
146
# add_proc_info gives you the memory map of the process, which is not so
147
# useful for Bazaar but does tell you what binary libraries are loaded.
148
# More importantly it sets the ExecutablePath, InterpreterPath, etc.
153
# add_proc_info sets the ExecutablePath, InterpreterPath, etc.
149
154
pr.add_proc_info()
155
# It also adds ProcMaps which for us is rarely useful and mostly noise, so
150
158
pr.add_user_info()
152
160
# Package and SourcePackage are needed so that apport will report about even
256
264
def _format_plugin_list():
258
for name, a_plugin in sorted(plugin.plugins().items()):
259
plugin_lines.append(" %-20s %s [%s]" %
260
(name, a_plugin.path(), a_plugin.__version__))
261
return '\n'.join(plugin_lines)
265
return ''.join(plugin.describe_plugins(show_paths=True))
264
268
def _format_module_list():