Utils: Move QtcProcess constructor setup data to shared setup data

This includes replacing DeviceProcess terminal handling with base
member.

Change-Id: Id1541bfce33c71dddc71b4816ad0b174dce3879c
Reviewed-by: Jarek Kobus <jaroslaw.kobus@qt.io>
This commit is contained in:
hjk
2022-02-10 19:25:03 +01:00
parent 825c89987c
commit e2cb64471a
23 changed files with 119 additions and 87 deletions

View File

@@ -118,7 +118,8 @@ static CreateAvdInfo createAvdCommand(const AndroidConfig &config, const CreateA
const FilePath avdManagerTool = config.avdManagerToolPath();
qCDebug(avdManagerLog)
<< "Running AVD Manager command:" << CommandLine(avdManagerTool, arguments).toUserOutput();
QtcProcess proc(ProcessMode::Writer);
QtcProcess proc;
proc.setProcessMode(ProcessMode::Writer);
proc.setEnvironment(AndroidConfigurations::toolsEnvironment(config));
proc.setCommand({avdManagerTool, arguments});
proc.start();

View File

@@ -1017,9 +1017,12 @@ void AndroidSdkManagerPrivate::getPendingLicense(SdkCmdFutureInterface &fi)
{
fi.setProgressRange(0, 100);
fi.setProgressValue(0);
AndroidSdkManager::OperationOutput result;
result.type = AndroidSdkManager::LicenseWorkflow;
QtcProcess licenseCommand(ProcessMode::Writer);
QtcProcess licenseCommand;
licenseCommand.setProcessMode(ProcessMode::Writer);
licenseCommand.setEnvironment(AndroidConfigurations::toolsEnvironment(m_config));
bool reviewingLicenses = false;
licenseCommand.setCommand(CommandLine(m_config.sdkManagerToolPath(), {"--licenses", sdkRootArg(m_config)}));

View File

@@ -182,9 +182,10 @@ void addCdbOptionPages(QList<Core::IOptionsPage *> *opts)
CdbEngine::CdbEngine() :
m_tokenPrefix("<token>"),
m_process(ProcessMode::Writer),
m_extensionCommandPrefix("!" QT_CREATOR_CDB_EXT ".")
{
m_process.setProcessMode(ProcessMode::Writer);
setObjectName("CdbEngine");
setDebuggerName("CDB");

View File

@@ -145,8 +145,9 @@ const char tracepointCapturePropertyName[] = "GDB.TracepointCapture";
///////////////////////////////////////////////////////////////////////
GdbEngine::GdbEngine()
: m_gdbProc(ProcessMode::Writer)
{
m_gdbProc.setProcessMode(ProcessMode::Writer);
setObjectName("GdbEngine");
setDebuggerName("GDB");

View File

@@ -82,8 +82,9 @@ static int &currentToken()
///////////////////////////////////////////////////////////////////////
LldbEngine::LldbEngine()
: m_lldbProc(ProcessMode::Writer)
{
m_lldbProc.setProcessMode(ProcessMode::Writer);
setObjectName("LldbEngine");
setDebuggerName("LLDB");

View File

@@ -63,8 +63,10 @@ using namespace Utils;
namespace Debugger {
namespace Internal {
PdbEngine::PdbEngine() : m_proc(ProcessMode::Writer)
PdbEngine::PdbEngine()
{
m_proc.setProcessMode(ProcessMode::Writer);
setObjectName("PdbEngine");
setDebuggerName("PDB");
}

View File

@@ -194,9 +194,10 @@ void TerminalRunner::start()
QTC_ASSERT(!m_stubProc, reportFailure({}); return);
Runnable stub = m_stubRunnable();
const QtcProcess::TerminalMode terminalMode = HostOsInfo::isWindowsHost()
? QtcProcess::TerminalSuspend : QtcProcess::TerminalDebug;
m_stubProc = new QtcProcess(terminalMode, this);
m_stubProc = new QtcProcess(this);
m_stubProc->setTerminalMode(HostOsInfo::isWindowsHost()
? QtcProcess::TerminalSuspend : QtcProcess::TerminalDebug);
connect(m_stubProc, &QtcProcess::errorOccurred,
this, &TerminalRunner::stubError);
connect(m_stubProc, &QtcProcess::started,

View File

@@ -112,8 +112,9 @@ public:
DockerDeviceProcess::DockerDeviceProcess(const QSharedPointer<const IDevice> &device,
QObject *parent)
: DeviceProcess(device, ProcessMode::Writer, parent)
: DeviceProcess(device, parent)
{
setProcessMode(ProcessMode::Writer);
}
void DockerDeviceProcess::start(const Runnable &runnable)
@@ -537,7 +538,9 @@ DockerDevice::DockerDevice(const DockerDeviceData &data)
return;
}
QtcProcess *proc = new QtcProcess(QtcProcess::TerminalOn);
QtcProcess *proc = new QtcProcess;
proc->setTerminalMode(QtcProcess::TerminalOn);
QObject::connect(proc, &QtcProcess::finished, proc, &QObject::deleteLater);
QObject::connect(proc, &DeviceProcess::errorOccurred, [proc] {
@@ -897,7 +900,8 @@ void DockerDevicePrivate::startContainer()
CommandLine dockerRun{"docker", {"container" , "start", "-i", "-a", m_container}};
LOG("RUNNING: " << dockerRun.toUserOutput());
QPointer<QtcProcess> shell = new QtcProcess(ProcessMode::Writer);
QPointer<QtcProcess> shell = new QtcProcess;
shell->setProcessMode(ProcessMode::Writer);
connect(shell, &QtcProcess::finished, this, [this, shell] {
LOG("\nSHELL FINISHED\n");
QTC_ASSERT(shell, return);

View File

@@ -58,7 +58,8 @@ bool MergeTool::start(const FilePath &workingDirectory, const QStringList &files
Environment env = Environment::systemEnvironment();
env.set("LANG", "C");
env.set("LANGUAGE", "C");
m_process = new QtcProcess(ProcessMode::Writer);
m_process = new QtcProcess;
m_process->setProcessMode(ProcessMode::Writer);
m_process->setWorkingDirectory(workingDirectory);
m_process->setEnvironment(env);
m_process->setProcessChannelMode(QProcess::MergedChannels);

View File

@@ -88,8 +88,9 @@ void BaseClientInterface::parseData(const QByteArray &data)
}
StdIOClientInterface::StdIOClientInterface()
: m_process(ProcessMode::Writer)
{
m_process.setProcessMode(ProcessMode::Writer);
connect(&m_process, &QtcProcess::readyReadStandardError,
this, &StdIOClientInterface::readError);
connect(&m_process, &QtcProcess::readyReadStandardOutput,

View File

@@ -334,9 +334,9 @@ void ApplicationLauncherPrivate::start(const Runnable &runnable, const IDevice::
m_isLocal = local;
if (m_isLocal) {
const QtcProcess::TerminalMode terminalMode = m_useTerminal
? QtcProcess::TerminalOn : QtcProcess::TerminalOff;
m_localProcess.reset(new QtcProcess(terminalMode, this));
m_localProcess.reset(new QtcProcess(this));
m_localProcess->setTerminalMode(
m_useTerminal ? QtcProcess::TerminalOn : QtcProcess::TerminalOff);
m_localProcess->setProcessChannelMode(m_processChannelMode);
if (m_processChannelMode == QProcess::SeparateChannels) {
@@ -410,7 +410,8 @@ void ApplicationLauncherPrivate::start(const Runnable &runnable, const IDevice::
m_remoteExitStatus = QProcess::NormalExit;
m_deviceProcess = device->createProcess(this);
m_deviceProcess->setRunInTerminal(m_useTerminal);
m_deviceProcess->setTerminalMode(m_useTerminal ? QtcProcess::TerminalOn
: QtcProcess::TerminalOff);
connect(m_deviceProcess, &DeviceProcess::started,
q, &ApplicationLauncher::processStarted);
connect(m_deviceProcess, &DeviceProcess::readyReadStandardOutput,

View File

@@ -39,8 +39,9 @@ namespace Internal {
DesktopDeviceProcess::DesktopDeviceProcess(const QSharedPointer<const IDevice> &device,
QObject *parent)
: DeviceProcess(device, ProcessMode::Writer, parent)
: DeviceProcess(device, parent)
{
setProcessMode(ProcessMode::Writer);
}
void DesktopDeviceProcess::start(const Runnable &runnable)

View File

@@ -34,10 +34,8 @@ using namespace Utils;
namespace ProjectExplorer {
DeviceProcess::DeviceProcess(const IDevice::ConstPtr &device,
const QtcProcess::Setup &setup,
QObject *parent)
: QtcProcess(setup, parent), m_device(device)
DeviceProcess::DeviceProcess(const IDevice::ConstPtr &device, QObject *parent)
: QtcProcess(parent), m_device(device)
{
}

View File

@@ -44,19 +44,14 @@ public:
using Utils::QtcProcess::start;
virtual void start(const Runnable &runnable) = 0;
void setRunInTerminal(bool term) { m_runInTerminal = term; }
bool runInTerminal() const { return m_runInTerminal; }
protected:
explicit DeviceProcess(const QSharedPointer<const IDevice> &device,
const Utils::QtcProcess::Setup &setup,
QObject *parent = nullptr);
QSharedPointer<const IDevice> device() const;
private:
const QSharedPointer<const IDevice> m_device;
bool m_runInTerminal = false;
};
} // namespace ProjectExplorer

View File

@@ -71,9 +71,11 @@ public:
};
SshDeviceProcess::SshDeviceProcess(const IDevice::ConstPtr &device, QObject *parent)
: DeviceProcess(device, QtcProcess::TerminalOn, parent),
: DeviceProcess(device, parent),
d(std::make_unique<SshDeviceProcessPrivate>(this))
{
setTerminalMode(QtcProcess::TerminalOn);
// Hack: we rely on fact that below slots were called before any other external slots connected
// to this instance signals. That's why we don't re-emit them from inside our handlers since
// these signal will reach all other external slots anyway after our handlers are done.
@@ -96,7 +98,7 @@ SshDeviceProcess::~SshDeviceProcess()
void SshDeviceProcess::start(const Runnable &runnable)
{
QTC_ASSERT(d->state == SshDeviceProcessPrivate::Inactive, return);
QTC_ASSERT(runInTerminal() || !runnable.command.isEmpty(), return);
QTC_ASSERT(usesTerminal() || !runnable.command.isEmpty(), return);
d->setState(SshDeviceProcessPrivate::Connecting);
d->errorMessage.clear();
@@ -161,7 +163,7 @@ QProcess::ExitStatus SshDeviceProcess::exitStatus() const
int SshDeviceProcess::exitCode() const
{
return runInTerminal() ? QtcProcess::exitCode() : d->remoteProcess->exitCode();
return usesTerminal() ? QtcProcess::exitCode() : d->remoteProcess->exitCode();
}
QString SshDeviceProcess::errorString() const
@@ -189,14 +191,14 @@ void SshDeviceProcess::handleConnected()
QTC_ASSERT(d->state == SshDeviceProcessPrivate::Connecting, return);
d->setState(SshDeviceProcessPrivate::Connected);
d->remoteProcess = runInTerminal() && d->runnable.command.isEmpty()
d->remoteProcess = usesTerminal() && d->runnable.command.isEmpty()
? d->connection->createRemoteShell()
: d->connection->createRemoteProcess(fullCommandLine(d->runnable));
const QString display = d->displayName();
if (!display.isEmpty())
d->remoteProcess->requestX11Forwarding(display);
d->ignoreSelfSignals = !runInTerminal();
if (runInTerminal()) {
d->ignoreSelfSignals = !usesTerminal();
if (usesTerminal()) {
setAbortOnMetaChars(false);
setCommand(d->remoteProcess->fullLocalCommandLine(true));
QtcProcess::start();
@@ -337,7 +339,7 @@ void SshDeviceProcess::SshDeviceProcessPrivate::setState(SshDeviceProcess::SshDe
if (killOperation) {
killOperation->disconnect(q);
killOperation.clear();
if (q->runInTerminal())
if (q->usesTerminal())
QMetaObject::invokeMethod(q, &QtcProcess::stopProcess, Qt::QueuedConnection);
}
killTimer.stop();
@@ -352,7 +354,7 @@ void SshDeviceProcess::SshDeviceProcessPrivate::setState(SshDeviceProcess::SshDe
qint64 SshDeviceProcess::write(const QByteArray &data)
{
QTC_ASSERT(!runInTerminal(), return -1);
QTC_ASSERT(!usesTerminal(), return -1);
return d->remoteProcess->write(data);
}

View File

@@ -107,7 +107,8 @@ void openPythonRepl(QObject *parent, const FilePath &file, ReplType type)
};
const auto args = QStringList{"-i"} + replImportArgs(file, type);
auto process = new QtcProcess(QtcProcess::TerminalOn, parent);
auto process = new QtcProcess(parent);
process->setTerminalMode(QtcProcess::TerminalOn);
const FilePath pythonCommand = detectPython(file);
process->setCommand({pythonCommand, args});
process->setWorkingDirectory(workingDir(file));

View File

@@ -169,8 +169,11 @@ void QbsSession::initialize()
{
Environment env = Environment::systemEnvironment();
env.set("QT_FORCE_STDERR_LOGGING", "1");
d->packetReader = new PacketReader(this);
d->qbsProcess = new QtcProcess(ProcessMode::Writer, this);
d->qbsProcess = new QtcProcess(this);
d->qbsProcess->setProcessMode(ProcessMode::Writer);
d->qbsProcess->setEnvironment(env);
connect(d->qbsProcess, &QtcProcess::readyReadStandardOutput, this, [this] {
d->packetReader->handleData(d->qbsProcess->readAllStandardOutput());

View File

@@ -339,7 +339,7 @@ LinuxDevice::LinuxDevice()
if (env.size() > 0)
runnable.command.setExecutable("/bin/sh");
proc->setRunInTerminal(true);
proc->setTerminalMode(QtcProcess::TerminalOn);
proc->start(runnable);
});

View File

@@ -52,7 +52,7 @@ LinuxDeviceProcess::LinuxDeviceProcess(const QSharedPointer<const ProjectExplore
QByteArray LinuxDeviceProcess::readAllStandardOutput()
{
QByteArray output = SshDeviceProcess::readAllStandardOutput();
if (m_pidParsed || runInTerminal())
if (m_pidParsed || usesTerminal())
return output;
m_output.append(output);
@@ -96,14 +96,14 @@ QString LinuxDeviceProcess::fullCommandLine(const Runnable &runnable) const
cmd.addArgs("&&", CommandLine::Raw);
}
if (!runInTerminal())
if (!usesTerminal())
cmd.addArgs(QString("echo ") + pidMarker + "$$" + pidMarker + " && ", CommandLine::Raw);
const Environment &env = runnable.environment;
for (auto it = env.constBegin(); it != env.constEnd(); ++it)
cmd.addArgs(env.key(it) + "='" + env.expandedValueForKey(env.key(it)) + '\'', CommandLine::Raw);
if (!runInTerminal())
if (!usesTerminal())
cmd.addArg("exec");
cmd.addArg(runnable.command.executable().toString());