Script 'mail_helper' called by obssrc Hello community, here is the log from the commit of package bibletime for openSUSE:Factory checked in at 2025-03-10 18:04:59 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Comparing /work/SRC/openSUSE:Factory/bibletime (Old) and /work/SRC/openSUSE:Factory/.bibletime.new.19136 (New) ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "bibletime" Mon Mar 10 18:04:59 2025 rev:23 rq:1251553 version:3.1.0 Changes: -------- --- /work/SRC/openSUSE:Factory/bibletime/bibletime.changes 2024-02-23 16:47:51.816850316 +0100 +++ /work/SRC/openSUSE:Factory/.bibletime.new.19136/bibletime.changes 2025-03-10 18:05:14.646358684 +0100 @@ -1,0 +2,8 @@ +Sat Mar 8 19:21:08 UTC 2025 - Jaime MarquÃnez Ferrándiz <jaime.marquinez.ferran...@fastmail.net> + +- Update to 3.1.0 + * Use Qt 6 +- Add fix_compilation_against_sword_1_8_1.patch and + fixed_grouping_serialization_qt5_compatibility.patch + +------------------------------------------------------------------- Old: ---- bibletime-3.0.3.tar.xz New: ---- bibletime-3.1.0.tar.xz fix_compilation_against_sword_1_8_1.patch fixed_grouping_serialization_qt5_compatibility.patch BETA DEBUG BEGIN: New: * Use Qt 6 - Add fix_compilation_against_sword_1_8_1.patch and fixed_grouping_serialization_qt5_compatibility.patch New:- Add fix_compilation_against_sword_1_8_1.patch and fixed_grouping_serialization_qt5_compatibility.patch BETA DEBUG END: ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Other differences: ------------------ ++++++ bibletime.spec ++++++ --- /var/tmp/diff_new_pack.hhKYK9/_old 2025-03-10 18:05:15.554396299 +0100 +++ /var/tmp/diff_new_pack.hhKYK9/_new 2025-03-10 18:05:15.554396299 +0100 @@ -1,7 +1,7 @@ # # spec file for package bibletime # -# Copyright (c) 2024 SUSE LLC +# Copyright (c) 2025 SUSE LLC # Copyright (c) 2012-2014 Lars Vogdt # # All modifications and additions to the file contributed by third parties @@ -21,7 +21,7 @@ %global __requires_exclude qmlimport\\(BibleTime.* Name: bibletime -Version: 3.0.3 +Version: 3.1.0 Release: 0 Summary: A Bible study tool License: GPL-2.0-or-later @@ -29,22 +29,28 @@ URL: http://www.bibletime.info/ Source0: https://github.com/bibletime/bibletime/releases/download/v%{version}/bibletime-%{version}.tar.xz Source1: bibletime-rpmlintrc -BuildRequires: cmake +# PATCH-FIX-UPSTREAM https://github.com/bibletime/bibletime/issues/498 +Patch0: fix_compilation_against_sword_1_8_1.patch +# PATCH-FIX-UPSTREAM https://github.com/bibletime/bibletime/issues/497 +Patch1: fixed_grouping_serialization_qt5_compatibility.patch +BuildRequires: cmake >= 3.12 BuildRequires: curl-devel BuildRequires: fdupes BuildRequires: pkgconfig BuildRequires: update-desktop-files -BuildRequires: cmake(Qt5Core) -BuildRequires: cmake(Qt5Gui) -BuildRequires: cmake(Qt5LinguistTools) -BuildRequires: cmake(Qt5PrintSupport) -BuildRequires: cmake(Qt5Qml) -BuildRequires: cmake(Qt5Svg) -BuildRequires: cmake(Qt5Test) -BuildRequires: cmake(Qt5Widgets) -BuildRequires: cmake(Qt5Xml) -BuildRequires: pkgconfig(libclucene-core) -BuildRequires: pkgconfig(sword) >= 1.7 +BuildRequires: cmake(Qt6Core) +BuildRequires: cmake(Qt6Gui) +BuildRequires: cmake(Qt6LinguistTools) +BuildRequires: cmake(Qt6PrintSupport) +BuildRequires: cmake(Qt6Qml) +BuildRequires: cmake(Qt6Quick) +BuildRequires: cmake(Qt6QuickWidgets) +BuildRequires: cmake(Qt6Svg) +BuildRequires: cmake(Qt6Test) +BuildRequires: cmake(Qt6Widgets) +BuildRequires: cmake(Qt6Xml) +BuildRequires: pkgconfig(libclucene-core) >= 2.0 +BuildRequires: pkgconfig(sword) >= 1.8.1 # Dependencies for building documentation BuildRequires: docbook-xsl-stylesheets BuildRequires: fop @@ -70,27 +76,24 @@ write own notes, save, print etc.). %prep -%setup -q +%autosetup -p1 %build -%cmake \ -%if 0%{?suse_version} < 1600 +%cmake_qt6 \ -DCMAKE_INSTALL_DOCDIR:PATH=%{_docdir}/%{name} \ -%endif - -DCMAKE_BUILD_TYPE=Release \ -DBT_DOCBOOK_XSL_HTML_CHUNK_XSL=%{_datadir}/xml/docbook/stylesheet/nwalsh/current/html/chunk.xsl \ -DBT_DOCBOOK_XSL_PDF_DOCBOOK_XSL=%{_datadir}/xml/docbook/stylesheet/nwalsh/current/fo/docbook.xsl -%cmake_build +%qt6_build %install -%cmake_install +%qt6_install %fdupes -s %{buildroot} %suse_update_desktop_file -r %{buildroot}%{_datadir}/applications/info.%{name}.BibleTime.desktop Education Humanities %files -%doc ChangeLog README.md +%doc README.md %license LICENSE %{_bindir}/bibletime %{_datadir}/icons/* ++++++ bibletime-3.0.3.tar.xz -> bibletime-3.1.0.tar.xz ++++++ ++++ 252233 lines of diff (skipped) ++++++ fix_compilation_against_sword_1_8_1.patch ++++++ >From 0be2c8854eba81b94dbf81289d57ec50ab2b6ca4 Mon Sep 17 00:00:00 2001 From: Jaak Ristioja <j...@ristioja.ee> Date: Sat, 8 Mar 2025 19:11:41 +0200 Subject: [PATCH] backend, BtInstallMgr: Fix compilation against Sword 1.8.1 The if constexpr body is type-checked regardless of whether the condition holds. --- src/backend/btinstallmgr.cpp | 17 +++++++++++------ 1 file changed, 11 insertions(+), 6 deletions(-) diff --git a/src/backend/btinstallmgr.cpp b/src/backend/btinstallmgr.cpp index 063ea2ff4..f6473ec04 100644 --- a/src/backend/btinstallmgr.cpp +++ b/src/backend/btinstallmgr.cpp @@ -51,13 +51,19 @@ inline int calculateIntPercentage(T done, T total) { } template <typename T, class = void> -struct HasSetTimeoutMillis : std::false_type {}; +struct TrySetTimeoutMillis { + template <typename ... Args> + static void setTimeoutMillis(Args && ...) noexcept {} +}; template <typename T> -struct HasSetTimeoutMillis<T, +struct TrySetTimeoutMillis<T, std::void_t<decltype(std::declval<T &>().setTimeoutMillis(0))>> - : std::true_type -{}; +{ + template <typename ... Args> + static void setTimeoutMillis(T & c, Args && ... args) + { c.setTimeoutMillis(std::forward<Args>(args)...); } +}; } // anonymous namespace @@ -71,8 +77,7 @@ BtInstallMgr::BtInstallMgr(QObject * parent) , m_firstCallOfPreStatus(true) { setFTPPassive(true); - if constexpr (HasSetTimeoutMillis<BtInstallMgr>::value) - setTimeoutMillis(0); + TrySetTimeoutMillis<BtInstallMgr>::setTimeoutMillis(*this, 0); } BtInstallMgr::~BtInstallMgr() { ++++++ fixed_grouping_serialization_qt5_compatibility.patch ++++++ >From 52fca59a99bf1bfec88945a1654b9760a5ea8eda Mon Sep 17 00:00:00 2001 From: Jaak Ristioja <j...@ristioja.ee> Date: Sat, 8 Mar 2025 00:05:20 +0200 Subject: [PATCH] backend, BtBookshelfTreeModel: Fixed Grouping serialization Qt5 compatibility The Qt6 API change the of the QList<T>::size() return type from int to qsizetype broke our the serialization and deserialization logic. This was an oversight during porting to Qt6, and a rather unpleasantly difficult one to fix, but thanks God for His mercy! :) --- .../bookshelfmodel/btbookshelftreemodel.cpp | 142 +++++++++++++++++- 1 file changed, 134 insertions(+), 8 deletions(-) diff --git a/src/backend/bookshelfmodel/btbookshelftreemodel.cpp b/src/backend/bookshelfmodel/btbookshelftreemodel.cpp index 6a62e646a..d310d1458 100644 --- a/src/backend/bookshelfmodel/btbookshelftreemodel.cpp +++ b/src/backend/bookshelfmodel/btbookshelftreemodel.cpp @@ -12,7 +12,9 @@ #include "btbookshelftreemodel.h" +#include <QByteArray> #include <QDataStream> +#include <QDebug> #include <QModelIndexList> #include <QPair> #include <QtGlobal> @@ -627,14 +629,138 @@ QDataStream & operator <<(QDataStream & os, QDataStream & operator >>(QDataStream & is, BtBookshelfTreeModel::Grouping & o) { - decltype(o.list().size()) s; - is >> s; - decltype(o.m_list) newList; - for (decltype(s) i = 0; i < s; i++) { - std::underlying_type_t<BtBookshelfTreeModel::Group> g; - is >> g; - newList.append(static_cast<BtBookshelfTreeModel::Group>(g)); + using Size = decltype(o.list().size()); + Size size = -1; // -1 stands for invalid + + // Due to a serialization bug in BibleTime the grouping size may have been + // serialized as an int on Qt5 or as qsizetype on Qt6. The complex logic + // which follows works around this issue by attempting to parse both cases. + // This is not entirely future proof, but good enough for the foreseeable + // future, assuming that Qt does not change too much and users upgrade + // relatively often enough. + using U = std::underlying_type_t<BtBookshelfTreeModel::Group>; + if constexpr (std::is_same_v<int, Size>) { + is >> size; + } else { + // If other strange platforms need to be supported, please let us know: + static_assert(sizeof(int) == 4, "Platform not supported"); + static_assert(sizeof(Size) == 8, "Platform not supported"); + + // The following relies on Qt providing us a datastream which only + // contains the serialized value and an optional ')' at the end. See + // QSettingsPrivate::stringToVariant() in Qt 6.8.2 for details. Assuming + // this, and the facts that the size can only be 0, 1 or 2, and that the + // values can only be 0 or 1, makes it possible for us to deduce the + // width of the serialized size field. + static constexpr Size const maxReadSize = + sizeof(Size) + sizeof(U) * 2 + 2; + char buf[maxReadSize]; + auto readSize = is.device()->peek(buf, maxReadSize); + if (readSize < maxReadSize) { // Assumptions about Qt must hold + if (buf[readSize - 1] == ')') + --readSize; + if (readSize == 4) { // 4 bytes can only fit an (int) size: + int s; + is >> s; // Consume (int) + if (s == 0) // The (int) size can only be 0. + size = 0; + } else if (readSize == 8) { + // 8 bytes can be either hold a (Size) size of value 0, or a + // (int) size of value 1 followed by an (int) value. + int s; + is >> s; // Consume (int) + if (s == 1) { // (int) size of value 1 + size = s; + } else if (s == 0) { // (Size) size + is >> s; // Consume other (int) half of (Size) size + if (s == 0) // Both (int) halves must be 0 for (Size) 0 + size = 0; + } + } else if (readSize == 12) { + // 12 bytes either holds a (Size) size of value 1 and a value, + // or an (int) size of value 2, and two values: + int s; + is >> s; // Consume (int) + if (s == 2) { // (int) size of value 2 + size = 2; + } else if (s >= 0 && s <= 1) { // First half is either 0 or 1 + int s2; + is >> s2; // Consume other (int) half of (Size) size + if ((s2 ^ 0x1) == s) // Other half is the other way around + size = 1; + } + } else if (readSize == 16) { // must be (Size) 2 + (int) values + is >> size; // Consume (Size) size + if (size != 2) // The (Size) size can only by 2 + size = -1; + } // else keep size as -1 (invalid) + } } - o.m_list = std::move(newList); + + if (size >= 0 && size <= 2) { + decltype(o.m_list) newList; + for (; size; --size) { + U v; + is >> v; + if (v < 0 || v > 1) + break; + newList.append(static_cast<BtBookshelfTreeModel::Group>(v)); + } + if (!size) { + o.m_list = std::move(newList); + return is; + } + } + + qWarning() << "Failed to deserialize BtBookshelfTreeModel::Grouping"; + is.setStatus(QDataStream::ReadCorruptData); + o.m_list.clear(); return is; } + +#if 0 +namespace { + +template <typename SizeType> +void testGroupingSerialization_(BtBookshelfTreeModel::Grouping const & expected) +{ + using U = std::underlying_type_t<BtBookshelfTreeModel::Group>; + auto const & list = expected.list(); + QByteArray byteArray; + { + QBuffer buffer(&byteArray); + buffer.open(QIODevice::WriteOnly); + QDataStream os(&buffer); + SizeType s = list.size(); + os << s; + for (auto const g : list) + os << static_cast<U>(g); + } + QBuffer buffer(&byteArray); + buffer.open(QIODevice::ReadOnly); + QDataStream is(&buffer); + BtBookshelfTreeModel::Grouping value; + is >> value; + if (value == expected) { + qInfo() << "SUCCESS" << Q_FUNC_INFO << byteArray << list; + } else { + qFatal() << "FAILURE" << Q_FUNC_INFO << byteArray << list; + } +} + +void testGroupingSerialization(BtBookshelfTreeModel::Grouping const & expected){ + testGroupingSerialization_<int>(expected); + testGroupingSerialization_<decltype(expected.list().size())>(expected); +} + +} // anonymous namespace + +void testGroupingSerializations() { + using G = BtBookshelfTreeModel::Grouping; + testGroupingSerialization(G::NONE); + testGroupingSerialization(G::CAT); + testGroupingSerialization(G::CAT_LANG); + testGroupingSerialization(G::LANG); + testGroupingSerialization(G::LANG_CAT); +} +#endif