Rewrite gathering to use new hawkey code that's part of libhif.
Signed-off-by: Lubomír Sedlář <lsedlar@redhat.com>
This commit is contained in:
		
							parent
							
								
									dfef1837ea
								
							
						
					
					
						commit
						94d16d8c32
					
				
							
								
								
									
										34
									
								
								pungi/common.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										34
									
								
								pungi/common.py
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,34 @@ | |||||||
|  | # -*- coding: utf-8 -*- | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | # This program is free software; you can redistribute it and/or modify | ||||||
|  | # it under the terms of the GNU General Public License as published by | ||||||
|  | # the Free Software Foundation; version 2 of the License. | ||||||
|  | # | ||||||
|  | # This program is distributed in the hope that it will be useful, | ||||||
|  | # but WITHOUT ANY WARRANTY; without even the implied warranty of | ||||||
|  | # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the | ||||||
|  | # GNU Library General Public License for more details. | ||||||
|  | # | ||||||
|  | # You should have received a copy of the GNU General Public License along | ||||||
|  | # with this program; if not, write to the Free Software Foundation, Inc., | ||||||
|  | # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | class OptionsBase(object): | ||||||
|  | 
 | ||||||
|  |     def __init__(self, **kwargs): | ||||||
|  |         """ | ||||||
|  |         inherit and initialize attributes | ||||||
|  |         call self.merge_options(**kwargs) at the end | ||||||
|  |         """ | ||||||
|  |         pass | ||||||
|  | 
 | ||||||
|  |     def merge_options(self, **kwargs): | ||||||
|  |         """ | ||||||
|  |         override defaults with user defined values | ||||||
|  |         """ | ||||||
|  |         for key, value in kwargs.items(): | ||||||
|  |             if not hasattr(self, key): | ||||||
|  |                 raise ValueError("Invalid option in %s: %s" % (self.__class__.__name__, key)) | ||||||
|  |             setattr(self, key, value) | ||||||
| @ -16,16 +16,18 @@ | |||||||
| # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. | # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
| 
 | import logging | ||||||
| 
 | 
 | ||||||
| import hawkey | import hawkey | ||||||
| import logging | from kobo.rpmlib import parse_nvra | ||||||
|  | 
 | ||||||
|  | import pungi.common | ||||||
| import pungi.dnf_wrapper | import pungi.dnf_wrapper | ||||||
| import pungi.multilib_dnf | import pungi.multilib_dnf | ||||||
| from pungi.profiler import Profiler | from pungi.profiler import Profiler | ||||||
| from kobo.rpmlib import parse_nvra |  | ||||||
| 
 | 
 | ||||||
| class GatherOptions(object): | 
 | ||||||
|  | class GatherOptions(pungi.common.OptionsBase): | ||||||
|     def __init__(self, **kwargs): |     def __init__(self, **kwargs): | ||||||
|         super(GatherOptions, self).__init__() |         super(GatherOptions, self).__init__() | ||||||
| 
 | 
 | ||||||
| @ -56,75 +58,7 @@ class GatherOptions(object): | |||||||
|         # lookaside repos; packages will be flagged accordingly |         # lookaside repos; packages will be flagged accordingly | ||||||
|         self.lookaside_repos = [] |         self.lookaside_repos = [] | ||||||
| 
 | 
 | ||||||
|         for key, value in kwargs.items(): |         self.merge_options(**kwargs) | ||||||
|             if not hasattr(self, key): |  | ||||||
|                 raise ValueError("Invalid gather option: %s" % key) |  | ||||||
|             setattr(self, key, value) |  | ||||||
| 
 |  | ||||||
| 
 |  | ||||||
| def filter_debug_packages(q, arch=None): |  | ||||||
|     result = q.filter(arch__neq=["src", "nosrc"]) |  | ||||||
|     if arch: |  | ||||||
|         arches = pungi.dnf_wrapper.ArchWrapper(arch).all_arches |  | ||||||
|         result = result.filter(arch=arches) |  | ||||||
|     result = result.filter(name__glob=["*-debuginfo", "*-debuginfo-*"]) |  | ||||||
|     return result |  | ||||||
| 
 |  | ||||||
| 
 |  | ||||||
| def filter_native_debug_packages(q, arch): |  | ||||||
|     result = q.filter(arch__neq=["src", "nosrc"]) |  | ||||||
|     arches = pungi.dnf_wrapper.ArchWrapper(arch).native_arches |  | ||||||
|     result = result.filter(arch=arches) |  | ||||||
|     result = result.filter(name__glob=["*-debuginfo", "*-debuginfo-*"]) |  | ||||||
|     return result |  | ||||||
| 
 |  | ||||||
