From 27e53f746f9ffaee13f167619ad4061dc442abd5 Mon Sep 17 00:00:00 2001 From: Orgad Shaneh Date: Wed, 28 Aug 2013 21:15:18 +0300 Subject: [PATCH] VCS: Enable terminating a command Change-Id: I2160a22e300aca9b38e28257375c8e0be2026d12 Reviewed-by: Tobias Hunger --- src/libs/utils/synchronousprocess.cpp | 5 +++++ src/libs/utils/synchronousprocess.h | 3 +++ src/plugins/vcsbase/command.cpp | 7 ++++++- src/plugins/vcsbase/command.h | 2 ++ 4 files changed, 16 insertions(+), 1 deletion(-) diff --git a/src/libs/utils/synchronousprocess.cpp b/src/libs/utils/synchronousprocess.cpp index 7fb83c64770..9e1f56bb106 100644 --- a/src/libs/utils/synchronousprocess.cpp +++ b/src/libs/utils/synchronousprocess.cpp @@ -402,6 +402,11 @@ SynchronousProcessResponse SynchronousProcess::run(const QString &binary, return d->m_result; } +bool SynchronousProcess::terminate() +{ + return stopProcess(d->m_process); +} + static inline bool askToKill(const QString &binary = QString()) { if (!isGuiThread()) diff --git a/src/libs/utils/synchronousprocess.h b/src/libs/utils/synchronousprocess.h index 96c600c00f4..5aa1183d759 100644 --- a/src/libs/utils/synchronousprocess.h +++ b/src/libs/utils/synchronousprocess.h @@ -145,6 +145,9 @@ signals: void stdOutBuffered(const QString &data, bool firstTime); void stdErrBuffered(const QString &data, bool firstTime); +public slots: + bool terminate(); + private slots: void slotTimeout(); void finished(int exitCode, QProcess::ExitStatus e); diff --git a/src/plugins/vcsbase/command.cpp b/src/plugins/vcsbase/command.cpp index 57d36c3575c..97532a93316 100644 --- a/src/plugins/vcsbase/command.cpp +++ b/src/plugins/vcsbase/command.cpp @@ -213,6 +213,11 @@ void Command::execute() Core::ICore::progressManager()->addTask(task, taskName, binary + QLatin1String(".action")); } +void Command::terminate() +{ + emit doTerminate(); +} + bool Command::lastExecutionSuccess() const { return d->m_lastExecSuccess; @@ -346,8 +351,8 @@ Utils::SynchronousProcessResponse Command::runVcs(const QStringList &arguments, if (d->m_flags & VcsBasePlugin::FullySynchronously) { response = runSynchronous(arguments, timeoutMS); } else { - // Run, connect stderr to the output window Utils::SynchronousProcess process; + connect(this, SIGNAL(doTerminate()), &process, SLOT(terminate())); if (!d->m_workingDirectory.isEmpty()) process.setWorkingDirectory(d->m_workingDirectory); diff --git a/src/plugins/vcsbase/command.h b/src/plugins/vcsbase/command.h index 7931cc974ee..e0164dd7f47 100644 --- a/src/plugins/vcsbase/command.h +++ b/src/plugins/vcsbase/command.h @@ -80,6 +80,7 @@ public: void addJob(const QStringList &arguments); void addJob(const QStringList &arguments, int timeout); void execute(); + void terminate(); bool lastExecutionSuccess() const; int lastExecutionExitCode() const; @@ -118,6 +119,7 @@ signals: void errorText(const QString &); void finished(bool ok, int exitCode, const QVariant &cookie); void success(const QVariant &cookie); + void doTerminate(); private: class Internal::CommandPrivate *const d;