/brz/remove-bazaar

To get this branch, use:
bzr branch http://gegoxaren.bato24.eu/bzr/brz/remove-bazaar

« back to all changes in this revision

Viewing changes to bzrlib/crash.py

  • Committer: John Arbash Meinel
  • Date: 2011-04-20 14:27:19 UTC
  • mto: This revision was merged to the branch mainline in revision 5837.
  • Revision ID: john@arbash-meinel.com-20110420142719-advs1k5vztqzbrgv
Fix bug #767177. Be more agressive with file.close() calls.

Our test suite gets a number of thread leaks and failures because it happens to get async
SFTPFile.close() calls. (if an SFTPFile closes due to __del__ it is done as an async request,
while if you call SFTPFile.close() it is done as a synchronous request.)
We have a couple other cases, probably. Namely SFTPTransport.get() also does an async
prefetch of the content, so if you don't .read() you'll also leak threads that think they
are doing work that you want.

The biggest change here, though, is using a try/finally in a generator, which is not 
python2.4 compatible.

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
 
# Copyright (C) 2009, 2010 Canonical Ltd
 
1
# Copyright (C) 2009-2011 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
20
20
A crash is an exception propagated up almost to the top level of Bazaar.
21
21
 
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
26
26
to send it.
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' % \
88
 
                       (bzrlib.__version__,
89
 
                        bzrlib._format_version_tuple(sys.version_info),
90
 
                        platform.platform(aliased=1)))
91
 
    err_file.write('arguments: %r\n' % sys.argv)
92
 
    err_file.write(
 
87
    import textwrap
 
88
    def print_wrapped(l):
 
89
        err_file.write(textwrap.fill(l,
 
90
            width=78, subsequent_indent='    ') + '\n')
 
91
    print_wrapped('bzr %s on python %s (%s)\n' % \
 
92
        (bzrlib.__version__,
 
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(),
 
98
        width=78,
 
99
        subsequent_indent='    ',
 
100
        ) + '\n')
 
101
    print_wrapped(
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.
98
106
    err_file.write(
99
 
        "\n\n"
 
107
        "\n"
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"
143
151
    exc_type, exc_object, exc_tb = exc_info
144
152
 
145
153
    pr = Report()
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.
 
154
    # add_proc_info sets the ExecutablePath, InterpreterPath, etc.
149
155
    pr.add_proc_info()
 
156
    # It also adds ProcMaps which for us is rarely useful and mostly noise, so
 
157
    # let's remove it.
 
158
    del pr['ProcMaps']
150
159
    pr.add_user_info()
151
160
 
152
161
    # Package and SourcePackage are needed so that apport will report about even
173
182
    pr['Package'] = 'bzr'
174
183
 
175
184
    # tell apport to file directly against the bzr package using 
176
 
    # <https://bugs.edge.launchpad.net/bzr/+bug/391015>
 
185
    # <https://bugs.launchpad.net/bzr/+bug/391015>
177
186
    #
178
187
    # XXX: unfortunately apport may crash later if the crashdb definition
179
188
    # file isn't present
254
263
 
255
264
 
256
265
def _format_plugin_list():
257
 
    plugin_lines = []
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)
 
266
    return ''.join(plugin.describe_plugins(show_paths=True))
262
267
 
263
268
 
264
269
def _format_module_list():