| 
 |  | ||||||
| def filter_multilib_debug_packages(q, arch): |  | ||||||
|     result = q.filter(arch__neq=["src", "nosrc"]) |  | ||||||
|     arches = pungi.dnf_wrapper.ArchWrapper(arch).multilib_arches |  | ||||||
|     result = result.filter(arch=arches) |  | ||||||
|     result = result.filter(name__glob=["*-debuginfo", "*-debuginfo-*"]) |  | ||||||
|     return result |  | ||||||
| 
 |  | ||||||
| 
 |  | ||||||
| def filter_source_packages(q): |  | ||||||
|     result = q.filter(arch=["src", "nosrc"]) |  | ||||||
|     return result |  | ||||||
| 
 |  | ||||||
| 
 |  | ||||||
| def filter_binary_packages(q, arch=None): |  | ||||||
|     result = q.filter(arch__neq=["src", "nosrc"]) |  | ||||||
|     if arch: |  | ||||||
|         arches = pungi.dnf_wrapper.ArchWrapper(arch).all_arches |  | ||||||
|         result = result.filter(arch=arches) |  | ||||||
|     result = result.filter(latest_per_arch=True) |  | ||||||
|     result = result.filter(name__glob__not=["*-debuginfo", "*-debuginfo-*"]) |  | ||||||
|     return result |  | ||||||
| 
 |  | ||||||
| 
 |  | ||||||
| def filter_native_binary_packages(q, arch): |  | ||||||
|     result = q.filter(arch__neq=["src", "nosrc"]) |  | ||||||
|     arches = pungi.dnf_wrapper.ArchWrapper(arch).native_arches |  | ||||||
|     result = result.filter(arch=arches) |  | ||||||
|     result = result.filter(latest_per_arch=True) |  | ||||||
|     result = result.filter(name__glob__not=["*-debuginfo", "*-debuginfo-*"]) |  | ||||||
|     return result |  | ||||||
| 
 |  | ||||||
| 
 |  | ||||||
| def filter_multilib_binary_packages(q, arch): |  | ||||||
|     result = q.filter(arch__neq=["src", "nosrc"]) |  | ||||||
|     arches = pungi.dnf_wrapper.ArchWrapper(arch).multilib_arches |  | ||||||
|     result = result.filter(arch=arches) |  | ||||||
|     result = result.filter(latest_per_arch=True) |  | ||||||
|     result = result.filter(name__glob__not=["*-debuginfo", "*-debuginfo-*"]) |  | ||||||
|     return result |  | ||||||
| 
 |  | ||||||
| 
 |  | ||||||
| def filter_binary_noarch_packages(q): |  | ||||||
|     result = q.filter(arch="noarch") |  | ||||||
|     result = result.filter(latest_per_arch=True) |  | ||||||
|     result = result.filter(name__glob__not=["*-debuginfo", "*-debuginfo-*"]) |  | ||||||
|     return result |  | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
| class QueryCache(object): | class QueryCache(object): | ||||||
| @ -152,14 +86,30 @@ class QueryCache(object): | |||||||
| class GatherBase(object): | class GatherBase(object): | ||||||
|     def __init__(self, dnf_obj): |     def __init__(self, dnf_obj): | ||||||
|         self.dnf = dnf_obj |         self.dnf = dnf_obj | ||||||
|         self.q_binary_packages = filter_binary_packages(self._query, arch=self.dnf.basearch).apply() | 
 | ||||||
|         self.q_native_binary_packages = filter_native_binary_packages(self._query, arch=self.dnf.basearch).apply() |         q = self._query | ||||||
|         self.q_multilib_binary_packages = filter_multilib_binary_packages(self._query, arch=self.dnf.basearch).apply() |         q = q.filter(latest_per_arch=True).apply() | ||||||
|         self.q_noarch_binary_packages = filter_binary_packages(self._query).apply() | 
 | ||||||
|         self.q_debug_packages = filter_debug_packages(self._query, arch=self.dnf.basearch).apply() |         # source packages | ||||||
|         self.q_native_debug_packages = filter_native_debug_packages(self._query, arch=self.dnf.basearch).apply() |         self.q_source_packages = q.filter(arch=self.dnf.arch_wrapper.source_arches).apply() | ||||||
|         self.q_multilib_debug_packages = filter_multilib_debug_packages(self._query, arch=self.dnf.basearch).apply() |         q = q.difference(self.q_source_packages) | ||||||
|         self.q_source_packages = filter_source_packages(self._query).apply() | 
 | ||||||
|  |         # filter arches | ||||||
|  |         q = q.filter(arch=self.dnf.arch_wrapper.all_arches).apply() | ||||||
|  |         q_noarch = q.filter(arch="noarch").apply() | ||||||
|  |         q_native = q.filter(arch=self.dnf.arch_wrapper.native_arches).apply() | ||||||
|  |         q_multilib = q.difference(q_native).union(q_noarch).apply() | ||||||
|  | 
 | ||||||
|  |         # debug packages | ||||||
|  |         self.q_debug_packages = q.filter(name__glob=["*-debuginfo", "*-debuginfo-*"]).apply() | ||||||
|  |         self.q_native_debug_packages = self.q_debug_packages.intersection(q_native) | ||||||
|  |         self.q_multilib_debug_packages = self.q_debug_packages.intersection(q_multilib) | ||||||
|  | 
 | ||||||
|  |         # binary packages | ||||||
|  |         self.q_binary_packages = q.difference(self.q_debug_packages) | ||||||
|  |         self.q_native_binary_packages = q_native.difference(self.q_debug_packages) | ||||||
|  |         self.q_multilib_binary_packages = q_multilib.difference(self.q_debug_packages) | ||||||
|  |         self.q_noarch_binary_packages = q_noarch.difference(self.q_debug_packages) | ||||||
| 
 | 
 | ||||||
|     @property |     @property | ||||||
|     def _query(self): |     def _query(self): | ||||||
| @ -169,7 +119,7 @@ class GatherBase(object): | |||||||
|         return pkg.arch == "noarch" |         return pkg.arch == "noarch" | ||||||
| 
 | 
 | ||||||
|     def is_native_package(self, pkg): |     def is_native_package(self, pkg): | ||||||
|         if pkg.arch in ["src", "nosrc"]: |         if pkg.arch in self.dnf.arch_wrapper.source_arches: | ||||||
|             return False |             return False | ||||||
|         if pkg.arch == "noarch": |         if pkg.arch == "noarch": | ||||||
|             return True |             return True | ||||||
| @ -178,7 +128,7 @@ class GatherBase(object): | |||||||
|         return False |         return False | ||||||
| 
 | 
 | ||||||
|     def is_multilib_package(self, pkg): |     def is_multilib_package(self, pkg): | ||||||
|         if pkg.arch in ["src", "nosrc"]: |         if pkg.arch in self.dnf.arch_wrapper.source_arches: | ||||||
|             return False |             return False | ||||||
|         if pkg.arch == "noarch": |         if pkg.arch == "noarch": | ||||||
|             return False |             return False | ||||||
| @ -236,7 +186,7 @@ class Gather(GatherBase): | |||||||
| 
 | 
 | ||||||
|         all_pkgs = list(package_list) |         all_pkgs = list(package_list) | ||||||
|         native_pkgs = self.q_native_binary_packages.filter(pkg=all_pkgs).apply() |         native_pkgs = self.q_native_binary_packages.filter(pkg=all_pkgs).apply() | ||||||
|         multilib_pkgs = [pkg for pkg in all_pkgs if pkg.arch != "noarch"] |         multilib_pkgs = self.q_multilib_binary_packages.filter(pkg=all_pkgs).apply() | ||||||
| 
 | 
 | ||||||
|         result = set() |         result = set() | ||||||
| 
 | 
 | ||||||
| @ -342,19 +292,19 @@ class Gather(GatherBase): | |||||||
|             with Profiler("Gather.add_initial_packages():exclude"): |             with Profiler("Gather.add_initial_packages():exclude"): | ||||||
|                 # TODO: debug, source |                 # TODO: debug, source | ||||||
|                 if pattern.endswith(".+"): |                 if pattern.endswith(".+"): | ||||||
|                     pkgs = self.q_multilib_binary_packages.filter_autoglob(name=pattern[:-2]) |                     pkgs = self.q_multilib_binary_packages.filter(name__glob=pattern[:-2]) | ||||||
|                 else: |                 else: | ||||||
|                     pkgs = self.q_binary_packages.filter_autoglob(name=pattern) |                     pkgs = self.q_binary_packages.filter(name__glob=pattern) | ||||||
| 
 | 
 | ||||||
