X-Git-Url: https://cloud.milkyroute.net/gitweb/dolphin.git/blobdiff_plain/c1739d5c4d55401a03462467ed446763924be844..99cc976a8564cbdae63e4261fcb2292a33148dbc:/src/views/versioncontrol/versioncontrolobserver.cpp diff --git a/src/views/versioncontrol/versioncontrolobserver.cpp b/src/views/versioncontrol/versioncontrolobserver.cpp index 5f7c34194..6766aa479 100644 --- a/src/views/versioncontrol/versioncontrolobserver.cpp +++ b/src/views/versioncontrol/versioncontrolobserver.cpp @@ -13,8 +13,9 @@ #include "updateitemstatesthread.h" #include -#include -#include +#include +#include +#include #include @@ -112,7 +113,7 @@ QList VersionControlObserver::actions(const KFileItemList& items) cons return m_plugin->versionControlActions(items); } else { QList actions; - for (const auto &plugin : qAsConst(m_plugins)) { + for (const QPointer &plugin : qAsConst(m_plugins)) { actions << plugin->outOfVersionControlActions(items); } return actions; @@ -155,7 +156,7 @@ void VersionControlObserver::verifyDirectory() } if (m_plugin != nullptr) { - if (!rootItem.url().path().startsWith(m_wcRoot) || !QFile::exists(m_wcRoot + '/' + m_plugin->fileName())) { + if (!rootItem.url().path().startsWith(m_localRepoRoot) || !QFile::exists(m_localRepoRoot + '/' + m_plugin->fileName())) { m_plugin = nullptr; // The directory is not versioned. Reset the verification timer to a higher @@ -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(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 plugins = KPluginLoader::findPlugins(QStringLiteral("dolphin/vcs")); + + QSet loadedPlugins; + for (const auto &p : plugins) { + if (enabledPlugins.contains(p.name())) { + KPluginLoader loader(p.fileName()); + KPluginFactory *factory = loader.factory(); + KVersionControlPlugin *plugin = factory->create(); + 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,16 +316,20 @@ 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 &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_wcRoot = directory.path(); + m_localRepoRoot = directory.path(); return plugin; } - auto wcRoot = plugin->localRepositoryRoot(directory.path()); - if (!wcRoot.isEmpty()) { - m_wcRoot = wcRoot; + const QString root = plugin->localRepositoryRoot(directory.path()); + if (!root.isEmpty()) { + m_localRepoRoot = root; return plugin; } }