From dbb4b9d21dcb9e5ea547b0b8837540e0566abbd7 Mon Sep 17 00:00:00 2001 From: Tomas Tomecek Date: May 16 2017 08:06:25 +0000 Subject: [PATCH 1/2] fix deps differ: use local repos populated via mbs-build local Signed-off-by: Tomas Tomecek --- diff --git a/modularity/module_deps_differ.py b/modularity/module_deps_differ.py index 7493add..3feade7 100755 --- a/modularity/module_deps_differ.py +++ b/modularity/module_deps_differ.py @@ -1,11 +1,11 @@ #!/usr/bin/env python from pdc_client import PDCClient import dnf +import os import sys import re -SUPPORTED_MODULES = ['perl', 'base-runtime', 'common-build-dependencies-bootstrap', 'common-build-dependencies'] FALLBACK_STREAM = 'master' STREAM = 'f26' REPO_F26 = "http://ftp.fi.muni.cz/pub/linux/fedora/linux/development/26/Everything/x86_64/os/" @@ -44,6 +44,7 @@ class ModuleDepsDiffer(object): self.repo_bases = {} def get_repo_urls(self): + """ this doesn't work anymore since the repos are no longer present in koji """ for repo in SUPPORTED_MODULES: module_name = repo stream = STREAM @@ -84,6 +85,25 @@ class ModuleDepsDiffer(object): base = ModuleDepsDiffer.get_base_from_repo(reponame, repourl) self.repo_bases[reponame] = base + def _init_repo_bases2(self): + """ + version 1 is no longer usable since koji no longer creates repos for + modules this version iterates over repos present in + ~/modulebuild/cache/koji_tags, this means that you should do `mbs-build + local` to populate the directory + + Once we have real compose of boltron, we might utilize it here + + initialize repo objects for dnf to kick off queries + """ + cache_path = os.path.expanduser("~/modulebuild/cache/koji_tags") + for module_name in os.listdir(cache_path): + if module_name != "f26-modularity": # bootstrap contains almost everything, so let's ignore it + self.repos[module_name] = "file://{}".format(os.path.join(cache_path, module_name)) + for reponame, repourl in self.repos.items(): + base = ModuleDepsDiffer.get_base_from_repo(reponame, repourl) + self.repo_bases[reponame] = base + def get_repo_provides(self): for reponame, base in self.repo_bases.items(): allpkgs = base.sack.query().filter() @@ -117,14 +137,16 @@ class ModuleDepsDiffer(object): # weak deps will get resolved correctly with this approach def classify_caps(self, caps_classified, requirements): for cap in requirements: + found = False for reponame, base in self.repo_bases.items(): q = base.sack.query() pkg = q.filter(provides=[cap], arch=['noarch', ARCH], latest=True) if pkg: + found = True caps_classified.setdefault(reponame, set()) caps_classified[reponame].add(cap) - break - else: + # don't break here in case one cap is present in multiple repos + if not found: caps_classified['result'].add(cap) @staticmethod @@ -197,7 +219,7 @@ class ModuleDepsDiffer(object): self._dump_pkgs_result(self.runtime_caps_classified.items()) def run(self): - self._init_repo_bases() + self._init_repo_bases2() self.get_package_requires() # self.get_repo_provides() self.classify_caps(self.build_caps_classified, self.build_req) From d1253524e48c81f14a90af361b8c730f2cfaf041 Mon Sep 17 00:00:00 2001 From: Tomas Tomecek Date: May 17 2017 08:36:50 +0000 Subject: [PATCH 2/2] show module names instead of IDs Signed-off-by: Tomas Tomecek --- diff --git a/modularity/module_deps_differ.py b/modularity/module_deps_differ.py index 3feade7..e0091d4 100755 --- a/modularity/module_deps_differ.py +++ b/modularity/module_deps_differ.py @@ -42,6 +42,20 @@ class ModuleDepsDiffer(object): self.runtime_caps_classified = dict() self.runtime_caps_classified['result'] = set() self.repo_bases = {} + self.module_id_to_name = {} + + def get_module_name(self, koji_tag_name): + return self.module_id_to_name.get(koji_tag_name, koji_tag_name) + + def obtain_module_names(self): + j = self.p['unreleasedvariants']( + variant_type="module", + active=True, + page_size=-1 + # variant_version=STREAM, + ) + for module in j: + self.module_id_to_name[module["koji_tag"]] = "{}:{}".format(module["variant_id"], module["variant_version"]) def get_repo_urls(self): """ this doesn't work anymore since the repos are no longer present in koji """ @@ -174,15 +188,16 @@ class ModuleDepsDiffer(object): result.add(stripped) return result - @staticmethod - def _dump_caps_result(items): + def _dump_caps_result(self, items): for repo, caps in items: if not caps: continue if repo == 'result': print("Capabilities which aren't provided by any module:") else: - print("Capabilities which are part of " + repo + " module:") + print("Components which are part of " + \ + self.get_module_name(repo) + \ + " module:") for cap in sorted(caps): print(cap) print('') @@ -190,21 +205,22 @@ class ModuleDepsDiffer(object): def dump_caps_result(self): print('BUILD requirements:') print('-------------------') - ModuleDepsDiffer._dump_caps_result(self.build_caps_classified.items()) + self._dump_caps_result(self.build_caps_classified.items()) print('\n') print('RUNTIME requirements:') print('---------------------') - ModuleDepsDiffer._dump_caps_result(self.runtime_caps_classified.items()) + self._dump_caps_result(self.runtime_caps_classified.items()) - @staticmethod - def _dump_pkgs_result(items): + def _dump_pkgs_result(self, items): for repo, caps in items: if not caps: continue if repo == 'result': print("Components which aren't provided by any module:") else: - print("Components which are part of " + repo + " module:") + print("Components which are part of " + \ + self.get_module_name(repo) + \ + " module:") for cap in sorted(ModuleDepsDiffer.whatprovides(caps)): print(cap) print('') @@ -222,5 +238,6 @@ class ModuleDepsDiffer(object): self._init_repo_bases2() self.get_package_requires() # self.get_repo_provides() + self.obtain_module_names() self.classify_caps(self.build_caps_classified, self.build_req) self.classify_caps(self.runtime_caps_classified, self.runtime_req)