X-Git-Url: https://cloud.milkyroute.net/gitweb/dolphin.git/blobdiff_plain/a24327cd50ef17b953ecb908d260b73460158107..c1739d5c4d55401a03462467ed446763924be844:/src/views/versioncontrol/versioncontrolobserver.cpp diff --git a/src/views/versioncontrol/versioncontrolobserver.cpp b/src/views/versioncontrol/versioncontrolobserver.cpp index 359ae0152..5f7c34194 100644 --- a/src/views/versioncontrol/versioncontrolobserver.cpp +++ b/src/views/versioncontrol/versioncontrolobserver.cpp @@ -21,7 +21,6 @@ VersionControlObserver::VersionControlObserver(QObject* parent) : QObject(parent), m_pendingItemStatesUpdate(false), - m_versionedDirectory(false), m_silentUpdate(false), m_view(nullptr), m_model(nullptr), @@ -114,7 +113,7 @@ QList VersionControlObserver::actions(const KFileItemList& items) cons } else { QList actions; for (const auto &plugin : qAsConst(m_plugins)) { - actions << plugin.first->outOfVersionControlActions(items); + actions << plugin->outOfVersionControlActions(items); } return actions; } @@ -155,23 +154,23 @@ void VersionControlObserver::verifyDirectory() return; } - m_plugin = searchPlugin(rootItem.url()); - if (m_plugin) { - if (!m_versionedDirectory) { - m_versionedDirectory = true; + if (m_plugin != nullptr) { + if (!rootItem.url().path().startsWith(m_wcRoot) || !QFile::exists(m_wcRoot + '/' + m_plugin->fileName())) { + m_plugin = nullptr; - // The directory is versioned. Assume that the user will further browse through - // versioned directories and decrease the verification timer. - m_dirVerificationTimer->setInterval(100); + // The directory is not versioned. Reset the verification timer to a higher + // value, so that browsing through non-versioned directories is not slown down + // by an immediate verification. + m_dirVerificationTimer->setInterval(500); + } else { + // View was versionned but should not be anymore + updateItemStates(); } + } else if ((m_plugin = searchPlugin(rootItem.url()))) { + // The directory is versioned. Assume that the user will further browse through + // versioned directories and decrease the verification timer. + m_dirVerificationTimer->setInterval(100); updateItemStates(); - } else if (m_versionedDirectory) { - m_versionedDirectory = false; - - // The directory is not versioned. Reset the verification timer to a higher - // value, so that browsing through non-versioned directories is not slown down - // by an immediate verification. - m_dirVerificationTimer->setInterval(500); } } @@ -202,7 +201,7 @@ void VersionControlObserver::slotThreadFinished() // Using an empty message results in clearing the previously shown information message and showing // the default status bar information. This is useful as the user already gets feedback that the // operation has been completed because of the icon emblems. - emit operationCompletedMessage(QString()); + Q_EMIT operationCompletedMessage(QString()); } if (m_pendingItemStatesUpdate) { @@ -226,7 +225,7 @@ void VersionControlObserver::updateItemStates() if (!itemStates.isEmpty()) { if (!m_silentUpdate) { - emit infoMessage(i18nc("@info:status", "Updating version information...")); + Q_EMIT infoMessage(i18nc("@info:status", "Updating version information...")); } m_updateItemStatesThread = new UpdateItemStatesThread(m_plugin, itemStates); connect(m_updateItemStatesThread, &UpdateItemStatesThread::finished, @@ -273,7 +272,7 @@ int VersionControlObserver::createItemStatesList(QMapfileName()) ); + m_plugins.append(plugin); } } } m_pluginsInitialized = true; } +} - if (m_plugins.empty()) { - // A searching for plugins has already been done, but no - // plugins are installed - return nullptr; - } - - // We use the number of upUrl() calls to find the best matching plugin - // for the given directory. The smaller value, the better it is (0 is best). - KVersionControlPlugin* bestPlugin = nullptr; - int bestScore = INT_MAX; +KVersionControlPlugin* VersionControlObserver::searchPlugin(const QUrl& directory) +{ + initPlugins(); - // Verify whether the current directory contains revision information - // like .svn, .git, ... - for (const auto &it : qAsConst(m_plugins)) { - const QString fileName = directory.path() + '/' + it.second; + // Verify whether the current directory is under a version system + for (const auto &plugin : qAsConst(m_plugins)) { + // first naively check if we are at working copy root + const QString fileName = directory.path() + '/' + plugin->fileName(); if (QFile::exists(fileName)) { - // The score of this plugin is 0 (best), so we can just return this plugin, - // instead of going through the plugin scoring procedure, we can't find a better one ;) - return it.first; + m_wcRoot = directory.path(); + return plugin; } - - // Version control systems like Git provide the version information - // file only in the root directory. Check whether the version information file can - // be found in one of the parent directories. For performance reasons this - // step is only done, if the previous directory was marked as versioned by - // m_versionedDirectory. Drawback: Until e. g. Git is recognized, the root directory - // must be shown at least once. - if (m_versionedDirectory) { - QUrl dirUrl(directory); - QUrl upUrl = KIO::upUrl(dirUrl); - int upUrlCounter = 1; - while ((upUrlCounter < bestScore) && (upUrl != dirUrl)) { - const QString fileName = dirUrl.path() + '/' + it.second; - if (QFile::exists(fileName)) { - if (upUrlCounter < bestScore) { - bestPlugin = it.first; - bestScore = upUrlCounter; - } - break; - } - dirUrl = upUrl; - upUrl = KIO::upUrl(dirUrl); - ++upUrlCounter; - } + auto wcRoot = plugin->localRepositoryRoot(directory.path()); + if (!wcRoot.isEmpty()) { + m_wcRoot = wcRoot; + return plugin; } } - - return bestPlugin; + return nullptr; } bool VersionControlObserver::isVersionControlled() const { - return m_versionedDirectory && m_plugin; + return m_plugin != nullptr; }