From 61d94c5ccd12f676079a0d4c1fa7c4c0c73fc609 Mon Sep 17 00:00:00 2001 From: Orgad Shaneh Date: Sun, 8 May 2016 11:15:00 +0300 Subject: [PATCH] Git: Fetch completion refs asynchronously For repositories with many refs the dialog takes a few seconds to open. Change-Id: I82154ad8a77cc304db941f9d41e36e32aa7043cd Reviewed-by: Tobias Hunger --- src/plugins/git/changeselectiondialog.cpp | 24 ++++++++++++----------- src/plugins/git/gitclient.cpp | 6 ++++++ src/plugins/git/gitclient.h | 1 + 3 files changed, 20 insertions(+), 11 deletions(-) diff --git a/src/plugins/git/changeselectiondialog.cpp b/src/plugins/git/changeselectiondialog.cpp index 563cea0238e..4af6afac425 100644 --- a/src/plugins/git/changeselectiondialog.cpp +++ b/src/plugins/git/changeselectiondialog.cpp @@ -33,6 +33,7 @@ #include #include +#include #include #include @@ -212,18 +213,19 @@ void ChangeSelectionDialog::recalculateCompletion() if (workingDir == m_oldWorkingDir) return; m_oldWorkingDir = workingDir; - - if (!workingDir.isEmpty()) { - GitClient *client = GitPlugin::client(); - QStringList args; - args << QLatin1String("--format=%(refname:short)"); - QString output; - if (client->synchronousForEachRefCmd(workingDir, args, &output)) { - m_changeModel->setStringList(output.split(QLatin1Char('\n'))); - return; - } - } m_changeModel->setStringList(QStringList()); + + if (workingDir.isEmpty()) + return; + + GitClient *client = GitPlugin::client(); + QStringList args; + args << QLatin1String("--format=%(refname:short)"); + VcsBase::VcsCommand *command = client->asyncForEachRefCmd(workingDir, args); + connect(this, &QObject::destroyed, command, &VcsBase::VcsCommand::abort); + connect(command, &VcsBase::VcsCommand::stdOutText, [this](const QString &output) { + m_changeModel->setStringList(output.split(QLatin1Char('\n'))); + }); } void ChangeSelectionDialog::recalculateDetails() diff --git a/src/plugins/git/gitclient.cpp b/src/plugins/git/gitclient.cpp index 292c27c1fd6..3e1d1e39200 100644 --- a/src/plugins/git/gitclient.cpp +++ b/src/plugins/git/gitclient.cpp @@ -1681,6 +1681,12 @@ bool GitClient::synchronousForEachRefCmd(const QString &workingDirectory, QStrin return rc; } +VcsCommand *GitClient::asyncForEachRefCmd(const QString &workingDirectory, QStringList args) const +{ + args.push_front(QLatin1String("for-each-ref")); + return vcsExec(workingDirectory, args, 0, false, silentFlags); +} + bool GitClient::synchronousRemoteCmd(const QString &workingDirectory, QStringList remoteArgs, QString *output, QString *errorMessage, bool silent) const { diff --git a/src/plugins/git/gitclient.h b/src/plugins/git/gitclient.h index ef8f8873913..086890c4699 100644 --- a/src/plugins/git/gitclient.h +++ b/src/plugins/git/gitclient.h @@ -207,6 +207,7 @@ public: QString *output, QString *errorMessage) const; bool synchronousForEachRefCmd(const QString &workingDirectory, QStringList args, QString *output, QString *errorMessage = 0) const; + VcsBase::VcsCommand *asyncForEachRefCmd(const QString &workingDirectory, QStringList args) const; bool synchronousRemoteCmd(const QString &workingDirectory, QStringList remoteArgs, QString *output = 0, QString *errorMessage = 0, bool silent = false) const;