Fix dependency lookup in Database::replacePackages()

This commit is contained in:
Martchus 2021-02-08 23:52:01 +01:00
parent 5127ca351f
commit 7a8601010e
1 changed files with 17 additions and 33 deletions

View File

@ -204,7 +204,7 @@ std::unordered_map<std::shared_ptr<Package>, UnresolvedDependencies> Database::d
const std::vector<std::shared_ptr<Package>> &newPackages, const DependencySet &removedProvides,
const std::unordered_set<std::string_view> &depsToIgnore, const std::unordered_set<std::string_view> &libsToIgnore)
{
std::unordered_map<std::shared_ptr<Package>, UnresolvedDependencies> unresolvedPackages;
auto unresolvedPackages = std::unordered_map<std::shared_ptr<Package>, UnresolvedDependencies>();
// determine new provides
DependencySet newProvides;
@ -219,6 +219,16 @@ std::unordered_map<std::shared_ptr<Package>, UnresolvedDependencies> Database::d
}
}
// determine dependencies and "protected" database
auto deps = std::vector<Database *>();
const auto depOrder = config.computeDatabaseDependencyOrder(*this);
if (auto *const dbs = std::get_if<std::vector<Database *>>(&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<std::shared_ptr<Package>, 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<std::shared_ptr<Package>, 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<std::shared_ptr<Package>, 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<std::shared_ptr<Package>, 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);