forked from qt-creator/qt-creator
Utils: Use CommandLine in ConsoleProcess
Change-Id: I380b91513fa342819cba898196c91443622d0ae2 Reviewed-by: David Schulz <david.schulz@qt.io>
This commit is contained in:
@@ -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
|
||||||
|
@@ -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;
|
||||||
|
@@ -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;
|
||||||
|
@@ -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 ")) {
|
||||||
|
@@ -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()
|
||||||
|
@@ -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);
|
||||||
|
@@ -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);
|
||||||
|
Reference in New Issue
Block a user