f116d93
# -*- coding: utf-8 -*-
f116d93
f116d93
f116d93
# This program is free software; you can redistribute it and/or modify
f116d93
# it under the terms of the GNU General Public License as published by
f116d93
# the Free Software Foundation; version 2 of the License.
f116d93
#
f116d93
# This program is distributed in the hope that it will be useful,
f116d93
# but WITHOUT ANY WARRANTY; without even the implied warranty of
f116d93
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
f116d93
# GNU Library General Public License for more details.
f116d93
#
f116d93
# You should have received a copy of the GNU General Public License
f116d93
# along with this program; if not, write to the Free Software
f116d93
# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
f116d93
f116d93
f116d93
f116d93
import os
f116d93
f116d93
import kobo.rpmlib
f116d93
07e90f0
from pungi.linker import LinkerThread, LinkerPool
f116d93
f116d93
f116d93
# TODO: global Linker instance - to keep hardlinks on dest?
f116d93
# DONE: show overall progress, not each file
f116d93
#   TODO: (these should be logged separately)
f116d93
f116d93
def _get_src_nevra(compose, pkg_obj, srpm_map):
f116d93
    """Return source N-E:V-R.A.rpm; guess if necessary."""
f116d93
    result = srpm_map.get(pkg_obj.sourcerpm, None)
f116d93
    if not result:
f116d93
        nvra = kobo.rpmlib.parse_nvra(pkg_obj.sourcerpm)
f116d93
        nvra["epoch"] = pkg_obj.epoch
f116d93
        result = kobo.rpmlib.make_nvra(nvra, add_rpm=True, force_epoch=True)
f116d93
        compose.log_warning("Package %s has no SRPM available, guessing epoch: %s" % (pkg_obj.nevra, result))
f116d93
    return result
f116d93
f116d93
f116d93
def link_files(compose, arch, variant, pkg_map, pkg_sets, manifest, srpm_map={}):
f116d93
    # srpm_map instance is shared between link_files() runs
f116d93
    pkg_set = pkg_sets[arch]
f116d93
f116d93
    msg = "Linking packages (arch: %s, variant: %s)" % (arch, variant)
f116d93
    compose.log_info("[BEGIN] %s" % msg)
f116d93
    link_type = compose.conf.get("link_type", "hardlink-or-copy")
f116d93
f116d93
    pool = LinkerPool(link_type, logger=compose._logger)
f116d93
    for i in range(10):
f116d93
        pool.add(LinkerThread(pool))
f116d93
f116d93
    packages_dir = compose.paths.compose.packages("src", variant)
f116d93
    packages_dir_relpath = compose.paths.compose.packages("src", variant, relative=True)
f116d93
    for pkg in pkg_map["srpm"]:
f116d93
        dst = os.path.join(packages_dir, os.path.basename(pkg["path"]))
f116d93
        dst_relpath = os.path.join(packages_dir_relpath, os.path.basename(pkg["path"]))
f116d93
f116d93
        # link file
f116d93
        pool.queue_put((pkg["path"], dst))
f116d93
f116d93
        # update rpm manifest
f116d93
        pkg_obj = pkg_set[pkg["path"]]
f116d93
        nevra = pkg_obj.nevra
Adam Miller 8d50f89
        manifest.add(variant.uid, arch, nevra, path=dst_relpath, sigkey=pkg_obj.signature, category="source")
f116d93
f116d93
        # update srpm_map
f116d93
        srpm_map.setdefault(pkg_obj.file_name, nevra)
f116d93
f116d93
    packages_dir = compose.paths.compose.packages(arch, variant)
f116d93
    packages_dir_relpath = compose.paths.compose.packages(arch, variant, relative=True)
f116d93
    for pkg in pkg_map["rpm"]:
f116d93
        dst = os.path.join(packages_dir, os.path.basename(pkg["path"]))
f116d93
        dst_relpath = os.path.join(packages_dir_relpath, os.path.basename(pkg["path"]))
f116d93
f116d93
        # link file
f116d93
        pool.queue_put((pkg["path"], dst))
f116d93
f116d93
        # update rpm manifest
f116d93
        pkg_obj = pkg_set[pkg["path"]]
f116d93
        nevra = pkg_obj.nevra
f116d93
        src_nevra = _get_src_nevra(compose, pkg_obj, srpm_map)
Adam Miller 8d50f89
        manifest.add(variant.uid, arch, nevra, path=dst_relpath, sigkey=pkg_obj.signature, category="binary", srpm_nevra=src_nevra)
f116d93
f116d93
    packages_dir = compose.paths.compose.debug_packages(arch, variant)
f116d93
    packages_dir_relpath = compose.paths.compose.debug_packages(arch, variant, relative=True)
f116d93
    for pkg in pkg_map["debuginfo"]:
f116d93
        dst = os.path.join(packages_dir, os.path.basename(pkg["path"]))
f116d93
        dst_relpath = os.path.join(packages_dir_relpath, os.path.basename(pkg["path"]))
f116d93
f116d93
        # link file
f116d93
        pool.queue_put((pkg["path"], dst))
f116d93
f116d93
        # update rpm manifest
f116d93
        pkg_obj = pkg_set[pkg["path"]]
f116d93
        nevra = pkg_obj.nevra
f116d93
        src_nevra = _get_src_nevra(compose, pkg_obj, srpm_map)
Adam Miller 8d50f89
        manifest.add(variant.uid, arch, nevra, path=dst_relpath, sigkey=pkg_obj.signature, category="debug", srpm_nevra=src_nevra)
f116d93
f116d93
    pool.start()
f116d93
    pool.stop()
f116d93
    compose.log_info("[DONE ] %s" % msg)