Skip to content

Commit

Permalink
Add missing problem type
Browse files Browse the repository at this point in the history
  • Loading branch information
AntoinePrv committed Sep 19, 2022
1 parent 24de00e commit 25b77d4
Showing 1 changed file with 79 additions and 15 deletions.
94 changes: 79 additions & 15 deletions libmamba/src/core/satisfiability_error.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -72,12 +72,61 @@ namespace mamba
<< ", dep: " << problem.dep().value_or("(empty)");
}

inline std::optional<ProblemsGraph::ProblemType> map_problem(SolverRuleinfo solverRuleInfo)
{
switch (solverRuleInfo)
{
case SOLVER_RULE_PKG_CONSTRAINS:
case SOLVER_RULE_PKG_REQUIRES:
case SOLVER_RULE_JOB:
case SOLVER_RULE_PKG:
case SOLVER_RULE_UPDATE:
return std::nullopt;
case SOLVER_RULE_JOB_NOTHING_PROVIDES_DEP:
case SOLVER_RULE_PKG_NOTHING_PROVIDES_DEP:
case SOLVER_RULE_JOB_UNKNOWN_PACKAGE:
return ProblemsGraph::ProblemType::NOT_FOUND;
case SOLVER_RULE_PKG_CONFLICTS:
case SOLVER_RULE_PKG_SAME_NAME:
return ProblemsGraph::ProblemType::CONFLICT;
case SOLVER_RULE_BEST:
return ProblemsGraph::ProblemType::BEST_NOT_INSTALLABLE;
case SOLVER_RULE_BLACK:
return ProblemsGraph::ProblemType::ONLY_DIRECT_INSTALL;
case SOLVER_RULE_INFARCH:
return ProblemsGraph::ProblemType::INFERIOR_ARCH;
case SOLVER_RULE_PKG_NOT_INSTALLABLE:
return ProblemsGraph::ProblemType::NOT_INSTALLABLE;
case SOLVER_RULE_STRICT_REPO_PRIORITY:
return ProblemsGraph::ProblemType::EXCLUDED_BY_REPO_PRIORITY;
case SOLVER_RULE_JOB_PROVIDED_BY_SYSTEM:
return ProblemsGraph::ProblemType::PROVIDED_BY_SYSTEM;
case SOLVER_RULE_CHOICE:
case SOLVER_RULE_FEATURE:
case SOLVER_RULE_JOB_UNSUPPORTED:
case SOLVER_RULE_LEARNT:
case SOLVER_RULE_PKG_RECOMMENDS:
case SOLVER_RULE_RECOMMENDS:
case SOLVER_RULE_UNKNOWN:
return std::nullopt;
case SOLVER_RULE_PKG_SELF_CONFLICT:
case SOLVER_RULE_PKG_OBSOLETES:
case SOLVER_RULE_PKG_IMPLICIT_OBSOLETES:
case SOLVER_RULE_PKG_INSTALLED_OBSOLETES:
case SOLVER_RULE_YUMOBS:
case SOLVER_RULE_DISTUPGRADE:
return std::nullopt;
}
return std::nullopt;
}

class ProblemsGraphCreator
{
public:
using SolvId = Id; // Unscoped from libsolv

using graph_t = ProblemsGraph::graph_t;
using ProblemType = ProblemsGraph::ProblemType;
using RootNode = ProblemsGraph::RootNode;
using PackageNode = ProblemsGraph::PackageNode;
using UnresolvedDependencyNode = ProblemsGraph::UnresolvedDependencyNode;
Expand Down Expand Up @@ -116,8 +165,12 @@ namespace mamba
* Add a node if it is not already present and return the node id.
*/
auto ensure_solvable(SolvId solv_id, node_t&& pkg_info) -> node_id;
auto ensure_solvable(SolvId solv_id, PackageInfo&& pkg_info) -> node_id;
auto ensure_solvable(SolvId solv_id, std::string&& dep) -> node_id;
auto ensure_solvable(SolvId solv_id,
PackageInfo&& pkg_info,
std::optional<ProblemType> pb_type) -> node_id;
auto ensure_solvable(SolvId solv_id,
std::string&& dep,
std::optional<ProblemType> pb_type) -> node_id;

auto add_conflict(node_id n1, node_id n2) -> void;
auto add_expanded_deps_edges(node_id from_id, SolvId dep_id, edge_t const& edge)
Expand All @@ -136,15 +189,18 @@ namespace mamba
return node_id;
};

auto ProblemsGraphCreator::ensure_solvable(SolvId solv_id, PackageInfo&& pkg_info)
-> node_id
auto ProblemsGraphCreator::ensure_solvable(SolvId solv_id,
PackageInfo&& pkg_info,
std::optional<ProblemType> pb_type) -> node_id
{
return ensure_solvable(solv_id, PackageNode{ std::move(pkg_info) });
return ensure_solvable(solv_id, PackageNode{ std::move(pkg_info), pb_type });
}

auto ProblemsGraphCreator::ensure_solvable(SolvId solv_id, std::string&& dep) -> node_id
auto ProblemsGraphCreator::ensure_solvable(SolvId solv_id,
std::string&& dep,
std::optional<ProblemType> pb_type) -> node_id
{
return ensure_solvable(solv_id, UnresolvedDependencyNode{ std::move(dep) });
return ensure_solvable(solv_id, UnresolvedDependencyNode{ std::move(dep), pb_type });
}

auto ProblemsGraphCreator::add_conflict(node_id n1, node_id n2) -> void
Expand All @@ -160,7 +216,7 @@ namespace mamba
for (const auto& solv_id : m_pool.select_solvables(dep_id))
{
auto pkg_info = PackageInfo(pool_id2solvable(m_pool, solv_id));
auto to_id = ensure_solvable(solv_id, std::move(pkg_info));
auto to_id = ensure_solvable(solv_id, std::move(pkg_info), {});
m_graph.add_edge(from_id, to_id, edge);
}
}
Expand All @@ -175,6 +231,7 @@ namespace mamba
auto source = problem.source();
auto target = problem.target();
auto dep = problem.dep();
auto type = map_problem(problem.type);
switch (problem.type)
{
case SOLVER_RULE_PKG_CONSTRAINS:
Expand All @@ -185,8 +242,10 @@ namespace mamba
warn_unexpected_problem(problem);
break;
}
auto src_id = ensure_solvable(problem.source_id, std::move(source).value());
auto tgt_id = ensure_solvable(problem.target_id, std::move(target).value());
auto src_id
= ensure_solvable(problem.source_id, std::move(source).value(), type);
auto tgt_id
= ensure_solvable(problem.target_id, std::move(target).value(), type);
auto const edge = ConstraintEdge{ DependencyInfo(dep.value()) };
add_expanded_deps_edges(src_id, problem.dep_id, edge);
add_conflict(src_id, tgt_id);
Expand All @@ -199,7 +258,8 @@ namespace mamba
warn_unexpected_problem(problem);
break;
}
auto src_id = ensure_solvable(problem.source_id, std::move(source).value());
auto src_id
= ensure_solvable(problem.source_id, std::move(source).value(), type);
auto edge = RequireEdge{ DependencyInfo(dep.value()) };
add_expanded_deps_edges(src_id, problem.dep_id, edge);
break;
Expand Down Expand Up @@ -227,8 +287,10 @@ namespace mamba
break;
}
auto edge = RequireEdge{ DependencyInfo(dep.value()) };
auto src_id = ensure_solvable(problem.source_id, std::move(source).value());
auto tgt_id = ensure_solvable(problem.target_id, std::move(dep).value());
auto src_id
= ensure_solvable(problem.source_id, std::move(source).value(), type);
auto tgt_id
= ensure_solvable(problem.target_id, std::move(dep).value(), type);
m_graph.add_edge(src_id, tgt_id, std::move(edge));
}
case SOLVER_RULE_PKG_CONFLICTS:
Expand All @@ -239,8 +301,10 @@ namespace mamba
warn_unexpected_problem(problem);
break;
}
auto src_id = ensure_solvable(problem.source_id, std::move(source).value());
auto tgt_id = ensure_solvable(problem.target_id, std::move(target).value());
auto src_id
= ensure_solvable(problem.source_id, std::move(source).value(), type);
auto tgt_id
= ensure_solvable(problem.target_id, std::move(target).value(), type);
add_conflict(src_id, tgt_id);
break;
}
Expand Down

0 comments on commit 25b77d4

Please sign in to comment.