From 4ac9e729d012aadb826e721265a1add22531f6e3 Mon Sep 17 00:00:00 2001 From: Martchus Date: Tue, 9 Feb 2021 11:59:23 +0100 Subject: [PATCH] Exclude current db from order computation when detecting unresolved packages --- libpkg/data/config.cpp | 12 +++++++----- libpkg/data/config.h | 2 +- libpkg/data/database.cpp | 2 +- libpkg/tests/data.cpp | 6 +++--- 4 files changed, 12 insertions(+), 10 deletions(-) diff --git a/libpkg/data/config.cpp b/libpkg/data/config.cpp index 2a33908..cd63d77 100644 --- a/libpkg/data/config.cpp +++ b/libpkg/data/config.cpp @@ -45,7 +45,7 @@ DatabaseStatistics::DatabaseStatistics(const Database &db) } static std::string addDatabaseDependencies( - Config &config, Database &database, std::vector &result, std::unordered_map &visited) + Config &config, Database &database, std::vector &result, std::unordered_map &visited, bool addSelf) { // abort if ... const auto insertion = visited.emplace(make_pair(&database, false)); @@ -63,13 +63,15 @@ static std::string addDatabaseDependencies( return argsToString( "database \"", dependency, "\" required by \"", database.name, "\" does not exist (architecture ", database.arch, ')'); } - if (auto error = addDatabaseDependencies(config, *requiredDb, result, visited); !error.empty()) { + if (auto error = addDatabaseDependencies(config, *requiredDb, result, visited, true); !error.empty()) { return error; } } // add database itself - result.emplace_back(&database); + if (addSelf) { + result.emplace_back(&database); + } // consider this db done; if something else depends on it is o.k. and not a cycle visited[&database] = true; @@ -77,12 +79,12 @@ static std::string addDatabaseDependencies( return string(); } -std::variant, std::string> Config::computeDatabaseDependencyOrder(Database &database) +std::variant, std::string> Config::computeDatabaseDependencyOrder(Database &database, bool addSelf) { std::vector result; std::unordered_map visited; result.reserve(database.dependencies.size()); - auto error = addDatabaseDependencies(*this, database, result, visited); + auto error = addDatabaseDependencies(*this, database, result, visited, addSelf); if (!error.empty()) { return move(error); } diff --git a/libpkg/data/config.h b/libpkg/data/config.h index 43a6c58..804d2c7 100644 --- a/libpkg/data/config.h +++ b/libpkg/data/config.h @@ -118,7 +118,7 @@ struct LIBPKG_EXPORT Config : public Lockable, public ReflectiveRapidJSON::Binar Status computeStatus() const; BuildOrderResult computeBuildOrder(const std::vector &dependencyDenotations, BuildOrderOptions options); LicenseResult computeLicenseInfo(const std::vector &dependencyDenotations); - std::variant, std::string> computeDatabaseDependencyOrder(Database &database); + std::variant, std::string> computeDatabaseDependencyOrder(Database &database, bool addSelf = true); std::vector computeDatabasesRequiringDatabase(Database &database); void pullDependentPackages(const std::vector &dependencies, const std::shared_ptr &relevantPackage, const std::unordered_set &relevantDbs, std::unordered_set &runtimeDependencies, diff --git a/libpkg/data/database.cpp b/libpkg/data/database.cpp index 16a6d04..e1bcba9 100644 --- a/libpkg/data/database.cpp +++ b/libpkg/data/database.cpp @@ -221,7 +221,7 @@ std::unordered_map, UnresolvedDependencies> Database::d // determine dependencies and "protected" database auto deps = std::vector(); - const auto depOrder = config.computeDatabaseDependencyOrder(*this); + const auto depOrder = config.computeDatabaseDependencyOrder(*this, false); if (auto *const dbs = std::get_if>(&depOrder)) { deps = std::move(*dbs); } diff --git a/libpkg/tests/data.cpp b/libpkg/tests/data.cpp index 5c00cd6..d170213 100644 --- a/libpkg/tests/data.cpp +++ b/libpkg/tests/data.cpp @@ -254,15 +254,15 @@ void DataTests::testComputingFileName() void DataTests::testDetectingUnresolved() { - auto &db1(m_config.databases[0]); + auto &db1 = m_config.databases[0]; CPPUNIT_ASSERT_EQUAL(0_st, db1.detectUnresolvedPackages(m_config, {}, {}).size()); // upgrade bar to 5.6, foo should be unresolvable m_pkg2->version = "5.6"; - DependencySet removedPackages; + auto removedPackages = DependencySet(); removedPackages.add(Dependency("bar", "5.5"), m_pkg2); - const auto failures(db1.detectUnresolvedPackages(m_config, { m_pkg2 }, removedPackages)); + const auto failures = db1.detectUnresolvedPackages(m_config, { m_pkg2 }, removedPackages); CPPUNIT_ASSERT_EQUAL(1_st, failures.size()); CPPUNIT_ASSERT_EQUAL(m_pkg1, failures.begin()->first); }