aboutsummaryrefslogtreecommitdiffstats
path: root/src/libs
diff options
context:
space:
mode:
authorEike Ziller <[email protected]>2022-01-28 14:59:08 +0100
committerEike Ziller <[email protected]>2022-01-28 14:59:08 +0100
commit116b498b342b3c2194bd864417c360808495fb13 (patch)
treea4075534cc6e9d072b96e8178905ade33f4de425 /src/libs
parent95a9b22f6fe07f8417ad94722d456d4a5730f068 (diff)
parent0923d8676eb6ce7e1af5fc54c83f399eb0ec6648 (diff)
Merge remote-tracking branch 'origin/7.0'
Conflicts: src/libs/ssh/sshremoteprocessrunner.h Change-Id: I4ce088c68704845ec8ec6feaad10bf747e415bec
Diffstat (limited to 'src/libs')
-rw-r--r--src/libs/ssh/sshconnectionmanager.cpp1
-rw-r--r--src/libs/ssh/sshremoteprocessrunner.cpp1
-rw-r--r--src/libs/ssh/sshremoteprocessrunner.h2
-rw-r--r--src/libs/utils/qtcprocess.cpp40
-rw-r--r--src/libs/utils/qtcprocess.h22
-rw-r--r--src/libs/utils/terminalprocess.cpp112
6 files changed, 87 insertions, 91 deletions
diff --git a/src/libs/ssh/sshconnectionmanager.cpp b/src/libs/ssh/sshconnectionmanager.cpp
index fff3db499ea..800c4f14f19 100644
--- a/src/libs/ssh/sshconnectionmanager.cpp
+++ b/src/libs/ssh/sshconnectionmanager.cpp
@@ -151,6 +151,7 @@ private:
disconnect(connection, nullptr, this, nullptr);
connection->deleteLater();
+ m_connections.erase(it);
}
void removeInactiveConnections()
diff --git a/src/libs/ssh/sshremoteprocessrunner.cpp b/src/libs/ssh/sshremoteprocessrunner.cpp
index 2d34ab4eae3..edbc7219b17 100644
--- a/src/libs/ssh/sshremoteprocessrunner.cpp
+++ b/src/libs/ssh/sshremoteprocessrunner.cpp
@@ -185,7 +185,6 @@ void SshRemoteProcessRunner::setState(int newState)
}
}
-QString SshRemoteProcessRunner::command() const { return d->m_command; }
QString SshRemoteProcessRunner::lastConnectionErrorString() const {
return d->m_lastConnectionErrorString;
}
diff --git a/src/libs/ssh/sshremoteprocessrunner.h b/src/libs/ssh/sshremoteprocessrunner.h
index 22ed6613fbf..21c4f6b8f68 100644
--- a/src/libs/ssh/sshremoteprocessrunner.h
+++ b/src/libs/ssh/sshremoteprocessrunner.h
@@ -40,7 +40,7 @@ public:
~SshRemoteProcessRunner();
void run(const QString &command, const SshConnectionParameters &sshParams);
- QString command() const;
+ void runInTerminal(const QString &command, const SshConnectionParameters &sshParams);
QString lastConnectionErrorString() const;
diff --git a/src/libs/utils/qtcprocess.cpp b/src/libs/utils/qtcprocess.cpp
index 05f92666e65..04561a5af8b 100644
--- a/src/libs/utils/qtcprocess.cpp
+++ b/src/libs/utils/qtcprocess.cpp
@@ -227,8 +227,8 @@ public:
virtual void setWorkingDirectory(const QString &dir) = 0;
virtual void start(const QString &program, const QStringList &arguments,
const QByteArray &writeData) = 0;
- virtual void customStart(const CommandLine &command, const FilePath &workingDirectory,
- const Environment &environment) { QTC_CHECK(false); }
+ virtual void customStart(const CommandLine &, const FilePath &workingDirectory,
+ const Environment &) { Q_UNUSED(workingDirectory); QTC_CHECK(false); }
virtual bool isCustomStart() const { return false; }
virtual void terminate() = 0;
virtual void kill() = 0;
@@ -312,9 +312,9 @@ public:
QByteArray readAllStandardOutput() override { QTC_CHECK(false); return {}; }
QByteArray readAllStandardError() override { QTC_CHECK(false); return {}; }
- void setProcessEnvironment(const QProcessEnvironment &environment) override { QTC_CHECK(false); }
- void setWorkingDirectory(const QString &dir) override { QTC_CHECK(false); }
- void start(const QString &program, const QStringList &arguments, const QByteArray &writeData) override
+ void setProcessEnvironment(const QProcessEnvironment &) override { QTC_CHECK(false); }
+ void setWorkingDirectory(const QString &) override { QTC_CHECK(false); }
+ void start(const QString &, const QStringList &, const QByteArray &) override
{ QTC_CHECK(false); }
void customStart(const CommandLine &command, const FilePath &workingDirectory,
const Environment &environment) override
@@ -330,7 +330,7 @@ public:
void terminate() override { m_terminal.stopProcess(); }
void kill() override { m_terminal.stopProcess(); }
void close() override { m_terminal.stopProcess(); }
- qint64 write(const QByteArray &data) override { QTC_CHECK(false); return -1; }
+ qint64 write(const QByteArray &) override { QTC_CHECK(false); return -1; }
void setStandardInputFile(const QString &fileName) override { Q_UNUSED(fileName) QTC_CHECK(false); }
// intentionally no-op without an assert
@@ -343,13 +343,13 @@ public:
int exitCode() const override { return m_terminal.exitCode(); }
QProcess::ExitStatus exitStatus() const override { return m_terminal.exitStatus(); }
QString errorString() const override { return m_terminal.errorString(); }
- void setErrorString(const QString &str) override { QTC_CHECK(false); }
+ void setErrorString(const QString &) override { QTC_CHECK(false); }
// intentionally no-op without an assert
- bool waitForStarted(int msecs) override { return false; }
- bool waitForReadyRead(int msecs) override { QTC_CHECK(false); return false; }
+ bool waitForStarted(int) override { return false; }
+ bool waitForReadyRead(int) override { QTC_CHECK(false); return false; }
// intentionally no-op without an assert
- bool waitForFinished(int msecs) override { return false; }
+ bool waitForFinished(int) override { return false; }
void kickoffProcess() override { m_terminal.kickoffProcess(); }
void interruptProcess() override { m_terminal.interruptProcess(); }
@@ -748,9 +748,11 @@ static QtcProcess::ProcessImpl defaultProcessImpl()
return QtcProcess::ProcessLauncherImpl;
}
-QtcProcess::QtcProcess(ProcessImpl processImpl, ProcessMode processMode, TerminalMode terminalMode,
- QObject *parent)
- : QObject(parent), d(new QtcProcessPrivate(this, processImpl, processMode, terminalMode))
+QtcProcess::QtcProcess(const Setup &setup, QObject *parent)
+ : QObject(parent),
+ d(new QtcProcessPrivate(this,
+ setup.processImpl == DefaultImpl ? defaultProcessImpl() : setup.processImpl,
+ setup.processMode, setup.terminalMode))
{
static int qProcessExitStatusMeta = qRegisterMetaType<QProcess::ExitStatus>();
static int qProcessProcessErrorMeta = qRegisterMetaType<QProcess::ProcessError>();
@@ -758,17 +760,9 @@ QtcProcess::QtcProcess(ProcessImpl processImpl, ProcessMode processMode, Termina
Q_UNUSED(qProcessProcessErrorMeta)
}
-QtcProcess::QtcProcess(ProcessImpl processImpl, QObject *parent)
- : QtcProcess(processImpl, ProcessMode::Reader, TerminalMode::TerminalOff, parent) {}
-
-QtcProcess::QtcProcess(ProcessMode processMode, QObject *parent)
- : QtcProcess(defaultProcessImpl(), processMode, TerminalMode::TerminalOff, parent) {}
-
-QtcProcess::QtcProcess(TerminalMode terminalMode, QObject *parent)
- : QtcProcess(defaultProcessImpl(), ProcessMode::Reader, terminalMode, parent) {}
-
QtcProcess::QtcProcess(QObject *parent)
- : QtcProcess(defaultProcessImpl(), ProcessMode::Reader, TerminalMode::TerminalOff, parent) {}
+ : QtcProcess({}, parent)
+{}
QtcProcess::~QtcProcess()
{
diff --git a/src/libs/utils/qtcprocess.h b/src/libs/utils/qtcprocess.h
index 57783e38ade..592830041e1 100644
--- a/src/libs/utils/qtcprocess.h
+++ b/src/libs/utils/qtcprocess.h
@@ -62,7 +62,8 @@ class QTCREATOR_UTILS_EXPORT QtcProcess : public QObject
public:
enum ProcessImpl {
QProcessImpl,
- ProcessLauncherImpl
+ ProcessLauncherImpl,
+ DefaultImpl,
};
enum TerminalMode {
@@ -73,12 +74,19 @@ public:
TerminalOn = TerminalRun // default mode for ON
};
- QtcProcess(ProcessImpl processImpl, ProcessMode processMode, TerminalMode terminalMode,
- QObject *parent = nullptr);
- QtcProcess(ProcessImpl processImpl, QObject *parent = nullptr);
- QtcProcess(ProcessMode processMode, QObject *parent = nullptr);
- QtcProcess(TerminalMode terminalMode, QObject *parent = nullptr);
- QtcProcess(QObject *parent = nullptr);
+ struct Setup {
+ Setup() {}
+ Setup(ProcessImpl processImpl) : processImpl(processImpl) {}
+ Setup(ProcessMode processMode) : processMode(processMode) {}
+ Setup(TerminalMode terminalMode) : terminalMode(terminalMode) {}
+
+ ProcessImpl processImpl = DefaultImpl;
+ ProcessMode processMode = ProcessMode::Reader;
+ TerminalMode terminalMode = TerminalOff;
+ };
+
+ QtcProcess(const Setup &setup = {}, QObject *parent = nullptr);
+ QtcProcess(QObject *parent);
~QtcProcess();
ProcessMode processMode() const;
diff --git a/src/libs/utils/terminalprocess.cpp b/src/libs/utils/terminalprocess.cpp
index 1f74153e9f6..a12107e1715 100644
--- a/src/libs/utils/terminalprocess.cpp
+++ b/src/libs/utils/terminalprocess.cpp
@@ -186,63 +186,6 @@ const CommandLine &TerminalProcess::commandLine() const
return d->m_commandLine;
}
-static QString quoteWinCommand(const QString &program)
-{
- const QChar doubleQuote = QLatin1Char('"');
-
- // add the program as the first arg ... it works better
- QString programName = program;
- programName.replace(QLatin1Char('/'), QLatin1Char('\\'));
- if (!programName.startsWith(doubleQuote) && !programName.endsWith(doubleQuote)
- && programName.contains(QLatin1Char(' '))) {
- programName.prepend(doubleQuote);
- programName.append(doubleQuote);
- }
- return programName;
-}
-
-static QString quoteWinArgument(const QString &arg)
-{
- if (arg.isEmpty())
- return QString::fromLatin1("\"\"");
-
- QString ret(arg);
- // Quotes are escaped and their preceding backslashes are doubled.
- ret.replace(QRegularExpression("(\\\\*)\""), "\\1\\1\\\"");
- if (ret.contains(QRegularExpression("\\s"))) {
- // The argument must not end with a \ since this would be interpreted
- // as escaping the quote -- rather put the \ behind the quote: e.g.
- // rather use "foo"\ than "foo\"
- int i = ret.length();
- while (i > 0 && ret.at(i - 1) == QLatin1Char('\\'))
- --i;
- ret.insert(i, QLatin1Char('"'));
- ret.prepend(QLatin1Char('"'));
- }
- return ret;
-}
-
-// Quote a Windows command line correctly for the "CreateProcess" API
-static QString createWinCommandline(const QString &program, const QStringList &args)
-{
- QString programName = quoteWinCommand(program);
- for (const QString &arg : args) {
- programName += QLatin1Char(' ');
- programName += quoteWinArgument(arg);
- }
- return programName;
-}
-
-static QString createWinCommandline(const QString &program, const QString &args)
-{
- QString programName = quoteWinCommand(program);
- if (!args.isEmpty()) {
- programName += QLatin1Char(' ');
- programName += args;
- }
- return programName;
-}
-
void TerminalProcess::setAbortOnMetaChars(bool abort)
{
d->m_abortOnMetaChars = abort;
@@ -334,15 +277,66 @@ void TerminalProcess::start()
if (!workDir.isEmpty() && !workDir.endsWith(QLatin1Char('\\')))
workDir.append(QLatin1Char('\\'));
+ // Quote a Windows command line correctly for the "CreateProcess" API
+ static const auto quoteWinCommand = [](const QString &program) {
+ const QChar doubleQuote = QLatin1Char('"');
+
+ // add the program as the first arg ... it works better
+ QString programName = program;
+ programName.replace(QLatin1Char('/'), QLatin1Char('\\'));
+ if (!programName.startsWith(doubleQuote) && !programName.endsWith(doubleQuote)
+ && programName.contains(QLatin1Char(' '))) {
+ programName.prepend(doubleQuote);
+ programName.append(doubleQuote);
+ }
+ return programName;
+ };
+ static const auto quoteWinArgument = [](const QString &arg) {
+ if (arg.isEmpty())
+ return QString::fromLatin1("\"\"");
+
+ QString ret(arg);
+ // Quotes are escaped and their preceding backslashes are doubled.
+ ret.replace(QRegularExpression("(\\\\*)\""), "\\1\\1\\\"");
+ if (ret.contains(QRegularExpression("\\s"))) {
+ // The argument must not end with a \ since this would be interpreted
+ // as escaping the quote -- rather put the \ behind the quote: e.g.
+ // rather use "foo"\ than "foo\"
+ int i = ret.length();
+ while (i > 0 && ret.at(i - 1) == QLatin1Char('\\'))
+ --i;
+ ret.insert(i, QLatin1Char('"'));
+ ret.prepend(QLatin1Char('"'));
+ }
+ return ret;
+ };
+ static const auto createWinCommandlineMultiArgs = [](const QString &program, const QStringList &args) {
+ QString programName = quoteWinCommand(program);
+ for (const QString &arg : args) {
+ programName += QLatin1Char(' ');
+ programName += quoteWinArgument(arg);
+ }
+ return programName;
+ };
+ static const auto createWinCommandlineSingleArg = [](const QString &program, const QString &args)
+ {
+ QString programName = quoteWinCommand(program);
+ if (!args.isEmpty()) {
+ programName += QLatin1Char(' ');
+ programName += args;
+ }
+ return programName;
+ };
+
QStringList stubArgs;
stubArgs << modeOption(d->m_terminalMode)
<< d->m_stubServer.fullServerName()
<< workDir
<< (d->m_tempFile ? d->m_tempFile->fileName() : QString())
- << createWinCommandline(pcmd, pargs)
+ << createWinCommandlineSingleArg(pcmd, pargs)
<< msgPromptToClose();
- const QString cmdLine = createWinCommandline(
+ const QString cmdLine = createWinCommandlineMultiArgs(
QCoreApplication::applicationDirPath() + QLatin1String("/qtcreator_process_stub.exe"), stubArgs);
bool success = CreateProcessW(0, (WCHAR*)cmdLine.utf16(),