Goal::Impl::add_install_to_goal: Fix to_repo_ids handling

If our package installation request includes a restriction to only
repositories defined in `to_repo_ids`, we must retain only
the corresponding installed packages, and do so before checking
if the packages requested for installation are already installed.
This commit is contained in:
Jaroslav Rohel 2025-07-16 10:07:31 +02:00
parent 278280ff40
commit 375cd816ca
1 changed files with 31 additions and 49 deletions

View File

@ -1410,11 +1410,40 @@ std::pair<GoalProblem, libdnf5::solv::IdQueue> Goal::Impl::add_install_to_goal(
return {GoalProblem::NO_PROBLEM, result_queue};
}
rpm::PackageQuery installed(query);
installed.filter_installed();
if (!settings.get_to_repo_ids().empty()) {
query.filter_repo_id(settings.get_to_repo_ids(), sack::QueryCmp::GLOB);
if (query.empty()) {
transaction.p_impl->add_resolve_log(
action,
GoalProblem::NOT_FOUND_IN_REPOSITORIES,
settings,
libdnf5::transaction::TransactionItemType::PACKAGE,
spec,
{},
log_level);
return {skip_unavailable ? GoalProblem::NO_PROBLEM : GoalProblem::NOT_FOUND_IN_REPOSITORIES, result_queue};
}
// We require packages only from the to_repo_ids repositories. We'll select only the corresponding installed
// packages (matching name and architecture, or the same NEVRA for install-only packages)
installed.filter_name_arch(query);
rpm::PackageQuery installed_install_only(installed);
installed_install_only.filter_installonly();
installed -= installed_install_only;
installed_install_only.filter_nevra(query);
installed |= installed_install_only;
// Return the corresponding installed packages to the query
// TODO(jrohel): Is it needed?
query |= installed;
}
bool has_just_name = nevra_pair.second.has_just_name();
bool add_obsoletes = cfg_main.get_obsoletes_option().get_value() && has_just_name;
rpm::PackageQuery installed(query);
installed.filter_installed();
for (auto package_id : *installed.p_impl) {
transaction.p_impl->add_resolve_log(
action,
@ -1429,22 +1458,6 @@ std::pair<GoalProblem, libdnf5::solv::IdQueue> Goal::Impl::add_install_to_goal(
bool skip_broken = settings.resolve_skip_broken(cfg_main);
if (multilib_policy == "all" || utils::is_glob_pattern(nevra_pair.second.get_arch().c_str())) {
if (!settings.get_to_repo_ids().empty()) {
query.filter_repo_id(settings.get_to_repo_ids(), sack::QueryCmp::GLOB);
if (query.empty()) {
transaction.p_impl->add_resolve_log(
action,
GoalProblem::NOT_FOUND_IN_REPOSITORIES,
settings,
libdnf5::transaction::TransactionItemType::PACKAGE,
spec,
{},
log_level);
return {GoalProblem::NOT_FOUND_IN_REPOSITORIES, result_queue};
}
query |= installed;
}
// Apply advisory filters
if (settings.get_advisory_filter() != nullptr) {
query.filter_advisories(*settings.get_advisory_filter(), libdnf5::sack::QueryCmp::EQ);
@ -1530,22 +1543,6 @@ std::pair<GoalProblem, libdnf5::solv::IdQueue> Goal::Impl::add_install_to_goal(
(nevra_pair.second.get_name().empty() &&
(!nevra_pair.second.get_epoch().empty() || !nevra_pair.second.get_version().empty() ||
!nevra_pair.second.get_release().empty() || !nevra_pair.second.get_arch().empty()))) {
if (!settings.get_to_repo_ids().empty()) {
query.filter_repo_id(settings.get_to_repo_ids(), sack::QueryCmp::GLOB);
if (query.empty()) {
transaction.p_impl->add_resolve_log(
action,
GoalProblem::NOT_FOUND_IN_REPOSITORIES,
settings,
libdnf5::transaction::TransactionItemType::PACKAGE,
spec,
{},
log_level);
return {GoalProblem::NOT_FOUND_IN_REPOSITORIES, result_queue};
}
query |= installed;
}
// Apply advisory filters
if (settings.get_advisory_filter() != nullptr) {
query.filter_advisories(*settings.get_advisory_filter(), libdnf5::sack::QueryCmp::EQ);
@ -1619,21 +1616,6 @@ std::pair<GoalProblem, libdnf5::solv::IdQueue> Goal::Impl::add_install_to_goal(
if (add_obsoletes) {
add_obsoletes_to_data(base_query, query);
}
if (!settings.get_to_repo_ids().empty()) {
query.filter_repo_id(settings.get_to_repo_ids(), sack::QueryCmp::GLOB);
if (query.empty()) {
transaction.p_impl->add_resolve_log(
action,
GoalProblem::NOT_FOUND_IN_REPOSITORIES,
settings,
libdnf5::transaction::TransactionItemType::PACKAGE,
spec,
{},
log_level);
return {GoalProblem::NOT_FOUND_IN_REPOSITORIES, result_queue};
}
query |= installed;
}
// Apply advisory filters
if (settings.get_advisory_filter() != nullptr) {