From 5e2e448d6b0f24e928e408bf76d29fb7ba76db41 Mon Sep 17 00:00:00 2001 From: seryan Date: Tue, 2 Sep 2025 09:39:38 +0100 Subject: [PATCH 1/2] Add logic for reverse boolean weak dependencies --- content_resolver/analyzer.py | 53 +++++++++++++++++++++++++++++++++++- templates/view_rpm.html | 47 ++++++++++++++++++++++++++++++++ 2 files changed, 99 insertions(+), 1 deletion(-) diff --git a/content_resolver/analyzer.py b/content_resolver/analyzer.py index eaaffd3..d31b9b1 100644 --- a/content_resolver/analyzer.py +++ b/content_resolver/analyzer.py @@ -664,6 +664,7 @@ def _analyze_package_relations(self, dnf_query, package_placeholders = None): required_by = set() recommended_by = set() suggested_by = set() + supplements = set() for dep_pkg in dnf_query.filter(requires=[pkg]): dep_pkg_id = "{name}-{evr}.{arch}".format( @@ -689,10 +690,23 @@ def _analyze_package_relations(self, dnf_query, package_placeholders = None): # arch=dep_pkg.arch # ) # suggested_by.add(dep_pkg_id) + + # Find packages that this pkg supplements + for supplement_reldep in pkg.supplements: + # Find packages in the query that provide this supplement + providing_pkgs = dnf_query.filter(provides=[supplement_reldep]) + for providing_pkg in providing_pkgs: + supplement_pkg_id = "{name}-{evr}.{arch}".format( + name=providing_pkg.name, + evr=providing_pkg.evr, + arch=providing_pkg.arch + ) + supplements.add(supplement_pkg_id) relations[pkg_id] = {} relations[pkg_id]["required_by"] = sorted(list(required_by)) relations[pkg_id]["recommended_by"] = sorted(list(recommended_by)) + relations[pkg_id]["supplements"] = sorted(list(supplements)) #relations[pkg_id]["suggested_by"] = sorted(list(suggested_by)) relations[pkg_id]["suggested_by"] = [] relations[pkg_id]["source_name"] = pkg.source_name @@ -706,6 +720,7 @@ def _analyze_package_relations(self, dnf_query, package_placeholders = None): relations[placeholder_id]["required_by"] = [] relations[placeholder_id]["recommended_by"] = [] relations[placeholder_id]["suggested_by"] = [] + relations[placeholder_id]["supplements"] = [] relations[placeholder_id]["reponame"] = None # TODO: triple for loop!!!! @@ -1561,6 +1576,7 @@ def _init_view_pkg(self, input_pkg, arch, placeholder=False, level=0): pkg["required_by"] = set() pkg["recommended_by"] = set() pkg["suggested_by"] = set() + pkg["supplements"] = set() return pkg @@ -1685,6 +1701,7 @@ def _analyze_view(self, view_conf, arch, views): view["pkgs"][pkg_id]["required_by"].update(workload["pkg_relations"][pkg_id]["required_by"]) view["pkgs"][pkg_id]["recommended_by"].update(workload["pkg_relations"][pkg_id]["recommended_by"]) view["pkgs"][pkg_id]["suggested_by"].update(workload["pkg_relations"][pkg_id]["suggested_by"]) + view["pkgs"][pkg_id]["supplements"].update(workload["pkg_relations"][pkg_id]["supplements"]) # Packages added by this workload (required or dependency) for pkg_id in workload["pkg_added_ids"]: @@ -1711,6 +1728,7 @@ def _analyze_view(self, view_conf, arch, views): view["pkgs"][pkg_id]["required_by"].update(workload["pkg_relations"][pkg_id]["required_by"]) view["pkgs"][pkg_id]["recommended_by"].update(workload["pkg_relations"][pkg_id]["recommended_by"]) view["pkgs"][pkg_id]["suggested_by"].update(workload["pkg_relations"][pkg_id]["suggested_by"]) + view["pkgs"][pkg_id]["supplements"].update(workload["pkg_relations"][pkg_id]["supplements"]) # And finally the non-existing, imaginary, package placeholders! for pkg_id in workload["pkg_placeholder_ids"]: @@ -2387,6 +2405,7 @@ def _add_buildroot_to_view(self, view_conf, arch): view["pkgs"][pkg_id]["required_by"].update(buildroot_srpm["pkg_relations"][pkg_id]["required_by"]) view["pkgs"][pkg_id]["recommended_by"].update(buildroot_srpm["pkg_relations"][pkg_id]["recommended_by"]) view["pkgs"][pkg_id]["suggested_by"].update(buildroot_srpm["pkg_relations"][pkg_id]["suggested_by"]) + view["pkgs"][pkg_id]["supplements"].update(buildroot_srpm["pkg_relations"][pkg_id]["supplements"]) # Packages needed on top of the base buildroot (required or dependency) for pkg_id in buildroot_srpm["pkg_added_ids"]: @@ -2418,6 +2437,7 @@ def _add_buildroot_to_view(self, view_conf, arch): view["pkgs"][pkg_id]["required_by"].update(buildroot_srpm["pkg_relations"][pkg_id]["required_by"]) view["pkgs"][pkg_id]["recommended_by"].update(buildroot_srpm["pkg_relations"][pkg_id]["recommended_by"]) view["pkgs"][pkg_id]["suggested_by"].update(buildroot_srpm["pkg_relations"][pkg_id]["suggested_by"]) + view["pkgs"][pkg_id]["supplements"].update(buildroot_srpm["pkg_relations"][pkg_id]["supplements"]) # Resetting the SRPMs, so only the new ones can be added srpm_ids_to_process = set() @@ -2527,12 +2547,14 @@ def _init_pkg_or_srpm_relations_fields(self, target_pkg, type = None): target_pkg["dependency_of_pkg_nevrs"] = set() target_pkg["hard_dependency_of_pkg_nevrs"] = set() target_pkg["weak_dependency_of_pkg_nevrs"] = set() + target_pkg["reverse_weak_dependency_of_pkg_nevrs"] = set() + # Dependency of RPM Names target_pkg["dependency_of_pkg_names"] = {} # of set() of nevrs target_pkg["hard_dependency_of_pkg_names"] = {} # of set() of nevrs target_pkg["weak_dependency_of_pkg_names"] = {} # if set() of nevrs - + target_pkg["reverse_weak_dependency_of_pkg_names"] = {} # if set() of nevrs def _populate_pkg_or_srpm_relations_fields(self, target_pkg, source_pkg, type = None, view = None): @@ -2662,10 +2684,34 @@ def _populate_pkg_or_srpm_relations_fields(self, target_pkg, source_pkg, type = if pkg_name not in target_pkg["weak_dependency_of_pkg_names"]: target_pkg["weak_dependency_of_pkg_names"][pkg_name] = set() target_pkg["weak_dependency_of_pkg_names"][pkg_name].add(pkg_nevr) + + # Reverse weak dependency of (supplements) + for pkg_id in source_pkg["supplements"]: + pkg_name = pkg_id_to_name(pkg_id) + + # This only happens in addon views, and only rarely. + # (see the long comment above) + if pkg_id not in view["pkgs"]: + view_conf_id = view["view_conf_id"] + view_conf = self.configs["views"][view_conf_id] + if view_conf["type"] == "addon": + continue + + pkg = view["pkgs"][pkg_id] + pkg_nevr = "{name}-{evr}".format( + name=pkg["name"], + evr=pkg["evr"] + ) + target_pkg["reverse_weak_dependency_of_pkg_nevrs"].add(pkg_nevr) + + if pkg_name not in target_pkg["reverse_weak_dependency_of_pkg_names"]: + target_pkg["reverse_weak_dependency_of_pkg_names"][pkg_name] = set() + target_pkg["reverse_weak_dependency_of_pkg_names"][pkg_name].add(pkg_nevr) # All types of dependency target_pkg["dependency_of_pkg_nevrs"].update(target_pkg["hard_dependency_of_pkg_nevrs"]) target_pkg["dependency_of_pkg_nevrs"].update(target_pkg["weak_dependency_of_pkg_nevrs"]) + target_pkg["dependency_of_pkg_nevrs"].update(target_pkg["reverse_weak_dependency_of_pkg_nevrs"]) for pkg_name, pkg_nevrs in target_pkg["hard_dependency_of_pkg_names"].items(): if pkg_name not in target_pkg["dependency_of_pkg_names"]: @@ -2679,6 +2725,11 @@ def _populate_pkg_or_srpm_relations_fields(self, target_pkg, source_pkg, type = target_pkg["dependency_of_pkg_names"][pkg_name].update(pkg_nevrs) + for pkg_name, pkg_nevrs in target_pkg["reverse_weak_dependency_of_pkg_names"].items(): + if pkg_name not in target_pkg["dependency_of_pkg_names"]: + target_pkg["dependency_of_pkg_names"][pkg_name] = set() + + target_pkg["dependency_of_pkg_names"][pkg_name].update(pkg_nevrs) # TODO: add the levels diff --git a/templates/view_rpm.html b/templates/view_rpm.html index afa51cb..6269574 100644 --- a/templates/view_rpm.html +++ b/templates/view_rpm.html @@ -222,6 +222,53 @@
Weak runtime dependency of {{pkg.weak_dependency_of_pkg_n {% endif %} + +
+
+
Reverse boolean Weak runtime dependency of {{pkg.reverse_weak_dependency_of_pkg_names|count}} + RPMs
+ {% if pkg.reverse_weak_dependency_of_pkg_names %} +
+ + + + + {% for srpm_name, srpm_nevrs in pkg.reverse_weak_dependency_of_pkg_names.items() | + sort(attribute='0') + %} + + + + + + + {% endfor %} + +
+ {{srpm_name}} + {% if view_all_arches["pkgs_by_name"][srpm_name].placeholder %}(placeholder){% endif %} + {% if + view_all_arches["pkgs_by_name"][srpm_name].unwanted_completely_in_list_ids + %}(unwanted){% endif %} + + {{pkg_why(view_all_arches["pkgs_by_name"][srpm_name])}} + + {% for srpm_nevr in srpm_nevrs | sort %} + {{srpm_nevr}}
+ {% endfor %} +
+
+ {% else %} +
+
+ No packages... +
+
+ {% endif %} +
+
+ From d378c3723fb222f8a826c3e003d73b4e793415d7 Mon Sep 17 00:00:00 2001 From: seryan-rh Date: Tue, 9 Sep 2025 16:09:30 +0100 Subject: [PATCH 2/2] Clarify reverse weak runtime dependency title Co-authored-by: Yaakov Selkowitz --- templates/view_rpm.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/templates/view_rpm.html b/templates/view_rpm.html index 6269574..8ff999a 100644 --- a/templates/view_rpm.html +++ b/templates/view_rpm.html @@ -225,7 +225,7 @@
Weak runtime dependency of {{pkg.weak_dependency_of_pkg_n
-
Reverse boolean Weak runtime dependency of {{pkg.reverse_weak_dependency_of_pkg_names|count}} +
Reverse weak runtime dependency of {{pkg.reverse_weak_dependency_of_pkg_names|count}} RPMs
{% if pkg.reverse_weak_dependency_of_pkg_names %}