Date: Wednesday, August 19, 2015 @ 19:07:59 Author: arojas Revision: 244182
db-move: moved akonadi-qt4 from [testing] to [extra] (i686, x86_64) Added: akonadi-qt4/repos/extra-i686/ akonadi-qt4/repos/extra-i686/PKGBUILD (from rev 244181, akonadi-qt4/repos/testing-i686/PKGBUILD) akonadi-qt4/repos/extra-i686/akonadi-qt4.install (from rev 244181, akonadi-qt4/repos/testing-i686/akonadi-qt4.install) akonadi-qt4/repos/extra-i686/dont-leak-old-external-payload-files.patch (from rev 244181, akonadi-qt4/repos/testing-i686/dont-leak-old-external-payload-files.patch) akonadi-qt4/repos/extra-x86_64/ akonadi-qt4/repos/extra-x86_64/PKGBUILD (from rev 244181, akonadi-qt4/repos/testing-x86_64/PKGBUILD) akonadi-qt4/repos/extra-x86_64/akonadi-qt4.install (from rev 244181, akonadi-qt4/repos/testing-x86_64/akonadi-qt4.install) akonadi-qt4/repos/extra-x86_64/dont-leak-old-external-payload-files.patch (from rev 244181, akonadi-qt4/repos/testing-x86_64/dont-leak-old-external-payload-files.patch) Deleted: akonadi-qt4/repos/testing-i686/ akonadi-qt4/repos/testing-x86_64/ ---------------------------------------------------------+ extra-i686/PKGBUILD | 62 ++++++ extra-i686/akonadi-qt4.install | 11 + extra-i686/dont-leak-old-external-payload-files.patch | 135 ++++++++++++++ extra-x86_64/PKGBUILD | 62 ++++++ extra-x86_64/akonadi-qt4.install | 11 + extra-x86_64/dont-leak-old-external-payload-files.patch | 135 ++++++++++++++ 6 files changed, 416 insertions(+) Copied: akonadi-qt4/repos/extra-i686/PKGBUILD (from rev 244181, akonadi-qt4/repos/testing-i686/PKGBUILD) =================================================================== --- extra-i686/PKGBUILD (rev 0) +++ extra-i686/PKGBUILD 2015-08-19 17:07:59 UTC (rev 244182) @@ -0,0 +1,62 @@ +# $Id$ +# Maintainer: Felix Yan <felixonm...@archlinux.org> +# Contributor: Andrea Scarpino <and...@archlinux.org> +# Contributor: Pierre Schmitz <pie...@archlinux.de> + +pkgbase=akonadi-qt4 +pkgname=(libakonadi-qt4 akonadi-qt4) +pkgver=1.13.0 +pkgrel=5 +pkgdesc="PIM layer, which provides an asynchronous API to access all kind of PIM data (Qt4 version)" +arch=('i686' 'x86_64') +url='http://community.kde.org/KDE_PIM/Akonadi' +license=('LGPL') +makedepends=('cmake' 'automoc4' 'boost' 'postgresql' 'mariadb' 'qt4' 'libxslt') +install="$pkgbase.install" +source=("http://download.kde.org/stable/akonadi/src/akonadi-${pkgver}.tar.bz2" + dont-leak-old-external-payload-files.patch) +md5sums=('84eb2e471bd6bdfe54a2a2f1d858c07d' + '9711e300dde3775a38637daa3c20befe') + +prepare() { + mkdir -p build + + cd akonadi-$pkgver + # https://bugs.kde.org/show_bug.cgi?id=341884 + patch -p1 -i ../dont-leak-old-external-payload-files.patch +} + +build() { + cd build + cmake ../akonadi-$pkgver \ + -DCMAKE_BUILD_TYPE=Release \ + -DCMAKE_INSTALL_PREFIX=/usr \ + -DINSTALL_QSQLITE_IN_QT_PREFIX=TRUE \ + -DQT_QMAKE_EXECUTABLE=qmake-qt4 \ + -DWITH_SOPRANO=OFF + make +} + +package_libakonadi-qt4() { + pkgdesc='Qt4 akonadi libraries' + depends=('qt4') + conflicts=('akonadi<15') + + cd build + make DESTDIR="$pkgdir" install + +# conflicts with akonadi + rm -r "$pkgdir"/usr/{bin,share} +} + +package_akonadi-qt4() { + depends=(libakonadi-qt4 boost-libs mariadb) + conflicts=(akonadi) + replaces=('akonadi<15') + + cd build + make DESTDIR="$pkgdir" install + +# provided by libakonadi-qt4 + rm -r "$pkgdir"/usr/{lib,include} +} Copied: akonadi-qt4/repos/extra-i686/akonadi-qt4.install (from rev 244181, akonadi-qt4/repos/testing-i686/akonadi-qt4.install) =================================================================== --- extra-i686/akonadi-qt4.install (rev 0) +++ extra-i686/akonadi-qt4.install 2015-08-19 17:07:59 UTC (rev 244182) @@ -0,0 +1,11 @@ +post_install() { + update-mime-database usr/share/mime &> /dev/null +} + +post_upgrade() { + post_install +} + +post_remove() { + post_install +} Copied: akonadi-qt4/repos/extra-i686/dont-leak-old-external-payload-files.patch (from rev 244181, akonadi-qt4/repos/testing-i686/dont-leak-old-external-payload-files.patch) =================================================================== --- extra-i686/dont-leak-old-external-payload-files.patch (rev 0) +++ extra-i686/dont-leak-old-external-payload-files.patch 2015-08-19 17:07:59 UTC (rev 244182) @@ -0,0 +1,135 @@ +From: Dan Vrátil <dvra...@redhat.com> +Date: Mon, 29 Jun 2015 20:45:11 +0000 +Subject: Don't leak old external payload files +X-Git-Url: http://quickgit.kde.org/?p=akonadi.git&a=commitdiff&h=9c0dc6b3f0826d32eac310b2e7ecd858ca3df681 +--- +Don't leak old external payload files + +Actually delete old payload files after we increase the payload revision or +switch from external to internal payload. This caused ~/.local/share/akonadi/file_db_data +to grow insanely for all users, leaving them with many duplicated files (just with +different revisions). + +It is recommended that users run akonadictl fsck to clean up the leaked payload +files. + +Note that there won't be any more releases of Akonadi 1.13 (and this has been +fixed in master already), so I strongly recommend distributions to pick this +patch into their packaging. + +BUG: 341884 +CCBUG: 338402 +--- + + +--- a/server/src/storage/partstreamer.cpp ++++ b/server/src/storage/partstreamer.cpp +@@ -290,6 +290,12 @@ + mDataChanged = true; + } + ++ // If the part is external, remember it's current file name ++ QString originalFile; ++ if (part.isValid() && part.external()) { ++ originalFile = PartHelper::resolveAbsolutePath(part.data()); ++ } ++ + part.setPartType(partType); + part.setVersion(partVersion); + part.setPimItemId(mItem.id()); +@@ -306,6 +312,14 @@ + *changed = mDataChanged; + } + ++ if (!originalFile.isEmpty()) { ++ // If the part was external but is not anymore, or if it's still external ++ // but the filename has changed (revision update), remove the original file ++ if (!part.external() || (part.external() && originalFile != PartHelper::resolveAbsolutePath(part.data()))) { ++ PartHelper::removeFile(originalFile); ++ } ++ } ++ + return ok; + } + + +--- a/server/tests/unittest/partstreamertest.cpp ++++ b/server/tests/unittest/partstreamertest.cpp +@@ -91,6 +91,7 @@ + QTest::addColumn<qint64>("expectedPartSize"); + QTest::addColumn<bool>("expectedChanged"); + QTest::addColumn<bool>("isExternal"); ++ QTest::addColumn<int>("version"); + QTest::addColumn<PimItem>("pimItem"); + + PimItem item; +@@ -101,22 +102,22 @@ + QVERIFY(item.insert()); + + // Order of these tests matters! +- QTest::newRow("item 1, internal") << QByteArray("PLD:DATA") << QByteArray("123") << 3ll << true << false << item; +- QTest::newRow("item 1, change to external") << QByteArray("PLD:DATA") << QByteArray("123456789") << 9ll << true << true << item; +- QTest::newRow("item 1, update external") << QByteArray("PLD:DATA") << QByteArray("987654321") << 9ll << true << true << item; +- QTest::newRow("item 1, external, no change") << QByteArray("PLD:DATA") << QByteArray("987654321") << 9ll << false << true << item; +- QTest::newRow("item 1, change to internal") << QByteArray("PLD:DATA") << QByteArray("1234") << 4ll << true << false << item; +- QTest::newRow("item 1, internal, no change") << QByteArray("PLD:DATA") << QByteArray("1234") << 4ll << false << false << item; ++ QTest::newRow("item 1, internal") << QByteArray("PLD:DATA") << QByteArray("123") << 3ll << true << false << -1 << item; ++ QTest::newRow("item 1, change to external") << QByteArray("PLD:DATA") << QByteArray("123456789") << 9ll << true << true << 0 << item; ++ QTest::newRow("item 1, update external") << QByteArray("PLD:DATA") << QByteArray("987654321") << 9ll << true << true << 1 << item; ++ QTest::newRow("item 1, external, no change") << QByteArray("PLD:DATA") << QByteArray("987654321") << 9ll << false << true << 2 << item; ++ QTest::newRow("item 1, change to internal") << QByteArray("PLD:DATA") << QByteArray("1234") << 4ll << true << false << 2 << item; ++ QTest::newRow("item 1, internal, no change") << QByteArray("PLD:DATA") << QByteArray("1234") << 4ll << false << false << 2 << item; + } + + void testStreamer() + { +- return; + QFETCH(QByteArray, expectedPartName); + QFETCH(QByteArray, expectedData); + QFETCH(qint64, expectedPartSize); + QFETCH(bool, expectedChanged); + QFETCH(bool, isExternal); ++ QFETCH(int, version); + QFETCH(PimItem, pimItem); + + FakeConnection connection; +@@ -160,17 +161,18 @@ + + PimItem item = PimItem::retrieveById(pimItem.id()); + const QVector<Part> parts = item.parts(); +- QVERIFY(parts.count() == 1); ++ QCOMPARE(parts.count(), 1); + const Part part = parts[0]; + QCOMPARE(part.datasize(), expectedPartSize); + QCOMPARE(part.external(), isExternal); ++ qDebug() << part.version() << part.data(); + const QByteArray data = part.data(); + if (isExternal) { + QVERIFY(streamerSpy.count() == 1); + QVERIFY(streamerSpy.first().count() == 1); + const Response response = streamerSpy.first().first().value<Akonadi::Server::Response>(); + const QByteArray str = response.asString(); +- const QByteArray expectedResponse = "+ STREAM [FILE " + QByteArray::number(part.id()) + "_r" + QByteArray::number(part.version()) + "]"; ++ const QByteArray expectedResponse = "+ STREAM [FILE " + QByteArray::number(part.id()) + "_r" + QByteArray::number(version) + "]"; + QCOMPARE(QString::fromUtf8(str), QString::fromUtf8(expectedResponse)); + + QFile file(PartHelper::resolveAbsolutePath(data)); +@@ -182,7 +184,7 @@ + QCOMPARE(fileData, expectedData); + + // Make sure no previous versions are left behind in file_db_data +- for (int i = 0; i < part.version(); ++i) { ++ for (int i = 0; i < version; ++i) { + const QByteArray fileName = QByteArray::number(part.id()) + "_r" + QByteArray::number(part.version()); + const QString filePath = PartHelper::resolveAbsolutePath(fileName); + QVERIFY(!QFile::exists(filePath)); +@@ -194,7 +196,7 @@ + QCOMPARE(data, expectedData); + + // Make sure nothing is left behind in file_db_data +- for (int i = 0; i <= part.version(); ++i) { ++ for (int i = 0; i <= version; ++i) { + const QByteArray fileName = QByteArray::number(part.id()) + "_r" + QByteArray::number(part.version()); + const QString filePath = PartHelper::resolveAbsolutePath(fileName); + QVERIFY(!QFile::exists(filePath)); + Copied: akonadi-qt4/repos/extra-x86_64/PKGBUILD (from rev 244181, akonadi-qt4/repos/testing-x86_64/PKGBUILD) =================================================================== --- extra-x86_64/PKGBUILD (rev 0) +++ extra-x86_64/PKGBUILD 2015-08-19 17:07:59 UTC (rev 244182) @@ -0,0 +1,62 @@ +# $Id$ +# Maintainer: Felix Yan <felixonm...@archlinux.org> +# Contributor: Andrea Scarpino <and...@archlinux.org> +# Contributor: Pierre Schmitz <pie...@archlinux.de> + +pkgbase=akonadi-qt4 +pkgname=(libakonadi-qt4 akonadi-qt4) +pkgver=1.13.0 +pkgrel=5 +pkgdesc="PIM layer, which provides an asynchronous API to access all kind of PIM data (Qt4 version)" +arch=('i686' 'x86_64') +url='http://community.kde.org/KDE_PIM/Akonadi' +license=('LGPL') +makedepends=('cmake' 'automoc4' 'boost' 'postgresql' 'mariadb' 'qt4' 'libxslt') +install="$pkgbase.install" +source=("http://download.kde.org/stable/akonadi/src/akonadi-${pkgver}.tar.bz2" + dont-leak-old-external-payload-files.patch) +md5sums=('84eb2e471bd6bdfe54a2a2f1d858c07d' + '9711e300dde3775a38637daa3c20befe') + +prepare() { + mkdir -p build + + cd akonadi-$pkgver + # https://bugs.kde.org/show_bug.cgi?id=341884 + patch -p1 -i ../dont-leak-old-external-payload-files.patch +} + +build() { + cd build + cmake ../akonadi-$pkgver \ + -DCMAKE_BUILD_TYPE=Release \ + -DCMAKE_INSTALL_PREFIX=/usr \ + -DINSTALL_QSQLITE_IN_QT_PREFIX=TRUE \ + -DQT_QMAKE_EXECUTABLE=qmake-qt4 \ + -DWITH_SOPRANO=OFF + make +} + +package_libakonadi-qt4() { + pkgdesc='Qt4 akonadi libraries' + depends=('qt4') + conflicts=('akonadi<15') + + cd build + make DESTDIR="$pkgdir" install + +# conflicts with akonadi + rm -r "$pkgdir"/usr/{bin,share} +} + +package_akonadi-qt4() { + depends=(libakonadi-qt4 boost-libs mariadb) + conflicts=(akonadi) + replaces=('akonadi<15') + + cd build + make DESTDIR="$pkgdir" install + +# provided by libakonadi-qt4 + rm -r "$pkgdir"/usr/{lib,include} +} Copied: akonadi-qt4/repos/extra-x86_64/akonadi-qt4.install (from rev 244181, akonadi-qt4/repos/testing-x86_64/akonadi-qt4.install) =================================================================== --- extra-x86_64/akonadi-qt4.install (rev 0) +++ extra-x86_64/akonadi-qt4.install 2015-08-19 17:07:59 UTC (rev 244182) @@ -0,0 +1,11 @@ +post_install() { + update-mime-database usr/share/mime &> /dev/null +} + +post_upgrade() { + post_install +} + +post_remove() { + post_install +} Copied: akonadi-qt4/repos/extra-x86_64/dont-leak-old-external-payload-files.patch (from rev 244181, akonadi-qt4/repos/testing-x86_64/dont-leak-old-external-payload-files.patch) =================================================================== --- extra-x86_64/dont-leak-old-external-payload-files.patch (rev 0) +++ extra-x86_64/dont-leak-old-external-payload-files.patch 2015-08-19 17:07:59 UTC (rev 244182) @@ -0,0 +1,135 @@ +From: Dan Vrátil <dvra...@redhat.com> +Date: Mon, 29 Jun 2015 20:45:11 +0000 +Subject: Don't leak old external payload files +X-Git-Url: http://quickgit.kde.org/?p=akonadi.git&a=commitdiff&h=9c0dc6b3f0826d32eac310b2e7ecd858ca3df681 +--- +Don't leak old external payload files + +Actually delete old payload files after we increase the payload revision or +switch from external to internal payload. This caused ~/.local/share/akonadi/file_db_data +to grow insanely for all users, leaving them with many duplicated files (just with +different revisions). + +It is recommended that users run akonadictl fsck to clean up the leaked payload +files. + +Note that there won't be any more releases of Akonadi 1.13 (and this has been +fixed in master already), so I strongly recommend distributions to pick this +patch into their packaging. + +BUG: 341884 +CCBUG: 338402 +--- + + +--- a/server/src/storage/partstreamer.cpp ++++ b/server/src/storage/partstreamer.cpp +@@ -290,6 +290,12 @@ + mDataChanged = true; + } + ++ // If the part is external, remember it's current file name ++ QString originalFile; ++ if (part.isValid() && part.external()) { ++ originalFile = PartHelper::resolveAbsolutePath(part.data()); ++ } ++ + part.setPartType(partType); + part.setVersion(partVersion); + part.setPimItemId(mItem.id()); +@@ -306,6 +312,14 @@ + *changed = mDataChanged; + } + ++ if (!originalFile.isEmpty()) { ++ // If the part was external but is not anymore, or if it's still external ++ // but the filename has changed (revision update), remove the original file ++ if (!part.external() || (part.external() && originalFile != PartHelper::resolveAbsolutePath(part.data()))) { ++ PartHelper::removeFile(originalFile); ++ } ++ } ++ + return ok; + } + + +--- a/server/tests/unittest/partstreamertest.cpp ++++ b/server/tests/unittest/partstreamertest.cpp +@@ -91,6 +91,7 @@ + QTest::addColumn<qint64>("expectedPartSize"); + QTest::addColumn<bool>("expectedChanged"); + QTest::addColumn<bool>("isExternal"); ++ QTest::addColumn<int>("version"); + QTest::addColumn<PimItem>("pimItem"); + + PimItem item; +@@ -101,22 +102,22 @@ + QVERIFY(item.insert()); + + // Order of these tests matters! +- QTest::newRow("item 1, internal") << QByteArray("PLD:DATA") << QByteArray("123") << 3ll << true << false << item; +- QTest::newRow("item 1, change to external") << QByteArray("PLD:DATA") << QByteArray("123456789") << 9ll << true << true << item; +- QTest::newRow("item 1, update external") << QByteArray("PLD:DATA") << QByteArray("987654321") << 9ll << true << true << item; +- QTest::newRow("item 1, external, no change") << QByteArray("PLD:DATA") << QByteArray("987654321") << 9ll << false << true << item; +- QTest::newRow("item 1, change to internal") << QByteArray("PLD:DATA") << QByteArray("1234") << 4ll << true << false << item; +- QTest::newRow("item 1, internal, no change") << QByteArray("PLD:DATA") << QByteArray("1234") << 4ll << false << false << item; ++ QTest::newRow("item 1, internal") << QByteArray("PLD:DATA") << QByteArray("123") << 3ll << true << false << -1 << item; ++ QTest::newRow("item 1, change to external") << QByteArray("PLD:DATA") << QByteArray("123456789") << 9ll << true << true << 0 << item; ++ QTest::newRow("item 1, update external") << QByteArray("PLD:DATA") << QByteArray("987654321") << 9ll << true << true << 1 << item; ++ QTest::newRow("item 1, external, no change") << QByteArray("PLD:DATA") << QByteArray("987654321") << 9ll << false << true << 2 << item; ++ QTest::newRow("item 1, change to internal") << QByteArray("PLD:DATA") << QByteArray("1234") << 4ll << true << false << 2 << item; ++ QTest::newRow("item 1, internal, no change") << QByteArray("PLD:DATA") << QByteArray("1234") << 4ll << false << false << 2 << item; + } + + void testStreamer() + { +- return; + QFETCH(QByteArray, expectedPartName); + QFETCH(QByteArray, expectedData); + QFETCH(qint64, expectedPartSize); + QFETCH(bool, expectedChanged); + QFETCH(bool, isExternal); ++ QFETCH(int, version); + QFETCH(PimItem, pimItem); + + FakeConnection connection; +@@ -160,17 +161,18 @@ + + PimItem item = PimItem::retrieveById(pimItem.id()); + const QVector<Part> parts = item.parts(); +- QVERIFY(parts.count() == 1); ++ QCOMPARE(parts.count(), 1); + const Part part = parts[0]; + QCOMPARE(part.datasize(), expectedPartSize); + QCOMPARE(part.external(), isExternal); ++ qDebug() << part.version() << part.data(); + const QByteArray data = part.data(); + if (isExternal) { + QVERIFY(streamerSpy.count() == 1); + QVERIFY(streamerSpy.first().count() == 1); + const Response response = streamerSpy.first().first().value<Akonadi::Server::Response>(); + const QByteArray str = response.asString(); +- const QByteArray expectedResponse = "+ STREAM [FILE " + QByteArray::number(part.id()) + "_r" + QByteArray::number(part.version()) + "]"; ++ const QByteArray expectedResponse = "+ STREAM [FILE " + QByteArray::number(part.id()) + "_r" + QByteArray::number(version) + "]"; + QCOMPARE(QString::fromUtf8(str), QString::fromUtf8(expectedResponse)); + + QFile file(PartHelper::resolveAbsolutePath(data)); +@@ -182,7 +184,7 @@ + QCOMPARE(fileData, expectedData); + + // Make sure no previous versions are left behind in file_db_data +- for (int i = 0; i < part.version(); ++i) { ++ for (int i = 0; i < version; ++i) { + const QByteArray fileName = QByteArray::number(part.id()) + "_r" + QByteArray::number(part.version()); + const QString filePath = PartHelper::resolveAbsolutePath(fileName); + QVERIFY(!QFile::exists(filePath)); +@@ -194,7 +196,7 @@ + QCOMPARE(data, expectedData); + + // Make sure nothing is left behind in file_db_data +- for (int i = 0; i <= part.version(); ++i) { ++ for (int i = 0; i <= version; ++i) { + const QByteArray fileName = QByteArray::number(part.id()) + "_r" + QByteArray::number(part.version()); + const QString filePath = PartHelper::resolveAbsolutePath(fileName); + QVERIFY(!QFile::exists(filePath)); +