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