From fc3e3953a9c6a2241ec85b74f8a980f5bbe7c45b Mon Sep 17 00:00:00 2001 From: Alexander Bruy Date: Fri, 20 Oct 2023 11:29:20 +0300 Subject: [PATCH] unload active plugin before updating or reinstalling it (fix #54968) --- python/pyplugin_installer/installer.py | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/python/pyplugin_installer/installer.py b/python/pyplugin_installer/installer.py index d4ea51106ac..af546b5eaae 100644 --- a/python/pyplugin_installer/installer.py +++ b/python/pyplugin_installer/installer.py @@ -46,7 +46,7 @@ import qgis from qgis.core import Qgis, QgsApplication, QgsMessageLog, QgsNetworkAccessManager, QgsSettings, QgsSettingsTree, QgsNetworkRequestParameters from qgis.gui import QgsMessageBar, QgsPasswordLineEdit, QgsHelp from qgis.utils import (iface, startPlugin, unloadPlugin, loadPlugin, OverrideCursor, - reloadPlugin, updateAvailablePlugins, plugins_metadata_parser) + reloadPlugin, updateAvailablePlugins, plugins_metadata_parser, isPluginLoaded) from .installer_data import (repositories, plugins, officialRepo, reposGroup, removeDir) from .qgsplugininstallerinstallingdialog import QgsPluginInstallerInstallingDialog @@ -315,6 +315,11 @@ class QgsPluginInstaller(QObject): if QMessageBox.warning(iface.mainWindow(), self.tr("QGIS Python Plugin Installer"), self.tr("Are you sure you want to downgrade the plugin to the latest available version? The installed one is newer!"), QMessageBox.Yes, QMessageBox.No) == QMessageBox.No: return + # if plugin is active, unload it before update, see https://github.com/qgis/QGIS/issues/54968 + pluginWasLoaded = isPluginLoaded(plugin["id"]) + if pluginWasLoaded: + unloadPlugin(plugin["id"]) + dlg = QgsPluginInstallerInstallingDialog(iface.mainWindow(), plugin, stable=stable) dlg.exec_() @@ -322,6 +327,9 @@ class QgsPluginInstaller(QObject): if dlg.result(): error = True infoString = (self.tr("Plugin installation failed"), dlg.result()) + # download failed or aborted. If plugin was active before the update, let's try to load it back + if pluginWasLoaded and loadPlugin(plugin["id"]): + startPlugin(plugin["id"]) elif not QDir(plugin_path).exists(): error = True infoString = ( @@ -610,6 +618,10 @@ class QgsPluginInstaller(QObject): pluginDirectory = QDir.cleanPath(os.path.join(pluginsDirectory, pluginName)) + # if plugin is active, unload it before update, see https://github.com/qgis/QGIS/issues/54968 + if isPluginLoaded(pluginName): + unloadPlugin(pluginName) + # If the target directory already exists as a link, # remove the link without resolving QFile(pluginDirectory).remove()