]> cloud.milkyroute.net Git - dolphin.git/blobdiff - src/views/versioncontrol/versioncontrolobserver.cpp
Merge branch 'release/21.08'
[dolphin.git] / src / views / versioncontrol / versioncontrolobserver.cpp
index 709d98e4268e93f3a133cd40e5158c8e5e686bd7..6766aa479a0b57dd2c7454ec40d6ddc2d0dedc88 100644 (file)
@@ -13,8 +13,9 @@
 #include "updateitemstatesthread.h"
 
 #include <KLocalizedString>
-#include <KService>
-#include <KServiceTypeTrader>
+#include <KPluginFactory>
+#include <KPluginLoader>
+#include <KPluginMetaData>
 
 #include <QTimer>
 
@@ -112,7 +113,7 @@ QList<QAction*> VersionControlObserver::actions(const KFileItemList& items) cons
         return m_plugin->versionControlActions(items);
     } else {
         QList<QAction*> actions;
-        for (const auto &plugin : qAsConst(m_plugins)) {
+        for (const QPointer<KVersionControlPlugin> &plugin : qAsConst(m_plugins)) {
             actions << plugin->outOfVersionControlActions(items);
         }
         return actions;
@@ -279,24 +280,33 @@ void VersionControlObserver::initPlugins()
         // all fileview version control plugins and remember them in 'plugins'.
         const QStringList enabledPlugins = VersionControlSettings::enabledPlugins();
 
-        const KService::List pluginServices = KServiceTypeTrader::self()->query(QStringLiteral("FileViewVersionControlPlugin"));
-        for (KService::List::ConstIterator it = pluginServices.constBegin(); it != pluginServices.constEnd(); ++it) {
-            if (enabledPlugins.contains((*it)->name())) {
-                KVersionControlPlugin* plugin = (*it)->createInstance<KVersionControlPlugin>(this);
-                if (plugin) {
-                    connect(plugin, &KVersionControlPlugin::itemVersionsChanged,
-                            this, &VersionControlObserver::silentDirectoryVerification);
-                    connect(plugin, &KVersionControlPlugin::infoMessage,
-                            this, &VersionControlObserver::infoMessage);
-                    connect(plugin, &KVersionControlPlugin::errorMessage,
-                            this, &VersionControlObserver::errorMessage);
-                    connect(plugin, &KVersionControlPlugin::operationCompletedMessage,
-                            this, &VersionControlObserver::operationCompletedMessage);
+        const QVector<KPluginMetaData> plugins = KPluginLoader::findPlugins(QStringLiteral("dolphin/vcs"));
+
+        QSet<QString> loadedPlugins;
 
+        for (const auto &p : plugins) {
+            if (enabledPlugins.contains(p.name())) {
+                KPluginLoader loader(p.fileName());
+                KPluginFactory *factory = loader.factory();
+                KVersionControlPlugin *plugin = factory->create<KVersionControlPlugin>();
+                if (plugin) {
                     m_plugins.append(plugin);
+                    loadedPlugins += p.name();
                 }
             }
         }
+
+        for (auto &plugin : qAsConst(m_plugins)) {
+            connect(plugin, &KVersionControlPlugin::itemVersionsChanged,
+                this, &VersionControlObserver::silentDirectoryVerification);
+            connect(plugin, &KVersionControlPlugin::infoMessage,
+                this, &VersionControlObserver::infoMessage);
+            connect(plugin, &KVersionControlPlugin::errorMessage,
+                this, &VersionControlObserver::errorMessage);
+            connect(plugin, &KVersionControlPlugin::operationCompletedMessage,
+                this, &VersionControlObserver::operationCompletedMessage);
+        }
+
         m_pluginsInitialized = true;
     }
 }
@@ -306,14 +316,18 @@ KVersionControlPlugin* VersionControlObserver::searchPlugin(const QUrl& director
     initPlugins();
 
     // Verify whether the current directory is under a version system
-    for (const auto &plugin : qAsConst(m_plugins)) {
+    for (const QPointer<KVersionControlPlugin> &plugin : qAsConst(m_plugins)) {
+        if (!plugin) {
+            continue;
+        }
+
         // first naively check if we are at working copy root
         const QString fileName = directory.path() + '/' + plugin->fileName();
         if (QFile::exists(fileName)) {
             m_localRepoRoot = directory.path();
             return plugin;
         }
-        auto root = plugin->localRepositoryRoot(directory.path());
+        const QString root = plugin->localRepositoryRoot(directory.path());
         if (!root.isEmpty()) {
             m_localRepoRoot = root;
             return plugin;