aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMarcus Tillmanns <[email protected]>2025-02-10 16:02:22 +0100
committerMarcus Tillmanns <[email protected]>2025-02-10 16:06:52 +0000
commit5240e8c7bf1b733b64c94286ccc13425a35d829b (patch)
treebf1ccd81653e0960d24ca070ff83a70e319f4421
parentb4b46fa38f72a0b27709d984b87516cd281b4e09 (diff)
ExtensionSystem: Split update into remove and install
Change-Id: Ib048d5c889bb5ac463309ea15486e3f226d84a2e Reviewed-by: Eike Ziller <[email protected]>
-rw-r--r--src/app/main.cpp5
-rw-r--r--src/libs/extensionsystem/pluginmanager.cpp78
-rw-r--r--src/libs/extensionsystem/pluginmanager.h3
-rw-r--r--src/libs/extensionsystem/pluginmanager_p.h8
-rw-r--r--src/libs/extensionsystem/pluginspec.cpp12
-rw-r--r--src/libs/extensionsystem/pluginspec.h2
-rw-r--r--src/plugins/coreplugin/plugininstallwizard.cpp8
-rw-r--r--src/plugins/lua/luaplugin.cpp13
8 files changed, 53 insertions, 76 deletions
diff --git a/src/app/main.cpp b/src/app/main.cpp
index 4af2efe4482..bf05a8946ec 100644
--- a/src/app/main.cpp
+++ b/src/app/main.cpp
@@ -839,6 +839,8 @@ int main(int argc, char **argv)
// Make sure we honor the system's proxy settings
QNetworkProxyFactory::setUseSystemConfiguration(true);
+ PluginManager::removePluginsAfterRestart();
+
// We need to install plugins before we scan for them.
PluginManager::installPluginsAfterRestart();
@@ -847,9 +849,6 @@ int main(int argc, char **argv)
PluginManager::setPluginPaths(
getPluginPaths() + Utils::transform(pluginPaths, &FilePath::fromUserInput));
- // We need to remove plugins once we have scanned for them.
- PluginManager::removePluginsAfterRestart();
-
QMap<QString, QString> foundAppOptions;
if (pluginArguments.size() > 1) {
QMap<QString, bool> appOptions;
diff --git a/src/libs/extensionsystem/pluginmanager.cpp b/src/libs/extensionsystem/pluginmanager.cpp
index 67743aea2cd..b439ede5361 100644
--- a/src/libs/extensionsystem/pluginmanager.cpp
+++ b/src/libs/extensionsystem/pluginmanager.cpp
@@ -357,15 +357,15 @@ void PluginManager::installPluginsAfterRestart()
d->installPluginsAfterRestart();
}
-void PluginManager::removePluginOnRestart(const QString &id)
+Result PluginManager::removePluginOnRestart(const QString &id)
{
- d->removePluginOnNextRestart(id);
+ return d->removePluginOnRestart(id);
}
void PluginManager::installPluginOnRestart(
const Utils::FilePath &source, const Utils::FilePath &destination)
{
- d->installPluginOnNextRestart(source, destination);
+ d->installPluginOnRestart(source, destination);
}
/*!
@@ -1710,11 +1710,6 @@ PluginSpec *PluginManager::specForPlugin(IPlugin *plugin)
return findOrDefault(d->pluginSpecs, equal(&PluginSpec::plugin, plugin));
}
-bool PluginManager::takePluginIdForRemoval(const QString &id)
-{
- return d->m_pluginsToRemove.remove(id);
-}
-
static QString pluginListString(const QSet<PluginSpec *> &plugins)
{
QStringList names = Utils::transform<QList>(plugins, &PluginSpec::name);
@@ -1925,36 +1920,6 @@ static const FilePaths pluginFiles(const FilePaths &pluginPaths)
return pluginFiles;
}
-bool PluginManagerPrivate::removePlugin(const QString &pluginId)
-{
- PluginSpec *existingSpec
- = Utils::findOrDefault(pluginSpecs, Utils::equal(&PluginSpec::id, pluginId));
-
- if (existingSpec) {
- QTC_ASSERT(existingSpec->state() == PluginSpec::State::Resolved, return false);
-
- const Result removeResult = existingSpec->removePluginFiles();
- if (!removeResult) {
- qCWarning(pluginLog) << "Failed to remove plugin files for" << pluginId << ":"
- << removeResult.error();
- return false;
- }
-
- for (QList<PluginSpec *> &category : pluginCategories) {
- category.removeOne(existingSpec);
- }
-
- if (pluginSpecs.removeOne(existingSpec)) {
- delete existingSpec;
- return true;
- }
- }
-
- // This is used by other plugin managers like Lua that is not loaded yet.
- m_pluginsToRemove << pluginId;
- return true;
-}
-
void PluginManagerPrivate::addPlugins(const PluginSpecs &specs)
{
pluginSpecs += specs;
@@ -1987,11 +1952,24 @@ void PluginManagerPrivate::addPlugins(const PluginSpecs &specs)
static const char PLUGINS_TO_INSTALL_KEY[] = "PluginsToInstall";
static const char PLUGINS_TO_REMOVE_KEY[] = "PluginsToRemove";
-void PluginManagerPrivate::removePluginOnNextRestart(const QString &pluginId)
+Result PluginManagerPrivate::removePluginOnRestart(const QString &pluginId)
{
- settings->setValue(
- PLUGINS_TO_REMOVE_KEY, settings->value(PLUGINS_TO_REMOVE_KEY).toStringList() << pluginId);
+ const PluginSpec *pluginSpec
+ = findOrDefault(pluginSpecs, Utils::equal(&PluginSpec::id, pluginId));
+
+ if (!pluginSpec)
+ return Result::Error(Tr::tr("Plugin not found."));
+
+ const expected_str<FilePaths> filePaths = pluginSpec->filesToUninstall();
+ if (!filePaths)
+ return Result::Error(filePaths.error());
+
+ const QVariantList list = Utils::transform(*filePaths, &FilePath::toVariant);
+
+ settings->setValue(PLUGINS_TO_REMOVE_KEY, settings->value(PLUGINS_TO_REMOVE_KEY).toList() + list);
+
settings->sync();
+ return Result::Ok;
}
static QList<QPair<FilePath, FilePath>> readPluginInstallList(QtcSettings *settings)
@@ -2009,7 +1987,7 @@ static QList<QPair<FilePath, FilePath>> readPluginInstallList(QtcSettings *setti
return installList;
}
-void PluginManagerPrivate::installPluginOnNextRestart(
+void PluginManagerPrivate::installPluginOnRestart(
const Utils::FilePath &src, const Utils::FilePath &dest)
{
const QList<QPair<FilePath, FilePath>> list = readPluginInstallList(settings)
@@ -2028,9 +2006,19 @@ void PluginManagerPrivate::installPluginOnNextRestart(
void PluginManagerPrivate::removePluginsAfterRestart()
{
- const QStringList removeList = settings->value(PLUGINS_TO_REMOVE_KEY).toStringList();
- for (const QString &pluginId : removeList)
- removePlugin(pluginId);
+ const FilePaths removeList
+ = Utils::transform(settings->value(PLUGINS_TO_REMOVE_KEY).toList(), &FilePath::fromVariant);
+
+ for (const FilePath &path : removeList) {
+ Result r = Result::Error(Tr::tr("It does not exist."));
+ if (path.isFile())
+ r = path.removeFile();
+ else if (path.isDir())
+ r = path.removeRecursively();
+
+ if (!r)
+ qCWarning(pluginLog()) << "Failed to remove" << path << ":" << r.error();
+ }
settings->remove(PLUGINS_TO_REMOVE_KEY);
}
diff --git a/src/libs/extensionsystem/pluginmanager.h b/src/libs/extensionsystem/pluginmanager.h
index 7ea388b3ce4..75230fe8823 100644
--- a/src/libs/extensionsystem/pluginmanager.h
+++ b/src/libs/extensionsystem/pluginmanager.h
@@ -80,13 +80,12 @@ public:
static const QSet<PluginSpec *> pluginsRequiredByPlugin(PluginSpec *spec);
static void checkForProblematicPlugins();
static PluginSpec *specForPlugin(IPlugin *plugin);
- static bool takePluginIdForRemoval(const QString &id);
static void addPlugins(const QVector<PluginSpec *> &specs);
static void reInstallPlugins();
- static void removePluginOnRestart(const QString &id);
+ static Utils::Result removePluginOnRestart(const QString &id);
static void installPluginOnRestart(
const Utils::FilePath &source, const Utils::FilePath &destination);
diff --git a/src/libs/extensionsystem/pluginmanager_p.h b/src/libs/extensionsystem/pluginmanager_p.h
index 3855b3c016b..9cb21f66a99 100644
--- a/src/libs/extensionsystem/pluginmanager_p.h
+++ b/src/libs/extensionsystem/pluginmanager_p.h
@@ -52,8 +52,6 @@ public:
void loadPluginsAtRuntime(const QSet<PluginSpec *> &plugins);
void addPlugins(const QVector<PluginSpec *> &specs);
- bool removePlugin(const QString &pluginId);
-
void shutdown();
void setPluginPaths(const Utils::FilePaths &paths);
const QVector<ExtensionSystem::PluginSpec *> loadQueue();
@@ -77,8 +75,8 @@ public:
void removePluginsAfterRestart();
void installPluginsAfterRestart();
- void removePluginOnNextRestart(const QString &pluginId);
- void installPluginOnNextRestart(const Utils::FilePath &src, const Utils::FilePath &dest);
+ Utils::Result removePluginOnRestart(const QString &pluginId);
+ void installPluginOnRestart(const Utils::FilePath &src, const Utils::FilePath &dest);
class TestSpec {
public:
@@ -152,8 +150,6 @@ public:
PluginManager::ProcessData m_creatorProcessData;
- QSet<QString> m_pluginsToRemove;
-
private:
PluginManager *q;
diff --git a/src/libs/extensionsystem/pluginspec.cpp b/src/libs/extensionsystem/pluginspec.cpp
index 7cc3221312a..8dacb20cb7b 100644
--- a/src/libs/extensionsystem/pluginspec.cpp
+++ b/src/libs/extensionsystem/pluginspec.cpp
@@ -1453,27 +1453,27 @@ QList<PluginSpec *> pluginSpecsFromArchive(const Utils::FilePath &path)
return results;
}
-Utils::Result PluginSpec::removePluginFiles() const
+expected_str<FilePaths> PluginSpec::filesToUninstall() const
{
if (isSystemPlugin())
- return Result::Error(Tr::tr("Cannot remove system plugins."));
+ return make_unexpected(Tr::tr("Cannot remove system plugins."));
// Try to figure out where we are ...
- const Utils::FilePaths pluginPaths = PluginManager::pluginPaths();
+ const FilePaths pluginPaths = PluginManager::pluginPaths();
for (const FilePath &pluginPath : pluginPaths) {
if (location().isChildOf(pluginPath)) {
const FilePath rootFolder = location().relativeChildPath(pluginPath);
if (rootFolder.isEmpty())
- return Result::Error(Tr::tr("Could not determine root folder."));
+ return make_unexpected(Tr::tr("Could not determine root folder."));
const FilePath pathToDelete = pluginPath
/ rootFolder.pathComponents().first().toString();
- return pathToDelete.removeRecursively();
+ return FilePaths{pathToDelete};
}
}
- return filePath().removeFile();
+ return FilePaths{filePath()};
}
bool PluginSpec::isSystemPlugin() const
diff --git a/src/libs/extensionsystem/pluginspec.h b/src/libs/extensionsystem/pluginspec.h
index 39717f0ed61..39ed77469c8 100644
--- a/src/libs/extensionsystem/pluginspec.h
+++ b/src/libs/extensionsystem/pluginspec.h
@@ -161,7 +161,7 @@ public:
virtual Utils::FilePath installLocation(bool inUserFolder) const = 0;
- virtual Utils::Result removePluginFiles() const;
+ virtual Utils::expected_str<Utils::FilePaths> filesToUninstall() const;
virtual bool isSystemPlugin() const;
protected:
diff --git a/src/plugins/coreplugin/plugininstallwizard.cpp b/src/plugins/coreplugin/plugininstallwizard.cpp
index fb06b9dc6ca..50b21e1025b 100644
--- a/src/plugins/coreplugin/plugininstallwizard.cpp
+++ b/src/plugins/coreplugin/plugininstallwizard.cpp
@@ -515,6 +515,14 @@ InstallResult executePluginInstallWizard(const FilePath &archive, bool prepareFo
/ extensionId(data.pluginSpec.get());
if (prepareForUpdate) {
+ const Result result = ExtensionSystem::PluginManager::removePluginOnRestart(
+ data.pluginSpec->id());
+ if (!result) {
+ qWarning() << "Failed to remove plugin" << data.pluginSpec->id() << ":"
+ << result.error();
+ return false;
+ }
+
if (hasLibSuffix(data.sourcePath)) {
ExtensionSystem::PluginManager::installPluginOnRestart(
data.pluginSpec->filePath(), installPath);
diff --git a/src/plugins/lua/luaplugin.cpp b/src/plugins/lua/luaplugin.cpp
index 27107364b09..fa66622a462 100644
--- a/src/plugins/lua/luaplugin.cpp
+++ b/src/plugins/lua/luaplugin.cpp
@@ -446,19 +446,6 @@ public:
continue;
}
- if (PluginManager::takePluginIdForRemoval((*result)->id())) {
- auto removeResult = (*result)->removePluginFiles();
- if (!removeResult) {
- qWarning() << "Failed to remove plugin files" << script << ":"
- << removeResult.error();
- MessageManager::writeFlashing(
- Tr::tr("Failed to remove plugin files of %1: %2")
- .arg((*result)->id())
- .arg(removeResult.error()));
- }
- continue;
- }
-
plugins.insert(*result);
}
}