|                 exclude.update(pkgs) |                 exclude.update(pkgs) | ||||||
|                 self.logger.debug("EXCLUDED: %s" % list(pkgs)) |                 self.logger.debug("EXCLUDED: %s" % list(pkgs)) | ||||||
|                 self.dnf._sack.add_excludes(pkgs) |                 self.dnf._sack.add_excludes(pkgs) | ||||||
| 
 | 
 | ||||||
|         # HACK |         with Profiler("Gather.add_initial_packages():exclude-queries"): | ||||||
|         self.q_binary_packages = self.q_binary_packages.filter(pkg=[i for i in self.q_binary_packages if i not in exclude]).apply() |             self.q_binary_packages = self.q_binary_packages.filter(pkg__neq=exclude).apply() | ||||||
|         self.q_native_binary_packages = self.q_native_binary_packages.filter(pkg=[i for i in self.q_native_binary_packages if i not in exclude]).apply() |             self.q_native_binary_packages = self.q_native_binary_packages.filter(pkg__neq=exclude).apply() | ||||||
|         self.q_multilib_binary_packages = self.q_multilib_binary_packages.filter(pkg=[i for i in self.q_multilib_binary_packages if i not in exclude]).apply() |             self.q_multilib_binary_packages = self.q_multilib_binary_packages.filter(pkg__neq=exclude).apply() | ||||||
|         self.q_noarch_binary_packages = self.q_noarch_binary_packages.filter(pkg=[i for i in self.q_noarch_binary_packages if i not in exclude]).apply() |             self.q_noarch_binary_packages = self.q_noarch_binary_packages.filter(pkg__neq=exclude).apply() | ||||||
| 
 | 
 | ||||||
|         self.init_query_cache() |         self.init_query_cache() | ||||||
| 
 | 
 | ||||||
| @ -364,9 +314,9 @@ class Gather(GatherBase): | |||||||
|                     pkgs = self.q_binary_packages.filter(provides=hawkey.Reldep(self.dnf.sack, "system-release")).apply() |                     pkgs = self.q_binary_packages.filter(provides=hawkey.Reldep(self.dnf.sack, "system-release")).apply() | ||||||
|                 else: |                 else: | ||||||
|                     if pattern.endswith(".+"): |                     if pattern.endswith(".+"): | ||||||
|                         pkgs = self.q_multilib_binary_packages.filter_autoglob(name=pattern[:-2]).apply() |                         pkgs = self.q_multilib_binary_packages.filter(name__glob=pattern[:-2]).apply() | ||||||
|                     else: |                     else: | ||||||
|                         pkgs = self.q_binary_packages.filter_autoglob(name=pattern).apply() |                         pkgs = self.q_binary_packages.filter(name__glob=pattern).apply() | ||||||
| 
 | 
 | ||||||
|                 pkgs = self._get_best_package(pkgs) |                 pkgs = self._get_best_package(pkgs) | ||||||
|                 if pkgs: |                 if pkgs: | ||||||
| @ -377,12 +327,10 @@ class Gather(GatherBase): | |||||||
|         for pkg in added: |         for pkg in added: | ||||||
|             self._set_flag(pkg, "input") |             self._set_flag(pkg, "input") | ||||||
| 
 | 
 | ||||||
|         native_binary_packages = set(self.q_native_binary_packages) |  | ||||||
| 
 |  | ||||||
|         if self.opts.greedy_method == "build": |         if self.opts.greedy_method == "build": | ||||||
|             for pkg in added.copy(): |             for pkg in added.copy(): | ||||||
|                 with Profiler("Gather.add_initial_packages():greedy-build"): |                 with Profiler("Gather.add_initial_packages():greedy-build"): | ||||||
|                     if pkg in native_binary_packages: |                     if pkg in self.q_native_binary_packages: | ||||||
|                         greedy_build_packages = self.q_native_pkgs_by_sourcerpm_cache.get(pkg.sourcerpm) or [] |                         greedy_build_packages = self.q_native_pkgs_by_sourcerpm_cache.get(pkg.sourcerpm) or [] | ||||||
|                     else: |                     else: | ||||||
|                         greedy_build_packages = self.q_multilib_pkgs_by_sourcerpm_cache.get(pkg.sourcerpm) or [] |                         greedy_build_packages = self.q_multilib_pkgs_by_sourcerpm_cache.get(pkg.sourcerpm) or [] | ||||||
|  | |||||||
		Loading…
	
		Reference in New Issue
	
	Block a user