diff --git a/src/plugins/git/branchmodel.cpp b/src/plugins/git/branchmodel.cpp index 047b3ebf99d..35340e0731e 100644 --- a/src/plugins/git/branchmodel.cpp +++ b/src/plugins/git/branchmodel.cpp @@ -529,7 +529,7 @@ void BranchModel::checkoutBranch(const QModelIndex &idx) // No StashGuard since this function for now is only used with clean working dir. // If it is ever used from another place, please add StashGuard here - m_client->synchronousCheckout(m_workingDirectory, branch); + m_client->checkout(m_workingDirectory, branch, GitClient::StashMode::NoStash); } bool BranchModel::branchIsMerged(const QModelIndex &idx) diff --git a/src/plugins/git/gerrit/gerritplugin.cpp b/src/plugins/git/gerrit/gerritplugin.cpp index d409f939060..13a49c4903a 100644 --- a/src/plugins/git/gerrit/gerritplugin.cpp +++ b/src/plugins/git/gerrit/gerritplugin.cpp @@ -254,7 +254,7 @@ void FetchContext::cherryPick() void FetchContext::checkout() { - GitPlugin::client()->stashAndCheckout(m_repository, "FETCH_HEAD"); + GitPlugin::client()->checkout(m_repository, "FETCH_HEAD"); } void FetchContext::terminate() diff --git a/src/plugins/git/gitclient.cpp b/src/plugins/git/gitclient.cpp index 6809d89ddf3..eb527339baf 100644 --- a/src/plugins/git/gitclient.cpp +++ b/src/plugins/git/gitclient.cpp @@ -1113,21 +1113,22 @@ VcsBaseEditorWidget *GitClient::annotate( return editor; } -bool GitClient::synchronousCheckout(const QString &workingDirectory, - const QString &ref, - QString *errorMessage) +void GitClient::checkout(const QString &workingDirectory, const QString &ref, + StashMode stashMode) { + if (stashMode == StashMode::TryStash && !beginStashScope(workingDirectory, "Checkout")) + return; QStringList arguments = setupCheckoutArguments(workingDirectory, ref); - const SynchronousProcessResponse resp = vcsFullySynchronousExec( - workingDirectory, arguments, VcsCommand::ExpectRepoChanges); - VcsOutputWindow::append(resp.stdOut()); - if (resp.result == SynchronousProcessResponse::Finished) { - updateSubmodulesIfNeeded(workingDirectory, true); - return true; - } else { - msgCannotRun(arguments, workingDirectory, resp.stdErr(), errorMessage); - return false; - } + VcsCommand *command = vcsExec( + workingDirectory, arguments, nullptr, true, + VcsCommand::ExpectRepoChanges | VcsCommand::ShowSuccessMessage); + connect(command, &VcsCommand::finished, + this, [this, workingDirectory, stashMode](bool success) { + if (stashMode == StashMode::TryStash) + endStashScope(workingDirectory); + if (success) + updateSubmodulesIfNeeded(workingDirectory, true); + }); } /* method used to setup arguments for checkout, in case user wants to create local branch */ @@ -1358,16 +1359,6 @@ bool GitClient::synchronousCheckoutFiles(const QString &workingDirectory, QStrin return true; } -bool GitClient::stashAndCheckout(const QString &workingDirectory, const QString &ref) -{ - if (!beginStashScope(workingDirectory, "Checkout")) - return false; - if (!synchronousCheckout(workingDirectory, ref)) - return false; - endStashScope(workingDirectory); - return true; -} - static inline QString msgParentRevisionFailed(const QString &workingDirectory, const QString &revision, const QString &why) diff --git a/src/plugins/git/gitclient.h b/src/plugins/git/gitclient.h index 30df75fb907..59b64ae2027 100644 --- a/src/plugins/git/gitclient.h +++ b/src/plugins/git/gitclient.h @@ -173,10 +173,9 @@ public: bool synchronousCheckoutFiles(const QString &workingDirectory, QStringList files = QStringList(), QString revision = QString(), QString *errorMessage = nullptr, bool revertStaging = true); - // Checkout ref - bool stashAndCheckout(const QString &workingDirectory, const QString &ref); - bool synchronousCheckout(const QString &workingDirectory, const QString &ref, - QString *errorMessage = nullptr); + enum class StashMode { NoStash, TryStash }; + void checkout(const QString &workingDirectory, const QString &ref, + StashMode stashMode = StashMode::TryStash); QStringList setupCheckoutArguments(const QString &workingDirectory, const QString &ref); void updateSubmodulesIfNeeded(const QString &workingDirectory, bool prompt); diff --git a/src/plugins/git/giteditor.cpp b/src/plugins/git/giteditor.cpp index 2e6746cf646..d4688fa85ff 100644 --- a/src/plugins/git/giteditor.cpp +++ b/src/plugins/git/giteditor.cpp @@ -191,7 +191,7 @@ void GitEditorWidget::setPlainText(const QString &text) void GitEditorWidget::checkoutChange() { - GitPlugin::client()->stashAndCheckout(sourceWorkingDirectory(), m_currentChange); + GitPlugin::client()->checkout(sourceWorkingDirectory(), m_currentChange); } void GitEditorWidget::resetChange(const QByteArray &resetType) diff --git a/src/plugins/git/gitplugin.cpp b/src/plugins/git/gitplugin.cpp index 8a3fef260b2..35ef47a978c 100644 --- a/src/plugins/git/gitplugin.cpp +++ b/src/plugins/git/gitplugin.cpp @@ -861,7 +861,7 @@ void GitPlugin::startChangeRelatedAction(const Id &id) m_gitClient->synchronousRevert(workingDirectory, change); break; case Checkout: - m_gitClient->stashAndCheckout(workingDirectory, change); + m_gitClient->checkout(workingDirectory, change); break; default: return;