/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: Vincent Ladeuil
  • Date: 2012-01-18 14:09:19 UTC
  • mto: This revision was merged to the branch mainline in revision 6468.
  • Revision ID: v.ladeuil+lp@free.fr-20120118140919-rlvdrhpc0nq1lbwi
Change set/remove to require a lock for the branch config files.

This means that tests (or any plugin for that matter) do not requires an
explicit lock on the branch anymore to change a single option. This also
means the optimisation becomes "opt-in" and as such won't be as
spectacular as it may be and/or harder to get right (nothing fails
anymore).

This reduces the diff by ~300 lines.

Code/tests that were updating more than one config option is still taking
a lock to at least avoid some IOs and demonstrate the benefits through
the decreased number of hpss calls.

The duplication between BranchStack and BranchOnlyStack will be removed
once the same sharing is in place for local config files, at which point
the Stack class itself may be able to host the changes.

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
14
14
# along with this program; if not, write to the Free Software
15
15
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
16
16
 
17
 
 
18
17
"""Handling and reporting crashes.
19
18
 
20
19
A crash is an exception propagated up almost to the top level of Bazaar.
21
20
 
22
21
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
 
22
crash using apport into its /var/crash spool directory, from where the user
24
23
can either manually send it to Launchpad.  In some cases (at least Ubuntu
25
24
development releases), Apport may pop up a window asking if they want
26
25
to send it.
37
36
-Dno_apport.
38
37
"""
39
38
 
 
39
from __future__ import absolute_import
 
40
 
40
41
# for interactive testing, try the 'bzr assert-fail' command 
41
42
# or see http://code.launchpad.net/~mbp/bzr/bzr-fail
42
43
#
70
71
            return
71
72
    except ImportError, e:
72
73
        trace.mutter("couldn't find apport bug-reporting library: %s" % e)
73
 
        pass
74
74
    except Exception, e:
75
75
        # this should only happen if apport is installed but it didn't
76
76
        # work, eg because of an io error writing the crash file
77
 
        stderr.write("bzr: failed to report crash using apport:\n "
78
 
            "    %r\n" % e)
79
 
        pass
 
77
        trace.mutter("bzr: failed to report crash using apport: %r" % e)
 
78
        trace.log_exception_quietly()
80
79
    return report_bug_legacy(exc_info, stderr)
81
80
 
82
81
 
84
83
    """Report a bug by just printing a message to the user."""
85
84
    trace.print_exception(exc_info, err_file)
86
85
    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(
 
86
    import textwrap
 
87
    def print_wrapped(l):
 
88
        err_file.write(textwrap.fill(l,
 
89
            width=78, subsequent_indent='    ') + '\n')
 
90
    print_wrapped('bzr %s on python %s (%s)\n' % \
 
91
        (bzrlib.__version__,
 
92
        bzrlib._format_version_tuple(sys.version_info),
 
93
        platform.platform(aliased=1)))
 
94
    print_wrapped('arguments: %r\n' % sys.argv)
 
95
    print_wrapped(textwrap.fill(
 
96
        'plugins: ' + plugin.format_concise_plugin_list(),
 
97
        width=78,
 
98
        subsequent_indent='    ',
 
99
        ) + '\n')
 
100
    print_wrapped(
93
101
        'encoding: %r, fsenc: %r, lang: %r\n' % (
94
102
            osutils.get_user_encoding(), sys.getfilesystemencoding(),
95
103
            os.environ.get('LANG')))
96
 
    err_file.write("plugins:\n")
97
 
    err_file.write(_format_plugin_list())
 
104
    # We used to show all the plugins here, but it's too verbose.
98
105
    err_file.write(
99
 
        "\n\n"
 
106
        "\n"
100
107
        "*** Bazaar has encountered an internal error.  This probably indicates a\n"
101
108
        "    bug in Bazaar.  You can help us fix it by filing a bug report at\n"
102
109
        "        https://bugs.launchpad.net/bzr/+filebug\n"
112
119
    # this function is based on apport_package_hook.py, but omitting some of the
113
120
    # Ubuntu-specific policy about what to report and when
114
121
 
115
 
    # if the import fails, the exception will be caught at a higher level and
116
 
    # we'll report the error by other means
 
122
    # This import is apparently not used, but we're doing it so that if the
 
123
    # import fails, the exception will be caught at a higher level and we'll
 
124
    # report the error by other means.
117
125
    import apport
118
126
 
119
127
    crash_filename = _write_apport_report_to_file(exc_info)
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():