Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
53 changes: 52 additions & 1 deletion content_resolver/analyzer.py
Original file line number Diff line number Diff line change
Expand Up @@ -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(
Expand All @@ -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
Expand All @@ -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!!!!
Expand Down Expand Up @@ -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

Expand Down Expand Up @@ -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"]:
Expand All @@ -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"]:
Expand Down Expand Up @@ -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"]:
Expand Down Expand Up @@ -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()
Expand Down Expand Up @@ -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):

Expand Down Expand Up @@ -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"]:
Expand All @@ -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
Expand Down
47 changes: 47 additions & 0 deletions templates/view_rpm.html
Original file line number Diff line number Diff line change
Expand Up @@ -222,6 +222,53 @@ <h5 class="card-title">Weak runtime dependency of {{pkg.weak_dependency_of_pkg_n
</div>
{% endif %}
</div>

<div class="card border-secondary">
<div class="card-body">
<h5 class="card-title">Reverse weak runtime dependency of {{pkg.reverse_weak_dependency_of_pkg_names|count}}
RPMs</h5>
{% if pkg.reverse_weak_dependency_of_pkg_names %}
<div class="card">

<table class="table-packages table-packages-muted">

<tbody>
{% for srpm_name, srpm_nevrs in pkg.reverse_weak_dependency_of_pkg_names.items() |
sort(attribute='0')
%}
<tr>
<td>
<a href="view-rpm--{{view_conf.id}}--{{srpm_name}}.html">{{srpm_name}}</a>
{% if view_all_arches["pkgs_by_name"][srpm_name].placeholder %}<span
class="text-muted">(placeholder)</span>{% endif %}
{% if
view_all_arches["pkgs_by_name"][srpm_name].unwanted_completely_in_list_ids
%}<span class="text-danger">(unwanted)</span>{% endif %}
</td>
<td>
{{pkg_why(view_all_arches["pkgs_by_name"][srpm_name])}}
</td>
<td>
{% for srpm_nevr in srpm_nevrs | sort %}
{{srpm_nevr}}<br>
{% endfor %}
</td>
</tr>

{% endfor %}
</tbody>
</table>
</div>
{% else %}
<div class="card bg-light">
<div class="card-body text-muted text-center">
No packages...
</div>
</div>
{% endif %}
</div>
</div>

</div>
</div>
</div>
Expand Down