From 177f7740363d5e16561af166ddb42772e40c5eb2 Mon Sep 17 00:00:00 2001
From: Orgad Shaneh <orgad.shaneh@audiocodes.com>
Date: Tue, 22 Jan 2013 21:27:54 +0200
Subject: [PATCH] Git: Use StashGuard for merge and rebase

Change-Id: I7c9059396aaac78c769518b34c7bf68bfe9932ec
Reviewed-by: Tobias Hunger <tobias.hunger@digia.com>
Reviewed-by: Petar Perisin <petar.perisin@gmail.com>
---
 src/plugins/git/branchdialog.cpp | 22 ++++++----------------
 src/plugins/git/gitclient.cpp    |  4 ++--
 src/plugins/git/gitclient.h      |  2 +-
 3 files changed, 9 insertions(+), 19 deletions(-)

diff --git a/src/plugins/git/branchdialog.cpp b/src/plugins/git/branchdialog.cpp
index d6f7bc20965..28e72fc8381 100644
--- a/src/plugins/git/branchdialog.cpp
+++ b/src/plugins/git/branchdialog.cpp
@@ -255,14 +255,9 @@ void BranchDialog::merge()
     QTC_CHECK(idx != m_model->currentBranch());            // otherwise the button would not be enabled!
 
     const QString branch = m_model->branchName(idx);
-    GitClient *gitClient = GitPlugin::instance()->gitClient();
-    QString stashMessage;
-
-    if (gitClient->gitStatus(m_repository, StatusMode(NoUntracked | NoSubmodules)) == GitClient::StatusChanged)
-        gitClient->ensureStash(m_repository, QLatin1String("merge"), false, &stashMessage);
-
-    if (gitClient->synchronousMerge(m_repository, branch) && !stashMessage.isEmpty())
-        gitClient->stashPop(m_repository, stashMessage);
+    GitClient::StashGuard stashGuard(m_repository, QLatin1String("merge"), false);
+    if (!GitPlugin::instance()->gitClient()->synchronousMerge(m_repository, branch))
+        stashGuard.preventPop();
 }
 
 void BranchDialog::rebase()
@@ -272,14 +267,9 @@ void BranchDialog::rebase()
     QTC_CHECK(idx != m_model->currentBranch());            // otherwise the button would not be enabled!
 
     const QString baseBranch = m_model->branchName(idx);
-    GitClient *gitClient = GitPlugin::instance()->gitClient();
-    QString stashMessage;
-
-    if (gitClient->gitStatus(m_repository, StatusMode(NoUntracked | NoSubmodules)) == GitClient::StatusChanged)
-        gitClient->ensureStash(m_repository, QLatin1String("rebase"), false, &stashMessage);
-
-    if (gitClient->synchronousRebase(m_repository, baseBranch) && !stashMessage.isEmpty())
-        gitClient->stashPop(m_repository, stashMessage);
+    GitClient::StashGuard stashGuard(m_repository, QLatin1String("rebase"), false);
+    if (!GitPlugin::instance()->gitClient()->synchronousRebase(m_repository, baseBranch))
+        stashGuard.preventPop();
 }
 
 void BranchDialog::changeEvent(QEvent *e)
diff --git a/src/plugins/git/gitclient.cpp b/src/plugins/git/gitclient.cpp
index d6a13095086..283b52a66a7 100644
--- a/src/plugins/git/gitclient.cpp
+++ b/src/plugins/git/gitclient.cpp
@@ -2530,13 +2530,13 @@ unsigned GitClient::synchronousGitVersion(QString *errorMessage) const
     return version(major, minor, patch);
 }
 
-GitClient::StashGuard::StashGuard(const QString &workingDirectory, const QString &keyword) :
+GitClient::StashGuard::StashGuard(const QString &workingDirectory, const QString &keyword, bool askUser) :
     pop(true),
     workingDir(workingDirectory)
 {
     client = GitPlugin::instance()->gitClient();
     QString errorMessage;
-    stashResult = client->ensureStash(workingDir, keyword, true, &message, &errorMessage);
+    stashResult = client->ensureStash(workingDir, keyword, askUser, &message, &errorMessage);
     if (stashResult == GitClient::StashFailed)
         VcsBase::VcsBaseOutputWindow::instance()->appendError(errorMessage);
 }
diff --git a/src/plugins/git/gitclient.h b/src/plugins/git/gitclient.h
index 9f77b0501b0..9c3e0bb2c75 100644
--- a/src/plugins/git/gitclient.h
+++ b/src/plugins/git/gitclient.h
@@ -88,7 +88,7 @@ public:
     class StashGuard
     {
     public:
-        StashGuard(const QString &workingDirectory, const QString &keyword);
+        StashGuard(const QString &workingDirectory, const QString &keyword, bool askUser = true);
         ~StashGuard();
 
         void preventPop();
-- 
GitLab