Exclude current db from order computation when detecting unresolved packages
This commit is contained in:
parent
7a8601010e
commit
4ac9e729d0
|
@ -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);
|
||||
}
|
||||
|
|
|
@ -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,
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue