diff --git a/include/libdnf5/base/goal_elements.hpp b/include/libdnf5/base/goal_elements.hpp index 608ba3bf5..cb02a4054 100644 --- a/include/libdnf5/base/goal_elements.hpp +++ b/include/libdnf5/base/goal_elements.hpp @@ -122,7 +122,9 @@ enum class GoalProblem : uint32_t { /// Error when transaction contains additional unexpected elements. /// Used when replaying transactions. EXTRA = (1 << 22), - MALFORMED = (1 << 23) + MALFORMED = (1 << 23), + NOT_FOUND_DEBUGINFO = (1 << 24), + NOT_FOUND_DEBUGSOURCE = (1 << 25) }; /// Types of Goal actions diff --git a/libdnf5/base/goal.cpp b/libdnf5/base/goal.cpp index 2ebebc5cc..4ba91280b 100644 --- a/libdnf5/base/goal.cpp +++ b/libdnf5/base/goal.cpp @@ -1613,6 +1613,9 @@ std::pair Goal::Impl::add_install_debug_to_ } ++iter; } + + std::set no_debuginfo_for_packages; + std::set no_debugsource_for_packages; for (auto & item : candidate_map) { auto & first_pkg = *item.second.begin(); auto debug_name = first_pkg.get_debuginfo_name(); @@ -1644,7 +1647,9 @@ std::pair Goal::Impl::add_install_debug_to_ skip_broken, best, clean_requirements_on_remove)) { - // TODO(jmracek) report when proper debug RPM is not found + for (auto & package : arch_item.second) { + no_debuginfo_for_packages.emplace(package.get_full_nevra()); + } } } if (!install_debug_from_packages( @@ -1656,7 +1661,9 @@ std::pair Goal::Impl::add_install_debug_to_ skip_broken, best, clean_requirements_on_remove)) { - // TODO(jmracek) report when proper debug RPM is not found + for (auto & package : arch_item.second) { + no_debugsource_for_packages.emplace(package.get_full_nevra()); + } } } continue; @@ -1680,7 +1687,9 @@ std::pair Goal::Impl::add_install_debug_to_ skip_broken, best, clean_requirements_on_remove)) { - // TODO(jmracek) report when proper debug RPM is not found + for (auto & package : item.second) { + no_debuginfo_for_packages.emplace(package.get_full_nevra()); + } } } if (!install_debug_from_packages( @@ -1692,9 +1701,31 @@ std::pair Goal::Impl::add_install_debug_to_ skip_broken, best, clean_requirements_on_remove)) { - // TODO(jmracek) report when proper debug RPM is not found + for (auto & package : item.second) { + no_debugsource_for_packages.emplace(package.get_full_nevra()); + } } } + if (!no_debuginfo_for_packages.empty()) { + transaction.p_impl->add_resolve_log( + GoalAction::INSTALL_DEBUG, + GoalProblem::NOT_FOUND_DEBUGINFO, + settings, + libdnf5::transaction::TransactionItemType::PACKAGE, + spec, + no_debuginfo_for_packages, + libdnf5::Logger::Level::WARNING); + } + if (!no_debugsource_for_packages.empty()) { + transaction.p_impl->add_resolve_log( + GoalAction::INSTALL_DEBUG, + GoalProblem::NOT_FOUND_DEBUGSOURCE, + settings, + libdnf5::transaction::TransactionItemType::PACKAGE, + spec, + no_debugsource_for_packages, + libdnf5::Logger::Level::WARNING); + } return {GoalProblem::NO_PROBLEM, result_queue}; } diff --git a/libdnf5/base/log_event.cpp b/libdnf5/base/log_event.cpp index 15a29cecd..d271ae1ff 100644 --- a/libdnf5/base/log_event.cpp +++ b/libdnf5/base/log_event.cpp @@ -340,6 +340,27 @@ std::string LogEvent::to_string( case GoalProblem::MALFORMED: { return ret.append(utils::sformat(_("Cannot parse file: '{0}': {1}.\n"), *spec, *additional_data.begin())); } + case GoalProblem::NOT_FOUND_DEBUGINFO: { + if (additional_data.empty()) { + throw std::invalid_argument("Missing description of missing debuginfo packages"); + } + return ret.append(utils::sformat( + _("Could not find debuginfo package for the following packages resolved from the argument '{0}': {1}"), + *spec, + utils::string::join( + additional_data, C_("String for joining NEVRAs - e.g. `foo-4-4.noarch, bar-5-5.noarch`", ", ")))); + } + case GoalProblem::NOT_FOUND_DEBUGSOURCE: { + if (additional_data.empty()) { + throw std::invalid_argument("Missing description of missing debugsource packages"); + } + return ret.append(utils::sformat( + _("Could not find debugsource package for the following packages resolved from the argument '{0}': " + "{1}"), + *spec, + utils::string::join( + additional_data, C_("String for joining NEVRAs - e.g. `foo-4-4.noarch, bar-5-5.noarch`", ", ")))); + } } return ret; }