From ca4efa4a34a1ca479a61aef7b55db61be3bb7cd0 Mon Sep 17 00:00:00 2001
From: Tobias Hunger <tobias.hunger@nokia.com>
Date: Fri, 3 Feb 2012 11:41:57 +0100
Subject: [PATCH] Git: Speed up diff/show output

* Avoid calling git --version repeatedly
* Use VcsManager to find toplevel directory which does caching.

Task-number: QTCREATORBUG-6906
Change-Id: Ib9ba94751bbecac686a0e116baeded9b2f6f3d90
Reviewed-by: Tobias Hunger <tobias.hunger@nokia.com>
---
 src/plugins/bazaar/bazaareditor.cpp         |  2 +-
 src/plugins/git/gitclient.cpp               |  7 +++++--
 src/plugins/git/giteditor.cpp               |  2 +-
 src/plugins/mercurial/mercurialeditor.cpp   |  2 +-
 src/plugins/subversion/subversioneditor.cpp |  2 +-
 src/plugins/vcsbase/vcsbaseeditor.cpp       | 18 +++++++++++-------
 src/plugins/vcsbase/vcsbaseeditor.h         |  2 +-
 7 files changed, 21 insertions(+), 14 deletions(-)

diff --git a/src/plugins/bazaar/bazaareditor.cpp b/src/plugins/bazaar/bazaareditor.cpp
index bf3f6caff6d..b0b7917ec36 100644
--- a/src/plugins/bazaar/bazaareditor.cpp
+++ b/src/plugins/bazaar/bazaareditor.cpp
@@ -113,7 +113,7 @@ QString BazaarEditor::fileNameFromDiffSpecification(const QTextBlock &inBlock) c
     for (QTextBlock  block = inBlock; block.isValid(); block = block.previous()) {
         const QString line = block.text();
         if (m_diffFileId.indexIn(line) != -1)
-            return findDiffFile(m_diffFileId.cap(1), BazaarPlugin::instance()->versionControl());
+            return findDiffFile(m_diffFileId.cap(1));
     }
     return QString();
 }
