Git: Refactored "synchronousPullOrRebase" to be more general.

This can ease adding commands that can cause conflicts like cherry-pick,
revert, merge, rebase, stash pop ...

Change-Id: Id9df7f11307dbbcb60036a20a2c22c5097ba239f
Reviewed-by: Tobias Hunger <tobias.hunger@digia.com>
This commit is contained in:
Petar Perisin
2013-01-08 00:17:18 +01:00
committed by Tobias Hunger
parent ff288af50b
commit 40eecd87c9
3 changed files with 53 additions and 30 deletions

View File

@@ -2107,7 +2107,7 @@ bool GitClient::synchronousFetch(const QString &workingDirectory, const QString
return resp.result == Utils::SynchronousProcessResponse::Finished; return resp.result == Utils::SynchronousProcessResponse::Finished;
} }
bool GitClient::synchronousMergeOrRebase(const QString &workingDirectory, const QStringList &arguments, bool rebase) bool GitClient::executeAndHandleConflicts(const QString &workingDirectory, const QStringList &arguments, const QString &abortCommand)
{ {
// Disable UNIX terminals to suppress SSH prompting. // Disable UNIX terminals to suppress SSH prompting.
const unsigned flags = VcsBase::VcsBasePlugin::SshPasswordPrompt|VcsBase::VcsBasePlugin::ShowStdOutInLogWindow; const unsigned flags = VcsBase::VcsBasePlugin::SshPasswordPrompt|VcsBase::VcsBasePlugin::ShowStdOutInLogWindow;
@@ -2117,42 +2117,58 @@ bool GitClient::synchronousMergeOrRebase(const QString &workingDirectory, const
if (ok) if (ok)
GitPlugin::instance()->gitVersionControl()->emitRepositoryChanged(workingDirectory); GitPlugin::instance()->gitVersionControl()->emitRepositoryChanged(workingDirectory);
else if (resp.stdOut.contains(QLatin1String("CONFLICT"))) else if (resp.stdOut.contains(QLatin1String("CONFLICT")))
handleMergeConflicts(workingDirectory, rebase); handleMergeConflicts(workingDirectory, abortCommand);
return ok; return ok;
} }
bool GitClient::synchronousPull(const QString &workingDirectory, bool rebase) bool GitClient::synchronousPull(const QString &workingDirectory, bool rebase)
{ {
QStringList arguments(QLatin1String("pull")); QString abortCommand;
if (rebase) QStringList arguments;
if (rebase) {
arguments << QLatin1String("--rebase"); arguments << QLatin1String("--rebase");
return synchronousMergeOrRebase(workingDirectory, arguments, rebase); abortCommand = QLatin1String("rebase");
} else {
abortCommand = QLatin1String("merge");
}
return executeAndHandleConflicts(workingDirectory, arguments, abortCommand);
} }
bool GitClient::synchronousRebaseContinue(const QString &workingDirectory) bool GitClient::synchronousCommandContinue(const QString &workingDirectory, const QString &command)
{ {
QStringList arguments(QLatin1String("rebase")); QStringList arguments;
arguments << QLatin1String("--continue"); arguments << command << QLatin1String("--continue");
return synchronousMergeOrRebase(workingDirectory, arguments, true); return executeAndHandleConflicts(workingDirectory, arguments, command);
} }
void GitClient::handleMergeConflicts(const QString &workingDir, bool rebase) void GitClient::synchronousAbortCommand(const QString &workingDir, const QString &abortCommand)
{
// Abort to clean if something goes wrong
if (abortCommand.isEmpty()) {
// no abort command - checkout index to clean working copy.
synchronousCheckoutFiles(findRepositoryForDirectory(workingDir), QStringList(), QString(), 0, false);
return;
}
VcsBase::VcsBaseOutputWindow *outwin = VcsBase::VcsBaseOutputWindow::instance();
QStringList arguments;
arguments << abortCommand << QLatin1String("--abort");
QByteArray stdOut;
QByteArray stdErr;
const bool rc = fullySynchronousGit(workingDir, arguments, &stdOut, &stdErr, true);
outwin->append(commandOutputFromLocal8Bit(stdOut));
if (!rc)
outwin->appendError(commandOutputFromLocal8Bit(stdErr));
}
void GitClient::handleMergeConflicts(const QString &workingDir, const QString &abortCommand)
{ {
QMessageBox mergeOrAbort(QMessageBox::Question, tr("Conflicts detected"), QMessageBox mergeOrAbort(QMessageBox::Question, tr("Conflicts detected"),
tr("Conflicts detected"), QMessageBox::Ignore | QMessageBox::Abort); tr("Conflicts detected"), QMessageBox::Ignore | QMessageBox::Abort);
mergeOrAbort.addButton(tr("Run Merge Tool"), QMessageBox::ActionRole); mergeOrAbort.addButton(tr("Run Merge Tool"), QMessageBox::ActionRole);
switch (mergeOrAbort.exec()) { switch (mergeOrAbort.exec()) {
case QMessageBox::Abort: { case QMessageBox::Abort: {
// Abort merge/rebase to clean if something goes wrong synchronousAbortCommand(workingDir, abortCommand);
VcsBase::VcsBaseOutputWindow *outwin = VcsBase::VcsBaseOutputWindow::instance();
QStringList arguments;
arguments << QLatin1String(rebase ? "rebase" : "merge") << QLatin1String("--abort");
QByteArray stdOut;
QByteArray stdErr;
const bool rc = fullySynchronousGit(workingDir, arguments, &stdOut, &stdErr, true);
outwin->append(commandOutputFromLocal8Bit(stdOut));
if (!rc)
outwin->appendError(commandOutputFromLocal8Bit(stdErr));
break; break;
} }
case QMessageBox::Ignore: case QMessageBox::Ignore:
@@ -2209,19 +2225,24 @@ bool GitClient::synchronousPush(const QString &workingDirectory, const QString &
bool GitClient::synchronousMerge(const QString &workingDirectory, const QString &branch) bool GitClient::synchronousMerge(const QString &workingDirectory, const QString &branch)
{ {
QStringList arguments(QLatin1String("merge")); QString command = QLatin1String("merge");
arguments << branch; QStringList arguments;
return synchronousMergeOrRebase(workingDirectory, arguments, false);
arguments << command << branch;
return executeAndHandleConflicts(workingDirectory, arguments, command);
} }
bool GitClient::synchronousRebase(const QString &workingDirectory, const QString &baseBranch, bool GitClient::synchronousRebase(const QString &workingDirectory, const QString &baseBranch,
const QString &topicBranch) const QString &topicBranch)
{ {
QStringList arguments(QLatin1String("rebase")); QString command = QLatin1String("rebase");
arguments << baseBranch; QStringList arguments;
arguments << command << baseBranch;
if (!topicBranch.isEmpty()) if (!topicBranch.isEmpty())
arguments << topicBranch; arguments << topicBranch;
return synchronousMergeOrRebase(workingDirectory, arguments, true);
return executeAndHandleConflicts(workingDirectory, arguments, command);
} }
QString GitClient::msgNoChangedFiles() QString GitClient::msgNoChangedFiles()

View File

@@ -178,7 +178,7 @@ public:
QString vcsGetRepositoryURL(const QString &directory); QString vcsGetRepositoryURL(const QString &directory);
bool synchronousFetch(const QString &workingDirectory, const QString &remote); bool synchronousFetch(const QString &workingDirectory, const QString &remote);
bool synchronousPull(const QString &workingDirectory, bool rebase); bool synchronousPull(const QString &workingDirectory, bool rebase);
bool synchronousRebaseContinue(const QString &workingDirectory); bool synchronousCommandContinue(const QString &workingDirectory, const QString &command);
bool synchronousPush(const QString &workingDirectory, const QString &remote = QString()); bool synchronousPush(const QString &workingDirectory, const QString &remote = QString());
bool synchronousMerge(const QString &workingDirectory, const QString &branch); bool synchronousMerge(const QString &workingDirectory, const QString &branch);
bool synchronousRebase(const QString &workingDirectory, bool synchronousRebase(const QString &workingDirectory,
@@ -301,8 +301,10 @@ private:
QString *errorMessage, QString *errorMessage,
bool revertStaging); bool revertStaging);
void connectRepositoryChanged(const QString & repository, VcsBase::Command *cmd); void connectRepositoryChanged(const QString & repository, VcsBase::Command *cmd);
bool synchronousMergeOrRebase(const QString &workingDirectory, const QStringList &arguments, bool rebase); bool executeAndHandleConflicts(const QString &workingDirectory, const QStringList &arguments,
void handleMergeConflicts(const QString &workingDir, bool rebase); const QString &abortCommand = QString());
void synchronousAbortCommand(const QString &workingDir, const QString &abortCommand);
void handleMergeConflicts(const QString &workingDir, const QString &abortCommand);
bool tryLauchingGitK(const QProcessEnvironment &env, bool tryLauchingGitK(const QProcessEnvironment &env,
const QString &workingDirectory, const QString &workingDirectory,
const QString &fileName, const QString &fileName,

View File

@@ -267,7 +267,7 @@ void MergeTool::done()
if (QMessageBox::question(0, tr("Continue Rebase"), if (QMessageBox::question(0, tr("Continue Rebase"),
tr("Continue rebase?"), tr("Continue rebase?"),
QMessageBox::Yes, QMessageBox::No) == QMessageBox::Yes) { QMessageBox::Yes, QMessageBox::No) == QMessageBox::Yes) {
client->synchronousRebaseContinue(workingDirectory); client->synchronousCommandContinue(workingDirectory, QLatin1String("rebase"));
} }
} }
} else { } else {