364d7f5229
With this patch the gather_source option is no longer used. Instead, all sources are always used. If they return at least some input packages, then a configured method is used and the returned lists of packages from all sources are merged. The method used for gathering can be configured for each variant and gather source separately. Additional packages are only added to the comps source. Each gathering step is logged separately. All the logs are preserved for later inspection. Signed-off-by: Lubomír Sedlář <lsedlar@redhat.com>
138 lines
5.1 KiB
Python
138 lines
5.1 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/>.
|
|
|
|
from pprint import pformat
|
|
import six
|
|
|
|
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, *args, **kwargs):
|
|
fname = 'gather-nodeps-%s' % variant.uid
|
|
if self.source_name:
|
|
fname += '-' + self.source_name
|
|
log_file = self.compose.paths.log.log_file(arch, fname)
|
|
with open(log_file, 'w') as log:
|
|
return self.worker(log, arch, variant, *args, **kwargs)
|
|
|
|
def worker(self, log, arch, variant, pkgs, groups, filter_packages,
|
|
multilib_whitelist, multilib_blacklist, package_sets,
|
|
path_prefix=None, fulltree_excludes=None, prepopulate=None):
|
|
pkgset = package_sets[arch]
|
|
result = {
|
|
"rpm": [],
|
|
"srpm": [],
|
|
"debuginfo": [],
|
|
}
|
|
|
|
group_packages = expand_groups(self.compose, arch, groups)
|
|
packages = pkgs | group_packages
|
|
log.write('Requested packages:\n%s\n' % pformat(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)
|
|
|
|
log.write('\nGathering rpms\n')
|
|
for i in pkgset:
|
|
pkg = pkgset[i]
|
|
if not pkg_is_rpm(pkg):
|
|
continue
|
|
for gathered_pkg, pkg_arch in packages:
|
|
if isinstance(gathered_pkg, six.string_types) 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)
|
|
log.write('Added %s (matched %s.%s) (sourcerpm: %s)\n'
|
|
% (pkg, gathered_pkg, pkg_arch, pkg.sourcerpm))
|
|
|
|
log.write('\nGathering source rpms\n')
|
|
for i in pkgset:
|
|
pkg = 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"],
|
|
})
|
|
log.write('Adding %s\n' % pkg)
|
|
|
|
log.write('\nGathering debuginfo packages\n')
|
|
for i in pkgset:
|
|
pkg = pkgset[i]
|
|
if not pkg_is_debug(pkg):
|
|
continue
|
|
if pkg.sourcerpm not in seen_srpms:
|
|
log.write('Not considering %s: corresponding srpm not included\n' % pkg)
|
|
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).
|
|
log.write('Not including %s: no package for this arch\n'
|
|
% pkg)
|
|
continue
|
|
result["debuginfo"].append({
|
|
"path": pkg.file_path,
|
|
"flags": ["input"],
|
|
})
|
|
log.write('Adding %s\n' % pkg)
|
|
|
|
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
|