diff options
author | Eike Ziller <[email protected]> | 2022-01-28 14:59:08 +0100 |
---|---|---|
committer | Eike Ziller <[email protected]> | 2022-01-28 14:59:08 +0100 |
commit | 116b498b342b3c2194bd864417c360808495fb13 (patch) | |
tree | a4075534cc6e9d072b96e8178905ade33f4de425 /src/libs | |
parent | 95a9b22f6fe07f8417ad94722d456d4a5730f068 (diff) | |
parent | 0923d8676eb6ce7e1af5fc54c83f399eb0ec6648 (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.cpp | 1 | ||||
-rw-r--r-- | src/libs/ssh/sshremoteprocessrunner.cpp | 1 | ||||
-rw-r--r-- | src/libs/ssh/sshremoteprocessrunner.h | 2 | ||||
-rw-r--r-- | src/libs/utils/qtcprocess.cpp | 40 | ||||
-rw-r--r-- | src/libs/utils/qtcprocess.h | 22 | ||||
-rw-r--r-- | src/libs/utils/terminalprocess.cpp | 112 |
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(), |