Script 'mail_helper' called by obssrc Hello community, here is the log from the commit of package kf6-baloo for openSUSE:Factory checked in at 2026-04-11 22:23:24 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Comparing /work/SRC/openSUSE:Factory/kf6-baloo (Old) and /work/SRC/openSUSE:Factory/.kf6-baloo.new.21863 (New) ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "kf6-baloo" Sat Apr 11 22:23:24 2026 rev:26 rq:1345860 version:6.25.0 Changes: -------- --- /work/SRC/openSUSE:Factory/kf6-baloo/kf6-baloo.changes 2026-03-16 14:15:16.580150448 +0100 +++ /work/SRC/openSUSE:Factory/.kf6-baloo.new.21863/kf6-baloo.changes 2026-04-11 22:24:06.010794661 +0200 @@ -1,0 +2,25 @@ +Tue Apr 7 19:18:43 UTC 2026 - Christophe Marin <[email protected]> + +- Update to 6.25.0 + * New feature release + * For more details please see: + * https://kde.org/announcements/frameworks/6/6.25.0 +- Changes since 6.24.0: + * Update dependency version to 6.25.0 + * Fix remaining QFile::open nodiscard warnings + * [FileIndexerConfigUtils] Fix a nodiscard warning in fixture setup + * [FileIndexerConfigUtils] Remove unneeded QTextStream + * [FileIndexerConfigTest] Get rid of an almost duplicate helper function + * [FileIndexerConfigTest] Reduce repetitions/manual expansion + * [FileIndexerConfigTest] Reduce string puzzles to improve readability + * [FileIndexerConfigTest] Move single-use strings out of header file + * [DocumentUrlDBTest] Remove unused helper function + * [ExtractorProcess] Verify transaction was sucessfully created + * Tell the compiler QFile::open(fd, ...) can not fail for STDIN + * [Query] Use explicit percent-encoding for title and json data + * [QuerySerializationTest] Extend test coverage for disallowed characters + * [QuerySerializationTest] Cover fromSearchUrl/toSearchUrl methods + * [QuerySerializationTest] Make JSON roundtrip test data driven + * Update version to 6.25.0 + +------------------------------------------------------------------- Old: ---- baloo-6.24.0.tar.xz baloo-6.24.0.tar.xz.sig New: ---- baloo-6.25.0.tar.xz baloo-6.25.0.tar.xz.sig ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Other differences: ------------------ ++++++ kf6-baloo.spec ++++++ --- /var/tmp/diff_new_pack.Xkm9ku/_old 2026-04-11 22:24:06.594818567 +0200 +++ /var/tmp/diff_new_pack.Xkm9ku/_new 2026-04-11 22:24:06.594818567 +0200 @@ -19,11 +19,11 @@ %define qt6_version 6.8.0 %define rname baloo -# Full KF6 version (e.g. 6.24.0) +# Full KF6 version (e.g. 6.25.0) %{!?_kf6_version: %global _kf6_version %{version}} %bcond_without released Name: kf6-baloo -Version: 6.24.0 +Version: 6.25.0 Release: 0 Summary: Framework for searching and managing metadata License: GPL-2.0-or-later AND LGPL-2.1-or-later AND LGPL-3.0-only ++++++ baloo-6.24.0.tar.xz -> baloo-6.25.0.tar.xz ++++++ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/baloo-6.24.0/CMakeLists.txt new/baloo-6.25.0/CMakeLists.txt --- old/baloo-6.24.0/CMakeLists.txt 2026-03-07 21:28:47.000000000 +0100 +++ new/baloo-6.25.0/CMakeLists.txt 2026-04-03 19:06:54.000000000 +0200 @@ -1,8 +1,8 @@ # set minimum version requirements -cmake_minimum_required(VERSION 3.27) -set(REQUIRED_QT_VERSION 6.8.0) -set(KF_VERSION "6.24.0") # handled by release scripts -set(KF_DEP_VERSION "6.24.0") # handled by release scripts +cmake_minimum_required(VERSION 3.29) +set(REQUIRED_QT_VERSION 6.9.0) +set(KF_VERSION "6.25.0") # handled by release scripts +set(KF_DEP_VERSION "6.25.0") # handled by release scripts # set up project project(Baloo VERSION ${KF_VERSION}) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/baloo-6.24.0/autotests/unit/engine/documenturldbtest.cpp new/baloo-6.25.0/autotests/unit/engine/documenturldbtest.cpp --- old/baloo-6.24.0/autotests/unit/engine/documenturldbtest.cpp 2026-03-07 21:28:47.000000000 +0100 +++ new/baloo-6.25.0/autotests/unit/engine/documenturldbtest.cpp 2026-04-03 19:06:54.000000000 +0200 @@ -17,12 +17,6 @@ { Q_OBJECT - void touchFile(const QByteArray& path) { - QFile file(QString::fromUtf8(path)); - file.open(QIODevice::WriteOnly); - file.write("data"); - } - private Q_SLOTS: void testNonExistingPath() { /* diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/baloo-6.24.0/autotests/unit/file/basicindexingjobtest.cpp new/baloo-6.25.0/autotests/unit/file/basicindexingjobtest.cpp --- old/baloo-6.24.0/autotests/unit/file/basicindexingjobtest.cpp 2026-03-07 21:28:47.000000000 +0100 +++ new/baloo-6.25.0/autotests/unit/file/basicindexingjobtest.cpp 2026-04-03 19:06:54.000000000 +0200 @@ -62,12 +62,12 @@ }; for (const auto& entry : m_testFiles) { - QFile file(m_workDir.filePath(entry.filename)); - file.open(QIODevice::WriteOnly); - if (entry.filename.startsWith(QStringLiteral("test"))) { - file.write("\0", 1); - } - file.close(); + QFile file(m_workDir.filePath(entry.filename)); + QVERIFY(file.open(QIODevice::WriteOnly)); + if (entry.filename.startsWith(QStringLiteral("test"))) { + file.write("\0", 1); + } + file.close(); } } diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/baloo-6.24.0/autotests/unit/file/extractorcommandpipe_worker.cpp new/baloo-6.25.0/autotests/unit/file/extractorcommandpipe_worker.cpp --- old/baloo-6.24.0/autotests/unit/file/extractorcommandpipe_worker.cpp 2026-03-07 21:28:47.000000000 +0100 +++ new/baloo-6.25.0/autotests/unit/file/extractorcommandpipe_worker.cpp 2026-04-03 19:06:54.000000000 +0200 @@ -22,11 +22,11 @@ QCoreApplication app(argc, argv); QFile input; - input.open(STDIN_FILENO, QIODevice::ReadOnly | QIODevice::Unbuffered); + std::ignore = input.open(STDIN_FILENO, QIODevice::ReadOnly | QIODevice::Unbuffered); QSocketNotifier inputNotifier(STDIN_FILENO, QSocketNotifier::Read); QFile output; - output.open(STDOUT_FILENO, QIODevice::WriteOnly | QIODevice::Unbuffered); + std::ignore = output.open(STDOUT_FILENO, QIODevice::WriteOnly | QIODevice::Unbuffered); WorkerPipe worker(&input, &output); QObject::connect(&inputNotifier, &QSocketNotifier::activated, diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/baloo-6.24.0/autotests/unit/file/extractorprocess_fake.cpp new/baloo-6.25.0/autotests/unit/file/extractorprocess_fake.cpp --- old/baloo-6.24.0/autotests/unit/file/extractorprocess_fake.cpp 2026-03-07 21:28:47.000000000 +0100 +++ new/baloo-6.25.0/autotests/unit/file/extractorprocess_fake.cpp 2026-04-03 19:06:54.000000000 +0200 @@ -35,8 +35,8 @@ : notifier(STDIN_FILENO, QSocketNotifier::Read) , worker(&input, &output) { - input.open(STDIN_FILENO, QIODevice::ReadOnly | QIODevice::Unbuffered); - output.open(STDOUT_FILENO, QIODevice::WriteOnly | QIODevice::Unbuffered); + std::ignore = input.open(STDIN_FILENO, QIODevice::ReadOnly | QIODevice::Unbuffered); + std::ignore = output.open(STDOUT_FILENO, QIODevice::WriteOnly | QIODevice::Unbuffered); QObject::connect(¬ifier, // &QSocketNotifier::activated, diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/baloo-6.24.0/autotests/unit/file/fileindexerconfigtest.cpp new/baloo-6.25.0/autotests/unit/file/fileindexerconfigtest.cpp --- old/baloo-6.24.0/autotests/unit/file/fileindexerconfigtest.cpp 2026-03-07 21:28:47.000000000 +0100 +++ new/baloo-6.25.0/autotests/unit/file/fileindexerconfigtest.cpp 2026-04-03 19:06:54.000000000 +0200 @@ -18,6 +18,8 @@ namespace Baloo { namespace Test { +using namespace Qt::Literals::StringLiterals; + class FileIndexerConfigTest : public QObject { Q_OBJECT @@ -48,22 +50,53 @@ namespace { -const QString excludeFilter1 = QStringLiteral("build"); -const QString excludeFilter2 = QStringLiteral("foo?ar"); +// Trying to put all cases into one folder tree: +// |- indexedRootDir +// |- indexedSubDir +// |- indexedSubSubDir +// |- excludedSubSubDir +// |- .hiddenSubSubDir +// |- ignoredSubFolderToIndexedHidden +// |- indexedSubFolderToIndexedHidden +// |- excludedSubDir +// |- indexedSubDirToExcluded +// |- .indexedHiddenSubDirToExcluded +// |- .hiddenSubDir +// |- .indexedHiddenSubDir +// |- ignoredRootDir +// |- excludedRootDir +// +const QString indexedRootDir = u"d1/"_s; +const QString indexedSubDir = u"d1/sd1/"_s; +const QString indexedSubSubDir = u"d1/sd1/ssd1/"_s; +const QString excludedSubSubDir = u"d1/sd1/ssd2/"_s; +const QString hiddenSubSubDir = u"d1/sd1/.ssd3/"_s; +const QString ignoredSubFolderToIndexedHidden = u"d1/sd1/.ssd3/isfh1/"_s; +const QString indexedSubFolderToIndexedHidden = u"d1/sd1/.ssd3/isfh2/"_s; +const QString excludedSubDir = u"d1/sd2/"_s; +const QString indexedSubDirToExcluded = u"d1/sd2/isde1/"_s; +const QString indexedHiddenSubDirToExcluded = u"d1/sd2/.isde2/"_s; +const QString hiddenSubDir = u"d1/.sd3/"_s; +const QString indexedHiddenSubDir = u"d1/.sd4/"_s; +const QString ignoredRootDir = u"d2/"_s; +const QString excludedRootDir = u"d3/"_s; + +const QString excludeFilter1 = u"build"_s; +const QString excludeFilter2 = u"foo?ar"_s; -const QString excludedFilterSubDir1 = indexedRootDir + QLatin1String("/") + excludeFilter1; -const QString excludedFilterSubSubDir1 = excludedFilterSubDir1 + QLatin1String("/sub1"); +const QString excludedFilterSubDir1 = indexedRootDir + u"build/"_s; +const QString excludedFilterSubSubDir1 = indexedRootDir + u"build/sub1/"_s; -const QString excludedFilterSubDir2 = indexedRootDir + QLatin1String("/foobar"); -const QString excludedFilterSubSubDir2 = excludedFilterSubDir2 + QLatin1String("/sub2"); +const QString excludedFilterSubDir2 = indexedRootDir + u"foobar/"_s; +const QString excludedFilterSubSubDir2 = indexedRootDir + u"foobar/sub2/"_s; -const QString includedFilterSubDir = excludedFilterSubDir1 + QLatin1String("/sub3"); -const QString includedFilterSubSubDir = includedFilterSubDir + QLatin1String("/sub"); +const QString includedFilterSubDir = indexedRootDir + u"build/sub3/"_s; +const QString includedFilterSubSubDir = indexedRootDir + u"build/sub3/sub/"; } void FileIndexerConfigTest::initTestCase() { - m_mainDir = createTmpFolders(QStringList{ + m_mainDir = createTmpFilesAndFolders(QStringList{ indexedRootDir, indexedSubDir, indexedSubSubDir, @@ -84,9 +117,9 @@ excludedFilterSubDir2, excludedFilterSubSubDir2, includedFilterSubDir, - includedFilterSubSubDir - }); - m_dirPrefix = m_mainDir->path() + QLatin1Char('/'); + includedFilterSubSubDir, + }); + m_dirPrefix = m_mainDir->path() + QLatin1Char('/'); } void FileIndexerConfigTest::cleanupTestCase() @@ -119,13 +152,15 @@ QTest::addColumn<bool>("shouldBeIndexed"); for (const auto& key : indexed) { - QVERIFY2(QFileInfo(m_dirPrefix + key).isDir(), qPrintable(QStringLiteral("Not a folder: %1").arg(m_dirPrefix + key))); - QTest::addRow("%s", qPrintable(key)) << m_dirPrefix + key << true; + const auto dirName = m_dirPrefix + key; + QVERIFY2(QFileInfo(dirName).isDir(), qPrintable(u"Not a folder: %1"_s.arg(dirName))); + QTest::addRow("%s", qPrintable(key)) << dirName << true; } for (const auto& key : excluded) { - QVERIFY2(QFileInfo(m_dirPrefix + key).isDir(), qPrintable(QStringLiteral("Not a folder: %1").arg(m_dirPrefix + key))); - QTest::addRow("%s", qPrintable(key)) << m_dirPrefix + key << false; + const auto dirName = m_dirPrefix + key; + QVERIFY2(QFileInfo(dirName).isDir(), qPrintable(u"Not a folder: %1"_s.arg(dirName))); + QTest::addRow("%s", qPrintable(key)) << dirName << false; } } @@ -177,13 +212,15 @@ QTest::addColumn<bool>("shouldBeIndexed"); for (const auto& key : indexed) { - QVERIFY2(QFileInfo(m_dirPrefix + key).isDir(), qPrintable(QStringLiteral("Not a folder: %1").arg(m_dirPrefix + key))); - QTest::addRow("%s", qPrintable(key)) << m_dirPrefix + key << true; + const auto dirName = m_dirPrefix + key; + QVERIFY2(QFileInfo(dirName).isDir(), qPrintable(u"Not a folder: %1"_s.arg(dirName))); + QTest::addRow("%s", qPrintable(key)) << dirName << true; } for (const auto& key : excluded) { - QVERIFY2(QFileInfo(m_dirPrefix + key).isDir(), qPrintable(QStringLiteral("Not a folder: %1").arg(m_dirPrefix + key))); - QTest::addRow("%s", qPrintable(key)) << m_dirPrefix + key << false; + const auto dirName = m_dirPrefix + key; + QVERIFY2(QFileInfo(dirName).isDir(), qPrintable(u"Not a folder: %1"_s.arg(dirName))); + QTest::addRow("%s", qPrintable(key)) << dirName << false; } } @@ -215,7 +252,7 @@ void FileIndexerConfigTest::testShouldBeIndexed_data() { - const QString fileName = QStringLiteral("/somefile.txt"); + const QString fileName = u"somefile.txt"_s; const auto indexed = QStringList{ indexedRootDir, indexedSubDir, @@ -224,14 +261,6 @@ indexedSubDirToExcluded, indexedHiddenSubDir, }; - const auto indexedFilenames = QStringList{ - indexedRootDir + fileName, - indexedSubDir + fileName, - indexedSubSubDir + fileName, - indexedSubFolderToIndexedHidden + fileName, - indexedSubDirToExcluded + fileName, - indexedHiddenSubDir + fileName - }; const auto excluded = QStringList{ excludedSubSubDir, hiddenSubSubDir, @@ -241,35 +270,22 @@ ignoredRootDir, excludedRootDir, }; - const auto excludedFilenames = QStringList{ - excludedSubSubDir + fileName, - hiddenSubSubDir + fileName, - ignoredSubFolderToIndexedHidden + fileName, - excludedSubDir + fileName, - hiddenSubDir + fileName, - ignoredRootDir + fileName, - excludedRootDir + fileName, - }; QTest::addColumn<QString>("path"); QTest::addColumn<bool>("shouldBeIndexed"); for (const auto& key : indexed) { - QVERIFY2(QFileInfo(m_dirPrefix + key).isDir(), qPrintable(QStringLiteral("Not a folder: %1").arg(m_dirPrefix + key))); - QTest::addRow("%s", qPrintable(key)) << m_dirPrefix + key << true; - } - - for (const auto& key : indexedFilenames) { - QTest::addRow("%s", qPrintable(key)) << m_dirPrefix + key << true; + const auto dirName = m_dirPrefix + key; + QVERIFY2(QFileInfo(dirName).isDir(), qPrintable(u"Not a folder: %1"_s.arg(dirName))); + QTest::addRow("%s", qPrintable(key)) << dirName << true; + QTest::addRow("%s - file", qPrintable(key)) << dirName + fileName << true; } for (const auto& key : excluded) { - QVERIFY2(QFileInfo(m_dirPrefix + key).isDir(), qPrintable(QStringLiteral("Not a folder: %1").arg(m_dirPrefix + key))); - QTest::addRow("%s", qPrintable(key)) << m_dirPrefix + key << false; - } - - for (const auto& key : excludedFilenames) { - QTest::addRow("%s", qPrintable(key)) << m_dirPrefix + key << false; + const auto dirName = m_dirPrefix + key; + QVERIFY2(QFileInfo(dirName).isDir(), qPrintable(u"Not a folder: %1"_s.arg(dirName))); + QTest::addRow("%s", qPrintable(key)) << dirName << false; + QTest::addRow("%s - file", qPrintable(key)) << dirName + fileName << false; } } @@ -301,7 +317,8 @@ void FileIndexerConfigTest::testShouldBeIndexedHidden_data() { - const QString fileName = QStringLiteral("/somefile.txt"); + const QString fileName = u"somefile.txt"_s; + const auto indexed = QStringList{ indexedRootDir, indexedSubDir, @@ -313,49 +330,29 @@ hiddenSubDir, indexedHiddenSubDir }; - const auto indexedFilenames = QStringList{ - indexedRootDir + fileName, - indexedSubDir + fileName, - indexedSubSubDir + fileName, - hiddenSubSubDir + fileName, - ignoredSubFolderToIndexedHidden + fileName, - indexedSubFolderToIndexedHidden + fileName, - indexedSubDirToExcluded + fileName, - hiddenSubDir + fileName, - indexedHiddenSubDir + fileName - }; + const auto excluded = QStringList{ excludedSubSubDir, excludedSubDir, ignoredRootDir, - excludedRootDir - }; - const auto excludedFilenames = QStringList{ - excludedSubSubDir + fileName, - excludedSubDir + fileName, - ignoredRootDir + fileName, - excludedRootDir + fileName + excludedRootDir, }; QTest::addColumn<QString>("path"); QTest::addColumn<bool>("shouldBeIndexed"); for (const auto& key : indexed) { - QVERIFY2(QFileInfo(m_dirPrefix + key).isDir(), qPrintable(QStringLiteral("Not a folder: %1").arg(m_dirPrefix + key))); - QTest::addRow("%s", qPrintable(key)) << m_dirPrefix + key << true; - } - - for (const auto& key : indexedFilenames) { - QTest::addRow("%s", qPrintable(key)) << m_dirPrefix + key << true; + const auto dirName = m_dirPrefix + key; + QVERIFY2(QFileInfo(m_dirPrefix + key).isDir(), qPrintable(u"Not a folder: %1"_s.arg(m_dirPrefix + key))); + QTest::addRow("%s", qPrintable(key)) << dirName << true; + QTest::addRow("%s - file", qPrintable(key)) << dirName + fileName << true; } for (const auto& key : excluded) { - QVERIFY2(QFileInfo(m_dirPrefix + key).isDir(), qPrintable(QStringLiteral("Not a folder: %1").arg(m_dirPrefix + key))); - QTest::addRow("%s", qPrintable(key)) << m_dirPrefix + key << false; - } - - for (const auto& key : excludedFilenames) { - QTest::addRow("%s", qPrintable(key)) << m_dirPrefix + key << false; + const auto dirName = m_dirPrefix + key; + QVERIFY2(QFileInfo(m_dirPrefix + key).isDir(), qPrintable(u"Not a folder: %1"_s.arg(m_dirPrefix + key))); + QTest::addRow("%s", qPrintable(key)) << dirName << false; + QTest::addRow("%s - file", qPrintable(key)) << dirName + fileName << false; } } @@ -387,49 +384,34 @@ void FileIndexerConfigTest::testShouldExcludeFilterOnFolders_data() { - const QString fileName = QStringLiteral("/somefile.txt"); + const QString fileName = u"somefile.txt"_s; const auto indexed = QStringList{ indexedRootDir, includedFilterSubDir, includedFilterSubSubDir, }; - const auto indexedFilenames = QStringList{ - indexedRootDir + fileName, - includedFilterSubDir + fileName, - includedFilterSubSubDir + fileName - }; const auto excluded = QStringList{ excludedFilterSubDir1, excludedFilterSubSubDir1, excludedFilterSubDir2, excludedFilterSubSubDir2, }; - const auto excludedFilenames = QStringList{ - excludedFilterSubDir1 + fileName, - excludedFilterSubSubDir1 + fileName, - excludedFilterSubDir2 + fileName, - excludedFilterSubSubDir2 + fileName - }; QTest::addColumn<QString>("path"); QTest::addColumn<bool>("shouldBeIndexed"); for (const auto& key : indexed) { - QVERIFY2(QFileInfo(m_dirPrefix + key).isDir(), qPrintable(QStringLiteral("Not a folder: %1").arg(m_dirPrefix + key))); - QTest::addRow("%s", qPrintable(key)) << m_dirPrefix + key << true; - } - - for (const auto& key : indexedFilenames) { - QTest::addRow("%s", qPrintable(key)) << m_dirPrefix + key << true; + const auto dirName = m_dirPrefix + key; + QVERIFY2(QFileInfo(dirName).isDir(), qPrintable(u"Not a folder: %1"_s.arg(dirName))); + QTest::addRow("%s", qPrintable(key)) << dirName << true; + QTest::addRow("%s - file", qPrintable(key)) << dirName + fileName << true; } for (const auto& key : excluded) { - QVERIFY2(QFileInfo(m_dirPrefix + key).isDir(), qPrintable(QStringLiteral("Not a folder: %1").arg(m_dirPrefix + key))); - QTest::addRow("%s", qPrintable(key)) << m_dirPrefix + key << false; - } - - for (const auto& key : excludedFilenames) { - QTest::addRow("%s", qPrintable(key)) << m_dirPrefix + key << false; + const auto dirName = m_dirPrefix + key; + QVERIFY2(QFileInfo(dirName).isDir(), qPrintable(u"Not a folder: %1"_s.arg(dirName))); + QTest::addRow("%s", qPrintable(key)) << dirName << false; + QTest::addRow("%s - file", qPrintable(key)) << dirName + fileName << false; } } diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/baloo-6.24.0/autotests/unit/file/fileindexerconfigutils.h new/baloo-6.25.0/autotests/unit/file/fileindexerconfigutils.h --- old/baloo-6.24.0/autotests/unit/file/fileindexerconfigutils.h 2026-03-07 21:28:47.000000000 +0100 +++ new/baloo-6.25.0/autotests/unit/file/fileindexerconfigutils.h 2026-04-03 19:06:54.000000000 +0200 @@ -12,10 +12,10 @@ #include <KConfigGroup> #include <memory> + #include <QDir> -#include <QTextStream> -#include <QTemporaryDir> #include <QStandardPaths> +#include <QTemporaryDir> #ifdef Q_OS_WIN #include <windows.h> @@ -39,35 +39,6 @@ fileIndexerConfig.sync(); } -std::unique_ptr<QTemporaryDir> createTmpFolders(const QStringList& folders) -{ - auto tmpDir = std::make_unique<QTemporaryDir>(); - // If the temporary directory is in a hidden folder, then the tests will fail, - // so we use /tmp/ instead. - // TODO: Find a better solution - if (QFileInfo(tmpDir->path()).isHidden()) { - tmpDir = std::make_unique<QTemporaryDir>(QStringLiteral("/tmp/")); - } - for (const QString & f : folders) { - QDir dir(tmpDir->path()); - const auto lst = f.split(QLatin1Char('/'), Qt::SkipEmptyParts); - for (const QString & sf : lst) { - if (!dir.exists(sf)) { - dir.mkdir(sf); - } -#ifdef Q_OS_WIN - if(sf.startsWith(QLatin1Char('.'))) { - if(!SetFileAttributesW(reinterpret_cast<const WCHAR*>((dir.path() + "/" + sf).utf16()), FILE_ATTRIBUTE_HIDDEN)) { - qWarning("failed to set 'hidden' attribute!"); - } - } -#endif - dir.cd(sf); - } - } - return tmpDir; -} - std::unique_ptr<QTemporaryDir> createTmpFilesAndFolders(const QStringList& list) { auto tmpDir = std::make_unique<QTemporaryDir>(); @@ -97,46 +68,16 @@ } else { QFile file(tmpDir->path() + QLatin1Char('/') + f); - file.open(QIODevice::WriteOnly); + if (!file.open(QIODevice::WriteOnly)) { + return nullptr; + } - QTextStream stream(&file); - stream << "test"; + file.write("test"); } } return tmpDir; } -// -// Trying to put all cases into one folder tree: -// |- indexedRootDir -// |- indexedSubDir -// |- indexedSubSubDir -// |- excludedSubSubDir -// |- .hiddenSubSubDir -// |- ignoredSubFolderToIndexedHidden -// |- indexedSubFolderToIndexedHidden -// |- excludedSubDir -// |- indexedSubDirToExcluded -// |- .indexedHiddenSubDirToExcluded -// |- .hiddenSubDir -// |- .indexedHiddenSubDir -// |- ignoredRootDir -// |- excludedRootDir -// -const QString indexedRootDir = QStringLiteral("d1"); -const QString indexedSubDir = QStringLiteral("d1/sd1"); -const QString indexedSubSubDir = QStringLiteral("d1/sd1/ssd1"); -const QString excludedSubSubDir = QStringLiteral("d1/sd1/ssd2"); -const QString hiddenSubSubDir = QStringLiteral("d1/sd1/.ssd3"); -const QString ignoredSubFolderToIndexedHidden = QStringLiteral("d1/sd1/.ssd3/isfh1"); -const QString indexedSubFolderToIndexedHidden = QStringLiteral("d1/sd1/.ssd3/isfh2"); -const QString excludedSubDir = QStringLiteral("d1/sd2"); -const QString indexedSubDirToExcluded = QStringLiteral("d1/sd2/isde1"); -const QString indexedHiddenSubDirToExcluded = QStringLiteral("d1/sd2/.isde2"); -const QString hiddenSubDir = QStringLiteral("d1/.sd3"); -const QString indexedHiddenSubDir = QStringLiteral("d1/.sd4"); -const QString ignoredRootDir = QStringLiteral("d2"); -const QString excludedRootDir = QStringLiteral("d3"); -} -} +} // namespace Test +} // namespace Baloo #endif // FILEINDEXERCONFIGUTILS_H diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/baloo-6.24.0/autotests/unit/lib/filefetchjobtest.cpp new/baloo-6.25.0/autotests/unit/lib/filefetchjobtest.cpp --- old/baloo-6.24.0/autotests/unit/lib/filefetchjobtest.cpp 2026-03-07 21:28:47.000000000 +0100 +++ new/baloo-6.25.0/autotests/unit/lib/filefetchjobtest.cpp 2026-04-03 19:06:54.000000000 +0200 @@ -47,7 +47,7 @@ QVERIFY(!json.isEmpty()); QTemporaryFile tempFile; - tempFile.open(); + QVERIFY(tempFile.open()); Document doc; doc.setData(json); diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/baloo-6.24.0/autotests/unit/lib/queryserializationtest.cpp new/baloo-6.25.0/autotests/unit/lib/queryserializationtest.cpp --- old/baloo-6.24.0/autotests/unit/lib/queryserializationtest.cpp 2026-03-07 21:28:47.000000000 +0100 +++ new/baloo-6.25.0/autotests/unit/lib/queryserializationtest.cpp 2026-04-03 19:06:54.000000000 +0200 @@ -18,10 +18,10 @@ private Q_SLOTS: void testBasic(); - void testTerm(); - void testAndTerm(); - void testDateTerm(); - void testDateTimeTerm(); + void testJSON(); + void testJSON_data(); + void testURL(); + void testURL_data(); void testCustomOptions(); }; @@ -48,10 +48,12 @@ QCOMPARE(q, query); } -void QuerySerializationTest::testTerm() +void QuerySerializationTest::testJSON() { + QFETCH(QString, searchString); + Query query; - query.setSearchString(QStringLiteral("prop:value")); + query.setSearchString(searchString); QByteArray json = query.toJSON(); Query q = Query::fromJSON(json); @@ -59,37 +61,44 @@ QCOMPARE(q, query); } -void QuerySerializationTest::testAndTerm() +void QuerySerializationTest::testJSON_data() { - Query query; - query.setSearchString(QStringLiteral("prop1:1 AND prop2:2")); - - QByteArray json = query.toJSON(); - Query q = Query::fromJSON(json); + QTest::addColumn<QString>("searchString"); - QCOMPARE(q, query); + QTest::addRow("term") << QStringLiteral("prop:value"); + QTest::addRow("andTerm") << QStringLiteral("prop1:1 AND prop2:2"); + QTest::addRow("dateTerm") << QStringLiteral("prop:2015-05-01"); + QTest::addRow("dateTimeTerm") << QStringLiteral("prop:2015-05-01T23:44:11"); } -void QuerySerializationTest::testDateTerm() +void QuerySerializationTest::testURL() { + QFETCH(QString, searchString); + const auto title{searchString}; + Query query; - query.setSearchString(QStringLiteral("prop:2015-05-01")); + query.setSearchString(searchString); - QByteArray json = query.toJSON(); - Query q = Query::fromJSON(json); + const auto url = query.toSearchUrl(title); + QCOMPARE(Query::titleFromQueryUrl(url), title); + + Query q = Query::fromSearchUrl(url); + QCOMPARE(q.searchString(), query.searchString()); QCOMPARE(q, query); } -void QuerySerializationTest::testDateTimeTerm() +void QuerySerializationTest::testURL_data() { - Query query; - query.setSearchString(QStringLiteral("prop:2015-05-01T23:44:11")); + QTest::addColumn<QString>("searchString"); - QByteArray json = query.toJSON(); - Query q = Query::fromJSON(json); - - QCOMPARE(q, query); + QTest::addRow("term") << QStringLiteral("prop:value"); + QTest::addRow("andTerm") << QStringLiteral("prop1:1 AND prop2:2"); + QTest::addRow("dateTerm") << QStringLiteral("prop:2015-05-01"); + QTest::addRow("dateTimeTerm") << QStringLiteral("prop:2015-05-01T23:44:11"); + QTest::addRow("reservedChars") << QStringLiteral("()&+:,;[]!"); + QTest::addRow("disallowedChars") << QStringLiteral("{\"äöü\"}"); + QTest::addRow("looksLikePercentEncoded") << QStringLiteral("%22 abc %22"); } void QuerySerializationTest::testCustomOptions() diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/baloo-6.24.0/po/de/balooctl6.po new/baloo-6.25.0/po/de/balooctl6.po --- old/baloo-6.24.0/po/de/balooctl6.po 2026-03-07 21:28:47.000000000 +0100 +++ new/baloo-6.25.0/po/de/balooctl6.po 2026-04-03 19:06:54.000000000 +0200 @@ -1,20 +1,21 @@ # SPDX-FileCopyrightText: 2024 Johannes Obermayr <[email protected]> # SPDX-FileCopyrightText: 2014, 2015, 2018, 2020 Frederik Schwarzer <[email protected]> # SPDX-FileCopyrightText: 2015, 2017, 2018, 2019, 2020 Burkhard Lück <[email protected]> +# SPDX-FileCopyrightText: 2026 Frank Steinmetzger <[email protected]> msgid "" msgstr "" "Project-Id-Version: balooctl6\n" "Report-Msgid-Bugs-To: https://bugs.kde.org\n" "POT-Creation-Date: 2026-01-10 00:39+0000\n" -"PO-Revision-Date: 2024-12-23 19:10+0100\n" -"Last-Translator: Johannes Obermayr <[email protected]>\n" +"PO-Revision-Date: 2026-02-22 11:43+0100\n" +"Last-Translator: Frank Steinmetzger <[email protected]>\n" "Language-Team: German <[email protected]>\n" "Language: de\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" -"X-Generator: Lokalize 25.03.70\n" +"X-Generator: Lokalize 25.12.2\n" #, kde-format msgctxt "NAME OF TRANSLATORS" @@ -196,10 +197,9 @@ msgstr "%1 ist bereits in der Liste der ausgeschlossenen Ordner" #: configcommand.cpp:313 -#, fuzzy, kde-format -#| msgid "%1 is not in the list of include folders" +#, kde-format msgid "%1 is in the list of include folders" -msgstr "%1 ist nicht in der Liste der einbezogenen Ordner" +msgstr "%1 ist in der Liste der einbezogenen Ordner" #: configcommand.cpp:331 #, kde-format diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/baloo-6.24.0/po/fi/balooctl6.po new/baloo-6.25.0/po/fi/balooctl6.po --- old/baloo-6.24.0/po/fi/balooctl6.po 2026-03-07 21:28:47.000000000 +0100 +++ new/baloo-6.25.0/po/fi/balooctl6.po 2026-04-03 19:06:54.000000000 +0200 @@ -1,7 +1,7 @@ # Copyright (C) YEAR This_file_is_part_of_KDE # This file is distributed under the same license as the PACKAGE package. # Lasse Liehu <[email protected]>, 2014, 2015, 2017. -# SPDX-FileCopyrightText: 2017, 2018, 2019, 2020, 2023, 2024 Tommi Nieminen <[email protected]> +# SPDX-FileCopyrightText: 2017, 2018, 2019, 2020, 2023, 2024, 2026 Tommi Nieminen <[email protected]> # # # @@ -10,7 +10,7 @@ "Project-Id-Version: \n" "Report-Msgid-Bugs-To: https://bugs.kde.org\n" "POT-Creation-Date: 2026-01-10 00:39+0000\n" -"PO-Revision-Date: 2024-12-01 14:25+0200\n" +"PO-Revision-Date: 2026-03-13 13:37+0200\n" "Last-Translator: Tommi Nieminen <[email protected]>\n" "Language-Team: Finnish <[email protected]>\n" "Language: fi\n" @@ -18,7 +18,7 @@ "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" -"X-Generator: Lokalize 23.08.5\n" +"X-Generator: Lokalize 25.04.0\n" #, kde-format msgctxt "NAME OF TRANSLATORS" @@ -200,10 +200,9 @@ msgstr "%1 kuuluu jo sivuutettaviin kansioihin" #: configcommand.cpp:313 -#, fuzzy, kde-format -#| msgid "%1 is not in the list of include folders" +#, kde-format msgid "%1 is in the list of include folders" -msgstr "%1 ei kuulu mukana oleviin kansioihin" +msgstr "%1 kuuluu mukana oleviin kansioihin" #: configcommand.cpp:331 #, kde-format diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/baloo-6.24.0/po/he/balooshow6.po new/baloo-6.25.0/po/he/balooshow6.po --- old/baloo-6.24.0/po/he/balooshow6.po 2026-03-07 21:28:47.000000000 +0100 +++ new/baloo-6.25.0/po/he/balooshow6.po 2026-04-03 19:06:54.000000000 +0200 @@ -1,13 +1,13 @@ # Copyright (C) 2024 This file is copyright: # This file is distributed under the same license as the baloo package. # -# SPDX-FileCopyrightText: 2024 Yaron Shahrabani <[email protected]> +# SPDX-FileCopyrightText: 2024, 2026 Yaron Shahrabani <[email protected]> msgid "" msgstr "" "Project-Id-Version: baloo\n" "Report-Msgid-Bugs-To: https://bugs.kde.org\n" "POT-Creation-Date: 2025-11-17 11:49+0000\n" -"PO-Revision-Date: 2024-02-24 18:10+0200\n" +"PO-Revision-Date: 2026-03-20 08:13+0200\n" "Last-Translator: Yaron Shahrabani <[email protected]>\n" "Language-Team: צוות התרגום של KDE ישראל\n" "Language: he\n" @@ -16,7 +16,7 @@ "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=4; plural=(n == 1) ? 0 : ((n == 2) ? 1 : ((n > 10 && " "n % 10 == 0) ? 2 : 3));\n" -"X-Generator: Lokalize 23.08.4\n" +"X-Generator: Lokalize 25.12.3\n" #, kde-format msgctxt "NAME OF TRANSLATORS" @@ -90,7 +90,7 @@ #: main.cpp:153 #, kde-format msgid "%1: Failed to parse inode number" -msgstr "%1: פענוח מספר ה־inode נכשל" +msgstr "%1: פיענוח מספר ה־inode נכשל" #: main.cpp:177 #, kde-format diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/baloo-6.24.0/src/engine/transaction.cpp new/baloo-6.25.0/src/engine/transaction.cpp --- old/baloo-6.24.0/src/engine/transaction.cpp 2026-03-07 21:28:47.000000000 +0100 +++ new/baloo-6.25.0/src/engine/transaction.cpp 2026-04-03 19:06:54.000000000 +0200 @@ -53,7 +53,8 @@ uint flags = type == ReadOnly ? MDB_RDONLY : 0; int rc = mdb_txn_begin(m_env, nullptr, flags, &m_txn); if (rc) { - qCDebug(ENGINE) << "Transaction init() error:" << rc << mdb_strerror(rc); + m_lastError = rc; + qCWarning(ENGINE) << "Transaction init() error:" << rc << mdb_strerror(rc); return; } @@ -78,6 +79,11 @@ } } +const char *Transaction::lastError() const +{ + return mdb_strerror(m_lastError); +} + bool Transaction::hasDocument(quint64 id) const { Q_ASSERT(id > 0); @@ -299,6 +305,7 @@ m_txn = nullptr; if (rc) { + m_lastError = rc; qCWarning(ENGINE) << "Transaction::commit" << mdb_strerror(rc); return false; } diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/baloo-6.24.0/src/engine/transaction.h new/baloo-6.25.0/src/engine/transaction.h --- old/baloo-6.24.0/src/engine/transaction.h 2026-03-07 21:28:47.000000000 +0100 +++ new/baloo-6.25.0/src/engine/transaction.h 2026-04-03 19:06:54.000000000 +0200 @@ -38,6 +38,12 @@ Transaction(Database* db, TransactionType type); ~Transaction(); + constexpr bool isValid() const + { + return m_txn != nullptr; + } + const char *lastError() const; + // // Getters // @@ -119,6 +125,7 @@ MDB_txn *m_txn = nullptr; MDB_env *m_env = nullptr; std::unique_ptr<WriteTransaction> m_writeTrans; + int m_lastError = 0; friend class DatabaseSanitizerImpl; friend class DBState; // for testing diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/baloo-6.24.0/src/file/extractor/app.cpp new/baloo-6.25.0/src/file/extractor/app.cpp --- old/baloo-6.24.0/src/file/extractor/app.cpp 2026-03-07 21:28:47.000000000 +0100 +++ new/baloo-6.25.0/src/file/extractor/app.cpp 2026-04-03 19:06:54.000000000 +0200 @@ -34,8 +34,8 @@ , m_output() , m_workerPipe(&m_input, &m_output) { - m_input.open(STDIN_FILENO, QIODevice::ReadOnly | QIODevice::Unbuffered ); - m_output.open(STDOUT_FILENO, QIODevice::WriteOnly | QIODevice::Unbuffered ); + std::ignore = m_input.open(STDIN_FILENO, QIODevice::ReadOnly | QIODevice::Unbuffered); + std::ignore = m_output.open(STDOUT_FILENO, QIODevice::WriteOnly | QIODevice::Unbuffered); static int s_idleTimeout = 1000 * 60 * 1; // 1 min m_idleTime = KIdleTime::instance(); @@ -72,6 +72,17 @@ { Transaction tr(db, Transaction::ReadOnly); + if (tr.isValid()) { + m_consecutiveErrors = 0; + } else if (m_consecutiveErrors++ > 10) { + qCCritical(BALOO) << "Failed to create ReadOnly transaction" << tr.lastError(); + exit(3); + } else { + QTimer::singleShot(500, [this, ids]() { + slotNewBatch(ids); + }); + } + for (const auto id : ids) { auto url = tr.documentUrl(id); m_batch.push_back({id, url, IndexState::Pending, {}}); @@ -107,6 +118,16 @@ { Database *db = globalDatabaseInstance(); Transaction tr(db, Transaction::ReadWrite); + if (tr.isValid()) { + m_consecutiveErrors = 0; + } else if (m_consecutiveErrors++ > 10) { + qCCritical(BALOO) << "Failed to create ReadWrite transaction"; + exit(3); + } else { + QTimer::singleShot(500, [this]() { + processNextFile(); + }); + } size_t pendingCount = 0; diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/baloo-6.24.0/src/file/extractor/app.h new/baloo-6.25.0/src/file/extractor/app.h --- old/baloo-6.24.0/src/file/extractor/app.h 2026-03-07 21:28:47.000000000 +0100 +++ new/baloo-6.25.0/src/file/extractor/app.h 2026-04-03 19:06:54.000000000 +0200 @@ -75,6 +75,7 @@ }; std::vector<BatchInfo> m_batch; QElapsedTimer m_batchTime; + unsigned int m_consecutiveErrors = 0; }; } diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/baloo-6.24.0/src/file/extractorprocess.cpp new/baloo-6.25.0/src/file/extractorprocess.cpp --- old/baloo-6.24.0/src/file/extractorprocess.cpp 2026-03-07 21:28:47.000000000 +0100 +++ new/baloo-6.25.0/src/file/extractorprocess.cpp 2026-04-03 19:06:54.000000000 +0200 @@ -41,6 +41,9 @@ } else if (exitCode == 2) { // DB transaction commit error Q_EMIT failed(); + } else if (exitCode == 3) { + // DB transaction create error + Q_EMIT failed(); } else if (exitCode == 253) { // DrKonqi mangles signals depending on the core_pattern // and does a regular exit with status 253 instead diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/baloo-6.24.0/src/lib/query.cpp new/baloo-6.25.0/src/lib/query.cpp --- old/baloo-6.24.0/src/lib/query.cpp 2026-03-07 21:28:47.000000000 +0100 +++ new/baloo-6.25.0/src/lib/query.cpp 2026-04-03 19:06:54.000000000 +0200 @@ -19,6 +19,7 @@ #include <QJsonObject> using namespace Baloo; +using namespace Qt::StringLiterals; const int defaultLimit = -1; @@ -290,11 +291,13 @@ QUrl url; url.setScheme(QStringLiteral("baloosearch")); + const auto percentEncodedJSON = QString::fromUtf8(QUrl::toPercentEncoding(QString::fromUtf8(toJSON()), ":"_ba)); QUrlQuery urlQuery; - urlQuery.addQueryItem(QStringLiteral("json"), QString::fromUtf8(toJSON())); + urlQuery.addQueryItem(QStringLiteral("json"), percentEncodedJSON); if (!title.isEmpty()) { - urlQuery.addQueryItem(QStringLiteral("title"), title); + const auto percentEncodedTitle = QString::fromUtf8(QUrl::toPercentEncoding(title, ":"_ba)); + urlQuery.addQueryItem(QStringLiteral("title"), percentEncodedTitle); } url.setQuery(urlQuery);
