Exclude current db from order computation when detecting unresolved packages

This commit is contained in:
Martchus 2021-02-09 11:59:23 +01:00
parent 7a8601010e
commit 4ac9e729d0
4 changed files with 12 additions and 10 deletions

View File

@ -45,7 +45,7 @@ DatabaseStatistics::DatabaseStatistics(const Database &db)
} }
static std::string addDatabaseDependencies( static std::string addDatabaseDependencies(
Config &config, Database &database, std::vector<Database *> &result, std::unordered_map<Database *, bool> &visited) Config &config, Database &database, std::vector<Database *> &result, std::unordered_map<Database *, bool> &visited, bool addSelf)
{ {
// abort if ... // abort if ...
const auto insertion = visited.emplace(make_pair(&database, false)); const auto insertion = visited.emplace(make_pair(&database, false));
@ -63,13 +63,15 @@ static std::string addDatabaseDependencies(
return argsToString( return argsToString(
"database \"", dependency, "\" required by \"", database.name, "\" does not exist (architecture ", database.arch, ')'); "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; return error;
} }
} }
// add database itself // 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 // consider this db done; if something else depends on it is o.k. and not a cycle
visited[&database] = true; visited[&database] = true;
@ -77,12 +79,12 @@ static std::string addDatabaseDependencies(
return string(); return string();
} }
std::variant<std::vector<Database *>, std::string> Config::computeDatabaseDependencyOrder(Database &database) std::variant<std::vector<Database *>, std::string> Config::computeDatabaseDependencyOrder(Database &database, bool addSelf)
{ {
std::vector<Database *> result; std::vector<Database *> result;
std::unordered_map<Database *, bool> visited; std::unordered_map<Database *, bool> visited;
result.reserve(database.dependencies.size()); result.reserve(database.dependencies.size());
auto error = addDatabaseDependencies(*this, database, result, visited); auto error = addDatabaseDependencies(*this, database, result, visited, addSelf);
if (!error.empty()) { if (!error.empty()) {
return move(error); return move(error);
} }

View File

@ -118,7 +118,7 @@ struct LIBPKG_EXPORT Config : public Lockable, public ReflectiveRapidJSON::Binar
Status computeStatus() const; Status computeStatus() const;
BuildOrderResult computeBuildOrder(const std::vector<std::string> &dependencyDenotations, BuildOrderOptions options); BuildOrderResult computeBuildOrder(const std::vector<std::string> &dependencyDenotations, BuildOrderOptions options);
LicenseResult computeLicenseInfo(const std::vector<std::string> &dependencyDenotations); LicenseResult computeLicenseInfo(const std::vector<std::string> &dependencyDenotations);
std::variant<std::vector<Database *>, std::string> computeDatabaseDependencyOrder(Database &database); std::variant<std::vector<Database *>, std::string> computeDatabaseDependencyOrder(Database &database, bool addSelf = true);
std::vector<Database *> computeDatabasesRequiringDatabase(Database &database); std::vector<Database *> computeDatabasesRequiringDatabase(Database &database);
void pullDependentPackages(const std::vector<Dependency> &dependencies, const std::shared_ptr<Package> &relevantPackage, void pullDependentPackages(const std::vector<Dependency> &dependencies, const std::shared_ptr<Package> &relevantPackage,
const std::unordered_set<LibPkg::Database *> &relevantDbs, std::unordered_set<Package *> &runtimeDependencies, const std::unordered_set<LibPkg::Database *> &relevantDbs, std::unordered_set<Package *> &runtimeDependencies,

View File

@ -221,7 +221,7 @@ std::unordered_map<std::shared_ptr<Package>, UnresolvedDependencies> Database::d
// determine dependencies and "protected" database // determine dependencies and "protected" database
auto deps = std::vector<Database *>(); auto deps = std::vector<Database *>();
const auto depOrder = config.computeDatabaseDependencyOrder(*this); const auto depOrder = config.computeDatabaseDependencyOrder(*this, false);
if (auto *const dbs = std::get_if<std::vector<Database *>>(&depOrder)) { if (auto *const dbs = std::get_if<std::vector<Database *>>(&depOrder)) {
deps = std::move(*dbs); deps = std::move(*dbs);
} }

View File

@ -254,15 +254,15 @@ void DataTests::testComputingFileName()
void DataTests::testDetectingUnresolved() 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()); CPPUNIT_ASSERT_EQUAL(0_st, db1.detectUnresolvedPackages(m_config, {}, {}).size());
// upgrade bar to 5.6, foo should be unresolvable // upgrade bar to 5.6, foo should be unresolvable
m_pkg2->version = "5.6"; m_pkg2->version = "5.6";
DependencySet removedPackages; auto removedPackages = DependencySet();
removedPackages.add(Dependency("bar", "5.5"), m_pkg2); 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(1_st, failures.size());
CPPUNIT_ASSERT_EQUAL(m_pkg1, failures.begin()->first); CPPUNIT_ASSERT_EQUAL(m_pkg1, failures.begin()->first);
} }