Utils: Use CommandLine in ConsoleProcess

Change-Id: I380b91513fa342819cba898196c91443622d0ae2
Reviewed-by: David Schulz <david.schulz@qt.io>
This commit is contained in:
hjk
2019-06-12 15:25:51 +02:00
parent 1455ab6c07
commit 465d4cc845
7 changed files with 38 additions and 18 deletions

View File

@@ -35,8 +35,9 @@ class QSettings;
QT_END_NAMESPACE QT_END_NAMESPACE
namespace Utils { namespace Utils {
class Environment; class Environment;
struct ConsoleProcessPrivate; class CommandLine;
class QTCREATOR_UTILS_EXPORT TerminalCommand class QTCREATOR_UTILS_EXPORT TerminalCommand
{ {
@@ -61,6 +62,8 @@ public:
ConsoleProcess(QObject *parent = nullptr); ConsoleProcess(QObject *parent = nullptr);
~ConsoleProcess() override; ~ConsoleProcess() override;
void setCommand(const Utils::CommandLine &command);
void setWorkingDirectory(const QString &dir); void setWorkingDirectory(const QString &dir);
QString workingDirectory() const; QString workingDirectory() const;
@@ -70,7 +73,8 @@ public:
QProcess::ProcessError error() const; QProcess::ProcessError error() const;
QString errorString() const; QString errorString() const;
bool start(const QString &program, const QString &args); bool start();
public slots: public slots:
void stop(); void stop();
@@ -156,7 +160,7 @@ private:
void cleanupInferior(); void cleanupInferior();
#endif #endif
ConsoleProcessPrivate *d; struct ConsoleProcessPrivate *d;
}; };
} //namespace Utils } //namespace Utils

View File

@@ -53,7 +53,7 @@ struct ConsoleProcessPrivate {
Environment m_environment; Environment m_environment;
qint64 m_appPid = 0; qint64 m_appPid = 0;
int m_appCode; int m_appCode;
QString m_executable; CommandLine m_commandLine;
QProcess::ExitStatus m_appStatus; QProcess::ExitStatus m_appStatus;
QLocalServer m_stubServer; QLocalServer m_stubServer;
QLocalSocket *m_stubSocket = nullptr; QLocalSocket *m_stubSocket = nullptr;

View File

@@ -60,12 +60,17 @@ qint64 ConsoleProcess::applicationMainThreadID() const
return -1; return -1;
} }
void ConsoleProcess::setCommand(const Utils::CommandLine &command)
{
d->m_commandLine = command;
}
void ConsoleProcess::setSettings(QSettings *settings) void ConsoleProcess::setSettings(QSettings *settings)
{ {
d->m_settings = settings; d->m_settings = settings;
} }
bool ConsoleProcess::start(const QString &program, const QString &args) bool ConsoleProcess::start()
{ {
if (isRunning()) if (isRunning())
return false; return false;
@@ -74,11 +79,12 @@ bool ConsoleProcess::start(const QString &program, const QString &args)
d->m_error = QProcess::UnknownError; d->m_error = QProcess::UnknownError;
QtcProcess::SplitError perr; 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); &d->m_environment, &d->m_workingDir);
QString pcmd; QString pcmd;
if (perr == QtcProcess::SplitOk) { if (perr == QtcProcess::SplitOk) {
pcmd = program; pcmd = d->m_commandLine.executable().toString();
} else { } else {
if (perr != QtcProcess::FoundMeta) { if (perr != QtcProcess::FoundMeta) {
emitError(QProcess::FailedToStart, tr("Quoting error in command.")); 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"); pcmd = QLatin1String("/bin/sh");
pargs = QtcProcess::Arguments::createUnixArgs( 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; 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); connect(d->m_stubConnectTimer, &QTimer::timeout, this, &ConsoleProcess::stop);
d->m_stubConnectTimer->setSingleShot(true); d->m_stubConnectTimer->setSingleShot(true);
d->m_stubConnectTimer->start(10000); d->m_stubConnectTimer->start(10000);
d->m_executable = program;
return true; return true;
} }
@@ -285,7 +291,7 @@ void ConsoleProcess::readStubOutput()
if (out.startsWith("err:chdir ")) { if (out.startsWith("err:chdir ")) {
emitError(QProcess::FailedToStart, msgCannotChangeToWorkDir(workingDirectory(), errorMsg(out.mid(10).toInt()))); emitError(QProcess::FailedToStart, msgCannotChangeToWorkDir(workingDirectory(), errorMsg(out.mid(10).toInt())));
} else if (out.startsWith("err:exec ")) { } 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 ")) { } else if (out.startsWith("spid ")) {
delete d->m_tempFile; delete d->m_tempFile;
d->m_tempFile = nullptr; d->m_tempFile = nullptr;

View File

@@ -46,12 +46,17 @@ ConsoleProcess::ConsoleProcess(QObject *parent) :
this, &ConsoleProcess::stubConnectionAvailable); this, &ConsoleProcess::stubConnectionAvailable);
} }
void ConsoleProcess::setCommand(const Utils::CommandLine &command)
{
d->m_commandLine = command;
}
qint64 ConsoleProcess::applicationMainThreadID() const qint64 ConsoleProcess::applicationMainThreadID() const
{ {
return d->m_appMainThreadId; return d->m_appMainThreadId;
} }
bool ConsoleProcess::start(const QString &program, const QString &args) bool ConsoleProcess::start()
{ {
if (isRunning()) if (isRunning())
return false; return false;
@@ -62,11 +67,13 @@ bool ConsoleProcess::start(const QString &program, const QString &args)
QString pcmd; QString pcmd;
QString pargs; QString pargs;
if (d->m_mode != Run) { // The debugger engines already pre-process the arguments. if (d->m_mode != Run) { // The debugger engines already pre-process the arguments.
pcmd = program; pcmd = d->m_commandLine.executable().toString();
pargs = args; pargs = d->m_commandLine.arguments();
} else { } else {
QtcProcess::Arguments outArgs; 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); &d->m_environment, &d->m_workingDir);
pargs = outArgs.toWindowsArgs(); pargs = outArgs.toWindowsArgs();
} }
@@ -207,7 +214,7 @@ void ConsoleProcess::readStubOutput()
if (out.startsWith("err:chdir ")) { if (out.startsWith("err:chdir ")) {
emitError(QProcess::FailedToStart, msgCannotChangeToWorkDir(workingDirectory(), winErrorMessage(out.mid(10).toInt()))); emitError(QProcess::FailedToStart, msgCannotChangeToWorkDir(workingDirectory(), winErrorMessage(out.mid(10).toInt())));
} else if (out.startsWith("err:exec ")) { } 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 } else if (out.startsWith("thread ")) { // Windows only
d->m_appMainThreadId = out.mid(7).toLongLong(); d->m_appMainThreadId = out.mid(7).toLongLong();
} else if (out.startsWith("pid ")) { } else if (out.startsWith("pid ")) {

View File

@@ -196,7 +196,8 @@ void TerminalRunner::start()
} }
// Error message for user is delivered via a signal. // 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() void TerminalRunner::stop()

