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(
|
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);
|
||||||
}
|
}
|
||||||
|
|
|
@ -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,
|
||||||
|
|
|
@ -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);
|
||||||
}
|
}
|
||||||
|
|
|
@ -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);
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue