Fix bug when updating add-ons automatically - #18971
Merged
Merged
Conversation
nvdaes
marked this pull request as ready for review
September 23, 2025 04:15
seanbudd
reviewed
Sep 23, 2025
seanbudd
approved these changes
Sep 23, 2025
5 tasks done
LeonarddeR
added a commit
to LeonarddeR/nvda
that referenced
this pull request
Aug 22, 2026
…ddonImports _cleanupAddonImports now matches modules on their file path against the add-on directory, case insensitively and anchored at a path separator. Modules without a file attribute are skipped. Add unit tests covering the cleanup. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
LeonarddeR
added a commit
to LeonarddeR/nvda
that referenced
this pull request
Aug 25, 2026
…ddonImports _cleanupAddonImports now matches modules on their file path against the add-on directory, case insensitively and anchored at a path separator. Modules without a file attribute are skipped. Add unit tests covering the cleanup. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
seanbudd
pushed a commit
that referenced
this pull request
Aug 26, 2026
Fixup for #18971. Summary of the issue: Installing or removing an add-on can run install tasks. These tasks can import modules from the add-on. Python caches every import in sys.modules. NVDA must drop the add-on's modules from that cache afterwards. Otherwise a later import returns the cached old module instead of the file on disk. Modules the tasks load directly are tracked in _importedAddonModules and dropped reliably. Modules imported indirectly, for example through a relative import inside the add-on, are not tracked. For those, _cleanupAddonImports scans every module imported during the task and drops each one whose file is inside the add-on directory. That scan has been broken twice: Remove add-on modules imported in install tasks to avoid conflicts between add-ons #15967 introduced it reading module.__file__ directly. Modules without a __file__, such as built-in modules, made it crash with AttributeError. Fix bug when updating add-ons automatically #18971 fixed that crash by reading module.__name__ instead. A module name is not a file path, so the scan matches nothing. Since 2026.1 it drops nothing. Result: updating an add-on can break on the first start after the update. The old version's uninstall task runs first and leaves old modules in the cache. The new version then partly imports old code. A second restart of NVDA resolves the situation regardless. Description of user facing changes: Updated add-ons that perform install tasks no longer raise intermittent errors on the first start of NVDA after the update. Description of developer facing changes: None. Description of development approach: The approach of #15967 was the correct one: a module belongs to the add-on when its file is inside the add-on directory. This change returns to matching on the file path and fixes the three defects of that implementation: The file is read with getattr(module, "__file__", None). Modules without a __file__ are skipped instead of crashing the scan, so the error fixed by Fix bug when updating add-ons automatically #18971 stays fixed. The file path and the add-on directory are compared through os.path.normcase, so case differences match. The directory prefix ends with a path separator, so a sibling directory such as myAddonExtra no longer matches myAddon. Each defect is covered by a unit test. The loop over the tracked modules is unchanged.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Link to issue number:
Fixes #18965
Summary of the issue:
When NVDA is configured to update add-ons automatically without provide notifications, add-ons aren't updated and an error is produced.
Description of user facing changes:
NVDA can be configured to update add-ons automatically, and this should work as expected.
Description of developer facing changes:
None.
Description of development approach:
Use
wx.CallAfterto present a message informing that add-ons are been updated, in the_checkForUpdatableAddonsmethod of theUpdatableAddonsDialogclass, just after the condition to check that add-ons should be updated automatically, ensuring that this can be run in the main thread.Additionally, an error has been discovered and fixed in addonHandler, when installing an add-on which shows a message before installation.
Testing strategy:
Tested locally with clipContentsDesigner (which asks a question before installation) and resourceMonitor.
Known issues with pull request:
None.
Code Review Checklist: