From f23922f84a16f1c469014a5763729a6f40c5fac0 Mon Sep 17 00:00:00 2001 From: Petar Perisin <petar.perisin@gmail.com> Date: Tue, 14 Jan 2014 19:58:46 +0100 Subject: [PATCH] Git: Added ability to checkout and reset in GitEditor Especially useful in reflog. Change-Id: I1d63221f152ebc7e69934482785b433d016e4ead Reviewed-by: Tobias Hunger <tobias.hunger@digia.com> Reviewed-by: Orgad Shaneh <orgads@gmail.com> Reviewed-by: Petar Perisin <petar.perisin@gmail.com> --- src/plugins/git/giteditor.cpp | 29 +++++++++++++++++++++++++++++ src/plugins/git/giteditor.h | 2 ++ 2 files changed, 31 insertions(+) diff --git a/src/plugins/git/giteditor.cpp b/src/plugins/git/giteditor.cpp index c21b6166ddb..8e979d8208b 100644 --- a/src/plugins/git/giteditor.cpp +++ b/src/plugins/git/giteditor.cpp @@ -37,6 +37,7 @@ #include "gitconstants.h" #include "githighlighters.h" +#include <coreplugin/icore.h> #include <utils/qtcassert.h> #include <vcsbase/vcsbaseoutputwindow.h> #include <texteditor/basetextdocument.h> @@ -212,6 +213,32 @@ void GitEditor::commandFinishedGotoLine(bool ok, int exitCode, const QVariant &v } } +void GitEditor::checkoutChange() +{ + const QFileInfo fi(source()); + const QString workingDirectory = fi.isDir() ? fi.absoluteFilePath() : fi.absolutePath(); + GitPlugin::instance()->gitClient()->stashAndCheckout(workingDirectory, m_currentChange); +} + +void GitEditor::resetChange() +{ + const QFileInfo fi(source()); + const QString workingDir = fi.isDir() ? fi.absoluteFilePath() : fi.absolutePath(); + + GitClient *client = GitPlugin::instance()->gitClient(); + if (client->gitStatus(workingDir, StatusMode(NoUntracked | NoSubmodules)) + != GitClient::StatusUnchanged) { + if (QMessageBox::question( + Core::ICore::mainWindow(), tr("Reset"), + tr("All changes in working directory will be discarded. Are you sure?"), + QMessageBox::Yes | QMessageBox::No, + QMessageBox::No) == QMessageBox::No) { + return; + } + } + client->reset(workingDir, QLatin1String("--hard"), m_currentChange); +} + void GitEditor::cherryPickChange() { const QFileInfo fi(source()); @@ -344,6 +371,8 @@ void GitEditor::addChangeActions(QMenu *menu, const QString &change) if (contentType() != VcsBase::OtherContent) { menu->addAction(tr("Cherry-Pick Change %1").arg(change), this, SLOT(cherryPickChange())); menu->addAction(tr("Revert Change %1").arg(change), this, SLOT(revertChange())); + menu->addAction(tr("Checkout Change %1").arg(change), this, SLOT(checkoutChange())); + menu->addAction(tr("Hard Reset to Change %1").arg(change), this, SLOT(resetChange())); } } diff --git a/src/plugins/git/giteditor.h b/src/plugins/git/giteditor.h index 5943485e344..35bfd53ef34 100644 --- a/src/plugins/git/giteditor.h +++ b/src/plugins/git/giteditor.h @@ -55,6 +55,8 @@ public slots: void commandFinishedGotoLine(bool ok, int exitCode, const QVariant &v); private slots: + void checkoutChange(); + void resetChange(); void cherryPickChange(); void revertChange(); void stageDiffChunk(); -- GitLab