diff --git a/src/plugins/git/gitclient.cpp b/src/plugins/git/gitclient.cpp
index 9b045178bd2..1c4f06c0139 100644
--- a/src/plugins/git/gitclient.cpp
+++ b/src/plugins/git/gitclient.cpp
@@ -366,7 +366,7 @@ const char *GitClient::decorateOption = "--decorate";
 
 QString GitClient::findRepositoryForDirectory(const QString &dir)
 {
-    if (synchronousGitVersion(true) >= 0x010700) {
+    if (gitVersion(true) >= 0x010700) {
         // Find a directory to run git in:
         const QString root = QDir::rootPath();
         const QString home = QDir::homePath();
@@ -530,6 +530,7 @@ void GitClient::diff(const QString &workingDirectory,
         connect(editor, SIGNAL(diffChunkReverted(VcsBase::DiffChunk)), argWidget, SLOT(executeCommand()));
         editor->setRevertDiffChunkEnabled(true);
     }
+    editor->setDiffBaseDirectory(workingDirectory);
 
     GitFileDiffArgumentsWidget *argWidget = qobject_cast<GitFileDiffArgumentsWidget *>(editor->configurationWidget());
     QStringList userDiffArgs = argWidget->arguments();
@@ -556,6 +557,7 @@ void GitClient::diffBranch(const QString &workingDirectory,
         editor = createVcsEditor(editorId, title, sourceFile, CodecSource, "BranchName", branchName,
                                  new GitBranchDiffArgumentsWidget(this, workingDirectory,
                                                                   diffArgs, branchName));
+    editor->setDiffBaseDirectory(workingDirectory);
 
     GitBranchDiffArgumentsWidget *argWidget = qobject_cast<GitBranchDiffArgumentsWidget *>(editor->configurationWidget());
     QStringList userDiffArgs = argWidget->arguments();
@@ -683,6 +685,7 @@ void GitClient::show(const QString &source, const QString &id, const QStringList
 
     const QFileInfo sourceFi(source);
     const QString workDir = sourceFi.isDir() ? sourceFi.absoluteFilePath() : sourceFi.absolutePath();
+    editor->setDiffBaseDirectory(workDir);
     executeGit(workDir, arguments, editor);
 }
 
@@ -1743,7 +1746,7 @@ bool GitClient::getCommitData(const QString &workingDirectory,
     if (amend) {
         // Amend: get last commit data as "SHA1@message".
         QStringList args(QLatin1String("log"));
-        const QString format = synchronousGitVersion(true) > 0x010701 ?
+        const QString format = gitVersion(true) > 0x010701 ?
                                QLatin1String("%h@%B") :
                                QLatin1String("%h@%s%n%n%b");
         args << QLatin1String("--max-count=1") << QLatin1String("--pretty=format:") + format;
diff --git a/src/plugins/git/giteditor.cpp b/src/plugins/git/giteditor.cpp
index a605270a0dc..2909c58c218 100644
--- a/src/plugins/git/giteditor.cpp
+++ b/src/plugins/git/giteditor.cpp
@@ -130,7 +130,7 @@ QString GitEditor::fileNameFromDiffSpecification(const QTextBlock &inBlock) cons
         QString diffFileName = block.text();
         if (diffFileName.startsWith(newFileIndicator)) {
             diffFileName.remove(0, newFileIndicator.size());
-            return findDiffFile(diffFileName, GitPlugin::instance()->versionControl());
+            return findDiffFile(diffFileName);
         }
     }
     return QString();
diff --git a/src/plugins/mercurial/mercurialeditor.cpp b/src/plugins/mercurial/mercurialeditor.cpp
index 04899de75b2..34d4d6c9785 100644
--- a/src/plugins/mercurial/mercurialeditor.cpp
+++ b/src/plugins/mercurial/mercurialeditor.cpp
@@ -110,7 +110,7 @@ QString MercurialEditor::fileNameFromDiffSpecification(const QTextBlock &inBlock
         QString diffFileName = block.text();
         if (diffFileName.startsWith(newFileIndicator)) {
             diffFileName.remove(0, newFileIndicator.size());
-            return findDiffFile(diffFileName, MercurialPlugin::instance()->versionControl());
+            return findDiffFile(diffFileName);
         }
 
     }
diff --git a/src/plugins/subversion/subversioneditor.cpp b/src/plugins/subversion/subversioneditor.cpp
index 70670e76535..ac6e8c4ea5f 100644
--- a/src/plugins/subversion/subversioneditor.cpp
+++ b/src/plugins/subversion/subversioneditor.cpp
@@ -134,7 +134,7 @@ QString SubversionEditor::fileNameFromDiffSpecification(const QTextBlock &inBloc
             const int tabIndex = diffFileName.lastIndexOf(QLatin1Char('\t'));
             if (tabIndex != -1)
                 diffFileName.truncate(tabIndex);
-            const QString rc = findDiffFile(diffFileName, SubversionPlugin::instance()->versionControl());
+            const QString rc = findDiffFile(diffFileName);
             if (Subversion::Constants::debug)
                 qDebug() << Q_FUNC_INFO << diffFileName << rc << source();
             return rc;
diff --git a/src/plugins/vcsbase/vcsbaseeditor.cpp b/src/plugins/vcsbase/vcsbaseeditor.cpp
index 83e7286d098..9e71b9b7ae8 100644
--- a/src/plugins/vcsbase/vcsbaseeditor.cpp
+++ b/src/plugins/vcsbase/vcsbaseeditor.cpp
@@ -39,10 +39,12 @@
 #include "vcsbaseplugin.h"
 
 #include <coreplugin/editormanager/editormanager.h>
+#include <coreplugin/icore.h>
 #include <coreplugin/ifile.h>
 #include <coreplugin/iversioncontrol.h>
 #include <coreplugin/coreconstants.h>
 #include <coreplugin/modemanager.h>
+#include <coreplugin/vcsmanager.h>
 #include <extensionsystem/pluginmanager.h>
 #include <projectexplorer/editorconfiguration.h>
 #include <projectexplorer/projectexplorer.h>
@@ -1341,8 +1343,7 @@ QWidget *VcsBaseEditorWidget::configurationWidget() const
 }
 
 // Find the complete file from a diff relative specification.
-QString VcsBaseEditorWidget::findDiffFile(const QString &f,
-                                          Core::IVersionControl *control /* = 0 */) const
+QString VcsBaseEditorWidget::findDiffFile(const QString &f) const
 {
     // Check if file is absolute
     const QFileInfo in(f);
@@ -1366,11 +1367,14 @@ QString VcsBaseEditorWidget::findDiffFile(const QString &f,
             return sourceFileInfo.absoluteFilePath();
 
         QString topLevel;
-        if (control && control->managesDirectory(sourceDir, &topLevel)) {
-            const QFileInfo topLevelFileInfo(topLevel + slash + f);
-            if (topLevelFileInfo.isFile())
-                return topLevelFileInfo.absoluteFilePath();
-        }
+        Core::VcsManager *vcsManager = Core::ICore::vcsManager();
+        vcsManager->findVersionControlForDirectory(sourceDir, &topLevel); //
+        if (topLevel.isEmpty())
+            return QString();
+
+        const QFileInfo topLevelFileInfo(topLevel + slash + f);
+        if (topLevelFileInfo.isFile())
+            return topLevelFileInfo.absoluteFilePath();
     }
 
     // 3) Try working directory
diff --git a/src/plugins/vcsbase/vcsbaseeditor.h b/src/plugins/vcsbase/vcsbaseeditor.h
index 1eb9f8f3749..5148f95fd4f 100644
--- a/src/plugins/vcsbase/vcsbaseeditor.h
+++ b/src/plugins/vcsbase/vcsbaseeditor.h
@@ -236,7 +236,7 @@ protected:
     /* A helper that can be used to locate a file in a diff in case it
      * is relative. Tries to derive the directory from base directory,
      * source and version control. */
-    QString findDiffFile(const QString &f, Core::IVersionControl *control = 0) const;
+    QString findDiffFile(const QString &f) const;
 
     virtual bool canApplyDiffChunk(const DiffChunk &dc) const;
     // Revert a patch chunk. Default implementation uses patch.exe
-- 
GitLab