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/^/#/' \

Reply via email to