From ad16dba14caf3bc617496a18b4cb66212d4225ec Mon Sep 17 00:00:00 2001 From: Eike Ziller Date: Tue, 25 Jul 2023 14:01:08 +0200 Subject: [PATCH 01/18] GitHub/COIN: Use Qt 6.5.2 Change-Id: Id2c7b7080ac2efb05e93d88804007fc3f61e1dc3 Reviewed-by: Cristian Adam --- .github/workflows/build_cmake.yml | 2 +- coin/instructions/common_environment.yaml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/build_cmake.yml b/.github/workflows/build_cmake.yml index eaf3013fcfa..68fe9052e6e 100644 --- a/.github/workflows/build_cmake.yml +++ b/.github/workflows/build_cmake.yml @@ -7,7 +7,7 @@ on: - 'doc/**' env: - QT_VERSION: 6.5.1 + QT_VERSION: 6.5.2 MACOS_DEPLOYMENT_TARGET: 10.15 CLANG_VERSION: 16.0.2 ELFUTILS_VERSION: 0.175 diff --git a/coin/instructions/common_environment.yaml b/coin/instructions/common_environment.yaml index 1fec2c793a6..20d6247ea9c 100644 --- a/coin/instructions/common_environment.yaml +++ b/coin/instructions/common_environment.yaml @@ -10,7 +10,7 @@ instructions: variableValue: https://ci-files02-hki.ci.qt.io/packages/jenkins/qtcreator_libclang/libclang-release_16.0.2-based - type: EnvironmentVariable variableName: QTC_QT_BASE_URL - variableValue: "https://ci-files02-hki.ci.qt.io/packages/jenkins/archive/qt/6.5/6.5.1-released/Qt" + variableValue: "https://ci-files02-hki.ci.qt.io/packages/jenkins/archive/qt/6.5/6.5.2-released/Qt" - type: EnvironmentVariable variableName: QTC_QT_MODULES variableValue: "qt5compat qtbase qtdeclarative qtimageformats qtquick3d qtquickcontrols2 qtquicktimeline qtserialport qtshadertools qtsvg qttools qttranslations qtwebengine" From 3c58c87585a13df6077e8b68d83716e91bfb45bb Mon Sep 17 00:00:00 2001 From: Christian Kandeler Date: Tue, 25 Jul 2023 16:31:59 +0200 Subject: [PATCH 02/18] ProjectExplorer: Fix crash on toolchain re-detection Fixes: QTCREATORBUG-29430 Change-Id: I8233371f70c3889ef81a3f111c298205712a2838 Reviewed-by: hjk --- src/plugins/mcusupport/mcupackage.cpp | 4 +++- src/plugins/projectexplorer/toolchainoptionspage.cpp | 5 +++-- 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/src/plugins/mcusupport/mcupackage.cpp b/src/plugins/mcusupport/mcupackage.cpp index f41b1193387..1c079eebdfb 100644 --- a/src/plugins/mcusupport/mcupackage.cpp +++ b/src/plugins/mcusupport/mcupackage.cpp @@ -10,6 +10,7 @@ #include #include #include +#include #include #include #include @@ -447,7 +448,8 @@ static ToolChain *iarToolChain(const FilePath &path, Id language) == BareMetal::Constants::IAREW_TOOLCHAIN_TYPEID; }); if (iarFactory) { - Toolchains detected = iarFactory->autoDetect(ToolchainDetector({}, {}, {})); + Toolchains detected = iarFactory->autoDetect( + {{}, DeviceManager::defaultDesktopDevice(), {}}); if (detected.isEmpty()) detected = iarFactory->detectForImport({path, language}); for (auto tc : detected) { diff --git a/src/plugins/projectexplorer/toolchainoptionspage.cpp b/src/plugins/projectexplorer/toolchainoptionspage.cpp index e0717ab7804..0c87f248dbb 100644 --- a/src/plugins/projectexplorer/toolchainoptionspage.cpp +++ b/src/plugins/projectexplorer/toolchainoptionspage.cpp @@ -3,10 +3,11 @@ #include "toolchainoptionspage.h" -#include "toolchain.h" #include "abi.h" +#include "devicesupport/devicemanager.h" #include "projectexplorerconstants.h" #include "projectexplorertr.h" +#include "toolchain.h" #include "toolchainconfigwidget.h" #include "toolchainmanager.h" @@ -404,7 +405,7 @@ void ToolChainOptionsWidget::redetectToolchains() QSet toDelete; ToolChainManager::resetBadToolchains(); for (ToolChainFactory *f : ToolChainFactory::allToolChainFactories()) { - const ToolchainDetector detector(knownTcs, {}, {}); // FIXME: Pass device and search paths + const ToolchainDetector detector(knownTcs, DeviceManager::defaultDesktopDevice(), {}); // FIXME: Pass search paths for (ToolChain * const tc : f->autoDetect(detector)) { if (knownTcs.contains(tc) || toDelete.contains(tc)) continue; From 5e5b90a9a1664ca262b4016d27f5f639e81e2457 Mon Sep 17 00:00:00 2001 From: hjk Date: Tue, 25 Jul 2023 15:19:25 +0200 Subject: [PATCH 03/18] Git: Switch order of GitClient and GerritPlugin construction The GerritPlugin constructor calls GerritParameters::fromSettings() which then calls calls detectApp() if there is no curl (or no ssh/GIT_SSH). On Windows this ends up calling GitClient::instance()->gitBinDirectory() which crashes as the GitClent instance does not exist at this time. Work around by switching the construction order. Change-Id: I0b1172d6b7ec96502a51684578b78042a42a95ca Reviewed-by: Orgad Shaneh --- src/plugins/git/gitplugin.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/plugins/git/gitplugin.cpp b/src/plugins/git/gitplugin.cpp index c5f30fa036f..3c1affca33f 100644 --- a/src/plugins/git/gitplugin.cpp +++ b/src/plugins/git/gitplugin.cpp @@ -421,9 +421,10 @@ public: QVector m_projectActions; QVector m_repositoryActions; ParameterAction *m_applyCurrentFilePatchAction = nullptr; - Gerrit::Internal::GerritPlugin m_gerritPlugin; GitClient m_gitClient; + Gerrit::Internal::GerritPlugin m_gerritPlugin; + QPointer m_stashDialog; BranchViewFactory m_branchViewFactory; QPointer m_remoteDialog; From def291f2600bfa6530541b01e6d756260c735c58 Mon Sep 17 00:00:00 2001 From: Marcus Tillmanns Date: Tue, 25 Jul 2023 08:17:13 +0200 Subject: [PATCH 04/18] Terminal: Improve paste performance Pasting large amounts of data on macos would block the App indefinitely. The issue was a blocking call to ::write. The first fix for that was to set O_NONBLOCK on the tty stdout fd. The second fix was to pass the actual result of the write back to the caller so they can react to it. In the TerminalSurface we now check if the write was successful and if not we buffer the data and try again later. Change-Id: Ibc92cce57fad88b5e9aa325197b42e17bec5e746 Reviewed-by: Cristian Adam Reviewed-by: Christian Stenger --- src/libs/3rdparty/libptyqt/unixptyprocess.cpp | 9 +-- src/libs/utils/process.cpp | 8 ++- src/plugins/terminal/terminalsurface.cpp | 67 ++++++++++++++++++- src/plugins/terminal/terminalsurface.h | 3 +- src/plugins/terminal/terminalwidget.cpp | 12 ++-- src/plugins/terminal/terminalwidget.h | 2 +- 6 files changed, 84 insertions(+), 17 deletions(-) diff --git a/src/libs/3rdparty/libptyqt/unixptyprocess.cpp b/src/libs/3rdparty/libptyqt/unixptyprocess.cpp index 8c018daf8c0..4c67ee28fb0 100644 --- a/src/libs/3rdparty/libptyqt/unixptyprocess.cpp +++ b/src/libs/3rdparty/libptyqt/unixptyprocess.cpp @@ -54,6 +54,10 @@ bool UnixPtyProcess::startProcess(const QString &shellPath, int rc = 0; m_shellProcess.m_handleMaster = ::posix_openpt(O_RDWR | O_NOCTTY); + + int flags = fcntl(m_shellProcess.m_handleMaster, F_GETFL, 0); + fcntl(m_shellProcess.m_handleMaster, F_SETFL, flags | O_NONBLOCK); + if (m_shellProcess.m_handleMaster <= 0) { m_lastError = QString("UnixPty Error: unable to open master -> %1").arg(QLatin1String(strerror(errno))); kill(); @@ -308,10 +312,7 @@ QByteArray UnixPtyProcess::readAll() qint64 UnixPtyProcess::write(const QByteArray &byteArray) { - int result = ::write(m_shellProcess.m_handleMaster, byteArray.constData(), byteArray.size()); - Q_UNUSED(result) - - return byteArray.size(); + return ::write(m_shellProcess.m_handleMaster, byteArray.constData(), byteArray.size()); } bool UnixPtyProcess::isAvailable() diff --git a/src/libs/utils/process.cpp b/src/libs/utils/process.cpp index 43d57ded891..5f8e3612f7f 100644 --- a/src/libs/utils/process.cpp +++ b/src/libs/utils/process.cpp @@ -1564,9 +1564,11 @@ qint64 Process::writeRaw(const QByteArray &input) QTC_ASSERT(state() == QProcess::Running, return -1); QTC_ASSERT(QThread::currentThread() == thread(), return -1); qint64 result = -1; - QMetaObject::invokeMethod(d->m_process.get(), [this, input] { - d->m_process->write(input); - }, d->connectionType(), &result); + QMetaObject::invokeMethod( + d->m_process.get(), + [this, input] { return d->m_process->write(input); }, + d->connectionType(), + &result); return result; } diff --git a/src/plugins/terminal/terminalsurface.cpp b/src/plugins/terminal/terminalsurface.cpp index caab0a93702..698f3589b56 100644 --- a/src/plugins/terminal/terminalsurface.cpp +++ b/src/plugins/terminal/terminalsurface.cpp @@ -11,6 +11,7 @@ #include #include +#include namespace Terminal::Internal { @@ -21,6 +22,8 @@ QColor toQColor(const VTermColor &c) return QColor(qRgb(c.rgb.red, c.rgb.green, c.rgb.blue)); }; +constexpr int batchFlushSize = 256; + struct TerminalSurfacePrivate { TerminalSurfacePrivate(TerminalSurface *surface, @@ -33,13 +36,64 @@ struct TerminalSurfacePrivate , q(surface) {} + void flush() + { + if (m_writeBuffer.isEmpty()) + return; + + QByteArray data = m_writeBuffer.left(batchFlushSize); + qint64 result = m_writeToPty(data); + + if (result != data.size()) { + // Not all data was written, remove the unwritten data from the array + data.resize(qMax(0, result)); + } + + // Remove the written data from the buffer + if (data.size() > 0) + m_writeBuffer = m_writeBuffer.mid(data.size()); + + if (!m_writeBuffer.isEmpty()) + m_delayWriteTimer.start(); + } + void init() { + m_delayWriteTimer.setInterval(1); + m_delayWriteTimer.setSingleShot(true); + + QObject::connect(&m_delayWriteTimer, &QTimer::timeout, &m_delayWriteTimer, [this] { + flush(); + }); + vterm_set_utf8(m_vterm.get(), true); static auto writeToPty = [](const char *s, size_t len, void *user) { auto p = static_cast(user); - emit p->q->writeToPty(QByteArray(s, static_cast(len))); + QByteArray d(s, len); + + // If its just a couple of chars, or we already have data in the writeBuffer, + // add the new data to the write buffer and start the delay timer + if (d.size() < batchFlushSize || !p->m_writeBuffer.isEmpty()) { + p->m_writeBuffer.append(d); + p->m_delayWriteTimer.start(); + return; + } + + // Try to write the data ... + qint64 result = p->m_writeToPty(d); + + if (result != d.size()) { + // if writing failed, append the data to the writeBuffer and start the delay timer + + // Check if partial data may have already been written ... + if (result <= 0) + p->m_writeBuffer.append(d); + else + p->m_writeBuffer.append(d.mid(result)); + + p->m_delayWriteTimer.start(); + } }; vterm_output_set_callback(m_vterm.get(), writeToPty, this); @@ -313,6 +367,10 @@ struct TerminalSurfacePrivate ShellIntegration *m_shellIntegration{nullptr}; TerminalSurface *q; + QTimer m_delayWriteTimer; + QByteArray m_writeBuffer; + + TerminalSurface::WriteToPty m_writeToPty; }; TerminalSurface::TerminalSurface(QSize initialGridSize, ShellIntegration *shellIntegration) @@ -385,7 +443,7 @@ void TerminalSurface::clearAll() vterm_input_write(d->m_vterm.get(), data.constData(), data.size()); // Send Ctrl+L which will clear the screen - emit writeToPty(QByteArray("\f")); + d->m_writeToPty(QByteArray("\f")); } void TerminalSurface::resize(QSize newSize) @@ -493,6 +551,11 @@ ShellIntegration *TerminalSurface::shellIntegration() const return d->m_shellIntegration; } +void TerminalSurface::setWriteToPty(WriteToPty writeToPty) +{ + d->m_writeToPty = writeToPty; +} + CellIterator TerminalSurface::begin() const { auto res = CellIterator(this, {0, 0}); diff --git a/src/plugins/terminal/terminalsurface.h b/src/plugins/terminal/terminalsurface.h index a6fc7425d48..3b737836f6b 100644 --- a/src/plugins/terminal/terminalsurface.h +++ b/src/plugins/terminal/terminalsurface.h @@ -95,8 +95,9 @@ public: ShellIntegration *shellIntegration() const; + using WriteToPty = std::function; + void setWriteToPty(WriteToPty writeToPty); signals: - void writeToPty(const QByteArray &data); void invalidated(QRect grid); void fullSizeChanged(QSize newSize); void cursorChanged(Cursor oldCursor, Cursor newCursor); diff --git a/src/plugins/terminal/terminalwidget.cpp b/src/plugins/terminal/terminalwidget.cpp index 4b6442753e1..dd105223536 100644 --- a/src/plugins/terminal/terminalwidget.cpp +++ b/src/plugins/terminal/terminalwidget.cpp @@ -327,10 +327,12 @@ void TerminalWidget::closeTerminal() deleteLater(); } -void TerminalWidget::writeToPty(const QByteArray &data) +qint64 TerminalWidget::writeToPty(const QByteArray &data) { if (m_process && m_process->isRunning()) - m_process->writeRaw(data); + return m_process->writeRaw(data); + + return data.size(); } void TerminalWidget::setupSurface() @@ -351,10 +353,8 @@ void TerminalWidget::setupSurface() } }); - connect(m_surface.get(), - &Internal::TerminalSurface::writeToPty, - this, - &TerminalWidget::writeToPty); + m_surface->setWriteToPty([this](const QByteArray &data) { return writeToPty(data); }); + connect(m_surface.get(), &Internal::TerminalSurface::fullSizeChanged, this, [this] { updateScrollBars(); }); diff --git a/src/plugins/terminal/terminalwidget.h b/src/plugins/terminal/terminalwidget.h index 11cd9335cc9..2d0f6b16df7 100644 --- a/src/plugins/terminal/terminalwidget.h +++ b/src/plugins/terminal/terminalwidget.h @@ -129,7 +129,7 @@ protected: void setupColors(); void setupActions(); - void writeToPty(const QByteArray &data); + qint64 writeToPty(const QByteArray &data); int paintCell(QPainter &p, const QRectF &cellRect, From e321b3d6fc02fb7d96fff8f03c88666e3dcf5e84 Mon Sep 17 00:00:00 2001 From: Cristian Adam Date: Thu, 27 Jul 2023 12:11:17 +0200 Subject: [PATCH 05/18] Debugger: Allow usage of Python 2 based GDB versions Amends 7a210c41b42e4bd2f3db4a145f6d11e463d48254 Fixes: QTCREATORBUG-29440 Change-Id: I5991f7954c4831b732ea2b391e5542fab96a308e Reviewed-by: Marcus Tillmanns --- share/qtcreator/debugger/libcpp_stdtypes.py | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/share/qtcreator/debugger/libcpp_stdtypes.py b/share/qtcreator/debugger/libcpp_stdtypes.py index 1e0b852dc0b..28288bb89f3 100644 --- a/share/qtcreator/debugger/libcpp_stdtypes.py +++ b/share/qtcreator/debugger/libcpp_stdtypes.py @@ -163,8 +163,8 @@ def qdump__std____1__stack(d, value): d.putBetterType(value.type) -def GetChildMemberWithName(value: DumperBase.Value, name: str) -> DumperBase.Value: - members: list[DumperBase.Value] = value.members(True) +def GetChildMemberWithName(value, name): + members = value.members(True) for member in members: if member.name == name: @@ -172,8 +172,8 @@ def GetChildMemberWithName(value: DumperBase.Value, name: str) -> DumperBase.Val return None -def GetIndexOfChildWithName(value: DumperBase.Value, name: str) -> int: - members: list[DumperBase.Value] = value.members(True) +def GetIndexOfChildWithName(value, name): + members = value.members(True) for i, member in enumerate(members): if member.name == name: @@ -229,8 +229,8 @@ def std_1_string_dumper_v2(d, value): if not Short_Sp: raise Exception("Could not find __s") - Is_Long: DumperBase.Value = GetChildMemberWithName(Short_Sp, "__is_long_") - Size_Sp: DumperBase.Value = GetChildMemberWithName(Short_Sp, "__size_") + Is_Long = GetChildMemberWithName(Short_Sp, "__is_long_") + Size_Sp = GetChildMemberWithName(Short_Sp, "__size_") if not Size_Sp: raise Exception("Could not find __size_") From 488f1b3d11f29fa8b5ac09d454e7372c33aa4318 Mon Sep 17 00:00:00 2001 From: Christian Stenger Date: Thu, 27 Jul 2023 09:39:22 +0200 Subject: [PATCH 06/18] SquishTests: Adapt cmake based speedcrunch test MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Change-Id: Ic4c22311828f2c0364cbc514b98d2cb4e7d1b86a Reviewed-by: Robert Löhning --- tests/system/0001-Fix-build-on-macOS.patch | 33 +++++++++++++++++++ .../tst_cmake_speedcrunch/test.py | 10 ++++++ .../testdata/projecttree_speedcrunch.tsv | 1 - 3 files changed, 43 insertions(+), 1 deletion(-) create mode 100644 tests/system/0001-Fix-build-on-macOS.patch diff --git a/tests/system/0001-Fix-build-on-macOS.patch b/tests/system/0001-Fix-build-on-macOS.patch new file mode 100644 index 00000000000..124a6b7a9c6 --- /dev/null +++ b/tests/system/0001-Fix-build-on-macOS.patch @@ -0,0 +1,33 @@ +From e5aec585120ca65b92e642b50b1552f75df26b93 Mon Sep 17 00:00:00 2001 +From: Christian Stenger +Date: Thu, 27 Jul 2023 08:49:30 +0200 +Subject: [PATCH] Fix build on macOS + +--- + src/CMakeLists.txt | 3 +-- + 1 file changed, 1 insertion(+), 2 deletions(-) + +diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt +index 7be6aad..0cad721 100644 +--- a/src/CMakeLists.txt ++++ b/src/CMakeLists.txt +@@ -18,7 +18,6 @@ if(APPLE) + set(MACOSX_BUNDLE_SHORT_VERSION_STRING ${speedcrunch_VERSION}) + set(MACOSX_BUNDLE_VERSION ${speedcrunch_VERSION}) + set(MACOSX_BUNDLE_LONG_VERSION_STRING Version ${speedcrunch_VERSION}) +- set(CMAKE_OSX_ARCHITECTURES ppc;i386) + else(APPLE) + set(PROGNAME speedcrunch) + endif(APPLE) +@@ -71,7 +70,7 @@ if(APPLE) + set( speedcrunch_RESOURCE_DIR ${CMAKE_CURRENT_BINARY_DIR}/${PROGNAME}.app/Contents/Resources ) + add_custom_command(TARGET ${PROGNAME} POST_BUILD + COMMAND mkdir ARGS -p ${speedcrunch_RESOURCE_DIR} +- COMMAND cp ARGS -f resources/${MACOSX_BUNDLE_ICON_FILE} ${speedcrunch_RESOURCE_DIR}) ++ COMMAND cp ARGS -f ${CMAKE_CURRENT_SOURCE_DIR}/resources/${MACOSX_BUNDLE_ICON_FILE} ${speedcrunch_RESOURCE_DIR}) + endif(APPLE) + + add_custom_target(confclean COMMAND rm -rf Makefile CMakeFiles/ CMakeCache.txt cmake_install.cmake DartTestfile.txt install_manifest.txt) +-- +2.32.0 (Apple Git-132) + diff --git a/tests/system/suite_general/tst_cmake_speedcrunch/test.py b/tests/system/suite_general/tst_cmake_speedcrunch/test.py index 64d8d877f0d..681835818ed 100644 --- a/tests/system/suite_general/tst_cmake_speedcrunch/test.py +++ b/tests/system/suite_general/tst_cmake_speedcrunch/test.py @@ -32,6 +32,16 @@ def main(): if not SpeedCrunchPath: test.fatal("Could not clone SpeedCrunch") return + # patch CMakeLists.txt outside of QC + try: + patchFile = os.path.join(os.path.dirname(__file__), + "..", "..", "0001-Fix-build-on-macOS.patch") + subprocess.check_call(["git", "am", patchFile], cwd=SpeedCrunchPath) + test.log("Patched speedcrunch.") + except: + t, v = sys.exc_info()[:2] + test.warning("Patching speedcrunch failed.", "%s(%s)" % (str(t), str(v))) + startQC() if not startedWithoutPluginError(): return diff --git a/tests/system/suite_general/tst_cmake_speedcrunch/testdata/projecttree_speedcrunch.tsv b/tests/system/suite_general/tst_cmake_speedcrunch/testdata/projecttree_speedcrunch.tsv index 2fd1d59bb2b..82a7ae6ac84 100644 --- a/tests/system/suite_general/tst_cmake_speedcrunch/testdata/projecttree_speedcrunch.tsv +++ b/tests/system/suite_general/tst_cmake_speedcrunch/testdata/projecttree_speedcrunch.tsv @@ -1,6 +1,5 @@ "text" "nestinglevel" "CMakeLists.txt" "0" -"speedcrunch" "0" "Header Files" "1" "genericdock.h" "2" "Source Files" "1" From 4a8c08a349638bc3106e341fec5e4d308102a152 Mon Sep 17 00:00:00 2001 From: Christian Stenger Date: Tue, 25 Jul 2023 09:27:25 +0200 Subject: [PATCH 07/18] SquishTests: Skip too old Qt on Windows MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit When creating a command line project from wizard we end up with code that is not compilable on Windows when using too old Qt versions. Explicitly do not use the older Qt versions as this fails to build and the whole tests would need to get adapted to handle this appropriate instead. Change-Id: Ia8a253a0c5d8d20ea181dd33dc8d31cb83cb31c3 Reviewed-by: Robert Löhning --- tests/system/shared/project.py | 7 ++++++- tests/system/suite_debugger/tst_cli_output_console/test.py | 6 +++++- 2 files changed, 11 insertions(+), 2 deletions(-) diff --git a/tests/system/shared/project.py b/tests/system/shared/project.py index d1e44102bcc..b39ef8060ee 100644 --- a/tests/system/shared/project.py +++ b/tests/system/shared/project.py @@ -248,11 +248,16 @@ def createProject_Qt_GUI(path, projectName, checks=True, addToVersionControl=" Date: Wed, 26 Jul 2023 17:30:53 +0200 Subject: [PATCH 08/18] SquishTests: Don't initialize an entire list for reading one item The point of Python3 returning objects instead of lists is that it will iterate just as far as items are actually being used. Change-Id: If4d9742bb47aa9cac1166a0ff6f10d211829fd85 Reviewed-by: Christian Stenger --- tests/system/shared/debugger.py | 4 ++-- tests/system/shared/qtcreator.py | 3 ++- tests/system/suite_HELP/tst_HELP02/test.py | 2 +- .../suite_general/tst_cmake_speedcrunch/test.py | 2 +- .../suite_general/tst_create_proj_wizard/test.py | 4 ++-- .../suite_general/tst_default_settings/test.py | 12 ++++++------ tests/system/suite_tools/tst_git_local/test.py | 4 ++-- 7 files changed, 16 insertions(+), 15 deletions(-) diff --git a/tests/system/shared/debugger.py b/tests/system/shared/debugger.py index 7176afc8e59..b878f9efef6 100644 --- a/tests/system/shared/debugger.py +++ b/tests/system/shared/debugger.py @@ -238,7 +238,7 @@ def __logDebugResult__(): def verifyBreakPoint(bpToVerify): if isinstance(bpToVerify, dict): - fileName = list(bpToVerify.keys())[0] + fileName = next(iter(bpToVerify.keys())) editor = getEditorForFileSuffix(fileName) if editor: test.compare(waitForObject(":DebugModeWidget_QComboBox").toolTip, fileName, @@ -247,7 +247,7 @@ def verifyBreakPoint(bpToVerify): windowTitle = str(waitForObject(":Qt Creator_Core::Internal::MainWindow").windowTitle) test.verify(windowTitle.startswith(os.path.basename(fileName) + " "), "Verify that Creator's window title changed according to current file") - return test.compare(line, list(bpToVerify.values())[0], + return test.compare(line, next(iter(bpToVerify.values())), "Compare hit breakpoint to expected line number in %s" % fileName) else: test.fatal("Expected a dict for bpToVerify - got '%s'" % className(bpToVerify)) diff --git a/tests/system/shared/qtcreator.py b/tests/system/shared/qtcreator.py index 0b86001529f..bb52497774b 100644 --- a/tests/system/shared/qtcreator.py +++ b/tests/system/shared/qtcreator.py @@ -206,7 +206,8 @@ def substituteCdb(settingsDir): try: serverIni = readFile(os.path.join(os.getenv("APPDATA"), "froglogic", "Squish", "ver1", "server.ini")) - autLine = list(filter(lambda line: "AUT/qtcreator" in line, serverIni.splitlines()))[0] + autLine = next(iter(filter(lambda line: "AUT/qtcreator" in line, + serverIni.splitlines()))) autPath = autLine.split("\"")[1] return os.path.exists(os.path.join(autPath, "..", "lib", "qtcreatorcdbext64")) except: diff --git a/tests/system/suite_HELP/tst_HELP02/test.py b/tests/system/suite_HELP/tst_HELP02/test.py index 8b6c32b7ded..9c5104087e0 100644 --- a/tests/system/suite_HELP/tst_HELP02/test.py +++ b/tests/system/suite_HELP/tst_HELP02/test.py @@ -44,7 +44,7 @@ def checkQtCreatorHelpVersion(expectedVersion): helpContentWidget = waitForObject(':Qt Creator_QHelpContentWidget', 5000) waitFor("any(map(rightStart, dumpItems(helpContentWidget.model())))", 10000) items = dumpItems(helpContentWidget.model()) - test.compare(list(filter(rightStart, items))[0], + test.compare(next(iter(filter(rightStart, items))), 'Qt Creator Manual %s' % expectedVersion, 'Verifying whether manual uses expected version.') except: diff --git a/tests/system/suite_general/tst_cmake_speedcrunch/test.py b/tests/system/suite_general/tst_cmake_speedcrunch/test.py index 681835818ed..4f75d43eb9d 100644 --- a/tests/system/suite_general/tst_cmake_speedcrunch/test.py +++ b/tests/system/suite_general/tst_cmake_speedcrunch/test.py @@ -9,7 +9,7 @@ def cmakeSupported(): versionLines = filter(lambda line: "cmake version " in line, getOutputFromCmdline(["cmake", "--version"]).splitlines()) try: - versionLine = list(versionLines)[0] + versionLine = next(iter(versionLines)) test.log("Using " + versionLine) matcher = re.match("cmake version (\d+)\.(\d+)\.\d+", versionLine) major = __builtin__.int(matcher.group(1)) diff --git a/tests/system/suite_general/tst_create_proj_wizard/test.py b/tests/system/suite_general/tst_create_proj_wizard/test.py index 8579111b02c..d521f2092dd 100644 --- a/tests/system/suite_general/tst_create_proj_wizard/test.py +++ b/tests/system/suite_general/tst_create_proj_wizard/test.py @@ -49,8 +49,8 @@ def main(): availableProjectTypes.append({category:template}) safeClickButton("Cancel") for current in availableProjectTypes: - category = list(current.keys())[0] - template = list(current.values())[0] + category = next(iter(current.keys())) + template = next(iter(current.values())) with TestSection("Testing project template %s -> %s" % (category, template)): displayedPlatforms = __createProject__(category, template) if template.startswith("Qt Quick Application"): diff --git a/tests/system/suite_general/tst_default_settings/test.py b/tests/system/suite_general/tst_default_settings/test.py index ce026e98d36..f7ece36e6de 100644 --- a/tests/system/suite_general/tst_default_settings/test.py +++ b/tests/system/suite_general/tst_default_settings/test.py @@ -311,15 +311,15 @@ def __compareCompilers__(foundCompilers, expectedCompilers): for currentExp in expectedCompilers: if isString(currentExp): continue - key = list(currentExp.keys())[0] + key = next(iter(currentExp.keys())) # the regex .*? is used for the different possible version strings of the WinSDK # if it's present a regex will be validated otherwise simple string comparison # same applies for [.0-9]+ which is used for minor/patch versions isRegex = ".*?" in key or "[.0-9]+" in key - if (((isRegex and re.match(key, list(currentFound.keys())[0], flags))) + if (((isRegex and re.match(key, next(iter(currentFound.keys())), flags))) or currentFound.keys() == currentExp.keys()): - if ((isWin and os.path.abspath(list(currentFound.values())[0].lower()) - == os.path.abspath(list(currentExp.values())[0].lower())) + if ((isWin and os.path.abspath(next(iter(currentFound.values())).lower()) + == os.path.abspath(next(iter(currentExp.values())).lower())) or currentFound.values() == currentExp.values()): foundExp = True break @@ -375,8 +375,8 @@ def __checkCreatedSettings__(settingsFolder): test.verify(os.path.isdir(f), "Verifying whether folder '%s' has been created." % os.path.basename(f)) for f in files: - fName = list(f.keys())[0] - fMinSize = list(f.values())[0] + fName = next(iter(f.keys())) + fMinSize = next(iter(f.values())) text = "created non-empty" if fMinSize > 0: text = "modified" diff --git a/tests/system/suite_tools/tst_git_local/test.py b/tests/system/suite_tools/tst_git_local/test.py index 9ce9a0b3164..450f3b58558 100644 --- a/tests/system/suite_tools/tst_git_local/test.py +++ b/tests/system/suite_tools/tst_git_local/test.py @@ -90,8 +90,8 @@ def __clickCommit__(count): {"Author: %s, %s" % (id, time): True}, {"Committer: %s, %s" % (id, time): True}] for line, exp in zip(show.splitlines(), expected): - expLine = list(exp.keys())[0] - isRegex = list(exp.values())[0] + expLine = next(iter(exp.keys())) + isRegex = next(iter(exp.values())) if isRegex: test.verify(re.match(expLine, line), "Verifying commit header line '%s'" % line) else: From b57f72e3c8a0c6375fcd3c795637a32fb933c1f1 Mon Sep 17 00:00:00 2001 From: Christian Stenger Date: Thu, 27 Jul 2023 13:01:24 +0200 Subject: [PATCH 09/18] SquishTests: Adapt test of navigation tree MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Explicitly disable loading ClangCodeModel plugin to avoid slowing down the load and parse of the projects by the indexer as we are measuring the time for these. Beside this adapt the expected tree for macOS - there are a couple of files and subtrees that are present only conditionally. Change-Id: Ibc000d0908e652700820f8eee4b17effdf48f637 Reviewed-by: Robert Löhning --- .../suite_general/tst_openqt_creator/test.py | 2 +- .../testdata/projecttree_creator.tsv | 18 ------------------ 2 files changed, 1 insertion(+), 19 deletions(-) diff --git a/tests/system/suite_general/tst_openqt_creator/test.py b/tests/system/suite_general/tst_openqt_creator/test.py index 257a32d8161..8bdb82e4e53 100644 --- a/tests/system/suite_general/tst_openqt_creator/test.py +++ b/tests/system/suite_general/tst_openqt_creator/test.py @@ -13,7 +13,7 @@ def main(): if not pathSpeedcrunch: test.fatal("Could not clone SpeedCrunch") return - startQC() + startQC(["-noload", "ClangCodeModel"]) if not startedWithoutPluginError(): return diff --git a/tests/system/suite_general/tst_openqt_creator/testdata/projecttree_creator.tsv b/tests/system/suite_general/tst_openqt_creator/testdata/projecttree_creator.tsv index e0e8060e7bd..662eb4fe255 100644 --- a/tests/system/suite_general/tst_openqt_creator/testdata/projecttree_creator.tsv +++ b/tests/system/suite_general/tst_openqt_creator/testdata/projecttree_creator.tsv @@ -4166,7 +4166,6 @@ "Headers" "5" "touchbar.h" "6" "Sources" "5" -"touchbar.cpp" "6" "Headers" "4" "optional" "6" "optional.hpp" "7" @@ -16895,21 +16894,6 @@ "qtc-askpass-main.cpp" "4" "Other files" "3" "qtc-askpass.qbs" "4" -"qtcreatortool" "3" -"qtcreatortool.pri" "4" -"qtcreator" "4" -"qtcreator.pri" "5" -"qtcreator_ide_branding" "5" -"qtcreator_ide_branding.pri" "6" -"qtcreator_testvars" "5" -"qtcreator_testvars.pri" "6" -"Other files" "5" -"CMakeLists.txt" "7" -"rpath" "4" -"rpath.pri" "5" -"Sources" "3" -"main.cpp" "4" -"Other files" "3" "qtpromaker" "2" "qtpromaker.pro" "3" "qtcreatortool" "3" @@ -20837,7 +20821,6 @@ "Headers" "5" "touchbar.h" "6" "Sources" "5" -"touchbar.cpp" "6" "Headers" "4" "optional" "6" "optional.hpp" "7" @@ -21758,7 +21741,6 @@ "Headers" "6" "touchbar.h" "7" "Sources" "6" -"touchbar.cpp" "7" "Headers" "5" "optional" "7" "optional.hpp" "8" From b95aba56b5abe22e61c01e166f2bca59e8515711 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Robert=20L=C3=B6hning?= Date: Wed, 26 Jul 2023 18:26:26 +0200 Subject: [PATCH 10/18] SquishTests: Don't use lists of dicts ...when that doesn't have any advantages. Change-Id: I0c58e30ae0b9e278e3336646332279f6243719d0 Reviewed-by: Christian Stenger --- .../tst_default_settings/test.py | 28 +++++++++---------- .../system/suite_tools/tst_git_local/test.py | 10 +++---- 2 files changed, 18 insertions(+), 20 deletions(-) diff --git a/tests/system/suite_general/tst_default_settings/test.py b/tests/system/suite_general/tst_default_settings/test.py index f7ece36e6de..57d7ae02cb1 100644 --- a/tests/system/suite_general/tst_default_settings/test.py +++ b/tests/system/suite_general/tst_default_settings/test.py @@ -359,24 +359,22 @@ def __lowerStrs__(iterable): def __checkCreatedSettings__(settingsFolder): waitForCleanShutdown() qtProj = os.path.join(settingsFolder, "QtProject") - folders = [] - files = [{os.path.join(qtProj, "QtCreator.db"):0}, - {os.path.join(qtProj, "QtCreator.ini"):30}] - folders.append(os.path.join(qtProj, "qtcreator")) - files.extend([{os.path.join(folders[0], "debuggers.xml"):0}, - {os.path.join(folders[0], "devices.xml"):0}, - {os.path.join(folders[0], "helpcollection.qhc"):0}, - {os.path.join(folders[0], "profiles.xml"):0}, - {os.path.join(folders[0], "qtversion.xml"):0}, - {os.path.join(folders[0], "toolchains.xml"):0}]) - folders.extend([os.path.join(folders[0], "generic-highlighter"), - os.path.join(folders[0], "macros")]) + creatorFolder = os.path.join(qtProj, "qtcreator") + folders = [creatorFolder, + os.path.join(creatorFolder, "generic-highlighter"), + os.path.join(creatorFolder, "macros")] + files = {os.path.join(qtProj, "QtCreator.db"):0, + os.path.join(qtProj, "QtCreator.ini"):30, + os.path.join(creatorFolder, "debuggers.xml"):0, + os.path.join(creatorFolder, "devices.xml"):0, + os.path.join(creatorFolder, "helpcollection.qhc"):0, + os.path.join(creatorFolder, "profiles.xml"):0, + os.path.join(creatorFolder, "qtversion.xml"):0, + os.path.join(creatorFolder, "toolchains.xml"):0} for f in folders: test.verify(os.path.isdir(f), "Verifying whether folder '%s' has been created." % os.path.basename(f)) - for f in files: - fName = next(iter(f.keys())) - fMinSize = next(iter(f.values())) + for fName, fMinSize in files.items(): text = "created non-empty" if fMinSize > 0: text = "modified" diff --git a/tests/system/suite_tools/tst_git_local/test.py b/tests/system/suite_tools/tst_git_local/test.py index 450f3b58558..aefdc07d9a1 100644 --- a/tests/system/suite_tools/tst_git_local/test.py +++ b/tests/system/suite_tools/tst_git_local/test.py @@ -86,12 +86,12 @@ def __clickCommit__(count): show = str(description.plainText) id = "Nobody " time = "\w{3} \w{3} \d{1,2} \d{2}:\d{2}:\d{2} \d{4}.* seconds ago\)" - expected = [{"commit %s" % commit:False}, - {"Author: %s, %s" % (id, time): True}, - {"Committer: %s, %s" % (id, time): True}] + expected = [["commit %s" % commit, False], + ["Author: %s, %s" % (id, time), True], + ["Committer: %s, %s" % (id, time), True]] for line, exp in zip(show.splitlines(), expected): - expLine = next(iter(exp.keys())) - isRegex = next(iter(exp.values())) + expLine = exp[0] + isRegex = exp[1] if isRegex: test.verify(re.match(expLine, line), "Verifying commit header line '%s'" % line) else: From d55d2cbb2f9e1859180b88d6f1342a22f27f33a9 Mon Sep 17 00:00:00 2001 From: Eike Ziller Date: Mon, 24 Jul 2023 09:25:31 +0200 Subject: [PATCH 11/18] German translation: Haskell, Qnx, SerialTerminal, SilverSearcher, Vcpkg MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Change-Id: I36d842b7641e81f5310dd4e31fa61c9ddab8e362 Reviewed-by: Christian Stenger Reviewed-by: Robert Löhning --- share/qtcreator/translations/qtcreator_de.ts | 80 ++++++++++---------- 1 file changed, 40 insertions(+), 40 deletions(-) diff --git a/share/qtcreator/translations/qtcreator_de.ts b/share/qtcreator/translations/qtcreator_de.ts index 4d3e2507589..e657d4a799f 100644 --- a/share/qtcreator/translations/qtcreator_de.ts +++ b/share/qtcreator/translations/qtcreator_de.ts @@ -31686,48 +31686,48 @@ Hinweis: Dies macht Sie anfällig für Man-in-the-middle-Angriffe. QtC::Haskell Release - Release + Release General - Allgemein + Allgemein Build directory: - Build-Verzeichnis: + Build-Verzeichnis: GHCi - + GHCi Run GHCi - + GHCi ausführen Haskell SnippetProvider - + Haskell Executable - Ausführbare Datei + Ausführbare Datei Haskell - + Haskell Stack executable: - + Ausführbare Stack-Datei: Choose Stack Executable - + Ausführbare Datei für Stack auswählen Stack Build - + Erstellen mit Stack @@ -46082,7 +46082,7 @@ Are you sure? Checking that files can be created in %1... - + Überprüfe, ob Dateien in %1 erstellt werden können... Files can be created in /var/run. @@ -46090,11 +46090,11 @@ Are you sure? An error occurred while checking that files can be created in %1. - + Beim Überprüfen, ob Dateien in %1 erstellt werden können, ist ein Fehler aufgetreten. Files cannot be created in %1. - + In %1 können keine Dateien erstellt werden. Warning: "slog2info" is not found on the device, debug output not available. @@ -46173,34 +46173,34 @@ Möchten Sie fortfahren? No files need to be uploaded. - Es müssen keine Dateien hochgeladen werden. + Es müssen keine Dateien hochgeladen werden. %n file(s) need to be uploaded. - + Eine Datei muss hochgeladen werden. %n Dateien müssen hochgeladen werden. Local file "%1" does not exist. - Es gibt keine lokale Datei "%1". + Es gibt keine lokale Datei "%1". Remote chmod failed for file "%1": %2 - "chmod" für die entfernte Datei "%1" ist fehlgeschlagen: %2 + "chmod" für die entfernte Datei "%1" ist fehlgeschlagen: %2 No device configuration set. - Es ist keine Gerätekonfiguration eingestellt. + Es ist keine Gerätekonfiguration gesetzt. No deployment action necessary. Skipping. - Alle Dateien sind auf dem aktuellen Stand, es ist keine Installation erforderlich. + Alle Dateien sind auf dem aktuellen Stand, es ist keine Installation erforderlich. All files successfully deployed. - Alle Dateien erfolgreich versandt. + Deployment für alle Dateien erfolgreich. Deploy Qt to QNX Device @@ -46208,7 +46208,7 @@ Möchten Sie fortfahren? Create Kit for %1 - + Kit für %1 erstellen Configuration Information: @@ -46232,11 +46232,11 @@ Möchten Sie fortfahren? Compiler: - + Compiler: Architectures: - + Architekturen: Remove @@ -46252,11 +46252,11 @@ Möchten Sie fortfahren? Configuration already exists. - + Konfiguration existiert bereits. Configuration is not valid. - + Konfiguration ist ungültig. Remove QNX Configuration @@ -48636,30 +48636,30 @@ Zeile: %4, Spalte: %5 None - Keine + Keine LF - LF + LF CR - CR + CR CRLF - CRLF + CRLF QtC::SilverSearcher Search Options (optional) - Sucheinstellungen (optional) + Sucheinstellungen (optional) Silver Searcher is not available on the system. - Silver Searcher ist auf dem System nicht verfügbar. + Silver Searcher ist auf dem System nicht verfügbar. @@ -58293,35 +58293,35 @@ Are you sure you want to remove the material? QtC::Vcpkg Search package... - + Paket suchen... Vcpkg Manifest Editor - + Vcpkg Manifest-Editor Name: - + Name: Version: - Version: + Version: License: - Lizenz: + Lizenz: Description: - Beschreibung: + Beschreibung: Homepage: - + Homepage: Vcpkg installation - + Vcpkg-Installation From 6b39020295406fe22ab02ae72d89f4db95757d6a Mon Sep 17 00:00:00 2001 From: Christian Stenger Date: Tue, 11 Jul 2023 15:48:35 +0200 Subject: [PATCH 12/18] SquishTests: Fix expected proposals MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Change-Id: Id835185e621fac6adba3e1db15d1a3d782b571df Reviewed-by: Robert Löhning --- tests/system/suite_CSUP/tst_CSUP02/test.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/tests/system/suite_CSUP/tst_CSUP02/test.py b/tests/system/suite_CSUP/tst_CSUP02/test.py index fc8c35ce9cf..de1633e6b79 100644 --- a/tests/system/suite_CSUP/tst_CSUP02/test.py +++ b/tests/system/suite_CSUP/tst_CSUP02/test.py @@ -41,8 +41,9 @@ def main(): listView = waitForObject(":popupFrame_Proposal_QListView") shownProposals = dumpItems(listView.model()) usedProposal = "class derived from QObject" - expectedProposals = ["class", "class ", "class template", + expectedProposals = ["class ", "class template", usedProposal, "class derived from QWidget"] + expectedProposals += [" class"] if useClang else ["class"] test.xcompare(len(shownProposals), len(expectedProposals), # QTCREATORBUG-23159 "Number of proposed templates") test.verify(set(expectedProposals).issubset(set(shownProposals)), From 55be030a627c1b1fe21f9c46083efe1c4922f1ad Mon Sep 17 00:00:00 2001 From: Eike Ziller Date: Mon, 24 Jul 2023 10:10:30 +0200 Subject: [PATCH 13/18] German translation: WebAssembly MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Change-Id: If526d36406855ae90c06e9ea76ba6fe8a6a92848 Reviewed-by: Reviewed-by: Robert Löhning --- share/qtcreator/translations/qtcreator_de.ts | 46 +++++++++++--------- 1 file changed, 25 insertions(+), 21 deletions(-) diff --git a/share/qtcreator/translations/qtcreator_de.ts b/share/qtcreator/translations/qtcreator_de.ts index e657d4a799f..1fe961712e4 100644 --- a/share/qtcreator/translations/qtcreator_de.ts +++ b/share/qtcreator/translations/qtcreator_de.ts @@ -55651,88 +55651,92 @@ should a repository require SSH-authentication (see documentation on SSH and the QtC::WebAssembly Web Browser - + Webbrowser WebAssembly Runtime - + WebAssembly-Runtime Emscripten SDK path: - + Pfad zum Emscripten-SDK: Select the root directory of an installed %1. Ensure that the activated SDK version is compatible with the %2 or %3 version that you plan to develop against. - + %1=Emscripten SDK, %2=Qt 5, %3=Qt 6 + Wählen Sie das Wurzelverzeichnis einer Installation von %1. Stellen Sie sicher, dass die eingestellte SDK-Version mit der von Ihnen für das Entwickeln geplanten %2- oder %3-Version kompatibel ist. Emscripten SDK environment: - + Umgebung für Emscripten-SDK: Note: %1 supports Qt %2 for WebAssembly and higher. Your installed lower Qt version(s) are not supported. - + %1=the QtC-Version, %2=minimumSupportedQtVersion + Hinweis: %1 unterstützt für WebAssembly nur Qt %2 und höher. Ihre älteren installierten Qt-Versionen werden nicht unterstützt. Adding directories to PATH: - + Füge Verzeichnisse zu PATH hinzu: Setting environment variables: - + Setze Umgebungsvariablen: The activated version %1 is not supported by %2. Activate version %3 or higher. - + %1=sdkVersion, %2=QtC-Version, %3=minVersion + Die aktivierte Version %1 wird von %2 nicht unterstützt. Benutzen Sie Version %3 oder höher. Activated version: %1 - + Aktivierte Version: %1 WebAssembly - + WebAssembly Setup Emscripten SDK for WebAssembly? To do it later, select Edit > Preferences > Devices > WebAssembly. - + Emscripten-SDK für WebAssembly einrichten? Dies geht auch später unter Bearbeiten > Einstellungen > Geräte > WebAssembly. Setup Emscripten SDK - + Emscripten-SDK einrichten WebAssembly Qt Version is meant for WebAssembly - + WebAssembly %1 does not support Qt for WebAssembly below version %2. - + %1=QtC-Version + %1 unterstützt Qt für WebAssembly nicht unter Version %2. Effective emrun call: - + Resultierender emrun-Aufruf: Default Browser - + Vorgabe-Browser Web browser: - + Webbrowser: Emscripten Compiler - + Emscripten-Compiler Emscripten Compiler %1 for %2 - + Emscripten-Compiler %1 für %2 Emscripten - + Emscripten From d9c5212c94b4766189589727c87f71d3de4fd681 Mon Sep 17 00:00:00 2001 From: Eike Ziller Date: Tue, 25 Jul 2023 10:04:17 +0200 Subject: [PATCH 14/18] German translation: Remote Linux MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Change-Id: I307ccc3c1a31124e5470abd1bdb2c6a80cb6794f Reviewed-by: Robert Löhning Reviewed-by: --- share/qtcreator/translations/qtcreator_de.ts | 153 ++++++++++--------- 1 file changed, 82 insertions(+), 71 deletions(-) diff --git a/share/qtcreator/translations/qtcreator_de.ts b/share/qtcreator/translations/qtcreator_de.ts index 1fe961712e4..66171ce79a8 100644 --- a/share/qtcreator/translations/qtcreator_de.ts +++ b/share/qtcreator/translations/qtcreator_de.ts @@ -46957,7 +46957,7 @@ wirklich löschen? Key deployment failed. - + Deployment des Schlüssels fehlgeschlagen. Deployment finished successfully. @@ -47003,7 +47003,7 @@ Zusätzlich wird die Verbindung zum Gerät getestet. Uploading package to device... - + Lade Paket auf das Gerät hoch... Successfully uploaded package file. @@ -47015,19 +47015,19 @@ Zusätzlich wird die Verbindung zum Gerät getestet. Successfully installed package file. - + Die Paketdatei wurde erfolgreich installiert. Failed to start "stat": %1 - + "stat" konnte nicht gestartet werden: %1 "stat" crashed. - + "stat" ist abgestürzt. "stat" failed with exit code %1: %2 - + "stat" ist mit Rückgabewert %1 fehlgeschlagen: %2 Failed to retrieve remote timestamp for file "%1". Incremental deployment will not work. Error message was: %2 @@ -47066,7 +47066,7 @@ Zusätzlich wird die Verbindung zum Gerät getestet. Ignore missing files - + Fehlende Dateien ignorieren Upload files via SFTP @@ -47074,19 +47074,19 @@ Zusätzlich wird die Verbindung zum Gerät getestet. Sending echo to device... - + Sende Echo zum Gerät... echo failed: %1 - + Echo fehlgeschlagen: %1 echo failed. - + Echo fehlgeschlagen. Device replied to echo with expected contents. - + Das Gerät hat mit dem erwarteten Inhalt auf das Echo geantwortet. Checking kernel version... @@ -47110,7 +47110,7 @@ Zusätzlich wird die Verbindung zum Gerät getestet. Device replied to echo with unexpected contents: "%1" - + Das Gerät hat auf das Echo mit unerwartetem Inhalt geantwortet: "%1" The following specified ports are currently in use: %1 @@ -47119,56 +47119,62 @@ Zusätzlich wird die Verbindung zum Gerät getestet. Some tools will not work out of the box. - + Einige Werkzeuge werden nicht ohne weitere Einstellungen funktionieren. + Checking whether "%1" works... - + Überprüfe, ob "%1" funktioniert... Failed to start "%1": %2 - + "%1" konnte nicht gestartet werden: %2 + "%1" crashed. - + "%1" ist abgestürzt. + "%1" failed with exit code %2: %3 - + "%1" ist mit Rückgabewert %2 fehlgeschlagen: %3 + "%1" is functional. - + "%1" funktioniert. + "%1" will be used for deployment, because "%2" and "%3" are not available. - + "%1" wird für das Deployment benutzt, da "%2" und "%3" nicht verfügbar sind. + Checking if required commands are available... - + Überprüfe Verfügbarkeit der benötigten Kommandos... %1... - + %1... %1 found. - %1 gefunden. + %1 gefunden. An error occurred while checking for %1. - Bei der Prüfung von %1 trat ein Fehler auf. + Bei der Überprüfung von %1 trat ein Fehler auf. %1 not found. - %1 nicht gefunden. + %1 nicht gefunden. Deployment to this device will not work out of the box. @@ -47182,7 +47188,7 @@ Zusätzlich wird die Verbindung zum Gerät getestet. Deploy to Remote Linux Host - Auf Linux-Mobilgerät ausführen + Deployment auf entferntes Linuxgerät Installing package failed. @@ -47290,7 +47296,7 @@ Zusätzlich wird die Verbindung zum Gerät getestet. The device's SSH port number: - + SSH-Port des Geräts: The username to log into the device: @@ -47326,11 +47332,12 @@ Zusätzlich wird die Verbindung zum Gerät getestet. Source %1 and %2 - + Source (verb) /etc/profile and $HOME/.profile + %1 und %2 einbeziehen Direct - + Direkt &Username: @@ -47338,11 +47345,12 @@ Zusätzlich wird die Verbindung zum Gerät getestet. QML runtime executable: - + Ausführbare Datei der QML-Runtime: Access via: - + drop down with devices + Zugriff über: Physical Device @@ -47402,62 +47410,65 @@ Zusätzlich wird die Verbindung zum Gerät getestet. Cannot establish SSH connection: ssh binary "%1" does not exist. - SSH-Verbindung kann nicht aufgebaut werden: Eine ausführbare SSH-Datei "%1" existiert nicht. + SSH-Verbindung kann nicht hergestellt werden: Eine ausführbare SSH-Datei "%1" existiert nicht. Cannot establish SSH connection: Failed to create temporary directory for control socket: %1 - SSH-Verbindung kann nicht aufgebaut werden: Es konnte kein temporäres Verzeichnis für den Steuer-Socket angelegt werden: %1 + SSH-Verbindung kann nicht hergestellt werden: Es konnte kein temporäres Verzeichnis für den Steuer-Socket angelegt werden: %1 Cannot establish SSH connection. Control process failed to start. - + SSH-Verbindung kann nicht hergestellt werden. +Der Kontrollprozess konnte nicht gestartet werden. SSH connection failure. - SSH-Verbindungsfehler. + SSH-Verbindungsfehler. SSH connection failure: - + SSH-Verbindungsfehler: Remote Linux - + Entferntes Linuxgerät Failed: %1 - + Fehlgeschlagen: %1 Remote Linux Device - + Entferntes Linuxgerät "%1" failed to start: %2 - "%1" konnte nicht gestartet werden: %2 + "%1" konnte nicht gestartet werden: %2 "%1" crashed. - "%1" ist abgestürzt. + "%1" ist abgestürzt. "sftp" binary "%1" does not exist. - + Ausführbare "sftp"-Datei "%1" existiert nicht. Creating directory: %1 - + Erstelle Verzeichnis: %1 + Failed. - Fehlgeschlagen. + Fehlgeschlagen. Copying %1/%2: %3 -> %4 - + Kopiere %1/%2: %3 -> %4 + Clean Environment @@ -47559,7 +47570,7 @@ Wenn Sie noch keinen privaten Schlüssel besitzen, können Sie hier auch einen e Deploy via rsync: failed to create remote directories: - + Deployment über rsync: Erstellen von entfernten Verzeichnissen ist fehlgeschlagen: rsync failed to start: %1 @@ -47583,7 +47594,7 @@ Wenn Sie noch keinen privaten Schlüssel besitzen, können Sie hier auch einen e rsync is only supported for transfers between different devices. - + rsync wird nur für das Übertragen zwischen unterschiedlichen Geräten unterstützt. Deploy files via rsync @@ -47591,7 +47602,7 @@ Wenn Sie noch keinen privaten Schlüssel besitzen, können Sie hier auch einen e Command: - + Kommando: Install root: @@ -47599,43 +47610,43 @@ Wenn Sie noch keinen privaten Schlüssel besitzen, können Sie hier auch einen e Clean install root first: - + Install-Root zuerst bereinigen: Full command line: - + Vollständige Kommandozeile: Custom command line: - + Benutzerdefinierte Kommandozeile: Use custom command line instead: - + Benutzerdefinierte Kommandozeile verwenden: Install into temporary host directory - + In temporäres Host-Verzeichnis installieren You must provide an install root. - + Sie müssen ein Installationsverzeichnis angeben. The install root "%1" could not be cleaned. - + Das Installationsverzeichnis "%1" konnte nicht bereinigt werden. The install root "%1" could not be created. - + Das Installationsverzeichnis "%1" konnte nicht erstellt werden. The "make install" step should probably not be last in the list of deploy steps. Consider moving it up. - + Der "make install"-Schritt sollte wahrscheinlich nicht der letzte Deployment-Schritt sein. Ziehen Sie in Betracht, ihn nach oben zu verschieben. You need to add an install statement to your CMakeLists.txt file for deployment to work. - + Sie müssen zu Ihrer CMakeLists.txt-Datei eine "install"-Anweisung hinzufügen, damit das Deployment funktioniert. Executable on device: @@ -47651,59 +47662,59 @@ Wenn Sie noch keinen privaten Schlüssel besitzen, können Sie hier auch einen e New Remote Linux Device Configuration Setup - + Einrichtung der Konfiguration für neues entferntes Linuxgerät SSH Key Configuration - SSH-Schlüsselkonfiguration + SSH-Schlüsselkonfiguration &RSA - &RSA + &RSA ECDSA - ECDSA + ECDSA &Generate And Save Key Pair - &Erzeuge und speichere Schlüsselpaar + &Erzeuge und speichere Schlüsselpaar Options - Einstellungen + Einstellungen Key algorithm: - Schlüsselalgorithmus: + Schlüsselalgorithmus: Key &size: - Schlüssel&länge: + Schlüssel&länge: Public key file: - Öffentliche Schlüsseldatei: + Öffentliche Schlüsseldatei: The ssh-keygen tool was not found. - Das Programm "ssh-keygen" wurde nicht gefunden. + Das Programm "ssh-keygen" wurde nicht gefunden. Refusing to overwrite existing private key file "%1". - Die private Schlüsseldatei "%1" wird nicht überschrieben. + Die private Schlüsseldatei "%1" wird nicht überschrieben. The ssh-keygen tool at "%1" failed: %2 - Das Programm "ssh-keygen" in "%1" hat einen Fehler festgestellt: %2 + Das Programm "ssh-keygen" in "%1" hat einen Fehler festgestellt: %2 Choose Private Key File Name - Name der privaten Schlüsseldatei auswählen + Private Schlüsseldatei auswählen Key Generation Failed - Fehler bei Erzeugung der Schlüssel + Schlüsselerzeugung ist fehlgeschlagen From 3006dab72d51d2b50cf9c41faebc4abed0cee973 Mon Sep 17 00:00:00 2001 From: Eike Ziller Date: Thu, 27 Jul 2023 14:51:28 +0200 Subject: [PATCH 15/18] QmlDesigner: Fix wrong priority versus shortcut The arguments were mixed up, resulting in a shortcut of `\u0002` Amends 14b86100b52990570308f0ec3f7c727801d4ab85 Fixes: QTCREATORBUG-29431 Change-Id: I10cf959a9f9b24df1d1f544ad3ea80b1b2060751 Reviewed-by: Reviewed-by: Christian Stenger --- .../components/componentcore/designeractionmanager.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/plugins/qmldesigner/components/componentcore/designeractionmanager.cpp b/src/plugins/qmldesigner/components/componentcore/designeractionmanager.cpp index 7243225c887..86f66d86a13 100644 --- a/src/plugins/qmldesigner/components/componentcore/designeractionmanager.cpp +++ b/src/plugins/qmldesigner/components/componentcore/designeractionmanager.cpp @@ -1675,8 +1675,8 @@ void DesignerActionManager::createDefaultDesignerActions() setFlowStartDisplayName, {}, flowCategory, - 2, {}, + 2, &setFlowStartItem, &isFlowItem, &flowOptionVisible)); From 178b4909970b60e5de2140836fb9bb8250aef726 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Robert=20L=C3=B6hning?= Date: Thu, 27 Jul 2023 17:17:50 +0200 Subject: [PATCH 16/18] SquishTests: Adapt test of navigation tree Extends b57f72e3c8 to another test. Change-Id: I419ce4fb05667fd22a1e913ef7122b191e12a34a Reviewed-by: Reviewed-by: Christian Stenger --- tests/system/suite_general/tst_opencreator_qbs/test.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tests/system/suite_general/tst_opencreator_qbs/test.py b/tests/system/suite_general/tst_opencreator_qbs/test.py index 6ff692d41cf..86c8f99e4da 100644 --- a/tests/system/suite_general/tst_opencreator_qbs/test.py +++ b/tests/system/suite_general/tst_opencreator_qbs/test.py @@ -8,7 +8,7 @@ def main(): if not neededFilePresent(pathCreator): return - startQC() + startQC(["-noload", "ClangCodeModel"]) if not startedWithoutPluginError(): return openQbsProject(pathCreator) @@ -24,7 +24,7 @@ def main(): else: test.warning("Parsing project timed out") compareProjectTree(rootNodeTemplate % "Qt Creator", "projecttree_creator.tsv") - buildIssuesTexts = map(lambda i: str(i[0]), getBuildIssues()) + buildIssuesTexts = map(lambda i: str(i[0]), getBuildIssues(False)) deprecationWarnings = "\n".join(set(filter(lambda s: "deprecated" in s, buildIssuesTexts))) if deprecationWarnings: test.warning("Creator claims that the .qbs file uses deprecated features.", From 12067afc26a45d38f3dc428088d752b9e57e87bd Mon Sep 17 00:00:00 2001 From: Aleksei German Date: Tue, 27 Jun 2023 12:52:33 +0200 Subject: [PATCH 17/18] QmlDesigner: Add context object to a connection Fixes: QTCREATORBUG-29438 Change-Id: I3662737acf3d80c17c8004594540220296971ef3 (cherry picked from commit cfadc5a984f059b59d87194e2c7a98b92a98ad26) Reviewed-by: Christian Kandeler --- src/plugins/qmlprojectmanager/buildsystem/qmlbuildsystem.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/plugins/qmlprojectmanager/buildsystem/qmlbuildsystem.cpp b/src/plugins/qmlprojectmanager/buildsystem/qmlbuildsystem.cpp index bce1b5babc1..53b67603482 100644 --- a/src/plugins/qmlprojectmanager/buildsystem/qmlbuildsystem.cpp +++ b/src/plugins/qmlprojectmanager/buildsystem/qmlbuildsystem.cpp @@ -82,11 +82,11 @@ QmlBuildSystem::QmlBuildSystem(Target *target) updateDeploymentData(); registerMenuButtons(); - connect(target->project(), &Project::activeTargetChanged, [this](Target *target) { + connect(target->project(), &Project::activeTargetChanged, this, [this](Target *target) { refresh(RefreshOptions::NoFileRefresh); updateMcuBuildStep(target, qtForMCUs()); }); - connect(target->project(), &Project::projectFileIsDirty, [this]() { + connect(target->project(), &Project::projectFileIsDirty, this, [this]() { refresh(RefreshOptions::Project); updateMcuBuildStep(project()->activeTarget(), qtForMCUs()); }); From 17e932e3058cfcc2675925192448288fe2af348d Mon Sep 17 00:00:00 2001 From: Eike Ziller Date: Fri, 28 Jul 2023 11:09:35 +0200 Subject: [PATCH 18/18] Fix saving of keyboard schemes in presence of broken shortcut QKeySequence can consist of weird keys, and QmlDesigner accidentally set one to \u0002. Trying to write this into an XML attribute results in QXmlStreamWriter simply failing and never writing anything. Aside from fixing QmlDesigner in another patch, make sure that we only write valid characters to the XML, by using the same checks as in QXmlStreamWriter and writing/reading as hex-encoded as a fallback. Also print a warning, if saving the keyboard schemes fails for any reason. Fixes: QTCREATORBUG-29431 Change-Id: Ief656ea42db3c1dceeb3f90a851eb9000b63f0c6 Reviewed-by: Reviewed-by: Christian Stenger --- .../coreplugin/actionmanager/commandsfile.cpp | 38 +++++++++++++++++-- 1 file changed, 34 insertions(+), 4 deletions(-) diff --git a/src/plugins/coreplugin/actionmanager/commandsfile.cpp b/src/plugins/coreplugin/actionmanager/commandsfile.cpp index 7b69e3da916..f0a1db98608 100644 --- a/src/plugins/coreplugin/actionmanager/commandsfile.cpp +++ b/src/plugins/coreplugin/actionmanager/commandsfile.cpp @@ -49,6 +49,36 @@ CommandsFile::CommandsFile(const FilePath &filename) } +// XML attributes cannot contain these characters, and +// QXmlStreamWriter just bails out with an error. +// QKeySequence::toString() should probably not result in these +// characters, but it currently does, see QTCREATORBUG-29431 +static bool containsInvalidCharacters(const QString &s) +{ + const auto end = s.constEnd(); + for (auto it = s.constBegin(); it != end; ++it) { + // from QXmlStreamWriterPrivate::writeEscaped + if (*it == u'\v' || *it == u'\f' || *it <= u'\x1F' || *it >= u'\uFFFE') { + return true; + } + } + return false; +} + +static QString toAttribute(const QString &s) +{ + if (containsInvalidCharacters(s)) + return "0x" + QString::fromUtf8(s.toUtf8().toHex()); + return s; +} + +static QString fromAttribute(const QStringView &s) +{ + if (s.startsWith(QLatin1String("0x"))) + return QString::fromUtf8(QByteArray::fromHex(s.sliced(2).toUtf8())); + return s.toString(); +} + /*! \internal */ @@ -77,7 +107,7 @@ QMap> CommandsFile::importCommands() const QTC_ASSERT(!currentId.isEmpty(), continue); const QXmlStreamAttributes attributes = r.attributes(); if (attributes.hasAttribute(ctx.valueAttribute)) { - const QString keyString = attributes.value(ctx.valueAttribute).toString(); + const QString keyString = fromAttribute(attributes.value(ctx.valueAttribute)); QList keys = result.value(currentId); result.insert(currentId, keys << QKeySequence(keyString)); } @@ -94,7 +124,6 @@ QMap> CommandsFile::importCommands() const /*! \internal */ - bool CommandsFile::exportCommands(const QList &items) { FileSaver saver(m_filePath, QIODevice::Text); @@ -119,7 +148,7 @@ bool CommandsFile::exportCommands(const QList &items) w.writeAttribute(ctx.idAttribute, id.toString()); for (const QKeySequence &k : item->m_keys) { w.writeEmptyElement(ctx.keyElement); - w.writeAttribute(ctx.valueAttribute, k.toString()); + w.writeAttribute(ctx.valueAttribute, toAttribute(k.toString())); } w.writeEndElement(); // Shortcut } @@ -127,7 +156,8 @@ bool CommandsFile::exportCommands(const QList &items) w.writeEndElement(); w.writeEndDocument(); - saver.setResult(&w); + if (!saver.setResult(&w)) + qWarning() << saver.errorString(); } return saver.finalize(); }