forked from qt-creator/qt-creator
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:
committed by
Tobias Hunger
parent
ff288af50b
commit
40eecd87c9
@@ -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()
|
||||||
|
|||||||
@@ -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,
|
||||||
|
|||||||
@@ -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 {
|
||||||
|
|||||||
Reference in New Issue
Block a user