forked from qt-creator/qt-creator
Move more internal data into ProcessSetupData
It's going to be reused in other parts of implementation. Change-Id: I4721bba28537d3f00c20c0f3c8e5ca633dc8727e Reviewed-by: hjk <hjk@qt.io>
This commit is contained in:
@@ -316,6 +316,7 @@ public:
|
|||||||
m_process->setStandardInputFile(m_setup->m_standardInputFile);
|
m_process->setStandardInputFile(m_setup->m_standardInputFile);
|
||||||
m_process->setProcessChannelMode(m_setup->m_procesChannelMode);
|
m_process->setProcessChannelMode(m_setup->m_procesChannelMode);
|
||||||
m_process->setErrorString(m_setup->m_initialErrorString);
|
m_process->setErrorString(m_setup->m_initialErrorString);
|
||||||
|
m_setup->m_initialErrorString.clear();
|
||||||
if (m_setup->m_lowPriority)
|
if (m_setup->m_lowPriority)
|
||||||
m_process->setLowPriority();
|
m_process->setLowPriority();
|
||||||
if (m_setup->m_unixTerminalDisabled)
|
if (m_setup->m_unixTerminalDisabled)
|
||||||
@@ -408,6 +409,7 @@ public:
|
|||||||
m_handle->setStandardInputFile(m_setup->m_standardInputFile);
|
m_handle->setStandardInputFile(m_setup->m_standardInputFile);
|
||||||
m_handle->setProcessChannelMode(m_setup->m_procesChannelMode);
|
m_handle->setProcessChannelMode(m_setup->m_procesChannelMode);
|
||||||
m_handle->setErrorString(m_setup->m_initialErrorString);
|
m_handle->setErrorString(m_setup->m_initialErrorString);
|
||||||
|
m_setup->m_initialErrorString.clear();
|
||||||
if (m_setup->m_belowNormalPriority)
|
if (m_setup->m_belowNormalPriority)
|
||||||
m_handle->setBelowNormalPriority();
|
m_handle->setBelowNormalPriority();
|
||||||
m_handle->setNativeArguments(m_setup->m_nativeArguments);
|
m_handle->setNativeArguments(m_setup->m_nativeArguments);
|
||||||
@@ -557,7 +559,7 @@ public:
|
|||||||
|
|
||||||
if (commandLine.executable().osType() == OsTypeWindows) {
|
if (commandLine.executable().osType() == OsTypeWindows) {
|
||||||
QString args;
|
QString args;
|
||||||
if (m_useCtrlCStub) {
|
if (m_setup.m_useCtrlCStub) {
|
||||||
if (m_setup.m_lowPriority)
|
if (m_setup.m_lowPriority)
|
||||||
ProcessArgs::addArg(&args, "-nice");
|
ProcessArgs::addArg(&args, "-nice");
|
||||||
ProcessArgs::addArg(&args, QDir::toNativeSeparators(commandString));
|
ProcessArgs::addArg(&args, QDir::toNativeSeparators(commandString));
|
||||||
@@ -568,7 +570,7 @@ public:
|
|||||||
m_setup.m_nativeArguments = args;
|
m_setup.m_nativeArguments = args;
|
||||||
// Note: Arguments set with setNativeArgs will be appended to the ones
|
// Note: Arguments set with setNativeArgs will be appended to the ones
|
||||||
// passed with start() below.
|
// passed with start() below.
|
||||||
start(commandString, QStringList(), workingDirectory, m_writeData);
|
start(commandString, QStringList(), workingDirectory, m_setup.m_writeData);
|
||||||
} else {
|
} else {
|
||||||
if (!success) {
|
if (!success) {
|
||||||
q->setErrorString(tr("Error in command line."));
|
q->setErrorString(tr("Error in command line."));
|
||||||
@@ -577,7 +579,7 @@ public:
|
|||||||
emit q->errorOccurred(QProcess::UnknownError);
|
emit q->errorOccurred(QProcess::UnknownError);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
start(commandString, arguments.toUnixArgs(), workingDirectory, m_writeData);
|
start(commandString, arguments.toUnixArgs(), workingDirectory, m_setup.m_writeData);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -596,21 +598,21 @@ public:
|
|||||||
|
|
||||||
CommandLine fullCommandLine() const
|
CommandLine fullCommandLine() const
|
||||||
{
|
{
|
||||||
if (!m_runAsRoot || HostOsInfo::isWindowsHost())
|
if (!m_setup.m_runAsRoot || HostOsInfo::isWindowsHost())
|
||||||
return m_commandLine;
|
return m_setup.m_commandLine;
|
||||||
CommandLine rootCommand("sudo", {"-A"});
|
CommandLine rootCommand("sudo", {"-A"});
|
||||||
rootCommand.addCommandLineAsArgs(m_commandLine);
|
rootCommand.addCommandLineAsArgs(m_setup.m_commandLine);
|
||||||
return rootCommand;
|
return rootCommand;
|
||||||
}
|
}
|
||||||
|
|
||||||
Environment fullEnvironment() const
|
Environment fullEnvironment() const
|
||||||
{
|
{
|
||||||
Environment env;
|
Environment env;
|
||||||
if (m_haveEnv) {
|
if (m_setup.m_haveEnv) {
|
||||||
if (m_environment.size() == 0)
|
if (m_setup.m_environment.size() == 0)
|
||||||
qWarning("QtcProcess::start: Empty environment set when running '%s'.",
|
qWarning("QtcProcess::start: Empty environment set when running '%s'.",
|
||||||
qPrintable(m_commandLine.executable().toString()));
|
qPrintable(m_setup.m_commandLine.executable().toString()));
|
||||||
env = m_environment;
|
env = m_setup.m_environment;
|
||||||
} else {
|
} else {
|
||||||
env = Environment::systemEnvironment();
|
env = Environment::systemEnvironment();
|
||||||
}
|
}
|
||||||
@@ -623,15 +625,7 @@ public:
|
|||||||
|
|
||||||
QtcProcess *q;
|
QtcProcess *q;
|
||||||
std::unique_ptr<ProcessInterface> m_process;
|
std::unique_ptr<ProcessInterface> m_process;
|
||||||
CommandLine m_commandLine;
|
|
||||||
FilePath m_workingDirectory;
|
|
||||||
Environment m_environment;
|
|
||||||
QByteArray m_writeData;
|
|
||||||
bool m_runAsRoot = false;
|
|
||||||
bool m_haveEnv = false;
|
|
||||||
bool m_useCtrlCStub = false;
|
|
||||||
ProcessSetupData m_setup;
|
ProcessSetupData m_setup;
|
||||||
QVariantHash m_extraData;
|
|
||||||
|
|
||||||
void slotTimeout();
|
void slotTimeout();
|
||||||
void slotFinished(int exitCode, QProcess::ExitStatus e);
|
void slotFinished(int exitCode, QProcess::ExitStatus e);
|
||||||
@@ -731,50 +725,50 @@ void QtcProcess::setProcessMode(ProcessMode processMode)
|
|||||||
|
|
||||||
void QtcProcess::setEnvironment(const Environment &env)
|
void QtcProcess::setEnvironment(const Environment &env)
|
||||||
{
|
{
|
||||||
d->m_environment = env;
|
d->m_setup.m_environment = env;
|
||||||
d->m_haveEnv = true;
|
d->m_setup.m_haveEnv = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
void QtcProcess::unsetEnvironment()
|
void QtcProcess::unsetEnvironment()
|
||||||
{
|
{
|
||||||
d->m_environment = Environment();
|
d->m_setup.m_environment = Environment();
|
||||||
d->m_haveEnv = false;
|
d->m_setup.m_haveEnv = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
const Environment &QtcProcess::environment() const
|
const Environment &QtcProcess::environment() const
|
||||||
{
|
{
|
||||||
return d->m_environment;
|
return d->m_setup.m_environment;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool QtcProcess::hasEnvironment() const
|
bool QtcProcess::hasEnvironment() const
|
||||||
{
|
{
|
||||||
return d->m_haveEnv;
|
return d->m_setup.m_haveEnv;
|
||||||
}
|
}
|
||||||
|
|
||||||
void QtcProcess::setCommand(const CommandLine &cmdLine)
|
void QtcProcess::setCommand(const CommandLine &cmdLine)
|
||||||
{
|
{
|
||||||
if (d->m_workingDirectory.needsDevice() && cmdLine.executable().needsDevice()) {
|
if (d->m_setup.m_workingDirectory.needsDevice() && cmdLine.executable().needsDevice()) {
|
||||||
QTC_CHECK(d->m_workingDirectory.host() == cmdLine.executable().host());
|
QTC_CHECK(d->m_setup.m_workingDirectory.host() == cmdLine.executable().host());
|
||||||
}
|
}
|
||||||
d->m_commandLine = cmdLine;
|
d->m_setup.m_commandLine = cmdLine;
|
||||||
}
|
}
|
||||||
|
|
||||||
const CommandLine &QtcProcess::commandLine() const
|
const CommandLine &QtcProcess::commandLine() const
|
||||||
{
|
{
|
||||||
return d->m_commandLine;
|
return d->m_setup.m_commandLine;
|
||||||
}
|
}
|
||||||
|
|
||||||
FilePath QtcProcess::workingDirectory() const
|
FilePath QtcProcess::workingDirectory() const
|
||||||
{
|
{
|
||||||
return d->m_workingDirectory;
|
return d->m_setup.m_workingDirectory;
|
||||||
}
|
}
|
||||||
|
|
||||||
void QtcProcess::setWorkingDirectory(const FilePath &dir)
|
void QtcProcess::setWorkingDirectory(const FilePath &dir)
|
||||||
{
|
{
|
||||||
if (dir.needsDevice() && d->m_commandLine.executable().needsDevice()) {
|
if (dir.needsDevice() && d->m_setup.m_commandLine.executable().needsDevice()) {
|
||||||
QTC_CHECK(dir.host() == d->m_commandLine.executable().host());
|
QTC_CHECK(dir.host() == d->m_setup.m_commandLine.executable().host());
|
||||||
}
|
}
|
||||||
d->m_workingDirectory = dir;
|
d->m_setup.m_workingDirectory = dir;
|
||||||
}
|
}
|
||||||
|
|
||||||
void QtcProcess::setUseCtrlCStub(bool enabled)
|
void QtcProcess::setUseCtrlCStub(bool enabled)
|
||||||
@@ -783,7 +777,7 @@ void QtcProcess::setUseCtrlCStub(bool enabled)
|
|||||||
// Qt Creator otherwise, because they share the same Windows console.
|
// Qt Creator otherwise, because they share the same Windows console.
|
||||||
// See QTCREATORBUG-11995 for details.
|
// See QTCREATORBUG-11995 for details.
|
||||||
#ifndef QT_DEBUG
|
#ifndef QT_DEBUG
|
||||||
d->m_useCtrlCStub = enabled;
|
d->m_setup.m_useCtrlCStub = enabled;
|
||||||
#else
|
#else
|
||||||
Q_UNUSED(enabled)
|
Q_UNUSED(enabled)
|
||||||
#endif
|
#endif
|
||||||
@@ -791,7 +785,7 @@ void QtcProcess::setUseCtrlCStub(bool enabled)
|
|||||||
|
|
||||||
void QtcProcess::start()
|
void QtcProcess::start()
|
||||||
{
|
{
|
||||||
if (d->m_commandLine.executable().needsDevice()) {
|
if (d->m_setup.m_commandLine.executable().needsDevice()) {
|
||||||
QTC_ASSERT(s_deviceHooks.startProcessHook, return);
|
QTC_ASSERT(s_deviceHooks.startProcessHook, return);
|
||||||
s_deviceHooks.startProcessHook(*this);
|
s_deviceHooks.startProcessHook(*this);
|
||||||
return;
|
return;
|
||||||
@@ -801,9 +795,9 @@ void QtcProcess::start()
|
|||||||
const CommandLine cmd = d->fullCommandLine();
|
const CommandLine cmd = d->fullCommandLine();
|
||||||
const Environment env = d->fullEnvironment();
|
const Environment env = d->fullEnvironment();
|
||||||
if (d->m_process->isCustomStart())
|
if (d->m_process->isCustomStart())
|
||||||
d->m_process->customStart(cmd, d->m_workingDirectory, env);
|
d->m_process->customStart(cmd, d->m_setup.m_workingDirectory, env);
|
||||||
else
|
else
|
||||||
d->defaultStart(cmd, d->m_workingDirectory, env);
|
d->defaultStart(cmd, d->m_setup.m_workingDirectory, env);
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef Q_OS_WIN
|
#ifdef Q_OS_WIN
|
||||||
@@ -834,7 +828,7 @@ BOOL CALLBACK sendInterruptMessageToAllWindowsOfProcess_enumWnd(HWND hwnd, LPARA
|
|||||||
void QtcProcess::terminate()
|
void QtcProcess::terminate()
|
||||||
{
|
{
|
||||||
#ifdef Q_OS_WIN
|
#ifdef Q_OS_WIN
|
||||||
if (d->m_useCtrlCStub)
|
if (d->m_setup.m_useCtrlCStub)
|
||||||
EnumWindows(sendShutDownMessageToAllWindowsOfProcess_enumWnd, processId());
|
EnumWindows(sendShutDownMessageToAllWindowsOfProcess_enumWnd, processId());
|
||||||
else
|
else
|
||||||
#endif
|
#endif
|
||||||
@@ -845,7 +839,7 @@ void QtcProcess::terminate()
|
|||||||
void QtcProcess::interrupt()
|
void QtcProcess::interrupt()
|
||||||
{
|
{
|
||||||
#ifdef Q_OS_WIN
|
#ifdef Q_OS_WIN
|
||||||
QTC_ASSERT(d->m_useCtrlCStub, return);
|
QTC_ASSERT(d->m_setup.m_useCtrlCStub, return);
|
||||||
EnumWindows(sendInterruptMessageToAllWindowsOfProcess_enumWnd, processId());
|
EnumWindows(sendInterruptMessageToAllWindowsOfProcess_enumWnd, processId());
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
@@ -875,12 +869,12 @@ void QtcProcess::setAbortOnMetaChars(bool abort)
|
|||||||
|
|
||||||
void QtcProcess::setRunAsRoot(bool on)
|
void QtcProcess::setRunAsRoot(bool on)
|
||||||
{
|
{
|
||||||
d->m_runAsRoot = on;
|
d->m_setup.m_runAsRoot = on;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool QtcProcess::isRunAsRoot() const
|
bool QtcProcess::isRunAsRoot() const
|
||||||
{
|
{
|
||||||
return d->m_runAsRoot;
|
return d->m_setup.m_runAsRoot;
|
||||||
}
|
}
|
||||||
|
|
||||||
void QtcProcess::setStandardInputFile(const QString &inputFile)
|
void QtcProcess::setStandardInputFile(const QString &inputFile)
|
||||||
@@ -892,39 +886,39 @@ QString QtcProcess::toStandaloneCommandLine() const
|
|||||||
{
|
{
|
||||||
QStringList parts;
|
QStringList parts;
|
||||||
parts.append("/usr/bin/env");
|
parts.append("/usr/bin/env");
|
||||||
if (!d->m_workingDirectory.isEmpty()) {
|
if (!d->m_setup.m_workingDirectory.isEmpty()) {
|
||||||
parts.append("-C");
|
parts.append("-C");
|
||||||
d->m_workingDirectory.path();
|
d->m_setup.m_workingDirectory.path();
|
||||||
}
|
}
|
||||||
parts.append("-i");
|
parts.append("-i");
|
||||||
if (d->m_environment.size() > 0) {
|
if (d->m_setup.m_environment.size() > 0) {
|
||||||
const QStringList envVars = d->m_environment.toStringList();
|
const QStringList envVars = d->m_setup.m_environment.toStringList();
|
||||||
std::transform(envVars.cbegin(), envVars.cend(),
|
std::transform(envVars.cbegin(), envVars.cend(),
|
||||||
std::back_inserter(parts), ProcessArgs::quoteArgUnix);
|
std::back_inserter(parts), ProcessArgs::quoteArgUnix);
|
||||||
}
|
}
|
||||||
parts.append(d->m_commandLine.executable().path());
|
parts.append(d->m_setup.m_commandLine.executable().path());
|
||||||
parts.append(d->m_commandLine.splitArguments());
|
parts.append(d->m_setup.m_commandLine.splitArguments());
|
||||||
return parts.join(" ");
|
return parts.join(" ");
|
||||||
}
|
}
|
||||||
|
|
||||||
void QtcProcess::setExtraData(const QString &key, const QVariant &value)
|
void QtcProcess::setExtraData(const QString &key, const QVariant &value)
|
||||||
{
|
{
|
||||||
d->m_extraData.insert(key, value);
|
d->m_setup.m_extraData.insert(key, value);
|
||||||
}
|
}
|
||||||
|
|
||||||
QVariant QtcProcess::extraData(const QString &key) const
|
QVariant QtcProcess::extraData(const QString &key) const
|
||||||
{
|
{
|
||||||
return d->m_extraData.value(key);
|
return d->m_setup.m_extraData.value(key);
|
||||||
}
|
}
|
||||||
|
|
||||||
void QtcProcess::setExtraData(const QVariantHash &extraData)
|
void QtcProcess::setExtraData(const QVariantHash &extraData)
|
||||||
{
|
{
|
||||||
d->m_extraData = extraData;
|
d->m_setup.m_extraData = extraData;
|
||||||
}
|
}
|
||||||
|
|
||||||
QVariantHash QtcProcess::extraData() const
|
QVariantHash QtcProcess::extraData() const
|
||||||
{
|
{
|
||||||
return d->m_extraData;
|
return d->m_setup.m_extraData;
|
||||||
}
|
}
|
||||||
|
|
||||||
void QtcProcess::setRemoteProcessHooks(const DeviceProcessHooks &hooks)
|
void QtcProcess::setRemoteProcessHooks(const DeviceProcessHooks &hooks)
|
||||||
@@ -1009,7 +1003,7 @@ bool QtcProcess::readDataFromProcess(int timeoutS,
|
|||||||
}
|
}
|
||||||
// Prompt user, pretend we have data if says 'No'.
|
// Prompt user, pretend we have data if says 'No'.
|
||||||
const bool hang = !hasData && !finished;
|
const bool hang = !hasData && !finished;
|
||||||
hasData = hang && showTimeOutMessageBox && !askToKill(d->m_commandLine.executable().path());
|
hasData = hang && showTimeOutMessageBox && !askToKill(d->m_setup.m_commandLine.executable().path());
|
||||||
} while (hasData && !finished);
|
} while (hasData && !finished);
|
||||||
if (syncDebug)
|
if (syncDebug)
|
||||||
qDebug() << "<readDataFromProcess" << finished;
|
qDebug() << "<readDataFromProcess" << finished;
|
||||||
@@ -1493,7 +1487,7 @@ void QtcProcess::setExitCodeInterpreter(const ExitCodeInterpreter &interpreter)
|
|||||||
|
|
||||||
void QtcProcess::setWriteData(const QByteArray &writeData)
|
void QtcProcess::setWriteData(const QByteArray &writeData)
|
||||||
{
|
{
|
||||||
d->m_writeData = writeData;
|
d->m_setup.m_writeData = writeData;
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef QT_GUI_LIB
|
#ifdef QT_GUI_LIB
|
||||||
@@ -1507,13 +1501,13 @@ void QtcProcess::runBlocking(QtcProcess::EventLoopMode eventLoopMode)
|
|||||||
{
|
{
|
||||||
// FIXME: Implement properly
|
// FIXME: Implement properly
|
||||||
|
|
||||||
if (d->m_commandLine.executable().needsDevice()) {
|
if (d->m_setup.m_commandLine.executable().needsDevice()) {
|
||||||
QtcProcess::start();
|
QtcProcess::start();
|
||||||
waitForFinished();
|
waitForFinished();
|
||||||
return;
|
return;
|
||||||
};
|
};
|
||||||
|
|
||||||
qCDebug(processLog).noquote() << "Starting blocking:" << d->m_commandLine.toUserOutput()
|
qCDebug(processLog).noquote() << "Starting blocking:" << d->m_setup.m_commandLine.toUserOutput()
|
||||||
<< " process user events: " << (eventLoopMode == QtcProcess::WithEventLoop);
|
<< " process user events: " << (eventLoopMode == QtcProcess::WithEventLoop);
|
||||||
ExecuteOnDestruction logResult([this] { qCDebug(processLog) << *this; });
|
ExecuteOnDestruction logResult([this] { qCDebug(processLog) << *this; });
|
||||||
|
|
||||||
@@ -1600,7 +1594,7 @@ void QtcProcessPrivate::slotTimeout()
|
|||||||
qDebug() << Q_FUNC_INFO << "HANG detected, killing";
|
qDebug() << Q_FUNC_INFO << "HANG detected, killing";
|
||||||
m_waitingForUser = true;
|
m_waitingForUser = true;
|
||||||
const bool terminate = !m_timeOutMessageBoxEnabled
|
const bool terminate = !m_timeOutMessageBoxEnabled
|
||||||
|| askToKill(m_commandLine.executable().toString());
|
|| askToKill(m_setup.m_commandLine.executable().toString());
|
||||||
m_waitingForUser = false;
|
m_waitingForUser = false;
|
||||||
if (terminate) {
|
if (terminate) {
|
||||||
q->stopProcess();
|
q->stopProcess();
|
||||||
|
|||||||
@@ -43,8 +43,6 @@ class tst_QtcProcess;
|
|||||||
|
|
||||||
namespace Utils {
|
namespace Utils {
|
||||||
|
|
||||||
class CommandLine;
|
|
||||||
class Environment;
|
|
||||||
class ProcessInterface;
|
class ProcessInterface;
|
||||||
class QtcProcess;
|
class QtcProcess;
|
||||||
|
|
||||||
@@ -253,6 +251,15 @@ public:
|
|||||||
ProcessMode m_processMode = ProcessMode::Reader;
|
ProcessMode m_processMode = ProcessMode::Reader;
|
||||||
QtcProcess::TerminalMode m_terminalMode = QtcProcess::TerminalOff;
|
QtcProcess::TerminalMode m_terminalMode = QtcProcess::TerminalOff;
|
||||||
|
|
||||||
|
CommandLine m_commandLine;
|
||||||
|
FilePath m_workingDirectory;
|
||||||
|
Environment m_environment;
|
||||||
|
QByteArray m_writeData;
|
||||||
|
bool m_runAsRoot = false;
|
||||||
|
bool m_haveEnv = false;
|
||||||
|
bool m_useCtrlCStub = false;
|
||||||
|
QVariantHash m_extraData;
|
||||||
|
|
||||||
QString m_nativeArguments;
|
QString m_nativeArguments;
|
||||||
QString m_standardInputFile;
|
QString m_standardInputFile;
|
||||||
QString m_initialErrorString;
|
QString m_initialErrorString;
|
||||||
|
|||||||
Reference in New Issue
Block a user