From e657bc8781113984e38d3fc6b72a555249f508c2 Mon Sep 17 00:00:00 2001 From: hjk Date: Mon, 9 May 2022 15:02:23 +0200 Subject: [PATCH] Utils: Introduce QtcProcess::controlEnvironment() ... and drop QtcProcess::removeEnvironment() This shifts the meaning of the unqualified QtcProcess::environment() to always refer to (possibly remote) "main" process this QtcProcess wraps. The controlEnvironment is now referring to secondary helper processes (if any...) typically(?) running on the host system. This helps to avoid local/remote distinctions in some places. Change-Id: Ib7cd15dd226617484b5358acd7deaed29e751883 Reviewed-by: Jarek Kobus --- src/libs/ssh/sshconnection.cpp | 5 +- src/libs/utils/processinterface.h | 3 +- src/libs/utils/qtcprocess.cpp | 49 +++++++------------ src/libs/utils/qtcprocess.h | 8 ++- src/plugins/docker/dockerdevice.cpp | 2 +- .../projectexplorer/applicationlauncher.cpp | 2 +- src/plugins/qnx/qnxdevice.cpp | 2 +- src/plugins/remotelinux/linuxdevice.cpp | 12 +++-- src/plugins/remotelinux/linuxdevice.h | 1 + 9 files changed, 36 insertions(+), 48 deletions(-) diff --git a/src/libs/ssh/sshconnection.cpp b/src/libs/ssh/sshconnection.cpp index db6ac36d7d8..dda32975ae3 100644 --- a/src/libs/ssh/sshconnection.cpp +++ b/src/libs/ssh/sshconnection.cpp @@ -106,8 +106,9 @@ QStringList SshConnectionParameters::connectionOptions(const FilePath &binary) c bool SshConnectionParameters::setupSshEnvironment(QtcProcess *process) { - Environment env = process->hasEnvironment() ? process->environment() - : Environment::systemEnvironment(); + Environment env = process->controlEnvironment(); + if (env.size() == 0) + env = Environment::systemEnvironment(); const bool hasDisplay = env.hasKey("DISPLAY") && (env.value("DISPLAY") != QString(":0")); if (SshSettings::askpassFilePath().exists()) { env.set("SSH_ASKPASS", SshSettings::askpassFilePath().toUserOutput()); diff --git a/src/libs/utils/processinterface.h b/src/libs/utils/processinterface.h index eb14c8b1cd2..37709be47d9 100644 --- a/src/libs/utils/processinterface.h +++ b/src/libs/utils/processinterface.h @@ -47,7 +47,7 @@ public: CommandLine m_commandLine; FilePath m_workingDirectory; Environment m_environment; - Environment m_remoteEnvironment; + Environment m_controlEnvironment; QByteArray m_writeData; QProcess::ProcessChannelMode m_processChannelMode = QProcess::SeparateChannels; QVariantHash m_extraData; @@ -56,7 +56,6 @@ public: bool m_abortOnMetaChars = true; bool m_runAsRoot = false; - bool m_haveEnv = false; bool m_lowPriority = false; bool m_unixTerminalDisabled = false; bool m_useCtrlCStub = false; // release only diff --git a/src/libs/utils/qtcprocess.cpp b/src/libs/utils/qtcprocess.cpp index 5ab723b6a8d..b37754ae1cc 100644 --- a/src/libs/utils/qtcprocess.cpp +++ b/src/libs/utils/qtcprocess.cpp @@ -580,7 +580,9 @@ public: explicit QtcProcessPrivate(QtcProcess *parent) : QObject(parent) , q(parent) - {} + { + m_setup.m_controlEnvironment = Environment::systemEnvironment(); + } ProcessInterface *createProcessInterface() { @@ -615,22 +617,17 @@ public: Environment fullEnvironment() const { - Environment env; - if (m_setup.m_haveEnv) { - if (m_setup.m_environment.size()) { - env = m_setup.m_environment; - } else { - qWarning("QtcProcess::start: Empty environment set when running '%s'.", - qPrintable(m_setup.m_commandLine.executable().toString())); - env = Environment::systemEnvironment(); - } - } else { - env = Environment::systemEnvironment(); + Environment env = m_setup.m_environment; + if (env.size() == 0) { +// FIXME: Either switch to using EnvironmentChange instead of full Environments, or +// feed the full environment into the QtcProcess instead of fixing it up here. +// qWarning("QtcProcess::start: Empty environment set when running '%s'.", +// qPrintable(m_setup.m_commandLine.executable().toString())); + env = m_setup.m_commandLine.executable().deviceEnvironment(); } - -// TODO: needs SshSettings -// if (m_runAsRoot) -// RunControl::provideAskPassEntry(env); + // TODO: needs SshSettings + // if (m_runAsRoot) + // RunControl::provideAskPassEntry(env); return env; } @@ -1017,13 +1014,6 @@ void QtcProcess::setProcessMode(ProcessMode processMode) void QtcProcess::setEnvironment(const Environment &env) { d->m_setup.m_environment = env; - d->m_setup.m_haveEnv = true; -} - -void QtcProcess::unsetEnvironment() -{ - d->m_setup.m_environment = Environment(); - d->m_setup.m_haveEnv = false; } const Environment &QtcProcess::environment() const @@ -1031,19 +1021,14 @@ const Environment &QtcProcess::environment() const return d->m_setup.m_environment; } -bool QtcProcess::hasEnvironment() const +void QtcProcess::setControlEnvironment(const Environment &environment) { - return d->m_setup.m_haveEnv; + d->m_setup.m_controlEnvironment = environment; } -void QtcProcess::setRemoteEnvironment(const Environment &environment) +const Environment &QtcProcess::controlEnvironment() const { - d->m_setup.m_remoteEnvironment = environment; -} - -Environment QtcProcess::remoteEnvironment() const -{ - return d->m_setup.m_remoteEnvironment; + return d->m_setup.m_controlEnvironment; } void QtcProcess::setCommand(const CommandLine &cmdLine) diff --git a/src/libs/utils/qtcprocess.h b/src/libs/utils/qtcprocess.h index 00362eb4617..539e2a7280a 100644 --- a/src/libs/utils/qtcprocess.h +++ b/src/libs/utils/qtcprocess.h @@ -99,13 +99,11 @@ public: void setProcessMode(ProcessMode processMode); ProcessMode processMode() const; - void setEnvironment(const Environment &env); - void unsetEnvironment(); + void setEnvironment(const Environment &env); // Main process const Environment &environment() const; - bool hasEnvironment() const; - void setRemoteEnvironment(const Environment &env); - Environment remoteEnvironment() const; + void setControlEnvironment(const Environment &env); // Possible helper process (ssh on host etc) + const Environment &controlEnvironment() const; void setCommand(const CommandLine &cmdLine); const CommandLine &commandLine() const; diff --git a/src/plugins/docker/dockerdevice.cpp b/src/plugins/docker/dockerdevice.cpp index 4eb7d396bf4..f4757d31ce0 100644 --- a/src/plugins/docker/dockerdevice.cpp +++ b/src/plugins/docker/dockerdevice.cpp @@ -239,7 +239,7 @@ CommandLine DockerProcessImpl::fullLocalCommandLine(bool interactive) args.append({"echo", s_pidMarker, "&&"}); - const Environment &env = m_setup.m_remoteEnvironment; + const Environment &env = m_setup.m_environment; for (auto it = env.constBegin(); it != env.constEnd(); ++it) args.append(env.key(it) + "='" + env.expandedValueForKey(env.key(it)) + '\''); diff --git a/src/plugins/projectexplorer/applicationlauncher.cpp b/src/plugins/projectexplorer/applicationlauncher.cpp index f30de43dcd7..1a25e6cada6 100644 --- a/src/plugins/projectexplorer/applicationlauncher.cpp +++ b/src/plugins/projectexplorer/applicationlauncher.cpp @@ -343,7 +343,7 @@ void ApplicationLauncherPrivate::start() cmd.setExecutable(m_runnable.device->mapToGlobalPath(cmd.executable())); m_process.setCommand(cmd); m_process.setWorkingDirectory(m_runnable.workingDirectory); - m_process.setRemoteEnvironment(m_runnable.environment); + m_process.setEnvironment(m_runnable.environment); m_process.setExtraData(m_runnable.extraData); } diff --git a/src/plugins/qnx/qnxdevice.cpp b/src/plugins/qnx/qnxdevice.cpp index 3f33fcd5ee2..da448869897 100644 --- a/src/plugins/qnx/qnxdevice.cpp +++ b/src/plugins/qnx/qnxdevice.cpp @@ -83,7 +83,7 @@ QString QnxProcessImpl::fullCommandLine(const CommandLine &commandLine) const fullCommandLine += QString::fromLatin1("cd %1 ; ").arg( ProcessArgs::quoteArg(m_setup.m_workingDirectory.toString())); - const Environment env = m_setup.m_remoteEnvironment; + const Environment env = m_setup.m_environment; for (auto it = env.constBegin(); it != env.constEnd(); ++it) { fullCommandLine += QString::fromLatin1("%1='%2' ") .arg(env.key(it)).arg(env.expandedValueForKey(env.key(it))); diff --git a/src/plugins/remotelinux/linuxdevice.cpp b/src/plugins/remotelinux/linuxdevice.cpp index b41c5d80264..91c4baed5d2 100644 --- a/src/plugins/remotelinux/linuxdevice.cpp +++ b/src/plugins/remotelinux/linuxdevice.cpp @@ -595,7 +595,7 @@ QString LinuxProcessInterface::fullCommandLine(const CommandLine &commandLine) c if (m_setup.m_terminalMode == TerminalMode::Off) cmd.addArgs(QString("echo ") + s_pidMarker + "$$" + s_pidMarker + " && ", CommandLine::Raw); - const Environment &env = m_setup.m_remoteEnvironment; + const Environment &env = m_setup.m_environment; for (auto it = env.constBegin(); it != env.constEnd(); ++it) cmd.addArgs(env.key(it) + "='" + env.expandedValueForKey(env.key(it)) + '\'', CommandLine::Raw); @@ -760,11 +760,11 @@ void SshProcessInterfacePrivate::doStart() // TODO: what about other fields from m_setup? SshConnectionParameters::setupSshEnvironment(&m_process); if (!m_sshParameters.x11DisplayName.isEmpty()) { - Environment env = m_process.environment(); + Environment env = m_process.controlEnvironment(); // Note: it seems this is no-op when shared connection is used. // In this case the display is taken from master process. env.set("DISPLAY", m_sshParameters.x11DisplayName); - m_process.setEnvironment(env); + m_process.setControlEnvironment(env); } m_process.setCommand(fullLocalCommandLine()); m_process.start(); @@ -1030,7 +1030,6 @@ LinuxDevice::LinuxDevice() proc->setCommand({ mapToGlobalPath({}), {}}); proc->setTerminalMode(TerminalMode::On); proc->setEnvironment(env); - proc->setRemoteEnvironment(env); proc->setWorkingDirectory(workingDir); proc->start(); }); @@ -1133,6 +1132,11 @@ ProcessInterface *LinuxDevice::createProcessInterface() const return new LinuxProcessInterface(this); } +Environment LinuxDevice::systemEnvironment() const +{ + return {}; // FIXME. See e.g. Docker implementation. +} + LinuxDevicePrivate::LinuxDevicePrivate(LinuxDevice *parent) : q(parent) { diff --git a/src/plugins/remotelinux/linuxdevice.h b/src/plugins/remotelinux/linuxdevice.h index 176aa6f1074..60c97b07e9c 100644 --- a/src/plugins/remotelinux/linuxdevice.h +++ b/src/plugins/remotelinux/linuxdevice.h @@ -81,6 +81,7 @@ public: bool writeFileContents(const Utils::FilePath &filePath, const QByteArray &data) const override; QDateTime lastModified(const Utils::FilePath &filePath) const override; Utils::ProcessInterface *createProcessInterface() const override; + Utils::Environment systemEnvironment() const override; qint64 fileSize(const Utils::FilePath &filePath) const override; qint64 bytesAvailable(const Utils::FilePath &filePath) const override; QFileDevice::Permissions permissions(const Utils::FilePath &filePath) const override;