commit: bb093e3f89752911fd56abe94a75b125c5fa897f Author: Andreas Sturmlechner <andreas.sturmlechner <AT> gmail <DOT> com> AuthorDate: Sun Sep 13 14:50:26 2015 +0000 Commit: Michael Palimaka <kensington <AT> gentoo <DOT> org> CommitDate: Sun Sep 13 20:21:54 2015 +0000 URL: https://gitweb.gentoo.org/proj/kde.git/commit/?id=bb093e3f
kde-apps/kdepimlibs: Backport GID merge fix for IMAP Upstream fix is in >=15.08.2 See also: https://bugs.kde.org/show_bug.cgi?id=338658#c39 Package-Manager: portage-2.2.20.1 .../files/kdepimlibs-15.08.0-GID-merge.patch | 210 +++++++++++++++++++++ .../files/kdepimlibs-15.08.0-RID-fallback.patch | 31 +++ ...15.08.0.ebuild => kdepimlibs-15.08.0-r1.ebuild} | 4 + kde-apps/kdepimlibs/kdepimlibs-15.08.1.ebuild | 4 + 4 files changed, 249 insertions(+) diff --git a/kde-apps/kdepimlibs/files/kdepimlibs-15.08.0-GID-merge.patch b/kde-apps/kdepimlibs/files/kdepimlibs-15.08.0-GID-merge.patch new file mode 100644 index 0000000..c29aa9b --- /dev/null +++ b/kde-apps/kdepimlibs/files/kdepimlibs-15.08.0-GID-merge.patch @@ -0,0 +1,210 @@ +From: Dan Vrátil <dvra...@redhat.com> +Date: Mon, 07 Sep 2015 13:50:50 +0000 +Subject: ItemSync: use RID merge by default, allow optional switch to GID merge +X-Git-Url: http://quickgit.kde.org/?p=kdepimlibs.git&a=commitdiff&h=43d5659a88a6ebb3423c6228986f0bd1e1f496f7 +--- +ItemSync: use RID merge by default, allow optional switch to GID merge + +GID is not guaranteed to be actually unique and is not in our control, which means +that we can easilly run to the multiple merge candidates problem, which breaks +ItemSync. This patch switching ItemSync to use RID, which (although not enforced) is +basically guaranteed to be unique per Collection, thus the multiple merge candidates +error should not happen anymore. + +Some resources however mandate GID-based merging (when RID is not stable), so we have +a new API that allows resources to switch the merging mode of ItemSync optionally. + +(cherry picked from commit 442961918d8f3d9ff94fd4593c9b09d1e89d6bc0) +--- + + +--- a/akonadi/autotests/itemsynctest.cpp ++++ b/akonadi/autotests/itemsynctest.cpp +@@ -451,14 +451,18 @@ + AKVERIFYEXEC(syncer); + + Item::List resultItems = fetchItems(col); +- QCOMPARE(resultItems.count(), 2); +- +- ItemFetchJob *fetchJob = new ItemFetchJob(modifiedItem); ++ QCOMPARE(resultItems.count(), 3); ++ ++ Item item; ++ item.setGid(QStringLiteral("gid2")); ++ ItemFetchJob *fetchJob = new ItemFetchJob(item); + fetchJob->fetchScope().fetchFullPayload(); + AKVERIFYEXEC(fetchJob); +- QCOMPARE(fetchJob->items().size(), 1); ++ QCOMPARE(fetchJob->items().size(), 2); + QCOMPARE(fetchJob->items().first().payload<QByteArray>(), QByteArray("payload2")); + QCOMPARE(fetchJob->items().first().remoteId(), QString::fromLatin1("rid3")); ++ QCOMPARE(fetchJob->items().at(1).payload<QByteArray>(), QByteArray("payload1")); ++ QCOMPARE(fetchJob->items().at(1).remoteId(), QStringLiteral("rid2")); + } + + /* + +--- a/akonadi/src/agentbase/resourcebase.cpp ++++ b/akonadi/src/agentbase/resourcebase.cpp +@@ -76,6 +76,7 @@ + , mItemSyncer(0) + , mItemSyncFetchScope(0) + , mItemTransactionMode(ItemSync::SingleTransaction) ++ , mItemMergeMode(ItemSync::RIDMerge) + , mCollectionSyncer(0) + , mTagSyncer(0) + , mRelationSyncer(0) +@@ -189,6 +190,7 @@ + mItemSyncer = new ItemSync(q->currentCollection()); + mItemSyncer->setTransactionMode(mItemTransactionMode); + mItemSyncer->setBatchSize(mItemSyncBatchSize); ++ mItemSyncer->setMergeMode(mItemMergeMode); + if (mItemSyncFetchScope) { + mItemSyncer->setFetchScope(*mItemSyncFetchScope); + } +@@ -456,6 +458,7 @@ + ItemSync *mItemSyncer; + ItemFetchScope *mItemSyncFetchScope; + ItemSync::TransactionMode mItemTransactionMode; ++ ItemSync::MergeMode mItemMergeMode; + CollectionSync *mCollectionSyncer; + TagSync *mTagSyncer; + RelationSync *mRelationSyncer; +@@ -1379,6 +1382,12 @@ + *(d->mItemSyncFetchScope) = fetchScope; + } + ++void ResourceBase::setItemMergingMode(ItemSync::MergeMode mode) ++{ ++ Q_D(ResourceBase); ++ d->mItemMergeMode = mode; ++} ++ + void ResourceBase::setAutomaticProgressReporting(bool enabled) + { + Q_D(ResourceBase); + +--- a/akonadi/src/agentbase/resourcebase.h ++++ b/akonadi/src/agentbase/resourcebase.h +@@ -545,6 +545,20 @@ + * @since 4.6 + */ + void setItemTransactionMode(ItemSync::TransactionMode mode); ++ ++ /** ++ * Set merge mode for item sync'ing. ++ * ++ * Default merge mode is RIDMerge. ++ * ++ * @note This method must be called before first call to itemRetrieved(), ++ * itemsRetrieved() or itemsRetrievedIncremental(). ++ * ++ * @param mode Item merging mode (see ItemCreateJob for details on item merging) ++ * @see Akonadi::ItemSync::MergeMode ++ * @ince 4.14.11 ++ */ ++ void setItemMergingMode(ItemSync::MergeMode mode); + + /** + * Set the fetch scope applied for item synchronization. + +--- a/akonadi/src/core/itemsync.cpp ++++ b/akonadi/src/core/itemsync.cpp +@@ -61,6 +61,7 @@ + , mProcessingBatch(false) + , mDisableAutomaticDeliveryDone(false) + , mBatchSize(10) ++ , mMergeMode(Akonadi::ItemSync::RIDMerge) + { + // we want to fetch all data by default + mFetchScope.fetchFullPayload(); +@@ -116,6 +117,7 @@ + bool mDisableAutomaticDeliveryDone; + + int mBatchSize; ++ Akonadi::ItemSync::MergeMode mMergeMode; + }; + + void ItemSyncPrivate::createOrMerge(const Item &item) +@@ -127,11 +129,13 @@ + } + mPendingJobs++; + ItemCreateJob *create = new ItemCreateJob(item, mSyncCollection, subjobParent()); +- if (!item.gid().isEmpty()) { +- create->setMerge(ItemCreateJob::GID | ItemCreateJob::Silent); +- } else { +- create->setMerge(ItemCreateJob::RID | ItemCreateJob::Silent); +- } ++ ItemCreateJob::MergeOptions merge = ItemCreateJob::Silent; ++ if (mMergeMode == ItemSync::RIDMerge) { ++ merge |= ItemCreateJob::RID; ++ } else if (mMergeMode == ItemSync::GIDMerge && !item.gid().isEmpty()) { ++ merge |= ItemCreateJob::GID; ++ } ++ create->setMerge(merge); + q->connect(create, SIGNAL(result(KJob*)), q, SLOT(slotLocalChangeDone(KJob*))); + } + +@@ -535,5 +539,17 @@ + d->mBatchSize = size; + } + ++ItemSync::MergeMode ItemSync::mergeMode() const ++{ ++ Q_D(const ItemSync); ++ return d->mMergeMode; ++} ++ ++void ItemSync::setMergeMode(MergeMode mergeMode) ++{ ++ Q_D(ItemSync); ++ d->mMergeMode = mergeMode; ++} ++ + #include "moc_itemsync.cpp" + + +--- a/akonadi/src/core/itemsync.h ++++ b/akonadi/src/core/itemsync.h +@@ -56,6 +56,12 @@ + Q_OBJECT + + public: ++ enum MergeMode ++ { ++ RIDMerge, ++ GIDMerge ++ }; ++ + /** + * Creates a new item synchronizer. + * +@@ -208,6 +214,27 @@ + * @since 4.14 + */ + void setDisableAutomaticDeliveryDone(bool disable); ++ ++ /** ++ * Returns current merge mode ++ * ++ * @see setMergeMode() ++ * @since 5.1 ++ */ ++ MergeMode mergeMode() const; ++ ++ /** ++ * Set what merge method should be used for next ItemSync run ++ * ++ * By default ItemSync uses RIDMerge method. ++ * ++ * See ItemCreateJob for details on Item merging. ++ * ++ * @note You must call this method before starting the sync, changes afterwards lead to undefined results. ++ * @see mergeMode ++ * @since 4.14.11 ++ */ ++ void setMergeMode(MergeMode mergeMode); + + Q_SIGNALS: + /** + diff --git a/kde-apps/kdepimlibs/files/kdepimlibs-15.08.0-RID-fallback.patch b/kde-apps/kdepimlibs/files/kdepimlibs-15.08.0-RID-fallback.patch new file mode 100644 index 0000000..6d4e807 --- /dev/null +++ b/kde-apps/kdepimlibs/files/kdepimlibs-15.08.0-RID-fallback.patch @@ -0,0 +1,31 @@ +From: Dan Vrátil <dvra...@redhat.com> +Date: Sun, 13 Sep 2015 13:05:08 +0000 +Subject: Fix ItemSync merge type fallback +X-Git-Url: http://quickgit.kde.org/?p=kdepimlibs.git&a=commitdiff&h=ffa20e75f388bfa87530e113641f0830a5a58ec4 +--- +Fix ItemSync merge type fallback + +Always fallback to RID merge, even when GID merge is requsted, but no GID +is present. + +(cherry picked from commit d8b5da7bb16bfd3652e83200d851af3a21816469) +--- + + +--- a/akonadi/src/core/itemsync.cpp ++++ b/akonadi/src/core/itemsync.cpp +@@ -130,10 +130,10 @@ + mPendingJobs++; + ItemCreateJob *create = new ItemCreateJob(item, mSyncCollection, subjobParent()); + ItemCreateJob::MergeOptions merge = ItemCreateJob::Silent; +- if (mMergeMode == ItemSync::RIDMerge) { ++ if (mMergeMode == ItemSync::GIDMerge && !item.gid().isEmpty()) { ++ merge |= ItemCreateJob::GID; ++ } else { + merge |= ItemCreateJob::RID; +- } else if (mMergeMode == ItemSync::GIDMerge && !item.gid().isEmpty()) { +- merge |= ItemCreateJob::GID; + } + create->setMerge(merge); + q->connect(create, SIGNAL(result(KJob*)), q, SLOT(slotLocalChangeDone(KJob*))); + diff --git a/kde-apps/kdepimlibs/kdepimlibs-15.08.0.ebuild b/kde-apps/kdepimlibs/kdepimlibs-15.08.0-r1.ebuild similarity index 95% rename from kde-apps/kdepimlibs/kdepimlibs-15.08.0.ebuild rename to kde-apps/kdepimlibs/kdepimlibs-15.08.0-r1.ebuild index 65e42ce..b2f7d46 100644 --- a/kde-apps/kdepimlibs/kdepimlibs-15.08.0.ebuild +++ b/kde-apps/kdepimlibs/kdepimlibs-15.08.0-r1.ebuild @@ -65,6 +65,10 @@ RDEPEND="${COMMON_DEPEND} " src_prepare() { + + epatch "${FILESDIR}/${PN}-15.08.0-GID-merge.patch" \ + "${FILESDIR}/${PN}-15.08.0-RID-fallback.patch" + use handbook || \ sed -e '/^find_package.*KF5DocTools/ s/^/#/' \ -e '/^add_subdirectory(docs)/ s/^/#/' \ diff --git a/kde-apps/kdepimlibs/kdepimlibs-15.08.1.ebuild b/kde-apps/kdepimlibs/kdepimlibs-15.08.1.ebuild index 65e42ce..b2f7d46 100644 --- a/kde-apps/kdepimlibs/kdepimlibs-15.08.1.ebuild +++ b/kde-apps/kdepimlibs/kdepimlibs-15.08.1.ebuild @@ -65,6 +65,10 @@ RDEPEND="${COMMON_DEPEND} " src_prepare() { + + epatch "${FILESDIR}/${PN}-15.08.0-GID-merge.patch" \ + "${FILESDIR}/${PN}-15.08.0-RID-fallback.patch" + use handbook || \ sed -e '/^find_package.*KF5DocTools/ s/^/#/' \ -e '/^add_subdirectory(docs)/ s/^/#/' \