From 465d4cc845364ce6457af83ae1298f2daabc4664 Mon Sep 17 00:00:00 2001 From: hjk Date: Wed, 12 Jun 2019 15:25:51 +0200 Subject: [PATCH] Utils: Use CommandLine in ConsoleProcess Change-Id: I380b91513fa342819cba898196c91443622d0ae2 Reviewed-by: David Schulz --- src/libs/utils/consoleprocess.h | 10 +++++++--- src/libs/utils/consoleprocess_p.h | 2 +- src/libs/utils/consoleprocess_unix.cpp | 18 ++++++++++++------ src/libs/utils/consoleprocess_win.cpp | 17 ++++++++++++----- src/plugins/debugger/terminal.cpp | 3 ++- .../projectexplorer/applicationlauncher.cpp | 3 ++- .../devicesupport/sshdeviceprocess.cpp | 3 ++- 7 files changed, 38 insertions(+), 18 deletions(-) diff --git a/src/libs/utils/consoleprocess.h b/src/libs/utils/consoleprocess.h index 28be67f0bf2..1ae0bb44968 100644 --- a/src/libs/utils/consoleprocess.h +++ b/src/libs/utils/consoleprocess.h @@ -35,8 +35,9 @@ class QSettings; QT_END_NAMESPACE namespace Utils { + class Environment; -struct ConsoleProcessPrivate; +class CommandLine; class QTCREATOR_UTILS_EXPORT TerminalCommand { @@ -61,6 +62,8 @@ public: ConsoleProcess(QObject *parent = nullptr); ~ConsoleProcess() override; + void setCommand(const Utils::CommandLine &command); + void setWorkingDirectory(const QString &dir); QString workingDirectory() const; @@ -70,7 +73,8 @@ public: QProcess::ProcessError error() const; QString errorString() const; - bool start(const QString &program, const QString &args); + bool start(); + public slots: void stop(); @@ -156,7 +160,7 @@ private: void cleanupInferior(); #endif - ConsoleProcessPrivate *d; + struct ConsoleProcessPrivate *d; }; } //namespace Utils diff --git a/src/libs/utils/consoleprocess_p.h b/src/libs/utils/consoleprocess_p.h index 5d8d1934934..b32be8c5867 100644 --- a/src/libs/utils/consoleprocess_p.h +++ b/src/libs/utils/consoleprocess_p.h @@ -53,7 +53,7 @@ struct ConsoleProcessPrivate { Environment m_environment; qint64 m_appPid = 0; int m_appCode; - QString m_executable; + CommandLine m_commandLine; QProcess::ExitStatus m_appStatus; QLocalServer m_stubServer; QLocalSocket *m_stubSocket = nullptr; diff --git a/src/libs/utils/consoleprocess_unix.cpp b/src/libs/utils/consoleprocess_unix.cpp index 53a8c958487..6b02f92c249 100644 --- a/src/libs/utils/consoleprocess_unix.cpp +++ b/src/libs/utils/consoleprocess_unix.cpp @@ -60,12 +60,17 @@ qint64 ConsoleProcess::applicationMainThreadID() const return -1; } +void ConsoleProcess::setCommand(const Utils::CommandLine &command) +{ + d->m_commandLine = command; +} + void ConsoleProcess::setSettings(QSettings *settings) { d->m_settings = settings; } -bool ConsoleProcess::start(const QString &program, const QString &args) +bool ConsoleProcess::start() { if (isRunning()) return false; @@ -74,11 +79,12 @@ bool ConsoleProcess::start(const QString &program, const QString &args) d->m_error = QProcess::UnknownError; QtcProcess::SplitError perr; - QtcProcess::Arguments pargs = QtcProcess::prepareArgs(args, &perr, HostOsInfo::hostOs(), + QtcProcess::Arguments pargs = QtcProcess::prepareArgs(d->m_commandLine.arguments(), + &perr, HostOsInfo::hostOs(), &d->m_environment, &d->m_workingDir); QString pcmd; if (perr == QtcProcess::SplitOk) { - pcmd = program; + pcmd = d->m_commandLine.executable().toString(); } else { if (perr != QtcProcess::FoundMeta) { emitError(QProcess::FailedToStart, tr("Quoting error in command.")); @@ -92,7 +98,8 @@ bool ConsoleProcess::start(const QString &program, const QString &args) } pcmd = QLatin1String("/bin/sh"); pargs = QtcProcess::Arguments::createUnixArgs( - QStringList({"-c", (QtcProcess::quoteArg(program) + ' ' + args)})); + {"-c", (QtcProcess::quoteArg(d->m_commandLine.executable().toString()) + + ' ' + d->m_commandLine.arguments())}); } QtcProcess::SplitError qerr; @@ -166,7 +173,6 @@ bool ConsoleProcess::start(const QString &program, const QString &args) connect(d->m_stubConnectTimer, &QTimer::timeout, this, &ConsoleProcess::stop); d->m_stubConnectTimer->setSingleShot(true); d->m_stubConnectTimer->start(10000); - d->m_executable = program; return true; } @@ -285,7 +291,7 @@ void ConsoleProcess::readStubOutput() if (out.startsWith("err:chdir ")) { emitError(QProcess::FailedToStart, msgCannotChangeToWorkDir(workingDirectory(), errorMsg(out.mid(10).toInt()))); } else if (out.startsWith("err:exec ")) { - emitError(QProcess::FailedToStart, msgCannotExecute(d->m_executable, errorMsg(out.mid(9).toInt()))); + emitError(QProcess::FailedToStart, msgCannotExecute(d->m_commandLine.executable().toString(), errorMsg(out.mid(9).toInt()))); } else if (out.startsWith("spid ")) { delete d->m_tempFile; d->m_tempFile = nullptr; diff --git a/src/libs/utils/consoleprocess_win.cpp b/src/libs/utils/consoleprocess_win.cpp index 2a68ddaba82..fdead4db853 100644 --- a/src/libs/utils/consoleprocess_win.cpp +++ b/src/libs/utils/consoleprocess_win.cpp @@ -46,12 +46,17 @@ ConsoleProcess::ConsoleProcess(QObject *parent) : this, &ConsoleProcess::stubConnectionAvailable); } +void ConsoleProcess::setCommand(const Utils::CommandLine &command) +{ + d->m_commandLine = command; +} + qint64 ConsoleProcess::applicationMainThreadID() const { return d->m_appMainThreadId; } -bool ConsoleProcess::start(const QString &program, const QString &args) +bool ConsoleProcess::start() { if (isRunning()) return false; @@ -62,11 +67,13 @@ bool ConsoleProcess::start(const QString &program, const QString &args) QString pcmd; QString pargs; if (d->m_mode != Run) { // The debugger engines already pre-process the arguments. - pcmd = program; - pargs = args; + pcmd = d->m_commandLine.executable().toString(); + pargs = d->m_commandLine.arguments(); } else { QtcProcess::Arguments outArgs; - QtcProcess::prepareCommand(program, args, &pcmd, &outArgs, OsTypeWindows, + QtcProcess::prepareCommand(d->m_commandLine.executable().toString(), + d->m_commandLine.arguments(), + &pcmd, &outArgs, OsTypeWindows, &d->m_environment, &d->m_workingDir); pargs = outArgs.toWindowsArgs(); } @@ -207,7 +214,7 @@ void ConsoleProcess::readStubOutput() if (out.startsWith("err:chdir ")) { emitError(QProcess::FailedToStart, msgCannotChangeToWorkDir(workingDirectory(), winErrorMessage(out.mid(10).toInt()))); } else if (out.startsWith("err:exec ")) { - emitError(QProcess::FailedToStart, msgCannotExecute(d->m_executable, winErrorMessage(out.mid(9).toInt()))); + emitError(QProcess::FailedToStart, msgCannotExecute(d->m_commandLine.executable().toUserOutput(), winErrorMessage(out.mid(9).toInt()))); } else if (out.startsWith("thread ")) { // Windows only d->m_appMainThreadId = out.mid(7).toLongLong(); } else if (out.startsWith("pid ")) { diff --git a/src/plugins/debugger/terminal.cpp b/src/plugins/debugger/terminal.cpp index 654adde42f1..f9fcb2a7a34 100644 --- a/src/plugins/debugger/terminal.cpp +++ b/src/plugins/debugger/terminal.cpp @@ -196,7 +196,8 @@ void TerminalRunner::start() } // Error message for user is delivered via a signal. - m_stubProc.start(m_stubRunnable.executable, m_stubRunnable.commandLineArguments); + m_stubProc.setCommand(m_stubRunnable.commandLine()); + m_stubProc.start(); } void TerminalRunner::stop() diff --git a/src/plugins/projectexplorer/applicationlauncher.cpp b/src/plugins/projectexplorer/applicationlauncher.cpp index 3a9cde2baf9..e0a725716ac 100644 --- a/src/plugins/projectexplorer/applicationlauncher.cpp +++ b/src/plugins/projectexplorer/applicationlauncher.cpp @@ -382,7 +382,8 @@ void ApplicationLauncherPrivate::start(const Runnable &runnable, const IDevice:: m_guiProcess.closeWriteChannel(); m_guiProcess.start(); } else { - m_consoleProcess.start(runnable.executable, runnable.commandLineArguments); + m_consoleProcess.setCommand(runnable.commandLine()); + m_consoleProcess.start(); } } else { QTC_ASSERT(m_state == Inactive, return); diff --git a/src/plugins/projectexplorer/devicesupport/sshdeviceprocess.cpp b/src/plugins/projectexplorer/devicesupport/sshdeviceprocess.cpp index 030e4057a3d..a4b0857820d 100644 --- a/src/plugins/projectexplorer/devicesupport/sshdeviceprocess.cpp +++ b/src/plugins/projectexplorer/devicesupport/sshdeviceprocess.cpp @@ -201,7 +201,8 @@ void SshDeviceProcess::handleConnected() this, &SshDeviceProcess::handleProcessStarted); connect(&d->consoleProcess, &ConsoleProcess::stubStopped, this, [this] { handleProcessFinished(d->consoleProcess.errorString()); }); - d->consoleProcess.start(cmdLine.first(), cmdLine.mid(1).join(' ')); + d->consoleProcess.setCommand({FilePath::fromString(cmdLine.first()), cmdLine.mid(1)}); + d->consoleProcess.start(); } else { connect(d->process.get(), &QSsh::SshRemoteProcess::started, this, &SshDeviceProcess::handleProcessStarted);