pungi/pungi/phases/gather/methods/method_nodeps.py
Lubomír Sedlář b79ff7d8dd gather: Nodeps should allow noarch packages
If the package name matches, we should take the package either if
architecture matches or the package is noarch.

Signed-off-by: Lubomír Sedlář <lsedlar@redhat.com>
2017-10-16 13:45:35 +02:00

122 lines
4.3 KiB
Python

# -*- 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, see <https://gnu.org/licenses/>.
import pungi.arch
from pungi.util import pkg_is_rpm, pkg_is_srpm, pkg_is_debug
from pungi.wrappers.comps import CompsWrapper
import pungi.phases.gather.method
from kobo.pkgset import SimpleRpmWrapper, RpmWrapper
class GatherMethodNodeps(pungi.phases.gather.method.GatherMethodBase):
enabled = True
def __call__(self, arch, variant, pkgs, groups, filter_packages,
multilib_whitelist, multilib_blacklist, package_sets,
path_prefix=None, fulltree_excludes=None, prepopulate=None):
global_pkgset = package_sets["global"]
result = {
"rpm": [],
"srpm": [],
"debuginfo": [],
}
group_packages = expand_groups(self.compose, arch, groups)
packages = pkgs | group_packages
seen_rpms = {}
seen_srpms = {}
valid_arches = pungi.arch.get_valid_arches(arch, multilib=True)
compatible_arches = {}
for i in valid_arches:
compatible_arches[i] = pungi.arch.get_compatible_arches(i)
for i in global_pkgset:
pkg = global_pkgset[i]
if not pkg_is_rpm(pkg):
continue
if pkg.arch not in valid_arches:
continue
for gathered_pkg, pkg_arch in packages:
if (type(gathered_pkg) in [str, unicode]
and pkg.name != gathered_pkg):
continue
elif (type(gathered_pkg) in [SimpleRpmWrapper, RpmWrapper]
and pkg.nevra != gathered_pkg.nevra):
continue
if pkg_arch is not None and pkg.arch != pkg_arch and pkg.arch != 'noarch':
continue
result["rpm"].append({
"path": pkg.file_path,
"flags": ["input"],
})
seen_rpms.setdefault(pkg.name, set()).add(pkg.arch)
seen_srpms.setdefault(pkg.sourcerpm, set()).add(pkg.arch)
for i in global_pkgset:
pkg = global_pkgset[i]
if not pkg_is_srpm(pkg):
continue
if pkg.file_name in seen_srpms:
result["srpm"].append({
"path": pkg.file_path,
"flags": ["input"],
})
for i in global_pkgset:
pkg = global_pkgset[i]
if pkg.arch not in valid_arches:
continue
if not pkg_is_debug(pkg):
continue
if pkg.sourcerpm not in seen_srpms:
continue
pkg_arches = set(compatible_arches[pkg.arch]) - set(['noarch'])
seen_arches = set(seen_srpms[pkg.sourcerpm]) - set(['noarch'])
if not (pkg_arches & seen_arches):
# We only want to pull in a debuginfo if we have a binary
# package for a compatible arch. Noarch packages should not
# pull debuginfo (they would pull in all architectures).
continue
result["debuginfo"].append({
"path": pkg.file_path,
"flags": ["input"],
})
return result
def expand_groups(compose, arch, groups):
"""Read comps file filtered for given architecture and return all packages
in given groups.
:returns: A set of tuples (pkg_name, arch)
"""
if not groups:
# No groups, nothing to do (this also covers case when there is no
# comps file.
return set()
comps_file = compose.paths.work.comps(arch, create_dir=False)
comps = CompsWrapper(comps_file)
packages = set()
for group in groups:
packages.update([(pkg, arch) for pkg in comps.get_packages(group)])
return packages