View File

@@ -382,7 +382,8 @@ void ApplicationLauncherPrivate::start(const Runnable &runnable, const IDevice::
m_guiProcess.closeWriteChannel(); m_guiProcess.closeWriteChannel();
m_guiProcess.start(); m_guiProcess.start();
} else { } else {
m_consoleProcess.start(runnable.executable, runnable.commandLineArguments); m_consoleProcess.setCommand(runnable.commandLine());
m_consoleProcess.start();
} }
} else { } else {
QTC_ASSERT(m_state == Inactive, return); QTC_ASSERT(m_state == Inactive, return);

View File

@@ -201,7 +201,8 @@ void SshDeviceProcess::handleConnected()
this, &SshDeviceProcess::handleProcessStarted); this, &SshDeviceProcess::handleProcessStarted);
connect(&d->consoleProcess, &ConsoleProcess::stubStopped, connect(&d->consoleProcess, &ConsoleProcess::stubStopped,
this, [this] { handleProcessFinished(d->consoleProcess.errorString()); }); 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 { } else {
connect(d->process.get(), &QSsh::SshRemoteProcess::started, connect(d->process.get(), &QSsh::SshRemoteProcess::started,
this, &SshDeviceProcess::handleProcessStarted); this, &SshDeviceProcess::handleProcessStarted);