From 1bfea4523b803917e37f81f83519721848012674 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lubom=C3=ADr=20Sedl=C3=A1=C5=99?= Date: Wed, 7 Mar 2018 13:42:09 +0100 Subject: [PATCH 6/8] gather: Honor package whitelist MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Basically everything not on the list is excluded. This has to be applied before we filter only the latest versions (otherwise we could lose packages that are on the whitelist). Signed-off-by: Lubomír Sedlář --- bin/pungi-gather | 1 + pungi/gather_dnf.py | 29 +++++++++++++++++++----- tests/test_gather.py | 63 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 88 insertions(+), 5 deletions(-) diff --git a/bin/pungi-gather b/bin/pungi-gather index daf80f2c..aa70977b 100755 --- a/bin/pungi-gather +++ b/bin/pungi-gather @@ -125,6 +125,7 @@ def main(persistdir, cachedir): gather_opts.multilib_whitelist = ksparser.handler.multilib_whitelist gather_opts.prepopulate = ksparser.handler.prepopulate gather_opts.fulltree_excludes = ksparser.handler.fulltree_excludes + gather_opts.package_whitelist = ksparser.handler.package_whitelist g = Gather(dnf_obj, gather_opts) diff --git a/pungi/gather_dnf.py b/pungi/gather_dnf.py index 1a47eea6..1023c57d 100644 --- a/pungi/gather_dnf.py +++ b/pungi/gather_dnf.py @@ -69,6 +69,8 @@ class GatherOptions(pungi.common.OptionsBase): # lookaside repos; packages will be flagged accordingly self.lookaside_repos = [] + self.package_whitelist = set() + self.merge_options(**kwargs) @@ -363,12 +365,29 @@ class Gather(GatherBase): self.logger.debug("EXCLUDED by %s: %s", pattern, [str(p) for p in pkgs]) self.dnf._sack.add_excludes(pkgs) + all_queues = ['q_binary_packages', 'q_native_binary_packages', + 'q_multilib_binary_packages', 'q_noarch_binary_packages', + 'q_source_packages', 'q_native_debug_packages', + 'q_multilib_debug_packages'] + + if self.opts.package_whitelist: + with Profiler("Gather._apply_excludes():apply-package-whitelist'"): + to_keep = [] + for pattern in self.opts.package_whitelist: + nvra = parse_nvra(pattern) + nvra.pop('src') + try: + nvra['epoch'] = int(nvra.pop('epoch')) + except ValueError: + pass + to_keep.extend(self._query.filter(**nvra).run()) + + for queue in all_queues: + setattr(self, queue, getattr(self, queue).filter(pkg=to_keep).latest().apply()) + with Profiler("Gather._apply_excludes():exclude-queries"): - self._filter_queue('q_binary_packages', exclude) - self._filter_queue('q_native_binary_packages', exclude) - self._filter_queue('q_multilib_binary_packages', exclude) - self._filter_queue('q_noarch_binary_packages', exclude) - self._filter_queue('q_source_packages', exclude) + for queue in all_queues: + self._filter_queue(queue, exclude) @Profiler("Gather.add_initial_packages()") def add_initial_packages(self, pattern_list): diff --git a/tests/test_gather.py b/tests/test_gather.py index 0b015abe..e73ae9c3 100644 --- a/tests/test_gather.py +++ b/tests/test_gather.py @@ -1791,8 +1791,71 @@ class DNFDepsolvingTestCase(DepsolvingBase, unittest.TestCase): def test_bash_older(self): pass + def test_whitelist_old_version(self): + # There are two version of dummy-bash in the package set; let's + # whitelist only the older one and its dependencies. + packages = [ + "dummy-bash", + ] + package_whitelist = [ + "dummy-basesystem-10.0-6.noarch", + "dummy-basesystem-10.0-6.src", + "dummy-bash-debuginfo-4.2.37-5.x86_64", + "dummy-bash-4.2.37-5.x86_64", + "dummy-bash-4.2.37-5.src", + "dummy-filesystem-4.2.37-6.x86_64", + "dummy-filesystem-4.2.37-6.src", + "dummy-glibc-common-2.14-5.x86_64", + "dummy-glibc-debuginfo-common-2.14-5.x86_64", + "dummy-glibc-debuginfo-2.14-5.x86_64", + "dummy-glibc-2.14-5.x86_64", + "dummy-glibc-2.14-5.src", + ] + pkg_map = self.go(packages, None, greedy="none", package_whitelist=package_whitelist) + + self.assertNotIn("dummy-bash-4.2.37-5.i686.rpm", pkg_map["rpm"]) + self.assertNotIn("dummy-bash-4.2.37-6.i686.rpm", pkg_map["rpm"]) + self.assertNotIn("dummy-bash-4.2.37-6.x86_64.rpm", pkg_map["rpm"]) + + self.assertItemsEqual(pkg_map["rpm"], [ + "dummy-basesystem-10.0-6.noarch.rpm", + "dummy-bash-4.2.37-5.x86_64.rpm", + "dummy-filesystem-4.2.37-6.x86_64.rpm", + "dummy-glibc-2.14-5.x86_64.rpm", + "dummy-glibc-common-2.14-5.x86_64.rpm", + ]) + self.assertItemsEqual(pkg_map["srpm"], [ + "dummy-basesystem-10.0-6.src.rpm", + "dummy-bash-4.2.37-5.src.rpm", + "dummy-filesystem-4.2.37-6.src.rpm", + "dummy-glibc-2.14-5.src.rpm", + ]) + self.assertItemsEqual(pkg_map["debuginfo"], [ + "dummy-bash-debuginfo-4.2.37-5.x86_64.rpm", + "dummy-glibc-debuginfo-2.14-5.x86_64.rpm", + "dummy-glibc-debuginfo-common-2.14-5.x86_64.rpm", + ]) + def test_firefox_selfhosting_with_krb5_lookaside(self): super(DNFDepsolvingTestCase, self).test_firefox_selfhosting_with_krb5_lookaside() self.assertFlags("dummy-krb5-devel-1.10-5.x86_64", [PkgFlag.lookaside]) self.assertFlags("dummy-krb5-1.10-5.src", [PkgFlag.lookaside]) self.assertFlags("dummy-krb5-debuginfo-1.10-5.x86_64", [PkgFlag.lookaside]) + + def test_package_whitelist(self): + packages = ['*'] + whitelist = [ + 'dummy-bash-4.2.37-6.x86_64', + 'dummy-bash-4.2.37-6.src', + ] + + pkg_map = self.go(packages, None, package_whitelist=whitelist) + + self.assertItemsEqual(pkg_map["rpm"], [ + 'dummy-bash-4.2.37-6.x86_64.rpm', + ]) + self.assertItemsEqual(pkg_map["srpm"], [ + 'dummy-bash-4.2.37-6.src.rpm', + ]) + self.assertItemsEqual(pkg_map["debuginfo"], [ + ]) -- 2.13.6