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;