From df9299fd2456f91405fe2a09a255a07949c775aa Mon Sep 17 00:00:00 2001 From: Orgad Shaneh <orgad.shaneh@audiocodes.com> Date: Mon, 23 Dec 2013 09:32:59 +0200 Subject: [PATCH] Git: Do not hang on Continue Cherry-Pick/Revert ...after conflicts resolving Change-Id: I02637e19d1f5b595b2c63d8e001c0df6af94a347 Reviewed-by: Tobias Hunger <tobias.hunger@digia.com> --- src/plugins/git/gitclient.cpp | 35 ++++++++++++++++++++++++----------- src/plugins/git/gitclient.h | 6 +++++- src/plugins/git/gitplugin.cpp | 4 ++-- 3 files changed, 31 insertions(+), 14 deletions(-) diff --git a/src/plugins/git/gitclient.cpp b/src/plugins/git/gitclient.cpp index cceb52b065d..4636c673615 100644 --- a/src/plugins/git/gitclient.cpp +++ b/src/plugins/git/gitclient.cpp @@ -3521,21 +3521,39 @@ bool GitClient::canRebase(const QString &workingDirectory) const return true; } -void GitClient::rebase(const QString &workingDirectory, const QString &baseBranch) +void GitClient::rebase(const QString &workingDirectory, const QString &argument) +{ + asyncCommand(workingDirectory, QStringList() << QLatin1String("rebase") << argument, true); +} + +void GitClient::cherryPick(const QString &workingDirectory, const QString &argument) +{ + asyncCommand(workingDirectory, QStringList() << QLatin1String("cherry-pick") << argument); +} + +void GitClient::revert(const QString &workingDirectory, const QString &argument) +{ + asyncCommand(workingDirectory, QStringList() << QLatin1String("revert") << argument); +} + +// Executes a command asynchronously. Work tree is expected to be clean. +// Stashing is handled prior to this call. +void GitClient::asyncCommand(const QString &workingDirectory, const QStringList &arguments, + bool hasProgress) { // Git might request an editor, so this must be done asynchronously // and without timeout - QString gitCommand = QLatin1String("rebase"); - QStringList arguments; - arguments << gitCommand << baseBranch; + QString gitCommand = arguments.first(); outputWindow()->appendCommand(workingDirectory, settings()->stringValue(GitSettings::binaryPathKey), arguments); VcsBase::Command *command = createCommand(workingDirectory, 0, true); new ConflictHandler(command, workingDirectory, gitCommand); - command->setProgressParser(new ProgressParser); + if (hasProgress) + command->setProgressParser(new ProgressParser); command->addJob(arguments, -1); command->execute(); + command->setCookie(workingDirectory); } bool GitClient::synchronousRevert(const QString &workingDirectory, const QString &commit) @@ -3577,12 +3595,7 @@ void GitClient::interactiveRebase(const QString &workingDirectory, const QString outputWindow()->appendCommand(workingDirectory, settings()->stringValue(GitSettings::binaryPathKey), arguments); if (fixup) m_disableEditor = true; - VcsBase::Command *command = createCommand(workingDirectory, 0, true); - new ConflictHandler(command, workingDirectory, QLatin1String("rebase")); - command->setProgressParser(new ProgressParser); - command->addJob(arguments, -1); - command->execute(); - command->setCookie(workingDirectory); + asyncCommand(workingDirectory, arguments, true); if (fixup) m_disableEditor = false; } diff --git a/src/plugins/git/gitclient.h b/src/plugins/git/gitclient.h index aedb61bd4e2..6d5593df4c4 100644 --- a/src/plugins/git/gitclient.h +++ b/src/plugins/git/gitclient.h @@ -254,7 +254,11 @@ public: bool synchronousMerge(const QString &workingDirectory, const QString &branch, bool allowFastForward = true); bool canRebase(const QString &workingDirectory) const; - void rebase(const QString &workingDirectory, const QString &baseBranch); + void rebase(const QString &workingDirectory, const QString &argument); + void cherryPick(const QString &workingDirectory, const QString &argument); + void revert(const QString &workingDirectory, const QString &argument); + void asyncCommand(const QString &workingDirectory, const QStringList &arguments, + bool hasProgress = false); bool synchronousRevert(const QString &workingDirectory, const QString &commit); bool synchronousCherryPick(const QString &workingDirectory, const QString &commit); void interactiveRebase(const QString &workingDirectory, const QString &commit, bool fixup); diff --git a/src/plugins/git/gitplugin.cpp b/src/plugins/git/gitplugin.cpp index be1b7400197..f5e66dfbaf2 100644 --- a/src/plugins/git/gitplugin.cpp +++ b/src/plugins/git/gitplugin.cpp @@ -1206,9 +1206,9 @@ void GitPlugin::continueOrAbortCommand() else if (action == m_continueRebaseAction) m_gitClient->rebase(state.topLevel(), QLatin1String("--continue")); else if (action == m_continueCherryPickAction) - m_gitClient->synchronousCherryPick(state.topLevel(), QLatin1String("--continue")); + m_gitClient->cherryPick(state.topLevel(), QLatin1String("--continue")); else if (action == m_continueRevertAction) - m_gitClient->synchronousRevert(state.topLevel(), QLatin1String("--continue")); + m_gitClient->revert(state.topLevel(), QLatin1String("--continue")); updateContinueAndAbortCommands(); } -- GitLab