Git: Suggest running mergetool if pull fails

Change-Id: Ic2fe525ea9e63a5ecdd1ab23dc07ede810aa192e
Reviewed-by: Tobias Hunger <tobias.hunger@digia.com>
This commit is contained in:
Orgad Shaneh
2012-11-14 21:49:25 +02:00
committed by Orgad Shaneh
parent 7ba0433b2b
commit 099345d110
2 changed files with 27 additions and 24 deletions

View File

@@ -2036,11 +2036,6 @@ bool GitClient::synchronousFetch(const QString &workingDirectory, const QString
return resp.result == Utils::SynchronousProcessResponse::Finished; return resp.result == Utils::SynchronousProcessResponse::Finished;
} }
bool GitClient::synchronousPull(const QString &workingDirectory)
{
return synchronousPull(workingDirectory, settings()->boolValue(GitSettings::pullRebaseKey));
}
bool GitClient::synchronousPull(const QString &workingDirectory, bool rebase) bool GitClient::synchronousPull(const QString &workingDirectory, bool rebase)
{ {
QStringList arguments(QLatin1String("pull")); QStringList arguments(QLatin1String("pull"));
@@ -2051,28 +2046,37 @@ bool GitClient::synchronousPull(const QString &workingDirectory, bool rebase)
const Utils::SynchronousProcessResponse resp = synchronousGit(workingDirectory, arguments, flags); const Utils::SynchronousProcessResponse resp = synchronousGit(workingDirectory, arguments, flags);
// Notify about changed files or abort the rebase. // Notify about changed files or abort the rebase.
const bool ok = resp.result == Utils::SynchronousProcessResponse::Finished; const bool ok = resp.result == Utils::SynchronousProcessResponse::Finished;
if (ok) { if (ok)
GitPlugin::instance()->gitVersionControl()->emitRepositoryChanged(workingDirectory); GitPlugin::instance()->gitVersionControl()->emitRepositoryChanged(workingDirectory);
} else { else
if (rebase) handleMergeConflicts(workingDirectory, rebase);
syncAbortPullRebase(workingDirectory);
}
return ok; return ok;
} }
void GitClient::syncAbortPullRebase(const QString &workingDir) void GitClient::handleMergeConflicts(const QString &workingDir, bool rebase)
{ {
// Abort rebase to clean if something goes wrong QMessageBox mergeOrAbort(QMessageBox::Question, tr("Conflicts detected"),
VcsBase::VcsBaseOutputWindow *outwin = VcsBase::VcsBaseOutputWindow::instance(); tr("Conflicts detected"), QMessageBox::Ignore | QMessageBox::Abort);
outwin->appendError(tr("The command 'git pull --rebase' failed, aborting rebase.")); mergeOrAbort.addButton(tr("Run Merge Tool"), QMessageBox::ActionRole);
QStringList arguments; switch (mergeOrAbort.exec()) {
arguments << QLatin1String("rebase") << QLatin1String("--abort"); case QMessageBox::Abort: {
QByteArray stdOut; // Abort merge/rebase to clean if something goes wrong
QByteArray stdErr; VcsBase::VcsBaseOutputWindow *outwin = VcsBase::VcsBaseOutputWindow::instance();
const bool rc = fullySynchronousGit(workingDir, arguments, &stdOut, &stdErr, true); QStringList arguments;
outwin->append(commandOutputFromLocal8Bit(stdOut)); arguments << QLatin1String(rebase ? "rebase" : "merge") << QLatin1String("--abort");
if (!rc) QByteArray stdOut;
outwin->appendError(commandOutputFromLocal8Bit(stdErr)); QByteArray stdErr;
const bool rc = fullySynchronousGit(workingDir, arguments, &stdOut, &stdErr, true);
outwin->append(commandOutputFromLocal8Bit(stdOut));
if (!rc)
outwin->appendError(commandOutputFromLocal8Bit(stdErr));
break;
}
case QMessageBox::Ignore:
break;
default: // Merge
merge(workingDir);
}
} }
// Subversion: git svn // Subversion: git svn

View File

@@ -167,7 +167,6 @@ public:
bool cloneRepository(const QString &directory, const QByteArray &url); bool cloneRepository(const QString &directory, const QByteArray &url);
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 synchronousPull(const QString &workingDirectory, bool rebase); bool synchronousPull(const QString &workingDirectory, bool rebase);
bool synchronousPush(const QString &workingDirectory, const QString &remote = QString()); bool synchronousPush(const QString &workingDirectory, const QString &remote = QString());
@@ -285,7 +284,7 @@ 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);
void syncAbortPullRebase(const QString &workingDir); void handleMergeConflicts(const QString &workingDir, bool rebase);
bool tryLauchingGitK(const QProcessEnvironment &env, bool tryLauchingGitK(const QProcessEnvironment &env,
const QString &workingDirectory, const QString &workingDirectory,
const QString &gitBinDirectory, const QString &gitBinDirectory,