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