From b5f1783a62e55bd52acb2d48b4eb6464c4fb16c6 Mon Sep 17 00:00:00 2001 From: SomberNight Date: Fri, 17 Nov 2023 11:29:38 +0000 Subject: [PATCH] plugins: better error and logging on duplicate plugins (=plugin name collision) This assert is currently failing in pyinstaller builds (probably have been since it was added in 552bfb589ac218b909c81efe9fdc5388d5926321). Looks like the pyinstaller binaries include two copies of the hw_wallet and the jade plugins. This likely has been the case for years, we just never noticed. -- but it started triggering the new assert. ``` 2.78 | I | plugin | iter_modules=[ ModuleInfo(module_finder=FileFinder('C:\\Program Files (x86)\\Electrum\\electrum\\plugins'), name='audio_modem', ispkg=True), ModuleInfo(module_finder=FileFinder('C:\\Program Files (x86)\\Electrum\\electrum\\plugins'), name='bitbox02', ispkg=True), ModuleInfo(module_finder=FileFinder('C:\\Program Files (x86)\\Electrum\\electrum\\plugins'), name='coldcard', ispkg=True), ModuleInfo(module_finder=FileFinder('C:\\Program Files (x86)\\Electrum\\electrum\\plugins'), name='cosigner_pool', ispkg=True), ModuleInfo(module_finder=FileFinder('C:\\Program Files (x86)\\Electrum\\electrum\\plugins'), name='digitalbitbox', ispkg=True), ModuleInfo(module_finder=FileFinder('C:\\Program Files (x86)\\Electrum\\electrum\\plugins'), name='hw_wallet', ispkg=True), ModuleInfo(module_finder=FileFinder('C:\\Program Files (x86)\\Electrum\\electrum\\plugins'), name='jade', ispkg=True), ModuleInfo(module_finder=FileFinder('C:\\Program Files (x86)\\Electrum\\electrum\\plugins'), name='keepkey', ispkg=True), ModuleInfo(module_finder=FileFinder('C:\\Program Files (x86)\\Electrum\\electrum\\plugins'), name='labels', ispkg=True), ModuleInfo(module_finder=FileFinder('C:\\Program Files (x86)\\Electrum\\electrum\\plugins'), name='ledger', ispkg=True), ModuleInfo(module_finder=FileFinder('C:\\Program Files (x86)\\Electrum\\electrum\\plugins'), name='payserver', ispkg=True), ModuleInfo(module_finder=FileFinder('C:\\Program Files (x86)\\Electrum\\electrum\\plugins'), name='revealer', ispkg=True), ModuleInfo(module_finder=FileFinder('C:\\Program Files (x86)\\Electrum\\electrum\\plugins'), name='safe_t', ispkg=True), ModuleInfo(module_finder=FileFinder('C:\\Program Files (x86)\\Electrum\\electrum\\plugins'), name='swapserver', ispkg=True), ModuleInfo(module_finder=FileFinder('C:\\Program Files (x86)\\Electrum\\electrum\\plugins'), name='trezor', ispkg=True), ModuleInfo(module_finder=FileFinder('C:\\Program Files (x86)\\Electrum\\electrum\\plugins'), name='trustedcoin', ispkg=True), ModuleInfo(module_finder=FileFinder('C:\\Program Files (x86)\\Electrum\\electrum\\plugins'), name='virtualkeyboard', ispkg=True), ModuleInfo(module_finder=, name='hw_wallet', ispkg=True), ModuleInfo(module_finder=, name='jade', ispkg=True)] ``` --- electrum/plugin.py | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/electrum/plugin.py b/electrum/plugin.py index 631f6a388..4be5d323d 100644 --- a/electrum/plugin.py +++ b/electrum/plugin.py @@ -80,7 +80,8 @@ class Plugins(DaemonThread): """ if cls._all_found_plugins is None: cls._all_found_plugins = dict() - for loader, name, ispkg in pkgutil.iter_modules([cls.pkgpath]): + iter_modules = list(pkgutil.iter_modules([cls.pkgpath])) + for loader, name, ispkg in iter_modules: full_name = f'electrum.plugins.{name}' spec = importlib.util.find_spec(full_name) if spec is None: # pkgutil found it but importlib can't ?! @@ -94,7 +95,9 @@ class Plugins(DaemonThread): except Exception as e: raise Exception(f"Error pre-loading {full_name}: {repr(e)}") from e d = module.__dict__ - assert name not in cls._all_found_plugins + if name in cls._all_found_plugins: + _logger.info(f"Found the following plugin modules: {iter_modules=}") + raise Exception(f"duplicate plugins? for {name=}") cls._all_found_plugins[name] = d return cls._all_found_plugins