summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorArttu Tarkiainen <arttu.tarkiainen@qt.io>2019-06-24 09:21:39 +0300
committerArttu Tarkiainen <arttu.tarkiainen@qt.io>2019-08-15 10:00:37 +0000
commit55ecbb9660048b06959d471b783a05e4f6b47efd (patch)
treefdc942d40902f0df0ec769ad3baf8eb8d9749745
parent120e527ed16f6c579e46f71c9018ad35ad1cb528 (diff)
Update repository categories on server authentication request
If repositories in a category were located on a server that requires user authentication, IFW couldn't update information of the repositories inside a category during runtime. This prevents for example storing credentials from the authentication request dialog and blocks the usage of that category. Add a method for updating contents in repository categories and a unit test for the new method. Also some minor tweaks to relevant bits of code. Task-number: QTIFW-1358 Change-Id: Idfa2559df6d0d2a6de428b8d5fb1f7672aa1e300 Reviewed-by: Katja Marttila <katja.marttila@qt.io>
-rw-r--r--src/libs/installer/metadatajob.cpp3
-rw-r--r--src/libs/installer/repositorycategory.cpp15
-rw-r--r--src/libs/installer/repositorycategory.h2
-rw-r--r--src/libs/installer/settings.cpp34
-rw-r--r--src/libs/installer/settings.h9
-rw-r--r--tests/auto/installer/repository/tst_repository.cpp47
6 files changed, 101 insertions, 9 deletions
diff --git a/src/libs/installer/metadatajob.cpp b/src/libs/installer/metadatajob.cpp
index ecdf1cd31..7d7b46e72 100644
--- a/src/libs/installer/metadatajob.cpp
+++ b/src/libs/installer/metadatajob.cpp
@@ -326,6 +326,9 @@ void MetadataJob::xmlTaskFinished()
QHash<QString, QPair<Repository, Repository> > update;
update.insert(QLatin1String("replace"), qMakePair(original, replacement));
+ if (s.updateRepositoryCategories(update) == Settings::UpdatesApplied)
+ qDebug() << "Repository categories updated.";
+
if (s.updateDefaultRepositories(update) == Settings::UpdatesApplied
|| s.updateUserRepositories(update) == Settings::UpdatesApplied) {
if (m_core->isMaintainer()) {
diff --git a/src/libs/installer/repositorycategory.cpp b/src/libs/installer/repositorycategory.cpp
index 42fb41c99..ce06480c8 100644
--- a/src/libs/installer/repositorycategory.cpp
+++ b/src/libs/installer/repositorycategory.cpp
@@ -28,6 +28,7 @@
#include "repositorycategory.h"
#include "filedownloaderfactory.h"
+#include "constants.h"
#include <QDataStream>
#include <QFileInfo>
@@ -102,16 +103,20 @@ void RepositoryCategory::setTooltip(const QString &tooltip)
*/
QSet<Repository> RepositoryCategory::repositories() const
{
- return variantListToSet<Repository>(m_data.values(QLatin1String("Repositories")));
+ return variantListToSet<Repository>(m_data.values(scRepositories));
}
/*!
- Inserts a set of \a repositories to the category.
+ Inserts a set of \a repositories to the category. Removes old \a repositories
+ if \a replace is set to \c true.
*/
-void RepositoryCategory::setRepositories(const QSet<Repository> repositories)
+void RepositoryCategory::setRepositories(const QSet<Repository> repositories, const bool replace)
{
+ if (replace)
+ m_data.remove(scRepositories);
+
foreach (const Repository &repository, repositories)
- m_data.insertMulti(QLatin1String("Repositories"), QVariant().fromValue(repository));
+ m_data.insertMulti(scRepositories, QVariant().fromValue(repository));
}
/*!
@@ -119,7 +124,7 @@ void RepositoryCategory::setRepositories(const QSet<Repository> repositories)
*/
void RepositoryCategory::addRepository(const Repository repository)
{
- m_data.insertMulti(QLatin1String("Repositories"), QVariant().fromValue(repository));
+ m_data.insertMulti(scRepositories, QVariant().fromValue(repository));
}
/*!
diff --git a/src/libs/installer/repositorycategory.h b/src/libs/installer/repositorycategory.h
index 98d5df7bd..1996103a5 100644
--- a/src/libs/installer/repositorycategory.h
+++ b/src/libs/installer/repositorycategory.h
@@ -54,7 +54,7 @@ public:
void setTooltip(const QString &tooltip);
QSet<Repository> repositories() const;
- void setRepositories(const QSet<Repository> repositories);
+ void setRepositories(const QSet<Repository> repositories, const bool replace = false);
void addRepository(const Repository repository);
bool isEnabled() const;
diff --git a/src/libs/installer/settings.cpp b/src/libs/installer/settings.cpp
index e0c9a3970..0963f2208 100644
--- a/src/libs/installer/settings.cpp
+++ b/src/libs/installer/settings.cpp
@@ -616,12 +616,46 @@ void Settings::addDefaultRepositories(const QSet<Repository> &repositories)
d->m_data.insertMulti(scRepositories, QVariant().fromValue(repository));
}
+void Settings::setRepositoryCategories(const QSet<RepositoryCategory> &repositories)
+{
+ d->m_data.remove(scRepositoryCategories);
+ addRepositoryCategories(repositories);
+}
+
void Settings::addRepositoryCategories(const QSet<RepositoryCategory> &repositories)
{
foreach (const RepositoryCategory &repository, repositories)
d->m_data.insertMulti(scRepositoryCategories, QVariant().fromValue(repository));
}
+Settings::Update Settings::updateRepositoryCategories(const RepoHash &updates)
+{
+ if (updates.isEmpty())
+ return Settings::NoUpdatesApplied;
+
+ QSet<RepositoryCategory> categories = repositoryCategories();
+ QList<RepositoryCategory> categoriesList = categories.values();
+ QPair<Repository, Repository> updateValues = updates.value(QLatin1String("replace"));
+
+ bool update = false;
+
+ foreach (RepositoryCategory category, categoriesList) {
+ QSet<Repository> repositories = category.repositories();
+ if (repositories.contains(updateValues.first)) {
+ update = true;
+ repositories.remove(updateValues.first);
+ repositories.insert(updateValues.second);
+ category.setRepositories(repositories, true);
+ categoriesList.replace(categoriesList.indexOf(category), category);
+ }
+ }
+ if (update) {
+ categories = categoriesList.toSet();
+ setRepositoryCategories(categories);
+ }
+ return update ? Settings::UpdatesApplied : Settings::NoUpdatesApplied;
+}
+
static bool apply(const RepoHash &updates, QHash<QUrl, Repository> *reposToUpdate)
{
bool update = false;
diff --git a/src/libs/installer/settings.h b/src/libs/installer/settings.h
index 55b94d745..fff2324f1 100644
--- a/src/libs/installer/settings.h
+++ b/src/libs/installer/settings.h
@@ -115,13 +115,16 @@ public:
QSet<Repository> repositories() const;
QSet<Repository> defaultRepositories() const;
- QSet<RepositoryCategory> repositoryCategories() const;
- QMap<QString, RepositoryCategory> organizedRepositoryCategories() const;
void setDefaultRepositories(const QSet<Repository> &repositories);
void addDefaultRepositories(const QSet<Repository> &repositories);
- void addRepositoryCategories(const QSet<RepositoryCategory> &repositories);
Settings::Update updateDefaultRepositories(const RepoHash &updates);
+ QSet<RepositoryCategory> repositoryCategories() const;
+ QMap<QString, RepositoryCategory> organizedRepositoryCategories() const;
+ void setRepositoryCategories(const QSet<RepositoryCategory> &repositories);
+ void addRepositoryCategories(const QSet<RepositoryCategory> &repositories);
+ Settings::Update updateRepositoryCategories(const RepoHash &updates);
+
QSet<Repository> temporaryRepositories() const;
void setTemporaryRepositories(const QSet<Repository> &repositories, bool replace);
void addTemporaryRepositories(const QSet<Repository> &repositories, bool replace);
diff --git a/tests/auto/installer/repository/tst_repository.cpp b/tests/auto/installer/repository/tst_repository.cpp
index 8d5d278a2..7b8405baf 100644
--- a/tests/auto/installer/repository/tst_repository.cpp
+++ b/tests/auto/installer/repository/tst_repository.cpp
@@ -1,4 +1,6 @@
#include "repository.h"
+#include "repositorycategory.h"
+#include "settings.h"
#include <QDataStream>
#include <QString>
@@ -114,6 +116,51 @@ private slots:
s1 >> r1; s2 >> r2;
QCOMPARE(r1, r2);
}
+
+ void testUpdateRepositoryCategories()
+ {
+ Settings settings;
+
+ RepositoryCategory category;
+ category.setEnabled(true);
+ category.setDisplayName(QLatin1String("category"));
+
+ Repository original(QUrl("http://example.com/"), true);
+ original.setEnabled(true);
+ category.addRepository(original);
+
+ Repository replacement = original;
+ replacement.setUsername(QLatin1String("user"));
+ replacement.setPassword(QLatin1String("pass"));
+
+ QSet<RepositoryCategory> categories;
+ categories.insert(category);
+ settings.setRepositoryCategories(categories);
+
+ QHash<QString, QPair<Repository, Repository>> update;
+
+ // non-empty update
+ update.insert(QLatin1String("replace"), qMakePair(original, replacement));
+ QVERIFY(settings.updateRepositoryCategories(update) == Settings::UpdatesApplied);
+
+ // verify that the values really updated
+ QVERIFY(settings.repositoryCategories().values().at(0)
+ .repositories().values().at(0).username() == "user");
+
+ QVERIFY(settings.repositoryCategories().values().at(0)
+ .repositories().values().at(0).password() == "pass");
+
+ // empty update
+ update.clear();
+ QVERIFY(settings.updateRepositoryCategories(update) == Settings::NoUpdatesApplied);
+
+ // non-matching repository update
+ Repository nonMatching(QUrl("https://www.qt.io/"), true);
+ nonMatching.setEnabled(true);
+
+ update.insert(QLatin1String("replace"), qMakePair(nonMatching, replacement));
+ QVERIFY(settings.updateRepositoryCategories(update) == Settings::NoUpdatesApplied);
+ }
};
QTEST_MAIN(tst_Repository)