diff options
-rw-r--r-- | src/libs/installer/metadatajob.cpp | 2 | ||||
-rw-r--r-- | src/libs/installer/settings.cpp | 42 | ||||
-rw-r--r-- | tests/auto/installer/metadatajob/data/repositoryActionRemove/Updates.xml | 2 | ||||
-rw-r--r-- | tests/auto/installer/metadatajob/tst_metadatajob.cpp | 6 |
4 files changed, 38 insertions, 14 deletions
diff --git a/src/libs/installer/metadatajob.cpp b/src/libs/installer/metadatajob.cpp index 26fd2b2a5..d986db87d 100644 --- a/src/libs/installer/metadatajob.cpp +++ b/src/libs/installer/metadatajob.cpp @@ -260,7 +260,7 @@ void MetadataJob::doStart() continue; QString url; - url = repo.url().toString() + updateFilePath; + url = repo.url().toString(QUrl::StripTrailingSlash) + updateFilePath; if (!m_core->value(scUrlQueryString).isEmpty()) url += m_core->value(scUrlQueryString) + QLatin1Char('&'); // also append a random string to avoid proxy caches diff --git a/src/libs/installer/settings.cpp b/src/libs/installer/settings.cpp index e18f63689..d3c74c41d 100644 --- a/src/libs/installer/settings.cpp +++ b/src/libs/installer/settings.cpp @@ -761,28 +761,52 @@ static bool apply(const RepoHash &updates, QMultiHash<QUrl, Repository> *reposTo QList<QPair<Repository, Repository> > values = updates.values(QLatin1String("replace")); for (int a = 0; a < values.count(); ++a) { const QPair<Repository, Repository> data = values.at(a); - if (reposToUpdate->contains(data.first.url())) { - update = true; - reposToUpdate->remove(data.first.url()); - reposToUpdate->insert(data.second.url(), data.second); + auto it = reposToUpdate->begin(); + while (it != reposToUpdate->end()) { + const QUrl &repoUrl = it.key(); + if (repoUrl.matches(data.first.url(), QUrl::NormalizePathSegments)) { + update = true; + reposToUpdate->remove(data.first.url()); + reposToUpdate->insert(data.second.url(), data.second); + break; + } else { + ++it; + } } } values = updates.values(QLatin1String("remove")); for (int a = 0; a < values.count(); ++a) { const QPair<Repository, Repository> data = values.at(a); - if (reposToUpdate->contains(data.first.url())) { - update = true; - reposToUpdate->remove(data.first.url()); + auto it = reposToUpdate->begin(); + while (it != reposToUpdate->end()) { + const QUrl &repoUrl = it.key(); + if (repoUrl.matches(data.first.url(), QUrl::NormalizePathSegments)) { + it = reposToUpdate->erase(it); + update = true; + } else { + ++it; + } } } values = updates.values(QLatin1String("add")); for (int a = 0; a < values.count(); ++a) { const QPair<Repository, Repository> data = values.at(a); - if (!reposToUpdate->contains(data.first.url())) { - update = true; + auto it = reposToUpdate->begin(); + bool repositoryAlreadyAdded = false; + while (it != reposToUpdate->end()) { + const QUrl &repoUrl = it.key(); + if (repoUrl.matches(data.first.url(), QUrl::NormalizePathSegments)) { + repositoryAlreadyAdded = true; + break; + } else { + ++it; + } + } + if (!repositoryAlreadyAdded) { reposToUpdate->insert(data.first.url(), data.first); + update = true; } } return update; diff --git a/tests/auto/installer/metadatajob/data/repositoryActionRemove/Updates.xml b/tests/auto/installer/metadatajob/data/repositoryActionRemove/Updates.xml index 5e612183a..5fd962056 100644 --- a/tests/auto/installer/metadatajob/data/repositoryActionRemove/Updates.xml +++ b/tests/auto/installer/metadatajob/data/repositoryActionRemove/Updates.xml @@ -2,7 +2,7 @@ <ApplicationName>{AnyApplication}</ApplicationName> <ApplicationVersion>1.0.0</ApplicationVersion> <RepositoryUpdate> - <Repository action="https://code.qt.io/remove" url="../repository"/> + <Repository action="https://code.qt.io/remove" url="../repository" displayname="Example repository"/> </RepositoryUpdate> <PackageUpdate> <Name>C</Name> diff --git a/tests/auto/installer/metadatajob/tst_metadatajob.cpp b/tests/auto/installer/metadatajob/tst_metadatajob.cpp index cb974e7ad..83b57bd8c 100644 --- a/tests/auto/installer/metadatajob/tst_metadatajob.cpp +++ b/tests/auto/installer/metadatajob/tst_metadatajob.cpp @@ -65,7 +65,7 @@ private slots: PackageManagerCore core; core.setInstaller(); QSet<Repository> repoList; - Repository repo = Repository::fromUserInput(":///data/repositoryActionAdd"); + Repository repo = Repository::fromUserInput(":///data/repositoryActionAdd/"); repoList.insert(repo); core.settings().setDefaultRepositories(repoList); MetadataJob metadata; @@ -91,8 +91,8 @@ private slots: MetadataJob metadata; metadata.setPackageManagerCore(&core); - QTest::ignoreMessage(QtDebugMsg, "Repository to remove: \"file::///data/repository\""); - QTest::ignoreMessage(QtDebugMsg, "Repository to remove: \"file::///data/repository\""); + QTest::ignoreMessage(QtDebugMsg, "Repository to remove: \"Example repository\""); + QTest::ignoreMessage(QtDebugMsg, "Repository to remove: \"Example repository\""); metadata.start(); metadata.waitForFinished(); QCOMPARE(metadata.metadata().count(), 1); |