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(
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 ...
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::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::unordered_map<Database *, bool> 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);
}

View File

@ -118,7 +118,7 @@ struct LIBPKG_EXPORT Config : public Lockable, public ReflectiveRapidJSON::Binar
Status computeStatus() const;
BuildOrderResult computeBuildOrder(const std::vector<std::string> &dependencyDenotations, BuildOrderOptions options);
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);
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,

View File

@ -221,7 +221,7 @@ 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);
const auto depOrder = config.computeDatabaseDependencyOrder(*this, false);
if (auto *const dbs = std::get_if<std::vector<Database *>>(&depOrder)) {
deps = std::move(*dbs);
}

View File

@ -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);
}