]> cloud.milkyroute.net Git - dolphin.git/blobdiff - src/versioncontrol/versioncontrolobserver.cpp
use KFileItemActions::runPreferredApplications to handle Key_Enter on multiple select...
[dolphin.git] / src / versioncontrol / versioncontrolobserver.cpp
index cab62be39d6b7619a972b2c17a4d8bae339e0a55..c5a0b982fc9df67a3f7ec81bf07d0b331df9f9e0 100644 (file)
@@ -99,9 +99,9 @@ VersionControlObserver::~VersionControlObserver()
 QList<QAction*> VersionControlObserver::contextMenuActions(const KFileItemList& items) const
 {
     QList<QAction*> actions;
-    if (isVersioned() && m_updateItemStatesThread->beginReadItemStates()) {
+    if (isVersioned() && m_updateItemStatesThread->lockPlugin()) {
         actions = m_plugin->contextMenuActions(items);
-        m_updateItemStatesThread->endReadItemStates();
+        m_updateItemStatesThread->unlockPlugin();
     }
     return actions;
 }
@@ -109,9 +109,9 @@ QList<QAction*> VersionControlObserver::contextMenuActions(const KFileItemList&
 QList<QAction*> VersionControlObserver::contextMenuActions(const QString& directory) const
 {
     QList<QAction*> actions;
-    if (isVersioned() && m_updateItemStatesThread->beginReadItemStates()) {
+    if (isVersioned() && m_updateItemStatesThread->lockPlugin()) {
         actions = m_plugin->contextMenuActions(directory);
-        m_updateItemStatesThread->endReadItemStates();
+        m_updateItemStatesThread->unlockPlugin();
     }
 
     return actions;
@@ -141,16 +141,7 @@ void VersionControlObserver::verifyDirectory()
     }
 
     m_plugin = searchPlugin(versionControlUrl);
-    const bool foundVersionInfo = (m_plugin != 0);
-    if (!foundVersionInfo && m_versionedDirectory) {
-        // 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.
-
-        // TODO...
-    }
-
-    if (foundVersionInfo) {
+    if (m_plugin != 0) {
         if (!m_versionedDirectory) {
             m_versionedDirectory = true;
 
@@ -275,7 +266,7 @@ KVersionControlPlugin* VersionControlObserver::searchPlugin(const KUrl& director
     static QList<KVersionControlPlugin*> plugins;
 
     if (!pluginsAvailable) {
-        // a searching for plugins has already been done, but no
+        // A searching for plugins has already been done, but no
         // plugins are installed
         return 0;
     }
@@ -283,12 +274,11 @@ KVersionControlPlugin* VersionControlObserver::searchPlugin(const KUrl& director
     if (plugins.isEmpty()) {
         // No searching for plugins has been done yet. Query the KServiceTypeTrader for
         // all fileview version control plugins and remember them in 'plugins'.
-        const QString disabledPlugins = VersionControlSettings::disabledPlugins();
-        const QStringList disabledPluginsList = disabledPlugins.split(',');
+        const QStringList enabledPlugins = VersionControlSettings::enabledPlugins();
 
         const KService::List pluginServices = KServiceTypeTrader::self()->query("FileViewVersionControlPlugin");
         for (KService::List::ConstIterator it = pluginServices.constBegin(); it != pluginServices.constEnd(); ++it) {
-            if (!disabledPluginsList.contains((*it)->name())) {
+            if (enabledPlugins.contains((*it)->name())) {
                 KVersionControlPlugin* plugin = (*it)->createInstance<KVersionControlPlugin>();
                 Q_ASSERT(plugin != 0);
                 plugins.append(plugin);
@@ -300,15 +290,36 @@ KVersionControlPlugin* VersionControlObserver::searchPlugin(const KUrl& director
         }
     }
 
-    // verify whether the current directory contains revision information
+    // Verify whether the current directory contains revision information
     // like .svn, .git, ...
     foreach (KVersionControlPlugin* plugin, plugins) {
-        KUrl fileUrl = directory;
+        // Use the KDirLister cache to check for .svn, .git, ... files
+        KUrl dirUrl(directory);
+        KUrl fileUrl = dirUrl;
         fileUrl.addPath(plugin->fileName());
         const KFileItem item = m_dirLister->findByUrl(fileUrl);
         if (!item.isNull()) {
             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) {
+            KUrl upUrl = dirUrl.upUrl();
+            while (upUrl != dirUrl) {
+                const QString filePath = dirUrl.pathOrUrl(KUrl::AddTrailingSlash) + plugin->fileName();
+                QFileInfo file(filePath);
+                if (file.exists()) {
+                    return plugin;
+                }
+                dirUrl = upUrl;
+                upUrl = dirUrl.upUrl();
+            }
+        }
     }
 
     return 0;