Hello community, here is the log from the commit of package kservice for openSUSE:Factory checked in at 2016-04-12 19:25:46 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Comparing /work/SRC/openSUSE:Factory/kservice (Old) and /work/SRC/openSUSE:Factory/.kservice.new (New) ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "kservice" Changes: -------- --- /work/SRC/openSUSE:Factory/kservice/kservice.changes 2016-03-16 10:31:44.000000000 +0100 +++ /work/SRC/openSUSE:Factory/.kservice.new/kservice.changes 2016-04-12 19:25:48.000000000 +0200 @@ -1,0 +2,13 @@ +Mon Apr 4 14:22:23 UTC 2016 - [email protected] + +- Update to 5.21.0 (boo#974793) + * Fix new kbuildsycoca warning, when a mimetype inherits + from an alias + * Fix handling of x-scheme-handler/* in mimeapps.list + * Fix handling of x-scheme-handler/* in mimeapps.list parsing + (kde#358159) + * Upgrade Qt version requirement to 5.4.0 + * For more details please see: + https://www.kde.org/announcements/kde-frameworks-5.21.0.php + +------------------------------------------------------------------- Old: ---- kservice-5.20.0.tar.xz New: ---- kservice-5.21.0.tar.xz ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Other differences: ------------------ ++++++ kservice.spec ++++++ --- /var/tmp/diff_new_pack.Q0IkMd/_old 2016-04-12 19:25:49.000000000 +0200 +++ /var/tmp/diff_new_pack.Q0IkMd/_new 2016-04-12 19:25:49.000000000 +0200 @@ -17,9 +17,9 @@ %bcond_without lang -%define _tar_path 5.20 +%define _tar_path 5.21 Name: kservice -Version: 5.20.0 +Version: 5.21.0 Release: 0 %define kf5_version %{version} BuildRequires: cmake >= 2.8.12 @@ -32,10 +32,10 @@ BuildRequires: kdoctools-devel >= %{_tar_path} BuildRequires: kf5-filesystem BuildRequires: ki18n-devel >= %{_tar_path} -BuildRequires: cmake(Qt5Concurrent) >= 5.3.0 -BuildRequires: cmake(Qt5DBus) >= 5.3.0 -BuildRequires: cmake(Qt5Test) >= 5.3.0 -BuildRequires: cmake(Qt5Xml) >= 5.3.0 +BuildRequires: cmake(Qt5Concurrent) >= 5.4.0 +BuildRequires: cmake(Qt5DBus) >= 5.4.0 +BuildRequires: cmake(Qt5Test) >= 5.4.0 +BuildRequires: cmake(Qt5Xml) >= 5.4.0 %if %{with lang} Recommends: %{name}-lang = %{version} %endif ++++++ kservice-5.20.0.tar.xz -> kservice-5.21.0.tar.xz ++++++ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/kservice-5.20.0/CMakeLists.txt new/kservice-5.21.0/CMakeLists.txt --- old/kservice-5.20.0/CMakeLists.txt 2016-03-05 20:08:10.000000000 +0100 +++ new/kservice-5.21.0/CMakeLists.txt 2016-04-03 23:02:37.000000000 +0200 @@ -5,7 +5,7 @@ # ECM setup include(FeatureSummary) -find_package(ECM 5.20.0 NO_MODULE) +find_package(ECM 5.21.0 NO_MODULE) set_package_properties(ECM PROPERTIES TYPE REQUIRED DESCRIPTION "Extra CMake Modules." URL "https://projects.kde.org/projects/kdesupport/extra-cmake-modules") feature_summary(WHAT REQUIRED_PACKAGES_NOT_FOUND FATAL_ON_MISSING_REQUIRED_PACKAGES) @@ -19,8 +19,8 @@ include(GenerateExportHeader) -set(KF5_VERSION "5.20.0") # handled by release scripts -set(KF5_DEP_VERSION "5.20.0") # handled by release scripts +set(KF5_VERSION "5.21.0") # handled by release scripts +set(KF5_DEP_VERSION "5.21.0") # handled by release scripts ecm_setup_version(${KF5_VERSION} VARIABLE_PREFIX KSERVICE @@ -35,7 +35,7 @@ remove_definitions(-DQT_NO_CAST_FROM_ASCII) # Dependencies -set(REQUIRED_QT_VERSION "5.3.0") +set(REQUIRED_QT_VERSION 5.4.0) find_package(Qt5 ${REQUIRED_QT_VERSION} CONFIG REQUIRED DBus Xml) find_package(KF5Config ${KF5_DEP_VERSION} REQUIRED) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/kservice-5.20.0/autotests/CMakeLists.txt new/kservice-5.21.0/autotests/CMakeLists.txt --- old/kservice-5.20.0/autotests/CMakeLists.txt 2016-03-05 20:08:10.000000000 +0100 +++ new/kservice-5.21.0/autotests/CMakeLists.txt 2016-04-03 23:02:37.000000000 +0200 @@ -43,7 +43,7 @@ ######### kmimeassociationstest ######## -set(kmimeassociationstest_SRCS kmimeassociationstest.cpp ../src/sycoca/kmimeassociations.cpp) +set(kmimeassociationstest_SRCS kmimeassociationstest.cpp ../src/sycoca/kmimeassociations.cpp ../src/sycoca/sycocadebug.cpp) ecm_add_test(${kmimeassociationstest_SRCS} TEST_NAME kmimeassociationstest LINK_LIBRARIES KF5::Service Qt5::Test) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/kservice-5.20.0/autotests/kmimeassociationstest.cpp new/kservice-5.21.0/autotests/kmimeassociationstest.cpp --- old/kservice-5.20.0/autotests/kmimeassociationstest.cpp 2016-03-05 20:08:10.000000000 +0100 +++ new/kservice-5.21.0/autotests/kmimeassociationstest.cpp 2016-04-03 23:02:37.000000000 +0200 @@ -33,6 +33,7 @@ #include "ksycoca_p.h" #include <QMimeDatabase> #include <QMimeType> +#include <QSignalSpy> // We need a factory that returns the same KService::Ptr every time it's asked for a given service. // Otherwise the changes to the service's serviceTypes by KMimeAssociationsTest have no effect @@ -187,6 +188,8 @@ "text/plain=faketextapplication.desktop;fakepfx-faketextapplicationpfx.desktop;gvim.desktop;wine.desktop;idontexist.desktop;\n" // test alias resolution "application/x-pdf=fakejpegapplication.desktop;\n" + // test x-scheme-handler (#358159) (missing trailing ';' as per xdg-mime bug...) + "x-scheme-handler/mailto=faketextapplication.desktop\n" "[Added KParts/ReadOnlyPart Associations]\n" "text/plain=katepart.desktop;\n" "[Removed Associations]\n" @@ -204,6 +207,7 @@ preferredApps[QStringLiteral("text/html")] << QStringLiteral("fakehtmlapplication.desktop") << QStringLiteral("fakepfx-fakehtmlapplicationpfx.desktop"); preferredApps[QStringLiteral("application/msword")] << QStringLiteral("fakecsrcmswordapplication.desktop"); + preferredApps[QStringLiteral("x-scheme-handler/mailto")] << QStringLiteral("faketextapplication.desktop"); removedApps[QStringLiteral("image/jpeg")] << QStringLiteral("firefox.desktop"); removedApps[QStringLiteral("text/html")] << QStringLiteral("gvim.desktop") << QStringLiteral("abiword.desktop"); @@ -452,11 +456,12 @@ { // Wait for notifyDatabaseChanged DBus signal // (The real KCM code simply does the refresh in a slot, asynchronously) - QEventLoop loop; - QObject::connect(KSycoca::self(), SIGNAL(databaseChanged(QStringList)), &loop, SLOT(quit())); + QSignalSpy spy(KSycoca::self(), SIGNAL(databaseChanged(QStringList))); KBuildSycoca builder; QVERIFY(builder.recreate()); - loop.exec(); + if (spy.isEmpty()) { + spy.wait(); + } } void writeToMimeApps(const QByteArray &contents) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/kservice-5.20.0/src/services/kmimetypefactory.cpp new/kservice-5.21.0/src/services/kmimetypefactory.cpp --- old/kservice-5.20.0/src/services/kmimetypefactory.cpp 2016-03-05 20:08:10.000000000 +0100 +++ new/kservice-5.21.0/src/services/kmimetypefactory.cpp 2016-04-03 23:02:37.000000000 +0200 @@ -99,6 +99,14 @@ return result; } +KMimeTypeFactory::MimeTypeEntry::Ptr KMimeTypeFactory::findMimeTypeEntryByName(const QString &name) +{ + Q_ASSERT(sycoca()->isBuilding()); + // We're building a database - the mimetype entry must be in memory + KSycocaEntry::Ptr servType = m_entryDict->value(name); + return MimeTypeEntry::Ptr(static_cast<MimeTypeEntry*>(servType.data())); +} + QStringList KMimeTypeFactory::resourceDirs() { return KSycocaFactory::allDirectories(QStringLiteral("mime")); diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/kservice-5.20.0/src/services/kmimetypefactory_p.h new/kservice-5.21.0/src/services/kmimetypefactory_p.h --- old/kservice-5.20.0/src/services/kmimetypefactory_p.h 2016-03-05 20:08:10.000000000 +0100 +++ new/kservice-5.21.0/src/services/kmimetypefactory_p.h 2016-04-03 23:02:37.000000000 +0200 @@ -100,6 +100,8 @@ void setServiceOffersOffset(int off); }; + MimeTypeEntry::Ptr findMimeTypeEntryByName(const QString &name); + protected: virtual MimeTypeEntry *createEntry(int offset) const; private: diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/kservice-5.20.0/src/sycoca/kbuildmimetypefactory.cpp new/kservice-5.21.0/src/sycoca/kbuildmimetypefactory.cpp --- old/kservice-5.20.0/src/sycoca/kbuildmimetypefactory.cpp 2016-03-05 20:08:10.000000000 +0100 +++ new/kservice-5.21.0/src/sycoca/kbuildmimetypefactory.cpp 2016-04-03 23:02:37.000000000 +0200 @@ -92,7 +92,7 @@ str.device()->seek(endOfFactoryData); } -void KBuildMimeTypeFactory::createFakeMimeType(const QString &name) +KMimeTypeFactory::MimeTypeEntry::Ptr KBuildMimeTypeFactory::createFakeMimeType(const QString &name) { const QString file = name; // hack KSycocaEntry::Ptr entry = m_entryDict->value(file); @@ -103,4 +103,5 @@ Q_ASSERT(entry && entry->isValid()); addEntry(entry); + return KMimeTypeFactory::MimeTypeEntry::Ptr(static_cast<MimeTypeEntry *>(entry.data())); } diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/kservice-5.20.0/src/sycoca/kbuildmimetypefactory_p.h new/kservice-5.21.0/src/sycoca/kbuildmimetypefactory_p.h --- old/kservice-5.20.0/src/sycoca/kbuildmimetypefactory_p.h 2016-03-05 20:08:10.000000000 +0100 +++ new/kservice-5.21.0/src/sycoca/kbuildmimetypefactory_p.h 2016-04-03 23:02:37.000000000 +0200 @@ -50,7 +50,7 @@ return 0L; } - void createFakeMimeType(const QString &name); + KMimeTypeFactory::MimeTypeEntry::Ptr createFakeMimeType(const QString &name); /** * Write out mime type specific index files. diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/kservice-5.20.0/src/sycoca/kbuildservicefactory.cpp new/kservice-5.21.0/src/sycoca/kbuildservicefactory.cpp --- old/kservice-5.20.0/src/sycoca/kbuildservicefactory.cpp 2016-03-05 20:08:10.000000000 +0100 +++ new/kservice-5.21.0/src/sycoca/kbuildservicefactory.cpp 2016-04-03 23:02:37.000000000 +0200 @@ -178,7 +178,10 @@ QMimeDatabase db; QMimeType qmime = db.mimeTypeForName(mimeTypeName); - Q_FOREACH (const QString &parentMimeType, qmime.parentMimeTypes()) { + Q_FOREACH (QString parentMimeType, qmime.parentMimeTypes()) { + + // Workaround issue in shared-mime-info and/or Qt, which sometimes return an alias as parent + parentMimeType = db.mimeTypeForName(parentMimeType).name(); collectInheritedServices(parentMimeType, visitedMimes); @@ -291,8 +294,7 @@ } else { //qDebug() << service->entryPath() << "specifies undefined mimetype/servicetype" << stName; // technically we could call addServiceOffer here, 'mime' isn't used. But it - // would be useless, since the loops for writing out the offers iterate - // over all known servicetypes and mimetypes. Unknown -> never written out. + // would be useless, since we have no mimetype entry where to write the offers offset. continue; } } else { @@ -328,28 +330,30 @@ int offersOffset = 0; const int offerEntrySize = sizeof(qint32) * 4; // four qint32s, see saveOfferList. - // TODO: idea: we could iterate over m_offerHash, and look up the servicetype or mimetype. - // Would that be faster than iterating over all servicetypes and mimetypes? - - KSycocaEntryDict::const_iterator itstf = m_serviceTypeFactory->entryDict()->constBegin(); - const KSycocaEntryDict::const_iterator endstf = m_serviceTypeFactory->entryDict()->constEnd(); - for (; itstf != endstf; ++itstf) { - KServiceType::Ptr entry(static_cast<KServiceType*>((*itstf).data())); - const int numOffers = m_offerHash.offersFor(entry->name()).count(); - if (numOffers) { - entry->setServiceOffersOffset(offersOffset); - offersOffset += offerEntrySize * numOffers; - } - } - KSycocaEntryDict::const_iterator itmtf = m_mimeTypeFactory->entryDict()->constBegin(); - const KSycocaEntryDict::const_iterator endmtf = m_mimeTypeFactory->entryDict()->constEnd(); - for (; itmtf != endmtf; ++itmtf) { - KMimeTypeFactory::MimeTypeEntry::Ptr entry(static_cast<KMimeTypeFactory::MimeTypeEntry*>((*itmtf).data())); - const int numOffers = m_offerHash.offersFor(entry->name()).count(); - if (numOffers) { - //qDebug() << entry->name() << "offset=" << offersOffset; - entry->setServiceOffersOffset(offersOffset); + const auto &offerHash = m_offerHash.serviceTypeData(); + auto it = offerHash.constBegin(); + const auto end = offerHash.constEnd(); + for ( ; it != end ; ++it ) { + const QString stName = it.key(); + const ServiceTypeOffersData offersData = it.value(); + const int numOffers = offersData.offers.count(); + KServiceType::Ptr serviceType = m_serviceTypeFactory->findServiceTypeByName(stName); + if (serviceType) { + serviceType->setServiceOffersOffset(offersOffset); offersOffset += offerEntrySize * numOffers; + } else { + KMimeTypeFactory::MimeTypeEntry::Ptr entry = m_mimeTypeFactory->findMimeTypeEntryByName(stName); + if (entry) { + entry->setServiceOffersOffset(offersOffset); + offersOffset += offerEntrySize * numOffers; + } else if (stName.startsWith(QLatin1String("x-scheme-handler/"))) { + // Create those on demand + entry = m_mimeTypeFactory->createFakeMimeType(stName); + entry->setServiceOffersOffset(offersOffset); + offersOffset += offerEntrySize * numOffers; + } else { + qWarning() << "Not found:" << stName; + } } } } @@ -357,45 +361,40 @@ void KBuildServiceFactory::saveOfferList(QDataStream &str) { m_offerListOffset = str.device()->pos(); + //qDebug() << "Saving offer list at offset" << m_offerListOffset; - // For each entry in servicetypeFactory - KSycocaEntryDict::const_iterator itstf = m_serviceTypeFactory->entryDict()->constBegin(); - const KSycocaEntryDict::const_iterator endstf = m_serviceTypeFactory->entryDict()->constEnd(); - for (; itstf != endstf; ++itstf) { - // export associated services - const KServiceType::Ptr entry(static_cast<KServiceType*>((*itstf).data())); - Q_ASSERT(entry); - - QList<KServiceOffer> offers = m_offerHash.offersFor(entry->name()); + const auto &offerHash = m_offerHash.serviceTypeData(); + auto it = offerHash.constBegin(); + const auto end = offerHash.constEnd(); + for ( ; it != end ; ++it ) { + const QString stName = it.key(); + const ServiceTypeOffersData offersData = it.value(); + QList<KServiceOffer> offers = offersData.offers; qStableSort(offers); // by initial preference - for (QList<KServiceOffer>::const_iterator it2 = offers.constBegin(); - it2 != offers.constEnd(); ++it2) { - //qDebug() << "servicetype offers list:" << entry->name() << "->" << (*it2).service()->entryPath(); - - str << qint32(entry->offset()); - str << qint32((*it2).service()->offset()); - str << qint32((*it2).preference()); - str << qint32(0); // mimeTypeInheritanceLevel - // update offerEntrySize in populateServiceTypes if you add/remove something here + int offset = -1; + KServiceType::Ptr serviceType = m_serviceTypeFactory->findServiceTypeByName(stName); + if (serviceType) { + offset = serviceType->offset(); + } else { + KMimeTypeFactory::MimeTypeEntry::Ptr entry = m_mimeTypeFactory->findMimeTypeEntryByName(stName); + if (entry) { + offset = entry->offset(); + //Q_ASSERT(str.device()->pos() == entry->serviceOffersOffset() + m_offerListOffset); + } + } + if (offset == -1) { + qDebug() << "Didn't find servicetype or mimetype" << stName; + continue; } - } - - // For each entry in mimeTypeFactory - KSycocaEntryDict::const_iterator itmtf = m_mimeTypeFactory->entryDict()->constBegin(); - const KSycocaEntryDict::const_iterator endmtf = m_mimeTypeFactory->entryDict()->constEnd(); - for (; itmtf != endmtf; ++itmtf) { - // export associated services - const KMimeTypeFactory::MimeTypeEntry::Ptr entry(static_cast<KMimeTypeFactory::MimeTypeEntry*>((*itmtf).data())); - Q_ASSERT(entry); - QList<KServiceOffer> offers = m_offerHash.offersFor(entry->name()); - qStableSort(offers); // by initial preference for (QList<KServiceOffer>::const_iterator it2 = offers.constBegin(); it2 != offers.constEnd(); ++it2) { - //qDebug() << "mimetype offers list:" << entry->name() << "->" << (*it2).service()->entryPath() << "pref" << (*it2).preference(); + + //qDebug() << stName << ":" << "writing offer" << (*it2).service()->desktopEntryName() << offset << (*it2).service()->offset() << "in sycoca at pos" << str.device()->pos(); Q_ASSERT((*it2).service()->offset() != 0); - str << qint32(entry->offset()); + + str << qint32(offset); str << qint32((*it2).service()->offset()); str << qint32((*it2).preference()); str << qint32((*it2).mimeTypeInheritanceLevel()); diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/kservice-5.20.0/src/sycoca/kmimeassociations.cpp new/kservice-5.21.0/src/sycoca/kmimeassociations.cpp --- old/kservice-5.20.0/src/sycoca/kmimeassociations.cpp 2016-03-05 20:08:10.000000000 +0100 +++ new/kservice-5.21.0/src/sycoca/kmimeassociations.cpp 2016-04-03 23:02:37.000000000 +0200 @@ -27,6 +27,7 @@ #include <QFile> #include <qstandardpaths.h> #include <qmimedatabase.h> +#include "sycocadebug.h" KMimeAssociations::KMimeAssociations(KOfferHash &offerHash, KServiceFactory *serviceFactory) : m_offerHash(offerHash), m_serviceFactory(serviceFactory) @@ -106,15 +107,15 @@ QMimeDatabase db; Q_FOREACH (const QString &mimeName, group.keyList()) { const QStringList services = group.readXdgListEntry(mimeName); - const QString resolvedMimeName = db.mimeTypeForName(mimeName).name(); + const QString resolvedMimeName = mimeName.startsWith("x-scheme-handler/") ? mimeName : db.mimeTypeForName(mimeName).name(); if (resolvedMimeName.isEmpty()) { - //qDebug() << file << "specifies unknown mimeType" << mimeName << "in" << group.name(); + qCDebug(SYCOCA) << file << "specifies unknown mimeType" << mimeName << "in" << group.name(); } else { int pref = basePreference; Q_FOREACH (const QString &service, services) { KService::Ptr pService = m_serviceFactory->findServiceByStorageId(service); if (!pService) { - //qDebug() << file << "specifies unknown service" << service << "in" << group.name(); + qDebug(SYCOCA) << file << "specifies unknown service" << service << "in" << group.name(); } else { //qDebug() << "adding mime" << resolvedMimeName << "to service" << pService->entryPath() << "pref=" << pref; m_offerHash.addServiceOffer(resolvedMimeName, KServiceOffer(pService, pref, 0, pService->allowAsDefault())); diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/kservice-5.20.0/src/sycoca/kmimeassociations_p.h new/kservice-5.21.0/src/sycoca/kmimeassociations_p.h --- old/kservice-5.20.0/src/sycoca/kmimeassociations_p.h 2016-03-05 20:08:10.000000000 +0100 +++ new/kservice-5.21.0/src/sycoca/kmimeassociations_p.h 2016-04-03 23:02:37.000000000 +0200 @@ -50,6 +50,8 @@ void removeServiceOffer(const QString &serviceType, KService::Ptr service); bool hasRemovedOffer(const QString &serviceType, KService::Ptr service) const; + const QHash<QString, ServiceTypeOffersData> &serviceTypeData() const { return m_serviceTypeData; } + private: KOfferHash(const KOfferHash &); // forbidden QHash<QString, ServiceTypeOffersData> m_serviceTypeData; diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/kservice-5.20.0/tests/CMakeLists.txt new/kservice-5.21.0/tests/CMakeLists.txt --- old/kservice-5.20.0/tests/CMakeLists.txt 2016-03-05 20:08:10.000000000 +0100 +++ new/kservice-5.21.0/tests/CMakeLists.txt 2016-04-03 23:02:37.000000000 +0200 @@ -22,6 +22,6 @@ findservice ) -add_executable(kmimeassociations_dumper kmimeassociations_dumper.cpp ../src/sycoca/kmimeassociations.cpp) +add_executable(kmimeassociations_dumper kmimeassociations_dumper.cpp ../src/sycoca/kmimeassociations.cpp ../src/sycoca/sycocadebug.cpp) target_link_libraries(kmimeassociations_dumper KF5::Service) ecm_mark_as_test(kmimeassociations_dumper)
