From 7a8601010ec0ba7844a66a3212b37911918e6275 Mon Sep 17 00:00:00 2001 From: Martchus Date: Mon, 8 Feb 2021 23:52:01 +0100 Subject: [PATCH] Fix dependency lookup in Database::replacePackages() --- libpkg/data/database.cpp | 50 ++++++++++++++-------------------------- 1 file changed, 17 insertions(+), 33 deletions(-) diff --git a/libpkg/data/database.cpp b/libpkg/data/database.cpp index eb9e9ca..16a6d04 100644 --- a/libpkg/data/database.cpp +++ b/libpkg/data/database.cpp @@ -204,7 +204,7 @@ std::unordered_map, UnresolvedDependencies> Database::d const std::vector> &newPackages, const DependencySet &removedProvides, const std::unordered_set &depsToIgnore, const std::unordered_set &libsToIgnore) { - std::unordered_map, UnresolvedDependencies> unresolvedPackages; + auto unresolvedPackages = std::unordered_map, UnresolvedDependencies>(); // determine new provides DependencySet newProvides; @@ -219,6 +219,16 @@ std::unordered_map, UnresolvedDependencies> Database::d } } + // determine dependencies and "protected" database + auto deps = std::vector(); + const auto depOrder = config.computeDatabaseDependencyOrder(*this); + if (auto *const dbs = std::get_if>(&depOrder)) { + deps = std::move(*dbs); + } + if (auto *const protectedDb = config.findDatabase(name + "-protected", arch)) { + deps.emplace_back(protectedDb); + } + // check whether all required dependencies are still provided for (const auto &requiredDep : requiredDeps) { const auto &[dependencyName, dependencyDetail] = requiredDep; @@ -239,18 +249,10 @@ std::unordered_map, UnresolvedDependencies> Database::d continue; } - // skip if dependency is provided by a database this database depends on - const auto checkDb = [this, &config, &requiredDep](const std::string &dbName) { - if (const auto *const db = config.findDatabase(dbName, arch)) { - if (db->providedDeps.provides(requiredDep.first, requiredDep.second)) { - return true; - } - } - return false; - }; + // skip if dependency is provided by a database this database depends on or the protected version of this db auto providedByAnotherDb = false; - for (const auto &dbName : dependencies) { - if ((providedByAnotherDb = checkDb(dbName))) { + for (const auto *db : deps) { + if ((providedByAnotherDb = db->providedDeps.provides(requiredDep.first, requiredDep.second))) { break; } } @@ -258,11 +260,6 @@ std::unordered_map, UnresolvedDependencies> Database::d continue; } - // skip if dependency is provided by the protected version of this db - if (checkDb(name + "-protected")) { - continue; - } - // add packages to list of unresolved packages for (const auto &affectedPackage : affectedPackages) { unresolvedPackages[affectedPackage].deps.emplace_back(Dependency(dependencyName, dependencyDetail.version, dependencyDetail.mode)); @@ -287,18 +284,10 @@ std::unordered_map, UnresolvedDependencies> Database::d continue; } - // skip if dependency is provided by a database this database depends on - const auto checkDb = [this, &config, &requiredLib = requiredLib](const std::string &dbName) { - if (const auto *const db = config.findDatabase(dbName, arch)) { - if (db->providedLibs.find(requiredLib) != db->providedLibs.end()) { - return true; - } - } - return false; - }; + // skip if dependency is provided by a database this database depends on or the protected version of this db auto providedByAnotherDb = false; - for (const auto &dbName : dependencies) { - if ((providedByAnotherDb = checkDb(dbName))) { + for (const auto *db : deps) { + if ((providedByAnotherDb = db->providedLibs.find(requiredLib) != db->providedLibs.end())) { break; } } @@ -306,11 +295,6 @@ std::unordered_map, UnresolvedDependencies> Database::d continue; } - // skip if library is provided by the protected version of this db - if (checkDb(name + "-protected")) { - continue; - } - // add packages to list of unresolved packages for (const auto &affectedPackage : affectedPackages) { unresolvedPackages[affectedPackage].libs.emplace_back(requiredLib);