Improve sandboxing of broken extensions.
Review Request #10959 — Created March 17, 2020 and submitted
When loading extensions, we attempt to catch some common initialization
errors and present them in the extension manager interface, so that
developers or end users have a sense of what's going on. This has worked
fine for extensions involving the initialization of the extenison
itself, but didn't cover issues like syntax errors, issues with the
administration URLs, media installation, or others.
This change attempts improve upon this by capturing more failures that
can occur and insulating the rest of the product from those failures,
ensuring we don't, for instance, have stale extension state sitting around.
Along with this, it tries bullet-proof signal management for extensions
so a bad handler can't further break things during the enabling or
disabling of an extension.
Hit this on release-2.0.x with some older extensions on Django 1.11,
and with old Python 2 code on Python 3. Verified that various issues
(such as half-loaded extensions, extension state ref count inconsistencies,
and issues re-enabling extensions) weren't hit.
Unit tests pass. Note that there are no new unit tests in this change, and
that's partly because the extension test suite was completely redone between
Djblets 1.0 and 2.0. There's some work in the queue on improving tests for
this for 2.0.
F821 undefined name 'ext_class'
Fixed a bad variable reference in a logging statement when uninitializing an extension.
Revision 2 (+202 -122)
Checks run (2 succeeded)