diff options
-rw-r--r-- | src/libs/installer/packagemanagercore_p.cpp | 4 | ||||
-rw-r--r-- | src/libs/installer/packagesource.h | 4 | ||||
-rw-r--r-- | src/libs/installer/repository.cpp | 27 | ||||
-rw-r--r-- | src/libs/installer/repository.h | 4 | ||||
-rw-r--r-- | src/libs/kdtools/updatefinder.cpp | 4 | ||||
-rw-r--r-- | src/libs/kdtools/updatesinfo.cpp | 16 | ||||
-rw-r--r-- | src/libs/kdtools/updatesinfo_p.h | 2 | ||||
-rw-r--r-- | src/libs/kdtools/updatesinfodata_p.h | 3 | ||||
-rw-r--r-- | tests/auto/installer/repository/data/repository/A/1.0.2meta.7z | bin | 0 -> 979 bytes | |||
-rw-r--r-- | tests/auto/installer/repository/data/repository/B/1.0.0meta.7z | bin | 0 -> 998 bytes | |||
-rw-r--r-- | tests/auto/installer/repository/data/repository/C/1.0.0meta.7z | bin | 0 -> 994 bytes | |||
-rw-r--r-- | tests/auto/installer/repository/data/repository/Updates.xml | 21 | ||||
-rw-r--r-- | tests/auto/installer/repository/settings.qrc | 3 | ||||
-rw-r--r-- | tests/auto/installer/repository/tst_repository.cpp | 98 |
14 files changed, 171 insertions, 15 deletions
diff --git a/src/libs/installer/packagemanagercore_p.cpp b/src/libs/installer/packagemanagercore_p.cpp index 94e8e5b79..7ccfe2b1c 100644 --- a/src/libs/installer/packagemanagercore_p.cpp +++ b/src/libs/installer/packagemanagercore_p.cpp @@ -2960,9 +2960,9 @@ bool PackageManagerCorePrivate::addUpdateResourcesFromRepositories(bool compress continue; if (data->repository().isCompressed()) - m_compressedPackageSources.insert(PackageSource(QUrl::fromLocalFile(data->path()), 2)); + m_compressedPackageSources.insert(PackageSource(QUrl::fromLocalFile(data->path()), 2, data->repository().postLoadComponentScript())); else - m_packageSources.insert(PackageSource(QUrl::fromLocalFile(data->path()), 0)); + m_packageSources.insert(PackageSource(QUrl::fromLocalFile(data->path()), 0, data->repository().postLoadComponentScript())); ProductKeyCheck::instance()->addPackagesFromXml(data->path() + QLatin1String("/Updates.xml")); } diff --git a/src/libs/installer/packagesource.h b/src/libs/installer/packagesource.h index 92245d906..f63b53cd8 100644 --- a/src/libs/installer/packagesource.h +++ b/src/libs/installer/packagesource.h @@ -40,13 +40,15 @@ struct INSTALLER_EXPORT PackageSource PackageSource() : priority(-1) {} - PackageSource(const QUrl &u, int p) + PackageSource(const QUrl &u, int p, bool pl = false) : url(u) , priority(p) + , postLoadComponentScript(pl) {} QUrl url; int priority; + bool postLoadComponentScript; }; INSTALLER_EXPORT hashValue qHash(const PackageSource &key, hashValue seed); diff --git a/src/libs/installer/repository.cpp b/src/libs/installer/repository.cpp index ca090ab05..f7035e732 100644 --- a/src/libs/installer/repository.cpp +++ b/src/libs/installer/repository.cpp @@ -49,6 +49,7 @@ Repository::Repository() : m_default(false) , m_enabled(false) , m_compressed(false) + , m_postLoadComponentScript(false) { } @@ -65,6 +66,7 @@ Repository::Repository(const Repository &other) , m_categoryname(other.m_categoryname) , m_compressed(other.m_compressed) , m_xmlChecksum(other.m_xmlChecksum) + , m_postLoadComponentScript(other.m_postLoadComponentScript) { } @@ -77,6 +79,7 @@ Repository::Repository(const QUrl &url, bool isDefault, bool compressed) , m_default(isDefault) , m_enabled(true) , m_compressed(compressed) + , m_postLoadComponentScript(false) { } @@ -252,6 +255,22 @@ bool Repository::isCompressed() const } /*! + \internal +*/ +bool Repository::postLoadComponentScript() const +{ + return m_postLoadComponentScript; +} + +/*! + \internal +*/ +void Repository::setPostLoadComponentScript(const bool postLoad) +{ + m_postLoadComponentScript = postLoad; +} + +/*! Compares the values of this repository to \a other and returns true if they are equal (same server, default state, enabled state as well as username and password). \sa operator!=() */ @@ -259,7 +278,8 @@ bool Repository::operator==(const Repository &other) const { return m_url == other.m_url && m_default == other.m_default && m_enabled == other.m_enabled && m_username == other.m_username && m_password == other.m_password - && m_displayname == other.m_displayname && m_xmlChecksum == other.m_xmlChecksum; + && m_displayname == other.m_displayname && m_xmlChecksum == other.m_xmlChecksum + && m_postLoadComponentScript == other.m_postLoadComponentScript; } /*! @@ -288,6 +308,7 @@ const Repository &Repository::operator=(const Repository &other) m_compressed = other.m_compressed; m_categoryname = other.m_categoryname; m_xmlChecksum = other.m_xmlChecksum; + m_postLoadComponentScript = other.m_postLoadComponentScript; return *this; } @@ -307,7 +328,7 @@ QDataStream &operator>>(QDataStream &istream, Repository &repository) { QByteArray url, username, password, displayname, compressed; istream >> url >> repository.m_default >> repository.m_enabled >> username >> password - >> displayname >> repository.m_categoryname >> repository.m_xmlChecksum; + >> displayname >> repository.m_categoryname >> repository.m_xmlChecksum >> repository.m_postLoadComponentScript; repository.setUrl(QUrl::fromEncoded(QByteArray::fromBase64(url))); repository.setUsername(QString::fromUtf8(QByteArray::fromBase64(username))); repository.setPassword(QString::fromUtf8(QByteArray::fromBase64(password))); @@ -323,7 +344,7 @@ QDataStream &operator<<(QDataStream &ostream, const Repository &repository) return ostream << repository.m_url.toEncoded().toBase64() << repository.m_default << repository.m_enabled << repository.m_username.toUtf8().toBase64() << repository.m_password.toUtf8().toBase64() << repository.m_displayname.toUtf8().toBase64() << repository.m_categoryname.toUtf8().toBase64() - << repository.m_xmlChecksum.toBase64(); + << repository.m_xmlChecksum.toBase64() << repository.m_postLoadComponentScript; } } diff --git a/src/libs/installer/repository.h b/src/libs/installer/repository.h index 80698e447..0a589a43e 100644 --- a/src/libs/installer/repository.h +++ b/src/libs/installer/repository.h @@ -71,6 +71,9 @@ public: void setXmlChecksum(const QByteArray &checksum); bool isCompressed() const; + bool postLoadComponentScript() const; + void setPostLoadComponentScript(const bool postLoad); + bool operator==(const Repository &other) const; bool operator!=(const Repository &other) const; @@ -90,6 +93,7 @@ private: QString m_categoryname; bool m_compressed; QByteArray m_xmlChecksum; + bool m_postLoadComponentScript; }; inline hashValue qHash(const Repository &repository) diff --git a/src/libs/kdtools/updatefinder.cpp b/src/libs/kdtools/updatefinder.cpp index 120dcb952..dbe7825df 100644 --- a/src/libs/kdtools/updatefinder.cpp +++ b/src/libs/kdtools/updatefinder.cpp @@ -301,9 +301,9 @@ bool UpdateFinder::downloadUpdateXMLFiles() connect(downloader, SIGNAL(downloadCanceled()), this, SLOT(slotDownloadDone())); connect(downloader, SIGNAL(downloadCompleted()), this, SLOT(slotDownloadDone())); connect(downloader, SIGNAL(downloadAborted(QString)), this, SLOT(slotDownloadDone())); - m_updatesInfoList.insert(new UpdatesInfo, Data(info, downloader)); + m_updatesInfoList.insert(new UpdatesInfo(info.postLoadComponentScript), Data(info, downloader)); } else { - UpdatesInfo *updatesInfo = new UpdatesInfo; + UpdatesInfo *updatesInfo = new UpdatesInfo(info.postLoadComponentScript); updatesInfo->setFileName(QInstaller::pathFromUrl(url)); m_updatesInfoList.insert(updatesInfo, Data(info)); } diff --git a/src/libs/kdtools/updatesinfo.cpp b/src/libs/kdtools/updatesinfo.cpp index 707daf11f..e82c1c1fb 100644 --- a/src/libs/kdtools/updatesinfo.cpp +++ b/src/libs/kdtools/updatesinfo.cpp @@ -40,8 +40,9 @@ using namespace KDUpdater; -UpdatesInfoData::UpdatesInfoData() +UpdatesInfoData::UpdatesInfoData(const bool postLoadComponentScript) : error(UpdatesInfo::NotYetReadError) + , m_postLoadComponentScript(postLoadComponentScript) { } @@ -135,7 +136,14 @@ bool UpdatesInfoData::parsePackageUpdateElement(QXmlStreamReader &reader, const parseOperations(reader, info.data); } else if (elementName == QLatin1String("Script")) { const QXmlStreamAttributes attr = reader.attributes(); - const bool postLoad = attr.value(QLatin1String("postLoad")).toString().toLower() == QInstaller::scTrue ? true : false; + bool postLoad = false; + // postLoad can be set either to individual components or to whole repositories. + // If individual components has the postLoad attribute, it overwrites the repository value. + if (attr.hasAttribute(QLatin1String("postLoad"))) + postLoad = attr.value(QLatin1String("postLoad")).toString().toLower() == QInstaller::scTrue ? true : false; + else if (m_postLoadComponentScript) + postLoad = true; + if (postLoad) scriptHash.insert(QLatin1String("postLoadScript"), reader.readElementText()); else @@ -238,8 +246,8 @@ void UpdatesInfoData::parseLicenses(QXmlStreamReader &reader, QHash<QString, QVa // // UpdatesInfo // -UpdatesInfo::UpdatesInfo() - : d(new UpdatesInfoData) +UpdatesInfo::UpdatesInfo(const bool postLoadComponentScript) + : d(new UpdatesInfoData(postLoadComponentScript)) { } diff --git a/src/libs/kdtools/updatesinfo_p.h b/src/libs/kdtools/updatesinfo_p.h index bd9885327..a3768232a 100644 --- a/src/libs/kdtools/updatesinfo_p.h +++ b/src/libs/kdtools/updatesinfo_p.h @@ -59,7 +59,7 @@ public: InvalidContentError }; - UpdatesInfo(); + UpdatesInfo(const bool postLoadComponentScript = false); ~UpdatesInfo(); bool isValid() const; diff --git a/src/libs/kdtools/updatesinfodata_p.h b/src/libs/kdtools/updatesinfodata_p.h index 9229f8577..c71a85193 100644 --- a/src/libs/kdtools/updatesinfodata_p.h +++ b/src/libs/kdtools/updatesinfodata_p.h @@ -43,7 +43,7 @@ struct UpdatesInfoData : public QSharedData Q_DECLARE_TR_FUNCTIONS(KDUpdater::UpdatesInfoData) public: - UpdatesInfoData(); + UpdatesInfoData(const bool postLoadComponentScript); ~UpdatesInfoData(); int error; @@ -53,6 +53,7 @@ public: QString applicationVersion; QString checkSha1CheckSum; QList<UpdateInfo> updateInfoList; + bool m_postLoadComponentScript; void parseFile(const QString &updateXmlFile); bool parsePackageUpdateElement(QXmlStreamReader &reader, const QString &checkSha1CheckSum); diff --git a/tests/auto/installer/repository/data/repository/A/1.0.2meta.7z b/tests/auto/installer/repository/data/repository/A/1.0.2meta.7z Binary files differnew file mode 100644 index 000000000..6631280a7 --- /dev/null +++ b/tests/auto/installer/repository/data/repository/A/1.0.2meta.7z diff --git a/tests/auto/installer/repository/data/repository/B/1.0.0meta.7z b/tests/auto/installer/repository/data/repository/B/1.0.0meta.7z Binary files differnew file mode 100644 index 000000000..16f3a6c42 --- /dev/null +++ b/tests/auto/installer/repository/data/repository/B/1.0.0meta.7z diff --git a/tests/auto/installer/repository/data/repository/C/1.0.0meta.7z b/tests/auto/installer/repository/data/repository/C/1.0.0meta.7z Binary files differnew file mode 100644 index 000000000..37c8fffc4 --- /dev/null +++ b/tests/auto/installer/repository/data/repository/C/1.0.0meta.7z diff --git a/tests/auto/installer/repository/data/repository/Updates.xml b/tests/auto/installer/repository/data/repository/Updates.xml index 8ddea3938..f541882c5 100644 --- a/tests/auto/installer/repository/data/repository/Updates.xml +++ b/tests/auto/installer/repository/data/repository/Updates.xml @@ -8,7 +8,26 @@ <Description>Example component A</Description> <Version>1.0.2</Version> <ReleaseDate>2015-01-01</ReleaseDate> - <Default>true</Default> + <Default>false</Default> <DownloadableArchives>content.7z</DownloadableArchives> + <Script postLoad="true">script.qs</Script> + </PackageUpdate> + <PackageUpdate> + <Name>B</Name> + <DisplayName>B</DisplayName> + <Description>Example component B</Description> + <Version>1.0.0</Version> + <ReleaseDate>2015-01-01</ReleaseDate> + <Default>false</Default> + <Script>script.qs</Script> + </PackageUpdate> + <PackageUpdate> + <Name>C</Name> + <DisplayName>C</DisplayName> + <Description>Example component C</Description> + <Version>1.0.0</Version> + <ReleaseDate>2015-01-01</ReleaseDate> + <Default>false</Default> + <Script postLoad="false">script.qs</Script> </PackageUpdate> </Updates> diff --git a/tests/auto/installer/repository/settings.qrc b/tests/auto/installer/repository/settings.qrc index ff628b482..92db7e3e1 100644 --- a/tests/auto/installer/repository/settings.qrc +++ b/tests/auto/installer/repository/settings.qrc @@ -2,6 +2,9 @@ <qresource prefix="/"> <file>data/repository/Updates.xml</file> <file>data/repository/A/1.0.2content.7z</file> + <file>data/repository/A/1.0.2meta.7z</file> + <file>data/repository/B/1.0.0meta.7z</file> + <file>data/repository/C/1.0.0meta.7z</file> <file>data/compressedRepository/compressedRepository.7z</file> </qresource> </RCC> diff --git a/tests/auto/installer/repository/tst_repository.cpp b/tests/auto/installer/repository/tst_repository.cpp index 410c369ed..112098130 100644 --- a/tests/auto/installer/repository/tst_repository.cpp +++ b/tests/auto/installer/repository/tst_repository.cpp @@ -39,6 +39,8 @@ using namespace QInstaller; +typedef QList<QPair<QString, QString>> SettingsPairList; + class tst_Repository : public QObject { Q_OBJECT @@ -210,6 +212,102 @@ private slots: QVERIFY(dir.removeRecursively()); core->deleteLater(); } + + void testPostLoadScriptFromRepository_data() + { + QTest::addColumn<QStringList>("installComponent"); + QTest::addColumn<bool>("repositoryPostLoadSetting"); + QTest::addColumn<SettingsPairList>("expectedSettingsBeforeInstall"); + QTest::addColumn<SettingsPairList>("expectedSettingsAfterInstall"); + QTest::addColumn<QStringList>("unexpectedSettings"); + + // component A has postLoad = true in component.xml + // component B has no postLoad attribute + // component C has postLoad = false in component.xml + + SettingsPairList expectedSettingsListAfterInstall; + expectedSettingsListAfterInstall.append(QPair<QString, QString>("componentAKey", "componentAValue")); + + SettingsPairList expectedSettingsListBeforeInstall; + expectedSettingsListBeforeInstall.append(QPair<QString, QString>("componentBKey", "componentBValue")); + expectedSettingsListBeforeInstall.append(QPair<QString, QString>("componentCKey", "componentCValue")); + + QTest::newRow("noRepoPostLoadComponentA") + << (QStringList() << "A") + << false + << expectedSettingsListBeforeInstall + << expectedSettingsListAfterInstall + << (QStringList()); + + // Component B is installed so values from component A and component C should not be set + expectedSettingsListAfterInstall.clear(); + expectedSettingsListAfterInstall.append(QPair<QString, QString>("componentBKey", "componentBValue")); + QTest::newRow("noRepoPostLoadComponentB") + << (QStringList() << "B") + << false + << expectedSettingsListBeforeInstall + << expectedSettingsListAfterInstall + << (QStringList() << "componentAValue" << "componentCValue"); + + // PostLoad is set to whole repository. Since only A is installed, + // values from component B and component C values are not set + expectedSettingsListBeforeInstall.clear(); + expectedSettingsListAfterInstall.clear(); + expectedSettingsListAfterInstall.append(QPair<QString, QString>("componentAKey", "componentAValue")); + QTest::newRow("repoPostLoadComponentA") << (QStringList() << "A") + << true + << expectedSettingsListBeforeInstall + << expectedSettingsListAfterInstall + << (QStringList() << "componentBValue" << "componentCValue"); + + // PostLoad is set to whole repository. Since only B is installed, + // values from component C and component A are not set. + expectedSettingsListAfterInstall.clear(); + expectedSettingsListAfterInstall.append(QPair<QString, QString>("componentBKey", "componentBValue")); + QTest::newRow("repoPostLoadComponentB") << (QStringList() << "B") + << true + << expectedSettingsListBeforeInstall + << expectedSettingsListAfterInstall + << (QStringList() << "componentCValue" << "componentAValue"); + + // PostLoad is set to whole repository. Since component C has its postload = false, + // value is set to component C before install + expectedSettingsListBeforeInstall.clear(); + expectedSettingsListAfterInstall.clear(); + expectedSettingsListBeforeInstall.append(QPair<QString, QString>("componentCKey", "componentCValue")); + QTest::newRow("repoPostLoadComponentC") << (QStringList() << "C") + << true + << expectedSettingsListBeforeInstall + << expectedSettingsListAfterInstall + << (QStringList() << "componentAValue" << "componentBValue"); + } + + void testPostLoadScriptFromRepository() + { + QFETCH(QStringList, installComponent); + QFETCH(bool, repositoryPostLoadSetting); + QFETCH(SettingsPairList, expectedSettingsBeforeInstall); + QFETCH(SettingsPairList, expectedSettingsAfterInstall); + QFETCH(QStringList, unexpectedSettings); + + QString installDir = QInstaller::generateTemporaryFileName(); + QScopedPointer<PackageManagerCore> core(PackageManager::getPackageManagerWithInit(installDir)); + QSet<Repository> repoList; + Repository repo = Repository::fromUserInput(":///data/repository"); + repo.setPostLoadComponentScript(repositoryPostLoadSetting); + repoList.insert(repo); + core->settings().setDefaultRepositories(repoList); + QVERIFY(core->fetchRemotePackagesTree()); + + for (const QPair<QString, QString> settingValue : expectedSettingsBeforeInstall) + QCOMPARE(core->value(settingValue.first), settingValue.second); + + core->installSelectedComponentsSilently(installComponent); + for (const QPair<QString, QString> settingValue : expectedSettingsAfterInstall) + QCOMPARE(core->value(settingValue.first), settingValue.second); + for (const QString unexpectedSetting : unexpectedSettings) + QVERIFY2(!core->containsValue(unexpectedSetting), "Core contains unexpected value"); + } }; QTEST_MAIN(tst_Repository) |