diff --git a/src/plugins/vcsbase/command.cpp b/src/plugins/vcsbase/command.cpp index 63d2825260bd7b579db2c2fc1da3600f7f7e3e0e..24fd466e9fa36b929438e9754657c9c5d7d436ce 100644 --- a/src/plugins/vcsbase/command.cpp +++ b/src/plugins/vcsbase/command.cpp @@ -104,6 +104,7 @@ public: bool m_progressiveOutput; bool m_hadOutput; bool m_preventRepositoryChanged; + bool m_aborted; QFutureWatcher<void> m_watcher; QList<Job> m_jobs; @@ -127,6 +128,7 @@ CommandPrivate::CommandPrivate(const QString &binary, m_progressiveOutput(false), m_hadOutput(false), m_preventRepositoryChanged(false), + m_aborted(false), m_lastExecSuccess(false), m_lastExecExitCode(-1) { @@ -229,6 +231,12 @@ void Command::execute() Core::Id::fromString(binary + QLatin1String(".action"))); } +void Command::abort() +{ + d->m_aborted = true; + d->m_watcher.future().cancel(); +} + void Command::cancel() { emit terminate(); @@ -277,23 +285,18 @@ void Command::run(QFutureInterface<void> &future) break; } - const QString canceledMessage = tr("Canceled"); - if (d->m_progressiveOutput) { - if (!d->m_hadOutput && future.isCanceled()) - emit output(canceledMessage); - } else { - if (stdOut.isEmpty() && future.isCanceled()) - emit output(canceledMessage); - else + if (!d->m_aborted) { + if (!d->m_progressiveOutput) { emit output(stdOut); - if (!stdErr.isEmpty()) - emit errorText(stdErr); - } + if (!stdErr.isEmpty()) + emit errorText(stdErr); + } - emit finished(d->m_lastExecSuccess, d->m_lastExecExitCode, cookie()); - if (d->m_lastExecSuccess) - emit success(cookie()); - future.setProgressValue(future.progressMaximum()); + emit finished(d->m_lastExecSuccess, d->m_lastExecExitCode, cookie()); + if (d->m_lastExecSuccess) + emit success(cookie()); + future.setProgressValue(future.progressMaximum()); + } if (d->m_progressParser) d->m_progressParser->setFuture(0); @@ -420,12 +423,14 @@ Utils::SynchronousProcessResponse Command::runVcs(const QStringList &arguments, response = process.run(d->m_binaryPath, arguments); } - // Success/Fail message in appropriate window? - if (response.result == Utils::SynchronousProcessResponse::Finished) { - if (d->m_flags & VcsBasePlugin::ShowSuccessMessage) - emit outputProxy.appendMessage(response.exitMessage(d->m_binaryPath, timeoutMS)); - } else if (!(d->m_flags & VcsBasePlugin::SuppressFailMessageInLogWindow)) { - emit outputProxy.appendError(response.exitMessage(d->m_binaryPath, timeoutMS)); + if (!d->m_aborted) { + // Success/Fail message in appropriate window? + if (response.result == Utils::SynchronousProcessResponse::Finished) { + if (d->m_flags & VcsBasePlugin::ShowSuccessMessage) + emit outputProxy.appendMessage(response.exitMessage(d->m_binaryPath, timeoutMS)); + } else if (!(d->m_flags & VcsBasePlugin::SuppressFailMessageInLogWindow)) { + emit outputProxy.appendError(response.exitMessage(d->m_binaryPath, timeoutMS)); + } } emitRepositoryChanged(); @@ -467,22 +472,24 @@ Utils::SynchronousProcessResponse Command::runSynchronous(const QStringList &arg !Utils::SynchronousProcess::readDataFromProcess(*process.data(), timeoutMS, &stdOut, &stdErr, true); - OutputProxy outputProxy; - if (!stdErr.isEmpty()) { - response.stdErr = Utils::SynchronousProcess::normalizeNewlines( - d->m_codec ? d->m_codec->toUnicode(stdErr) : QString::fromLocal8Bit(stdErr)); - if (!(d->m_flags & VcsBasePlugin::SuppressStdErrInLogWindow)) - emit outputProxy.append(response.stdErr); - } + if (!d->m_aborted) { + OutputProxy outputProxy; + if (!stdErr.isEmpty()) { + response.stdErr = Utils::SynchronousProcess::normalizeNewlines( + d->m_codec ? d->m_codec->toUnicode(stdErr) : QString::fromLocal8Bit(stdErr)); + if (!(d->m_flags & VcsBasePlugin::SuppressStdErrInLogWindow)) + emit outputProxy.append(response.stdErr); + } - if (!stdOut.isEmpty()) { - response.stdOut = Utils::SynchronousProcess::normalizeNewlines( - d->m_codec ? d->m_codec->toUnicode(stdOut) : QString::fromLocal8Bit(stdOut)); - if (d->m_flags & VcsBasePlugin::ShowStdOutInLogWindow) { - if (d->m_flags & VcsBasePlugin::SilentOutput) - emit outputProxy.appendSilently(response.stdOut); - else - emit outputProxy.append(response.stdOut); + if (!stdOut.isEmpty()) { + response.stdOut = Utils::SynchronousProcess::normalizeNewlines( + d->m_codec ? d->m_codec->toUnicode(stdOut) : QString::fromLocal8Bit(stdOut)); + if (d->m_flags & VcsBasePlugin::ShowStdOutInLogWindow) { + if (d->m_flags & VcsBasePlugin::SilentOutput) + emit outputProxy.appendSilently(response.stdOut); + else + emit outputProxy.append(response.stdOut); + } } } @@ -570,7 +577,7 @@ void Command::bufferedError(const QString &text) void Command::coreAboutToClose() { d->m_preventRepositoryChanged = true; - cancel(); + abort(); } const QVariant &Command::cookie() const diff --git a/src/plugins/vcsbase/command.h b/src/plugins/vcsbase/command.h index cbc65224e083c32eacdc274cc9c677d3fd4a5b99..b44dc3e57a6f5224854dac75359c0de87644f9a7 100644 --- a/src/plugins/vcsbase/command.h +++ b/src/plugins/vcsbase/command.h @@ -80,6 +80,7 @@ public: void addJob(const QStringList &arguments, Utils::ExitCodeInterpreter *interpreter = 0); void addJob(const QStringList &arguments, int timeout, Utils::ExitCodeInterpreter *interpreter = 0); void execute(); + void abort(); bool lastExecutionSuccess() const; int lastExecutionExitCode() const;