From 34fd5ca532554c62fcf667ad94733929007f19b1 Mon Sep 17 00:00:00 2001
From: Orgad Shaneh <orgad.shaneh@audiocodes.com>
Date: Sat, 9 Feb 2013 20:33:50 +0200
Subject: [PATCH] Git: Handle "no changes" case on conflict resolving

Change-Id: I75bb18c9564ffac3de2654bd388465794481b487
Reviewed-by: Tobias Hunger <tobias.hunger@digia.com>
---
 src/plugins/git/gitclient.cpp |  4 ++--
 src/plugins/git/gitclient.h   |  2 +-
 src/plugins/git/mergetool.cpp | 33 +++++++++++++++++++--------------
 src/plugins/git/mergetool.h   |  2 +-
 4 files changed, 23 insertions(+), 18 deletions(-)

diff --git a/src/plugins/git/gitclient.cpp b/src/plugins/git/gitclient.cpp
index 48fde2be1e1..0e8f5af0ed8 100644
--- a/src/plugins/git/gitclient.cpp
+++ b/src/plugins/git/gitclient.cpp
@@ -2132,10 +2132,10 @@ bool GitClient::synchronousPull(const QString &workingDirectory, bool rebase)
     return executeAndHandleConflicts(workingDirectory, arguments, abortCommand);
 }
 
-bool GitClient::synchronousCommandContinue(const QString &workingDirectory, const QString &command)
+bool GitClient::synchronousCommandContinue(const QString &workingDirectory, const QString &command, bool hasChanges)
 {
     QStringList arguments;
-    arguments << command << QLatin1String("--continue");
+    arguments << command << QLatin1String(hasChanges ? "--continue" : "--skip");
     return executeAndHandleConflicts(workingDirectory, arguments, command);
 }
 
diff --git a/src/plugins/git/gitclient.h b/src/plugins/git/gitclient.h
index 956fcb460bc..66be621f2a2 100644
--- a/src/plugins/git/gitclient.h
+++ b/src/plugins/git/gitclient.h
@@ -198,7 +198,7 @@ public:
     QString vcsGetRepositoryURL(const QString &directory);
     bool synchronousFetch(const QString &workingDirectory, const QString &remote);
     bool synchronousPull(const QString &workingDirectory, bool rebase);
-    bool synchronousCommandContinue(const QString &workingDirectory, const QString &command);
+    bool synchronousCommandContinue(const QString &workingDirectory, const QString &command, bool hasChanges);
     bool synchronousPush(const QString &workingDirectory, const QString &remote = QString());
     bool synchronousMerge(const QString &workingDirectory, const QString &branch);
     bool synchronousRebase(const QString &workingDirectory,
diff --git a/src/plugins/git/mergetool.cpp b/src/plugins/git/mergetool.cpp
index 45bec25742b..c44bbfe4f97 100644
--- a/src/plugins/git/mergetool.cpp
+++ b/src/plugins/git/mergetool.cpp
@@ -255,26 +255,31 @@ void MergeTool::readData()
     }
 }
 
-void MergeTool::continuePreviousGitCommand(const QString &msgBoxTitle, const QString &msgBoxText,
+void MergeTool::continuePreviousGitCommand(const QString &msgBoxTitle, QString msgBoxText,
                                            const QString &buttonName, const QString &gitCommand)
 {
     QString workingDirectory = m_process->workingDirectory();
-    QMessageBox msgBox;
-    QPushButton *commandButton = msgBox.addButton(buttonName,  QMessageBox::AcceptRole);
-    QPushButton *abortButton = msgBox.addButton(QMessageBox::Abort);
+    bool isRebase = gitCommand == QLatin1String("rebase");
+    bool hasChanges = m_gitClient->gitStatus(m_process->workingDirectory(),
+            StatusMode(NoUntracked | NoSubmodules)) == GitClient::StatusChanged;
+    if (!hasChanges)
+        msgBoxText.prepend(tr("No changes found. "));
+    QMessageBox msgBox(QMessageBox::Question, msgBoxTitle, msgBoxText);
+    if (hasChanges || isRebase)
+        msgBox.addButton(hasChanges ? buttonName : tr("Skip"), QMessageBox::AcceptRole);
+    msgBox.addButton(QMessageBox::Abort);
     msgBox.addButton(QMessageBox::Ignore);
-    msgBox.setIcon(QMessageBox::Question);
-    msgBox.setWindowTitle(msgBoxTitle);
-    msgBox.setText(msgBoxText);
-    msgBox.exec();
-
-    if (msgBox.clickedButton() == commandButton) {      // Continue
-        if (gitCommand == QLatin1String("rebase"))
-            m_gitClient->synchronousCommandContinue(workingDirectory, gitCommand);
+    switch (msgBox.exec()) {
+    case QMessageBox::Ignore:
+        break;
+    case QMessageBox::Abort:
+        m_gitClient->synchronousAbortCommand(workingDirectory, gitCommand);
+        break;
+    default: // Continue/Skip
+        if (isRebase)
+            m_gitClient->synchronousCommandContinue(workingDirectory, gitCommand, hasChanges);
         else
             GitPlugin::instance()->startCommit();
-    } else if (msgBox.clickedButton() == abortButton) { // Abort
-        m_gitClient->synchronousAbortCommand(workingDirectory, gitCommand);
     }
 }
 
diff --git a/src/plugins/git/mergetool.h b/src/plugins/git/mergetool.h
index edb5658cc49..093b7ab4c9b 100644
--- a/src/plugins/git/mergetool.h
+++ b/src/plugins/git/mergetool.h
@@ -78,7 +78,7 @@ private:
     QString stateName(FileState state, const QString &extraInfo);
     void chooseAction();
     void addButton(QMessageBox *msgBox, const QString &text, char key);
-    void continuePreviousGitCommand(const QString &msgBoxTitle, const QString &msgBoxText,
+    void continuePreviousGitCommand(const QString &msgBoxTitle, QString msgBoxText,
                                     const QString &buttonName, const QString &gitCommand);
 
     MergeToolProcess *m_process;
-- 
GitLab