summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRobert Loehning <robert.loehning@nokia.com>2010-07-30 19:39:55 +0200
committerRobert Loehning <robert.loehning@nokia.com>2010-07-30 19:39:55 +0200
commite2347b3d9202ac55e08cc069f8659adc6ec250c3 (patch)
treed1108f0fec5cc38e261cfb02112125ac67e16452
parent308b462973bf90802d28bc946176f526f5bd302a (diff)
downloadqt-creator-e2347b3d9202ac55e08cc069f8659adc6ec250c3.tar.gz
git: Added an option to undo unstaged changes only
-rw-r--r--src/plugins/git/gitclient.cpp28
-rw-r--r--src/plugins/git/gitclient.h10
-rw-r--r--src/plugins/git/gitplugin.cpp17
-rw-r--r--src/plugins/git/gitplugin.h3
4 files changed, 42 insertions, 16 deletions
diff --git a/src/plugins/git/gitclient.cpp b/src/plugins/git/gitclient.cpp
index 335a85068c..9f9a646ea1 100644
--- a/src/plugins/git/gitclient.cpp
+++ b/src/plugins/git/gitclient.cpp
@@ -584,18 +584,22 @@ bool GitClient::synchronousInit(const QString &workingDirectory)
bool GitClient::synchronousCheckoutFiles(const QString &workingDirectory,
QStringList files /* = QStringList() */,
QString revision /* = QString() */,
- QString *errorMessage /* = 0 */)
+ QString *errorMessage /* = 0 */,
+ bool revertStaging /* = true */)
{
if (Git::Constants::debug)
qDebug() << Q_FUNC_INFO << workingDirectory << files;
- if (revision.isEmpty())
+ if (revertStaging && revision.isEmpty())
revision = QLatin1String("HEAD");
if (files.isEmpty())
files = QStringList(QString(QLatin1Char('.')));
QByteArray outputText;
QByteArray errorText;
QStringList arguments;
- arguments << QLatin1String("checkout") << revision << QLatin1String("--") << files;
+ arguments << QLatin1String("checkout");
+ if (revertStaging)
+ arguments << revision;
+ arguments << QLatin1String("--") << files;
const bool rc = synchronousGit(workingDirectory, arguments, &outputText, &errorText);
if (!rc) {
const QString fileArg = files.join(QLatin1String(", "));
@@ -1392,7 +1396,10 @@ bool GitClient::addAndCommit(const QString &repositoryDirectory,
* reverting a directory pending a sophisticated selection dialog in the
* VCSBase plugin. */
-GitClient::RevertResult GitClient::revertI(QStringList files, bool *ptrToIsDirectory, QString *errorMessage)
+GitClient::RevertResult GitClient::revertI(QStringList files,
+ bool *ptrToIsDirectory,
+ QString *errorMessage,
+ bool revertStaging)
{
if (Git::Constants::debug)
qDebug() << Q_FUNC_INFO << files;
@@ -1454,7 +1461,7 @@ GitClient::RevertResult GitClient::revertI(QStringList files, bool *ptrToIsDirec
if (Git::Constants::debug)
qDebug() << Q_FUNC_INFO << data.stagedFiles << data.unstagedFiles << allStagedFiles << allUnstagedFiles << stagedFiles << unstagedFiles;
- if (stagedFiles.empty() && unstagedFiles.empty())
+ if ((!revertStaging || stagedFiles.empty()) && unstagedFiles.empty())
return RevertUnchanged;
// Ask to revert (to do: Handle lists with a selection dialog)
@@ -1468,19 +1475,22 @@ GitClient::RevertResult GitClient::revertI(QStringList files, bool *ptrToIsDirec
return RevertCanceled;
// Unstage the staged files
- if (!stagedFiles.empty() && !synchronousReset(repoDirectory, stagedFiles, errorMessage))
+ if (revertStaging && !stagedFiles.empty() && !synchronousReset(repoDirectory, stagedFiles, errorMessage))
return RevertFailed;
+ QStringList filesToRevert = unstagedFiles;
+ if (revertStaging)
+ filesToRevert += stagedFiles;
// Finally revert!
- if (!synchronousCheckoutFiles(repoDirectory, stagedFiles + unstagedFiles, QString(), errorMessage))
+ if (!synchronousCheckoutFiles(repoDirectory, filesToRevert, QString(), errorMessage, revertStaging))
return RevertFailed;
return RevertOk;
}
-void GitClient::revert(const QStringList &files)
+void GitClient::revert(const QStringList &files, bool revertStaging)
{
bool isDirectory;
QString errorMessage;
- switch (revertI(files, &isDirectory, &errorMessage)) {
+ switch (revertI(files, &isDirectory, &errorMessage, revertStaging)) {
case RevertOk:
m_plugin->gitVersionControl()->emitFilesChanged(files);
break;
diff --git a/src/plugins/git/gitclient.h b/src/plugins/git/gitclient.h
index 3d65928b6c..8c7670d021 100644
--- a/src/plugins/git/gitclient.h
+++ b/src/plugins/git/gitclient.h
@@ -106,7 +106,8 @@ public:
bool synchronousInit(const QString &workingDirectory);
bool synchronousCheckoutFiles(const QString &workingDirectory,
QStringList files = QStringList(),
- QString revision = QString(), QString *errorMessage = 0);
+ QString revision = QString(), QString *errorMessage = 0,
+ bool revertStaging = true);
// Checkout branch
bool synchronousCheckoutBranch(const QString &workingDirectory, const QString &branch, QString *errorMessage = 0);
@@ -156,7 +157,7 @@ public:
void subversionLog(const QString &workingDirectory);
void stashPop(const QString &workingDirectory);
- void revert(const QStringList &files);
+ void revert(const QStringList &files, bool revertStaging);
void branchList(const QString &workingDirectory);
void stashList(const QString &workingDirectory);
bool synchronousStashList(const QString &workingDirectory,
@@ -241,7 +242,10 @@ private:
unsigned synchronousGitVersion(bool silent, QString *errorMessage = 0);
enum RevertResult { RevertOk, RevertUnchanged, RevertCanceled, RevertFailed };
- RevertResult revertI(QStringList files, bool *isDirectory, QString *errorMessage);
+ RevertResult revertI(QStringList files,
+ bool *isDirectory,
+ QString *errorMessage,
+ bool revertStaging);
void connectRepositoryChanged(const QString & repository, GitCommand *cmd);
void pull(const QString &workingDirectory, bool rebase);
diff --git a/src/plugins/git/gitplugin.cpp b/src/plugins/git/gitplugin.cpp
index b54607b447..e5f17b0c5f 100644
--- a/src/plugins/git/gitplugin.cpp
+++ b/src/plugins/git/gitplugin.cpp
@@ -335,8 +335,14 @@ bool GitPlugin::initialize(const QStringList &arguments, QString *errorMessage)
parameterActionCommand.second->setDefaultKeySequence(QKeySequence(tr("Alt+G,Alt+B")));
parameterActionCommand
+ = createFileAction(actionManager, gitContainer,
+ tr("Undo Unstaged Changes"), tr("Undo Unstaged Changes for \"%1\""),
+ QLatin1String("Git.UndoUnstaged"), globalcontext,
+ true, SLOT(undoUnstagedFileChanges()));
+
+ parameterActionCommand
= createFileAction(actionManager, gitContainer,
- tr("Undo Changes"), tr("Undo Changes for \"%1\""),
+ tr("Undo Uncommitted Changes"), tr("Undo Uncommitted Changes for \"%1\""),
QLatin1String("Git.Undo"), globalcontext,
true, SLOT(undoFileChanges()));
parameterActionCommand.second->setDefaultKeySequence(QKeySequence(tr("Alt+G,Alt+U")));
@@ -560,12 +566,17 @@ void GitPlugin::logProject()
m_gitClient->log(state.currentProjectTopLevel(), state.relativeCurrentProject());
}
-void GitPlugin::undoFileChanges()
+void GitPlugin::undoFileChanges(bool revertStaging)
{
const VCSBase::VCSBasePluginState state = currentState();
QTC_ASSERT(state.hasFile(), return)
Core::FileChangeBlocker fcb(state.currentFile());
- m_gitClient->revert(QStringList(state.currentFile()));
+ m_gitClient->revert(QStringList(state.currentFile()), revertStaging);
+}
+
+void GitPlugin::undoUnstagedFileChanges()
+{
+ undoFileChanges(false);
}
void GitPlugin::undoRepositoryChanges()
diff --git a/src/plugins/git/gitplugin.h b/src/plugins/git/gitplugin.h
index 676362cc69..16852d9cd9 100644
--- a/src/plugins/git/gitplugin.h
+++ b/src/plugins/git/gitplugin.h
@@ -108,7 +108,8 @@ private slots:
void logFile();
void blameFile();
void logProject();
- void undoFileChanges();
+ void undoFileChanges(bool revertStaging = true);
+ void undoUnstagedFileChanges();
void undoRepositoryChanges();
void stageFile();
void unstageFile();