pax_global_header00006660000000000000000000000064150244651750014523gustar00rootroot0000000000000052 comment=b8b11b4dafaa2c4d73883152bfa7e5bd81cd7395 fedora-modularity-libmodulemd-357799c/000077500000000000000000000000001502446517500177415ustar00rootroot00000000000000fedora-modularity-libmodulemd-357799c/.beautifier/000077500000000000000000000000001502446517500221365ustar00rootroot00000000000000fedora-modularity-libmodulemd-357799c/.beautifier/c/000077500000000000000000000000001502446517500223605ustar00rootroot00000000000000fedora-modularity-libmodulemd-357799c/.beautifier/c/config.ini000066400000000000000000000001671502446517500243320ustar00rootroot00000000000000[global] default = libmodulemd [libmodulemd] command = clang-format config = libmodulemd-clang.cfg name = libmodulemd fedora-modularity-libmodulemd-357799c/.beautifier/c/libmodulemd-clang.cfg000077700000000000000000000000001502446517500314142../../.clang-formatustar00rootroot00000000000000fedora-modularity-libmodulemd-357799c/.beautifier/global.ini000066400000000000000000000000461502446517500240770ustar00rootroot00000000000000[chdr] map = c default = libmodulemd fedora-modularity-libmodulemd-357799c/.ci/000077500000000000000000000000001502446517500204125ustar00rootroot00000000000000fedora-modularity-libmodulemd-357799c/.ci/archlinux/000077500000000000000000000000001502446517500224075ustar00rootroot00000000000000fedora-modularity-libmodulemd-357799c/.ci/archlinux/Dockerfile.deps.tmpl000066400000000000000000000007601502446517500263110ustar00rootroot00000000000000FROM __IMAGE__ MAINTAINER Stephen Gallagher RUN pacman -Syu --needed --noconfirm \ base-devel \ glib2 \ glib2-devel \ glib2-docs \ gobject-introspection \ gtk-doc \ jq \ libyaml \ meson \ python-gobject \ python-six \ && pacman -Scc --noconfirm RUN ln -sf /builddir/bindings/python/gi/overrides/Modulemd.py $(python3 -c "import gi; import os; os.makedirs(gi._overridesdir, exist_ok=True); print(gi._overridesdir)")/Modulemd.py fedora-modularity-libmodulemd-357799c/.ci/archlinux/Dockerfile.tmpl000066400000000000000000000002361502446517500253550ustar00rootroot00000000000000FROM __DEPS_IMAGE__ MAINTAINER Stephen Gallagher ARG TARBALL ADD $TARBALL /builddir/ ENTRYPOINT /builddir/.ci/archlinux/ci-tasks.sh fedora-modularity-libmodulemd-357799c/.ci/archlinux/ci-tasks.sh000077500000000000000000000004001502446517500244560ustar00rootroot00000000000000#!/usr/bin/env bash #Exit on failures set -e set -x pushd /builddir/ # Build the code under GCC and run standard tests meson --buildtype=debugoptimized \ -Dpython_name=python3 \ -Drpmio=disabled \ ci ninja -C ci test popd #builddir fedora-modularity-libmodulemd-357799c/.ci/centos/000077500000000000000000000000001502446517500217055ustar00rootroot00000000000000fedora-modularity-libmodulemd-357799c/.ci/centos/Dockerfile.deps.tmpl000066400000000000000000000027161502446517500256120ustar00rootroot00000000000000dnl Coerce CentOS Stream image tags (streamN) to CentOS tags (N) define(`cosrelease', patsubst(__RELEASE__, `stream', `'))dnl FROM __IMAGE__ MAINTAINER Stephen Gallagher RUN yum -y install epel-release \ ifelse(eval(cosrelease >= 9), 1, `dnl && yum -y install dnf-plugins-core \ && yum config-manager --enable crb \ ')dnl ifelse(eval(cosrelease == 8), 1, `dnl && yum -y install dnf-plugins-core \ && yum config-manager --enable powertools \ ')dnl && yum -y --setopt=tsflags='' install \ clang \ createrepo_c \ elinks \ gcc \ gcc-c++ \ git-core \ glib2-devel \ glib2-doc \ gobject-introspection-devel \ gtk-doc \ jq \ libyaml-devel \ meson \ ninja-build \ pkgconfig \ ifelse(eval(cosrelease < 9), 1, `dnl python2-devel \ python2-six \ python36-devel \ ',`dnl python3-devel \ python3-six \ ')dnl ifelse(eval(cosrelease < 8), 1, `dnl python-gobject-base \ python36-gobject-base \ ',`dnl python3-gobject-base \ ')dnl python3-rpm-macros \ redhat-rpm-config \ rpm-build \ rpm-devel \ rpmdevtools \ sudo \ && yum -y clean all RUN ln -sf /builddir/bindings/python/gi/overrides/Modulemd.py $(python3 -c "import gi; import os; os.makedirs(gi._overridesdir, exist_ok=True); print(gi._overridesdir)")/Modulemd.py fedora-modularity-libmodulemd-357799c/.ci/centos/Dockerfile.tmpl000066400000000000000000000002331502446517500246500ustar00rootroot00000000000000FROM __DEPS_IMAGE__ MAINTAINER Stephen Gallagher ARG TARBALL ADD $TARBALL /builddir/ ENTRYPOINT /builddir/.ci/centos/ci-tasks.sh fedora-modularity-libmodulemd-357799c/.ci/centos/ci-tasks.sh000077500000000000000000000003561502446517500237660ustar00rootroot00000000000000#!/usr/bin/env bash #Exit on failures set -e set -x pushd /builddir/ # Build the code under GCC and run standard tests meson --buildtype=debugoptimized \ -Dpython_name=python3.6 \ ci ninja-build -C ci test popd #builddir fedora-modularity-libmodulemd-357799c/.ci/ci-archlinux.sh000077500000000000000000000006261502446517500233430ustar00rootroot00000000000000#!/usr/bin/env bash SCRIPT_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )" pushd $SCRIPT_DIR source $SCRIPT_DIR/ci-common.inc set -e set -x # There is only one release of archlinux since it's a rolling release # distribution, so we can hard-code these values. mmd_run_docker_tests \ os=archlinux \ release=base \ repository=docker.io \ image=archlinux/base popd # $SCRIPT_DIR fedora-modularity-libmodulemd-357799c/.ci/ci-autoformat.sh000077500000000000000000000012131502446517500235200ustar00rootroot00000000000000#!/usr/bin/env bash SCRIPT_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )" pushd $SCRIPT_DIR source $SCRIPT_DIR/ci-common.inc set -e set -x os=fedora release=latest repository=quay.io image=fedora/fedora:${release} # Override the standard tests with auto-formatting mmd_run_docker_tests \ os=$os \ release=$release \ repository=$repository \ image=$image \ test_template="autoformat/Dockerfile.tmpl" \ test_image="libmodulemd-autoformat-$os:$release" \ oci_extra_args=" -e FORMAT_DEST_DIR=/modulemd-formatted --volume '${SCRIPT_DIR}/../modulemd:/modulemd-formatted:Z' " popd # $SCRIPT_DIR fedora-modularity-libmodulemd-357799c/.ci/ci-centos.sh000077500000000000000000000004531502446517500226370ustar00rootroot00000000000000#!/usr/bin/env bash SCRIPT_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )" pushd $SCRIPT_DIR source $SCRIPT_DIR/ci-common.inc set -e set -x release=${1:-7} repository=docker.io mmd_run_docker_tests \ os=centos \ release=$release \ repository=$repository popd # $SCRIPT_DIR fedora-modularity-libmodulemd-357799c/.ci/ci-common.inc000066400000000000000000000072331502446517500227730ustar00rootroot00000000000000#!/usr/bin/env bash set -x # Global variables to support finalize() MMD_OS= MMD_RELEASE= MMD_TARBALL_PATH= BUILDAH_PATH=$(which buildah) DOCKER_PATH=$(which docker) RETRY_CMD=$SCRIPT_DIR/retry-command.sh if [ x$BUILDAH_PATH == x ]; then if [ x$DOCKER_PATH == x ]; then >&2 echo "error: Neither docker nor podman available" exit 1 else MMD_BUILDAH="$RETRY_CMD sudo $DOCKER_PATH build" MMD_LAYERS_TRUE= MMD_LAYERS_FALSE= fi else MMD_BUILDAH="$RETRY_CMD $BUILDAH_PATH bud" MMD_LAYERS_TRUE="--layers=true" MMD_LAYERS_FALSE="--layers=false" fi PODMAN_PATH=$(which podman) if [ x$PODMAN_PATH == x ]; then MMD_OCI="sudo $DOCKER_PATH" else MMD_OCI="$PODMAN_PATH" fi function common_finalize { # If any specific test launcher needs to do its own cleanup as well, # it should set the EXIT trap and make sure to also call this function # internally. exitcode=$? rm -f $MMD_TARBALL_PATH \ $SCRIPT_DIR/$MMD_OS/Dockerfile.deps.$MMD_RELEASE \ $SCRIPT_DIR/$MMD_OS/Dockerfile.test.$MMD_RELEASE return $exitcode } trap common_finalize EXIT function mmd_setup_container { local os release repository image local deps_template deps_image local "${@}" if [ -z $SCRIPT_DIR ]; then >&2 echo "Programming error: \$SCRIPT_DIR must be set" exit 1 fi os=${os-fedora} release=${release-rawhide} repository=${repository-registry.fedoraproject.org} # Lower-case the os and release for the container registry MMD_OS=${os,,} MMD_RELEASE=${release,,} deps_template=${deps_template-$MMD_OS/Dockerfile.deps.tmpl} deps_image=${deps_image-libmodulemd-deps-$MMD_OS:$MMD_RELEASE} m4 -D__IMAGE__="$repository/$image" \ -D__OS__=$os \ -D__RELEASE__=$release \ $SCRIPT_DIR/${deps_template} \ > $SCRIPT_DIR/$MMD_OS/Dockerfile.deps.$MMD_RELEASE $MMD_BUILDAH $MMD_LAYERS_TRUE \ -f $SCRIPT_DIR/$MMD_OS/Dockerfile.deps.$MMD_RELEASE \ -t fedora-modularity/${deps_image} . } function mmd_run_docker_tests { local os release repository image local deps_template deps_image local test_template test_image local oci_extra_args local "${@}" os=${os-fedora} release=${release-rawhide} repository=${repository-registry.fedoraproject.org} # Lower-case the os and release for the container registry MMD_OS=${os,,} MMD_RELEASE=${release,,} image=${image-$MMD_OS:$MMD_RELEASE} deps_template=${deps_template-$MMD_OS/Dockerfile.deps.tmpl} test_template=${test_template-$MMD_OS/Dockerfile.tmpl} deps_image=${deps_image-libmodulemd-deps-$MMD_OS:$MMD_RELEASE} test_image=${test_image-libmodulemd-$MMD_OS:$MMD_RELEASE} # Create an archive of the current checkout MMD_TARBALL_PATH=`mktemp -p $SCRIPT_DIR tarball-XXXXXX.tar.bz2` TARBALL=`basename $MMD_TARBALL_PATH` pushd $SCRIPT_DIR/.. git ls-files |xargs tar cfj $MMD_TARBALL_PATH .git popd mmd_setup_container \ os=$os \ release=$release \ repository=$repository \ image=$image \ deps_template=$deps_template \ deps_image=$deps_image m4 -D__DEPS_IMAGE__="fedora-modularity/${deps_image}" \ -D__OS__=$os \ -D__RELEASE__=$release \ $SCRIPT_DIR/${test_template} \ > $SCRIPT_DIR/$MMD_OS/Dockerfile.test.$MMD_RELEASE $MMD_BUILDAH $MMD_LAYERS_FALSE \ -f $SCRIPT_DIR/$MMD_OS/Dockerfile.test.$MMD_RELEASE \ -t fedora-modularity/${test_image} \ --build-arg TARBALL=${TARBALL} . eval $MMD_OCI run \ ${oci_extra_args} \ --rm fedora-modularity/${test_image} } set +x fedora-modularity-libmodulemd-357799c/.ci/ci-coverity.sh000077500000000000000000000010061502446517500232030ustar00rootroot00000000000000#!/usr/bin/env bash SCRIPT_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )" pushd $SCRIPT_DIR source $SCRIPT_DIR/ci-common.inc set -e set -x os=centos release=stream9 repository=quay.io/centos # Override the standard tests with the Coverity scan mmd_run_docker_tests \ os=$os \ release=$release \ repository=$repository \ test_template="coverity/Dockerfile.tmpl" \ test_image="libmodulemd-coverity" \ oci_extra_args="-e COVERITY_SCAN_TOKEN=$COVERITY_SCAN_TOKEN" popd # $SCRIPT_DIR fedora-modularity-libmodulemd-357799c/.ci/ci-docs.sh000077500000000000000000000017231502446517500222750ustar00rootroot00000000000000#!/usr/bin/env bash SCRIPT_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )" pushd $SCRIPT_DIR source $SCRIPT_DIR/ci-common.inc set -e set -x modulemd_version=${1:-latest} os=fedora # glib-2.79.0 available since Fedora ≥ 40 changed a documentation format # references in libmodulemd documentation do not resolve to glib # documentation. Use older Fedora release to have an on-line documentation # with the hyperlinks. See # . #release=latest release=39 repository=quay.io image=fedora/fedora:${release} # Override the standard tests with the doc generation template mmd_run_docker_tests \ os=$os \ release=$release \ repository=$repository \ image=$image \ test_template="docs/Dockerfile.tmpl" \ test_image="libmodulemd-docs-$os:$release" \ oci_extra_args=" --env MODULEMD_VERSION=$modulemd_version --volume=$GITHUB_WORKSPACE:/builddir " popd # $SCRIPT_DIR fedora-modularity-libmodulemd-357799c/.ci/ci-fedora.sh000077500000000000000000000006351502446517500226060ustar00rootroot00000000000000#!/usr/bin/env bash SCRIPT_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )" pushd $SCRIPT_DIR source $SCRIPT_DIR/ci-common.inc set -e set -x release=${1:-rawhide} if [ $release = rawhide ]; then release=$($SCRIPT_DIR/get_rawhide_version.py) fi mmd_run_docker_tests \ os=fedora \ release=$release \ repository=quay.io \ image=fedora/fedora:$release-$(uname -m) popd # $SCRIPT_DIR fedora-modularity-libmodulemd-357799c/.ci/ci-launcher.sh000077500000000000000000000011201502446517500231350ustar00rootroot00000000000000#!/usr/bin/env bash set -e SOURCE_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )" arr=(${DISTRO:-Fedora rawhide}) os=${arr[0]:-Fedora} release=${arr[1]:-rawhide} case $os in Fedora) $SOURCE_DIR/ci-fedora.sh $release ;; CentOS) $SOURCE_DIR/ci-centos.sh $release ;; Archlinux) $SOURCE_DIR/ci-archlinux.sh ;; Mageia) $SOURCE_DIR/ci-mageia.sh $release ;; OpenMandriva) $SOURCE_DIR/ci-openmandriva.sh $release ;; openSUSE) $SOURCE_DIR/ci-opensuse.sh $release ;; *) echo "Unknown OS: $os" exit 1 ;; esac fedora-modularity-libmodulemd-357799c/.ci/ci-mageia.sh000077500000000000000000000004241502446517500225650ustar00rootroot00000000000000#!/usr/bin/env bash SCRIPT_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )" pushd $SCRIPT_DIR source $SCRIPT_DIR/ci-common.inc set -e set -x release=${1:-8} mmd_run_docker_tests \ os=mageia \ release=$release \ repository=docker.io popd # $SCRIPT_DIR fedora-modularity-libmodulemd-357799c/.ci/ci-openmandriva.sh000077500000000000000000000004521502446517500240260ustar00rootroot00000000000000#!/usr/bin/env bash SCRIPT_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )" cd $SCRIPT_DIR source $SCRIPT_DIR/ci-common.inc set -e set -x release=${1:-cooker} mmd_run_docker_tests \ os=openmandriva \ release=$release \ repository=docker.io \ image=openmandriva/$release fedora-modularity-libmodulemd-357799c/.ci/ci-opensuse.sh000077500000000000000000000005111502446517500232000ustar00rootroot00000000000000#!/usr/bin/env bash SCRIPT_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )" pushd $SCRIPT_DIR source $SCRIPT_DIR/ci-common.inc set -e set -x release=${1:-tumbleweed} mmd_run_docker_tests \ os=opensuse \ release=$release \ repository=registry.opensuse.org \ image=opensuse/$release popd # $SCRIPT_DIR fedora-modularity-libmodulemd-357799c/.ci/coverity/000077500000000000000000000000001502446517500222565ustar00rootroot00000000000000fedora-modularity-libmodulemd-357799c/.ci/coverity/Dockerfile.tmpl000066400000000000000000000006321502446517500252240ustar00rootroot00000000000000FROM __DEPS_IMAGE__ MAINTAINER Stephen Gallagher RUN yum -y --setopt=install_weak_deps=False --setopt=tsflags='' \ --nogpgcheck install \ rsync \ ruby \ rubygems \ "rubygem(json)" \ wget \ && yum -y clean all ARG TARBALL ADD $TARBALL /builddir/ RUN /builddir/.ci/coverity_prep.sh ENTRYPOINT /builddir/.ci/coverity/ci-tasks.sh fedora-modularity-libmodulemd-357799c/.ci/coverity/ci-tasks.sh000077500000000000000000000016201502446517500243320ustar00rootroot00000000000000#!/usr/bin/env bash #Exit on failures set -e set -x if [ -e /usr/lib/os-release ]; then source /usr/lib/os-release case "${ID-unknown} ${VERSION_ID-unknown}" in "centos 7") COMMON_MESON_ARGS="-Dpython_name=python3.6" ;; "centos "*) COMMON_MESON_ARGS="" ;; esac fi pushd /builddir/ meson --buildtype=debug \ $COMMON_MESON_ARGS \ coverity pushd coverity # The coverity scan script returns an error despite succeeding... TRAVIS_BRANCH="main" \ COVERITY_SCAN_PROJECT_NAME="${COVERITY_SCAN_PROJECT_NAME:-sgallagher/libmodulemd}" \ COVERITY_SCAN_NOTIFICATION_EMAIL="${COVERITY_SCAN_NOTIFICATION_EMAIL:-sgallagh@redhat.com}" \ COVERITY_SCAN_BUILD_COMMAND="${COVERITY_SCAN_BUILD_COMMAND:-ninja}" \ COVERITY_SCAN_BRANCH_PATTERN=${COVERITY_SCAN_BRANCH_PATTERN:-main} \ /usr/bin/travisci_build_coverity_scan.sh ||: popd #coverity popd #builddir fedora-modularity-libmodulemd-357799c/.ci/coverity_prep.sh000077500000000000000000000013531502446517500236450ustar00rootroot00000000000000#!/usr/bin/env bash set -x echo -n | openssl s_client -connect scan.coverity.com:443 | sed -ne '/-BEGIN CERTIFICATE-/,/-END CERTIFICATE-/p' | sudo tee -a /etc/ssl/certs/ca- curl -s -L https://entrust.com/root-certificates/entrust_l1k.cer | tee -a /etc/pki/ca-trust/source/anchors/entrust_l1k.cer sudo update-ca-trust curl -s https://scan.coverity.com/scripts/travisci_build_coverity_scan.sh -o /usr/bin/travisci_build_coverity_scan.sh if [ "$(file -b --mime-type /usr/bin/travisci_build_coverity_scan.sh)" == "text/x-shellscript" ]; then chmod a+x /usr/bin/travisci_build_coverity_scan.sh else echo "Warning: Coverity not detected!" # Disable the scanning tool ln -sf /usr/bin/true /usr/bin/travisci_build_coverity_scan.sh fi fedora-modularity-libmodulemd-357799c/.ci/docs/000077500000000000000000000000001502446517500213425ustar00rootroot00000000000000fedora-modularity-libmodulemd-357799c/.ci/docs/Dockerfile.tmpl000066400000000000000000000003731502446517500243120ustar00rootroot00000000000000FROM __DEPS_IMAGE__ MAINTAINER Stephen Gallagher RUN dnf -y --setopt=install_weak_deps=False --nogpgcheck install rsync \ && dnf -y clean all ARG TARBALL ADD $TARBALL /builddir/ ENTRYPOINT /builddir/.ci/docs/ci-tasks.sh fedora-modularity-libmodulemd-357799c/.ci/docs/ci-tasks.sh000077500000000000000000000014631502446517500234230ustar00rootroot00000000000000#!/usr/bin/env bash #Exit on failures set -e set -x RETRY_CMD=/builddir/.ci/retry-command.sh pushd /builddir/ # Build the code under GCC and run documentation generation meson --buildtype=debug \ doc-generation set +e ninja -C doc-generation modulemd-2.0-doc err=$? if [ $err != 0 ]; then cat doc-generation/meson-logs/testlog.txt exit $err fi set -e # Fix external references for publishing on the web pushd doc-generation/modulemd/html /builddir/contrib/doc-tools/fix-xref.sh popd MODULEMD_VERSION=${MODULEMD_VERSION:-latest} mkdir -p /builddir/fedora-modularity.github.io/libmodulemd/$MODULEMD_VERSION rsync -avh --delete-before --no-perms --omit-dir-times \ /builddir/doc-generation/modulemd/html/* \ /builddir/fedora-modularity.github.io/libmodulemd/$MODULEMD_VERSION popd #builddir fedora-modularity-libmodulemd-357799c/.ci/fedora/000077500000000000000000000000001502446517500216525ustar00rootroot00000000000000fedora-modularity-libmodulemd-357799c/.ci/fedora/Dockerfile.deps.tmpl000066400000000000000000000002121502446517500255440ustar00rootroot00000000000000FROM __IMAGE__ MAINTAINER Stephen Gallagher COPY ./fedora/get_fedora_deps.sh /root RUN /root/get_fedora_deps.sh fedora-modularity-libmodulemd-357799c/.ci/fedora/Dockerfile.tmpl000066400000000000000000000002331502446517500246150ustar00rootroot00000000000000FROM __DEPS_IMAGE__ MAINTAINER Stephen Gallagher ARG TARBALL ADD $TARBALL /builddir/ ENTRYPOINT /builddir/.ci/fedora/ci-tasks.sh fedora-modularity-libmodulemd-357799c/.ci/fedora/ci-tasks.sh000077500000000000000000000046061502446517500237350ustar00rootroot00000000000000#!/usr/bin/env bash #Exit on failures set -e set -x PROCESSORS=$(/usr/bin/getconf _NPROCESSORS_ONLN) RETRY_CMD=/builddir/.ci/retry-command.sh WITH_RPM_TESTS=${WITH_RPM_TESTS:-true} override_dir=`python3 -c 'import gi; print(gi._overridesdir)'` pushd /builddir/ # Work-around ldd bug in rawhide CIs sed -i -e 's/test -r/test -f/g' -e 's/test -x/test -f/g' /bin/ldd # Build the code under GCC and run standard tests meson --buildtype=debugoptimized \ ci meson test --suite formatters \ -C ci \ --num-processes=$PROCESSORS \ --print-errorlogs \ -t 5 meson test --suite ci \ -C ci \ --num-processes=$PROCESSORS \ --print-errorlogs \ -t 5 # Disable the verbose tests and run the supported tests through valgrind meson --buildtype=debugoptimized \ -Dverbose_tests=false \ ci-valgrind meson test --suite ci_valgrind \ --wrap=/builddir/contrib/valgrind/valgrind_wrapper.sh \ -C ci-valgrind \ --num-processes=$PROCESSORS \ --print-errorlogs \ -t 10 # Test the code with clang-analyzer meson --buildtype=debug \ -Dskip_introspection=true \ -Dwith_py3=false \ ci_scanbuild pushd ci_scanbuild /builddir/.ci/scanbuild.sh popd #ci_scanbuild if [ $WITH_RPM_TESTS != true ]; then exit 0 fi # Always install and run the installed RPM tests last so we don't pollute the # testing environment above. arch=$(uname -m) mkdir -p rpmbuild/RPMS/ pushd rpmbuild/RPMS/ packit --debug build locally ../.. createrepo_c $arch $RETRY_CMD dnf -y install --nogpgcheck \ --allowerasing \ --repofrompath libmodulemd-ci,$arch \ $arch/python3-libmodulemd*.rpm \ $arch/libmodulemd-devel*.rpm # Also install the python2-libmodulemd if it was built for this release # the ||: at the end instructs bash to consider this a pass either way. dnf -y install --nogpgcheck \ --allowerasing \ --repofrompath libmodulemd-ci,$arch \ $arch/python2-libmodulemd*.rpm ||: popd #build_rpm meson --buildtype=release \ -Dtest_installed_lib=true \ installed_lib_tests # Run the tests against the installed RPMs meson test --suite ci \ -C installed_lib_tests \ --num-processes=$PROCESSORS \ --print-errorlogs \ -t 5 popd #builddir fedora-modularity-libmodulemd-357799c/.ci/fedora/get_fedora_deps.sh000077500000000000000000000024241502446517500253250ustar00rootroot00000000000000#!/usr/bin/env bash set -e set -x SCRIPT_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )" pushd $SCRIPT_DIR # Work around a DNF5 bug with resetting tsflags # . sed -i -e 's/\//' /etc/dnf/dnf.conf dnf -y --setopt=install_weak_deps=False --setopt=tsflags='' \ --nogpgcheck --quiet install --skip-broken \ python3-black \ clang \ clang-analyzer \ clang-tools-extra \ createrepo_c \ "libmodulemd >= 2.3" \ curl \ elinks \ gcc \ gcc-c++ \ git-core \ glib2-devel \ glib2-doc \ gobject-introspection-devel \ gtk-doc \ jq \ libyaml-devel \ meson \ ninja-build \ openssl \ packit \ pkgconf \ popt-devel \ python3-autopep8 \ python3-devel \ python3-GitPython \ python3-gobject-base \ python3-koji \ python3-pycodestyle \ python3-rpm-macros \ redhat-rpm-config \ rpm-build \ rpm-devel \ rpmdevtools \ ruby \ "rubygem(json)" \ rubygems \ sudo \ valgrind \ wget dnf -y clean all ln -sf /builddir/bindings/python/gi/overrides/Modulemd.py $(python3 -c "import gi; import os; os.makedirs(gi._overridesdir, exist_ok=True); print(gi._overridesdir)")/Modulemd.py popd fedora-modularity-libmodulemd-357799c/.ci/get_rawhide_version.py000077500000000000000000000023511502446517500250170ustar00rootroot00000000000000#!/usr/bin/env python3 # -*- coding: utf-8 -*- # This file is part of libmodulemd # Copyright (C) 2020 Stephen Gallagher # # Fedora-License-Identifier: MIT # SPDX-2.0-License-Identifier: MIT # SPDX-3.0-License-Identifier: MIT # # This program is free software. # For more information on the license, see COPYING. # For more information on free software, see # . import xmlrpc.client import time KOJI_URL = "https://koji.fedoraproject.org/kojihub" def get_fedora_rawhide_version(session): # Koji sometimes disconnects for no apparent reason. Retry up to 5 # times before failing. for attempt in range(5): try: build_targets = session.getBuildTargets("rawhide") except requests.exceptions.ConnectionError: logging.warning( "Connection lost while retrieving rawhide branch, retrying..." ) else: # Succeeded this time, so break out of the loop break time.sleep(3) return build_targets[0]["build_tag_name"].partition("-build")[0][1:] def main(): session = xmlrpc.client.ServerProxy(KOJI_URL) print(get_fedora_rawhide_version(session)) if __name__ == "__main__": main() fedora-modularity-libmodulemd-357799c/.ci/mageia/000077500000000000000000000000001502446517500216355ustar00rootroot00000000000000fedora-modularity-libmodulemd-357799c/.ci/mageia/Dockerfile.deps.tmpl000077500000000000000000000017531502446517500255450ustar00rootroot00000000000000FROM __IMAGE__ MAINTAINER Stephen Gallagher RUN dnf -y --setopt=install_weak_deps=False --setopt=tsflags='' install \ clang \ clang-analyzer \ createrepo_c \ curl \ elinks \ gcc \ gcc-c++ \ git-core \ glib2-devel \ /usr/share/gtk-doc/html/glib/index.html \ gobject-introspection-devel \ gtk-doc \ jq \ libyaml-devel \ meson \ ninja-build \ openssl \ pkgconf \ popt-devel \ python3-six \ python3-autopep8 \ python3-devel \ python3-gitpython \ python3-gobject3 \ python3-pycodestyle \ python3-rpm-macros \ rpm-mageia-setup-build \ rpm-build \ rpm-devel \ rpmdevtools \ ruby \ "rubygem(json)" \ rubygems \ sudo \ valgrind \ wget \ && dnf -y clean all RUN ln -sf /builddir/bindings/python/gi/overrides/Modulemd.py $(python3 -c "import gi; import os; os.makedirs(gi._overridesdir, exist_ok=True); print(gi._overridesdir)")/Modulemd.py fedora-modularity-libmodulemd-357799c/.ci/mageia/Dockerfile.tmpl000077500000000000000000000002331502446517500246030ustar00rootroot00000000000000FROM __DEPS_IMAGE__ MAINTAINER Stephen Gallagher ARG TARBALL ADD $TARBALL /builddir/ ENTRYPOINT /builddir/.ci/mageia/ci-tasks.sh fedora-modularity-libmodulemd-357799c/.ci/mageia/ci-tasks.sh000077500000000000000000000015651502446517500237210ustar00rootroot00000000000000#!/usr/bin/env bash #Exit on failures set -e set -x PROCESSORS=$(/usr/bin/getconf _NPROCESSORS_ONLN) pushd /builddir/ # Build the code under GCC and run standard tests meson --buildtype=debugoptimized \ ci meson test --suite ci \ -C ci \ --num-processes=$PROCESSORS \ --print-errorlogs \ -t 5 meson --buildtype=debugoptimized \ -Dverbose_tests=false \ ci-valgrind meson test --suite ci_valgrind \ --wrap=/builddir/contrib/valgrind/valgrind_wrapper.sh \ -C ci-valgrind \ --num-processes=$PROCESSORS \ --print-errorlogs \ -t 10 # Test the code with clang-analyzer meson --buildtype=debug \ -Dskip_introspection=true \ -Dwith_py3=false \ $COMMON_MESON_ARGS \ ci_scanbuild pushd ci_scanbuild /builddir/.ci/scanbuild.sh popd #ci_scanbuild fedora-modularity-libmodulemd-357799c/.ci/openmandriva/000077500000000000000000000000001502446517500230755ustar00rootroot00000000000000fedora-modularity-libmodulemd-357799c/.ci/openmandriva/Dockerfile.deps.tmpl000066400000000000000000000012711502446517500267750ustar00rootroot00000000000000FROM __IMAGE__ MAINTAINER Tomasz Paweł Gajc RUN dnf -y --setopt=install_weak_deps=False --setopt=tsflags='' install \ clang \ clang-analyzer \ cmake \ jq \ meson \ ninja \ rpmdevtools \ sudo \ valgrind \ wget \ task-devel \ 'pkgconfig(glib-2.0)' \ 'pkgconfig(gobject-introspection-1.0)' \ 'pkgconfig(rpm)' \ 'pkgconfig(yaml-0.1)' \ 'python3dist(autopep8)' \ 'python3dist(pygobject)' \ git-core \ && dnf -y clean all RUN ln -sf /builddir/bindings/python/gi/overrides/Modulemd.py $(python3 -c "import gi; import os; os.makedirs(gi._overridesdir, exist_ok=True); print(gi._overridesdir)")/Modulemd.py fedora-modularity-libmodulemd-357799c/.ci/openmandriva/Dockerfile.tmpl000066400000000000000000000002371502446517500260440ustar00rootroot00000000000000FROM __DEPS_IMAGE__ MAINTAINER Tomasz Paweł Gajc ARG TARBALL ADD $TARBALL /builddir/ ENTRYPOINT /builddir/.ci/openmandriva/ci-tasks.sh fedora-modularity-libmodulemd-357799c/.ci/openmandriva/ci-tasks.sh000077500000000000000000000021571502446517500251570ustar00rootroot00000000000000#!/usr/bin/env bash #Exit on failures set -e set -x PROCESSORS=$(/usr/bin/getconf _NPROCESSORS_ONLN) COMMON_MESON_ARGS="-Dwith_docs=false" pushd /builddir/ # Build the code under LLVM/clang and run standard tests CC=clang CXX=clang++ meson --buildtype=debugoptimized \ $COMMON_MESON_ARGS \ ci meson test --suite ci \ -C ci \ --num-processes=$PROCESSORS \ --print-errorlogs \ -t 5 # Disable the verbose tests and run the supported tests through valgrind CC=clang CXX=clang++ meson --buildtype=debugoptimized \ -Dverbose_tests=false \ $COMMON_MESON_ARGS \ ci-valgrind meson test --suite ci_valgrind \ --wrap=/builddir/contrib/valgrind/valgrind_wrapper.sh \ -C ci-valgrind \ --num-processes=$PROCESSORS \ --print-errorlogs \ -t 10 # Test the code with clang-analyzer CC=clang CXX=clang++ meson --buildtype=debug \ -Dskip_introspection=true \ -Dwith_py3=false \ $COMMON_MESON_ARGS \ ci_scanbuild pushd ci_scanbuild /builddir/.ci/scanbuild.sh popd #ci_scanbuild fedora-modularity-libmodulemd-357799c/.ci/opensuse/000077500000000000000000000000001502446517500222535ustar00rootroot00000000000000fedora-modularity-libmodulemd-357799c/.ci/opensuse/Dockerfile.deps.tmpl000066400000000000000000000015661502446517500261620ustar00rootroot00000000000000FROM __IMAGE__ MAINTAINER Stephen Gallagher RUN sed -i /etc/zypp/zypp.conf \ -e "s/rpm.install.excludedocs = yes/rpm.install.excludedocs = no/" RUN zypper install --no-confirm --no-recommends --capability \ clang \ clang-tools \ createrepo_c \ elinks \ gcc \ gcc-c++ \ git-core \ glib2-devel \ glib2-doc \ gobject-introspection-devel \ gtk-doc \ jq \ libyaml-devel \ meson \ ninja \ pkgconf \ python3-autopep8 \ python3-devel \ python3-GitPython \ python3-gobject \ python3-pycodestyle \ python-rpm-macros \ rpm-build \ rpm-devel \ rpmdevtools \ sudo \ valgrind RUN ln -sf /builddir/bindings/python/gi/overrides/Modulemd.py $(python3 -c "import gi; import os; os.makedirs(gi._overridesdir, exist_ok=True); print(gi._overridesdir)")/Modulemd.py fedora-modularity-libmodulemd-357799c/.ci/opensuse/Dockerfile.tmpl000066400000000000000000000002351502446517500252200ustar00rootroot00000000000000FROM __DEPS_IMAGE__ MAINTAINER Stephen Gallagher ARG TARBALL ADD $TARBALL /builddir/ ENTRYPOINT /builddir/.ci/opensuse/ci-tasks.sh fedora-modularity-libmodulemd-357799c/.ci/opensuse/ci-tasks.sh000077500000000000000000000004471502446517500243350ustar00rootroot00000000000000#!/usr/bin/env bash #Exit on failures set -e set -x COMMON_MESON_ARGS="-Dpython_name=python3" pushd /builddir/ # Build the code under GCC and run standard tests meson --buildtype=debugoptimized \ $COMMON_MESON_ARGS \ ci MMD_SKIP_VALGRIND=TRUE ninja -C ci test popd #builddir fedora-modularity-libmodulemd-357799c/.ci/retry-command.sh000077500000000000000000000014741502446517500235400ustar00rootroot00000000000000#!/usr/bin/env bash function retry_command { local usage="Usage: ${FUNCNAME[0]} [-b backoff-factor] [-d delay] [-n numtries]" local OPTIND OPTION local backoff_factor=2 delay=3 numtries=4 while getopts ":b:d:n:" OPTION; do case "${OPTION}" in b) backoff_factor=${OPTARG} ;; d) delay=${OPTARG} ;; n) numtries=${OPTARG} ;; *) echo "$usage" 1>&2 return 1 ;; esac done shift $((OPTIND-1)) exitcode=0 while (( numtries > 0 )) ; do eval "$@" exitcode=$? (( exitcode == 0 )) && break (( --numtries > 0 )) && sleep $delay (( delay *= backoff_factor )) done return $exitcode } retry_command "$@" fedora-modularity-libmodulemd-357799c/.ci/scanbuild.sh000077500000000000000000000007621502446517500227220ustar00rootroot00000000000000#!/usr/bin/env bash # This file is part of libmodulemd # Copyright (C) 2018 Stephen Gallagher # # Fedora-License-Identifier: MIT # SPDX-2.0-License-Identifier: MIT # SPDX-3.0-License-Identifier: MIT # # This program is free software. # For more information on the license, see COPYING. # For more information on free software, see # . ninja scan-build if [ $? -eq 0 ]; then exit 0 else elinks -dump meson-logs/scanbuild/*/index.html exit 1 fi fedora-modularity-libmodulemd-357799c/.clang-format000066400000000000000000000030531502446517500223150ustar00rootroot00000000000000--- # C format Language: Cpp BasedOnStyle: WebKit AlignAfterOpenBracket: Align AlignConsecutiveAssignments: false AlignConsecutiveDeclarations: false AlignEscapedNewlinesLeft: false AlignOperands: true AlignTrailingComments: false AllowAllParametersOfDeclarationOnNextLine: true AllowShortBlocksOnASingleLine: false AllowShortCaseLabelsOnASingleLine: true AllowShortFunctionsOnASingleLine: None AllowShortIfStatementsOnASingleLine: false AllowShortLoopsOnASingleLine: false AlwaysBreakAfterReturnType: All AlwaysBreakBeforeMultilineStrings: true BinPackArguments: false BinPackParameters: false BreakBeforeBinaryOperators: None BreakBeforeBraces: GNU BreakBeforeTernaryOperators: false ColumnLimit: 79 CommentPragmas: '^ IWYU pragma:' ContinuationIndentWidth: 2 DerivePointerAlignment: false DisableFormat: false ExperimentalAutoDetectBinPacking: false IndentCaseLabels: false IndentWidth: 2 IndentWrappedFunctionNames: false KeepEmptyLinesAtTheStartOfBlocks: false MacroBlockBegin: '' MacroBlockEnd: '' MaxEmptyLinesToKeep: 2 PenaltyBreakBeforeFirstCallParameter: 19 PenaltyBreakComment: 300 PenaltyBreakFirstLessLess: 120 PenaltyBreakString: 1000 PenaltyExcessCharacter: 1000000 PointerAlignment: Right ReflowComments: false SortIncludes: false SpaceAfterCStyleCast: false SpaceBeforeAssignmentOperators: true SpaceBeforeParens: Always SpaceInEmptyParentheses: false SpacesBeforeTrailingComments: 1 SpacesInContainerLiterals: true SpacesInCStyleCastParentheses: false SpacesInParentheses: false SpacesInSquareBrackets: false Standard: Cpp11 TabWidth: 4 UseTab: Never ... fedora-modularity-libmodulemd-357799c/.github/000077500000000000000000000000001502446517500213015ustar00rootroot00000000000000fedora-modularity-libmodulemd-357799c/.github/workflows/000077500000000000000000000000001502446517500233365ustar00rootroot00000000000000fedora-modularity-libmodulemd-357799c/.github/workflows/ci.yaml000066400000000000000000000337071502446517500246270ustar00rootroot00000000000000name: Continuous Integration on: [push, pull_request] jobs: get_fedora_releases: name: Get Fedora Releases runs-on: ubuntu-latest steps: - name: Query Fedora id: releases uses: sgallagher/get-fedora-releases-action@v1 outputs: stable: ${{ steps.releases.outputs.stable }} development: ${{ steps.releases.outputs.development }} unit_tests_fedora_stable: name: Unit Tests (Stable Fedora) needs: get_fedora_releases runs-on: ubuntu-latest continue-on-error: false strategy: matrix: release: ${{ fromJson(needs.get_fedora_releases.outputs.stable) }} container: image: quay.io/fedora/fedora:${{ matrix.release }}-x86_64 steps: - name: Checkout code uses: actions/checkout@v4 - name: Install dependencies run: $GITHUB_WORKSPACE/.ci/fedora/get_fedora_deps.sh - name: Set up the build directory run: meson setup --buildtype=debugoptimized ci $GITHUB_WORKSPACE - name: Compile the code run: ninja -C ci - name: Run CI tests run: meson test -C ci --suite ci --print-errorlogs -t 5 - name: Set up the valgrind build directory run: meson setup --buildtype=debugoptimized -Dverbose_tests=false -Drpmio=disabled ci_valgrind $GITHUB_WORKSPACE - name: Compile the code run: ninja -C ci_valgrind - name: Run valgrind tests run: meson test -C ci_valgrind --suite ci_valgrind --print-errorlogs -t 10 --wrap=$GITHUB_WORKSPACE/contrib/valgrind/valgrind_wrapper.sh - name: Run clang static analysis tests run: | meson setup --buildtype=debug -Dskip_introspection=true -Dwith_py3=false ci_scanbuild ninja -C ci_scanbuild scan-build; if [ $? -ne 0 ]; then elinks -dump ci_scanbuild/meson-logs/scanbuild/*/index.html; fi rpm_tests: name: Installed RPM Tests (Stable Fedora) needs: get_fedora_releases runs-on: ubuntu-latest continue-on-error: false strategy: matrix: arch: - x86_64 release: ${{ fromJson(needs.get_fedora_releases.outputs.stable) }} container: image: quay.io/fedora/fedora:${{ matrix.release }}-x86_64 steps: - name: Install git run: dnf -y install git-core - name: Checkout code uses: actions/checkout@v4 - name: Install dependencies run: $GITHUB_WORKSPACE/.ci/fedora/get_fedora_deps.sh - name: Set up the RPM output directory run: mkdir -p $GITHUB_WORKSPACE/rpmbuild/RPMS - name: Build the RPM repository working-directory: ${{github.workspace}}/rpmbuild/RPMS run: | git config --global --add safe.directory "$GITHUB_WORKSPACE" packit --debug build locally ../.. createrepo_c x86_64 - name: Install the packages working-directory: ${{github.workspace}}/rpmbuild/RPMS run: $GITHUB_WORKSPACE/.ci/retry-command.sh dnf -y install --nogpgcheck --allowerasing --repofrompath libmodulemd-ci,x86_64 x86_64/python3-libmodulemd*.rpm x86_64/libmodulemd-devel*.rpm - name: Set up the build directory run: meson --buildtype=release -Dtest_installed_lib=true installed_lib_tests $GITHUB_WORKSPACE - name: Compile the code run: ninja -C installed_lib_tests - name: Run tests on the installed RPMs run: meson test --suite ci -C installed_lib_tests --print-errorlogs -t 5 unit_tests_fedora_devel: name: Unit Tests (Devel Fedora) needs: get_fedora_releases runs-on: ubuntu-latest continue-on-error: true strategy: matrix: release: ${{ fromJson(needs.get_fedora_releases.outputs.development) }} container: image: quay.io/fedora/fedora:${{ matrix.release }}-x86_64 steps: - name: Checkout code uses: actions/checkout@v4 - name: Install dependencies run: $GITHUB_WORKSPACE/.ci/fedora/get_fedora_deps.sh - name: Set up the build directory run: meson setup --buildtype=debugoptimized ci $GITHUB_WORKSPACE - name: Compile the code run: ninja -C ci - name: Run CI tests run: meson test -C ci --suite ci --print-errorlogs -t 5 - name: Set up the valgrind build directory run: meson setup --buildtype=debugoptimized -Dverbose_tests=false ci_valgrind $GITHUB_WORKSPACE - name: Compile the code run: ninja -C ci_valgrind - name: Run valgrind tests run: meson test -C ci_valgrind --suite ci_valgrind --print-errorlogs -t 10 --wrap=$GITHUB_WORKSPACE/contrib/valgrind/valgrind_wrapper.sh - name: Run clang static analysis tests run: | meson setup --buildtype=debug -Dskip_introspection=true -Dwith_py3=false ci_scanbuild ninja -C ci_scanbuild scan-build; if [ $? -ne 0 ]; then elinks -dump ci_scanbuild/meson-logs/scanbuild/*/index.html; fi rpm_tests_devel: name: Installed RPM Tests (Devel Fedora) needs: get_fedora_releases runs-on: ubuntu-latest continue-on-error: true strategy: matrix: arch: - x86_64 release: ${{ fromJson(needs.get_fedora_releases.outputs.development) }} container: image: quay.io/fedora/fedora:${{ matrix.release }}-x86_64 steps: - name: Install git run: dnf -y install git-core - name: Checkout code uses: actions/checkout@v4 - name: Install dependencies run: $GITHUB_WORKSPACE/.ci/fedora/get_fedora_deps.sh - name: Set up the RPM output directory run: mkdir -p $GITHUB_WORKSPACE/rpmbuild/RPMS - name: Build the RPM repository working-directory: ${{github.workspace}}/rpmbuild/RPMS run: | git config --global --add safe.directory "$GITHUB_WORKSPACE" packit --debug build locally ../.. createrepo_c x86_64 - name: Install the packages working-directory: ${{github.workspace}}/rpmbuild/RPMS run: $GITHUB_WORKSPACE/.ci/retry-command.sh dnf -y install --nogpgcheck --allowerasing --repofrompath libmodulemd-ci,x86_64 x86_64/python3-libmodulemd*.rpm x86_64/libmodulemd-devel*.rpm - name: Set up the build directory run: meson --buildtype=release -Dtest_installed_lib=true installed_lib_tests $GITHUB_WORKSPACE - name: Compile the code run: ninja -C installed_lib_tests - name: Run tests on the installed RPMs run: meson test --suite ci -C installed_lib_tests --print-errorlogs -t 5 archlinux: name: Arch Linux runs-on: ubuntu-latest continue-on-error: true container: image: docker.io/library/archlinux:base steps: - name: Disable excluding documenation in pacman configuration run: sed -i -e '\| usr/share/gtk-doc/|d' -e '\| usr/share/doc/|d' /etc/pacman.conf - name: Install dependencies run: pacman -Syu --needed --noconfirm base-devel file git glib2 glib2-devel glib2-docs gobject-introspection gtk-doc jq libyaml meson python-gobject python-six valgrind - name: Checkout code uses: actions/checkout@v4 - name: Set up the build directory run: meson setup --buildtype=debugoptimized -Drpmio=disabled ci $GITHUB_WORKSPACE - name: Compile the code run: ninja -C ci - name: Run CI tests run: meson test -C ci --suite ci --print-errorlogs -t 5 - name: Set up the valgrind build directory run: meson setup --buildtype=debugoptimized -Dverbose_tests=false -Drpmio=disabled ci_valgrind $GITHUB_WORKSPACE - name: Compile the code run: ninja -C ci_valgrind - name: Run valgrind tests # Run profile scripts to set debuginfo environment variable, # shell: bash --login -eo pipefail {0} run: meson test -C ci_valgrind --suite ci_valgrind --print-errorlogs -t 10 --wrap=$GITHUB_WORKSPACE/contrib/valgrind/valgrind_wrapper.sh mageia_8: name: Mageia 8 runs-on: ubuntu-latest continue-on-error: true container: image: docker.io/library/mageia:8 steps: - name: Install dependencies run: dnf -y --setopt=install_weak_deps=False --setopt=tsflags='' install clang clang-analyzer createrepo_c curl elinks gcc gcc-c++ git-core glib2-devel /usr/share/gtk-doc/html/glib/index.html gobject-introspection-devel gtk-doc jq libyaml-devel meson ninja-build openssl pkgconf popt-devel python3-six python3-autopep8 python3-devel python3-gitpython python3-gobject3 python3-pycodestyle python3-rpm-macros rpm-mageia-setup-build rpm-build rpm-devel rpmdevtools ruby "rubygem(json)" rubygems sudo valgrind wget - name: Checkout code uses: actions/checkout@v4 - name: Set up the build directory run: meson setup --buildtype=debugoptimized ci $GITHUB_WORKSPACE - name: Compile the code run: ninja -C ci - name: Run CI tests run: meson test -C ci --suite ci --print-errorlogs -t 5 - name: Set up the valgrind build directory run: meson setup --buildtype=debugoptimized -Dverbose_tests=false ci_valgrind $GITHUB_WORKSPACE - name: Compile the code run: ninja -C ci_valgrind - name: Run valgrind tests run: meson test -C ci_valgrind --suite ci_valgrind --print-errorlogs -t 10 --wrap=$GITHUB_WORKSPACE/contrib/valgrind/valgrind_wrapper.sh opensuse_tw: name: openSUSE Tumbleweed runs-on: ubuntu-latest continue-on-error: true container: image: registry.opensuse.org/opensuse/tumbleweed steps: - name: Enable docs in container run: sed -i /etc/zypp/zypp.conf -e "s/rpm.install.excludedocs = yes/rpm.install.excludedocs = no/" - name: Install dependencies run: zypper install --no-confirm --no-recommends --capability clang clang-tools createrepo_c elinks gcc gcc-c++ git-core glib2-devel glib2-doc gobject-introspection-devel gtk-doc jq libyaml-devel meson ninja pkgconf python3-autopep8 python3-devel python3-GitPython python3-gobject python3-pycodestyle python-rpm-macros rpm-build rpm-devel rpmdevtools sudo valgrind - name: Checkout code uses: actions/checkout@v4 - name: Set up the build directory run: meson setup --buildtype=debugoptimized ci $GITHUB_WORKSPACE - name: Compile the code run: ninja -C ci - name: Run CI tests run: meson test -C ci --suite ci --print-errorlogs -t 5 - name: Set up the valgrind build directory run: meson setup --buildtype=debugoptimized -Dverbose_tests=false ci_valgrind $GITHUB_WORKSPACE - name: Compile the code run: ninja -C ci_valgrind - name: Run valgrind tests run: meson test -C ci_valgrind --suite ci_valgrind --print-errorlogs -t 10 --wrap=$GITHUB_WORKSPACE/contrib/valgrind/valgrind_wrapper.sh mandriva: name: OpenMandriva Cooker runs-on: ubuntu-latest continue-on-error: true container: image: docker.io/openmandriva/cooker outputs: meson_version: ${{ steps.scanbuild.outputs.available }} steps: - name: Install Dependencies run: dnf -y --setopt=install_weak_deps=False --setopt=tsflags='' install clang clang-analyzer cmake jq meson ninja rpmdevtools sudo valgrind wget task-devel 'pkgconfig(glib-2.0)' 'pkgconfig(gobject-introspection-1.0)' 'pkgconfig(yaml-0.1)' 'python3dist(autopep8)' 'python3dist(pygobject)' 'pkgconfig(rpm)' git-core - name: Checkout code uses: actions/checkout@v4 - name: Set up the build directory env: CC: clang CXX: clang++ run: meson setup --buildtype=debugoptimized -Dwith_docs=false ci $GITHUB_WORKSPACE - name: Compile the code run: ninja -C ci - name: Run CI tests run: meson test -C ci --suite ci --print-errorlogs -t 5 # Do not run "ninja scan-build" on this platform because glib2.0 # HTML documentation does not exist and -Dwith_docs=false is needed. # The internal scan-build target ignores build options # and the build would # fail. fedora-modularity-libmodulemd-357799c/.github/workflows/formatters.yaml000066400000000000000000000014001502446517500264030ustar00rootroot00000000000000name: Automatic Code Formatters on: push jobs: autoformat: name: Auto-format code runs-on: ubuntu-latest steps: - name: Checkout code uses: actions/checkout@v4 - name: Install formatters run: | sudo apt-get update sudo apt-get install clang-format black - name: Format code run: | clang-format -i --verbose $(find . -name "*.[ch]") black --target-version py36 --verbose --line-length 79 . - name: Commit changes uses: EndBug/add-and-commit@v9 with: author_name: Libmodulemd CI author_email: github-actions@github.com message: 'Code auto-formatting' add: -u commit: --signoff push: true fedora-modularity-libmodulemd-357799c/.github/workflows/release.yaml000066400000000000000000000022671502446517500256510ustar00rootroot00000000000000name: Release Tasks on: release: types: [published] jobs: docs: name: Publish Documentation runs-on: ubuntu-latest continue-on-error: false if: github.repository == 'fedora-modularity/libmodulemd' steps: - name: Checkout code repo uses: actions/checkout@v4 - name: Checkout documentation repo uses: actions/checkout@v4 with: repository: fedora-modularity/fedora-modularity.github.io ref: main path: fedora-modularity.github.io token: ${{ secrets.DOC_TOKEN }} - name: Get release version run: | echo "version=$(./get_version.sh)" >> $GITHUB_ENV - name: Generate documentation run: | ./.ci/ci-docs.sh $version - name: Commit documentation uses: EndBug/add-and-commit@v9 with: new_branch: main token: ${{ secrets.DOC_TOKEN }} cwd: fedora-modularity.github.io author_name: Libmodulemd CI author_email: github-actions@github.com message: libmodulemd docs for ${{ env.version }} add: libmodulemd/${{ env.version }} commit: --signoff push: true fedora-modularity-libmodulemd-357799c/.github/workflows/upstreamed.yaml000066400000000000000000000026451502446517500264020ustar00rootroot00000000000000name: Upstreamed on: push: branches: - main jobs: static_analysis: name: Static Analysis runs-on: ubuntu-latest if: github.repository == 'fedora-modularity/libmodulemd' steps: - name: Checkout code uses: actions/checkout@v4 - name: Coverity Scan env: COVERITY_SCAN_TOKEN: ${{ secrets.COVERITY_TOKEN }} run: | ./.ci/ci-coverity.sh docs: name: Publish Documentation runs-on: ubuntu-latest continue-on-error: false if: github.repository == 'fedora-modularity/libmodulemd' steps: - name: Checkout code repo uses: actions/checkout@v4 - name: Checkout documentation repo uses: actions/checkout@v4 with: repository: fedora-modularity/fedora-modularity.github.io ref: main path: fedora-modularity.github.io token: ${{ secrets.DOC_TOKEN }} - name: Generate documentation run: | ./.ci/ci-docs.sh - name: Commit documentation uses: EndBug/add-and-commit@v9 with: new_branch: main github_token: ${{ secrets.DOC_TOKEN }} cwd: fedora-modularity.github.io author_name: Libmodulemd CI author_email: github-actions@github.com message: Updating libmodulemd docs for ${{ github.sha }} add: libmodulemd/latest commit: --signoff push: true fedora-modularity-libmodulemd-357799c/.gitignore000066400000000000000000000020051502446517500217260ustar00rootroot00000000000000*.o *.py[co] .deps /**/*.swp /*.bak /*.gcda /*.gcno /*.o /*.orig /*.rej /*.tab.c /*~ __pycache__/ /.*.sw[nop] /.dirstamp /.gitignore /ChangeLog /GPATH /GRTAGS /GSYMS /GTAGS /ID /INSTALL /m4 /Makefile /Makefile.in /TAGS /aclocal.m4 /autom4te.cache /build-aux /config /config.cache /config.h /config.h.in /config.log /config.lt /config.status /config.status.lineno /configure /configure.lineno /gtk-doc.m4 /gtk-doc.make /intltool-extract.in /intltool-merge.in /intltool-update.in /libtool /po/*.gmo /po/*.header /po/*.mo /po/*.sed /po/*.sin /po/.intltool-merge-cache /po/Makefile /po/Makefile.in /po/Makefile.in.in /po/Makefile.in.in~ /po/Makevars.template /po/POTFILES /po/Rules-quot /po/modulemd.pot /po/stamp-it /so_locations /stamp-h1 /tags # Common config files for IDEs /.buildconfig /.project /.vscode /settings.json # Common meson build directories /build /debugbuild /x86_64 /i*86 /aarch64 /armv7hl /ppc64le /s390* /libmodulemd.spec /fedora/*.patch /fedora/modulemd-* /fedora/libmodulemd-* *.rpm .travis/.home* .ci/.home* fedora-modularity-libmodulemd-357799c/.packit.yml000066400000000000000000000012431502446517500220150ustar00rootroot00000000000000specfile_path: fedora/libmodulemd.spec upstream_package_name: libmodulemd upstream_project_url: https://github.com/fedora-modularity/libmodulemd downstream_package_name: libmodulemd actions: get-current-version: ./get_version.sh files_to_sync: - fedora/ - .packit.yaml jobs: - job: sync_from_downstream trigger: commit - job: copr_build trigger: pull_request metadata: targets: - fedora-all - fedora-rawhide-aarch64 - fedora-rawhide-i386 - fedora-rawhide-ppc64le # fedora-rawhide-x86_64 is included in fedora-all # fedora-rawhide-s390x has too long wait queue - epel-7 - epel-8 - centos-stream-9 - centos-stream-10 fedora-modularity-libmodulemd-357799c/COPYING000066400000000000000000000021151502446517500207730ustar00rootroot00000000000000MIT License Copyright (c) 2017-2018 Stephen Gallagher Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. fedora-modularity-libmodulemd-357799c/NEWS000066400000000000000000000161531502446517500204460ustar00rootroot00000000000000Release history for libmodulemd 2.15.2 2025-06-18 Fixes: - module_index test now passes if RPM library is built without bzip2 or xz compression support and libmodulemd is configured to support decompression using the RPM library. 2.15.1 2025-05-09 Fixes: - A new "g_variant_store: assertion 'data != NULL' failed" warning added to GLib 2.84.1 when processing modulemd YAML documents with /data/xmd field with an empty flow map ({}) value was fixed. - Building documentation now works with GLib 2.80.1 at the expense of missing cross links from libmodulemd to GLib. If it still fails you, you can disable building the documentation with "-Dwith_docs=false" meson option. - A number of warnings printed by recent Meson was reduced. 2.15.0 2023-05-10 Enhancements: - Add a support for decompressing Zstandard-compressed YAML files. modulemd_detect_compression() function now recognizes files with "zst" file name extension and files with Zstandard magic bytes and returns MODULEMD_COMPRESSION_TYPE_ZSTD_COMPRESSION constant for them. modulemd_module_index_update_from_file() can load Zstandard-compressed YAML files now. - Remove a dependency on "file" library (libmagic). libmodulemd now implements its own detection of supported compression formats. This saves roughly 9 MB from a minimal system installation. - An XML specification for in-YUM-repository metadata is available in "xml_specs" directory. This new format aspires for replacing modulemd-v2, modulemd-defaults-v1 and modulemd-translations-v1 YAML formats. A motivation is to unify with other XML files in YUM repositories. Please note that this specification is not yet implemented. Incompatible changes: - Meson minimal version increased to 0.55. Deprecation: - Deprecate intents in modulemd-defaults specification. System intents, which parameterize a default stream and default profiles of a module, were never implemented in the package managers (e.g. DNF). Users are discouraged from using this feature. Future libmodulmed versions might deprecate and later remove parts of an API pertaining the intents. Fixes: - Fix a crash when converting a modulemd-packager object with a default profile and without a module name or stream to a module index. - Fix parsing empty profiles. Previously a profile with an empty rpms list was misparsed as a list with a single, empty package name. - A specification for modulemd-v2 format was corrected to require a "content" license subtree only if the module build contains artifacts. - Double-quote strings in scalar YAML values when they look like a number. Most of the fields in the YAML files are required to be interpreted as strings. Unaware third-party parsers could misinterpret number-like strings (e.g. 2.30) as floats (i.e. 2.3), leading to mismatching string representations. This is now prevented by quoting these values (i.e. "2.30"). - A build script now correctly asserts a requested Python version. Previously Python 3 /usr/bin/python program could be mistaken with Python 2 interpreter. - meson-0.64.0 warnings about "check" option of run_command() were fixed. - Warnings from g_str_equal() macro of glib2 about passing an unsigned char * to strcmp() were fixed. 2.14.0 2022-02-04 This release is fully compatible with the previous version 2.13.0 except behaviour changes described in Fixes section. Enhancements: - New functions for stripping XMD from an index (modulemd_module_index_clear_xmds()), from a module (modulemd_module_clear_xmds()), and from a version 2 module stream (modulemd_module_stream_v2_clear_xmd()). This enables you to prevent from leaking private build options to output modulemd-v2 documents. - Interpret an invalid buildorder 18446744073709551615 as -1 if the library is built with a new build boolean accept_overflowed_buildorder set to true. - Document module version, buildorder, and epoch limits in the specifications. Also clarify that an epoch number at RPM artifacts is mandatory. - Document that modulemd_module_get_defaults can return NULL - Improve a documentation for modulemd_module_set_defaults() and modulemd_module_index_upgrade_defaults() functions. - Improve modulemd-validator(1) manual page. - Drop a build dependency on help2man tool. Fixes: - Fix a crash when updating an index with an invalid subdocument and a NULL error parameter. - Fix clobbering module defaults on a modulemd_module_set_defaults() error. - Fix modulemd_module_index_upgrade_defaults() to actually use the requested version. - Reject duplicate contexts in modulemd-packager-v3 documents. - Report an error if modulemd-validator tool is invoked with both --version option and an unknown option. - Fix an undefined behaviour when comparing integers of different signs. - Fix DNF examples in a documentation. - Actually execute modulemd-obsoletes Python tests. - Fix deprecation warnings in tests with glib2-2.69.0. - Fix deprecation warnings in Python tests and make the test compatible with Python 3.11. 2.13.0 2021-07-09 This release is fully compatible with the previous 2.12.1 version. Enhancements: - Add /data/demodularized/rpms list to modulemd and modulemd-packager formats. The listed binary RPM package names will be handled by a package manager as removed from all previous module versions. This enables moving a package from a module to a non-modular package set. - modulemd-validator tool enables you to constrain a document type with a new "--type" option. Without this option, all document types recognized by a modulemd index are accepted. To validate version 3 of modulemd-packager format, use "modulemd-validator --type modulemd-packager-v3 foo.yaml" command. - Allow disabling Python 3. You can pass -Dwith_py3=false to a meson setup command to disable building a binding for Python 3. The binding is enabled by default. Fixes: - Reject invalid integers. Purely non-numeric values and negative numbers where an unsigned type is mandated by a specification raise a parser error now. - Handle a failed g_setenv() call in modulemd-validator. - Prevent from dereferencing a NULL pointer when reporting invalid subdocuments. - A build script now refuses to disable Glib introspection (-Dskip_introspection=true) while a Python binding is requested (-Dwith_py3=true). - "modulemd-validator --version" command returns 0 exit code now. 2.12.1 2021-05-03 This is a bug-fix release fully compatible with the previous 2.12.0 version. Notable changes: Enhancements: - Improve diagnostic messages for compression tests. - Tests performed in a GitHub continues integration are faster. - Use GitHub actions to perform CI tests also on ArchLinux, Mageia, Mandriva, and OpenSUSE. Fixes: - Relax context value up to 13 characters including an underscore character in modulemd v2 format. This reenables scratch-builds in MBS. - Migrate Packit tests from a deprecated current_version_command to a newer actions/get-current-version. 2.12.0 2021-01-15 Enhancements: - Enable component 'buildorder' for modulemd-packager v2 and v3 documents. Fixes: - When adding obsoletes ensure index has stream mdversion at least 2. - Add missing @staticmethod for python2. fedora-modularity-libmodulemd-357799c/README.md000066400000000000000000000314341502446517500212250ustar00rootroot00000000000000![Continuous Integration](https://github.com/fedora-modularity/libmodulemd/workflows/Continuous%20Integration/badge.svg) [![Travis](https://img.shields.io/coverity/scan/13739.svg?style=plastic)](https://scan.coverity.com/projects/sgallagher-libmodulemd) # libmodulemd C Library for manipulating module metadata files Full details can be found in the [API Documentation](https://fedora-modularity.github.io/libmodulemd/latest/) # Using libmodulemd from Python Using libmodulemd from Python is possible thanks to the gobject-introspection project. To use libmodulemd from Python, include the following at the top of your sources. Install the `python2-libmodulemd` or `python3-libmodulemd` package for your system depending on the version of python with which you are working. These packages provide the appropriate language bindings. ```python import gi gi.require_version("Modulemd", "2.0") from gi.repository import Modulemd ``` # Working with repodata (DNF use-case) The libmodulemd API provides a number of convenience tools for interacting with repodata (that is, streams of YAML that contains information on multiple streams, default data and translations). The documentation will use two repositories, called "fedora" and "updates" for demonstrative purposes. It will assume that the content of the YAML module metadata from those two repositories have been loaded into string variables `fedora_yaml` and `updates_yaml`, respectively. Tools such as DNF that are consuming data from a repository should always set `strict=False`, so that it can safely handle minor, backwards-compatible changes to the modulemd format. First step is to load the metadata from these two repositories into ModulemdModuleIndex objects. This is done as follows: ## C ```C ModulemdModuleIndex *fedora_index = modulemd_module_index_new (); gboolean ret = modulemd_module_index_update_from_string ( fedora_index, fedora_yaml, FALSE, &failures, &error); ModulemdModuleIndex *updates_index = modulemd_module_index_new (); gboolean ret2 = modulemd_module_index_update_from_string ( updates_index, updates_yaml, FALSE, &failures, &error); ``` ## Python ```python fedora_index = Modulemd.ModuleIndex.new() ret, failures = fedora_index.update_from_string(fedora_yaml, False) updates_index = Modulemd.ModuleIndex.new() ret, failures = updates_index.update_from_string(updates_yaml, False) ``` The `failures` are a list of subdocuments in the YAML that failed parsing, along with the reason they failed. Hence, by checking the return value of failures we will know if the YAML parsing was successful or not. Since it doesn't really make sense to view the contents from separate repositories in isolation (in most cases), the next step is to merge the two indexes into a combined one: ## C ```C ModulemdModuleIndexMerger *merger = modulemd_module_index_merger_new (); modulemd_module_index_merger_associate_index (merger, fedora_index, 0); modulemd_module_index_merger_associate_index (merger, updates_index, 0); ModulemdModuleIndex *merged_index = modulemd_module_index_merger_resolve (merger, &error); ``` ## Python ```python merger = Modulemd.ModuleIndexMerger.new() merger.associate_index(fedora_index, 0) merger.associate_index(updates_index, 0) merged_index = merger.resolve() ``` At this point, you now have either a complete view of the merged repodata, or else have received an error describing why the merge was unable to complete successfully. Additionally, it should be noted that the combined metadata in any ModulemdModuleIndex will have all of its component parts upgraded to match the highest version of those objects seen. So for example if the repodata has a mix of v1 and v2 ModulemdModuleStream objects, the index will contain only v2 objects (with the v1 objects automatically upgraded internally). Now, we can start operating on the retrieved data. This guide will give only a brief overview of the most common operations. See the API specification for a full list of information that can be retrieved. ## Discover the default stream for a particular module. ## C ```C ModulemdModule *module = modulemd_module_index_get_module (merged_index, "modulename"); ModulemdDefaults *defaults = modulemd_module_get_defaults (module); if (defaults) { printf ("Default stream for modulename is %s\n", modulemd_defaults_v1_get_default_stream ( MODULEMD_DEFAULTS_V1 (defaults), NULL)); } ``` ## Python ```python module = merged_index.get_module("modulename") defaults = module.get_defaults() print("Default stream for modulename is %s" % defaults.get_default_stream()) ``` ## Get the list of RPMs defining the public API for a particular module NSVCA First, query the ModulemdModuleIndex for the module with a given name. ## C ```C ModulemdModule *module = modulemd_module_index_get_module (merged_index, "modulename"); ``` ## Python ```python module = merged_index.get_module("modulename") ``` Then, query the ModulemdModule for the ModulemdModuleStream associated with the provided NSVCA (name-stream-version-context-architecture identifier). ## C ```C ModulemdModuleStream *stream = modulemd_module_get_stream_by_NSVCA ( module, "modulestream", 0, "deadbeef", "coolarch", &error); ``` ## Python ```python stream = module.get_stream_by_NSVCA("modulestream", 0, "deadbeef", "coolarch") ``` Lastly, read the RPM API from the ModulemdModuleStream. Here, `api_list` is a list of strings containing package names. ## C ```C GStrv api_list = modulemd_module_stream_v2_get_rpm_api_as_strv ( MODULEMD_MODULE_STREAM_V2 (stream)); ``` ## Python ```python api_list = stream.get_rpm_api() ``` Also note that in addition to accessor API methods, many objects also have properties that can be accessed directly. ## C ```C printf ("Documentation for module stream is at %s\n", modulemd_module_stream_v2_get_documentation ( MODULEMD_MODULE_STREAM_V2 (stream))); g_autofree gchar *doc; g_object_get (MODULEMD_MODULE_STREAM_V2 (stream), "documentation", &doc, NULL); printf ("Documentation for module stream is at %s\n", doc); ``` ## Python ```python print("Documentation for module stream is at %s" % stream.get_documentation()) print("Documentation for module stream is at %s" % stream.props.documentation) ``` ## Retrieve the modular runtime dependencies for a particular module NSVCA ## C ```C ModulemdModule *module = modulemd_module_index_get_module (merged_index, "modulename"); ModulemdModuleStream *stream = modulemd_module_get_stream_by_NSVCA ( module, "modulestream", 0, "deadbeef", "coolarch", &error); GPtrArray *deps_list = modulemd_module_stream_v2_get_dependencies ( MODULEMD_MODULE_STREAM_V2 (stream)); for (gint i = 0; i < deps_list->len; i++) { GStrv depmodules_list = modulemd_dependencies_get_runtime_modules_as_strv ( g_ptr_array_index (deps_list, i)); for (gint j = 0; j < g_strv_length (depmodules_list); j++) { GStrv depstreams_list = modulemd_dependencies_get_runtime_streams_as_strv ( g_ptr_array_index (deps_list, i), depmodules_list[j]); for (gint k = 0; k < g_strv_length (depstreams_list); k++) { // do stuff with depmodules_list[j], depstreams_list[k] } } } ``` ## Python ```python module = merged_index.get_module("modulename") stream = module.get_stream_by_NSVCA("modulestream", 0, "deadbeef", "coolarch") deps_list = stream.get_dependencies() for dep in deps_list: depmodules_list = dep.get_runtime_modules() for depmod in depmodules_list: depstream_list = dep.get_runtime_streams(depmod) for depstream in depstream_list: # do stuff with depmod, depstream ``` # Working with a single module stream (Packager/MBS use-case) One limitation of the ModulemdModuleIndex format is that it requires that all module streams loaded into it have both a name and a stream name. This however is not possible when dealing with streams such as a packager would be using (since the build-system auto-generates the module name and stream name from the git repository information. In this case, we need to work with a single module stream document at a time. For this, we will use the ModulemdModuleStream interface. This example will assume that the module name and stream name have already been determined from the repodata and that they are stored in string variables named `module_name` and `stream_name`, respectively. ## Python ```python stream = Modulemd.ModuleStream.read_file( "/path/to/module_name.yaml", True, module_name, stream_name ) v2_stream = stream.upgrade(Modulemd.ModuleStreamVersionEnum.TWO) v2_stream.validate() ``` In the example above, we upgraded the stream to v2, in case we were reading from v1 metadata. This will allow us to avoid having to manage multiple code-paths and support only the latest we understand. After that, it calls validate() to ensure that the content that was read in was valid both syntactically and referentially. Also available is `Modulemd.ModuleStreamVersionEnum.LATEST` which will always represent the highest-supported version of the ModulemdModuleStream metadata format. This may change at any time. # Getting started with developing ## Forking and cloning the sources The libmodulemd project follows the [Github Fork-and-Pull](https://reflectoring.io/github-fork-and-pull/) model of development. To get started, create a fork of the upstream libmodulemd sources, clone those locally and create branches on your fork to make changes. When they are ready for review or feedback, create a pull-request. ## Prerequisites * A development system with either [Podman](https://podman.io/) and [Buildah](https://buildah.io/) (preferred) or [Docker](https://www.docker.com/) installed. ## Preparing a build environment Create a container for building the libmodulemd sources. Run the handy setup script in the root of the checkout. ``` ./setup_dev_container.sh [] ``` If unspecified, it will default to "Fedora Rawhide". To select a different Fedora release for the base image, add the release number as an argument to the command. For example: ``` ./setup_dev_container.sh 33 ``` This will automatically pull down a Fedora base image, install all of the packages needed for development and testing and then provide you with a shell inside this environment. ## Building the sources Projects built with the meson build-system require a separate build directory from the source path. The `meson` command will generate this directory for you. ``` meson --buildtype=debug -Db_coverage=true debugbuild ``` The above command (run from the root of the source checkout) will create a new subdirectory - `debugbuild` - configured to compile with debug symbols and `gcov` symbols to measure test coverage. To build the sources, `chdir()` into the `debugbuild` directory and run ``` ninja ``` To build and run the in-tree tests, use ``` ninja test ``` To generate HTML documentation, you can run ``` ninja modulemd-2.0-doc ``` (Be aware that the GLib documentation module in meson has some strange quirks and won't recognize newly-added pages without deleting and re-creating the build directory first.) ## Running more advanced test suites In addition to the basic `ninja test` set of tests, libmodulemd also has a suite of tests performed in the Github Actions environment. These are also containerized and can be run locally on the host. (You will not be able to run them from within the development container shell, as nested containers are not supported.) To run the container-based tests, you can run the following from the source root: ``` ./.ci/ci-fedora.sh ``` (Optionally, you can pass the release number as an argument to switch to building and testing against that release rather than Fedora Rawhide). Support for running the tests on other OSes is ongoing. See the `.ci` directory for available suites. All supported OSes and release versions are tested as part of each pull request. ## Tips and tricks ### Running tests in debug mode The libmodulemd library is built atop [GObject](https://developer.gnome.org/gobject/stable/). It provides a debug mode that is configurable by an environment variable. In general, it is highly recommended that you run all tests with `G_DEBUG='fatal-warnings,fatal-criticals'` set in the environment. This will cause the application to `abort()` on programming errors that would be logged and ignored at runtime. ### Running tests with valgrind Assuming your current working directory is `debugbuild` as described above: ``` meson test --suite=ci_valgrind --wrap=../contrib/valgrind/valgrind_wrapper.sh ``` If not, you may need to adjust the path to libmodulemd-python.supp. You can also specify individual tests to run against. See `meson test --list` for the available tests. The automated CI tests will always run with valgrind on all platforms where it is supported. # Authors: * Stephen Gallagher * Merlin Mathesius * Igor Gnatenko fedora-modularity-libmodulemd-357799c/bindings/000077500000000000000000000000001502446517500215365ustar00rootroot00000000000000fedora-modularity-libmodulemd-357799c/bindings/python/000077500000000000000000000000001502446517500230575ustar00rootroot00000000000000fedora-modularity-libmodulemd-357799c/bindings/python/gi/000077500000000000000000000000001502446517500234565ustar00rootroot00000000000000fedora-modularity-libmodulemd-357799c/bindings/python/gi/overrides/000077500000000000000000000000001502446517500254605ustar00rootroot00000000000000fedora-modularity-libmodulemd-357799c/bindings/python/gi/overrides/Modulemd.py000066400000000000000000000144221502446517500276030ustar00rootroot00000000000000# This file is part of libmodulemd # Copyright (C) 2016 Red Hat, Inc. # Copyright (C) 2017-2018 Stephen Gallagher # # Fedora-License-Identifier: MIT # SPDX-2.0-License-Identifier: MIT # SPDX-3.0-License-Identifier: MIT # # This program is free software. # For more information on the license, see COPYING. # For more information on free software, see # . from ..module import get_introspection_module from ..overrides import override import functools from six import text_type from gi.repository import GLib import datetime Modulemd = get_introspection_module("Modulemd") __all__ = [] class ModulemdUtil(object): @staticmethod def strip_gtype(method): @functools.wraps(method) def wrapped(*args, **kwargs): ret = method(*args, **kwargs) if len(ret) == 2: return ret[1] else: return ret[1:] return wrapped @staticmethod def variant_str(s): """Converts a string to a GLib.Variant""" if not isinstance(s, str): raise TypeError("Only strings are supported for scalars") return GLib.Variant.new_string(s) @staticmethod def variant_bool(b): """Converts a boolean to a GLib.Varant""" if not isinstance(b, bool): raise TypeError("Only booleans are supported") return GLib.Variant.new_boolean(b) @staticmethod def variant_list(vl): """Converts a list to a GLib.Variant""" # If this is a zero-length array, handle it specially if len(vl) == 0: return GLib.Variant.new_array(GLib.VariantType("v")) # Build the array from each entry builder = GLib.VariantBuilder(GLib.VariantType("a*")) for item in vl: if item is None: item = "" builder.add_value(ModulemdUtil.python_to_variant(item)) return builder.end() @staticmethod def variant_dict(d): """Converts a dictionary to a dictionary of GLib.Variant""" if not isinstance(d, dict): raise TypeError("Only dictionaries are supported for mappings") vdict = GLib.VariantDict() for k, v in d.items(): if v is None: v = "" vdict.insert_value(k, ModulemdUtil.python_to_variant(v)) return vdict.end() @staticmethod def python_to_variant(obj): if isinstance(obj, str): return ModulemdUtil.variant_str(obj) elif isinstance(obj, text_type): return ModulemdUtil.variant_str(obj.encode("utf-8")) elif isinstance(obj, bool): return ModulemdUtil.variant_bool(obj) elif isinstance(obj, list): return ModulemdUtil.variant_list(obj) elif isinstance(obj, dict): return ModulemdUtil.variant_dict(obj) else: raise TypeError("Cannot convert unknown type") if float(Modulemd._version) >= 2: if hasattr(Modulemd, "read_packager_file"): read_packager_file = ModulemdUtil.strip_gtype( Modulemd.read_packager_file ) __all__.append("read_packager_file") if hasattr(Modulemd, "read_packager_string"): read_packager_string = ModulemdUtil.strip_gtype( Modulemd.read_packager_string ) __all__.append("read_packager_string") if hasattr(Modulemd.ModuleIndex, "add_known_stream"): class ModuleIndex(Modulemd.ModuleIndex): def set_known_streams(self, known_streams): for module, streams in known_streams.items(): for stream in streams: super(ModuleIndex, self).add_known_stream( module, stream ) ModuleIndex = override(ModuleIndex) __all__.append(ModuleIndex) if hasattr(Modulemd, "PackagerV3"): class PackagerV3(Modulemd.PackagerV3): def set_xmd(self, xmd): super(PackagerV3, self).set_xmd( ModulemdUtil.python_to_variant(xmd) ) def get_xmd(self): variant_xmd = super(PackagerV3, self).get_xmd() if variant_xmd is None: return {} return variant_xmd.unpack() PackagerV3 = override(PackagerV3) __all__.append(PackagerV3) if hasattr(Modulemd, "ModuleStreamV2"): class ModuleStreamV2(Modulemd.ModuleStreamV2): def set_xmd(self, xmd): super(ModuleStreamV2, self).set_xmd( ModulemdUtil.python_to_variant(xmd) ) def get_xmd(self): variant_xmd = super(ModuleStreamV2, self).get_xmd() if variant_xmd is None: return {} return variant_xmd.unpack() ModuleStreamV2 = override(ModuleStreamV2) __all__.append(ModuleStreamV2) if hasattr(Modulemd, "ModuleStreamV1"): class ModuleStreamV1(Modulemd.ModuleStreamV1): def set_xmd(self, xmd): super(ModuleStreamV1, self).set_xmd( ModulemdUtil.python_to_variant(xmd) ) def get_xmd(self): variant_xmd = super(ModuleStreamV1, self).get_xmd() if variant_xmd is None: return {} return variant_xmd.unpack() ModuleStreamV1 = override(ModuleStreamV1) __all__.append(ModuleStreamV1) if hasattr(Modulemd, "ServiceLevel"): class ServiceLevel(Modulemd.ServiceLevel): def set_eol(self, eol): if isinstance(eol, datetime.date): return super(ServiceLevel, self).set_eol_ymd( eol.year, eol.month, eol.day ) raise TypeError( "Expected datetime.date, but got %s." % (type(eol).__name__) ) def get_eol(self): eol = super(ServiceLevel, self).get_eol() if eol is None: return None return datetime.date( eol.get_year(), eol.get_month(), eol.get_day() ) ServiceLevel = override(ServiceLevel) __all__.append(ServiceLevel) fedora-modularity-libmodulemd-357799c/bindings/python/meson.build000066400000000000000000000020241502446517500252170ustar00rootroot00000000000000gobject_overrides_dir_py3 = get_option('gobject_overrides_dir_py3') gobject_overrides_dir_py2 = get_option('gobject_overrides_dir_py2') # Python 3 if with_py3 if gobject_overrides_dir_py3 == '' ret = run_command([python3, '-c', 'import gi; print(gi._overridesdir)'], check: false) if ret.returncode() != 0 error('Failed to determine Python 3 pygobject overridedir: @0@'.format(ret.stderr())) else gobject_overrides_dir_py3 = ret.stdout().strip() endif endif install_data('gi/overrides/Modulemd.py', install_dir: gobject_overrides_dir_py3) endif # Python 2 if with_py2 if gobject_overrides_dir_py2 == '' ret2 = run_command([python2, '-c', 'import gi; print(gi._overridesdir)'], check: false) if ret2.returncode() != 0 error('Failed to determine Python 2 pygobject overridedir: @0@'.format(ret2.stderr())) else gobject_overrides_dir_py2 = ret2.stdout().strip() endif endif install_data('gi/overrides/Modulemd.py', install_dir: gobject_overrides_dir_py2) endif fedora-modularity-libmodulemd-357799c/contrib/000077500000000000000000000000001502446517500214015ustar00rootroot00000000000000fedora-modularity-libmodulemd-357799c/contrib/coverity-modeling.c000066400000000000000000000205351502446517500252120ustar00rootroot00000000000000/* Coverity Scan model * * Copyright (C) 2014 Red Hat, Inc. * * Authors: * Markus Armbruster * Paolo Bonzini * * This work is licensed under the terms of the GNU GPL, version 2 or, at your * option, any later version. See the COPYING file in the top-level directory. * * It originated within the QEMU project. */ /* * This is the source code for our Coverity user model file. The * purpose of user models is to increase scanning accuracy by explaining * code Coverity can't see (out of tree libraries) or doesn't * sufficiently understand. Better accuracy means both fewer false * positives and more true defects. Memory leaks in particular. * * - A model file can't import any header files. Some built-in primitives are * available but not wchar_t, NULL etc. * - Modeling doesn't need full structs and typedefs. Rudimentary structs * and similar types are sufficient. * - An uninitialized local variable signifies that the variable could be * any value. * * The model file must be uploaded by an admin in the analysis settings of * https://scan.coverity.com/projects/sgallagher-libmodulemd */ #define NULL ((void *)0) typedef unsigned char uint8_t; typedef char int8_t; typedef unsigned int uint32_t; typedef int int32_t; typedef long ssize_t; typedef unsigned long long uint64_t; typedef long long int64_t; typedef _Bool bool; typedef struct va_list_str *va_list; /* exec.c */ typedef struct AddressSpace AddressSpace; typedef uint64_t hwaddr; typedef uint32_t MemTxResult; typedef uint64_t MemTxAttrs; static void __bufwrite (uint8_t *buf, ssize_t len) { int first, last; __coverity_negative_sink__ (len); if (len == 0) return; buf[0] = first; buf[len - 1] = last; __coverity_writeall__ (buf); } static void __bufread (uint8_t *buf, ssize_t len) { __coverity_negative_sink__ (len); if (len == 0) return; int first = buf[0]; int last = buf[len - 1]; } MemTxResult address_space_rw (AddressSpace *as, hwaddr addr, MemTxAttrs attrs, uint8_t *buf, int len, bool is_write) { MemTxResult result; // TODO: investigate impact of treating reads as producing // tainted data, with __coverity_tainted_data_argument__(buf). if (is_write) __bufread (buf, len); else __bufwrite (buf, len); return result; } /* Tainting */ typedef struct { } name2keysym_t; static int get_keysym (const name2keysym_t *table, const char *name) { int result; if (result > 0) { __coverity_tainted_string_sanitize_content__ (name); return result; } else { return 0; } } /* * GLib memory allocation functions. * * Note that we ignore the fact that g_malloc of 0 bytes returns NULL, * and g_realloc of 0 bytes frees the pointer. * * Modeling this would result in Coverity flagging a lot of memory * allocations as potentially returning NULL, and asking us to check * whether the result of the allocation is NULL or not. However, the * resulting pointer should never be dereferenced anyway, and in fact * it is not in the vast majority of cases. * * If a dereference did happen, this would suppress a defect report * for an actual null pointer dereference. But it's too unlikely to * be worth wading through the false positives, and with some luck * we'll get a buffer overflow reported anyway. */ /* * Allocation primitives, cannot return NULL * See also Coverity's library/generic/libc/all/all.c */ void * g_malloc_n (size_t nmemb, size_t size) { size_t sz; void *ptr; __coverity_negative_sink__ (nmemb); __coverity_negative_sink__ (size); sz = nmemb * size; ptr = __coverity_alloc__ (sz); __coverity_mark_as_uninitialized_buffer__ (ptr); __coverity_mark_as_afm_allocated__ (ptr, "g_free"); return ptr; } void * g_malloc0_n (size_t nmemb, size_t size) { size_t sz; void *ptr; __coverity_negative_sink__ (nmemb); __coverity_negative_sink__ (size); sz = nmemb * size; ptr = __coverity_alloc__ (sz); __coverity_writeall0__ (ptr); __coverity_mark_as_afm_allocated__ (ptr, "g_free"); return ptr; } void * g_realloc_n (void *ptr, size_t nmemb, size_t size) { size_t sz; __coverity_negative_sink__ (nmemb); __coverity_negative_sink__ (size); sz = nmemb * size; __coverity_escape__ (ptr); ptr = __coverity_alloc__ (sz); /* * Memory beyond the old size isn't actually initialized. Can't * model that. See Coverity's realloc() model */ __coverity_writeall__ (ptr); __coverity_mark_as_afm_allocated__ (ptr, "g_free"); return ptr; } void g_free (void *ptr) { __coverity_free__ (ptr); __coverity_mark_as_afm_freed__ (ptr, "g_free"); } /* * Derive the g_try_FOO_n() from the g_FOO_n() by adding indeterminate * out of memory conditions */ void * g_try_malloc_n (size_t nmemb, size_t size) { int nomem; if (nomem) { return NULL; } return g_malloc_n (nmemb, size); } void * g_try_malloc0_n (size_t nmemb, size_t size) { int nomem; if (nomem) { return NULL; } return g_malloc0_n (nmemb, size); } void * g_try_realloc_n (void *ptr, size_t nmemb, size_t size) { int nomem; if (nomem) { return NULL; } return g_realloc_n (ptr, nmemb, size); } /* Trivially derive the g_FOO() from the g_FOO_n() */ void * g_malloc (size_t size) { return g_malloc_n (1, size); } void * g_malloc0 (size_t size) { return g_malloc0_n (1, size); } void * g_realloc (void *ptr, size_t size) { return g_realloc_n (ptr, 1, size); } void * g_try_malloc (size_t size) { return g_try_malloc_n (1, size); } void * g_try_malloc0 (size_t size) { return g_try_malloc0_n (1, size); } void * g_try_realloc (void *ptr, size_t size) { return g_try_realloc_n (ptr, 1, size); } /* Other memory allocation functions */ void * g_memdup (const void *ptr, unsigned size) { unsigned char *dup; unsigned i; if (!ptr) { return NULL; } dup = g_malloc (size); for (i = 0; i < size; i++) dup[i] = ((unsigned char *)ptr)[i]; return dup; } /* * GLib string allocation functions */ char * g_strdup (const char *s) { char *dup; size_t i; if (!s) { return NULL; } __coverity_string_null_sink__ (s); __coverity_string_size_sink__ (s); dup = __coverity_alloc_nosize__ (); __coverity_mark_as_afm_allocated__ (dup, "g_free"); for (i = 0; (dup[i] = s[i]); i++) ; return dup; } char * g_strndup (const char *s, size_t n) { char *dup; size_t i; __coverity_negative_sink__ (n); if (!s) { return NULL; } dup = g_malloc (n + 1); for (i = 0; i < n && (dup[i] = s[i]); i++) ; dup[i] = 0; return dup; } char * g_strdup_printf (const char *format, ...) { char ch, *s; size_t len; __coverity_string_null_sink__ (format); __coverity_string_size_sink__ (format); ch = *format; s = __coverity_alloc_nosize__ (); __coverity_writeall__ (s); __coverity_mark_as_afm_allocated__ (s, "g_free"); return s; } char * g_strdup_vprintf (const char *format, va_list ap) { char ch, *s; size_t len; __coverity_string_null_sink__ (format); __coverity_string_size_sink__ (format); ch = *format; ch = *(char *)ap; s = __coverity_alloc_nosize__ (); __coverity_writeall__ (s); __coverity_mark_as_afm_allocated__ (s, "g_free"); return len; } char * g_strconcat (const char *s, ...) { char *s; /* * Can't model: last argument must be null, the others * null-terminated strings */ s = __coverity_alloc_nosize__ (); __coverity_writeall__ (s); __coverity_mark_as_afm_allocated__ (s, "g_free"); return s; } /* Other glib functions */ typedef struct pollfd GPollFD; int poll (); int g_poll (GPollFD *fds, unsigned nfds, int timeout) { return poll (fds, nfds, timeout); } typedef struct _GIOChannel GIOChannel; GIOChannel * g_io_channel_unix_new (int fd) { GIOChannel *c = g_malloc0 (sizeof (GIOChannel)); __coverity_escape__ (fd); return c; } void g_assertion_message_expr (const char *domain, const char *file, int line, const char *func, const char *expr) { __coverity_panic__ (); } void g_assertion_message (const char *domain, const char *file, int line, const char *func, const char *message) { __coverity_panic__ (); } fedora-modularity-libmodulemd-357799c/contrib/doc-tools/000077500000000000000000000000001502446517500233045ustar00rootroot00000000000000fedora-modularity-libmodulemd-357799c/contrib/doc-tools/fix-xref.sh000077500000000000000000000006641502446517500254010ustar00rootroot00000000000000#!/bin/sh devdocs_url="https://developer.gnome.org" dir=`pwd` for file in $dir/*.html; do echo "Fixing cross-references in ${file}..." sed -i \ -e "s|/usr/share/gtk-doc/html/gobject|${devdocs_url}/gobject/stable|" \ -e "s|/usr/share/gtk-doc/html/glib|${devdocs_url}/glib/stable|" \ -e "s|\.\./glib|${devdocs_url}/glib/stable|" \ -e "s|\.\./gobject|${devdocs_url}/gobject/stable|" \ ${file} done fedora-modularity-libmodulemd-357799c/contrib/release-tools/000077500000000000000000000000001502446517500241575ustar00rootroot00000000000000fedora-modularity-libmodulemd-357799c/contrib/release-tools/release.sh000077500000000000000000000062431502446517500261430ustar00rootroot00000000000000#!/usr/bin/bash SCRIPT_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )" SOURCE_ROOT=$SCRIPT_DIR/../.. pushd $SOURCE_ROOT function error_out { local code message local "${@}" echo $message 1>&2 exit $code } TMPDIR=$(mktemp -d MODULEMD_XXXXXX --tmpdir) function common_finalize { exitcode=$? rm -Rf $TMPDIR return $exitcode } trap common_finalize EXIT # Don't release if the git repo has uncommitted changes git diff --quiet || error_out code=127 message="There are uncommitted changes. Refusing to release." [[ $(git remote get-url upstream) =~ fedora-modularity/libmodulemd.git$ ]] || error_out code=127 message="There must be a git remote named 'upstream' available. The user running this script must have privilege to push commits to the 'upstream' remote" [ $(git branch --show-current) = main ] || error_out code=127 message="This script may only be run on the 'main' branch" hub --version >/dev/null || error_out code=127 message="Install 'hub' to use this script" jq --version >/dev/null || error_out code=127 message="Install 'jq' to use this script" # Make sure the current user has logged in before or prompt them for credentials echo "Logging into Github" hub api "https://api.github.com/user" || error_out code=1 message="Invalid credentials" # Get the previous tag for this branch OLDTAG=$(git describe --first-parent --abbrev=0) # Configure the build directory meson --buildtype=release $TMPDIR MMD_SKIP_VALGRIND=True ninja -C $TMPDIR dist # Get the version that will be tagged NEWVERSION=$(meson introspect $TMPDIR --projectinfo |jq -r ".version") NEWTAG=libmodulemd-$NEWVERSION if [ $NEWTAG = $OLDTAG ]; then error_out code=2 message="Version is already tagged. Update meson.build with the new version." fi echo ========== echo Tagging $NEWTAG echo ========== echo Tagging $NEWTAG > $TMPDIR/tag_header echo >> $TMPDIR/tag_header git shortlog $OLDTAG.. >> $TMPDIR/shortlog || error_out code=3 message="Couldn't find the previous tag" cat $TMPDIR/tag_header $TMPDIR/shortlog > $TMPDIR/tag_message git tag -s -F $TMPDIR/tag_message $NEWTAG || error_out code=4 message="Couldn't create new signed tag for the release" git tag -s -F $TMPDIR/tag_message $NEWVERSION || error_out code=4 message="Couldn't create new signed tag for the release" bump_version=$($SCRIPT_DIR/semver bump patch $NEWVERSION) pushd $SOURCE_ROOT meson rewrite kwargs set project / version $bump_version #|| error_out code=11 message="Couldn't bump the version in meson.build" git commit -sm "Bump version in meson.build to $bump_version" meson.build popd #$SOURCE_ROOT # Make sure everything is up-to-date on Github git push --follow-tags upstream main || error_out code=5 message="Couldn't push the new tags to Github" echo "libmodulemd $NEWVERSION" > $TMPDIR/github_message echo >> $TMPDIR/github_message sed -E "s/ / * /g" $TMPDIR/shortlog | sed -E "s/(.*):\$/\# \1/g" >> $TMPDIR/github_message hub release create -a $TMPDIR/meson-dist/modulemd-$NEWVERSION.tar.xz \ -a $TMPDIR/meson-dist/modulemd-$NEWVERSION.tar.xz.sha256sum \ -F $TMPDIR/github_message \ $NEWTAG || error_out code=10 message="Couldn't publish the release" fedora-modularity-libmodulemd-357799c/contrib/release-tools/semver000077500000000000000000000176511502446517500254200ustar00rootroot00000000000000#!/usr/bin/env bash # Retrieved from https://github.com/fsaintjacques/semver-tool # This code is GPLv3, but it's used as part of the libmodulemd release process # and it does not end up in the built library. set -o errexit -o nounset -o pipefail NAT='0|[1-9][0-9]*' ALPHANUM='[0-9]*[A-Za-z-][0-9A-Za-z-]*' IDENT="$NAT|$ALPHANUM" FIELD='[0-9A-Za-z-]+' SEMVER_REGEX="\ ^[vV]?\ ($NAT)\\.($NAT)\\.($NAT)\ (\\-(${IDENT})(\\.(${IDENT}))*)?\ (\\+${FIELD}(\\.${FIELD})*)?$" PROG=semver PROG_VERSION="3.0.0" USAGE="\ Usage: $PROG bump (major|minor|patch|release|prerel |build ) $PROG compare $PROG get (major|minor|patch|release|prerel|build) $PROG --help $PROG --version Arguments: A version must match the following regular expression: \"${SEMVER_REGEX}\" In English: -- The version must match X.Y.Z[-PRERELEASE][+BUILD] where X, Y and Z are non-negative integers. -- PRERELEASE is a dot separated sequence of non-negative integers and/or identifiers composed of alphanumeric characters and hyphens (with at least one non-digit). Numeric identifiers must not have leading zeros. A hyphen (\"-\") introduces this optional part. -- BUILD is a dot separated sequence of identifiers composed of alphanumeric characters and hyphens. A plus (\"+\") introduces this optional part. See definition. A string as defined by PRERELEASE above. A string as defined by BUILD above. Options: -v, --version Print the version of this tool. -h, --help Print this help message. Commands: bump Bump by one of major, minor, patch; zeroing or removing subsequent parts. \"bump prerel\" sets the PRERELEASE part and removes any BUILD part. \"bump build\" sets the BUILD part. \"bump release\" removes any PRERELEASE or BUILD parts. The bumped version is written to stdout. compare Compare with , output to stdout the following values: -1 if is newer, 0 if equal, 1 if older. The BUILD part is not used in comparisons. get Extract given part of , where part is one of major, minor, patch, prerel, build, or release. See also: https://semver.org -- Semantic Versioning 2.0.0" function error { echo -e "$1" >&2 exit 1 } function usage-help { error "$USAGE" } function usage-version { echo -e "${PROG}: $PROG_VERSION" exit 0 } function validate-version { local version=$1 if [[ "$version" =~ $SEMVER_REGEX ]]; then # if a second argument is passed, store the result in var named by $2 if [ "$#" -eq "2" ]; then local major=${BASH_REMATCH[1]} local minor=${BASH_REMATCH[2]} local patch=${BASH_REMATCH[3]} local prere=${BASH_REMATCH[4]} local build=${BASH_REMATCH[8]} eval "$2=(\"$major\" \"$minor\" \"$patch\" \"$prere\" \"$build\")" else echo "$version" fi else error "version $version does not match the semver scheme 'X.Y.Z(-PRERELEASE)(+BUILD)'. See help for more information." fi } function is-nat { [[ "$1" =~ ^($NAT)$ ]] } function is-null { [ -z "$1" ] } function order-nat { [ "$1" -lt "$2" ] && { echo -1 ; return ; } [ "$1" -gt "$2" ] && { echo 1 ; return ; } echo 0 } function order-string { [[ $1 < $2 ]] && { echo -1 ; return ; } [[ $1 > $2 ]] && { echo 1 ; return ; } echo 0 } # given two (named) arrays containing NAT and/or ALPHANUM fields, compare them # one by one according to semver 2.0.0 spec. Return -1, 0, 1 if left array ($1) # is less-than, equal, or greater-than the right array ($2). The longer array # is considered greater-than the shorter if the shorter is a prefix of the longer. # function compare-fields { local l="$1[@]" local r="$2[@]" local leftfield=( "${!l}" ) local rightfield=( "${!r}" ) local left local right local i=$(( -1 )) local order=$(( 0 )) while true do [ $order -ne 0 ] && { echo $order ; return ; } : $(( i++ )) left="${leftfield[$i]}" right="${rightfield[$i]}" is-null "$left" && is-null "$right" && { echo 0 ; return ; } is-null "$left" && { echo -1 ; return ; } is-null "$right" && { echo 1 ; return ; } is-nat "$left" && is-nat "$right" && { order=$(order-nat "$left" "$right") ; continue ; } is-nat "$left" && { echo -1 ; return ; } is-nat "$right" && { echo 1 ; return ; } { order=$(order-string "$left" "$right") ; continue ; } done } # shellcheck disable=SC2206 # checked by "validate"; ok to expand prerel id's into array function compare-version { local order validate-version "$1" V validate-version "$2" V_ # compare major, minor, patch local left=( "${V[0]}" "${V[1]}" "${V[2]}" ) local right=( "${V_[0]}" "${V_[1]}" "${V_[2]}" ) order=$(compare-fields left right) [ "$order" -ne 0 ] && { echo "$order" ; return ; } # compare pre-release ids when M.m.p are equal local prerel="${V[3]:1}" local prerel_="${V_[3]:1}" local left=( ${prerel//./ } ) local right=( ${prerel_//./ } ) # if left and right have no pre-release part, then left equals right # if only one of left/right has pre-release part, that one is less than simple M.m.p [ -z "$prerel" ] && [ -z "$prerel_" ] && { echo 0 ; return ; } [ -z "$prerel" ] && { echo 1 ; return ; } [ -z "$prerel_" ] && { echo -1 ; return ; } # otherwise, compare the pre-release id's compare-fields left right } function command-bump { local new; local version; local sub_version; local command; case $# in 2) case $1 in major|minor|patch|release) command=$1; version=$2;; *) usage-help;; esac ;; 3) case $1 in prerel|build) command=$1; sub_version=$2 version=$3 ;; *) usage-help;; esac ;; *) usage-help;; esac validate-version "$version" parts # shellcheck disable=SC2154 local major="${parts[0]}" local minor="${parts[1]}" local patch="${parts[2]}" local prere="${parts[3]}" local build="${parts[4]}" case "$command" in major) new="$((major + 1)).0.0";; minor) new="${major}.$((minor + 1)).0";; patch) new="${major}.${minor}.$((patch + 1))";; release) new="${major}.${minor}.${patch}";; prerel) new=$(validate-version "${major}.${minor}.${patch}-${sub_version}");; build) new=$(validate-version "${major}.${minor}.${patch}${prere}+${sub_version}");; *) usage-help ;; esac echo "$new" exit 0 } function command-compare { local v; local v_; case $# in 2) v=$(validate-version "$1"); v_=$(validate-version "$2") ;; *) usage-help ;; esac set +u # need unset array element to evaluate to null compare-version "$v" "$v_" exit 0 } # shellcheck disable=SC2034 function command-get { local part version if [[ "$#" -ne "2" ]] || [[ -z "$1" ]] || [[ -z "$2" ]]; then usage-help exit 0 fi part="$1" version="$2" validate-version "$version" parts local major="${parts[0]}" local minor="${parts[1]}" local patch="${parts[2]}" local prerel="${parts[3]:1}" local build="${parts[4]:1}" local release="${major}.${minor}.${patch}" case "$part" in major|minor|patch|release|prerel|build) echo "${!part}" ;; *) usage-help ;; esac exit 0 } case $# in 0) echo "Unknown command: $*"; usage-help;; esac case $1 in --help|-h) echo -e "$USAGE"; exit 0;; --version|-v) usage-version ;; bump) shift; command-bump "$@";; get) shift; command-get "$@";; compare) shift; command-compare "$@";; *) echo "Unknown arguments: $*"; usage-help;; esac fedora-modularity-libmodulemd-357799c/contrib/valgrind/000077500000000000000000000000001502446517500232075ustar00rootroot00000000000000fedora-modularity-libmodulemd-357799c/contrib/valgrind/libmodulemd-python.supp000066400000000000000000000037111502446517500277360ustar00rootroot00000000000000# libmodulemd valgrind suppressions file # # This provides a list of suppressions for libmodulemd for valgrind for # the false positives that are reported when running under valgrind. # # Pass this suppression file to valgrind using --suppressions=/path/to/this-file.supp # # See http://valgrind.org/docs/manual/manual-core.html#manual-core.suppress # for details about the format of this file. # # Also see https://wiki.wxwidgets.org/Parse_valgrind_suppressions.sh for a # handy script to extract suppression entries from the valgrind test log. # { Handle PyMalloc confusing valgrind Memcheck:Leak fun:malloc ... fun:_PyObject_GC_New } { Handle PyMalloc confusing valgrind Memcheck:Leak fun:malloc ... fun:_PyObject_GC_NewVar } { Handle PyMalloc confusing valgrind Memcheck:Leak fun:realloc ... fun:_PyObject_GC_Resize } { Handle PyMalloc confusing valgrind Memcheck:Leak match-leak-kinds: definite fun:malloc ... fun:_PyMem_RawWcsdup } { Handle PyMalloc confusing valgrind Memcheck:Cond fun:PyUnicode_Decode fun:PyUnicode_FromEncodedObject } { Handle PyMalloc confusing valgrind Memcheck:Leak match-leak-kinds: definite fun:malloc fun:g_malloc fun:g_strdup ... fun:PyObject_SetAttr } { Handle Python 3.9 PyMalloc confusing valgrind Memcheck:Leak fun:malloc fun:PyThread_allocate_lock ... fun:Py_InitializeFromConfig ... fun:Py_BytesMain } { Python3 Unicode uninitialized value Memcheck:Cond fun:PyUnicode_Decode ... fun:_PyEval_EvalFrameDefault } { Mageia string insert leak Memcheck:Leak match-leak-kinds: definite fun:realloc ... fun:g_string_insert_len } { Mageia girepo leak Memcheck:Leak match-leak-kinds: definite fun:malloc ... fun:g_irepository_find_by_gtype } { Mageia loaddynamicmodule leak Memcheck:Leak match-leak-kinds: definite fun:malloc ... fun:_PyImport_LoadDynamicModuleWithSpec } fedora-modularity-libmodulemd-357799c/contrib/valgrind/valgrind_wrapper.sh000077500000000000000000000005361502446517500271200ustar00rootroot00000000000000#!/bin/bash SCRIPT_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )" set -e set -x valgrind \ --error-exitcode=1 \ --errors-for-leak-kinds=definite \ --leak-check=full \ --show-leak-kinds=definite \ --suppressions=/usr/share/glib-2.0/valgrind/glib.supp \ --suppressions=$SCRIPT_DIR/libmodulemd-python.supp \ "$@" fedora-modularity-libmodulemd-357799c/fedora/000077500000000000000000000000001502446517500212015ustar00rootroot00000000000000fedora-modularity-libmodulemd-357799c/fedora/.gitignore000066400000000000000000000021251502446517500231710ustar00rootroot00000000000000/modulemd-0.1.0.tar.xz /modulemd-0.2.0.tar.xz /modulemd-0.2.1.tar.xz /modulemd-0.2.2.tar.xz /modulemd-1.0.0.tar.xz /modulemd-1.0.1.tar.xz /modulemd-1.0.2.tar.xz /modulemd-1.0.3.tar.xz /modulemd-1.0.4.tar.xz /modulemd-1.1.0.tar.xz /modulemd-1.1.1.tar.xz /modulemd-1.1.2.tar.xz /modulemd-1.1.3.tar.xz /modulemd-1.2.0.tar.xz /modulemd-1.3.0.tar.xz /modulemd-1.4.0.tar.xz /modulemd-1.4.1.tar.xz /modulemd-1.5.0.tar.xz /modulemd-1.5.1.tar.xz /modulemd-1.5.2.tar.xz /modulemd-1.6.0.tar.xz /modulemd-1.6.1.tar.xz /modulemd-1.6.2.tar.xz /modulemd-1.6.3.tar.xz /modulemd-1.6.4.tar.xz /modulemd-1.7.0.tar.xz /modulemd-2.0.0beta2.tar.xz /modulemd-2.0.0.tar.xz /modulemd-2.1.0.tar.xz /modulemd-2.2.0.tar.xz /modulemd-2.2.1.tar.xz /modulemd-2.2.2.tar.xz /modulemd-2.2.3.tar.xz /modulemd-2.3.0.tar.xz /modulemd-2.3.1.tar.xz /modulemd-2.4.0.tar.xz /modulemd-2.5.0.tar.xz /modulemd-2.6.0.tar.xz /modulemd-2.7.0.tar.xz /modulemd-2.8.0.tar.xz /modulemd-2.8.1.tar.xz /modulemd-2.8.2.tar.xz /modulemd-2.8.3.tar.xz /modulemd-2.9.0.tar.xz /modulemd-2.9.1.tar.xz /modulemd-2.9.2.tar.xz /modulemd-2.9.3.tar.xz /modulemd-2.9.4.tar.xz fedora-modularity-libmodulemd-357799c/fedora/README.md000066400000000000000000000002101502446517500224510ustar00rootroot00000000000000# libmodulemd C Library for manipulating module metadata files See https://github.com/fedora-modularity/libmodulemd for more details. fedora-modularity-libmodulemd-357799c/fedora/README.packit000066400000000000000000000001511502446517500233300ustar00rootroot00000000000000This repository is maintained by packit. https://packit.dev/ The file was generated using packit 0.10.1. fedora-modularity-libmodulemd-357799c/fedora/gating.yaml000066400000000000000000000010021502446517500233270ustar00rootroot00000000000000--- !Policy product_versions: - fedora-* decision_context: bodhi_update_push_testing subject_type: koji_build rules: - !PassingTestCaseRule {test_case_name: fedora-ci.koji-build.tier0.functional} - !PassingTestCaseRule {test_case_name: dist.abicheck} --- !Policy product_versions: - fedora-* decision_context: bodhi_update_push_stable subject_type: koji_build rules: - !PassingTestCaseRule {test_case_name: fedora-ci.koji-build.tier0.functional} - !PassingTestCaseRule {test_case_name: dist.abicheck} fedora-modularity-libmodulemd-357799c/fedora/libmodulemd.spec000066400000000000000000000075251502446517500243630ustar00rootroot00000000000000%if 0%{?rhel} && 0%{?rhel} <= 7 %global meson_python_flags -Dwith_py2=true %global build_python2 1 %else %global meson_python_flags -Dwith_py2=false %global build_python2 0 %endif %global upstream_name libmodulemd %if (0%{?rhel} && 0%{?rhel} <= 7) %global v2_suffix 2 %endif # Rawhide builds currently fail when building with LTO %define _lto_cflags %{nil} Name: %{upstream_name}%{?v2_suffix} Version: 0.0.0 Release: 0 Summary: Module metadata manipulation library License: MIT URL: https://github.com/fedora-modularity/libmodulemd Source0: %{url}/releases/download/%{upstream_name}-%{version}/modulemd-%{version}.tar.xz BuildRequires: meson >= 0.55 BuildRequires: pkgconfig BuildRequires: gcc BuildRequires: gcc-c++ BuildRequires: pkgconfig(gobject-2.0) BuildRequires: pkgconfig(gobject-introspection-1.0) BuildRequires: pkgconfig(yaml-0.1) BuildRequires: pkgconfig(gtk-doc) BuildRequires: glib2-doc BuildRequires: rpm-devel %if %{build_python2} BuildRequires: python2-devel BuildRequires: python-gobject-base %endif BuildRequires: python%{python3_pkgversion}-devel BuildRequires: python%{python3_pkgversion}-gobject-base # Patches %description C Library for manipulating module metadata files. See https://github.com/fedora-modularity/libmodulemd/blob/main/README.md for more details. %if %{build_python2} %package -n python2-%{name} Summary: Python 2 bindings for %{name} Requires: %{name}%{?_isa} = %{version}-%{release} Requires: python-gobject-base Requires: python-six %description -n python2-%{name} Python 2 bindings for %{name} %endif %package -n python%{python3_pkgversion}-%{name} Summary: Python 3 bindings for %{name} Requires: %{name}%{?_isa} = %{version}-%{release} Requires: python%{python3_pkgversion}-gobject-base %if (0%{?rhel} && 0%{?rhel} <= 7) # The py3_dist macro on EPEL 7 doesn't work right at the moment Requires: python3.6dist(six) %else Requires: %{py3_dist six} %endif %description -n python%{python3_pkgversion}-%{name} Python %{python3_pkgversion} bindings for %{name} %package devel Summary: Development files for libmodulemd Requires: %{name}%{?_isa} = %{version}-%{release} %if (0%{?rhel} && 0%{?rhel} <= 7) Conflicts: libmodulemd1-devel Conflicts: libmodulemd-devel %endif %description devel Development files for libmodulemd. %prep %autosetup -p1 -n modulemd-%{version} %build %meson %{meson_python_flags} %meson_build %check export LC_CTYPE=C.utf8 # Don't run tests on ARM for now. There are problems with # performance on the builders and often these time out. %ifnarch %{arm} # The tests sometimes time out in CI, so give them a little extra time %{__meson} test -C %{_vpath_builddir} %{?_smp_mesonflags} --print-errorlogs -t 5 %endif %install %meson_install %if ( 0%{?rhel} && 0%{?rhel} <= 7) # Don't conflict with modulemd-validator from 1.x included in the official # RHEL 7 repos mv %{buildroot}%{_bindir}/modulemd-validator \ %{buildroot}%{_bindir}/modulemd-validator%{?v2_suffix} mv %{buildroot}%{_mandir}/man1/modulemd-validator.1 \ %{buildroot}%{_mandir}/man1/modulemd-validator%{?v2_suffix}.1 %endif %ldconfig_scriptlets %files %license COPYING %doc NEWS README.md %{_bindir}/modulemd-validator%{?v2_suffix} %{_mandir}/man1/modulemd-validator%{?v2_suffix}.1* %{_libdir}/%{upstream_name}.so.2* %dir %{_libdir}/girepository-1.0 %{_libdir}/girepository-1.0/Modulemd-2.0.typelib %files devel %{_libdir}/%{upstream_name}.so %{_libdir}/pkgconfig/modulemd-2.0.pc %{_includedir}/modulemd-2.0/ %dir %{_datadir}/gir-1.0 %{_datadir}/gir-1.0/Modulemd-2.0.gir %dir %{_datadir}/gtk-doc %dir %{_datadir}/gtk-doc/html %{_datadir}/gtk-doc/html/modulemd-2.0/ %if %{build_python2} %files -n python2-%{name} %{python2_sitearch}/gi/overrides/ %endif %files -n python%{python3_pkgversion}-%{name} %{python3_sitearch}/gi/overrides/ %changelog fedora-modularity-libmodulemd-357799c/fedora/sources000066400000000000000000000002421502446517500226050ustar00rootroot00000000000000SHA512 (modulemd-2.9.4.tar.xz) = f1feec56507cf294ce01a24b77fb851671d331408ecf7dd453eb2b39dc5eb5548b6376b6b1b8e5ccbc75503e1260651e8c1995e2d3b29830e1c322451f861a11 fedora-modularity-libmodulemd-357799c/fedora/tests.yml000066400000000000000000000013271502446517500230710ustar00rootroot00000000000000--- - hosts: localhost tags: - classic roles: - role: standard-test-source - hosts: localhost tags: - classic tasks: - name: Make sure fedpkg and selinux bindings are installed shell: dnf -y install --skip-broken fedpkg python3-libselinux libmodulemd-devel - name: Copy spec file to remote machine copy: src: "{{ playbook_dir }}/../libmodulemd.spec" dest: /tmp/libmodulemd.spec - name: Install build deps shell: dnf -y builddep /tmp/libmodulemd.spec - hosts: localhost tags: - classic roles: - role: standard-test-basic tests: - build: dir: . run: meson -Dtest_installed_lib=true source - unittests: dir: . run: ninja test fedora-modularity-libmodulemd-357799c/get_version.sh000077500000000000000000000002441502446517500226240ustar00rootroot00000000000000#!/usr/bin/env bash SOURCE_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )" cd $SOURCE_DIR grep "^version" meson.build | sed -e "s/[^']*'//" -e "s/'.*$//" fedora-modularity-libmodulemd-357799c/meson.build000066400000000000000000000155601502446517500221120ustar00rootroot00000000000000# This file is part of libmodulemd # Copyright (C) 2017-2018 Stephen Gallagher # # Fedora-License-Identifier: MIT # SPDX-2.0-License-Identifier: MIT # SPDX-3.0-License-Identifier: MIT # # This program is free software. # For more information on the license, see COPYING. # For more information on free software, see . project( 'modulemd', 'c', version : '2.15.2', default_options : ['buildtype=debugoptimized', 'c_std=c11', 'warning_level=1', 'b_asneeded=true'], license : 'MIT', meson_version : '>=0.55.0' ) libmodulemd_version = meson.project_version() cc = meson.get_compiler('c') test_cflags = [ '-Wpointer-arith', '-Werror=missing-declarations', '-Wmissing-prototypes', '-Wstrict-prototypes', '-Wuninitialized', ['-Werror=format-security', '-Werror=format=2'], # Must be checked together '-Werror=implicit', '-Werror=init-self', '-Werror=main', '-Werror=missing-braces', '-Werror=return-type', '-Werror=array-bounds', '-Werror=write-strings', '-D_GNU_SOURCE', '-DG_LOG_USE_STRUCTURED', '-DG_LOG_DOMAIN="libmodulemd"', ] foreach cflag: test_cflags if cc.has_multi_arguments(cflag) add_project_arguments(cflag, language : 'c') endif endforeach pymod = import('python') gnome = import('gnome') pkg = import('pkgconfig') gobject = dependency('gobject-2.0') yaml = dependency('yaml-0.1') with_libmagic = get_option('libmagic') if with_libmagic.enabled() or with_libmagic.disabled() warning('libmagic option is obsolete. libmodulemd can detect compression formats without a magic library now. Please stop using this option. It will be removed in the future and will cause a meson failure.') endif with_rpmio = get_option('rpmio') rpm = dependency('rpm', required : with_rpmio) glib = dependency('glib-2.0') glib_prefix = glib.get_variable(pkgconfig: 'prefix') bash = find_program('bash') sed = find_program('sed') test = find_program('test') with_docs = get_option('with_docs') gtk_doc_referred_paths = [] if with_docs gtkdoc = dependency('gtk-doc') if glib.version().version_compare('<2.79.0') glib_docpath = join_paths(glib_prefix, 'share', 'gtk-doc', 'html') glib_modules = ['glib', 'gobject' ] else warning('glib >= 2.79.0 documention might not be properly referred from libmodulemd documentation.') if glib.version().version_compare('<2.80.1') glib_docpath = join_paths(glib_prefix, 'share', 'doc', 'glib-2.0') glib_modules = ['glib', 'gobject' ] else glib_docpath = join_paths(glib_prefix, 'share', 'doc') glib_modules = ['glib-2.0', 'gobject-2.0' ] endif endif foreach referred_module : glib_modules doc_module_path = join_paths(glib_docpath, referred_module) doc_index_file = join_paths(doc_module_path, 'index.html') ret = run_command ([test, '-e', doc_index_file], check: false) if ret.returncode() != 0 error('Missing GTK documentation for @0@: @1@'.format(referred_module, doc_index_file)) endif gtk_doc_referred_paths += [ doc_module_path ] endforeach endif # Keep with_manpages option a tristate feature for backward compatibility. if get_option('with_manpages').disabled() with_manpages = false else with_manpages = true endif # Check whether this version of glib has the GDate autoptr defined gdate_check = '''#include int main (int argc, char **argv) { g_autoptr(GDate) date = NULL; return 0; } ''' has_gdate_autoptr = cc.compiles( gdate_check, dependencies : [ glib ], name : 'g_autoptr(GDate)') # Check whether glib2 has g_ptr_array_extend_and_steal or if we # need to bundle it. has_extend_and_steal = cc.has_function( 'g_ptr_array_extend_and_steal', dependencies : [ glib ]) # Check whether we can use a new g_spawn_check_wait_status() from glib2. has_g_spawn_check_wait_status = cc.has_function( 'g_spawn_check_wait_status', dependencies : [ glib ]) with_py3 = get_option('with_py3') if with_py3 if get_option('skip_introspection') error('A Python3 binding requires a GObject introspection.') endif python_name = get_option('python_name') if python_name != '' # If we've been instructed to use a specific python version python3 = pymod.find_installation(python_name) else # Use the python installation that is running meson python3 = pymod.find_installation() endif # Verify Python version . python3_version = python3.language_version() if not python3_version.startswith('3.') error('Python3 interpreter has an unexpected version: @0@'.format(python3_version)) endif else python3 = disabler() endif with_py2 = get_option('with_py2') if with_py2 if get_option('skip_introspection') error('A Python2 binding requires a GObject introspection.') endif python2 = pymod.find_installation('python2') # Verify Python version . python2_version = python2.language_version() if not python2_version.startswith('2.') error('Python2 interpreter has an unexpected version:', python2_version) endif else python2 = disabler() endif rpm_cdata = configuration_data() rpm_cdata.set('VERSION', meson.project_version()) rpm_cdata.set('BUILDFLAG', '-bb') srpm_cdata = configuration_data() srpm_cdata.set('VERSION', meson.project_version()) srpm_cdata.set('BUILDFLAG', '-bs') subdir('modulemd') subdir('bindings/python') if rpm.found() if with_rpmio.enabled() rpmio_status = 'Enabled' elif with_rpmio.auto() rpmio_status = 'Enabled (autodetected)' else error('rpmio state is unknown') endif else if with_rpmio.disabled() rpmio_status = 'Disabled' elif with_rpmio.auto() rpmio_status = 'Disabled (autodetection could not locate librpm)' else error('rpmio state is unknown') endif endif if with_manpages manpages_status = 'Enabled' else manpages_status = 'Disabled' endif summary({'prefix': get_option('prefix'), 'bindir': get_option('bindir'), 'libdir': get_option('libdir'), 'datadir': get_option('datadir'), 'Python 2 GObject Overrides': gobject_overrides_dir_py2, 'Python 3 GObject Overrides': gobject_overrides_dir_py3, 'GTK-Doc Referred Paths': gtk_doc_referred_paths, }, section: 'Directories') summary({'Custom Python': get_option('python_name'), 'RPMIO Support': rpmio_status, 'Generate Manual Pages': manpages_status, 'Generate HTML Documentation': get_option('with_docs'), 'Python 2 Support': get_option('with_py2'), 'Python 3 Support': get_option('with_py3'), 'Skip Introspection': get_option('skip_introspection'), 'Accept overflowed buildorder': get_option('accept_overflowed_buildorder'), 'Test Installed Library': get_option('test_installed_lib'), }, section: 'Build Configuration') fedora-modularity-libmodulemd-357799c/meson_options.txt000066400000000000000000000050421502446517500233770ustar00rootroot00000000000000# This file is part of libmodulemd # Copyright (C) 2017-2018 Stephen Gallagher # # Fedora-License-Identifier: MIT # SPDX-2.0-License-Identifier: MIT # SPDX-3.0-License-Identifier: MIT # # This program is free software. # For more information on the license, see COPYING. # For more information on free software, see . # # REMEMBER TO UPDATE THE SUMMARY() IN meson.build when adding options here option('accept_overflowed_buildorder', type : 'boolean', value: false, description : 'Accept overflowed 18446744073709551615 buildorder as -1. This breaks a specification, but some RHEL 8 module builds look like that.') option('verbose_tests', type : 'boolean', value : true, description : 'Tests that are run under the "debug" configuration will print all debug messages. Disable this option for valgrind checks, as it speeds it up substantially.') option('libmagic', type : 'feature', value : 'auto', description : 'This option is ignored and will be removed in the future.') option('python_name', type : 'string', description : 'The name of the Python 3 interpreter to use for generating Python bindings and running tests. If left blank, it defaults to the version of Python 3 being used to run meson.') option('rpmio', type : 'feature', value : 'enabled', description : 'Use the rpmio library to automatically decompress gzip, bzip2 and xz YAML streams.') option('skip_introspection', type : 'boolean', value : false, description : 'Do not generate GObject Introspection data.') option('test_installed_lib', type : 'boolean', value : false, description : 'Build only the test suite and run it against a copy of libmodulemd installed on the local system.') option('with_docs', type : 'boolean', value : true, description : 'Build API documentation.') option('with_manpages', type : 'feature', value : 'auto', description : 'Build manual pages for included executables.') option('with_py2', type : 'boolean', value : false, description : 'Build Python 2 language bindings and run Python 2 tests.') option('with_py3', type : 'boolean', value : true, description : 'Build Python 3 language bindings and run Python 3 tests.') option('gobject_overrides_dir_py2', type : 'string', description : 'Path to Python 2 PyGObject overrides directory. Leave empty to determine it automatically.') option('gobject_overrides_dir_py3', type : 'string', description : 'Path to Python 3 PyGObject overrides directory. Leave empty to determine it automatically.') fedora-modularity-libmodulemd-357799c/modulemd/000077500000000000000000000000001502446517500215475ustar00rootroot00000000000000fedora-modularity-libmodulemd-357799c/modulemd/clang_simple_version.sh000077500000000000000000000000761502446517500263130ustar00rootroot00000000000000#!/bin/sh $1 --version | awk '/LLVM version/ {print $NF}' - fedora-modularity-libmodulemd-357799c/modulemd/include/000077500000000000000000000000001502446517500231725ustar00rootroot00000000000000fedora-modularity-libmodulemd-357799c/modulemd/include/modulemd-2.0/000077500000000000000000000000001502446517500252755ustar00rootroot00000000000000fedora-modularity-libmodulemd-357799c/modulemd/include/modulemd-2.0/modulemd-build-config.h000066400000000000000000000220061502446517500316140ustar00rootroot00000000000000/* * This file is part of libmodulemd * Copyright (C) 2020 Red Hat, Inc. * * Fedora-License-Identifier: MIT * SPDX-2.0-License-Identifier: MIT * SPDX-3.0-License-Identifier: MIT * * This program is free software. * For more information on the license, see COPYING. * For more information on free software, see . */ #pragma once #include "modulemd-buildopts.h" #include G_BEGIN_DECLS /** * SECTION: modulemd-build-config * @title: Modulemd.BuildConfig * @stability: stable * @short_description: The data to represent a configuration for building a * module stream. */ #define MODULEMD_TYPE_BUILD_CONFIG (modulemd_build_config_get_type ()) G_DECLARE_FINAL_TYPE ( ModulemdBuildConfig, modulemd_build_config, MODULEMD, BUILD_CONFIG, GObject) /** * modulemd_build_config_new: * * Initialize a new #ModulemdBuildConfig representing a module build * configuration. * * Since: 2.11 */ ModulemdBuildConfig * modulemd_build_config_new (void); /** * modulemd_build_config_set_context: * @self: This #ModulemdBuildConfig object. * @context: A string of up to ten alphanumeric characters. * * Set the context that this build configuration produces. * * Note: For consistency in the API, this function does not validate the input * @context. This validation will be performed as part of the * modulemd_build_config_validate() routine where it can be reported cleanly. * * Since: 2.11 */ void modulemd_build_config_set_context (ModulemdBuildConfig *self, const gchar *context); /** * modulemd_build_config_get_context: * @self: This #ModulemdBuildConfig object. * * Get the context that this build configuration produces. * * Note: This function returns the context as stored internally. If you want to * be sure that it is in the correct format, call * modulemd_build_config_validate() first. * * Returns: (transfer none): The string representing the context that this * build configuration produces. * * Since: 2.11 */ const gchar * modulemd_build_config_get_context (ModulemdBuildConfig *self); /** * modulemd_build_config_set_platform: * @self: This #ModulemdBuildConfig object. * @platform: A string of up to ten alphanumeric characters. * * Set the platform that this build configuration applies to. * * Since: 2.11 */ void modulemd_build_config_set_platform (ModulemdBuildConfig *self, const gchar *platform); /** * modulemd_build_config_get_platform: * @self: This #ModulemdBuildConfig object. * * Get the platform that this build configuration applies to. * * Returns: (transfer none): The string representing the platform that this * build configuration applies to. * * Since: 2.11 */ const gchar * modulemd_build_config_get_platform (ModulemdBuildConfig *self); /** * modulemd_build_config_add_runtime_requirement: * @self: (in): This #ModulemdBuildConfig object. * @module_name: (in): The name of the module to depend on. * @stream_name: (in): The name of the module stream to depend on. * * Add a build-time dependency for this module. * * Since: 2.11 */ void modulemd_build_config_add_runtime_requirement (ModulemdBuildConfig *self, const gchar *module_name, const gchar *stream_name); /** * modulemd_build_config_remove_runtime_requirement: * @self: (in): This #ModulemdBuildConfig object. * @module_name: (in): The name of the module to be removed. * * Remove a run-time dependency for this module. * * Since: 2.11 */ void modulemd_build_config_remove_runtime_requirement (ModulemdBuildConfig *self, const gchar *module_name); /** * modulemd_build_config_clear_runtime_requirements * @self: (in): This #ModulemdBuildConfig object. * * Remove all run-time dependencies for this module. * * Since: 2.11 */ void modulemd_build_config_clear_runtime_requirements (ModulemdBuildConfig *self); /** * modulemd_build_config_get_runtime_requirement_stream: * @self: (in): This #ModulemdBuildConfig object. * @module_name: (in): The name of the module this module depends on. * * Returns: (transfer none): The name of the stream matching this module name * in the run-time dependencies. * * Since: 2.11 */ const gchar * modulemd_build_config_get_runtime_requirement_stream ( ModulemdBuildConfig *self, const gchar *module_name); /** * modulemd_build_config_get_runtime_modules_as_strv: * @self: (in): This #ModulemdBuildConfig object. * * Returns: (transfer full): An ordered #GStrv list of module names that this * module depends on at run-time. * * Since: 2.11 */ GStrv modulemd_build_config_get_runtime_modules_as_strv (ModulemdBuildConfig *self); /** * modulemd_build_config_add_buildtime_requirement: * @self: (in): This #ModulemdBuildConfig object. * @module_name: (in): The name of the module to depend on. * @stream_name: (in): The name of the module stream to depend on. * * Add a build-time dependency for this module. * * Since: 2.11 */ void modulemd_build_config_add_buildtime_requirement (ModulemdBuildConfig *self, const gchar *module_name, const gchar *stream_name); /** * modulemd_build_config_remove_buildtime_requirement: * @self: (in): This #ModulemdBuildConfig object. * @module_name: (in): The name of the module to be removed. * * Remove a build-time dependency for this module. * * Since: 2.11 */ void modulemd_build_config_remove_buildtime_requirement (ModulemdBuildConfig *self, const gchar *module_name); /** * modulemd_build_config_clear_buildtime_requirements * @self: (in): This #ModulemdBuildConfig object. * * Remove all build-time dependencies for this module. * * Since: 2.11 */ void modulemd_build_config_clear_buildtime_requirements (ModulemdBuildConfig *self); /** * modulemd_build_config_get_buildtime_requirement_stream: * @self: (in): This #ModulemdBuildConfig object. * @module_name: (in): The name of the module this module depends on. * * Returns: (transfer none): The name of the stream matching this module name * in the build-time dependencies. * * Since: 2.11 */ const gchar * modulemd_build_config_get_buildtime_requirement_stream ( ModulemdBuildConfig *self, const gchar *module_name); /** * modulemd_build_config_get_buildtime_modules_as_strv: * @self: (in): This #ModulemdBuildConfig object. * * Returns: (transfer full): An ordered #GStrv list of module names that this * module depends on at build-time. * * Since: 2.11 */ GStrv modulemd_build_config_get_buildtime_modules_as_strv ( ModulemdBuildConfig *self); /** * modulemd_build_config_set_buildopts: * @self: (in): This #ModulemdBuildConfig object. * @buildopts: (in) (transfer none): A #ModulemdBuildopts object describing * build options that apply globally to components in this module. * * Set build options for this module's components. * * Since: 2.11 */ void modulemd_build_config_set_buildopts (ModulemdBuildConfig *self, ModulemdBuildopts *buildopts); /** * modulemd_build_config_get_buildopts: * @self: (in): This #ModulemdBuildConfig object. * * Returns: (transfer none): The build options for this module's components. * * Since: 2.11 */ ModulemdBuildopts * modulemd_build_config_get_buildopts (ModulemdBuildConfig *self); /** * modulemd_build_config_validate: * @self: (in): This #ModulemdBuildConfig object. * @error: (out): A #GError explaining any validation failure. * * Determine if this #ModulemdBuildConfig is valid according to the YAML * specification. * * Returns: TRUE if validation passes. Returns FALSE and sets @error * appropriately on validation failure. * * Since: 2.11 */ gboolean modulemd_build_config_validate (ModulemdBuildConfig *self, GError **error); /** * modulemd_build_config_copy: * @self: (in): This #ModulemdBuildConfig object * * Returns: (transfer full): A deep copy of @self * * Since: 2.11 */ ModulemdBuildConfig * modulemd_build_config_copy (ModulemdBuildConfig *self); /** * modulemd_build_config_equals: * @self_1: A pointer to a #ModulemdBuildConfig object. * @self_2: A pointer to a #ModulemdBuildConfig object. * * Returns: TRUE, if @self_1 and @self_2 are pointers to #ModulemdBuildConfig * objects containing equivalent data. FALSE, otherwise. * * Since: 2.11 */ gboolean modulemd_build_config_equals (ModulemdBuildConfig *self_1, ModulemdBuildConfig *self_2); /** * modulemd_build_config_compare: * @self_1: (in): A pointer to a #ModulemdBuildConfig object. * @self_2: (in): A pointer to a #ModulemdBuildConfig object. * * Returns: Less than zero if @self_1 sorts less than @self_2, zero for equal, * greater than zero if @self_1 is greater than @self_2. * * Since: 2.11 */ gint modulemd_build_config_compare (ModulemdBuildConfig *self_1, ModulemdBuildConfig *self_2); G_END_DECLS fedora-modularity-libmodulemd-357799c/modulemd/include/modulemd-2.0/modulemd-buildopts.h000066400000000000000000000115261502446517500312640ustar00rootroot00000000000000/* * This file is part of libmodulemd * Copyright (C) 2018 Red Hat, Inc. * * Fedora-License-Identifier: MIT * SPDX-2.0-License-Identifier: MIT * SPDX-3.0-License-Identifier: MIT * * This program is free software. * For more information on the license, see COPYING. * For more information on free software, see . */ #pragma once #include G_BEGIN_DECLS /** * SECTION: modulemd-buildopts * @title: Modulemd.Buildopts * @stability: stable * @short_description: Provides hints to the build-system on how to build this module. */ #define MODULEMD_TYPE_BUILDOPTS (modulemd_buildopts_get_type ()) G_DECLARE_FINAL_TYPE ( ModulemdBuildopts, modulemd_buildopts, MODULEMD, BUILDOPTS, GObject) /** * modulemd_buildopts_new: * * Returns: (transfer full): A newly-allocated #ModulemdBuildopts object. This * object must be freed with g_object_unref(). * * Since: 2.0 */ ModulemdBuildopts * modulemd_buildopts_new (void); /** * modulemd_buildopts_equals: * @self_1: A #ModulemdBuildopts object. * @self_2: A #ModulemdBuildopts object. * * Check for equality for two #ModulemdBuildopts objects. * * Returns: TRUE if both objects are equal, FALSE otherwise. * * Since: 2.2 */ gboolean modulemd_buildopts_equals (ModulemdBuildopts *self_1, ModulemdBuildopts *self_2); /** * modulemd_buildopts_copy: * @self: This #ModulemdBuildopts object. * * Create a copy of this #ModulemdBuildopts object. * * Returns: (transfer full): A newly-allocated #ModulemdBuildopts object that * is a copy of @self. * * Since: 2.0 */ ModulemdBuildopts * modulemd_buildopts_copy (ModulemdBuildopts *self); /** * modulemd_buildopts_set_rpm_macros: * @self: This #ModulemdBuildopts object. * @rpm_macros: A string containing RPM build macros in the form that they * would appear in an RPM macros file on-disk. * * Since: 2.0 */ void modulemd_buildopts_set_rpm_macros (ModulemdBuildopts *self, const gchar *rpm_macros); /** * modulemd_buildopts_get_rpm_macros: * @self: This #ModulemdBuildopts object. * * Returns: (transfer none): A string containing RPM build macros in the form * that they would appear in an RPM macros file on-disk. * * Since: 2.0 */ const gchar * modulemd_buildopts_get_rpm_macros (ModulemdBuildopts *self); /** * modulemd_buildopts_add_rpm_to_whitelist: * @self: This #ModulemdBuildopts object. * @rpm: An RPM name to add to the whitelist. * * Since: 2.0 */ void modulemd_buildopts_add_rpm_to_whitelist (ModulemdBuildopts *self, const gchar *rpm); /** * modulemd_buildopts_remove_rpm_from_whitelist: * @self: This #ModulemdBuildopts object. * @rpm: An RPM name to remove from the whitelist. * * Since: 2.0 */ void modulemd_buildopts_remove_rpm_from_whitelist (ModulemdBuildopts *self, const gchar *rpm); /** * modulemd_buildopts_clear_rpm_whitelist: * @self: This #ModulemdBuildopts object. * * Remove all RPMs from the whitelist. * * Since: 2.5 */ void modulemd_buildopts_clear_rpm_whitelist (ModulemdBuildopts *self); /** * modulemd_buildopts_get_rpm_whitelist_as_strv: (rename-to modulemd_buildopts_get_rpm_whitelist) * @self: This #ModulemdBuildopts object. * * Returns: (transfer full): An ordered #GStrv list of all RPMs in the whitelist. * * Since: 2.0 */ GStrv modulemd_buildopts_get_rpm_whitelist_as_strv (ModulemdBuildopts *self); /** * modulemd_buildopts_add_arch: * @self: This #ModulemdBuildopts object. * @arch: An architecture for which to build this module. * * Restrict the list of architectures for which to build this module. It may be * called any number of times to indicate support on additional architectures. * Use modulemd_buildopts_clear_arches() to return to "all architectures". * * Since: 2.9 */ void modulemd_buildopts_add_arch (ModulemdBuildopts *self, const gchar *arch); /** * modulemd_buildopts_remove_arch: * @self: This #ModulemdBuildopts object. * @arch: An architecture to remove from the list of architectures for which to * build this module. * * Since: 2.9 */ void modulemd_buildopts_remove_arch (ModulemdBuildopts *self, const gchar *arch); /** * modulemd_buildopts_clear_arches: * @self: This #ModulemdBuildopts object. * * Indicate that this module should be built for all architectures. * * Since: 2.9 */ void modulemd_buildopts_clear_arches (ModulemdBuildopts *self); /** * modulemd_buildopts_get_arches_as_strv: (rename-to modulemd_buildopts_get_arches) * @self: This #ModulemdBuildopts object. * * Returns: (transfer full): A #GStrv list of architectures for which this * module should be built. If empty, this module should be built for all * architectures. * * Since: 2.9 */ GStrv modulemd_buildopts_get_arches_as_strv (ModulemdBuildopts *self); G_END_DECLS fedora-modularity-libmodulemd-357799c/modulemd/include/modulemd-2.0/modulemd-component-module.h000066400000000000000000000046231502446517500325440ustar00rootroot00000000000000/* * This file is part of libmodulemd * Copyright (C) 2018 Red Hat, Inc. * * Fedora-License-Identifier: MIT * SPDX-2.0-License-Identifier: MIT * SPDX-3.0-License-Identifier: MIT * * This program is free software. * For more information on the license, see COPYING. * For more information on free software, see . */ #pragma once #include "modulemd-component.h" #include G_BEGIN_DECLS /** * SECTION: modulemd-component-module * @title: Modulemd.ComponentModule * @stability: stable * @short_description: A module component that goes into a module stream. */ #define MODULEMD_TYPE_COMPONENT_MODULE (modulemd_component_module_get_type ()) G_DECLARE_FINAL_TYPE (ModulemdComponentModule, modulemd_component_module, MODULEMD, COMPONENT_MODULE, ModulemdComponent) /** * modulemd_component_module_new: * @key: (not nullable): The key of this module component. Used when looking up * components from a #ModulemdModuleStream. * * Returns: (transfer full): A newly-allocated #ModulemdComponentModule object. * * Since: 2.0 */ ModulemdComponentModule * modulemd_component_module_new (const gchar *key); /** * modulemd_component_module_set_ref: * @self: This #ModulemdComponentModule object. * @ref: (in) (nullable): The commit ID in the SCM repository. * * Since: 2.0 */ void modulemd_component_module_set_ref (ModulemdComponentModule *self, const gchar *ref); /** * modulemd_component_module_get_ref: * @self: This #ModulemdComponentModule object. * * Returns: (transfer none): The commit ID in the SCM repository. * * Since: 2.0 */ const gchar * modulemd_component_module_get_ref (ModulemdComponentModule *self); /** * modulemd_component_module_set_repository: * @self: This #ModulemdComponentModule object. * @repository: (in) (nullable): The URI of the SCM repository. * * Since: 2.0 */ void modulemd_component_module_set_repository (ModulemdComponentModule *self, const gchar *repository); /** * modulemd_component_module_get_repository: * @self: This #ModulemdComponentModule object. * * Returns: (transfer none): The URI of the SCM repository. * * Since: 2.0 */ const gchar * modulemd_component_module_get_repository (ModulemdComponentModule *self); G_END_DECLS fedora-modularity-libmodulemd-357799c/modulemd/include/modulemd-2.0/modulemd-component-rpm.h000066400000000000000000000160521502446517500320540ustar00rootroot00000000000000/* * This file is part of libmodulemd * Copyright (C) 2018 Red Hat, Inc. * * Fedora-License-Identifier: MIT * SPDX-2.0-License-Identifier: MIT * SPDX-3.0-License-Identifier: MIT * * This program is free software. * For more information on the license, see COPYING. * For more information on free software, see . */ #pragma once #include "modulemd-component.h" #include "modulemd-deprecated.h" #include G_BEGIN_DECLS /** * SECTION: modulemd-component-rpm * @title: Modulemd.ComponentRpm * @stability: stable * @short_description: An rpm component that goes into a module stream. */ #define MODULEMD_TYPE_COMPONENT_RPM (modulemd_component_rpm_get_type ()) G_DECLARE_FINAL_TYPE (ModulemdComponentRpm, modulemd_component_rpm, MODULEMD, COMPONENT_RPM, ModulemdComponent) /** * modulemd_component_rpm_new: * @key: (not nullable): The key of this module component. Used when looking up * components from a #ModulemdModuleStream. * * Returns: (transfer full): A newly-allocated #ModulemdComponentRpm object. * * Since: 2.0 */ ModulemdComponentRpm * modulemd_component_rpm_new (const gchar *key); /** * modulemd_component_rpm_add_restricted_arch: * @self: This #ModulemdComponentRpm object. * @arch: An architecture on which this package should be available. * * Restrict the list of architectures on which this RPM will be available. It * may be called any number of times to indicate support on additional * architectures. Use modulemd_component_rpm_clear_arches() to return to "all * architectures". * * Since: 2.0 */ void modulemd_component_rpm_add_restricted_arch (ModulemdComponentRpm *self, const gchar *arch); /** * modulemd_component_rpm_reset_arches: * @self: This #ModulemdComponentRpm object. * * Indicate that this RPM component is available on all arches. * * Since: 2.0 * Deprecated: 2.9: Use modulemd_component_rpm_clear_arches() instead. */ MMD_DEPRECATED_FOR (modulemd_component_rpm_clear_arches) void modulemd_component_rpm_reset_arches (ModulemdComponentRpm *self); /** * modulemd_component_rpm_clear_arches: * @self: This #ModulemdComponentRpm object. * * Indicate that this RPM component is available on all arches. * * Since: 2.9 */ void modulemd_component_rpm_clear_arches (ModulemdComponentRpm *self); /** * modulemd_component_rpm_get_arches_as_strv: (rename-to modulemd_component_rpm_get_arches) * @self: This #ModulemdComponentRpm object. * * Returns: (transfer full): A #GStrv list of architectures on which this RPM * should be available. * * Since: 2.0 */ GStrv modulemd_component_rpm_get_arches_as_strv (ModulemdComponentRpm *self); /** * modulemd_component_rpm_add_multilib_arch: * @self: This #ModulemdComponentRpm object. * @arch: An architecture on which this package should be multilib. * * Add an architecture on which this RPM will be multilib. It may be called * any number of times. Use modulemd_component_rpm_clear_multilib_arches() to * return to "no architectures". * * Since: 2.0 */ void modulemd_component_rpm_add_multilib_arch (ModulemdComponentRpm *self, const gchar *arch); /** * modulemd_component_rpm_reset_multilib_arches: * @self: This #ModulemdComponentRpm object. * * Indicate that this RPM component is multilib on no architectures. * * Since: 2.0 * Deprecated: 2.9: Use modulemd_component_rpm_clear_multilib_arches() instead. */ MMD_DEPRECATED_FOR (modulemd_component_rpm_clear_multilib_arches) void modulemd_component_rpm_reset_multilib_arches (ModulemdComponentRpm *self); /** * modulemd_component_rpm_clear_multilib_arches: * @self: This #ModulemdComponentRpm object. * * Indicate that this RPM component is multilib on no architectures. * * Since: 2.9 */ void modulemd_component_rpm_clear_multilib_arches (ModulemdComponentRpm *self); /** * modulemd_component_rpm_get_multilib_arches_as_strv: (rename-to modulemd_component_rpm_get_multilib_arches) * @self: This #ModulemdComponentRpm object. * * Returns: (transfer full): A #GStrv list of architectures on which multilib * should be available. * * Since: 2.0 */ GStrv modulemd_component_rpm_get_multilib_arches_as_strv ( ModulemdComponentRpm *self); /** * modulemd_component_rpm_set_cache: * @self: This #ModulemdComponentRpm object. * @cache: (in) (nullable): The lookaside cache URL. * * Since: 2.0 */ void modulemd_component_rpm_set_cache (ModulemdComponentRpm *self, const gchar *cache); /** * modulemd_component_rpm_get_cache: * @self: This #ModulemdComponentRpm object. * * Returns: (transfer none): The lookaside cache URL. * * Since: 2.0 */ const gchar * modulemd_component_rpm_get_cache (ModulemdComponentRpm *self); /** * modulemd_component_rpm_set_ref: * @self: This #ModulemdComponentRpm object. * @ref: (in) (nullable): The commit ID in the SCM repository. * * Since: 2.0 */ void modulemd_component_rpm_set_ref (ModulemdComponentRpm *self, const gchar *ref); /** * modulemd_component_rpm_get_ref: * @self: This #ModulemdComponentRpm object. * * Returns: (transfer none): The commit ID in the SCM repository. * * Since: 2.0 */ const gchar * modulemd_component_rpm_get_ref (ModulemdComponentRpm *self); /** * modulemd_component_rpm_set_repository: * @self: This #ModulemdComponentRpm object. * @repository: (in) (nullable): The URI of the SCM repository. * * Since: 2.0 */ void modulemd_component_rpm_set_repository (ModulemdComponentRpm *self, const gchar *repository); /** * modulemd_component_rpm_get_repository: * @self: This #ModulemdComponentRpm object. * * Returns: (transfer none): The URI of the SCM repository. * * Since: 2.0 */ const gchar * modulemd_component_rpm_get_repository (ModulemdComponentRpm *self); /** * modulemd_component_rpm_set_buildroot: * @self: This #ModulemdComponentRpm object. * @buildroot: (in): The #ModulemdComponentRpm:buildroot flag to set for @self. * * Since: 2.7 */ void modulemd_component_rpm_set_buildroot (ModulemdComponentRpm *self, gboolean buildroot); /** * modulemd_component_rpm_get_buildroot: * @self: This #ModulemdComponentRpm object. * * Returns: The #ModulemdComponentRpm:buildroot flag. * * Since: 2.7 */ gboolean modulemd_component_rpm_get_buildroot (ModulemdComponentRpm *self); /** * modulemd_component_rpm_set_srpm_buildroot: * @self: This #ModulemdComponentRpm object. * @srpm_buildroot: (in): The #ModulemdComponentRpm:srpm_buildroot flag to set * for @self. * * Since: 2.7 */ void modulemd_component_rpm_set_srpm_buildroot (ModulemdComponentRpm *self, gboolean srpm_buildroot); /** * modulemd_component_rpm_get_srpm_buildroot: * @self: This #ModulemdComponentRpm object. * * Returns: The #ModulemdComponentRpm:srpm_buildroot flag. * * Since: 2.7 */ gboolean modulemd_component_rpm_get_srpm_buildroot (ModulemdComponentRpm *self); G_END_DECLS fedora-modularity-libmodulemd-357799c/modulemd/include/modulemd-2.0/modulemd-component.h000066400000000000000000000147451502446517500312670ustar00rootroot00000000000000/* * This file is part of libmodulemd * Copyright (C) 2018 Red Hat, Inc. * * Fedora-License-Identifier: MIT * SPDX-2.0-License-Identifier: MIT * SPDX-3.0-License-Identifier: MIT * * This program is free software. * For more information on the license, see COPYING. * For more information on free software, see . */ #pragma once #include G_BEGIN_DECLS /** * SECTION: modulemd-component * @title: Modulemd.Component * @stability: stable * @short_description: Pure virtual parent class for components that go into a module stream. */ #define MODULEMD_TYPE_COMPONENT (modulemd_component_get_type ()) G_DECLARE_DERIVABLE_TYPE ( ModulemdComponent, modulemd_component, MODULEMD, COMPONENT, GObject) struct _ModulemdComponentClass { GObjectClass parent_class; ModulemdComponent *(*copy) (ModulemdComponent *self, const gchar *key); void (*set_name) (ModulemdComponent *self, const gchar *name); const gchar *(*get_name) (ModulemdComponent *self); gboolean (*validate) (ModulemdComponent *self, GError **error); gboolean (*equals) (ModulemdComponent *self_1, ModulemdComponent *self_2); /* Padding to allow adding up to 7 new virtual functions without * breaking ABI. */ gpointer padding[7]; }; /** * modulemd_component_equals: * @self_1: A #ModulemdComponent object. * @self_2: A #ModulemdComponent object. * * Returns: TRUE, if both the objects are equal. FALSE, otherwise. * * Since: 2.3 */ gboolean modulemd_component_equals (ModulemdComponent *self_1, ModulemdComponent *self_2); /** * modulemd_component_copy: * @self: This #ModulemdComponent object. * @key: (in) (nullable): An optional new key for the copied component which is * used as the lookup key when this component is attached to a * #ModulemdModuleStream. * * Returns: (transfer full): A newly-allocated copy of @self. * * Since: 2.0 */ ModulemdComponent * modulemd_component_copy (ModulemdComponent *self, const gchar *key); /** * modulemd_component_validate: * @self: (in): This #ModulemdComponent object. * @error: (out): A #GError that will return the reason for a validation error. * * Verifies that all stored values are internally consistent and that the * component is sufficiently-complete for emitting. This function is called * implicitly before attempting to emit the contents. * * Returns: TRUE if the #ModulemdComponent passed validation. FALSE and sets * @error appropriately if validation fails. * * Since: 2.2 */ gboolean modulemd_component_validate (ModulemdComponent *self, GError **error); /** * modulemd_component_add_buildafter: * @self: This #ModulemdComponent object. * @key: (in): A key representing another component in the * #ModulemdModuleStream components map. * * Add a build dependency of this component. * * Since: 2.2 */ void modulemd_component_add_buildafter (ModulemdComponent *self, const gchar *key); /** * modulemd_component_clear_buildafter: * @self: This #ModulemdComponent object. * * Remove all buildafter entries for this component. * * Since: 2.5 */ void modulemd_component_clear_buildafter (ModulemdComponent *self); /** * modulemd_component_get_buildafter_as_strv: (rename-to modulemd_component_get_buildafter) * @self: This #ModulemdComponent object. * * Returns: (transfer full): The set of component keys that this component * depends upon. * * Since: 2.2 */ GStrv modulemd_component_get_buildafter_as_strv (ModulemdComponent *self); /** * modulemd_component_set_buildonly: * @self: This #ModulemdComponent object. * @buildonly: Whether this component is used only for building this module. If * set to TRUE, the build system should add any artifacts produced by this * component to the data.filters section of the output modulemd. * * Since: 2.2 */ void modulemd_component_set_buildonly (ModulemdComponent *self, gboolean buildonly); /** * modulemd_component_get_buildonly: * @self: This #ModulemdComponent object. * * Returns: TRUE if this component is used only for building this module. * * Since: 2.2 */ gboolean modulemd_component_get_buildonly (ModulemdComponent *self); /** * modulemd_component_set_buildorder: * @self: This #ModulemdComponent object. * @buildorder: The order this component should be built relative to others. * * Since: 2.0 */ void modulemd_component_set_buildorder (ModulemdComponent *self, gint64 buildorder); /** * modulemd_component_get_buildorder: * @self: This #ModulemdComponent object. * * Returns: The value of the buildorder. * * Since: 2.0 */ gint64 modulemd_component_get_buildorder (ModulemdComponent *self); /** * modulemd_component_set_name: * @self: This #ModulemdComponent object. * @name: (nullable): The name of this component. Note that this is different * from the key used to save this component to a #ModulemdModuleStream. If this * value is set, it adds a "name:" attribute to this component. This is used in * bootstrapping cases where the key is a different name used to differentiate * multiple ordered builds of the same component name. This function is * currently only implemented for #ModulemdComponentRpm and has no effect on * other #ModulemdComponent types. * * Since: 2.2 */ void modulemd_component_set_name (ModulemdComponent *self, const gchar *name); /** * modulemd_component_get_name: * @self: This #ModulemdComponent object. * * Returns: (transfer none): The name of the component. Note that this may be * different from the key used to save this component to a * #ModulemdModuleStream. If you specifically need the key, use * modulemd_component_get_key() instead. * * Since: 2.0 */ const gchar * modulemd_component_get_name (ModulemdComponent *self); /** * modulemd_component_get_key: * @self: This #ModulemdComponent object. * * Returns: (transfer none): The name of the key used to attach this component * to a #ModulemdModuleStream. * * Since: 2.2 */ const gchar * modulemd_component_get_key (ModulemdComponent *self); /** * modulemd_component_set_rationale: * @self: This #ModulemdComponent object. * @rationale: (in) (nullable): The reason that this component is part of the * stream. * * Since: 2.0 */ void modulemd_component_set_rationale (ModulemdComponent *self, const gchar *rationale); /** * modulemd_component_get_rationale: * @self: This #ModulemdComponent object. * * Returns: (transfer none): The rationale. * * Since: 2.0 */ const gchar * modulemd_component_get_rationale (ModulemdComponent *self); G_END_DECLS fedora-modularity-libmodulemd-357799c/modulemd/include/modulemd-2.0/modulemd-compression.h000066400000000000000000000042271502446517500316200ustar00rootroot00000000000000/* * This file is part of libmodulemd * Copyright (C) 2019 Red Hat, Inc. * * Fedora-License-Identifier: MIT * SPDX-2.0-License-Identifier: MIT * SPDX-3.0-License-Identifier: MIT * * This program is free software. * For more information on the license, see COPYING. * For more information on free software, see . */ #pragma once #include G_BEGIN_DECLS /** * SECTION: modulemd-compression * @title: Modulemd Compression Helpers * @stability: stable * @short_description: Utility functions for working with compressed files. */ /** * ModulemdCompressionTypeEnum: * @MODULEMD_COMPRESSION_TYPE_DETECTION_FAILED: Autodetection failure * @MODULEMD_COMPRESSION_TYPE_UNKNOWN_COMPRESSION: Unknown compression * @MODULEMD_COMPRESSION_TYPE_NO_COMPRESSION: No compression * @MODULEMD_COMPRESSION_TYPE_GZ_COMPRESSION: gzip compression * @MODULEMD_COMPRESSION_TYPE_BZ2_COMPRESSION: bzip2 compression * @MODULEMD_COMPRESSION_TYPE_XZ_COMPRESSION: LZMA compression * @MODULEMD_COMPRESSION_TYPE_ZCK_COMPRESSION: zchunk compression * @MODULEMD_COMPRESSION_TYPE_ZSTD_COMPRESSION: Zstandard compression; since 2.15 * @MODULEMD_COMPRESSION_TYPE_SENTINEL: Enum list terminator * * Since: 2.8 */ typedef enum { MODULEMD_COMPRESSION_TYPE_ZSTD_COMPRESSION = -3, MODULEMD_COMPRESSION_TYPE_DETECTION_FAILED = -2, MODULEMD_COMPRESSION_TYPE_UNKNOWN_COMPRESSION, MODULEMD_COMPRESSION_TYPE_NO_COMPRESSION, MODULEMD_COMPRESSION_TYPE_GZ_COMPRESSION, MODULEMD_COMPRESSION_TYPE_BZ2_COMPRESSION, MODULEMD_COMPRESSION_TYPE_XZ_COMPRESSION, MODULEMD_COMPRESSION_TYPE_ZCK_COMPRESSION, MODULEMD_COMPRESSION_TYPE_SENTINEL, } ModulemdCompressionTypeEnum; /** * modulemd_compression_type: * @name: (in): The name of the compression type. Valid options are: * "gz", "gzip", "bz2", "bzip2", "xz", "zck", and "zstd". * * Returns: The #ModulemdCompressionTypeEnum value corresponding to the * provided string if available or * #MODULEMD_COMPRESSION_TYPE_UNKNOWN_COMPRESSION if the string does not match * a known type. * * Since: 2.8 */ ModulemdCompressionTypeEnum modulemd_compression_type (const gchar *name); G_END_DECLS fedora-modularity-libmodulemd-357799c/modulemd/include/modulemd-2.0/modulemd-defaults-v1.h000066400000000000000000000150751502446517500314150ustar00rootroot00000000000000/* * This file is part of libmodulemd * Copyright (C) 2017-2018 Stephen Gallagher * * Fedora-License-Identifier: MIT * SPDX-2.0-License-Identifier: MIT * SPDX-3.0-License-Identifier: MIT * * This program is free software. * For more information on the license, see COPYING. * For more information on free software, see . */ #pragma once #include "modulemd-defaults.h" #include G_BEGIN_DECLS /** * SECTION: modulemd-defaults-v1 * @title: Modulemd.DefaultsV1 * @stability: stable * @short_description: Object representing a defaults document (version 1) */ #define MODULEMD_TYPE_DEFAULTS_V1 (modulemd_defaults_v1_get_type ()) G_DECLARE_FINAL_TYPE (ModulemdDefaultsV1, modulemd_defaults_v1, MODULEMD, DEFAULTS_V1, ModulemdDefaults) /** * modulemd_defaults_v1_new: * @module_name: (in): The name of the module to which these defaults apply. * * Returns: (transfer full): A newly-allocated #ModulemdDefaultsV1 object. * * Since: 2.0 */ ModulemdDefaultsV1 * modulemd_defaults_v1_new (const gchar *module_name); /** * modulemd_defaults_v1_set_default_stream: * @self: (in): This #ModulemdDefaultsV1 object. * @default_stream: (in) (nullable): The name of the default stream for this * module. If NULL, it will remove the default stream. * @intent: (in) (nullable): If non-NULL, this indicates the system intent to * apply this default stream. If NULL, it will be added as common defaults. * System intents are deprecated and calls with this non-NULL argument will * become void in the future. * * Set the default stream for this module. * * Since: 2.0 */ void modulemd_defaults_v1_set_default_stream (ModulemdDefaultsV1 *self, const gchar *default_stream, const gchar *intent); /** * modulemd_defaults_v1_get_default_stream: * @self: (in): This #ModulemdDefaultsV1 object. * @intent: (in) (nullable): The name of the system intent whose default stream * will be retrieved. If left NULL or the specified intent has no different * default, it will return the generic default stream for this module. * System intents are deprecated and this argument will be ignored in the * future. * * Returns: (transfer none): The name of the default stream for this module. * * Since: 2.0 */ const gchar * modulemd_defaults_v1_get_default_stream (ModulemdDefaultsV1 *self, const gchar *intent); /** * modulemd_defaults_v1_get_streams_with_default_profiles_as_strv: (rename-to modulemd_defaults_v1_get_streams_with_default_profiles) * @self: (in): This #ModulemdDefaultsV1 object. * @intent: (in) (nullable): The name of the system intent whose stream * profiles will be retrieved. If left NULL or the specified intent has no * separate defaults for this module, it will return the generic stream * profiles. System intents are deprecated and this argument will be ignored * in the future. * * Returns: (transfer full): A sorted #GStrv list of unique stream names for * which default profiles have been assigned. * * Since: 2.0 */ GStrv modulemd_defaults_v1_get_streams_with_default_profiles_as_strv ( ModulemdDefaultsV1 *self, const gchar *intent); /** * modulemd_defaults_v1_add_default_profile_for_stream: * @self: (in): This #ModulemdDefaultsV1 object. * @stream_name: (in): The name of the module stream to which to add this * default profile. * @profile_name: (in): The name of the default profile to add. * @intent: (in) (nullable): The name of the system intent to add profile * defaults to. If NULL, this sets the generic fallback profiles for the * stream. System intents are deprecated and calls with this non-NULL argument * will become void in the future. * * Add a profile that will be installed for this stream if none are explicitly * specified by the user. This function may be called any number of times for * the same stream and will deduplicate input. * * Since: 2.0 */ void modulemd_defaults_v1_add_default_profile_for_stream (ModulemdDefaultsV1 *self, const gchar *stream_name, const gchar *profile_name, const gchar *intent); /** * modulemd_defaults_v1_set_empty_default_profiles_for_stream: * @self: (in): This #ModulemdDefaultsV1 object. * @stream_name: (in): The name of the module stream for which to empty * default profiles. * @intent: (in) (nullable): The name of the system intent from which to clear * the profile defaults for this stream. System intents are deprecated and * calls with this non-NULL argument will become void in the future. * * Sets the default profiles for @stream_name to the empty set. When output to * a file, it will appear as `stream_name: []`. * * Since: 2.0 */ void modulemd_defaults_v1_set_empty_default_profiles_for_stream ( ModulemdDefaultsV1 *self, const gchar *stream_name, const gchar *intent); /** * modulemd_defaults_v1_remove_default_profiles_for_stream: * @self: (in): This #ModulemdDefaultsV1 object. * @stream_name: (in): The name of the module stream from which to remove * default profiles. * @intent: (in) (nullable): The name of the system intent from which to remove * the profile defaults for this stream. System intents are deprecated and * calls with this non-NULL arugment will become void in the future. * * Removes this stream from the list of profiles entirely. It will not appear * in the output document. * * Since: 2.0 */ void modulemd_defaults_v1_remove_default_profiles_for_stream ( ModulemdDefaultsV1 *self, const gchar *stream_name, const gchar *intent); /** * modulemd_defaults_v1_get_default_profiles_for_stream_as_strv: (rename-to modulemd_defaults_v1_get_default_profiles_for_stream) * @self: (in): This #ModulemdDefaultsV1 object. * @stream_name: (in): The name of the string to retrieve the default profiles * for. * @intent: (in) (nullable): The name of the system intent for which to * retrieve the profile defaults for this stream. System intents are * deprecated and this argument will be ignored in the future. * * Returns: (transfer full): A sorted #GStrv list of unique profiles to be * installed by default for this stream. NULL, if this stream_name is not * present in the defaults. * * Since: 2.0 */ GStrv modulemd_defaults_v1_get_default_profiles_for_stream_as_strv ( ModulemdDefaultsV1 *self, const gchar *stream_name, const gchar *intent); G_END_DECLS fedora-modularity-libmodulemd-357799c/modulemd/include/modulemd-2.0/modulemd-defaults.h000066400000000000000000000114011502446517500310560ustar00rootroot00000000000000/* * This file is part of libmodulemd * Copyright (C) 2017-2018 Stephen Gallagher * * Fedora-License-Identifier: MIT * SPDX-2.0-License-Identifier: MIT * SPDX-3.0-License-Identifier: MIT * * This program is free software. * For more information on the license, see COPYING. * For more information on free software, see . */ #pragma once #include G_BEGIN_DECLS /** * SECTION: modulemd-defaults * @title: Modulemd.Defaults * @stability: stable * @short_description: Parent class for Default documents. * See #ModulemdDefaultsV1 for a specific type. */ /** * ModulemdDefaultsVersionEnum: * @MD_DEFAULTS_VERSION_ERROR: Represents an error handling mdversion. * @MD_DEFAULTS_VERSION_UNSET: Represents an unset mdversion. * @MD_DEFAULTS_VERSION_ONE: Represents v1 of the #ModulemdDefaults metadata * format. * @MD_DEFAULTS_VERSION_LATEST: Represents the highest-supported version of the * #ModulemdDefaults metadata format. * * Since: 2.0 */ typedef enum { MD_DEFAULTS_VERSION_ERROR = -1, MD_DEFAULTS_VERSION_UNSET = 0, MD_DEFAULTS_VERSION_ONE = 1, MD_DEFAULTS_VERSION_LATEST = MD_DEFAULTS_VERSION_ONE, } ModulemdDefaultsVersionEnum; #define MODULEMD_TYPE_DEFAULTS (modulemd_defaults_get_type ()) G_DECLARE_DERIVABLE_TYPE ( ModulemdDefaults, modulemd_defaults, MODULEMD, DEFAULTS, GObject) struct _ModulemdDefaultsClass { GObjectClass parent_class; ModulemdDefaults *(*copy) (ModulemdDefaults *self); gboolean (*validate) (ModulemdDefaults *self, GError **error); guint64 (*get_mdversion) (ModulemdDefaults *self); gboolean (*equals) (ModulemdDefaults *self_1, ModulemdDefaults *self_2); /* Padding to allow adding up to 9 new virtual functions without * breaking ABI. */ gpointer padding[9]; }; /** * modulemd_defaults_new: * @version: The version of the defaults metadata to create. * @module_name: The name of the module to which these defaults apply. * * Create a new #ModulemdDefaults. * * Returns: (transfer full): A newly created #ModulemdDefaults subtype of the * requested version. * * Since: 2.0 */ ModulemdDefaults * modulemd_defaults_new (guint64 version, const gchar *module_name); /** * modulemd_defaults_copy: * @self: (in): This #ModulemdDefaults object. * * Returns: (transfer full): A newly-allocated copy of @self. * * Since: 2.0 */ ModulemdDefaults * modulemd_defaults_copy (ModulemdDefaults *self); /** * modulemd_defaults_validate: * @self: (in): This #ModulemdDefaults object. * @error: (out): A #GError that will return the reason for a validation error. * * Returns: TRUE if validation passed, FALSE and sets @error appropriately if * validation failed. * * Since: 2.0 */ gboolean modulemd_defaults_validate (ModulemdDefaults *self, GError **error); /** * modulemd_defaults_equals: * @self_1: (in): A #ModulemdDefaults object * @self_2: (in): A #ModulemdDefaults object * * Returns: TRUE if both @self_1 and @self_2 contain equal values, FALSE if they differed. * * Since: 2.2 */ gboolean modulemd_defaults_equals (ModulemdDefaults *self_1, ModulemdDefaults *self_2); /** * modulemd_defaults_upgrade: * @self: (in): This #ModulemdDefaults object. * @mdversion: (in): The version to upgrade to. * @error: (out): A #GError that will return the reason for an upgrade error. * * Returns: (transfer full): A newly-allocated copy of @self upgraded to the * requested defaults version. NULL if the upgrade cannot be performed and sets * @error appropriately. This function does not modify @self. * * Since: 2.0 */ ModulemdDefaults * modulemd_defaults_upgrade (ModulemdDefaults *self, guint64 mdversion, GError **error); /** * modulemd_defaults_get_module_name: * @self: (in): This #ModulemdDefaults object. * * Returns: (transfer none): The name of the module to which these defaults * apply. * * Since: 2.0 */ const gchar * modulemd_defaults_get_module_name (ModulemdDefaults *self); /** * modulemd_defaults_get_mdversion: * @self: (in): This #ModulemdDefaults object. * * Returns: The metadata version of this defaults object. * * Since: 2.0 */ guint64 modulemd_defaults_get_mdversion (ModulemdDefaults *self); /** * modulemd_defaults_set_modified: * @self: (in): This #ModulemdDefaults object. * @modified: (in): The last modified time represented as a 64-bit integer * (such as 201807011200) * * Since: 2.0 */ void modulemd_defaults_set_modified (ModulemdDefaults *self, guint64 modified); /** * modulemd_defaults_get_modified: * @self: (in): This #ModulemdDefaults object. * * Returns: The last modified time represented as a 64-bit integer * (such as 201807011200) * * Since: 2.0 */ guint64 modulemd_defaults_get_modified (ModulemdDefaults *self); G_END_DECLS fedora-modularity-libmodulemd-357799c/modulemd/include/modulemd-2.0/modulemd-dependencies.h000066400000000000000000000143621502446517500317060ustar00rootroot00000000000000/* * This file is part of libmodulemd * Copyright (C) 2018 Red Hat, Inc. * * Fedora-License-Identifier: MIT * SPDX-2.0-License-Identifier: MIT * SPDX-3.0-License-Identifier: MIT * * This program is free software. * For more information on the license, see COPYING. * For more information on free software, see . */ #pragma once #include G_BEGIN_DECLS /** * SECTION: modulemd-dependencies * @title: Modulemd.Dependencies * @stability: stable * @short_description: Object to represent build-time and runtime dependencies of a module stream. */ #define MODULEMD_TYPE_DEPENDENCIES (modulemd_dependencies_get_type ()) G_DECLARE_FINAL_TYPE ( ModulemdDependencies, modulemd_dependencies, MODULEMD, DEPENDENCIES, GObject) /** * modulemd_dependencies_new: * * Returns: (transfer full): A newly-allocated #ModulemdDependencies object. * This object must be freed with g_object_unref(). * * Since: 2.0 */ ModulemdDependencies * modulemd_dependencies_new (void); /** * modulemd_dependencies_equals: * @self_1: A #ModulemdDependencies object. * @self_2: A #ModulemdDependencies object. * * Check if @self_1 and @self_2 are equal objects. * * Returns: TRUE, if the're equal. FALSE, otherwise. * * Since: 2.2 */ gboolean modulemd_dependencies_equals (ModulemdDependencies *self_1, ModulemdDependencies *self_2); /** * modulemd_dependencies_copy: * @self: This #ModulemdDependencies object. * * Create a copy of this #ModulemdDependencies object. * * Returns: (transfer full): The copied #ModulemdDependencies object. * * Since: 2.0 */ ModulemdDependencies * modulemd_dependencies_copy (ModulemdDependencies *self); /** * modulemd_dependencies_add_buildtime_stream: * @self: This #ModulemdDependencies object. * @module_name: The name of the module to depend on. * @module_stream: The name of the module stream to depend on. * * Add a single stream of a module that is required to build another dependent * module. The matrix of streams and module names will be calculated by the * build-system. If the provided module name is already present, the streams * will be added (with deduplication). * * Since: 2.0 */ void modulemd_dependencies_add_buildtime_stream (ModulemdDependencies *self, const gchar *module_name, const gchar *module_stream); /** * modulemd_dependencies_set_empty_buildtime_dependencies_for_module: * @self: This #ModulemdDependencies object. * @module_name: The name of the module to add dependencies on. * * Adds a module and inserts an empty list for it as buildtime dependency. * * Since: 2.0 */ void modulemd_dependencies_set_empty_buildtime_dependencies_for_module ( ModulemdDependencies *self, const gchar *module_name); /** * modulemd_dependencies_clear_buildtime_dependencies: * @self: This #ModulemdDependencies object. * * Remove all buildtime dependencies from this #ModulemdDependencies object. * * Since: 2.5 */ void modulemd_dependencies_clear_buildtime_dependencies ( ModulemdDependencies *self); /** * modulemd_dependencies_get_buildtime_modules_as_strv: (rename-to modulemd_dependencies_get_buildtime_modules) * @self: This #ModulemdDependencies object. * * Returns: (transfer full): An ordered #GStrv list of module names of * build-time dependencies. * * Since: 2.0 */ GStrv modulemd_dependencies_get_buildtime_modules_as_strv ( ModulemdDependencies *self); /** * modulemd_dependencies_get_buildtime_streams_as_strv: (rename-to modulemd_dependencies_get_buildtime_streams) * @self: This #ModulemdDependencies object. * @module: The name of the module. * * Returns: (transfer full) (nullable): An ordered #GStrv list of module * streams associated with the specified module that are required at * build-time. * * Since: 2.0 */ GStrv modulemd_dependencies_get_buildtime_streams_as_strv ( ModulemdDependencies *self, const gchar *module); /** * modulemd_dependencies_add_runtime_stream: * @self: This #ModulemdDependencies object. * @module_name: The name of the module to depend on. * @module_stream: The name of the module stream to depend on. * * Adds a module and its stream that is required at runtime by a dependent * module. The matrix of streams and module names will be calculated by the * build-system. If the listed provided module name is already present, the * streams will be added (with deduplication). * * Since: 2.0 */ void modulemd_dependencies_add_runtime_stream (ModulemdDependencies *self, const gchar *module_name, const gchar *module_stream); /** * modulemd_dependencies_set_empty_runtime_dependencies_for_module: * @self: This #ModulemdDependencies object. * @module_name: The name of the module to add dependencies on. * * Adds a module and inserts an empty list for it as runtime dependency. * * Since: 2.0 */ void modulemd_dependencies_set_empty_runtime_dependencies_for_module ( ModulemdDependencies *self, const gchar *module_name); /** * modulemd_dependencies_clear_runtime_dependencies: * @self: This #ModulemdDependencies object. * * Remove all runtime dependencies from this #ModulemdDependencies object. * * Since: 2.5 */ void modulemd_dependencies_clear_runtime_dependencies (ModulemdDependencies *self); /** * modulemd_dependencies_get_runtime_modules_as_strv: (rename-to modulemd_dependencies_get_runtime_modules) * @self: This #ModulemdDependencies object. * * Returns: (transfer full): An ordered #GStrv list of module names of run-time * dependencies. * * Since: 2.0 */ GStrv modulemd_dependencies_get_runtime_modules_as_strv (ModulemdDependencies *self); /** * modulemd_dependencies_get_runtime_streams_as_strv: (rename-to modulemd_dependencies_get_runtime_streams) * @self: This #ModulemdDependencies object. * @module: The name of the module. * * Returns: (transfer full) (nullable): An ordered #GStrv list of module streams * associated with the specified module that are required at run-time. * * Since: 2.0 */ GStrv modulemd_dependencies_get_runtime_streams_as_strv (ModulemdDependencies *self, const gchar *module); G_END_DECLS fedora-modularity-libmodulemd-357799c/modulemd/include/modulemd-2.0/modulemd-deprecated.h000066400000000000000000000015471502446517500313610ustar00rootroot00000000000000/* * This file is part of libmodulemd * Copyright (C) 2017-2018 Stephen Gallagher * * Fedora-License-Identifier: MIT * SPDX-2.0-License-Identifier: MIT * SPDX-3.0-License-Identifier: MIT * * This program is free software. * For more information on the license, see COPYING. * For more information on free software, see . */ #pragma once #include G_BEGIN_DECLS #ifdef MMD_DISABLE_DEPRECATION_WARNINGS #define MMD_DEPRECATED extern #define MMD_DEPRECATED_FOR(f) extern #define MMD_UNAVAILABLE(maj, min) extern #define MMD_DEPRECATED_TYPE_FOR(f) #else #define MMD_DEPRECATED G_DEPRECATED extern #define MMD_DEPRECATED_FOR(f) G_DEPRECATED_FOR (f) extern #define MMD_DEPRECATED_TYPE_FOR(f) G_DEPRECATED_FOR (f) #define MMD_UNAVAILABLE(maj, min) G_UNAVAILABLE (maj, min) extern #endif G_END_DECLS fedora-modularity-libmodulemd-357799c/modulemd/include/modulemd-2.0/modulemd-errors.h000066400000000000000000000152521502446517500305730ustar00rootroot00000000000000/* * This file is part of libmodulemd * Copyright (C) 2019 Red Hat, Inc. * * Fedora-License-Identifier: MIT * SPDX-2.0-License-Identifier: MIT * SPDX-3.0-License-Identifier: MIT * * This program is free software. * For more information on the license, see COPYING. * For more information on free software, see . */ #pragma once #include #include "modulemd-deprecated.h" G_BEGIN_DECLS /** * SECTION: modulemd-errors * @title: Modulemd Errors * @stability: stable * @short_description: Error codes for libmodulemd. */ /** * MODULEMD_ERROR: * * A convenience macro for identifying an error in the general modulemd domain. * * Since: 2.9 */ #define MODULEMD_ERROR modulemd_error_quark () /** * modulemd_error_quark: * * Returns: A #GQuark used to identify an error in the general modulemd domain. * * Since: 2.9 */ GQuark modulemd_error_quark (void); /** * ModulemdError: * @MMD_ERROR_UPGRADE: Represents an error encountered while upgrading the * metadata version of a module stream or module defaults. * @MMD_ERROR_VALIDATE: Represents an error encountered while validating * module metadata. * @MMD_ERROR_FILE_ACCESS: Represents an error encountered when attempting * to access a file. * @MMD_ERROR_NO_MATCHES: Represents an error indicating that no streams * matched when searching for a specific module stream. * @MMD_ERROR_TOO_MANY_MATCHES: Represents an error indicating that * multiple streams matched when searching for a specific module * stream. * @MMD_ERROR_MAGIC: Could not detect the mime type of a file for * automatic detection of compression format. * @MMD_ERROR_NOT_IMPLEMENTED: The requested function is not implemented * on this platform, likely due to needing a newer version of a dependency * library. * @MMD_ERROR_MISSING_REQUIRED: The object is missing some data necessary * for proper operation. * * Since: 2.9 */ typedef enum { MMD_ERROR_UPGRADE, MMD_ERROR_VALIDATE, MMD_ERROR_FILE_ACCESS, MMD_ERROR_NO_MATCHES, MMD_ERROR_TOO_MANY_MATCHES, MMD_ERROR_MAGIC, MMD_ERROR_NOT_IMPLEMENTED, MMD_ERROR_MISSING_REQUIRED } ModulemdError; /** * ModulemdErrorEnum: * @MODULEMD_ERROR_UPGRADE: Represents an error encountered while upgrading the * metadata version of a module stream or module defaults. * @MODULEMD_ERROR_VALIDATE: Represents an error encountered while validating * module metadata. * @MODULEMD_ERROR_FILE_ACCESS: Represents an error encountered when attempting * to access a file. * @MODULEMD_ERROR_NO_MATCHES: Represents an error indicating that no streams * matched when searching for a specific module stream. Since: 2.2 * @MODULEMD_ERROR_TOO_MANY_MATCHES: Represents an error indicating that * multiple streams matched when searching for a specific module * stream. Since: 2.2 * @MODULEMD_ERROR_MAGIC: Could not detect the mime type of a file for * automatic detection of compression format. Since: 2.8 * @MODULEMD_ERROR_NOT_IMPLEMENTED: The requested function is not implemented * on this platform, likely due to needing a newer version of a dependency * library. Since: 2.8 * * Since: 2.0 * Deprecated: 2.9 * Use #ModulemdError instead. */ MMD_DEPRECATED_TYPE_FOR (ModulemdError) typedef enum { MODULEMD_ERROR_UPGRADE, MODULEMD_ERROR_VALIDATE, MODULEMD_ERROR_FILE_ACCESS, MODULEMD_ERROR_NO_MATCHES, MODULEMD_ERROR_TOO_MANY_MATCHES, MODULEMD_ERROR_MAGIC, MODULEMD_ERROR_NOT_IMPLEMENTED } ModulemdErrorEnum; /** * MODULEMD_YAML_ERROR: * * A convenience macro for identifying an error in the modulemd yaml domain. * * Since: 2.9 */ #define MODULEMD_YAML_ERROR modulemd_yaml_error_quark () /** * modulemd_yaml_error_quark: * * Returns: A #GQuark used to identify an error in the modulemd yaml domain. * * Since: 2.9 */ GQuark modulemd_yaml_error_quark (void); /** * ModulemdYamlError: * @MMD_YAML_ERROR_OPEN: Represents an error encountered while opening a * YAML file. * @MMD_YAML_ERROR_PROGRAMMING: Represents an internal programming error * encountered while parsing a YAML document. * @MMD_YAML_ERROR_UNPARSEABLE: Represents an error indicating that * unexpected data or some other parsing error that violates the YAML spec * was encountered while parsing a YAML document. * @MMD_YAML_ERROR_PARSE: Represents an error indicating invalid data * violating the modulemd YAML spec was encountered while parsing a YAML * document. * @MMD_YAML_ERROR_EMIT: Represents an error encountered while writing a * YAML file. * @MMD_YAML_ERROR_MISSING_REQUIRED: Represents an error indicating that * required elements are missing while parsing a YAML document. * @MMD_YAML_ERROR_EVENT_INIT: Represents an error indicating that a YAML * output event could not be initialized. * @MMD_YAML_ERROR_INCONSISTENT: Represents a data inconsistency error * encountered while parsing a YAML document. * @MMD_YAML_ERROR_UNKNOWN_ATTRS: While parsing a document in strict mode, an * attribute was encountered that does not belong in this document. * * Since: 2.9 */ typedef enum { MMD_YAML_ERROR_OPEN, MMD_YAML_ERROR_PROGRAMMING, MMD_YAML_ERROR_UNPARSEABLE, MMD_YAML_ERROR_PARSE, MMD_YAML_ERROR_EMIT, MMD_YAML_ERROR_MISSING_REQUIRED, MMD_YAML_ERROR_EVENT_INIT, MMD_YAML_ERROR_INCONSISTENT, MMD_YAML_ERROR_UNKNOWN_ATTR } ModulemdYamlError; /** * ModulemdYamlErrorEnum: * @MODULEMD_YAML_ERROR_OPEN: Represents an error encountered while opening a * YAML file. * @MODULEMD_YAML_ERROR_PROGRAMMING: Represents an internal programming error * encountered while parsing a YAML document. * @MODULEMD_YAML_ERROR_UNPARSEABLE: Represents an error indicating that * unexpected data or some other parsing error was encountered while parsing a * YAML document. * @MODULEMD_YAML_ERROR_PARSE: Represents an error indicating invalid data was * encountered while parsing a YAML document. * @MODULEMD_YAML_ERROR_EMIT: Represents an error encountered while writing a * YAML file. * @MODULEMD_YAML_ERROR_MISSING_REQUIRED: Represents an error indicating that * required elements are missing while parsing a YAML document. * @MODULEMD_YAML_ERROR_EVENT_INIT: Represents an error indicating that a YAML * output event could not be initialized. * @MODULEMD_YAML_ERROR_INCONSISTENT: Represents a data inconsistency error * encountered while parsing a YAML document. * * Since: 2.0 * Deprecated: 2.9 * Use #ModulemdYamlError instead. */ MMD_DEPRECATED_TYPE_FOR (ModulemdYamlError) typedef enum { MODULEMD_YAML_ERROR_OPEN, MODULEMD_YAML_ERROR_PROGRAMMING, MODULEMD_YAML_ERROR_UNPARSEABLE, MODULEMD_YAML_ERROR_PARSE, MODULEMD_YAML_ERROR_EMIT, MODULEMD_YAML_ERROR_MISSING_REQUIRED, MODULEMD_YAML_ERROR_EVENT_INIT, MODULEMD_YAML_ERROR_INCONSISTENT } ModulemdYamlErrorEnum; G_END_DECLS fedora-modularity-libmodulemd-357799c/modulemd/include/modulemd-2.0/modulemd-module-index-merger.h000066400000000000000000000234351502446517500331320ustar00rootroot00000000000000/* * This file is part of libmodulemd * Copyright (C) 2018 Stephen Gallagher * * Fedora-License-Identifier: MIT * SPDX-2.0-License-Identifier: MIT * SPDX-3.0-License-Identifier: MIT * * This program is free software. * For more information on the license, see COPYING. * For more information on free software, see . */ #pragma once #include "modulemd-module-index.h" #include G_BEGIN_DECLS /** * SECTION: modulemd-module-index-merger * @title: Modulemd.ModuleIndexMerger * @stability: stable * @short_description: Class to aid in merging metadata from multiple * repositories. * * ModuleIndexMerger is used to resolve merges between multiple repository * metadata sources, possibly with varying priorities. * * It is expected to be used as follows (python example) by tools such as `yum`: * * |[ * merger = Modulemd.ModuleIndexMerger.new() * * merger.associate_index(fedora_repo_index, 0) * merger.associate_index(updates_repo_index, 0) * merger.associate_index(updates_testing_repo_index, 0) * * merged_index = merger.resolve() * * ]| * * In the above code, merged_index will be a complete, merged view of the * metadata from all of the added #ModulemdModuleIndex instances. * * When merging module streams, entries will be deduplicated based on whether * they share the same module name, stream name, version number, and context. * If the repository configuration is broken and there exists two * #ModulemdModuleStream entries that have different content for the same * NSVCA, the behavior is undefined. * * Merging #ModulemdDefaults entries behaves as follows (note that this * behavior has changed slightly as of 2.8.1): * * - Any module defaults object that is provided by a single * #ModulemdModuleIndex will be the defaults object in the resulting merged * #ModulemdModuleIndex. * - If the #ModulemdModuleIndex inputs have different priorities (not common), * then the defaults from the highest priority #ModulemdModuleIndex will be * used and the others entirely discarded. The `modified` value will not be * considered at all. (Priority is intended for providing a total override, * including an on-disk configuration). * - If the repos have the same priority (such as "fedora" and "updates" in the * Fedora Project) and `modified` value, the entries will be merged as * follows for default streams: * - If both #ModulemdModuleIndex objects specify the same default stream for * the module, that one will be used. * - If either #ModulemdModuleIndex specifies a default stream for the module * and the other does not, the provided one will be used. * - If both #ModulemdModuleIndex objects specify different default streams * and have different `modified` values, the default stream from the * #ModulemdDefaults object with the higher `modified` value will be used. * - If both #ModulemdModuleIndex objects specify different default streams * and have the same `modified` value, the merge will unset the default * stream and leave no default stream in the resulting merged * #ModulemdModuleIndex. This behavior can be controlled by using * modulemd_module_index_merger_resolve_ext() and setting * `strict_default_streams` to #TRUE. In that case, an error will be * returned if conflicting default streams have been provided. * - and for profile defaults: * - If both #ModulemdModuleIndex objects specify a set of default profiles * for a particular module and stream and the sets are equivalent, use that * set. * - If one #ModulemdModuleIndex object specifies a set of default profiles * for a module and stream and the other does not, use the provided set. * - If both #ModulemdModuleIndex objects specify a set of default profiles * for a stream, each are providing a different set and the `modified` * value differs, the set from the object with the higher `modified` value * will be used. * - If both #ModulemdModuleIndex objects specify a set of default profiles * for a stream, each are providing a different set and the `modified` * value is the same, this is an unresolvable merge conflict and the merge * resolution will fail and return an error. * - Intents behave in exactly the same manner as described for the top-level * defaults, except that they merge beneath each intent name. Intents are * deprecated. * * Merging #ModulemdTranslations entries behaves as follows: * * - For each translated summary, description and profile description, compare * the `modified` value of the Translation document matching this module name * and stream. Whichever has the higher value will be used. Any translation * containing the empty string will be interpreted as removing the * translation. Subsequent processing of a higher modified value may restore * it. * * Merging #ModulemdObsoletes entries with identical module, stream, context * and modified values behaves as follows (when accessed through module): * * - Any obsoletes object that is provided by a single #ModulemdModuleIndex * will be the obsoletes object in the resulting merged #ModulemdModuleIndex. * - If the #ModulemdModuleIndex inputs have different priorities (not common), * then the obsoletes from the highest priority #ModulemdModuleIndex will be * used and the others entirely discarded. (Priority is intended for providing * a total override, including an on-disk configuration). * - If the repos have the same priority (such as "fedora" and "updates" in the * Fedora Project) the behaviour is undefined. */ #define MODULEMD_TYPE_MODULE_INDEX_MERGER \ (modulemd_module_index_merger_get_type ()) G_DECLARE_FINAL_TYPE (ModulemdModuleIndexMerger, modulemd_module_index_merger, MODULEMD, MODULE_INDEX_MERGER, GObject) /** * modulemd_module_index_merger_new: * * Returns: (transfer full): A newly-allocated #ModulemdModuleIndexMerger * object. * * Since: 2.0 */ ModulemdModuleIndexMerger * modulemd_module_index_merger_new (void); /** * modulemd_module_index_merger_associate_index: * @self: (in): This #ModulemdModuleIndexMerger object. * @index: (in) (transfer none): A #ModulemdModuleIndex, usually constructed by * reading the module metadata from a repository with * modulemd_module_index_update_from_file(), * modulemd_module_index_update_from_string(), or * `modulemd_module_index_update_from_stream()`. This function take a reference * on @index, so the caller must not modify it while the * #ModulemdModuleIndexMerger is in use. * @priority: (in): The priority of the repository that the entries in @index * came from. This is used to determine when @index should override rather then * merge. In most cases, this will be zero. See the Description section for the * #ModulemdModuleIndexMerger class for details on the merge logic. Acceptable * values are in the range of 0-1000. * * Enqueues a #ModulemdModuleIndex representing the parsed metadata from a * repository into this #ModulemdModuleIndexMerger for merging and * deduplication of other repositories. * * Once all repositories have been added, call * modulemd_module_index_merger_resolve() to perform the merge. * * Since: 2.0 */ void modulemd_module_index_merger_associate_index (ModulemdModuleIndexMerger *self, ModulemdModuleIndex *index, gint32 priority); /** * modulemd_module_index_merger_resolve: * @self: (in): This #ModulemdModuleIndexMerger object. * @error: (out): A #GError containing the reason for a failure to resolve the * merges. * * Merges all added #ModulemdModuleIndex objects according to their priority. * The logic of this merge is described in the Description of * #ModulemdModuleIndexMerger. * * Once this function has been called, the internal state of the * #ModulemdModuleIndexMerger is undefined. The only valid action on it after * that point is g_object_unref(). * * This function is equivalent to calling * modulemd_module_index_merger_resolve_ext() with * `strict_default_streams=FALSE`. * * Returns: (transfer full): A newly-allocated #ModulemdModuleIndex object * containing the merged results. If this function encounters an unresolvable * merge conflict, it will return NULL and set @error appropriately. * * Since: 2.0 */ ModulemdModuleIndex * modulemd_module_index_merger_resolve (ModulemdModuleIndexMerger *self, GError **error); /** * modulemd_module_index_merger_resolve_ext: * @self: (in): This #ModulemdModuleIndexMerger object. * @strict_default_streams: (in): If TRUE, merging two #ModulemdDefaults with * conflicting default streams will raise an error. If FALSE, the module will * have its default stream blocked. * @error: (out): A #GError containing the reason for a failure to resolve the * merges. * * Merges all added #ModulemdModuleIndex objects according to their priority. * The logic of this merge is described in the Description of * #ModulemdModuleIndexMerger. * * Once this function has been called, the internal state of the * #ModulemdModuleIndexMerger is undefined. The only valid action on it after * that point is g_object_unref(). * * Returns: (transfer full): A newly-allocated #ModulemdModuleIndex object * containing the merged results. If this function encounters an unresolvable * merge conflict, it will return NULL and set @error appropriately. * * Since: 2.6 */ ModulemdModuleIndex * modulemd_module_index_merger_resolve_ext (ModulemdModuleIndexMerger *self, gboolean strict_default_streams, GError **error); G_END_DECLS fedora-modularity-libmodulemd-357799c/modulemd/include/modulemd-2.0/modulemd-module-index.h000066400000000000000000000661451502446517500316600ustar00rootroot00000000000000/* * This file is part of libmodulemd * Copyright (C) 2018 Red Hat, Inc. * * Fedora-License-Identifier: MIT * SPDX-2.0-License-Identifier: MIT * SPDX-3.0-License-Identifier: MIT * * This program is free software. * For more information on the license, see COPYING. * For more information on free software, see . */ #pragma once #include "modulemd-module.h" #include "modulemd-module-stream.h" #include "modulemd-subdocument-info.h" #include "modulemd-translation.h" #include "modulemd-obsoletes.h" #include G_BEGIN_DECLS /** * SECTION: modulemd-module-index * @title: Modulemd.ModuleIndex * @stability: stable * @short_description: The primary interface to dealing with repodata in the * module metadata format. * * This object provides an interface to the complete metadata read from a * repository or manually added to this object. * * NOTE: When adding or updating this object from YAML, all objects imported * will be automatically upgraded to match the highest version of that object * that is seen. This means that if the repository has a mix of * #ModulemdModuleStreamV1 and #ModulemdModuleStreamV2 objects, the index will * contain only #ModulemdModuleStreamV2. You can check the versions the index * upgraded to with the modulemd_module_index_get_stream_mdversion() and * modulemd_module_index_get_defaults_mdversion(). If your application would * prefer to always work with a particular stream or defaults version (such as * to avoid extra branching logic), the modulemd_module_index_upgrade_streams() * and modulemd_module_index_upgrade_defaults() functions can be used to force * the contents of the index to upgrade to those versions. * * Interacting with #ModulemdModuleIndex is relatively simple. A common Python * example for working with Fedora repodata might be (assuming the metadata has * already been read into strings): * * |[ * fedora_repo_index = Modulemd.ModuleIndex.new() * fedora_repo_index.update_from_string(fedora_modulemd, True) * * # Get the list of all module names in the index * module_names = fedora_repo_index.get_module_names() * * # Retrieve information about a particular module from the index * module = fedora_repo_index.get_module('module_name') * ]| * * See the #ModulemdModule documentation for details on retrieving information * about specific modules, including how to get #ModulemdDefaults information * and retrieve individual #ModulemdModuleStream objects. * * See the #ModulemdModuleIndexMerger documentation for details on merging * #ModulemdModuleIndex objects from separate repositories together. */ #define MODULEMD_TYPE_MODULE_INDEX (modulemd_module_index_get_type ()) G_DECLARE_FINAL_TYPE ( ModulemdModuleIndex, modulemd_module_index, MODULEMD, MODULE_INDEX, GObject) /** * ModulemdReadHandler: * @data: (inout): A private pointer to the data being read. * @buffer: (out): The buffer to write the data from the source. * @size: (in): The size of the buffer. * @size_read: (out): The actual number of bytes read from the source. * * The prototype of a read handler. * * The read handler is called when the parser needs to read more bytes from the * source. The handler should write not more than @size bytes to the @buffer. * The number of written bytes should be set to the @size_read variable. * * This handler is identical to a * [yaml_read_handler_t in yaml.h header of * libyaml](https://github.com/yaml/libyaml/blob/2c891fc7a770e8ba2fec34fc6b545c672beb37e6/include/yaml.h#L988) * but is included here to avoid depending on yaml.h in modulemd headers. * * Returns: On success, the handler must return 1. If the handler failed, * the returned value must be 0. On EOF, the handler must set the * @size_read to 0 and return 1. * * Since: 2.3 */ typedef gint (*ModulemdReadHandler) (void *data, unsigned char *buffer, size_t size, size_t *size_read); /** * ModulemdWriteHandler: * @data: (inout): A private pointer that includes the data source. * @buffer: (out): The buffer with bytes to be written. * @size: (in): The size of the buffer. * * The prototype of a write handler. * * The write handler is called when the emitter needs to flush the accumulated * characters to the output. The handler should write @size bytes of the * @buffer to the output. * * This handler is identical to a * [yaml_write_handler_t in yaml.h header of * libyaml](https://github.com/yaml/libyaml/blob/2c891fc7a770e8ba2fec34fc6b545c672beb37e6/include/yaml.h#L1478) * but is included here to avoid depending on yaml.h in modulemd headers. * * Returns: On success, the handler must return 1. If the handler failed, * the returned value must be 0. * * Since: 2.3 */ typedef gint (*ModulemdWriteHandler) (void *data, unsigned char *buffer, size_t size); /** * modulemd_module_index_new: * * Returns: (transfer full): A newly-allocated #ModulemdModuleIndex object. * * Since: 2.0 */ ModulemdModuleIndex * modulemd_module_index_new (void); /** * modulemd_module_index_update_from_file: * @self: This #ModulemdModuleIndex object. * @yaml_file: (in): A name of a YAML file containing the module metadata and * other related information such as default streams. * @strict: (in): Whether the parser should return failure if it encounters an * unknown mapping key or if it should ignore it. * @failures: (out) (element-type ModulemdSubdocumentInfo) (transfer container): * On output, an array containing any subdocuments (pointers to * #ModulemdSubdocumentInfo) from the YAML file that failed to parse. On * input, it must be a non-%NULL pointer. If that pointer points to %NULL, this * call will allocate a new array (regardless of any failures) with an element * destructor set to g_object_unref(). Otherwise, the pointed array is reused * without emptying before adding the failed subdocuments. The caller is * responsible for freeing the array. * @error: (out): A #GError containing additional information if this function * fails in a way that prevents program continuation. On input, it must be * %NULL (if you don't care) or a pointer to %NULL (if you want to know the * error). On output, it will become allocated only if an error occured. * * Returns: %TRUE if the update was successful. Returns %FALSE and sets * @failures appropriately if any of the YAML subdocuments were invalid or * sets @error if there was a fatal parse error. * * Since: 2.0 */ gboolean modulemd_module_index_update_from_file (ModulemdModuleIndex *self, const gchar *yaml_file, gboolean strict, GPtrArray **failures, GError **error); /** * modulemd_module_index_update_from_string: * @self: This #ModulemdModuleIndex object. * @yaml_string: (in): A YAML string containing the module metadata and other * related information such as default streams. * @strict: (in): Whether the parser should return failure if it encounters an * unknown mapping key or if it should ignore it. * @failures: (out) (element-type ModulemdSubdocumentInfo) (transfer container): * On output, an array containing any subdocuments (pointers to * #ModulemdSubdocumentInfo) from the YAML file that failed to parse. On * input, it must be a non-%NULL pointer. If that pointer points to %NULL, this * call will allocate a new array (regardless of any failures) with an element * destructor set to g_object_unref(). Otherwise, the pointed array is reused * without emptying before adding the failed subdocuments. The caller is * responsible for freeing the array. * @error: (out): A #GError containing additional information if this function * fails in a way that prevents program continuation. On input, it must be * %NULL (if you don't care) or a pointer to %NULL (if you want to know the * error). On output, it will become allocated only if an error occured. * * Returns: %TRUE if the update was successful. Returns %FALSE and sets * @failures appropriately if any of the YAML subdocuments were invalid or * sets @error if there was a fatal parse error. * * Since: 2.0 */ gboolean modulemd_module_index_update_from_string (ModulemdModuleIndex *self, const gchar *yaml_string, gboolean strict, GPtrArray **failures, GError **error); /** * modulemd_module_index_update_from_stream: (skip) * @self: This #ModulemdModuleIndex object. * @yaml_stream: (in): A YAML stream containing the module metadata and other * related information such as default streams. * @strict: (in): Whether the parser should return failure if it encounters an * unknown mapping key or if it should ignore it. * @failures: (out) (element-type ModulemdSubdocumentInfo) (transfer container): * On output, an array containing any subdocuments (pointers to * #ModulemdSubdocumentInfo) from the YAML file that failed to parse. On * input, it must be a non-%NULL pointer. If that pointer points to %NULL, this * call will allocate a new array (regardless of any failures) with an element * destructor set to g_object_unref(). Otherwise, the pointed array is reused * without emptying before adding the failed subdocuments. The caller is * responsible for freeing the array. * @error: (out): A #GError containing additional information if this function * fails in a way that prevents program continuation. On input, it must be * %NULL (if you don't care) or a pointer to %NULL (if you want to know the * error). On output, it will become allocated only if an error occured. * * Returns: %TRUE if the update was successful. Returns %FALSE and sets * @failures appropriately if any of the YAML subdocuments were invalid or * sets @error if there was a fatal parse error. * * Since: 2.0 */ gboolean modulemd_module_index_update_from_stream (ModulemdModuleIndex *self, FILE *yaml_stream, gboolean strict, GPtrArray **failures, GError **error); /** * modulemd_module_index_update_from_custom: (skip) * @self: This #ModulemdModuleIndex object. * @custom_read_fn: (in): A #ModulemdReadHandler * @custom_pvt_data: (inout): The private data needed by the #ModulemdReadHandler * @strict: (in): Whether the parser should return failure if it encounters an * unknown mapping key or if it should ignore it. * @failures: (out) (element-type ModulemdSubdocumentInfo) (transfer container): * On output, an array containing any subdocuments (pointers to * #ModulemdSubdocumentInfo) from the YAML file that failed to parse. On * input, it must be a non-%NULL pointer. If that pointer points to %NULL, this * call will allocate a new array (regardless of any failures) with an element * destructor set to g_object_unref(). Otherwise, the pointed array is reused * without emptying before adding the failed subdocuments. The caller is * responsible for freeing the array. * @error: (out): A #GError containing additional information if this function * fails in a way that prevents program continuation. On input, it must be * %NULL (if you don't care) or a pointer to %NULL (if you want to know the * error). On output, it will become allocated only if an error occured. * * Returns: %TRUE if the update was successful. Returns %FALSE and sets * @failures appropriately if any of the YAML subdocuments were invalid or * sets @error if there was a fatal parse error. * * Since: 2.3 */ gboolean modulemd_module_index_update_from_custom (ModulemdModuleIndex *self, ModulemdReadHandler custom_read_fn, void *custom_pvt_data, gboolean strict, GPtrArray **failures, GError **error); /** * modulemd_module_index_update_from_defaults_directory: * @self: This #ModulemdModuleIndex object. * @path: (in): The path to a directory containing defaults documents. * @strict: (in): Whether the parser should return failure if it encounters an * unknown mapping key or a conflict in module default streams. * @overrides_path: (in) (nullable): If non-%NULL, the path to a directory * containing defaults documents that should override those in @path. * @error: (out): A #GError indicating why this function failed. On input, it * must be %NULL (if you don't care) or a pointer to %NULL (if you want to * know the error). On output, it will become allocated only if an error * occured. * * This function will open the directory at @path and iterate through it, * adding any files with the suffix ".yaml" to @self. If @overrides_path is * non-%NULL, it will also open any files with the suffix ".yaml" in that * location and import them, overriding any conflicts with the existing * defaults. * * Note: If you need detailed information about what failed and why, it is * better to implement the directory traversal yourself and use the * modulemd_module_index_update_from_file() function, as it will return the * failures information. * * Returns: %TRUE if all ".yaml" files in the directory were imported * successfully (this includes if no ".yaml" files were present). %FALSE if one * or more files could not be read successfully and sets @error appropriately. * * Since: 2.8 */ gboolean modulemd_module_index_update_from_defaults_directory ( ModulemdModuleIndex *self, const gchar *path, gboolean strict, const gchar *overrides_path, GError **error); /** * modulemd_module_index_dump_to_string: * @self: This #ModulemdModuleIndex object. * @error: (out): A #GError containing the reason the function failed, NULL if * the function succeeded. * * Returns: (transfer full): A YAML representation of the index as a string. In * the event of an error, sets @error appropriately and returns NULL. * * Since: 2.0 */ gchar * modulemd_module_index_dump_to_string (ModulemdModuleIndex *self, GError **error); /** * modulemd_module_index_dump_to_stream: (skip) * @self: This #ModulemdModuleIndex object. * @yaml_stream: (in): A stream to write the module metadata and other related * information to. * @error: (out): A #GError containing the reason the function failed, NULL if * the function succeeded. * * Returns: TRUE if written successfully, FALSE and sets @error appropriately in * the event of an error. * * Since: 2.0 */ gboolean modulemd_module_index_dump_to_stream (ModulemdModuleIndex *self, FILE *yaml_stream, GError **error); /** * modulemd_module_index_dump_to_custom: (skip) * @self: This #ModulemdModuleIndex object. * @custom_write_fn: (in): A #ModulemdWriteHandler * @custom_pvt_data: (inout): The private data needed by the * #ModulemdWriteHandler * @error: (out): A #GError containing the reason the function failed, NULL if * the function succeeded * * Returns: TRUE if written successfully, FALSE and sets @error appropriately in * the event of an error. * * Since: 2.3 */ gboolean modulemd_module_index_dump_to_custom (ModulemdModuleIndex *self, ModulemdWriteHandler custom_write_fn, void *custom_pvt_data, GError **error); /** * modulemd_module_index_get_module_names_as_strv: (rename-to modulemd_module_index_get_module_names) * @self: This #ModulemdModuleIndex object. * * Returns: (transfer full): An ordered list of string keys in this index. * * Since: 2.0 */ GStrv modulemd_module_index_get_module_names_as_strv (ModulemdModuleIndex *self); /** * modulemd_module_index_get_module: * @self: This #ModulemdModuleIndex object. * @module_name: The module name to look up in the index. * * Returns: (transfer none): The #ModulemdModule object matching the provided * module name or NULL if the key was not present in the index. * * Since: 2.0 */ ModulemdModule * modulemd_module_index_get_module (ModulemdModuleIndex *self, const gchar *module_name); /** * modulemd_module_index_search_streams: * @self: This #ModulemdModuleIndex object. * @module_name: (nullable): The name of the module to retrieve. If NULL, will * search all modules in the index. * @stream_name: (nullable): The name of the stream to retrieve. If NULL, will * search all streams in a module. * @version: (nullable): The version of the stream to retrieve. If NULL, will * search all versions. * @context: (nullable): The context of the stream to retrieve. If NULL, will * search all contexts. * @arch: (nullable): The processor architecture of the stream to retrieve. If * NULL, the architecture is not included in the search. * * All arguments to this method will be compared using * [fnmatch(3)](https://www.mankier.com/3/fnmatch). * * Returns: (transfer container) (element-type ModulemdModuleStream): The list * of stream objects matching all of the requested parameters. This function * cannot fail, but it may return a zero-length list if no matches were found. * The returned streams will be in a predictable order, sorted first by module * name, then stream name, then by version (highest first), then by context * and finally by architecture. * * Since: 2.9 */ GPtrArray * modulemd_module_index_search_streams (ModulemdModuleIndex *self, const gchar *module_name, const gchar *stream_name, const gchar *version, const gchar *context, const gchar *arch); /** * modulemd_module_index_search_streams_by_nsvca_glob: * @self: This #ModulemdModuleIndex object. * @nsvca_pattern: (nullable): A [glob](https://www.mankier.com/3/glob) * pattern to match against the NSVCA strings of the #ModulemdModuleStream * objects in this module. If NULL, this will match all NSVCAs. * * Returns: (transfer container) (element-type ModulemdModuleStream): The list * of stream objects matching all of the requested parameters. This function * cannot fail, but it may return a zero-length list if no matches were found. * The returned streams will be in a predictable order, sorted first by module * name, then stream name, then by version (highest first), then by context * and finally by architecture. * * Since: 2.9 */ GPtrArray * modulemd_module_index_search_streams_by_nsvca_glob ( ModulemdModuleIndex *self, const gchar *nsvca_pattern); /** * modulemd_module_index_search_rpms: * @self: This #ModulemdModuleIndex object. * @nevra_pattern: (not nullable): A [glob](https://www.mankier.com/3/glob) * pattern to match against the NEVRA strings of the rpm artifacts in the * #ModulemdModuleStream objects in this module. * * All arguments to this method will be compared using * [fnmatch(3)](https://www.mankier.com/3/fnmatch). * * Returns: (transfer container) (element-type ModulemdModuleStream): The list * of stream objects containing an RPM that matches the @nevra_pattern. * This function cannot fail, but it may return a zero-length list if no * matches were found. * The returned streams will be in a predictable order, sorted first by module * name, then stream name, then by version (highest first), then by context * and finally by architecture. * * Since: 2.9 */ GPtrArray * modulemd_module_index_search_rpms (ModulemdModuleIndex *self, const gchar *nevra_pattern); /** * modulemd_module_index_remove_module: * @self: This #ModulemdModuleIndex object. * @module_name: The name of the module to remove from the index. * * Remove a module, including all of its streams, its defaults and its * translations from a #ModulemdModuleIndex. * * Returns: TRUE if the module name was present in the index. FALSE if it was * not. * * Since: 2.2 */ gboolean modulemd_module_index_remove_module (ModulemdModuleIndex *self, const gchar *module_name); /** * modulemd_module_index_add_module_stream: * @self: This #ModulemdModuleIndex object. * @stream: The #ModulemdModuleStream to add to the index. The stream added * must have a module name and stream name set on it or it will be rejected. * @error: (out): A #GError containing the reason the #ModulemdModuleStream * object could not be added or NULL if the function succeeded. * * Add a #ModulemdModuleStream to the #ModulemdModuleIndex. While being added, * the #ModulemdModuleStream will be upgraded to %MD_MODULESTREAM_VERSION_LATEST * to ensure that merges done with #ModulemdModuleIndexMerger will always occur * between streams of the same version. If this upgrade cannot be performed, * the function will return @error set appropriately. * * Returns: TRUE if the #ModulemdModuleStream was added successfully. If the * stream already existed in the index, it will be replaced by the new one. On * failure, returns FALSE and sets @error appropriately. * * Since: 2.0 */ gboolean modulemd_module_index_add_module_stream (ModulemdModuleIndex *self, ModulemdModuleStream *stream, GError **error); /** * modulemd_module_index_add_defaults: * @self: This #ModulemdModuleIndex object. * @defaults: The #ModulemdDefaults object to add to the index. * @error: (out): A #GError containing the reason the #ModulemdDefaults object * could not be added or NULL if the function succeeded. * * Returns: TRUE if the #ModulemdDefaults was added successfully. If the defaults * already existed in the index, it will be replaced by the new one. On failure, * returns FALSE and sets @error appropriately. * * Since: 2.0 */ gboolean modulemd_module_index_add_defaults (ModulemdModuleIndex *self, ModulemdDefaults *defaults, GError **error); /** * modulemd_module_index_add_obsoletes: * @self: This #ModulemdModuleIndex object. * @obsoletes: (in): The #ModulemdObsoletes object to add to the index. * @error: (out): A #GError containing the reason the #ModulemdObsoletes object * could not be added or NULL if the function succeeded. * * Returns: TRUE if the #ModulemdObsoletes was added successfully. If the obsoletes * already existed in the index, it will be replaced by the new one. On failure, * returns FALSE and sets @error appropriately. * * Since: 2.10 */ gboolean modulemd_module_index_add_obsoletes (ModulemdModuleIndex *self, ModulemdObsoletes *obsoletes, GError **error); /** * modulemd_module_index_get_default_streams_as_hash_table: (rename-to modulemd_module_index_get_default_streams) * @self: (in): This #ModulemdModuleIndex object. * @intent: (in) (nullable): The name of the system intent whose default stream * will be retrieved. If left NULL or the specified intent has no separate * default, it will return the generic default stream for this module. * System intents are deprecated and this argument will be ignored in the * future. * * Get a dictionary of all modules in the index that have a default stream. * * This function cannot fail, but may return an empty (non-NULL) #GHashTable. * * Returns: (transfer container) (element-type utf8 utf8): A #GHashTable with * the module name as the key and the default stream as the value for all * modules with a default stream in the index. Modules without a default stream * will not appear in this table. * * Since: 2.5 */ GHashTable * modulemd_module_index_get_default_streams_as_hash_table ( ModulemdModuleIndex *self, const gchar *intent); /** * modulemd_module_index_add_translation: * @self: This #ModulemdModuleIndex object. * @translation: The #ModulemdTranslation object to add to the index. * @error: (out): A #GError containing the reason the #ModulemdTranslation * object could not be added or NULL if the function succeeded. * * Returns: TRUE if the #ModulemdTranslation was added successfully. If the * translation already existed in the index, it will be replaced by the new one. * On failure, returns FALSE and sets @error appropriately. * * Since: 2.0 */ gboolean modulemd_module_index_add_translation (ModulemdModuleIndex *self, ModulemdTranslation *translation, GError **error); /** * modulemd_module_index_get_defaults_mdversion: * @self: This #ModulemdModuleIndex object. * * Returns: The metadata version of #ModulemdDefaults in use for this index. * * Since: 2.0 */ ModulemdDefaultsVersionEnum modulemd_module_index_get_defaults_mdversion (ModulemdModuleIndex *self); /** * modulemd_module_index_get_stream_mdversion: * @self: This #ModulemdModuleIndex object. * * Returns: The metadata version of #ModulemdModuleStream in use for this * index. * * Since: 2.0 */ ModulemdModuleStreamVersionEnum modulemd_module_index_get_stream_mdversion (ModulemdModuleIndex *self); /** * modulemd_module_index_upgrade_streams: * @self: This #ModulemdModuleIndex object. * @mdversion: The #ModulemdModuleStream metadata version to upgrade to. * @error: (out): A #GError that contains information on why the index could * not be upgraded in the event of an error. * * Upgrades all #ModulemdModuleStream objects in this index to @mdversion if * they are not already at that version. * * Since: 2.0 */ gboolean modulemd_module_index_upgrade_streams ( ModulemdModuleIndex *self, ModulemdModuleStreamVersionEnum mdversion, GError **error); /** * modulemd_module_index_upgrade_defaults: * @self: This #ModulemdModuleIndex object. * @mdversion: The #ModulemdDefaults metadata version to upgrade to. * @error: (out) (optional): A #GError that contains information on why the * index could not be upgraded in the event of an error. * * Upgrades all #ModulemdDefaults objects in this index to @mdversion if they * are not already at that version. An attempt to downgrade or an attempt to * upgrade beyond the latest supported version will report an error. In the * case of a failure to upgrade a particular #ModulemdDefaults object of the * index, an error will be reported and the index will be left in an undefined * state. * * Since: 2.0 */ gboolean modulemd_module_index_upgrade_defaults (ModulemdModuleIndex *self, ModulemdDefaultsVersionEnum mdversion, GError **error); /** * modulemd_module_index_clear_xmds: * @self: This #ModulemdModuleIndex object. * * Iterates through all #ModulemdModuleStream entries in this * #ModulemdModuleIndex and removes any XMD sections that are present. This is * generally done to trim down the metadata to only the portions that are * useful to the package manager. * * Since: 2.14 */ void modulemd_module_index_clear_xmds (ModulemdModuleIndex *self); G_END_DECLS fedora-modularity-libmodulemd-357799c/modulemd/include/modulemd-2.0/modulemd-module-stream-v1.h000066400000000000000000000646571502446517500323760ustar00rootroot00000000000000/* * This file is part of libmodulemd * Copyright (C) 2018 Red Hat, Inc. * * Fedora-License-Identifier: MIT * SPDX-2.0-License-Identifier: MIT * SPDX-3.0-License-Identifier: MIT * * This program is free software. * For more information on the license, see COPYING. * For more information on free software, see . */ #pragma once #include "modulemd-buildopts.h" #include "modulemd-component-module.h" #include "modulemd-component-rpm.h" #include "modulemd-component.h" #include "modulemd-deprecated.h" #include "modulemd-module-stream.h" #include "modulemd-profile.h" #include "modulemd-service-level.h" #include G_BEGIN_DECLS /** * SECTION: modulemd-module-stream-v1 * @title: Modulemd.ModuleStreamV1 * @stability: stable * @short_description: The data to represent a stream of a module as described * by a modulemd YAML document of version 1. */ #define MODULEMD_TYPE_MODULE_STREAM_V1 (modulemd_module_stream_v1_get_type ()) G_DECLARE_FINAL_TYPE (ModulemdModuleStreamV1, modulemd_module_stream_v1, MODULEMD, MODULE_STREAM_V1, ModulemdModuleStream) /** * modulemd_module_stream_v1_new: * @module_name: (in) (nullable): The name of this module. * @module_stream: (in) (nullable): The name of this module stream. * * Returns: (transfer full): A newly-allocated #ModulemdModuleStreamV1 object, * with the specified module and stream names, if provided. * * Since: 2.0 */ ModulemdModuleStreamV1 * modulemd_module_stream_v1_new (const gchar *module_name, const gchar *module_stream); /* ===== Properties ====== */ /** * modulemd_module_stream_v1_set_arch: * @self: (in): This #ModulemdModuleStreamV1 object. * @arch: (in): The module artifact architecture. * * Set the module artifact architecture. * * Since: 2.0 */ void modulemd_module_stream_v1_set_arch (ModulemdModuleStreamV1 *self, const gchar *arch); /** * modulemd_module_stream_v1_get_arch: * @self: (in): This #ModulemdModuleStreamV1 object. * * Returns: (transfer none): The module artifact architecture. * * Since: 2.0 */ const gchar * modulemd_module_stream_v1_get_arch (ModulemdModuleStreamV1 *self); /** * modulemd_module_stream_v1_set_buildopts: * @self: (in): This #ModulemdModuleStreamV1 object. * @buildopts: (in) (transfer none): A #ModulemdBuildopts object describing * build options that apply globally to components in this module. * * Set build options for this module's components. * * Since: 2.0 */ void modulemd_module_stream_v1_set_buildopts (ModulemdModuleStreamV1 *self, ModulemdBuildopts *buildopts); /** * modulemd_module_stream_v1_get_buildopts: * @self: (in): This #ModulemdModuleStreamV1 object. * * Returns: (transfer none): The build options for this module's components. * * Since: 2.0 */ ModulemdBuildopts * modulemd_module_stream_v1_get_buildopts (ModulemdModuleStreamV1 *self); /** * modulemd_module_stream_v1_set_community: * @self: (in): This #ModulemdModuleStreamV1 object. * @community: (in): The upstream community website for this module. * * Set the module community website address. * * Since: 2.0 */ void modulemd_module_stream_v1_set_community (ModulemdModuleStreamV1 *self, const gchar *community); /** * modulemd_module_stream_v1_get_community: * @self: (in): This #ModulemdModuleStreamV1 object. * * Returns: (transfer none): The module community website address. * * Since: 2.0 */ const gchar * modulemd_module_stream_v1_get_community (ModulemdModuleStreamV1 *self); /** * modulemd_module_stream_v1_set_description: * @self: (in): This #ModulemdModuleStreamV1 object. * @description: (in) (nullable): The untranslated description of this module. * * Set the module description. * * Since: 2.0 */ void modulemd_module_stream_v1_set_description (ModulemdModuleStreamV1 *self, const gchar *description); /** * modulemd_module_stream_v1_get_description: * @self: (in): This #ModulemdModuleStreamV1 object. * @locale: (in) (nullable): The name of the locale to use when translating * the string. If NULL, it will determine the locale with a system call to * `setlocale(LC_MESSAGES, NULL)` and return that. If the caller wants the * untranslated string, they should pass `"C"` for the locale. * * Returns: (transfer none): The module description, translated to the * requested locale if available. Translation information is managed by the * #ModulemdTranslation and #ModulemdTranslationEntry objects. * * Since: 2.0 */ const gchar * modulemd_module_stream_v1_get_description (ModulemdModuleStreamV1 *self, const gchar *locale); /** * modulemd_module_stream_v1_set_documentation: * @self: (in): This #ModulemdModuleStreamV1 object. * @documentation: (in): The upstream documentation website for this module. * * Set the module documentation website address. * * Since: 2.0 */ void modulemd_module_stream_v1_set_documentation (ModulemdModuleStreamV1 *self, const gchar *documentation); /** * modulemd_module_stream_v1_get_documentation: * @self: (in): This #ModulemdModuleStreamV1 object. * * Returns: (transfer none): The module documentation website address. * * Since: 2.0 */ const gchar * modulemd_module_stream_v1_get_documentation (ModulemdModuleStreamV1 *self); /** * modulemd_module_stream_v1_set_summary: * @self: (in): This #ModulemdModuleStreamV1 object. * @summary: (in) (nullable): The untranslated summary of this module. * * Set the module summary. * * Since: 2.0 */ void modulemd_module_stream_v1_set_summary (ModulemdModuleStreamV1 *self, const gchar *summary); /** * modulemd_module_stream_v1_get_summary: * @self: (in): This #ModulemdModuleStreamV1 object. * @locale: (in) (nullable): The name of the locale to use when translating * the string. If NULL, it will determine the locale with a system call to * `setlocale(LC_MESSAGES, NULL)` and return that. If the caller wants the * untranslated string, they should pass `"C"` for the locale. * * Returns: (transfer none): The module summary, translated to the requested * locale if available. Translation information is managed by the * #ModulemdTranslation and #ModulemdTranslationEntry objects. * * Since: 2.0 */ const gchar * modulemd_module_stream_v1_get_summary (ModulemdModuleStreamV1 *self, const gchar *locale); /** * modulemd_module_stream_v1_set_tracker: * @self: (in): This #ModulemdModuleStreamV1 object. * @tracker: (in): The upstream bug tracker website for this module. * * Set the module bug tracker website address. * * Since: 2.0 */ void modulemd_module_stream_v1_set_tracker (ModulemdModuleStreamV1 *self, const gchar *tracker); /** * modulemd_module_stream_v1_get_tracker: * @self: (in): This #ModulemdModuleStreamV1 object. * * Returns: (transfer none): The module bug tracker website address. * * Since: 2.0 */ const gchar * modulemd_module_stream_v1_get_tracker (ModulemdModuleStreamV1 *self); /* ===== Non-property Methods ===== */ /** * modulemd_module_stream_v1_add_component: * @self: (in): This #ModulemdModuleStreamV1 object. * @component: (in) (transfer none): A #ModulemdComponent to be added to this * module stream. * * Add a component definition to the module. * * Since: 2.0 */ void modulemd_module_stream_v1_add_component (ModulemdModuleStreamV1 *self, ModulemdComponent *component); /** * modulemd_module_stream_v1_remove_module_component: * @self: (in): This #ModulemdModuleStreamV1 object. * @component_name: (in): The name of the component to remove from the module * stream. * * Remove a component from this module stream. * * Since: 2.0 */ void modulemd_module_stream_v1_remove_module_component ( ModulemdModuleStreamV1 *self, const gchar *component_name); /** * modulemd_module_stream_v1_clear_module_components: * @self: (in): This #ModulemdModuleStreamV1 object. * * Remove all module components from this module stream. * * Since: 2.5 */ void modulemd_module_stream_v1_clear_module_components ( ModulemdModuleStreamV1 *self); /** * modulemd_module_stream_v1_remove_rpm_component: * @self: (in): This #ModulemdModuleStreamV1 object. * @component_name: (in): The name of the component to remove from the module * stream. * * Remove a component from this module stream. * * Since: 2.0 */ void modulemd_module_stream_v1_remove_rpm_component (ModulemdModuleStreamV1 *self, const gchar *component_name); /** * modulemd_module_stream_v1_clear_rpm_components: * @self: (in): This #ModulemdModuleStreamV1 object. * * Remove all RPM components from this module stream. * * Since: 2.5 */ void modulemd_module_stream_v1_clear_rpm_components (ModulemdModuleStreamV1 *self); /** * modulemd_module_stream_v1_get_module_component_names_as_strv: (rename-to modulemd_module_stream_v1_get_module_component_names) * @self: (in): This #ModulemdModuleStreamV1 object. * * Returns: (transfer full): An ordered #GStrv list of module component names * included in this stream. * * Since: 2.0 */ GStrv modulemd_module_stream_v1_get_module_component_names_as_strv ( ModulemdModuleStreamV1 *self); /** * modulemd_module_stream_v1_get_rpm_component_names_as_strv: (rename-to modulemd_module_stream_v1_get_rpm_component_names) * @self: (in): This #ModulemdModuleStreamV1 object. * * Returns: (transfer full): An ordered #GStrv list of RPM component names * included in this stream. * * Since: 2.0 */ GStrv modulemd_module_stream_v1_get_rpm_component_names_as_strv ( ModulemdModuleStreamV1 *self); /** * modulemd_module_stream_v1_get_module_component: * @self: (in): This #ModulemdModuleStreamV1 object. * @component_name: (in): The name of the component to retrieve. * * Returns: (transfer none): The module component matching @component_name if * it exists, else NULL. * * Since: 2.0 */ ModulemdComponentModule * modulemd_module_stream_v1_get_module_component (ModulemdModuleStreamV1 *self, const gchar *component_name); /** * modulemd_module_stream_v1_get_rpm_component: * @self: (in): This #ModulemdModuleStreamV1 object. * @component_name: (in): The name of the component to retrieve. * * Returns: (transfer none): The RPM component matching @component_name if it * exists, else NULL. * * Since: 2.0 */ ModulemdComponentRpm * modulemd_module_stream_v1_get_rpm_component (ModulemdModuleStreamV1 *self, const gchar *component_name); /** * modulemd_module_stream_v1_add_content_license: * @self: (in): This #ModulemdModuleStreamV1 object. * @license: (in): A license under which one or more of the components of this * module stream are distributed. * * Since: 2.0 */ void modulemd_module_stream_v1_add_content_license (ModulemdModuleStreamV1 *self, const gchar *license); /** * modulemd_module_stream_v1_add_module_license: * @self: (in): This #ModulemdModuleStreamV1 object. * @license: (in): A license under which this module stream is distributed. * * Since: 2.0 */ void modulemd_module_stream_v1_add_module_license (ModulemdModuleStreamV1 *self, const gchar *license); /** * modulemd_module_stream_v1_remove_content_license: * @self: (in): This #ModulemdModuleStreamV1 object. * @license: (in): A license to remove from the list. Has no effect if the * license is not present. * * Since: 2.0 */ void modulemd_module_stream_v1_remove_content_license (ModulemdModuleStreamV1 *self, const gchar *license); /** * modulemd_module_stream_v1_clear_content_licenses: * @self: (in): This #ModulemdModuleStreamV1 object. * * Remove all content licenses. * * Since: 2.5 */ void modulemd_module_stream_v1_clear_content_licenses ( ModulemdModuleStreamV1 *self); /** * modulemd_module_stream_v1_remove_module_license: * @self: (in): This #ModulemdModuleStreamV1 object. * @license: (in): A license to remove from the list. Has no effect if the * license is not present. * * Since: 2.0 */ void modulemd_module_stream_v1_remove_module_license (ModulemdModuleStreamV1 *self, const gchar *license); /** * modulemd_module_stream_v1_clear_module_licenses: * @self: (in): This #ModulemdModuleStreamV1 object. * * Remove all module licenses. * * Since: 2.5 */ void modulemd_module_stream_v1_clear_module_licenses (ModulemdModuleStreamV1 *self); /** * modulemd_module_stream_v1_get_content_licenses_as_strv: (rename-to modulemd_module_stream_v1_get_content_licenses) * @self: (in): This #ModulemdModuleStreamV1 object. * * Returns: (transfer full): An ordered #GStrv list of licenses under which one * or more components of this module stream are released. * * Since: 2.0 */ GStrv modulemd_module_stream_v1_get_content_licenses_as_strv ( ModulemdModuleStreamV1 *self); /** * modulemd_module_stream_v1_get_module_licenses_as_strv: (rename-to modulemd_module_stream_v1_get_module_licenses) * @self: (in): This #ModulemdModuleStreamV1 object. * * Returns: (transfer full): An ordered #GStrv list of licenses under which * this module stream is released. * * Since: 2.0 */ GStrv modulemd_module_stream_v1_get_module_licenses_as_strv ( ModulemdModuleStreamV1 *self); /** * modulemd_module_stream_v1_add_profile: * @self: (in): This #ModulemdModuleStreamV1 object. * @profile: (in) (transfer none): A #ModulemdProfile for this module stream. * * Adds a profile definition to this module stream. * * Since: 2.0 */ void modulemd_module_stream_v1_add_profile (ModulemdModuleStreamV1 *self, ModulemdProfile *profile); /** * modulemd_module_stream_v1_clear_profiles: * @self: (in): This #ModulemdModuleStreamV1 object. * * Remove all profiles from this module stream. * * Since: 2.0 */ void modulemd_module_stream_v1_clear_profiles (ModulemdModuleStreamV1 *self); /** * modulemd_module_stream_v1_get_profile_names_as_strv: (rename-to modulemd_module_stream_v1_get_profile_names) * @self: (in): This #ModulemdModuleStreamV1 object. * * Returns: (transfer full): An ordered #GStrv list of profile names associated * with this module stream. * * Since: 2.0 */ GStrv modulemd_module_stream_v1_get_profile_names_as_strv ( ModulemdModuleStreamV1 *self); /** * modulemd_module_stream_v1_get_profile: * @self: (in): This #ModulemdModuleStreamV1 object. * @profile_name: (in): The name of a profile to retrieve. * * Returns: (transfer none): The requested profile definition if present in the * module stream. NULL otherwise. * * Since: 2.0 */ ModulemdProfile * modulemd_module_stream_v1_get_profile (ModulemdModuleStreamV1 *self, const gchar *profile_name); /** * modulemd_module_stream_v1_add_rpm_api: * @self: (in): This #ModulemdModuleStreamV1 object. * @rpm: (in): The name of a binary RPM present in this module that is * considered stable public API. * * Since: 2.0 */ void modulemd_module_stream_v1_add_rpm_api (ModulemdModuleStreamV1 *self, const gchar *rpm); /** * modulemd_module_stream_v1_remove_rpm_api: * @self: (in): This #ModulemdModuleStreamV1 object. * @rpm: (in): A binary RPM name to remove from the list of stable public API. * * Since: 2.0 */ void modulemd_module_stream_v1_remove_rpm_api (ModulemdModuleStreamV1 *self, const gchar *rpm); /** * modulemd_module_stream_v1_clear_rpm_api: * @self: (in): This #ModulemdModuleStreamV1 object. * * Remove all RPMs from the list of stable public API. * * Since: 2.5 */ void modulemd_module_stream_v1_clear_rpm_api (ModulemdModuleStreamV1 *self); /** * modulemd_module_stream_v1_get_rpm_api_as_strv: (rename-to modulemd_module_stream_v1_get_rpm_api) * @self: (in): This #ModulemdModuleStreamV1 object. * * Returns: (transfer full): An ordered #GStrv list of binary RPM names that * forms the public API of this module stream. * * Since: 2.0 */ GStrv modulemd_module_stream_v1_get_rpm_api_as_strv (ModulemdModuleStreamV1 *self); /** * modulemd_module_stream_v1_add_rpm_artifact: * @self: (in): This #ModulemdModuleStreamV1 object. * @nevr: (in): The NEVR of a binary RPM present in this module stream. * * Since: 2.0 */ void modulemd_module_stream_v1_add_rpm_artifact (ModulemdModuleStreamV1 *self, const gchar *nevr); /** * modulemd_module_stream_v1_remove_rpm_artifact: * @self: (in): This #ModulemdModuleStreamV1 object. * @nevr: (in): An RPM NEVR to remove from the list of artifacts. * * Since: 2.0 */ void modulemd_module_stream_v1_remove_rpm_artifact (ModulemdModuleStreamV1 *self, const gchar *nevr); /** * modulemd_module_stream_v1_clear_rpm_artifacts: * @self: (in): This #ModulemdModuleStreamV1 object. * * Remove all RPM NEVRs from the list of artifacts. * * Since: 2.5 */ void modulemd_module_stream_v1_clear_rpm_artifacts (ModulemdModuleStreamV1 *self); /** * modulemd_module_stream_v1_get_rpm_artifacts_as_strv: (rename-to modulemd_module_stream_v1_get_rpm_artifacts) * @self: (in): This #ModulemdModuleStreamV1 object. * * Returns: (transfer full): An ordered #GStrv list of RPM NEVRs are included * in this module stream. * * Since: 2.0 */ GStrv modulemd_module_stream_v1_get_rpm_artifacts_as_strv ( ModulemdModuleStreamV1 *self); /** * modulemd_module_stream_v1_add_rpm_filter: * @self: (in): This #ModulemdModuleStreamV1 object. * @rpm: (in): The name of a binary RPM to filter out of this module stream. * * Since: 2.0 */ void modulemd_module_stream_v1_add_rpm_filter (ModulemdModuleStreamV1 *self, const gchar *rpm); /** * modulemd_module_stream_v1_remove_rpm_filter: * @self: (in): This #ModulemdModuleStreamV1 object. * @rpm: (in): A binary RPM name to remove from the filter list. * * Since: 2.0 */ void modulemd_module_stream_v1_remove_rpm_filter (ModulemdModuleStreamV1 *self, const gchar *rpm); /** * modulemd_module_stream_v1_clear_rpm_filters: * @self: (in): This #ModulemdModuleStreamV1 object. * * Remove all RPMs from the filter list. * * Since: 2.5 */ void modulemd_module_stream_v1_clear_rpm_filters (ModulemdModuleStreamV1 *self); /** * modulemd_module_stream_v1_get_rpm_filters_as_strv: (rename-to modulemd_module_stream_v1_get_rpm_filters) * @self: (in): This #ModulemdModuleStreamV1 object. * * Returns: (transfer full): An ordered #GStrv list of binary RPM names that * are filtered out of this module stream. * * Since: 2.0 */ GStrv modulemd_module_stream_v1_get_rpm_filters_as_strv ( ModulemdModuleStreamV1 *self); /** * modulemd_module_stream_v1_add_servicelevel: * @self: (in): This #ModulemdModuleStreamV1 object. * @servicelevel: (in) (transfer none): A #ModulemdServiceLevel for this module stream. * * Adds a servicelevel definition to this module stream. * * Since: 2.0 */ void modulemd_module_stream_v1_add_servicelevel ( ModulemdModuleStreamV1 *self, ModulemdServiceLevel *servicelevel); /** * modulemd_module_stream_v1_clear_servicelevels: * @self: (in): This #ModulemdModuleStreamV1 object. * * Remove all servicelevels from this module stream. * * Since: 2.0 */ void modulemd_module_stream_v1_clear_servicelevels (ModulemdModuleStreamV1 *self); /** * modulemd_module_stream_v1_get_servicelevel_names_as_strv: (rename-to modulemd_module_stream_v1_get_servicelevel_names) * @self: (in): This #ModulemdModuleStreamV1 object. * * Returns: (transfer full): An ordered #GStrv list of servicelevel names * associated with this module stream. * * Since: 2.0 */ GStrv modulemd_module_stream_v1_get_servicelevel_names_as_strv ( ModulemdModuleStreamV1 *self); /** * modulemd_module_stream_v1_get_servicelevel: * @self: (in): This #ModulemdModuleStreamV1 object. * @servicelevel_name: (in): The name of a servicelevel to retrieve. * * Returns: (transfer none): The requested servicelevel definition if present in the * module stream. NULL otherwise. * * Since: 2.0 */ ModulemdServiceLevel * modulemd_module_stream_v1_get_servicelevel (ModulemdModuleStreamV1 *self, const gchar *servicelevel_name); /** * modulemd_module_stream_v1_set_eol: * @self: (in): This #ModulemdModuleStreamV1 object. * @eol: (in): The end-of-life date for the "rawhide" service level. * * Comptibility function with early iterations of modulemd v1. This function is * a wrapper for `modulemd_module_stream_v1_add_servicelevel("rawhide", eol)`. * * Since: 2.0 * Deprecated: 2.0: Use modulemd_module_stream_v1_add_servicelevel() instead. */ MMD_DEPRECATED_FOR (modulemd_module_stream_v1_add_servicelevel) void modulemd_module_stream_v1_set_eol (ModulemdModuleStreamV1 *self, GDate *eol); /** * modulemd_module_stream_v1_get_eol: * @self: (in): This #ModulemdModuleStreamV1 object. * * Compatibility function with early iterations of modulemd v1. This function * is a wrapper for `modulemd_module_stream_v1_get_servicelevel("rawhide")`. * * Returns: (transfer none): The end-of-life date for the "rawhide" service * level. * * Since: 2.0 * Deprecated: 2.0: Use modulemd_module_stream_v1_get_servicelevel() instead. */ MMD_DEPRECATED_FOR (modulemd_module_stream_v1_get_servicelevel) GDate * modulemd_module_stream_v1_get_eol (ModulemdModuleStreamV1 *self); /** * modulemd_module_stream_v1_add_buildtime_requirement: * @self: (in): This #ModulemdModuleStreamV1 object. * @module_name: (in): The name of the module to depend on. * @module_stream: (in): The name of the module stream to depend on. * * Add a build-time dependency for this module. * * Since: 2.0 */ void modulemd_module_stream_v1_add_buildtime_requirement ( ModulemdModuleStreamV1 *self, const gchar *module_name, const gchar *module_stream); /** * modulemd_module_stream_v1_add_runtime_requirement: * @self: (in): This #ModulemdModuleStreamV1 object. * @module_name: (in): The name of the module to depend on. * @module_stream: (in): The name of the module stream to depend on. * * Add a runtime dependency for this module. * * Since: 2.0 */ void modulemd_module_stream_v1_add_runtime_requirement ( ModulemdModuleStreamV1 *self, const gchar *module_name, const gchar *module_stream); /** * modulemd_module_stream_v1_remove_buildtime_requirement: * @self: (in): This #ModulemdModuleStreamV1 object. * @module_name: (in): The name of the module to be removed. * * Remove a build-time dependency for this module. * * Since: 2.0 */ void modulemd_module_stream_v1_remove_buildtime_requirement ( ModulemdModuleStreamV1 *self, const gchar *module_name); /** * modulemd_module_stream_v1_remove_runtime_requirement: * @self: (in): This #ModulemdModuleStreamV1 object. * @module_name: (in): The name of the module to be removed. * * Remove a runtime dependency for this module. * * Since: 2.0 */ void modulemd_module_stream_v1_remove_runtime_requirement ( ModulemdModuleStreamV1 *self, const gchar *module_name); /** * modulemd_module_stream_v1_clear_buildtime_requirements * @self: (in): This #ModulemdModuleStreamV1 object. * * Remove all buildtime dependencies for this module. * * Since: 2.5 */ void modulemd_module_stream_v1_clear_buildtime_requirements ( ModulemdModuleStreamV1 *self); /** * modulemd_module_stream_v1_clear_runtime_requirements * @self: (in): This #ModulemdModuleStreamV1 object. * * Remove all runtime dependencies for this module. * * Since: 2.5 */ void modulemd_module_stream_v1_clear_runtime_requirements ( ModulemdModuleStreamV1 *self); /** * modulemd_module_stream_v1_get_buildtime_modules_as_strv: (rename-to modulemd_module_stream_v1_get_buildtime_modules) * @self: (in): This #ModulemdModuleStreamV1 object. * * Returns: (transfer full): An ordered #GStrv list of module names that this * module depends on at build-time. * * Since: 2.0 */ GStrv modulemd_module_stream_v1_get_buildtime_modules_as_strv ( ModulemdModuleStreamV1 *self); /** * modulemd_module_stream_v1_get_runtime_modules_as_strv: (rename-to modulemd_module_stream_v1_get_runtime_modules) * @self: (in): This #ModulemdModuleStreamV1 object. * * Returns: (transfer full): An ordered #GStrv list of module names that this * module depends on at runtime. * * Since: 2.0 */ GStrv modulemd_module_stream_v1_get_runtime_modules_as_strv ( ModulemdModuleStreamV1 *self); /** * modulemd_module_stream_v1_get_buildtime_requirement_stream: * @self: (in): This #ModulemdModuleStreamV1 object. * @module_name: (in): The name of the module this module depends on. * * Returns: (transfer none): The name of the stream matching this module name * in the build-time dependencies. * * Since: 2.0 */ const gchar * modulemd_module_stream_v1_get_buildtime_requirement_stream ( ModulemdModuleStreamV1 *self, const gchar *module_name); /** * modulemd_module_stream_get_runtime_requirement_stream: * @self: (in): This #ModulemdModuleStreamV1 object. * @module_name: (in): The name of the module this module depends on. * * Returns: (transfer none): The name of the stream matching this module name * in the runtime dependencies. * * Since: 2.0 */ const gchar * modulemd_module_stream_v1_get_runtime_requirement_stream ( ModulemdModuleStreamV1 *self, const gchar *module_name); /** * modulemd_module_stream_v1_set_xmd: * @self: (in): This #ModulemdModuleStreamV1 object. * @xmd: (in) (transfer none): A #GVariant representing arbitrary YAML. * * Sets the eXtensible MetaData (XMD) for this module. XMD is arbitrary YAML * data that will be set and returned as-is (with the exception that the * ordering of mapping keys is not defined). Useful for carrying private data. * * This function assumes ownership of the XMD #GVariant and thus should not be * freed by the caller. * * Since: 2.0 */ void modulemd_module_stream_v1_set_xmd (ModulemdModuleStreamV1 *self, GVariant *xmd); /** * modulemd_module_stream_v1_get_xmd: * @self: (in): This #ModulemdModuleStreamV1 object. * * Returns: (transfer none): The extensible metadata block as a #GVariant. */ GVariant * modulemd_module_stream_v1_get_xmd (ModulemdModuleStreamV1 *self); G_END_DECLS fedora-modularity-libmodulemd-357799c/modulemd/include/modulemd-2.0/modulemd-module-stream-v2.h000066400000000000000000000701531502446517500323630ustar00rootroot00000000000000/* * This file is part of libmodulemd * Copyright (C) 2018 Red Hat, Inc. * * Fedora-License-Identifier: MIT * SPDX-2.0-License-Identifier: MIT * SPDX-3.0-License-Identifier: MIT * * This program is free software. * For more information on the license, see COPYING. * For more information on free software, see . */ #pragma once #include "modulemd-buildopts.h" #include "modulemd-component-module.h" #include "modulemd-component-rpm.h" #include "modulemd-component.h" #include "modulemd-dependencies.h" #include "modulemd-module-stream.h" #include "modulemd-profile.h" #include "modulemd-rpm-map-entry.h" #include "modulemd-service-level.h" #include "modulemd-obsoletes.h" #include G_BEGIN_DECLS /** * SECTION: modulemd-module-stream-v2 * @title: Modulemd.ModuleStreamV2 * @stability: stable * @short_description: The data to represent a stream of a module as described * by a modulemd YAML document of version 2. */ #define MODULEMD_TYPE_MODULE_STREAM_V2 (modulemd_module_stream_v2_get_type ()) G_DECLARE_FINAL_TYPE (ModulemdModuleStreamV2, modulemd_module_stream_v2, MODULEMD, MODULE_STREAM_V2, ModulemdModuleStream) /** * modulemd_module_stream_v2_new: * @module_name: (in) (nullable): The name of this module. * @module_stream: (in) (nullable): The name of this module stream. * * Returns: (transfer full): A newly-allocated #ModulemdModuleStreamV2 object, * with the specified module and stream names, if provided. * * Since: 2.0 */ ModulemdModuleStreamV2 * modulemd_module_stream_v2_new (const gchar *module_name, const gchar *module_stream); /* ===== Properties ====== */ /** * modulemd_module_stream_v2_set_arch: * @self: (in): This #ModulemdModuleStreamV2 object. * @arch: (in): The module artifact architecture. * * Set the module artifact architecture. * * Since: 2.0 */ void modulemd_module_stream_v2_set_arch (ModulemdModuleStreamV2 *self, const gchar *arch); /** * modulemd_module_stream_v2_get_arch: * @self: (in): This #ModulemdModuleStreamV2 object. * * Returns: (transfer none): The module artifact architecture. * * Since: 2.0 */ const gchar * modulemd_module_stream_v2_get_arch (ModulemdModuleStreamV2 *self); /** * modulemd_module_stream_v2_set_buildopts: * @self: (in): This #ModulemdModuleStreamV2 object. * @buildopts: (in) (transfer none): A #ModulemdBuildopts object describing * build options that apply globally to components in this module. * * Set build options for this module's components. * * Since: 2.0 */ void modulemd_module_stream_v2_set_buildopts (ModulemdModuleStreamV2 *self, ModulemdBuildopts *buildopts); /** * modulemd_module_stream_v2_get_buildopts: * @self: (in): This #ModulemdModuleStreamV2 object. * * Returns: (transfer none): The build options for this module's components. * * Since: 2.0 */ ModulemdBuildopts * modulemd_module_stream_v2_get_buildopts (ModulemdModuleStreamV2 *self); /** * modulemd_module_stream_v2_set_community: * @self: (in): This #ModulemdModuleStreamV2 object. * @community: (in): The upstream community website for this module. * * Set the module community website address. * * Since: 2.0 */ void modulemd_module_stream_v2_set_community (ModulemdModuleStreamV2 *self, const gchar *community); /** * modulemd_module_stream_v2_get_community: * @self: (in): This #ModulemdModuleStreamV2 object. * * Returns: (transfer none): The module community website address. * * Since: 2.0 */ const gchar * modulemd_module_stream_v2_get_community (ModulemdModuleStreamV2 *self); /** * modulemd_module_stream_v2_set_description: * @self: (in): This #ModulemdModuleStreamV2 object. * @description: (in) (nullable): The untranslated description of this module. * * Set the module description. * * Since: 2.0 */ void modulemd_module_stream_v2_set_description (ModulemdModuleStreamV2 *self, const gchar *description); /** * modulemd_module_stream_v2_get_description: * @self: (in): This #ModulemdModuleStreamV2 object. * @locale: (in) (nullable): The name of the locale to use when translating * the string. If NULL, it will determine the locale with a system call to * `setlocale(LC_MESSAGES, NULL)` and return that. If the caller wants the * untranslated string, they should pass `"C"` for the locale. * * Returns: (transfer none): The module description, translated to the * requested locale if available. Translation information is managed by the * #ModulemdTranslation and #ModulemdTranslationEntry objects. * * Since: 2.0 */ const gchar * modulemd_module_stream_v2_get_description (ModulemdModuleStreamV2 *self, const gchar *locale); /** * modulemd_module_stream_v2_set_documentation: * @self: (in): This #ModulemdModuleStreamV2 object. * @documentation: (in): The upstream documentation website for this module. * * Set the module documentation website address. * * Since: 2.0 */ void modulemd_module_stream_v2_set_documentation (ModulemdModuleStreamV2 *self, const gchar *documentation); /** * modulemd_module_stream_v2_get_documentation: * @self: (in): This #ModulemdModuleStreamV2 object. * * Returns: (transfer none): The module documentation website address. * * Since: 2.0 */ const gchar * modulemd_module_stream_v2_get_documentation (ModulemdModuleStreamV2 *self); /** * modulemd_module_stream_v2_set_summary: * @self: (in): This #ModulemdModuleStreamV2 object. * @summary: (in) (nullable): The untranslated summary of this module. * * Set the module summary. * * Since: 2.0 */ void modulemd_module_stream_v2_set_summary (ModulemdModuleStreamV2 *self, const gchar *summary); /** * modulemd_module_stream_v2_get_summary: * @self: (in): This #ModulemdModuleStreamV2 object. * @locale: (in) (nullable): The name of the locale to use when translating * the string. If NULL, it will determine the locale with a system call to * `setlocale(LC_MESSAGES, NULL)` and return that. If the caller wants the * untranslated string, they should pass `"C"` for the locale. * * Returns: (transfer none): The module summary, translated to the requested * locale if available. Translation information is managed by the * #ModulemdTranslation and #ModulemdTranslationEntry objects. * * Since: 2.0 */ const gchar * modulemd_module_stream_v2_get_summary (ModulemdModuleStreamV2 *self, const gchar *locale); /** * modulemd_module_stream_v2_set_tracker: * @self: (in): This #ModulemdModuleStreamV2 object. * @tracker: (in): The upstream bug tracker website for this module. * * Set the module bug tracker website address. * * Since: 2.0 */ void modulemd_module_stream_v2_set_tracker (ModulemdModuleStreamV2 *self, const gchar *tracker); /** * modulemd_module_stream_v2_get_tracker: * @self: (in): This #ModulemdModuleStreamV2 object. * * Returns: (transfer none): The module bug tracker website address. * * Since: 2.0 */ const gchar * modulemd_module_stream_v2_get_tracker (ModulemdModuleStreamV2 *self); /** * modulemd_module_stream_v2_get_obsoletes_resolved: * @self: (in): This #ModulemdModuleStreamV2 object. * * Returns: (transfer none): The #ModulemdObsoletes information associated with * this object. If the associated obsoletes has reset attribute set, this * function doesn't return it. From outside obsoletes with reset looks like * there is no obsoletes set for this stream. Every obsoletes (even with reset) can * be accessed from the streams module. * * Since: 2.10 */ ModulemdObsoletes * modulemd_module_stream_v2_get_obsoletes_resolved ( ModulemdModuleStreamV2 *self); /* ===== Non-property Methods ===== */ /** * modulemd_module_stream_v2_add_component: * @self: (in): This #ModulemdModuleStreamV2 object. * @component: (in) (transfer none): A #ModulemdComponent to be added to this * module stream. * * Add a component definition to the module. * * Since: 2.0 */ void modulemd_module_stream_v2_add_component (ModulemdModuleStreamV2 *self, ModulemdComponent *component); /** * modulemd_module_stream_v2_remove_module_component: * @self: (in): This #ModulemdModuleStreamV2 object. * @component_name: (in): The name of the component to remove from the module * stream. * * Remove a component from this module stream. * * Since: 2.0 */ void modulemd_module_stream_v2_remove_module_component ( ModulemdModuleStreamV2 *self, const gchar *component_name); /** * modulemd_module_stream_v2_clear_module_components: * @self: (in): This #ModulemdModuleStreamV2 object. * * Remove all module components from this module stream. */ void modulemd_module_stream_v2_clear_module_components ( ModulemdModuleStreamV2 *self); /** * modulemd_module_stream_v2_remove_rpm_component: * @self: (in): This #ModulemdModuleStreamV2 object. * @component_name: (in): The name of the component to remove from the module * stream. * * Remove a component from this module stream. * * Since: 2.0 */ void modulemd_module_stream_v2_remove_rpm_component (ModulemdModuleStreamV2 *self, const gchar *component_name); /** * modulemd_module_stream_v2_clear_rpm_components: * @self: (in): This #ModulemdModuleStreamV2 object. * * Remove all RPM components from this module stream. */ void modulemd_module_stream_v2_clear_rpm_components (ModulemdModuleStreamV2 *self); /** * modulemd_module_stream_v2_get_module_component_names_as_strv: (rename-to modulemd_module_stream_v2_get_module_component_names) * @self: (in): This #ModulemdModuleStreamV2 object. * * Returns: (transfer full): An ordered #GStrv list of module component names * included in this stream. * * Since: 2.0 */ GStrv modulemd_module_stream_v2_get_module_component_names_as_strv ( ModulemdModuleStreamV2 *self); /** * modulemd_module_stream_v2_get_rpm_component_names_as_strv: (rename-to modulemd_module_stream_v2_get_rpm_component_names) * @self: (in): This #ModulemdModuleStreamV2 object. * * Returns: (transfer full): An ordered #GStrv list of RPM component names * included in this stream. * * Since: 2.0 */ GStrv modulemd_module_stream_v2_get_rpm_component_names_as_strv ( ModulemdModuleStreamV2 *self); /** * modulemd_module_stream_v2_get_module_component: * @self: (in): This #ModulemdModuleStreamV2 object. * @component_name: (in): The name of the component to retrieve. * * Returns: (transfer none): The module component matching @component_name if * it exists, else NULL. * * Since: 2.0 */ ModulemdComponentModule * modulemd_module_stream_v2_get_module_component (ModulemdModuleStreamV2 *self, const gchar *component_name); /** * modulemd_module_stream_v2_get_rpm_component: * @self: (in): This #ModulemdModuleStreamV2 object. * @component_name: (in): The name of the component to retrieve. * * Returns: (transfer none): The RPM component matching @component_name if it * exists, else NULL. * * Since: 2.0 */ ModulemdComponentRpm * modulemd_module_stream_v2_get_rpm_component (ModulemdModuleStreamV2 *self, const gchar *component_name); /** * modulemd_module_stream_v2_add_content_license: * @self: (in): This #ModulemdModuleStreamV2 object. * @license: (in): A license under which one or more of the components of this * module stream are distributed. * * Since: 2.0 */ void modulemd_module_stream_v2_add_content_license (ModulemdModuleStreamV2 *self, const gchar *license); /** * modulemd_module_stream_v2_add_module_license: * @self: (in): This #ModulemdModuleStreamV2 object. * @license: (in): A license under which this module stream is distributed. * * Since: 2.0 */ void modulemd_module_stream_v2_add_module_license (ModulemdModuleStreamV2 *self, const gchar *license); /** * modulemd_module_stream_v2_remove_content_license: * @self: (in): This #ModulemdModuleStreamV2 object. * @license: (in): A license to remove from the list. Has no effect if the * license is not present. * * Since: 2.0 */ void modulemd_module_stream_v2_remove_content_license (ModulemdModuleStreamV2 *self, const gchar *license); /** * modulemd_module_stream_v2_remove_module_license: * @self: (in): This #ModulemdModuleStreamV2 object. * @license: (in): A license to remove from the list. Has no effect if the * license is not present. * * Since: 2.0 */ void modulemd_module_stream_v2_remove_module_license (ModulemdModuleStreamV2 *self, const gchar *license); /** * modulemd_module_stream_v2_clear_content_licenses: * @self: (in): This #ModulemdModuleStreamV2 object. * * Remove all content licenses. * * Since: 2.5 */ void modulemd_module_stream_v2_clear_content_licenses ( ModulemdModuleStreamV2 *self); /** * modulemd_module_stream_v2_clear_module_licenses: * @self: (in): This #ModulemdModuleStreamV2 object. * * Remove all module licenses. * * Since: 2.5 */ void modulemd_module_stream_v2_clear_module_licenses (ModulemdModuleStreamV2 *self); /** * modulemd_module_stream_v2_get_content_licenses_as_strv: (rename-to modulemd_module_stream_v2_get_content_licenses) * @self: (in): This #ModulemdModuleStreamV2 object. * * Returns: (transfer full): An ordered #GStrv list of licenses under which one * or more components of this module stream are released. * * Since: 2.0 */ GStrv modulemd_module_stream_v2_get_content_licenses_as_strv ( ModulemdModuleStreamV2 *self); /** * modulemd_module_stream_v2_get_module_licenses_as_strv: (rename-to modulemd_module_stream_v2_get_module_licenses) * @self: (in): This #ModulemdModuleStreamV2 object. * * Returns: (transfer full): An ordered #GStrv list of licenses under which * this module stream is released. * * Since: 2.0 */ GStrv modulemd_module_stream_v2_get_module_licenses_as_strv ( ModulemdModuleStreamV2 *self); /** * modulemd_module_stream_v2_add_profile: * @self: (in): This #ModulemdModuleStreamV2 object. * @profile: (in) (transfer none): A #ModulemdProfile for this module stream. * * Adds a profile definition to this module stream. * * Since: 2.0 */ void modulemd_module_stream_v2_add_profile (ModulemdModuleStreamV2 *self, ModulemdProfile *profile); /** * modulemd_module_stream_v2_clear_profiles: * @self: (in): This #ModulemdModuleStreamV1 object. * * Remove all profiles from this module stream. * * Since: 2.0 */ void modulemd_module_stream_v2_clear_profiles (ModulemdModuleStreamV2 *self); /** * modulemd_module_stream_v2_get_profile_names_as_strv: (rename-to modulemd_module_stream_v2_get_profile_names) * @self: (in): This #ModulemdModuleStreamV2 object. * * Returns: (transfer full): An ordered #GStrv list of profile names associated * with this module stream. * * Since: 2.0 */ GStrv modulemd_module_stream_v2_get_profile_names_as_strv ( ModulemdModuleStreamV2 *self); /** * modulemd_module_stream_v2_get_profile: * @self: (in): This #ModulemdModuleStreamV2 object. * @profile_name: (in): The name of a profile to retrieve. * * Returns: (transfer none): The requested profile definition if present in the * module stream. NULL otherwise. * * Since: 2.0 */ ModulemdProfile * modulemd_module_stream_v2_get_profile (ModulemdModuleStreamV2 *self, const gchar *profile_name); /** * modulemd_module_stream_v2_search_profiles: * @self: This #ModulemdModuleStreamV2 object. * @profile_pattern: (nullable): A globbing pattern to locate one or more * profiles in this #ModulemdModuleStreamV2 object. The names will be compared * using [fnmatch(3)](https://www.mankier.com/3/fnmatch). * * Returns: (transfer container) (element-type ModulemdProfile): The list of * #ModulemdProfile objects whose name matched @profile_pattern. This function * cannot fail, but it may return a zero-length list if no matches were found. * The returned profiles will be sorted alphabetically by profile name. */ GPtrArray * modulemd_module_stream_v2_search_profiles (ModulemdModuleStreamV2 *self, const gchar *profile_pattern); /** * modulemd_module_stream_v2_add_rpm_api: * @self: (in): This #ModulemdModuleStreamV2 object. * @rpm: (in): The name of a binary RPM present in this module that is * considered stable public API. * * Since: 2.0 */ void modulemd_module_stream_v2_add_rpm_api (ModulemdModuleStreamV2 *self, const gchar *rpm); /** * modulemd_module_stream_v2_remove_rpm_api: * @self: (in): This #ModulemdModuleStreamV2 object. * @rpm: (in): A binary RPM name to remove from the list of stable public API. * * Since: 2.0 */ void modulemd_module_stream_v2_remove_rpm_api (ModulemdModuleStreamV2 *self, const gchar *rpm); /** * modulemd_module_stream_v2_clear_rpm_api: * @self: (in): This #ModulemdModuleStreamV2 object. * * Remove all RPMs from the list of stable public API. * * Since: 2.5 */ void modulemd_module_stream_v2_clear_rpm_api (ModulemdModuleStreamV2 *self); /** * modulemd_module_stream_v2_get_rpm_api_as_strv: (rename-to modulemd_module_stream_v2_get_rpm_api) * @self: (in): This #ModulemdModuleStreamV2 object. * * Returns: (transfer full): An ordered #GStrv list of binary RPM names that * form the public API of this module stream. * * Since: 2.0 */ GStrv modulemd_module_stream_v2_get_rpm_api_as_strv (ModulemdModuleStreamV2 *self); /** * modulemd_module_stream_v2_add_rpm_artifact: * @self: (in): This #ModulemdModuleStreamV2 object. * @nevr: (in): The NEVR of a binary RPM present in this module stream. * * Since: 2.0 */ void modulemd_module_stream_v2_add_rpm_artifact (ModulemdModuleStreamV2 *self, const gchar *nevr); /** * modulemd_module_stream_v2_remove_rpm_artifact: * @self: (in): This #ModulemdModuleStreamV2 object. * @nevr: (in): An RPM NEVR to remove from the list of artifacts. * * Since: 2.0 */ void modulemd_module_stream_v2_remove_rpm_artifact (ModulemdModuleStreamV2 *self, const gchar *nevr); /** * modulemd_module_stream_v2_clear_rpm_artifacts: * @self: (in): This #ModulemdModuleStreamV2 object. * * Remove all NPM NEVRs from the list of artifacts. * * Since: 2.5 */ void modulemd_module_stream_v2_clear_rpm_artifacts (ModulemdModuleStreamV2 *self); /** * modulemd_module_stream_v2_get_rpm_artifacts_as_strv: (rename-to modulemd_module_stream_v2_get_rpm_artifacts) * @self: (in): This #ModulemdModuleStreamV2 object. * * Returns: (transfer full): An ordered #GStrv list of RPM NEVRs that are * included in this module stream. * * Since: 2.0 */ GStrv modulemd_module_stream_v2_get_rpm_artifacts_as_strv ( ModulemdModuleStreamV2 *self); /** * modulemd_module_stream_v2_set_rpm_artifact_map_entry: * @self: (in): This #ModulemdModuleStreamV2 object. * @entry: (in): The RPM map entry to save to the stream. * @digest: (in): A string representing the digest algorithm used to generate * the @checksum. * @checksum: (in): An RPM artifact checksum. * * Since: 2.2 */ void modulemd_module_stream_v2_set_rpm_artifact_map_entry ( ModulemdModuleStreamV2 *self, ModulemdRpmMapEntry *entry, const gchar *digest, const gchar *checksum); /** * modulemd_module_stream_v2_get_rpm_artifact_map_entry: * @self: (in): This #ModulemdModuleStreamV2 object. * @digest: (in): A string representing the digest algorithm used to generate * the @checksum. * @checksum: (in): An RPM artifact checksum. * * Returns: (transfer none): The #ModulemdRpmMapEntry object associated with * the provided @checksum generated by the provided @digest. * * Since: 2.2 */ ModulemdRpmMapEntry * modulemd_module_stream_v2_get_rpm_artifact_map_entry ( ModulemdModuleStreamV2 *self, const gchar *digest, const gchar *checksum); /** * modulemd_module_stream_v2_add_rpm_filter: * @self: (in): This #ModulemdModuleStreamV2 object. * @rpm: (in): The name of a binary RPM to filter out of this module stream. * * Since: 2.0 */ void modulemd_module_stream_v2_add_rpm_filter (ModulemdModuleStreamV2 *self, const gchar *rpm); /** * modulemd_module_stream_v2_remove_rpm_filter: * @self: (in): This #ModulemdModuleStreamV2 object. * @rpm: (in): A binary RPM name to remove from the filter list. * * Since: 2.0 */ void modulemd_module_stream_v2_remove_rpm_filter (ModulemdModuleStreamV2 *self, const gchar *rpm); /** * modulemd_module_stream_v2_clear_rpm_filters: * @self: (in): This #ModulemdModuleStreamV2 object. * * Remove all RPMs from the filter list. * * Since: 2.5 */ void modulemd_module_stream_v2_clear_rpm_filters (ModulemdModuleStreamV2 *self); /** * modulemd_module_stream_v2_get_rpm_filters_as_strv: (rename-to modulemd_module_stream_v2_get_rpm_filters) * @self: (in): This #ModulemdModuleStreamV2 object. * * Returns: (transfer full): An ordered #GStrv list of binary RPM names that * are filtered out of this module stream. * * Since: 2.0 */ GStrv modulemd_module_stream_v2_get_rpm_filters_as_strv ( ModulemdModuleStreamV2 *self); /** * modulemd_module_stream_v2_add_demodularized_rpm: * @self: (in): This #ModulemdModuleStreamV2 object. * @rpm: (in): A name of a binary RPM package to become non-modular. * * Add a binary package name to a list of demodularized packages. * * Since: 2.13 */ void modulemd_module_stream_v2_add_demodularized_rpm (ModulemdModuleStreamV2 *self, const gchar *rpm); /** * modulemd_module_stream_v2_remove_demodularized_rpm: * @self: (in): This #ModulemdModuleStreamV2 object. * @rpm: (in): A binary RPM name to remove from a demodularized list. * * Remove a binary package name from a list of demodularized packages. * * Since: 2.13 */ void modulemd_module_stream_v2_remove_demodularized_rpm ( ModulemdModuleStreamV2 *self, const gchar *rpm); /** * modulemd_module_stream_v2_clear_demodularized_rpms: * @self: (in): This #ModulemdModuleStreamV2 object. * * Remove all RPM packages from a demodularized list of the object. * * Since: 2.13 */ void modulemd_module_stream_v2_clear_demodularized_rpms ( ModulemdModuleStreamV2 *self); /** * modulemd_module_stream_v2_get_demodularized_rpms: * @self: (in): This #ModulemdModuleStreamV2 object. * * Returns: (transfer full): An ordered #GStrv list of binary RPM package names * that became non-modular. * * Since: 2.13 */ GStrv modulemd_module_stream_v2_get_demodularized_rpms ( ModulemdModuleStreamV2 *self); /** * modulemd_module_stream_v2_add_servicelevel: * @self: (in): This #ModulemdModuleStreamV2 object. * @servicelevel: (in) (transfer none): A #ModulemdServiceLevel for this module stream. * * Adds a servicelevel definition to this module stream. * * Since: 2.0 */ void modulemd_module_stream_v2_add_servicelevel ( ModulemdModuleStreamV2 *self, ModulemdServiceLevel *servicelevel); /** * modulemd_module_stream_v2_clear_servicelevels: * @self: (in): This #ModulemdModuleStreamV2 object. * * Remove all servicelevels from this module stream. * * Since: 2.0 */ void modulemd_module_stream_v2_clear_servicelevels (ModulemdModuleStreamV2 *self); /** * modulemd_module_stream_v2_get_servicelevel_names_as_strv: (rename-to modulemd_module_stream_v2_get_servicelevel_names) * @self: (in): This #ModulemdModuleStreamV2 object. * * Returns: (transfer full): An ordered #GStrv list of servicelevel names * associated with this module stream. * * Since: 2.0 */ GStrv modulemd_module_stream_v2_get_servicelevel_names_as_strv ( ModulemdModuleStreamV2 *self); /** * modulemd_module_stream_v2_get_servicelevel: * @self: (in): This #ModulemdModuleStreamV2 object. * @servicelevel_name: (in): The name of a servicelevel to retrieve. * * Returns: (transfer none): The requested servicelevel definition if present in the * module stream. NULL otherwise. * * Since: 2.0 */ ModulemdServiceLevel * modulemd_module_stream_v2_get_servicelevel (ModulemdModuleStreamV2 *self, const gchar *servicelevel_name); /** * modulemd_module_stream_v2_add_dependencies: * @self: (in): This #ModulemdModuleStreamV2 object. * @deps: (in): A #ModulemdDependencies object to add to the list for this * module stream. * * Add a #ModulemdDependencies object to the list of dependencies for this * module stream. * * Since: 2.0 */ void modulemd_module_stream_v2_add_dependencies (ModulemdModuleStreamV2 *self, ModulemdDependencies *deps); /** * modulemd_module_stream_v2_clear_dependencies: * @self: (in): This #ModulemdModuleStreamV2 object. * * Empties the list of dependencies for this #ModulemdModuleStream. * * Since: 2.4 */ void modulemd_module_stream_v2_clear_dependencies (ModulemdModuleStreamV2 *self); /** * modulemd_module_stream_v2_remove_dependencies: * @self: (in): This #ModulemdModuleStreamV2 object. * @deps: (in): A #ModulemdDependencies object to remove from the list for this * module stream. * * Removes all entries matching @deps from the array of #ModulemdDependencies * objects. * * Since: 2.4 */ void modulemd_module_stream_v2_remove_dependencies (ModulemdModuleStreamV2 *self, ModulemdDependencies *deps); /** * modulemd_module_stream_v2_get_dependencies: * @self: (in): This #ModulemdModuleStreamV2 object. * * Return the list of #ModulemdDependencies objects as a #GPtrArray. * * Returns: (transfer none) (element-type ModulemdDependencies): A list of * all #ModulemdDependencies objects associated with this module stream. */ GPtrArray * modulemd_module_stream_v2_get_dependencies (ModulemdModuleStreamV2 *self); /** * modulemd_module_stream_v2_set_xmd: * @self: (in): This #ModulemdModuleStreamV2 object. * @xmd: (in) (transfer none): A #GVariant representing arbitrary YAML. * * Sets the eXtensible MetaData (XMD) for this module. XMD is arbitrary YAML * data that will be set and returned as-is (with the exception that the * ordering of mapping keys is not defined). Useful for carrying private data. * * This function assumes ownership of the XMD #GVariant and thus should not be * freed by the caller. * * Since: 2.0 */ void modulemd_module_stream_v2_set_xmd (ModulemdModuleStreamV2 *self, GVariant *xmd); /** * modulemd_module_stream_v2_get_xmd: * @self: (in): This #ModulemdModuleStreamV2 object. * * Returns: (transfer none): The extensible metadata block as a #GVariant. */ GVariant * modulemd_module_stream_v2_get_xmd (ModulemdModuleStreamV2 *self); /** * modulemd_module_stream_v2_clear_xmd: * @self: (in): This #ModulemdModuleStreamV2 object. * * Removes all XMD data from this #ModulemdModuleStreamV2 * * Since: 2.14 */ void modulemd_module_stream_v2_clear_xmd (ModulemdModuleStreamV2 *self); /** * modulemd_module_stream_v2_set_static_context: * @self: (in): This #ModulemdModuleStreamV2 object. * * Marks this #ModulemdModuleStreamV2 to indicate to dependency solvers that * they must treat the `context` attribute as informative. * * Since: 2.11 */ void modulemd_module_stream_v2_set_static_context (ModulemdModuleStreamV2 *self); /** * modulemd_module_stream_v2_unset_static_context: * @self: (in): This #ModulemdModuleStreamV2 object. * * Marks this #ModulemdModuleStreamV2 to indicate to dependency solvers that * they must ignore the `context` attribute as a uniqueness element. * * Since: 2.11 */ void modulemd_module_stream_v2_unset_static_context (ModulemdModuleStreamV2 *self); /** * modulemd_module_stream_v2_is_static_context: * @self: (in): This #ModulemdModuleStreamV2 object. * * Returns: Whether the `context` attribute should be treated as static. * * Since: 2.11 */ gboolean modulemd_module_stream_v2_is_static_context (ModulemdModuleStreamV2 *self); G_END_DECLS fedora-modularity-libmodulemd-357799c/modulemd/include/modulemd-2.0/modulemd-module-stream.h000066400000000000000000000431501502446517500320330ustar00rootroot00000000000000/* * This file is part of libmodulemd * Copyright (C) 2018-2020 Red Hat, Inc. * * Fedora-License-Identifier: MIT * SPDX-2.0-License-Identifier: MIT * SPDX-3.0-License-Identifier: MIT * * This program is free software. * For more information on the license, see COPYING. * For more information on free software, see . */ #pragma once #include #include #include #include "modulemd-deprecated.h" G_BEGIN_DECLS /** * SECTION: modulemd-module-stream * @title: Modulemd.ModuleStream * @stability: stable * @short_description: A parent class for all versions of #ModulemdModuleStream * objects. */ /** * MMD_MAXCONTEXTLEN: * * The ModuleStream v3 specification defines the maximum lenth of the context * field. * * Since: 2.10 */ #define MMD_MAXCONTEXTLEN 10 /* Forward declarations */ typedef struct _ModulemdModule ModulemdModule; /** * ModulemdModuleStreamVersionEnum: * @MD_MODULESTREAM_VERSION_ERROR: Represents an error handling module stream * version. * @MD_MODULESTREAM_VERSION_UNSET: Represents an unset module stream version. * @MD_MODULESTREAM_VERSION_ONE: Represents v1 of the #ModulemdModuleStream * metadata format. * @MD_MODULESTREAM_VERSION_TWO: Represents v2 of the #ModulemdModuleStream * metadata format. * @MD_MODULESTREAM_VERSION_LATEST: Represents the highest-supported version of * the #ModulemdModuleStream metadata format. * * Since: 2.0 */ typedef enum { MD_MODULESTREAM_VERSION_ERROR = -1, MD_MODULESTREAM_VERSION_UNSET = 0, MD_MODULESTREAM_VERSION_ONE = 1, MD_MODULESTREAM_VERSION_TWO = 2, MD_MODULESTREAM_VERSION_LATEST = MD_MODULESTREAM_VERSION_TWO } ModulemdModuleStreamVersionEnum; #define MODULEMD_TYPE_MODULE_STREAM (modulemd_module_stream_get_type ()) G_DECLARE_DERIVABLE_TYPE (ModulemdModuleStream, modulemd_module_stream, MODULEMD, MODULE_STREAM, GObject) struct _ModulemdModuleStreamClass { GObjectClass parent_class; ModulemdModuleStream *(*copy) (ModulemdModuleStream *self, const gchar *module_name, const gchar *module_stream); gboolean (*validate) (ModulemdModuleStream *self, GError **error); guint64 (*get_mdversion) (ModulemdModuleStream *self); gboolean (*depends_on_stream) (ModulemdModuleStream *self, const gchar *module_name, const gchar *stream_name); gboolean (*build_depends_on_stream) (ModulemdModuleStream *self, const gchar *module_name, const gchar *stream_name); gboolean (*equals) (ModulemdModuleStream *self_1, ModulemdModuleStream *self_2); /* Padding to allow adding up to 7 new virtual functions without * breaking ABI. */ gpointer padding[7]; }; /** * modulemd_module_stream_new: * @mdversion: (in): The metadata version of #ModulemdModuleStream to create. * @module_name: (in) (nullable): The name of the module. * @module_stream: (in) (nullable): The name of this stream. Optional. * * Returns: (transfer full): A newly-allocated #ModulemdModuleStream object of * the requested metadata version. * * Since: 2.0 */ ModulemdModuleStream * modulemd_module_stream_new (guint64 mdversion, const gchar *module_name, const gchar *module_stream); /** * modulemd_module_stream_read_file: * @path: (in): The path to a YAML document containing a module stream * definition. * @strict: (in): Whether the parser should return failure if it encounters an * unknown mapping key or if it should ignore it. * @module_name: (in) (nullable): An optional module name to override the * document on disk. Mostly useful in cases where the name is being * auto-detected from git. * @module_stream: (in) (nullable): An optional module stream name to override * the document on disk. Mostly useful in cases where the name is being * auto-detected from git. * @error: (out): A #GError that will return the reason for a failed read. * * Create a #ModulemdModuleStream object from a YAML file. * * Note: This function also reads modulemd-packager v2 and v3 documents, which * are transparently returned as #ModulemdModuleStream (V2) objects. However, * if a modulemd-packager v3 document (#ModulemdPackagerV3) is encountered and * it uses buildopts (#ModulemdBuildopts) in one or more build configurations, * only the buildopts present in the first listed configuration (if any) will be * applied to the returned #ModulemdModuleStreamV2 object. * * Returns: (transfer full): A newly-allocated #ModulemdModuleStream object if * the YAML file was valid and contained exactly one `document: modulemd` * subdocument. NULL if the document fails validation or multiple documents are * encountered and sets @error appropriately. See #ModulemdModuleIndex for * functions to read in multiple-subdocument YAML. * * Since: 2.0 * Deprecated: 2.11: Use modulemd_read_packager_file() instead. */ MMD_DEPRECATED_FOR (modulemd_read_packager_file) ModulemdModuleStream * modulemd_module_stream_read_file (const gchar *path, gboolean strict, const gchar *module_name, const gchar *module_stream, GError **error); /** * modulemd_module_stream_read_string: * @yaml_string: (in): A YAML document string containing a module stream * definition. * @strict: (in): Whether the parser should return failure if it encounters an * unknown mapping key or if it should ignore it. * @module_name: (in) (nullable): An optional module name to override the * document on disk. Mostly useful in cases where the name is being * auto-detected from git. * @module_stream: (in) (nullable): An optional module stream name to override * the document on disk. Mostly useful in cases where the name is being * auto-detected from git. * @error: (out): A #GError that will return the reason for a failed read. * * Create a #ModulemdModuleStream object from a YAML string. * * Note: This function also reads modulemd-packager v2 and v3 documents, which * are transparently returned as #ModulemdModuleStream (V2) objects. However, * if a modulemd-packager v3 document (#ModulemdPackagerV3) is encountered and * it uses buildopts (#ModulemdBuildopts) in one or more build configurations, * only the buildopts present in the first listed configuration (if any) will be * applied to the returned #ModulemdModuleStreamV2 object. * * Returns: (transfer full): A newly-allocated #ModulemdModuleStream object if * the YAML string was valid and contained exactly one `document: modulemd` * subdocument. NULL if the document fails validation or multiple documents are * encountered and sets @error appropriately. See #ModulemdModuleIndex for * functions to read in multiple-subdocument YAML. * * Since: 2.0 * Deprecated: 2.11: Use modulemd_read_packager_string() instead. */ MMD_DEPRECATED_FOR (modulemd_read_packager_string) ModulemdModuleStream * modulemd_module_stream_read_string (const gchar *yaml_string, gboolean strict, const gchar *module_name, const gchar *module_stream, GError **error); /** * modulemd_module_stream_read_stream: (skip) * @stream: (in): A YAML document as a FILE * containing a module stream * definition. * @strict: (in): Whether the parser should return failure if it encounters an * unknown mapping key or if it should ignore it. * @module_name: (in) (nullable): An optional module name to override the * document on disk. Mostly useful in cases where the name is being * auto-detected from git. * @module_stream: (in) (nullable): An optional module stream name to override * the document on disk. Mostly useful in cases where the name is being * auto-detected from git. * @error: (out): A #GError that will return the reason for a failed read. * * Create a #ModulemdModuleStream object from a YAML file. * * Returns: (transfer full): A newly-allocated #ModulemdModuleStream object if * the YAML file was valid and contained exactly one `document: modulemd` * subdocument. NULL if the document fails validation or multiple documents are * encountered and sets NULL appropriately. See #ModulemdModuleIndex for * functions to read in multiple-subdocument YAML. * * Since: 2.0 */ ModulemdModuleStream * modulemd_module_stream_read_stream (FILE *stream, gboolean strict, const gchar *module_name, const gchar *module_stream, GError **error); /** * modulemd_module_stream_equals: * @self_1: (in): A #ModulemdModuleStream object. * @self_2: (in): A #ModulemdModuleStream object. * * Checks if @self_1 and @self_2 are identical objects. * * Returns: TRUE, If both objects are equal. FALSE, otherwise. * * Since: 2.3 */ gboolean modulemd_module_stream_equals (ModulemdModuleStream *self_1, ModulemdModuleStream *self_2); /** * modulemd_module_stream_copy: * @self: (in): This #ModulemdModuleStream object. * @module_name: (in) (nullable): An optional new name for the module of the * copied stream. * @module_stream: (in) (nullable): An optional new name for the copied stream. * * Copies a #ModulemdModuleStream, optionally assigning it a new stream name in * the process. * * Returns: (transfer full): A newly-allocated #ModulemdModuleStream object * that is a complete copy of @self, optionally with a new stream name. * * Since: 2.0 */ ModulemdModuleStream * modulemd_module_stream_copy (ModulemdModuleStream *self, const gchar *module_name, const gchar *module_stream); /** * modulemd_module_stream_upgrade: * @self: (in): This #ModulemdModuleStream object. * @mdversion: (in): The metadata version to upgrade to. If zero, upgrades to * the highest-supported version. * @error: (out): A #GError that will return the reason for an upgrade error. * * Return an upgraded copy of this object. Does not modify the original. * * Returns: (transfer full): A newly-allocated #ModulemdModuleStream copy of * this object upgraded to the requested version. Returns NULL and sets @error * appropriately if the upgrade could not be completed automatically. * * Since: 2.0 * Deprecated: 2.10: Use modulemd_module_stream_upgrade_ext() instead. */ MMD_DEPRECATED_FOR (modulemd_module_stream_upgrade_ext) ModulemdModuleStream * modulemd_module_stream_upgrade (ModulemdModuleStream *self, guint64 mdversion, GError **error); /** * modulemd_module_stream_upgrade_ext: * @self: (in): This #ModulemdModuleStream object. * @mdversion: (in): The metadata version to upgrade to. If zero, upgrades to * the highest-supported version. * @error: (out): A #GError that will return the reason for an upgrade error. * * Does not modify the original #ModulemdModuleStream object, @from. * * Returns: (transfer full): A newly-allocated #ModulemdModule containing a copy * of this object upgraded to the requested version, possibly with multiple * streams. Returns NULL and sets @error appropriately if the upgrade could not * be completed automatically. * * Since: 2.10 */ ModulemdModule * modulemd_module_stream_upgrade_ext (ModulemdModuleStream *self, guint64 mdversion, GError **error); /** * modulemd_module_stream_validate: * @self: (in): This #ModulemdModuleStream object. * @error: (out): A #GError that will return the reason for a validation error. * * Verifies that all stored values are internally consistent and that the * module is sufficiently-complete for emitting. This function is called * implicitly before attempting to emit the contents. * * Returns: TRUE if the #ModulemdModuleStream passed validation. FALSE and sets * @error appropriately if validation fails. * * Since: 2.0 */ gboolean modulemd_module_stream_validate (ModulemdModuleStream *self, GError **error); /** * modulemd_module_stream_get_mdversion: * @self: (in): This #ModulemdModuleStream object. * * Returns: The metadata version of this #ModulemdModuleStream. * * Since: 2.0 */ guint64 modulemd_module_stream_get_mdversion (ModulemdModuleStream *self); /** * modulemd_module_stream_get_module_name: * @self: (in): This #ModulemdModuleStream object. * * Returns: (transfer none): The name of the module. * * Since: 2.0 */ const gchar * modulemd_module_stream_get_module_name (ModulemdModuleStream *self); /** * modulemd_module_stream_get_stream_name: * @self: (in): This #ModulemdModuleStream object. * * Returns: (transfer none): The name of this stream. * * Since: 2.0 */ const gchar * modulemd_module_stream_get_stream_name (ModulemdModuleStream *self); /** * modulemd_module_stream_set_version: * @self: (in): This #ModulemdModuleStream object. * @version: (in): The version of this #ModulemdModuleStream. * * Since: 2.0 */ void modulemd_module_stream_set_version (ModulemdModuleStream *self, guint64 version); /** * modulemd_module_stream_get_version: * @self: (in): This #ModulemdModuleStream object. * * Returns: The version of this #ModulemdModuleStream. */ guint64 modulemd_module_stream_get_version (ModulemdModuleStream *self); /** * modulemd_module_stream_set_context: * @self: (in): This #ModulemdModuleStream object. * @context: (in) (nullable): Module context flag. * The context flag serves to distinguish module builds with the same name, * stream and version and plays an important role in automatic module stream * name expansion. * * Since: 2.0 */ void modulemd_module_stream_set_context (ModulemdModuleStream *self, const gchar *context); /** * modulemd_module_stream_get_context: * @self: (in): This #ModulemdModuleStream object. * * Returns: (transfer none): Module context flag. * The context flag serves to distinguish module builds with the same name, * stream and version and plays an important role in automatic module stream * name expansion. * * Since: 2.0 */ const gchar * modulemd_module_stream_get_context (ModulemdModuleStream *self); /** * modulemd_module_stream_set_arch: * @self: (in): This #ModulemdModuleStream object. * @arch: (in) (nullable): Module architecture. * Indicates to which processor architecture this #ModulemdModuleStream * applies. * * Since: 2.2 */ void modulemd_module_stream_set_arch (ModulemdModuleStream *self, const gchar *arch); /** * modulemd_module_stream_get_arch: * @self: (in): This #ModulemdModuleStream object. * * Returns: (transfer none): Module architecture object. * Indicates to which processor architecture this #ModulemdModuleStream * applies. * * Since: 2.2 */ const gchar * modulemd_module_stream_get_arch (ModulemdModuleStream *self); /** * modulemd_module_stream_get_nsvc_as_string: (rename-to modulemd_module_stream_get_nsvc) * @self: (in): This #ModulemdModuleStream object. * * Retrieves a representation of the module name, stream name, version and * context of this #ModulemdModuleStream in the form * `module_name:stream_name:version:context`. Note that this excludes the * architecture of the module stream and as such is not guaranteed to be unique * within a repository. * * Returns: (transfer full): The NSVC (name:stream:version[:context]) of this * module stream. NULL if module name or stream stream is unknown. * * Since: 2.0 */ gchar * modulemd_module_stream_get_nsvc_as_string (ModulemdModuleStream *self); /** * modulemd_module_stream_get_NSVCA_as_string: (rename-to modulemd_module_stream_get_NSVCA) * @self: (in): This #ModulemdModuleStream object. * * Returns: (transfer full): The NSVCA of this module stream. The returned * format is described * [here](https://docs.fedoraproject.org/en-US/modularity/architecture/consuming/naming-policy/#_forms). * NULL if module name or stream stream is unknown. * * Since: 2.2 */ gchar * modulemd_module_stream_get_NSVCA_as_string (ModulemdModuleStream *self); /** * modulemd_module_stream_depends_on_stream: * @self: (not nullable): This #ModulemdModuleStream object. * @module_name: (not nullable): A module name. * @stream_name: (not nullable): The stream of the module. * * Returns: TRUE if any of the #ModulemdDependencies objects associated with * this module applies to the provided module name and stream in the runtime * dependencies. * * Since: 2.1 * * Stability: unstable */ gboolean modulemd_module_stream_depends_on_stream (ModulemdModuleStream *self, const gchar *module_name, const gchar *stream_name); /** * modulemd_module_stream_build_depends_on_stream: * @self: (not nullable): This #ModulemdModuleStream object. * @module_name: (not nullable): A module name. * @stream_name: (not nullable): The stream of the module. * * Returns: TRUE if any of the #ModulemdDependencies objects associated with * this module applies to the provided module name and stream in the build-time * dependencies. * * Since: 2.1 * * Stability: unstable */ gboolean modulemd_module_stream_build_depends_on_stream (ModulemdModuleStream *self, const gchar *module_name, const gchar *stream_name); G_END_DECLS fedora-modularity-libmodulemd-357799c/modulemd/include/modulemd-2.0/modulemd-module.h000066400000000000000000000276001502446517500305440ustar00rootroot00000000000000/* * This file is part of libmodulemd * Copyright (C) 2018 Red Hat, Inc. * * Fedora-License-Identifier: MIT * SPDX-2.0-License-Identifier: MIT * SPDX-3.0-License-Identifier: MIT * * This program is free software. * For more information on the license, see COPYING. * For more information on free software, see . */ #pragma once #include "modulemd-defaults.h" #include "modulemd-deprecated.h" #include "modulemd-module-stream.h" #include "modulemd-translation.h" #include "modulemd-obsoletes.h" #include G_BEGIN_DECLS /** * SECTION: modulemd-module * @title: Modulemd.Module * @stability: stable * @short_description: Collects all information about a module: all of its streams, defaults, etc. */ #define MODULEMD_TYPE_MODULE (modulemd_module_get_type ()) G_DECLARE_FINAL_TYPE ( ModulemdModule, modulemd_module, MODULEMD, MODULE, GObject) /** * modulemd_module_get_stream_names_as_strv: (rename-to modulemd_module_get_stream_names) * @self: This #ModulemdModule object. * * Returns: (transfer full): An ordered #GStrv list of stream names in this * module. * * Since: 2.6 */ GStrv modulemd_module_get_stream_names_as_strv (ModulemdModule *self); /** * modulemd_module_copy: * @self: (in): This #ModulemdModule object. * * Returns: (transfer full): A deep copy of this #ModulemdModule object. * * Since: 2.0 */ ModulemdModule * modulemd_module_copy (ModulemdModule *self); /** * modulemd_module_validate: * @self: (in): This #ModulemdModule object. * @error: (out): A #GError containing the reason the object failed validation. * NULL if the validation passed. * * Returns: TRUE if validation passed, FALSE and sets @error if failed. * * Since: 2.0 */ gboolean modulemd_module_validate (ModulemdModule *self, GError **error); /** * modulemd_module_get_module_name: * @self: This #ModulemdModule object. * * Returns: (transfer none): The module name. * * Since: 2.0 */ const gchar * modulemd_module_get_module_name (ModulemdModule *self); /** * modulemd_module_get_all_streams: * @self: This #ModulemdModule object. * * Returns: (transfer none) (element-type ModulemdModuleStream): A list of all available stream objects associated with * this module. There may be multiple streams with the same name and different version and * context. The order of items in this list is not guaranteed. * * Since: 2.0 */ GPtrArray * modulemd_module_get_all_streams (ModulemdModule *self); /** * modulemd_module_get_streams_by_stream_name_as_list: (rename-to modulemd_module_get_streams_by_stream_name) * @self: This #ModulemdModule object. * @stream_name: The name of the stream to retrieve. * * Returns: (transfer container) (element-type ModulemdModuleStream): A list of all available stream objects associated with a * particular stream name, sorted highest to lowest by the version. The same version may have * more than one associated context. * * Since: 2.0 */ GPtrArray * modulemd_module_get_streams_by_stream_name_as_list (ModulemdModule *self, const gchar *stream_name); /** * modulemd_module_get_stream_by_NSVC: * @self: This #ModulemdModule object. * @stream_name: The name of the stream to retrieve. * @version: The version of the stream to retrieve. * @context: The context of the stream to retrieve. * * Returns: (transfer none): The requested stream object or NULL if no match was found. * * Since: 2.0 * Deprecated: 2.2: Use modulemd_module_get_stream_by_NSVCA() instead. */ MMD_DEPRECATED_FOR (modulemd_module_get_stream_by_NSVCA) ModulemdModuleStream * modulemd_module_get_stream_by_NSVC (ModulemdModule *self, const gchar *stream_name, guint64 version, const gchar *context); /** * modulemd_module_search_streams: * @self: This #ModulemdModule object. * @stream_name: The name of the stream to retrieve. * @version: The version of the stream to retrieve. If set to zero, * the version is not included in the search. * @context: (nullable): The context of the stream to retrieve. If NULL, the * context is not included in the search. * @arch: (nullable): The processor architecture of the stream to retrieve. If * NULL, the architecture is not included in the search. * * Returns: (transfer container) (element-type ModulemdModuleStream): The list * of stream objects matching the requested parameters. This function cannot * fail, but it may return a zero-length list if no matches were found. The * returned streams will be in a predictable order, sorted first by stream * name, then by version (highest to lowest), then by context and finally by * architecture. * * Since: 2.5 */ GPtrArray * modulemd_module_search_streams (ModulemdModule *self, const gchar *stream_name, guint64 version, const gchar *context, const gchar *arch); /** * modulemd_module_search_streams_by_glob: * @self: This #ModulemdModule object. * @stream_name: (nullable): The name of the stream to retrieve. If NULL, will * search all streams. * @version: (nullable): The version of the stream to retrieve. If NULL, will * search all versions. * @context: (nullable): The context of the stream to retrieve. If NULL, will * search all contexts. * @arch: (nullable): The processor architecture of the stream to retrieve. If * NULL, the architecture is not included in the search. * * All arguments to this method will be compared using * [fnmatch(3)](https://www.mankier.com/3/fnmatch). * * Returns: (transfer container) (element-type ModulemdModuleStream): The list * of stream objects matching all of the requested parameters. This function * cannot fail, but it may return a zero-length list if no matches were found. * The returned streams will be in a predictable order, sorted first by module * name, then stream name, then by version (highest first), then by context * and finally by architecture. * * Since: 2.9 */ GPtrArray * modulemd_module_search_streams_by_glob (ModulemdModule *self, const gchar *stream_name, const gchar *version, const gchar *context, const gchar *arch); /** * modulemd_module_search_streams_by_nsvca_glob: * @self: This #ModulemdModule object. * @nsvca_pattern: (nullable): A [glob](https://www.mankier.com/3/glob) * pattern to match against the NSVCA strings of the #ModulemdModuleStream * objects in this module. If NULL, this will match all NSVCAs. * * Returns: (transfer container) (element-type ModulemdModuleStream): An array * of #ModulemdModuleStream objects whose NSVCA string matches the provided * pattern. This function cannot fail, but may return an array of zero entries * if the pattern did not match any streams. The returned streams will be in a * predictable order, sorted first by module name, then stream name, then by * version (highest first), then by context and finally by architecture. * * Since: 2.9 */ GPtrArray * modulemd_module_search_streams_by_nsvca_glob (ModulemdModule *self, const gchar *nsvca_pattern); /** * modulemd_module_get_stream_by_NSVCA: * @self: This #ModulemdModule object. * @stream_name: The name of the stream to retrieve. * @version: The version of the stream to retrieve. If set to zero, the version * is not included in the search. * @context: (nullable): The context of the stream to retrieve. If NULL, the * context is not included in the search. * @arch: (nullable): The processor architecture of the stream to retrieve. If * NULL, the architecture is not included in the search. * @error: (out): A #GError indicating the reason this function failed to * retrieve exactly one #ModulemdModuleStream. * * Returns: (transfer none): The requested stream object. NULL and sets @error * appropriately if the provided information is not sufficient to return * exactly one #ModulemdModuleStream result. * * Since: 2.2 */ ModulemdModuleStream * modulemd_module_get_stream_by_NSVCA (ModulemdModule *self, const gchar *stream_name, guint64 version, const gchar *context, const gchar *arch, GError **error); /** * modulemd_module_remove_streams_by_NSVCA: * @self: This #ModulemdModule object. * @stream_name: (not nullable): The name of the stream to remove. * @version: The version of the stream to remove. If set to zero, matches all * versions. * @context: (nullable): The context of the stream to remove. If NULL, matches * all stream contexts. * @arch: (nullable): The processor architecture of the stream to remove. If * NULL, matches all architectures. * * Remove one or more #ModulemdModuleStream objects from this #ModulemdModule * that match the provided parameters. * * Since: 2.3 */ void modulemd_module_remove_streams_by_NSVCA (ModulemdModule *self, const gchar *stream_name, guint64 version, const gchar *context, const gchar *arch); /** * modulemd_module_remove_streams_by_name: * @self: This #ModulemdModule object. * @stream_name: (not nullable): The name of the stream to remove. * * Remove one or more #ModulemdModuleStream objects from this #ModulemdModule * that match the provided stream name. * * Since: 2.3 */ #define modulemd_module_remove_streams_by_name(self, stream_name) \ modulemd_module_remove_streams_by_NSVCA (self, stream_name, 0, NULL, NULL) /** * modulemd_module_get_defaults: * @self: This #ModulemdModule object. * * Returns: (transfer none): The defaults of this module or NULL if none. * * Since: 2.0 */ ModulemdDefaults * modulemd_module_get_defaults (ModulemdModule *self); /** * modulemd_module_get_translation: * @self: This #ModulemdModule object. * @stream: The stream to look up translations for. * * Returns: (transfer none): The set of translations attached to streams. * * Since: 2.8 */ ModulemdTranslation * modulemd_module_get_translation (ModulemdModule *self, const gchar *stream); /** * modulemd_module_get_obsoletes: * @self: (in): This #ModulemdModule object. * * Returns: (transfer none) (element-type ModulemdObsoletes): A list of all obsoletes attached * to this module. These are pointers to the internal memory objects and must not be modified or freed. * * Since: 2.10 */ GPtrArray * modulemd_module_get_obsoletes (ModulemdModule *self); /** * modulemd_module_get_newest_active_obsoletes: * @self: (in): This #ModulemdModule object. * @stream: (in): The stream to look up obsoletes for. * @context: (in) (nullable): The stream context to look up obsoletes for. * * Returns: (transfer none): The newest active obsoletes attached to this module with * specified stream and context (when eol_date is not set or it already occured * the obsoletes is active). If no context is passed it matches obsoletes without context. * * Since: 2.10 */ ModulemdObsoletes * modulemd_module_get_newest_active_obsoletes (ModulemdModule *self, const gchar *stream, const gchar *context); /** * modulemd_module_clear_xmds: * @self: (in): This #ModulemdModule object. * * Iterates through all #ModulemdModuleStream entries in this * #ModulemdModule and removes any XMD sections that are present. This is * generally done to trim down the metadata to only the portions that are * useful to the package manager. * * Since: 2.14 */ void modulemd_module_clear_xmds (ModulemdModule *self); G_END_DECLS fedora-modularity-libmodulemd-357799c/modulemd/include/modulemd-2.0/modulemd-obsoletes.h000066400000000000000000000162531502446517500312600ustar00rootroot00000000000000/* * This file is part of libmodulemd * Copyright (C) 2020 Red Hat, Inc. * * Fedora-License-Identifier: MIT * SPDX-2.0-License-Identifier: MIT * SPDX-3.0-License-Identifier: MIT * * This program is free software. * For more information on the license, see COPYING. * For more information on free software, see . */ #pragma once #include G_BEGIN_DECLS /** * SECTION: modulemd-obsoletes * @title: Modulemd.Obsoletes * @stability: stable * @short_description: Obsoletes information for a module stream. */ #define MODULEMD_TYPE_OBSOLETES (modulemd_obsoletes_get_type ()) G_DECLARE_FINAL_TYPE ( ModulemdObsoletes, modulemd_obsoletes, MODULEMD, OBSOLETES, GObject) /** * ModulemdObsoletesVersionEnum: * @MD_OBSOLETES_VERSION_ERROR: Represents an error handling mdversion. * @MD_OBSOLETES_VERSION_UNSET: Represents an unset mdversion. * @MD_OBSOLETES_VERSION_ONE: Represents v1 of the #ModulemdObsoletes metadata * format. * @MD_OBSOLETES_VERSION_LATEST: Represents the highest-supported version of the * #ModulemdObsoletes metadata format. * * Since: 2.10 */ typedef enum { MD_OBSOLETES_VERSION_ERROR = -1, MD_OBSOLETES_VERSION_UNSET = 0, MD_OBSOLETES_VERSION_ONE = 1, MD_OBSOLETES_VERSION_LATEST = MD_OBSOLETES_VERSION_ONE, } ModulemdObsoletesVersionEnum; /** * modulemd_obsoletes_new: * @mdversion: (in): The metadata version of this #ModulemdObsoletes. * @modified: (in): The last modified time represented as a 64-bit integer (such as * 201807011200). * @module_name: (in): The name of the module to which this obsoletes applies. * @module_stream: (in): The name of the module stream to which this obsoletes applies. * @message: (in): A string describing the change, reason, etc. * * Returns: (transfer full): A newly-allocated #ModulemdObsoletes object. * This object must be freed with g_object_unref(). * * Since: 2.10 */ ModulemdObsoletes * modulemd_obsoletes_new (guint64 mdversion, guint64 modified, const gchar *module_name, const gchar *module_stream, const gchar *message); /** * modulemd_obsoletes_copy: * @self: (in): This #ModulemdObsoletes object. * * Create a copy of this #ModulemdObsoletes object. * * Returns: (transfer full): The copied #ModulemdObsoletes object. * * Since: 2.10 */ ModulemdObsoletes * modulemd_obsoletes_copy (ModulemdObsoletes *self); /** * modulemd_obsoletes_validate: * @self: (in): This #ModulemdObsoletes object. * @error: (out): If the object is not valid, it will return the reason. * * This method ensures that the obsoletes is internally consistent for usage * or dumping to YAML. It will be run implicitly prior to emitting YAML. This * is not a complete linter, merely a sanity check that the values are not * impossible. * * Since: 2.10 */ gboolean modulemd_obsoletes_validate (ModulemdObsoletes *self, GError **error); /** * modulemd_obsoletes_get_module_context: * @self: (in): This #ModulemdObsoletes object. * * Returns: (transfer none): The context name to which this #ModulemdObsoletes object applies. * * Since: 2.10 */ const gchar * modulemd_obsoletes_get_module_context (ModulemdObsoletes *self); /** * modulemd_obsoletes_set_module_context: * @self: This #ModulemdObsoletes object. * @module_context: (in) (nullable): The name of the module context to which this obsoletes * applies. * * Since: 2.10 */ void modulemd_obsoletes_set_module_context (ModulemdObsoletes *self, const gchar *module_context); /** * modulemd_obsoletes_set_modified: * @self: This #ModulemdObsoletes object. * @modified: (in): The last modified time represented as a 64-bit integer (such as * 201807011200). * * Since: 2.10 */ void modulemd_obsoletes_set_modified (ModulemdObsoletes *self, guint64 modified); /** * modulemd_obsoletes_set_reset: * @self: This #ModulemdObsoletes object. * @reset: (in): Whether to reset/cancel all previously specified obsoletes. * * Sets the reset attribute on #ModulemdObsoletes object. With this boolean attribute set the * obsoletes resets (cancels out) all previously specified obsoletes. * * Since: 2.10 */ void modulemd_obsoletes_set_reset (ModulemdObsoletes *self, gboolean reset); /** * modulemd_obsoletes_get_reset: * @self: (in): This #ModulemdObsoletes object. * * Returns: Whether this #ModulemdObsoletes object cancels/resets all previously specified obsoletes. * * Since: 2.10 */ gboolean modulemd_obsoletes_get_reset (ModulemdObsoletes *self); /** * modulemd_obsoletes_set_eol_date: * @self: This #ModulemdObsoletes object. * @eol_date: (in): The end-of-life date for this stream. If set to zero, the stream is * EOLed immediately. * * Since: 2.10 */ void modulemd_obsoletes_set_eol_date (ModulemdObsoletes *self, guint64 eol_date); /** * modulemd_obsoletes_get_eol_date: * @self: (in): This #ModulemdObsoletes object. * * Returns: A date represented as a 64-bit integer (such as 201807011200). * * Since: 2.10 */ guint64 modulemd_obsoletes_get_eol_date (ModulemdObsoletes *self); /** * modulemd_obsoletes_get_message: * @self: (in): This #ModulemdObsoletes object. * * Returns: (transfer none): The message associated with this #ModulemdObsoletes object * * Since: 2.10 */ const gchar * modulemd_obsoletes_get_message (ModulemdObsoletes *self); /** * modulemd_obsoletes_set_obsoleted_by: * @self: This #ModulemdObsoletes object. * @obsoleted_by_module_name: (in): The module name of obsoleting stream. * @obsoleted_by_module_stream: (in): The module stream of obsoleting stream. * * Sets both obsoleted by module name and stream because having one without * the other is invalid. * * Since: 2.10 */ void modulemd_obsoletes_set_obsoleted_by (ModulemdObsoletes *self, const gchar *obsoleted_by_module_name, const gchar *obsoleted_by_module_stream); /** * modulemd_obsoletes_get_obsoleted_by_module_name: * @self: (in): This #ModulemdObsoletes object. * * Returns: (transfer none): The module name of obsoleting stream. * * Since: 2.10 */ const gchar * modulemd_obsoletes_get_obsoleted_by_module_name (ModulemdObsoletes *self); /** * modulemd_obsoletes_get_obsoleted_by_module_stream: * @self: (in): This #ModulemdObsoletes object. * * Returns: (transfer none): The module stream of obsoleting stream. * * Since: 2.10 */ const gchar * modulemd_obsoletes_get_obsoleted_by_module_stream (ModulemdObsoletes *self); /** * modulemd_obsoletes_get_modified: * @self: (in): This #ModulemdObsoletes object. * * Returns: The last modified time of this #ModulemdObsoletes object * represented as a 64-bit integer (such as 201807011200). * * Since: 2.10 */ guint64 modulemd_obsoletes_get_modified (ModulemdObsoletes *self); /** * modulemd_obsoletes_is_active: * @self: (in): This #ModulemdObsoletes object. * * Returns: If this #ModulemdObsoletes object has eol_date set and the * date has not occured yet it returns false otherwise it returns true. * (When eol_date is not set or it already occured the obsoletes is active.) * * Since: 2.10 */ gboolean modulemd_obsoletes_is_active (ModulemdObsoletes *self); G_END_DECLS fedora-modularity-libmodulemd-357799c/modulemd/include/modulemd-2.0/modulemd-packager-v3.h000066400000000000000000000515651502446517500313710ustar00rootroot00000000000000/* * This file is part of libmodulemd * Copyright (C) 2020 Red Hat, Inc. * * Fedora-License-Identifier: MIT * SPDX-2.0-License-Identifier: MIT * SPDX-3.0-License-Identifier: MIT * * This program is free software. * For more information on the license, see COPYING. * For more information on free software, see . */ #pragma once #include "modulemd-build-config.h" #include "modulemd-component-module.h" #include "modulemd-component-rpm.h" #include "modulemd-module-index.h" #include "modulemd-profile.h" #include "modulemd-subdocument-info.h" #include G_BEGIN_DECLS /** * SECTION: modulemd-packager-v3 * @title: Modulemd.PackagerV3 * @stability: Private * @short_description: Internal representation of the modulemd-packager v3 * format. */ #define MODULEMD_TYPE_PACKAGER_V3 (modulemd_packager_v3_get_type ()) G_DECLARE_FINAL_TYPE ( ModulemdPackagerV3, modulemd_packager_v3, MODULEMD, PACKAGER_V3, GObject) /** * MMD_PACKAGER_DEFAULT_MODULE_LICENSE: * * The #ModulemdPackagerV3 default module metadata license. * * Since: 2.11 */ #define MMD_PACKAGER_DEFAULT_MODULE_LICENSE "MIT" /** * ModulemdPackagerVersionEnum: * @MD_PACKAGER_VERSION_ERROR: Represents an error handling module stream * version. * @MD_PACKAGER_VERSION_UNSET: Represents an unset module stream version. * @MD_PACKAGER_VERSION_TWO: Represents v2 of the ModulePackager * metadata format. Since: 2.11 * @MD_PACKAGER_VERSION_THREE: Represents v3 of the ModulePackager * metadata format. Since: 2.11 * @MD_PACKAGER_VERSION_LATEST: Represents the highest-supported version of * the ModulePackager metadata format. * * Since: 2.11 */ typedef enum { MD_PACKAGER_VERSION_ERROR = -1, MD_PACKAGER_VERSION_UNSET = 0, /* There is no Packager v1 */ MD_PACKAGER_VERSION_TWO = 2, MD_PACKAGER_VERSION_THREE = 3, MD_PACKAGER_VERSION_LATEST = MD_PACKAGER_VERSION_THREE } ModulemdPackagerVersionEnum; /** * modulemd_packager_v3_new: * * Returns: (transfer full): A newly-allocated #ModulemdPackagerV3 object. This * object must be freed with g_object_unref(). * * Since: 2.11 */ ModulemdPackagerV3 * modulemd_packager_v3_new (void); /** * modulemd_packager_v3_copy: * @self: This #ModulemdPackagerV3 object. * * Returns: (transfer full): A newly-allocated deep-copy of this * #ModulemdPackagerV3 object. This object must be freed with g_object_unref(). * * Since: 2.11 */ ModulemdPackagerV3 * modulemd_packager_v3_copy (ModulemdPackagerV3 *self); /** * modulemd_packager_v3_set_module_name: * @self: This #ModulemdPackagerV3 object. * @module_name: The name of the module. * * Sets the module name that this #ModulemdPackagerV3 object references. * * Since: 2.11 */ void modulemd_packager_v3_set_module_name (ModulemdPackagerV3 *self, const gchar *module_name); /** * modulemd_packager_v3_get_module_name: * @self: This #ModulemdPackagerV3 object. * * Returns: (transfer none): The module name. * * Since: 2.11 */ const gchar * modulemd_packager_v3_get_module_name (ModulemdPackagerV3 *self); /** * modulemd_packager_v3_set_stream_name: * @self: This #ModulemdPackagerV3 object. * @stream_name: The name of the module. * * Sets the stream name that this #ModulemdPackagerV3 object references. * * Since: 2.11 */ void modulemd_packager_v3_set_stream_name (ModulemdPackagerV3 *self, const gchar *stream_name); /** * modulemd_packager_v3_get_stream_name: * @self: This #ModulemdPackagerV3 object. * * Returns: (transfer none): The module stream name. * * Since: 2.11 */ const gchar * modulemd_packager_v3_get_stream_name (ModulemdPackagerV3 *self); /** * modulemd_packager_v3_set_summary: * @self: This #ModulemdPackagerV3 object. * @summary: (nullable): A short description of the module. * * Sets the module's short description. * * Since: 2.11 */ void modulemd_packager_v3_set_summary (ModulemdPackagerV3 *self, const gchar *summary); /** * modulemd_packager_v3_get_summary: * @self: This #ModulemdPackagerV3 object. * * Returns: The short description of the module. * * Since: 2.11 */ const gchar * modulemd_packager_v3_get_summary (ModulemdPackagerV3 *self); /** * modulemd_packager_v3_set_description: * @self: This #ModulemdPackagerV3 object. * @description: (nullable): A complete description of the module. * * Sets the module's long description. * * Since: 2.11 */ void modulemd_packager_v3_set_description (ModulemdPackagerV3 *self, const gchar *description); /** * modulemd_packager_v3_get_description: * @self: This #ModulemdPackagerV3 object. * * Returns: The long description of the module. * * Since: 2.11 */ const gchar * modulemd_packager_v3_get_description (ModulemdPackagerV3 *self); /** * modulemd_packager_v3_add_module_license: * @self: (in): This #ModulemdPackagerV3 object. * @license: (in): A license under which this module stream is distributed. * * Since: 2.11 */ void modulemd_packager_v3_add_module_license (ModulemdPackagerV3 *self, const gchar *license); /** * modulemd_packager_v3_remove_module_license: * @self: (in): This #ModulemdPackagerV3 object. * @license: (in): A license to remove from the list. Has no effect if the * license is not present. * * Since: 2.11 */ void modulemd_packager_v3_remove_module_license (ModulemdPackagerV3 *self, const gchar *license); /** * modulemd_packager_v3_clear_module_licenses: * @self: (in): This #ModulemdPackagerV3 object. * * Remove all module licenses from @self * * Since: 2.11 */ void modulemd_packager_v3_clear_module_licenses (ModulemdPackagerV3 *self); /** * modulemd_packager_v3_get_module_licenses_as_strv: * @self: (in): This #ModulemdPackagerV3 object. * * Returns: (transfer full): A #GStrv of module licenses associated with this * module stream. * * Since: 2.11 */ GStrv modulemd_packager_v3_get_module_licenses_as_strv (ModulemdPackagerV3 *self); /** * modulemd_packager_v3_set_xmd: * @self: (in): This #ModulemdPackagerV3 object. * @xmd: (in) (transfer none): A #GVariant representing arbitrary YAML. * * Sets the eXtensible MetaData (XMD) for this module. XMD is arbitrary YAML * data that will be set and returned as-is (with the exception that the * ordering of mapping keys is not defined). Useful for carrying private data. * * This function assumes ownership of the XMD #GVariant and thus should not be * freed by the caller. * * Since: 2.11 */ void modulemd_packager_v3_set_xmd (ModulemdPackagerV3 *self, GVariant *xmd); /** * modulemd_packager_v3_get_xmd: * @self: (in): This #ModulemdPackagerV3 object. * * Returns: (transfer none): The extensible metadata block as a #GVariant. * * Since: 2.11 */ GVariant * modulemd_packager_v3_get_xmd (ModulemdPackagerV3 *self); /** * modulemd_packager_v3_get_mdversion: * @self: (in): This #ModulemdPackagerV3 object. * * Returns: The metadata version of this #ModulemdPackagerV3. * * Since: 2.11 */ guint64 modulemd_packager_v3_get_mdversion (ModulemdPackagerV3 *self); /** * modulemd_packager_v3_add_build_config: * @self: (in): This #ModulemdPackagerV3 object. * @buildconfig: (in): A #ModulemdBuildConfig to include. * * Since: 2.11 */ void modulemd_packager_v3_add_build_config (ModulemdPackagerV3 *self, ModulemdBuildConfig *buildconfig); /** * modulemd_packager_v3_clear_build_configs: * @self: (in): This #ModulemdPackagerV3 object. * * Remove all added #ModulemdBuildConfig objects from @self * * Since: 2.11 */ void modulemd_packager_v3_clear_build_configs (ModulemdPackagerV3 *self); /** * modulemd_packager_v3_get_build_config_contexts_as_strv: * @self: (in): This #ModulemdPackagerV3 object. * * Returns: (transfer full): A list of contexts associated with the build * configurations. * * Since: 2.11 */ GStrv modulemd_packager_v3_get_build_config_contexts_as_strv ( ModulemdPackagerV3 *self); /** * modulemd_packager_v3_get_build_config: * @self: (in): This #ModulemdPackagerV3 object. * @context: (in): The context of the #ModulemdBuildConfig to retrieve * from @self. * * Returns: (transfer none): A #ModulemdBuildConfig with the provided @context * or NULL if it was not present. * * Since: 2.11 */ ModulemdBuildConfig * modulemd_packager_v3_get_build_config (ModulemdPackagerV3 *self, const gchar *context); /** * modulemd_packager_v3_set_community: * @self: (in): This #ModulemdPackagerV3 object. * @community: (in): The upstream community website for this module. * * Set the module community website address. * * Since: 2.11 */ void modulemd_packager_v3_set_community (ModulemdPackagerV3 *self, const gchar *community); /** * modulemd_packager_v3_get_community: * @self: (in): This #ModulemdPackagerV3 object. * * Returns: (transfer none): The module community website address. * * Since: 2.11 */ const gchar * modulemd_packager_v3_get_community (ModulemdPackagerV3 *self); /** * modulemd_packager_v3_set_documentation: * @self: (in): This #ModulemdPackagerV3 object. * @documentation: (in): The upstream documentation website for this module. * * Set the module documentation website address. * * Since: 2.11 */ void modulemd_packager_v3_set_documentation (ModulemdPackagerV3 *self, const gchar *documentation); /** * modulemd_packager_v3_get_documentation: * @self: (in): This #ModulemdPackagerV3 object. * * Returns: (transfer none): The module documentation website address. * * Since: 2.11 */ const gchar * modulemd_packager_v3_get_documentation (ModulemdPackagerV3 *self); /** * modulemd_packager_v3_set_tracker: * @self: (in): This #ModulemdPackagerV3 object. * @tracker: (in): The upstream bug tracker website for this module. * * Set the module bug tracker website address. * * Since: 2.11 */ void modulemd_packager_v3_set_tracker (ModulemdPackagerV3 *self, const gchar *tracker); /** * modulemd_packager_v3_get_tracker: * @self: (in): This #ModulemdPackagerV3 object. * * Returns: (transfer none): The module bug tracker website address. * * Since: 2.11 */ const gchar * modulemd_packager_v3_get_tracker (ModulemdPackagerV3 *self); /** * modulemd_packager_v3_add_profile: * @self: This #ModulemdPackagerV3 object. * @profile: The new #ModulemdProfile to add. * * Adds a #ModulemdProfile to this #ModulemdPackagerV3 object. * * Since: 2.11 */ void modulemd_packager_v3_add_profile (ModulemdPackagerV3 *self, ModulemdProfile *profile); /** * modulemd_packager_v3_clear_profiles: * @self: This #ModulemdPackagerV3 object. * * Removes all #ModulemdProfile objects from this #ModulemdPackagerV3 object. * * Since: 2.11 */ void modulemd_packager_v3_clear_profiles (ModulemdPackagerV3 *self); /** * modulemd_packager_v3_get_profile_names_as_strv: * @self: This #ModulemdPackagerV3 object. * * Returns: (transfer full): An ordered #GStrv list of profile names associated * with this #ModulemdPackagerV3 object. * * Since: 2.11 */ GStrv modulemd_packager_v3_get_profile_names_as_strv (ModulemdPackagerV3 *self); /** * modulemd_packager_v3_get_profile: * @self: (in): This #ModulemdPackagerV3 object. * @profile_name: (in): The name of a profile to retrieve. * * Returns: (transfer none): The requested profile definition if present in the * #ModulemdPackagerV3 object. NULL otherwise. * * Since: 2.11 */ ModulemdProfile * modulemd_packager_v3_get_profile (ModulemdPackagerV3 *self, const gchar *profile_name); /** * modulemd_packager_v3_add_rpm_api: * @self: (in): This #ModulemdPackagerV3 object. * @rpm: (in): The name of a binary RPM present in this module that is * considered stable public API. * * Since: 2.11 */ void modulemd_packager_v3_add_rpm_api (ModulemdPackagerV3 *self, const gchar *rpm); /** * modulemd_packager_v3_remove_rpm_api: * @self: (in): This #ModulemdPackagerV3 object. * @rpm: (in): A binary RPM name to remove from the list of stable public API. * * Since: 2.11 */ void modulemd_packager_v3_remove_rpm_api (ModulemdPackagerV3 *self, const gchar *rpm); /** * modulemd_packager_v3_clear_rpm_api: * @self: (in): This #ModulemdPackagerV3 object. * * Remove all RPMs from the list of stable public API. * * Since: 2.11 */ void modulemd_packager_v3_clear_rpm_api (ModulemdPackagerV3 *self); /** * modulemd_packager_v3_replace_rpm_api: * @self: (in): This #ModulemdPackagerV3 object. * @set: (in): A #GHashTable set of binary RPMs present in this module stream that is * considered stable public API. * * Any existing API RPMs associated with module stream @self are removed and * replaced by @set. * * Since: 2.11 */ void modulemd_packager_v3_replace_rpm_api (ModulemdPackagerV3 *self, GHashTable *set); /** * modulemd_packager_v3_get_rpm_api_as_strv: * @self: (in): This #ModulemdPackagerV3 object. * * Returns: (transfer full): An ordered #GStrv list of binary RPM names that * form the public API of this module stream. * * Since: 2.11 */ GStrv modulemd_packager_v3_get_rpm_api_as_strv (ModulemdPackagerV3 *self); /** * modulemd_packager_v3_add_rpm_filter: * @self: (in): This #ModulemdPackagerV3 object. * @rpm: (in): The name of a binary RPM to filter out of this module stream. * * Since: 2.11 */ void modulemd_packager_v3_add_rpm_filter (ModulemdPackagerV3 *self, const gchar *rpm); /** * modulemd_packager_v3_remove_rpm_filter: * @self: (in): This #ModulemdPackagerV3 object. * @rpm: (in): A binary RPM name to remove from the filter list. * * Since: 2.11 */ void modulemd_packager_v3_remove_rpm_filter (ModulemdPackagerV3 *self, const gchar *rpm); /** * modulemd_packager_v3_clear_rpm_filters: * @self: (in): This #ModulemdPackagerV3 object. * * Remove all RPMs from the filter list. * * Since: 2.11 */ void modulemd_packager_v3_clear_rpm_filters (ModulemdPackagerV3 *self); /** * modulemd_packager_v3_get_rpm_filters_as_strv: * @self: (in): This #ModulemdPackagerV3 object. * * Returns: (transfer full): An ordered #GStrv list of binary RPM names that * are filtered out of this module stream. * * Since: 2.11 */ GStrv modulemd_packager_v3_get_rpm_filters_as_strv (ModulemdPackagerV3 *self); /** * modulemd_packager_v3_replace_rpm_filters: * @self: (in): This #ModulemdPackagerV3 object. * @set: (in): A #GHashTable set of names of binary RPMs to filter out of this * module stream. * * Any existing filtered binary RPM names associated with module stream @self * are removed and replaced by @set. * * Since: 2.11 */ void modulemd_packager_v3_replace_rpm_filters (ModulemdPackagerV3 *self, GHashTable *set); /** * modulemd_packager_v3_add_demodularized_rpm: * @self: (in): This #ModulemdPackagerV3 object. * @rpm: (in): A name of a binary RPM package to become non-modular. * * Add a binary package name to a list of demodularized packages. * * Since: 2.13 */ void modulemd_packager_v3_add_demodularized_rpm (ModulemdPackagerV3 *self, const gchar *rpm); /** * modulemd_packager_v3_remove_demodularized_rpm: * @self: (in): This #ModulemdPackagerV3 object. * @rpm: (in): A binary RPM package name to remove from a demodularized list. * * Remove a binary package name from a list of demodularized packages. * * Since: 2.13 */ void modulemd_packager_v3_remove_demodularized_rpm (ModulemdPackagerV3 *self, const gchar *rpm); /** * modulemd_packager_v3_clear_demodularized_rpms: * @self: (in): This #ModulemdPackagerV3 object. * * Remove all RPM packages from a demodularized list of the object. * * Since: 2.13 */ void modulemd_packager_v3_clear_demodularized_rpms (ModulemdPackagerV3 *self); /** * modulemd_packager_v3_get_demodularized_rpms: * @self: (in): This #ModulemdPackagerV3 object. * * Returns: (transfer full): An ordered #GStrv list of binary RPM package names * that became non-modular. * * Since: 2.13 */ GStrv modulemd_packager_v3_get_demodularized_rpms (ModulemdPackagerV3 *self); /** * modulemd_packager_v3_replace_demodularized_rpms: * @self: (in): This #ModulemdPackagerV3 object. * @set: (in): A #GHashTable set of names of binary RPM packages to demodularize. * * Any existing demodularized binary RPM package names associated with module * stream @self are removed and replaced by @set. * * Since: 2.13 */ void modulemd_packager_v3_replace_demodularized_rpms (ModulemdPackagerV3 *self, GHashTable *set); /** * modulemd_packager_v3_add_component: * @self: (in): This #ModulemdPackagerV3 object. * @component: (in) (transfer none): A #ModulemdComponent to be added to this * module stream. * * Add a component definition to the module. * * Since: 2.11 */ void modulemd_packager_v3_add_component (ModulemdPackagerV3 *self, ModulemdComponent *component); /** * modulemd_packager_v3_remove_module_component: * @self: (in): This #ModulemdPackagerV3 object. * @component_name: (in): The name of the component to remove from the module * stream. * * Remove a component from this module stream. * * Since: 2.11 */ void modulemd_packager_v3_remove_module_component (ModulemdPackagerV3 *self, const gchar *component_name); /** * modulemd_packager_v3_clear_module_components: * @self: (in): This #ModulemdPackagerV3 object. * * Remove all module components from this module stream. * * Since: 2.11 */ void modulemd_packager_v3_clear_module_components (ModulemdPackagerV3 *self); /** * modulemd_packager_v3_remove_rpm_component: * @self: (in): This #ModulemdPackagerV3 object. * @component_name: (in): The name of the component to remove from the module * stream. * * Remove a component from this module stream. * * Since: 2.11 */ void modulemd_packager_v3_remove_rpm_component (ModulemdPackagerV3 *self, const gchar *component_name); /** * modulemd_packager_v3_clear_rpm_components: * @self: (in): This #ModulemdPackagerV3 object. * * Remove all RPM components from this module stream. * * Since: 2.11 */ void modulemd_packager_v3_clear_rpm_components (ModulemdPackagerV3 *self); /** * modulemd_packager_v3_get_module_component_names_as_strv: (rename-to modulemd_packager_v3_get_module_component_names) * @self: (in): This #ModulemdPackagerV3 object. * * Returns: (transfer full): An ordered #GStrv list of module component names * included in this stream. * * Since: 2.11 */ GStrv modulemd_packager_v3_get_module_component_names_as_strv ( ModulemdPackagerV3 *self); /** * modulemd_packager_v3_get_rpm_component_names_as_strv: (rename-to modulemd_packager_v3_get_rpm_component_names) * @self: (in): This #ModulemdPackagerV3 object. * * Returns: (transfer full): An ordered #GStrv list of RPM component names * included in this stream. * * Since: 2.11 */ GStrv modulemd_packager_v3_get_rpm_component_names_as_strv ( ModulemdPackagerV3 *self); /** * modulemd_packager_v3_get_module_component: * @self: (in): This #ModulemdPackagerV3 object. * @component_name: (in): The name of the component to retrieve. * * Returns: (transfer none): The module component matching @component_name if * it exists, else NULL. * * Since: 2.11 */ ModulemdComponentModule * modulemd_packager_v3_get_module_component (ModulemdPackagerV3 *self, const gchar *component_name); /** * modulemd_packager_v3_get_rpm_component: * @self: (in): This #ModulemdPackagerV3 object. * @component_name: (in): The name of the component to retrieve. * * Returns: (transfer none): The RPM component matching @component_name if it * exists, else NULL. * * Since: 2.11 */ ModulemdComponentRpm * modulemd_packager_v3_get_rpm_component (ModulemdPackagerV3 *self, const gchar *component_name); /** * modulemd_packager_v3_convert_to_index: * @self: (in): This #ModulemdPackagerV3 object. * @error: (out): A #GError that will return the reason for a conversion error. * * Returns: (transfer full): A newly-allocated #ModulemdModuleIndex object * containing a set of one or more #ModulemdModuleStreamV2 objects and possibly * a #ModulemdDefaults object corresponding to the #ModulemdPackagerV3 object * @self. NULL if there was an error doing the mapping and sets @error * appropriately. One of the errors is missing a module name or a stream name * if a default profile is present. * * Since: 2.11 */ ModulemdModuleIndex * modulemd_packager_v3_convert_to_index (ModulemdPackagerV3 *self, GError **error); G_END_DECLS fedora-modularity-libmodulemd-357799c/modulemd/include/modulemd-2.0/modulemd-profile.h000066400000000000000000000116031502446517500307130ustar00rootroot00000000000000/* * This file is part of libmodulemd * Copyright (C) 2018 Red Hat, Inc. * * Fedora-License-Identifier: MIT * SPDX-2.0-License-Identifier: MIT * SPDX-3.0-License-Identifier: MIT * * This program is free software. * For more information on the license, see COPYING. * For more information on free software, see . */ #pragma once #include G_BEGIN_DECLS /** * SECTION: modulemd-profile * @title: Modulemd.Profile * @stability: stable * @short_description: Stores profile information for a module stream. */ #define MODULEMD_TYPE_PROFILE (modulemd_profile_get_type ()) G_DECLARE_FINAL_TYPE ( ModulemdProfile, modulemd_profile, MODULEMD, PROFILE, GObject) /** * modulemd_profile_equals: * @self_1: A #ModulemdProfile object. * @self_2: A #ModulemdProfile object. * * Returns: TRUE, if all elements of @self_1 and @self_2 are equal. FALSE, * otherwise. * * Since: 2.2 */ gboolean modulemd_profile_equals (ModulemdProfile *self_1, ModulemdProfile *self_2); /** * modulemd_profile_new: * @name: (not nullable): The name of this profile. * * Returns: (transfer full): A newly-allocated #ModulemdProfile object. This * object must be freed with g_object_unref(). * * Since: 2.0 */ ModulemdProfile * modulemd_profile_new (const gchar *name); /** * modulemd_profile_copy: * @self: This #ModulemdProfile object. * * Create a copy of this #ModulemdProfile object. * * Returns: (transfer full): The copied #ModulemdProfile object. * * Since: 2.0 */ ModulemdProfile * modulemd_profile_copy (ModulemdProfile *self); /** * modulemd_profile_get_name: * @self: This #ModulemdProfile object. * * Returns: (transfer none): The name of this profile. * * Since: 2.0 */ const gchar * modulemd_profile_get_name (ModulemdProfile *self); /** * modulemd_profile_set_description: * @self: This #ModulemdProfile object. * @description: (nullable): The untranslated description of this profile. * * Since: 2.0 */ void modulemd_profile_set_description (ModulemdProfile *self, const gchar *description); /** * modulemd_profile_get_description: * @self: This #ModulemdProfile object. * @locale: (in) (nullable): The name of the locale to use when translating * the string. If NULL, it will determine the locale with a system call to * `setlocale(LC_MESSAGES, NULL)` and return that. If the caller wants the * untranslated string, they should pass `"C"` for the locale. * * Returns: (transfer none): The description of this profile translated into * the language specified by the locale if it is available, otherwise it * returns the C.UTF-8 original. Translation information is managed by the * #ModulemdTranslation and #ModulemdTranslationEntry objects. * * Since: 2.0 */ const gchar * modulemd_profile_get_description (ModulemdProfile *self, const gchar *locale); /** * modulemd_profile_set_default: * @self: This #ModulemdProfile object. * * Calling this function indicates that this profile should be considered one * of the default profiles for the associated stream. * * Since: 2.10 */ void modulemd_profile_set_default (ModulemdProfile *self); /** * modulemd_profile_unset_default: * @self: This #ModulemdProfile object. * * Calling this function indicates that this profile should not be considered * one of the default profiles for this stream. This is the normal state of * a #ModulemdProfile and thus this function is usually unnecessary. It has no * effect if @self is already non-default. * * Since: 2.10 */ void modulemd_profile_unset_default (ModulemdProfile *self); /** * modulemd_profile_is_default: * @self: This #ModulemdProfile object. * * Returns: TRUE if this profile is a default for the associated stream. FALSE * otherwise. * * Since: 2.10 */ gboolean modulemd_profile_is_default (ModulemdProfile *self); /** * modulemd_profile_add_rpm: * @self: This #ModulemdProfile object. * @rpm: The name of a binary RPM that should be installed when this profile is * selected for installation. * * Since: 2.0 */ void modulemd_profile_add_rpm (ModulemdProfile *self, const gchar *rpm); /** * modulemd_profile_remove_rpm: * @self: This #ModulemdProfile object. * @rpm: The name of a binary RPM to remove from this profile. * * Since: 2.0 */ void modulemd_profile_remove_rpm (ModulemdProfile *self, const gchar *rpm); /** * modulemd_profile_clear_rpms: * @self: This #ModulemdProfile object. * * Remove all RPMs from this profile. * * Since: 2.5 */ void modulemd_profile_clear_rpms (ModulemdProfile *self); /** * modulemd_profile_get_rpms_as_strv: (rename-to modulemd_profile_get_rpms) * @self: This #ModulemdProfile object. * * Returns: (transfer full): An ordered #GStrv list of binary RPMS that would be * installed when this profile is selected for installation. * * Since: 2.0 */ GStrv modulemd_profile_get_rpms_as_strv (ModulemdProfile *self); G_END_DECLS fedora-modularity-libmodulemd-357799c/modulemd/include/modulemd-2.0/modulemd-rpm-map-entry.h000066400000000000000000000125351502446517500317700ustar00rootroot00000000000000/* * This file is part of libmodulemd * Copyright (C) 2018 Red Hat, Inc. * * Fedora-License-Identifier: MIT * SPDX-2.0-License-Identifier: MIT * SPDX-3.0-License-Identifier: MIT * * This program is free software. * For more information on the license, see COPYING. * For more information on free software, see . */ #pragma once #include G_BEGIN_DECLS /** * SECTION: modulemd-rpm-map-entry * @title: Modulemd.RpmMapEntry * @stability: stable * @short_description: Provides an exploded and unexploded view of the NEVRA of * an RPM artifact. */ #define MODULEMD_TYPE_RPM_MAP_ENTRY (modulemd_rpm_map_entry_get_type ()) G_DECLARE_FINAL_TYPE (ModulemdRpmMapEntry, modulemd_rpm_map_entry, MODULEMD, RPM_MAP_ENTRY, GObject) /** * modulemd_rpm_map_entry_new: * @name: The name of the package. * @epoch: The epoch of the package. * @version: The version of the package. * @release: The release string of the package. * @arch: The processor architecture of the package. * * Create a new rpm-map entry. This will contain the decomposed NEVRA of an * RPM artifact. * * Returns: (transfer full): A newly-allocated #ModulemdRpmMapEntry object with * the provided values. */ ModulemdRpmMapEntry * modulemd_rpm_map_entry_new (const gchar *name, guint64 epoch, const gchar *version, const gchar *release, const gchar *arch); /** * modulemd_rpm_map_entry_copy: * @self: This #ModulemdRpmMapEntry object. * * Returns: (transfer full): A deep copy of this #ModulemdRpmMapEntry object. * * Since: 2.2 */ ModulemdRpmMapEntry * modulemd_rpm_map_entry_copy (ModulemdRpmMapEntry *self); /** * modulemd_rpm_map_entry_equals: * @self: A #ModulemdRpmMapEntry object. * @other: Another #ModulemdRpmMapEntry object. * * Returns: TRUE if the two entries contain equivalent data. FALSE if they * differ. * * Since: 2.2 */ gboolean modulemd_rpm_map_entry_equals (ModulemdRpmMapEntry *self, ModulemdRpmMapEntry *other); /** * modulemd_rpm_map_entry_validate: * @self: This #ModulemdRpmMapEntry object. * @error: (out): A #GError containing the reason the object failed validation. * NULL if the validation passed. * * Since: 2.2 */ gboolean modulemd_rpm_map_entry_validate (ModulemdRpmMapEntry *self, GError **error); /** * modulemd_rpm_map_entry_set_name: * @self: This #ModulemdRpmMapEntry object. * @name: The package name of this RPM. * * Since: 2.2 */ void modulemd_rpm_map_entry_set_name (ModulemdRpmMapEntry *self, const gchar *name); /** * modulemd_rpm_map_entry_get_name: * @self: This #ModulemdRpmMapEntry object. * * Returns: (transfer none): The package name of this RPM. * * Since: 2.2 */ const gchar * modulemd_rpm_map_entry_get_name (ModulemdRpmMapEntry *self); /** * modulemd_rpm_map_entry_set_epoch: * @self: This #ModulemdRpmMapEntry object. * @epoch: The package epoch of this RPM. * * Since: 2.2 */ void modulemd_rpm_map_entry_set_epoch (ModulemdRpmMapEntry *self, guint64 epoch); /** * modulemd_rpm_map_entry_get_epoch: * @self: This #ModulemdRpmMapEntry object. * * Returns: The package epoch of this RPM. * * Since: 2.2 */ guint64 modulemd_rpm_map_entry_get_epoch (ModulemdRpmMapEntry *self); /** * modulemd_rpm_map_entry_set_version: * @self: This #ModulemdRpmMapEntry object. * @version: The package version of this RPM. * * Since: 2.2 */ void modulemd_rpm_map_entry_set_version (ModulemdRpmMapEntry *self, const gchar *version); /** * modulemd_rpm_map_entry_get_version: * @self: This #ModulemdRpmMapEntry object. * * Returns: (transfer none): The package version of this RPM. * * Since: 2.2 */ const gchar * modulemd_rpm_map_entry_get_version (ModulemdRpmMapEntry *self); /** * modulemd_rpm_map_entry_set_release: * @self: This #ModulemdRpmMapEntry object. * @release: The package release string of this RPM. * * Since: 2.2 */ void modulemd_rpm_map_entry_set_release (ModulemdRpmMapEntry *self, const gchar *release); /** * modulemd_rpm_map_entry_get_release: * @self: This #ModulemdRpmMapEntry object. * * Returns: (transfer none): The package release of this RPM. * * Since: 2.2 */ const gchar * modulemd_rpm_map_entry_get_release (ModulemdRpmMapEntry *self); /** * modulemd_rpm_map_entry_set_arch: * @self: This #ModulemdRpmMapEntry object. * @arch: The package architecture of this RPM. * * Since: 2.2 */ void modulemd_rpm_map_entry_set_arch (ModulemdRpmMapEntry *self, const gchar *arch); /** * modulemd_rpm_map_entry_get_arch: * @self: This #ModulemdRpmMapEntry object. * * Returns: (transfer none): The package architecture of this RPM. * * Since: 2.2 */ const gchar * modulemd_rpm_map_entry_get_arch (ModulemdRpmMapEntry *self); /** * modulemd_rpm_map_entry_get_nevra_as_string: (rename-to modulemd_rpm_map_entry_get_nevra) * @self: This #ModulemdRpmMapEntry object. * * Returns: (transfer full): A newly-allocated string containing the complete * N-E:V-R.A constructed from the component parts. NULL if any field is * missing. * * Since: 2.2 */ gchar * modulemd_rpm_map_entry_get_nevra_as_string (ModulemdRpmMapEntry *self); G_END_DECLS fedora-modularity-libmodulemd-357799c/modulemd/include/modulemd-2.0/modulemd-service-level.h000066400000000000000000000075231502446517500320260ustar00rootroot00000000000000/* * This file is part of libmodulemd * Copyright (C) 2017-2018 Stephen Gallagher * * Fedora-License-Identifier: MIT * SPDX-2.0-License-Identifier: MIT * SPDX-3.0-License-Identifier: MIT * * This program is free software. * For more information on the license, see COPYING. * For more information on free software, see . */ #pragma once #include G_BEGIN_DECLS /** * SECTION: modulemd-service-level * @title: Modulemd.ServiceLevel * @stability: stable * @short_description: Provides lifecycle information for a module stream. */ #define MODULEMD_TYPE_SERVICE_LEVEL (modulemd_service_level_get_type ()) G_DECLARE_FINAL_TYPE (ModulemdServiceLevel, modulemd_service_level, MODULEMD, SERVICE_LEVEL, GObject) /** * modulemd_service_level_new: * @name: (not nullable): The name of the service level. * * Returns: (transfer full): A newly-allocated #ModulemdServiceLevel object. * This object must be freed with g_object_unref(). * * Since: 2.0 */ ModulemdServiceLevel * modulemd_service_level_new (const gchar *name); /** * modulemd_service_level_copy: * @self: This #ModulemdServiceLevel object. * * Create a copy of this #ModulemdServiceLevel object. * * Returns: (transfer full): The copied #ModulemdServiceLevel object. * * Since: 2.0 */ ModulemdServiceLevel * modulemd_service_level_copy (ModulemdServiceLevel *self); /** * modulemd_service_level_get_name: * @self: This #ModulemdServiceLevel object. * * Get the name of this service level. * * Returns: (transfer none): The name of this service level. This is a pointer * to the internal memory location and must not be freed. * * Since: 2.0 */ const gchar * modulemd_service_level_get_name (ModulemdServiceLevel *self); /** * modulemd_service_level_set_eol: * @self: This #ModulemdServiceLevel object. * @date: (nullable): The date this service level ends. * * Sets the end date of the service level. If the #GDate passed in is invalid * or NULL, the EOL will be unset. * * Since: 2.0 */ void modulemd_service_level_set_eol (ModulemdServiceLevel *self, GDate *date); /** * modulemd_service_level_set_eol_ymd: * @self: This #ModulemdServiceLevel object. * @year: The year this service level ends. * @month: The month this service level ends. * @day: The day of the month this service level ends. * * Since: 2.0 */ void modulemd_service_level_set_eol_ymd (ModulemdServiceLevel *self, GDateYear year, GDateMonth month, GDateDay day); /** * modulemd_service_level_remove_eol: * @self: This #ModulemdServiceLevel object. * * Remove the EOL from this Service Level. * * Since: 2.0 */ void modulemd_service_level_remove_eol (ModulemdServiceLevel *self); /** * modulemd_service_level_get_eol: * @self: This #ModulemdServiceLevel object. * * Returns: (transfer none): The end date of the service level as a #GDate. * * Since: 2.0 */ GDate * modulemd_service_level_get_eol (ModulemdServiceLevel *self); /** * modulemd_service_level_get_eol_as_string: * @self: This #ModulemdServiceLevel object. * * Returns: (transfer full) (nullable): The end date of the service level as a * string of the form "YYYY-MM-DD" or NULL if the date is unset or invalid. * * Since: 2.0 */ gchar * modulemd_service_level_get_eol_as_string (ModulemdServiceLevel *self); /** * modulemd_service_level_equals: * @self_1: A #ModulemdServiceLevel object. * @self_2: A #ModulemdServiceLevel object. * * Returns: TRUE if both the dates are either NULL or valid, FALSE otherwise. * * Since: 2.2 */ gboolean modulemd_service_level_equals (ModulemdServiceLevel *self_1, ModulemdServiceLevel *self_2); G_END_DECLS fedora-modularity-libmodulemd-357799c/modulemd/include/modulemd-2.0/modulemd-subdocument-info.h000066400000000000000000000027321502446517500325370ustar00rootroot00000000000000/* * This file is part of libmodulemd * Copyright (C) 2018 Red Hat, Inc. * * Fedora-License-Identifier: MIT * SPDX-2.0-License-Identifier: MIT * SPDX-3.0-License-Identifier: MIT * * This program is free software. * For more information on the license, see COPYING. * For more information on free software, see . */ #pragma once #include G_BEGIN_DECLS /** * SECTION: modulemd-subdocument-info * @title: Modulemd.SubdocumentInfo * @stability: stable * @short_description: Stores information regarding a YAML subdocument in a stream. */ #define MODULEMD_TYPE_SUBDOCUMENT_INFO (modulemd_subdocument_info_get_type ()) G_DECLARE_FINAL_TYPE (ModulemdSubdocumentInfo, modulemd_subdocument_info, MODULEMD, SUBDOCUMENT_INFO, GObject) /** * modulemd_subdocument_info_get_yaml: * @self: This #ModulemdSubdocumentInfo object. * * Returns: (transfer none): The associated YAML subdocument. * * Since: 2.0 */ const gchar * modulemd_subdocument_info_get_yaml (ModulemdSubdocumentInfo *self); /** * modulemd_subdocument_info_get_gerror: * @self: This #ModulemdSubdocumentInfo object. * * Returns: (transfer none): A #GError containing an error code and message * about why this subdocument failed parsing. * * Since: 2.0 */ const GError * modulemd_subdocument_info_get_gerror (ModulemdSubdocumentInfo *self); G_END_DECLS fedora-modularity-libmodulemd-357799c/modulemd/include/modulemd-2.0/modulemd-translation-entry.h000066400000000000000000000115421502446517500327520ustar00rootroot00000000000000/* * This file is part of libmodulemd * Copyright (C) 2018 Red Hat, Inc. * * Fedora-License-Identifier: MIT * SPDX-2.0-License-Identifier: MIT * SPDX-3.0-License-Identifier: MIT * * This program is free software. * For more information on the license, see COPYING. * For more information on free software, see . */ #pragma once #include G_BEGIN_DECLS /** * SECTION: modulemd-translation-entry * @title: Modulemd.TranslationEntry * @stability: stable * @short_description: Contains the translated strings of a module stream for a specific locale. */ #define MODULEMD_TYPE_TRANSLATION_ENTRY \ (modulemd_translation_entry_get_type ()) G_DECLARE_FINAL_TYPE (ModulemdTranslationEntry, modulemd_translation_entry, MODULEMD, TRANSLATION_ENTRY, GObject) /** * modulemd_translation_entry_new: * @locale: (not nullable): The locale for this translation entry. * It must correspond to the format specified by libc locale names. * * Returns: (transfer full): A newly-allocated #ModulemdTranslationEntry * object. This object must be freed with g_object_unref(). * * Since: 2.0 */ ModulemdTranslationEntry * modulemd_translation_entry_new (const gchar *locale); /** * modulemd_translation_entry_copy: * @self: This #ModulemdTranslationEntry object. * * Create a copy of this #ModulemdTranslationEntry object. * * Returns: (transfer full): The copied #ModulemdTranslationEntry object. * * Since: 2.0 */ ModulemdTranslationEntry * modulemd_translation_entry_copy (ModulemdTranslationEntry *self); /** * modulemd_translation_entry_get_locale: * @self: This #ModulemdTranslationEntry object. * * Get the locale of this translation entry. * * Returns: (transfer none): The locale of this translation entry. This is a pointer * to the internal memory location and must not be freed. * * Since: 2.0 */ const gchar * modulemd_translation_entry_get_locale (ModulemdTranslationEntry *self); /** * modulemd_translation_entry_set_summary: * @self: This #ModulemdTranslationEntry object. * @summary: (nullable): The summary of this module translated appropriately * for this locale. * * Since: 2.0 */ void modulemd_translation_entry_set_summary (ModulemdTranslationEntry *self, const gchar *summary); /** * modulemd_translation_entry_get_summary: * @self: This #ModulemdTranslationEntry object. * * Get the summary of this translation entry. * * Returns: (transfer none): The summary of this module stream translated into * the language specified by locale. * * Since: 2.0 */ const gchar * modulemd_translation_entry_get_summary (ModulemdTranslationEntry *self); /** * modulemd_translation_entry_set_description: * @self: This #ModulemdTranslationEntry object. * @description: (nullable): The description of this module stream translated * into the language specified by locale. * * Since: 2.0 */ void modulemd_translation_entry_set_description (ModulemdTranslationEntry *self, const char *description); /** * modulemd_translation_entry_get_description: * @self: This #ModulemdTranslationEntry object. * * Get the description of this translation entry. * * Returns: (transfer none): The description of this module stream translated * into the language specified by locale. * * Since: 2.0 */ const gchar * modulemd_translation_entry_get_description (ModulemdTranslationEntry *self); /** * modulemd_translation_entry_get_profiles_as_strv: (rename-to modulemd_translation_entry_get_profiles) * @self: This #ModulemdTranslationEntry object. * * Get a list of profiles that have descriptions. * * Returns: (transfer full): An ordered #GStrv list of profiles for which * descriptions have been translated for this locale. * * Since: 2.0 */ GStrv modulemd_translation_entry_get_profiles_as_strv ( ModulemdTranslationEntry *self); /** * modulemd_translation_entry_set_profile_description: * @self: This #ModulemdTranslationEntry object. * @profile_name: The name of the profile. * @profile_description: (nullable): The translated description of the profile. * * Adds a profile name translation. * * Since: 2.0 */ void modulemd_translation_entry_set_profile_description ( ModulemdTranslationEntry *self, const gchar *profile_name, const gchar *profile_description); /** * module_translation_entry_get_profile_description: * @self: This #ModulemdTranslationEntry object. * @profile_name: The name of the profile whose description is being translated. * * Returns: (transfer none): The description for the specified profile. * * Since: 2.0 */ const gchar * modulemd_translation_entry_get_profile_description ( ModulemdTranslationEntry *self, const gchar *profile_name); G_END_DECLS fedora-modularity-libmodulemd-357799c/modulemd/include/modulemd-2.0/modulemd-translation.h000066400000000000000000000073441502446517500316200ustar00rootroot00000000000000/* * This file is part of libmodulemd * Copyright (C) 2018 Red Hat, Inc. * * Fedora-License-Identifier: MIT * SPDX-2.0-License-Identifier: MIT * SPDX-3.0-License-Identifier: MIT * * This program is free software. * For more information on the license, see COPYING. * For more information on free software, see . */ #pragma once #include "modulemd-translation-entry.h" #include G_BEGIN_DECLS /** * SECTION: modulemd-translation * @title: Modulemd.Translation * @stability: stable * @short_description: Translation information for a module stream. */ #define MODULEMD_TYPE_TRANSLATION (modulemd_translation_get_type ()) G_DECLARE_FINAL_TYPE ( ModulemdTranslation, modulemd_translation, MODULEMD, TRANSLATION, GObject) /** * modulemd_translation_new: * @version: The metadata version of this #ModulemdTranslation. * @module_name: The name of the module to which these translations apply. * @module_stream: The name of the module stream to which these translations apply. * @modified: The last modified time represented as a 64-bit integer (such as * 201807011200). * * Returns: (transfer full): A newly-allocated #ModulemdTranslation object. * This object must be freed with g_object_unref(). * * Since: 2.0 */ ModulemdTranslation * modulemd_translation_new (guint64 version, const gchar *module_name, const gchar *module_stream, guint64 modified); /** * modulemd_translation_copy: * @self: This #ModulemdTranslation object. * * Create a copy of this #ModulemdTranslation object. * * Returns: (transfer full): The copied #ModulemdTranslation object. * * Since: 2.0 */ ModulemdTranslation * modulemd_translation_copy (ModulemdTranslation *self); /** * modulemd_translation_validate: * @self: This #ModulemdTranslation object. * @error: (out): If the object is not valid, it will return the reason. * * This method ensures that the translation is internally consistent for usage * or dumping to YAML. It will be run implicitly prior to emitting YAML. This * is not a complete linter, merely a sanity check that the values are not * impossible. * * Since: 2.0 */ gboolean modulemd_translation_validate (ModulemdTranslation *self, GError **error); /** * modulemd_translation_set_modified: * @self: This #ModulemdTranslation object. * @modified: The last modified time represented as a 64-bit integer (such as * 201807011200). * * Since: 2.0 */ void modulemd_translation_set_modified (ModulemdTranslation *self, guint64 modified); /** * modulemd_translation_get_locales_as_strv: (rename-to modulemd_translation_get_locales) * @self: This #ModulemdTranslation object. * * Returns: (transfer full): An ordered #GStrv list of locales known to this * #ModulemdTranslation. * * Since: 2.0 */ GStrv modulemd_translation_get_locales_as_strv (ModulemdTranslation *self); /** * modulemd_translation_set_translation_entry: * @self: This #ModulemdTranslation object. * @translation_entry: A set of translations of this module stream for a particular locale. * * Since: 2.0 */ void modulemd_translation_set_translation_entry ( ModulemdTranslation *self, ModulemdTranslationEntry *translation_entry); /** * modulemd_translation_get_translation_entry: * @self: This #ModulemdTranslation object. * @locale: The locale of the translation to retrieve. * * Returns: (transfer none): The translation entry for the requested locale, or NULL if the locale was unknown. * * Since: 2.0 */ ModulemdTranslationEntry * modulemd_translation_get_translation_entry (ModulemdTranslation *self, const gchar *locale); G_END_DECLS fedora-modularity-libmodulemd-357799c/modulemd/include/modulemd-2.0/modulemd.h000066400000000000000000000416041502446517500272610ustar00rootroot00000000000000/* * This file is part of libmodulemd * Copyright (C) 2018-2020 Red Hat, Inc. * * Fedora-License-Identifier: MIT * SPDX-2.0-License-Identifier: MIT * SPDX-3.0-License-Identifier: MIT * * This program is free software. * For more information on the license, see COPYING. * For more information on free software, see . */ #pragma once #include "modulemd-build-config.h" #include "modulemd-buildopts.h" #include "modulemd-component-module.h" #include "modulemd-component-rpm.h" #include "modulemd-component.h" #include "modulemd-compression.h" #include "modulemd-defaults-v1.h" #include "modulemd-defaults.h" #include "modulemd-dependencies.h" #include "modulemd-deprecated.h" #include "modulemd-errors.h" #include "modulemd-module-index-merger.h" #include "modulemd-module-index.h" #include "modulemd-module-stream-v1.h" #include "modulemd-module-stream-v2.h" #include "modulemd-module-stream.h" #include "modulemd-module.h" #include "modulemd-packager-v3.h" #include "modulemd-profile.h" #include "modulemd-rpm-map-entry.h" #include "modulemd-service-level.h" #include "modulemd-subdocument-info.h" #include "modulemd-translation-entry.h" #include "modulemd-translation.h" G_BEGIN_DECLS /** * SECTION: modulemd * @title: Modulemd * @stability: stable * @short_description: User's Guide for libmodulemd * * # Working with repodata (DNF use-case) * The libmodulemd API provides a number of convenience tools for interacting * with repodata (that is, streams of YAML that contains information on multiple * streams, default data and translations). The documentation will use two * repositories, called "fedora" and "updates" for demonstrative purposes. It * will assume that the content of the YAML module metadata from those two * repositories have been loaded into string variables `fedora_yaml` and * `updates_yaml`, respectively. * * Tools such as DNF that are consuming data from a repository should always * set `strict=False`, so that it can safely handle minor, * backwards-compatible changes to the modulemd format. * * First step is to load the metadata from these two repositories into * #ModulemdModuleIndex objects. This is done as follows: * * In C: * |[ * ModulemdModuleIndex *fedora_index = modulemd_module_index_new (); * gboolean ret = modulemd_module_index_update_from_string ( * fedora_index, fedora_yaml, FALSE, &failures, &error); * * ModulemdModuleIndex *updates_index = modulemd_module_index_new (); * gboolean ret2 = modulemd_module_index_update_from_string ( * updates_index, updates_yaml, FALSE, &failures, &error); * ]| * * In Python: * |[ * fedora_index = Modulemd.ModuleIndex.new() * ret, failures = fedora_index.update_from_string(fedora_yaml, False) * * updates_index = Modulemd.ModuleIndex.new() * ret, failures = updates_index.update_from_string(updates_yaml, False) * ]| * * The @failures are a list of subdocuments in the YAML that failed parsing, * along with the reason they failed. Hence, by checking the return value of * @failures we will know if the YAML parsing was successful or not. * * Since it doesn't really make sense to view the contents from separate * repositories in isolation (in most cases), the next step is to merge the two * indexes into a combined one: * * In C: * |[ * ModulemdModuleIndexMerger *merger = modulemd_module_index_merger_new (); * * modulemd_module_index_merger_associate_index (merger, fedora_index, 0); * modulemd_module_index_merger_associate_index (merger, updates_index, 0); * * ModulemdModuleIndex *merged_index = * modulemd_module_index_merger_resolve (merger, &error); * ]| * * In Python: * |[ * merger = Modulemd.ModuleIndexMerger.new() * * merger.associate_index(fedora_index, 0) * merger.associate_index(updates_index, 0) * * merged_index = merger.resolve() * ]| * * At this point, you now have either a complete view of the merged repodata, * or else have received an error describing why the merge was unable to * complete successfully. Additionally, it should be noted that the combined * metadata in any #ModulemdModuleIndex will have all of its component parts * upgraded to match the highest version of those objects seen. So for example * if the repodata has a mix of v1 and v2 #ModulemdModuleStream objects, the * index will contain only v2 objects (with the v1 objects automatically * upgraded internally). * * Now, we can start operating on the retrieved data. This guide will * give only a brief overview of the most common operations. See the API * specification for a full list of information that can be retrieved. * * ## Discover the default stream for a particular module. * * In C: * |[ * ModulemdModule *module = * modulemd_module_index_get_module (merged_index, "modulename"); * ModulemdDefaults *defaults = modulemd_module_get_defaults (module); * if (defaults) * { * printf ("Default stream for modulename is %s\n", * modulemd_defaults_v1_get_default_stream ( * MODULEMD_DEFAULTS_V1 (defaults), NULL)); * } * ]| * * In Python: * |[ * module = merged_index.get_module("modulename") * defaults = module.get_defaults() * print("Default stream for modulename is %s" % defaults.get_default_stream()) * ]| * * ## Get the list of RPMs defining the public API for a particular module NSVCA * First, query the #ModulemdModuleIndex for the module with a given name. * * In C: * |[ * ModulemdModule *module = * modulemd_module_index_get_module (merged_index, "modulename"); * ]| * * In Python: * |[ * module = merged_index.get_module("modulename") * ]| * * Then, query the #ModulemdModule for the #ModulemdModuleStream associated with the * provided NSVCA (name-stream-version-context-architecture identifier). * * In C: * |[ * ModulemdModuleStream *stream = modulemd_module_get_stream_by_NSVCA ( * module, "modulestream", 0, "deadbeef", "coolarch", &error); * ]| * * In Python: * |[ * stream = module.get_stream_by_NSVCA("modulestream", 0, "deadbeef", "coolarch") * ]| * * Lastly, read the RPM API from the #ModulemdModuleStream. Here, `api_list` is * a list of strings containing package names. * * In C: * |[ * GStrv api_list = modulemd_module_stream_v2_get_rpm_api_as_strv ( * MODULEMD_MODULE_STREAM_V2 (stream)); * ]| * * In Python: * |[ * api_list = stream.get_rpm_api() * ]| * * Also note that in addition to accessor API methods, many objects also have * properties that can be accessed directly. * * In C: * |[ * printf ("Documentation for module stream is at %s\n", * modulemd_module_stream_v2_get_documentation ( * MODULEMD_MODULE_STREAM_V2 (stream))); * g_autofree gchar *doc; * g_object_get (MODULEMD_MODULE_STREAM_V2 (stream), "documentation", &doc, NULL); * printf ("Documentation for module stream is at %s\n", doc); * ]| * * In Python: * |[ * print("Documentation for module stream is at %s" % stream.get_documentation()) * print("Documentation for module stream is at %s" % stream.props.documentation) * ]| * * ## Retrieve the modular runtime dependencies for a particular module NSVCA * * In C: * |[ * ModulemdModule *module = * modulemd_module_index_get_module (merged_index, "modulename"); * ModulemdModuleStream *stream = modulemd_module_get_stream_by_NSVCA ( * module, "modulestream", 0, "deadbeef", "coolarch", &error); * GPtrArray *deps_list = modulemd_module_stream_v2_get_dependencies ( * MODULEMD_MODULE_STREAM_V2 (stream)); * * for (gint i = 0; i < deps_list->len; i++) * { * GStrv depmodules_list = * modulemd_dependencies_get_runtime_modules_as_strv ( * g_ptr_array_index (deps_list, i)); * * for (gint j = 0; j < g_strv_length (depmodules_list); j++) * { * GStrv depstreams_list = * modulemd_dependencies_get_runtime_streams_as_strv ( * g_ptr_array_index (deps_list, i), depmodules_list[j]); * * for (gint k = 0; k < g_strv_length (depstreams_list); k++) * { * // do stuff with depmodules_list[j], depstreams_list[k] * } * } * } * ]| * * In Python: * |[ * module = merged_index.get_module("modulename") * stream = module.get_stream_by_NSVCA("modulestream", 0, "deadbeef", "coolarch") * deps_list = stream.get_dependencies() * for dep in deps_list: * depmodules_list = dep.get_runtime_modules() * for depmod in depmodules_list: * depstream_list = dep.get_runtime_streams(depmod) * for depstream in depstream_list: * # do stuff with depmod, depstream * ]| * * # Working with a single module stream (Packager/MBS use-case) * One limitation of the #ModulemdModuleIndex format is that it requires that * all module streams loaded into it have both a name and a stream name. * This however is not possible when dealing with streams such as a packager * would be using (since the build-system auto-generates the module name and * stream name from the git repository information. In this case, we need to * work with a single module stream document at a time. For this, we will * use the #ModulemdModuleStream interface. * * This example will assume that the module name and stream name have * already been determined from the repodata and that they are stored in * string variables named `module_name` and `stream_name`, respectively. * * In Python: * |[ * stream = Modulemd.ModuleStream.read_file( * "/path/to/module_name.yaml", True, module_name, stream_name * ) * v2_stream = stream.upgrade(Modulemd.ModuleStreamVersionEnum.TWO) * v2_stream.validate() * ]| * In the example above, we upgraded the stream to v2, in case we were reading * from v1 metadata. This will allow us to avoid having to manage multiple * code-paths and support only the latest we understand. After that, it calls * validate() to ensure that the content that was read in was valid both * syntactically and referentially. * * Also available is `Modulemd.ModuleStreamVersionEnum.LATEST` which will * always represent the highest-supported version of the * #ModulemdModuleStream metadata format. This may change at any time. */ /** * modulemd_get_version: * * Returns: (transfer none): A string describing the version of libmodulemd. * * Since: 2.0 */ const gchar * modulemd_get_version (void); /** * modulemd_load_file: * @yaml_file: (in): A YAML file containing the module metadata and other * related information such as default streams. * @error: (out): A #GError containing additional information if this function * fails in a way that prevents program continuation. * * This is a convenience function that is a wrapper around * modulemd_module_index_new() and modulemd_module_index_update_from_file() * with `strict=False`. * * It will return the imported module metadata if all subdocuments are * parseable and valid. If any part of the document is unreadable or fails * validation, it will return NULL and set @error appropriately. If you need * more detail about which parts of the document failed, use the lower-level * functions. * * Returns: (transfer full): A newly-allocated #ModulemdModuleIndex object * initialized with the content from @yaml_file. Returns NULL and sets @error * if the file is not completely valid. * * Since: 2.10 */ ModulemdModuleIndex * modulemd_load_file (const gchar *yaml_file, GError **error); /** * modulemd_load_string: * @yaml_string: (in): A YAML string containing the module metadata and other * related information such as default streams. * @error: (out): A #GError containing additional information if this function * fails in a way that prevents program continuation. * * This is a convenience function that is a wrapper around * modulemd_module_index_new() and modulemd_module_index_update_from_string() * with `strict=False`. * * It will return the imported module metadata if all subdocuments are * parseable and valid. If any part of the document is unreadable or fails * validation, it will return NULL and set @error appropriately. If you need * more detail about which parts of the document failed, use the lower-level * functions. * * Returns: (transfer full): A newly-allocated #ModulemdModuleIndex object * initialized with the content from @yaml_string. Returns NULL and sets @error * if the metadata is not completely valid. * * Since: 2.10 */ ModulemdModuleIndex * modulemd_load_string (const gchar *yaml_string, GError **error); /** * modulemd_read_packager_file: (skip) * @yaml_path: (in): A path to a YAML file containing a packager document. * @object: (out): (transfer full): A newly allocated #ModulemdModuleStreamV2 or * #ModulemdPackagerV3 object initialized with the content from @yaml_path. * @error: (out): A #GError containing additional information if this function * fails in a way that prevents program continuation. * * Returns: @MODULEMD_TYPE_MODULE_STREAM_V2, @MODULEMD_TYPE_PACKAGER_V3, or * @G_TYPE_INVALID. Returns the matching GObject through the @object parameter. * If the return value is @G_TYPE_INVALID, returns the reason as @error. * * Since: 2.11 */ GType modulemd_read_packager_file (const gchar *yaml_path, GObject **object, GError **error); /** * modulemd_read_packager_file_ext: (rename-to modulemd_read_packager_file) * @yaml_path: (in): A path to a YAML file containing a packager document. * @object: (out): (transfer full): A newly allocated #ModulemdModuleStreamV2 or * #ModulemdPackagerV3 object initialized with the content from @yaml_path. * @module_name: (in) (nullable): An optional module name to override the * document on disk. Mostly useful in cases where the name is being * auto-detected from git. * @module_stream: (in) (nullable): An optional module stream name to override * the document on disk. Mostly useful in cases where the name is being * auto-detected from git. * @error: (out): A #GError containing additional information if this function * fails in a way that prevents program continuation. * * Returns: @MODULEMD_TYPE_MODULE_STREAM_V2, @MODULEMD_TYPE_PACKAGER_V3, or * @G_TYPE_INVALID. Returns the matching GObject through the @object parameter. * If the return value is @G_TYPE_INVALID, returns the reason as @error. * * Since: 2.11 */ GType modulemd_read_packager_file_ext (const gchar *yaml_path, GObject **object, const gchar *module_name, const gchar *module_stream, GError **error); /** * modulemd_read_packager_string: (skip) * @yaml_string: (in): A YAML string containing a packager document. * @object: (out): (transfer full): A newly allocated #ModulemdModuleStreamV2 or * #ModulemdPackagerV3 object initialized with the content from @yaml_string. * @error: (out): A #GError containing additional information if this function * fails in a way that prevents program continuation. * * Returns: @MODULEMD_TYPE_MODULE_STREAM_V2, @MODULEMD_TYPE_PACKAGER_V3, or * @G_TYPE_INVALID. Returns the matching GObject through the @object parameter. * If the return value is @G_TYPE_INVALID, returns the reason as @error. * * Since: 2.11 */ GType modulemd_read_packager_string (const gchar *yaml_string, GObject **object, GError **error); /** * modulemd_read_packager_string_ext: (rename-to modulemd_read_packager_string) * @yaml_string: (in): A YAML string containing a packager document. * @object: (out): (transfer full): A newly allocated #ModulemdModuleStreamV2 or * #ModulemdPackagerV3 object initialized with the content from @yaml_string. * @module_name: (in) (nullable): An optional module name to override the * document on disk. Mostly useful in cases where the name is being * auto-detected from git. * @module_stream: (in) (nullable): An optional module stream name to override * the document on disk. Mostly useful in cases where the name is being * auto-detected from git. * @error: (out): A #GError containing additional information if this function * fails in a way that prevents program continuation. * * Returns: @MODULEMD_TYPE_MODULE_STREAM_V2, @MODULEMD_TYPE_PACKAGER_V3, or * @G_TYPE_INVALID. Returns the matching GObject through the @object parameter. * If the return value is @G_TYPE_INVALID, returns the reason as @error. * * Since: 2.11 */ GType modulemd_read_packager_string_ext (const gchar *yaml_string, GObject **object, const gchar *module_name, const gchar *module_stream, GError **error); G_END_DECLS fedora-modularity-libmodulemd-357799c/modulemd/include/private/000077500000000000000000000000001502446517500246445ustar00rootroot00000000000000fedora-modularity-libmodulemd-357799c/modulemd/include/private/gi-binding-renames.h000066400000000000000000000160361502446517500304620ustar00rootroot00000000000000/* * This file is part of libmodulemd * Copyright (C) 2018-2020 Red Hat, Inc. * * Fedora-License-Identifier: MIT * SPDX-2.0-License-Identifier: MIT * SPDX-3.0-License-Identifier: MIT * * This program is free software. * For more information on the license, see COPYING. * For more information on free software, see . */ /* * This file contains empty "target" functions for renames. * This is required because gobject-introspection requires a defined target for * any renames, but they don't have to be implemented. */ #pragma once #include G_BEGIN_DECLS /** * modulemd_buildopts_get_arches: (skip) */ GStrv modulemd_buildopts_get_arches (ModulemdBuildopts *self); /** * modulemd_buildopts_get_rpm_whitelist: (skip) */ GStrv modulemd_buildopts_get_rpm_whitelist (ModulemdBuildopts *self); /** * modulemd_component_get_buildafter: (skip) */ GStrv modulemd_component_get_buildafter (ModulemdComponent *self); /** * modulemd_component_rpm_get_arches: (skip) */ GStrv modulemd_component_rpm_get_arches (ModulemdComponentRpm *self); /** * modulemd_component_rpm_get_multilib_arches: (skip) */ GStrv modulemd_component_rpm_get_multilib_arches (ModulemdComponentRpm *self); /** * modulemd_defaults_v1_get_streams_with_default_profiles: (skip) */ GStrv modulemd_defaults_v1_get_streams_with_default_profiles ( ModulemdDefaultsV1 *self, const gchar *intent); /** * modulemd_defaults_v1_get_default_profiles_for_stream: (skip) */ GStrv modulemd_defaults_v1_get_default_profiles_for_stream (ModulemdDefaultsV1 *self, const gchar *stream_name, const gchar *intent); /** * modulemd_dependencies_get_buildtime_modules: (skip) */ GStrv modulemd_dependencies_get_buildtime_modules (ModulemdDependencies *self); /** * modulemd_dependencies_get_buildtime_streams: (skip) */ GStrv modulemd_dependencies_get_buildtime_streams (ModulemdDependencies *self, const gchar *module); /** * modulemd_dependencies_get_runtime_modules: (skip) */ GStrv modulemd_dependencies_get_runtime_modules (ModulemdDependencies *self); /** * modulemd_dependencies_get_runtime_streams: (skip) */ GStrv modulemd_dependencies_get_runtime_streams (ModulemdDependencies *self, const gchar *module); /** * modulemd_module_get_stream_names: (skip) */ GStrv modulemd_module_get_stream_names (ModulemdModule *self); /** * modulemd_module_get_streams_by_stream_name: (skip) */ GPtrArray * modulemd_module_get_streams_by_stream_name (ModulemdModule *self, const gchar *stream_name); /** * modulemd_module_stream_get_nsvc: (skip) */ gchar * modulemd_module_stream_get_nsvc (ModulemdModuleStream *self); /** * modulemd_module_stream_get_NSVCA: (skip) */ gchar * modulemd_module_stream_get_NSVCA (ModulemdModuleStream *self); /** * modulemd_module_stream_v1_get_module_component_names: (skip) */ GStrv modulemd_module_stream_v1_get_module_component_names ( ModulemdModuleStreamV1 *self); /** * modulemd_module_stream_v1_get_rpm_component_names: (skip) */ GStrv modulemd_module_stream_v1_get_rpm_component_names ( ModulemdModuleStreamV1 *self); /** * modulemd_module_stream_v1_get_content_licenses: (skip) */ GStrv modulemd_module_stream_v1_get_content_licenses (ModulemdModuleStreamV1 *self); /** * modulemd_module_stream_v1_get_module_licenses: (skip) */ GStrv modulemd_module_stream_v1_get_module_licenses (ModulemdModuleStreamV1 *self); /** * modulemd_module_stream_v1_get_profile_names: (skip) */ GStrv modulemd_module_stream_v1_get_profile_names (ModulemdModuleStreamV1 *self); /** * modulemd_module_stream_v1_get_rpm_api: (skip) */ GStrv modulemd_module_stream_v1_get_rpm_api (ModulemdModuleStreamV1 *self); /** * modulemd_module_stream_v1_get_rpm_artifacts: (skip) */ GStrv modulemd_module_stream_v1_get_rpm_artifacts (ModulemdModuleStreamV1 *self); /** * modulemd_module_stream_v1_get_rpm_filters: (skip) */ GStrv modulemd_module_stream_v1_get_rpm_filters (ModulemdModuleStreamV1 *self); /** * modulemd_module_stream_v1_get_servicelevel_names: (skip) */ GStrv modulemd_module_stream_v1_get_servicelevel_names ( ModulemdModuleStreamV1 *self); /** * modulemd_module_stream_v1_get_buildtime_modules: (skip) */ GStrv modulemd_module_stream_v1_get_buildtime_modules (ModulemdModuleStreamV1 *self); /** * modulemd_module_stream_v1_get_runtime_modules: (skip) */ GStrv modulemd_module_stream_v1_get_runtime_modules (ModulemdModuleStreamV1 *self); /** * modulemd_module_stream_v2_get_module_component_names: (skip) */ GStrv modulemd_module_stream_v2_get_module_component_names ( ModulemdModuleStreamV2 *self); /** * modulemd_module_stream_v2_get_rpm_component_names: (skip) */ GStrv modulemd_module_stream_v2_get_rpm_component_names ( ModulemdModuleStreamV2 *self); /** * modulemd_module_stream_v2_get_content_licenses: (skip) */ GStrv modulemd_module_stream_v2_get_content_licenses (ModulemdModuleStreamV2 *self); /** * modulemd_module_stream_v2_get_module_licenses: (skip) */ GStrv modulemd_module_stream_v2_get_module_licenses (ModulemdModuleStreamV2 *self); /** * modulemd_module_stream_v2_get_profile_names: (skip) */ GStrv modulemd_module_stream_v2_get_profile_names (ModulemdModuleStreamV2 *self); /** * modulemd_module_stream_v2_get_rpm_api: (skip) */ GStrv modulemd_module_stream_v2_get_rpm_api (ModulemdModuleStreamV2 *self); /** * modulemd_module_stream_v2_get_rpm_artifacts: (skip) */ GStrv modulemd_module_stream_v2_get_rpm_artifacts (ModulemdModuleStreamV2 *self); /** * modulemd_module_stream_v2_get_rpm_filters: (skip) */ GStrv modulemd_module_stream_v2_get_rpm_filters (ModulemdModuleStreamV2 *self); /** * modulemd_module_stream_v2_get_servicelevel_names: (skip) */ GStrv modulemd_module_stream_v2_get_servicelevel_names ( ModulemdModuleStreamV2 *self); /** * modulemd_profile_get_rpms: (skip) */ GStrv modulemd_profile_get_rpms (ModulemdProfile *self); /** * modulemd_translation_entry_get_profiles: (skip) */ GStrv modulemd_translation_entry_get_profiles (ModulemdTranslationEntry *self); /** * modulemd_translation_get_locales: (skip) */ GStrv modulemd_translation_get_locales (ModulemdTranslation *self); /** * modulemd_module_index_get_module_names: (skip) */ GStrv modulemd_module_index_get_module_names (ModulemdModuleIndex *self); /** * modulemd_module_index_get_default_streams: (skip) */ GHashTable * modulemd_module_index_get_default_streams (ModulemdModuleIndex *self, const gchar *intent); /** * modulemd_rpm_map_entry_get_nevra: (skip) */ gchar * modulemd_rpm_map_entry_get_nevra (ModulemdRpmMapEntry *self); /** * modulemd_packager_v3_get_module_component_names: (skip) */ GStrv modulemd_packager_v3_get_module_component_names (ModulemdPackagerV3 *self); /** * modulemd_packager_v3_get_rpm_component_names: (skip) */ GStrv modulemd_packager_v3_get_rpm_component_names (ModulemdPackagerV3 *self); G_END_DECLS fedora-modularity-libmodulemd-357799c/modulemd/include/private/glib-extensions.h000066400000000000000000000027451502446517500301370ustar00rootroot00000000000000/* * This file is part of libmodulemd * Copyright (C) 2017-2018 Stephen Gallagher * * Fedora-License-Identifier: MIT * SPDX-2.0-License-Identifier: MIT * SPDX-3.0-License-Identifier: MIT * * This program is free software. * For more information on the license, see COPYING. * For more information on free software, see . */ #pragma once #include #include #include "config.h" /* GDate autoptr cleanup was finally added in GLib 2.63.3. */ #ifndef HAVE_GDATE_AUTOPTR G_DEFINE_AUTOPTR_CLEANUP_FUNC (GDate, g_date_free) #endif #ifndef HAVE_EXTEND_AND_STEAL void g_ptr_array_extend (GPtrArray *array_to_extend, GPtrArray *array, GCopyFunc func, gpointer user_data); /* * g_ptr_array_extend_and_steal: * @array_to_extend: (transfer none): a #GPtrArray. * @array: (transfer container): a #GPtrArray to add to the end of * @array_to_extend. * * Adds all the pointers in @array to the end of @array_to_extend, transferring * ownership of each element from @array to @array_to_extend and modifying * @array_to_extend in-place. @array is then freed. * * As with g_ptr_array_free(), @array will be destroyed if its reference count * is 1. If its reference count is higher, it will be decremented and the * length of @array set to zero. * * Since: glib 2.62 */ void g_ptr_array_extend_and_steal (GPtrArray *array_to_extend, GPtrArray *array); #endif fedora-modularity-libmodulemd-357799c/modulemd/include/private/modulemd-build-config-private.h000066400000000000000000000041111502446517500326300ustar00rootroot00000000000000/* * This file is part of libmodulemd * Copyright (C) 2020 Red Hat, Inc. * * Fedora-License-Identifier: MIT * SPDX-2.0-License-Identifier: MIT * SPDX-3.0-License-Identifier: MIT * * This program is free software. * For more information on the license, see COPYING. * For more information on free software, see . */ #pragma once #include #include "modulemd-2.0/modulemd-build-config.h" #include "modulemd-2.0/modulemd-buildopts.h" #include "private/modulemd-yaml.h" G_BEGIN_DECLS /** * SECTION: modulemd-build-config * @title: Modulemd.BuildConfig * @stability: private * @short_description: Internal representation of a module build configuration */ /** * modulemd_build_config_parse_yaml: * @parser: A #yaml_parser_t positioned at the start of a configuration * entry of a #ModulemdPackagerV3 YAML document. * @strict: Whether to ignore unknown keys in the YAML * @error: (out): A #GError explaining any failure to complete the parsing * * Returns: (transfer full): A newly-constructed #ModulemdBuildConfig object * populated from the data in the provided YAML. Returns NULL and sets @error * appropriately if the document couldn't be parsed successfully or failed * validation. * * Since: 2.11 */ ModulemdBuildConfig * modulemd_build_config_parse_yaml (yaml_parser_t *parser, gboolean strict, GError **error); /** * modulemd_build_config_emit_yaml: * @self: This #ModulemdBuildConfig object. * @emitter: (inout): A libyaml emitter object positioned where a BuidConfig * belongs in the YAML document. * @error: (out): A #GError that will return the reason for an emission or * validation error. * * Returns: TRUE if the BuildConfig was emitted successfully. FALSE and sets * @error appropriately if the YAML could not be emitted. * * Since: 2.11 */ gboolean modulemd_build_config_emit_yaml (ModulemdBuildConfig *self, yaml_emitter_t *emitter, GError **error); G_END_DECLS fedora-modularity-libmodulemd-357799c/modulemd/include/private/modulemd-buildopts-private.h000066400000000000000000000046131502446517500323020ustar00rootroot00000000000000/* * This file is part of libmodulemd * Copyright (C) 2018 Red Hat, Inc. * * Fedora-License-Identifier: MIT * SPDX-2.0-License-Identifier: MIT * SPDX-3.0-License-Identifier: MIT * * This program is free software. * For more information on the license, see COPYING. * For more information on free software, see . */ #pragma once #include #include #include "modulemd-buildopts.h" /** * SECTION: modulemd-buildopts-private * @title: Modulemd.Buildopts (Private) * @stability: Private * @short_description: #ModulemdBuildopts methods that should be used only * by internal consumers. */ /** * modulemd_buildopts_parse_yaml: * @parser: (inout): A libyaml parser object positioned at the beginning of a * Buildopts entry in the YAML document. * @strict: (in): Whether the parser should return failure if it encounters an * unknown mapping key or if it should ignore it. * @error: (out): A #GError that will return the reason for a parsing or * validation error. * * Returns: (transfer full): A newly-allocated #ModulemdBuildopts object * read from the YAML. NULL if a parse or validation error occurred and sets * @error appropriately. * * Since: 2.0 */ ModulemdBuildopts * modulemd_buildopts_parse_yaml (yaml_parser_t *parser, gboolean strict, GError **error); /** * modulemd_buildopts_emit_yaml: * @self: This #ModulemdBuildopts object. * @emitter: (inout): A libyaml emitter object positioned where a Buildopts * belongs in the YAML document. * @error: (out): A #GError that will return the reason for an emission or * validation error. * * Returns: TRUE if the buildopts was emitted successfully. FALSE and sets * @error appropriately if the YAML could not be emitted. * * Since: 2.0 */ gboolean modulemd_buildopts_emit_yaml (ModulemdBuildopts *self, yaml_emitter_t *emitter, GError **error); /** * modulemd_buildopts_compare: * @self_1: (in): A #ModulemdBuildopts object. * @self_2: (in): A #ModulemdBuildopts object. * * Returns: Less than zero if @self_1 sorts less than @self_2, zero for equal, * greater than zero if @self_1 is greater than @self_2. * * Since: 2.10 */ gint modulemd_buildopts_compare (ModulemdBuildopts *self_1, ModulemdBuildopts *self_2); fedora-modularity-libmodulemd-357799c/modulemd/include/private/modulemd-component-module-private.h000066400000000000000000000042721502446517500335630ustar00rootroot00000000000000/* * This file is part of libmodulemd * Copyright (C) 2018 Red Hat, Inc. * * Fedora-License-Identifier: MIT * SPDX-2.0-License-Identifier: MIT * SPDX-3.0-License-Identifier: MIT * * This program is free software. * For more information on the license, see COPYING. * For more information on free software, see . */ #pragma once #include #include #include "modulemd-component-module.h" /** * SECTION: modulemd-component-module-private * @title: Modulemd.ComponentModule (Private) * @stability: Private * @short_description: #ModulemdComponentModule methods that should be used only * by internal consumers. */ /** * modulemd_component_module_parse_yaml: * @parser: (inout): A libyaml parser object positioned at the beginning of a * ComponentModule's mapping entry in the YAML document. * @name: (in): A string with the name of the component. * @strict: (in): Whether the parser should return failure if it encounters an * unknown mapping key or if it should ignore it. * @error: (out): A #GError that will return the reason for parsing error. * * Returns: (transfer full): A newly-allocated #ModulemdComponentModule object * read from the YAML. NULL if a parse error occurred and sets @error * appropriately. * * Since: 2.0 */ ModulemdComponentModule * modulemd_component_module_parse_yaml (yaml_parser_t *parser, const gchar *name, gboolean strict, GError **error); /** * modulemd_component_module_emit_yaml: * @self: This #ModulemdComponentModule object. * @emitter: (inout): A libyaml emitter object positioned where Module Component * belongs in the YAML document. * @error: (out): A #GError that will return the reason for an emission error. * * Returns: TRUE if the module component was emitted successfully. FALSE and sets * @error appropriately if the YAML could not be emitted. * * Since: 2.0 */ gboolean modulemd_component_module_emit_yaml (ModulemdComponentModule *self, yaml_emitter_t *emitter, GError **error); fedora-modularity-libmodulemd-357799c/modulemd/include/private/modulemd-component-private.h000066400000000000000000000077531502446517500323070ustar00rootroot00000000000000/* * This file is part of libmodulemd * Copyright (C) 2018 Red Hat, Inc. * * Fedora-License-Identifier: MIT * SPDX-2.0-License-Identifier: MIT * SPDX-3.0-License-Identifier: MIT * * This program is free software. * For more information on the license, see COPYING. * For more information on free software, see . */ #pragma once #include #include #include "modulemd-component.h" /** * SECTION: modulemd-component-private * @title: Modulemd.Component (Private) * @stability: Private * @short_description: #ModulemdComponent methods that should be used only * by internal consumers. */ /** * modulemd_component_parse_buildafter: * @self: This #ModulemdComponent object. * @parser: (inout): A libyaml parser object positioned just after the * "buildafter" key in a Component section of a YAML document. * @error: (out): A #GError that will return the reason for a parse failure. * * Returns: TRUE if the buildafter list could be parsed successfully. * * Since: 2.2 */ gboolean modulemd_component_parse_buildafter (ModulemdComponent *self, yaml_parser_t *parser, GError **error); /** * modulemd_component_parse_buildonly: * @self: This #ModulemdComponent object. * @parser: (inout): A libyaml parser object positioned just after the * "buildonly" key in a Component section of a YAML document. * @error: (out): A #GError that will return the reason for a parse failure. * * Returns: TRUE if the buildonly list could be parsed successfully. * * Since: 2.2 */ gboolean modulemd_component_parse_buildonly (ModulemdComponent *self, yaml_parser_t *parser, GError **error); /** * modulemd_component_has_buildafter: * @self: This #ModulemdComponent object. * * Returns: TRUE if one or more buildafter entries have been added to this * component. * * Since: 2.2 */ gboolean modulemd_component_has_buildafter (ModulemdComponent *self); /** * modulemd_component_get_buildafter_internal: * @self: This #ModulemdComponent object. * * Returns: The internal hash table representing the set of buildafter * dependencies. * * Since: 2.2 */ GHashTable * modulemd_component_get_buildafter_internal (ModulemdComponent *self); /** * modulemd_component_emit_yaml_start: * @self: This #ModulemdComponent object. * @emitter: (inout): A libyaml emitter object positioned where Component start * belongs in the YAML document. * @error: (out): A #GError that will return the reason for an emission error. * * Returns: TRUE if the component header was emitted successfully. FALSE and sets * @error appropriately if the YAML could not be emitted. * * Since: 2.0 */ gboolean modulemd_component_emit_yaml_start (ModulemdComponent *self, yaml_emitter_t *emitter, GError **error); /** * modulemd_component_emit_yaml_build_common: * @self: This #ModulemdComponent object. * @emitter: (inout): A libyaml emitter object positioned where a Component's * buildorder, buildafter and/or buildonly item(s) should appear in the YAML * document. * @error: (out): A #GError that will return the reason for an emission error. * * Returns: TRUE if the component buildorder, buildafter and/or buildonly * item(s) were emitted successfully. FALSE and sets @error appropriately if * the YAML could not be emitted. * * Since: 2.2 */ gboolean modulemd_component_emit_yaml_build_common (ModulemdComponent *self, yaml_emitter_t *emitter, GError **error); /** * modulemd_component_equals_wrapper: * @a: A void pointer * @b: A void pointer * * Returns: TRUE, if both pointers are pointers to #ModulemdComponent objects and both objects are equal. FALSE, otherwise. * * Since: 2.5 */ gboolean modulemd_component_equals_wrapper (const void *a, const void *b); fedora-modularity-libmodulemd-357799c/modulemd/include/private/modulemd-component-rpm-private.h000066400000000000000000000041761502446517500330770ustar00rootroot00000000000000/* * This file is part of libmodulemd * Copyright (C) 2018 Red Hat, Inc. * * Fedora-License-Identifier: MIT * SPDX-2.0-License-Identifier: MIT * SPDX-3.0-License-Identifier: MIT * * This program is free software. * For more information on the license, see COPYING. * For more information on free software, see . */ #pragma once #include #include #include "modulemd-component-rpm.h" /** * SECTION: modulemd-component-rpm-private * @title: Modulemd.ComponentRpm (Private) * @stability: Private * @short_description: #ModulemdComponentRpm methods that should be used only * by internal consumers. */ /** * modulemd_component_rpm_parse_yaml: * @parser: (inout): A libyaml parser object positioned at the beginning of a * ComponentRpm's mapping entry in the YAML document. * @name: (in): A string with the name of the component. * @strict: (in): Whether the parser should return failure if it encounters an * unknown mapping key or if it should ignore it. * @error: (out): A #GError that will return the reason for parsing error. * * Returns: (transfer full): A newly-allocated #ModulemdComponentRpm object * read from the YAML. NULL if a parse error occurred and sets @error * appropriately. * * Since: 2.0 */ ModulemdComponentRpm * modulemd_component_rpm_parse_yaml (yaml_parser_t *parser, const gchar *name, gboolean strict, GError **error); /** * modulemd_component_rpm_emit_yaml: * @self: This #ModulemdComponentRpm object. * @emitter: (inout): A libyaml emitter object positioned where Rpm Component * belongs in the YAML document. * @error: (out): A #GError that will return the reason for an emission error. * * Returns: TRUE if the rpm component was emitted successfully. FALSE and sets * @error appropriately if the YAML could not be emitted. * * Since: 2.0 */ gboolean modulemd_component_rpm_emit_yaml (ModulemdComponentRpm *self, yaml_emitter_t *emitter, GError **error); fedora-modularity-libmodulemd-357799c/modulemd/include/private/modulemd-compression-private.h000066400000000000000000000057401502446517500326400ustar00rootroot00000000000000/* * This file is part of libmodulemd * Copyright (C) 2018 Red Hat, Inc. * * Fedora-License-Identifier: MIT * SPDX-2.0-License-Identifier: MIT * SPDX-3.0-License-Identifier: MIT * * This program is free software. * For more information on the license, see COPYING. * For more information on free software, see . */ #pragma once #include #include "config.h" #include "modulemd-compression.h" #ifdef HAVE_RPMIO #include #endif /** * SECTION: modulemd-compression-private * @title: Modulemd Compression Helpers (Private) * @stability: Private * @short_description: Internal utility functions for working with compressed * files. */ #ifdef HAVE_RPMIO /** * mmd_Fclose: * @fd: (in): A FD_t from rpmio.h to be closed * * Wrapper for rpmio's Fclose() function to use with * #G_DEFINE_AUTO_CLEANUP_FREE_FUNC() * * Since: 2.8 */ void mmd_Fclose (FD_t fd); G_DEFINE_AUTO_CLEANUP_FREE_FUNC (FD_t, mmd_Fclose, NULL); #endif /** * modulemd_detect_compression: * @filename: (in): The original filename that matches @fd. * @fd: (in): An open file descriptor pointing at a real file. * @error: (out): A #GError containing the reason this function failed. * * Returns: The #ModulemdCompressionTypeEnum detected from this file * descriptor. In the event of an error, returns * #MODULEMD_COMPRESSION_TYPE_DETECTION_FAILED and sets @error * appropriately. Returns #MODULEMD_COMPRESSION_TYPE_UNKNOWN_COMPRESSION if * all detection methods complete but the type is still indeterminate. * * Since: 2.8 */ ModulemdCompressionTypeEnum modulemd_detect_compression (const gchar *filename, int fd, GError **error); /** * modulemd_compression_suffix: * @comtype: (in): A #ModulemdCompressionTypeEnum. * * Returns: (transfer none): A static string representing the filename suffix * that a file of this compression type should have. * * Since: 2.8 */ const gchar * modulemd_compression_suffix (ModulemdCompressionTypeEnum comtype); /** * modulemd_get_rpmio_fmode: * @mode: (in): A mode argument that will be passed to `fopen(3)`. * @comtype: (in): A #ModulemdCompressionTypeEnum. * * Returns: (transfer full): A string suitable for passing to rpmio's * `Fopen()` function. NULL if @mode is NULL or the @comtype is invalid. * * Since: 2.8 */ gchar * modulemd_get_rpmio_fmode (const gchar *mode, ModulemdCompressionTypeEnum comtype); /** * compressed_stream_read_fn: * @data: (inout): A private pointer to the data being read. * @buffer: (out): The buffer to write the data from the source. * @size: (in): The size of the buffer. * @size_read: (out): The actual number of bytes read from the source. * * A #ModulemdReadHandler that uses rpmio's `Fread()` function to handle * compressed files. * * Since: 2.8 */ gint compressed_stream_read_fn (void *data, unsigned char *buffer, size_t size, size_t *size_read); fedora-modularity-libmodulemd-357799c/modulemd/include/private/modulemd-defaults-private.h000066400000000000000000000037301502446517500321030ustar00rootroot00000000000000/* * This file is part of libmodulemd * Copyright (C) 2017-2018 Stephen Gallagher * * Fedora-License-Identifier: MIT * SPDX-2.0-License-Identifier: MIT * SPDX-3.0-License-Identifier: MIT * * This program is free software. * For more information on the license, see COPYING. * For more information on free software, see . */ #pragma once #include G_BEGIN_DECLS /** * SECTION: modulemd-defaults-private * @title: Modulemd.Defaults (Private) * @stability: private * @short_description: #ModulemdDefaults methods that should only be used by * internal consumers. */ #define DEFAULT_PLACEHOLDER "__DEFAULT_PLACEHOLDER__" /** * modulemd_defaults_set_module_name: * @self: (in): This #ModulemdDefaults object. * @module_name: The module name this object represents. * * Since: 2.0 */ void modulemd_defaults_set_module_name (ModulemdDefaults *self, const gchar *module_name); /** * modulemd_defaults_merge: * @from: (in): A #ModulemdDefaults object to merge from. * @into: (in): A #ModulemdDefaults object being merged into. * @strict_default_streams: (in): Whether a stream conflict should throw an * error or just unset the default stream. * @error: (out): A #GError containing the reason for an unresolvable merge * conflict. * * Performs a merge of two #ModulemdDefaults objects. See the documentation for * #ModulemdModuleIndexMerger for details on the merge algorithm used. * * Returns: (transfer full): A newly-allocated #ModulemdDefaults object * containing the merged values of @from and @into. If this function encounters * an unresolvable merge conflict, it will return NULL and set @error * appropriately. * * Since: 2.0 */ ModulemdDefaults * modulemd_defaults_merge (ModulemdDefaults *from, ModulemdDefaults *into, gboolean strict_default_streams, GError **error); G_END_DECLS fedora-modularity-libmodulemd-357799c/modulemd/include/private/modulemd-defaults-v1-private.h000066400000000000000000000063261502446517500324330ustar00rootroot00000000000000/* * This file is part of libmodulemd * Copyright (C) 2017-2018 Stephen Gallagher * * Fedora-License-Identifier: MIT * SPDX-2.0-License-Identifier: MIT * SPDX-3.0-License-Identifier: MIT * * This program is free software. * For more information on the license, see COPYING. * For more information on free software, see . */ #pragma once #include "modulemd-defaults-v1.h" #include "modulemd-subdocument-info.h" #include #include G_BEGIN_DECLS /** * SECTION: modulemd-defaults-v1-private * @title: Modulemd.DefaultsV1 (Private) * @stability: private * @short_description: #ModulemdDefaults methods that should only be used by * internal consumers. */ #define DEFAULT_MERGE_CONFLICT "__merge_conflict__" /** * modulemd_defaults_v1_parse_yaml: * @subdoc: (in): A #ModulemdSubdocumentInfo representing a defaults document * of metadata version 1. * @strict: (in): Whether the parser should return failure if it encounters an * unknown mapping key or if it should ignore it. * @error: (out): A #GError that will return the reason for a parsing or * validation error. * * Returns: (transfer full): A newly-allocated #ModulemdDefaultsV1 object read * from the YAML. NULL if a parse or validation error occurred and sets @error * appropriately. * * Since: 2.0 */ ModulemdDefaultsV1 * modulemd_defaults_v1_parse_yaml (ModulemdSubdocumentInfo *subdoc, gboolean strict, GError **error); /** * modulemd_defaults_v1_emit_yaml: * @self: This #ModulemdDefaultsV1 object. * @emitter: (inout): A libyaml emitter object positioned where a Defaults (v1) * data section belongs in the YAML document. * @error: (out): A #GError that will return the reason for an emission or * validation error. * * Returns: TRUE if the #ModulemdDefaults was emitted successfully. FALSE and * sets @error appropriately if the YAML could not be emitted. * * Since: 2.0 */ gboolean modulemd_defaults_v1_emit_yaml (ModulemdDefaultsV1 *self, yaml_emitter_t *emitter, GError **error); /** * modulemd_defaults_v1_merge: * @from: (in): A #ModulemdDefaultsV1 object to merge from. * @into: (in): A #ModulemdDefaultsV1 object being merged into. * @strict_default_streams: (in): Whether a stream conflict should throw an * error or just unset the default stream. * @error: (out): A #GError containing the reason for an unresolvable merge * conflict. * * Performs a merge of two #ModulemdDefaultsV1 objects representing the * defaults for a single module name. See the documentation for * #ModulemdModuleIndexMerger for details on the merge algorithm used. * * Returns: (transfer full): A newly-allocated #ModulemdDefaultsV1 object * containing the merged values of @from and @into. If this function encounters * an unresolvable merge conflict, it will return NULL and set @error * appropriately. * * Since: 2.0 */ ModulemdDefaults * modulemd_defaults_v1_merge (ModulemdDefaultsV1 *from, ModulemdDefaultsV1 *into, gboolean strict_default_streams, GError **error); G_END_DECLS fedora-modularity-libmodulemd-357799c/modulemd/include/private/modulemd-dependencies-private.h000066400000000000000000000074631502446517500327310ustar00rootroot00000000000000/* * This file is part of libmodulemd * Copyright (C) 2018 Red Hat, Inc. * * Fedora-License-Identifier: MIT * SPDX-2.0-License-Identifier: MIT * SPDX-3.0-License-Identifier: MIT * * This program is free software. * For more information on the license, see COPYING. * For more information on free software, see . */ #pragma once #include #include #include "modulemd-dependencies.h" /** * SECTION: modulemd-dependencies-private * @title: Modulemd.Dependencies (Private) * @stability: Private * @short_description: #ModulemdDependencies methods that should be used only * by internal consumers. */ /** * modulemd_dependencies_parse_yaml: * @parser: (inout): A libyaml parser object positioned at a sequence entry for * a Dependencies object. * @strict: (in): Whether the parser should return failure if it encounters an * unknown mapping key or if it should ignore it. * @error: (out): A #GError that will return the reason for a parsing or * validation error. * * Returns: (transfer full): A newly-allocated #ModulemdDependencies object * read from the YAML. NULL if a parse or validation error occurred and sets * @error appropriately. * * Since: 2.0 */ ModulemdDependencies * modulemd_dependencies_parse_yaml (yaml_parser_t *parser, gboolean strict, GError **error); /** * modulemd_dependencies_emit_yaml: * @self: This #ModulemdDependencies object. * @emitter: (inout): A libyaml emitter object positioned where a dependencies instance * belongs in the YAML document. * @error: (out): A #GError that will return the reason for an emission or * validation error. * * Returns: TRUE if the dependencies object was emitted successfully. FALSE and sets * @error appropriately if the YAML could not be emitted. * * Since: 2.0 */ gboolean modulemd_dependencies_emit_yaml (ModulemdDependencies *self, yaml_emitter_t *emitter, GError **error); /** * modulemd_dependencies_validate: * @self: This #ModulemdDependencies object. * @error: (out): A #GError containing the reason the object failed validation. * NULL if the validation passed. * * Returns: TRUE if validation passed. FALSE and sets @error if failed. * * This method runs a sanity check that the runtime (requires) and buildtime * (buildrequires) dependencies are internally consistent. * * Since: 2.0 */ gboolean modulemd_dependencies_validate (ModulemdDependencies *self, GError **error); /** * modulemd_dependencies_requires_module_and_stream: * @self: This #ModulemdDependencies object. * @module_name: (in): The name of the module to be checked. * @stream_name: (in): The name of the stream to be checked. * * Returns: TRUE if the specified runtime dependency is present. FALSE if not. * * This method checks if the runtime dependencies for this object include the * specified module stream. * * Since: 2.2 */ gboolean modulemd_dependencies_requires_module_and_stream (ModulemdDependencies *self, const gchar *module_name, const gchar *stream_name); /** * modulemd_dependencies_buildrequires_module_and_stream: * @self: This #ModulemdDependencies object. * @module_name: (in): The name of the module to be checked. * @stream_name: (in): The name of the stream to be checked. * * Returns: TRUE if the specified buildtime dependency is present. FALSE if not. * * This method checks if the buildtime dependencies for this object include the * specified module stream. * * Since: 2.2 */ gboolean modulemd_dependencies_buildrequires_module_and_stream ( ModulemdDependencies *self, const gchar *module_name, const gchar *stream_name); fedora-modularity-libmodulemd-357799c/modulemd/include/private/modulemd-module-index-private.h000066400000000000000000000121751502446517500326710ustar00rootroot00000000000000/* * This file is part of libmodulemd * Copyright (C) 2018 Red Hat, Inc. * * Fedora-License-Identifier: MIT * SPDX-2.0-License-Identifier: MIT * SPDX-3.0-License-Identifier: MIT * * This program is free software. * For more information on the license, see COPYING. * For more information on free software, see . */ #pragma once #include "modulemd-module-index.h" #include #include G_BEGIN_DECLS /** * SECTION: modulemd-module-index-private * @title: Modulemd.ModuleIndex (Private) * @stability: Private * @short_description: #ModulemdModuleIndex methods that should be used only * by internal consumers. */ /** * modulemd_module_index_update_from_file_ext: * @self: This #ModulemdModuleIndex object. * @yaml_file: (in): A YAML file containing the module metadata and other * related information such as default streams. * @strict: (in): Whether the parser should return failure if it encounters an * unknown mapping key or if it should ignore it. * @autogen_module_name: (in): Whether the parser should automatically generate * a module name and stream name if they are not provided by the file being read * in. This is intended mainly for applications interacting with modulemd docs * that are build input. * @failures: (out) (element-type ModulemdSubdocumentInfo) (transfer container): * An array containing any subdocuments from the YAML file that failed to parse. * See #ModulemdSubdocumentInfo for more details. * @error: (out): A #GError containing additional information if this function * fails in a way that prevents program continuation. * * Returns: TRUE if the update was successful. Returns FALSE and sets @failures * appropriately if any of the YAML subdocuments were invalid or sets @error if * there was a fatal parse error. * * Since: 2.9 */ gboolean modulemd_module_index_update_from_file_ext (ModulemdModuleIndex *self, const gchar *yaml_file, gboolean strict, gboolean autogen_module_name, GPtrArray **failures, GError **error); /** * modulemd_module_index_update_from_parser: * @self: (in): This #ModulemdModuleIndex object. * @parser: (inout): An initialized YAML parser that has not yet processed any * events. * @strict: (in): Whether the parser should return failure if it encounters an * unknown mapping key or if it should ignore it. * @autogen_module_name: (in): When parsing a module stream that contains no * module name or stream name, whether to autogenerate one or not. This option * should be used only for validation tools such as modulemd-validator. Normal * public routines should always set this to FALSE. * @failures: (out) (element-type ModulemdSubdocumentInfo) (transfer container): * An array containing any subdocuments from the YAML file that failed to parse. * See #ModulemdSubdocumentInfo for more details. If the array is NULL, it will * be allocated by this function. If it is non-NULL, this function will append * to it. * @error: (out): A #GError containing additional information if this function * fails in a way that prevents program continuation. * * Returns: TRUE if the update was successful. Returns FALSE and sets failures * appropriately if any of the YAML subdocuments were invalid or sets @error if * there was a fatal parse error. * * Since: 2.0 */ gboolean modulemd_module_index_update_from_parser (ModulemdModuleIndex *self, yaml_parser_t *parser, gboolean strict, gboolean autogen_module_name, GPtrArray **failures, GError **error); /** * modulemd_module_index_merge: * @from: (in) (transfer none): The #ModulemdModuleIndex whose contents are * being merged in. * @into: (inout) (transfer none): The #ModulemdModuleIndex whose contents are * being merged updated by those from @from. * @override: (in): In the event that the contents cannot be merged, this * argument specifies whether the contents of @from will supersede those from * @into. For specifics of how this works, see the Description section for * #ModulemdModuleIndexMerger. * @strict_default_streams: (in): When merging #ModulemdDefaults, treat * conflicting stream defaults as an error if this is True. Otherwise, on a * conflict, the default stream will be unset. * @error: (out): If the merge fails, this will return a #GError explaining the * reason for it. * * Returns: TRUE if the two #ModulemdModuleIndex objects could be merged * without conflicts. FALSE and sets @error appropriately if the merge fails. * * Since: 2.0 */ gboolean modulemd_module_index_merge (ModulemdModuleIndex *from, ModulemdModuleIndex *into, gboolean override, gboolean strict_default_streams, GError **error); G_END_DECLS fedora-modularity-libmodulemd-357799c/modulemd/include/private/modulemd-module-private.h000066400000000000000000000141121502446517500315550ustar00rootroot00000000000000/* * This file is part of libmodulemd * Copyright (C) 2018 Red Hat, Inc. * * Fedora-License-Identifier: MIT * SPDX-2.0-License-Identifier: MIT * SPDX-3.0-License-Identifier: MIT * * This program is free software. * For more information on the license, see COPYING. * For more information on free software, see . */ #pragma once #include #include #include "modulemd-module.h" #include "modulemd-translation.h" #include "modulemd-obsoletes.h" G_BEGIN_DECLS /** * SECTION: modulemd-module-private * @title: Modulemd.Module (Private) * @stability: Private * @short_description: #ModulemdModule methods that should be used only * by internal consumers. */ /** * modulemd_module_new: * @module_name: (in) (not nullable): The name of the module. * * Returns: (transfer full): A newly-allocated #ModulemdModule object. * * Since: 2.0 */ ModulemdModule * modulemd_module_new (const gchar *module_name); /** * modulemd_module_set_defaults: * @self: (in): This #ModulemdModule object. * @defaults: (in) (nullable): A #ModulemdDefaults object whose copy to * associate with this #ModulemdModule. A module name in @defaults should * match a name in the @self module. Pass %NULL to unset the defaults. * @index_mdversion: (in): A minimal #ModulemdDefaultsVersionEnum version to * upgrade @defaults before adding them. * @error: (out): A #GError containing information about why this function * failed. * * This function takes a #ModulemdDefaults object, upgrades it to * @index_mdversion if its version is lower and adds it to the #ModulemdModule * object. If @defaults cannot be upgraded safely or the @defaults are not for @self * module, it will return an appropriate error. * * (A use case is upgrading defaults of modules in a #ModulemdModuleIndex to * the highest defaults version added so far in the #ModulemdModuleIndex.) * * Returns: The upgraded version of the defaults that were added. Or * %MD_DEFAULTS_VERSION_UNSET if @defaults was %NULL. Returns * %MD_DEFAULTS_VERSION_ERROR and sets @error if the defaults name didn't * match or the defaults object couldn't be upgraded successfully to * the @index_mdversion. * * Since: 2.0 */ ModulemdDefaultsVersionEnum modulemd_module_set_defaults (ModulemdModule *self, ModulemdDefaults *defaults, ModulemdDefaultsVersionEnum index_mdversion, GError **error); /** * modulemd_module_add_translation: * @self: This #ModulemdModule object. * @translation: (in): A #ModulemdTranslation object which is copied into the * #ModulemdModule object. * * Since: 2.0 */ void modulemd_module_add_translation (ModulemdModule *self, ModulemdTranslation *translation); /** * modulemd_module_get_translated_streams: * @self: This #ModulemdModule object. * * Returns: (transfer container): A list of streams for which translations have * been added, sorted by stream name. * * Since: 2.0 */ GPtrArray * modulemd_module_get_translated_streams (ModulemdModule *self); /** * modulemd_module_add_obsoletes: * @self: This #ModulemdModule object. * @obsoletes: (in): A #ModulemdObsoletes object which is copied into the * #ModulemdModule object. * * This function copies the @obsoletes object into @self. In addition if @obsoletes is * the newest active obsoletes for existing #ModulemdModuleStream in @self, the stream is * upgraded to at least version two and @obsoletes is associated with it. * * Since: 2.10 */ void modulemd_module_add_obsoletes (ModulemdModule *self, ModulemdObsoletes *obsoletes); /** * modulemd_module_add_stream: * @self: This #ModulemdModule object. * @stream: A #ModulemdModuleStream object to associate with this * #ModulemdModule. A stream added to a #ModulemdModule must have a module * name and stream name set on it or it will be rejected. If the module name * does not match this module, it will also be rejected. * @index_mdversion: (in): The #ModulemdModuleStreamVersionEnum stream_mdversion * of the #ModulemdModuleIndex to which @stream is being added. If the version * of @stream is less than @index_mdversion, an upgrade to this version will be * performed while adding @stream to @self. If @stream already has the same * version, it is just copied. When obsoletes is present for @stream it must be * set to at least version two. * @error: (out): A #GError containing information about why this function * failed. * * This function takes a stream object, upgrades it to index_mdversion if * needed (if the module contains active obsoletes for this @stream it is upgraded * to at least version two) and then adds it to the #ModulemdModule. If it cannot upgrade it * safely or the defaults are not for this module, it will return an * appropriate error. * * Returns: The mdversion of the stream that was added, which will be * @index_mdversion unless an error occurred. Returns * %MD_MODULESTREAM_VERSION_ERROR and sets @error if the module name didn't * match, the module and stream names were unset or the stream object couldn't * be upgraded successfully to the @index_mdversion. Returns * %MD_MODULESTREAM_VERSION_UNSET if @stream was NULL. * * Since: 2.0 */ ModulemdModuleStreamVersionEnum modulemd_module_add_stream (ModulemdModule *self, ModulemdModuleStream *stream, ModulemdModuleStreamVersionEnum index_mdversion, GError **error); /** * modulemd_module_upgrade_streams: * @self: This #ModulemdModule object. * @mdversion: The metadata version to upgrade to. * @error: (out): A #GError containing the reason a stream failed to upgrade. * * Returns: TRUE if all upgrades completed successfully. FALSE and sets @error * if an upgrade error occurs, including attempts to downgrade a stream. * * Since: 2.0 */ gboolean modulemd_module_upgrade_streams (ModulemdModule *self, ModulemdModuleStreamVersionEnum mdversion, GError **error); G_END_DECLS fedora-modularity-libmodulemd-357799c/modulemd/include/private/modulemd-module-stream-private.h000066400000000000000000000433621502446517500330570ustar00rootroot00000000000000/* * This file is part of libmodulemd * Copyright (C) 2017-2020 Stephen Gallagher * * Fedora-License-Identifier: MIT * SPDX-2.0-License-Identifier: MIT * SPDX-3.0-License-Identifier: MIT * * This program is free software. * For more information on the license, see COPYING. * For more information on free software, see . */ #pragma once #include "modulemd-module-index.h" #include "modulemd-module-stream.h" #include "modulemd-translation-entry.h" #include "modulemd-translation.h" #include "private/modulemd-module-stream-v1-private.h" #include "private/modulemd-module-stream-v2-private.h" #include "private/modulemd-yaml.h" #include G_BEGIN_DECLS /** * SECTION: modulemd-module-stream-private * @title: Modulemd.ModuleStream (Private) * @stability: private * @short_description: #ModulemdModuleStream methods that should only be used * by internal consumers. */ /** * modulemd_module_stream_set_module_name: * @self: (in): This #ModulemdModuleStream object. * @module_name: The module name this object represents. * * Since: 2.0 */ void modulemd_module_stream_set_module_name (ModulemdModuleStream *self, const gchar *module_name); /** * modulemd_module_stream_set_stream_name: * @self: (in): This #ModulemdModuleStream object. * @stream_name: The stream name this object represents. * * Since: 2.0 */ void modulemd_module_stream_set_stream_name (ModulemdModuleStream *self, const gchar *stream_name); /** * modulemd_module_stream_associate_translation: * @self: (in): This #ModulemdModuleStream object. * @translation: (in): The #ModulemdTranslation information to associate with * this object. * * Since: 2.0 */ void modulemd_module_stream_associate_translation ( ModulemdModuleStream *self, ModulemdTranslation *translation); /** * modulemd_module_stream_get_translation: * @self: (in): This #ModulemdModuleStream object. * * Returns: The #ModulemdTranslation information to associated with this object. * * Since: 2.0 */ ModulemdTranslation * modulemd_module_stream_get_translation (ModulemdModuleStream *self); /** * modulemd_module_stream_get_translation_entry: * @self: (in): This #ModulemdModuleStream object. * @locale: The locale of the translation to retrieve. * * Returns: (transfer none): The module stream #ModulemdTranslationEntry for * the requested locale, or NULL if the locale was unknown. * * Since: 2.0 */ ModulemdTranslationEntry * modulemd_module_stream_get_translation_entry (ModulemdModuleStream *self, const gchar *locale); /** * modulemd_module_stream_validate_components: * @components: (in): A #GHashTable of #ModulemdComponent objects. * @error: (out): A #GError that will return the reason for a validation error. * * Verifies that each of the #ModulemdComponent objects in @components * validates correctly via modulemd_component_validate(), verifies that any * buildafter components are also present in @components, and verifies that * buildorder and buildafter aren't mixed. * * Returns: TRUE if the component objects passed validation. FALSE and sets * @error appropriately if validation fails. * * Since: 2.0 */ gboolean modulemd_module_stream_validate_components (GHashTable *components, GError **error); /** * modulemd_module_stream_validate_component_rpm_arches: * @components: (in): A #GHashTable of #ModulemdComponent objects. * @module_arches: (in): A #GStrv list of arches for which to build the module. * @error: (out): A #GError that will return the reason for a validation error. * * Verifies that for each of the #ModulemdComponent RPM objects in @components, * any arches specified must be a subset of @module_arches. If @module_arches * is empty, all arches are allowed. * * Returns: TRUE if the component objects passed validation. FALSE and sets * @error appropriately if validation fails. * * Since: 2.9 */ gboolean modulemd_module_stream_validate_component_rpm_arches (GHashTable *components, GStrv module_arches, GError **error); /* Some macros used for copy operations */ /** * STREAM_UPGRADE_IF_SET_FULL: * @oldversion: The stream version of @src. Must be literal "v1" or "v2" * without the quotes. * @newversion: The stream version of @dest. Must be literal "v1" or "v2" * without the quotes. * @dest: (out): A #ModulemdModuleStreamV1 or #ModulemdModuleStreamV2 object * that is the destination to which @property is to be copied. * @src: (in): A #ModulemdModuleStreamV1 or #ModulemdModuleStreamV2 object that * is the source from which @property is to be copied. * @property: The name of the property to copy. Must be the literal property * name, in lower case, without quotes. * @locale...: (in): An optional locale that can be provided when @property has * possible translations. * * DIRECT USE OF THIS MACRO SHOULD BE AVOIDED. This is the internal * implementation for %STREAM_COPY_IF_SET, %STREAM_UPGRADE_IF_SET, * %STREAM_COPY_IF_SET_WITH_LOCALE, and %STREAM_UPGRADE_IF_SET_WITH_LOCALE * which should be used instead. * * This is a helper macro to simplify the coding when copying/upgrading * properties between #ModulemdModuleStreamV1 and #ModulemdModuleStreamV2 * objects. * * Does nothing if the @src @property is NULL. * * Since: 2.0 */ #define STREAM_UPGRADE_IF_SET_FULL( \ oldversion, newversion, dest, src, property, locale...) \ do \ { \ if (modulemd_module_stream_##oldversion##_get_##property ( \ src, ##locale) != NULL) \ modulemd_module_stream_##newversion##_set_##property ( \ dest, \ modulemd_module_stream_##oldversion##_get_##property (src, \ ##locale)); \ } \ while (0) /** * STREAM_COPY_IF_SET: * @version: The stream version being copied. Must be literal "v1" or "v2" * without the quotes. * @dest: (out): A #ModulemdModuleStreamV1 or #ModulemdModuleStreamV2 object * that is the destination to which @property is to be copied. * @src: (in): A #ModulemdModuleStreamV1 or #ModulemdModuleStreamV2 object that * is the source from which @property is to be copied. * @property: The name of the property to copy. Must be the literal property * name, in lower case, without quotes. * * This is a convenience macro to simplify the coding when copying properties * between #ModulemdModuleStream objects when both @src and @dest are the same * version. * * Does nothing if the @src @property is NULL. * * Since: 2.0 */ #define STREAM_COPY_IF_SET(version, dest, src, property) \ STREAM_UPGRADE_IF_SET_FULL (version, version, dest, src, property) /** * STREAM_UPGRADE_IF_SET: * @oldversion: The stream version of @src. Must be literal "v1" or "v2" * without the quotes. * @newversion: The stream version of @dest. Must be literal "v1" or "v2" * without the quotes. * @dest: (out): A #ModulemdModuleStreamV1 or #ModulemdModuleStreamV2 object * that is the destination to which @property is to be copied. * @src: (in): A #ModulemdModuleStreamV1 or #ModulemdModuleStreamV2 object that * is the source from which @property is to be copied. * @property: The name of the property to copy. Must be the literal property * name, in lower case, without quotes. * * This is a convenience macro to simplify the coding when copying properties * between #ModulemdModuleStreamV1 and #ModulemdModuleStreamV2 objects when * @src and @dest are different versions. * * Does nothing if the @src @property is NULL. * * Since: 2.0 */ #define STREAM_UPGRADE_IF_SET(oldversion, newversion, dest, src, property) \ STREAM_UPGRADE_IF_SET_FULL (oldversion, newversion, dest, src, property) /** * STREAM_COPY_IF_SET_WITH_LOCALE: * @version: The stream version being copied. Must be literal "v1" or "v2" * without the quotes. * @dest: (out): A #ModulemdModuleStreamV1 or #ModulemdModuleStreamV2 object * that is the destination to which @property is to be copied. * @src: (in): A #ModulemdModuleStreamV1 or #ModulemdModuleStreamV2 object that * is the source from which @property is to be copied. * @property: The name of the property to copy. Must be the literal property * name, in lower case, without quotes. * * This is a convenience macro to simplify the coding when copying properties * between #ModulemdModuleStreamV1 and #ModulemdModuleStreamV2 objects when * both @src and @dest are the same version and @property has possible * translations. Only the untranslated (`"C"` locale) version of @property will * be copied. * * Does nothing if the @src @property is NULL. * * Since: 2.0 */ #define STREAM_COPY_IF_SET_WITH_LOCALE(version, dest, src, property) \ STREAM_UPGRADE_IF_SET_FULL (version, version, dest, src, property, "C") /** * STREAM_UPGRADE_IF_SET_WITH_LOCALE: * @oldversion: The stream version of @src. Must be literal "v1" or "v2" * without the quotes. * @newversion: The stream version of @dest. Must be literal "v1" or "v2" * without the quotes. * @dest: (out): A #ModulemdModuleStreamV1 or #ModulemdModuleStreamV2 object * that is the destination to which @property is to be copied. * @src: (in): A #ModulemdModuleStreamV1 or #ModulemdModuleStreamV2 object that * is the source from which @property is to be copied. * @property: The name of the property to copy. Must be the literal property * name, in lower case, without quotes. * * This is a convenience macro to simply the coding when copying properties * between #ModulemdModuleStreamV1 and #ModulemdModuleStreamV2 objects when * @src and @dest are different versions and @property has possible * translations. Only the untranslated (`"C"` locale) version of @property will * be copied. * * Does nothing if the @src @property is NULL. * * Since: 2.0 */ #define STREAM_UPGRADE_IF_SET_WITH_LOCALE( \ oldversion, newversion, dest, src, property) \ STREAM_UPGRADE_IF_SET_FULL (oldversion, newversion, dest, src, property, "C") /** * STREAM_REPLACE_HASHTABLE: * @version: The stream version being replaced. Must be literal "v1" or "v2" * without the quotes. * @dest: (out): A #ModulemdModuleStreamV1 or #ModulemdModuleStreamV2 object * that is the destination at which @property is being replaced. * @src: (in): A #ModulemdModuleStreamV1 or #ModulemdModuleStreamV2 object that * is the source from which @property is being replaced. * @property: The name of the #GHashTable property to replace. Must be the * literal property name, in lower case, without quotes. * * This is a convenience macro to simply the coding when replacing #GHashTable * properties of #ModulemdModuleStreamV1 and #ModulemdModuleStreamV2 objects * when both @src and @dest are the same version. * * Since: 2.0 */ #define STREAM_REPLACE_HASHTABLE(version, dest, src, property) \ do \ { \ modulemd_module_stream_##version##_replace_##property (dest, \ src->property); \ } \ while (0) /** * COPY_HASHTABLE_BY_VALUE_ADDER: * @dest: (out): A #ModulemdModuleStreamV1 or #ModulemdModuleStreamV2 object * that is the destination to which @property is to be copied. * @src: (in): A #ModulemdModuleStreamV1 or #ModulemdModuleStreamV2 object that * is the source from which @property is to be copied. * @property: The name of the #GHashTable property to copy. Must be the literal * property name, in lower case, without quotes. * @adder: (in): A pointer to a method of @dest that supports add-on property * values. * * This is a convenience macro to simply the coding when copying #GHashTable * properties between #ModulemdModuleStreamV1 and #ModulemdModuleStreamV2 * objects when the property is set by using add-on values. * * Since: 2.0 */ #define COPY_HASHTABLE_BY_VALUE_ADDER(dest, src, property, adder) \ do \ { \ GHashTableIter iter; \ gpointer value; \ g_hash_table_iter_init (&iter, src->property); \ while (g_hash_table_iter_next (&iter, NULL, &value)) \ { \ adder (dest, value); \ } \ } \ while (0) /** * modulemd_module_stream_emit_yaml_base: * @self: This #ModulemdModuleStream object. * @emitter: (inout): A libyaml emitter object positioned where a Module Stream * document belongs in the YAML document. * @error: (out): A #GError that will return the reason for an emission or * validation error. * * Emit the common non-version specific YAML components for the Module Stream * document. * * Returns: TRUE if the #ModulemdModuleStream components were emitted * successfully. FALSE and sets @error appropriately if the YAML could not be * emitted. * * Since: 2.0 */ gboolean modulemd_module_stream_emit_yaml_base (ModulemdModuleStream *self, yaml_emitter_t *emitter, GError **error); /** * modulemd_module_stream_includes_nevra: * @self: This #ModulemdModuleStream object. * @nevra_pattern: (not nullable): A [glob](https://www.mankier.com/3/glob) * pattern to match against the NEVRA strings of the rpm artifacts in @self. * * Returns: TRUE if this stream includes at least one RPM artifact that * matches @nevra_pattern. FALSE otherwise. * * Since: 2.9 */ gboolean modulemd_module_stream_includes_nevra (ModulemdModuleStream *self, const gchar *nevra_pattern); /** * modulemd_module_stream_set_autogen_module_name: * @self: (in): A pointer to a #ModulemdModuleStream object * @id: (in): An unsigned integer to be used as a unique identifier if a module * name is generated. * * If @self already has a module name set, this function does nothing. * Otherwise, a module name will be generated and set for @self. * * Since: 2.10 */ void modulemd_module_stream_set_autogen_module_name (ModulemdModuleStream *self, guint id); /** * modulemd_module_stream_set_autogen_stream_name: * @self: (in): A pointer to a #ModulemdModuleStream object * @id: (in): An unsigned integer to be used as a unique identifier if a stream * name is generated. * * If @self already has a stream name set, this function does nothing. * Otherwise, a stream name will be generated and set for @self. * * Since: 2.10 */ void modulemd_module_stream_set_autogen_stream_name (ModulemdModuleStream *self, guint id); /** * modulemd_module_stream_is_autogen_module_name: * @self: (in): A pointer to a #ModulemdModuleStream object * * Returns: TRUE if @self has a module name that matches the format used if * modulemd_module_stream_set_autogen_module_name() created the name. * Otherwise FALSE. * * Since: 2.10 */ gboolean modulemd_module_stream_is_autogen_module_name (ModulemdModuleStream *self); /** * modulemd_module_stream_is_autogen_stream_name: * @self: (in): A pointer to a #ModulemdModuleStream object * * Returns: TRUE if @self has a stream name that matches the format used if * modulemd_module_stream_set_autogen_stream_name() created the name. * Otherwise FALSE. * * Since: 2.10 */ gboolean modulemd_module_stream_is_autogen_stream_name (ModulemdModuleStream *self); /** * modulemd_module_stream_clear_autogen_module_name: * @self: (in): A pointer to a #ModulemdModuleStream object * * Clears @self's module name if it matches the format used if * modulemd_module_stream_set_autogen_module_name() created the name, else * does nothing. * * Since: 2.10 */ void modulemd_module_stream_clear_autogen_module_name (ModulemdModuleStream *self); /** * modulemd_module_stream_clear_autogen_stream_name: * @self: (in): A pointer to a #ModulemdModuleStream object * * Clears @self's stream name if it matches the format used if * modulemd_module_stream_set_autogen_stream_name() created the name, else * does nothing. * * Since: 2.10 */ void modulemd_module_stream_clear_autogen_stream_name (ModulemdModuleStream *self); /** * modulemd_module_stream_upgrade_v1_to_v2: * @from (in): A #ModulemdModuleStreamV1 object. * @error: (out): A #GError that will return the reason for an upgrade error. * * Return an upgraded copy of this object. Does not modify the original. * * Returns: (transfer full): A newly-allocated #ModulemdModuleStreamV2 copy of * @from upgraded to V2. Returns NULL and sets @error appropriately if the * upgrade could not be completed automatically. * * Since: 2.11 */ ModulemdModuleStream * modulemd_module_stream_upgrade_v1_to_v2 (ModulemdModuleStream *from); G_END_DECLS fedora-modularity-libmodulemd-357799c/modulemd/include/private/modulemd-module-stream-v1-private.h000066400000000000000000000067771502446517500334140ustar00rootroot00000000000000/* * This file is part of libmodulemd * Copyright (C) 2018 Red Hat, Inc. * * Fedora-License-Identifier: MIT * SPDX-2.0-License-Identifier: MIT * SPDX-3.0-License-Identifier: MIT * * This program is free software. * For more information on the license, see COPYING. * For more information on free software, see . */ #pragma once #include "modulemd-module-stream-v1.h" #include "modulemd-subdocument-info.h" #include #include G_BEGIN_DECLS /** * SECTION: modulemd-module-stream-v1-private * @title: Modulemd.ModuleStreamV1 (Private) * @stability: private * @short_description: #ModulemdModuleStreamV1 methods that should only be * used by internal consumers. */ struct _ModulemdModuleStreamV1 { GObject parent_instance; /* Properties */ ModulemdBuildopts *buildopts; gchar *community; gchar *description; gchar *documentation; gchar *summary; gchar *tracker; /* Internal Data Structures */ GHashTable *rpm_components; /* */ GHashTable *module_components; /* */ GHashTable *rpm_api; /* string set */ GHashTable *rpm_artifacts; /* string set */ GHashTable *rpm_filters; /* string set */ GHashTable *servicelevels; /* */ GHashTable *runtime_deps; /* */ GVariant *xmd; }; /** * modulemd_module_stream_v1_parse_yaml: * @subdoc: (in): A #ModulemdSubdocumentInfo representing a stream v1 * document * @strict: (in): Whether the parser should return failure if it encounters an * unknown mapping key or if it should ignore it. * @error: (out): A #GError that will return the reason for a parsing or * validation error. * * Returns: (transfer full): A newly-allocated #ModulemdModuleStreamV1 object * read from the YAML. NULL if a parse or validation error occurred and sets * @error appropriately. * * Since: 2.0 */ ModulemdModuleStreamV1 * modulemd_module_stream_v1_parse_yaml (ModulemdSubdocumentInfo *subdoc, gboolean strict, GError **error); /** * modulemd_module_stream_v1_emit_yaml: * @self: This #ModulemdModuleStreamV1 object. * @emitter: (inout): A libyaml emitter object positioned where a Module Stream * document belongs. * @error: (out): A #GError that will return the reason for an emission or * validation error. * * Returns: TRUE if the stream was emitted successfully. FALSE and sets * @error appropriately if the YAML could not be emitted. * * Since: 2.0 */ gboolean modulemd_module_stream_v1_emit_yaml (ModulemdModuleStreamV1 *self, yaml_emitter_t *emitter, GError **error); /** * modulemd_module_stream_v1_includes_nevra: * @self: This #ModulemdModuleStreamV1 object. * @nevra_pattern: (not nullable): A [glob](https://www.mankier.com/3/glob) * pattern to match against the NEVRA strings of the rpm artifacts in @self. * * Returns: TRUE if this stream includes at least one RPM artifact that * matches @nevra_pattern. FALSE otherwise. * * Since: 2.9 */ gboolean modulemd_module_stream_v1_includes_nevra (ModulemdModuleStreamV1 *self, const gchar *nevra_pattern); G_END_DECLS fedora-modularity-libmodulemd-357799c/modulemd/include/private/modulemd-module-stream-v2-private.h000066400000000000000000000207721502446517500334040ustar00rootroot00000000000000/* * This file is part of libmodulemd * Copyright (C) 2018 Red Hat, Inc. * * Fedora-License-Identifier: MIT * SPDX-2.0-License-Identifier: MIT * SPDX-3.0-License-Identifier: MIT * * This program is free software. * For more information on the license, see COPYING. * For more information on free software, see . */ #pragma once #include "modulemd-module-stream.h" #include "modulemd-module-stream-v2.h" #include "modulemd-subdocument-info.h" #include #include G_BEGIN_DECLS /** * MODULEMD_MODULE_STREAM_V2_MAXCONTEXTLEN: * * The ModuleStream v3 specification defines the maximum lenth of the context * field. Just before building, the v3 format is converted to v2 format. But * if a scratch build was requested, an underscore with a decimal number (e.g. * "_1") is appended to the v2 context. Allow up to 99 scratch builds here. */ #define MODULEMD_MODULE_STREAM_V2_MAXCONTEXTLEN (MMD_MAXCONTEXTLEN + 3) /** * SECTION: modulemd-module-stream-v2-private * @title: Modulemd.ModuleStreamV2 (Private) * @stability: private * @short_description: #ModulemdModuleStreamV2 methods that should only be * used by internal consumers. */ struct _ModulemdModuleStreamV2 { GObject parent_instance; /* Properties */ ModulemdBuildopts *buildopts; gchar *community; gchar *description; gchar *documentation; gchar *summary; gchar *tracker; /* Internal Data Structures */ GHashTable *module_components; /* */ GHashTable *content_licenses; /* string set */ GHashTable *module_licenses; /* string set */ GHashTable *profiles; /* */ GHashTable *rpm_api; /* string set */ GHashTable *rpm_artifacts; /* string set */ /* < string, GHashTable > */ GHashTable *rpm_artifact_map; GHashTable *rpm_filters; /* string set */ GHashTable *demodularized_rpms; /* string set */ GHashTable *servicelevels; /* */ ModulemdObsoletes *obsoletes; GVariant *xmd; gboolean static_context; }; /** * modulemd_module_stream_v2_parse_yaml: * @subdoc: (in): A #ModulemdSubdocumentInfo representing a stream v2 * document. * @strict: (in): Whether the parser should return failure if it encounters an * unknown mapping key or if it should ignore it. * @only_packager: (in): Whether the parser should return failure if it * encounters a mapping key that is not intended for packager use. Ignored * if @strict is #FALSE. * @error: (out): A #GError that will return the reason for a parsing or * validation error. * * Returns: (transfer full): A newly-allocated #ModulemdModuleStreamV2 object * read from the YAML. NULL if a parse or validation error occurred and sets * @error appropriately. * * Since: 2.0 */ ModulemdModuleStreamV2 * modulemd_module_stream_v2_parse_yaml (ModulemdSubdocumentInfo *subdoc, gboolean strict, gboolean only_packager, GError **error); /** * modulemd_module_stream_v2_emit_yaml: * @self: This #ModulemdModuleStreamV2 object. * @emitter: (inout): A libyaml emitter object positioned where the data * section of a #ModulemdModuleStreamV2 belongs in the YAML document. * @error: (out): A #GError that will return the reason for an emission or * validation error. * * Returns: TRUE if the stream was emitted successfully. FALSE and sets * @error appropriately if the YAML could not be emitted. * * Since: 2.0 */ gboolean modulemd_module_stream_v2_emit_yaml (ModulemdModuleStreamV2 *self, yaml_emitter_t *emitter, GError **error); /** * modulemd_module_stream_v2_replace_content_licenses: * @self: (in): This #ModulemdModuleStreamV2 object. * @set: (in): A #GHashTable set of licenses under which one or more of the * components of this module stream are distributed. * * Any existing content licenses associated with module stream @self are * removed and replaced by @set. * * Since: 2.0 */ void modulemd_module_stream_v2_replace_content_licenses ( ModulemdModuleStreamV2 *self, GHashTable *set); /** * modulemd_module_stream_v2_replace_module_licenses: * @self: (in): This #ModulemdModuleStreamV2 object. * @set: (in): A #GHashTable set of licenses under which this module stream is * distributed. * * Any existing module licenses associated with module stream @self are removed * and replaced by @set. * * Since: 2.0 */ void modulemd_module_stream_v2_replace_module_licenses ( ModulemdModuleStreamV2 *self, GHashTable *set); /** * modulemd_module_stream_v2_replace_rpm_api: * @self: (in): This #ModulemdModuleStreamV2 object. * @set: (in): A #GHashTable set of binary RPMs present in this module stream that is * considered stable public API. * * Any existing API RPMs associated with module stream @self are removed and * replaced by @set. * * Since: 2.0 */ void modulemd_module_stream_v2_replace_rpm_api (ModulemdModuleStreamV2 *self, GHashTable *set); /** * modulemd_module_stream_v2_replace_rpm_artifacts: * @self: (in): This #ModulemdModuleStreamV2 object. * @set: (in): A #GHashTable set of NEVRs of binary RPMs present in this module * stream. * * Any existing artifact RPMs associated with module stream @self are removed * and replaced by @set. * * Since: 2.0 */ void modulemd_module_stream_v2_replace_rpm_artifacts (ModulemdModuleStreamV2 *self, GHashTable *set); /** * modulemd_module_stream_v2_replace_rpm_filters: * @self: (in): This #ModulemdModuleStreamV2 object. * @set: (in): A #GHashTable set of names of binary RPMs to filter out of this * module stream. * * Any existing filtered binary RPM names associated with module stream @self * are removed and replaced by @set. * * Since: 2.0 */ void modulemd_module_stream_v2_replace_rpm_filters (ModulemdModuleStreamV2 *self, GHashTable *set); /** * modulemd_module_stream_v2_replace_demodularized_rpms: * @self: (in): This #ModulemdModuleStreamV2 object. * @set: (in): A #GHashTable set of names of binary RPM packages to demodularize. * * Any existing demodularized binary RPM package names associated with module * stream @self are removed and replaced by @set. * * Since: 2.13 */ void modulemd_module_stream_v2_replace_demodularized_rpms ( ModulemdModuleStreamV2 *self, GHashTable *set); /** * modulemd_module_stream_v2_replace_dependencies: * @self: (in): This #ModulemdModuleStreamV2 object. * @array: (in): A #GPtrArray of #ModulemdDependencies objects for this module * stream. * * Any existing dependencies associated with module stream @self are removed * and replaced by @array. * * Since: 2.0 */ void modulemd_module_stream_v2_replace_dependencies (ModulemdModuleStreamV2 *self, GPtrArray *array); /** * modulemd_module_stream_v2_includes_nevra: * @self: This #ModulemdModuleStreamV2 object. * @nevra_pattern: (not nullable): A [glob](https://www.mankier.com/3/glob) * pattern to match against the NEVRA strings of the rpm artifacts in @self. * * Returns: TRUE if this stream includes at least one RPM artifact that * matches @nevra_pattern. FALSE otherwise. * * Since: 2.9 */ gboolean modulemd_module_stream_v2_includes_nevra (ModulemdModuleStreamV2 *self, const gchar *nevra_pattern); /** * modulemd_module_stream_v2_associate_obsoletes: * @self: (in): This #ModulemdModuleStreamV2 object. * @obsoletes: (in): The #ModulemdObsoletes information to associate with * this object. * * Since: 2.10 */ void modulemd_module_stream_v2_associate_obsoletes (ModulemdModuleStreamV2 *self, ModulemdObsoletes *obsoletes); /** * modulemd_module_stream_v2_get_obsoletes: * @self: (in): This #ModulemdModuleStreamV2 object. * * Returns: (transfer none): The #ModulemdObsoletes information associated with this * object. This function doesn't resolve the reset attribute of obsoletes, this means * even if obsoletes associated with this stream has attribute reset set the obsoletes * object is still returned. * * Since: 2.10 */ ModulemdObsoletes * modulemd_module_stream_v2_get_obsoletes (ModulemdModuleStreamV2 *self); G_END_DECLS fedora-modularity-libmodulemd-357799c/modulemd/include/private/modulemd-obsoletes-private.h000066400000000000000000000074531502446517500323010ustar00rootroot00000000000000/* * This file is part of libmodulemd * Copyright (C) 2020 Red Hat * * Fedora-License-Identifier: MIT * SPDX-2.0-License-Identifier: MIT * SPDX-3.0-License-Identifier: MIT * * This program is free software. * For more information on the license, see COPYING. * For more information on free software, see . */ #pragma once #include #include "modulemd-obsoletes.h" #include "modulemd-subdocument-info.h" G_BEGIN_DECLS /** * SECTION: modulemd-obsoletes-private * @title: Modulemd.Obsoletes (Private) * @stability: private * @short_description: #ModulemdObsoletes methods that should only be used by * internal consumers. */ /** * modulemd_obsoletes_get_mdversion: * @self: (in): This #ModulemdObsoletes object. * * Returns: The metadata mdversion of this #ModulemdObsoletes object. * * Since: 2.10 */ guint64 modulemd_obsoletes_get_mdversion (ModulemdObsoletes *self); /** * modulemd_obsoletes_get_module_name: * @self: (in): This #ModulemdObsoletes object. * * Returns: The module name to which this #ModulemdObsoletes object applies. * * Since: 2.10 */ const gchar * modulemd_obsoletes_get_module_name (ModulemdObsoletes *self); /** * modulemd_obsoletes_get_module_stream: * @self: (in): This #ModulemdObsoletes object. * * Returns: The stream name to which this #ModulemdObsoletes object applies. * * Since: 2.10 */ const gchar * modulemd_obsoletes_get_module_stream (ModulemdObsoletes *self); /** * modulemd_obsoletes_set_message: * @self: This #ModulemdObsoletes object. * @message: (in): A string describing the change, reason, etc. * * Since: 2.10 */ void modulemd_obsoletes_set_message (ModulemdObsoletes *self, const gchar *message); /** * modulemd_obsoletes_set_obsoleted_by_module_name: * @self: This #ModulemdObsoletes object. * @obsoleted_by_module_name: (in): The module name of obsoleting stream. * * Has to be set together with obsoleted by module stream. * * Since: 2.10 */ void modulemd_obsoletes_set_obsoleted_by_module_name ( ModulemdObsoletes *self, const gchar *obsoleted_by_module_name); /** * modulemd_obsoletes_set_obsoleted_by_module_stream: * @self: This #ModulemdObsoletes object. * @obsoleted_by_module_stream: (in): The module stream of obsoleting stream. * * Has to be set together with obsoleted by module name. * * Since: 2.10 */ void modulemd_obsoletes_set_obsoleted_by_module_stream ( ModulemdObsoletes *self, const gchar *obsoleted_by_module_stream); /** * modulemd_obsoletes_parse_yaml: * @subdoc: (in): A #ModulemdSubdocumentInfo representing a obsoletes * document * @strict: (in): Whether the parser should return failure if it encounters an * unknown mapping key or if it should ignore it. * @error: (out): A #GError that will return the reason for a parsing or * validation error. * * Returns: (transfer full): A newly-allocated #ModulemdObsoletes object * read from the YAML. NULL if a parse or validation error occurred and sets * @error appropriately. * * Since: 2.10 */ ModulemdObsoletes * modulemd_obsoletes_parse_yaml (ModulemdSubdocumentInfo *subdoc, gboolean strict, GError **error); /** * modulemd_obsoletes_emit_yaml: * @self: (in): This #ModulemdObsoletes object. * @emitter: (inout): A libyaml emitter object positioned where obsoletes data * belongs in the YAML document. * @error: (out): A #GError that will return the reason for an emission or * validation error. * * Returns: TRUE if the obsoletes data was emitted successfully. FALSE and sets * @error appropriately if the YAML could not be emitted. * * Since: 2.10 */ gboolean modulemd_obsoletes_emit_yaml (ModulemdObsoletes *self, yaml_emitter_t *emitter, GError **error); G_END_DECLS fedora-modularity-libmodulemd-357799c/modulemd/include/private/modulemd-packager-v3-private.h000066400000000000000000000106561502446517500324040ustar00rootroot00000000000000/* * This file is part of libmodulemd * Copyright (C) 2020 Red Hat, Inc. * * Fedora-License-Identifier: MIT * SPDX-2.0-License-Identifier: MIT * SPDX-3.0-License-Identifier: MIT * * This program is free software. * For more information on the license, see COPYING. * For more information on free software, see . */ #pragma once #include "modulemd-2.0/modulemd-packager-v3.h" #include #include G_BEGIN_DECLS /** * SECTION: modulemd-packager-v3-private * @title: Modulemd.PackagerV3 (Private) * @stability: Private * @short_description: #ModulemdPackagerV3 methods that should only be used by * internal consumers. */ /** * modulemd_packager_v3_to_defaults: * @self: (in): This #ModulemdPackagerV3 object. * @defaults_ptr: (out): (transfer-full): A pointer to a pointer to a new * #ModulemdDefaults object. Must be a valid pointer to a NULL object when * called. * @error: (out): A #GError that will return the reason for a conversion error. * * Sets @defaults_ptr to point to a newly-allocated #ModulemdDefaults object * corresponding to the #ModulemdPackagerV3 object @self if @self contains any * profiles marked as default. Leaves @defaults_ptr pointing to NULL if @self * contained no default profiles. * * Returns: TRUE if the conversion succeeded, including the case where there * @self contains no default profiles. FALSE otherwise and @error will be set. * * Since: 2.11 */ gboolean modulemd_packager_v3_to_defaults (ModulemdPackagerV3 *self, ModulemdDefaults **defaults_ptr, GError **error); /** * modulemd_packager_v3_to_stream_v2: * @self: (in): This #ModulemdPackagerV3 object. * @error: (out): A #GError that will return the reason for a conversion error. * * Returns: (transfer full): A newly-allocated #ModulemdModuleStreamV2 object * corresponding to the #ModulemdPackagerV3 object @self. NULL if there was an * error doing the mapping and sets @error appropriately. * * Since: 2.11 */ ModulemdModuleStreamV2 * modulemd_packager_v3_to_stream_v2 (ModulemdPackagerV3 *self, GError **error); /** * modulemd_packager_v3_to_stream_v2_ext: * @self: (in): This #ModulemdPackagerV3 object. * @error: (out): A #GError that will return the reason for a conversion error. * * Note: If buildopts (#ModulemdBuildopts) are in use in one or more build * configurations in the #ModulemdPackagerV3 object @self, only the buildopts * present in the first listed configuration (if any) will be applied to the * #ModulemdModuleStreamV2 object in the returned index. * * Returns: (transfer full): A newly-allocated #ModulemdModuleIndex object * containing a #ModulemdModuleStreamV2 object and possibly a * #ModulemdDefaults object corresponding to the #ModulemdPackagerV3 object * @self. NULL if there was an error doing the mapping and sets @error * appropriately. * * Since: 2.11 */ ModulemdModuleIndex * modulemd_packager_v3_to_stream_v2_ext (ModulemdPackagerV3 *self, GError **error); /** * modulemd_packager_v3_parse_yaml: * @subdoc: (in): A #ModulemdSubdocumentInfo representing a packager v3 * document. * @error: (out): A #GError that will return the reason for a parsing or * validation error. * * Parse a #ModulemdPackagerV3 document. This parser always operates in strict * mode, since it should only be used as input for a build-system. * * Returns: (transfer full): A newly-allocated #ModulemdPackagerV3 object * read from the YAML. NULL if a parse or validation error occurred and sets * @error appropriately. * * Since: 2.11 */ ModulemdPackagerV3 * modulemd_packager_v3_parse_yaml (ModulemdSubdocumentInfo *subdoc, GError **error); /** * modulemd_packager_v3_emit_yaml: * @self: This #ModulemdPackagerV3 object. * @emitter: (inout): A libyaml emitter object positioned where the data * section of a #ModulemdPackagerV3 belongs in the YAML document. * @error: (out): A #GError that will return the reason for an emission or * validation error. * * Returns: TRUE if the modulemd-packager v3 document was emitted successfully. * FALSE and sets @error appropriately if the YAML could not be emitted. * * Since: 2.11 */ gboolean modulemd_packager_v3_emit_yaml (ModulemdPackagerV3 *self, yaml_emitter_t *emitter, GError **error); G_END_DECLS fedora-modularity-libmodulemd-357799c/modulemd/include/private/modulemd-profile-private.h000066400000000000000000000053341502446517500317360ustar00rootroot00000000000000/* * This file is part of libmodulemd * Copyright (C) 2018 Red Hat, Inc. * * Fedora-License-Identifier: MIT * SPDX-2.0-License-Identifier: MIT * SPDX-3.0-License-Identifier: MIT * * This program is free software. * For more information on the license, see COPYING. * For more information on free software, see . */ #pragma once #include #include #include "modulemd-module-stream.h" #include "modulemd-profile.h" /** * SECTION: modulemd-profile-private * @title: Modulemd.Profile (Private) * @stability: Private * @short_description: #ModulemdProfile methods that should be used only * by internal consumers. */ /** * modulemd_profile_parse_yaml: * @parser: (inout): A libyaml parser object positioned at the beginning of a * Profile entry in the YAML document. * @name: (in): The name of this profile. * @strict: (in): Whether the parser should return failure if it encounters an * unknown mapping key or if it should ignore it. * @error: (out): A #GError that will return the reason for a parsing or * validation error. * * Returns: (transfer full): A newly-allocated #ModulemdProfile object * read from the YAML. NULL if a parse or validation error occurred and sets * @error appropriately. * * Since: 2.0 */ ModulemdProfile * modulemd_profile_parse_yaml (yaml_parser_t *parser, const gchar *name, gboolean strict, GError **error); /** * modulemd_profile_emit_yaml: * @self: This #ModulemdProfile object. * @emitter: (inout): A libyaml emitter object positioned where a Profile * belongs in the YAML document. * @error: (out): A #GError that will return the reason for an emission or * validation error. * * Returns: TRUE if the profile was emitted successfully. FALSE and sets * @error appropriately if the YAML could not be emitted. * * Since: 2.0 */ gboolean modulemd_profile_emit_yaml (ModulemdProfile *self, yaml_emitter_t *emitter, GError **error); /** * modulemd_profile_equals_wrapper: * @a: A const void pointer. * @b: A const void pointer. * * Returns: TRUE, if both arguments are pointers to #ModulemdProfile objects * and all elements of both objects are equal. FALSE, otherwise. * * Since: 2.5 */ gboolean modulemd_profile_equals_wrapper (const void *a, const void *b); /** * modulemd_profile_set_owner: * @self: This #ModulemdProfile object. * @owner: A #ModulemdModuleStream that will own this profile. Used to look up * translations internally. * * Since: 2.6 */ void modulemd_profile_set_owner (ModulemdProfile *self, ModulemdModuleStream *owner); fedora-modularity-libmodulemd-357799c/modulemd/include/private/modulemd-rpm-map-entry-private.h000066400000000000000000000053101502446517500330000ustar00rootroot00000000000000/* * This file is part of libmodulemd * Copyright (C) 2018 Red Hat, Inc. * * Fedora-License-Identifier: MIT * SPDX-2.0-License-Identifier: MIT * SPDX-3.0-License-Identifier: MIT * * This program is free software. * For more information on the license, see COPYING. * For more information on free software, see . */ #include #include /** * SECTION: modulemd-rpm-map-entry-private * @title: Modulemd.RpmMapEntry (Private) * @stability: Private * @short_description: #ModulemdRpmMapEntry methods that should be used only * by internal consumers. */ /** * modulemd_rpm_map_entry_parse_yaml * @parser: (inout): A libyaml parser object positioned at the beginning of an * RpmMapEntry's mapping entry in the YAML document. * @strict: (in): Whether the parser should return failure if it encounters an * unknown mapping key or if it should ignore it. * @error: (out): A #GError that will return the reason for parsing error. * * Returns: (transfer full): A newly-allocated #ModulemdComponentRpm object * read from the YAML. NULL if a parse error occurred and sets @error * appropriately. * Since: 2.2 */ ModulemdRpmMapEntry * modulemd_rpm_map_entry_parse_yaml (yaml_parser_t *parser, gboolean strict, GError **error); /** * modulemd_rpm_map_entry_emit_yaml: * @self: This #ModulemdRpmMapEntry object. * @emitter: (inout): A libyaml emitter object positioned where a * #ModulemdRpmMapEntry belongs in the YAML document. * @error: (out): A #GError that will return the reason for an emission or * validation error. * * Return: TRUE if the entry was emitted successfully. FALSE and sets @error * appropriately if the YAML could not be emitted. * * Since: 2.2 */ gboolean modulemd_rpm_map_entry_emit_yaml (ModulemdRpmMapEntry *self, yaml_emitter_t *emitter, GError **error); /** * modulemd_rpm_map_entry_equals_wrapper: * @a: A const void pointer. * @b: A const void pointer. * * Returns: TRUE if the two entries are both pointers to #ModulemdRpmMapEntry * objects containing equivalent data. FALSE if they differ. * * Since: 2.5 */ gboolean modulemd_rpm_map_entry_equals_wrapper (const void *a, const void *b); /** * modulemd_RpmMapEntry_hash_table_equals_wrapper: * @a: A const void pointer. * @b: A const void pointer. * * Returns: TRUE if the two entries are equivalent #GHashTables of * pointers to #ModulemdRpmMapEntry objects containing equivalent data. FALSE * if they differ. * * Since: 2.5 */ gboolean modulemd_RpmMapEntry_hash_table_equals_wrapper (const void *a, const void *b); fedora-modularity-libmodulemd-357799c/modulemd/include/private/modulemd-service-level-private.h000066400000000000000000000047611502446517500330460ustar00rootroot00000000000000/* * This file is part of libmodulemd * Copyright (C) 2017-2018 Stephen Gallagher * * Fedora-License-Identifier: MIT * SPDX-2.0-License-Identifier: MIT * SPDX-3.0-License-Identifier: MIT * * This program is free software. * For more information on the license, see COPYING. * For more information on free software, see . */ #pragma once #include #include #include "modulemd-service-level.h" /** * SECTION: modulemd-service-level-private * @title: Modulemd.ServiceLevel (Private) * @stability: Private * @short_description: #ModulemdServiceLevel methods that should be used only * by internal consumers. */ /** * modulemd_service_level_parse_yaml: * @parser: (inout): A libyaml parser object positioned at the beginning of a * Service Level entry in the YAML document. * @name: (in): The name of this service level. * @strict: (in): Whether the parser should return failure if it encounters an * unknown mapping key or if it should ignore it. * @error: (out): A #GError that will return the reason for a parsing or * validation error. * * Returns: (transfer full): A newly-allocated #ModulemdServiceLevel object * read from the YAML. NULL if a parse or validation error occurred and sets * @error appropriately. * * Since: 2.0 */ ModulemdServiceLevel * modulemd_service_level_parse_yaml (yaml_parser_t *parser, const gchar *name, gboolean strict, GError **error); /** * modulemd_service_level_emit_yaml: * @self: This #ModulemdServiceLevel object. * @emitter: (inout): A libyaml emitter object positioned where a Service Level * entry belongs in the YAML document. * @error: (out): A #GError that will return the reason for an emission or * validation error. * * Returns: TRUE if the service level was emitted successfully. FALSE and sets * @error appropriately if the YAML could not be emitted. * * Since: 2.0 */ gboolean modulemd_service_level_emit_yaml (ModulemdServiceLevel *self, yaml_emitter_t *emitter, GError **error); /** * modulemd_service_level_equals_wrapper: * @a: A const void pointer. * @b: A const void pointer. * * Returns: TRUE, if both arguments are pointers to equivalent * #ModulemdServiceLevel objects. FALSE, otherwise. * * Since: 2.5 */ gboolean modulemd_service_level_equals_wrapper (const void *a, const void *b); fedora-modularity-libmodulemd-357799c/modulemd/include/private/modulemd-subdocument-info-private.h000066400000000000000000000077331502446517500335640ustar00rootroot00000000000000/* * This file is part of libmodulemd * Copyright (C) 2018 Red Hat, Inc. * * Fedora-License-Identifier: MIT * SPDX-2.0-License-Identifier: MIT * SPDX-3.0-License-Identifier: MIT * * This program is free software. * For more information on the license, see COPYING. * For more information on free software, see . */ #pragma once #include #include #include "modulemd-subdocument-info.h" #include "private/modulemd-yaml.h" /** * SECTION: modulemd-subdocument-info-private * @title: Modulemd.SubdocumentInfo (Private) * @stability: Private * @short_description: #ModulemdSubdocumentInfo methods that should be used only * by internal consumers. */ /** * modulemd_subdocument_info_new: * * Returns: (transfer full): A newly-allocated #ModulemdSubdocumentInfo object. * * Since: 2.0 */ ModulemdSubdocumentInfo * modulemd_subdocument_info_new (void); /** * modulemd_subdocument_info_copy: * @self: This #ModulemdSubdocumentInfo object. * * Returns: (transfer full): A deep copy of @self. * * Since: 2.0 */ ModulemdSubdocumentInfo * modulemd_subdocument_info_copy (ModulemdSubdocumentInfo *self); /** * modulemd_subdocument_info_set_doctype: * @self: This #ModulemdSubdocumentInfo object. * @doctype: The #ModulemdYamlDocumentTypeEnum represented by this subdocument * object. * * Since: 2.0 */ void modulemd_subdocument_info_set_doctype (ModulemdSubdocumentInfo *self, ModulemdYamlDocumentTypeEnum doctype); /** * modulemd_subdocument_info_get_doctype: * @self: This #ModulemdSubdocumentInfo object. * * Returns: The type of subdocument represented by this #ModulemdSubdocumentInfo object. * * Since: 2.0 */ ModulemdYamlDocumentTypeEnum modulemd_subdocument_info_get_doctype (ModulemdSubdocumentInfo *self); /** * modulemd_subdocument_info_set_mdversion: * @self: This #ModulemdSubdocumentInfo object. * @mdversion: The metadata version of this #ModulemdSubdocumentInfo object. * * Since: 2.0 */ void modulemd_subdocument_info_set_mdversion (ModulemdSubdocumentInfo *self, guint64 mdversion); /** * modulemd_subdocument_info_get_mdversion: * @self: This #ModulemdSubdocumentInfo object. * * Returns: The metadata version of this #ModulemdSubdocumentInfo object. * * Since: 2.0 */ guint64 modulemd_subdocument_info_get_mdversion (ModulemdSubdocumentInfo *self); /** * modulemd_subdocument_info_set_yaml: * @self: This #ModulemdSubdocumentInfo object. * @contents: The contents of the document. * * Since: 2.0 */ void modulemd_subdocument_info_set_yaml (ModulemdSubdocumentInfo *self, const gchar *contents); /** * modulemd_subdocument_info_set_gerror: * @self: This #ModulemdSubdocumentInfo object. * @error: The error. * * Since: 2.0 */ void modulemd_subdocument_info_set_gerror (ModulemdSubdocumentInfo *self, const GError *error); /** * modulemd_subdocument_info_get_data_parser: * @self: This #ModulemdSubdocumentInfo object. * @parser: (inout): An unconfigured libyaml parser. * @strict: (in): Whether the parser should return failure if it encounters an * unknown mapping key or if it should ignore it. * @error: (out): A #GError containing the parser error if this function fails. * * Since: 2.0 */ gboolean modulemd_subdocument_info_get_data_parser (ModulemdSubdocumentInfo *self, yaml_parser_t *parser, gboolean strict, GError **error); /** * modulemd_subdocument_info_debug_dump_failures: * @failures: (in) (element-type ModulemdSubdocumentInfo): An array containing * any subdocuments from the YAML file that failed to parse. * * Dumps human readable information about @failures to the debug log. * * Since: 2.10 */ void modulemd_subdocument_info_debug_dump_failures (GPtrArray *failures); fedora-modularity-libmodulemd-357799c/modulemd/include/private/modulemd-translation-entry-private.h000066400000000000000000000044311502446517500337700ustar00rootroot00000000000000/* * This file is part of libmodulemd * Copyright (C) 2018 Red Hat, Inc. * * Fedora-License-Identifier: MIT * SPDX-2.0-License-Identifier: MIT * SPDX-3.0-License-Identifier: MIT * * This program is free software. * For more information on the license, see COPYING. * For more information on free software, see . */ #pragma once #include #include #include "modulemd-translation-entry.h" /** * SECTION: modulemd-translation-entry-private * @title: Modulemd.TranslationEntry (Private) * @stability: Private * @short_description: #ModulemdTranslationEntry methods that should be used only * by internal consumers. */ /** * modulemd_translation_entry_parse_yaml: * @parser: (inout): A libyaml parser object positioned at the beginning of a * Translation Entry's mapping entry in the YAML document. * @locale: (in): A string with the locale for the current translation entry. * @strict: (in): Whether the parser should return failure if it encounters an * unknown mapping key or if it should ignore it. * @error: (out): A #GError that will return the reason for a parsing or * validation error. * * Returns: (transfer full): A newly-allocated #ModulemdTranslationEntry object * read from the YAML. NULL if a parse or validation error occurred and sets * @error appropriately. * * Since: 2.0 */ ModulemdTranslationEntry * modulemd_translation_entry_parse_yaml (yaml_parser_t *parser, const gchar *locale, gboolean strict, GError **error); /** * modulemd_translation_entry_emit_yaml: * @self: This #ModulemdTranslationEntry object. * @emitter: (inout): A libyaml emitter object positioned where a Translation Entry * belongs in the YAML document. * @error: (out): A #GError that will return the reason for an emission or * validation error. * * Returns: TRUE if the translation entry was emitted successfully. FALSE and sets * @error appropriately if the YAML could not be emitted. * * Since: 2.0 */ gboolean modulemd_translation_entry_emit_yaml (ModulemdTranslationEntry *self, yaml_emitter_t *emitter, GError **error); fedora-modularity-libmodulemd-357799c/modulemd/include/private/modulemd-translation-private.h000066400000000000000000000062331502446517500326330ustar00rootroot00000000000000/* * This file is part of libmodulemd * Copyright (C) 2018 Red Hat, Inc. * * Fedora-License-Identifier: MIT * SPDX-2.0-License-Identifier: MIT * SPDX-3.0-License-Identifier: MIT * * This program is free software. * For more information on the license, see COPYING. * For more information on free software, see . */ #pragma once #include #include #include "modulemd-profile.h" #include "modulemd-subdocument-info.h" /** * SECTION: modulemd-translation-private * @title: Modulemd.Translation (Private) * @stability: Private * @short_description: #ModulemdTranslation methods that should be used only * by internal consumers. */ /** * modulemd_translation_get_version: * @self: (in): This #ModulemdTranslation object. * * Returns: The metadata version of this #ModulemdTranslation object. * * Since: 2.0 */ guint64 modulemd_translation_get_version (ModulemdTranslation *self); /** * modulemd_translation_get_module_name: * @self: (in): This #ModulemdTranslation object. * * Returns: The module name to which this #ModulemdTranslation object applies. * * Since: 2.0 */ const gchar * modulemd_translation_get_module_name (ModulemdTranslation *self); /** * modulemd_translation_get_module_stream: * @self: (in): This #ModulemdTranslation object. * * Returns: The stream name to which this #ModulemdTranslation object applies. * * Since: 2.0 */ const gchar * modulemd_translation_get_module_stream (ModulemdTranslation *self); /** * modulemd_translation_get_modified: * @self: (in): This #ModulemdTranslation object. * * Returns: The last modified time of this #ModulemdTranslation object * represented as a 64-bit integer (such as 201807011200). * * Since: 2.0 */ guint64 modulemd_translation_get_modified (ModulemdTranslation *self); /** * modulemd_translation_parse_yaml: * @subdoc: (in): A #ModulemdSubdocumentInfo representing a translation * document * @strict: (in): Whether the parser should return failure if it encounters an * unknown mapping key or if it should ignore it. * @error: (out): A #GError that will return the reason for a parsing or * validation error. * * Returns: (transfer full): A newly-allocated #ModulemdTranslation object * read from the YAML. NULL if a parse or validation error occurred and sets * @error appropriately. * * Since: 2.0 */ ModulemdTranslation * modulemd_translation_parse_yaml (ModulemdSubdocumentInfo *subdoc, gboolean strict, GError **error); /** * modulemd_translation_emit_yaml: * @self: This #ModulemdTranslation object. * @emitter: (inout): A libyaml emitter object positioned where Translation data * belongs in the YAML document. * @error: (out): A #GError that will return the reason for an emission or * validation error. * * Returns: TRUE if the translation data was emitted successfully. FALSE and sets * @error appropriately if the YAML could not be emitted. * * Since: 2.0 */ gboolean modulemd_translation_emit_yaml (ModulemdTranslation *self, yaml_emitter_t *emitter, GError **error); fedora-modularity-libmodulemd-357799c/modulemd/include/private/modulemd-util.h000066400000000000000000000423201502446517500275770ustar00rootroot00000000000000/* * This file is part of libmodulemd * Copyright (C) 2017-2018 Stephen Gallagher * * Fedora-License-Identifier: MIT * SPDX-2.0-License-Identifier: MIT * SPDX-3.0-License-Identifier: MIT * * This program is free software. * For more information on the license, see COPYING. * For more information on free software, see . */ #pragma once #include G_BEGIN_DECLS /** * SECTION: modulemd-util * @title: Modulemd Utility Functions * @stability: private * @short_description: Provides private utility functions for use within * libmodulemd. */ #ifdef __GNUC__ #define UNUSED(x) UNUSED_##x __attribute__ ((__unused__)) #else #define UNUSED(x) UNUSED_##x #endif #ifdef __GNUC__ #define FALLTHROUGH __attribute__ ((fallthrough)); #else #define FALLTHROUGH #endif /** * modulemd_tracer: * @function_name: The name of the function to be tracked by this * #modulemd_tracer. * * Since: 2.0 */ typedef struct _modulemd_tracer { gchar *function_name; } modulemd_tracer; /** * modulemd_trace_init: * @function_name: The name of the function being traced. * * Returns: (transfer full): A newly-allocated #modulemd_tracer object. * * Allocates and returns a new #modulemd_tracer that tracks the provided * @function_name. Also writes a g_debug() trace message indicating * @function_name has been entered. * * DIRECT USE OF THIS FUNCTION SHOULD BE AVOIDED. Instead use * %MODULEMD_INIT_TRACE--which makes use of this function as part of its * internal implementation. * * Since: 2.0 */ modulemd_tracer * modulemd_trace_init (const gchar *function_name); /** * modulemd_trace_free: * @tracer: A #modulemd_tracer object representing a function being traced. * * Writes a g_debug() trace message indicating the function name associated * with @tracer is being exited and frees @tracer. * * DIRECT USE OF THIS FUNCTION SHOULD BE AVOIDED. Instead use * %MODULEMD_INIT_TRACE--which makes use of this function as part of its * internal implementation. * * Since: 2.0 */ void modulemd_trace_free (modulemd_tracer *tracer); G_DEFINE_AUTOPTR_CLEANUP_FUNC (modulemd_tracer, modulemd_trace_free); /** * MODULEMD_INIT_TRACE: * * When used at the beginning of a function, automatically writes g_debug() * trace messages when entering and leaving that function. Makes use of * modulemd_trace_init() and modulemd_trace_free(). * * This macro manages the memory of the hidden #modulemd_tracer object it * creates, so the caller should not attempt to modify that object in any way. * * Since: 2.0 */ #define MODULEMD_INIT_TRACE() \ g_autoptr (modulemd_tracer) tracer = modulemd_trace_init (__func__); \ do \ { \ (void)(tracer); \ } \ while (0) G_END_DECLS /** * modulemd_hash_table_deep_str_copy: * @orig: A #GHashTable to copy, containing string keys and string values. * * Returns: (transfer full): A newly-allocated #GHashTable containing a deep * copy of both the keys and values from @orig. * * Since: 2.0 */ GHashTable * modulemd_hash_table_deep_str_copy (GHashTable *orig); /** * modulemd_hash_table_deep_set_copy: * @orig: A #GHashTable to copy, containing string keys. * * Returns: (transfer full): A newly-allocated #GHashTable containing a deep * copy of the keys from @orig. The values from @orig are ignored, and the * values in the copy are set the same as the corresponding keys so the * returned #GHashTable can be used as a set. * * Since: 2.0 */ GHashTable * modulemd_hash_table_deep_set_copy (GHashTable *orig); /** * modulemd_hash_table_deep_str_set_copy: * @orig: A #GHashTable to copy, containing string keys and #GHashTable values. * * Returns: (transfer full): A newly-allocated #GHashTable containing a deep * copy of the keys from @orig. The corresponding #GHashTable value for each * key is deep copied via modulemd_hash_table_deep_str_copy() for use as a set. * * Since: 2.0 */ GHashTable * modulemd_hash_table_deep_str_set_copy (GHashTable *orig); /** * modulemd_hash_table_deep_str_str_set_copy: * @orig: A #GHashTable to copy, containing string keys and #GHashTable values * that are nested two levels deep. * * Returns: (transfer full): A newly-allocated #GHashTable containing a deep * copy of the keys from @orig. Each corresponding #GHashTable value is deep * copied, with the second level #GHashTable copied for use as a set as * described in modulemd_hash_table_deep_str_copy(). * * Since: 2.0 */ GHashTable * modulemd_hash_table_deep_str_str_set_copy (GHashTable *orig); /** * modulemd_hash_table_sets_are_equal_wrapper: * @a: A void pointer. * @b: A void pointer. * * Returns: TRUE if both @a and @b (considered as #GHashTables) contain * an identical set of keys, FALSE if they differ. * * Only the keys of @a and @b are compared. The values are ignored. * * Since: 2.2 */ gboolean modulemd_hash_table_sets_are_equal_wrapper (const void *a, const void *b); /** * modulemd_hash_table_sets_are_equal: * @a: A #GHashTable object. * @b: A #GHashTable object. * * Returns: TRUE if both @a and @b contain an identical set of keys, FALSE if * they differ. * * Only the keys of @a and @b are compared. The values are ignored. * * Since: 2.0 */ gboolean modulemd_hash_table_sets_are_equal (GHashTable *a, GHashTable *b); /** * modulemd_hash_table_equals: * @a: A #GHashTable object. * @b: A #GHashTable object. * @compare_func: A #GEqualFunc function that is called to determine the * equivalence of pairs of #GHashTable values. * * Returns: TRUE if both @a and @b contain identical keys and identical * corresponding values (as determined by @compare_func), FALSE if they * differ. * * Since: 2.2 */ gboolean modulemd_hash_table_equals (GHashTable *a, GHashTable *b, GEqualFunc compare_func); /* * modulemd_hash_table_compare: * @a: (in): A #GHashTable object. * @b: (in): A #GHashTable object. * @value_compare_func: (in): A #GCompareFunc function that is called to compare * pairs of #GHashTable values for sorting. If NULL, only the #GHashTable keys * are compared. * * Using guidance from * https://docs.python.org/3/tutorial/datastructures.html#comparing-sequences-and-other-types * * Returns: Less than zero if @a sorts less than @b, zero for equal, greater than * zero if @a is greater than @b. * * Since: 2.10 */ gint modulemd_hash_table_compare (GHashTable *a, GHashTable *b, GCompareFunc value_compare_func); /** * modulemd_strcmp_sort: * @a: A #gconstpointer. * @b: A #gconstpointer. * * Returns: 0 if @a and @b are pointers to identical strings, a negative value * if @a is less than @b, and a positive value if @a is greater than @b. * * Since: 2.0 */ gint modulemd_strcmp_sort (gconstpointer a, gconstpointer b); /** * modulemd_strcmp_wrapper: * @a: (in): A #gconstpointer. * @b: (in): A #gconstpointer. * * Returns: 0 if @a and @b are identical strings, a negative value if @a is less * than @b, and a positive value if @a is greater than @b. * * Since: 2.10 */ gint modulemd_strcmp_wrapper (gconstpointer a, gconstpointer b); /** * modulemd_ordered_str_keys: * @htable: A #GHashTable. * @compare_func: A #GCompareFunc function that is called to determine the * equivalence of pairs of #GHashTable keys from @htable. This should almost * always be passed as modulemd_strcmp_sort(). * * Returns: (transfer container): A #GPtrArray of the keys from @htable sorted * according to @compare_func. * * Since: 2.0 */ GPtrArray * modulemd_ordered_str_keys (GHashTable *htable, GCompareFunc compare_func); /** * modulemd_ordered_str_keys_as_strv: * @htable: A #GHashTable. * * Returns: (transfer full): A #GStrv list of the keys from @htable sorted * according to modulemd_strcmp_sort(). * * Since: 2.0 */ GStrv modulemd_ordered_str_keys_as_strv (GHashTable *htable); /** * modulemd_variant_deep_copy: * @variant: A #GVariant opaque data structure. * * Returns: (transfer full): A newly-allocated deep copy of @variant. * * Since: 2.0 */ GVariant * modulemd_variant_deep_copy (GVariant *variant); /** * modulemd_hash_table_unref: * @table: (nullable): A void pointer. * * Decrements the reference count of @table (considered as a #GHashTable). If * the reference count drops to 0, all keys, values, and memory associated with * @table will be released. * * The main purpose of this function is to provide a GDestroyNotify() function * for #GPtrArray, #GHashTable, and similar object types. * * Since: 2.0 */ void modulemd_hash_table_unref (void *table); /** * modulemd_validate_nevra: * @nevra: A NEVRA (Name, Epoch, Version, Release, Architecture) string. * * Returns: TRUE if @nevra is in proper N-E:V-R.A format, FALSE otherwise. * * Since: 2.0 */ gboolean modulemd_validate_nevra (const gchar *nevra); /** * modulemd_boolean_equals: * @a: A #gboolean value. * @b: A #gboolean value. * * Since a #gboolean could contain any value represented by a #gint, @a and @b * are compared for logical equivalence. * * Returns: TRUE if @a and @b are logically equal, FALSE otherwise. * * Since: 2.7 */ gboolean modulemd_boolean_equals (gboolean a, gboolean b); /** * modulemd_is_glob_pattern: * @pattern: (nullable) A string to check for glob patterns as defined by * [glob(7)[(https://www.mankier.com/7/glob) * * Returns: TRUE if @pattern contains any globbing characters. FALSE * otherwise. * * Since: 2.9 */ gboolean modulemd_is_glob_pattern (const char *pattern); /** * compare_streams: * @a: The first #ModulemdModuleStream to sort * @b: The second #ModulemdModuleStream to sort * * Sorting function for GPtrArrays of #ModulemdModuleStream objects. * * Since: 2.9 */ gint compare_streams (gconstpointer a, gconstpointer b); /** * modulemd_fnmatch: * @pattern: (nullable) A string to check for glob patterns as defined by * [glob(7)[(https://www.mankier.com/7/glob) * @string: (nullable) A string to check for matches. * * A wrapper around fnmatch() for use with modulemd. * * Returns: #TRUE if @pattern matched for this string or if @pattern is NULL. * #FALSE if @pattern did not match or @string is NULL. */ gboolean modulemd_fnmatch (const gchar *pattern, const gchar *string); /** * modulemd_rpm_match: * @key: The key in the RPM artifacts hash table. * @value: The value in the RPM artifacts hash table (should be the same * as @key). * @user_data: A [glob](https://www.mankier.com/3/glob) * pattern to match against the NEVRA strings of the RPM artifacts in @self. * * This is a #GHRFunc for use with g_hash_table_find() to search for RPMs. It * is a wrapper around modulemd_fnmatch(). * * Returns: TRUE if @key is a match for the pattern in @user_data. */ gboolean modulemd_rpm_match (gpointer key, gpointer UNUSED (value), gpointer user_data); /** * modulemd_iso8601date_to_guint64: * @iso8601: (in): string containing a date in ISO 8601 format. * * Returns: date represented as a 64-bit integer (such as 201807011200). * * Since: 2.10 */ guint64 modulemd_iso8601date_to_guint64 (const gchar *iso8601); /** * modulemd_guint64_to_iso8601date: * @date: (in): date represented as a 64-bit integer (such as 201807011200). * * Returns: (transfer full): A newly-allocated string containing a date in ISO 8601 format. * * Since: 2.10 */ gchar * modulemd_guint64_to_iso8601date (guint64 date); /** * MODULEMD_REPLACE_SET: * @_dest: A reference to a #GHashTable. * @_set: (nullable): A reference to a #GHashTable. * * Frees the existing #GHashTable at @_dest. If @_set is not NULL, assigns a * deep copy of @_set's keys for use as a set. * * This helper function is intended for use in GOBJECT_copy() functions to * simplify copying internal set variables and avoid code duplication. * * Since: 2.0 */ #define MODULEMD_REPLACE_SET(_dest, _set) \ do \ { \ if (_set) \ { \ g_clear_pointer (&_dest, g_hash_table_unref); \ _dest = modulemd_hash_table_deep_set_copy (_set); \ } \ else \ { \ g_hash_table_remove_all (_dest); \ } \ } \ while (0) /** * MODULEMD_SETTER_GETTER_STRING_EXT: * @is_static: static for private methods, or empty comment for public. * @ObjName: The name of the object type, in camel case. * @obj_name: The name of the object type, in lowercase with words separated * by '_'. * @OBJ_NAME: The name of the object type, in uppercase with words separated * by '_'. * @attr: The name of the object attribute, in lowercase. * @ATTR: The name of the object attribute, in uppercase. * * A convenience macro for defining standard set and get methods for a string * attribute of an object. * * This is the internal implementation for %MODULEMD_SETTER_GETTER_STRING and * %MODULEMD_SETTER_GETTER_STRING_STATIC which should be used instead. * * Since: 2.2 */ #define MODULEMD_SETTER_GETTER_STRING_EXT( \ is_static, ObjName, obj_name, OBJ_NAME, attr, ATTR) \ is_static void modulemd_##obj_name##_set_##attr (ObjName *self, \ const gchar *attr) \ { \ g_return_if_fail (MODULEMD_IS_##OBJ_NAME (self)); \ \ g_clear_pointer (&self->attr, g_free); \ self->attr = g_strdup (attr); \ \ g_object_notify_by_pspec (G_OBJECT (self), properties[PROP_##ATTR]); \ } \ \ \ is_static const gchar *modulemd_##obj_name##_get_##attr (ObjName *self) \ { \ g_return_val_if_fail (MODULEMD_IS_##OBJ_NAME (self), NULL); \ \ return self->attr; \ } /** * MODULEMD_SETTER_GETTER_STRING: * @ObjName: The name of the object type, in camel case. * @obj_name: The name of the object type, in lowercase with words separated * by '_'. * @OBJ_NAME: The name of the object type, in uppercase with words separated * by '_'. * @attr: The name of the object attribute, in lowercase. * @ATTR: The name of the object attribute, in uppercase. * * A convenience macro for defining standard public set * and get methods for a string attribute of an object. * * Since: 2.2 */ #define MODULEMD_SETTER_GETTER_STRING( \ ObjName, obj_name, OBJ_NAME, attr, ATTR) \ MODULEMD_SETTER_GETTER_STRING_EXT ( \ /**/, ObjName, obj_name, OBJ_NAME, attr, ATTR) /** * MODULEMD_SETTER_GETTER_STRING_STATIC: * @ObjName: The name of the object type, in camel case. * @obj_name: The name of the object type, in lowercase with words separated * by '_'. * @OBJ_NAME: The name of the object type, in uppercase with words separated * by '_'. * @attr: The name of the object attribute, in lowercase. * @ATTR: The name of the object attribute, in uppercase. * * A is a convenience macro for defining standard private * (static) set and get methods for a string attribute of an object. * * Since: 2.2 */ #define MODULEMD_SETTER_GETTER_STRING_STATIC( \ ObjName, obj_name, OBJ_NAME, attr, ATTR) \ MODULEMD_SETTER_GETTER_STRING_EXT ( \ static, ObjName, obj_name, OBJ_NAME, attr, ATTR) /** * modulemd_str_set_new: * * A convenience macro to simplify the common operation of setting up a hash * table in libmodulemd for containing a set() of unique strings. * * Since: 2.10 */ #define modulemd_str_set_new() \ g_hash_table_new_full (g_str_hash, g_str_equal, g_free, NULL) fedora-modularity-libmodulemd-357799c/modulemd/include/private/modulemd-yaml.h000066400000000000000000002071471502446517500275760ustar00rootroot00000000000000/* * This file is part of libmodulemd * Copyright (C) 2017-2020 Stephen Gallagher * * Fedora-License-Identifier: MIT * SPDX-2.0-License-Identifier: MIT * SPDX-3.0-License-Identifier: MIT * * This program is free software. * For more information on the license, see COPYING. * For more information on free software, see . */ #pragma once #include #include #include "modulemd-errors.h" #include "modulemd-service-level.h" #include "modulemd-subdocument-info.h" #include "private/modulemd-util.h" G_BEGIN_DECLS /** * SECTION: modulemd-yaml * @title: YAML Manipulation Tools * @stability: private * @short_description: Provides private YAML utilities for internal use. */ /** * ModulemdYamlDocumentTypeEnum: * @MODULEMD_YAML_DOC_UNKNOWN: Represents an unknown YAML document type. * @MODULEMD_YAML_DOC_MODULESTREAM: Represents a `modulemd` (see * #ModulemdModuleStream) YAML document type. * @MODULEMD_YAML_DOC_DEFAULTS: Represents a `modulemd-defaults` (see * #ModulemdDefaultsV1) YAML document type. * @MODULEMD_YAML_DOC_TRANSLATIONS: Represents a `modulemd-translations` (see * #ModulemdTranslation) YAML document type. * @MODULEMD_YAML_DOC_PACKAGER: Represents a `modulemd-packager` document. * V2 is a subset of #ModulemdModuleStreamV2 containing only the attributes that a * package maintainer should modify. V3 (see #ModulemdPackagerV3) is a new YAML * document type. Since: 2.9 * @MODULEMD_YAML_DOC_OBSOLETES: Represents a `modulemd-obsoletes` document (see * #ModulemdObsoletes) YAML document type. Since: 2.10 * * Since: 2.0 */ typedef enum { MODULEMD_YAML_DOC_UNKNOWN = 0, MODULEMD_YAML_DOC_MODULESTREAM, MODULEMD_YAML_DOC_DEFAULTS, MODULEMD_YAML_DOC_TRANSLATIONS, MODULEMD_YAML_DOC_PACKAGER, MODULEMD_YAML_DOC_OBSOLETES } ModulemdYamlDocumentTypeEnum; /** * modulemd_yaml_string: * @str: A pointer to a block of memory containing YAML. * @len: The number of bytes currently in use in @str. * * #modulemd_yaml_string is an internal representation of an arbitrary length * YAML string. * * Since: 2.0 */ typedef struct _modulemd_yaml_string { char *str; size_t len; } modulemd_yaml_string; /** * write_yaml_string: * @data: (inout): A void pointer to a #modulemd_yaml_string object. * @buffer: (in): YAML text to append to @data. * @size: (in): The number of bytes from @buffer to append to @data. * * Additionally memory for @data is automatically allocated if necessary. * * Since: 2.0 */ int write_yaml_string (void *data, unsigned char *buffer, size_t size); /** * modulemd_yaml_string_free: * @yaml_string: (inout): A pointer to a #modulemd_yaml_string to be freed. * * Since: 2.0 */ void modulemd_yaml_string_free (modulemd_yaml_string *yaml_string); G_DEFINE_AUTOPTR_CLEANUP_FUNC (FILE, fclose); G_DEFINE_AUTOPTR_CLEANUP_FUNC (modulemd_yaml_string, modulemd_yaml_string_free); G_DEFINE_AUTO_CLEANUP_CLEAR_FUNC (yaml_event_t, yaml_event_delete); G_DEFINE_AUTO_CLEANUP_CLEAR_FUNC (yaml_parser_t, yaml_parser_delete); G_DEFINE_AUTO_CLEANUP_CLEAR_FUNC (yaml_emitter_t, yaml_emitter_delete); /** * mmd_yaml_get_event_name: * @type: (in): A libyaml event type. * * Returns: The string representation for @type. * * Since: 2.0 */ const gchar * mmd_yaml_get_event_name (yaml_event_type_t type); /** * MMD_INIT_YAML_PARSER: * @_parser: (out): A variable name to use for the new parser object. * * This convenience macro allocates and initializes a new libyaml parser object * named @_parser. * * Since: 2.0 */ #define MMD_INIT_YAML_PARSER(_parser) \ g_auto (yaml_parser_t) _parser; \ yaml_parser_initialize (&_parser) /** * MMD_INIT_YAML_EMITTER: * @_emitter: (out): A variable name to use for the new emitter object. * * This convenience macro allocates and initializes a new libyaml emitter * object named @_emitter. * * Since: 2.0 */ #define MMD_INIT_YAML_EMITTER(_emitter) \ g_auto (yaml_emitter_t) _emitter; \ yaml_emitter_initialize (&_emitter) /** * MMD_INIT_YAML_EVENT: * @_event: (out): A variable name to use for the new event object. * * This convenience macro allocates and initializes a new libyaml event object * named @_event. * * Since: 2.0 */ #define MMD_INIT_YAML_EVENT(_event) \ g_auto (yaml_event_t) _event; \ memset (&(_event), 0, sizeof (yaml_event_t)) /** * MMD_INIT_YAML_STRING: * @_emitter: (inout): A libyaml emitter object. * @_string: (out): A variable name to use for the new yaml string object. * * This convenience macro allocates and initializes a new yaml string object * named @_string and associates it as the output target for the libyaml * emitter object @_emitter. * * Since: 2.0 */ #define MMD_INIT_YAML_STRING(_emitter, _string) \ g_autoptr (modulemd_yaml_string) _string = \ g_malloc0_n (1, sizeof (modulemd_yaml_string)); \ yaml_emitter_set_output (_emitter, write_yaml_string, (void *)_string) /** * MMD_REINIT_YAML_STRING: * @_emitter: (inout): A libyaml emitter object to reinitialize. * @_string: (inout): A variable name to reinitialize with a new yaml string * object. * * This convenience macro deletes then initializes a new libyaml emitter named * @_emitter, then deletes, reallocates, and initializes a new yaml string * object named @_string and associates it as the output target for @_emitter. * * Since: 2.0 */ #define MMD_REINIT_YAML_STRING(_emitter, _string) \ yaml_emitter_delete (_emitter); \ yaml_emitter_initialize (_emitter); \ g_clear_pointer (&_string, modulemd_yaml_string_free); \ _string = g_malloc0_n (1, sizeof (modulemd_yaml_string)); \ yaml_emitter_set_output (_emitter, write_yaml_string, (void *)_string) /** * YAML_PARSER_PARSE_WITH_EXIT_FULL: * @_parser: (inout): A libyaml parser object positioned at the beginning of an * event. * @_returnval: (in): The value to return in case of a parsing error. * @_event: (out): Returns the libyaml event that was parsed. * @_error: (out): A #GError that will return the reason for a parsing or * validation error. * * DIRECT USE OF THIS MACRO SHOULD BE AVOIDED. This is the internal * implementation for %YAML_PARSER_PARSE_WITH_EXIT_BOOL, * %YAML_PARSER_PARSE_WITH_EXIT_INT, and %YAML_PARSER_PARSE_WITH_EXIT which * should be used instead. * * Returns: Continues on if parsing of the event was successful. Returns * @_returnval if a parse error occurred and sets @_error appropriately. * * Since: 2.0 */ #define YAML_PARSER_PARSE_WITH_EXIT_FULL(_parser, _returnval, _event, _error) \ do \ { \ if (!yaml_parser_parse (_parser, _event)) \ { \ g_debug ("Parser error"); \ g_set_error_literal (_error, \ MODULEMD_YAML_ERROR, \ MMD_YAML_ERROR_UNPARSEABLE, \ "Parser error"); \ return _returnval; \ } \ if ((_event)->type == YAML_SCALAR_EVENT) \ g_debug ("Parser event: %s: %s", \ mmd_yaml_get_event_name ((_event)->type), \ (const gchar *)event.data.scalar.value); \ else \ { \ g_debug ("Parser event: %s", \ mmd_yaml_get_event_name ((_event)->type)); \ } \ } \ while (0) /** * YAML_PARSER_PARSE_WITH_EXIT_BOOL: * @_parser: (inout): A libyaml parser object positioned at the beginning of an * event. * @_event: (out): Returns the libyaml event that was parsed. * @_error: (out): A #GError that will return the reason for a parsing or * validation error. * * Returns: Continues on if parsing of the event was successful. Returns * FALSE if a parse error occurred and sets @_error appropriately. * * Since: 2.0 */ #define YAML_PARSER_PARSE_WITH_EXIT_BOOL(_parser, _event, _error) \ YAML_PARSER_PARSE_WITH_EXIT_FULL (_parser, FALSE, _event, _error) /** * YAML_PARSER_PARSE_WITH_EXIT_INT: * @_parser: (inout): A libyaml parser object positioned at the beginning of an * event. * @_event: (out): Returns the libyaml event that was parsed. * @_error: (out): A #GError that will return the reason for a parsing or * validation error. * * Returns: Continues on if parsing of the event was successful. Returns * 0 if a parse error occurred and sets @_error appropriately. * * Since: 2.0 */ #define YAML_PARSER_PARSE_WITH_EXIT_INT(_parser, _event, _error) \ YAML_PARSER_PARSE_WITH_EXIT_FULL (_parser, 0, _event, _error) /** * YAML_PARSER_PARSE_WITH_EXIT: * @_parser: (inout): A libyaml parser object positioned at the beginning of an * event. * @_event: (out): Returns the libyaml event that was parsed. * @_error: (out): A #GError that will return the reason for a parsing or * validation error. * * Returns: Continues on if parsing of the event was successful. Returns * NULL if a parse error occurred and sets @_error appropriately. * * Since: 2.0 */ #define YAML_PARSER_PARSE_WITH_EXIT(_parser, _event, _error) \ YAML_PARSER_PARSE_WITH_EXIT_FULL (_parser, NULL, _event, _error) /** * MMD_EMIT_WITH_EXIT_FULL: * @_emitter: (inout): A libyaml emitter object positioned where @_event * belongs in the YAML document. * @_returnval: (in): The value to return in case of an output error. * @_event: (in): The libyaml event to be emitted. * @_error: (out): A #GError that will return the reason for an output error. * @...: (in): Additional argument(s) to pass to g_set_error() when setting * @_error in case of failure. * * DIRECT USE OF THIS MACRO SHOULD BE AVOIDED. This is the internal * implementation for %MMD_EMIT_WITH_EXIT and %MMD_EMIT_WITH_EXIT_PTR which * should be used instead. * * Returns: Continues on if emitting of the event was successful. Returns * @_returnval if an output error occurred and sets @_error appropriately. * * Since: 2.0 */ #define MMD_EMIT_WITH_EXIT_FULL(_emitter, _returnval, _event, _error, ...) \ do \ { \ int _ret; \ g_debug ("Emitter event: %s", \ mmd_yaml_get_event_name ((_event)->type)); \ _ret = yaml_emitter_emit (_emitter, _event); \ (_event)->type = 0; \ if (!_ret) \ { \ g_debug (__VA_ARGS__); \ g_set_error ( \ _error, MODULEMD_YAML_ERROR, MMD_YAML_ERROR_EMIT, __VA_ARGS__); \ return _returnval; \ } \ } \ while (0) /** * MMD_EMIT_WITH_EXIT: * @_emitter: (inout): A libyaml emitter object positioned where @_event * belongs in the YAML document. * @_event: (in): The libyaml event to be emitted. * @_error: (out): A #GError that will return the reason for an output error. * @...: (in): Additional argument(s) to pass to g_set_error() when setting * @_error in case of failure. * * Returns: Continues on if emitting of the event was successful. Returns * FALSE if an output error occurred and sets @_error appropriately. * * Since: 2.0 */ #define MMD_EMIT_WITH_EXIT(_emitter, _event, _error, ...) \ MMD_EMIT_WITH_EXIT_FULL (_emitter, FALSE, _event, _error, __VA_ARGS__) /** * MMD_EMIT_WITH_EXIT_PTR: * @_emitter: (inout): A libyaml emitter object positioned where @_event * belongs in the YAML document. * @_event: (in): The libyaml event to be emitted. * @_error: (out): A #GError that will return the reason for an output error. * @...: (in): Additional argument(s) to pass to g_set_error() when setting * @_error in case of failure. * * Returns: Continues on if emitting of the event was successful. Returns * NULL if an output error occurred and sets @_error appropriately. * * Since: 2.0 */ #define MMD_EMIT_WITH_EXIT_PTR(_emitter, _event, _error, ...) \ MMD_EMIT_WITH_EXIT_FULL (_emitter, NULL, _event, _error, __VA_ARGS__) /** * MMD_YAML_ERROR_EVENT_EXIT_FULL: * @_error: (out): A #GError that will return the reason for the error. * @_errorcode: (in): The exact error code that should be set on @_error. * @_event: (in): The libyaml event for which an error is to be reported. * @_returnval: (in): The error value to return. * @...: (in): Additional argument(s) to pass to g_set_error() when setting * @_error. * * DIRECT USE OF THIS MACRO SHOULD BE AVOIDED. This is the internal * implementation for %MMD_YAML_ERROR_EVENT_EXIT, * %MMD_YAML_ERROR_EVENT_EXIT_BOOL, and %MMD_YAML_ERROR_EVENT_EXIT_INT which * should be used instead. * * Returns: Returns @_returnval and sets @_error appropriately. * * Since: 2.0 */ #define MMD_YAML_ERROR_EVENT_EXIT_FULL( \ _error, _errorcode, _event, _returnval, ...) \ do \ { \ g_autofree gchar *formatted = g_strdup_printf (__VA_ARGS__); \ g_autofree gchar *formatted2 = \ g_strdup_printf ("%s [line %zu col %zu]", \ formatted, \ _event.start_mark.line + 1, \ _event.start_mark.column + 1); \ g_debug ("%s", formatted2); \ g_set_error ( \ _error, MODULEMD_YAML_ERROR, _errorcode, "%s", formatted2); \ return _returnval; \ } \ while (0) /** * MMD_YAML_ERROR_EVENT_EXIT: * @_error: (out): A #GError that will return the reason for the error. * @_event: (in): The libyaml event for which an error is to be reported. * @...: (in): Additional argument(s) to pass to g_set_error() when setting * @_error. * * Returns: Returns NULL and sets @_error appropriately. * * Since: 2.0 */ #define MMD_YAML_ERROR_EVENT_EXIT(_error, _event, ...) \ MMD_YAML_ERROR_EVENT_EXIT_FULL ( \ _error, MMD_YAML_ERROR_PARSE, _event, NULL, __VA_ARGS__) /** * MMD_YAML_ERROR_EVENT_EXIT_BOOL: * @_error: (out): A #GError that will return the reason for the error. * @_event: (in): The libyaml event for which an error is to be reported. * @...: (in): Additional argument(s) to pass to g_set_error() when setting * @_error. * * Returns: Returns FALSE and sets @_error appropriately. * * Since: 2.0 */ #define MMD_YAML_ERROR_EVENT_EXIT_BOOL(_error, _event, ...) \ MMD_YAML_ERROR_EVENT_EXIT_FULL ( \ _error, MMD_YAML_ERROR_PARSE, _event, FALSE, __VA_ARGS__) /** * MMD_YAML_ERROR_EVENT_EXIT_INT: * @_error: (out): A #GError that will return the reason for the error. * @_event: (in): The libyaml event for which an error is to be reported. * @...: (in): Additional argument(s) to pass to g_set_error() when setting * @_error. * * Returns: Returns 0 and sets @_error appropriately. * * Since: 2.0 */ #define MMD_YAML_ERROR_EVENT_EXIT_INT(_error, _event, ...) \ MMD_YAML_ERROR_EVENT_EXIT_FULL ( \ _error, MMD_YAML_ERROR_PARSE, _event, 0, __VA_ARGS__) /** * MMD_SET_PARSED_YAML_STRING: * @_parser: (inout): A libyaml parser object positioned at the beginning of an * expected string event. * @_error: (out): A #GError that will return the reason for a parsing or * validation error. * @_fn: (in): A setter method for a property of object @_obj to be called with * the successfully parsed string. * @_obj: (inout): The object that is to store the parsed string via its @_fn * setter method. * * This convenience macro can be used when a YAML string (scalar) event is * expected, and that string is to be stored in a property of libmodulemd * object @_obj via setter method @_fn. * * Returns: Continues on if parsing of the event was successful. Returns * NULL if a parse error occurred and sets @_error appropriately. * * Since: 2.0 */ #define MMD_SET_PARSED_YAML_STRING(_parser, _error, _fn, _obj) \ do \ { \ GError *_nested_error = NULL; \ g_autofree gchar *_scalar = \ modulemd_yaml_parse_string (_parser, &_nested_error); \ if (!_scalar) \ { \ g_propagate_error (_error, _nested_error); \ return NULL; \ } \ _fn (_obj, _scalar); \ g_clear_pointer (&_scalar, g_free); \ } \ while (0) /** * mmd_emitter_start_stream: * @emitter: (inout): A libyaml emitter object that will be positioned at the * beginning of a new YAML output stream. * @error: (out): A #GError that will return the reason for any error. * * Returns: TRUE if the YAML stream was started successfully. Returns FALSE if * an error occurred and sets @error appropriately. * * Since: 2.0 */ gboolean mmd_emitter_start_stream (yaml_emitter_t *emitter, GError **error); /** * mmd_emitter_end_stream: * @emitter: (inout): A libyaml emitter object that is positioned at the end of * a YAML output stream to be closed. * @error: (out): A #GError that will return the reason for any error. * * Returns: TRUE if the YAML stream was closed successfully. Returns FALSE if * an error occurred and sets @error appropriately. * * Since: 2.0 */ gboolean mmd_emitter_end_stream (yaml_emitter_t *emitter, GError **error); /** * mmd_emitter_start_document: * @emitter: (inout): A libyaml emitter object that is positioned at the start * of where a new YAML document will be written. * @error: (out): A #GError that will return the reason for any error. * * Emits a YAML document start header line. * * Returns: TRUE if the YAML document was started successfully. Returns FALSE * if an error occurred and sets @error appropriately. * * Since: 2.0 */ gboolean mmd_emitter_start_document (yaml_emitter_t *emitter, GError **error); /** * mmd_emitter_end_document: * @emitter: (inout): A libyaml emitter object that is positioned at the start * of where a YAML document terminator will be written. * @error: (out): A #GError that will return the reason for any error. * * Emits a YAML document termination line. * * Returns: TRUE if the YAML document was terminated successfully. Returns * FALSE if an error occurred and sets @error appropriately. * * Since: 2.0 */ gboolean mmd_emitter_end_document (yaml_emitter_t *emitter, GError **error); /** * mmd_emitter_start_mapping: * @emitter: (inout): A libyaml emitter object that is positioned at the start * of where a new mapping will be written. * @style: (in): The YAML mapping style for the output. * @error: (out): A #GError that will return the reason for any error. * * Returns: TRUE if the YAML mapping was started successfully. Returns FALSE if * an error occurred and sets @error appropriately. * * Since: 2.0 */ gboolean mmd_emitter_start_mapping (yaml_emitter_t *emitter, yaml_mapping_style_t style, GError **error); /** * mmd_emitter_end_mapping: * @emitter: (inout): A libyaml emitter object that is positioned at the start * of where a mapping ending will be written. * @error: (out): A #GError that will return the reason for any error. * * Returns: TRUE if the YAML mapping was ended successfully. Returns FALSE if * an error occurred and sets @error appropriately. * * Since: 2.0 */ gboolean mmd_emitter_end_mapping (yaml_emitter_t *emitter, GError **error); /** * mmd_emitter_start_sequence: * @emitter: (inout): A libyaml emitter object that is positioned at the start * of where a new sequence will be written. * @style: (in): The YAML sequence style for the output. * @error: (out): A #GError that will return the reason for any error. * * Returns: TRUE if the YAML sequence was started successfully. Returns FALSE * if an error occurred and sets @error appropriately. * * Since: 2.0 */ gboolean mmd_emitter_start_sequence (yaml_emitter_t *emitter, yaml_sequence_style_t style, GError **error); /** * mmd_emitter_end_sequence: * @emitter: (inout): A libyaml emitter object that is positioned at the start * of where a sequence ending will be written. * @error: (out): A #GError that will return the reason for any error. * * Returns: TRUE if the YAML sequence was ended successfully. Returns FALSE if * an error occurred and sets @error appropriately. * * Since: 2.0 */ gboolean mmd_emitter_end_sequence (yaml_emitter_t *emitter, GError **error); /** * mmd_emitter_scalar: * @emitter: (inout): A libyaml emitter object that is positioned at the start * of where a scalar will be written. * @scalar: (in): The scalar (string) to be written. * @style: (in): The YAML scalar style for the output. * @error: (out): A #GError that will return the reason for any error. * * Returns: TRUE if the YAML scalar was written successfully. Returns FALSE if * an error occurred and sets @error appropriately. * * Since: 2.0 */ gboolean mmd_emitter_scalar (yaml_emitter_t *emitter, const gchar *scalar, yaml_scalar_style_t style, GError **error); /** * mmd_emitter_scalar_string: * @emitter: (inout): A libyaml emitter object that is positioned at the start * of where a scalar will be written. * @scalar: (in) (nullable): The scalar string to be written. If the string * looks like a number or is empty or undefined, it will be explicitly quoted. * @error: (out): A #GError that will return the reason for any error. * * Returns: TRUE if the YAML scalar was written successfully. Returns FALSE if * an error occurred and sets @error appropriately. * * Since: 2.15 */ gboolean mmd_emitter_scalar_string (yaml_emitter_t *emitter, const gchar *scalar, GError **error); /** * mmd_emitter_strv: * @emitter: (inout): A libyaml emitter object positioned at the start of where * a string sequence will be written. * @seq_style: (in): The YAML sequence style for the output. * @list: (in): A list that will be emitted to the YAML emitter. * @error: (out): A #GError that will return the reason for an emitting error. * * Returns: TRUE if the sequence emitted successfully. FALSE if an error was * encountered and sets @error appropriately. * * Since: 2.0 */ gboolean mmd_emitter_strv (yaml_emitter_t *emitter, yaml_sequence_style_t seq_style, GStrv list, GError **error); /** * modulemd_yaml_parse_date: * @parser: (inout): A libyaml parser object positioned at the beginning of a * date (YYYY-MM-DD) scalar entry. * @error: (out): A #GError that will return the reason for a parsing or * validation error. * * Returns: (transfer full): A newly-allocated #GDate representing the parsed * value. NULL if a parse or validation error occurred and sets @error * appropriately. * * Since: 2.0 */ GDate * modulemd_yaml_parse_date (yaml_parser_t *parser, GError **error); /** * modulemd_yaml_parse_string: * @parser: (inout): A libyaml parser object positioned at the beginning of a * string scalar entry. * @error: (out): A #GError that will return the reason for a parsing or * validation error. * * Returns: (transfer full): A newly-allocated `gchar *` representing the * parsed value. NULL if a parse error occurred and sets @error appropriately. * * Since: 2.0 */ gchar * modulemd_yaml_parse_string (yaml_parser_t *parser, GError **error); /** * modulemd_yaml_parse_bool: * @parser: (inout): A libyaml parser object positioned at the beginning of a * boolean scalar entry. * @error: (out): A #GError that will return the reason for a parsing or * validation error. * * Returns: A boolean representing the parsed value. Returns FALSE if a parse * error occurred and sets @error appropriately. * * Since: 2.2 */ gboolean modulemd_yaml_parse_bool (yaml_parser_t *parser, GError **error); /** * modulemd_yaml_parse_int64: * @parser: (inout): A libyaml parser object positioned at the beginning of a * int64 scalar entry. * @error: (out): A #GError that will return the reason for a parsing or * validation error. * * Returns: (transfer full): A 64-bit signed integer representing the parsed * value. Returns 0 if a parse error occurred and sets @error appropriately. * * Since: 2.0 */ gint64 modulemd_yaml_parse_int64 (yaml_parser_t *parser, GError **error); /** * modulemd_yaml_parse_uint64: * @parser: (inout): A libyaml parser object positioned at the beginning of a * uint64 scalar entry. * @error: (out): A #GError that will return the reason for a parsing or * validation error. * * Returns: (transfer full): A 64-bit unsigned integer representing the parsed * value. Returns 0 if a parse error occurred and sets @error appropriately. * * Since: 2.0 */ guint64 modulemd_yaml_parse_uint64 (yaml_parser_t *parser, GError **error); /** * modulemd_yaml_parse_string_set: * @parser: (inout): A libyaml parser object positioned at the beginning of a * sequence with string scalars. * @error: (out): A #GError that will return the reason for a parsing or * validation error. * * Returns: (transfer full): A newly-allocated #GHashTable * representing the * parsed value. All parsed sequence entries are added as keys in the * hashtable. NULL if a parse error occurred and sets @error appropriately. * * Since: 2.0 */ GHashTable * modulemd_yaml_parse_string_set (yaml_parser_t *parser, GError **error); /** * modulemd_yaml_parse_string_set_from_map: * @parser: (inout): A libyaml parser object positioned at the beginning of a * map containing a single key which is a sequence with string scalars. * @key: (in): The key in a single-key mapping whose contents should be * returned as a string set. * @strict: (in): Whether the parser should return failure if it encounters an * unknown mapping key or if it should ignore it. * @error: (out): A #GError that will return the reason for a parsing or * validation error. * * Function for retrieving a string set from a single-key map such as * data.artifacts, data.api or data.filter from a module stream document. * * Returns: (transfer full): A newly-allocated #GHashTable * representing the * parsed values. All parsed sequence entries are added as keys in the * hashtable. NULL if a parse error occurred and sets @error appropriately. * * Since: 2.0 */ GHashTable * modulemd_yaml_parse_string_set_from_map (yaml_parser_t *parser, const gchar *key, gboolean strict, GError **error); /** * modulemd_yaml_parse_string_string_map: * @parser: (inout): A libyaml parser object positioned at the beginning of a * map containing a scalar/scalar key/value pairs. * @error: (out): A #GError that will return the reason for a parsing or * validation error. * * Function for retrieving a hash table from a str/str map such as * data.dependencies in ModuleStreamV1. * * Returns: (transfer full): A newly-allocated #GHashTable * representing the * parsed values. NULL if a parse error occurred and sets @error appropriately. * * Since: 2.0 */ GHashTable * modulemd_yaml_parse_string_string_map (yaml_parser_t *parser, GError **error); /** * modulemd_yaml_parse_nested_set: * @parser: (inout): A libyaml parser object positioned at the beginning of a * map containing scalar keys with string set values. * @error: (out): A #GError that will return the reason for a parsing or * validation error. * * Function for retrieving a hash table from a str/string-set map such as * data.dependencies in #ModulemdModuleStreamV2. * * Returns: (transfer full): A newly-allocated #GHashTable * representing the * parsed values. NULL if a parse error occurred and sets @error appropriately. * * Since: 2.10 */ GHashTable * modulemd_yaml_parse_nested_set (yaml_parser_t *parser, GError **error); /** * modulemd_yaml_emit_nested_set: * @emitter: (inout): A libyaml emitter object that is positioned where a nested * set (a map containing scalar keys with string set values) should occur. * @table: (in): The nested set to emit. * @error: (out): A #GError that will return the reason for failing to emit. * * Returns: TRUE if the nested set emitted successfully. FALSE if an error was * encountered and sets @error appropriately. * * Since: 2.10 */ gboolean modulemd_yaml_emit_nested_set (yaml_emitter_t *emitter, GHashTable *table, GError **error); /** * modulemd_yaml_parse_document_type: * @parser: (inout): A libyaml parser object positioned at the beginning of a * yaml subdocument immediately prior to a `YAML_DOCUMENT_START_EVENT`. * * Reads through a YAML subdocument to retrieve the document type, metadata * version and the data section. * * Returns: (transfer full): A #ModulemdSubdocumentInfo with information on * the parse results. * * Since: 2.0 */ ModulemdSubdocumentInfo * modulemd_yaml_parse_document_type (yaml_parser_t *parser); /** * modulemd_yaml_emit_document_headers: * @emitter: (inout): A libyaml emitter object that is positioned where the * `YAML_DOCUMENT_START_EVENT` should occur (so this must be after either a * `YAML_STREAM_START_EVENT` or `YAML_DOCUMENT_END_EVENT`). * @doctype: (in): The document type (see #ModulemdYamlDocumentTypeEnum) * @mdversion: (in): The metadata version for this document * @error: (out): A #GError that will return the reason for failing to emit. * * Creates the YAML header and returns @emitter positioned just before the * `YAML_MAPPING_START` for the "data:" section. * * Returns: TRUE if the document emitted successfully. FALSE if an error was * encountered and sets @error appropriately. * * Since: 2.0 */ gboolean modulemd_yaml_emit_document_headers (yaml_emitter_t *emitter, ModulemdYamlDocumentTypeEnum doctype, guint64 mdversion, GError **error); /** * modulemd_yaml_emit_variant: * @emitter: (inout): A libyaml emitter object that is positioned where the * variant should occur. * @variant: (in): The variant to emit. It must be either a boolean, string, * array or dictionary. * @error: (out): A #GError that will return the reason for failing to emit. * * Returns: TRUE if the variant emitted successfully. FALSE if an error was * encountered and sets @error appropriately. * * Since: 2.0 */ gboolean modulemd_yaml_emit_variant (yaml_emitter_t *emitter, GVariant *variant, GError **error); /** * mmd_variant_from_scalar: * @scalar: (in): A string or boolean value to read into a #GVariant * * Returns: (transfer full): A new, floating #GVariant representing a string * or boolean value matching the scalar passed in. * * Since: 2.0 */ GVariant * mmd_variant_from_scalar (const gchar *scalar); /** * mmd_variant_from_mapping: * @parser: (inout): A YAML parser positioned just after a `MAPPING_START` * @error: (out): A #GError that will return the reason for failing to parse. * * Returns: (transfer full): A new, floating #GVariant representing a hash * table with string keys and #GVariant values. * * Since: 2.0 */ GVariant * mmd_variant_from_mapping (yaml_parser_t *parser, GError **error); /** * mmd_variant_from_sequence: * @parser: (inout): A YAML parser positioned just after a `SEQUENCE_START` * @error: (out): A #GError that will return the reason for failing to parse. * * Returns: (transfer full): A new, floating #GVariant representing a list of * #GVariant values. * * Since: 2.0 */ GVariant * mmd_variant_from_sequence (yaml_parser_t *parser, GError **error); /** * mmd_parse_xmd: * @parser: (inout): A YAML parser positioned just after an 'xmd' mapping key. * @error: (out): A #GError that will return the reason for failing to parse. * * Returns: (transfer full): A new, floating #GVariant representing the parsed * XMD (eXtensible MetaData). * * Since: 2.10 */ GVariant * mmd_parse_xmd (yaml_parser_t *parser, GError **error); /** * skip_unknown_yaml: * @parser: (inout): A YAML parser positioned just after an unexpected map key. * @error: (out): A #GError that will return the reason for failing to parse. * * This function is used to skip a section of YAML that contains unknown keys. * The intent here is that it will allow libmodulemd to be forward-compatible * with new, backwards-compatible changes in the metadata format. This function * will advance @parser to just before the next key in the map. * * Returns: TRUE if the parser was able to skip the unknown values safely. * FALSE and sets @error appropriately if the document was malformed YAML. */ gboolean skip_unknown_yaml (yaml_parser_t *parser, GError **error); /** * SKIP_UNKNOWN: * @_parser: (inout): A YAML parser positioned just after an unexpected map key. * @_returnval: (in): The error value to return. * @...: (in): Additional argument(s) to pass to g_set_error() when setting * `error`. * * This convenience macro is a wrapper around skip_unknown_yaml() used to skip * a section of YAML that contains unknown keys. * * NOTE: Local variables `strict` and `error` are expected to be present in the * code from which this macro is used. * * Returns: If `strict` is TRUE or skip_unknown_yaml() fails, @_returnval is * returned and `error` is set appropriately. * * Since: 2.0 */ #define SKIP_UNKNOWN(_parser, _returnval, ...) \ do \ { \ g_debug (__VA_ARGS__); \ if (strict) \ { \ MMD_YAML_ERROR_EVENT_EXIT_FULL (error, \ MMD_YAML_ERROR_UNKNOWN_ATTR, \ event, \ _returnval, \ __VA_ARGS__); \ } \ \ if (!skip_unknown_yaml (_parser, error)) \ return _returnval; \ break; \ } \ while (0) /* A set of macros for simple emitting of common elements */ /** * NON_EMPTY_TABLE: * @table: A #GHashTable. * * Returns: FALSE if @table is empty, otherwise TRUE. * * Since: 2.0 */ #define NON_EMPTY_TABLE(table) (g_hash_table_size (table) != 0) /** * NON_EMPTY_ARRAY: * @array: A #GPtrArray. * * Returns: FALSE if @array is empty, otherwise TRUE. * * Since: 2.0 */ #define NON_EMPTY_ARRAY(array) (array->len != 0) /** * EMIT_SCALAR_FULL: * @emitter: (inout): A libyaml emitter object positioned where a scalar * belongs in the YAML document. * @error: (out): A #GError that will return the reason for an output error. * @value: (in): The scalar (string) to be written. * @style: (in): The YAML scalar style for the output. * * Emits scalar @value using style @style. * * Returns: Continues on if the YAML scalar was written successfully. Returns * FALSE if an error occurred and sets @error appropriately. * * Since: 2.1 */ #define EMIT_SCALAR_FULL(emitter, error, value, style) \ do \ { \ if (!mmd_emitter_scalar (emitter, value, style, error)) \ return FALSE; \ } \ while (0) /** * EMIT_SCALAR: * @emitter: (inout): A libyaml emitter object positioned where a scalar * belongs in the YAML document. * @error: (out): A #GError that will return the reason for an output error. * @value: (in): The scalar (string) to be written. * * Emits scalar @value using style `YAML_PLAIN_SCALAR_STYLE`. * * Returns: Continues on if the YAML scalar was written successfully. Returns * FALSE if an error occurred and sets @error appropriately. * * Since: 2.0 */ #define EMIT_SCALAR(emitter, error, value) \ EMIT_SCALAR_FULL (emitter, error, value, YAML_PLAIN_SCALAR_STYLE) /** * EMIT_SCALAR_STRING: * @emitter: (inout): A libyaml emitter object positioned where a scalar * belongs in the YAML document. * @error: (out): A #GError that will return the reason for an output error. * @value: (in): The scalar (string) to be written. * * Emits a string @value. Using style `YAML_DOUBLE_QUOTED_SCALAR_STYLE` style * if the @value is empty or looks like a number. Otherwise, using * `YAML_PLAIN_SCALAR_STYLE` style. This autoquoting of number-like * strings is in place to prevent other YAML applications from trimming * trailing null digits and to force them handle the values as a string (e.g. * "1.0" will be serialized as "1.0" instead of 1.0 which some applications * interpret as 1. We do not always quote to keep the YAML file concise and * similar to previous serialization styles. * * Returns: Continues on if the YAML scalar was written successfully. Returns * FALSE if an error occurred and sets @error appropriately. * * Since: 2.15 */ #define EMIT_SCALAR_STRING(emitter, error, value) \ do \ { \ if (!mmd_emitter_scalar_string ((emitter), (value), (error))) \ return FALSE; \ } \ while (0) /** * EMIT_KEY_VALUE_FULL: * @emitter: (inout): A libyaml emitter object positioned where a scalar * belongs in the YAML document. * @error: (out): A #GError that will return the reason for an output error. * @key: (in): The key (string) to be written. * @value: (in): The scalar (string) to be written. * @style: (in): The YAML scalar style for the output. * * Emits key/value pair (@key: @value) using style @style. * * NOTE: This macro outputs both a key and a value for that key, thus it must * only be used from within a YAML mapping. * * Returns: Continues on if the YAML key/value pair was written successfully. * Returns FALSE if an error occurred and sets @error appropriately. * * Since: 2.1 */ #define EMIT_KEY_VALUE_FULL(emitter, error, key, value, style) \ do \ { \ if (value == NULL) \ { \ g_set_error (error, \ MODULEMD_YAML_ERROR, \ MMD_YAML_ERROR_EMIT, \ "Value for key %s was NULL on emit", \ key); \ return FALSE; \ } \ EMIT_SCALAR (emitter, error, key); \ EMIT_SCALAR_FULL (emitter, error, value, style); \ } \ while (0) /** * EMIT_KEY_VALUE: * @emitter: (inout): A libyaml emitter object positioned where a scalar * belongs in the YAML document. * @error: (out): A #GError that will return the reason for an output error. * @key: (in): The key (string) to be written. * @value: (in): The scalar (string) to be written. * * Emits key/value pair (@key: @value) using style `YAML_PLAIN_SCALAR_STYLE`. * * NOTE: This macro outputs both a key and a value for that key, thus it must * only be used from within a YAML mapping. * * Returns: Continues on if the YAML key/value pair was written successfully. * Returns FALSE if an error occurred and sets @error appropriately. * * Since: 2.0 */ #define EMIT_KEY_VALUE(emitter, error, key, value) \ EMIT_KEY_VALUE_FULL (emitter, error, key, value, YAML_PLAIN_SCALAR_STYLE) /** * EMIT_KEY_VALUE_STRING: * @emitter: (inout): A libyaml emitter object positioned where a scalar * belongs in the YAML document. * @error: (out): A #GError that will return the reason for an output error. * @key: (in): The key (string) to be written. * @value: (in): The scalar (string) to be written. * * Emits key/value pair (@key: @value) using YAML_DOUBLE_QUOTED_SCALAR_STYLE * style for number-like keys/values, YAML_PLAIN_SCALAR_STYLE otherwise. * * NOTE: This macro outputs both a key and a value for that key, thus it must * only be used from within a YAML mapping. * * Returns: Continues on if the YAML key/value pair was written successfully. * Returns FALSE if an error occurred and sets @error appropriately. * * Since: 2.15 */ #define EMIT_KEY_VALUE_STRING(emitter, error, key, value) \ do \ { \ if ((value) == NULL) \ { \ g_set_error ((error), \ MODULEMD_YAML_ERROR, \ MMD_YAML_ERROR_EMIT, \ "Value for key %s was NULL on emit", \ (key)); \ return FALSE; \ } \ EMIT_SCALAR_STRING ((emitter), (error), (key)); \ EMIT_SCALAR_STRING ((emitter), (error), (value)); \ } \ while (0) /** * EMIT_KEY_VALUE_IF_SET: * @emitter: (inout): A libyaml emitter object positioned where a scalar * belongs in the YAML document. * @error: (out): A #GError that will return the reason for an output error. * @key: (in): The key (string) to be written. * @value: (in): The scalar (string) to be written. * * Emits key/value pair (@key: @value) only if @value is not NULL. The * emission is performed in YAML_PLAIN_SCALAR_STYLE style. * * NOTE: This macro outputs both a key and a value for that key, thus it must * only be used from within a YAML mapping. * * Returns: Continues on if @value is NULL or the YAML key/value pair was * written successfully. Returns FALSE if an error occurred and sets @error * appropriately. * * Since: 2.0 */ #define EMIT_KEY_VALUE_IF_SET(emitter, error, key, value) \ do \ { \ if ((value) != NULL) \ { \ EMIT_KEY_VALUE ((emitter), (error), (key), (value)); \ } \ } \ while (0) /** * EMIT_KEY_VALUE_STRING_IF_SET: * @emitter: (inout): A libyaml emitter object positioned where a scalar * belongs in the YAML document. * @error: (out): A #GError that will return the reason for an output error. * @key: (in): The key (string) to be written. * @value: (in): The scalar (string) to be written. * * Emits key/value pair (@key: @value) only if @value is not NULL. The * emission is performed in YAML_DOUBLE_QUOTED_SCALAR_STYLE style if the * key/value looks like a number, otherwise in YAML_PLAIN_SCALAR_STYLE style. * * NOTE: This macro outputs both a key and a value for that key, thus it must * only be used from within a YAML mapping. * * Returns: Continues on if @value is NULL or the YAML key/value pair was * written successfully. Returns FALSE if an error occurred and sets @error * appropriately. * * Since: 2.15 */ #define EMIT_KEY_VALUE_STRING_IF_SET(emitter, error, key, value) \ do \ { \ if ((value) != NULL) \ { \ EMIT_KEY_VALUE_STRING ((emitter), (error), (key), (value)); \ } \ } \ while (0) /** * EMIT_MAPPING_START_WITH_STYLE: * @emitter: (inout): A libyaml emitter object that is positioned at the start * of where a new mapping will be written. * @error: (out): A #GError that will return the reason for any error. * @style: (in): The YAML mapping style for the output. * * Returns: Continues on if the YAML mapping was started successfully. Returns * FALSE if an error occurred and sets @error appropriately. * * Since: 2.0 */ #define EMIT_MAPPING_START_WITH_STYLE(emitter, error, style) \ do \ { \ if (!mmd_emitter_start_mapping (emitter, style, error)) \ return FALSE; \ } \ while (0) /** * EMIT_MAPPING_START: * @emitter: (inout): A libyaml emitter object that is positioned at the start * of where a new mapping will be written. * @error: (out): A #GError that will return the reason for any error. * * Returns: Continues on if the YAML mapping was started successfully using * style `YAML_BLOCK_MAPPING_STYLE`. Returns FALSE if an error occurred and * sets @error appropriately. * * Since: 2.0 */ #define EMIT_MAPPING_START(emitter, error) \ EMIT_MAPPING_START_WITH_STYLE (emitter, error, YAML_BLOCK_MAPPING_STYLE) /** * EMIT_MAPPING_END: * @emitter: (inout): A libyaml emitter object that is positioned at the start * of where a mapping ending will be written. * @error: (out): A #GError that will return the reason for any error. * * Returns: Continues on if the YAML mapping was ended successfully. Returns * FALSE if an error occurred and sets @error appropriately. * * Since: 2.0 */ #define EMIT_MAPPING_END(emitter, error) \ do \ { \ if (!mmd_emitter_end_mapping (emitter, error)) \ return FALSE; \ } \ while (0) /** * EMIT_SEQUENCE_START_WITH_STYLE: * @emitter: (inout): A libyaml emitter object that is positioned at the start * of where a new sequence will be written. * @error: (out): A #GError that will return the reason for any error. * @style: (in): The YAML sequence style for the output. * * Returns: Continues on if the YAML sequence was started successfully. Returns * FALSE if an error occurred and sets @error appropriately. * * Since: 2.0 */ #define EMIT_SEQUENCE_START_WITH_STYLE(emitter, error, style) \ do \ { \ if (!mmd_emitter_start_sequence (emitter, style, error)) \ return FALSE; \ } \ while (0) /** * EMIT_SEQUENCE_START: * @emitter: (inout): A libyaml emitter object that is positioned at the start * of where a new sequence will be written. * @error: (out): A #GError that will return the reason for any error. * * Returns: Continues on if the YAML sequence was started successfully using * style `YAML_BLOCK_SEQUENCE_STYLE`. Returns FALSE if an error occurred and * sets @error appropriately. * * Since: 2.0 */ #define EMIT_SEQUENCE_START(emitter, error) \ EMIT_SEQUENCE_START_WITH_STYLE (emitter, error, YAML_BLOCK_SEQUENCE_STYLE) /** * EMIT_SEQUENCE_END: * @emitter: (inout): A libyaml emitter object that is positioned at the start * of where a sequence ending will be written. * @error: (out): A #GError that will return the reason for any error. * * Returns: Continues on if the YAML sequence was ended successfully. Returns * FALSE if an error occurred and sets @error appropriately. * * Since: 2.0 */ #define EMIT_SEQUENCE_END(emitter, error) \ do \ { \ if (!mmd_emitter_end_sequence (emitter, error)) \ return FALSE; \ } \ while (0) /** * EMIT_HASHTABLE_VALUES_IF_NON_EMPTY: * @emitter: (inout): A libyaml emitter object that is positioned at the start * of where a new mapping will be written. * @error: (out): A #GError that will return the reason for any error. * @key: (in): The name to be used as the identifier for the output mapping. * @table: (in): The #GHashTable that is to be output. * @emitfn: (in): A function used to emit each of the hash table values. * * Does nothing if the hash table @table is empty. Otherwise, calls @emitfn * to emit each of the values from @table identified as @key. * * NOTE: This macro outputs both a key and a sub-mapping value for that key, * thus it must only be used from within a YAML mapping. * * Returns: Continues on if the YAML mapping was output successfully. Returns * FALSE if an error occurred and sets @error appropriately. * * Since: 2.0 */ #define EMIT_HASHTABLE_VALUES_IF_NON_EMPTY( \ emitter, error, key, table, emitfn) \ do \ { \ if (NON_EMPTY_TABLE (table)) \ { \ EMIT_SCALAR (emitter, error, key); \ EMIT_MAPPING_START (emitter, error); \ gsize i; \ g_autoptr (GPtrArray) keys = \ modulemd_ordered_str_keys (table, modulemd_strcmp_sort); \ for (i = 0; i < keys->len; i++) \ { \ if (!emitfn ( \ g_hash_table_lookup (table, g_ptr_array_index (keys, i)), \ emitter, \ error)) \ return FALSE; \ } \ EMIT_MAPPING_END (emitter, error); \ } \ } \ while (0) /** * EMIT_HASHTABLE_KEY_VALUES_IF_NON_EMPTY: * @emitter: (inout): A libyaml emitter object that is positioned at the start * of where a new mapping will be written. * @error: (out): A #GError that will return the reason for any error. * @key: (in): The name to be used as the identifier for the output mapping. * @table: (in): The #GHashTable that is to be output. Both the keys and values * must be strings. * * Does nothing if the hash table @table is empty. Otherwise, outputs a YAML * mapping with the key/value pairs from @table identified as @key. * * NOTE: This macro outputs both a key and a sub-mapping value for that key, * thus it must only be used from within a YAML mapping. * * Returns: Continues on if the YAML mapping was output successfully. Returns * FALSE if an error occurred and sets @error appropriately. * * Since: 2.0 */ #define EMIT_HASHTABLE_KEY_VALUES_IF_NON_EMPTY(emitter, error, key, table) \ do \ { \ if (NON_EMPTY_TABLE (table)) \ { \ EMIT_SCALAR (emitter, error, key); \ EMIT_MAPPING_START (emitter, error); \ gsize i; \ g_autoptr (GPtrArray) keys = \ modulemd_ordered_str_keys (table, modulemd_strcmp_sort); \ for (i = 0; i < keys->len; i++) \ { \ EMIT_SCALAR (emitter, error, g_ptr_array_index (keys, i)); \ EMIT_SCALAR ( \ emitter, \ error, \ g_hash_table_lookup (table, g_ptr_array_index (keys, i))); \ } \ EMIT_MAPPING_END (emitter, error); \ } \ } \ while (0) /** * EMIT_STRING_SET: * @emitter: (inout): A libyaml emitter object that is positioned at the start * of where a new sequence will be written. * @error: (out): A #GError that will return the reason for any error. * @key: (in): The name to be used as the identifier for the output sequence. * @table: (in): The #GHashTable that is to be output. The keys are expected to * be a set() of strings. * * Raises an error if the hash table @table is empty. Otherwise, outputs a YAML * sequence using style `YAML_BLOCK_SEQUENCE_STYLE` with the keys from @table * identified as @key. * * NOTE: This macro outputs both a key and an array value for that key, thus it * must only be used from within a YAML mapping. * * Returns: Continues on if the YAML sequence was output successfully. Returns * FALSE if an error occurred and sets @error appropriately. * * Since: 2.0 */ #define EMIT_STRING_SET(emitter, error, key, table) \ do \ { \ if (!NON_EMPTY_TABLE (table)) \ { \ g_set_error (error, \ MODULEMD_YAML_ERROR, \ MMD_YAML_ERROR_EMIT, \ "String set for key %s was empty on emit", \ key); \ return FALSE; \ } \ EMIT_STRING_SET_FULL ( \ emitter, error, key, table, YAML_BLOCK_SEQUENCE_STYLE); \ } \ while (0) /** * EMIT_STRING_SET_IF_NON_EMPTY: * @emitter: (inout): A libyaml emitter object that is positioned at the start * of where a new sequence will be written. * @error: (out): A #GError that will return the reason for any error. * @key: (in): The name to be used as the identifier for the output sequence. * @table: (in): The #GHashTable that is to be output. The keys are expected to * be a set() of strings. * * Does nothing if the hash table @table is empty. Otherwise, outputs a YAML * sequence using style `YAML_BLOCK_SEQUENCE_STYLE` with the keys from @table * identified as @key. * * NOTE: This macro outputs both a key and an array value for that key, thus it * must only be used from within a YAML mapping. * * Returns: Continues on if the YAML sequence was output successfully. Returns * FALSE if an error occurred and sets @error appropriately. * * Since: 2.0 */ #define EMIT_STRING_SET_IF_NON_EMPTY(emitter, error, key, table) \ do \ { \ if (NON_EMPTY_TABLE (table)) \ { \ EMIT_STRING_SET (emitter, error, key, table); \ } \ } \ while (0) /** * EMIT_STRING_SET_FULL: * @emitter: (inout): A libyaml emitter object that is positioned at the start * of where a new sequence will be written. * @error: (out): A #GError that will return the reason for any error. * @key: (in): The name to be used as the identifier for the output sequence. * @table: (in): The #GHashTable that is to be output. The keys are expected to * be a set() of strings. * @sequence_style: (in): The YAML sequence style for the output. * * Outputs a YAML sequence with the keys from @table identified as @key. * * NOTE: This macro outputs both a key and an array value for that key, thus it * must only be used from within a YAML mapping. * * Returns: Continues on if the YAML sequence was output successfully. Returns * FALSE if an error occurred and sets @error appropriately. * * Since: 2.1 */ #define EMIT_STRING_SET_FULL(emitter, error, key, table, sequence_style) \ do \ { \ EMIT_SCALAR_STRING (emitter, error, key); \ EMIT_SEQUENCE_START_WITH_STYLE (emitter, error, sequence_style); \ gsize i; \ g_autoptr (GPtrArray) keys = \ modulemd_ordered_str_keys (table, modulemd_strcmp_sort); \ for (i = 0; i < keys->len; i++) \ { \ EMIT_SCALAR_STRING (emitter, error, g_ptr_array_index (keys, i)); \ } \ EMIT_SEQUENCE_END (emitter, error); \ } \ while (0) /** * EMIT_ARRAY_VALUES: * @emitter: (inout): A libyaml emitter object that is positioned at the start * of where a new sequence will be written. * @error: (out): A #GError that will return the reason for any error. * @key: (in): The name to be used as the identifier for the output sequence. * @array: (in): The #GPtrArray that is to be output. * @emitfn: (in): A function used to emit each of the array values. * * Raises an error if the array @array is empty. Otherwise, calls @emitfn * to emit each of the values from @array identified as @key. * * NOTE: This macro outputs both a key and an array value for that key, thus it * must only be used from within a YAML mapping. * * Returns: Continues on if the YAML sequence was output successfully. Returns * FALSE if an error occurred and sets @error appropriately. * * Since: 2.0 */ #define EMIT_ARRAY_VALUES(emitter, error, key, array, emitfn) \ do \ { \ if (!NON_EMPTY_ARRAY (array)) \ { \ g_set_error (error, \ MODULEMD_YAML_ERROR, \ MMD_YAML_ERROR_EMIT, \ "Array for key %s was empty on emit", \ key); \ return FALSE; \ } \ EMIT_SCALAR (emitter, error, key); \ EMIT_SEQUENCE_START (emitter, error); \ gsize i; \ for (i = 0; i < array->len; i++) \ { \ if (!emitfn (g_ptr_array_index (array, i), emitter, error)) \ return FALSE; \ } \ EMIT_SEQUENCE_END (emitter, error); \ } \ while (0) /** * EMIT_ARRAY_VALUES_IF_NON_EMPTY: * @emitter: (inout): A libyaml emitter object that is positioned at the start * of where a new sequence will be written. * @error: (out): A #GError that will return the reason for any error. * @key: (in): The name to be used as the identifier for the output sequence. * @array: (in): The #GPtrArray that is to be output. * @emitfn: (in): A function used to emit each of the array values. * * Does nothing if the array @array is empty. Otherwise, calls @emitfn to emit * each of the values from @array identified as @key. * * NOTE: This macro outputs both a key and an array value for that key, thus it * must only be used from within a YAML mapping. * * Returns: Continues on if the YAML sequence was output successfully. Returns * FALSE if an error occurred and sets @error appropriately. * * Since: 2.0 */ #define EMIT_ARRAY_VALUES_IF_NON_EMPTY(emitter, error, key, array, emitfn) \ do \ { \ if (NON_EMPTY_ARRAY (array)) \ { \ EMIT_ARRAY_VALUES (emitter, error, key, array, emitfn); \ } \ } \ while (0) G_END_DECLS fedora-modularity-libmodulemd-357799c/modulemd/include/private/test-utils.h000066400000000000000000000036301502446517500271340ustar00rootroot00000000000000/* * This file is part of libmodulemd * Copyright (C) 2017-2018 Stephen Gallagher * * Fedora-License-Identifier: MIT * SPDX-2.0-License-Identifier: MIT * SPDX-3.0-License-Identifier: MIT * * This program is free software. * For more information on the license, see COPYING. * For more information on free software, see . */ #pragma once #include #include #include G_BEGIN_DECLS /** * SECTION: test-utils * @title: Internal Unit Test Utilities * @stability: private * @short_description: Utility functions for use with unit tests. */ extern int modulemd_test_signal; /** * modulemd_test_signal_handler: * @sig_num: The signal received. * * Sets the global variable #modulemd_test_signal with the value of the signal * that was received. * * Since: 2.0 */ void modulemd_test_signal_handler (int sig_num); /** * parser_skip_headers: * @parser: (inout): A libyaml parser object that has been initialized with an * input source. * * This function will advance the parser object past the initial STREAM_START, * DOCUMENT_START and MAPPING_START events to the first real entry in the first * document of the YAML stream. This is intended for unit tests to move the * parser location to the start of the object representation to be tested. * * Since: 2.0 */ void parser_skip_headers (yaml_parser_t *parser); /** * parser_skip_document_start: * @parser: (inout): A libyaml parser object that has been initialized with an * input source. * * This function will advance the parser object past the initial STREAM_START, * and DOCUMENT_START events to the first real entry in the first mapping * of the YAML stream. This is intended for unit tests to move the parser * location to the start of the object representation to be tested. * * Since: 2.0 */ void parser_skip_document_start (yaml_parser_t *parser); G_END_DECLS fedora-modularity-libmodulemd-357799c/modulemd/meson.build000066400000000000000000000464541502446517500237260ustar00rootroot00000000000000# This file is part of libmodulemd # Copyright (C) 2017-2020 Stephen Gallagher # # Fedora-License-Identifier: MIT # SPDX-2.0-License-Identifier: MIT # SPDX-3.0-License-Identifier: MIT # # This program is free software. # For more information on the license, see COPYING. # For more information on free software, see . # -- Configuration Options -- # test_installed_lib = get_option('test_installed_lib') skip_introspection = get_option('skip_introspection') verbose_tests = get_option('verbose_tests') accept_overflowed_buildorder = get_option('accept_overflowed_buildorder') clang_simple_version_script = find_program ('clang_simple_version.sh') # -- Library -- # if test_installed_lib # If we're just running the tests on a library that's already installed, # don't bother building it again. build_lib = disabler() else build_lib = declare_dependency() endif modulemd_srcs = files( 'modulemd.c', 'modulemd-build-config.c', 'modulemd-buildopts.c', 'modulemd-component.c', 'modulemd-component-module.c', 'modulemd-component-rpm.c', 'modulemd-compression.c', 'modulemd-defaults.c', 'modulemd-defaults-v1.c', 'modulemd-dependencies.c', 'modulemd-module.c', 'modulemd-module-index.c', 'modulemd-module-index-merger.c', 'modulemd-module-stream.c', 'modulemd-module-stream-v1.c', 'modulemd-module-stream-v2.c', 'modulemd-packager-v3.c', 'modulemd-profile.c', 'modulemd-rpm-map-entry.c', 'modulemd-service-level.c', 'modulemd-subdocument-info.c', 'modulemd-translation.c', 'modulemd-translation-entry.c', 'modulemd-util.c', 'modulemd-yaml-util.c', 'modulemd-obsoletes.c', ) modulemd_validator_srcs = files ( 'modulemd-validator.c', ) modulemd_hdrs = files( 'include/modulemd-2.0/modulemd.h', 'include/modulemd-2.0/modulemd-build-config.h', 'include/modulemd-2.0/modulemd-buildopts.h', 'include/modulemd-2.0/modulemd-component.h', 'include/modulemd-2.0/modulemd-component-module.h', 'include/modulemd-2.0/modulemd-component-rpm.h', 'include/modulemd-2.0/modulemd-compression.h', 'include/modulemd-2.0/modulemd-defaults.h', 'include/modulemd-2.0/modulemd-defaults-v1.h', 'include/modulemd-2.0/modulemd-dependencies.h', 'include/modulemd-2.0/modulemd-deprecated.h', 'include/modulemd-2.0/modulemd-errors.h', 'include/modulemd-2.0/modulemd-module.h', 'include/modulemd-2.0/modulemd-module-index.h', 'include/modulemd-2.0/modulemd-module-index-merger.h', 'include/modulemd-2.0/modulemd-module-stream.h', 'include/modulemd-2.0/modulemd-module-stream-v1.h', 'include/modulemd-2.0/modulemd-module-stream-v2.h', 'include/modulemd-2.0/modulemd-packager-v3.h', 'include/modulemd-2.0/modulemd-profile.h', 'include/modulemd-2.0/modulemd-rpm-map-entry.h', 'include/modulemd-2.0/modulemd-service-level.h', 'include/modulemd-2.0/modulemd-subdocument-info.h', 'include/modulemd-2.0/modulemd-translation.h', 'include/modulemd-2.0/modulemd-translation-entry.h', 'include/modulemd-2.0/modulemd-obsoletes.h', ) modulemd_priv_hdrs = files( 'include/private/glib-extensions.h', 'include/private/modulemd-build-config-private.h', 'include/private/modulemd-buildopts-private.h', 'include/private/modulemd-component-private.h', 'include/private/modulemd-component-module-private.h', 'include/private/modulemd-component-rpm-private.h', 'include/private/modulemd-compression-private.h', 'include/private/modulemd-dependencies-private.h', 'include/private/modulemd-profile-private.h', 'include/private/modulemd-defaults-private.h', 'include/private/modulemd-defaults-v1-private.h', 'include/private/modulemd-module-private.h', 'include/private/modulemd-module-index-private.h', 'include/private/modulemd-module-stream-private.h', 'include/private/modulemd-module-stream-v1-private.h', 'include/private/modulemd-module-stream-v2-private.h', 'include/private/modulemd-packager-v3-private.h', 'include/private/modulemd-service-level-private.h', 'include/private/modulemd-subdocument-info-private.h', 'include/private/modulemd-translation-private.h', 'include/private/modulemd-translation-entry-private.h', 'include/private/modulemd-util.h', 'include/private/modulemd-yaml.h', 'include/private/gi-binding-renames.h', 'include/private/modulemd-obsoletes-private.h', ) test_srcs = files( 'tests/test-utils.c', ) test_priv_hdrs = files( 'include/private/test-utils.h', ) test_python_scripts = files( 'tests/ModulemdTests/base.py', ) include_dirs = include_directories ( 'include/modulemd-2.0', 'include' ) enums = gnome.mkenums_simple ('modulemd-enums', sources : modulemd_hdrs) cdata = configuration_data() cdata.set_quoted('LIBMODULEMD_VERSION', libmodulemd_version) cdata.set('HAVE_RPMIO', rpm.found()) cdata.set('HAVE_GDATE_AUTOPTR', has_gdate_autoptr) cdata.set('HAVE_EXTEND_AND_STEAL', has_extend_and_steal) cdata.set('HAVE_G_SPAWN_CHECK_WAIT_STATUS', has_g_spawn_check_wait_status) cdata.set('HAVE_OVERFLOWED_BUILDORDER', accept_overflowed_buildorder) configure_file( output : 'config.h', configuration : cdata ) modulemd_lib = library( 'modulemd', sources : modulemd_srcs + enums, include_directories : include_dirs, dependencies : [ gobject, rpm, yaml, build_lib, ], install : true, version: libmodulemd_version, ) if test_installed_lib # Run tests against an installed library instead of in-tree modulemd_dep = declare_dependency( include_directories : include_dirs, dependencies : [ gobject, yaml, dependency( 'modulemd-2.0', ), ] ) else modulemd_dep = declare_dependency( include_directories : include_dirs, link_with : modulemd_lib, dependencies : [ gobject, yaml, ] ) endif if test_installed_lib # Run tests against an installed tool of in-tree modulemd_validator = find_program('modulemd-validator').full_path() else modulemd_validator = executable( 'modulemd-validator', sources : modulemd_validator_srcs, include_directories : include_dirs, dependencies : [ gobject, rpm, yaml, modulemd_dep ], install : true ) endif header_path = 'modulemd-2.0' install_headers( modulemd_hdrs, subdir : header_path, ) # --- GOBject Introspection -- # if skip_introspection else girs = gnome.generate_gir( modulemd_lib, sources : modulemd_srcs + modulemd_hdrs + ['include/private/gi-binding-renames.h'], nsversion : '2.0', namespace : 'Modulemd', symbol_prefix : 'modulemd_', identifier_prefix : 'Modulemd', includes : [ 'GObject-2.0', ], extra_args : [ '--accept-unprefixed' ], install : true, fatal_warnings : true, ) endif pkg.generate( libraries : modulemd_lib, subdirs : header_path, version : libmodulemd_version, name : 'modulemd-2.0', filebase : 'modulemd-2.0', description : 'Module metadata manipulation library', requires: [ 'glib-2.0', 'gobject-2.0' ], ) xcdata = configuration_data() xcdata.set('VERSION', meson.project_version()) configure_file( input : 'version.xml.in', output : 'version.xml', configuration : xcdata ) # --- Documenatation --- # if with_docs fixxref_args = [] foreach path : gtk_doc_referred_paths fixxref_args += [ '--extra-dir=@0@'.format(path) ] endforeach gnome.gtkdoc( 'modulemd-2.0', install_dir: 'modulemd-2.0', src_dir : './modulemd', main_xml : 'modulemd-docs.xml', gobject_typesfile : join_paths(meson.current_build_dir(), 'modulemd-2.0.types'), dependencies : [ modulemd_dep, ], fixxref_args: [ fixxref_args ], install : true, ) endif if with_manpages install_man('modulemd-validator.1') endif # --- TESTS --- # # Test env with release values test_release_env = environment() test_release_env.set('LC_ALL', 'C') if meson.version().version_compare('>=0.56.0') project_source_root = meson.project_source_root() project_build_root = meson.project_build_root() else project_source_root = meson.source_root() project_build_root = meson.build_root() endif test_release_env.set ('MESON_SOURCE_ROOT', project_source_root) test_release_env.set ('MESON_BUILD_ROOT', project_build_root) test_release_env.set ('TEST_DATA_PATH', project_source_root + '/modulemd/tests/test_data') # Test env with fatal warnings and criticals test_env = test_release_env test_env.set('G_DEBUG', 'fatal-warnings,fatal-criticals') if verbose_tests test_env.set('G_MESSAGES_DEBUG', 'all') endif # Python test env with fatal warnings and criticals py_test_env = test_env if not test_installed_lib # If we're testing an installed version, we want to use the default # locations for these paths. py_test_env.set ('GI_TYPELIB_PATH', project_build_root + '/modulemd') py_test_env.set ('LD_LIBRARY_PATH', project_build_root + '/modulemd') py_test_env.set ('PYTHONPATH', project_source_root) # This test is just to catch whether we are accidentally not testing # the built version. py_test_env.set ('MODULEMD_VERSION', libmodulemd_version) else # Add an env var to exercise the Python overrides, which can only be done # against installed libs. py_test_env.set ('MMD_TEST_INSTALLED_LIBS', 'TRUE') endif # Python test env with release values py_test_release_env = py_test_env py_test_release_env.set('G_DEBUG', 'fatal-warnings,fatal-criticals') # --- Test utility library --- # test_utils_lib = library( 'modulemd_tests', sources : [ 'tests/test-utils.c', ], include_directories : include_dirs, dependencies : [ gobject, yaml, ], install : false, ) c_tests = { 'buildconfig' : [ 'tests/test-modulemd-build-config.c' ], 'buildopts' : [ 'tests/test-modulemd-buildopts.c' ], 'common' : [ 'tests/test-modulemd-common.c' ], 'component_module' : [ 'tests/test-modulemd-component-module.c' ], 'component_rpm' : [ 'tests/test-modulemd-component-rpm.c' ], 'compression' : [ 'tests/test-modulemd-compression.c' ], 'context' : [ 'tests/test-modulemd-context.c' ], 'defaults' : [ 'tests/test-modulemd-defaults.c' ], 'defaultsv1' : [ 'tests/test-modulemd-defaults-v1.c' ], 'dependencies' : [ 'tests/test-modulemd-dependencies.c' ], 'module' : [ 'tests/test-modulemd-module.c' ], 'module_index' : [ 'tests/test-modulemd-moduleindex.c' ], 'module_index_merger' : [ 'tests/test-modulemd-merger.c' ], 'modulestream' : [ 'tests/test-modulemd-modulestream.c' ], 'packagerv3' : [ 'tests/test-modulemd-packager-v3.c' ], 'parse_int64' : [ 'tests/test-modulemd-parse_int64.c' ], 'profile' : [ 'tests/test-modulemd-profile.c' ], 'rpm_map' : [ 'tests/test-modulemd-rpmmap.c' ], 'service_level' : [ 'tests/test-modulemd-service-level.c' ], 'translation' : [ 'tests/test-modulemd-translation.c' ], 'translation_entry' : [ 'tests/test-modulemd-translation-entry.c' ], 'variant_deep_copy' : [ 'tests/test-modulemd-variant_deep_copy.c' ], 'obsoletes' : [ 'tests/test-modulemd-obsoletes.c' ], 'quoting' : [ 'tests/test-modulemd-quoting.c' ], } foreach name, sources : c_tests test_srcs += files(sources) exe = executable( name, sources, dependencies : [ modulemd_dep, rpm, ], link_with : [ test_utils_lib, ], install : false, ) test(name + '_debug', exe, env : test_env, timeout : 120, suite : ['ci', 'ci_valgrind', 'c', 'c_debug']) test(name + '_release', exe, env : test_release_env, timeout : 60, suite : ['ci', 'c', 'c_release']) endforeach python_tests = { 'buildopts' : 'tests/ModulemdTests/buildopts.py', 'common' : 'tests/ModulemdTests/common.py', 'componentrpm' : 'tests/ModulemdTests/componentrpm.py', 'defaults' : 'tests/ModulemdTests/defaults.py', 'defaultsv1' : 'tests/ModulemdTests/defaultsv1.py', 'dependencies' : 'tests/ModulemdTests/dependencies.py', 'merger' : 'tests/ModulemdTests/merger.py', 'module' : 'tests/ModulemdTests/module.py', 'moduleindex' : 'tests/ModulemdTests/moduleindex.py', 'modulepackager' : 'tests/ModulemdTests/modulepackager.py', 'modulestream' : 'tests/ModulemdTests/modulestream.py', 'obsoletes' : 'tests/ModulemdTests/obsoletes.py', 'profile' : 'tests/ModulemdTests/profile.py', 'rpmmap' : 'tests/ModulemdTests/rpmmap.py', 'servicelevel' : 'tests/ModulemdTests/servicelevel.py', 'translation' : 'tests/ModulemdTests/translation.py', 'translationentry' : 'tests/ModulemdTests/translationentry.py', } foreach name, script : python_tests if with_py3 test_python_scripts += files(script) test (name + '_python3_debug', python3, env : py_test_env, timeout : 60, args : files(script), depends : girs, suite : ['ci', 'py3', 'py3_debug']) test (name + '_python3_release', python3, env : py_test_release_env, timeout : 60, args : files(script), depends : girs, suite : ['ci', 'py3', 'py3_release']) endif if with_py2 test (name + '_python2_debug', python2, env : py_test_env, timeout : 60, args : files(script), depends : girs, suite : ['ci', 'py2', 'py2_debug']) test (name + '_python2_release', python2, env : py_test_release_env, timeout : 60, args : files(script), depends : girs, suite : ['ci', 'py2', 'py2_release']) endif #with_py2 endforeach # Tests for modulemd-validator tool modulemd_validator_tests = { 'help' : [['--code', '0'], ['--help']], 'version' : [['--code', '0'], ['--version']], 'version_with_uknown_option': [['--code', '1', '--stderr', '--does-not-exist'], ['--version', '--does-not-exist']], 'valid' : [['--code', '0'], [files('tests/test_data/static_context.yaml')]], 'invalid' : [['--code', '1', '--stdout', 'No data section provided'], [files('tests/test_data/good_and_bad.yaml')]], 'stream_packagerv3_invalid_mix_as_index': [['--code', '1'], [files('tests/test_data/stream_packager_mix.yaml')]], 'valid_defaultsv1.yaml': [['--code', '0'], [files('../yaml_specs/modulemd_defaults_v1.yaml')]], 'invalid_defaultsv1.yaml': [['--code', '1'], [files('tests/test_data/invalid_defaults.yaml')]], 'valid_defaultsv1_as_defaultsv1': [['--code', '0'], ['--type', 'modulemd-defaults-v1', files('../yaml_specs/modulemd_defaults_v1.yaml')]], 'invalid_defaultsv1_as_defaultsv1': [['--code', '1'], ['--type', 'modulemd-defaults-v1', files('tests/test_data/invalid_defaults.yaml')]], 'valid_defaultsv1_with_garbage_as_defaultsv1': [['--code', '1'], ['--type', 'modulemd-defaults-v1', files('tests/test_data/valid_defaults_with_garbage.yaml')]], 'valid_defaultsv1_with_unexpected_document_as_defaultsv1': [['--code', '1'], ['--type', 'modulemd-defaults-v1', files('tests/test_data/valid_defaults_with_unexpected_document.yaml')]], 'valid_modulemdv1_as_modulemdv1': [['--code', '0'], ['--type', 'modulemd-v1', files('../yaml_specs/modulemd_stream_v1.yaml')]], 'invalid_modulemdv1_as_modulemdv1': [['--code', '1', '--stderr', 'not in valid N-E:V-R.A format'], ['--type', 'modulemd-v1', files('tests/test_data/bad_stream_v1.yaml')]], 'valid_modulemdv2_as_modulemdv1': [['--code', '1'], ['--type', 'modulemd-v1', files('../yaml_specs/modulemd_stream_v2.yaml')]], 'valid_modulemdv2_as_modulemdv2': [['--code', '0'], ['--type', 'modulemd-v2', files('../yaml_specs/modulemd_stream_v2.yaml')]], 'invalid_modulemdv2_as_modulemdv2': [['--code', '1', '--stderr', 'Stream context'], ['--type', 'modulemd-v2', files('tests/test_data/bad_stream_v2.yaml')]], 'valid_packagerv3_as_modulemdv2': [['--code', '1'], ['--type', 'modulemd-v2', files('../yaml_specs/modulemd_packager_v3.yaml')]], 'valid_obsoletesv1.yaml': [['--code', '0'], [files('../yaml_specs/modulemd_obsoletes_v1.yaml')]], 'invalid_obsoletesv1.yaml': [['--code', '1'], [files('tests/test_data/invalid_obsoletes_v1.yaml')]], 'valid_obsoletesv1_as_obsoletesv1.yaml': [['--code', '0'], ['--type', 'modulemd-obsoletes-v1', files('../yaml_specs/modulemd_obsoletes_v1.yaml')]], 'invalid_obsoletesv1_as_obseletesv1.yaml': [['--code', '1'], ['--type', 'modulemd-obsoletes-v1', files('tests/test_data/invalid_obsoletes_v1.yaml')]], 'modulemdv2_as_defaultsv1': [['--code', '1'], ['--type', 'defaults-v1', files('../yaml_specs/modulemd_stream_v2.yaml')]], 'valid_packagerv2_as_packagerv2': [['--code', '0'], ['--type', 'modulemd-packager-v2', files('../yaml_specs/modulemd_packager_v2.yaml')]], 'invalid_packagerv2_as_packagerv2': [['--code', '1', '--stderr', 'license is missing'], ['--type', 'modulemd-packager-v2', files('tests/test_data/bad_packager_v2.yaml')]], 'valid_modulemdv2_as_packagerv2': [['--code', '1'], ['--type', 'modulemd-packager-v2', files('../yaml_specs/modulemd_stream_v2.yaml')]], 'valid_packagerv3_as_packagerv3': [['--code', '0'], ['--type', 'modulemd-packager-v3', files('../yaml_specs/modulemd_packager_v3.yaml')]], 'invalid_packagerv3_as_packagerv3': [['--code', '1', '--stderr', 'context exceeds'], ['--type', 'modulemd-packager-v3', files('tests/test_data/bad_packager_v3.yaml')]], 'valid_modulemdv2_as_packagerv3': [['--code', '1'], ['--type', 'modulemd-packager-v3', files('../yaml_specs/modulemd_stream_v2.yaml')]], 'valid_translationsv1_as_translationsv1': [['--code', '0'], ['--type', 'modulemd-translations-v1', files('../yaml_specs/modulemd_translations_v1.yaml')]], 'invalid_translationsv1_as_translationsv1': [['--code', '1', '--stderr', 'not a valid integer'], ['--type', 'modulemd-translations-v1', files('tests/test_data/bad_translations_v1.yaml')]], 'valid_modulemdv2_as_translationsv1': [['--code', '1'], ['--type', 'modulemd-translations-v1', files('../yaml_specs/modulemd_stream_v2.yaml')]], } test_modulemd_validator = executable( 'test-modulemd-validator', files('tests/test-modulemd-validator.c'), dependencies : [ glib ], install : false, ) foreach name, arguments : modulemd_validator_tests test(name, test_modulemd_validator, args : [arguments[0], '--', modulemd_validator, arguments[1]], env : test_env, timeout : 60, suite : ['ci', 'modulemd_validator']) endforeach # -- C/C++ Header test -- # # Ensures that all public headers can be imported by consumers # This test takes a while, so run it near the end so that the functional test # results are visible more quickly. import_header_script = find_program('tests/test-import-headers.sh') test('test_import_headers', import_header_script, env : test_env, args : modulemd_hdrs, timeout : 300, suite : ['smoketest', 'ci']) fedora-modularity-libmodulemd-357799c/modulemd/modulemd-build-config.c000066400000000000000000000515531502446517500260720ustar00rootroot00000000000000/* * This file is part of libmodulemd * Copyright (C) 2020 Red Hat, Inc. * * Fedora-License-Identifier: MIT * SPDX-2.0-License-Identifier: MIT * SPDX-3.0-License-Identifier: MIT * * This program is free software. * For more information on the license, see COPYING. * For more information on free software, see . */ #include "modulemd-2.0/modulemd-buildopts.h" #include "modulemd-2.0/modulemd-errors.h" #include "modulemd-2.0/modulemd-module-stream.h" #include "private/modulemd-build-config-private.h" #include "private/modulemd-buildopts-private.h" #include "private/modulemd-util.h" #include "private/modulemd-yaml.h" struct _ModulemdBuildConfig { GObject parent_instance; gchar *context; gchar *platform; GHashTable * requires; /* hashtable */ GHashTable *buildrequires; /* hashtable */ ModulemdBuildopts *buildopts; }; G_DEFINE_TYPE (ModulemdBuildConfig, modulemd_build_config, G_TYPE_OBJECT) ModulemdBuildConfig * modulemd_build_config_new (void) { return g_object_new (MODULEMD_TYPE_BUILD_CONFIG, NULL); } static void modulemd_build_config_finalize (GObject *object) { ModulemdBuildConfig *self = MODULEMD_BUILD_CONFIG (object); g_clear_pointer (&self->context, g_free); g_clear_pointer (&self->platform, g_free); g_clear_pointer (&self->requires, g_hash_table_unref); g_clear_pointer (&self->buildrequires, g_hash_table_unref); g_clear_object (&self->buildopts); G_OBJECT_CLASS (modulemd_build_config_parent_class)->finalize (object); } static void modulemd_build_config_class_init (ModulemdBuildConfigClass *klass) { GObjectClass *object_class = G_OBJECT_CLASS (klass); object_class->finalize = modulemd_build_config_finalize; } static void modulemd_build_config_init (ModulemdBuildConfig *self) { self-> requires = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, g_free); self->buildrequires = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, g_free); } void modulemd_build_config_set_context (ModulemdBuildConfig *self, const gchar *context) { g_return_if_fail (MODULEMD_IS_BUILD_CONFIG (self)); g_clear_pointer (&self->context, g_free); if (context) { self->context = g_strdup (context); } } const gchar * modulemd_build_config_get_context (ModulemdBuildConfig *self) { g_return_val_if_fail (MODULEMD_IS_BUILD_CONFIG (self), NULL); return self->context; } void modulemd_build_config_set_platform (ModulemdBuildConfig *self, const gchar *platform) { g_return_if_fail (MODULEMD_IS_BUILD_CONFIG (self)); g_clear_pointer (&self->platform, g_free); if (platform) { self->platform = g_strdup (platform); } } const gchar * modulemd_build_config_get_platform (ModulemdBuildConfig *self) { g_return_val_if_fail (MODULEMD_IS_BUILD_CONFIG (self), NULL); return self->platform; } void modulemd_build_config_add_runtime_requirement (ModulemdBuildConfig *self, const gchar *module_name, const gchar *stream_name) { g_return_if_fail (MODULEMD_IS_BUILD_CONFIG (self)); g_return_if_fail (module_name && stream_name); g_hash_table_replace ( self->requires, g_strdup (module_name), g_strdup (stream_name)); } void modulemd_build_config_remove_runtime_requirement (ModulemdBuildConfig *self, const gchar *module_name) { g_return_if_fail (MODULEMD_IS_BUILD_CONFIG (self)); g_return_if_fail (module_name); g_hash_table_remove (self->requires, module_name); } void modulemd_build_config_clear_runtime_requirements (ModulemdBuildConfig *self) { g_return_if_fail (MODULEMD_IS_BUILD_CONFIG (self)); g_hash_table_remove_all (self->requires); } const gchar * modulemd_build_config_get_runtime_requirement_stream ( ModulemdBuildConfig *self, const gchar *module_name) { g_return_val_if_fail (MODULEMD_IS_BUILD_CONFIG (self), NULL); return g_hash_table_lookup (self->requires, module_name); } GStrv modulemd_build_config_get_runtime_modules_as_strv (ModulemdBuildConfig *self) { g_return_val_if_fail (MODULEMD_IS_BUILD_CONFIG (self), NULL); return modulemd_ordered_str_keys_as_strv (self->requires); } void modulemd_build_config_add_buildtime_requirement (ModulemdBuildConfig *self, const gchar *module_name, const gchar *stream_name) { g_return_if_fail (MODULEMD_IS_BUILD_CONFIG (self)); g_return_if_fail (module_name && stream_name); g_hash_table_replace ( self->buildrequires, g_strdup (module_name), g_strdup (stream_name)); } void modulemd_build_config_remove_buildtime_requirement (ModulemdBuildConfig *self, const gchar *module_name) { g_return_if_fail (MODULEMD_IS_BUILD_CONFIG (self)); g_return_if_fail (module_name); g_hash_table_remove (self->buildrequires, module_name); } void modulemd_build_config_clear_buildtime_requirements (ModulemdBuildConfig *self) { g_return_if_fail (MODULEMD_IS_BUILD_CONFIG (self)); g_hash_table_remove_all (self->buildrequires); } const gchar * modulemd_build_config_get_buildtime_requirement_stream ( ModulemdBuildConfig *self, const gchar *module_name) { g_return_val_if_fail (MODULEMD_IS_BUILD_CONFIG (self), NULL); return g_hash_table_lookup (self->buildrequires, module_name); } GStrv modulemd_build_config_get_buildtime_modules_as_strv (ModulemdBuildConfig *self) { g_return_val_if_fail (MODULEMD_IS_BUILD_CONFIG (self), NULL); return modulemd_ordered_str_keys_as_strv (self->buildrequires); } void modulemd_build_config_set_buildopts (ModulemdBuildConfig *self, ModulemdBuildopts *buildopts) { g_return_if_fail (MODULEMD_IS_BUILD_CONFIG (self)); g_clear_object (&self->buildopts); if (buildopts) { self->buildopts = modulemd_buildopts_copy (buildopts); } } ModulemdBuildopts * modulemd_build_config_get_buildopts (ModulemdBuildConfig *self) { g_return_val_if_fail (MODULEMD_IS_BUILD_CONFIG (self), NULL); return self->buildopts; } static void modulemd_build_config_replace_runtime_deps (ModulemdBuildConfig *self, GHashTable *deps); static void modulemd_build_config_replace_buildtime_deps (ModulemdBuildConfig *self, GHashTable *deps); static GHashTable * modulemd_build_config_parse_deptable (yaml_parser_t *parser, GError **error) { MODULEMD_INIT_TRACE (); MMD_INIT_YAML_EVENT (event); g_autoptr (GError) nested_error = NULL; g_autoptr (GHashTable) nested_set = NULL; g_autoptr (GHashTable) deptable = NULL; g_auto (GStrv) stream_names = NULL; GHashTableIter iter; gpointer key; gpointer value; gchar *module_name; g_return_val_if_fail (error == NULL || *error == NULL, FALSE); nested_set = modulemd_yaml_parse_nested_set (parser, &nested_error); if (!nested_set) { g_propagate_error (error, g_steal_pointer (&nested_error)); return NULL; } deptable = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, g_free); g_hash_table_iter_init (&iter, nested_set); while (g_hash_table_iter_next (&iter, &key, &value)) { module_name = (gchar *)key; stream_names = modulemd_ordered_str_keys_as_strv (value); if (g_strv_length (stream_names) != 1) { MMD_YAML_ERROR_EVENT_EXIT ( error, event, "BuildConfig dependency %s must specify a single stream", module_name); } g_hash_table_replace ( deptable, g_strdup (module_name), g_strdup (stream_names[0])); g_clear_pointer (&stream_names, g_strfreev); } g_clear_pointer (&nested_set, g_hash_table_unref); return g_steal_pointer (&deptable); } ModulemdBuildConfig * modulemd_build_config_parse_yaml (yaml_parser_t *parser, gboolean strict, GError **error) { MODULEMD_INIT_TRACE (); MMD_INIT_YAML_EVENT (event); gboolean done = FALSE; g_autoptr (ModulemdBuildConfig) buildconfig = NULL; g_autoptr (ModulemdBuildopts) buildopts = NULL; g_autoptr (GError) nested_error = NULL; g_autoptr (GHashTable) deptable = NULL; g_return_val_if_fail (error == NULL || *error == NULL, FALSE); buildconfig = modulemd_build_config_new (); /* Read in attributes of this config */ while (!done) { YAML_PARSER_PARSE_WITH_EXIT (parser, &event, error); switch (event.type) { case YAML_MAPPING_END_EVENT: done = TRUE; break; case YAML_SCALAR_EVENT: if (g_str_equal ((const gchar *)event.data.scalar.value, "context")) MMD_SET_PARSED_YAML_STRING ( parser, error, modulemd_build_config_set_context, buildconfig); else if (g_str_equal ((const gchar *)event.data.scalar.value, "platform")) MMD_SET_PARSED_YAML_STRING ( parser, error, modulemd_build_config_set_platform, buildconfig); else if (g_str_equal ((const gchar *)event.data.scalar.value, "buildrequires")) { deptable = modulemd_build_config_parse_deptable (parser, &nested_error); if (!deptable) { g_propagate_error (error, g_steal_pointer (&nested_error)); return FALSE; } modulemd_build_config_replace_buildtime_deps (buildconfig, deptable); g_clear_pointer (&deptable, g_hash_table_unref); } else if (g_str_equal ((const gchar *)event.data.scalar.value, "requires")) { deptable = modulemd_build_config_parse_deptable (parser, &nested_error); if (!deptable) { g_propagate_error (error, g_steal_pointer (&nested_error)); return FALSE; } modulemd_build_config_replace_runtime_deps (buildconfig, deptable); g_clear_pointer (&deptable, g_hash_table_unref); } else if (g_str_equal ((const gchar *)event.data.scalar.value, "buildopts")) { buildopts = modulemd_buildopts_parse_yaml (parser, strict, &nested_error); if (!buildopts) { g_propagate_error (error, g_steal_pointer (&nested_error)); return NULL; } modulemd_build_config_set_buildopts (buildconfig, buildopts); g_clear_object (&buildopts); } else { SKIP_UNKNOWN (parser, FALSE, "Unexpected key in build config: %s", (const gchar *)event.data.scalar.value); break; } break; default: MMD_YAML_ERROR_EVENT_EXIT ( error, event, "Unexpected YAML event in profile"); break; } yaml_event_delete (&event); } /* Validate the input */ if (!modulemd_build_config_validate (buildconfig, &nested_error)) { g_propagate_error (error, g_steal_pointer (&nested_error)); return NULL; } return g_steal_pointer (&buildconfig); } gboolean modulemd_build_config_emit_deptable (GHashTable *deptable, const char *table_key, yaml_emitter_t *emitter, GError **error); gboolean modulemd_build_config_emit_yaml (ModulemdBuildConfig *self, yaml_emitter_t *emitter, GError **error) { MODULEMD_INIT_TRACE (); int ret; g_autoptr (GError) nested_error = NULL; MMD_INIT_YAML_EVENT (event); ret = mmd_emitter_start_mapping ( emitter, YAML_BLOCK_MAPPING_STYLE, &nested_error); if (!ret) { g_propagate_prefixed_error (error, g_steal_pointer (&nested_error), "Failed to start BuildConfig mapping: "); return FALSE; } EMIT_KEY_VALUE_STRING_IF_SET (emitter, error, "context", self->context); EMIT_KEY_VALUE_STRING_IF_SET (emitter, error, "platform", self->platform); if (!modulemd_build_config_emit_deptable ( self->buildrequires, "buildrequires", emitter, error)) { g_propagate_error (error, g_steal_pointer (&nested_error)); return FALSE; } if (!modulemd_build_config_emit_deptable ( self->requires, "requires", emitter, error)) { g_propagate_error (error, g_steal_pointer (&nested_error)); return FALSE; } if (self->buildopts != NULL) { EMIT_SCALAR (emitter, error, "buildopts"); EMIT_MAPPING_START (emitter, error); if (!modulemd_buildopts_emit_yaml ( self->buildopts, emitter, &nested_error)) { g_propagate_prefixed_error ( error, g_steal_pointer (&nested_error), "Failed to emit BuildConfig buildopts: "); return FALSE; } EMIT_MAPPING_END (emitter, error); } ret = mmd_emitter_end_mapping (emitter, &nested_error); if (!ret) { g_propagate_prefixed_error (error, g_steal_pointer (&nested_error), "Failed to end BuildConfig mapping"); return FALSE; } return TRUE; } gboolean modulemd_build_config_emit_deptable (GHashTable *deptable, const char *table_key, yaml_emitter_t *emitter, GError **error) { MODULEMD_INIT_TRACE (); MMD_INIT_YAML_EVENT (event); g_autoptr (GError) nested_error = NULL; g_autoptr (GHashTable) nested_set = NULL; g_autoptr (GHashTable) stream_table = NULL; int ret; GHashTableIter iter; gpointer key; gpointer value; gchar *module_name; gchar *stream_name; if (deptable == NULL || g_hash_table_size (deptable) == 0) { return TRUE; } nested_set = g_hash_table_new_full ( g_str_hash, g_str_equal, g_free, (GDestroyNotify)g_hash_table_unref); g_hash_table_iter_init (&iter, deptable); while (g_hash_table_iter_next (&iter, &key, &value)) { module_name = (gchar *)key; stream_name = (gchar *)value; /* stuff the stream name into a sub-table */ stream_table = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, NULL); g_hash_table_add (stream_table, g_strdup (stream_name)); g_hash_table_insert ( nested_set, g_strdup (module_name), g_steal_pointer (&stream_table)); } ret = mmd_emitter_scalar_string (emitter, table_key, &nested_error); if (!ret) { g_propagate_prefixed_error (error, g_steal_pointer (&nested_error), "Failed to emit %s dependencies key: ", table_key); return FALSE; } ret = modulemd_yaml_emit_nested_set (emitter, nested_set, &nested_error); if (!ret) { g_propagate_prefixed_error (error, g_steal_pointer (&nested_error), "Failed to emit %s dependencies values: ", table_key); return FALSE; } g_clear_pointer (&nested_set, g_hash_table_unref); return TRUE; } static void modulemd_build_config_replace_runtime_deps (ModulemdBuildConfig *self, GHashTable *deps) { g_return_if_fail (MODULEMD_IS_BUILD_CONFIG (self)); if (deps) { g_clear_pointer (&self->requires, g_hash_table_unref); self-> requires = modulemd_hash_table_deep_str_copy (deps); } else { g_hash_table_remove_all (self->requires); } } static void modulemd_build_config_replace_buildtime_deps (ModulemdBuildConfig *self, GHashTable *deps) { g_return_if_fail (MODULEMD_IS_BUILD_CONFIG (self)); if (deps) { g_clear_pointer (&self->buildrequires, g_hash_table_unref); self->buildrequires = modulemd_hash_table_deep_str_copy (deps); } else { g_hash_table_remove_all (self->buildrequires); } } gboolean modulemd_build_config_validate (ModulemdBuildConfig *self, GError **error) { gsize i; /* Context must be present and be between 1 and MMD_MAXCONTEXTLEN * alphanumeric characters */ if (self->context == NULL || self->context[0] == '\0') { g_set_error (error, MODULEMD_ERROR, MMD_ERROR_VALIDATE, "Empty context in BuildConfig"); return FALSE; } for (i = 0; i < MMD_MAXCONTEXTLEN; i++) { if (self->context[i] == '\0') break; if (!(g_ascii_isalnum (self->context[i]))) { g_set_error (error, MODULEMD_ERROR, MMD_ERROR_VALIDATE, "Non-alphanumeric character in BuildConfig context"); return FALSE; } } if (self->context[i] != '\0') { /* We passed the maximum length without encountering a * NULL-terminator */ g_set_error (error, MODULEMD_ERROR, MMD_ERROR_VALIDATE, "BuildConfig context exceeds maximum characters"); return FALSE; } /* The platform value must be set. * In the future, we should probably validate its contents, but this is * not currently defined in the specification. */ if (!self->platform) { g_set_error (error, MODULEMD_ERROR, MMD_ERROR_VALIDATE, "Unset platform in BuildConfig"); return FALSE; } return TRUE; } ModulemdBuildConfig * modulemd_build_config_copy (ModulemdBuildConfig *self) { g_autoptr (ModulemdBuildConfig) copy = modulemd_build_config_new (); modulemd_build_config_set_context (copy, modulemd_build_config_get_context (self)); modulemd_build_config_set_platform ( copy, modulemd_build_config_get_platform (self)); if (self->requires) { modulemd_build_config_replace_runtime_deps (copy, self->requires); } if (self->buildrequires) { modulemd_build_config_replace_buildtime_deps (copy, self->buildrequires); } modulemd_build_config_set_buildopts ( copy, modulemd_build_config_get_buildopts (self)); return g_steal_pointer (©); } gboolean modulemd_build_config_equals (ModulemdBuildConfig *self_1, ModulemdBuildConfig *self_2) { if (!self_1 && !self_2) { return TRUE; } if (!self_1 || !self_2) { return FALSE; } g_return_val_if_fail (MODULEMD_IS_BUILD_CONFIG (self_1), FALSE); g_return_val_if_fail (MODULEMD_IS_BUILD_CONFIG (self_2), FALSE); if (g_strcmp0 (self_1->context, self_2->context) != 0) { return FALSE; } if (g_strcmp0 (self_1->platform, self_2->platform) != 0) { return FALSE; } if (!modulemd_hash_table_equals ( self_1->requires, self_2->requires, g_str_equal)) { return FALSE; } if (!modulemd_hash_table_equals ( self_1->buildrequires, self_2->buildrequires, g_str_equal)) { return FALSE; } if (!modulemd_buildopts_equals (self_1->buildopts, self_2->buildopts)) { return FALSE; } return TRUE; } /* return less than zero if first arg is less than second arg, * zero for equal, * greater than zero if first arg is greater than second arg. */ gint modulemd_build_config_compare (ModulemdBuildConfig *self_1, ModulemdBuildConfig *self_2) { gint cmp; if (!self_1 && !self_2) { return 0; } if (!self_1) { return -1; } if (!self_2) { return 1; } g_return_val_if_fail (MODULEMD_IS_BUILD_CONFIG (self_1), 1); g_return_val_if_fail (MODULEMD_IS_BUILD_CONFIG (self_2), -1); cmp = g_strcmp0 (self_1->context, self_2->context); if (cmp != 0) { return cmp; } cmp = g_strcmp0 (self_1->platform, self_2->platform); if (cmp != 0) { return cmp; } cmp = modulemd_hash_table_compare ( self_1->buildrequires, self_2->buildrequires, modulemd_strcmp_wrapper); if (cmp != 0) { return cmp; } cmp = modulemd_hash_table_compare ( self_1->requires, self_2->requires, modulemd_strcmp_wrapper); if (cmp != 0) { return cmp; } cmp = modulemd_buildopts_compare (self_1->buildopts, self_2->buildopts); if (cmp != 0) { return cmp; } return 0; } fedora-modularity-libmodulemd-357799c/modulemd/modulemd-buildopts.c000066400000000000000000000411741502446517500255330ustar00rootroot00000000000000/* * This file is part of libmodulemd * Copyright (C) 2018 Red Hat, Inc. * * Fedora-License-Identifier: MIT * SPDX-2.0-License-Identifier: MIT * SPDX-3.0-License-Identifier: MIT * * This program is free software. * For more information on the license, see COPYING. * For more information on free software, see . */ #include #include #include "modulemd-buildopts.h" #include "private/glib-extensions.h" #include "private/modulemd-buildopts-private.h" #include "private/modulemd-util.h" #include "private/modulemd-yaml.h" #define B_DEFAULT_STRING "__BUILDOPTS_RPM_MACROS_UNSET__" struct _ModulemdBuildopts { GObject parent_instance; gchar *rpm_macros; GHashTable *allowed_build_names; GHashTable *arches; }; G_DEFINE_TYPE (ModulemdBuildopts, modulemd_buildopts, G_TYPE_OBJECT) enum { PROP_0, PROP_RPM_MACROS, N_PROPS }; static GParamSpec *properties[N_PROPS]; gboolean modulemd_buildopts_equals (ModulemdBuildopts *self_1, ModulemdBuildopts *self_2) { if (!self_1 && !self_2) { return TRUE; } if (!self_1 || !self_2) { return FALSE; } g_return_val_if_fail (MODULEMD_IS_BUILDOPTS (self_1), FALSE); g_return_val_if_fail (MODULEMD_IS_BUILDOPTS (self_2), FALSE); if (g_strcmp0 (self_1->rpm_macros, self_2->rpm_macros) != 0) { return FALSE; } if (!modulemd_hash_table_sets_are_equal (self_1->allowed_build_names, self_2->allowed_build_names)) { return FALSE; } if (!modulemd_hash_table_sets_are_equal (self_1->arches, self_2->arches)) { return FALSE; } return TRUE; } gint modulemd_buildopts_compare (ModulemdBuildopts *self_1, ModulemdBuildopts *self_2) { gint cmp; if (!self_1 && !self_2) { return 0; } if (!self_1) { return -1; } if (!self_2) { return 1; } g_return_val_if_fail (MODULEMD_IS_BUILDOPTS (self_1), 1); g_return_val_if_fail (MODULEMD_IS_BUILDOPTS (self_2), -1); cmp = g_strcmp0 (self_1->rpm_macros, self_2->rpm_macros); if (cmp != 0) { return cmp; } cmp = modulemd_hash_table_compare ( self_1->allowed_build_names, self_2->allowed_build_names, NULL); if (cmp != 0) { return cmp; } cmp = modulemd_hash_table_compare (self_1->arches, self_2->arches, NULL); if (cmp != 0) { return cmp; } return 0; } ModulemdBuildopts * modulemd_buildopts_new (void) { return g_object_new (MODULEMD_TYPE_BUILDOPTS, NULL); } ModulemdBuildopts * modulemd_buildopts_copy (ModulemdBuildopts *self) { g_autoptr (ModulemdBuildopts) copy = NULL; g_return_val_if_fail (MODULEMD_IS_BUILDOPTS (self), NULL); copy = modulemd_buildopts_new (); modulemd_buildopts_set_rpm_macros (copy, modulemd_buildopts_get_rpm_macros (self)); MODULEMD_REPLACE_SET (copy->allowed_build_names, self->allowed_build_names); MODULEMD_REPLACE_SET (copy->arches, self->arches); return g_steal_pointer (©); } static void modulemd_buildopts_finalize (GObject *object) { ModulemdBuildopts *self = (ModulemdBuildopts *)object; g_clear_pointer (&self->rpm_macros, g_free); g_clear_pointer (&self->allowed_build_names, g_hash_table_unref); g_clear_pointer (&self->arches, g_hash_table_unref); G_OBJECT_CLASS (modulemd_buildopts_parent_class)->finalize (object); } void modulemd_buildopts_set_rpm_macros (ModulemdBuildopts *self, const gchar *rpm_macros) { g_return_if_fail (MODULEMD_IS_BUILDOPTS (self)); g_clear_pointer (&self->rpm_macros, g_free); self->rpm_macros = g_strdup (rpm_macros); g_object_notify_by_pspec (G_OBJECT (self), properties[PROP_RPM_MACROS]); } const gchar * modulemd_buildopts_get_rpm_macros (ModulemdBuildopts *self) { g_return_val_if_fail (MODULEMD_IS_BUILDOPTS (self), NULL); return self->rpm_macros; } void modulemd_buildopts_add_rpm_to_whitelist (ModulemdBuildopts *self, const gchar *rpm) { g_return_if_fail (MODULEMD_IS_BUILDOPTS (self)); g_hash_table_add (self->allowed_build_names, g_strdup (rpm)); } void modulemd_buildopts_remove_rpm_from_whitelist (ModulemdBuildopts *self, const gchar *rpm) { g_return_if_fail (MODULEMD_IS_BUILDOPTS (self)); g_hash_table_remove (self->allowed_build_names, rpm); } void modulemd_buildopts_clear_rpm_whitelist (ModulemdBuildopts *self) { g_return_if_fail (MODULEMD_IS_BUILDOPTS (self)); g_hash_table_remove_all (self->allowed_build_names); } GStrv modulemd_buildopts_get_rpm_whitelist_as_strv (ModulemdBuildopts *self) { g_return_val_if_fail (MODULEMD_IS_BUILDOPTS (self), NULL); return modulemd_ordered_str_keys_as_strv (self->allowed_build_names); } void modulemd_buildopts_add_arch (ModulemdBuildopts *self, const gchar *arch) { g_return_if_fail (MODULEMD_IS_BUILDOPTS (self)); g_hash_table_add (self->arches, g_strdup (arch)); } void modulemd_buildopts_remove_arch (ModulemdBuildopts *self, const gchar *arch) { g_return_if_fail (MODULEMD_IS_BUILDOPTS (self)); g_hash_table_remove (self->arches, arch); } void modulemd_buildopts_clear_arches (ModulemdBuildopts *self) { g_return_if_fail (MODULEMD_IS_BUILDOPTS (self)); g_hash_table_remove_all (self->arches); } GStrv modulemd_buildopts_get_arches_as_strv (ModulemdBuildopts *self) { g_return_val_if_fail (MODULEMD_IS_BUILDOPTS (self), NULL); return modulemd_ordered_str_keys_as_strv (self->arches); } static void modulemd_buildopts_get_property (GObject *object, guint prop_id, GValue *value, GParamSpec *pspec) { ModulemdBuildopts *self = MODULEMD_BUILDOPTS (object); switch (prop_id) { case PROP_RPM_MACROS: g_value_set_string (value, modulemd_buildopts_get_rpm_macros (self)); break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); } } static void modulemd_buildopts_set_property (GObject *object, guint prop_id, const GValue *value, GParamSpec *pspec) { ModulemdBuildopts *self = MODULEMD_BUILDOPTS (object); switch (prop_id) { case PROP_RPM_MACROS: modulemd_buildopts_set_rpm_macros (self, g_value_get_string (value)); break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); } } static void modulemd_buildopts_class_init (ModulemdBuildoptsClass *klass) { GObjectClass *object_class = G_OBJECT_CLASS (klass); object_class->finalize = modulemd_buildopts_finalize; object_class->get_property = modulemd_buildopts_get_property; object_class->set_property = modulemd_buildopts_set_property; properties[PROP_RPM_MACROS] = g_param_spec_string ( "rpm-macros", "Rpm Macros", "A string containing RPM build macros in the form that they would appear " "in an RPM macros file on-disk.", B_DEFAULT_STRING, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS); g_object_class_install_properties (object_class, N_PROPS, properties); } static void modulemd_buildopts_init (ModulemdBuildopts *self) { self->allowed_build_names = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, NULL); self->arches = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, NULL); } /* === YAML Functions === */ static gboolean modulemd_buildopts_parse_rpm_buildopts (yaml_parser_t *parser, ModulemdBuildopts *buildopts, gboolean strict, GError **error); ModulemdBuildopts * modulemd_buildopts_parse_yaml (yaml_parser_t *parser, gboolean strict, GError **error) { MODULEMD_INIT_TRACE (); MMD_INIT_YAML_EVENT (event); gboolean done = FALSE; gboolean in_map = FALSE; g_autoptr (ModulemdBuildopts) buildopts = NULL; g_autoptr (GError) nested_error = NULL; g_return_val_if_fail (error == NULL || *error == NULL, FALSE); buildopts = modulemd_buildopts_new (); while (!done) { YAML_PARSER_PARSE_WITH_EXIT (parser, &event, error); switch (event.type) { case YAML_MAPPING_START_EVENT: in_map = TRUE; break; case YAML_MAPPING_END_EVENT: in_map = FALSE; done = TRUE; break; case YAML_SCALAR_EVENT: if (!in_map) { MMD_YAML_ERROR_EVENT_EXIT_BOOL ( error, event, "Missing mapping in buildopts"); } if (g_str_equal ((const gchar *)event.data.scalar.value, "rpms")) { if (!modulemd_buildopts_parse_rpm_buildopts ( parser, buildopts, strict, &nested_error)) { g_propagate_error (error, nested_error); return NULL; } } else if (g_str_equal ((const gchar *)event.data.scalar.value, "arches")) { g_hash_table_unref (buildopts->arches); buildopts->arches = modulemd_yaml_parse_string_set (parser, &nested_error); if (buildopts->arches == NULL) { MMD_YAML_ERROR_EVENT_EXIT_BOOL ( error, event, "Failed to parse arches list in buildopts: %s", nested_error->message); } } else { SKIP_UNKNOWN (parser, NULL, "Unexpected key in buildopts: %s", (const gchar *)event.data.scalar.value); break; } break; default: MMD_YAML_ERROR_EVENT_EXIT (error, event, "Unexpected YAML event in buildopts: %s", mmd_yaml_get_event_name (event.type)); break; } yaml_event_delete (&event); } return g_steal_pointer (&buildopts); } static gboolean modulemd_buildopts_parse_rpm_buildopts (yaml_parser_t *parser, ModulemdBuildopts *buildopts, gboolean strict, GError **error) { MODULEMD_INIT_TRACE (); MMD_INIT_YAML_EVENT (event); gboolean done = FALSE; gboolean in_map = FALSE; g_autofree gchar *value = NULL; g_autoptr (GError) nested_error = NULL; /* Read in RPM attributes */ while (!done) { YAML_PARSER_PARSE_WITH_EXIT_BOOL (parser, &event, error); switch (event.type) { case YAML_MAPPING_START_EVENT: in_map = TRUE; break; case YAML_MAPPING_END_EVENT: in_map = FALSE; done = TRUE; break; case YAML_SCALAR_EVENT: if (!in_map) { MMD_YAML_ERROR_EVENT_EXIT_BOOL ( error, event, "Missing mapping in buildopts rpms entry"); } if (g_str_equal ((const gchar *)event.data.scalar.value, "whitelist")) { g_hash_table_unref (buildopts->allowed_build_names); buildopts->allowed_build_names = modulemd_yaml_parse_string_set (parser, &nested_error); if (buildopts->allowed_build_names == NULL) { MMD_YAML_ERROR_EVENT_EXIT_BOOL ( error, event, "Failed to parse whitelist list in buildopts rpms: %s", nested_error->message); } } else if (g_str_equal ((const gchar *)event.data.scalar.value, "macros")) { value = modulemd_yaml_parse_string (parser, &nested_error); if (!value) { MMD_YAML_ERROR_EVENT_EXIT_BOOL ( error, event, "Failed to parse rpm_macros in buildopts: %s", nested_error->message); } modulemd_buildopts_set_rpm_macros (buildopts, value); g_clear_pointer (&value, g_free); } else { SKIP_UNKNOWN (parser, FALSE, "Unexpected key in buildopts body: %s", (const gchar *)event.data.scalar.value); } break; default: MMD_YAML_ERROR_EVENT_EXIT_BOOL ( error, event, "Unexpected YAML event in rpm buildopts: %s", mmd_yaml_get_event_name (event.type)); break; } yaml_event_delete (&event); } return TRUE; } gboolean modulemd_buildopts_emit_yaml (ModulemdBuildopts *self, yaml_emitter_t *emitter, GError **error) { MODULEMD_INIT_TRACE (); int ret; g_auto (GStrv) list = NULL; g_autoptr (GError) nested_error = NULL; MMD_INIT_YAML_EVENT (event); ret = mmd_emitter_scalar ( emitter, "rpms", YAML_PLAIN_SCALAR_STYLE, &nested_error); if (!ret) { g_propagate_prefixed_error ( error, g_steal_pointer (&nested_error), "Failed to emit buildopts 'rpms' constant: "); return FALSE; } ret = mmd_emitter_start_mapping ( emitter, YAML_BLOCK_MAPPING_STYLE, &nested_error); if (!ret) { g_propagate_prefixed_error (error, g_steal_pointer (&nested_error), "Failed to start buildopts mapping: "); return FALSE; } if (modulemd_buildopts_get_rpm_macros (self) != NULL) { ret = mmd_emitter_scalar ( emitter, "macros", YAML_PLAIN_SCALAR_STYLE, &nested_error); if (!ret) { g_propagate_prefixed_error (error, g_steal_pointer (&nested_error), "Failed to emit buildopts macros key: "); return FALSE; } ret = mmd_emitter_scalar (emitter, modulemd_buildopts_get_rpm_macros (self), YAML_FOLDED_SCALAR_STYLE, &nested_error); if (!ret) { g_propagate_prefixed_error ( error, g_steal_pointer (&nested_error), "Failed to emit buildopts macros value: "); return FALSE; } } if (g_hash_table_size (self->allowed_build_names) != 0) { ret = mmd_emitter_scalar ( emitter, "whitelist", YAML_PLAIN_SCALAR_STYLE, &nested_error); if (!ret) { g_propagate_prefixed_error ( error, g_steal_pointer (&nested_error), "Failed to emit buildopts whitelist key: "); return FALSE; } list = modulemd_buildopts_get_rpm_whitelist_as_strv (self); ret = mmd_emitter_strv ( emitter, YAML_BLOCK_SEQUENCE_STYLE, list, &nested_error); if (!ret) { g_propagate_prefixed_error (error, g_steal_pointer (&nested_error), "Failed to emit buildopts whitelist: "); return FALSE; } g_clear_pointer (&list, g_strfreev); } ret = mmd_emitter_end_mapping (emitter, &nested_error); if (!ret) { g_propagate_prefixed_error (error, g_steal_pointer (&nested_error), "Failed to end buildopts mapping"); return FALSE; } if (g_hash_table_size (self->arches) != 0) { ret = mmd_emitter_scalar ( emitter, "arches", YAML_PLAIN_SCALAR_STYLE, &nested_error); if (!ret) { g_propagate_prefixed_error (error, g_steal_pointer (&nested_error), "Failed to emit buildopts arches key: "); return FALSE; } list = modulemd_buildopts_get_arches_as_strv (self); ret = mmd_emitter_strv ( emitter, YAML_FLOW_SEQUENCE_STYLE, list, &nested_error); if (!ret) { g_propagate_prefixed_error (error, g_steal_pointer (&nested_error), "Failed to emit buildopts arches: "); return FALSE; } g_clear_pointer (&list, g_strfreev); } return TRUE; } fedora-modularity-libmodulemd-357799c/modulemd/modulemd-component-module.c000066400000000000000000000310061502446517500270040ustar00rootroot00000000000000/* * This file is part of libmodulemd * Copyright (C) 2018 Red Hat, Inc. * * Fedora-License-Identifier: MIT * SPDX-2.0-License-Identifier: MIT * SPDX-3.0-License-Identifier: MIT * * This program is free software. * For more information on the license, see COPYING. * For more information on free software, see . */ #include "modulemd-component-module.h" #include "private/modulemd-component-module-private.h" #include "private/modulemd-component-private.h" #include "private/modulemd-util.h" #include "private/modulemd-yaml.h" #define CM_DEFAULT_STRING "__UNSET_COMPONENT_MODULE__" struct _ModulemdComponentModule { GObject parent_instance; gchar *ref; gchar *repository; }; G_DEFINE_TYPE (ModulemdComponentModule, modulemd_component_module, MODULEMD_TYPE_COMPONENT) enum { PROP_0, PROP_REF, PROP_REPOSITORY, N_PROPS }; static GParamSpec *properties[N_PROPS]; ModulemdComponentModule * modulemd_component_module_new (const gchar *key) { return g_object_new (MODULEMD_TYPE_COMPONENT_MODULE, "name", key, NULL); } static void modulemd_component_module_finalize (GObject *object) { ModulemdComponentModule *self = (ModulemdComponentModule *)object; g_clear_pointer (&self->ref, g_free); g_clear_pointer (&self->repository, g_free); G_OBJECT_CLASS (modulemd_component_module_parent_class)->finalize (object); } static gboolean modulemd_component_module_equals (ModulemdComponent *self_1, ModulemdComponent *self_2) { ModulemdComponentModule *module_self_1 = NULL; ModulemdComponentModule *module_self_2 = NULL; g_return_val_if_fail (MODULEMD_IS_COMPONENT_MODULE (self_1), FALSE); module_self_1 = MODULEMD_COMPONENT_MODULE (self_1); g_return_val_if_fail (MODULEMD_IS_COMPONENT_MODULE (self_2), FALSE); module_self_2 = MODULEMD_COMPONENT_MODULE (self_2); if (!MODULEMD_COMPONENT_CLASS (modulemd_component_module_parent_class) ->equals (self_1, self_2)) { return FALSE; } if (g_strcmp0 (module_self_1->ref, module_self_2->ref) != 0) { return FALSE; } if (g_strcmp0 (module_self_1->repository, module_self_2->repository) != 0) { return FALSE; } return TRUE; } static ModulemdComponent * modulemd_component_module_copy (ModulemdComponent *self, const gchar *key) { ModulemdComponentModule *module_self = NULL; g_autoptr (ModulemdComponentModule) copy = NULL; g_return_val_if_fail (MODULEMD_IS_COMPONENT_MODULE (self), NULL); module_self = MODULEMD_COMPONENT_MODULE (self); copy = MODULEMD_COMPONENT_MODULE ( MODULEMD_COMPONENT_CLASS (modulemd_component_module_parent_class) ->copy (self, key)); modulemd_component_module_set_ref ( copy, modulemd_component_module_get_ref (module_self)); modulemd_component_module_set_repository ( copy, modulemd_component_module_get_repository (module_self)); return MODULEMD_COMPONENT (g_steal_pointer (©)); } void modulemd_component_module_set_ref (ModulemdComponentModule *self, const gchar *ref) { g_return_if_fail (MODULEMD_IS_COMPONENT_MODULE (self)); g_clear_pointer (&self->ref, g_free); self->ref = g_strdup (ref); g_object_notify_by_pspec (G_OBJECT (self), properties[PROP_REF]); } const gchar * modulemd_component_module_get_ref (ModulemdComponentModule *self) { g_return_val_if_fail (MODULEMD_IS_COMPONENT_MODULE (self), NULL); return self->ref; } void modulemd_component_module_set_repository (ModulemdComponentModule *self, const gchar *repository) { g_return_if_fail (MODULEMD_IS_COMPONENT_MODULE (self)); g_clear_pointer (&self->repository, g_free); self->repository = g_strdup (repository); g_object_notify_by_pspec (G_OBJECT (self), properties[PROP_REPOSITORY]); } const gchar * modulemd_component_module_get_repository (ModulemdComponentModule *self) { g_return_val_if_fail (MODULEMD_IS_COMPONENT_MODULE (self), NULL); return self->repository; } static void modulemd_component_module_get_property (GObject *object, guint prop_id, GValue *value, GParamSpec *pspec) { ModulemdComponentModule *self = MODULEMD_COMPONENT_MODULE (object); switch (prop_id) { case PROP_REF: g_value_set_string (value, modulemd_component_module_get_ref (self)); break; case PROP_REPOSITORY: g_value_set_string (value, modulemd_component_module_get_repository (self)); break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); } } static void modulemd_component_module_set_property (GObject *object, guint prop_id, const GValue *value, GParamSpec *pspec) { ModulemdComponentModule *self = MODULEMD_COMPONENT_MODULE (object); switch (prop_id) { case PROP_REF: modulemd_component_module_set_ref (self, g_value_get_string (value)); break; case PROP_REPOSITORY: modulemd_component_module_set_repository (self, g_value_get_string (value)); break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); } } static void modulemd_component_module_class_init (ModulemdComponentModuleClass *klass) { GObjectClass *object_class = G_OBJECT_CLASS (klass); ModulemdComponentClass *component_class = MODULEMD_COMPONENT_CLASS (object_class); object_class->finalize = modulemd_component_module_finalize; object_class->get_property = modulemd_component_module_get_property; object_class->set_property = modulemd_component_module_set_property; component_class->copy = modulemd_component_module_copy; component_class->equals = modulemd_component_module_equals; properties[PROP_REF] = g_param_spec_string ("ref", "Ref", "The commit ID in the SCM repository.", CM_DEFAULT_STRING, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS); properties[PROP_REPOSITORY] = g_param_spec_string ("repository", "Repository", "The URI of the SCM repository.", CM_DEFAULT_STRING, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS); g_object_class_install_properties (object_class, N_PROPS, properties); } static void modulemd_component_module_init (ModulemdComponentModule *UNUSED (self)) { /* Nothing to init */ } gboolean modulemd_component_module_emit_yaml (ModulemdComponentModule *self, yaml_emitter_t *emitter, GError **error) { MODULEMD_INIT_TRACE (); MMD_INIT_YAML_EVENT (event); if (!modulemd_component_emit_yaml_start ( MODULEMD_COMPONENT (self), emitter, error)) { return FALSE; } if (modulemd_component_module_get_repository (self) != NULL) { if (!mmd_emitter_scalar ( emitter, "repository", YAML_PLAIN_SCALAR_STYLE, error)) { return FALSE; } if (!mmd_emitter_scalar_string ( emitter, modulemd_component_module_get_repository (self), error)) { return FALSE; } } if (modulemd_component_module_get_ref (self) != NULL) { if (!mmd_emitter_scalar (emitter, "ref", YAML_PLAIN_SCALAR_STYLE, error)) { return FALSE; } if (!mmd_emitter_scalar_string ( emitter, modulemd_component_module_get_ref (self), error)) { return FALSE; } } if (!modulemd_component_emit_yaml_build_common ( MODULEMD_COMPONENT (self), emitter, error)) { return FALSE; } if (!mmd_emitter_end_mapping (emitter, error)) { return FALSE; } return TRUE; } ModulemdComponentModule * modulemd_component_module_parse_yaml (yaml_parser_t *parser, const gchar *name, gboolean strict, GError **error) { MODULEMD_INIT_TRACE (); MMD_INIT_YAML_EVENT (event); gboolean done = FALSE; gboolean in_map = FALSE; g_autofree gchar *value = NULL; gint buildorder = 0; g_autoptr (ModulemdComponentModule) m = NULL; g_autoptr (GError) nested_error = NULL; g_return_val_if_fail (error == NULL || *error == NULL, NULL); m = modulemd_component_module_new (name); while (!done) { YAML_PARSER_PARSE_WITH_EXIT (parser, &event, error); switch (event.type) { case YAML_MAPPING_START_EVENT: in_map = TRUE; break; case YAML_MAPPING_END_EVENT: in_map = FALSE; done = TRUE; break; case YAML_SCALAR_EVENT: if (!in_map) { MMD_YAML_ERROR_EVENT_EXIT ( error, event, "Missing mapping in module component entry"); break; } if (g_str_equal ((const gchar *)event.data.scalar.value, "rationale")) { value = modulemd_yaml_parse_string (parser, &nested_error); if (!value) { MMD_YAML_ERROR_EVENT_EXIT ( error, event, "Failed to parse rationale in component: %s", nested_error->message); } modulemd_component_set_rationale (MODULEMD_COMPONENT (m), value); g_clear_pointer (&value, g_free); } else if (g_str_equal ((const gchar *)event.data.scalar.value, "repository")) { value = modulemd_yaml_parse_string (parser, &nested_error); if (!value) { MMD_YAML_ERROR_EVENT_EXIT ( error, event, "Failed to parse repository in component: %s", nested_error->message); } modulemd_component_module_set_repository (m, value); g_clear_pointer (&value, g_free); } else if (g_str_equal ((const gchar *)event.data.scalar.value, "ref")) { value = modulemd_yaml_parse_string (parser, &nested_error); if (!value) { MMD_YAML_ERROR_EVENT_EXIT ( error, event, "Failed to parse ref in component: %s", nested_error->message); } modulemd_component_module_set_ref (m, value); g_clear_pointer (&value, g_free); } else if (g_str_equal ((const gchar *)event.data.scalar.value, "buildonly")) { if (!modulemd_component_parse_buildonly ( MODULEMD_COMPONENT (m), parser, &nested_error)) { MMD_YAML_ERROR_EVENT_EXIT ( error, event, "Failed to parse buildonly in component: %s", nested_error->message); } } else if (g_str_equal ((const gchar *)event.data.scalar.value, "buildorder")) { buildorder = modulemd_yaml_parse_int64 (parser, &nested_error); if (buildorder == 0 && nested_error != NULL) { MMD_YAML_ERROR_EVENT_EXIT ( error, event, "Failed to parse buildorder in component: %s", nested_error->message); } modulemd_component_set_buildorder (MODULEMD_COMPONENT (m), buildorder); } else { SKIP_UNKNOWN (parser, NULL, "Unexpected key in module component body: %s", (const gchar *)event.data.scalar.value); break; } break; default: /* We received a YAML event we shouldn't expect at this level */ MMD_YAML_ERROR_EVENT_EXIT ( error, event, "Unexpected YAML event in module component"); break; } yaml_event_delete (&event); } return g_steal_pointer (&m); } fedora-modularity-libmodulemd-357799c/modulemd/modulemd-component-rpm.c000066400000000000000000000630701502446517500263230ustar00rootroot00000000000000/* * This file is part of libmodulemd * Copyright (C) 2018 Red Hat, Inc. * * Fedora-License-Identifier: MIT * SPDX-2.0-License-Identifier: MIT * SPDX-3.0-License-Identifier: MIT * * This program is free software. * For more information on the license, see COPYING. * For more information on free software, see . */ #include "modulemd-component-rpm.h" #include "private/modulemd-component-private.h" #include "private/modulemd-component-rpm-private.h" #include "private/modulemd-util.h" #include "private/modulemd-yaml.h" #define CR_DEFAULT_STRING "__UNSET_COMPONENT_RPM__" struct _ModulemdComponentRpm { GObject parent_instance; gchar *override_name; gchar *ref; gchar *repository; gchar *cache; gboolean buildroot; gboolean srpm_buildroot; GHashTable *arches; GHashTable *multilib; }; G_DEFINE_TYPE (ModulemdComponentRpm, modulemd_component_rpm, MODULEMD_TYPE_COMPONENT) enum { PROP_0, PROP_REF, PROP_REPOSITORY, PROP_CACHE, PROP_BUILDROOT, PROP_SRPM_BUILDROOT, N_PROPS }; static GParamSpec *properties[N_PROPS]; ModulemdComponentRpm * modulemd_component_rpm_new (const gchar *key) { return g_object_new (MODULEMD_TYPE_COMPONENT_RPM, "name", key, NULL); } static void modulemd_component_rpm_finalize (GObject *object) { ModulemdComponentRpm *self = (ModulemdComponentRpm *)object; g_clear_pointer (&self->override_name, g_free); g_clear_pointer (&self->ref, g_free); g_clear_pointer (&self->repository, g_free); g_clear_pointer (&self->cache, g_free); g_clear_pointer (&self->arches, g_hash_table_unref); g_clear_pointer (&self->multilib, g_hash_table_unref); G_OBJECT_CLASS (modulemd_component_rpm_parent_class)->finalize (object); } static gboolean modulemd_component_rpm_equals (ModulemdComponent *self_1, ModulemdComponent *self_2) { ModulemdComponentRpm *rpm_self_1 = NULL; ModulemdComponentRpm *rpm_self_2 = NULL; g_return_val_if_fail (MODULEMD_IS_COMPONENT_RPM (self_1), FALSE); rpm_self_1 = MODULEMD_COMPONENT_RPM (self_1); g_return_val_if_fail (MODULEMD_IS_COMPONENT_RPM (self_2), FALSE); rpm_self_2 = MODULEMD_COMPONENT_RPM (self_2); if (!MODULEMD_COMPONENT_CLASS (modulemd_component_rpm_parent_class) ->equals (self_1, self_2)) { return FALSE; } if (g_strcmp0 (rpm_self_1->override_name, rpm_self_2->override_name) != 0) { return FALSE; } if (g_strcmp0 (rpm_self_1->ref, rpm_self_2->ref) != 0) { return FALSE; } if (g_strcmp0 (rpm_self_1->repository, rpm_self_2->repository) != 0) { return FALSE; } if (g_strcmp0 (rpm_self_1->cache, rpm_self_2->cache) != 0) { return FALSE; } if (!modulemd_boolean_equals (rpm_self_1->buildroot, rpm_self_2->buildroot)) { return FALSE; } if (!modulemd_boolean_equals (rpm_self_1->srpm_buildroot, rpm_self_2->srpm_buildroot)) { return FALSE; } if (!modulemd_hash_table_sets_are_equal (rpm_self_1->arches, rpm_self_2->arches)) { return FALSE; } if (!modulemd_hash_table_sets_are_equal (rpm_self_1->multilib, rpm_self_2->multilib)) { return FALSE; } return TRUE; } static GHashTable * hash_table_str_set_copy (GHashTable *orig) { GHashTable *new; GHashTableIter iter; gpointer key; g_return_val_if_fail (orig, NULL); new = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, NULL); g_hash_table_iter_init (&iter, orig); while (g_hash_table_iter_next (&iter, &key, NULL)) { g_hash_table_add (new, g_strdup ((const gchar *)key)); } return new; } static void modulemd_component_rpm_set_name (ModulemdComponent *self, const gchar *name); static const gchar * modulemd_component_rpm_get_name (ModulemdComponent *self); static ModulemdComponent * modulemd_component_rpm_copy (ModulemdComponent *self, const gchar *key) { ModulemdComponentRpm *rpm_self = NULL; g_autoptr (ModulemdComponentRpm) copy = NULL; g_return_val_if_fail (MODULEMD_IS_COMPONENT_RPM (self), NULL); rpm_self = MODULEMD_COMPONENT_RPM (self); copy = MODULEMD_COMPONENT_RPM ( MODULEMD_COMPONENT_CLASS (modulemd_component_rpm_parent_class) ->copy (self, key)); modulemd_component_rpm_set_ref (copy, modulemd_component_rpm_get_ref (rpm_self)); modulemd_component_rpm_set_name (MODULEMD_COMPONENT (copy), rpm_self->override_name); modulemd_component_rpm_set_repository ( copy, modulemd_component_rpm_get_repository (rpm_self)); modulemd_component_rpm_set_cache ( copy, modulemd_component_rpm_get_cache (rpm_self)); modulemd_component_rpm_set_buildroot (copy, rpm_self->buildroot); modulemd_component_rpm_set_srpm_buildroot (copy, rpm_self->srpm_buildroot); g_clear_pointer (©->arches, g_hash_table_unref); copy->arches = hash_table_str_set_copy (rpm_self->arches); g_clear_pointer (©->multilib, g_hash_table_unref); copy->multilib = hash_table_str_set_copy (rpm_self->multilib); return MODULEMD_COMPONENT (g_steal_pointer (©)); } static void modulemd_component_rpm_set_name (ModulemdComponent *self, const gchar *name) { const gchar *key = NULL; ModulemdComponentRpm *rpm_self = NULL; g_return_if_fail (MODULEMD_IS_COMPONENT_RPM (self)); rpm_self = MODULEMD_COMPONENT_RPM (self); if (g_strcmp0 (rpm_self->override_name, name) == 0) { /* No change, so just return. */ return; } /* We're changing the value, so clear the existing version */ g_clear_pointer (&rpm_self->override_name, g_free); key = MODULEMD_COMPONENT_CLASS (modulemd_component_rpm_parent_class) ->get_name (self); /* If we were passed non-NULL and the passed name differs from the hash table * key, save it. Otherwise, just leave it set NULL. */ if (name && g_strcmp0 (key, name) != 0) { rpm_self->override_name = g_strdup (name); } } static const gchar * modulemd_component_rpm_get_name (ModulemdComponent *self) { ModulemdComponentRpm *rpm_self = NULL; g_return_val_if_fail (MODULEMD_IS_COMPONENT_RPM (self), NULL); rpm_self = MODULEMD_COMPONENT_RPM (self); /* If an override name was set, return it */ if (rpm_self->override_name) { return rpm_self->override_name; } /* Otherwise, return the hash table key as the name */ return MODULEMD_COMPONENT_CLASS (modulemd_component_rpm_parent_class) ->get_name (self); } void modulemd_component_rpm_set_ref (ModulemdComponentRpm *self, const gchar *ref) { g_return_if_fail (MODULEMD_IS_COMPONENT_RPM (self)); g_clear_pointer (&self->ref, g_free); self->ref = g_strdup (ref); g_object_notify_by_pspec (G_OBJECT (self), properties[PROP_REF]); } const gchar * modulemd_component_rpm_get_ref (ModulemdComponentRpm *self) { g_return_val_if_fail (MODULEMD_IS_COMPONENT_RPM (self), NULL); return self->ref; } void modulemd_component_rpm_set_cache (ModulemdComponentRpm *self, const gchar *cache) { g_return_if_fail (MODULEMD_IS_COMPONENT_RPM (self)); g_clear_pointer (&self->cache, g_free); self->cache = g_strdup (cache); g_object_notify_by_pspec (G_OBJECT (self), properties[PROP_CACHE]); } const gchar * modulemd_component_rpm_get_cache (ModulemdComponentRpm *self) { g_return_val_if_fail (MODULEMD_IS_COMPONENT_RPM (self), NULL); return self->cache; } void modulemd_component_rpm_set_repository (ModulemdComponentRpm *self, const gchar *repository) { g_return_if_fail (MODULEMD_IS_COMPONENT_RPM (self)); g_clear_pointer (&self->repository, g_free); self->repository = g_strdup (repository); g_object_notify_by_pspec (G_OBJECT (self), properties[PROP_REPOSITORY]); } const gchar * modulemd_component_rpm_get_repository (ModulemdComponentRpm *self) { g_return_val_if_fail (MODULEMD_IS_COMPONENT_RPM (self), NULL); return self->repository; } void modulemd_component_rpm_set_buildroot (ModulemdComponentRpm *self, gboolean buildroot) { g_return_if_fail (MODULEMD_IS_COMPONENT_RPM (self)); self->buildroot = buildroot; g_object_notify_by_pspec (G_OBJECT (self), properties[PROP_BUILDROOT]); } gboolean modulemd_component_rpm_get_buildroot (ModulemdComponentRpm *self) { g_return_val_if_fail (MODULEMD_IS_COMPONENT_RPM (self), FALSE); return self->buildroot; } void modulemd_component_rpm_set_srpm_buildroot (ModulemdComponentRpm *self, gboolean srpm_buildroot) { g_return_if_fail (MODULEMD_IS_COMPONENT_RPM (self)); self->srpm_buildroot = srpm_buildroot; g_object_notify_by_pspec (G_OBJECT (self), properties[PROP_SRPM_BUILDROOT]); } gboolean modulemd_component_rpm_get_srpm_buildroot (ModulemdComponentRpm *self) { g_return_val_if_fail (MODULEMD_IS_COMPONENT_RPM (self), FALSE); return self->srpm_buildroot; } void modulemd_component_rpm_add_restricted_arch (ModulemdComponentRpm *self, const gchar *arch) { g_return_if_fail (MODULEMD_IS_COMPONENT_RPM (self)); g_hash_table_add (self->arches, g_strdup (arch)); } /* Deprecated in favor of modulemd_component_rpm_clear_arches() */ void modulemd_component_rpm_reset_arches (ModulemdComponentRpm *self) { modulemd_component_rpm_clear_arches (self); } void modulemd_component_rpm_clear_arches (ModulemdComponentRpm *self) { g_return_if_fail (MODULEMD_IS_COMPONENT_RPM (self)); g_hash_table_remove_all (self->arches); } GStrv modulemd_component_rpm_get_arches_as_strv (ModulemdComponentRpm *self) { g_return_val_if_fail (MODULEMD_IS_COMPONENT_RPM (self), NULL); return modulemd_ordered_str_keys_as_strv (self->arches); ; } void modulemd_component_rpm_add_multilib_arch (ModulemdComponentRpm *self, const gchar *arch) { g_return_if_fail (MODULEMD_IS_COMPONENT_RPM (self)); g_hash_table_add (self->multilib, g_strdup (arch)); } /* Deprecated in favor of modulemd_component_rpm_clear_multilib_arches() */ void modulemd_component_rpm_reset_multilib_arches (ModulemdComponentRpm *self) { modulemd_component_rpm_clear_multilib_arches (self); } void modulemd_component_rpm_clear_multilib_arches (ModulemdComponentRpm *self) { g_return_if_fail (MODULEMD_IS_COMPONENT_RPM (self)); g_hash_table_remove_all (self->multilib); } GStrv modulemd_component_rpm_get_multilib_arches_as_strv (ModulemdComponentRpm *self) { g_return_val_if_fail (MODULEMD_IS_COMPONENT_RPM (self), NULL); return modulemd_ordered_str_keys_as_strv (self->multilib); ; } static void modulemd_component_rpm_get_property (GObject *object, guint prop_id, GValue *value, GParamSpec *pspec) { ModulemdComponentRpm *self = MODULEMD_COMPONENT_RPM (object); switch (prop_id) { case PROP_REF: g_value_set_string (value, modulemd_component_rpm_get_ref (self)); break; case PROP_REPOSITORY: g_value_set_string (value, modulemd_component_rpm_get_repository (self)); break; case PROP_CACHE: g_value_set_string (value, modulemd_component_rpm_get_cache (self)); break; case PROP_BUILDROOT: g_value_set_boolean (value, modulemd_component_rpm_get_buildroot (self)); break; case PROP_SRPM_BUILDROOT: g_value_set_boolean (value, modulemd_component_rpm_get_srpm_buildroot (self)); break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); } } static void modulemd_component_rpm_set_property (GObject *object, guint prop_id, const GValue *value, GParamSpec *pspec) { ModulemdComponentRpm *self = MODULEMD_COMPONENT_RPM (object); switch (prop_id) { case PROP_REF: modulemd_component_rpm_set_ref (self, g_value_get_string (value)); break; case PROP_REPOSITORY: modulemd_component_rpm_set_repository (self, g_value_get_string (value)); break; case PROP_CACHE: modulemd_component_rpm_set_cache (self, g_value_get_string (value)); break; case PROP_BUILDROOT: modulemd_component_rpm_set_buildroot (self, g_value_get_boolean (value)); break; case PROP_SRPM_BUILDROOT: modulemd_component_rpm_set_srpm_buildroot (self, g_value_get_boolean (value)); break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); } } static void modulemd_component_rpm_class_init (ModulemdComponentRpmClass *klass) { GObjectClass *object_class = G_OBJECT_CLASS (klass); ModulemdComponentClass *component_class = MODULEMD_COMPONENT_CLASS (object_class); object_class->finalize = modulemd_component_rpm_finalize; object_class->get_property = modulemd_component_rpm_get_property; object_class->set_property = modulemd_component_rpm_set_property; component_class->copy = modulemd_component_rpm_copy; component_class->equals = modulemd_component_rpm_equals; component_class->set_name = modulemd_component_rpm_set_name; component_class->get_name = modulemd_component_rpm_get_name; // clang-format off properties[PROP_CACHE] = g_param_spec_string ( "cache", "Cache", "The lookaside cache URL.", CR_DEFAULT_STRING, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS); properties[PROP_REF] = g_param_spec_string ( "ref", "Ref", "The commit ID in the SCM repository.", CR_DEFAULT_STRING, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS); properties[PROP_REPOSITORY] = g_param_spec_string ( "repository", "Repository", "The URI of the SCM repository.", CR_DEFAULT_STRING, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS); properties[PROP_BUILDROOT] = g_param_spec_boolean ( "buildroot", "Buildroot", "Whether the packages listed in this module's buildroot profile will be " "installed into the buildroot of any component built in subsequent " "buildorder/buildafter batches.", FALSE, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS); properties[PROP_SRPM_BUILDROOT] = g_param_spec_boolean ( "srpm-buildroot", "SrpmBuildroot", "Whether the packages listed in this module's srpm-buildroot profile will " "be installed into the buildroot when performing the buildSRPMfromSCM " "step in subsequent buildorder/buildafter batches.", FALSE, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS); // clang-format on g_object_class_install_properties (object_class, N_PROPS, properties); } static void modulemd_component_rpm_init (ModulemdComponentRpm *self) { self->arches = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, NULL); self->multilib = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, NULL); } gboolean modulemd_component_rpm_emit_yaml (ModulemdComponentRpm *self, yaml_emitter_t *emitter, GError **error) { MODULEMD_INIT_TRACE (); MMD_INIT_YAML_EVENT (event); g_auto (GStrv) list = NULL; if (!modulemd_component_emit_yaml_start ( MODULEMD_COMPONENT (self), emitter, error)) { return FALSE; } EMIT_KEY_VALUE_STRING_IF_SET (emitter, error, "name", self->override_name); EMIT_KEY_VALUE_STRING_IF_SET ( emitter, error, "repository", self->repository); EMIT_KEY_VALUE_STRING_IF_SET (emitter, error, "cache", self->cache); EMIT_KEY_VALUE_STRING_IF_SET (emitter, error, "ref", self->ref); /* Only output buildroot if it's TRUE */ if (modulemd_component_rpm_get_buildroot (self)) { EMIT_KEY_VALUE (emitter, error, "buildroot", "true"); } /* Only output srpm-buildroot if it's TRUE */ if (modulemd_component_rpm_get_srpm_buildroot (self)) { EMIT_KEY_VALUE (emitter, error, "srpm-buildroot", "true"); } if (!modulemd_component_emit_yaml_build_common ( MODULEMD_COMPONENT (self), emitter, error)) { return FALSE; } if (g_hash_table_size (self->arches) != 0) { if (!mmd_emitter_scalar ( emitter, "arches", YAML_PLAIN_SCALAR_STYLE, error)) { return FALSE; } list = modulemd_component_rpm_get_arches_as_strv (self); if (!mmd_emitter_strv (emitter, YAML_FLOW_SEQUENCE_STYLE, list, error)) { return FALSE; } g_clear_pointer (&list, g_strfreev); } if (g_hash_table_size (self->multilib) != 0) { if (!mmd_emitter_scalar ( emitter, "multilib", YAML_PLAIN_SCALAR_STYLE, error)) { return FALSE; } list = modulemd_component_rpm_get_multilib_arches_as_strv (self); if (!mmd_emitter_strv (emitter, YAML_FLOW_SEQUENCE_STYLE, list, error)) { return FALSE; } g_clear_pointer (&list, g_strfreev); } if (!mmd_emitter_end_mapping (emitter, error)) { return FALSE; } return TRUE; } ModulemdComponentRpm * modulemd_component_rpm_parse_yaml (yaml_parser_t *parser, const gchar *name, gboolean strict, GError **error) { MODULEMD_INIT_TRACE (); MMD_INIT_YAML_EVENT (event); gboolean done = FALSE; gboolean in_map = FALSE; gboolean truth_value; g_autofree gchar *value = NULL; g_autoptr (GHashTable) list = NULL; gint buildorder = 0; g_autoptr (ModulemdComponentRpm) r = NULL; g_autoptr (GError) nested_error = NULL; g_return_val_if_fail (error == NULL || *error == NULL, NULL); r = modulemd_component_rpm_new (name); while (!done) { YAML_PARSER_PARSE_WITH_EXIT (parser, &event, error); switch (event.type) { case YAML_MAPPING_START_EVENT: in_map = TRUE; break; case YAML_MAPPING_END_EVENT: in_map = FALSE; done = TRUE; break; case YAML_SCALAR_EVENT: if (!in_map) { MMD_YAML_ERROR_EVENT_EXIT ( error, event, "Missing mapping in rpm component entry"); break; } if (g_str_equal ((const gchar *)event.data.scalar.value, "rationale")) { value = modulemd_yaml_parse_string (parser, &nested_error); if (!value) { MMD_YAML_ERROR_EVENT_EXIT ( error, event, "Failed to parse rationale in component: %s", nested_error->message); } modulemd_component_set_rationale (MODULEMD_COMPONENT (r), value); g_clear_pointer (&value, g_free); } else if (g_str_equal ((const gchar *)event.data.scalar.value, "name")) { value = modulemd_yaml_parse_string (parser, &nested_error); if (!value) { MMD_YAML_ERROR_EVENT_EXIT ( error, event, "Failed to parse override name in component: %s", nested_error->message); } modulemd_component_set_name (MODULEMD_COMPONENT (r), value); g_clear_pointer (&value, g_free); } else if (g_str_equal ((const gchar *)event.data.scalar.value, "repository")) { value = modulemd_yaml_parse_string (parser, &nested_error); if (!value) { MMD_YAML_ERROR_EVENT_EXIT ( error, event, "Failed to parse repository in component: %s", nested_error->message); } modulemd_component_rpm_set_repository (r, value); g_clear_pointer (&value, g_free); } else if (g_str_equal ((const gchar *)event.data.scalar.value, "ref")) { value = modulemd_yaml_parse_string (parser, &nested_error); if (!value) { MMD_YAML_ERROR_EVENT_EXIT ( error, event, "Failed to parse ref in component: %s", nested_error->message); } modulemd_component_rpm_set_ref (r, value); g_clear_pointer (&value, g_free); } else if (g_str_equal ((const gchar *)event.data.scalar.value, "cache")) { value = modulemd_yaml_parse_string (parser, &nested_error); if (!value) { MMD_YAML_ERROR_EVENT_EXIT ( error, event, "Failed to parse cache in component: %s", nested_error->message); } modulemd_component_rpm_set_cache (r, value); g_clear_pointer (&value, g_free); } else if (g_str_equal ((const gchar *)event.data.scalar.value, "arches")) { list = modulemd_yaml_parse_string_set (parser, &nested_error); if (!list) { MMD_YAML_ERROR_EVENT_EXIT ( error, event, "Failed to parse arches in component: %s", nested_error->message); } g_clear_pointer (&r->arches, g_hash_table_unref); r->arches = g_steal_pointer (&list); } else if (g_str_equal ((const gchar *)event.data.scalar.value, "multilib")) { list = modulemd_yaml_parse_string_set (parser, &nested_error); if (!list) { MMD_YAML_ERROR_EVENT_EXIT ( error, event, "Failed to parse arches in component: %s", nested_error->message); } g_clear_pointer (&r->multilib, g_hash_table_unref); r->multilib = g_steal_pointer (&list); } else if (g_str_equal ((const gchar *)event.data.scalar.value, "buildroot")) { truth_value = modulemd_yaml_parse_bool (parser, &nested_error); if (nested_error) { MMD_YAML_ERROR_EVENT_EXIT ( error, event, "Failed to parse buildroot in component: %s", nested_error->message); } modulemd_component_rpm_set_buildroot (r, truth_value); } else if (g_str_equal ((const gchar *)event.data.scalar.value, "srpm-buildroot")) { truth_value = modulemd_yaml_parse_bool (parser, &nested_error); if (nested_error) { MMD_YAML_ERROR_EVENT_EXIT ( error, event, "Failed to parse srpm-buildroot in component: %s", nested_error->message); } modulemd_component_rpm_set_srpm_buildroot (r, truth_value); } else if (g_str_equal ((const gchar *)event.data.scalar.value, "buildafter")) { if (!modulemd_component_parse_buildafter ( MODULEMD_COMPONENT (r), parser, &nested_error)) { MMD_YAML_ERROR_EVENT_EXIT ( error, event, "Failed to parse buildafter in component: %s", nested_error->message); } } else if (g_str_equal ((const gchar *)event.data.scalar.value, "buildonly")) { if (!modulemd_component_parse_buildonly ( MODULEMD_COMPONENT (r), parser, &nested_error)) { MMD_YAML_ERROR_EVENT_EXIT ( error, event, "Failed to parse buildonly in component: %s", nested_error->message); } } else if (g_str_equal ((const gchar *)event.data.scalar.value, "buildorder")) { buildorder = modulemd_yaml_parse_int64 (parser, &nested_error); if (buildorder == 0 && nested_error != NULL) { MMD_YAML_ERROR_EVENT_EXIT ( error, event, "Failed to parse buildorder in component: %s", nested_error->message); } modulemd_component_set_buildorder (MODULEMD_COMPONENT (r), buildorder); } else { SKIP_UNKNOWN (parser, NULL, "Unexpected key in rpm component body: %s", (const gchar *)event.data.scalar.value); break; } break; default: /* We received a YAML event we shouldn't expect at this level */ MMD_YAML_ERROR_EVENT_EXIT ( error, event, "Unexpected YAML event in rpm component"); break; } yaml_event_delete (&event); } return g_steal_pointer (&r); } fedora-modularity-libmodulemd-357799c/modulemd/modulemd-component.c000066400000000000000000000435221502446517500255270ustar00rootroot00000000000000/* * This file is part of libmodulemd * Copyright (C) 2018 Red Hat, Inc. * * Fedora-License-Identifier: MIT * SPDX-2.0-License-Identifier: MIT * SPDX-3.0-License-Identifier: MIT * * This program is free software. * For more information on the license, see COPYING. * For more information on free software, see . */ #include #include "modulemd-component.h" #include "modulemd-errors.h" #include "private/modulemd-component-private.h" #include "private/modulemd-util.h" #include "private/modulemd-yaml.h" #define C_DEFAULT_STRING "__UNSET__" typedef struct { gint64 buildorder; GHashTable *buildafter; gboolean buildonly; gchar *name; gchar *rationale; } ModulemdComponentPrivate; G_DEFINE_ABSTRACT_TYPE_WITH_PRIVATE (ModulemdComponent, modulemd_component, G_TYPE_OBJECT); enum { PROP_0, PROP_BUILDONLY, PROP_BUILDORDER, PROP_NAME, PROP_RATIONALE, N_PROPS }; static GParamSpec *properties[N_PROPS]; gboolean modulemd_component_equals_wrapper (const void *a, const void *b) { g_return_val_if_fail (MODULEMD_IS_COMPONENT ((ModulemdComponent *)a), FALSE); g_return_val_if_fail (MODULEMD_IS_COMPONENT ((ModulemdComponent *)b), FALSE); return modulemd_component_equals ((ModulemdComponent *)a, (ModulemdComponent *)b); } gboolean modulemd_component_equals (ModulemdComponent *self_1, ModulemdComponent *self_2) { if (!self_1 && !self_2) { return TRUE; } if (!self_1 || !self_2) { return FALSE; } g_return_val_if_fail (MODULEMD_IS_COMPONENT (self_1), FALSE); g_return_val_if_fail (MODULEMD_IS_COMPONENT (self_2), FALSE); ModulemdComponentClass *klass; klass = MODULEMD_COMPONENT_GET_CLASS (self_1); g_return_val_if_fail (klass->equals, FALSE); return klass->equals (self_1, self_2); } static void modulemd_component_finalize (GObject *object) { ModulemdComponent *self = (ModulemdComponent *)object; ModulemdComponentPrivate *priv = modulemd_component_get_instance_private (self); g_clear_pointer (&priv->name, g_free); g_clear_pointer (&priv->rationale, g_free); g_clear_pointer (&priv->buildafter, g_hash_table_unref); G_OBJECT_CLASS (modulemd_component_parent_class)->finalize (object); } ModulemdComponent * modulemd_component_copy (ModulemdComponent *self, const gchar *key) { g_return_val_if_fail (self, NULL); ModulemdComponentClass *klass; klass = MODULEMD_COMPONENT_GET_CLASS (self); g_return_val_if_fail (klass->copy, NULL); return klass->copy (self, key); } static gboolean modulemd_component_default_validate (ModulemdComponent *self, GError **error) { if (!self) { return FALSE; } ModulemdComponentPrivate *priv = modulemd_component_get_instance_private (self); g_return_val_if_fail (MODULEMD_IS_COMPONENT (self), FALSE); if (priv->buildorder && modulemd_component_has_buildafter (self)) { /* It is invalid to have both buildorder and buildafter set on a * component */ g_set_error ( error, MODULEMD_ERROR, MMD_ERROR_VALIDATE, "Cannot mix buildorder and buildafter in the same component"); return FALSE; } return TRUE; } gboolean modulemd_component_validate (ModulemdComponent *self, GError **error) { ModulemdComponentClass *klass; if (!self) { return FALSE; } g_return_val_if_fail (MODULEMD_IS_COMPONENT (self), FALSE); klass = MODULEMD_COMPONENT_GET_CLASS (self); g_return_val_if_fail (klass->validate, FALSE); return klass->validate (self, error); } static ModulemdComponent * modulemd_component_copy_component (ModulemdComponent *self, const gchar *key) { ModulemdComponentPrivate *priv = modulemd_component_get_instance_private (self); ModulemdComponentPrivate *m_priv = NULL; g_autoptr (ModulemdComponent) m = NULL; if (key == NULL) { key = priv->name; } m = g_object_new (G_OBJECT_TYPE (self), "name", key, NULL); modulemd_component_set_buildorder (m, modulemd_component_get_buildorder (self)); modulemd_component_set_rationale (m, modulemd_component_get_rationale (self)); modulemd_component_set_buildonly (m, modulemd_component_get_buildonly (self)); m_priv = modulemd_component_get_instance_private (m); g_clear_pointer (&m_priv->buildafter, g_hash_table_unref); m_priv->buildafter = modulemd_hash_table_deep_set_copy (priv->buildafter); return g_steal_pointer (&m); } static gboolean modulemd_component_default_equals (ModulemdComponent *self_1, ModulemdComponent *self_2) { if (modulemd_component_get_buildorder (self_1) != modulemd_component_get_buildorder (self_2)) { return FALSE; } if (modulemd_component_get_buildonly (self_1) != modulemd_component_get_buildonly (self_2)) { return FALSE; } if (g_strcmp0 (modulemd_component_get_name (self_1), modulemd_component_get_name (self_2)) != 0) { return FALSE; } if (g_strcmp0 (modulemd_component_get_rationale (self_1), modulemd_component_get_rationale (self_2)) != 0) { return FALSE; } if (!modulemd_hash_table_sets_are_equal ( modulemd_component_get_buildafter_internal (self_1), modulemd_component_get_buildafter_internal (self_2))) { return FALSE; } return TRUE; } void modulemd_component_add_buildafter (ModulemdComponent *self, const gchar *key) { g_return_if_fail (MODULEMD_IS_COMPONENT (self)); ModulemdComponentPrivate *priv = modulemd_component_get_instance_private (self); g_hash_table_add (priv->buildafter, g_strdup (key)); } void modulemd_component_clear_buildafter (ModulemdComponent *self) { g_return_if_fail (MODULEMD_IS_COMPONENT (self)); ModulemdComponentPrivate *priv = modulemd_component_get_instance_private (self); g_hash_table_remove_all (priv->buildafter); } GStrv modulemd_component_get_buildafter_as_strv (ModulemdComponent *self) { g_return_val_if_fail (MODULEMD_IS_COMPONENT (self), NULL); ModulemdComponentPrivate *priv = modulemd_component_get_instance_private (self); return modulemd_ordered_str_keys_as_strv (priv->buildafter); } GHashTable * modulemd_component_get_buildafter_internal (ModulemdComponent *self) { g_return_val_if_fail (MODULEMD_IS_COMPONENT (self), NULL); ModulemdComponentPrivate *priv = modulemd_component_get_instance_private (self); return priv->buildafter; } gboolean modulemd_component_has_buildafter (ModulemdComponent *self) { g_return_val_if_fail (MODULEMD_IS_COMPONENT (self), FALSE); ModulemdComponentPrivate *priv = modulemd_component_get_instance_private (self); return !!g_hash_table_size (priv->buildafter); } void modulemd_component_set_buildonly (ModulemdComponent *self, gboolean buildonly) { g_return_if_fail (MODULEMD_IS_COMPONENT (self)); ModulemdComponentPrivate *priv = modulemd_component_get_instance_private (self); priv->buildonly = buildonly; g_object_notify_by_pspec (G_OBJECT (self), properties[PROP_BUILDONLY]); } gboolean modulemd_component_get_buildonly (ModulemdComponent *self) { g_return_val_if_fail (MODULEMD_IS_COMPONENT (self), FALSE); ModulemdComponentPrivate *priv = modulemd_component_get_instance_private (self); return priv->buildonly; } void modulemd_component_set_buildorder (ModulemdComponent *self, gint64 buildorder) { g_return_if_fail (MODULEMD_IS_COMPONENT (self)); ModulemdComponentPrivate *priv = modulemd_component_get_instance_private (self); priv->buildorder = buildorder; g_object_notify_by_pspec (G_OBJECT (self), properties[PROP_BUILDORDER]); } gint64 modulemd_component_get_buildorder (ModulemdComponent *self) { g_return_val_if_fail (MODULEMD_IS_COMPONENT (self), 0); ModulemdComponentPrivate *priv = modulemd_component_get_instance_private (self); return priv->buildorder; } static void modulemd_component_set_key (ModulemdComponent *self, const gchar *name) { g_return_if_fail (MODULEMD_IS_COMPONENT (self)); g_return_if_fail (name); g_return_if_fail (!g_str_equal (name, C_DEFAULT_STRING)); ModulemdComponentPrivate *priv = modulemd_component_get_instance_private (self); g_clear_pointer (&priv->name, g_free); priv->name = g_strdup (name); g_object_notify_by_pspec (G_OBJECT (self), properties[PROP_NAME]); } void modulemd_component_set_name (ModulemdComponent *self, const gchar *name) { ModulemdComponentClass *klass; klass = MODULEMD_COMPONENT_GET_CLASS (self); /* Do nothing if the child class has not implemented this */ if (!klass->set_name) { return; } klass->set_name (self, name); } const gchar * modulemd_component_get_key (ModulemdComponent *self) { g_return_val_if_fail (MODULEMD_IS_COMPONENT (self), NULL); ModulemdComponentPrivate *priv = modulemd_component_get_instance_private (self); return priv->name; } const gchar * modulemd_component_get_name (ModulemdComponent *self) { ModulemdComponentClass *klass; klass = MODULEMD_COMPONENT_GET_CLASS (self); g_return_val_if_fail (klass->get_name, NULL); return klass->get_name (self); } void modulemd_component_set_rationale (ModulemdComponent *self, const gchar *rationale) { g_return_if_fail (MODULEMD_IS_COMPONENT (self)); ModulemdComponentPrivate *priv = modulemd_component_get_instance_private (self); g_clear_pointer (&priv->rationale, g_free); priv->rationale = g_strdup (rationale); g_object_notify_by_pspec (G_OBJECT (self), properties[PROP_RATIONALE]); } const gchar * modulemd_component_get_rationale (ModulemdComponent *self) { g_return_val_if_fail (MODULEMD_IS_COMPONENT (self), NULL); ModulemdComponentPrivate *priv = modulemd_component_get_instance_private (self); return priv->rationale; } static void modulemd_component_get_property (GObject *object, guint prop_id, GValue *value, GParamSpec *pspec) { ModulemdComponent *self = MODULEMD_COMPONENT (object); switch (prop_id) { case PROP_BUILDONLY: g_value_set_boolean (value, modulemd_component_get_buildonly (self)); break; case PROP_BUILDORDER: g_value_set_int64 (value, modulemd_component_get_buildorder (self)); break; case PROP_NAME: /* On lookups, return the real name value, not the key. This differs from * the set function, which always assigns the key. */ g_value_set_string (value, modulemd_component_get_name (self)); break; case PROP_RATIONALE: g_value_set_string (value, modulemd_component_get_rationale (self)); break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); } } static void modulemd_component_set_property (GObject *object, guint prop_id, const GValue *value, GParamSpec *pspec) { ModulemdComponent *self = MODULEMD_COMPONENT (object); switch (prop_id) { case PROP_BUILDONLY: modulemd_component_set_buildonly (self, g_value_get_boolean (value)); break; case PROP_BUILDORDER: modulemd_component_set_buildorder (self, g_value_get_int64 (value)); break; case PROP_NAME: /* On object creation, we set the key. */ modulemd_component_set_key (self, g_value_get_string (value)); break; case PROP_RATIONALE: modulemd_component_set_rationale (self, g_value_get_string (value)); break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); } } static void modulemd_component_class_init (ModulemdComponentClass *klass) { GObjectClass *object_class = G_OBJECT_CLASS (klass); object_class->finalize = modulemd_component_finalize; object_class->get_property = modulemd_component_get_property; object_class->set_property = modulemd_component_set_property; klass->copy = modulemd_component_copy_component; klass->equals = modulemd_component_default_equals; klass->set_name = NULL; klass->get_name = modulemd_component_get_key; klass->validate = modulemd_component_default_validate; properties[PROP_BUILDONLY] = g_param_spec_boolean ("buildonly", "Buildonly", "Whether the artifacts produced by this component " "are intended only for building this module.", FALSE, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS); properties[PROP_BUILDORDER] = g_param_spec_int64 ( "buildorder", "Buildorder", "The order this component should be built relative to others.", G_MININT64, G_MAXINT64, 0, G_PARAM_READWRITE); properties[PROP_NAME] = g_param_spec_string ( "name", "Name", "The name of the component. This is the real name of the component and " "may differ from the key used to associate this component with the " "ModuleStream.", C_DEFAULT_STRING, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS | G_PARAM_CONSTRUCT_ONLY); properties[PROP_RATIONALE] = g_param_spec_string ("rationale", "Rationale", "A description of the reason this component is " "part of the module stream.", C_DEFAULT_STRING, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS); g_object_class_install_properties (object_class, N_PROPS, properties); } static void modulemd_component_init (ModulemdComponent *self) { ModulemdComponentPrivate *priv = modulemd_component_get_instance_private (self); priv->buildafter = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, NULL); } gboolean modulemd_component_parse_buildafter (ModulemdComponent *self, yaml_parser_t *parser, GError **error) { g_autoptr (GHashTable) buildafter = NULL; g_autoptr (GError) nested_error = NULL; ModulemdComponentPrivate *priv = modulemd_component_get_instance_private (self); MODULEMD_INIT_TRACE (); buildafter = modulemd_yaml_parse_string_set (parser, &nested_error); if (!buildafter) { g_propagate_error (error, g_steal_pointer (&nested_error)); return FALSE; } g_clear_pointer (&priv->buildafter, g_hash_table_unref); priv->buildafter = g_steal_pointer (&buildafter); return TRUE; } gboolean modulemd_component_parse_buildonly (ModulemdComponent *self, yaml_parser_t *parser, GError **error) { gboolean buildonly = FALSE; g_autoptr (GError) nested_error = NULL; g_return_val_if_fail (MODULEMD_IS_COMPONENT (self), FALSE); buildonly = modulemd_yaml_parse_bool (parser, &nested_error); if (nested_error) { g_propagate_error (error, g_steal_pointer (&nested_error)); return FALSE; } modulemd_component_set_buildonly (self, buildonly); return TRUE; } gboolean modulemd_component_emit_yaml_start (ModulemdComponent *self, yaml_emitter_t *emitter, GError **error) { ModulemdComponentPrivate *priv = modulemd_component_get_instance_private (self); g_autoptr (GError) nested_error = NULL; MODULEMD_INIT_TRACE (); if (!modulemd_component_validate (self, &nested_error)) { g_propagate_prefixed_error (error, g_steal_pointer (&nested_error), "Component failed to validate: "); return FALSE; } if (!mmd_emitter_scalar_string (emitter, priv->name, error)) { return FALSE; } if (!mmd_emitter_start_mapping (emitter, YAML_BLOCK_MAPPING_STYLE, error)) { return FALSE; } if (modulemd_component_get_rationale (self) != NULL) { if (!mmd_emitter_scalar ( emitter, "rationale", YAML_PLAIN_SCALAR_STYLE, error)) { return FALSE; } if (!mmd_emitter_scalar_string ( emitter, modulemd_component_get_rationale (self), error)) { return FALSE; } } /* The rest of the fields are emitted by children, after which they need to call emit_yaml_end to end the mapping. */ return TRUE; } gboolean modulemd_component_emit_yaml_build_common (ModulemdComponent *self, yaml_emitter_t *emitter, GError **error) { ModulemdComponentPrivate *priv = modulemd_component_get_instance_private (self); g_autofree gchar *buildorder = NULL; g_autoptr (GPtrArray) buildafter = NULL; MODULEMD_INIT_TRACE (); if (modulemd_component_get_buildorder (self) != 0) { buildorder = g_strdup_printf ("%" PRId64, modulemd_component_get_buildorder (self)); ; if (!mmd_emitter_scalar ( emitter, "buildorder", YAML_PLAIN_SCALAR_STYLE, error)) { return FALSE; } if (!mmd_emitter_scalar ( emitter, buildorder, YAML_PLAIN_SCALAR_STYLE, error)) { return FALSE; } } else if (g_hash_table_size (priv->buildafter)) { buildafter = modulemd_ordered_str_keys (priv->buildafter, modulemd_strcmp_sort); EMIT_SCALAR (emitter, error, "buildafter"); EMIT_SEQUENCE_START (emitter, error); for (guint i = 0; i < buildafter->len; i++) { EMIT_SCALAR (emitter, error, g_ptr_array_index (buildafter, i)); } EMIT_SEQUENCE_END (emitter, error); } /* Only output buildonly if it's TRUE */ if (modulemd_component_get_buildonly (self)) { EMIT_SCALAR (emitter, error, "buildonly"); EMIT_SCALAR (emitter, error, "true"); } return TRUE; } fedora-modularity-libmodulemd-357799c/modulemd/modulemd-compression.c000066400000000000000000000176211502446517500260670ustar00rootroot00000000000000/* * This file is part of libmodulemd * Copyright (C) 2019 Red Hat, Inc. * * Fedora-License-Identifier: MIT * SPDX-2.0-License-Identifier: MIT * SPDX-3.0-License-Identifier: MIT * * This program is free software. * For more information on the license, see COPYING. * For more information on free software, see . */ #include #include #include #include #include #ifdef HAVE_RPMIO #include #endif #include "modulemd-compression.h" #include "modulemd-errors.h" #include "private/modulemd-compression-private.h" #include "private/modulemd-util.h" ModulemdCompressionTypeEnum modulemd_detect_compression (const gchar *filename, int fd, GError **error) { g_return_val_if_fail (filename, MODULEMD_COMPRESSION_TYPE_DETECTION_FAILED); g_return_val_if_fail (!error || *error == NULL, MODULEMD_COMPRESSION_TYPE_DETECTION_FAILED); if (!g_file_test (filename, G_FILE_TEST_IS_REGULAR)) { g_set_error (error, MODULEMD_ERROR, MMD_ERROR_FILE_ACCESS, "File %s does not exist or is not a regular file", filename); return MODULEMD_COMPRESSION_TYPE_DETECTION_FAILED; } /* If the filename has a known suffix, assume it is accurate */ if (g_str_has_suffix (filename, ".gz") || g_str_has_suffix (filename, ".gzip") || g_str_has_suffix (filename, ".gunzip")) { return MODULEMD_COMPRESSION_TYPE_GZ_COMPRESSION; } if (g_str_has_suffix (filename, ".bz2") || g_str_has_suffix (filename, ".bzip2")) { return MODULEMD_COMPRESSION_TYPE_BZ2_COMPRESSION; } if (g_str_has_suffix (filename, ".xz")) { return MODULEMD_COMPRESSION_TYPE_XZ_COMPRESSION; } if (g_str_has_suffix (filename, ".zst")) { return MODULEMD_COMPRESSION_TYPE_ZSTD_COMPRESSION; } if (g_str_has_suffix (filename, ".yaml") || g_str_has_suffix (filename, ".yml") || g_str_has_suffix (filename, ".txt")) { return MODULEMD_COMPRESSION_TYPE_NO_COMPRESSION; } /* No known suffix? Inspect magic bytes in the content. */ unsigned char buffer[6]; /* gzip, bzip2, zstd have a 4-byte header. xz has a 6-byte header. */ size_t filled = 0; ssize_t retval = 0; do { retval = read (fd, buffer + filled, sizeof (buffer) - filled); if (retval == -1 && errno != EAGAIN && errno != EWOULDBLOCK) { g_set_error (error, MODULEMD_ERROR, MMD_ERROR_MAGIC, "Could not read from file %s: %s", filename, g_strerror (errno)); lseek (fd, 0, SEEK_SET); return MODULEMD_COMPRESSION_TYPE_DETECTION_FAILED; } else if (retval > 0) filled += retval; } while (retval != 0 && filled < sizeof (buffer)); /* Reset the file descriptor to the start of the file */ if ((off_t)-1 == lseek (fd, 0, SEEK_SET)) { g_set_error (error, MODULEMD_ERROR, MMD_ERROR_MAGIC, "Could not reset a position in %s file: %s", filename, g_strerror (errno)); return MODULEMD_COMPRESSION_TYPE_DETECTION_FAILED; } /* Classify files shorter than the buffer as a plain text */ if (filled < sizeof (buffer)) { g_debug ("%s: File %s is too short (%zu B) to be compressed", __func__, filename, filled); return MODULEMD_COMPRESSION_TYPE_NO_COMPRESSION; } /* Now inspect the file content */ if (buffer[0] == 0x1f && buffer[1] == 0x8b) /* RFC 1952. */ return MODULEMD_COMPRESSION_TYPE_GZ_COMPRESSION; if (buffer[0] == 'B' && buffer[1] == 'Z' && buffer[2] == 'h') /* bzip2 and libbzip2, version 1.0.8: A program and library for data compression. */ return MODULEMD_COMPRESSION_TYPE_BZ2_COMPRESSION; if (buffer[0] == 0xfd && buffer[1] == '7' && buffer[2] == 'z' && buffer[3] == 'X' && buffer[4] == 'Z' && buffer[5] == 0x00) /* The .xz File Format, Version 1.1.0 (2022-12-11). */ return MODULEMD_COMPRESSION_TYPE_XZ_COMPRESSION; if (/* Zstandard frame */ (buffer[0] == 0x28 && buffer[1] == 0xb5 && buffer[2] == 0x2f && buffer[3] == 0xfd) || /* Skippable frame */ ((buffer[0] & 0xf0) == 0x50 && buffer[1] == 0x2a && buffer[2] == 0x4d && buffer[3] == 0x18)) /* RFC 8878. */ return MODULEMD_COMPRESSION_TYPE_ZSTD_COMPRESSION; /* Fall back to no compression. YAML parser will error later on a binary * garbage. YAML 1.2.2 requires to support UTF-8, UTF-16, UTF-32, with and * without a byte-order mark. There is no reliable detection except of * reading the complete file and validating the UTF encoding. */ return MODULEMD_COMPRESSION_TYPE_NO_COMPRESSION; } ModulemdCompressionTypeEnum modulemd_compression_type (const gchar *name) { if (!name) { return MODULEMD_COMPRESSION_TYPE_UNKNOWN_COMPRESSION; } int type = MODULEMD_COMPRESSION_TYPE_UNKNOWN_COMPRESSION; if (!g_strcmp0 (name, "gz") || !g_strcmp0 (name, "gzip") || !g_strcmp0 (name, "gunzip")) { type = MODULEMD_COMPRESSION_TYPE_GZ_COMPRESSION; } if (!g_strcmp0 (name, "bz2") || !g_strcmp0 (name, "bzip2")) { type = MODULEMD_COMPRESSION_TYPE_BZ2_COMPRESSION; } if (!g_strcmp0 (name, "xz")) { type = MODULEMD_COMPRESSION_TYPE_XZ_COMPRESSION; } if (!g_strcmp0 (name, "zck")) { type = MODULEMD_COMPRESSION_TYPE_ZCK_COMPRESSION; } if (!g_strcmp0 (name, "zstd")) { type = MODULEMD_COMPRESSION_TYPE_ZSTD_COMPRESSION; } return type; } const gchar * modulemd_compression_suffix (ModulemdCompressionTypeEnum comtype) { switch (comtype) { case MODULEMD_COMPRESSION_TYPE_GZ_COMPRESSION: return ".gz"; case MODULEMD_COMPRESSION_TYPE_BZ2_COMPRESSION: return ".bz2"; case MODULEMD_COMPRESSION_TYPE_XZ_COMPRESSION: return ".xz"; case MODULEMD_COMPRESSION_TYPE_ZSTD_COMPRESSION: return ".zst"; default: return NULL; } } static const gchar * get_comtype_string (ModulemdCompressionTypeEnum comtype) { /* see rpmio/rpmio.c in the RPM sources for the origin of these * magic strings. */ switch (comtype) { case MODULEMD_COMPRESSION_TYPE_NO_COMPRESSION: return "fdio"; break; case MODULEMD_COMPRESSION_TYPE_GZ_COMPRESSION: return "gzdio"; break; case MODULEMD_COMPRESSION_TYPE_BZ2_COMPRESSION: return "bzdio"; break; case MODULEMD_COMPRESSION_TYPE_XZ_COMPRESSION: return "xzdio"; break; case MODULEMD_COMPRESSION_TYPE_ZSTD_COMPRESSION: return "zstdio"; break; default: g_info ("Unknown compression type: %d", comtype); return NULL; break; } } gchar * modulemd_get_rpmio_fmode (const gchar *mode, ModulemdCompressionTypeEnum comtype) { const gchar *type_string; if (!mode) { return NULL; } type_string = get_comtype_string (comtype); if (type_string == NULL) { return NULL; } return g_strdup_printf ("%s.%s", mode, type_string); } #ifdef HAVE_RPMIO gint compressed_stream_read_fn (void *data, unsigned char *buffer, size_t size, size_t *size_read) { FD_t rpmio_fd = (FD_t)data; ssize_t read = Fread (buffer, sizeof (*buffer), size, rpmio_fd); if (read < 0) { g_warning ("Got error [%d] reading the file", Ferror (rpmio_fd)); return 0; } *size_read = read; return 1; } #else gint compressed_stream_read_fn (void *data, unsigned char *buffer, size_t size, size_t *size_read) { /* Not implemented without librpm available */ return 0; } #endif #ifdef HAVE_RPMIO void mmd_Fclose (FD_t fd) { Fclose (fd); } #endif fedora-modularity-libmodulemd-357799c/modulemd/modulemd-defaults-v1.c000066400000000000000000001365641502446517500256710ustar00rootroot00000000000000/* * This file is part of libmodulemd * Copyright (C) 2017-2018 Stephen Gallagher * * Fedora-License-Identifier: MIT * SPDX-2.0-License-Identifier: MIT * SPDX-3.0-License-Identifier: MIT * * This program is free software. * For more information on the license, see COPYING. * For more information on free software, see . */ #include "modulemd-defaults-v1.h" #include "modulemd-errors.h" #include "private/modulemd-defaults-private.h" #include "private/modulemd-defaults-v1-private.h" #include "private/modulemd-subdocument-info-private.h" #include "private/modulemd-util.h" #include "private/modulemd-yaml.h" #include #include struct _ModulemdDefaultsV1 { GObject parent_instance; gchar *default_stream; /* @key: stream name * @value: #GHashTable set of profile names */ GHashTable *profile_defaults; /* @key: intent name * @value: string stream name */ GHashTable *intent_default_streams; /* @key: intent name * @value: #GHashTable set of profile names */ GHashTable *intent_default_profiles; }; G_DEFINE_TYPE (ModulemdDefaultsV1, modulemd_defaults_v1, MODULEMD_TYPE_DEFAULTS) static gboolean modulemd_defaults_v1_equals (ModulemdDefaults *self_1, ModulemdDefaults *self_2) { ModulemdDefaultsV1 *v1_self_1 = NULL; ModulemdDefaultsV1 *v1_self_2 = NULL; g_return_val_if_fail (MODULEMD_IS_DEFAULTS_V1 (self_1), FALSE); v1_self_1 = MODULEMD_DEFAULTS_V1 (self_1); g_return_val_if_fail (MODULEMD_IS_DEFAULTS_V1 (self_2), FALSE); v1_self_2 = MODULEMD_DEFAULTS_V1 (self_2); if (!MODULEMD_DEFAULTS_CLASS (modulemd_defaults_v1_parent_class) ->equals (self_1, self_2)) { return FALSE; } if (g_strcmp0 (v1_self_1->default_stream, v1_self_2->default_stream) != 0) { return FALSE; } /*Check profile_defaults: size, keys, values*/ if (!modulemd_hash_table_equals (v1_self_1->profile_defaults, v1_self_2->profile_defaults, modulemd_hash_table_sets_are_equal_wrapper)) { return FALSE; } /*Check intent_default_streams: size, keys, values*/ if (!modulemd_hash_table_equals (v1_self_1->intent_default_streams, v1_self_2->intent_default_streams, g_str_equal)) { return FALSE; } /*Check intent_default_profiles: size, keys, values*/ if (!modulemd_hash_table_equals (v1_self_1->intent_default_profiles, v1_self_2->intent_default_profiles, modulemd_hash_table_sets_are_equal_wrapper)) { return FALSE; } return TRUE; } ModulemdDefaultsV1 * modulemd_defaults_v1_new (const gchar *module_name) { // clang-format off return g_object_new (MODULEMD_TYPE_DEFAULTS_V1, "module-name", module_name, NULL); // clang-format on } static void modulemd_defaults_v1_finalize (GObject *object) { ModulemdDefaultsV1 *self = (ModulemdDefaultsV1 *)object; g_clear_pointer (&self->default_stream, g_free); g_clear_pointer (&self->profile_defaults, g_hash_table_unref); g_clear_pointer (&self->intent_default_streams, g_hash_table_unref); g_clear_pointer (&self->intent_default_profiles, g_hash_table_unref); G_OBJECT_CLASS (modulemd_defaults_v1_parent_class)->finalize (object); } static ModulemdDefaults * modulemd_defaults_v1_copy (ModulemdDefaults *self) { ModulemdDefaultsV1 *v1_self = NULL; g_autoptr (ModulemdDefaultsV1) copy = NULL; g_return_val_if_fail (MODULEMD_IS_DEFAULTS_V1 (self), NULL); v1_self = MODULEMD_DEFAULTS_V1 (self); copy = MODULEMD_DEFAULTS_V1 ( MODULEMD_DEFAULTS_CLASS (modulemd_defaults_v1_parent_class)->copy (self)); /* Copy the default stream */ modulemd_defaults_v1_set_default_stream ( copy, modulemd_defaults_v1_get_default_stream (v1_self, NULL), NULL); /* Copy the profile defaults table */ g_clear_pointer (©->profile_defaults, g_hash_table_unref); copy->profile_defaults = modulemd_hash_table_deep_str_set_copy (v1_self->profile_defaults); /* Copy intent default_stream table */ g_clear_pointer (©->intent_default_streams, g_hash_table_unref); copy->intent_default_streams = modulemd_hash_table_deep_str_copy (v1_self->intent_default_streams); /* Copy intent profile_defaults table */ g_clear_pointer (©->intent_default_profiles, g_hash_table_unref); copy->intent_default_profiles = modulemd_hash_table_deep_str_str_set_copy ( v1_self->intent_default_profiles); return MODULEMD_DEFAULTS (g_steal_pointer (©)); } static gboolean modulemd_defaults_v1_validate (ModulemdDefaults *self, GError **error) { gboolean result = FALSE; g_autoptr (GError) nested_error = NULL; result = MODULEMD_DEFAULTS_CLASS (modulemd_defaults_v1_parent_class) ->validate (self, &nested_error); if (!result) { g_propagate_error (error, g_steal_pointer (&nested_error)); } return TRUE; } static guint64 modulemd_defaults_v1_get_mdversion (ModulemdDefaults *self) { g_return_val_if_fail (MODULEMD_IS_DEFAULTS (self), 0); return MD_DEFAULTS_VERSION_ONE; } void modulemd_defaults_v1_set_default_stream (ModulemdDefaultsV1 *self, const gchar *default_stream, const gchar *intent) { g_return_if_fail (MODULEMD_IS_DEFAULTS_V1 (self)); if (default_stream) { if (intent) { /* If this is an intent-specific default stream, add it to the * table. */ g_hash_table_replace (self->intent_default_streams, g_strdup (intent), g_strdup (default_stream)); } else { /* This is the fallback default for non-specific intents */ g_clear_pointer (&self->default_stream, g_free); self->default_stream = g_strdup (default_stream); } } else { if (intent) { /* Remove the intent-specific default stream */ g_hash_table_remove (self->intent_default_streams, intent); } else { /* Remove the fallback default stream */ g_clear_pointer (&self->default_stream, g_free); } } } const gchar * modulemd_defaults_v1_get_default_stream (ModulemdDefaultsV1 *self, const gchar *intent) { const gchar *default_stream = NULL; g_return_val_if_fail (MODULEMD_IS_DEFAULTS_V1 (self), NULL); if (!intent) { if (self->default_stream && g_str_equal (self->default_stream, DEFAULT_MERGE_CONFLICT)) { /* During an index merge, we determined that this was in conflict * with another set of ModulemdDefaults for the same module. If we * see this, treat it as no default stream when querying for it. */ return NULL; } return self->default_stream; } default_stream = g_hash_table_lookup (self->intent_default_streams, intent); if (default_stream) { if (default_stream[0] == '\0') { /* If the intent is zero-length, it means explicitly no default * stream, so return NULL here */ return NULL; } return default_stream; } /* No intent-specific default. Return the fallback defaults */ return self->default_stream; } GStrv modulemd_defaults_v1_get_streams_with_default_profiles_as_strv ( ModulemdDefaultsV1 *self, const gchar *intent) { GHashTable *profile_set = NULL; g_return_val_if_fail (MODULEMD_IS_DEFAULTS_V1 (self), NULL); if (!intent) { return modulemd_ordered_str_keys_as_strv (self->profile_defaults); } profile_set = g_hash_table_lookup (self->intent_default_profiles, intent); if (profile_set) { return modulemd_ordered_str_keys_as_strv (profile_set); } /* No intent-specific default. Return the fallback defaults */ return modulemd_ordered_str_keys_as_strv (self->profile_defaults); } static GHashTable * modulemd_defaults_v1_get_or_create_profile_table (ModulemdDefaultsV1 *self, const gchar *intent) { GHashTable *profile_table = NULL; g_return_val_if_fail (MODULEMD_IS_DEFAULTS_V1 (self), NULL); if (intent) { /* Get or create the profile table for this intent */ profile_table = g_hash_table_lookup (self->intent_default_profiles, intent); if (!profile_table) { /* This table didn't exist yet, so create it */ profile_table = g_hash_table_new_full ( g_str_hash, g_str_equal, g_free, modulemd_hash_table_unref); /* Add the new table back to the intent table */ g_hash_table_replace ( self->intent_default_profiles, g_strdup (intent), profile_table); } } else { /* These are the fallback defaults */ profile_table = self->profile_defaults; } return profile_table; } static void modulemd_defaults_v1_add_or_clear_default_profile_for_stream ( ModulemdDefaultsV1 *self, const gchar *stream_name, const gchar *profile_name, const gchar *intent) { g_autoptr (GHashTable) profile_table = NULL; g_autoptr (GHashTable) profiles = NULL; g_return_if_fail (MODULEMD_IS_DEFAULTS_V1 (self)); g_return_if_fail (stream_name); profile_table = g_hash_table_ref ( modulemd_defaults_v1_get_or_create_profile_table (self, intent)); /* Get a reference to the profile set within the table */ profiles = g_hash_table_lookup (profile_table, stream_name); if (profiles) { g_hash_table_ref (profiles); } else { /* A profile set for this stream doesn't exist yet. Create it. */ profiles = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, NULL); /* Add the new profile set back to the profile table */ g_hash_table_replace ( profile_table, g_strdup (stream_name), g_hash_table_ref (profiles)); } if (profile_name) { /* Add a new profile name for this stream. Since we're operating on a * reference to the internal value, we don't need to explicitly save this * back */ g_hash_table_add (profiles, g_strdup (profile_name)); } else { /* No profile name was provided, so turn this to the empty set */ g_hash_table_remove_all (profiles); } } void modulemd_defaults_v1_add_default_profile_for_stream (ModulemdDefaultsV1 *self, const gchar *stream_name, const gchar *profile_name, const gchar *intent) { g_return_if_fail (MODULEMD_IS_DEFAULTS_V1 (self)); g_return_if_fail (stream_name); g_return_if_fail (profile_name); return modulemd_defaults_v1_add_or_clear_default_profile_for_stream ( self, stream_name, profile_name, intent); } void modulemd_defaults_v1_set_empty_default_profiles_for_stream ( ModulemdDefaultsV1 *self, const gchar *stream_name, const gchar *intent) { g_return_if_fail (MODULEMD_IS_DEFAULTS_V1 (self)); g_return_if_fail (stream_name); return modulemd_defaults_v1_add_or_clear_default_profile_for_stream ( self, stream_name, NULL, intent); } void modulemd_defaults_v1_remove_default_profiles_for_stream ( ModulemdDefaultsV1 *self, const gchar *stream_name, const gchar *intent) { g_autoptr (GHashTable) profile_table = NULL; g_return_if_fail (MODULEMD_IS_DEFAULTS_V1 (self)); g_return_if_fail (stream_name); profile_table = g_hash_table_ref ( modulemd_defaults_v1_get_or_create_profile_table (self, intent)); g_hash_table_remove (profile_table, stream_name); } GStrv modulemd_defaults_v1_get_default_profiles_for_stream_as_strv ( ModulemdDefaultsV1 *self, const gchar *stream_name, const gchar *intent) { GHashTable *profile_table = NULL; GHashTable *profiles = NULL; g_return_val_if_fail (MODULEMD_IS_DEFAULTS_V1 (self), NULL); g_return_val_if_fail (stream_name, NULL); if (intent) { /* Get or create the profile table for this intent */ profile_table = g_hash_table_lookup (self->intent_default_profiles, intent); if (profile_table) { /* See if this stream name appears in the profile defaults * for this intent */ profiles = g_hash_table_lookup (profile_table, stream_name); } if (profiles) { return modulemd_ordered_str_keys_as_strv (profiles); } /* We didn't find this profile in the intents, try the fallback * defaults */ } /* These are the fallback defaults */ profiles = g_hash_table_lookup (self->profile_defaults, stream_name); if (!profiles) { return NULL; } return modulemd_ordered_str_keys_as_strv (profiles); } static void modulemd_defaults_v1_get_property (GObject *object, guint prop_id, GValue *UNUSED (value), GParamSpec *pspec) { switch (prop_id) { default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); } } static void modulemd_defaults_v1_set_property (GObject *object, guint prop_id, const GValue *UNUSED (value), GParamSpec *pspec) { switch (prop_id) { default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); } } static void modulemd_defaults_v1_class_init (ModulemdDefaultsV1Class *klass) { GObjectClass *object_class = G_OBJECT_CLASS (klass); ModulemdDefaultsClass *defaults_class = MODULEMD_DEFAULTS_CLASS (object_class); object_class->finalize = modulemd_defaults_v1_finalize; object_class->get_property = modulemd_defaults_v1_get_property; object_class->set_property = modulemd_defaults_v1_set_property; defaults_class->copy = modulemd_defaults_v1_copy; defaults_class->get_mdversion = modulemd_defaults_v1_get_mdversion; defaults_class->validate = modulemd_defaults_v1_validate; defaults_class->equals = modulemd_defaults_v1_equals; } static void modulemd_defaults_v1_init (ModulemdDefaultsV1 *self) { self->profile_defaults = g_hash_table_new_full ( g_str_hash, g_str_equal, g_free, modulemd_hash_table_unref); self->intent_default_streams = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, g_free); self->intent_default_profiles = g_hash_table_new_full ( g_str_hash, g_str_equal, g_free, modulemd_hash_table_unref); } static gboolean modulemd_defaults_v1_parse_yaml_profiles (yaml_parser_t *parser, GHashTable *profile_defaults, GError **error); static gboolean modulemd_defaults_v1_parse_intents (yaml_parser_t *parser, ModulemdDefaultsV1 *defaults, gboolean strict, GError **error); static gboolean modulemd_defaults_v1_parse_intent (yaml_parser_t *parser, gboolean strict, gchar **_default_stream, GHashTable **_profile_defaults, GError **error); ModulemdDefaultsV1 * modulemd_defaults_v1_parse_yaml (ModulemdSubdocumentInfo *subdoc, gboolean strict, GError **error) { MODULEMD_INIT_TRACE (); MMD_INIT_YAML_PARSER (parser); MMD_INIT_YAML_EVENT (event); g_autoptr (GError) nested_error = FALSE; ModulemdDefaultsV1 *defaults = NULL; gboolean done = FALSE; g_autofree gchar *scalar = NULL; guint64 modified; g_return_val_if_fail (error == NULL || *error == NULL, NULL); if (!modulemd_subdocument_info_get_data_parser ( subdoc, &parser, strict, error)) { g_debug ("get_data_parser() failed: %s", (*error)->message); return NULL; } /* Create a module with a placeholder name. We'll verify that this has been * changed before we return it. This is because we can't guarantee that we * will get the module name from the YAML before reading any of the other * data, but it's easier to process the rest of the contents with the * constructed object. */ defaults = modulemd_defaults_v1_new (DEFAULT_PLACEHOLDER); YAML_PARSER_PARSE_WITH_EXIT (&parser, &event, error); if (event.type != YAML_MAPPING_START_EVENT) { MMD_YAML_ERROR_EVENT_EXIT ( error, event, "Missing mapping in defaults data entry"); } while (!done) { YAML_PARSER_PARSE_WITH_EXIT (&parser, &event, error); switch (event.type) { case YAML_MAPPING_END_EVENT: done = TRUE; break; case YAML_SCALAR_EVENT: if (g_str_equal ((const gchar *)event.data.scalar.value, "module")) { if (!g_str_equal (modulemd_defaults_get_module_name ( MODULEMD_DEFAULTS (defaults)), DEFAULT_PLACEHOLDER)) { /* The module name was set earlier call, which means it is * not expected here */ MMD_YAML_ERROR_EVENT_EXIT ( error, event, "Module name encountered twice."); } scalar = modulemd_yaml_parse_string (&parser, &nested_error); if (!scalar) { MMD_YAML_ERROR_EVENT_EXIT ( error, event, "Failed to parse module name in default data: %s", nested_error->message); } /* Use a private internal function to set the module_name. * External consumers should never be allowed to change this * value, but we need to be able to modify the placeholder. */ modulemd_defaults_set_module_name (MODULEMD_DEFAULTS (defaults), scalar); g_clear_pointer (&scalar, g_free); } else if (g_str_equal ((const gchar *)event.data.scalar.value, "modified")) { modified = modulemd_yaml_parse_uint64 (&parser, &nested_error); if (nested_error) { MMD_YAML_ERROR_EVENT_EXIT ( error, event, "Failed to parse modified in defaults data: %s", nested_error->message); } modulemd_defaults_set_modified (MODULEMD_DEFAULTS (defaults), modified); } else if (g_str_equal ((const gchar *)event.data.scalar.value, "stream")) { if (modulemd_defaults_v1_get_default_stream (defaults, NULL)) { /* We already have a default stream. It should not appear * twice in the same document. */ MMD_YAML_ERROR_EVENT_EXIT ( error, event, "Default stream encountered twice."); } scalar = modulemd_yaml_parse_string (&parser, &nested_error); if (!scalar) { MMD_YAML_ERROR_EVENT_EXIT ( error, event, "Failed to parse default stream in default data: %s", nested_error->message); } modulemd_defaults_v1_set_default_stream (defaults, scalar, NULL); g_clear_pointer (&scalar, g_free); } else if (g_str_equal ((const gchar *)event.data.scalar.value, "profiles")) { if (!modulemd_defaults_v1_parse_yaml_profiles ( &parser, defaults->profile_defaults, &nested_error)) { g_propagate_error (error, g_steal_pointer (&nested_error)); return NULL; } } else if (g_str_equal ((const gchar *)event.data.scalar.value, "intents")) { if (!modulemd_defaults_v1_parse_intents ( &parser, defaults, strict, &nested_error)) { g_propagate_error (error, g_steal_pointer (&nested_error)); return NULL; } } else { SKIP_UNKNOWN (&parser, NULL, "Unexpected key in defaults data: %s", (const gchar *)event.data.scalar.value); break; } break; default: MMD_YAML_ERROR_EVENT_EXIT ( error, event, "Unexpected YAML event %s in defaults data", mmd_yaml_get_event_name (event.type)); break; } yaml_event_delete (&event); } if (!modulemd_defaults_validate (MODULEMD_DEFAULTS (defaults), &nested_error)) { g_propagate_error (error, g_steal_pointer (&nested_error)); return NULL; } return g_steal_pointer (&defaults); } static gboolean modulemd_defaults_v1_parse_yaml_profiles (yaml_parser_t *parser, GHashTable *profile_defaults, GError **error) { MODULEMD_INIT_TRACE (); MMD_INIT_YAML_EVENT (event); g_autoptr (GError) nested_error = NULL; g_autofree gchar *stream_name = NULL; g_autoptr (GHashTable) profile_set = NULL; gboolean done = FALSE; YAML_PARSER_PARSE_WITH_EXIT_BOOL (parser, &event, error); if (event.type != YAML_MAPPING_START_EVENT) { MMD_YAML_ERROR_EVENT_EXIT_BOOL ( error, event, "Missing mapping in defaults data entry"); } while (!done) { YAML_PARSER_PARSE_WITH_EXIT_BOOL (parser, &event, error); switch (event.type) { case YAML_MAPPING_END_EVENT: done = TRUE; break; case YAML_SCALAR_EVENT: stream_name = g_strdup ((const gchar *)event.data.scalar.value); if (!stream_name) { MMD_YAML_ERROR_EVENT_EXIT_BOOL ( error, event, "Failed to parse stream name in profile defaults"); } /* Check to see if we've encountered this stream name previously */ if (g_hash_table_contains (profile_defaults, stream_name)) { MMD_YAML_ERROR_EVENT_EXIT_BOOL ( error, event, "Encountered stream name %s more than once in profile " "defaults", stream_name); } profile_set = modulemd_yaml_parse_string_set (parser, &nested_error); if (!profile_set) { MMD_YAML_ERROR_EVENT_EXIT_BOOL ( error, event, "Failed to parse profile_set in profile defaults for %s: %s", stream_name, nested_error->message); } g_hash_table_replace (profile_defaults, g_strdup (stream_name), g_steal_pointer (&profile_set)); g_clear_pointer (&stream_name, g_free); break; default: MMD_YAML_ERROR_EVENT_EXIT_BOOL ( error, event, "Unexpected YAML event %s in profile defaults.", mmd_yaml_get_event_name (event.type)); break; } yaml_event_delete (&event); } return TRUE; } static gboolean modulemd_defaults_v1_parse_intents (yaml_parser_t *parser, ModulemdDefaultsV1 *defaults, gboolean strict, GError **error) { MODULEMD_INIT_TRACE (); MMD_INIT_YAML_EVENT (event); g_autoptr (GError) nested_error = NULL; g_autofree gchar *intent_name = NULL; g_autofree gchar *default_stream = NULL; g_autoptr (GHashTable) profile_set = NULL; gboolean done = FALSE; YAML_PARSER_PARSE_WITH_EXIT_BOOL (parser, &event, error); if (event.type != YAML_MAPPING_START_EVENT) { MMD_YAML_ERROR_EVENT_EXIT_BOOL ( error, event, "Missing mapping in intents"); } while (!done) { YAML_PARSER_PARSE_WITH_EXIT_BOOL (parser, &event, error); switch (event.type) { case YAML_MAPPING_END_EVENT: done = TRUE; break; case YAML_SCALAR_EVENT: intent_name = g_strdup ((const gchar *)event.data.scalar.value); if (!intent_name) { MMD_YAML_ERROR_EVENT_EXIT_BOOL ( error, event, "Failed to parse intent name in defaults"); } /* Check to see if we've encountered this intent name previously */ if (g_hash_table_contains (defaults->intent_default_streams, intent_name) || g_hash_table_contains (defaults->intent_default_profiles, intent_name)) { MMD_YAML_ERROR_EVENT_EXIT_BOOL ( error, event, "Encountered intent name %s more than once in defaults", intent_name); } if (!modulemd_defaults_v1_parse_intent ( parser, strict, &default_stream, &profile_set, &nested_error)) { g_propagate_error (error, g_steal_pointer (&nested_error)); return FALSE; } g_hash_table_replace (defaults->intent_default_streams, g_strdup (intent_name), g_strdup (default_stream)); g_hash_table_replace (defaults->intent_default_profiles, g_strdup (intent_name), g_hash_table_ref (profile_set)); g_clear_pointer (&default_stream, g_free); g_clear_pointer (&profile_set, g_hash_table_unref); g_clear_pointer (&intent_name, g_free); break; default: MMD_YAML_ERROR_EVENT_EXIT_BOOL ( error, event, "Unexpected YAML event in intents."); break; } yaml_event_delete (&event); } return TRUE; } static gboolean modulemd_defaults_v1_parse_intent (yaml_parser_t *parser, gboolean strict, gchar **_default_stream, GHashTable **_profile_defaults, GError **error) { MODULEMD_INIT_TRACE (); MMD_INIT_YAML_EVENT (event); g_autofree gchar *default_stream = NULL; g_autoptr (GHashTable) profile_defaults = NULL; g_autoptr (GError) nested_error = FALSE; gboolean done = FALSE; gboolean in_map = FALSE; g_return_val_if_fail (error == NULL || *error == NULL, FALSE); profile_defaults = g_hash_table_new_full ( g_str_hash, g_str_equal, g_free, modulemd_hash_table_unref); while (!done) { YAML_PARSER_PARSE_WITH_EXIT_BOOL (parser, &event, error); switch (event.type) { case YAML_MAPPING_START_EVENT: in_map = TRUE; break; case YAML_MAPPING_END_EVENT: in_map = FALSE; done = TRUE; break; case YAML_SCALAR_EVENT: if (!in_map) { MMD_YAML_ERROR_EVENT_EXIT_BOOL ( error, event, "Missing mapping in intent data"); } if (g_str_equal ((const gchar *)event.data.scalar.value, "stream")) { if (default_stream) { /* We already have a default stream. It should not appear * twice in the same document. */ MMD_YAML_ERROR_EVENT_EXIT_BOOL ( error, event, "Default stream encountered twice."); } default_stream = modulemd_yaml_parse_string (parser, &nested_error); if (!default_stream) { MMD_YAML_ERROR_EVENT_EXIT_BOOL ( error, event, "Failed to parse default stream in intent data: %s", nested_error->message); } } else if (g_str_equal ((const gchar *)event.data.scalar.value, "profiles")) { if (!modulemd_defaults_v1_parse_yaml_profiles ( parser, profile_defaults, &nested_error)) { g_propagate_error (error, g_steal_pointer (&nested_error)); return FALSE; } } else { SKIP_UNKNOWN (parser, FALSE, "Unexpected key in intent data: %s", (const gchar *)event.data.scalar.value); break; } break; default: MMD_YAML_ERROR_EVENT_EXIT_BOOL ( error, event, "Unexpected YAML event in intent data"); break; } yaml_event_delete (&event); } *_default_stream = g_steal_pointer (&default_stream); *_profile_defaults = g_steal_pointer (&profile_defaults); return TRUE; } static gboolean modulemd_defaults_v1_emit_profiles (GHashTable *profile_table, yaml_emitter_t *emitter, GError **error); static gboolean modulemd_defaults_v1_emit_intents (ModulemdDefaultsV1 *self, yaml_emitter_t *emitter, GError **error); gboolean modulemd_defaults_v1_emit_yaml (ModulemdDefaultsV1 *self, yaml_emitter_t *emitter, GError **error) { MODULEMD_INIT_TRACE (); g_autoptr (GError) nested_error = NULL; guint64 modified; g_autofree gchar *modified_string = NULL; if (!modulemd_defaults_validate (MODULEMD_DEFAULTS (self), &nested_error)) { /* Validation failed */ g_propagate_prefixed_error (error, g_steal_pointer (&nested_error), "Defaults object failed validation: "); return FALSE; } /* First emit the standard document headers */ if (!modulemd_yaml_emit_document_headers ( emitter, MODULEMD_YAML_DOC_DEFAULTS, modulemd_defaults_get_mdversion (MODULEMD_DEFAULTS (self)), error)) { return FALSE; } /* Start the data: section mapping */ if (!mmd_emitter_start_mapping (emitter, YAML_BLOCK_MAPPING_STYLE, error)) { return FALSE; } /* Fill in the default data */ /* The module name is mandatory */ if (!mmd_emitter_scalar (emitter, "module", YAML_PLAIN_SCALAR_STYLE, error)) { return FALSE; } if (!mmd_emitter_scalar_string ( emitter, modulemd_defaults_get_module_name (MODULEMD_DEFAULTS (self)), error)) { return FALSE; } /* The modified field is optional */ modified = modulemd_defaults_get_modified (MODULEMD_DEFAULTS (self)); if (modified) { modified_string = g_strdup_printf ("%" PRIu64, modified); EMIT_KEY_VALUE (emitter, error, "modified", modified_string); } /* The default stream is optional * Always emit the stream quoted, since a purely numeric-looking stream such * as 5.30 might otherwise be interpreted by parsers like pyyaml as a number * and result in being read (and written) as '5.3'. */ if (modulemd_defaults_v1_get_default_stream (self, NULL) != NULL) { EMIT_KEY_VALUE_FULL ( emitter, error, "stream", modulemd_defaults_v1_get_default_stream (self, NULL), YAML_DOUBLE_QUOTED_SCALAR_STYLE); } /* Profiles are optional */ if (g_hash_table_size (self->profile_defaults) > 0) { if (!modulemd_defaults_v1_emit_profiles ( self->profile_defaults, emitter, error)) { return FALSE; } } /* Intents are optional */ if (g_hash_table_size (self->intent_default_streams) > 0 || g_hash_table_size (self->intent_default_profiles) > 0) { modulemd_defaults_v1_emit_intents (self, emitter, &nested_error); } /* Close the data: section mapping */ if (!mmd_emitter_end_mapping (emitter, error)) { return FALSE; } /* Close the top-level section mapping */ if (!mmd_emitter_end_mapping (emitter, error)) { return FALSE; } /* End the document */ if (!mmd_emitter_end_document (emitter, error)) { return FALSE; } return TRUE; } static gboolean modulemd_defaults_v1_emit_profiles (GHashTable *profile_table, yaml_emitter_t *emitter, GError **error) { g_autoptr (GPtrArray) stream_names = NULL; g_auto (GStrv) profiles = NULL; gchar *stream_name = NULL; GHashTable *profile_set = NULL; /* Start the "profiles:" section */ if (!mmd_emitter_scalar ( emitter, "profiles", YAML_PLAIN_SCALAR_STYLE, error)) { return FALSE; } /* Start the mapping for "profiles:" */ if (!mmd_emitter_start_mapping (emitter, YAML_BLOCK_MAPPING_STYLE, error)) { return FALSE; } stream_names = modulemd_ordered_str_keys (profile_table, modulemd_strcmp_sort); for (guint i = 0; i < stream_names->len; i++) { stream_name = g_ptr_array_index (stream_names, i); profile_set = g_hash_table_lookup (profile_table, stream_name); if (!profile_set) { /* This should be impossible. Warn and continue */ g_warning ("Encountered NULL profile set for stream %s", stream_name); continue; } if (!mmd_emitter_scalar_string (emitter, stream_name, error)) { return FALSE; } profiles = modulemd_ordered_str_keys_as_strv (profile_set); if (!mmd_emitter_strv ( emitter, YAML_FLOW_SEQUENCE_STYLE, profiles, error)) { return FALSE; } g_clear_pointer (&profiles, g_strfreev); } /* End the mapping for "profiles:" */ if (!mmd_emitter_end_mapping (emitter, error)) { return FALSE; } return TRUE; } static gboolean modulemd_defaults_v1_emit_intents (ModulemdDefaultsV1 *self, yaml_emitter_t *emitter, GError **error) { g_autoptr (GHashTable) intent_names = NULL; GHashTableIter iter; gpointer key; gpointer value; g_autoptr (GPtrArray) intents = NULL; gchar *intent = NULL; gchar *intent_default_stream = NULL; GHashTable *intent_default_profiles = NULL; /* Emit the section name */ if (!mmd_emitter_scalar (emitter, "intents", YAML_PLAIN_SCALAR_STYLE, error)) { return FALSE; } /* Start the mapping for "intents:" */ if (!mmd_emitter_start_mapping (emitter, YAML_BLOCK_MAPPING_STYLE, error)) { return FALSE; } /* Get the union of the keys from intents_stream_defaults and * intents_profile_defaults */ intent_names = g_hash_table_new_full (g_str_hash, g_str_equal, NULL, NULL); g_hash_table_iter_init (&iter, self->intent_default_streams); while (g_hash_table_iter_next (&iter, &key, &value)) { /* Don't bother copying the key; we're only using this as an index */ g_hash_table_add (intent_names, key); } g_hash_table_iter_init (&iter, self->intent_default_profiles); while (g_hash_table_iter_next (&iter, &key, &value)) { /* Don't bother copying the key; we're only using this as an index */ g_hash_table_add (intent_names, key); } intents = modulemd_ordered_str_keys (intent_names, modulemd_strcmp_sort); g_clear_pointer (&intent_names, g_hash_table_unref); for (guint i = 0; i < intents->len; i++) { intent = g_ptr_array_index (intents, i); /* Emit the intent name */ if (!mmd_emitter_scalar_string (emitter, intent, error)) { return FALSE; } /* Start the mapping for this intent */ if (!mmd_emitter_start_mapping ( emitter, YAML_BLOCK_MAPPING_STYLE, error)) { return FALSE; } /* The default stream is optional * Always emit the stream quoted, since a purely numeric-looking stream * such as 5.30 might otherwise be interpreted by parsers like pyyaml as * a number and result in being read (and written) as '5.3'. */ intent_default_stream = g_hash_table_lookup (self->intent_default_streams, intent); if (intent_default_stream) { EMIT_KEY_VALUE_FULL (emitter, error, "stream", intent_default_stream, YAML_DOUBLE_QUOTED_SCALAR_STYLE); intent_default_profiles = g_hash_table_lookup (self->intent_default_profiles, intent); } if (intent_default_profiles) { if (!modulemd_defaults_v1_emit_profiles ( intent_default_profiles, emitter, error)) { return FALSE; } } /* End the mapping for this intent */ if (!mmd_emitter_end_mapping (emitter, error)) { return FALSE; } } /* End the mapping for "intents:" */ if (!mmd_emitter_end_mapping (emitter, error)) { return FALSE; } return TRUE; } static gboolean modulemd_defaults_v1_merge_default_profiles ( GHashTable *from_profile_defaults, GHashTable *merged_profile_defaults, guint64 from_modified, guint64 into_modified, GError **error); static GHashTable * modulemd_defaults_v1_copy_intent_profiles (GHashTable *intent_profiles); ModulemdDefaults * modulemd_defaults_v1_merge (ModulemdDefaultsV1 *from, ModulemdDefaultsV1 *into, gboolean strict_default_streams, GError **error) { g_autoptr (ModulemdDefaultsV1) merged = NULL; GHashTableIter iter; gpointer key; gpointer value; GHashTable *intent_profiles = NULL; GHashTable *merged_intent_profiles = NULL; guint64 from_modified; guint64 into_modified; g_autoptr (GHashTable) intent_profile_defaults = NULL; gchar *intent_name = NULL; gchar *intent_default_stream = NULL; gchar *merged_default_stream = NULL; g_autoptr (GError) nested_error = NULL; const gchar *module_name = modulemd_defaults_get_module_name (MODULEMD_DEFAULTS (into)); from_modified = modulemd_defaults_get_modified (MODULEMD_DEFAULTS (from)); into_modified = modulemd_defaults_get_modified (MODULEMD_DEFAULTS (into)); /* Start from a copy of "into" */ merged = MODULEMD_DEFAULTS_V1 (modulemd_defaults_copy (MODULEMD_DEFAULTS (into))); /* Merge the default streams */ if (from->default_stream && !merged->default_stream) { modulemd_defaults_v1_set_default_stream ( merged, from->default_stream, NULL); } else if (merged->default_stream && from->default_stream) { if (g_str_equal (merged->default_stream, DEFAULT_MERGE_CONFLICT)) { /* A previous pass over this same module encountered a merge * conflict, so keep it. */ } else if (!g_str_equal (merged->default_stream, from->default_stream)) { if (from_modified > into_modified) { modulemd_defaults_v1_set_default_stream ( merged, from->default_stream, NULL); } else if (from_modified == into_modified) { /* They have conflicting default streams */ g_info ("Module stream mismatch in merge: %s != %s", into->default_stream, from->default_stream); if (strict_default_streams) { g_set_error ( error, MODULEMD_ERROR, MMD_ERROR_VALIDATE, "Default stream mismatch in module %s: %s != %s", module_name, into->default_stream, from->default_stream); return NULL; } modulemd_defaults_v1_set_default_stream ( merged, DEFAULT_MERGE_CONFLICT, NULL); } } else { /* They're the same, so change nothing */ } } else { /* The 'from' default stream was NULL. Make no changes. */ } /* == Merge profile defaults == */ /* Iterate through 'from' and see if there are additions or conflicts */ if (!modulemd_defaults_v1_merge_default_profiles (from->profile_defaults, merged->profile_defaults, from_modified, into_modified, &nested_error)) { g_propagate_error (error, g_steal_pointer (&nested_error)); return NULL; } /* == Merge intent defaults == */ /* Merge intent default stream values */ /* Iterate through 'from', adding any new values and checking the existing * ones for equivalence. */ g_hash_table_iter_init (&iter, from->intent_default_streams); while (g_hash_table_iter_next (&iter, &key, &value)) { intent_name = (gchar *)key; intent_default_stream = (gchar *)value; merged_default_stream = g_hash_table_lookup (merged->intent_default_streams, intent_name); /* If there is no new default stream, just jump to the next item */ if (!intent_default_stream) { continue; } if (!merged_default_stream) { /* New entry, just add it */ g_hash_table_insert (merged->intent_default_streams, g_strdup (intent_name), g_strdup (intent_default_stream)); } else if (!g_str_equal (intent_default_stream, merged_default_stream)) { if (from_modified > into_modified) { g_hash_table_replace (merged->intent_default_streams, g_strdup (intent_name), g_strdup (intent_default_stream)); } else if (into_modified == from_modified) { g_set_error ( error, MODULEMD_ERROR, MMD_ERROR_VALIDATE, "Profile default stream mismatch in intents: %s != %s", intent_default_stream, merged_default_stream); return NULL; } } } /* Merge intent default profile values */ /* Now copy 'from' into merged, checking for conflicts */ g_hash_table_iter_init (&iter, from->intent_default_profiles); while (g_hash_table_iter_next (&iter, &key, &value)) { intent_name = (gchar *)key; intent_profiles = (GHashTable *)value; merged_intent_profiles = g_hash_table_lookup (merged->intent_default_profiles, intent_name); if (!merged_intent_profiles) { intent_profile_defaults = modulemd_defaults_v1_copy_intent_profiles (intent_profiles); /* This wasn't in 'merged', so just add it */ g_hash_table_insert (merged->intent_default_profiles, g_strdup (intent_name), g_steal_pointer (&intent_profile_defaults)); continue; } /* Go through each of the profile defaults and see if they're additive or * conflicting */ if (!modulemd_defaults_v1_merge_default_profiles (intent_profiles, merged_intent_profiles, from_modified, into_modified, &nested_error)) { g_propagate_error (error, g_steal_pointer (&nested_error)); return NULL; } } /* Set the modified value to the higher of the two provided */ if (from_modified > into_modified) { modulemd_defaults_set_modified (MODULEMD_DEFAULTS (merged), from_modified); } return MODULEMD_DEFAULTS (g_steal_pointer (&merged)); } static GHashTable * modulemd_defaults_v1_copy_intent_profiles (GHashTable *intent_profiles) { g_autoptr (GHashTable) intent_profile_defaults = NULL; gchar *stream_name = NULL; GHashTable *profile_defaults = NULL; GHashTableIter iter; gpointer key; gpointer value; intent_profile_defaults = g_hash_table_new_full ( g_str_hash, g_str_equal, g_free, modulemd_hash_table_unref); g_hash_table_iter_init (&iter, intent_profiles); while (g_hash_table_iter_next (&iter, &key, &value)) { stream_name = (gchar *)key; profile_defaults = (GHashTable *)value; /* Copy the profile defaults */ g_hash_table_insert ( intent_profile_defaults, g_strdup (stream_name), modulemd_hash_table_deep_set_copy (profile_defaults)); } return g_steal_pointer (&intent_profile_defaults); } static gboolean modulemd_defaults_v1_merge_default_profiles ( GHashTable *from_profile_defaults, GHashTable *merged_profile_defaults, guint64 from_modified, guint64 into_modified, GError **error) { GHashTableIter iter; gpointer key; gpointer value; gchar *stream_name = NULL; GHashTable *from_profiles = NULL; GHashTable *merged_profiles = NULL; g_hash_table_iter_init (&iter, from_profile_defaults); while (g_hash_table_iter_next (&iter, &key, &value)) { stream_name = (gchar *)key; from_profiles = (GHashTable *)value; merged_profiles = g_hash_table_lookup (merged_profile_defaults, stream_name); if (!merged_profiles) { /* Didn't appear in the profiles list, so just add it to merged */ g_hash_table_insert ( merged_profile_defaults, g_strdup (stream_name), modulemd_hash_table_deep_set_copy (from_profiles)); continue; } /* Check to see if they match */ if (!modulemd_hash_table_sets_are_equal (from_profiles, merged_profiles)) { if (from_modified > into_modified) { g_hash_table_replace ( merged_profile_defaults, g_strdup (stream_name), modulemd_hash_table_deep_set_copy (from_profiles)); } else if (into_modified > from_modified) { /* Already there, so just continue */ continue; } else { /* The profile sets differed. This is an unresolvable merge * conflict */ g_set_error (error, MODULEMD_ERROR, MMD_ERROR_VALIDATE, "Profile default mismatch in stream: %s", stream_name); return FALSE; } } /* They were a complete match, so no need to add it a second time */ } return TRUE; } fedora-modularity-libmodulemd-357799c/modulemd/modulemd-defaults.c000066400000000000000000000272271502446517500253400ustar00rootroot00000000000000/* * This file is part of libmodulemd * Copyright (C) 2017-2018 Stephen Gallagher * * Fedora-License-Identifier: MIT * SPDX-2.0-License-Identifier: MIT * SPDX-3.0-License-Identifier: MIT * * This program is free software. * For more information on the license, see COPYING. * For more information on free software, see . */ #include "modulemd-defaults.h" #include "modulemd-defaults-v1.h" #include "modulemd-errors.h" #include "private/modulemd-defaults-private.h" #include "private/modulemd-defaults-v1-private.h" #include "private/modulemd-util.h" #include #define DEF_DEFAULT_NAME_STRING "__NAME_UNSET__" typedef struct { gchar *module_name; guint64 modified; } ModulemdDefaultsPrivate; G_DEFINE_ABSTRACT_TYPE_WITH_PRIVATE (ModulemdDefaults, modulemd_defaults, G_TYPE_OBJECT) enum { PROP_0, PROP_MDVERSION, PROP_MODULE_NAME, N_PROPS }; static GParamSpec *properties[N_PROPS]; gboolean modulemd_defaults_equals (ModulemdDefaults *self_1, ModulemdDefaults *self_2) { ModulemdDefaultsClass *klass; if (!self_1 && !self_2) { return TRUE; } if (!self_1 || !self_2) { return FALSE; } g_return_val_if_fail (MODULEMD_IS_DEFAULTS (self_1), FALSE); g_return_val_if_fail (MODULEMD_IS_DEFAULTS (self_2), FALSE); klass = MODULEMD_DEFAULTS_GET_CLASS (self_1); g_return_val_if_fail (klass->equals, FALSE); return klass->equals (self_1, self_2); } static gboolean modulemd_defaults_default_equals (ModulemdDefaults *self_1, ModulemdDefaults *self_2) { if (g_strcmp0 (modulemd_defaults_get_module_name (self_1), modulemd_defaults_get_module_name (self_2)) != 0) { return FALSE; } if (modulemd_defaults_get_modified (self_1) != modulemd_defaults_get_modified (self_2)) { return FALSE; } if (modulemd_defaults_get_mdversion (self_1) != modulemd_defaults_get_mdversion (self_2)) { return FALSE; } return TRUE; } ModulemdDefaults * modulemd_defaults_new (guint64 mdversion, const gchar *module_name) { g_return_val_if_fail (mdversion && mdversion <= MD_DEFAULTS_VERSION_LATEST, NULL); if (mdversion == MD_DEFAULTS_VERSION_ONE) { return MODULEMD_DEFAULTS (modulemd_defaults_v1_new (module_name)); } /* This should be unreachable */ g_return_val_if_reached (NULL); } static void modulemd_defaults_finalize (GObject *object) { ModulemdDefaults *self = (ModulemdDefaults *)object; ModulemdDefaultsPrivate *priv = modulemd_defaults_get_instance_private (self); g_clear_pointer (&priv->module_name, g_free); G_OBJECT_CLASS (modulemd_defaults_parent_class)->finalize (object); } ModulemdDefaults * modulemd_defaults_copy (ModulemdDefaults *self) { ModulemdDefaultsClass *klass; if (!self) { return NULL; } g_return_val_if_fail (MODULEMD_IS_DEFAULTS (self), NULL); klass = MODULEMD_DEFAULTS_GET_CLASS (self); g_return_val_if_fail (klass->copy, NULL); return klass->copy (self); } static ModulemdDefaults * modulemd_defaults_default_copy (ModulemdDefaults *self) { g_autoptr (ModulemdDefaults) copy = NULL; g_return_val_if_fail (MODULEMD_IS_DEFAULTS (self), NULL); copy = modulemd_defaults_new (modulemd_defaults_get_mdversion (self), modulemd_defaults_get_module_name (self)); modulemd_defaults_set_modified (copy, modulemd_defaults_get_modified (self)); return g_steal_pointer (©); } gboolean modulemd_defaults_validate (ModulemdDefaults *self, GError **error) { ModulemdDefaultsClass *klass; if (!self) { return FALSE; } g_return_val_if_fail (MODULEMD_IS_DEFAULTS (self), FALSE); klass = MODULEMD_DEFAULTS_GET_CLASS (self); g_return_val_if_fail (klass->validate, FALSE); return klass->validate (self, error); } static gboolean modulemd_defaults_default_validate (ModulemdDefaults *self, GError **error) { ModulemdDefaultsPrivate *priv = modulemd_defaults_get_instance_private (self); guint64 mdversion = modulemd_defaults_get_mdversion (self); if (!mdversion) { g_set_error_literal (error, MODULEMD_ERROR, MMD_ERROR_VALIDATE, "Metadata version is unset."); return FALSE; } if (mdversion > MD_DEFAULTS_VERSION_LATEST) { g_set_error (error, MODULEMD_ERROR, MMD_ERROR_VALIDATE, "Metadata version unknown: %" PRIu64 ".", mdversion); return FALSE; } if (!priv->module_name) { g_set_error_literal ( error, MODULEMD_ERROR, MMD_ERROR_VALIDATE, "Module name is unset."); return FALSE; } /* Make sure we have a real module name set */ if (g_str_equal (modulemd_defaults_get_module_name (self), DEFAULT_PLACEHOLDER)) { g_set_error_literal (error, MODULEMD_ERROR, MMD_ERROR_VALIDATE, "Defaults did not specify a module name."); return FALSE; } return TRUE; } ModulemdDefaults * modulemd_defaults_upgrade (ModulemdDefaults *self, guint64 mdversion, GError **error) { g_assert_true (MODULEMD_IS_DEFAULTS (self)); if (!mdversion) { mdversion = MD_DEFAULTS_VERSION_LATEST; } if (mdversion > MD_DEFAULTS_VERSION_LATEST) { g_set_error (error, MODULEMD_ERROR, MMD_ERROR_UPGRADE, "Unknown metadata version for upgrade: %" PRIu64 ".", mdversion); return NULL; } if (modulemd_defaults_get_mdversion (self) == mdversion) { /* Already at this version, just copy it and return that */ return modulemd_defaults_copy (self); } return NULL; } guint64 modulemd_defaults_get_mdversion (ModulemdDefaults *self) { ModulemdDefaultsClass *klass; g_return_val_if_fail (self && MODULEMD_IS_DEFAULTS (self), 0); klass = MODULEMD_DEFAULTS_GET_CLASS (self); g_return_val_if_fail (klass->get_mdversion, 0); return klass->get_mdversion (self); } void modulemd_defaults_set_modified (ModulemdDefaults *self, guint64 modified) { g_return_if_fail (MODULEMD_IS_DEFAULTS (self)); ModulemdDefaultsPrivate *priv = modulemd_defaults_get_instance_private (self); priv->modified = modified; } guint64 modulemd_defaults_get_modified (ModulemdDefaults *self) { g_return_val_if_fail (MODULEMD_IS_DEFAULTS (self), 0); ModulemdDefaultsPrivate *priv = modulemd_defaults_get_instance_private (self); return priv->modified; } void modulemd_defaults_set_module_name (ModulemdDefaults *self, const gchar *module_name) { g_return_if_fail (MODULEMD_IS_DEFAULTS (self)); /* It is a coding error if we ever get a NULL name here */ g_return_if_fail (module_name); /* It is a coding error if we ever get the default name here */ g_return_if_fail (g_strcmp0 (module_name, DEF_DEFAULT_NAME_STRING)); ModulemdDefaultsPrivate *priv = modulemd_defaults_get_instance_private (self); g_clear_pointer (&priv->module_name, g_free); priv->module_name = g_strdup (module_name); g_object_notify_by_pspec (G_OBJECT (self), properties[PROP_MODULE_NAME]); } const gchar * modulemd_defaults_get_module_name (ModulemdDefaults *self) { ModulemdDefaultsPrivate *priv = modulemd_defaults_get_instance_private (self); return priv->module_name; } static void modulemd_defaults_get_property (GObject *object, guint prop_id, GValue *value, GParamSpec *pspec) { ModulemdDefaults *self = MODULEMD_DEFAULTS (object); switch (prop_id) { case PROP_MODULE_NAME: g_value_set_string (value, modulemd_defaults_get_module_name (self)); break; case PROP_MDVERSION: g_value_set_uint64 (value, modulemd_defaults_get_mdversion (self)); break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); } } static void modulemd_defaults_set_property (GObject *object, guint prop_id, const GValue *value, GParamSpec *pspec) { ModulemdDefaults *self = MODULEMD_DEFAULTS (object); switch (prop_id) { case PROP_MODULE_NAME: modulemd_defaults_set_module_name (self, g_value_get_string (value)); break; case PROP_MDVERSION: default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); } } static void modulemd_defaults_class_init (ModulemdDefaultsClass *klass) { GObjectClass *object_class = G_OBJECT_CLASS (klass); object_class->finalize = modulemd_defaults_finalize; object_class->get_property = modulemd_defaults_get_property; object_class->set_property = modulemd_defaults_set_property; klass->copy = modulemd_defaults_default_copy; klass->validate = modulemd_defaults_default_validate; klass->equals = modulemd_defaults_default_equals; properties[PROP_MDVERSION] = g_param_spec_uint64 ( "mdversion", "Metadata Version", "The metadata version of this Defaults object. Read-only.", 0, MD_DEFAULTS_VERSION_LATEST, 0, G_PARAM_READABLE | G_PARAM_STATIC_STRINGS); properties[PROP_MODULE_NAME] = g_param_spec_string ( "module-name", "Module Name", "The name of the module to which these defaults apply.", DEF_DEFAULT_NAME_STRING, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS | G_PARAM_CONSTRUCT_ONLY); g_object_class_install_properties (object_class, N_PROPS, properties); } static void modulemd_defaults_init (ModulemdDefaults *UNUSED (self)) { } ModulemdDefaults * modulemd_defaults_merge (ModulemdDefaults *from, ModulemdDefaults *into, gboolean strict_default_streams, GError **error) { g_autoptr (ModulemdDefaults) merged_defaults = NULL; guint64 mdversion; g_autoptr (GError) nested_error = NULL; g_return_val_if_fail (MODULEMD_IS_DEFAULTS (from), NULL); g_return_val_if_fail (MODULEMD_IS_DEFAULTS (into), NULL); g_return_val_if_fail (error == NULL || *error == NULL, NULL); /* TODO: Upgrade defaults if either is a different mdversion. Right now, we * only have a single version of this document, so there's no need to worry * about it. For now, treat it as a failure so we don't forget to update this * location if we add a new version. */ mdversion = modulemd_defaults_get_mdversion (into); g_return_val_if_fail (modulemd_defaults_get_mdversion (from) == mdversion, NULL); g_return_val_if_fail (mdversion == MD_DEFAULTS_VERSION_ONE, NULL); if (!g_str_equal (modulemd_defaults_get_module_name (into), modulemd_defaults_get_module_name (from))) { g_set_error (error, MODULEMD_ERROR, MMD_ERROR_VALIDATE, "Module name mismatch in merge: %s != %s", modulemd_defaults_get_module_name (into), modulemd_defaults_get_module_name (from)); return NULL; } merged_defaults = modulemd_defaults_v1_merge (MODULEMD_DEFAULTS_V1 (from), MODULEMD_DEFAULTS_V1 (into), strict_default_streams, &nested_error); if (!merged_defaults) { g_propagate_error (error, g_steal_pointer (&nested_error)); return NULL; } return g_steal_pointer (&merged_defaults); } fedora-modularity-libmodulemd-357799c/modulemd/modulemd-dependencies.c000066400000000000000000000416551502446517500261600ustar00rootroot00000000000000/* * This file is part of libmodulemd * Copyright (C) 2018 Red Hat, Inc. * * Fedora-License-Identifier: MIT * SPDX-2.0-License-Identifier: MIT * SPDX-3.0-License-Identifier: MIT * * This program is free software. * For more information on the license, see COPYING. * For more information on free software, see . */ #include #include #include "modulemd-dependencies.h" #include "modulemd-errors.h" #include "private/glib-extensions.h" #include "private/modulemd-dependencies-private.h" #include "private/modulemd-util.h" #include "private/modulemd-yaml.h" struct _ModulemdDependencies { GObject parent_instance; /* @key: dependent modules. * @value: #GHashTable set of compatible streams */ GHashTable *buildtime_deps; /* @key: dependent modules. * @value: #GHashTable set of compatible streams */ GHashTable *runtime_deps; }; G_DEFINE_TYPE (ModulemdDependencies, modulemd_dependencies, G_TYPE_OBJECT) ModulemdDependencies * modulemd_dependencies_new (void) { return g_object_new (MODULEMD_TYPE_DEPENDENCIES, NULL); } gboolean modulemd_dependencies_equals (ModulemdDependencies *self_1, ModulemdDependencies *self_2) { if (!self_1 && !self_2) { return TRUE; } if (!self_1 || !self_2) { return FALSE; } g_return_val_if_fail (MODULEMD_IS_DEPENDENCIES (self_1), FALSE); g_return_val_if_fail (MODULEMD_IS_DEPENDENCIES (self_2), FALSE); if (!modulemd_hash_table_equals (self_1->buildtime_deps, self_2->buildtime_deps, modulemd_hash_table_sets_are_equal_wrapper)) { return FALSE; } if (!modulemd_hash_table_equals (self_1->runtime_deps, self_2->runtime_deps, modulemd_hash_table_sets_are_equal_wrapper)) { return FALSE; } return TRUE; } ModulemdDependencies * modulemd_dependencies_copy (ModulemdDependencies *self) { g_autoptr (ModulemdDependencies) d = NULL; g_return_val_if_fail (MODULEMD_IS_DEPENDENCIES (self), NULL); d = modulemd_dependencies_new (); g_hash_table_unref (d->buildtime_deps); d->buildtime_deps = g_hash_table_ref (self->buildtime_deps); g_hash_table_unref (d->runtime_deps); d->runtime_deps = g_hash_table_ref (self->runtime_deps); return g_steal_pointer (&d); } static void modulemd_dependencies_finalize (GObject *object) { ModulemdDependencies *self = (ModulemdDependencies *)object; g_clear_pointer (&self->buildtime_deps, g_hash_table_unref); g_clear_pointer (&self->runtime_deps, g_hash_table_unref); G_OBJECT_CLASS (modulemd_dependencies_parent_class)->finalize (object); } static GHashTable * modulemd_dependencies_nested_table_get_or_create (GHashTable *table, const gchar *key) { g_autofree gchar *keyi = NULL; GHashTable *inner = NULL; inner = g_hash_table_lookup (table, key); if (inner != NULL) { return inner; } // We know that the hash table will end up holding on to it for us. keyi = g_strdup (key); inner = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, NULL); g_hash_table_insert (table, keyi, inner); keyi = NULL; return inner; } static void modulemd_dependencies_nested_table_add (GHashTable *table, const gchar *key, const gchar *value) { GHashTable *inner = modulemd_dependencies_nested_table_get_or_create (table, key); g_return_if_fail (inner); if (value != NULL) { g_hash_table_add (inner, g_strdup (value)); } } static GStrv modulemd_dependencies_nested_table_values_as_strv (GHashTable *table, const gchar *key) { GHashTable *inner = g_hash_table_lookup (table, key); if (inner == NULL) { g_warning ("Streams requested for unknown module: %s", key); return NULL; } return modulemd_ordered_str_keys_as_strv (inner); } void modulemd_dependencies_add_buildtime_stream (ModulemdDependencies *self, const gchar *module_name, const gchar *module_stream) { g_return_if_fail (MODULEMD_IS_DEPENDENCIES (self)); g_return_if_fail (module_name); g_return_if_fail (module_stream); modulemd_dependencies_nested_table_add ( self->buildtime_deps, module_name, module_stream); } void modulemd_dependencies_set_empty_buildtime_dependencies_for_module ( ModulemdDependencies *self, const gchar *module_name) { g_return_if_fail (MODULEMD_IS_DEPENDENCIES (self)); g_return_if_fail (module_name); modulemd_dependencies_nested_table_add ( self->buildtime_deps, module_name, NULL); } void modulemd_dependencies_clear_buildtime_dependencies (ModulemdDependencies *self) { g_return_if_fail (MODULEMD_IS_DEPENDENCIES (self)); g_hash_table_remove_all (self->buildtime_deps); } GStrv modulemd_dependencies_get_buildtime_modules_as_strv ( ModulemdDependencies *self) { g_return_val_if_fail (MODULEMD_IS_DEPENDENCIES (self), NULL); return modulemd_ordered_str_keys_as_strv (self->buildtime_deps); } GStrv modulemd_dependencies_get_buildtime_streams_as_strv ( ModulemdDependencies *self, const gchar *module) { g_return_val_if_fail (MODULEMD_IS_DEPENDENCIES (self), NULL); return modulemd_dependencies_nested_table_values_as_strv ( self->buildtime_deps, module); } void modulemd_dependencies_add_runtime_stream (ModulemdDependencies *self, const gchar *module_name, const gchar *module_stream) { g_return_if_fail (MODULEMD_IS_DEPENDENCIES (self)); g_return_if_fail (module_name); g_return_if_fail (module_stream); modulemd_dependencies_nested_table_add ( self->runtime_deps, module_name, module_stream); } void modulemd_dependencies_set_empty_runtime_dependencies_for_module ( ModulemdDependencies *self, const gchar *module_name) { g_return_if_fail (MODULEMD_IS_DEPENDENCIES (self)); g_return_if_fail (module_name); modulemd_dependencies_nested_table_add ( self->runtime_deps, module_name, NULL); } void modulemd_dependencies_clear_runtime_dependencies (ModulemdDependencies *self) { g_return_if_fail (MODULEMD_IS_DEPENDENCIES (self)); g_hash_table_remove_all (self->runtime_deps); } GStrv modulemd_dependencies_get_runtime_modules_as_strv (ModulemdDependencies *self) { g_return_val_if_fail (MODULEMD_IS_DEPENDENCIES (self), NULL); return modulemd_ordered_str_keys_as_strv (self->runtime_deps); } GStrv modulemd_dependencies_get_runtime_streams_as_strv (ModulemdDependencies *self, const gchar *module) { g_return_val_if_fail (MODULEMD_IS_DEPENDENCIES (self), NULL); return modulemd_dependencies_nested_table_values_as_strv (self->runtime_deps, module); } static gboolean modulemd_dependencies_validate_deps (GHashTable *deps, GError **error) { GHashTableIter iter; gpointer key; gpointer value; gchar *module_name = NULL; gchar *stream_name = NULL; gssize signedness = 0; g_autoptr (GPtrArray) set = NULL; g_hash_table_iter_init (&iter, deps); while (g_hash_table_iter_next (&iter, &key, &value)) { module_name = (gchar *)key; /* The value is a set of strings. Get it and check them all */ set = modulemd_ordered_str_keys (value, modulemd_strcmp_sort); /* An empty set is always valid */ if (set->len == 0) { g_clear_pointer (&set, g_ptr_array_unref); continue; } /* The first element will determine the signedness for the whole * set. */ if (((const gchar *)g_ptr_array_index (set, 0))[0] == '-') { signedness = -1; } else { signedness = 1; } for (guint i = 1; i < set->len; i++) { stream_name = (gchar *)g_ptr_array_index (set, i); if ((stream_name[0] == '-' && signedness > 0) || (stream_name[0] != '-' && signedness < 0)) { g_set_error (error, MODULEMD_ERROR, MMD_ERROR_VALIDATE, "Runtime dependency %s contained a mix of positive " "and negative entries.", module_name); return FALSE; } } g_clear_pointer (&set, g_ptr_array_unref); } return TRUE; } gboolean modulemd_dependencies_validate (ModulemdDependencies *self, GError **error) { /* Look through all the runtime dependencies */ if (!modulemd_dependencies_validate_deps (self->runtime_deps, error)) { return FALSE; } if (!modulemd_dependencies_validate_deps (self->buildtime_deps, error)) { return FALSE; } return TRUE; } static void modulemd_dependencies_get_property (GObject *object, guint prop_id, GValue *UNUSED (value), GParamSpec *pspec) { switch (prop_id) { default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); } } static void modulemd_dependencies_set_property (GObject *object, guint prop_id, const GValue *UNUSED (value), GParamSpec *pspec) { switch (prop_id) { default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); } } static void modulemd_dependencies_class_init (ModulemdDependenciesClass *klass) { GObjectClass *object_class = G_OBJECT_CLASS (klass); object_class->finalize = modulemd_dependencies_finalize; object_class->get_property = modulemd_dependencies_get_property; object_class->set_property = modulemd_dependencies_set_property; } static void modulemd_dependencies_init (ModulemdDependencies *self) { self->buildtime_deps = g_hash_table_new_full ( g_str_hash, g_str_equal, g_free, (GDestroyNotify)g_hash_table_destroy); self->runtime_deps = g_hash_table_new_full ( g_str_hash, g_str_equal, g_free, (GDestroyNotify)g_hash_table_destroy); } /* === YAML Functions === */ ModulemdDependencies * modulemd_dependencies_parse_yaml (yaml_parser_t *parser, gboolean strict, GError **error) { MODULEMD_INIT_TRACE (); MMD_INIT_YAML_EVENT (event); gboolean done = FALSE; g_autoptr (ModulemdDependencies) d = NULL; g_autoptr (GError) nested_error = NULL; d = modulemd_dependencies_new (); g_return_val_if_fail (error == NULL || *error == NULL, FALSE); while (!done) { YAML_PARSER_PARSE_WITH_EXIT (parser, &event, error); switch (event.type) { case YAML_MAPPING_END_EVENT: done = TRUE; break; case YAML_SCALAR_EVENT: if (g_str_equal ((const gchar *)event.data.scalar.value, "buildrequires")) { g_hash_table_unref (d->buildtime_deps); d->buildtime_deps = modulemd_yaml_parse_nested_set (parser, &nested_error); if (d->buildtime_deps == NULL) { MMD_YAML_ERROR_EVENT_EXIT ( error, event, "Failed to parse buildtime deps: %s", nested_error->message); } } else if (g_str_equal ((const gchar *)event.data.scalar.value, "requires")) { g_hash_table_unref (d->runtime_deps); d->runtime_deps = modulemd_yaml_parse_nested_set (parser, &nested_error); if (d->runtime_deps == NULL) { MMD_YAML_ERROR_EVENT_EXIT ( error, event, "Failed to parse runtime deps: %s", nested_error->message); } } else { SKIP_UNKNOWN (parser, NULL, "Unexpected key in dependencies body: %s", (const gchar *)event.data.scalar.value); break; } break; default: MMD_YAML_ERROR_EVENT_EXIT ( error, event, "Unexpected YAML event in dependencies: %d", event.type); break; } yaml_event_delete (&event); } return g_steal_pointer (&d); } gboolean modulemd_dependencies_emit_yaml (ModulemdDependencies *self, yaml_emitter_t *emitter, GError **error) { MODULEMD_INIT_TRACE (); int ret; g_autoptr (GError) nested_error = NULL; MMD_INIT_YAML_EVENT (event); ret = mmd_emitter_start_mapping ( emitter, YAML_BLOCK_MAPPING_STYLE, &nested_error); if (!ret) { g_propagate_prefixed_error (error, g_steal_pointer (&nested_error), "Failed to start dependencies mapping: "); return FALSE; } if (g_hash_table_size (self->buildtime_deps) != 0) { ret = mmd_emitter_scalar ( emitter, "buildrequires", YAML_PLAIN_SCALAR_STYLE, &nested_error); if (!ret) { g_propagate_prefixed_error ( error, g_steal_pointer (&nested_error), "Failed to emit dependencies buildrequires key: "); return FALSE; } ret = modulemd_yaml_emit_nested_set ( emitter, self->buildtime_deps, &nested_error); if (!ret) { g_propagate_prefixed_error ( error, g_steal_pointer (&nested_error), "Failed to emit buildtime dependencies rpms: "); return FALSE; } } if (g_hash_table_size (self->runtime_deps) != 0) { ret = mmd_emitter_scalar ( emitter, "requires", YAML_PLAIN_SCALAR_STYLE, &nested_error); if (!ret) { g_propagate_prefixed_error ( error, g_steal_pointer (&nested_error), "Failed to emit dependencies run-requires key: "); return FALSE; } ret = modulemd_yaml_emit_nested_set ( emitter, self->runtime_deps, &nested_error); if (!ret) { g_propagate_prefixed_error ( error, g_steal_pointer (&nested_error), "Failed to emit runtime dependencies rpms: "); return FALSE; } } ret = mmd_emitter_end_mapping (emitter, &nested_error); if (!ret) { g_propagate_prefixed_error (error, g_steal_pointer (&nested_error), "Failed to end dependencies mapping"); return FALSE; } return TRUE; } static gboolean requires_module_and_stream (GHashTable *modules, const gchar *module_name, const gchar *stream_name) { GHashTable *streams = NULL; GHashTableIter iter; gpointer key; gpointer value; g_autofree gchar *negated = NULL; streams = g_hash_table_lookup (modules, module_name); /* If the module doesn't appear at all, return false */ if (!streams) { return FALSE; } /* Check whether this module is the empty set (which means "all streams") */ if (g_hash_table_size (streams) == 0) { return TRUE; } /* Check whether it includes the stream name explicitly */ if (g_hash_table_contains (streams, stream_name)) { return TRUE; } /* Get the first item from the table and check if it's a negation */ negated = g_strdup_printf ("-%s", stream_name); g_hash_table_iter_init (&iter, streams); /* We already checked that this hash table is not empty, so if iterating it * fails, something has gone horribly wrong. Wrap this in a * g_return_val_if_fail() to make static analysis happy. */ g_return_val_if_fail (g_hash_table_iter_next (&iter, &key, &value), FALSE); /* If we have a negative value for any entry, they all must be negative. * Check whether we're explicitly excluding the requested stream */ if (((const gchar *)key)[0] == '-' && (!g_hash_table_contains (streams, negated))) { return TRUE; } return FALSE; } gboolean modulemd_dependencies_requires_module_and_stream (ModulemdDependencies *self, const gchar *module_name, const gchar *stream_name) { return requires_module_and_stream ( self->runtime_deps, module_name, stream_name); } gboolean modulemd_dependencies_buildrequires_module_and_stream ( ModulemdDependencies *self, const gchar *module_name, const gchar *stream_name) { return requires_module_and_stream ( self->buildtime_deps, module_name, stream_name); } fedora-modularity-libmodulemd-357799c/modulemd/modulemd-docs.xml000066400000000000000000000144241502446517500250320ustar00rootroot00000000000000 ]> Modulemd Reference Manual for Modulemd &version; Stephen Gallagher
sgallagh@redhat.com
2017-2018 Stephen Gallagher
libmodulemd API Documentation for libmodulemd. Modulemd 2.0 Public API Modulemd 2.0 Private Object Methods Modulemd 2.0 Private Developer Utilities resources Additional resources for libmodulemd Annotations 2.0 API Index 2.1 API Index 2.2 API Index 2.3 API Index 2.4 API Index 2.5 API Index 2.6 API Index 2.7 API Index 2.8 API Index 2.9 API Index 2.10 API Index 2.11 API Index 2.13 API Index 2.14 API Index Deprecated API Index Full API Index
fedora-modularity-libmodulemd-357799c/modulemd/modulemd-module-index-merger.c000066400000000000000000000152721502446517500273770ustar00rootroot00000000000000/* * This file is part of libmodulemd * Copyright (C) 2018 Stephen Gallagher * * Fedora-License-Identifier: MIT * SPDX-2.0-License-Identifier: MIT * SPDX-3.0-License-Identifier: MIT * * This program is free software. * For more information on the license, see COPYING. * For more information on free software, see . */ #include "modulemd-defaults.h" #include "modulemd-module-index-merger.h" #include "modulemd-module-index.h" #include "modulemd-module-stream.h" #include "modulemd-module.h" #include "private/modulemd-module-index-private.h" #include "private/modulemd-util.h" #include typedef struct _priorities { gint16 priority; GPtrArray *index_array; } MergerPriorities; struct _ModulemdModuleIndexMerger { GObject parent_instance; ModulemdModuleIndex *merged; GPtrArray *priority_levels; /* */ }; G_DEFINE_TYPE (ModulemdModuleIndexMerger, modulemd_module_index_merger, G_TYPE_OBJECT) ModulemdModuleIndexMerger * modulemd_module_index_merger_new (void) { return g_object_new (MODULEMD_TYPE_MODULE_INDEX_MERGER, NULL); } static void modulemd_module_index_merger_finalize (GObject *object) { ModulemdModuleIndexMerger *self = (ModulemdModuleIndexMerger *)object; g_clear_pointer (&self->priority_levels, g_ptr_array_unref); g_clear_object (&self->merged); G_OBJECT_CLASS (modulemd_module_index_merger_parent_class) ->finalize (object); } static void modulemd_module_index_merger_get_property (GObject *object, guint prop_id, GValue *UNUSED (value), GParamSpec *pspec) { switch (prop_id) { default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); } } static void modulemd_module_index_merger_set_property (GObject *object, guint prop_id, const GValue *UNUSED (value), GParamSpec *pspec) { switch (prop_id) { default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); } } static void modulemd_module_index_merger_class_init (ModulemdModuleIndexMergerClass *klass) { GObjectClass *object_class = G_OBJECT_CLASS (klass); object_class->finalize = modulemd_module_index_merger_finalize; object_class->get_property = modulemd_module_index_merger_get_property; object_class->set_property = modulemd_module_index_merger_set_property; } static void merger_priorities_free (void *ptr) { MergerPriorities *level = (MergerPriorities *)ptr; g_clear_pointer (&level->index_array, g_ptr_array_unref); g_free (level); } static void modulemd_module_index_merger_init (ModulemdModuleIndexMerger *self) { self->priority_levels = g_ptr_array_new_with_free_func (merger_priorities_free); } static GPtrArray * get_or_create_index_array (GPtrArray *priorities, gint32 priority) { MergerPriorities *level = NULL; for (guint i = 0; i < priorities->len; i++) { level = g_ptr_array_index (priorities, i); if (level->priority == priority) { return level->index_array; } if (level->priority > priority) { /* We encountered a higher priority, so insert this new one * just before it */ level = g_new0 (MergerPriorities, 1); level->priority = priority; level->index_array = g_ptr_array_new_full (1, g_object_unref); g_ptr_array_insert (priorities, i, level); return level->index_array; } } /* Went through the list and didn't encounter a higher value. Add this * to the end */ level = g_new0 (MergerPriorities, 1); level->priority = priority; level->index_array = g_ptr_array_new_full (1, g_object_unref); g_ptr_array_add (priorities, level); return level->index_array; } void modulemd_module_index_merger_associate_index (ModulemdModuleIndexMerger *self, ModulemdModuleIndex *index, gint32 priority) { MODULEMD_INIT_TRACE (); GPtrArray *index_array = NULL; g_return_if_fail (MODULEMD_IS_MODULE_INDEX_MERGER (self)); g_return_if_fail (MODULEMD_IS_MODULE_INDEX (index)); g_return_if_fail (priority >= 0 && priority <= 1000); index_array = get_or_create_index_array (self->priority_levels, priority); g_ptr_array_add (index_array, g_object_ref (index)); } ModulemdModuleIndex * modulemd_module_index_merger_resolve (ModulemdModuleIndexMerger *self, GError **error) { return modulemd_module_index_merger_resolve_ext (self, FALSE, error); } ModulemdModuleIndex * modulemd_module_index_merger_resolve_ext (ModulemdModuleIndexMerger *self, gboolean strict_default_streams, GError **error) { MODULEMD_INIT_TRACE (); g_autoptr (ModulemdModuleIndex) thislevel = NULL; g_autoptr (ModulemdModuleIndex) final = NULL; g_autoptr (GError) nested_error = NULL; GPtrArray *indexes = NULL; MergerPriorities *priority_level; g_return_val_if_fail (MODULEMD_IS_MODULE_INDEX_MERGER (self), NULL); final = modulemd_module_index_new (); for (guint i = 0; i < self->priority_levels->len; i++) { priority_level = g_ptr_array_index (self->priority_levels, i); g_debug ("Handling Priority Level: %" G_GINT32_FORMAT, priority_level->priority); /* At each level, process through the attached ModuleIndex objects and * merge them together, then into the lower levels. */ thislevel = modulemd_module_index_new (); indexes = priority_level->index_array; for (guint j = 0; j < indexes->len; j++) { /* Merge each ModuleIndex at this priority level into 'thislevel' */ if (!modulemd_module_index_merge (g_ptr_array_index (indexes, j), thislevel, FALSE, strict_default_streams, &nested_error)) { g_propagate_error (error, g_steal_pointer (&nested_error)); return NULL; } } /* Merge 'thislevel' into 'final' with override=True */ if (!modulemd_module_index_merge ( thislevel, final, TRUE, strict_default_streams, &nested_error)) { g_propagate_error (error, g_steal_pointer (&nested_error)); return NULL; } g_clear_object (&thislevel); } return g_steal_pointer (&final); } fedora-modularity-libmodulemd-357799c/modulemd/modulemd-module-index.c000066400000000000000000001376161502446517500261270ustar00rootroot00000000000000/* * This file is part of libmodulemd * Copyright (C) 2018-2020 Red Hat, Inc. * * Fedora-License-Identifier: MIT * SPDX-2.0-License-Identifier: MIT * SPDX-3.0-License-Identifier: MIT * * This program is free software. * For more information on the license, see COPYING. * For more information on free software, see . */ #include #include #include #include #include #ifdef HAVE_RPMIO #include #endif #include "modulemd.h" #include "modulemd-compression.h" #include "modulemd-errors.h" #include "modulemd-module-index.h" #include "modulemd-subdocument-info.h" #include "private/glib-extensions.h" #include "private/modulemd-compression-private.h" #include "private/modulemd-defaults-private.h" #include "private/modulemd-defaults-v1-private.h" #include "private/modulemd-module-index-private.h" #include "private/modulemd-module-private.h" #include "private/modulemd-module-stream-private.h" #include "private/modulemd-module-stream-v1-private.h" #include "private/modulemd-module-stream-v2-private.h" #include "private/modulemd-packager-v3-private.h" #include "private/modulemd-subdocument-info-private.h" #include "private/modulemd-translation-private.h" #include "private/modulemd-obsoletes-private.h" #include "private/modulemd-util.h" #include "private/modulemd-yaml.h" #define MMD_YAML_SUFFIX ".yaml" struct _ModulemdModuleIndex { GObject parent_instance; GHashTable *modules; ModulemdDefaultsVersionEnum defaults_mdversion; ModulemdModuleStreamVersionEnum stream_mdversion; }; G_DEFINE_TYPE (ModulemdModuleIndex, modulemd_module_index, G_TYPE_OBJECT) ModulemdModuleIndex * modulemd_module_index_new (void) { return g_object_new (MODULEMD_TYPE_MODULE_INDEX, NULL); } static void modulemd_module_index_finalize (GObject *object) { ModulemdModuleIndex *self = (ModulemdModuleIndex *)object; g_clear_pointer (&self->modules, g_hash_table_unref); G_OBJECT_CLASS (modulemd_module_index_parent_class)->finalize (object); } static void modulemd_module_index_get_property (GObject *object, guint prop_id, GValue *UNUSED (value), GParamSpec *pspec) { switch (prop_id) { default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); } } static void modulemd_module_index_set_property (GObject *object, guint prop_id, const GValue *UNUSED (value), GParamSpec *pspec) { switch (prop_id) { default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); } } static void modulemd_module_index_class_init (ModulemdModuleIndexClass *klass) { GObjectClass *object_class = G_OBJECT_CLASS (klass); object_class->finalize = modulemd_module_index_finalize; object_class->get_property = modulemd_module_index_get_property; object_class->set_property = modulemd_module_index_set_property; } static void modulemd_module_index_init (ModulemdModuleIndex *self) { self->modules = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, g_object_unref); } static ModulemdModule * get_or_create_module (ModulemdModuleIndex *self, const gchar *module_name) { ModulemdModule *module = g_hash_table_lookup (self->modules, module_name); if (module == NULL) { module = modulemd_module_new (module_name); g_hash_table_insert (self->modules, g_strdup (module_name), module); } return module; } static gboolean add_subdoc (ModulemdModuleIndex *self, ModulemdSubdocumentInfo *subdoc, gboolean strict, gboolean autogen_module_name, GError **error) { g_autoptr (GError) nested_error = NULL; g_autoptr (ModulemdModuleStream) stream = NULL; g_autoptr (ModulemdTranslation) translation = NULL; g_autoptr (ModulemdObsoletes) obsoletes = NULL; g_autoptr (ModulemdDefaults) defaults = NULL; ModulemdYamlDocumentTypeEnum doctype = modulemd_subdocument_info_get_doctype (subdoc); switch (doctype) { case MODULEMD_YAML_DOC_PACKAGER: g_set_error (error, MODULEMD_YAML_ERROR, MMD_YAML_ERROR_PARSE, "modulemd-packager document ignored while reading into a " "module index"); return FALSE; case MODULEMD_YAML_DOC_MODULESTREAM: switch (modulemd_subdocument_info_get_mdversion (subdoc)) { case MD_MODULESTREAM_VERSION_ONE: stream = MODULEMD_MODULE_STREAM ( modulemd_module_stream_v1_parse_yaml (subdoc, strict, error)); break; case MD_MODULESTREAM_VERSION_TWO: stream = MODULEMD_MODULE_STREAM (modulemd_module_stream_v2_parse_yaml ( subdoc, strict, FALSE, error)); break; default: g_set_error (error, MODULEMD_YAML_ERROR, MMD_YAML_ERROR_PARSE, "Invalid mdversion for a stream object"); return FALSE; } if (stream == NULL) { return FALSE; } if (autogen_module_name) { modulemd_module_stream_set_autogen_module_name ( stream, g_hash_table_size (self->modules) + 1); modulemd_module_stream_set_autogen_stream_name ( stream, g_hash_table_size (self->modules) + 1); } if (!modulemd_module_stream_validate (stream, &nested_error)) { g_propagate_error (error, g_steal_pointer (&nested_error)); return FALSE; } if (!modulemd_module_index_add_module_stream (self, stream, error)) { return FALSE; } break; case MODULEMD_YAML_DOC_DEFAULTS: switch (modulemd_subdocument_info_get_mdversion (subdoc)) { case MD_DEFAULTS_VERSION_ONE: defaults = (ModulemdDefaults *)modulemd_defaults_v1_parse_yaml ( subdoc, strict, error); if (defaults == NULL) { return FALSE; } if (!modulemd_defaults_validate (defaults, &nested_error)) { g_propagate_error (error, g_steal_pointer (&nested_error)); return FALSE; } if (!modulemd_module_index_add_defaults (self, defaults, error)) { return FALSE; } break; default: g_set_error (error, MODULEMD_YAML_ERROR, MMD_YAML_ERROR_PARSE, "Invalid mdversion for a defaults object"); return FALSE; } break; case MODULEMD_YAML_DOC_TRANSLATIONS: translation = modulemd_translation_parse_yaml (subdoc, strict, error); if (translation == NULL) { return FALSE; } if (!modulemd_translation_validate (translation, &nested_error)) { g_propagate_error (error, g_steal_pointer (&nested_error)); return FALSE; } if (!modulemd_module_index_add_translation (self, translation, error)) { return FALSE; } break; case MODULEMD_YAML_DOC_OBSOLETES: obsoletes = modulemd_obsoletes_parse_yaml (subdoc, strict, error); if (obsoletes == NULL) { return FALSE; } if (!modulemd_obsoletes_validate (obsoletes, &nested_error)) { g_propagate_error (error, g_steal_pointer (&nested_error)); return FALSE; } if (!modulemd_module_index_add_obsoletes (self, obsoletes, error)) { return FALSE; } break; default: g_set_error (error, MODULEMD_YAML_ERROR, MMD_YAML_ERROR_PARSE, "Invalid doctype encountered"); return FALSE; } return TRUE; } gboolean modulemd_module_index_update_from_parser (ModulemdModuleIndex *self, yaml_parser_t *parser, gboolean strict, gboolean autogen_module_name, GPtrArray **failures, GError **error) { gboolean done = FALSE; gboolean all_passed = TRUE; g_autoptr (ModulemdSubdocumentInfo) subdoc = NULL; MMD_INIT_YAML_EVENT (event); if (*failures == NULL) { *failures = g_ptr_array_new_with_free_func (g_object_unref); } YAML_PARSER_PARSE_WITH_EXIT_BOOL (parser, &event, error); if (event.type != YAML_STREAM_START_EVENT) { MMD_YAML_ERROR_EVENT_EXIT_BOOL ( error, event, "Did not encounter stream start"); } while (!done) { YAML_PARSER_PARSE_WITH_EXIT_BOOL (parser, &event, error); switch (event.type) { case YAML_DOCUMENT_START_EVENT: /* One more subdocument to parse */ subdoc = modulemd_yaml_parse_document_type (parser); if (modulemd_subdocument_info_get_gerror (subdoc) != NULL) { /* Add to failures and ignore */ g_ptr_array_add (*failures, g_steal_pointer (&subdoc)); all_passed = FALSE; } else { /* Initial parsing worked, parse further */ g_autoptr (GError) subdoc_error = NULL; if (!add_subdoc ( self, subdoc, strict, autogen_module_name, &subdoc_error)) { modulemd_subdocument_info_set_gerror (subdoc, subdoc_error); /* Add to failures and ignore */ g_ptr_array_add (*failures, g_steal_pointer (&subdoc)); all_passed = FALSE; } } g_clear_pointer (&subdoc, g_object_unref); break; case YAML_STREAM_END_EVENT: done = TRUE; break; default: MMD_YAML_ERROR_EVENT_EXIT_BOOL ( error, event, "Unexpected YAML event in document stream"); break; } yaml_event_delete (&event); } return all_passed; } static gboolean dump_defaults (ModulemdModule *module, yaml_emitter_t *emitter, GError **error) { ModulemdDefaults *defaults = modulemd_module_get_defaults (module); g_autoptr (GError) nested_error = NULL; if (defaults == NULL) { return TRUE; /* Nothing to dump -> all a success */ } if (!modulemd_defaults_validate (defaults, &nested_error)) { g_propagate_prefixed_error (error, g_steal_pointer (&nested_error), "Could not validate defaults to emit: "); return FALSE; } if (modulemd_defaults_get_mdversion (defaults) == MD_DEFAULTS_VERSION_ONE) { if (!modulemd_defaults_v1_emit_yaml ( (ModulemdDefaultsV1 *)defaults, emitter, error)) { return FALSE; } } else { g_set_error_literal (error, MODULEMD_ERROR, MMD_ERROR_VALIDATE, "Provided defaults is not a recognized version"); return FALSE; } return TRUE; } static gboolean dump_translations (ModulemdModule *module, yaml_emitter_t *emitter, GError **error) { ModulemdTranslation *translation = NULL; gsize i = 0; g_autoptr (GPtrArray) streams = modulemd_module_get_translated_streams (module); for (i = 0; i < streams->len; i++) { translation = modulemd_module_get_translation ( module, g_ptr_array_index (streams, i)); if (!modulemd_translation_emit_yaml (translation, emitter, error)) { return FALSE; } } return TRUE; } static gboolean dump_obsoletes (ModulemdModule *module, yaml_emitter_t *emitter, GError **error) { ModulemdObsoletes *o = NULL; gsize i = 0; GPtrArray *obsoletes = modulemd_module_get_obsoletes (module); for (i = 0; i < obsoletes->len; i++) { o = g_ptr_array_index (obsoletes, i); if (!modulemd_obsoletes_emit_yaml (o, emitter, error)) { return FALSE; } } return TRUE; } static gint compare_stream_SVCA (gconstpointer a, gconstpointer b) { ModulemdModuleStream *a_ = *(ModulemdModuleStream **)a; ModulemdModuleStream *b_ = *(ModulemdModuleStream **)b; g_autofree gchar *a_nsvca = modulemd_module_stream_get_NSVCA_as_string (a_); g_autofree gchar *b_nsvca = modulemd_module_stream_get_NSVCA_as_string (b_); return g_strcmp0 (a_nsvca, b_nsvca); } static gboolean dump_streams (ModulemdModule *module, yaml_emitter_t *emitter, GError **error) { ModulemdModuleStream *stream = NULL; gsize i = 0; GPtrArray *streams = modulemd_module_get_all_streams (module); g_autoptr (GError) nested_error = NULL; /* * Make sure we get a stable sorting by sorting just before dumping. */ g_ptr_array_sort (streams, compare_stream_SVCA); for (i = 0; i < streams->len; i++) { stream = (ModulemdModuleStream *)g_ptr_array_index (streams, i); if (!modulemd_module_stream_validate (stream, &nested_error)) { g_propagate_prefixed_error (error, g_steal_pointer (&nested_error), "Could not validate stream to emit: "); return FALSE; } if (modulemd_module_stream_get_mdversion (stream) == MD_MODULESTREAM_VERSION_ONE) { if (!modulemd_module_stream_v1_emit_yaml ( MODULEMD_MODULE_STREAM_V1 (stream), emitter, error)) { return FALSE; } } else if (modulemd_module_stream_get_mdversion (stream) == MD_MODULESTREAM_VERSION_TWO) { if (!modulemd_module_stream_v2_emit_yaml ( MODULEMD_MODULE_STREAM_V2 (stream), emitter, error)) { return FALSE; } } else { g_set_error_literal (error, MODULEMD_ERROR, MMD_ERROR_VALIDATE, "Provided stream is not a recognized version"); return FALSE; } } return TRUE; } static gboolean modulemd_module_index_dump_to_emitter (ModulemdModuleIndex *self, yaml_emitter_t *emitter, GError **error) { ModulemdModule *module = NULL; gsize i; g_autoptr (GPtrArray) modules = modulemd_ordered_str_keys (self->modules, modulemd_strcmp_sort); if (modules->len == 0) { g_set_error_literal (error, MODULEMD_ERROR, MMD_ERROR_VALIDATE, "Index contains no modules."); return FALSE; } if (!mmd_emitter_start_stream (emitter, error)) { return FALSE; } for (i = 0; i < modules->len; i++) { module = modulemd_module_index_get_module ( self, g_ptr_array_index (modules, i)); if (!dump_defaults (module, emitter, error)) { return FALSE; } if (!dump_obsoletes (module, emitter, error)) { return FALSE; } if (!dump_translations (module, emitter, error)) { return FALSE; } if (!dump_streams (module, emitter, error)) { return FALSE; } } if (!mmd_emitter_end_stream (emitter, error)) { return FALSE; } return TRUE; } gboolean modulemd_module_index_update_from_file_ext (ModulemdModuleIndex *self, const gchar *yaml_file, gboolean strict, gboolean autogen_module_name, GPtrArray **failures, GError **error) { if (*failures == NULL) { *failures = g_ptr_array_new_full (0, g_object_unref); } g_return_val_if_fail (MODULEMD_IS_MODULE_INDEX (self), FALSE); MMD_INIT_YAML_PARSER (parser); int saved_errno; g_autoptr (FILE) yaml_stream = NULL; g_autoptr (GError) nested_error = NULL; int fd; ModulemdCompressionTypeEnum comtype; g_autofree gchar *fmode = NULL; yaml_stream = g_fopen (yaml_file, "rbe"); saved_errno = errno; if (yaml_stream == NULL) { g_set_error (error, MODULEMD_YAML_ERROR, MMD_YAML_ERROR_OPEN, "Failed to open file: %s", g_strerror (saved_errno)); return FALSE; } /* To avoid TOCTOU race conditions, do everything from the same opened * file */ fd = fileno (yaml_stream); /* Determine if the file is compressed */ comtype = modulemd_detect_compression (yaml_file, fd, &nested_error); if (comtype == MODULEMD_COMPRESSION_TYPE_DETECTION_FAILED) { g_propagate_error (error, g_steal_pointer (&nested_error)); return FALSE; } if (comtype == MODULEMD_COMPRESSION_TYPE_NO_COMPRESSION || comtype == MODULEMD_COMPRESSION_TYPE_UNKNOWN_COMPRESSION) { /* If it's not compressed (or we can't figure out what compression is in * use), just use the libyaml function. It's fast and will fail quickly * if the file is unreadable. */ yaml_parser_set_input_file (&parser, yaml_stream); return modulemd_module_index_update_from_parser ( self, &parser, strict, autogen_module_name, failures, error); } #ifdef HAVE_RPMIO /* We're handling a compressed input file, so we'll use librpm's "rpmio" * suite of tools to deal with it. We need to construct a special "mode" * argument to pass to Fdopen(). */ FD_t rpmio_fd = NULL; g_auto (FD_t) fd_dup = NULL; fmode = modulemd_get_rpmio_fmode ("r", comtype); if (!fmode) { g_set_error (error, MODULEMD_ERROR, MMD_ERROR_FILE_ACCESS, "Unable to construct rpmio fmode from comtype [%d]", comtype); return FALSE; } /* Create an rpmio file descriptor object from the current file descriptor, * setting the appropriate "mode" so that librpm will read it with the * correct handlers. */ fd_dup = fdDup (fd); saved_errno = errno; if (!fd_dup) { g_set_error ( error, MODULEMD_ERROR, MMD_ERROR_NOT_IMPLEMENTED, "Cannot open compressed file. Error in rpmio::fdDup(%d): %s", fd, strerror (saved_errno)); return FALSE; } g_debug ("Calling rpmio::Fdopen (%p, %s)", fd_dup, fmode); rpmio_fd = Fdopen (fd_dup, fmode); if (!rpmio_fd) { g_set_error_literal ( error, MODULEMD_ERROR, MMD_ERROR_NOT_IMPLEMENTED, "Cannot open compressed file. Error in rpmio::Fdopen()."); return FALSE; } g_debug ("rpmio::Fdopen (%p, %s) succeeded", fd_dup, fmode); return modulemd_module_index_update_from_custom ( self, compressed_stream_read_fn, rpmio_fd, strict, failures, error); #else /* HAVE_RPMIO */ g_set_error_literal ( error, MODULEMD_ERROR, MMD_ERROR_NOT_IMPLEMENTED, "Cannot open compressed file. libmodulemd was not compiled " "with rpmio support."); return FALSE; #endif /* HAVE_RPMIO */ } gboolean modulemd_module_index_update_from_file (ModulemdModuleIndex *self, const gchar *yaml_file, gboolean strict, GPtrArray **failures, GError **error) { return modulemd_module_index_update_from_file_ext ( self, yaml_file, strict, FALSE, failures, error); } gboolean modulemd_module_index_update_from_string (ModulemdModuleIndex *self, const gchar *yaml_string, gboolean strict, GPtrArray **failures, GError **error) { if (*failures == NULL) { *failures = g_ptr_array_new_full (0, g_object_unref); } g_return_val_if_fail (MODULEMD_IS_MODULE_INDEX (self), FALSE); if (!yaml_string) { g_set_error ( error, MODULEMD_ERROR, MMD_YAML_ERROR_OPEN, "No string provided"); return FALSE; } MMD_INIT_YAML_PARSER (parser); yaml_parser_set_input_string ( &parser, (const unsigned char *)yaml_string, strlen (yaml_string)); return modulemd_module_index_update_from_parser ( self, &parser, strict, FALSE, failures, error); } gboolean modulemd_module_index_update_from_stream (ModulemdModuleIndex *self, FILE *yaml_stream, gboolean strict, GPtrArray **failures, GError **error) { if (*failures == NULL) { *failures = g_ptr_array_new_full (0, g_object_unref); } g_return_val_if_fail (MODULEMD_IS_MODULE_INDEX (self), FALSE); if (!yaml_stream) { g_set_error ( error, MODULEMD_ERROR, MMD_YAML_ERROR_OPEN, "No stream provided"); return FALSE; } MMD_INIT_YAML_PARSER (parser); yaml_parser_set_input_file (&parser, yaml_stream); return modulemd_module_index_update_from_parser ( self, &parser, strict, FALSE, failures, error); } gboolean modulemd_module_index_update_from_custom (ModulemdModuleIndex *self, ModulemdReadHandler custom_read_fn, void *custom_pvt_data, gboolean strict, GPtrArray **failures, GError **error) { if (*failures == NULL) { *failures = g_ptr_array_new_full (0, g_object_unref); } g_return_val_if_fail (MODULEMD_IS_MODULE_INDEX (self), FALSE); g_return_val_if_fail (custom_read_fn, FALSE); MMD_INIT_YAML_PARSER (parser); yaml_parser_set_input (&parser, custom_read_fn, custom_pvt_data); return modulemd_module_index_update_from_parser ( self, &parser, strict, FALSE, failures, error); } /* * modules_from_directory: * @path: A directory containing one or more modulemd YAML documents * @file_suffix: A file suffix to limit the files to be read. Pass "" if you * need to read all files. * @strict: Whether to fail on unknown fields * @strict_default_streams: Whether to fail on default stream merges. * @error: Error return value */ static ModulemdModuleIndex * modules_from_directory (const gchar *path, const gchar *file_suffix, gboolean strict, gboolean strict_default_streams, GError **error) { const gchar *filename = NULL; g_autoptr (GDir) dir = NULL; g_autofree gchar *filepath = NULL; g_autoptr (ModulemdModuleIndex) index = NULL; g_autoptr (ModulemdModuleIndex) intermediate = NULL; g_autoptr (GPtrArray) failures = NULL; g_autoptr (GError) nested_error = NULL; index = modulemd_module_index_new (); /* Open the directory */ dir = g_dir_open (path, 0, &nested_error); if (!dir) { g_propagate_error (error, g_steal_pointer (&nested_error)); return FALSE; } while ((filename = g_dir_read_name (dir)) != NULL) { if (g_str_has_suffix (filename, file_suffix)) { intermediate = modulemd_module_index_new (); filepath = g_build_path ("/", path, filename, NULL); g_debug ("Reading modulemd from %s", filepath); if (!modulemd_module_index_update_from_file ( intermediate, filepath, strict, &failures, error)) { return FALSE; } if (!modulemd_module_index_merge (intermediate, index, FALSE, strict_default_streams, &nested_error)) { g_propagate_error (error, g_steal_pointer (&nested_error)); return FALSE; } g_clear_pointer (&failures, g_ptr_array_unref); g_clear_pointer (&filepath, g_free); g_clear_object (&intermediate); } } return g_steal_pointer (&index); } gboolean modulemd_module_index_update_from_defaults_directory ( ModulemdModuleIndex *self, const gchar *path, gboolean strict, const gchar *overrides_path, GError **error) { g_autoptr (ModulemdModuleIndex) defaults_idx = NULL; g_autoptr (ModulemdModuleIndex) override_idx = NULL; g_autoptr (GError) nested_error = NULL; /* Read the regular path first */ defaults_idx = modules_from_directory ( path, MMD_YAML_SUFFIX, strict, strict, &nested_error); if (!defaults_idx) { g_propagate_error (error, g_steal_pointer (&nested_error)); return FALSE; } /* If an override path was provided, use that too */ if (overrides_path) { override_idx = modules_from_directory ( overrides_path, MMD_YAML_SUFFIX, strict, strict, &nested_error); if (!override_idx) { g_propagate_error (error, g_steal_pointer (&nested_error)); return FALSE; } if (!modulemd_module_index_merge ( override_idx, defaults_idx, TRUE, strict, &nested_error)) { g_propagate_error (error, g_steal_pointer (&nested_error)); return FALSE; } } /* Now that we've verified that the content in the two paths is compatible, * attempt to merge it into the existing index. */ if (!modulemd_module_index_merge ( defaults_idx, self, TRUE, strict, &nested_error)) { g_propagate_error (error, g_steal_pointer (&nested_error)); return FALSE; } return TRUE; } gchar * modulemd_module_index_dump_to_string (ModulemdModuleIndex *self, GError **error) { g_return_val_if_fail (MODULEMD_IS_MODULE_INDEX (self), NULL); MMD_INIT_YAML_EMITTER (emitter); MMD_INIT_YAML_STRING (&emitter, yaml_string); if (!modulemd_module_index_dump_to_emitter (self, &emitter, error)) { return NULL; } return g_steal_pointer (&yaml_string->str); } gboolean modulemd_module_index_dump_to_stream (ModulemdModuleIndex *self, FILE *yaml_stream, GError **error) { g_return_val_if_fail (MODULEMD_IS_MODULE_INDEX (self), FALSE); MMD_INIT_YAML_EMITTER (emitter); yaml_emitter_set_output_file (&emitter, yaml_stream); return modulemd_module_index_dump_to_emitter (self, &emitter, error); } gboolean modulemd_module_index_dump_to_custom (ModulemdModuleIndex *self, ModulemdWriteHandler custom_write_fn, void *custom_pvt_data, GError **error) { g_return_val_if_fail (MODULEMD_IS_MODULE_INDEX (self), FALSE); MMD_INIT_YAML_EMITTER (emitter); yaml_emitter_set_output (&emitter, custom_write_fn, custom_pvt_data); return modulemd_module_index_dump_to_emitter (self, &emitter, error); } GStrv modulemd_module_index_get_module_names_as_strv (ModulemdModuleIndex *self) { g_return_val_if_fail (MODULEMD_IS_MODULE_INDEX (self), NULL); return modulemd_ordered_str_keys_as_strv (self->modules); } ModulemdModule * modulemd_module_index_get_module (ModulemdModuleIndex *self, const gchar *module_name) { g_return_val_if_fail (MODULEMD_IS_MODULE_INDEX (self), NULL); return g_hash_table_lookup (self->modules, module_name); } GPtrArray * modulemd_module_index_search_streams (ModulemdModuleIndex *self, const gchar *module_name, const gchar *stream_name, const gchar *version, const gchar *context, const gchar *arch) { g_autoptr (GPtrArray) module_names = NULL; g_autoptr (GPtrArray) module_streams = NULL; const gchar *mname = NULL; ModulemdModule *module = NULL; module_names = modulemd_ordered_str_keys (self->modules, modulemd_strcmp_sort); module_streams = g_ptr_array_new (); for (guint i = 0; i < module_names->len; i++) { mname = g_ptr_array_index (module_names, i); g_debug ("Searching through %s", mname); module = modulemd_module_index_get_module (self, mname); if (!module) { /* Since we're iterating through keys we just retrieved, this should * be impossible. If we get here, it must be a bug. */ g_assert_not_reached (); continue; } if (!modulemd_fnmatch (module_name, modulemd_module_get_module_name (module))) { g_debug ("%s did not match %s", modulemd_module_get_module_name (module), module_name); continue; } g_ptr_array_extend_and_steal ( module_streams, modulemd_module_search_streams_by_glob ( module, stream_name, version, context, arch)); } g_debug ("Module stream count: %d", module_streams->len); return g_steal_pointer (&module_streams); } GPtrArray * modulemd_module_index_search_streams_by_nsvca_glob (ModulemdModuleIndex *self, const gchar *nsvca_pattern) { g_autoptr (GPtrArray) module_names = NULL; g_autoptr (GPtrArray) module_streams = NULL; const gchar *mname = NULL; ModulemdModule *module = NULL; module_names = modulemd_ordered_str_keys (self->modules, modulemd_strcmp_sort); module_streams = g_ptr_array_new (); for (guint i = 0; i < module_names->len; i++) { mname = g_ptr_array_index (module_names, i); g_debug ("Searching through %s", mname); module = modulemd_module_index_get_module (self, mname); if (!module) { /* Since we're iterating through keys we just retrieved, this should * be impossible. If we get here, it must be a bug. */ g_assert_not_reached (); continue; } g_ptr_array_extend_and_steal ( module_streams, modulemd_module_search_streams_by_nsvca_glob (module, nsvca_pattern)); } g_debug ("Module stream count: %d", module_streams->len); return g_steal_pointer (&module_streams); } GPtrArray * modulemd_module_index_search_rpms (ModulemdModuleIndex *self, const gchar *nevra_pattern) { g_autoptr (GPtrArray) module_names = NULL; g_autoptr (GPtrArray) found_streams = NULL; GPtrArray *module_streams = NULL; const gchar *mname = NULL; ModulemdModule *module = NULL; ModulemdModuleStream *stream = NULL; module_names = modulemd_ordered_str_keys (self->modules, modulemd_strcmp_sort); found_streams = g_ptr_array_new (); for (guint i = 0; i < module_names->len; i++) { mname = g_ptr_array_index (module_names, i); g_debug ("Searching through %s", mname); module = modulemd_module_index_get_module (self, mname); if (!module) { /* Since we're iterating through keys we just retrieved, this should * be impossible. If we get here, it must be a bug. */ g_assert_not_reached (); continue; } module_streams = modulemd_module_get_all_streams (module); for (guint j = 0; j < module_streams->len; j++) { stream = g_ptr_array_index (module_streams, j); if (modulemd_module_stream_includes_nevra (stream, nevra_pattern)) { g_ptr_array_add (found_streams, stream); } } } g_debug ("Module stream count: %d", found_streams->len); return g_steal_pointer (&found_streams); } gboolean modulemd_module_index_remove_module (ModulemdModuleIndex *self, const gchar *module_name) { g_return_val_if_fail (MODULEMD_IS_MODULE_INDEX (self), FALSE); return g_hash_table_remove (self->modules, module_name); } gboolean modulemd_module_index_add_module_stream (ModulemdModuleIndex *self, ModulemdModuleStream *stream, GError **error) { g_autoptr (GError) nested_error = NULL; ModulemdModuleStreamVersionEnum mdversion = MD_MODULESTREAM_VERSION_UNSET; g_return_val_if_fail (MODULEMD_IS_MODULE_INDEX (self), FALSE); if (!modulemd_module_stream_get_module_name (stream) || !modulemd_module_stream_get_stream_name (stream)) { g_set_error (error, MODULEMD_ERROR, MMD_ERROR_MISSING_REQUIRED, "The module and stream names are required when adding to " "ModuleIndex."); return FALSE; } mdversion = modulemd_module_add_stream ( get_or_create_module (self, modulemd_module_stream_get_module_name (stream)), stream, self->stream_mdversion, &nested_error); if (mdversion == MD_MODULESTREAM_VERSION_ERROR) { g_propagate_error (error, g_steal_pointer (&nested_error)); return FALSE; } if (mdversion > self->stream_mdversion) { /* Upgrade any streams we've already seen to this version */ g_debug ("Upgrading all streams to version %i", mdversion); if (!modulemd_module_index_upgrade_streams ( self, mdversion, &nested_error)) { g_propagate_error (error, g_steal_pointer (&nested_error)); return FALSE; } } return TRUE; } gboolean modulemd_module_index_upgrade_streams ( ModulemdModuleIndex *self, ModulemdModuleStreamVersionEnum mdversion, GError **error) { GHashTableIter iter; gpointer key; gpointer value; g_autoptr (ModulemdModule) module = NULL; g_autoptr (GError) nested_error = NULL; if (mdversion < self->stream_mdversion) { g_set_error (error, MODULEMD_ERROR, MMD_ERROR_UPGRADE, "Downgrades not permitted. mdversion %i < current %i", mdversion, self->stream_mdversion); return FALSE; } g_hash_table_iter_init (&iter, self->modules); while (g_hash_table_iter_next (&iter, &key, &value)) { module = g_object_ref (MODULEMD_MODULE (value)); /* Skip any module without streams */ if (modulemd_module_get_all_streams (module)->len == 0) { g_clear_object (&module); continue; } if (!modulemd_module_upgrade_streams (module, mdversion, &nested_error)) { g_propagate_prefixed_error ( error, g_steal_pointer (&nested_error), "Error upgrading streams for module %s", modulemd_module_get_module_name (module)); return FALSE; } g_clear_object (&module); } self->stream_mdversion = mdversion; return TRUE; } gboolean modulemd_module_index_add_defaults (ModulemdModuleIndex *self, ModulemdDefaults *defaults, GError **error) { g_autoptr (GError) nested_error = NULL; ModulemdDefaultsVersionEnum mdversion = MD_DEFAULTS_VERSION_UNSET; g_return_val_if_fail (MODULEMD_IS_MODULE_INDEX (self), FALSE); mdversion = modulemd_module_set_defaults ( get_or_create_module (self, modulemd_defaults_get_module_name (defaults)), defaults, self->defaults_mdversion, &nested_error); if (mdversion == MD_DEFAULTS_VERSION_ERROR) { g_propagate_error (error, g_steal_pointer (&nested_error)); return FALSE; } if (mdversion > self->defaults_mdversion) { /* Upgrade any defaults we've already seen to this version */ g_debug ("Upgrading all defaults to version %i", mdversion); if (!modulemd_module_index_upgrade_defaults ( self, mdversion, &nested_error)) { g_propagate_error (error, g_steal_pointer (&nested_error)); return FALSE; } } return TRUE; } gboolean modulemd_module_index_add_obsoletes (ModulemdModuleIndex *self, ModulemdObsoletes *obsoletes, GError **error) { g_autoptr (GError) nested_error = NULL; g_return_val_if_fail (MODULEMD_IS_MODULE_INDEX (self), FALSE); g_return_val_if_fail (MODULEMD_IS_OBSOLETES (obsoletes), FALSE); modulemd_module_add_obsoletes ( get_or_create_module (self, modulemd_obsoletes_get_module_name (obsoletes)), obsoletes); /* Obsoletes need at least MD_MODULESTREAM_VERSION_TWO */ if (self->stream_mdversion < MD_MODULESTREAM_VERSION_TWO) { if (!modulemd_module_index_upgrade_streams ( self, MD_MODULESTREAM_VERSION_TWO, &nested_error)) { g_propagate_error (error, g_steal_pointer (&nested_error)); return FALSE; } } return TRUE; } GHashTable * modulemd_module_index_get_default_streams_as_hash_table ( ModulemdModuleIndex *self, const gchar *intent) { GHashTable *defaults = NULL; GHashTableIter iter; gpointer key; gpointer value; ModulemdDefaults *defs = NULL; const gchar *def_stream_name = NULL; defaults = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, g_free); g_hash_table_iter_init (&iter, self->modules); while (g_hash_table_iter_next (&iter, &key, &value)) { defs = modulemd_module_get_defaults (MODULEMD_MODULE (value)); if (defs) { switch (modulemd_defaults_get_mdversion (defs)) { case MD_DEFAULTS_VERSION_ONE: def_stream_name = modulemd_defaults_v1_get_default_stream ( MODULEMD_DEFAULTS_V1 (defs), intent); if (def_stream_name) { /* This module has a default stream. Add it to the table */ g_hash_table_replace ( defaults, g_strdup (key), g_strdup (def_stream_name)); } break; default: /* This should be impossible and suggests that we somehow added * a corrupt defaults object. We will ignore it and continue to * return valid entries. */ g_warning ("Encountered an unknown defaults mdversion: %" PRIu64, modulemd_defaults_get_mdversion (defs)); break; } } } return defaults; } gboolean modulemd_module_index_upgrade_defaults (ModulemdModuleIndex *self, ModulemdDefaultsVersionEnum mdversion, GError **error) { GHashTableIter iter; gpointer key; gpointer value; g_autoptr (ModulemdModule) module = NULL; g_autoptr (ModulemdDefaults) defaults = NULL; g_autoptr (GError) nested_error = NULL; if (mdversion < self->defaults_mdversion) { g_set_error (error, MODULEMD_ERROR, MMD_ERROR_UPGRADE, "Downgrades not permitted. mdversion %i < current %i", mdversion, self->defaults_mdversion); return FALSE; } if (mdversion > MD_DEFAULTS_VERSION_LATEST) { g_set_error (error, MODULEMD_ERROR, MMD_ERROR_UPGRADE, "Unknown Defaults metadata version %i", mdversion); return FALSE; } g_hash_table_iter_init (&iter, self->modules); while (g_hash_table_iter_next (&iter, &key, &value)) { module = g_object_ref (MODULEMD_MODULE (value)); defaults = modulemd_module_get_defaults (module); /* Skip any module without defaults */ if (!defaults) { g_clear_object (&module); continue; } g_object_ref (defaults); if (mdversion != modulemd_module_set_defaults ( module, defaults, mdversion, &nested_error)) { g_propagate_prefixed_error ( error, g_steal_pointer (&nested_error), "Error upgrading previously-added defaults: "); return FALSE; } g_clear_object (&defaults); g_clear_object (&module); } self->defaults_mdversion = mdversion; return TRUE; } gboolean modulemd_module_index_add_translation (ModulemdModuleIndex *self, ModulemdTranslation *translation, GError **UNUSED (error)) { g_return_val_if_fail (MODULEMD_IS_MODULE_INDEX (self), FALSE); modulemd_module_add_translation ( get_or_create_module (self, modulemd_translation_get_module_name (translation)), translation); return TRUE; } static void clear_xmds (gpointer key, gpointer value, gpointer user_data) { MODULEMD_INIT_TRACE (); g_return_if_fail (MODULEMD_IS_MODULE (value)); modulemd_module_clear_xmds (MODULEMD_MODULE (value)); } void modulemd_module_index_clear_xmds (ModulemdModuleIndex *self) { MODULEMD_INIT_TRACE (); g_hash_table_foreach (self->modules, clear_xmds, NULL); } gboolean modulemd_module_index_merge (ModulemdModuleIndex *from, ModulemdModuleIndex *into, gboolean override, gboolean strict_default_streams, GError **error) { MODULEMD_INIT_TRACE (); GHashTableIter iter; gpointer key; gpointer value; const gchar *module_name = NULL; const gchar *trans_stream = NULL; ModulemdModule *module = NULL; ModulemdModule *into_module = NULL; GPtrArray *streams = NULL; ModulemdModuleStream *stream = NULL; g_autoptr (GPtrArray) translations = NULL; ModulemdTranslation *translation = NULL; ModulemdTranslation *current_translation = NULL; ModulemdObsoletes *obsoletes = NULL; ModulemdDefaults *defaults = NULL; ModulemdDefaults *into_defaults = NULL; g_autoptr (ModulemdDefaults) merged_defaults = NULL; g_autoptr (GError) nested_error = NULL; guint i; g_autoptr (GPtrArray) translated_stream_names = NULL; GPtrArray *obsoletes_array = NULL; gchar *translated_stream_name = NULL; g_autofree gchar *nsvca = NULL; /* Loop through each module in the Index */ g_hash_table_iter_init (&iter, from->modules); while (g_hash_table_iter_next (&iter, &key, &value)) { module_name = (const gchar *)key; g_debug ("Merging module %s", module_name); module = MODULEMD_MODULE (value); into_module = get_or_create_module (into, module_name); /* Copy all module streams for this module * The module streams have "version" and "context" to disambiguate them, * so we have documented that if there are two modules with differing * content and the same NSVC, the operation is undefined. * As such, we'll just assume it's safe to add every stream. If there are * duplicates, they'll be deduplicated by replacing the previously- * existing entry. */ g_debug ("Prioritizer: merging streams for %s", module_name); streams = modulemd_module_get_all_streams (module); for (i = 0; i < streams->len; i++) { stream = g_ptr_array_index (streams, i); nsvca = modulemd_module_stream_get_NSVCA_as_string (stream); if (!modulemd_module_index_add_module_stream ( into, stream, &nested_error)) { g_info ("Could not add stream %s due to %s", nsvca, nested_error->message); g_clear_error (&nested_error); } g_clear_pointer (&nsvca, g_free); } /* Merge any defaults entry for this module */ g_debug ("Prioritizer: merging defaults for %s", module_name); defaults = modulemd_module_get_defaults (module); into_defaults = modulemd_module_get_defaults (into_module); if (override && defaults) { /* If we've been told to override (we're at a higher priority level), * then just replace the current defaults with the new one */ if (!modulemd_module_index_add_defaults ( into, defaults, &nested_error)) { g_propagate_error (error, g_steal_pointer (&nested_error)); return FALSE; } } else if (!defaults) { /* No defaults to merge in right now, just continue */ } else if (defaults && !into_defaults) { /* There are no defaults on the target module yet. Copy these */ if (!modulemd_module_index_add_defaults ( into, defaults, &nested_error)) { g_propagate_error (error, g_steal_pointer (&nested_error)); return FALSE; } } else { merged_defaults = modulemd_defaults_merge ( defaults, into_defaults, strict_default_streams, &nested_error); if (!merged_defaults) { g_propagate_error (error, g_steal_pointer (&nested_error)); return FALSE; } /* Add the new, merged defaults to the index */ if (!modulemd_module_index_add_defaults ( into, merged_defaults, &nested_error)) { g_propagate_error (error, g_steal_pointer (&nested_error)); return FALSE; } g_clear_object (&merged_defaults); } /* Merge translations for this module */ g_debug ("Prioritizer: merging translations for %s", module_name); translated_stream_names = modulemd_module_get_translated_streams (module); for (i = 0; i < translated_stream_names->len; i++) { translated_stream_name = g_ptr_array_index (translated_stream_names, i); translation = modulemd_module_get_translation (module, translated_stream_name); trans_stream = modulemd_translation_get_module_stream (translation); current_translation = modulemd_module_get_translation (into_module, trans_stream); if (!current_translation || modulemd_translation_get_modified (translation) > modulemd_translation_get_modified (current_translation)) { /* There was no translation for this stream name or we just found * a newer version of it, so set it on the index. */ if (!modulemd_module_index_add_translation ( into, translation, &nested_error)) { g_propagate_error (error, g_steal_pointer (&nested_error)); return FALSE; } } } g_clear_pointer (&translated_stream_names, g_ptr_array_unref); /* Merge obsoletes for this module */ g_debug ("Prioritizer: merging obsoletes for %s", module_name); obsoletes_array = modulemd_module_get_obsoletes (module); for (i = 0; i < obsoletes_array->len; i++) { obsoletes = g_ptr_array_index (obsoletes_array, i); if (obsoletes) { /* Add obsoletes, overriding if we enounter one with * identical module, stream, context and modified time. */ if (!modulemd_module_index_add_obsoletes ( into, obsoletes, &nested_error)) { g_propagate_error (error, g_steal_pointer (&nested_error)); return FALSE; } } } g_debug ("Prioritizer: all documents merged for %s", module_name); g_clear_pointer (&translations, g_ptr_array_unref); } return TRUE; } ModulemdDefaultsVersionEnum modulemd_module_index_get_defaults_mdversion (ModulemdModuleIndex *self) { return self->defaults_mdversion; } ModulemdModuleStreamVersionEnum modulemd_module_index_get_stream_mdversion (ModulemdModuleIndex *self) { return self->stream_mdversion; } fedora-modularity-libmodulemd-357799c/modulemd/modulemd-module-stream-v1.c000066400000000000000000002270251502446517500266310ustar00rootroot00000000000000/* * This file is part of libmodulemd * Copyright (C) 2018 Red Hat, Inc. * * Fedora-License-Identifier: MIT * SPDX-2.0-License-Identifier: MIT * SPDX-3.0-License-Identifier: MIT * * This program is free software. * For more information on the license, see COPYING. * For more information on free software, see . */ #include "modulemd-buildopts.h" #include "modulemd-component-module.h" #include "modulemd-component-rpm.h" #include "modulemd-component.h" #include "modulemd-errors.h" #include "modulemd-module-stream-v1.h" #include "modulemd-module-stream.h" #include "modulemd-profile.h" #include "modulemd-service-level.h" #include "modulemd-translation-entry.h" #include "private/glib-extensions.h" #include "private/modulemd-buildopts-private.h" #include "private/modulemd-component-module-private.h" #include "private/modulemd-component-private.h" #include "private/modulemd-component-rpm-private.h" #include "private/modulemd-module-stream-private.h" #include "private/modulemd-module-stream-v1-private.h" #include "private/modulemd-profile-private.h" #include "private/modulemd-service-level-private.h" #include "private/modulemd-subdocument-info-private.h" #include "private/modulemd-util.h" #include "private/modulemd-yaml.h" G_DEFINE_TYPE (ModulemdModuleStreamV1, modulemd_module_stream_v1, MODULEMD_TYPE_MODULE_STREAM) enum { PROP_0, PROP_ARCH, PROP_BUILDOPTS, PROP_COMMUNITY, PROP_DOCUMENTATION, PROP_TRACKER, N_PROPS }; static GParamSpec *properties[N_PROPS]; ModulemdModuleStreamV1 * modulemd_module_stream_v1_new (const gchar *module_name, const gchar *module_stream) { // clang-format off return g_object_new (MODULEMD_TYPE_MODULE_STREAM_V1, "module-name", module_name, "stream-name", module_stream, NULL); // clang-format on } static void modulemd_module_stream_v1_finalize (GObject *object) { ModulemdModuleStreamV1 *self = MODULEMD_MODULE_STREAM_V1 (object); /* Properties */ g_clear_object (&self->buildopts); g_clear_pointer (&self->community, g_free); g_clear_pointer (&self->description, g_free); g_clear_pointer (&self->documentation, g_free); g_clear_pointer (&self->summary, g_free); g_clear_pointer (&self->tracker, g_free); /* Internal Data Structures */ g_clear_pointer (&self->module_components, g_hash_table_unref); g_clear_pointer (&self->rpm_components, g_hash_table_unref); g_clear_pointer (&self->content_licenses, g_hash_table_unref); g_clear_pointer (&self->module_licenses, g_hash_table_unref); g_clear_pointer (&self->profiles, g_hash_table_unref); g_clear_pointer (&self->rpm_api, g_hash_table_unref); g_clear_pointer (&self->rpm_artifacts, g_hash_table_unref); g_clear_pointer (&self->rpm_filters, g_hash_table_unref); g_clear_pointer (&self->servicelevels, g_hash_table_unref); g_clear_pointer (&self->buildtime_deps, g_hash_table_unref); g_clear_pointer (&self->runtime_deps, g_hash_table_unref); g_clear_pointer (&self->xmd, g_variant_unref); G_OBJECT_CLASS (modulemd_module_stream_v1_parent_class)->finalize (object); } /* ===== Properties ====== */ static guint64 modulemd_module_stream_v1_get_mdversion (ModulemdModuleStream *UNUSED (self)) { return MD_MODULESTREAM_VERSION_ONE; } void modulemd_module_stream_v1_set_arch (ModulemdModuleStreamV1 *self, const gchar *arch) { g_return_if_fail (MODULEMD_IS_MODULE_STREAM_V1 (self)); modulemd_module_stream_set_arch (MODULEMD_MODULE_STREAM (self), arch); g_object_notify_by_pspec (G_OBJECT (self), properties[PROP_ARCH]); } const gchar * modulemd_module_stream_v1_get_arch (ModulemdModuleStreamV1 *self) { g_return_val_if_fail (MODULEMD_IS_MODULE_STREAM_V1 (self), NULL); return modulemd_module_stream_get_arch (MODULEMD_MODULE_STREAM (self)); } void modulemd_module_stream_v1_set_buildopts (ModulemdModuleStreamV1 *self, ModulemdBuildopts *buildopts) { g_return_if_fail (MODULEMD_IS_MODULE_STREAM_V1 (self)); g_clear_object (&self->buildopts); self->buildopts = modulemd_buildopts_copy (buildopts); g_object_notify_by_pspec (G_OBJECT (self), properties[PROP_BUILDOPTS]); } ModulemdBuildopts * modulemd_module_stream_v1_get_buildopts (ModulemdModuleStreamV1 *self) { g_return_val_if_fail (MODULEMD_IS_MODULE_STREAM_V1 (self), NULL); return self->buildopts; } void modulemd_module_stream_v1_set_community (ModulemdModuleStreamV1 *self, const gchar *community) { g_return_if_fail (MODULEMD_IS_MODULE_STREAM_V1 (self)); g_clear_pointer (&self->community, g_free); self->community = g_strdup (community); g_object_notify_by_pspec (G_OBJECT (self), properties[PROP_COMMUNITY]); } const gchar * modulemd_module_stream_v1_get_community (ModulemdModuleStreamV1 *self) { g_return_val_if_fail (MODULEMD_IS_MODULE_STREAM_V1 (self), NULL); return self->community; } void modulemd_module_stream_v1_set_description (ModulemdModuleStreamV1 *self, const gchar *description) { g_return_if_fail (MODULEMD_IS_MODULE_STREAM_V1 (self)); g_clear_pointer (&self->description, g_free); self->description = g_strdup (description); } const gchar * modulemd_module_stream_v1_get_description (ModulemdModuleStreamV1 *self, const gchar *locale) { g_return_val_if_fail (MODULEMD_IS_MODULE_STREAM_V1 (self), NULL); ModulemdTranslationEntry *entry = modulemd_module_stream_get_translation_entry ( MODULEMD_MODULE_STREAM (self), locale); if (entry != NULL && modulemd_translation_entry_get_description (entry) != NULL) { return modulemd_translation_entry_get_description (entry); } return self->description; } void modulemd_module_stream_v1_set_documentation (ModulemdModuleStreamV1 *self, const gchar *documentation) { g_return_if_fail (MODULEMD_IS_MODULE_STREAM_V1 (self)); g_clear_pointer (&self->documentation, g_free); self->documentation = g_strdup (documentation); g_object_notify_by_pspec (G_OBJECT (self), properties[PROP_COMMUNITY]); } const gchar * modulemd_module_stream_v1_get_documentation (ModulemdModuleStreamV1 *self) { g_return_val_if_fail (MODULEMD_IS_MODULE_STREAM_V1 (self), NULL); return self->documentation; } void modulemd_module_stream_v1_set_summary (ModulemdModuleStreamV1 *self, const gchar *summary) { g_return_if_fail (MODULEMD_IS_MODULE_STREAM_V1 (self)); g_clear_pointer (&self->summary, g_free); self->summary = g_strdup (summary); } const gchar * modulemd_module_stream_v1_get_summary (ModulemdModuleStreamV1 *self, const gchar *locale) { g_return_val_if_fail (MODULEMD_IS_MODULE_STREAM_V1 (self), NULL); ModulemdTranslationEntry *entry = modulemd_module_stream_get_translation_entry ( MODULEMD_MODULE_STREAM (self), locale); if (entry != NULL && modulemd_translation_entry_get_summary (entry) != NULL) { return modulemd_translation_entry_get_summary (entry); } return self->summary; } void modulemd_module_stream_v1_set_tracker (ModulemdModuleStreamV1 *self, const gchar *tracker) { g_return_if_fail (MODULEMD_IS_MODULE_STREAM_V1 (self)); g_clear_pointer (&self->tracker, g_free); self->tracker = g_strdup (tracker); g_object_notify_by_pspec (G_OBJECT (self), properties[PROP_TRACKER]); } const gchar * modulemd_module_stream_v1_get_tracker (ModulemdModuleStreamV1 *self) { g_return_val_if_fail (MODULEMD_IS_MODULE_STREAM_V1 (self), NULL); return self->tracker; } /* ===== Non-property Methods ===== */ void modulemd_module_stream_v1_add_component (ModulemdModuleStreamV1 *self, ModulemdComponent *component) { GHashTable *table = NULL; /* Do nothing if we were passed a NULL component */ if (!component) { return; } g_return_if_fail (MODULEMD_IS_MODULE_STREAM_V1 (self)); g_return_if_fail (MODULEMD_IS_COMPONENT (component)); if (MODULEMD_IS_COMPONENT_RPM (component)) { table = self->rpm_components; } else if (MODULEMD_IS_COMPONENT_MODULE (component)) { table = self->module_components; } else { /* Unknown component. Raise a warning and return */ g_return_if_reached (); } /* Add the component to the table. This will replace an existing component * with the same name */ g_hash_table_replace (table, g_strdup (modulemd_component_get_key (component)), modulemd_component_copy (component, NULL)); } void modulemd_module_stream_v1_remove_module_component ( ModulemdModuleStreamV1 *self, const gchar *component_name) { /* Do nothing if we were passed a NULL component_name */ if (!component_name) { return; } g_return_if_fail (MODULEMD_IS_MODULE_STREAM_V1 (self)); g_hash_table_remove (self->module_components, component_name); } void modulemd_module_stream_v1_clear_module_components ( ModulemdModuleStreamV1 *self) { g_return_if_fail (MODULEMD_IS_MODULE_STREAM_V1 (self)); g_hash_table_remove_all (self->module_components); } void modulemd_module_stream_v1_remove_rpm_component (ModulemdModuleStreamV1 *self, const gchar *component_name) { /* Do nothing if we were passed a NULL component_name */ if (!component_name) { return; } g_return_if_fail (MODULEMD_IS_MODULE_STREAM_V1 (self)); g_hash_table_remove (self->rpm_components, component_name); } void modulemd_module_stream_v1_clear_rpm_components (ModulemdModuleStreamV1 *self) { g_return_if_fail (MODULEMD_IS_MODULE_STREAM_V1 (self)); g_hash_table_remove_all (self->rpm_components); } GStrv modulemd_module_stream_v1_get_module_component_names_as_strv ( ModulemdModuleStreamV1 *self) { g_return_val_if_fail (MODULEMD_IS_MODULE_STREAM_V1 (self), NULL); return modulemd_ordered_str_keys_as_strv (self->module_components); } GStrv modulemd_module_stream_v1_get_rpm_component_names_as_strv ( ModulemdModuleStreamV1 *self) { g_return_val_if_fail (MODULEMD_IS_MODULE_STREAM_V1 (self), NULL); return modulemd_ordered_str_keys_as_strv (self->rpm_components); } ModulemdComponentModule * modulemd_module_stream_v1_get_module_component (ModulemdModuleStreamV1 *self, const gchar *component_name) { g_return_val_if_fail (MODULEMD_IS_MODULE_STREAM_V1 (self), NULL); return g_hash_table_lookup (self->module_components, component_name); } ModulemdComponentRpm * modulemd_module_stream_v1_get_rpm_component (ModulemdModuleStreamV1 *self, const gchar *component_name) { g_return_val_if_fail (MODULEMD_IS_MODULE_STREAM_V1 (self), NULL); return g_hash_table_lookup (self->rpm_components, component_name); } void modulemd_module_stream_v1_add_content_license (ModulemdModuleStreamV1 *self, const gchar *license) { if (!license) { return; } g_return_if_fail (MODULEMD_IS_MODULE_STREAM_V1 (self)); g_hash_table_add (self->content_licenses, g_strdup (license)); } static void modulemd_module_stream_v1_replace_content_licenses ( ModulemdModuleStreamV1 *self, GHashTable *set) { g_return_if_fail (MODULEMD_IS_MODULE_STREAM_V1 (self)); MODULEMD_REPLACE_SET (self->content_licenses, set); } void modulemd_module_stream_v1_clear_content_licenses (ModulemdModuleStreamV1 *self) { g_return_if_fail (MODULEMD_IS_MODULE_STREAM_V1 (self)); g_hash_table_remove_all (self->content_licenses); } void modulemd_module_stream_v1_add_module_license (ModulemdModuleStreamV1 *self, const gchar *license) { if (!license) { return; } g_return_if_fail (MODULEMD_IS_MODULE_STREAM_V1 (self)); g_hash_table_add (self->module_licenses, g_strdup (license)); } static void modulemd_module_stream_v1_replace_module_licenses ( ModulemdModuleStreamV1 *self, GHashTable *set) { g_return_if_fail (MODULEMD_IS_MODULE_STREAM_V1 (self)); MODULEMD_REPLACE_SET (self->module_licenses, set); } void modulemd_module_stream_v1_clear_module_licenses (ModulemdModuleStreamV1 *self) { g_return_if_fail (MODULEMD_IS_MODULE_STREAM_V1 (self)); g_hash_table_remove_all (self->module_licenses); } void modulemd_module_stream_v1_remove_content_license (ModulemdModuleStreamV1 *self, const gchar *license) { if (!license) { return; } g_return_if_fail (MODULEMD_IS_MODULE_STREAM_V1 (self)); g_hash_table_remove (self->content_licenses, license); } void modulemd_module_stream_v1_remove_module_license (ModulemdModuleStreamV1 *self, const gchar *license) { if (!license) { return; } g_return_if_fail (MODULEMD_IS_MODULE_STREAM_V1 (self)); g_hash_table_remove (self->module_licenses, license); } GStrv modulemd_module_stream_v1_get_content_licenses_as_strv ( ModulemdModuleStreamV1 *self) { g_return_val_if_fail (MODULEMD_IS_MODULE_STREAM_V1 (self), NULL); return modulemd_ordered_str_keys_as_strv (self->content_licenses); } GStrv modulemd_module_stream_v1_get_module_licenses_as_strv ( ModulemdModuleStreamV1 *self) { g_return_val_if_fail (MODULEMD_IS_MODULE_STREAM_V1 (self), NULL); return modulemd_ordered_str_keys_as_strv (self->module_licenses); } void modulemd_module_stream_v1_add_profile (ModulemdModuleStreamV1 *self, ModulemdProfile *profile) { if (!profile) { return; } g_return_if_fail (MODULEMD_IS_MODULE_STREAM_V1 (self)); g_return_if_fail (MODULEMD_IS_PROFILE (profile)); ModulemdProfile *copied_profile = modulemd_profile_copy (profile); modulemd_profile_set_owner (copied_profile, MODULEMD_MODULE_STREAM (self)); g_hash_table_replace (self->profiles, g_strdup (modulemd_profile_get_name (profile)), copied_profile); } void modulemd_module_stream_v1_clear_profiles (ModulemdModuleStreamV1 *self) { g_return_if_fail (MODULEMD_IS_MODULE_STREAM_V1 (self)); g_hash_table_remove_all (self->profiles); } GStrv modulemd_module_stream_v1_get_profile_names_as_strv ( ModulemdModuleStreamV1 *self) { g_return_val_if_fail (MODULEMD_IS_MODULE_STREAM_V1 (self), NULL); return modulemd_ordered_str_keys_as_strv (self->profiles); } ModulemdProfile * modulemd_module_stream_v1_get_profile (ModulemdModuleStreamV1 *self, const gchar *profile_name) { g_return_val_if_fail (MODULEMD_IS_MODULE_STREAM_V1 (self), NULL); return g_hash_table_lookup (self->profiles, profile_name); } void modulemd_module_stream_v1_add_rpm_api (ModulemdModuleStreamV1 *self, const gchar *rpm) { if (!rpm) { return; } g_return_if_fail (MODULEMD_IS_MODULE_STREAM_V1 (self)); g_hash_table_add (self->rpm_api, g_strdup (rpm)); } static void modulemd_module_stream_v1_replace_rpm_api (ModulemdModuleStreamV1 *self, GHashTable *set) { g_return_if_fail (MODULEMD_IS_MODULE_STREAM_V1 (self)); MODULEMD_REPLACE_SET (self->rpm_api, set); } void modulemd_module_stream_v1_remove_rpm_api (ModulemdModuleStreamV1 *self, const gchar *rpm) { if (!rpm) { return; } g_return_if_fail (MODULEMD_IS_MODULE_STREAM_V1 (self)); g_hash_table_remove (self->rpm_api, rpm); } void modulemd_module_stream_v1_clear_rpm_api (ModulemdModuleStreamV1 *self) { g_return_if_fail (MODULEMD_IS_MODULE_STREAM_V1 (self)); g_hash_table_remove_all (self->rpm_api); } GStrv modulemd_module_stream_v1_get_rpm_api_as_strv (ModulemdModuleStreamV1 *self) { g_return_val_if_fail (MODULEMD_IS_MODULE_STREAM_V1 (self), NULL); return modulemd_ordered_str_keys_as_strv (self->rpm_api); } void modulemd_module_stream_v1_add_rpm_artifact (ModulemdModuleStreamV1 *self, const gchar *nevr) { if (!nevr) { return; } g_return_if_fail (MODULEMD_IS_MODULE_STREAM_V1 (self)); g_hash_table_add (self->rpm_artifacts, g_strdup (nevr)); } static void modulemd_module_stream_v1_replace_rpm_artifacts (ModulemdModuleStreamV1 *self, GHashTable *set) { g_return_if_fail (MODULEMD_IS_MODULE_STREAM_V1 (self)); MODULEMD_REPLACE_SET (self->rpm_artifacts, set); } void modulemd_module_stream_v1_remove_rpm_artifact (ModulemdModuleStreamV1 *self, const gchar *nevr) { if (!nevr) { return; } g_return_if_fail (MODULEMD_IS_MODULE_STREAM_V1 (self)); g_hash_table_remove (self->rpm_artifacts, nevr); } void modulemd_module_stream_v1_clear_rpm_artifacts (ModulemdModuleStreamV1 *self) { g_return_if_fail (MODULEMD_IS_MODULE_STREAM_V1 (self)); g_hash_table_remove_all (self->rpm_artifacts); } GStrv modulemd_module_stream_v1_get_rpm_artifacts_as_strv ( ModulemdModuleStreamV1 *self) { g_return_val_if_fail (MODULEMD_IS_MODULE_STREAM_V1 (self), NULL); return modulemd_ordered_str_keys_as_strv (self->rpm_artifacts); } void modulemd_module_stream_v1_add_rpm_filter (ModulemdModuleStreamV1 *self, const gchar *rpm) { if (!rpm) { return; } g_return_if_fail (MODULEMD_IS_MODULE_STREAM_V1 (self)); g_hash_table_add (self->rpm_filters, g_strdup (rpm)); } static void modulemd_module_stream_v1_replace_rpm_filters (ModulemdModuleStreamV1 *self, GHashTable *set) { g_return_if_fail (MODULEMD_IS_MODULE_STREAM_V1 (self)); MODULEMD_REPLACE_SET (self->rpm_filters, set); } void modulemd_module_stream_v1_remove_rpm_filter (ModulemdModuleStreamV1 *self, const gchar *rpm) { if (!rpm) { return; } g_return_if_fail (MODULEMD_IS_MODULE_STREAM_V1 (self)); g_hash_table_remove (self->rpm_filters, rpm); } void modulemd_module_stream_v1_clear_rpm_filters (ModulemdModuleStreamV1 *self) { g_return_if_fail (MODULEMD_IS_MODULE_STREAM_V1 (self)); g_hash_table_remove_all (self->rpm_filters); } GStrv modulemd_module_stream_v1_get_rpm_filters_as_strv ( ModulemdModuleStreamV1 *self) { g_return_val_if_fail (MODULEMD_IS_MODULE_STREAM_V1 (self), NULL); return modulemd_ordered_str_keys_as_strv (self->rpm_filters); } void modulemd_module_stream_v1_add_servicelevel (ModulemdModuleStreamV1 *self, ModulemdServiceLevel *servicelevel) { if (!servicelevel) { return; } g_return_if_fail (MODULEMD_IS_MODULE_STREAM_V1 (self)); g_return_if_fail (MODULEMD_IS_SERVICE_LEVEL (servicelevel)); g_hash_table_replace ( self->servicelevels, g_strdup (modulemd_service_level_get_name (servicelevel)), modulemd_service_level_copy (servicelevel)); } void modulemd_module_stream_v1_clear_servicelevels (ModulemdModuleStreamV1 *self) { g_return_if_fail (MODULEMD_IS_MODULE_STREAM_V1 (self)); g_hash_table_remove_all (self->servicelevels); } GStrv modulemd_module_stream_v1_get_servicelevel_names_as_strv ( ModulemdModuleStreamV1 *self) { g_return_val_if_fail (MODULEMD_IS_MODULE_STREAM_V1 (self), NULL); return modulemd_ordered_str_keys_as_strv (self->servicelevels); } ModulemdServiceLevel * modulemd_module_stream_v1_get_servicelevel (ModulemdModuleStreamV1 *self, const gchar *servicelevel_name) { g_return_val_if_fail (MODULEMD_IS_MODULE_STREAM_V1 (self), NULL); return g_hash_table_lookup (self->servicelevels, servicelevel_name); } void modulemd_module_stream_v1_set_eol (ModulemdModuleStreamV1 *self, GDate *eol) { g_return_if_fail (MODULEMD_IS_MODULE_STREAM_V1 (self)); /* The "eol" field in the YAML is a relic of an early iteration and has been * entirely replaced by the ServiceLevel concept. If we encounter it, we just * treat it as if it was the EOL value for a service level named "rawhide". */ g_autoptr (ModulemdServiceLevel) sl = modulemd_service_level_new ("rawhide"); modulemd_service_level_set_eol (sl, eol); return modulemd_module_stream_v1_add_servicelevel (self, sl); } GDate * modulemd_module_stream_v1_get_eol (ModulemdModuleStreamV1 *self) { g_return_val_if_fail (MODULEMD_IS_MODULE_STREAM_V1 (self), NULL); ModulemdServiceLevel *sl = modulemd_module_stream_v1_get_servicelevel (self, "rawhide"); return modulemd_service_level_get_eol (sl); } void modulemd_module_stream_v1_add_buildtime_requirement ( ModulemdModuleStreamV1 *self, const gchar *module_name, const gchar *module_stream) { g_return_if_fail (MODULEMD_IS_MODULE_STREAM_V1 (self)); g_return_if_fail (module_name && module_stream); g_hash_table_replace ( self->buildtime_deps, g_strdup (module_name), g_strdup (module_stream)); } static void modulemd_module_stream_v1_replace_buildtime_deps (ModulemdModuleStreamV1 *self, GHashTable *deps) { g_return_if_fail (MODULEMD_IS_MODULE_STREAM_V1 (self)); if (deps) { g_hash_table_unref (self->buildtime_deps); self->buildtime_deps = modulemd_hash_table_deep_str_copy (deps); } else { g_hash_table_remove_all (self->buildtime_deps); } } void modulemd_module_stream_v1_add_runtime_requirement ( ModulemdModuleStreamV1 *self, const gchar *module_name, const gchar *module_stream) { g_return_if_fail (MODULEMD_IS_MODULE_STREAM_V1 (self)); g_return_if_fail (module_name && module_stream); g_hash_table_replace ( self->runtime_deps, g_strdup (module_name), g_strdup (module_stream)); } static void modulemd_module_stream_v1_replace_runtime_deps (ModulemdModuleStreamV1 *self, GHashTable *deps) { g_return_if_fail (MODULEMD_IS_MODULE_STREAM_V1 (self)); if (deps) { g_hash_table_unref (self->runtime_deps); self->runtime_deps = modulemd_hash_table_deep_str_copy (deps); } else { g_hash_table_remove_all (self->runtime_deps); } } void modulemd_module_stream_v1_remove_buildtime_requirement ( ModulemdModuleStreamV1 *self, const gchar *module_name) { g_return_if_fail (MODULEMD_IS_MODULE_STREAM_V1 (self)); g_return_if_fail (module_name); g_hash_table_remove (self->buildtime_deps, module_name); } void modulemd_module_stream_v1_remove_runtime_requirement ( ModulemdModuleStreamV1 *self, const gchar *module_name) { g_return_if_fail (MODULEMD_IS_MODULE_STREAM_V1 (self)); g_return_if_fail (module_name); g_hash_table_remove (self->runtime_deps, module_name); } void modulemd_module_stream_v1_clear_buildtime_requirements ( ModulemdModuleStreamV1 *self) { g_return_if_fail (MODULEMD_IS_MODULE_STREAM_V1 (self)); g_hash_table_remove_all (self->buildtime_deps); } void modulemd_module_stream_v1_clear_runtime_requirements ( ModulemdModuleStreamV1 *self) { g_return_if_fail (MODULEMD_IS_MODULE_STREAM_V1 (self)); g_hash_table_remove_all (self->runtime_deps); } GStrv modulemd_module_stream_v1_get_buildtime_modules_as_strv ( ModulemdModuleStreamV1 *self) { g_return_val_if_fail (MODULEMD_IS_MODULE_STREAM_V1 (self), NULL); return modulemd_ordered_str_keys_as_strv (self->buildtime_deps); } GStrv modulemd_module_stream_v1_get_runtime_modules_as_strv ( ModulemdModuleStreamV1 *self) { g_return_val_if_fail (MODULEMD_IS_MODULE_STREAM_V1 (self), NULL); return modulemd_ordered_str_keys_as_strv (self->runtime_deps); } const gchar * modulemd_module_stream_v1_get_buildtime_requirement_stream ( ModulemdModuleStreamV1 *self, const gchar *module_name) { g_return_val_if_fail (MODULEMD_IS_MODULE_STREAM_V1 (self), NULL); return g_hash_table_lookup (self->buildtime_deps, module_name); } const gchar * modulemd_module_stream_v1_get_runtime_requirement_stream ( ModulemdModuleStreamV1 *self, const gchar *module_name) { g_return_val_if_fail (MODULEMD_IS_MODULE_STREAM_V1 (self), NULL); return g_hash_table_lookup (self->runtime_deps, module_name); } void modulemd_module_stream_v1_set_xmd (ModulemdModuleStreamV1 *self, GVariant *xmd) { g_return_if_fail (MODULEMD_IS_MODULE_STREAM_V1 (self)); /* Do nothing if we were passed the same pointer */ if (self->xmd == xmd) { return; } g_clear_pointer (&self->xmd, g_variant_unref); self->xmd = modulemd_variant_deep_copy (xmd); } GVariant * modulemd_module_stream_v1_get_xmd (ModulemdModuleStreamV1 *self) { g_return_val_if_fail (MODULEMD_IS_MODULE_STREAM_V1 (self), NULL); return self->xmd; } gboolean modulemd_module_stream_v1_includes_nevra (ModulemdModuleStreamV1 *self, const gchar *nevra_pattern) { /* If g_hash_table_find() returns non-NULL, the nevra was found in this * module stream, so return TRUE */ return !!g_hash_table_find ( self->rpm_artifacts, modulemd_rpm_match, (void *)nevra_pattern); } static gboolean modulemd_module_stream_v1_equals (ModulemdModuleStream *self_1, ModulemdModuleStream *self_2) { ModulemdModuleStreamV1 *v1_self_1 = NULL; ModulemdModuleStreamV1 *v1_self_2 = NULL; g_return_val_if_fail (MODULEMD_IS_MODULE_STREAM_V1 (self_1), FALSE); v1_self_1 = MODULEMD_MODULE_STREAM_V1 (self_1); g_return_val_if_fail (MODULEMD_IS_MODULE_STREAM_V1 (self_2), FALSE); v1_self_2 = MODULEMD_MODULE_STREAM_V1 (self_2); if (!MODULEMD_MODULE_STREAM_CLASS (modulemd_module_stream_v1_parent_class) ->equals (self_1, self_2)) { return FALSE; } /*Check property equality*/ if (g_strcmp0 (v1_self_1->community, v1_self_2->community) != 0) { return FALSE; } if (g_strcmp0 (v1_self_1->description, v1_self_2->description) != 0) { return FALSE; } if (g_strcmp0 (v1_self_1->documentation, v1_self_2->documentation) != 0) { return FALSE; } if (g_strcmp0 (v1_self_1->summary, v1_self_2->summary) != 0) { return FALSE; } if (g_strcmp0 (v1_self_1->tracker, v1_self_2->tracker) != 0) { return FALSE; } if (!modulemd_buildopts_equals (v1_self_1->buildopts, v1_self_2->buildopts)) { return FALSE; } if (!modulemd_hash_table_equals (v1_self_1->rpm_components, v1_self_2->rpm_components, modulemd_component_equals_wrapper)) { return FALSE; } if (!modulemd_hash_table_equals (v1_self_1->module_components, v1_self_2->module_components, modulemd_component_equals_wrapper)) { return FALSE; } if (!modulemd_hash_table_sets_are_equal (v1_self_1->module_licenses, v1_self_2->module_licenses)) { return FALSE; } if (!modulemd_hash_table_sets_are_equal (v1_self_1->content_licenses, v1_self_2->content_licenses)) { return FALSE; } if (!modulemd_hash_table_equals (v1_self_1->profiles, v1_self_2->profiles, modulemd_profile_equals_wrapper)) { return FALSE; } if (!modulemd_hash_table_sets_are_equal (v1_self_1->rpm_api, v1_self_2->rpm_api)) { return FALSE; } if (!modulemd_hash_table_sets_are_equal (v1_self_1->rpm_artifacts, v1_self_2->rpm_artifacts)) { return FALSE; } if (!modulemd_hash_table_sets_are_equal (v1_self_1->rpm_filters, v1_self_2->rpm_filters)) { return FALSE; } if (!modulemd_hash_table_equals (v1_self_1->servicelevels, v1_self_2->servicelevels, modulemd_service_level_equals_wrapper)) { return FALSE; } if (!modulemd_hash_table_equals ( v1_self_1->buildtime_deps, v1_self_2->buildtime_deps, g_str_equal)) { return FALSE; } if (!modulemd_hash_table_equals ( v1_self_1->runtime_deps, v1_self_2->runtime_deps, g_str_equal)) { return FALSE; } if (v1_self_1->xmd == NULL && v1_self_2->xmd == NULL) { return TRUE; } if (v1_self_1->xmd == NULL || v1_self_2->xmd == NULL) { return FALSE; } if (!g_variant_equal (v1_self_1->xmd, v1_self_2->xmd)) { return FALSE; } return TRUE; } static gboolean modulemd_module_stream_v1_validate (ModulemdModuleStream *self, GError **error) { GHashTableIter iter; gpointer key; gpointer value; gchar *nevra = NULL; ModulemdModuleStreamV1 *v1_self = NULL; g_autoptr (GError) nested_error = NULL; g_return_val_if_fail (MODULEMD_IS_MODULE_STREAM_V1 (self), FALSE); v1_self = MODULEMD_MODULE_STREAM_V1 (self); if (!MODULEMD_MODULE_STREAM_CLASS (modulemd_module_stream_v1_parent_class) ->validate (self, error)) { return FALSE; } /* Make sure that mandatory fields are present */ if (!modulemd_module_stream_v1_get_summary (v1_self, "C")) { g_set_error (error, MODULEMD_YAML_ERROR, MMD_YAML_ERROR_MISSING_REQUIRED, "Summary is missing"); return FALSE; } if (!modulemd_module_stream_v1_get_description (v1_self, "C")) { g_set_error (error, MODULEMD_YAML_ERROR, MMD_YAML_ERROR_MISSING_REQUIRED, "Description is missing"); return FALSE; } if (!g_hash_table_size (v1_self->module_licenses)) { g_set_error (error, MODULEMD_YAML_ERROR, MMD_YAML_ERROR_MISSING_REQUIRED, "Module license is missing"); return FALSE; } /* Verify that the components are consistent with regards to buildorder and * buildafter values. */ if (!modulemd_module_stream_validate_components (v1_self->rpm_components, &nested_error)) { g_propagate_error (error, g_steal_pointer (&nested_error)); return FALSE; } /* Iterate through the artifacts and validate that they are in the proper * NEVRA format */ g_hash_table_iter_init (&iter, v1_self->rpm_artifacts); while (g_hash_table_iter_next (&iter, &key, &value)) { nevra = (gchar *)key; if (!modulemd_validate_nevra (nevra)) { g_set_error (error, MODULEMD_ERROR, MMD_ERROR_VALIDATE, "Artifact '%s' was not in valid N-E:V-R.A format.", nevra); return FALSE; } } return TRUE; } static void modulemd_module_stream_v1_get_property (GObject *object, guint prop_id, GValue *value, GParamSpec *pspec) { ModulemdModuleStreamV1 *self = MODULEMD_MODULE_STREAM_V1 (object); switch (prop_id) { case PROP_ARCH: g_value_set_string (value, modulemd_module_stream_v1_get_arch (self)); break; case PROP_BUILDOPTS: g_value_set_object (value, modulemd_module_stream_v1_get_buildopts (self)); break; case PROP_COMMUNITY: g_value_set_string (value, modulemd_module_stream_v1_get_community (self)); break; case PROP_DOCUMENTATION: g_value_set_string (value, modulemd_module_stream_v1_get_documentation (self)); break; case PROP_TRACKER: g_value_set_string (value, modulemd_module_stream_v1_get_tracker (self)); break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); } } static void modulemd_module_stream_v1_set_property (GObject *object, guint prop_id, const GValue *value, GParamSpec *pspec) { ModulemdModuleStreamV1 *self = MODULEMD_MODULE_STREAM_V1 (object); switch (prop_id) { case PROP_ARCH: modulemd_module_stream_v1_set_arch (self, g_value_get_string (value)); break; case PROP_BUILDOPTS: modulemd_module_stream_v1_set_buildopts (self, g_value_get_object (value)); break; case PROP_COMMUNITY: modulemd_module_stream_v1_set_community (self, g_value_get_string (value)); break; case PROP_DOCUMENTATION: modulemd_module_stream_v1_set_documentation (self, g_value_get_string (value)); break; case PROP_TRACKER: modulemd_module_stream_v1_set_tracker (self, g_value_get_string (value)); break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); } } static ModulemdModuleStream * modulemd_module_stream_v1_copy (ModulemdModuleStream *self, const gchar *module_name, const gchar *module_stream) { ModulemdModuleStreamV1 *v1_self = NULL; g_autoptr (ModulemdModuleStreamV1) copy = NULL; g_return_val_if_fail (MODULEMD_IS_MODULE_STREAM_V1 (self), NULL); v1_self = MODULEMD_MODULE_STREAM_V1 (self); copy = MODULEMD_MODULE_STREAM_V1 ( MODULEMD_MODULE_STREAM_CLASS (modulemd_module_stream_v1_parent_class) ->copy (self, module_name, module_stream)); /* Properties */ STREAM_COPY_IF_SET (v1, copy, v1_self, arch); STREAM_COPY_IF_SET (v1, copy, v1_self, buildopts); STREAM_COPY_IF_SET (v1, copy, v1_self, community); STREAM_COPY_IF_SET_WITH_LOCALE (v1, copy, v1_self, description); STREAM_COPY_IF_SET (v1, copy, v1_self, documentation); STREAM_COPY_IF_SET_WITH_LOCALE (v1, copy, v1_self, summary); STREAM_COPY_IF_SET (v1, copy, v1_self, tracker); /* Internal Data Structures: With replace function */ STREAM_REPLACE_HASHTABLE (v1, copy, v1_self, content_licenses); STREAM_REPLACE_HASHTABLE (v1, copy, v1_self, module_licenses); STREAM_REPLACE_HASHTABLE (v1, copy, v1_self, rpm_api); STREAM_REPLACE_HASHTABLE (v1, copy, v1_self, rpm_artifacts); STREAM_REPLACE_HASHTABLE (v1, copy, v1_self, rpm_filters); STREAM_REPLACE_HASHTABLE (v1, copy, v1_self, buildtime_deps); STREAM_REPLACE_HASHTABLE (v1, copy, v1_self, runtime_deps); /* Internal Data Structures: With add on value */ COPY_HASHTABLE_BY_VALUE_ADDER ( copy, v1_self, rpm_components, modulemd_module_stream_v1_add_component); COPY_HASHTABLE_BY_VALUE_ADDER ( copy, v1_self, module_components, modulemd_module_stream_v1_add_component); COPY_HASHTABLE_BY_VALUE_ADDER ( copy, v1_self, profiles, modulemd_module_stream_v1_add_profile); COPY_HASHTABLE_BY_VALUE_ADDER ( copy, v1_self, servicelevels, modulemd_module_stream_v1_add_servicelevel); STREAM_COPY_IF_SET (v1, copy, v1_self, xmd); return MODULEMD_MODULE_STREAM (g_steal_pointer (©)); } static gboolean modulemd_module_stream_v1_depends_on_stream (ModulemdModuleStream *self, const gchar *module_name, const gchar *stream_name) { const gchar *stream = NULL; ModulemdModuleStreamV1 *v1_self = NULL; g_return_val_if_fail (MODULEMD_IS_MODULE_STREAM_V1 (self), FALSE); g_return_val_if_fail (module_name && stream_name, FALSE); v1_self = MODULEMD_MODULE_STREAM_V1 (self); stream = g_hash_table_lookup (v1_self->runtime_deps, module_name); if (!stream) { return FALSE; } return g_str_equal (stream, stream_name); } static gboolean modulemd_module_stream_v1_build_depends_on_stream (ModulemdModuleStream *self, const gchar *module_name, const gchar *stream_name) { const gchar *stream = NULL; ModulemdModuleStreamV1 *v1_self = NULL; g_return_val_if_fail (MODULEMD_IS_MODULE_STREAM_V1 (self), FALSE); g_return_val_if_fail (module_name && stream_name, FALSE); v1_self = MODULEMD_MODULE_STREAM_V1 (self); stream = g_hash_table_lookup (v1_self->buildtime_deps, module_name); if (!stream) { return FALSE; } return g_str_equal (stream, stream_name); } static void modulemd_module_stream_v1_class_init (ModulemdModuleStreamV1Class *klass) { GObjectClass *object_class = G_OBJECT_CLASS (klass); ModulemdModuleStreamClass *stream_class = MODULEMD_MODULE_STREAM_CLASS (object_class); object_class->finalize = modulemd_module_stream_v1_finalize; object_class->get_property = modulemd_module_stream_v1_get_property; object_class->set_property = modulemd_module_stream_v1_set_property; stream_class->get_mdversion = modulemd_module_stream_v1_get_mdversion; stream_class->copy = modulemd_module_stream_v1_copy; stream_class->equals = modulemd_module_stream_v1_equals; stream_class->validate = modulemd_module_stream_v1_validate; stream_class->depends_on_stream = modulemd_module_stream_v1_depends_on_stream; stream_class->build_depends_on_stream = modulemd_module_stream_v1_build_depends_on_stream; properties[PROP_ARCH] = g_param_spec_string ( "arch", "Module Artifact Architecture", "The architecture of the produced artifacts", NULL, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS | G_PARAM_CONSTRUCT); properties[PROP_BUILDOPTS] = g_param_spec_object ("buildopts", "Module Build Options", "Build options for module components", MODULEMD_TYPE_BUILDOPTS, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS); properties[PROP_COMMUNITY] = g_param_spec_string ( "community", "Module Community Website", "The website address of the upstream community for this module", NULL, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS | G_PARAM_CONSTRUCT); properties[PROP_DOCUMENTATION] = g_param_spec_string ( "documentation", "Module Documentation Website", "The website address of the upstream documentation for this module", NULL, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS | G_PARAM_CONSTRUCT); properties[PROP_TRACKER] = g_param_spec_string ( "tracker", "Module Bug Tracker Website", "The website address of the upstream bug tracker for this module", NULL, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS | G_PARAM_CONSTRUCT); g_object_class_install_properties (object_class, N_PROPS, properties); } static void modulemd_module_stream_v1_init (ModulemdModuleStreamV1 *self) { /* Properties */ /* Internal Data Structures */ self->module_components = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, g_object_unref); self->rpm_components = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, g_object_unref); self->content_licenses = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, NULL); self->module_licenses = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, NULL); self->profiles = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, g_object_unref); self->rpm_api = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, NULL); self->rpm_artifacts = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, NULL); self->rpm_filters = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, NULL); self->servicelevels = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, g_object_unref); self->buildtime_deps = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, g_free); self->runtime_deps = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, g_free); } static gboolean modulemd_module_stream_v1_parse_licenses (yaml_parser_t *parser, ModulemdModuleStreamV1 *modulestream, gboolean strict, GError **error); static gboolean modulemd_module_stream_v1_parse_servicelevels ( yaml_parser_t *parser, ModulemdModuleStreamV1 *modulestream, gboolean strict, GError **error); static gboolean modulemd_module_stream_v1_parse_deps (yaml_parser_t *parser, ModulemdModuleStreamV1 *modulestream, gboolean strict, GError **error); static gboolean modulemd_module_stream_v1_parse_refs (yaml_parser_t *parser, ModulemdModuleStreamV1 *modulestream, gboolean strict, GError **error); static gboolean modulemd_module_stream_v1_parse_profiles (yaml_parser_t *parser, ModulemdModuleStreamV1 *modulestream, gboolean strict, GError **error); static gboolean modulemd_module_stream_v1_parse_components ( yaml_parser_t *parser, ModulemdModuleStreamV1 *modulestream, gboolean strict, GError **error); ModulemdModuleStreamV1 * modulemd_module_stream_v1_parse_yaml (ModulemdSubdocumentInfo *subdoc, gboolean strict, GError **error) { MODULEMD_INIT_TRACE (); MMD_INIT_YAML_PARSER (parser); MMD_INIT_YAML_EVENT (event); gboolean done = FALSE; g_autoptr (GError) nested_error = NULL; g_autoptr (ModulemdModuleStreamV1) modulestream = NULL; g_autoptr (GHashTable) set = NULL; g_autoptr (ModulemdBuildopts) buildopts = NULL; g_autoptr (GVariant) xmd = NULL; g_autoptr (GDate) eol = NULL; g_autoptr (ModulemdServiceLevel) sl = NULL; if (!modulemd_subdocument_info_get_data_parser ( subdoc, &parser, strict, error)) { return NULL; } guint64 version; g_return_val_if_fail (error == NULL || *error == NULL, FALSE); modulestream = modulemd_module_stream_v1_new (NULL, NULL); /* Read the MAPPING_START */ YAML_PARSER_PARSE_WITH_EXIT (&parser, &event, error); if (event.type != YAML_MAPPING_START_EVENT) { MMD_YAML_ERROR_EVENT_EXIT ( error, event, "Data section did not begin with a map."); } /* Process through the mapping */ while (!done) { YAML_PARSER_PARSE_WITH_EXIT (&parser, &event, error); switch (event.type) { case YAML_MAPPING_END_EVENT: done = TRUE; break; case YAML_SCALAR_EVENT: /* Mapping Keys */ /* Module Name */ if (g_str_equal ((const gchar *)event.data.scalar.value, "name")) { MMD_SET_PARSED_YAML_STRING ( &parser, error, modulemd_module_stream_set_module_name, MODULEMD_MODULE_STREAM (modulestream)); } /* Module Stream Name */ else if (g_str_equal ((const gchar *)event.data.scalar.value, "stream")) { MMD_SET_PARSED_YAML_STRING ( &parser, error, modulemd_module_stream_set_stream_name, MODULEMD_MODULE_STREAM (modulestream)); } /* Module Version */ else if (g_str_equal ((const gchar *)event.data.scalar.value, "version")) { version = modulemd_yaml_parse_uint64 (&parser, &nested_error); if (nested_error) { g_propagate_error (error, g_steal_pointer (&nested_error)); return NULL; } modulemd_module_stream_set_version ( MODULEMD_MODULE_STREAM (modulestream), version); } /* Module Context */ else if (g_str_equal ((const gchar *)event.data.scalar.value, "context")) { MMD_SET_PARSED_YAML_STRING ( &parser, error, modulemd_module_stream_set_context, MODULEMD_MODULE_STREAM (modulestream)); } /* Module Artifact Architecture */ else if (g_str_equal ((const gchar *)event.data.scalar.value, "arch")) { MMD_SET_PARSED_YAML_STRING (&parser, error, modulemd_module_stream_v1_set_arch, modulestream); } /* Module Summary */ else if (g_str_equal ((const gchar *)event.data.scalar.value, "summary")) { MMD_SET_PARSED_YAML_STRING ( &parser, error, modulemd_module_stream_v1_set_summary, modulestream); } /* Module Description */ else if (g_str_equal ((const gchar *)event.data.scalar.value, "description")) { MMD_SET_PARSED_YAML_STRING ( &parser, error, modulemd_module_stream_v1_set_description, modulestream); } /* Service Levels */ else if (g_str_equal ((const gchar *)event.data.scalar.value, "servicelevels")) { if (!modulemd_module_stream_v1_parse_servicelevels ( &parser, modulestream, strict, &nested_error)) { g_propagate_error (error, g_steal_pointer (&nested_error)); return NULL; } } /* Licences */ else if (g_str_equal ((const gchar *)event.data.scalar.value, "license")) { if (!modulemd_module_stream_v1_parse_licenses ( &parser, modulestream, strict, &nested_error)) { g_propagate_error (error, g_steal_pointer (&nested_error)); return NULL; } } /* Extensible Metadata */ else if (g_str_equal ((const gchar *)event.data.scalar.value, "xmd")) { xmd = mmd_parse_xmd (&parser, &nested_error); if (!xmd) { g_propagate_error (error, g_steal_pointer (&nested_error)); return NULL; } modulemd_module_stream_v1_set_xmd (modulestream, xmd); g_clear_pointer (&xmd, g_variant_unref); } /* Dependencies */ else if (g_str_equal ((const gchar *)event.data.scalar.value, "dependencies")) { if (!modulemd_module_stream_v1_parse_deps ( &parser, modulestream, strict, &nested_error)) { g_propagate_error (error, g_steal_pointer (&nested_error)); return NULL; } } /* References */ else if (g_str_equal ((const gchar *)event.data.scalar.value, "references")) { if (!modulemd_module_stream_v1_parse_refs ( &parser, modulestream, strict, &nested_error)) { g_propagate_error (error, g_steal_pointer (&nested_error)); return NULL; } } /* Profiles */ else if (g_str_equal ((const gchar *)event.data.scalar.value, "profiles")) { if (!modulemd_module_stream_v1_parse_profiles ( &parser, modulestream, strict, &nested_error)) { g_propagate_error (error, g_steal_pointer (&nested_error)); return NULL; } } /* API */ else if (g_str_equal ((const gchar *)event.data.scalar.value, "api")) { set = modulemd_yaml_parse_string_set_from_map ( &parser, "rpms", strict, &nested_error); modulemd_module_stream_v1_replace_rpm_api (modulestream, set); g_clear_pointer (&set, g_hash_table_unref); } /* Filter */ else if (g_str_equal ((const gchar *)event.data.scalar.value, "filter")) { set = modulemd_yaml_parse_string_set_from_map ( &parser, "rpms", strict, &nested_error); modulemd_module_stream_v1_replace_rpm_filters (modulestream, set); g_clear_pointer (&set, g_hash_table_unref); } /* Build Options */ else if (g_str_equal ((const gchar *)event.data.scalar.value, "buildopts")) { buildopts = modulemd_buildopts_parse_yaml (&parser, strict, &nested_error); if (!buildopts) { g_propagate_error (error, g_steal_pointer (&nested_error)); return NULL; } modulemd_module_stream_v1_set_buildopts (modulestream, buildopts); g_clear_object (&buildopts); } /* Components */ else if (g_str_equal ((const gchar *)event.data.scalar.value, "components")) { if (!modulemd_module_stream_v1_parse_components ( &parser, modulestream, strict, &nested_error)) { g_propagate_error (error, g_steal_pointer (&nested_error)); return NULL; } } /* Artifacts */ else if (g_str_equal ((const gchar *)event.data.scalar.value, "artifacts")) { set = modulemd_yaml_parse_string_set_from_map ( &parser, "rpms", strict, &nested_error); if (!set) { g_propagate_error (error, g_steal_pointer (&nested_error)); return NULL; } modulemd_module_stream_v1_replace_rpm_artifacts (modulestream, set); g_clear_pointer (&set, g_hash_table_unref); } /* EOL (Deprecated) */ else if (g_str_equal ((const gchar *)event.data.scalar.value, "eol")) { eol = modulemd_yaml_parse_date (&parser, &nested_error); if (!eol) { MMD_YAML_ERROR_EVENT_EXIT ( error, event, "Failed to parse EOL date in data: %s", nested_error->message); } /* We store EOL as the "rawhide" service level, according to the * spec. */ sl = modulemd_service_level_new ("rawhide"); modulemd_service_level_set_eol (sl, eol); modulemd_module_stream_v1_add_servicelevel (modulestream, sl); g_clear_object (&sl); g_clear_pointer (&eol, g_date_free); } /* Unknown key */ else { SKIP_UNKNOWN (&parser, NULL, "Unexpected key in data: %s", (const gchar *)event.data.scalar.value); break; } break; default: MMD_YAML_ERROR_EVENT_EXIT ( error, event, "Unexpected YAML event in ModuleStreamV1: %s", mmd_yaml_get_event_name (event.type)); break; } yaml_event_delete (&event); } return g_steal_pointer (&modulestream); } static gboolean modulemd_module_stream_v1_parse_licenses (yaml_parser_t *parser, ModulemdModuleStreamV1 *modulestream, gboolean strict, GError **error) { MODULEMD_INIT_TRACE (); MMD_INIT_YAML_EVENT (event); gboolean done = FALSE; gboolean in_map = FALSE; g_autoptr (GError) nested_error = NULL; g_autoptr (GHashTable) set = NULL; g_return_val_if_fail (error == NULL || *error == NULL, FALSE); /* Process through the mapping */ while (!done) { YAML_PARSER_PARSE_WITH_EXIT_BOOL (parser, &event, error); switch (event.type) { case YAML_MAPPING_START_EVENT: if (in_map) { MMD_YAML_ERROR_EVENT_EXIT_BOOL ( error, event, "Unexpected extra MAPPING_START event in licenses"); } in_map = TRUE; break; case YAML_MAPPING_END_EVENT: if (!in_map) { MMD_YAML_ERROR_EVENT_EXIT_BOOL ( error, event, "Unexpected MAPPING_END event in licenses"); } done = TRUE; break; case YAML_SCALAR_EVENT: if (!in_map) { MMD_YAML_ERROR_EVENT_EXIT_BOOL ( error, event, "Received scalar outside of mapping"); } if (g_str_equal ((const gchar *)event.data.scalar.value, "module")) { set = modulemd_yaml_parse_string_set (parser, &nested_error); if (!set) { g_propagate_error (error, g_steal_pointer (&nested_error)); return FALSE; } modulemd_module_stream_v1_replace_module_licenses (modulestream, set); g_clear_pointer (&set, g_hash_table_unref); } else if (g_str_equal ((const gchar *)event.data.scalar.value, "content")) { set = modulemd_yaml_parse_string_set (parser, &nested_error); modulemd_module_stream_v1_replace_content_licenses (modulestream, set); g_clear_pointer (&set, g_hash_table_unref); } else { SKIP_UNKNOWN (parser, FALSE, "Unexpected key in licenses: %s", (const gchar *)event.data.scalar.value); break; } break; default: MMD_YAML_ERROR_EVENT_EXIT_BOOL ( error, event, "Unexpected YAML event in licenses: %s", mmd_yaml_get_event_name (event.type)); break; } yaml_event_delete (&event); } return TRUE; } static gboolean modulemd_module_stream_v1_parse_servicelevels ( yaml_parser_t *parser, ModulemdModuleStreamV1 *modulestream, gboolean strict, GError **error) { MODULEMD_INIT_TRACE (); MMD_INIT_YAML_EVENT (event); gboolean done = FALSE; gboolean in_map = FALSE; const gchar *name = NULL; g_autoptr (ModulemdServiceLevel) sl = NULL; g_autoptr (GError) nested_error = NULL; g_return_val_if_fail (error == NULL || *error == NULL, FALSE); /* Process through the mapping */ while (!done) { YAML_PARSER_PARSE_WITH_EXIT_BOOL (parser, &event, error); switch (event.type) { case YAML_MAPPING_START_EVENT: if (in_map) { MMD_YAML_ERROR_EVENT_EXIT_BOOL ( error, event, "Unexpected extra MAPPING_START event in servicelevels"); } in_map = TRUE; break; case YAML_MAPPING_END_EVENT: if (!in_map) { MMD_YAML_ERROR_EVENT_EXIT_BOOL ( error, event, "Unexpected MAPPING_END event in servicelevels"); } done = TRUE; break; case YAML_SCALAR_EVENT: if (!in_map) { MMD_YAML_ERROR_EVENT_EXIT_BOOL ( error, event, "Received scalar outside of mapping"); } name = (const gchar *)event.data.scalar.value; sl = modulemd_service_level_parse_yaml ( parser, name, strict, &nested_error); if (!sl) { g_propagate_error (error, g_steal_pointer (&nested_error)); return FALSE; } modulemd_module_stream_v1_add_servicelevel (modulestream, sl); g_clear_object (&sl); break; default: MMD_YAML_ERROR_EVENT_EXIT_BOOL ( error, event, "Unexpected YAML event in servicelevels: %s", mmd_yaml_get_event_name (event.type)); break; } yaml_event_delete (&event); } return TRUE; } static gboolean modulemd_module_stream_v1_parse_deps (yaml_parser_t *parser, ModulemdModuleStreamV1 *modulestream, gboolean strict, GError **error) { MODULEMD_INIT_TRACE (); MMD_INIT_YAML_EVENT (event); gboolean done = FALSE; g_autoptr (GError) nested_error = NULL; g_autoptr (GHashTable) deptable = NULL; g_return_val_if_fail (error == NULL || *error == NULL, FALSE); /* Process through the sequence */ /* We *must* get a MAPPING_START here */ YAML_PARSER_PARSE_WITH_EXIT_BOOL (parser, &event, error); if (event.type != YAML_MAPPING_START_EVENT) { MMD_YAML_ERROR_EVENT_EXIT_BOOL ( error, event, "Got %s instead of SEQUENCE_START in dependencies.", mmd_yaml_get_event_name (event.type)); } while (!done) { YAML_PARSER_PARSE_WITH_EXIT_BOOL (parser, &event, error); switch (event.type) { case YAML_MAPPING_END_EVENT: done = TRUE; break; case YAML_SCALAR_EVENT: if (g_str_equal ((const gchar *)event.data.scalar.value, "buildrequires")) { deptable = modulemd_yaml_parse_string_string_map (parser, &nested_error); if (!deptable) { g_propagate_error (error, g_steal_pointer (&nested_error)); return FALSE; } modulemd_module_stream_v1_replace_buildtime_deps (modulestream, deptable); g_clear_pointer (&deptable, g_hash_table_unref); } else if (g_str_equal ((const gchar *)event.data.scalar.value, "requires")) { deptable = modulemd_yaml_parse_string_string_map (parser, &nested_error); if (!deptable) { g_propagate_error (error, g_steal_pointer (&nested_error)); return FALSE; } modulemd_module_stream_v1_replace_runtime_deps (modulestream, deptable); g_clear_pointer (&deptable, g_hash_table_unref); } else { SKIP_UNKNOWN (parser, FALSE, "Unexpected key in dependencies: %s", (const gchar *)event.data.scalar.value); break; } break; default: MMD_YAML_ERROR_EVENT_EXIT_BOOL ( error, event, "Unexpected YAML event in dependencies: %s", mmd_yaml_get_event_name (event.type)); break; } yaml_event_delete (&event); } return TRUE; } static gboolean modulemd_module_stream_v1_parse_refs (yaml_parser_t *parser, ModulemdModuleStreamV1 *modulestream, gboolean strict, GError **error) { MODULEMD_INIT_TRACE (); MMD_INIT_YAML_EVENT (event); gboolean done = FALSE; g_autofree gchar *scalar = NULL; g_autoptr (GError) nested_error = NULL; g_return_val_if_fail (error == NULL || *error == NULL, FALSE); /* Process through the map */ /* We *must* get a MAPPING_START here */ YAML_PARSER_PARSE_WITH_EXIT_BOOL (parser, &event, error); if (event.type != YAML_MAPPING_START_EVENT) { MMD_YAML_ERROR_EVENT_EXIT_BOOL ( error, event, "Got %s instead of MAPPING_START in dependencies.", mmd_yaml_get_event_name (event.type)); } while (!done) { YAML_PARSER_PARSE_WITH_EXIT_BOOL (parser, &event, error); switch (event.type) { case YAML_MAPPING_END_EVENT: done = TRUE; break; case YAML_SCALAR_EVENT: if (g_str_equal ((const gchar *)event.data.scalar.value, "community")) { scalar = modulemd_yaml_parse_string (parser, &nested_error); if (!scalar) { g_propagate_error (error, g_steal_pointer (&nested_error)); return FALSE; } modulemd_module_stream_v1_set_community (modulestream, scalar); g_clear_pointer (&scalar, g_free); } else if (g_str_equal ((const gchar *)event.data.scalar.value, "documentation")) { scalar = modulemd_yaml_parse_string (parser, &nested_error); if (!scalar) { g_propagate_error (error, g_steal_pointer (&nested_error)); return FALSE; } modulemd_module_stream_v1_set_documentation (modulestream, scalar); g_clear_pointer (&scalar, g_free); } else if (g_str_equal ((const gchar *)event.data.scalar.value, "tracker")) { scalar = modulemd_yaml_parse_string (parser, &nested_error); if (!scalar) { g_propagate_error (error, g_steal_pointer (&nested_error)); return FALSE; } modulemd_module_stream_v1_set_tracker (modulestream, scalar); g_clear_pointer (&scalar, g_free); } else { SKIP_UNKNOWN (parser, FALSE, "Unexpected key in references: %s", (const gchar *)event.data.scalar.value); break; } break; default: MMD_YAML_ERROR_EVENT_EXIT_BOOL ( error, event, "Unexpected YAML event in dependencies: %s", mmd_yaml_get_event_name (event.type)); break; } yaml_event_delete (&event); } return TRUE; } static gboolean modulemd_module_stream_v1_parse_profiles (yaml_parser_t *parser, ModulemdModuleStreamV1 *modulestream, gboolean strict, GError **error) { MODULEMD_INIT_TRACE (); MMD_INIT_YAML_EVENT (event); gboolean done = FALSE; g_autoptr (GError) nested_error = NULL; g_autoptr (ModulemdProfile) profile = NULL; g_return_val_if_fail (error == NULL || *error == NULL, FALSE); /* Process through the map */ /* We *must* get a MAPPING_START here */ YAML_PARSER_PARSE_WITH_EXIT_BOOL (parser, &event, error); if (event.type != YAML_MAPPING_START_EVENT) { MMD_YAML_ERROR_EVENT_EXIT_BOOL ( error, event, "Got %s instead of MAPPING_START in profiles.", mmd_yaml_get_event_name (event.type)); } while (!done) { YAML_PARSER_PARSE_WITH_EXIT_BOOL (parser, &event, error); switch (event.type) { case YAML_MAPPING_END_EVENT: done = TRUE; break; case YAML_SCALAR_EVENT: profile = modulemd_profile_parse_yaml ( parser, (const gchar *)event.data.scalar.value, strict, &nested_error); if (!profile) { g_propagate_error (error, g_steal_pointer (&nested_error)); return FALSE; } modulemd_module_stream_v1_add_profile (modulestream, profile); g_clear_pointer (&profile, g_object_unref); break; default: MMD_YAML_ERROR_EVENT_EXIT_BOOL ( error, event, "Unexpected YAML event in dependencies: %s", mmd_yaml_get_event_name (event.type)); break; } yaml_event_delete (&event); } return TRUE; } static gboolean modulemd_module_stream_v1_parse_rpm_components ( yaml_parser_t *parser, ModulemdModuleStreamV1 *modulestream, gboolean strict, GError **error); static gboolean modulemd_module_stream_v1_parse_module_components ( yaml_parser_t *parser, ModulemdModuleStreamV1 *modulestream, gboolean strict, GError **error); static gboolean modulemd_module_stream_v1_parse_components ( yaml_parser_t *parser, ModulemdModuleStreamV1 *modulestream, gboolean strict, GError **error) { MODULEMD_INIT_TRACE (); MMD_INIT_YAML_EVENT (event); gboolean done = FALSE; g_autoptr (GError) nested_error = NULL; g_return_val_if_fail (error == NULL || *error == NULL, FALSE); /* Process through the sequence */ /* We *must* get a MAPPING_START here */ YAML_PARSER_PARSE_WITH_EXIT_BOOL (parser, &event, error); if (event.type != YAML_MAPPING_START_EVENT) { MMD_YAML_ERROR_EVENT_EXIT_BOOL ( error, event, "Got %s instead of MAPPING_START in components.", mmd_yaml_get_event_name (event.type)); } while (!done) { YAML_PARSER_PARSE_WITH_EXIT_BOOL (parser, &event, error); switch (event.type) { case YAML_MAPPING_END_EVENT: done = TRUE; break; case YAML_SCALAR_EVENT: if (g_str_equal ((const gchar *)event.data.scalar.value, "rpms")) { if (!modulemd_module_stream_v1_parse_rpm_components ( parser, modulestream, strict, &nested_error)) { g_propagate_error (error, g_steal_pointer (&nested_error)); return FALSE; } } else if (g_str_equal ((const gchar *)event.data.scalar.value, "modules")) { if (!modulemd_module_stream_v1_parse_module_components ( parser, modulestream, strict, &nested_error)) { g_propagate_error (error, g_steal_pointer (&nested_error)); return FALSE; } } else { SKIP_UNKNOWN (parser, FALSE, "Unexpected key in components: %s", (const gchar *)event.data.scalar.value); break; } break; default: MMD_YAML_ERROR_EVENT_EXIT_BOOL ( error, event, "Unexpected YAML event in components: %s", mmd_yaml_get_event_name (event.type)); break; } yaml_event_delete (&event); } return TRUE; } static gboolean modulemd_module_stream_v1_parse_rpm_components ( yaml_parser_t *parser, ModulemdModuleStreamV1 *modulestream, gboolean strict, GError **error) { MODULEMD_INIT_TRACE (); MMD_INIT_YAML_EVENT (event); gboolean done = FALSE; g_autoptr (GError) nested_error = NULL; g_autoptr (ModulemdComponentRpm) component = NULL; g_return_val_if_fail (error == NULL || *error == NULL, FALSE); /* We *must* get a MAPPING_START here */ YAML_PARSER_PARSE_WITH_EXIT_BOOL (parser, &event, error); if (event.type != YAML_MAPPING_START_EVENT) { MMD_YAML_ERROR_EVENT_EXIT_BOOL ( error, event, "Got %s instead of MAPPING_START in rpm components.", mmd_yaml_get_event_name (event.type)); } while (!done) { YAML_PARSER_PARSE_WITH_EXIT_BOOL (parser, &event, error); switch (event.type) { case YAML_MAPPING_END_EVENT: done = TRUE; break; case YAML_SCALAR_EVENT: component = modulemd_component_rpm_parse_yaml ( parser, (const gchar *)event.data.scalar.value, strict, &nested_error); if (!component) { g_propagate_error (error, g_steal_pointer (&nested_error)); return FALSE; } modulemd_module_stream_v1_add_component ( modulestream, (ModulemdComponent *)component); g_clear_pointer (&component, g_object_unref); break; default: MMD_YAML_ERROR_EVENT_EXIT_BOOL ( error, event, "Unexpected YAML event in RPM component: %s", mmd_yaml_get_event_name (event.type)); break; } yaml_event_delete (&event); } return TRUE; } static gboolean modulemd_module_stream_v1_parse_module_components ( yaml_parser_t *parser, ModulemdModuleStreamV1 *modulestream, gboolean strict, GError **error) { MODULEMD_INIT_TRACE (); MMD_INIT_YAML_EVENT (event); gboolean done = FALSE; g_autoptr (GError) nested_error = NULL; g_autoptr (ModulemdComponentModule) component = NULL; g_return_val_if_fail (error == NULL || *error == NULL, FALSE); /* We *must* get a MAPPING_START here */ YAML_PARSER_PARSE_WITH_EXIT_BOOL (parser, &event, error); if (event.type != YAML_MAPPING_START_EVENT) { MMD_YAML_ERROR_EVENT_EXIT_BOOL ( error, event, "Got %s instead of MAPPING_START in module components.", mmd_yaml_get_event_name (event.type)); } while (!done) { YAML_PARSER_PARSE_WITH_EXIT_BOOL (parser, &event, error); switch (event.type) { case YAML_MAPPING_END_EVENT: done = TRUE; break; case YAML_SCALAR_EVENT: component = modulemd_component_module_parse_yaml ( parser, (const gchar *)event.data.scalar.value, strict, &nested_error); if (!component) { g_propagate_error (error, g_steal_pointer (&nested_error)); return FALSE; } modulemd_module_stream_v1_add_component ( modulestream, (ModulemdComponent *)component); g_clear_pointer (&component, g_object_unref); break; default: MMD_YAML_ERROR_EVENT_EXIT_BOOL ( error, event, "Unexpected YAML event in module component: %s", mmd_yaml_get_event_name (event.type)); break; } yaml_event_delete (&event); } return TRUE; } gboolean modulemd_module_stream_v1_emit_yaml (ModulemdModuleStreamV1 *self, yaml_emitter_t *emitter, GError **error) { MODULEMD_INIT_TRACE (); if (!modulemd_module_stream_emit_yaml_base ( MODULEMD_MODULE_STREAM (self), emitter, error)) { return FALSE; } EMIT_KEY_VALUE_STRING_IF_SET ( emitter, error, "arch", modulemd_module_stream_v1_get_arch (self)); EMIT_KEY_VALUE (emitter, error, "summary", self->summary); EMIT_KEY_VALUE_FULL (emitter, error, "description", self->description, YAML_FOLDED_SCALAR_STYLE); EMIT_HASHTABLE_VALUES_IF_NON_EMPTY (emitter, error, "servicelevels", self->servicelevels, modulemd_service_level_emit_yaml); if (!NON_EMPTY_TABLE (self->module_licenses)) { g_set_error (error, MODULEMD_YAML_ERROR, MMD_YAML_ERROR_EMIT, "Module licenses is not allowed to be empty"); return FALSE; } EMIT_SCALAR (emitter, error, "license"); EMIT_MAPPING_START (emitter, error); EMIT_STRING_SET (emitter, error, "module", self->module_licenses); EMIT_STRING_SET_IF_NON_EMPTY ( emitter, error, "content", self->content_licenses); EMIT_MAPPING_END (emitter, error); if (self->xmd != NULL) { EMIT_SCALAR (emitter, error, "xmd"); if (!modulemd_yaml_emit_variant (emitter, self->xmd, error)) { return FALSE; } } if (NON_EMPTY_TABLE (self->buildtime_deps) || NON_EMPTY_TABLE (self->runtime_deps)) { EMIT_SCALAR (emitter, error, "dependencies"); EMIT_MAPPING_START (emitter, error); EMIT_HASHTABLE_KEY_VALUES_IF_NON_EMPTY ( emitter, error, "buildrequires", self->buildtime_deps); EMIT_HASHTABLE_KEY_VALUES_IF_NON_EMPTY ( emitter, error, "requires", self->runtime_deps); EMIT_MAPPING_END (emitter, error); } if (self->community || self->documentation || self->tracker) { EMIT_SCALAR (emitter, error, "references"); EMIT_MAPPING_START (emitter, error); EMIT_KEY_VALUE_STRING_IF_SET ( emitter, error, "community", self->community); EMIT_KEY_VALUE_STRING_IF_SET ( emitter, error, "documentation", self->documentation); EMIT_KEY_VALUE_STRING_IF_SET (emitter, error, "tracker", self->tracker); EMIT_MAPPING_END (emitter, error); } EMIT_HASHTABLE_VALUES_IF_NON_EMPTY ( emitter, error, "profiles", self->profiles, modulemd_profile_emit_yaml); if (NON_EMPTY_TABLE (self->rpm_api)) { EMIT_SCALAR (emitter, error, "api"); EMIT_MAPPING_START (emitter, error); EMIT_STRING_SET (emitter, error, "rpms", self->rpm_api); EMIT_MAPPING_END (emitter, error); } if (NON_EMPTY_TABLE (self->rpm_filters)) { EMIT_SCALAR (emitter, error, "filter"); EMIT_MAPPING_START (emitter, error); EMIT_STRING_SET (emitter, error, "rpms", self->rpm_filters); EMIT_MAPPING_END (emitter, error); } if (self->buildopts != NULL) { EMIT_SCALAR (emitter, error, "buildopts"); EMIT_MAPPING_START (emitter, error); if (!modulemd_buildopts_emit_yaml (self->buildopts, emitter, error)) { return FALSE; } EMIT_MAPPING_END (emitter, error); } if (NON_EMPTY_TABLE (self->rpm_components) || NON_EMPTY_TABLE (self->module_components)) { EMIT_SCALAR (emitter, error, "components"); EMIT_MAPPING_START (emitter, error); EMIT_HASHTABLE_VALUES_IF_NON_EMPTY (emitter, error, "rpms", self->rpm_components, modulemd_component_rpm_emit_yaml); EMIT_HASHTABLE_VALUES_IF_NON_EMPTY (emitter, error, "modules", self->module_components, modulemd_component_module_emit_yaml); EMIT_MAPPING_END (emitter, error); } if (NON_EMPTY_TABLE (self->rpm_artifacts)) { EMIT_SCALAR (emitter, error, "artifacts"); EMIT_MAPPING_START (emitter, error); EMIT_STRING_SET (emitter, error, "rpms", self->rpm_artifacts); EMIT_MAPPING_END (emitter, error); } /* The "data" mapping */ EMIT_MAPPING_END (emitter, error); /* The overall document mapping */ EMIT_MAPPING_END (emitter, error); if (!mmd_emitter_end_document (emitter, error)) { return FALSE; } return TRUE; } fedora-modularity-libmodulemd-357799c/modulemd/modulemd-module-stream-v2.c000066400000000000000000002716531502446517500266400ustar00rootroot00000000000000/* * This file is part of libmodulemd * Copyright (C) 2018 Red Hat, Inc. * * Fedora-License-Identifier: MIT * SPDX-2.0-License-Identifier: MIT * SPDX-3.0-License-Identifier: MIT * * This program is free software. * For more information on the license, see COPYING. * For more information on free software, see . */ #include "modulemd-buildopts.h" #include "modulemd-component-module.h" #include "modulemd-component-rpm.h" #include "modulemd-component.h" #include "modulemd-errors.h" #include "modulemd-module-stream-v2.h" #include "modulemd-module-stream.h" #include "modulemd-profile.h" #include "modulemd-rpm-map-entry.h" #include "modulemd-service-level.h" #include "modulemd-translation-entry.h" #include "private/modulemd-buildopts-private.h" #include "private/modulemd-component-module-private.h" #include "private/modulemd-component-private.h" #include "private/modulemd-component-rpm-private.h" #include "private/modulemd-dependencies-private.h" #include "private/modulemd-module-stream-private.h" #include "private/modulemd-module-stream-v2-private.h" #include "private/modulemd-profile-private.h" #include "private/modulemd-rpm-map-entry-private.h" #include "private/modulemd-service-level-private.h" #include "private/modulemd-subdocument-info-private.h" #include "private/modulemd-util.h" #include "private/modulemd-yaml.h" G_DEFINE_TYPE (ModulemdModuleStreamV2, modulemd_module_stream_v2, MODULEMD_TYPE_MODULE_STREAM) enum { PROP_0, PROP_ARCH, PROP_BUILDOPTS, PROP_COMMUNITY, PROP_DOCUMENTATION, PROP_TRACKER, PROP_STATIC_CONTEXT, N_PROPS }; static GParamSpec *properties[N_PROPS]; ModulemdModuleStreamV2 * modulemd_module_stream_v2_new (const gchar *module_name, const gchar *module_stream) { // clang-format off return g_object_new (MODULEMD_TYPE_MODULE_STREAM_V2, "module-name", module_name, "stream-name", module_stream, NULL); // clang-format on } static void modulemd_module_stream_v2_finalize (GObject *object) { ModulemdModuleStreamV2 *self = MODULEMD_MODULE_STREAM_V2 (object); /* Properties */ g_clear_object (&self->buildopts); g_clear_pointer (&self->community, g_free); g_clear_pointer (&self->description, g_free); g_clear_pointer (&self->documentation, g_free); g_clear_pointer (&self->summary, g_free); g_clear_pointer (&self->tracker, g_free); /* Internal Data Structures */ g_clear_pointer (&self->module_components, g_hash_table_unref); g_clear_pointer (&self->rpm_components, g_hash_table_unref); g_clear_pointer (&self->content_licenses, g_hash_table_unref); g_clear_pointer (&self->module_licenses, g_hash_table_unref); g_clear_pointer (&self->profiles, g_hash_table_unref); g_clear_pointer (&self->rpm_api, g_hash_table_unref); g_clear_pointer (&self->rpm_artifacts, g_hash_table_unref); g_clear_pointer (&self->rpm_artifact_map, g_hash_table_unref); g_clear_pointer (&self->rpm_filters, g_hash_table_unref); g_clear_pointer (&self->demodularized_rpms, g_hash_table_unref); g_clear_pointer (&self->servicelevels, g_hash_table_unref); g_clear_pointer (&self->dependencies, g_ptr_array_unref); g_clear_pointer (&self->obsoletes, g_object_unref); g_clear_pointer (&self->xmd, g_variant_unref); G_OBJECT_CLASS (modulemd_module_stream_v2_parent_class)->finalize (object); } static gboolean modulemd_module_stream_v2_equals (ModulemdModuleStream *self_1, ModulemdModuleStream *self_2) { ModulemdModuleStreamV2 *v2_self_1 = NULL; ModulemdModuleStreamV2 *v2_self_2 = NULL; g_return_val_if_fail (MODULEMD_IS_MODULE_STREAM_V2 (self_1), FALSE); v2_self_1 = MODULEMD_MODULE_STREAM_V2 (self_1); g_return_val_if_fail (MODULEMD_IS_MODULE_STREAM_V2 (self_2), FALSE); v2_self_2 = MODULEMD_MODULE_STREAM_V2 (self_2); if (!MODULEMD_MODULE_STREAM_CLASS (modulemd_module_stream_v2_parent_class) ->equals (self_1, self_2)) { return FALSE; } /*Check property equality*/ if (g_strcmp0 (v2_self_1->community, v2_self_2->community) != 0) { return FALSE; } if (g_strcmp0 (v2_self_1->description, v2_self_2->description) != 0) { return FALSE; } if (g_strcmp0 (v2_self_1->documentation, v2_self_2->documentation) != 0) { return FALSE; } if (g_strcmp0 (v2_self_1->summary, v2_self_2->summary) != 0) { return FALSE; } if (g_strcmp0 (v2_self_1->tracker, v2_self_2->tracker) != 0) { return FALSE; } /* Test the negations of static_context just in case somehow they are * different non-zero values */ if (!v2_self_1->static_context != !v2_self_2->static_context) { return FALSE; } if (!modulemd_buildopts_equals (v2_self_1->buildopts, v2_self_2->buildopts)) { return FALSE; } if (!modulemd_hash_table_equals (v2_self_1->rpm_components, v2_self_2->rpm_components, modulemd_component_equals_wrapper)) { return FALSE; } if (!modulemd_hash_table_equals (v2_self_1->module_components, v2_self_2->module_components, modulemd_component_equals_wrapper)) { return FALSE; } if (!modulemd_hash_table_sets_are_equal (v2_self_1->module_licenses, v2_self_2->module_licenses)) { return FALSE; } if (!modulemd_hash_table_sets_are_equal (v2_self_1->content_licenses, v2_self_2->content_licenses)) { return FALSE; } if (!modulemd_hash_table_equals (v2_self_1->profiles, v2_self_2->profiles, modulemd_profile_equals_wrapper)) { return FALSE; } if (!modulemd_hash_table_sets_are_equal (v2_self_1->rpm_api, v2_self_2->rpm_api)) { return FALSE; } if (!modulemd_hash_table_sets_are_equal (v2_self_1->rpm_artifacts, v2_self_2->rpm_artifacts)) { return FALSE; } if (!modulemd_hash_table_sets_are_equal (v2_self_1->rpm_filters, v2_self_2->rpm_filters)) { return FALSE; } if (!modulemd_hash_table_sets_are_equal (v2_self_1->demodularized_rpms, v2_self_2->demodularized_rpms)) { return FALSE; } if (!modulemd_hash_table_equals (v2_self_1->servicelevels, v2_self_2->servicelevels, modulemd_service_level_equals_wrapper)) { return FALSE; } /* < string, GHashTable > */ if (!modulemd_hash_table_equals ( v2_self_1->rpm_artifact_map, v2_self_2->rpm_artifact_map, modulemd_RpmMapEntry_hash_table_equals_wrapper)) { return FALSE; } if (v2_self_1->dependencies->len != v2_self_2->dependencies->len) { return FALSE; } for (guint i = 0; i < v2_self_1->dependencies->len; i++) { /*Ordering is important for the dependencies, so that each array index must be the same.*/ if (!modulemd_dependencies_equals ( g_ptr_array_index (v2_self_1->dependencies, i), g_ptr_array_index (v2_self_2->dependencies, i))) { return FALSE; } } if (v2_self_1->xmd == NULL && v2_self_2->xmd == NULL) { return TRUE; } if (v2_self_1->xmd == NULL || v2_self_2->xmd == NULL) { return FALSE; } if (!g_variant_equal (v2_self_1->xmd, v2_self_2->xmd)) { return FALSE; } return TRUE; } static guint64 modulemd_module_stream_v2_get_mdversion (ModulemdModuleStream *UNUSED (self)) { return MD_MODULESTREAM_VERSION_TWO; } void modulemd_module_stream_v2_set_arch (ModulemdModuleStreamV2 *self, const gchar *arch) { g_return_if_fail (MODULEMD_IS_MODULE_STREAM_V2 (self)); modulemd_module_stream_set_arch (MODULEMD_MODULE_STREAM (self), arch); g_object_notify_by_pspec (G_OBJECT (self), properties[PROP_ARCH]); } const gchar * modulemd_module_stream_v2_get_arch (ModulemdModuleStreamV2 *self) { g_return_val_if_fail (MODULEMD_IS_MODULE_STREAM_V2 (self), NULL); return modulemd_module_stream_get_arch (MODULEMD_MODULE_STREAM (self)); } void modulemd_module_stream_v2_set_buildopts (ModulemdModuleStreamV2 *self, ModulemdBuildopts *buildopts) { g_return_if_fail (MODULEMD_IS_MODULE_STREAM_V2 (self)); g_clear_object (&self->buildopts); if (buildopts) { self->buildopts = modulemd_buildopts_copy (buildopts); } g_object_notify_by_pspec (G_OBJECT (self), properties[PROP_BUILDOPTS]); } ModulemdBuildopts * modulemd_module_stream_v2_get_buildopts (ModulemdModuleStreamV2 *self) { g_return_val_if_fail (MODULEMD_IS_MODULE_STREAM_V2 (self), NULL); return self->buildopts; } void modulemd_module_stream_v2_set_community (ModulemdModuleStreamV2 *self, const gchar *community) { g_return_if_fail (MODULEMD_IS_MODULE_STREAM_V2 (self)); g_clear_pointer (&self->community, g_free); self->community = g_strdup (community); g_object_notify_by_pspec (G_OBJECT (self), properties[PROP_COMMUNITY]); } const gchar * modulemd_module_stream_v2_get_community (ModulemdModuleStreamV2 *self) { g_return_val_if_fail (MODULEMD_IS_MODULE_STREAM_V2 (self), NULL); return self->community; } void modulemd_module_stream_v2_set_description (ModulemdModuleStreamV2 *self, const gchar *description) { g_return_if_fail (MODULEMD_IS_MODULE_STREAM_V2 (self)); g_clear_pointer (&self->description, g_free); self->description = g_strdup (description); } const gchar * modulemd_module_stream_v2_get_description (ModulemdModuleStreamV2 *self, const gchar *locale) { g_return_val_if_fail (MODULEMD_IS_MODULE_STREAM_V2 (self), NULL); ModulemdTranslationEntry *entry = modulemd_module_stream_get_translation_entry ( MODULEMD_MODULE_STREAM (self), locale); if (entry != NULL && modulemd_translation_entry_get_description (entry) != NULL) { return modulemd_translation_entry_get_description (entry); } return self->description; } void modulemd_module_stream_v2_set_documentation (ModulemdModuleStreamV2 *self, const gchar *documentation) { g_return_if_fail (MODULEMD_IS_MODULE_STREAM_V2 (self)); g_clear_pointer (&self->documentation, g_free); self->documentation = g_strdup (documentation); g_object_notify_by_pspec (G_OBJECT (self), properties[PROP_COMMUNITY]); } const gchar * modulemd_module_stream_v2_get_documentation (ModulemdModuleStreamV2 *self) { g_return_val_if_fail (MODULEMD_IS_MODULE_STREAM_V2 (self), NULL); return self->documentation; } void modulemd_module_stream_v2_set_summary (ModulemdModuleStreamV2 *self, const gchar *summary) { g_return_if_fail (MODULEMD_IS_MODULE_STREAM_V2 (self)); g_clear_pointer (&self->summary, g_free); self->summary = g_strdup (summary); } const gchar * modulemd_module_stream_v2_get_summary (ModulemdModuleStreamV2 *self, const gchar *locale) { g_return_val_if_fail (MODULEMD_IS_MODULE_STREAM_V2 (self), NULL); ModulemdTranslationEntry *entry = modulemd_module_stream_get_translation_entry ( MODULEMD_MODULE_STREAM (self), locale); if (entry != NULL && modulemd_translation_entry_get_summary (entry) != NULL) { return modulemd_translation_entry_get_summary (entry); } return self->summary; } void modulemd_module_stream_v2_set_tracker (ModulemdModuleStreamV2 *self, const gchar *tracker) { g_return_if_fail (MODULEMD_IS_MODULE_STREAM_V2 (self)); g_clear_pointer (&self->tracker, g_free); self->tracker = g_strdup (tracker); g_object_notify_by_pspec (G_OBJECT (self), properties[PROP_TRACKER]); } const gchar * modulemd_module_stream_v2_get_tracker (ModulemdModuleStreamV2 *self) { g_return_val_if_fail (MODULEMD_IS_MODULE_STREAM_V2 (self), NULL); return self->tracker; } ModulemdObsoletes * modulemd_module_stream_v2_get_obsoletes_resolved (ModulemdModuleStreamV2 *self) { g_return_val_if_fail (MODULEMD_IS_MODULE_STREAM_V2 (self), NULL); ModulemdObsoletes *o = self->obsoletes; if (o && modulemd_obsoletes_get_reset (o)) { return NULL; } return o; } void modulemd_module_stream_v2_associate_obsoletes (ModulemdModuleStreamV2 *self, ModulemdObsoletes *obsoletes) { g_return_if_fail (MODULEMD_IS_MODULE_STREAM_V2 (self)); g_clear_pointer (&self->obsoletes, g_object_unref); if (obsoletes != NULL) { self->obsoletes = g_object_ref (obsoletes); } } ModulemdObsoletes * modulemd_module_stream_v2_get_obsoletes (ModulemdModuleStreamV2 *self) { g_return_val_if_fail (MODULEMD_IS_MODULE_STREAM_V2 (self), NULL); return self->obsoletes; } /* ===== Non-property Methods ===== */ void modulemd_module_stream_v2_add_component (ModulemdModuleStreamV2 *self, ModulemdComponent *component) { GHashTable *table = NULL; /* Do nothing if we were passed a NULL component */ if (!component) { return; } g_return_if_fail (MODULEMD_IS_MODULE_STREAM_V2 (self)); g_return_if_fail (MODULEMD_IS_COMPONENT (component)); if (MODULEMD_IS_COMPONENT_RPM (component)) { table = self->rpm_components; } else if (MODULEMD_IS_COMPONENT_MODULE (component)) { table = self->module_components; } else { /* Unknown component. Raise a warning and return */ g_return_if_reached (); } /* Add the component to the table. This will replace an existing component * with the same name */ g_hash_table_replace (table, g_strdup (modulemd_component_get_key (component)), modulemd_component_copy (component, NULL)); } void modulemd_module_stream_v2_remove_module_component ( ModulemdModuleStreamV2 *self, const gchar *component_name) { /* Do nothing if we were passed a NULL component_name */ if (!component_name) { return; } g_return_if_fail (MODULEMD_IS_MODULE_STREAM_V2 (self)); g_hash_table_remove (self->module_components, component_name); } void modulemd_module_stream_v2_clear_module_components ( ModulemdModuleStreamV2 *self) { g_return_if_fail (MODULEMD_IS_MODULE_STREAM_V2 (self)); g_hash_table_remove_all (self->module_components); } void modulemd_module_stream_v2_remove_rpm_component (ModulemdModuleStreamV2 *self, const gchar *component_name) { /* Do nothing if we were passed a NULL component_name */ if (!component_name) { return; } g_return_if_fail (MODULEMD_IS_MODULE_STREAM_V2 (self)); g_hash_table_remove (self->rpm_components, component_name); } void modulemd_module_stream_v2_clear_rpm_components (ModulemdModuleStreamV2 *self) { g_return_if_fail (MODULEMD_IS_MODULE_STREAM_V2 (self)); g_hash_table_remove_all (self->rpm_components); } GStrv modulemd_module_stream_v2_get_module_component_names_as_strv ( ModulemdModuleStreamV2 *self) { g_return_val_if_fail (MODULEMD_IS_MODULE_STREAM_V2 (self), NULL); return modulemd_ordered_str_keys_as_strv (self->module_components); } GStrv modulemd_module_stream_v2_get_rpm_component_names_as_strv ( ModulemdModuleStreamV2 *self) { g_return_val_if_fail (MODULEMD_IS_MODULE_STREAM_V2 (self), NULL); return modulemd_ordered_str_keys_as_strv (self->rpm_components); } ModulemdComponentModule * modulemd_module_stream_v2_get_module_component (ModulemdModuleStreamV2 *self, const gchar *component_name) { g_return_val_if_fail (MODULEMD_IS_MODULE_STREAM_V2 (self), NULL); return g_hash_table_lookup (self->module_components, component_name); } ModulemdComponentRpm * modulemd_module_stream_v2_get_rpm_component (ModulemdModuleStreamV2 *self, const gchar *component_name) { g_return_val_if_fail (MODULEMD_IS_MODULE_STREAM_V2 (self), NULL); return g_hash_table_lookup (self->rpm_components, component_name); } void modulemd_module_stream_v2_add_content_license (ModulemdModuleStreamV2 *self, const gchar *license) { if (!license) { return; } g_return_if_fail (MODULEMD_IS_MODULE_STREAM_V2 (self)); g_hash_table_add (self->content_licenses, g_strdup (license)); } void modulemd_module_stream_v2_replace_content_licenses ( ModulemdModuleStreamV2 *self, GHashTable *set) { g_return_if_fail (MODULEMD_IS_MODULE_STREAM_V2 (self)); MODULEMD_REPLACE_SET (self->content_licenses, set); } void modulemd_module_stream_v2_add_module_license (ModulemdModuleStreamV2 *self, const gchar *license) { if (!license) { return; } g_return_if_fail (MODULEMD_IS_MODULE_STREAM_V2 (self)); g_hash_table_add (self->module_licenses, g_strdup (license)); } void modulemd_module_stream_v2_replace_module_licenses ( ModulemdModuleStreamV2 *self, GHashTable *set) { g_return_if_fail (MODULEMD_IS_MODULE_STREAM_V2 (self)); MODULEMD_REPLACE_SET (self->module_licenses, set); } void modulemd_module_stream_v2_remove_content_license (ModulemdModuleStreamV2 *self, const gchar *license) { if (!license) { return; } g_return_if_fail (MODULEMD_IS_MODULE_STREAM_V2 (self)); g_hash_table_remove (self->content_licenses, license); } void modulemd_module_stream_v2_remove_module_license (ModulemdModuleStreamV2 *self, const gchar *license) { if (!license) { return; } g_return_if_fail (MODULEMD_IS_MODULE_STREAM_V2 (self)); g_hash_table_remove (self->module_licenses, license); } void modulemd_module_stream_v2_clear_content_licenses (ModulemdModuleStreamV2 *self) { g_return_if_fail (MODULEMD_IS_MODULE_STREAM_V2 (self)); g_hash_table_remove_all (self->content_licenses); } void modulemd_module_stream_v2_clear_module_licenses (ModulemdModuleStreamV2 *self) { g_return_if_fail (MODULEMD_IS_MODULE_STREAM_V2 (self)); g_hash_table_remove_all (self->module_licenses); } GStrv modulemd_module_stream_v2_get_content_licenses_as_strv ( ModulemdModuleStreamV2 *self) { g_return_val_if_fail (MODULEMD_IS_MODULE_STREAM_V2 (self), NULL); return modulemd_ordered_str_keys_as_strv (self->content_licenses); } GStrv modulemd_module_stream_v2_get_module_licenses_as_strv ( ModulemdModuleStreamV2 *self) { g_return_val_if_fail (MODULEMD_IS_MODULE_STREAM_V2 (self), NULL); return modulemd_ordered_str_keys_as_strv (self->module_licenses); } void modulemd_module_stream_v2_add_profile (ModulemdModuleStreamV2 *self, ModulemdProfile *profile) { if (!profile) { return; } g_return_if_fail (MODULEMD_IS_MODULE_STREAM_V2 (self)); g_return_if_fail (MODULEMD_IS_PROFILE (profile)); ModulemdProfile *copied_profile = modulemd_profile_copy (profile); modulemd_profile_set_owner (copied_profile, MODULEMD_MODULE_STREAM (self)); g_hash_table_replace (self->profiles, g_strdup (modulemd_profile_get_name (profile)), copied_profile); } void modulemd_module_stream_v2_clear_profiles (ModulemdModuleStreamV2 *self) { g_return_if_fail (MODULEMD_IS_MODULE_STREAM_V2 (self)); g_hash_table_remove_all (self->profiles); } GStrv modulemd_module_stream_v2_get_profile_names_as_strv ( ModulemdModuleStreamV2 *self) { g_return_val_if_fail (MODULEMD_IS_MODULE_STREAM_V2 (self), NULL); return modulemd_ordered_str_keys_as_strv (self->profiles); } ModulemdProfile * modulemd_module_stream_v2_get_profile (ModulemdModuleStreamV2 *self, const gchar *profile_name) { g_return_val_if_fail (MODULEMD_IS_MODULE_STREAM_V2 (self), NULL); return g_hash_table_lookup (self->profiles, profile_name); } struct profile_match_ctx { GHashTable *profiles; GPtrArray *found; const gchar *pattern; }; static void profile_match (gpointer data, gpointer user_data) { struct profile_match_ctx *match_ctx = (struct profile_match_ctx *)user_data; /* Add it to the found list if it matches the pattern */ if (modulemd_fnmatch (match_ctx->pattern, (const gchar *)data)) { g_ptr_array_add (match_ctx->found, g_object_ref (g_hash_table_lookup ( match_ctx->profiles, (const gchar *)data))); } } GPtrArray * modulemd_module_stream_v2_search_profiles (ModulemdModuleStreamV2 *self, const gchar *profile_pattern) { /* The list of profiles will probably never be large, so we'll optimize for * the worst-case and preallocate the array to the number of profiles. */ GPtrArray *found = g_ptr_array_new_full (g_hash_table_size (self->profiles), g_object_unref); g_return_val_if_fail (MODULEMD_IS_MODULE_STREAM_V2 (self), found); g_autoptr (GPtrArray) profile_names = modulemd_ordered_str_keys (self->profiles, modulemd_strcmp_sort); struct profile_match_ctx match_ctx = { .profiles = self->profiles, .found = found, .pattern = profile_pattern }; g_ptr_array_foreach (profile_names, profile_match, &match_ctx); return found; } void modulemd_module_stream_v2_add_rpm_api (ModulemdModuleStreamV2 *self, const gchar *rpm) { if (!rpm) { return; } g_return_if_fail (MODULEMD_IS_MODULE_STREAM_V2 (self)); g_hash_table_add (self->rpm_api, g_strdup (rpm)); } void modulemd_module_stream_v2_replace_rpm_api (ModulemdModuleStreamV2 *self, GHashTable *set) { g_return_if_fail (MODULEMD_IS_MODULE_STREAM_V2 (self)); MODULEMD_REPLACE_SET (self->rpm_api, set); } void modulemd_module_stream_v2_remove_rpm_api (ModulemdModuleStreamV2 *self, const gchar *rpm) { if (!rpm) { return; } g_return_if_fail (MODULEMD_IS_MODULE_STREAM_V2 (self)); g_hash_table_remove (self->rpm_api, rpm); } void modulemd_module_stream_v2_clear_rpm_api (ModulemdModuleStreamV2 *self) { g_return_if_fail (MODULEMD_IS_MODULE_STREAM_V2 (self)); g_hash_table_remove_all (self->rpm_api); } GStrv modulemd_module_stream_v2_get_rpm_api_as_strv (ModulemdModuleStreamV2 *self) { g_return_val_if_fail (MODULEMD_IS_MODULE_STREAM_V2 (self), NULL); return modulemd_ordered_str_keys_as_strv (self->rpm_api); } void modulemd_module_stream_v2_add_rpm_artifact (ModulemdModuleStreamV2 *self, const gchar *nevr) { if (!nevr) { return; } g_return_if_fail (MODULEMD_IS_MODULE_STREAM_V2 (self)); g_hash_table_add (self->rpm_artifacts, g_strdup (nevr)); } void modulemd_module_stream_v2_replace_rpm_artifacts (ModulemdModuleStreamV2 *self, GHashTable *set) { g_return_if_fail (MODULEMD_IS_MODULE_STREAM_V2 (self)); MODULEMD_REPLACE_SET (self->rpm_artifacts, set); } void modulemd_module_stream_v2_remove_rpm_artifact (ModulemdModuleStreamV2 *self, const gchar *nevr) { if (!nevr) { return; } g_return_if_fail (MODULEMD_IS_MODULE_STREAM_V2 (self)); g_hash_table_remove (self->rpm_artifacts, nevr); } void modulemd_module_stream_v2_clear_rpm_artifacts (ModulemdModuleStreamV2 *self) { g_return_if_fail (MODULEMD_IS_MODULE_STREAM_V2 (self)); g_hash_table_remove_all (self->rpm_artifacts); } GStrv modulemd_module_stream_v2_get_rpm_artifacts_as_strv ( ModulemdModuleStreamV2 *self) { g_return_val_if_fail (MODULEMD_IS_MODULE_STREAM_V2 (self), NULL); return modulemd_ordered_str_keys_as_strv (self->rpm_artifacts); } static GHashTable * get_or_create_digest_table (ModulemdModuleStreamV2 *self, const gchar *digest) { GHashTable *digest_table = g_hash_table_lookup (self->rpm_artifact_map, digest); if (digest_table == NULL) { digest_table = g_hash_table_new_full ( g_str_hash, g_str_equal, g_free, g_object_unref); g_hash_table_insert ( self->rpm_artifact_map, g_strdup (digest), digest_table); } return digest_table; } void modulemd_module_stream_v2_set_rpm_artifact_map_entry ( ModulemdModuleStreamV2 *self, ModulemdRpmMapEntry *entry, const gchar *digest, const gchar *checksum) { GHashTable *digest_table = NULL; g_return_if_fail (MODULEMD_IS_MODULE_STREAM_V2 (self)); g_return_if_fail (entry && digest && checksum); digest_table = get_or_create_digest_table (self, digest); g_hash_table_insert ( digest_table, g_strdup (checksum), modulemd_rpm_map_entry_copy (entry)); } ModulemdRpmMapEntry * modulemd_module_stream_v2_get_rpm_artifact_map_entry ( ModulemdModuleStreamV2 *self, const gchar *digest, const gchar *checksum) { GHashTable *digest_table = NULL; g_return_val_if_fail (MODULEMD_IS_MODULE_STREAM_V2 (self), NULL); g_return_val_if_fail (digest && checksum, NULL); digest_table = g_hash_table_lookup (self->rpm_artifact_map, digest); if (!digest_table) { return NULL; } return g_hash_table_lookup (digest_table, checksum); } void modulemd_module_stream_v2_add_rpm_filter (ModulemdModuleStreamV2 *self, const gchar *rpm) { if (!rpm) { return; } g_return_if_fail (MODULEMD_IS_MODULE_STREAM_V2 (self)); g_hash_table_add (self->rpm_filters, g_strdup (rpm)); } void modulemd_module_stream_v2_replace_rpm_filters (ModulemdModuleStreamV2 *self, GHashTable *set) { g_return_if_fail (MODULEMD_IS_MODULE_STREAM_V2 (self)); MODULEMD_REPLACE_SET (self->rpm_filters, set); } void modulemd_module_stream_v2_remove_rpm_filter (ModulemdModuleStreamV2 *self, const gchar *rpm) { if (!rpm) { return; } g_return_if_fail (MODULEMD_IS_MODULE_STREAM_V2 (self)); g_hash_table_remove (self->rpm_filters, rpm); } void modulemd_module_stream_v2_clear_rpm_filters (ModulemdModuleStreamV2 *self) { g_return_if_fail (MODULEMD_IS_MODULE_STREAM_V2 (self)); g_hash_table_remove_all (self->rpm_filters); } GStrv modulemd_module_stream_v2_get_rpm_filters_as_strv ( ModulemdModuleStreamV2 *self) { g_return_val_if_fail (MODULEMD_IS_MODULE_STREAM_V2 (self), NULL); return modulemd_ordered_str_keys_as_strv (self->rpm_filters); } void modulemd_module_stream_v2_add_demodularized_rpm (ModulemdModuleStreamV2 *self, const gchar *rpm) { if (!rpm) { return; } g_return_if_fail (MODULEMD_IS_MODULE_STREAM_V2 (self)); g_hash_table_add (self->demodularized_rpms, g_strdup (rpm)); } void modulemd_module_stream_v2_replace_demodularized_rpms ( ModulemdModuleStreamV2 *self, GHashTable *set) { g_return_if_fail (MODULEMD_IS_MODULE_STREAM_V2 (self)); MODULEMD_REPLACE_SET (self->demodularized_rpms, set); } void modulemd_module_stream_v2_remove_demodularized_rpm ( ModulemdModuleStreamV2 *self, const gchar *rpm) { if (!rpm) { return; } g_return_if_fail (MODULEMD_IS_MODULE_STREAM_V2 (self)); g_hash_table_remove (self->demodularized_rpms, rpm); } void modulemd_module_stream_v2_clear_demodularized_rpms ( ModulemdModuleStreamV2 *self) { g_return_if_fail (MODULEMD_IS_MODULE_STREAM_V2 (self)); g_hash_table_remove_all (self->demodularized_rpms); } GStrv modulemd_module_stream_v2_get_demodularized_rpms (ModulemdModuleStreamV2 *self) { g_return_val_if_fail (MODULEMD_IS_MODULE_STREAM_V2 (self), NULL); return modulemd_ordered_str_keys_as_strv (self->demodularized_rpms); } void modulemd_module_stream_v2_add_servicelevel (ModulemdModuleStreamV2 *self, ModulemdServiceLevel *servicelevel) { if (!servicelevel) { return; } g_return_if_fail (MODULEMD_IS_MODULE_STREAM_V2 (self)); g_return_if_fail (MODULEMD_IS_SERVICE_LEVEL (servicelevel)); g_hash_table_replace ( self->servicelevels, g_strdup (modulemd_service_level_get_name (servicelevel)), modulemd_service_level_copy (servicelevel)); } void modulemd_module_stream_v2_clear_servicelevels (ModulemdModuleStreamV2 *self) { g_return_if_fail (MODULEMD_IS_MODULE_STREAM_V2 (self)); g_hash_table_remove_all (self->servicelevels); } GStrv modulemd_module_stream_v2_get_servicelevel_names_as_strv ( ModulemdModuleStreamV2 *self) { g_return_val_if_fail (MODULEMD_IS_MODULE_STREAM_V2 (self), NULL); return modulemd_ordered_str_keys_as_strv (self->servicelevels); } ModulemdServiceLevel * modulemd_module_stream_v2_get_servicelevel (ModulemdModuleStreamV2 *self, const gchar *servicelevel_name) { g_return_val_if_fail (MODULEMD_IS_MODULE_STREAM_V2 (self), NULL); return g_hash_table_lookup (self->servicelevels, servicelevel_name); } void modulemd_module_stream_v2_add_dependencies (ModulemdModuleStreamV2 *self, ModulemdDependencies *deps) { g_return_if_fail (MODULEMD_IS_MODULE_STREAM_V2 (self)); g_ptr_array_add (self->dependencies, modulemd_dependencies_copy (deps)); } void modulemd_module_stream_v2_replace_dependencies (ModulemdModuleStreamV2 *self, GPtrArray *array) { gsize i; g_return_if_fail (MODULEMD_IS_MODULE_STREAM_V2 (self)); for (i = 0; i < array->len; i++) { modulemd_module_stream_v2_add_dependencies ( self, g_ptr_array_index (array, i)); } } void modulemd_module_stream_v2_clear_dependencies (ModulemdModuleStreamV2 *self) { g_return_if_fail (MODULEMD_IS_MODULE_STREAM_V2 (self)); g_ptr_array_set_size (self->dependencies, 0); } static gboolean dep_equal_wrapper (gconstpointer a, gconstpointer b) { return modulemd_dependencies_equals ((ModulemdDependencies *)a, (ModulemdDependencies *)b); } void modulemd_module_stream_v2_remove_dependencies (ModulemdModuleStreamV2 *self, ModulemdDependencies *deps) { guint index; g_return_if_fail (MODULEMD_IS_MODULE_STREAM_V2 (self)); while (g_ptr_array_find_with_equal_func ( self->dependencies, deps, dep_equal_wrapper, &index)) { g_ptr_array_remove_index (self->dependencies, index); } } GPtrArray * modulemd_module_stream_v2_get_dependencies (ModulemdModuleStreamV2 *self) { g_return_val_if_fail (MODULEMD_IS_MODULE_STREAM_V2 (self), NULL); return self->dependencies; } void modulemd_module_stream_v2_set_xmd (ModulemdModuleStreamV2 *self, GVariant *xmd) { g_return_if_fail (MODULEMD_IS_MODULE_STREAM_V2 (self)); /* Do nothing if we were passed the same pointer */ if (self->xmd == xmd) { return; } g_clear_pointer (&self->xmd, g_variant_unref); self->xmd = modulemd_variant_deep_copy (xmd); } GVariant * modulemd_module_stream_v2_get_xmd (ModulemdModuleStreamV2 *self) { g_return_val_if_fail (MODULEMD_IS_MODULE_STREAM_V2 (self), NULL); return self->xmd; } void modulemd_module_stream_v2_clear_xmd (ModulemdModuleStreamV2 *self) { g_return_if_fail (MODULEMD_IS_MODULE_STREAM_V2 (self)); g_clear_pointer (&self->xmd, g_variant_unref); } gboolean modulemd_module_stream_v2_includes_nevra (ModulemdModuleStreamV2 *self, const gchar *nevra_pattern) { /* If g_hash_table_find() returns non-NULL, the nevra was found in this * module stream, so return TRUE */ return !!g_hash_table_find ( self->rpm_artifacts, modulemd_rpm_match, (void *)nevra_pattern); } void modulemd_module_stream_v2_set_static_context (ModulemdModuleStreamV2 *self) { self->static_context = TRUE; g_object_notify_by_pspec (G_OBJECT (self), properties[PROP_STATIC_CONTEXT]); } void modulemd_module_stream_v2_unset_static_context (ModulemdModuleStreamV2 *self) { self->static_context = FALSE; g_object_notify_by_pspec (G_OBJECT (self), properties[PROP_STATIC_CONTEXT]); } gboolean modulemd_module_stream_v2_is_static_context (ModulemdModuleStreamV2 *self) { return self->static_context; } static gboolean modulemd_module_stream_v2_validate_context (const gchar *context, GError **error) { /* must be string of up to MODULEMD_MODULE_STREAM_V2_MAXCONTEXTLEN [a-zA-Z0-9_] */ if (context == NULL || *context == '\0') { g_set_error ( error, MODULEMD_ERROR, MMD_ERROR_VALIDATE, "Empty stream context"); return FALSE; } if (strlen (context) > MODULEMD_MODULE_STREAM_V2_MAXCONTEXTLEN) { g_set_error (error, MODULEMD_ERROR, MMD_ERROR_VALIDATE, "Stream context '%s' exceeds maximum length (%d)", context, MODULEMD_MODULE_STREAM_V2_MAXCONTEXTLEN); return FALSE; } for (const gchar *i = context; *i != '\0'; i++) { if (!g_ascii_isalnum (*i) && *i != '_') { g_set_error ( error, MODULEMD_ERROR, MMD_ERROR_VALIDATE, "Stream context '%s' can only contain [a-zA-Z0-9_] characters", context); return FALSE; } } return TRUE; } static gboolean modulemd_module_stream_v2_validate (ModulemdModuleStream *self, GError **error) { GHashTableIter iter; gpointer key; gpointer value; gchar *nevra = NULL; ModulemdModuleStreamV2 *v2_self = NULL; ModulemdDependencies *deps = NULL; g_autoptr (GError) nested_error = NULL; g_auto (GStrv) buildopts_arches = NULL; const gchar *context = NULL; g_return_val_if_fail (MODULEMD_IS_MODULE_STREAM_V2 (self), FALSE); v2_self = MODULEMD_MODULE_STREAM_V2 (self); if (!MODULEMD_MODULE_STREAM_CLASS (modulemd_module_stream_v2_parent_class) ->validate (self, error)) { return FALSE; } /* Validate static context if present */ if (v2_self->static_context) { context = modulemd_module_stream_get_context (MODULEMD_MODULE_STREAM (self)); if (context) { if (!modulemd_module_stream_v2_validate_context (context, &nested_error)) { g_propagate_error (error, g_steal_pointer (&nested_error)); return FALSE; } } } /* Make sure that mandatory fields are present */ if (!modulemd_module_stream_v2_get_summary (v2_self, "C")) { g_set_error (error, MODULEMD_YAML_ERROR, MMD_YAML_ERROR_MISSING_REQUIRED, "Summary is missing"); return FALSE; } if (!modulemd_module_stream_v2_get_description (v2_self, "C")) { g_set_error (error, MODULEMD_YAML_ERROR, MMD_YAML_ERROR_MISSING_REQUIRED, "Description is missing"); return FALSE; } if (!g_hash_table_size (v2_self->module_licenses)) { g_set_error (error, MODULEMD_YAML_ERROR, MMD_YAML_ERROR_MISSING_REQUIRED, "Module license is missing"); return FALSE; } /* Verify that the components are consistent with regards to buildorder and * buildafter values. */ if (!modulemd_module_stream_validate_components (v2_self->rpm_components, &nested_error)) { g_propagate_error (error, g_steal_pointer (&nested_error)); return FALSE; } if (v2_self->buildopts != NULL) { /* Verify that the component rpm arches are consistent with any module * level arches. */ buildopts_arches = modulemd_buildopts_get_arches_as_strv (v2_self->buildopts); if (!modulemd_module_stream_validate_component_rpm_arches ( v2_self->rpm_components, buildopts_arches, &nested_error)) { g_propagate_error (error, g_steal_pointer (&nested_error)); return FALSE; } } /* Iterate through the artifacts and validate that they are in the proper * NEVRA format */ g_hash_table_iter_init (&iter, v2_self->rpm_artifacts); while (g_hash_table_iter_next (&iter, &key, &value)) { nevra = (gchar *)key; if (!modulemd_validate_nevra (nevra)) { g_set_error (error, MODULEMD_ERROR, MMD_ERROR_VALIDATE, "Artifact '%s' was not in valid N-E:V-R.A format.", nevra); return FALSE; } } /* Iterate through the Dependencies and validate them */ for (guint i = 0; i < v2_self->dependencies->len; i++) { deps = MODULEMD_DEPENDENCIES (g_ptr_array_index (v2_self->dependencies, i)); if (!modulemd_dependencies_validate (deps, &nested_error)) { g_propagate_prefixed_error (error, g_steal_pointer (&nested_error), "Dependency failed to validate: "); return FALSE; } } return TRUE; } static void modulemd_module_stream_v2_get_property (GObject *object, guint prop_id, GValue *value, GParamSpec *pspec) { ModulemdModuleStreamV2 *self = MODULEMD_MODULE_STREAM_V2 (object); switch (prop_id) { case PROP_ARCH: g_value_set_string (value, modulemd_module_stream_v2_get_arch (self)); break; case PROP_BUILDOPTS: g_value_set_object (value, modulemd_module_stream_v2_get_buildopts (self)); break; case PROP_COMMUNITY: g_value_set_string (value, modulemd_module_stream_v2_get_community (self)); break; case PROP_DOCUMENTATION: g_value_set_string (value, modulemd_module_stream_v2_get_documentation (self)); break; case PROP_TRACKER: g_value_set_string (value, modulemd_module_stream_v2_get_tracker (self)); break; case PROP_STATIC_CONTEXT: g_value_set_boolean (value, modulemd_module_stream_v2_is_static_context (self)); break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); } } static void modulemd_module_stream_v2_set_property (GObject *object, guint prop_id, const GValue *value, GParamSpec *pspec) { ModulemdModuleStreamV2 *self = MODULEMD_MODULE_STREAM_V2 (object); switch (prop_id) { case PROP_ARCH: modulemd_module_stream_v2_set_arch (self, g_value_get_string (value)); break; case PROP_BUILDOPTS: modulemd_module_stream_v2_set_buildopts (self, g_value_get_object (value)); break; case PROP_COMMUNITY: modulemd_module_stream_v2_set_community (self, g_value_get_string (value)); break; case PROP_DOCUMENTATION: modulemd_module_stream_v2_set_documentation (self, g_value_get_string (value)); break; case PROP_TRACKER: modulemd_module_stream_v2_set_tracker (self, g_value_get_string (value)); break; case PROP_STATIC_CONTEXT: if (g_value_get_boolean (value)) { modulemd_module_stream_v2_set_static_context (self); } else { modulemd_module_stream_v2_unset_static_context (self); } break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); } } static void copy_rpm_artifact_map (ModulemdModuleStreamV2 *from, ModulemdModuleStreamV2 *to) { GHashTableIter outer; GHashTableIter inner; gpointer outer_key; gpointer outer_value; gpointer inner_key; gpointer inner_value; GHashTable *to_digest_table = NULL; g_return_if_fail (MODULEMD_IS_MODULE_STREAM_V2 (from)); g_return_if_fail (MODULEMD_IS_MODULE_STREAM_V2 (to)); g_hash_table_iter_init (&outer, from->rpm_artifact_map); while (g_hash_table_iter_next (&outer, &outer_key, &outer_value)) { to_digest_table = get_or_create_digest_table (to, outer_key); g_hash_table_iter_init (&inner, (GHashTable *)outer_value); while (g_hash_table_iter_next (&inner, &inner_key, &inner_value)) { g_hash_table_insert (to_digest_table, g_strdup (inner_key), modulemd_rpm_map_entry_copy (inner_value)); } } } static ModulemdModuleStream * modulemd_module_stream_v2_copy (ModulemdModuleStream *self, const gchar *module_name, const gchar *module_stream) { ModulemdModuleStreamV2 *v2_self = NULL; g_autoptr (ModulemdModuleStreamV2) copy = NULL; g_return_val_if_fail (MODULEMD_IS_MODULE_STREAM_V2 (self), NULL); v2_self = MODULEMD_MODULE_STREAM_V2 (self); copy = MODULEMD_MODULE_STREAM_V2 ( MODULEMD_MODULE_STREAM_CLASS (modulemd_module_stream_v2_parent_class) ->copy (self, module_name, module_stream)); /* Properties */ STREAM_COPY_IF_SET (v2, copy, v2_self, arch); STREAM_COPY_IF_SET (v2, copy, v2_self, buildopts); STREAM_COPY_IF_SET (v2, copy, v2_self, community); STREAM_COPY_IF_SET_WITH_LOCALE (v2, copy, v2_self, description); STREAM_COPY_IF_SET (v2, copy, v2_self, documentation); STREAM_COPY_IF_SET_WITH_LOCALE (v2, copy, v2_self, summary); STREAM_COPY_IF_SET (v2, copy, v2_self, tracker); copy->static_context = v2_self->static_context; /* Internal Data Structures: With replace function */ STREAM_REPLACE_HASHTABLE (v2, copy, v2_self, content_licenses); STREAM_REPLACE_HASHTABLE (v2, copy, v2_self, module_licenses); STREAM_REPLACE_HASHTABLE (v2, copy, v2_self, rpm_api); STREAM_REPLACE_HASHTABLE (v2, copy, v2_self, rpm_artifacts); STREAM_REPLACE_HASHTABLE (v2, copy, v2_self, rpm_filters); STREAM_REPLACE_HASHTABLE (v2, copy, v2_self, demodularized_rpms); /* Internal Data Structures: With add on value */ COPY_HASHTABLE_BY_VALUE_ADDER ( copy, v2_self, rpm_components, modulemd_module_stream_v2_add_component); COPY_HASHTABLE_BY_VALUE_ADDER ( copy, v2_self, module_components, modulemd_module_stream_v2_add_component); COPY_HASHTABLE_BY_VALUE_ADDER ( copy, v2_self, profiles, modulemd_module_stream_v2_add_profile); COPY_HASHTABLE_BY_VALUE_ADDER ( copy, v2_self, servicelevels, modulemd_module_stream_v2_add_servicelevel); STREAM_REPLACE_HASHTABLE (v2, copy, v2_self, dependencies); copy_rpm_artifact_map (v2_self, copy); STREAM_COPY_IF_SET (v2, copy, v2_self, xmd); modulemd_module_stream_v2_associate_obsoletes ( copy, modulemd_module_stream_v2_get_obsoletes (v2_self)); return MODULEMD_MODULE_STREAM (g_steal_pointer (©)); } static gboolean depends_on_stream (ModulemdModuleStreamV2 *self, const gchar *module_name, const gchar *stream_name, gboolean is_builddep) { ModulemdDependencies *dep = NULL; /* Iterate through all of the dependency objects */ for (guint i = 0; i < self->dependencies->len; i++) { dep = g_ptr_array_index (self->dependencies, i); if (is_builddep) { if (modulemd_dependencies_buildrequires_module_and_stream ( dep, module_name, stream_name)) { return TRUE; } } else { if (modulemd_dependencies_requires_module_and_stream ( dep, module_name, stream_name)) { return TRUE; } } } return FALSE; } static gboolean modulemd_module_stream_v2_depends_on_stream (ModulemdModuleStream *self, const gchar *module_name, const gchar *stream_name) { g_return_val_if_fail (MODULEMD_IS_MODULE_STREAM_V2 (self), FALSE); g_return_val_if_fail (module_name && stream_name, FALSE); return depends_on_stream ( MODULEMD_MODULE_STREAM_V2 (self), module_name, stream_name, FALSE); } static gboolean modulemd_module_stream_v2_build_depends_on_stream (ModulemdModuleStream *self, const gchar *module_name, const gchar *stream_name) { g_return_val_if_fail (MODULEMD_IS_MODULE_STREAM_V2 (self), FALSE); g_return_val_if_fail (module_name && stream_name, FALSE); return depends_on_stream ( MODULEMD_MODULE_STREAM_V2 (self), module_name, stream_name, TRUE); } static void modulemd_module_stream_v2_class_init (ModulemdModuleStreamV2Class *klass) { GObjectClass *object_class = G_OBJECT_CLASS (klass); ModulemdModuleStreamClass *stream_class = MODULEMD_MODULE_STREAM_CLASS (object_class); object_class->finalize = modulemd_module_stream_v2_finalize; object_class->get_property = modulemd_module_stream_v2_get_property; object_class->set_property = modulemd_module_stream_v2_set_property; stream_class->get_mdversion = modulemd_module_stream_v2_get_mdversion; stream_class->copy = modulemd_module_stream_v2_copy; stream_class->equals = modulemd_module_stream_v2_equals; stream_class->validate = modulemd_module_stream_v2_validate; stream_class->depends_on_stream = modulemd_module_stream_v2_depends_on_stream; stream_class->build_depends_on_stream = modulemd_module_stream_v2_build_depends_on_stream; properties[PROP_ARCH] = g_param_spec_string ( "arch", "Module Artifact Architecture", "The architecture of the produced artifacts", NULL, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS | G_PARAM_CONSTRUCT); properties[PROP_BUILDOPTS] = g_param_spec_object ("buildopts", "Module Build Options", "Build options for module components", MODULEMD_TYPE_BUILDOPTS, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS); properties[PROP_COMMUNITY] = g_param_spec_string ( "community", "Module Community Website", "The website address of the upstream community for this module", NULL, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS | G_PARAM_CONSTRUCT); properties[PROP_DOCUMENTATION] = g_param_spec_string ( "documentation", "Module Documentation Website", "The website address of the upstream documentation for this module", NULL, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS | G_PARAM_CONSTRUCT); properties[PROP_TRACKER] = g_param_spec_string ( "tracker", "Module Bug Tracker Website", "The website address of the upstream bug tracker for this module", NULL, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS | G_PARAM_CONSTRUCT); properties[PROP_STATIC_CONTEXT] = g_param_spec_boolean ("static-context", "Static Context", "Whether the context is static", 0, G_PARAM_READWRITE | G_PARAM_CONSTRUCT); g_object_class_install_properties (object_class, N_PROPS, properties); } static void modulemd_module_stream_v2_init (ModulemdModuleStreamV2 *self) { /* Properties */ /* Internal Data Structures */ self->module_components = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, g_object_unref); self->rpm_components = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, g_object_unref); self->content_licenses = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, NULL); self->module_licenses = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, NULL); self->profiles = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, g_object_unref); self->rpm_api = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, NULL); self->rpm_artifacts = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, NULL); self->rpm_artifact_map = g_hash_table_new_full ( g_str_hash, g_str_equal, g_free, modulemd_hash_table_unref); self->rpm_filters = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, NULL); self->demodularized_rpms = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, NULL); self->servicelevels = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, g_object_unref); /* The common case is for a single entry, so we'll optimize for that when * preallocating */ self->dependencies = g_ptr_array_new_full (1, g_object_unref); } static gboolean modulemd_module_stream_v2_parse_licenses (yaml_parser_t *parser, ModulemdModuleStreamV2 *modulestream, gboolean strict, gboolean only_packager, GError **error); static gboolean modulemd_module_stream_v2_parse_servicelevels ( yaml_parser_t *parser, ModulemdModuleStreamV2 *modulestream, gboolean strict, GError **error); static gboolean modulemd_module_stream_v2_parse_deps (yaml_parser_t *parser, ModulemdModuleStreamV2 *modulestream, gboolean strict, GError **error); static gboolean modulemd_module_stream_v2_parse_refs (yaml_parser_t *parser, ModulemdModuleStreamV2 *modulestream, gboolean strict, GError **error); static gboolean modulemd_module_stream_v2_parse_profiles (yaml_parser_t *parser, ModulemdModuleStreamV2 *modulestream, gboolean strict, GError **error); static gboolean modulemd_module_stream_v2_parse_components ( yaml_parser_t *parser, ModulemdModuleStreamV2 *modulestream, gboolean strict, GError **error); static gboolean modulemd_module_stream_v2_parse_artifacts ( yaml_parser_t *parser, ModulemdModuleStreamV2 *modulestream, gboolean strict, GError **error); ModulemdModuleStreamV2 * modulemd_module_stream_v2_parse_yaml (ModulemdSubdocumentInfo *subdoc, gboolean strict, gboolean only_packager, GError **error) { MODULEMD_INIT_TRACE (); MMD_INIT_YAML_PARSER (parser); MMD_INIT_YAML_EVENT (event); gboolean done = FALSE; g_autoptr (GError) nested_error = NULL; g_autoptr (ModulemdModuleStreamV2) modulestream = NULL; g_autoptr (GHashTable) set = NULL; g_autoptr (ModulemdBuildopts) buildopts = NULL; g_autoptr (GVariant) xmd = NULL; guint64 version; gboolean static_context; if (!modulemd_subdocument_info_get_data_parser ( subdoc, &parser, strict, error)) { return FALSE; } g_return_val_if_fail (error == NULL || *error == NULL, FALSE); modulestream = modulemd_module_stream_v2_new (NULL, NULL); /* Read the MAPPING_START */ YAML_PARSER_PARSE_WITH_EXIT (&parser, &event, error); if (event.type != YAML_MAPPING_START_EVENT) { MMD_YAML_ERROR_EVENT_EXIT ( error, event, "Data section did not begin with a map."); } /* Process through the mapping */ while (!done) { YAML_PARSER_PARSE_WITH_EXIT (&parser, &event, error); switch (event.type) { case YAML_MAPPING_END_EVENT: done = TRUE; break; case YAML_SCALAR_EVENT: /* Mapping Keys */ /* Module Name */ if (g_str_equal ((const gchar *)event.data.scalar.value, "name") && !only_packager) { MMD_SET_PARSED_YAML_STRING ( &parser, error, modulemd_module_stream_set_module_name, MODULEMD_MODULE_STREAM (modulestream)); } /* Module Stream Name */ else if (g_str_equal ((const gchar *)event.data.scalar.value, "stream") && !only_packager) { MMD_SET_PARSED_YAML_STRING ( &parser, error, modulemd_module_stream_set_stream_name, MODULEMD_MODULE_STREAM (modulestream)); } /* Module Version */ else if (g_str_equal ((const gchar *)event.data.scalar.value, "version") && !only_packager) { version = modulemd_yaml_parse_uint64 (&parser, &nested_error); if (nested_error) { g_propagate_error (error, g_steal_pointer (&nested_error)); return NULL; } modulemd_module_stream_set_version ( MODULEMD_MODULE_STREAM (modulestream), version); } /* Module Context */ else if (g_str_equal ((const gchar *)event.data.scalar.value, "context") && !only_packager) { MMD_SET_PARSED_YAML_STRING ( &parser, error, modulemd_module_stream_set_context, MODULEMD_MODULE_STREAM (modulestream)); } else if (g_str_equal ((const gchar *)event.data.scalar.value, "static_context")) { static_context = modulemd_yaml_parse_bool (&parser, &nested_error); if (nested_error) { g_propagate_error (error, g_steal_pointer (&nested_error)); return NULL; } if (static_context) { modulemd_module_stream_v2_set_static_context (modulestream); } else { modulemd_module_stream_v2_unset_static_context ( modulestream); } } /* Module Artifact Architecture */ else if (g_str_equal ((const gchar *)event.data.scalar.value, "arch") && !only_packager) { MMD_SET_PARSED_YAML_STRING (&parser, error, modulemd_module_stream_v2_set_arch, modulestream); } /* Module Summary */ else if (g_str_equal ((const gchar *)event.data.scalar.value, "summary")) { MMD_SET_PARSED_YAML_STRING ( &parser, error, modulemd_module_stream_v2_set_summary, modulestream); } /* Module Description */ else if (g_str_equal ((const gchar *)event.data.scalar.value, "description")) { MMD_SET_PARSED_YAML_STRING ( &parser, error, modulemd_module_stream_v2_set_description, modulestream); } /* Service Levels */ else if (g_str_equal ((const gchar *)event.data.scalar.value, "servicelevels") && !only_packager) { if (!modulemd_module_stream_v2_parse_servicelevels ( &parser, modulestream, strict, &nested_error)) { g_propagate_error (error, g_steal_pointer (&nested_error)); return NULL; } } /* Licences */ else if (g_str_equal ((const gchar *)event.data.scalar.value, "license")) { if (!modulemd_module_stream_v2_parse_licenses (&parser, modulestream, strict, only_packager, &nested_error)) { g_propagate_error (error, g_steal_pointer (&nested_error)); return NULL; } } /* Extensible Metadata */ else if (g_str_equal ((const gchar *)event.data.scalar.value, "xmd") && !only_packager) { xmd = mmd_parse_xmd (&parser, &nested_error); if (!xmd) { g_propagate_error (error, g_steal_pointer (&nested_error)); return NULL; } modulemd_module_stream_v2_set_xmd (modulestream, xmd); g_clear_pointer (&xmd, g_variant_unref); } /* Dependencies */ else if (g_str_equal ((const gchar *)event.data.scalar.value, "dependencies")) { if (!modulemd_module_stream_v2_parse_deps ( &parser, modulestream, strict, &nested_error)) { g_propagate_error (error, g_steal_pointer (&nested_error)); return NULL; } } /* References */ else if (g_str_equal ((const gchar *)event.data.scalar.value, "references")) { if (!modulemd_module_stream_v2_parse_refs ( &parser, modulestream, strict, &nested_error)) { g_propagate_error (error, g_steal_pointer (&nested_error)); return NULL; } } /* Profiles */ else if (g_str_equal ((const gchar *)event.data.scalar.value, "profiles")) { if (!modulemd_module_stream_v2_parse_profiles ( &parser, modulestream, strict, &nested_error)) { g_propagate_error (error, g_steal_pointer (&nested_error)); return NULL; } } /* API */ else if (g_str_equal ((const gchar *)event.data.scalar.value, "api")) { set = modulemd_yaml_parse_string_set_from_map ( &parser, "rpms", strict, &nested_error); modulemd_module_stream_v2_replace_rpm_api (modulestream, set); g_clear_pointer (&set, g_hash_table_unref); } /* Filter */ else if (g_str_equal ((const gchar *)event.data.scalar.value, "filter")) { set = modulemd_yaml_parse_string_set_from_map ( &parser, "rpms", strict, &nested_error); modulemd_module_stream_v2_replace_rpm_filters (modulestream, set); g_clear_pointer (&set, g_hash_table_unref); } /* Demodularized Packages */ else if (g_str_equal ((const gchar *)event.data.scalar.value, "demodularized")) { set = modulemd_yaml_parse_string_set_from_map ( &parser, "rpms", strict, &nested_error); modulemd_module_stream_v2_replace_demodularized_rpms ( modulestream, set); g_clear_pointer (&set, g_hash_table_unref); } /* Build Options */ else if (g_str_equal ((const gchar *)event.data.scalar.value, "buildopts") && !only_packager) { buildopts = modulemd_buildopts_parse_yaml (&parser, strict, &nested_error); if (!buildopts) { g_propagate_error (error, g_steal_pointer (&nested_error)); return NULL; } modulemd_module_stream_v2_set_buildopts (modulestream, buildopts); g_clear_object (&buildopts); } /* Components */ else if (g_str_equal ((const gchar *)event.data.scalar.value, "components")) { if (!modulemd_module_stream_v2_parse_components ( &parser, modulestream, strict, &nested_error)) { g_propagate_error (error, g_steal_pointer (&nested_error)); return NULL; } } /* Artifacts */ else if (g_str_equal ((const gchar *)event.data.scalar.value, "artifacts") && !only_packager) { if (!modulemd_module_stream_v2_parse_artifacts ( &parser, modulestream, strict, &nested_error)) { g_propagate_error (error, g_steal_pointer (&nested_error)); return NULL; } g_clear_pointer (&set, g_hash_table_unref); } else { SKIP_UNKNOWN (&parser, NULL, "Unexpected key in data: %s", (const gchar *)event.data.scalar.value); break; } break; default: MMD_YAML_ERROR_EVENT_EXIT ( error, event, "Unexpected YAML event in ModuleStreamV2: %s", mmd_yaml_get_event_name (event.type)); break; } yaml_event_delete (&event); } return g_steal_pointer (&modulestream); } static gboolean modulemd_module_stream_v2_parse_licenses (yaml_parser_t *parser, ModulemdModuleStreamV2 *modulestream, gboolean strict, gboolean only_packager, GError **error) { MODULEMD_INIT_TRACE (); MMD_INIT_YAML_EVENT (event); gboolean done = FALSE; gboolean in_map = FALSE; g_autoptr (GError) nested_error = NULL; g_autoptr (GHashTable) set = NULL; g_return_val_if_fail (error == NULL || *error == NULL, FALSE); /* Process through the mapping */ while (!done) { YAML_PARSER_PARSE_WITH_EXIT_BOOL (parser, &event, error); switch (event.type) { case YAML_MAPPING_START_EVENT: if (in_map) { MMD_YAML_ERROR_EVENT_EXIT_BOOL ( error, event, "Unexpected extra MAPPING_START event in licenses"); } in_map = TRUE; break; case YAML_MAPPING_END_EVENT: if (!in_map) { MMD_YAML_ERROR_EVENT_EXIT_BOOL ( error, event, "Unexpected MAPPING_END event in licenses"); } done = TRUE; break; case YAML_SCALAR_EVENT: if (!in_map) { MMD_YAML_ERROR_EVENT_EXIT_BOOL ( error, event, "Received scalar outside of mapping"); } if (g_str_equal ((const gchar *)event.data.scalar.value, "module")) { set = modulemd_yaml_parse_string_set (parser, &nested_error); if (!set) { g_propagate_error (error, g_steal_pointer (&nested_error)); return FALSE; } modulemd_module_stream_v2_replace_module_licenses (modulestream, set); g_clear_pointer (&set, g_hash_table_unref); } else if (g_str_equal ((const gchar *)event.data.scalar.value, "content") && !only_packager) { set = modulemd_yaml_parse_string_set (parser, &nested_error); modulemd_module_stream_v2_replace_content_licenses (modulestream, set); g_clear_pointer (&set, g_hash_table_unref); } else { SKIP_UNKNOWN (parser, FALSE, "Unexpected key in licenses: %s", (const gchar *)event.data.scalar.value); break; } break; default: MMD_YAML_ERROR_EVENT_EXIT_BOOL ( error, event, "Unexpected YAML event in licenses: %s", mmd_yaml_get_event_name (event.type)); break; } yaml_event_delete (&event); } return TRUE; } static gboolean modulemd_module_stream_v2_parse_servicelevels ( yaml_parser_t *parser, ModulemdModuleStreamV2 *modulestream, gboolean strict, GError **error) { MODULEMD_INIT_TRACE (); MMD_INIT_YAML_EVENT (event); gboolean done = FALSE; gboolean in_map = FALSE; const gchar *name = NULL; g_autoptr (ModulemdServiceLevel) sl = NULL; g_autoptr (GError) nested_error = NULL; g_return_val_if_fail (error == NULL || *error == NULL, FALSE); /* Process through the mapping */ while (!done) { YAML_PARSER_PARSE_WITH_EXIT_BOOL (parser, &event, error); switch (event.type) { case YAML_MAPPING_START_EVENT: if (in_map) { MMD_YAML_ERROR_EVENT_EXIT_BOOL ( error, event, "Unexpected extra MAPPING_START event in servicelevels"); } in_map = TRUE; break; case YAML_MAPPING_END_EVENT: if (!in_map) { MMD_YAML_ERROR_EVENT_EXIT_BOOL ( error, event, "Unexpected MAPPING_END event in servicelevels"); } done = TRUE; break; case YAML_SCALAR_EVENT: if (!in_map) { MMD_YAML_ERROR_EVENT_EXIT_BOOL ( error, event, "Received scalar outside of mapping"); } name = (const gchar *)event.data.scalar.value; sl = modulemd_service_level_parse_yaml ( parser, name, strict, &nested_error); if (!sl) { g_propagate_error (error, g_steal_pointer (&nested_error)); return FALSE; } modulemd_module_stream_v2_add_servicelevel (modulestream, sl); g_clear_object (&sl); break; default: MMD_YAML_ERROR_EVENT_EXIT_BOOL ( error, event, "Unexpected YAML event in servicelevels: %s", mmd_yaml_get_event_name (event.type)); break; } yaml_event_delete (&event); } return TRUE; } static gboolean modulemd_module_stream_v2_parse_deps (yaml_parser_t *parser, ModulemdModuleStreamV2 *modulestream, gboolean strict, GError **error) { MODULEMD_INIT_TRACE (); MMD_INIT_YAML_EVENT (event); gboolean done = FALSE; g_autoptr (ModulemdDependencies) deps = NULL; g_autoptr (GError) nested_error = NULL; g_return_val_if_fail (error == NULL || *error == NULL, FALSE); /* Process through the sequence */ /* We *must* get a SEQUENCE_START here */ YAML_PARSER_PARSE_WITH_EXIT_BOOL (parser, &event, error); if (event.type != YAML_SEQUENCE_START_EVENT) { MMD_YAML_ERROR_EVENT_EXIT_BOOL ( error, event, "Got %s instead of SEQUENCE_START in dependencies.", mmd_yaml_get_event_name (event.type)); } while (!done) { YAML_PARSER_PARSE_WITH_EXIT_BOOL (parser, &event, error); switch (event.type) { case YAML_SEQUENCE_END_EVENT: done = TRUE; break; case YAML_MAPPING_START_EVENT: deps = modulemd_dependencies_parse_yaml (parser, strict, &nested_error); if (!deps) { g_propagate_error (error, g_steal_pointer (&nested_error)); return FALSE; } modulemd_module_stream_v2_add_dependencies (modulestream, deps); g_clear_object (&deps); break; default: MMD_YAML_ERROR_EVENT_EXIT_BOOL ( error, event, "Unexpected YAML event in dependencies: %s", mmd_yaml_get_event_name (event.type)); break; } yaml_event_delete (&event); } return TRUE; } static gboolean modulemd_module_stream_v2_parse_refs (yaml_parser_t *parser, ModulemdModuleStreamV2 *modulestream, gboolean strict, GError **error) { MODULEMD_INIT_TRACE (); MMD_INIT_YAML_EVENT (event); gboolean done = FALSE; g_autofree gchar *scalar = NULL; g_autoptr (GError) nested_error = NULL; g_return_val_if_fail (error == NULL || *error == NULL, FALSE); /* Process through the map */ /* We *must* get a MAPPING_START here */ YAML_PARSER_PARSE_WITH_EXIT_BOOL (parser, &event, error); if (event.type != YAML_MAPPING_START_EVENT) { MMD_YAML_ERROR_EVENT_EXIT_BOOL ( error, event, "Got %s instead of MAPPING_START in dependencies.", mmd_yaml_get_event_name (event.type)); } while (!done) { YAML_PARSER_PARSE_WITH_EXIT_BOOL (parser, &event, error); switch (event.type) { case YAML_MAPPING_END_EVENT: done = TRUE; break; case YAML_SCALAR_EVENT: if (g_str_equal ((const gchar *)event.data.scalar.value, "community")) { scalar = modulemd_yaml_parse_string (parser, &nested_error); if (!scalar) { g_propagate_error (error, g_steal_pointer (&nested_error)); return FALSE; } modulemd_module_stream_v2_set_community (modulestream, scalar); g_clear_pointer (&scalar, g_free); } else if (g_str_equal ((const gchar *)event.data.scalar.value, "documentation")) { scalar = modulemd_yaml_parse_string (parser, &nested_error); if (!scalar) { g_propagate_error (error, g_steal_pointer (&nested_error)); return FALSE; } modulemd_module_stream_v2_set_documentation (modulestream, scalar); g_clear_pointer (&scalar, g_free); } else if (g_str_equal ((const gchar *)event.data.scalar.value, "tracker")) { scalar = modulemd_yaml_parse_string (parser, &nested_error); if (!scalar) { g_propagate_error (error, g_steal_pointer (&nested_error)); return FALSE; } modulemd_module_stream_v2_set_tracker (modulestream, scalar); g_clear_pointer (&scalar, g_free); } else { SKIP_UNKNOWN (parser, FALSE, "Unexpected key in references: %s", (const gchar *)event.data.scalar.value); break; } break; default: MMD_YAML_ERROR_EVENT_EXIT_BOOL ( error, event, "Unexpected YAML event in dependencies: %s", mmd_yaml_get_event_name (event.type)); break; } yaml_event_delete (&event); } return TRUE; } static gboolean modulemd_module_stream_v2_parse_profiles (yaml_parser_t *parser, ModulemdModuleStreamV2 *modulestream, gboolean strict, GError **error) { MODULEMD_INIT_TRACE (); MMD_INIT_YAML_EVENT (event); gboolean done = FALSE; g_autoptr (GError) nested_error = NULL; g_autoptr (ModulemdProfile) profile = NULL; g_return_val_if_fail (error == NULL || *error == NULL, FALSE); /* Process through the map */ /* We *must* get a MAPPING_START here */ YAML_PARSER_PARSE_WITH_EXIT_BOOL (parser, &event, error); if (event.type != YAML_MAPPING_START_EVENT) { MMD_YAML_ERROR_EVENT_EXIT_BOOL ( error, event, "Got %s instead of MAPPING_START in profiles.", mmd_yaml_get_event_name (event.type)); } while (!done) { YAML_PARSER_PARSE_WITH_EXIT_BOOL (parser, &event, error); switch (event.type) { case YAML_MAPPING_END_EVENT: done = TRUE; break; case YAML_SCALAR_EVENT: profile = modulemd_profile_parse_yaml ( parser, (const gchar *)event.data.scalar.value, strict, &nested_error); if (!profile) { g_propagate_error (error, g_steal_pointer (&nested_error)); return FALSE; } modulemd_module_stream_v2_add_profile (modulestream, profile); g_clear_pointer (&profile, g_object_unref); break; default: MMD_YAML_ERROR_EVENT_EXIT_BOOL ( error, event, "Unexpected YAML event in dependencies: %s", mmd_yaml_get_event_name (event.type)); break; } yaml_event_delete (&event); } return TRUE; } static gboolean modulemd_module_stream_v2_parse_rpm_components ( yaml_parser_t *parser, ModulemdModuleStreamV2 *modulestream, gboolean strict, GError **error); static gboolean modulemd_module_stream_v2_parse_module_components ( yaml_parser_t *parser, ModulemdModuleStreamV2 *modulestream, gboolean strict, GError **error); static gboolean modulemd_module_stream_v2_parse_components ( yaml_parser_t *parser, ModulemdModuleStreamV2 *modulestream, gboolean strict, GError **error) { MODULEMD_INIT_TRACE (); MMD_INIT_YAML_EVENT (event); gboolean done = FALSE; g_autoptr (GError) nested_error = NULL; g_return_val_if_fail (error == NULL || *error == NULL, FALSE); /* Process through the sequence */ /* We *must* get a MAPPING_START here */ YAML_PARSER_PARSE_WITH_EXIT_BOOL (parser, &event, error); if (event.type != YAML_MAPPING_START_EVENT) { MMD_YAML_ERROR_EVENT_EXIT_BOOL ( error, event, "Got %s instead of MAPPING_START in components.", mmd_yaml_get_event_name (event.type)); } while (!done) { YAML_PARSER_PARSE_WITH_EXIT_BOOL (parser, &event, error); switch (event.type) { case YAML_MAPPING_END_EVENT: done = TRUE; break; case YAML_SCALAR_EVENT: if (g_str_equal ((const gchar *)event.data.scalar.value, "rpms")) { if (!modulemd_module_stream_v2_parse_rpm_components ( parser, modulestream, strict, &nested_error)) { g_propagate_error (error, g_steal_pointer (&nested_error)); return FALSE; } } else if (g_str_equal ((const gchar *)event.data.scalar.value, "modules")) { if (!modulemd_module_stream_v2_parse_module_components ( parser, modulestream, strict, &nested_error)) { g_propagate_error (error, g_steal_pointer (&nested_error)); return FALSE; } } else { SKIP_UNKNOWN (parser, FALSE, "Unexpected key in components: %s", (const gchar *)event.data.scalar.value); } break; default: MMD_YAML_ERROR_EVENT_EXIT_BOOL ( error, event, "Unexpected YAML event in components: %s", mmd_yaml_get_event_name (event.type)); break; } yaml_event_delete (&event); } return TRUE; } static gboolean modulemd_module_stream_v2_parse_rpm_components ( yaml_parser_t *parser, ModulemdModuleStreamV2 *modulestream, gboolean strict, GError **error) { MODULEMD_INIT_TRACE (); MMD_INIT_YAML_EVENT (event); gboolean done = FALSE; g_autoptr (GError) nested_error = NULL; g_autoptr (ModulemdComponentRpm) component = NULL; g_return_val_if_fail (error == NULL || *error == NULL, FALSE); /* We *must* get a MAPPING_START here */ YAML_PARSER_PARSE_WITH_EXIT_BOOL (parser, &event, error); if (event.type != YAML_MAPPING_START_EVENT) { MMD_YAML_ERROR_EVENT_EXIT_BOOL ( error, event, "Got %s instead of MAPPING_START in rpm components.", mmd_yaml_get_event_name (event.type)); } while (!done) { YAML_PARSER_PARSE_WITH_EXIT_BOOL (parser, &event, error); switch (event.type) { case YAML_MAPPING_END_EVENT: done = TRUE; break; case YAML_SCALAR_EVENT: component = modulemd_component_rpm_parse_yaml ( parser, (const gchar *)event.data.scalar.value, strict, &nested_error); if (!component) { g_propagate_error (error, g_steal_pointer (&nested_error)); return FALSE; } modulemd_module_stream_v2_add_component ( modulestream, (ModulemdComponent *)component); g_clear_pointer (&component, g_object_unref); break; default: MMD_YAML_ERROR_EVENT_EXIT_BOOL ( error, event, "Unexpected YAML event in RPM component: %s", mmd_yaml_get_event_name (event.type)); break; } yaml_event_delete (&event); } return TRUE; } static gboolean modulemd_module_stream_v2_parse_module_components ( yaml_parser_t *parser, ModulemdModuleStreamV2 *modulestream, gboolean strict, GError **error) { MODULEMD_INIT_TRACE (); MMD_INIT_YAML_EVENT (event); gboolean done = FALSE; g_autoptr (GError) nested_error = NULL; g_autoptr (ModulemdComponentModule) component = NULL; g_return_val_if_fail (error == NULL || *error == NULL, FALSE); /* We *must* get a MAPPING_START here */ YAML_PARSER_PARSE_WITH_EXIT_BOOL (parser, &event, error); if (event.type != YAML_MAPPING_START_EVENT) { MMD_YAML_ERROR_EVENT_EXIT_BOOL ( error, event, "Got %s instead of MAPPING_START in module components.", mmd_yaml_get_event_name (event.type)); } while (!done) { YAML_PARSER_PARSE_WITH_EXIT_BOOL (parser, &event, error); switch (event.type) { case YAML_MAPPING_END_EVENT: done = TRUE; break; case YAML_SCALAR_EVENT: component = modulemd_component_module_parse_yaml ( parser, (const gchar *)event.data.scalar.value, strict, &nested_error); if (!component) { g_propagate_error (error, g_steal_pointer (&nested_error)); return FALSE; } modulemd_module_stream_v2_add_component ( modulestream, (ModulemdComponent *)component); g_clear_pointer (&component, g_object_unref); break; default: MMD_YAML_ERROR_EVENT_EXIT_BOOL ( error, event, "Unexpected YAML event in module component: %s", mmd_yaml_get_event_name (event.type)); break; } yaml_event_delete (&event); } return TRUE; } static gboolean modulemd_module_stream_v2_parse_rpm_map (yaml_parser_t *parser, ModulemdModuleStreamV2 *modulestream, gboolean strict, GError **error); static gboolean modulemd_module_stream_v2_parse_artifacts ( yaml_parser_t *parser, ModulemdModuleStreamV2 *modulestream, gboolean strict, GError **error) { MODULEMD_INIT_TRACE (); MMD_INIT_YAML_EVENT (event); gboolean done = FALSE; g_autoptr (GHashTable) set = NULL; g_autoptr (GError) nested_error = NULL; g_return_val_if_fail (error == NULL || *error == NULL, FALSE); /* We *must* get a MAPPING_START here */ YAML_PARSER_PARSE_WITH_EXIT_BOOL (parser, &event, error); if (event.type != YAML_MAPPING_START_EVENT) { MMD_YAML_ERROR_EVENT_EXIT_BOOL ( error, event, "Got %s instead of MAPPING_START in artifacts.", mmd_yaml_get_event_name (event.type)); } while (!done) { YAML_PARSER_PARSE_WITH_EXIT_BOOL (parser, &event, error); switch (event.type) { case YAML_MAPPING_END_EVENT: done = TRUE; break; case YAML_SCALAR_EVENT: if (g_str_equal ((const gchar *)event.data.scalar.value, "rpms")) { set = modulemd_yaml_parse_string_set (parser, &nested_error); if (!set) { g_propagate_error (error, g_steal_pointer (&nested_error)); return FALSE; } modulemd_module_stream_v2_replace_rpm_artifacts (modulestream, set); g_clear_pointer (&set, g_hash_table_unref); } else if (g_str_equal ((const gchar *)event.data.scalar.value, "rpm-map")) { if (!modulemd_module_stream_v2_parse_rpm_map ( parser, modulestream, strict, &nested_error)) { g_propagate_error (error, g_steal_pointer (&nested_error)); return FALSE; } } else { /* Encountered a key other than the expected ones. */ SKIP_UNKNOWN (parser, FALSE, "Unexpected key in map: %s", (const gchar *)event.data.scalar.value); } break; default: MMD_YAML_ERROR_EVENT_EXIT_BOOL ( error, event, "Unexpected YAML event in map"); break; } yaml_event_delete (&event); } return TRUE; } static gboolean modulemd_module_stream_v2_parse_rpm_map_digest ( yaml_parser_t *parser, ModulemdModuleStreamV2 *modulestream, gboolean strict, const gchar *digest, GError **error); static gboolean modulemd_module_stream_v2_parse_rpm_map (yaml_parser_t *parser, ModulemdModuleStreamV2 *modulestream, gboolean strict, GError **error) { MODULEMD_INIT_TRACE (); MMD_INIT_YAML_EVENT (event); gboolean done = FALSE; g_autoptr (GError) nested_error = NULL; g_return_val_if_fail (error == NULL || *error == NULL, FALSE); /* We *must* get a MAPPING_START here */ YAML_PARSER_PARSE_WITH_EXIT_BOOL (parser, &event, error); if (event.type != YAML_MAPPING_START_EVENT) { MMD_YAML_ERROR_EVENT_EXIT_BOOL ( error, event, "Got %s instead of MAPPING_START in rpm-map.", mmd_yaml_get_event_name (event.type)); } while (!done) { YAML_PARSER_PARSE_WITH_EXIT_BOOL (parser, &event, error); switch (event.type) { case YAML_MAPPING_END_EVENT: done = TRUE; break; case YAML_SCALAR_EVENT: /* Each entry in the map here represents a digest name */ if (!modulemd_module_stream_v2_parse_rpm_map_digest ( parser, modulestream, strict, (const gchar *)event.data.scalar.value, &nested_error)) { g_propagate_error (error, g_steal_pointer (&nested_error)); return FALSE; } break; default: MMD_YAML_ERROR_EVENT_EXIT_BOOL ( error, event, "Unexpected YAML event in map"); break; } yaml_event_delete (&event); } return TRUE; } static gboolean modulemd_module_stream_v2_parse_rpm_map_digest ( yaml_parser_t *parser, ModulemdModuleStreamV2 *modulestream, gboolean strict, const gchar *digest, GError **error) { MODULEMD_INIT_TRACE (); MMD_INIT_YAML_EVENT (event); gboolean done = FALSE; g_autoptr (GError) nested_error = NULL; const gchar *checksum = NULL; g_autoptr (ModulemdRpmMapEntry) entry = NULL; g_return_val_if_fail (error == NULL || *error == NULL, FALSE); /* We *must* get a MAPPING_START here */ YAML_PARSER_PARSE_WITH_EXIT_BOOL (parser, &event, error); if (event.type != YAML_MAPPING_START_EVENT) { MMD_YAML_ERROR_EVENT_EXIT_BOOL ( error, event, "Got %s instead of MAPPING_START in rpm-map.", mmd_yaml_get_event_name (event.type)); } while (!done) { YAML_PARSER_PARSE_WITH_EXIT_BOOL (parser, &event, error); switch (event.type) { case YAML_MAPPING_END_EVENT: done = TRUE; break; case YAML_SCALAR_EVENT: /* Each key in this map is a checksum with the value being a * ModulemdRpmMapEntry */ checksum = (const gchar *)event.data.scalar.value; entry = modulemd_rpm_map_entry_parse_yaml (parser, strict, &nested_error); if (!entry) { g_propagate_error (error, g_steal_pointer (&nested_error)); return FALSE; } modulemd_module_stream_v2_set_rpm_artifact_map_entry ( modulestream, entry, digest, checksum); g_clear_object (&entry); break; default: MMD_YAML_ERROR_EVENT_EXIT_BOOL ( error, event, "Unexpected YAML event in map"); break; } yaml_event_delete (&event); } return TRUE; } gboolean modulemd_module_stream_v2_emit_rpm_map (ModulemdModuleStreamV2 *self, yaml_emitter_t *emitter, GError **error); gboolean modulemd_module_stream_v2_emit_yaml (ModulemdModuleStreamV2 *self, yaml_emitter_t *emitter, GError **error) { MODULEMD_INIT_TRACE (); if (!modulemd_module_stream_emit_yaml_base ( MODULEMD_MODULE_STREAM (self), emitter, error)) { return FALSE; } if (modulemd_module_stream_v2_is_static_context (self)) { EMIT_KEY_VALUE (emitter, error, "static_context", "true"); } EMIT_KEY_VALUE_STRING_IF_SET ( emitter, error, "arch", modulemd_module_stream_v2_get_arch (self)); EMIT_KEY_VALUE_STRING (emitter, error, "summary", self->summary); EMIT_KEY_VALUE_FULL (emitter, error, "description", self->description, YAML_FOLDED_SCALAR_STYLE); EMIT_HASHTABLE_VALUES_IF_NON_EMPTY (emitter, error, "servicelevels", self->servicelevels, modulemd_service_level_emit_yaml); if (!NON_EMPTY_TABLE (self->module_licenses)) { g_set_error (error, MODULEMD_YAML_ERROR, MMD_YAML_ERROR_EMIT, "Module licenses is not allowed to be empty"); return FALSE; } EMIT_SCALAR (emitter, error, "license"); EMIT_MAPPING_START (emitter, error); EMIT_STRING_SET (emitter, error, "module", self->module_licenses); EMIT_STRING_SET_IF_NON_EMPTY ( emitter, error, "content", self->content_licenses); EMIT_MAPPING_END (emitter, error); if (self->xmd != NULL) { EMIT_SCALAR (emitter, error, "xmd"); if (!modulemd_yaml_emit_variant (emitter, self->xmd, error)) { return FALSE; } } EMIT_ARRAY_VALUES_IF_NON_EMPTY (emitter, error, "dependencies", self->dependencies, modulemd_dependencies_emit_yaml); if (self->community || self->documentation || self->tracker) { EMIT_SCALAR (emitter, error, "references"); EMIT_MAPPING_START (emitter, error); EMIT_KEY_VALUE_STRING_IF_SET ( emitter, error, "community", self->community); EMIT_KEY_VALUE_STRING_IF_SET ( emitter, error, "documentation", self->documentation); EMIT_KEY_VALUE_STRING_IF_SET (emitter, error, "tracker", self->tracker); EMIT_MAPPING_END (emitter, error); } EMIT_HASHTABLE_VALUES_IF_NON_EMPTY ( emitter, error, "profiles", self->profiles, modulemd_profile_emit_yaml); if (NON_EMPTY_TABLE (self->rpm_api)) { EMIT_SCALAR (emitter, error, "api"); EMIT_MAPPING_START (emitter, error); EMIT_STRING_SET (emitter, error, "rpms", self->rpm_api); EMIT_MAPPING_END (emitter, error); } if (NON_EMPTY_TABLE (self->rpm_filters)) { EMIT_SCALAR (emitter, error, "filter"); EMIT_MAPPING_START (emitter, error); EMIT_STRING_SET (emitter, error, "rpms", self->rpm_filters); EMIT_MAPPING_END (emitter, error); } if (NON_EMPTY_TABLE (self->demodularized_rpms)) { EMIT_SCALAR (emitter, error, "demodularized"); EMIT_MAPPING_START (emitter, error); EMIT_STRING_SET (emitter, error, "rpms", self->demodularized_rpms); EMIT_MAPPING_END (emitter, error); } if (self->buildopts != NULL) { EMIT_SCALAR (emitter, error, "buildopts"); EMIT_MAPPING_START (emitter, error); if (!modulemd_buildopts_emit_yaml (self->buildopts, emitter, error)) { return FALSE; } EMIT_MAPPING_END (emitter, error); } if (NON_EMPTY_TABLE (self->rpm_components) || NON_EMPTY_TABLE (self->module_components)) { EMIT_SCALAR (emitter, error, "components"); EMIT_MAPPING_START (emitter, error); EMIT_HASHTABLE_VALUES_IF_NON_EMPTY (emitter, error, "rpms", self->rpm_components, modulemd_component_rpm_emit_yaml); EMIT_HASHTABLE_VALUES_IF_NON_EMPTY (emitter, error, "modules", self->module_components, modulemd_component_module_emit_yaml); EMIT_MAPPING_END (emitter, error); } if (NON_EMPTY_TABLE (self->rpm_artifacts) || NON_EMPTY_TABLE (self->rpm_artifact_map)) { EMIT_SCALAR (emitter, error, "artifacts"); EMIT_MAPPING_START (emitter, error); /* Emit the rpm artifacts */ EMIT_STRING_SET_IF_NON_EMPTY ( emitter, error, "rpms", self->rpm_artifacts); /* Emit the rpm-map */ if (!modulemd_module_stream_v2_emit_rpm_map (self, emitter, error)) { return FALSE; } EMIT_MAPPING_END (emitter, error); } /* The "data" mapping */ EMIT_MAPPING_END (emitter, error); /* The overall document mapping */ EMIT_MAPPING_END (emitter, error); if (!mmd_emitter_end_document (emitter, error)) { return FALSE; } return TRUE; } gboolean modulemd_module_stream_v2_emit_rpm_map (ModulemdModuleStreamV2 *self, yaml_emitter_t *emitter, GError **error) { GHashTable *digest_table = NULL; g_autoptr (GPtrArray) digests = NULL; const gchar *digest = NULL; g_autoptr (GPtrArray) checksums = NULL; const gchar *checksum = NULL; ModulemdRpmMapEntry *entry = NULL; if (!NON_EMPTY_TABLE (self->rpm_artifact_map)) { /* Nothing to output here */ return TRUE; } digests = modulemd_ordered_str_keys (self->rpm_artifact_map, modulemd_strcmp_sort); EMIT_SCALAR (emitter, error, "rpm-map"); EMIT_MAPPING_START (emitter, error); for (guint i = 0; i < digests->len; i++) { digest = g_ptr_array_index (digests, i); EMIT_SCALAR (emitter, error, digest); digest_table = g_hash_table_lookup (self->rpm_artifact_map, digest); EMIT_MAPPING_START (emitter, error); checksums = modulemd_ordered_str_keys (digest_table, modulemd_strcmp_sort); for (guint j = 0; j < digests->len; j++) { checksum = g_ptr_array_index (checksums, j); EMIT_SCALAR (emitter, error, checksum); entry = g_hash_table_lookup (digest_table, checksum); if (!modulemd_rpm_map_entry_emit_yaml (entry, emitter, error)) { return FALSE; } } EMIT_MAPPING_END (emitter, error); g_clear_pointer (&checksums, g_ptr_array_unref); } EMIT_MAPPING_END (emitter, error); return TRUE; } fedora-modularity-libmodulemd-357799c/modulemd/modulemd-module-stream.c000066400000000000000000001327731502446517500263120ustar00rootroot00000000000000/* * This file is part of libmodulemd * Copyright (C) 2018-2020 Red Hat, Inc. * * Fedora-License-Identifier: MIT * SPDX-2.0-License-Identifier: MIT * SPDX-3.0-License-Identifier: MIT * * This program is free software. * For more information on the license, see COPYING. * For more information on free software, see . */ #include "modulemd.h" #include "modulemd-errors.h" #include "modulemd-module-index.h" #include "modulemd-module-stream-v1.h" #include "modulemd-module-stream-v2.h" #include "modulemd-module-stream.h" #include "modulemd-packager-v3.h" #include "private/glib-extensions.h" #include "private/modulemd-component-private.h" #include "private/modulemd-module-private.h" #include "private/modulemd-module-stream-private.h" #include "private/modulemd-module-stream-v1-private.h" #include "private/modulemd-module-stream-v2-private.h" #include "private/modulemd-packager-v3-private.h" #include "private/modulemd-subdocument-info-private.h" #include "private/modulemd-util.h" #include "private/modulemd-yaml.h" #include #include typedef struct { gchar *module_name; gchar *stream_name; guint64 version; gchar *context; gchar *arch; ModulemdTranslation *translation; } ModulemdModuleStreamPrivate; G_DEFINE_ABSTRACT_TYPE_WITH_PRIVATE (ModulemdModuleStream, modulemd_module_stream, G_TYPE_OBJECT) enum { PROP_0, PROP_MDVERSION, PROP_MODULE_NAME, PROP_STREAM_NAME, PROP_VERSION, PROP_CONTEXT, PROP_ARCH, N_PROPS }; static GParamSpec *properties[N_PROPS]; ModulemdModuleStream * modulemd_module_stream_new (guint64 mdversion, const gchar *module_name, const gchar *module_stream) { switch (mdversion) { case MD_MODULESTREAM_VERSION_ONE: return MODULEMD_MODULE_STREAM ( modulemd_module_stream_v1_new (module_name, module_stream)); case MD_MODULESTREAM_VERSION_TWO: return MODULEMD_MODULE_STREAM ( modulemd_module_stream_v2_new (module_name, module_stream)); default: /* Other versions have not yet been implemented */ return NULL; } } static ModulemdModuleStream * modulemd_module_stream_read_yaml (yaml_parser_t *parser, const gchar *module_name, const gchar *module_stream, gboolean strict, GError **error); ModulemdModuleStream * modulemd_module_stream_read_file (const gchar *path, gboolean strict, const gchar *module_name, const gchar *module_stream, GError **error) { MMD_INIT_YAML_PARSER (parser); g_autoptr (FILE) yaml_stream = NULL; gint err; g_return_val_if_fail (path, NULL); g_return_val_if_fail (error == NULL || *error == NULL, NULL); errno = 0; yaml_stream = g_fopen (path, "rbe"); err = errno; if (!yaml_stream) { g_set_error ( error, MODULEMD_ERROR, MMD_ERROR_FILE_ACCESS, "%s", g_strerror (err)); return NULL; } yaml_parser_set_input_file (&parser, yaml_stream); return modulemd_module_stream_read_yaml ( &parser, module_name, module_stream, strict, error); } ModulemdModuleStream * modulemd_module_stream_read_string (const gchar *yaml_string, gboolean strict, const gchar *module_name, const gchar *module_stream, GError **error) { MMD_INIT_YAML_PARSER (parser); g_return_val_if_fail (yaml_string, NULL); g_return_val_if_fail (error == NULL || *error == NULL, NULL); yaml_parser_set_input_string ( &parser, (const unsigned char *)yaml_string, strlen (yaml_string)); return modulemd_module_stream_read_yaml ( &parser, module_name, module_stream, strict, error); } ModulemdModuleStream * modulemd_module_stream_read_stream (FILE *stream, gboolean strict, const gchar *module_name, const gchar *module_stream, GError **error) { MMD_INIT_YAML_PARSER (parser); yaml_parser_set_input_file (&parser, stream); return modulemd_module_stream_read_yaml ( &parser, module_name, module_stream, strict, error); } static ModulemdModuleStream * modulemd_module_stream_read_yaml (yaml_parser_t *parser, const gchar *module_name, const gchar *module_stream, gboolean strict, GError **error) { MMD_INIT_YAML_EVENT (event); MMD_INIT_YAML_PARSER (stream_parser); g_autoptr (GError) nested_error = NULL; g_autoptr (ModulemdModuleStream) stream = NULL; g_autoptr (ModulemdSubdocumentInfo) subdoc = NULL; g_autoptr (ModulemdPackagerV3) packager_v3 = NULL; ModulemdYamlDocumentTypeEnum doctype; const GError *gerror = NULL; /* The first event must be the stream start */ if (!yaml_parser_parse (parser, &event)) { g_set_error_literal (error, MODULEMD_YAML_ERROR, MMD_YAML_ERROR_UNPARSEABLE, "Parser error"); return NULL; } if (event.type != YAML_STREAM_START_EVENT) { g_set_error_literal (error, MODULEMD_YAML_ERROR, MMD_YAML_ERROR_PARSE, "YAML didn't begin with STREAM_START."); return NULL; } yaml_event_delete (&event); /* The second event must be the document start */ if (!yaml_parser_parse (parser, &event)) { g_set_error_literal (error, MODULEMD_YAML_ERROR, MMD_YAML_ERROR_UNPARSEABLE, "Parser error"); return NULL; } if (event.type != YAML_DOCUMENT_START_EVENT) { g_set_error_literal (error, MODULEMD_YAML_ERROR, MMD_YAML_ERROR_PARSE, "YAML didn't begin with STREAM_START."); return NULL; } yaml_event_delete (&event); subdoc = modulemd_yaml_parse_document_type (parser); gerror = modulemd_subdocument_info_get_gerror (subdoc); if (gerror) { g_set_error (error, gerror->domain, gerror->code, "Parse error identifying document type and version: %s", gerror->message); return NULL; } doctype = modulemd_subdocument_info_get_doctype (subdoc); if (doctype != MODULEMD_YAML_DOC_MODULESTREAM && doctype != MODULEMD_YAML_DOC_PACKAGER) { g_set_error (error, MODULEMD_YAML_ERROR, MMD_YAML_ERROR_PARSE, "Expected `document: modulemd[-packager]`, got %d", modulemd_subdocument_info_get_doctype (subdoc)); return NULL; } /* Read mdversion and parse 'data' with the appropriate subclass */ switch (modulemd_subdocument_info_get_mdversion (subdoc)) { case MD_MODULESTREAM_VERSION_ONE: stream = MODULEMD_MODULE_STREAM ( modulemd_module_stream_v1_parse_yaml (subdoc, strict, &nested_error)); if (!stream) { g_propagate_error (error, g_steal_pointer (&nested_error)); return NULL; } break; case MD_MODULESTREAM_VERSION_TWO: stream = MODULEMD_MODULE_STREAM (modulemd_module_stream_v2_parse_yaml ( subdoc, strict, doctype == MODULEMD_YAML_DOC_PACKAGER, &nested_error)); if (!stream) { g_propagate_error (error, g_steal_pointer (&nested_error)); return NULL; } break; case MD_PACKAGER_VERSION_THREE: if (doctype == MODULEMD_YAML_DOC_PACKAGER) { packager_v3 = modulemd_packager_v3_parse_yaml (subdoc, &nested_error); if (!packager_v3) { g_propagate_error (error, g_steal_pointer (&nested_error)); return NULL; } stream = MODULEMD_MODULE_STREAM ( modulemd_packager_v3_to_stream_v2 (packager_v3, &nested_error)); if (!stream) { g_propagate_error (error, g_steal_pointer (&nested_error)); return NULL; } g_clear_object (&packager_v3); } else { g_set_error (error, MODULEMD_YAML_ERROR, MMD_YAML_ERROR_PARSE, "Invalid ModuleStream version: %" PRIu64, modulemd_subdocument_info_get_mdversion (subdoc)); return NULL; } break; default: g_set_error (error, MODULEMD_YAML_ERROR, MMD_YAML_ERROR_PARSE, "Unknown ModuleStream version: %" PRIu64, modulemd_subdocument_info_get_mdversion (subdoc)); return NULL; break; } /* The last event must be the stream end */ if (!yaml_parser_parse (parser, &event)) { g_set_error_literal (error, MODULEMD_YAML_ERROR, MMD_YAML_ERROR_UNPARSEABLE, "Parser error"); return NULL; } if (event.type != YAML_STREAM_END_EVENT) { g_set_error_literal (error, MODULEMD_YAML_ERROR, MMD_YAML_ERROR_PARSE, "YAML contained more than a single subdocument"); return NULL; } yaml_event_delete (&event); if (module_name) { modulemd_module_stream_set_module_name (stream, module_name); } if (module_stream) { modulemd_module_stream_set_stream_name (stream, module_stream); } if (!modulemd_module_stream_validate (stream, &nested_error)) { g_propagate_error (error, g_steal_pointer (&nested_error)); return NULL; } return g_steal_pointer (&stream); } static void modulemd_module_stream_finalize (GObject *object) { ModulemdModuleStream *self = (ModulemdModuleStream *)object; ModulemdModuleStreamPrivate *priv = modulemd_module_stream_get_instance_private (self); g_clear_pointer (&priv->module_name, g_free); g_clear_pointer (&priv->stream_name, g_free); g_clear_pointer (&priv->context, g_free); g_clear_pointer (&priv->arch, g_free); g_clear_object (&priv->translation); G_OBJECT_CLASS (modulemd_module_stream_parent_class)->finalize (object); } static gboolean modulemd_module_stream_default_equals (ModulemdModuleStream *self_1, ModulemdModuleStream *self_2) { if (modulemd_module_stream_get_version (self_1) != modulemd_module_stream_get_version (self_2)) { return FALSE; } if (g_strcmp0 (modulemd_module_stream_get_module_name (self_1), modulemd_module_stream_get_module_name (self_2)) != 0) { return FALSE; } if (g_strcmp0 (modulemd_module_stream_get_stream_name (self_1), modulemd_module_stream_get_stream_name (self_2)) != 0) { return FALSE; } if (g_strcmp0 (modulemd_module_stream_get_context (self_1), modulemd_module_stream_get_context (self_2)) != 0) { return FALSE; } if (g_strcmp0 (modulemd_module_stream_get_arch (self_1), modulemd_module_stream_get_arch (self_2)) != 0) { return FALSE; } return TRUE; } gboolean modulemd_module_stream_equals (ModulemdModuleStream *self_1, ModulemdModuleStream *self_2) { ModulemdModuleStreamClass *klass; if (!self_1 && !self_2) { return TRUE; } if (!self_1 || !self_2) { return FALSE; } g_return_val_if_fail (MODULEMD_IS_MODULE_STREAM (self_1), FALSE); g_return_val_if_fail (MODULEMD_IS_MODULE_STREAM (self_2), FALSE); klass = MODULEMD_MODULE_STREAM_GET_CLASS (self_1); g_return_val_if_fail (klass->equals, FALSE); return klass->equals (self_1, self_2); } static ModulemdModuleStream * modulemd_module_stream_default_copy (ModulemdModuleStream *self, const gchar *module_name, const gchar *module_stream) { g_autoptr (ModulemdModuleStream) copy = NULL; const gchar *module = NULL; const gchar *stream = NULL; if (!self) { return NULL; } g_return_val_if_fail (MODULEMD_IS_MODULE_STREAM (self), NULL); /* If the module name was passed in, replace the original with it */ if (module_name) { module = module_name; } else { module = modulemd_module_stream_get_module_name (self); } /* If the stream name was passed in, replace the original with it */ if (module_stream) { stream = module_stream; } else { stream = modulemd_module_stream_get_stream_name (self); } /* The base implementation of the copy */ copy = modulemd_module_stream_new ( modulemd_module_stream_get_mdversion (self), module, stream); modulemd_module_stream_set_version ( copy, modulemd_module_stream_get_version (self)); modulemd_module_stream_set_context ( copy, modulemd_module_stream_get_context (self)); modulemd_module_stream_associate_translation ( copy, modulemd_module_stream_get_translation (self)); return g_steal_pointer (©); } ModulemdModuleStream * modulemd_module_stream_copy (ModulemdModuleStream *self, const gchar *module_name, const gchar *module_stream) { ModulemdModuleStreamClass *klass; if (!self) { return NULL; } g_return_val_if_fail (MODULEMD_IS_MODULE_STREAM (self), NULL); klass = MODULEMD_MODULE_STREAM_GET_CLASS (self); g_return_val_if_fail (klass->copy, NULL); return klass->copy (self, module_name, module_stream); } ModulemdModuleStream * modulemd_module_stream_upgrade (ModulemdModuleStream *self, guint64 mdversion, GError **error) { g_autoptr (ModulemdModuleStream) current_stream = NULL; g_autoptr (ModulemdModuleStream) updated_stream = NULL; guint64 current_mdversion; g_return_val_if_fail (MODULEMD_IS_MODULE_STREAM (self), NULL); current_mdversion = modulemd_module_stream_get_mdversion (self); if (!mdversion) { /* If target mdversion is unspecified, set it to the latest */ mdversion = MD_MODULESTREAM_VERSION_LATEST; } if (mdversion < current_mdversion) { /* Downgrades are not supported */ g_set_error_literal (error, MODULEMD_ERROR, MMD_ERROR_UPGRADE, "ModuleStream downgrades are not supported."); return NULL; } if (current_mdversion == mdversion) { /* If we're already on the requested version, just make a copy */ return modulemd_module_stream_copy (self, NULL, NULL); } current_stream = g_object_ref (self); while (current_mdversion != mdversion) { switch (current_mdversion) { case 1: /* Upgrade from ModuleStreamV1 to ModuleStreamV2 */ updated_stream = modulemd_module_stream_upgrade_v1_to_v2 (current_stream); if (!updated_stream) { /* This should be impossible, since there are no failure returns * from modulemd_module_stream_upgrade_v1_to_v2() */ g_set_error (error, MODULEMD_ERROR, MMD_ERROR_UPGRADE, "Upgrading to v2 failed for an unknown reason"); return NULL; } break; default: /* If we get here, it means we failed to address an upgrade. */ g_set_error ( error, MODULEMD_ERROR, MMD_ERROR_UPGRADE, "Cannot upgrade beyond metadata version %" G_GUINT64_FORMAT, current_mdversion); return NULL; } g_object_unref (current_stream); current_stream = g_steal_pointer (&updated_stream); current_mdversion = modulemd_module_stream_get_mdversion (current_stream); } return g_steal_pointer (¤t_stream); } ModulemdModule * modulemd_module_stream_upgrade_ext (ModulemdModuleStream *self, guint64 mdversion, GError **error) { g_autoptr (ModulemdModuleStream) current_stream = NULL; g_autoptr (ModulemdModuleStream) updated_stream = NULL; g_autoptr (ModulemdModule) current_module = NULL; g_autoptr (GError) nested_error = NULL; guint64 current_mdversion; g_return_val_if_fail (MODULEMD_IS_MODULE_STREAM (self), NULL); current_mdversion = modulemd_module_stream_get_mdversion (self); if (!mdversion) { /* If target mdversion is unspecified, set it to the latest */ mdversion = MD_MODULESTREAM_VERSION_LATEST; } if (mdversion < current_mdversion) { /* Downgrades are not supported */ g_set_error_literal (error, MODULEMD_ERROR, MMD_ERROR_UPGRADE, "ModuleStream downgrades are not supported."); return NULL; } if (current_mdversion == mdversion) { /* If we're already at the requested version, just wrap it in a Module * and return that. */ current_module = modulemd_module_new (modulemd_module_stream_get_module_name (self)); if (modulemd_module_add_stream ( current_module, self, current_mdversion, &nested_error) == MD_MODULESTREAM_VERSION_ERROR) { g_propagate_error (error, g_steal_pointer (&nested_error)); return NULL; } return g_steal_pointer (¤t_module); } current_stream = g_object_ref (self); while (current_mdversion != mdversion) { switch (current_mdversion) { case 1: /* Upgrade from ModuleStreamV1 to ModuleStreamV2 */ updated_stream = modulemd_module_stream_upgrade_v1_to_v2 (current_stream); if (!updated_stream) { /* This should be impossible, since there are no failure returns * from modulemd_module_stream_upgrade_v1_to_v2() */ g_set_error (error, MODULEMD_ERROR, MMD_ERROR_UPGRADE, "Upgrading to v2 failed for an unknown reason"); return NULL; } g_object_unref (current_stream); current_stream = g_steal_pointer (&updated_stream); current_mdversion = MD_MODULESTREAM_VERSION_TWO; break; default: /* If we get here, it means we failed to address an upgrade. */ g_set_error ( error, MODULEMD_ERROR, MMD_ERROR_UPGRADE, "Cannot upgrade beyond metadata version %" G_GUINT64_FORMAT, current_mdversion); return NULL; } } /* if that latest upgrade was still a Stream, wrap it in a Module */ if (current_stream) { current_module = modulemd_module_new ( modulemd_module_stream_get_module_name (current_stream)); if (modulemd_module_add_stream (current_module, current_stream, current_mdversion, &nested_error) == MD_MODULESTREAM_VERSION_ERROR) { g_propagate_error (error, g_steal_pointer (&nested_error)); return NULL; } g_clear_object (¤t_stream); } return g_steal_pointer (¤t_module); } ModulemdModuleStream * modulemd_module_stream_upgrade_v1_to_v2 (ModulemdModuleStream *from) { ModulemdModuleStreamV1 *v1_stream = NULL; g_autoptr (ModulemdModuleStreamV2) copy = NULL; g_autoptr (ModulemdDependencies) deps = NULL; GHashTableIter iter; gpointer key; gpointer value; g_return_val_if_fail (MODULEMD_IS_MODULE_STREAM_V1 (from), NULL); v1_stream = MODULEMD_MODULE_STREAM_V1 (from); copy = modulemd_module_stream_v2_new ( modulemd_module_stream_get_module_name (from), modulemd_module_stream_get_stream_name (from)); /* Parent class copy */ modulemd_module_stream_set_version ( MODULEMD_MODULE_STREAM (copy), modulemd_module_stream_get_version (from)); modulemd_module_stream_set_context ( MODULEMD_MODULE_STREAM (copy), modulemd_module_stream_get_context (from)); modulemd_module_stream_associate_translation ( MODULEMD_MODULE_STREAM (copy), modulemd_module_stream_get_translation (from)); /* Copy all attributes that are the same as V1 */ /* Properties */ STREAM_UPGRADE_IF_SET (v1, v2, copy, v1_stream, arch); STREAM_UPGRADE_IF_SET (v1, v2, copy, v1_stream, buildopts); STREAM_UPGRADE_IF_SET (v1, v2, copy, v1_stream, community); STREAM_UPGRADE_IF_SET_WITH_LOCALE (v1, v2, copy, v1_stream, description); STREAM_UPGRADE_IF_SET (v1, v2, copy, v1_stream, documentation); STREAM_UPGRADE_IF_SET_WITH_LOCALE (v1, v2, copy, v1_stream, summary); STREAM_UPGRADE_IF_SET (v1, v2, copy, v1_stream, tracker); /* Internal Data Structures: With replace function */ STREAM_REPLACE_HASHTABLE (v2, copy, v1_stream, content_licenses); STREAM_REPLACE_HASHTABLE (v2, copy, v1_stream, module_licenses); STREAM_REPLACE_HASHTABLE (v2, copy, v1_stream, rpm_api); STREAM_REPLACE_HASHTABLE (v2, copy, v1_stream, rpm_artifacts); STREAM_REPLACE_HASHTABLE (v2, copy, v1_stream, rpm_filters); /* Internal Data Structures: With add on value */ COPY_HASHTABLE_BY_VALUE_ADDER ( copy, v1_stream, rpm_components, modulemd_module_stream_v2_add_component); COPY_HASHTABLE_BY_VALUE_ADDER (copy, v1_stream, module_components, modulemd_module_stream_v2_add_component); COPY_HASHTABLE_BY_VALUE_ADDER ( copy, v1_stream, profiles, modulemd_module_stream_v2_add_profile); COPY_HASHTABLE_BY_VALUE_ADDER (copy, v1_stream, servicelevels, modulemd_module_stream_v2_add_servicelevel); if (v1_stream->xmd != NULL) { modulemd_module_stream_v2_set_xmd (copy, v1_stream->xmd); } /* Upgrade the Dependencies */ if (g_hash_table_size (v1_stream->buildtime_deps) > 0 || g_hash_table_size (v1_stream->runtime_deps) > 0) { deps = modulemd_dependencies_new (); /* Add the build-time deps */ g_hash_table_iter_init (&iter, v1_stream->buildtime_deps); while (g_hash_table_iter_next (&iter, &key, &value)) { modulemd_dependencies_add_buildtime_stream (deps, key, value); } /* Add the run-time deps */ g_hash_table_iter_init (&iter, v1_stream->runtime_deps); while (g_hash_table_iter_next (&iter, &key, &value)) { modulemd_dependencies_add_runtime_stream (deps, key, value); } /* Add the Dependencies to this ModuleStreamV2 */ modulemd_module_stream_v2_add_dependencies (copy, deps); } return MODULEMD_MODULE_STREAM (g_steal_pointer (©)); } static gboolean modulemd_module_stream_default_validate (ModulemdModuleStream *self, GError **error) { g_return_val_if_fail (MODULEMD_IS_MODULE_STREAM (self), FALSE); guint64 mdversion = modulemd_module_stream_get_mdversion (self); if (mdversion == 0) { g_set_error_literal (error, MODULEMD_ERROR, MMD_ERROR_VALIDATE, "Metadata version is unset."); return FALSE; } if (mdversion > MD_MODULESTREAM_VERSION_LATEST) { g_set_error_literal (error, MODULEMD_ERROR, MMD_ERROR_VALIDATE, "Unknown metadata version."); return FALSE; } return TRUE; } gboolean modulemd_module_stream_validate_components (GHashTable *components, GError **error) { GHashTableIter iter; GHashTableIter buildafter_iter; gpointer key; gpointer value; gpointer ba_key; gpointer ba_value; gboolean has_buildorder = FALSE; gboolean has_buildafter = FALSE; /* Iterate through components and verify that they don't mix buildorder and * buildafter */ g_hash_table_iter_init (&iter, components); while (g_hash_table_iter_next (&iter, &key, &value)) { /* First, ensure that the component validates in general */ if (!modulemd_component_validate (MODULEMD_COMPONENT (value), error)) { return FALSE; } /* Record whether we've seen buildorder at least once */ if (modulemd_component_get_buildorder (MODULEMD_COMPONENT (value))) { has_buildorder = TRUE; } /* Record whether we've seen buildafter at least once */ if (modulemd_component_has_buildafter (MODULEMD_COMPONENT (value))) { has_buildafter = TRUE; /* Verify the all the items listed in buildafter actually appear * in this stream */ if (!has_buildorder) { g_hash_table_iter_init ( &buildafter_iter, modulemd_component_get_buildafter_internal ( MODULEMD_COMPONENT (value))); while ( g_hash_table_iter_next (&buildafter_iter, &ba_key, &ba_value)) { /* Check each entry in the list and confirm that it appears * in the table of components */ if (!g_hash_table_contains (components, ba_key)) { g_set_error ( error, MODULEMD_ERROR, MMD_ERROR_VALIDATE, "Buildafter '%s' not found in components list", (const gchar *)ba_key); return FALSE; } } } } /* If both buildorder and buildafter have been seen in this stream, it * is invalid. */ if (has_buildafter && has_buildorder) { g_set_error_literal ( error, MODULEMD_ERROR, MMD_ERROR_VALIDATE, "Cannot mix buildorder and buildafter in the same stream"); return FALSE; } } return TRUE; } gboolean modulemd_module_stream_validate_component_rpm_arches (GHashTable *components, GStrv module_arches, GError **error) { GHashTableIter iter; gpointer key; gpointer value; g_auto (GStrv) rpm_arches = NULL; int num_arches; /* If no module level arches are provided, there's nothing to check. */ if (g_strv_length (module_arches) == 0) { return TRUE; } /* Iterate through rpm components and verify that any arches specified are a * subset of the module level arches. */ g_hash_table_iter_init (&iter, components); while (g_hash_table_iter_next (&iter, &key, &value)) { if (!MODULEMD_IS_COMPONENT_RPM (value)) { continue; } rpm_arches = modulemd_component_rpm_get_arches_as_strv ( MODULEMD_COMPONENT_RPM (value)); num_arches = g_strv_length (rpm_arches); for (int i = 0; i < num_arches; i++) { if (!g_strv_contains ((const gchar *const *)module_arches, rpm_arches[i])) { g_set_error ( error, MODULEMD_ERROR, MMD_ERROR_VALIDATE, "Component rpm '%s' arch '%s' not in module buildopts.arches", modulemd_component_get_name (MODULEMD_COMPONENT (value)), rpm_arches[i]); return FALSE; } } g_clear_pointer (&rpm_arches, g_strfreev); } return TRUE; } gboolean modulemd_module_stream_validate (ModulemdModuleStream *self, GError **error) { ModulemdModuleStreamClass *klass; if (!self) { return FALSE; } g_return_val_if_fail (MODULEMD_IS_MODULE_STREAM (self), FALSE); klass = MODULEMD_MODULE_STREAM_GET_CLASS (self); g_return_val_if_fail (klass->validate, FALSE); return klass->validate (self, error); } guint64 modulemd_module_stream_get_mdversion (ModulemdModuleStream *self) { ModulemdModuleStreamClass *klass; if (!self) { return FALSE; } g_return_val_if_fail (MODULEMD_IS_MODULE_STREAM (self), 0); klass = MODULEMD_MODULE_STREAM_GET_CLASS (self); g_return_val_if_fail (klass->get_mdversion, 0); return klass->get_mdversion (self); } void modulemd_module_stream_set_module_name (ModulemdModuleStream *self, const gchar *module_name) { g_return_if_fail (MODULEMD_IS_MODULE_STREAM (self)); ModulemdModuleStreamPrivate *priv = modulemd_module_stream_get_instance_private (self); g_clear_pointer (&priv->module_name, g_free); priv->module_name = g_strdup (module_name); g_object_notify_by_pspec (G_OBJECT (self), properties[PROP_MODULE_NAME]); } const gchar * modulemd_module_stream_get_module_name (ModulemdModuleStream *self) { g_return_val_if_fail (MODULEMD_IS_MODULE_STREAM (self), NULL); ModulemdModuleStreamPrivate *priv = modulemd_module_stream_get_instance_private (self); return priv->module_name; } void modulemd_module_stream_set_stream_name (ModulemdModuleStream *self, const gchar *stream_name) { g_return_if_fail (MODULEMD_IS_MODULE_STREAM (self)); ModulemdModuleStreamPrivate *priv = modulemd_module_stream_get_instance_private (self); g_clear_pointer (&priv->stream_name, g_free); priv->stream_name = g_strdup (stream_name); g_object_notify_by_pspec (G_OBJECT (self), properties[PROP_MODULE_NAME]); } const gchar * modulemd_module_stream_get_stream_name (ModulemdModuleStream *self) { g_return_val_if_fail (MODULEMD_IS_MODULE_STREAM (self), NULL); ModulemdModuleStreamPrivate *priv = modulemd_module_stream_get_instance_private (self); return priv->stream_name; } void modulemd_module_stream_set_version (ModulemdModuleStream *self, guint64 version) { g_return_if_fail (MODULEMD_IS_MODULE_STREAM (self)); ModulemdModuleStreamPrivate *priv = modulemd_module_stream_get_instance_private (self); priv->version = version; g_object_notify_by_pspec (G_OBJECT (self), properties[PROP_VERSION]); } guint64 modulemd_module_stream_get_version (ModulemdModuleStream *self) { g_return_val_if_fail (MODULEMD_IS_MODULE_STREAM (self), 0); ModulemdModuleStreamPrivate *priv = modulemd_module_stream_get_instance_private (self); return priv->version; } void modulemd_module_stream_set_context (ModulemdModuleStream *self, const gchar *context) { g_return_if_fail (MODULEMD_IS_MODULE_STREAM (self)); ModulemdModuleStreamPrivate *priv = modulemd_module_stream_get_instance_private (self); g_clear_pointer (&priv->context, g_free); priv->context = g_strdup (context); g_object_notify_by_pspec (G_OBJECT (self), properties[PROP_CONTEXT]); } const gchar * modulemd_module_stream_get_context (ModulemdModuleStream *self) { g_return_val_if_fail (MODULEMD_IS_MODULE_STREAM (self), 0); ModulemdModuleStreamPrivate *priv = modulemd_module_stream_get_instance_private (self); return priv->context; } void modulemd_module_stream_set_arch (ModulemdModuleStream *self, const gchar *arch) { g_return_if_fail (MODULEMD_IS_MODULE_STREAM (self)); ModulemdModuleStreamPrivate *priv = modulemd_module_stream_get_instance_private (self); g_clear_pointer (&priv->arch, g_free); priv->arch = g_strdup (arch); g_object_notify_by_pspec (G_OBJECT (self), properties[PROP_CONTEXT]); } const gchar * modulemd_module_stream_get_arch (ModulemdModuleStream *self) { g_return_val_if_fail (MODULEMD_IS_MODULE_STREAM (self), 0); ModulemdModuleStreamPrivate *priv = modulemd_module_stream_get_instance_private (self); return priv->arch; } gchar * modulemd_module_stream_get_nsvc_as_string (ModulemdModuleStream *self) { g_return_val_if_fail (MODULEMD_IS_MODULE_STREAM (self), 0); ModulemdModuleStreamPrivate *priv = modulemd_module_stream_get_instance_private (self); gchar *nsvc = NULL; if (!priv->module_name || !priv->stream_name) { /* Mandatory field is missing */ return NULL; } if (priv->context) { nsvc = g_strdup_printf ("%s:%s:%" PRIu64 ":%s", priv->module_name, priv->stream_name, priv->version, priv->context); } else { nsvc = g_strdup_printf ( "%s:%s:%" PRIu64, priv->module_name, priv->stream_name, priv->version); } return nsvc; } gchar * modulemd_module_stream_get_NSVCA_as_string (ModulemdModuleStream *self) { g_return_val_if_fail (MODULEMD_IS_MODULE_STREAM (self), 0); ModulemdModuleStreamPrivate *priv = modulemd_module_stream_get_instance_private (self); gchar *nsvca = NULL; gchar *endptr = NULL; g_autofree gchar *stream = NULL; g_autofree gchar *version = NULL; g_autofree gchar *context = NULL; g_autofree gchar *arch = NULL; if (!priv->module_name) { /* Mandatory field is missing */ return NULL; } if (priv->stream_name) { stream = g_strdup (priv->stream_name); } else { stream = g_strdup (""); } if (priv->version) { version = g_strdup_printf ("%" PRIu64 "", priv->version); } else { version = g_strdup (""); } if (priv->context) { context = g_strdup (priv->context); } else { context = g_strdup (""); } if (priv->arch) { arch = g_strdup (priv->arch); } else { arch = g_strdup (""); } nsvca = g_strjoin (":", priv->module_name, stream, version, context, arch, NULL); /* Remove any trailing colons */ endptr = nsvca + strlen (nsvca) - 1; while (*endptr == ':' && endptr > nsvca) { *endptr = '\0'; endptr--; } return nsvca; } static void modulemd_module_stream_get_property (GObject *object, guint prop_id, GValue *value, GParamSpec *pspec) { ModulemdModuleStream *self = MODULEMD_MODULE_STREAM (object); switch (prop_id) { case PROP_MDVERSION: g_value_set_uint64 (value, modulemd_module_stream_get_mdversion (self)); break; case PROP_MODULE_NAME: g_value_set_string (value, modulemd_module_stream_get_module_name (self)); break; case PROP_STREAM_NAME: g_value_set_string (value, modulemd_module_stream_get_stream_name (self)); break; case PROP_VERSION: g_value_set_uint64 (value, modulemd_module_stream_get_version (self)); break; case PROP_CONTEXT: g_value_set_string (value, modulemd_module_stream_get_context (self)); break; case PROP_ARCH: g_value_set_string (value, modulemd_module_stream_get_arch (self)); break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); } } static void modulemd_module_stream_set_property (GObject *object, guint prop_id, const GValue *value, GParamSpec *pspec) { ModulemdModuleStream *self = MODULEMD_MODULE_STREAM (object); switch (prop_id) { case PROP_MODULE_NAME: modulemd_module_stream_set_module_name (self, g_value_get_string (value)); break; case PROP_STREAM_NAME: modulemd_module_stream_set_stream_name (self, g_value_get_string (value)); break; case PROP_VERSION: modulemd_module_stream_set_version (self, g_value_get_uint64 (value)); break; case PROP_CONTEXT: modulemd_module_stream_set_context (self, g_value_get_string (value)); break; case PROP_ARCH: modulemd_module_stream_set_arch (self, g_value_get_string (value)); break; case PROP_MDVERSION: default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); } } static void modulemd_module_stream_class_init (ModulemdModuleStreamClass *klass) { GObjectClass *object_class = G_OBJECT_CLASS (klass); object_class->finalize = modulemd_module_stream_finalize; object_class->get_property = modulemd_module_stream_get_property; object_class->set_property = modulemd_module_stream_set_property; klass->equals = modulemd_module_stream_default_equals; klass->copy = modulemd_module_stream_default_copy; klass->validate = modulemd_module_stream_default_validate; /* get_mdversion() must be implemented by the child class */ klass->get_mdversion = NULL; properties[PROP_MDVERSION] = g_param_spec_uint64 ( "mdversion", "Metadata Version", "The metadata version of this ModuleStream object. Read-only.", 0, MD_MODULESTREAM_VERSION_LATEST, 0, G_PARAM_READABLE | G_PARAM_STATIC_STRINGS); properties[PROP_MODULE_NAME] = g_param_spec_string ( "module-name", "Module Name", "The name of the module providing this stream.", NULL, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS | G_PARAM_CONSTRUCT_ONLY); properties[PROP_STREAM_NAME] = g_param_spec_string ( "stream-name", "Stream Name", "The name of this module stream.", NULL, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS | G_PARAM_CONSTRUCT_ONLY); properties[PROP_VERSION] = g_param_spec_uint64 ( "version", "Module Stream Version", "The version of this module stream", 0, G_MAXUINT64, 0, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS | G_PARAM_CONSTRUCT); properties[PROP_CONTEXT] = g_param_spec_string ( "context", "Module Stream Context", "The context of this module stream. Distinguishes between streams with " "the same version but different dependencies due to module stream " "expansion.", NULL, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS | G_PARAM_CONSTRUCT); properties[PROP_ARCH] = g_param_spec_string ( "arch", "Module Stream Architecture", "The processor architecture of this module stream.", NULL, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS | G_PARAM_CONSTRUCT); g_object_class_install_properties (object_class, N_PROPS, properties); } static void modulemd_module_stream_init (ModulemdModuleStream *UNUSED (self)) { } void modulemd_module_stream_associate_translation (ModulemdModuleStream *self, ModulemdTranslation *translation) { g_return_if_fail (MODULEMD_IS_MODULE_STREAM (self)); ModulemdModuleStreamPrivate *priv = modulemd_module_stream_get_instance_private (self); g_clear_pointer (&priv->translation, g_object_unref); if (translation != NULL) { priv->translation = g_object_ref (translation); } } ModulemdTranslation * modulemd_module_stream_get_translation (ModulemdModuleStream *self) { g_return_val_if_fail (MODULEMD_IS_MODULE_STREAM (self), NULL); ModulemdModuleStreamPrivate *priv = modulemd_module_stream_get_instance_private (self); return priv->translation; } ModulemdTranslationEntry * modulemd_module_stream_get_translation_entry (ModulemdModuleStream *self, const gchar *locale) { g_return_val_if_fail (MODULEMD_IS_MODULE_STREAM (self), NULL); if (locale == NULL) { return NULL; } if (g_str_equal (locale, "C")) { return NULL; } ModulemdModuleStreamPrivate *priv = modulemd_module_stream_get_instance_private (self); if (priv->translation == NULL) { return NULL; } return modulemd_translation_get_translation_entry (priv->translation, locale); } gboolean modulemd_module_stream_emit_yaml_base (ModulemdModuleStream *self, yaml_emitter_t *emitter, GError **error) { MODULEMD_INIT_TRACE (); g_autofree gchar *version_string = NULL; if (modulemd_module_stream_get_version (self) != 0) { version_string = g_strdup_printf ( "%" PRIu64, modulemd_module_stream_get_version (self)); } /* Emit document headers */ if (!modulemd_yaml_emit_document_headers ( emitter, MODULEMD_YAML_DOC_MODULESTREAM, modulemd_module_stream_get_mdversion (self), error)) { return FALSE; } /* Start data: */ EMIT_MAPPING_START (emitter, error); if (modulemd_module_stream_get_module_name (self) != NULL && !modulemd_module_stream_is_autogen_module_name (self)) { EMIT_KEY_VALUE_STRING ( emitter, error, "name", modulemd_module_stream_get_module_name (self)); } /* Always emit the stream quoted, since a purely numeric-looking stream such * as 5.30 might otherwise be interpreted by parsers like pyyaml as a number * and result in being read (and written) as '5.3'. */ if (modulemd_module_stream_get_stream_name (self) != NULL && !modulemd_module_stream_is_autogen_stream_name (self)) { EMIT_KEY_VALUE_FULL (emitter, error, "stream", modulemd_module_stream_get_stream_name (self), YAML_DOUBLE_QUOTED_SCALAR_STYLE); } EMIT_KEY_VALUE_IF_SET (emitter, error, "version", version_string); EMIT_KEY_VALUE_STRING_IF_SET ( emitter, error, "context", modulemd_module_stream_get_context (self)); /* The rest of the fields will be emitted by the version-specific emitters */ return TRUE; } gboolean modulemd_module_stream_depends_on_stream (ModulemdModuleStream *self, const gchar *module_name, const gchar *stream_name) { ModulemdModuleStreamClass *klass; g_return_val_if_fail (MODULEMD_IS_MODULE_STREAM (self), FALSE); klass = MODULEMD_MODULE_STREAM_GET_CLASS (self); g_return_val_if_fail (klass->depends_on_stream, FALSE); return klass->depends_on_stream (self, module_name, stream_name); } gboolean modulemd_module_stream_build_depends_on_stream (ModulemdModuleStream *self, const gchar *module_name, const gchar *stream_name) { ModulemdModuleStreamClass *klass; g_return_val_if_fail (MODULEMD_IS_MODULE_STREAM (self), FALSE); klass = MODULEMD_MODULE_STREAM_GET_CLASS (self); g_return_val_if_fail (klass->build_depends_on_stream, FALSE); return klass->build_depends_on_stream (self, module_name, stream_name); } gboolean modulemd_module_stream_includes_nevra (ModulemdModuleStream *self, const gchar *nevra_pattern) { ModulemdModuleStreamVersionEnum version; g_return_val_if_fail (MODULEMD_IS_MODULE_STREAM (self), FALSE); version = modulemd_module_stream_get_mdversion (self); switch (version) { case MD_MODULESTREAM_VERSION_ONE: return modulemd_module_stream_v1_includes_nevra ( MODULEMD_MODULE_STREAM_V1 (self), nevra_pattern); break; case MD_MODULESTREAM_VERSION_TWO: return modulemd_module_stream_v2_includes_nevra ( MODULEMD_MODULE_STREAM_V2 (self), nevra_pattern); break; default: /* We should never reach here */ g_return_val_if_reached (FALSE); break; } return FALSE; } void modulemd_module_stream_set_autogen_module_name (ModulemdModuleStream *self, guint id) { g_autofree gchar *name = NULL; if (!modulemd_module_stream_get_module_name (self)) { name = g_strdup_printf ("__unnamed_module_%u", id); modulemd_module_stream_set_module_name (self, name); g_clear_pointer (&name, g_free); } } void modulemd_module_stream_set_autogen_stream_name (ModulemdModuleStream *self, guint id) { g_autofree gchar *name = NULL; if (!modulemd_module_stream_get_stream_name (self)) { name = g_strdup_printf ("__unnamed_stream_%u", id); modulemd_module_stream_set_stream_name (self, name); g_clear_pointer (&name, g_free); } } gboolean modulemd_module_stream_is_autogen_module_name (ModulemdModuleStream *self) { const gchar *name = NULL; name = modulemd_module_stream_get_module_name (self); if (name && g_str_has_prefix (name, "__unnamed_module_")) { return TRUE; } return FALSE; } gboolean modulemd_module_stream_is_autogen_stream_name (ModulemdModuleStream *self) { const gchar *name = NULL; name = modulemd_module_stream_get_stream_name (self); if (name && g_str_has_prefix (name, "__unnamed_stream_")) { return TRUE; } return FALSE; } void modulemd_module_stream_clear_autogen_module_name (ModulemdModuleStream *self) { if (modulemd_module_stream_is_autogen_module_name (self)) { modulemd_module_stream_set_module_name (self, NULL); } } void modulemd_module_stream_clear_autogen_stream_name (ModulemdModuleStream *self) { if (modulemd_module_stream_is_autogen_stream_name (self)) { modulemd_module_stream_set_stream_name (self, NULL); } } fedora-modularity-libmodulemd-357799c/modulemd/modulemd-module.c000066400000000000000000001002661502446517500250110ustar00rootroot00000000000000/* * This file is part of libmodulemd * Copyright (C) 2018 Red Hat, Inc. * * Fedora-License-Identifier: MIT * SPDX-2.0-License-Identifier: MIT * SPDX-3.0-License-Identifier: MIT * * This program is free software. * For more information on the license, see COPYING. * For more information on free software, see . */ #include #include #include #include "modulemd-errors.h" #include "modulemd-module.h" #include "private/glib-extensions.h" #include "private/modulemd-module-private.h" #include "private/modulemd-module-stream-private.h" #include "private/modulemd-translation-private.h" #include "private/modulemd-obsoletes-private.h" #include "private/modulemd-util.h" #include "private/modulemd-yaml.h" struct _ModulemdModule { GObject parent_instance; gchar *module_name; GPtrArray *streams; ModulemdDefaults *defaults; GHashTable *translations; GPtrArray *obsoletes; }; G_DEFINE_TYPE (ModulemdModule, modulemd_module, G_TYPE_OBJECT) enum { PROP_0, PROP_MODULE_NAME, N_PROPS }; static GParamSpec *properties[N_PROPS]; ModulemdModule * modulemd_module_new (const gchar *module_name) { return g_object_new (MODULEMD_TYPE_MODULE, "module-name", module_name, NULL); } ModulemdModule * modulemd_module_copy (ModulemdModule *self) { g_autoptr (ModulemdModule) m = NULL; g_return_val_if_fail (MODULEMD_IS_MODULE (self), NULL); gsize i = 0; m = modulemd_module_new (modulemd_module_get_module_name (self)); m->defaults = modulemd_defaults_copy (self->defaults); for (i = 0; i < self->streams->len; i++) { g_ptr_array_add (m->streams, g_ptr_array_index (self->streams, i)); } for (i = 0; i < self->obsoletes->len; i++) { g_ptr_array_add ( m->obsoletes, modulemd_obsoletes_copy (g_ptr_array_index (self->obsoletes, i))); } return g_steal_pointer (&m); } gboolean modulemd_module_validate (ModulemdModule *UNUSED (self), GError **UNUSED (error)) { /* No validation yet */ return TRUE; } static void modulemd_module_finalize (GObject *object) { ModulemdModule *self = (ModulemdModule *)object; g_clear_pointer (&self->module_name, g_free); g_clear_object (&self->defaults); g_clear_pointer (&self->streams, g_ptr_array_unref); g_clear_pointer (&self->translations, g_hash_table_unref); g_clear_pointer (&self->obsoletes, g_ptr_array_unref); G_OBJECT_CLASS (modulemd_module_parent_class)->finalize (object); } static void modulemd_module_set_module_name (ModulemdModule *self, const gchar *module_name) { g_return_if_fail (MODULEMD_IS_MODULE (self)); g_return_if_fail (module_name); g_clear_pointer (&self->module_name, g_free); self->module_name = g_strdup (module_name); g_object_notify_by_pspec (G_OBJECT (self), properties[PROP_MODULE_NAME]); } const gchar * modulemd_module_get_module_name (ModulemdModule *self) { g_return_val_if_fail (MODULEMD_IS_MODULE (self), NULL); return self->module_name; } static void modulemd_module_get_property (GObject *object, guint prop_id, GValue *value, GParamSpec *pspec) { ModulemdModule *self = MODULEMD_MODULE (object); switch (prop_id) { case PROP_MODULE_NAME: g_value_set_string (value, modulemd_module_get_module_name (self)); break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); } } static void modulemd_module_set_property (GObject *object, guint prop_id, const GValue *value, GParamSpec *pspec) { ModulemdModule *self = MODULEMD_MODULE (object); switch (prop_id) { case PROP_MODULE_NAME: modulemd_module_set_module_name (self, g_value_get_string (value)); break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); } } static void modulemd_module_class_init (ModulemdModuleClass *klass) { GObjectClass *object_class = G_OBJECT_CLASS (klass); object_class->finalize = modulemd_module_finalize; object_class->get_property = modulemd_module_get_property; object_class->set_property = modulemd_module_set_property; properties[PROP_MODULE_NAME] = g_param_spec_string ( "module-name", "Module name", "The name of this module.", NULL, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS | G_PARAM_CONSTRUCT_ONLY); g_object_class_install_properties (object_class, N_PROPS, properties); } static void modulemd_module_init (ModulemdModule *self) { self->streams = g_ptr_array_new_full (0, g_object_unref); self->translations = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, g_object_unref); self->obsoletes = g_ptr_array_new_full (0, g_object_unref); } ModulemdDefaultsVersionEnum modulemd_module_set_defaults (ModulemdModule *self, ModulemdDefaults *defaults, ModulemdDefaultsVersionEnum index_mdversion, GError **error) { g_autoptr (ModulemdDefaults) upgraded_defaults = NULL; g_autoptr (GError) nested_error = NULL; g_return_val_if_fail (MODULEMD_IS_MODULE (self), MD_DEFAULTS_VERSION_ERROR); if (defaults == NULL) { /* If we are empty here, return MD_DEFAULTS_VERSION_UNSET to report * a successful unsetting. */ g_clear_object (&self->defaults); return MD_DEFAULTS_VERSION_UNSET; } /* We should never get a defaults object added whose module name doesn't * match. */ if (g_strcmp0 (modulemd_defaults_get_module_name (defaults), modulemd_module_get_module_name (self)) != 0) { g_set_error (error, MODULEMD_ERROR, MMD_ERROR_VALIDATE, "Attempted to add defaults for module '%s' to module '%s'", modulemd_defaults_get_module_name (defaults), modulemd_module_get_module_name (self)); return MD_DEFAULTS_VERSION_ERROR; } /* For Modulemd.ModuleIndex, we always want all entries to have the same * version, so that merges can be performed. If this Defaults object has a * lower mdversion than the Index, upgrade it to that version. * * We only call this if the mdversion is definitely lower, because the * upgrade() routine is not designed to handle downgrades. */ if (modulemd_defaults_get_mdversion (defaults) < (guint64)index_mdversion) { upgraded_defaults = modulemd_defaults_upgrade (defaults, index_mdversion, &nested_error); if (!upgraded_defaults) { g_propagate_error (error, g_steal_pointer (&nested_error)); return MD_DEFAULTS_VERSION_ERROR; } } else { /* The new defaults were of the same or a higher version, so just copy it * and return that. The ModulemdModuleIndex will handle upgrading other * Defaults in the index to match. */ upgraded_defaults = modulemd_defaults_copy (defaults); } /* Return the mdversion we saved so that the Index can check to see if we * need to upgrade other modules to match. */ g_clear_object (&self->defaults); self->defaults = g_steal_pointer (&upgraded_defaults); return modulemd_defaults_get_mdversion (self->defaults); } ModulemdDefaults * modulemd_module_get_defaults (ModulemdModule *self) { g_return_val_if_fail (MODULEMD_IS_MODULE (self), NULL); return self->defaults; } ModulemdModuleStreamVersionEnum modulemd_module_add_stream (ModulemdModule *self, ModulemdModuleStream *stream, ModulemdModuleStreamVersionEnum index_mdversion, GError **error) { ModulemdModuleStream *old = NULL; ModulemdTranslation *translation = NULL; ModulemdObsoletes *obsoletes = NULL; ModulemdModuleStream *newstream = NULL; g_autoptr (ModulemdModule) newmodule = NULL; g_autoptr (GError) nested_error = NULL; ModulemdModuleStreamVersionEnum new_mdversion; const gchar *module_name = NULL; const gchar *stream_name = NULL; GPtrArray *allstreams; g_return_val_if_fail (MODULEMD_IS_MODULE (self), MD_MODULESTREAM_VERSION_ERROR); g_return_val_if_fail (MODULEMD_IS_MODULE_STREAM (stream), MD_MODULESTREAM_VERSION_ERROR); module_name = modulemd_module_stream_get_module_name (stream); stream_name = modulemd_module_stream_get_stream_name (stream); if (!module_name) { g_set_error ( error, MODULEMD_ERROR, MMD_ERROR_VALIDATE, "Attempted to add stream with no module name to module '%s'", modulemd_module_get_module_name (self)); return MD_MODULESTREAM_VERSION_ERROR; } if (!stream_name) { g_set_error ( error, MODULEMD_ERROR, MMD_ERROR_VALIDATE, "Attempted to add stream with no stream name to module '%s'", modulemd_module_get_module_name (self)); return MD_MODULESTREAM_VERSION_ERROR; } /* We should never get a stream object added whose module name doesn't * match. */ if (g_strcmp0 (module_name, modulemd_module_get_module_name (self)) != 0) { g_set_error (error, MODULEMD_ERROR, MMD_ERROR_VALIDATE, "Attempted to add stream for module '%s' to module '%s'", module_name, modulemd_module_get_module_name (self)); return MD_MODULESTREAM_VERSION_ERROR; } old = modulemd_module_get_stream_by_NSVCA ( self, modulemd_module_stream_get_stream_name (stream), modulemd_module_stream_get_version (stream), modulemd_module_stream_get_context (stream), modulemd_module_stream_get_arch (stream), &nested_error); if (old != NULL) { /* We're probably deduplicating content here, so remove the old one in * favor of the new one. */ if (!modulemd_module_stream_equals (old, stream)) { g_autofree gchar *nsvca = modulemd_module_stream_get_NSVCA_as_string (stream); /* The two streams have matching NSVCA, but differ in content */ g_set_error (error, MODULEMD_ERROR, MMD_ERROR_VALIDATE, "Encountered two streams with matching NSVCA %s but " "differing content", nsvca); return MD_MODULESTREAM_VERSION_ERROR; } /* First, drop the existing stream */ g_ptr_array_remove (self->streams, old); old = NULL; } else if (old == NULL && g_error_matches (nested_error, MODULEMD_ERROR, MMD_ERROR_TOO_MANY_MATCHES)) { /* It should be impossible to get more than one error back here */ g_propagate_error (error, g_steal_pointer (&nested_error)); return MD_MODULESTREAM_VERSION_ERROR; } g_clear_error (&nested_error); obsoletes = modulemd_module_get_newest_active_obsoletes ( self, stream_name, modulemd_module_stream_get_context (stream)); if (obsoletes && index_mdversion < MD_MODULESTREAM_VERSION_TWO) { /* Obsoletes work only with mdversion two and higher */ g_set_error_literal ( error, MODULEMD_ERROR, MMD_ERROR_UPGRADE, "ModuleStream obsoletes requires mdversion two or greater."); return MD_MODULESTREAM_VERSION_ERROR; } if (modulemd_module_stream_get_mdversion (stream) < (guint64)index_mdversion) { /* If the stream we were passed is of a lower mdversion version than the * index, upgrade it to the index version. */ newmodule = modulemd_module_stream_upgrade_ext ( stream, index_mdversion, &nested_error); if (!newmodule) { g_propagate_error (error, g_steal_pointer (&nested_error)); return MD_MODULESTREAM_VERSION_ERROR; } new_mdversion = index_mdversion; } else { /* Otherwise the current stream is already at the desired mdversion, add * it to a new temporary module. */ newmodule = modulemd_module_new (module_name); g_ptr_array_add (newmodule->streams, g_object_ref (stream)); new_mdversion = modulemd_module_stream_get_mdversion (stream); } /* loop through all streams in the index of (possibly upgraded) modules */ allstreams = modulemd_module_get_all_streams (newmodule); for (guint i = 0; i < allstreams->len; i++) { newstream = g_ptr_array_index (allstreams, i); g_ptr_array_add (self->streams, g_object_ref (newstream)); translation = g_hash_table_lookup ( self->translations, modulemd_module_stream_get_stream_name (stream)); if (translation != NULL) { modulemd_module_stream_associate_translation (newstream, translation); } if (obsoletes != NULL) { switch (new_mdversion) { case MD_MODULESTREAM_VERSION_TWO: modulemd_module_stream_v2_associate_obsoletes ( (ModulemdModuleStreamV2 *)newstream, obsoletes); break; default: g_return_val_if_reached (MD_MODULESTREAM_VERSION_ERROR); } } } g_clear_object (&newmodule); return new_mdversion; } GStrv modulemd_module_get_stream_names_as_strv (ModulemdModule *self) { g_return_val_if_fail (MODULEMD_IS_MODULE (self), NULL); if (!self->streams) { return NULL; } g_autoptr (GHashTable) stream_names = g_hash_table_new (g_str_hash, g_str_equal); for (guint i = 0; i < self->streams->len; i++) { g_hash_table_add (stream_names, (void *)modulemd_module_stream_get_stream_name ( g_ptr_array_index (self->streams, i))); } return modulemd_ordered_str_keys_as_strv (stream_names); } GPtrArray * modulemd_module_get_all_streams (ModulemdModule *self) { g_return_val_if_fail (MODULEMD_IS_MODULE (self), NULL); return self->streams; } GPtrArray * modulemd_module_get_streams_by_stream_name_as_list (ModulemdModule *self, const gchar *stream_name) { g_return_val_if_fail (MODULEMD_IS_MODULE (self), NULL); return modulemd_module_search_streams (self, stream_name, 0, NULL, NULL); } ModulemdModuleStream * modulemd_module_get_stream_by_NSVC (ModulemdModule *self, const gchar *stream_name, const guint64 version, const gchar *context) { return modulemd_module_get_stream_by_NSVCA ( self, stream_name, version, context, NULL, NULL); } GPtrArray * modulemd_module_search_streams_by_glob (ModulemdModule *self, const gchar *stream_name, const gchar *version, const gchar *context, const gchar *arch) { gsize i = 0; g_autoptr (GPtrArray) matching_streams = NULL; ModulemdModuleStream *under_consideration = NULL; g_autofree gchar *version_str = NULL; g_return_val_if_fail (MODULEMD_IS_MODULE (self), NULL); /* Assume the worst-case scenario that all streams match to spare us extra * mallocs. */ matching_streams = g_ptr_array_sized_new (self->streams->len); for (i = 0; i < self->streams->len; i++) { g_clear_pointer (&version_str, g_free); under_consideration = (ModulemdModuleStream *)g_ptr_array_index (self->streams, i); /* Skip this one unless the stream name matches */ if (!modulemd_fnmatch ( stream_name, modulemd_module_stream_get_stream_name (under_consideration))) { continue; } /* Skip this one unless the stream version matches OR the version is zero * which indicates that it shouldn't prevent the other cases from * matching. */ if (version) { version_str = g_strdup_printf ( "%" PRIu64, modulemd_module_stream_get_version (under_consideration)); if (!modulemd_fnmatch (version, version_str)) { continue; } } if (!modulemd_fnmatch ( context, modulemd_module_stream_get_context (under_consideration))) { continue; } if (!modulemd_fnmatch ( arch, modulemd_module_stream_get_arch (under_consideration))) { continue; } g_ptr_array_add (matching_streams, under_consideration); } g_ptr_array_sort (matching_streams, compare_streams); return g_steal_pointer (&matching_streams); } GPtrArray * modulemd_module_search_streams_by_nsvca_glob (ModulemdModule *self, const gchar *nsvca_pattern) { gsize i = 0; g_autoptr (GPtrArray) matching_streams = NULL; ModulemdModuleStream *under_consideration = NULL; g_autofree gchar *nsvca = NULL; g_return_val_if_fail (MODULEMD_IS_MODULE (self), NULL); /* Assume the worst-case scenario that all streams match to spare us extra * mallocs. */ matching_streams = g_ptr_array_sized_new (self->streams->len); for (i = 0; i < self->streams->len; i++) { under_consideration = (ModulemdModuleStream *)g_ptr_array_index (self->streams, i); nsvca = modulemd_module_stream_get_NSVCA_as_string (under_consideration); if (nsvca_pattern == NULL || modulemd_fnmatch (nsvca_pattern, nsvca)) { g_ptr_array_add (matching_streams, under_consideration); } g_clear_pointer (&nsvca, g_free); } return g_steal_pointer (&matching_streams); } GPtrArray * modulemd_module_search_streams (ModulemdModule *self, const gchar *stream_name, const guint64 version, const gchar *context, const gchar *arch) { g_autofree gchar *version_str = NULL; g_return_val_if_fail (MODULEMD_IS_MODULE (self), NULL); if (version) { version_str = g_strdup_printf ("%" PRIu64, version); } return modulemd_module_search_streams_by_glob ( self, stream_name, version_str, context, arch); } ModulemdModuleStream * modulemd_module_get_stream_by_NSVCA (ModulemdModule *self, const gchar *stream_name, const guint64 version, const gchar *context, const gchar *arch, GError **error) { g_autoptr (GPtrArray) matching_streams = NULL; g_return_val_if_fail (MODULEMD_IS_MODULE (self), NULL); matching_streams = modulemd_module_search_streams (self, stream_name, version, context, arch); if (matching_streams->len == 0) { g_set_error ( error, MODULEMD_ERROR, MMD_ERROR_NO_MATCHES, "No streams matched"); return NULL; } if (matching_streams->len > 1) { g_set_error (error, MODULEMD_ERROR, MMD_ERROR_TOO_MANY_MATCHES, "Multiple ModulemdModuleStreams matched"); return NULL; } /* Exactly one result, so return it */ return g_ptr_array_index (matching_streams, 0); } typedef struct _modulemd_nsvca { const gchar *stream_name; guint64 version; const gchar *context; const gchar *arch; } modulemd_nsvca; static void modulemd_nsvca_free (gpointer nsvca) { /* All of the fields are just pointers to static data, * so nothing to free here. */ g_free ((modulemd_nsvca *)nsvca); } G_DEFINE_AUTOPTR_CLEANUP_FUNC (modulemd_nsvca, modulemd_nsvca_free); static gboolean match_nsvca (gconstpointer haystraw, gconstpointer needle) { ModulemdModuleStream *stream = (ModulemdModuleStream *)haystraw; modulemd_nsvca *nsvca = (modulemd_nsvca *)needle; if (!g_str_equal (nsvca->stream_name, modulemd_module_stream_get_stream_name (stream))) { return FALSE; } if (nsvca->version) { if (nsvca->version != modulemd_module_stream_get_version (stream)) { return FALSE; } } if (nsvca->context) { if (!g_str_equal (nsvca->context, modulemd_module_stream_get_context (stream))) { return FALSE; } } if (nsvca->arch) { if (!g_str_equal (nsvca->arch, modulemd_module_stream_get_arch (stream))) { return FALSE; } } return TRUE; } void modulemd_module_remove_streams_by_NSVCA (ModulemdModule *self, const gchar *stream_name, const guint64 version, const gchar *context, const gchar *arch) { gboolean found = FALSE; guint index; g_autoptr (modulemd_nsvca) nsvca = g_malloc0_n (1, sizeof (modulemd_nsvca)); nsvca->stream_name = stream_name; nsvca->version = version; nsvca->context = context; nsvca->arch = arch; /* Iterate through the streams and remove any that match the requested * parameters */ do { found = g_ptr_array_find_with_equal_func ( self->streams, nsvca, match_nsvca, &index); if (found) { g_ptr_array_remove_index (self->streams, index); } } while (found); } void modulemd_module_add_translation (ModulemdModule *self, ModulemdTranslation *translation) { gsize i; ModulemdModuleStream *stream = NULL; ModulemdTranslation *newtrans = NULL; g_return_if_fail ( g_str_equal (modulemd_translation_get_module_name (translation), modulemd_module_get_module_name (self))); newtrans = modulemd_translation_copy (translation); g_hash_table_replace ( self->translations, g_strdup (modulemd_translation_get_module_stream (translation)), newtrans); for (i = 0; i < self->streams->len; i++) { stream = (ModulemdModuleStream *)g_ptr_array_index (self->streams, i); if (!g_str_equal (modulemd_translation_get_module_stream (newtrans), modulemd_module_stream_get_stream_name (stream))) { continue; } modulemd_module_stream_associate_translation (stream, newtrans); } } GPtrArray * modulemd_module_get_translated_streams (ModulemdModule *self) { return modulemd_ordered_str_keys (self->translations, modulemd_strcmp_sort); } ModulemdTranslation * modulemd_module_get_translation (ModulemdModule *self, const gchar *stream) { return g_hash_table_lookup (self->translations, stream); } void modulemd_module_add_obsoletes (ModulemdModule *self, ModulemdObsoletes *obsoletes) { gsize i; ModulemdModuleStream *stream = NULL; ModulemdObsoletes *new_obsoletes = NULL; ModulemdObsoletes *current_obsoletes = NULL; g_return_if_fail ( g_str_equal (modulemd_obsoletes_get_module_name (obsoletes), modulemd_module_get_module_name (self))); new_obsoletes = modulemd_obsoletes_copy (obsoletes); const gchar *stream_str = modulemd_obsoletes_get_module_stream (new_obsoletes); const gchar *context_str = modulemd_obsoletes_get_module_context (new_obsoletes); // First if we already have an obsolete with identical module, // stream, contex tand modified time override it ModulemdObsoletes *temp_obsoletes = NULL; for (guint j = 0; j < self->obsoletes->len; j++) { temp_obsoletes = g_ptr_array_index (self->obsoletes, j); if (g_strcmp0 (modulemd_obsoletes_get_module_stream (obsoletes), modulemd_obsoletes_get_module_stream (temp_obsoletes))) { continue; } if (modulemd_obsoletes_get_modified (temp_obsoletes) != modulemd_obsoletes_get_modified (obsoletes)) { continue; } if (g_strcmp0 (modulemd_obsoletes_get_module_context (obsoletes), modulemd_obsoletes_get_module_context (temp_obsoletes))) { continue; } g_info ( "Overriding existing obsolete because of identical stream: %s, " "context: %s and modified time: %" PRIu64 ".", modulemd_obsoletes_get_module_stream (obsoletes), modulemd_obsoletes_get_module_context (obsoletes), modulemd_obsoletes_get_modified (obsoletes)); g_ptr_array_remove (self->obsoletes, temp_obsoletes); break; } g_ptr_array_add (self->obsoletes, new_obsoletes); if (!modulemd_obsoletes_is_active (new_obsoletes)) { return; } for (i = 0; i < self->streams->len; i++) { stream = (ModulemdModuleStream *)g_ptr_array_index (self->streams, i); if (!g_str_equal (stream_str, modulemd_module_stream_get_stream_name (stream))) { continue; } /* If no context specified and new_obsoletes is newer set it for all matching * streams */ if (context_str) { if (g_strcmp0 (context_str, modulemd_module_stream_get_context (stream))) { continue; } } switch (modulemd_module_stream_get_mdversion (stream)) { case MD_MODULESTREAM_VERSION_TWO: current_obsoletes = modulemd_module_stream_v2_get_obsoletes ( (ModulemdModuleStreamV2 *)stream); break; default: g_info ( "ModuleStream obsoletes requires mdversion two or greater: " "module: %s, stream: %s, context: %s, mdversion: %u", modulemd_module_get_module_name (self), stream_str, context_str, (uint)modulemd_module_stream_get_mdversion (stream)); g_return_if_reached (); } if (current_obsoletes) { guint64 cur_obsoletes_mod = modulemd_obsoletes_get_modified (current_obsoletes); guint64 new_obsoletes_mod = modulemd_obsoletes_get_modified (new_obsoletes); if (cur_obsoletes_mod > new_obsoletes_mod) { continue; } else if (cur_obsoletes_mod == new_obsoletes_mod) { /* In case of identical modified dates, do not override more specific * obsoletes (obsoletes with context) with obsoletes without context. Otherwise override * with a warning. */ if (!context_str && modulemd_obsoletes_get_module_context (current_obsoletes)) { continue; } /* Print a warning only if both obsoletes (don't) have specified context */ else if (!context_str || modulemd_obsoletes_get_module_context ( current_obsoletes)) { g_info ( "Multiple obsoletes for module: %s, stream: %s, context: " "%s " "with identical modified time: %" PRIu64, modulemd_module_get_module_name (self), stream_str, context_str, new_obsoletes_mod); } } } switch (modulemd_module_stream_get_mdversion (stream)) { case MD_MODULESTREAM_VERSION_TWO: modulemd_module_stream_v2_associate_obsoletes ( (ModulemdModuleStreamV2 *)stream, new_obsoletes); break; default: /* Internal error */ g_info ( "ModuleStream obsoletes internal error: module: %s, stream: %s, " "context: %s, mdversion: %u", modulemd_module_get_module_name (self), stream_str, context_str, (uint)modulemd_module_stream_get_mdversion (stream)); g_return_if_reached (); } } } gboolean modulemd_module_upgrade_streams (ModulemdModule *self, ModulemdModuleStreamVersionEnum mdversion, GError **error) { g_autoptr (GPtrArray) new_streams = NULL; ModulemdModuleStreamVersionEnum current_mdversion; g_autoptr (ModulemdModuleStream) modulestream = NULL; g_autoptr (ModulemdModuleStream) upgraded_stream = NULL; g_autoptr (ModulemdModule) upgraded_module = NULL; GPtrArray *upgraded_streams = NULL; g_autofree gchar *nsvca = NULL; g_autoptr (GError) nested_error = NULL; g_return_val_if_fail (MODULEMD_IS_MODULE (self), FALSE); new_streams = g_ptr_array_new_full (self->streams->len, g_object_unref); for (guint i = 0; i < self->streams->len; i++) { modulestream = g_object_ref ( MODULEMD_MODULE_STREAM (g_ptr_array_index (self->streams, i))); current_mdversion = modulemd_module_stream_get_mdversion (modulestream); nsvca = modulemd_module_stream_get_NSVCA_as_string (modulestream); if (current_mdversion <= MD_MODULESTREAM_VERSION_UNSET) { g_set_error (error, MODULEMD_ERROR, MMD_ERROR_VALIDATE, "ModuleStream %s had invalid mdversion %i", nsvca, current_mdversion); return FALSE; } if (current_mdversion == mdversion) { /* Already at the right version, so just add it to the new list */ g_ptr_array_add (new_streams, g_steal_pointer (&modulestream)); } else { upgraded_module = modulemd_module_stream_upgrade_ext ( modulestream, mdversion, &nested_error); if (!upgraded_module) { g_propagate_prefixed_error (error, g_steal_pointer (&nested_error), "Error upgrading module stream %s", nsvca); return FALSE; } /* loop through all upgraded streams */ upgraded_streams = modulemd_module_get_all_streams (upgraded_module); for (guint i = 0; i < upgraded_streams->len; i++) { upgraded_stream = g_object_ref (g_ptr_array_index (upgraded_streams, i)); g_ptr_array_add (new_streams, g_steal_pointer (&upgraded_stream)); } g_clear_object (&upgraded_module); } g_clear_pointer (&nsvca, g_free); g_clear_object (&modulestream); } /* Replace the old stream list with the new one */ g_ptr_array_unref (self->streams); self->streams = g_steal_pointer (&new_streams); return TRUE; } GPtrArray * modulemd_module_get_obsoletes (ModulemdModule *self) { g_return_val_if_fail (MODULEMD_IS_MODULE (self), NULL); return self->obsoletes; } ModulemdObsoletes * modulemd_module_get_newest_active_obsoletes (ModulemdModule *self, const gchar *stream, const gchar *context) { ModulemdObsoletes *obsoletes = NULL; ModulemdObsoletes *newestActiveObsoletes = NULL; for (guint i = 0; i < self->obsoletes->len; i++) { obsoletes = (ModulemdObsoletes *)g_ptr_array_index (self->obsoletes, i); if (g_strcmp0 (modulemd_obsoletes_get_module_stream (obsoletes), stream) || g_strcmp0 (modulemd_obsoletes_get_module_context (obsoletes), context) || !modulemd_obsoletes_is_active (obsoletes)) { continue; } if (newestActiveObsoletes) { if (modulemd_obsoletes_get_modified (obsoletes) <= modulemd_obsoletes_get_modified (newestActiveObsoletes)) { continue; } } newestActiveObsoletes = obsoletes; } return newestActiveObsoletes; } static void clear_xmds (gpointer data, gpointer user_data) { g_return_if_fail (MODULEMD_IS_MODULE_STREAM_V2 (data)); modulemd_module_stream_v2_clear_xmd (MODULEMD_MODULE_STREAM_V2 (data)); } void modulemd_module_clear_xmds (ModulemdModule *self) { MODULEMD_INIT_TRACE (); g_return_if_fail (MODULEMD_IS_MODULE (self)); g_ptr_array_foreach (self->streams, clear_xmds, NULL); } fedora-modularity-libmodulemd-357799c/modulemd/modulemd-obsoletes.c000066400000000000000000001117461502446517500255300ustar00rootroot00000000000000/* * This file is part of libmodulemd * Copyright (C) 2018 Red Hat, Inc. * * Fedora-License-Identifier: MIT * SPDX-2.0-License-Identifier: MIT * SPDX-3.0-License-Identifier: MIT * * This program is free software. * For more information on the license, see COPYING. * For more information on free software, see . */ #include #include #include #include "modulemd-errors.h" #include "modulemd-obsoletes.h" #include "private/modulemd-obsoletes-private.h" #include "private/modulemd-util.h" #include "private/modulemd-subdocument-info-private.h" #include "private/modulemd-util.h" #include "private/modulemd-yaml.h" #define O_DEFAULT_STRING "__obsoletes_VALUE_UNSET__" #define O_PLACEHOLDER_STRING "__obsoletes_VALUE_NOT_YET_SET__" struct _ModulemdObsoletes { GObject parent_instance; guint64 mdversion; guint64 modified; gboolean reset; gchar *module_name; gchar *module_stream; gchar *module_context; guint64 eol_date; gchar *message; /* Stream is obsoleted by exactly one other stream */ gchar *obsoleted_by_module_name; gchar *obsoleted_by_module_stream; }; G_DEFINE_TYPE (ModulemdObsoletes, modulemd_obsoletes, G_TYPE_OBJECT) enum { PROP_0, PROP_MDVERSION, PROP_MODIFIED, PROP_RESET, PROP_MODULE_NAME, PROP_MODULE_STREAM, PROP_MODULE_CONTEXT, PROP_EOL_DATE, PROP_MESSAGE, PROP_OBSOLETED_BY_MODULE_NAME, PROP_OBSOLETED_BY_MODULE_STREAM, N_PROPS }; static GParamSpec *properties[N_PROPS]; ModulemdObsoletes * modulemd_obsoletes_new (guint64 mdversion, guint64 modified, const gchar *module_name, const gchar *module_stream, const gchar *message) { // clang-format off return g_object_new (MODULEMD_TYPE_OBSOLETES, "mdversion", mdversion, "modified", modified, "module-name", module_name, "module-stream", module_stream, "message", message, NULL); // clang-format on } ModulemdObsoletes * modulemd_obsoletes_copy (ModulemdObsoletes *self) { g_autoptr (ModulemdObsoletes) o = NULL; g_return_val_if_fail (MODULEMD_IS_OBSOLETES (self), NULL); o = modulemd_obsoletes_new (modulemd_obsoletes_get_mdversion (self), modulemd_obsoletes_get_modified (self), modulemd_obsoletes_get_module_name (self), modulemd_obsoletes_get_module_stream (self), modulemd_obsoletes_get_message (self)); modulemd_obsoletes_set_module_context ( o, modulemd_obsoletes_get_module_context (self)); modulemd_obsoletes_set_reset (o, modulemd_obsoletes_get_reset (self)); modulemd_obsoletes_set_eol_date (o, modulemd_obsoletes_get_eol_date (self)); modulemd_obsoletes_set_obsoleted_by_module_name ( o, modulemd_obsoletes_get_obsoleted_by_module_name (self)); modulemd_obsoletes_set_obsoleted_by_module_stream ( o, modulemd_obsoletes_get_obsoleted_by_module_stream (self)); return g_steal_pointer (&o); } gboolean modulemd_obsoletes_validate (ModulemdObsoletes *self, GError **error) { g_return_val_if_fail (MODULEMD_IS_OBSOLETES (self), FALSE); guint64 mdversion = modulemd_obsoletes_get_mdversion (self); if (!mdversion) { g_set_error_literal (error, MODULEMD_ERROR, MMD_ERROR_VALIDATE, "Metadata version is unset."); return FALSE; } if (mdversion > MD_OBSOLETES_VERSION_LATEST) { g_set_error (error, MODULEMD_ERROR, MMD_ERROR_VALIDATE, "Metadata version unknown: %" PRIu64 ".", mdversion); return FALSE; } if (modulemd_obsoletes_get_modified (self) == 0) { g_set_error_literal (error, MODULEMD_ERROR, MMD_ERROR_VALIDATE, "Obsoletes modified is empty."); return FALSE; } if (!g_strcmp0 (modulemd_obsoletes_get_module_name (self), O_PLACEHOLDER_STRING) || modulemd_obsoletes_get_module_name (self)[0] == '\0') { g_set_error_literal (error, MODULEMD_ERROR, MMD_ERROR_VALIDATE, "Obsoletes module name is unset."); return FALSE; } if (!g_strcmp0 (modulemd_obsoletes_get_module_stream (self), O_PLACEHOLDER_STRING) || modulemd_obsoletes_get_module_stream (self)[0] == '\0') { g_set_error_literal (error, MODULEMD_ERROR, MMD_ERROR_VALIDATE, "Obsoletes stream is unset."); return FALSE; } if (!g_strcmp0 (modulemd_obsoletes_get_message (self), O_PLACEHOLDER_STRING) || !g_strcmp0 (modulemd_obsoletes_get_message (self), O_DEFAULT_STRING) || modulemd_obsoletes_get_message (self)[0] == '\0') { g_set_error_literal (error, MODULEMD_ERROR, MMD_ERROR_VALIDATE, "Obsoletes message is unset."); return FALSE; } /* It should not be possible to set reset and eol_date * at the same time */ if (modulemd_obsoletes_get_reset (self) && modulemd_obsoletes_get_eol_date (self)) { g_set_error_literal ( error, MODULEMD_ERROR, MMD_ERROR_VALIDATE, "Obsoletes cannot have both eol_date and reset attributes set."); return FALSE; } /* It should not be possible to set reset and obsoleted_by* * at the same time */ if (modulemd_obsoletes_get_reset (self) && (modulemd_obsoletes_get_obsoleted_by_module_name (self) || modulemd_obsoletes_get_obsoleted_by_module_stream (self))) { g_set_error_literal ( error, MODULEMD_ERROR, MMD_ERROR_VALIDATE, "Obsoletes cannot have both obsoleted_by and reset attributes set."); return FALSE; } if ((modulemd_obsoletes_get_obsoleted_by_module_name (self) && !modulemd_obsoletes_get_obsoleted_by_module_stream (self)) || (!modulemd_obsoletes_get_obsoleted_by_module_name (self) && modulemd_obsoletes_get_obsoleted_by_module_stream (self))) { g_set_error_literal ( error, MODULEMD_ERROR, MMD_ERROR_VALIDATE, "Obsoletes obsoleted by module name and module stream " "have to be set together."); return FALSE; } return TRUE; } static void modulemd_obsoletes_finalize (GObject *object) { ModulemdObsoletes *self = (ModulemdObsoletes *)object; g_clear_pointer (&self->module_name, g_free); g_clear_pointer (&self->module_stream, g_free); g_clear_pointer (&self->module_context, g_free); g_clear_pointer (&self->message, g_free); g_clear_pointer (&self->obsoleted_by_module_name, g_free); g_clear_pointer (&self->obsoleted_by_module_stream, g_free); G_OBJECT_CLASS (modulemd_obsoletes_parent_class)->finalize (object); } guint64 modulemd_obsoletes_get_mdversion (ModulemdObsoletes *self) { return self->mdversion; } guint64 modulemd_obsoletes_get_modified (ModulemdObsoletes *self) { return self->modified; } gboolean modulemd_obsoletes_get_reset (ModulemdObsoletes *self) { return self->reset; } const gchar * modulemd_obsoletes_get_module_name (ModulemdObsoletes *self) { return self->module_name; } const gchar * modulemd_obsoletes_get_module_stream (ModulemdObsoletes *self) { return self->module_stream; } const gchar * modulemd_obsoletes_get_module_context (ModulemdObsoletes *self) { return self->module_context; } guint64 modulemd_obsoletes_get_eol_date (ModulemdObsoletes *self) { return self->eol_date; } const gchar * modulemd_obsoletes_get_message (ModulemdObsoletes *self) { return self->message; } const gchar * modulemd_obsoletes_get_obsoleted_by_module_name (ModulemdObsoletes *self) { return self->obsoleted_by_module_name; } const gchar * modulemd_obsoletes_get_obsoleted_by_module_stream (ModulemdObsoletes *self) { return self->obsoleted_by_module_stream; } static void modulemd_obsoletes_set_mdversion (ModulemdObsoletes *self, guint64 mdversion) { g_return_if_fail (MODULEMD_IS_OBSOLETES (self)); g_return_if_fail (mdversion != 0); self->mdversion = mdversion; g_object_notify_by_pspec (G_OBJECT (self), properties[PROP_MDVERSION]); } void modulemd_obsoletes_set_modified (ModulemdObsoletes *self, guint64 modified) { g_return_if_fail (MODULEMD_IS_OBSOLETES (self)); self->modified = modified; g_object_notify_by_pspec (G_OBJECT (self), properties[PROP_MODIFIED]); } void modulemd_obsoletes_set_reset (ModulemdObsoletes *self, gboolean reset) { g_return_if_fail (MODULEMD_IS_OBSOLETES (self)); self->reset = reset; g_object_notify_by_pspec (G_OBJECT (self), properties[PROP_RESET]); } static void modulemd_obsoletes_set_module_name (ModulemdObsoletes *self, const gchar *module_name) { g_return_if_fail (MODULEMD_IS_OBSOLETES (self)); g_return_if_fail (module_name); g_return_if_fail (g_strcmp0 (module_name, O_DEFAULT_STRING)); g_clear_pointer (&self->module_name, g_free); self->module_name = g_strdup (module_name); g_object_notify_by_pspec (G_OBJECT (self), properties[PROP_MODULE_NAME]); } static void modulemd_obsoletes_set_module_stream (ModulemdObsoletes *self, const gchar *module_stream) { g_return_if_fail (MODULEMD_IS_OBSOLETES (self)); g_return_if_fail (module_stream); g_return_if_fail (g_strcmp0 (module_stream, O_DEFAULT_STRING)); g_clear_pointer (&self->module_stream, g_free); self->module_stream = g_strdup (module_stream); g_object_notify_by_pspec (G_OBJECT (self), properties[PROP_MODULE_STREAM]); } void modulemd_obsoletes_set_module_context (ModulemdObsoletes *self, const gchar *module_context) { g_return_if_fail (MODULEMD_IS_OBSOLETES (self)); g_clear_pointer (&self->module_context, g_free); self->module_context = g_strdup (module_context); g_object_notify_by_pspec (G_OBJECT (self), properties[PROP_MODULE_CONTEXT]); } void modulemd_obsoletes_set_eol_date (ModulemdObsoletes *self, guint64 eol_date) { g_return_if_fail (MODULEMD_IS_OBSOLETES (self)); self->eol_date = eol_date; g_object_notify_by_pspec (G_OBJECT (self), properties[PROP_EOL_DATE]); } void modulemd_obsoletes_set_message (ModulemdObsoletes *self, const gchar *message) { g_return_if_fail (MODULEMD_IS_OBSOLETES (self)); g_return_if_fail (message); g_clear_pointer (&self->message, g_free); self->message = g_strdup (message); g_object_notify_by_pspec (G_OBJECT (self), properties[PROP_MESSAGE]); } void modulemd_obsoletes_set_obsoleted_by_module_name ( ModulemdObsoletes *self, const gchar *obsoleted_by_module_name) { g_return_if_fail (MODULEMD_IS_OBSOLETES (self)); g_clear_pointer (&self->obsoleted_by_module_name, g_free); self->obsoleted_by_module_name = g_strdup (obsoleted_by_module_name); g_object_notify_by_pspec (G_OBJECT (self), properties[PROP_OBSOLETED_BY_MODULE_NAME]); } void modulemd_obsoletes_set_obsoleted_by_module_stream ( ModulemdObsoletes *self, const gchar *obsoleted_by_module_stream) { g_return_if_fail (MODULEMD_IS_OBSOLETES (self)); g_clear_pointer (&self->obsoleted_by_module_stream, g_free); self->obsoleted_by_module_stream = g_strdup (obsoleted_by_module_stream); g_object_notify_by_pspec (G_OBJECT (self), properties[PROP_OBSOLETED_BY_MODULE_STREAM]); } void modulemd_obsoletes_set_obsoleted_by (ModulemdObsoletes *self, const gchar *obsoleted_by_module_name, const gchar *obsoleted_by_module_stream) { g_return_if_fail (MODULEMD_IS_OBSOLETES (self)); modulemd_obsoletes_set_obsoleted_by_module_name (self, obsoleted_by_module_name); modulemd_obsoletes_set_obsoleted_by_module_stream ( self, obsoleted_by_module_stream); } static void modulemd_obsoletes_get_property (GObject *object, guint prop_id, GValue *value, GParamSpec *pspec) { ModulemdObsoletes *self = MODULEMD_OBSOLETES (object); switch (prop_id) { case PROP_MDVERSION: g_value_set_uint64 (value, modulemd_obsoletes_get_mdversion (self)); break; case PROP_MODIFIED: g_value_set_uint64 (value, modulemd_obsoletes_get_modified (self)); break; case PROP_RESET: g_value_set_boolean (value, modulemd_obsoletes_get_reset (self)); break; case PROP_MODULE_NAME: g_value_set_string (value, modulemd_obsoletes_get_module_name (self)); break; case PROP_MODULE_STREAM: g_value_set_string (value, modulemd_obsoletes_get_module_stream (self)); break; case PROP_MODULE_CONTEXT: g_value_set_string (value, modulemd_obsoletes_get_module_context (self)); break; case PROP_EOL_DATE: g_value_set_uint64 (value, modulemd_obsoletes_get_eol_date (self)); break; case PROP_MESSAGE: g_value_set_string (value, modulemd_obsoletes_get_message (self)); break; case PROP_OBSOLETED_BY_MODULE_NAME: g_value_set_string ( value, modulemd_obsoletes_get_obsoleted_by_module_name (self)); break; case PROP_OBSOLETED_BY_MODULE_STREAM: g_value_set_string ( value, modulemd_obsoletes_get_obsoleted_by_module_stream (self)); break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); } } static void modulemd_obsoletes_set_property (GObject *object, guint prop_id, const GValue *value, GParamSpec *pspec) { ModulemdObsoletes *self = MODULEMD_OBSOLETES (object); switch (prop_id) { case PROP_MDVERSION: modulemd_obsoletes_set_mdversion (self, g_value_get_uint64 (value)); break; case PROP_MODIFIED: modulemd_obsoletes_set_modified (self, g_value_get_uint64 (value)); break; case PROP_RESET: modulemd_obsoletes_set_reset (self, g_value_get_boolean (value)); break; case PROP_MODULE_NAME: modulemd_obsoletes_set_module_name (self, g_value_get_string (value)); break; case PROP_MODULE_STREAM: modulemd_obsoletes_set_module_stream (self, g_value_get_string (value)); break; case PROP_MODULE_CONTEXT: modulemd_obsoletes_set_module_context (self, g_value_get_string (value)); break; case PROP_EOL_DATE: modulemd_obsoletes_set_eol_date (self, g_value_get_uint64 (value)); break; case PROP_MESSAGE: modulemd_obsoletes_set_message (self, g_value_get_string (value)); break; case PROP_OBSOLETED_BY_MODULE_NAME: modulemd_obsoletes_set_obsoleted_by_module_name ( self, g_value_get_string (value)); break; case PROP_OBSOLETED_BY_MODULE_STREAM: modulemd_obsoletes_set_obsoleted_by_module_stream ( self, g_value_get_string (value)); break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); } } static void modulemd_obsoletes_class_init (ModulemdObsoletesClass *klass) { GObjectClass *object_class = G_OBJECT_CLASS (klass); object_class->finalize = modulemd_obsoletes_finalize; object_class->get_property = modulemd_obsoletes_get_property; object_class->set_property = modulemd_obsoletes_set_property; properties[PROP_MDVERSION] = g_param_spec_uint64 ( "mdversion", "Metadata Version", "The metadata version of this obsoletes object.", 0, G_MAXUINT64, 0, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS | G_PARAM_CONSTRUCT_ONLY); properties[PROP_MODIFIED] = g_param_spec_uint64 ( "modified", "Modified", "The last modified time represented as a 64-bit integer " "(such as 201807011200)", 0, G_MAXUINT64, 0, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS | G_PARAM_CONSTRUCT); properties[PROP_MODULE_NAME] = g_param_spec_string ( "module-name", "Module name", "The name of the module to which this obsoletes applies.", O_DEFAULT_STRING, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS | G_PARAM_CONSTRUCT_ONLY); properties[PROP_RESET] = g_param_spec_boolean ( "override-previous", "Override previous", "A boolean option to cancel/reset all previously specified obsoletes.", FALSE, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS | G_PARAM_CONSTRUCT); properties[PROP_MODULE_STREAM] = g_param_spec_string ( "module-stream", "Module stream", "The name of the module stream to which this obsoletes applies.", O_DEFAULT_STRING, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS | G_PARAM_CONSTRUCT_ONLY); properties[PROP_MODULE_CONTEXT] = g_param_spec_string ( "module-context", "Module context", "The name of the module context to which this obsoletes applies.", NULL, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS | G_PARAM_CONSTRUCT); properties[PROP_EOL_DATE] = g_param_spec_uint64 ( "eol-date", "EOL date", "A string representing UTC date in ISO 8601 format: YYYY-MM-DDTHH:MMZ", 0, G_MAXUINT64, 0, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS | G_PARAM_CONSTRUCT); properties[PROP_MESSAGE] = g_param_spec_string ( "message", "Message", "A string describing the change, reason, etc.", O_DEFAULT_STRING, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS | G_PARAM_CONSTRUCT_ONLY); properties[PROP_OBSOLETED_BY_MODULE_NAME] = g_param_spec_string ( "obsoleted-by-module-name", "Obsoleted by module name", "Name of the module that obsoletes this one.", NULL, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS | G_PARAM_CONSTRUCT); properties[PROP_OBSOLETED_BY_MODULE_STREAM] = g_param_spec_string ( "obsoleted-by-module-stream", "Obsoleted by module stream", "Stream of the module that obsoletes this one.", NULL, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS | G_PARAM_CONSTRUCT); g_object_class_install_properties (object_class, N_PROPS, properties); } static void modulemd_obsoletes_init (ModulemdObsoletes *UNUSED (self)) { } /* === YAML Functions === */ static gboolean modulemd_obsoletes_parse_obsoleted_by (yaml_parser_t *parser, ModulemdObsoletes *o, GError **error) { MODULEMD_INIT_TRACE (); MMD_INIT_YAML_EVENT (event); g_autoptr (GError) nested_error = NULL; gchar *value = NULL; gboolean done = FALSE; g_return_val_if_fail (error == NULL || *error == NULL, FALSE); YAML_PARSER_PARSE_WITH_EXIT_BOOL (parser, &event, error); if (event.type != YAML_MAPPING_START_EVENT) { MMD_YAML_ERROR_EVENT_EXIT_BOOL ( error, event, "Missing mapping in obsoletes obsoleted_by."); } while (!done) { YAML_PARSER_PARSE_WITH_EXIT_BOOL (parser, &event, error); switch (event.type) { case YAML_MAPPING_END_EVENT: done = TRUE; break; case YAML_SCALAR_EVENT: if (g_str_equal ((const gchar *)event.data.scalar.value, "module")) { if (modulemd_obsoletes_get_obsoleted_by_module_name (o)) { /* We already have a module name. It should not appear * twice in the same document. */ MMD_YAML_ERROR_EVENT_EXIT_BOOL ( error, event, "Obsoleted by module name encountered twice."); } value = modulemd_yaml_parse_string (parser, &nested_error); if (!value) { MMD_YAML_ERROR_EVENT_EXIT_BOOL ( error, event, "Failed to parse module name in obsoletes obsoleted_by " "data: %s", nested_error->message); } modulemd_obsoletes_set_obsoleted_by_module_name (o, value); g_clear_pointer (&value, g_free); } if (g_str_equal ((const gchar *)event.data.scalar.value, "stream")) { if (modulemd_obsoletes_get_obsoleted_by_module_stream (o)) { /* We already have a module stream. It should not appear * twice in the same document. */ MMD_YAML_ERROR_EVENT_EXIT_BOOL ( error, event, "Obsoleted by module stream encountered twice."); } value = modulemd_yaml_parse_string (parser, &nested_error); if (!value) { MMD_YAML_ERROR_EVENT_EXIT_BOOL ( error, event, "Failed to parse module stream in obsoletes obsoleted_by " "data: %s", nested_error->message); } modulemd_obsoletes_set_obsoleted_by_module_stream (o, value); g_clear_pointer (&value, g_free); } break; default: MMD_YAML_ERROR_EVENT_EXIT_BOOL ( error, event, "Unexpected YAML event in obsoletes obsoleted_by."); break; } yaml_event_delete (&event); } return TRUE; } ModulemdObsoletes * modulemd_obsoletes_parse_yaml (ModulemdSubdocumentInfo *subdoc, gboolean strict, GError **error) { MODULEMD_INIT_TRACE (); MMD_INIT_YAML_PARSER (parser); MMD_INIT_YAML_EVENT (event); g_autoptr (GError) nested_error = NULL; gboolean done = FALSE; g_autofree gchar *value = NULL; guint64 modified; guint64 eol_date; gboolean reset; g_autoptr (ModulemdObsoletes) o = NULL; guint64 mdversion = modulemd_subdocument_info_get_mdversion (subdoc); if (!modulemd_subdocument_info_get_data_parser ( subdoc, &parser, strict, error)) { g_debug ("get_data_parser() failed: %s", (*error)->message); return NULL; } g_return_val_if_fail (error == NULL || *error == NULL, NULL); /* Create an obsoletes with placeholder values. We'll verify that this has been * changed before we return it. This is because we can't guarantee that we * will get the actual values from the YAML before reading any of the other * data, but it's easier to process the rest of the contents with the * constructed object. */ o = modulemd_obsoletes_new (mdversion, 0, O_PLACEHOLDER_STRING, O_PLACEHOLDER_STRING, O_PLACEHOLDER_STRING); YAML_PARSER_PARSE_WITH_EXIT (&parser, &event, error); if (event.type != YAML_MAPPING_START_EVENT) { MMD_YAML_ERROR_EVENT_EXIT ( error, event, "Missing START EVENT mapping in obsoletes data entry"); } //parsing loop while (!done) { YAML_PARSER_PARSE_WITH_EXIT (&parser, &event, error); switch (event.type) { case YAML_MAPPING_END_EVENT: done = TRUE; break; case YAML_SCALAR_EVENT: if (g_str_equal ((const gchar *)event.data.scalar.value, "module")) { if (!g_str_equal (modulemd_obsoletes_get_module_name (o), O_PLACEHOLDER_STRING)) { /* The module name was set earlier, which means it is * not expected here */ MMD_YAML_ERROR_EVENT_EXIT ( error, event, "Module name encountered twice"); } value = modulemd_yaml_parse_string (&parser, &nested_error); if (!value) { MMD_YAML_ERROR_EVENT_EXIT ( error, event, "Failed to parse module name in obsoletes data: %s", nested_error->message); } /* Use a private internal function to set the module_name. * External consumers should never be allowed to change this * value, but we need to be able to modify the placeholder. */ modulemd_obsoletes_set_module_name (o, value); g_clear_pointer (&value, g_free); } else if (g_str_equal ((const gchar *)event.data.scalar.value, "stream")) { if (!g_str_equal (modulemd_obsoletes_get_module_stream (o), O_PLACEHOLDER_STRING)) { MMD_YAML_ERROR_EVENT_EXIT ( error, event, "Module stream encountered twice"); } value = modulemd_yaml_parse_string (&parser, &nested_error); if (!value) { MMD_YAML_ERROR_EVENT_EXIT ( error, event, "Failed to parse module stream in obsoletes data: %s", nested_error->message); } modulemd_obsoletes_set_module_stream (o, value); g_clear_pointer (&value, g_free); } else if (g_str_equal ((const gchar *)event.data.scalar.value, "context")) { if (modulemd_obsoletes_get_module_context (o)) { MMD_YAML_ERROR_EVENT_EXIT ( error, event, "Module context encountered twice"); } value = modulemd_yaml_parse_string (&parser, &nested_error); if (!value) { MMD_YAML_ERROR_EVENT_EXIT ( error, event, "Failed to parse module context in obsoletes data: %s", nested_error->message); } modulemd_obsoletes_set_module_context (o, value); g_clear_pointer (&value, g_free); } else if (g_str_equal ((const gchar *)event.data.scalar.value, "modified")) { value = modulemd_yaml_parse_string (&parser, &nested_error); if (nested_error) { MMD_YAML_ERROR_EVENT_EXIT ( error, event, "Failed to parse modified in obsoletes data: %s", nested_error->message); } modified = modulemd_iso8601date_to_guint64 (value); if (modified == 0) { MMD_YAML_ERROR_EVENT_EXIT ( error, event, "Failed to parse UTC date in ISO 8601 format: " "YYYY-MM-DDTHH:MMZ modified in eol data: %s", value); } modulemd_obsoletes_set_modified (o, modified); g_clear_pointer (&value, g_free); } else if (g_str_equal ((const gchar *)event.data.scalar.value, "eol_date")) { value = modulemd_yaml_parse_string (&parser, &nested_error); if (nested_error) { MMD_YAML_ERROR_EVENT_EXIT ( error, event, "Failed to parse eol_date in obsoletes data: %s", nested_error->message); } eol_date = modulemd_iso8601date_to_guint64 (value); if (eol_date == 0) { MMD_YAML_ERROR_EVENT_EXIT ( error, event, "Failed to parse UTC date in ISO 8601 format: " "YYYY-MM-DD[T ]HH:MMZ eol_date in obsoletes data: %s", value); } modulemd_obsoletes_set_eol_date (o, eol_date); g_clear_pointer (&value, g_free); } else if (g_str_equal ((const gchar *)event.data.scalar.value, "reset")) { reset = modulemd_yaml_parse_bool (&parser, &nested_error); if (nested_error) { MMD_YAML_ERROR_EVENT_EXIT ( error, event, "Failed to parse reset in obsoletes data: %s", nested_error->message); } modulemd_obsoletes_set_reset (o, reset); } else if (g_str_equal ((const gchar *)event.data.scalar.value, "message")) { if (!g_str_equal (modulemd_obsoletes_get_message (o), O_PLACEHOLDER_STRING)) { MMD_YAML_ERROR_EVENT_EXIT ( error, event, "Module message encountered twice"); } value = modulemd_yaml_parse_string (&parser, &nested_error); if (!value) { MMD_YAML_ERROR_EVENT_EXIT ( error, event, "Failed to parse message in obsoletes data: %s", nested_error->message); } modulemd_obsoletes_set_message (o, value); g_clear_pointer (&value, g_free); } else if (g_str_equal ((const gchar *)event.data.scalar.value, "obsoleted_by")) { if (!modulemd_obsoletes_parse_obsoleted_by ( &parser, o, &nested_error)) { g_propagate_error (error, g_steal_pointer (&nested_error)); return NULL; } } else { SKIP_UNKNOWN (&parser, NULL, "Unexpected key in obsoletes data: %s", (const gchar *)event.data.scalar.value); break; } break; default: MMD_YAML_ERROR_EVENT_EXIT ( error, event, "Unexpected YAML event %s in obsoletes data", mmd_yaml_get_event_name (event.type)); break; } yaml_event_delete (&event); } if (!modulemd_obsoletes_validate (o, &nested_error)) { g_propagate_error (error, g_steal_pointer (&nested_error)); return NULL; } return g_steal_pointer (&o); } static gboolean modulemd_obsoletes_emit_obsoleted_by (ModulemdObsoletes *self, yaml_emitter_t *emitter, GError **error) { /* Start the "obsoleted_by:" section */ if (!mmd_emitter_scalar ( emitter, "obsoleted_by", YAML_PLAIN_SCALAR_STYLE, error)) { return FALSE; } /* Start the mapping for "obsoleted_by:" */ if (!mmd_emitter_start_mapping (emitter, YAML_BLOCK_MAPPING_STYLE, error)) { return FALSE; } /* The module name is mandatory if already in obsoleted_by */ if (!mmd_emitter_scalar (emitter, "module", YAML_PLAIN_SCALAR_STYLE, error)) { return FALSE; } if (!mmd_emitter_scalar_string ( emitter, modulemd_obsoletes_get_obsoleted_by_module_name ( MODULEMD_OBSOLETES (self)), error)) { return FALSE; } /* The module stream is mandatory if already in obsoleted_by */ if (!mmd_emitter_scalar (emitter, "stream", YAML_PLAIN_SCALAR_STYLE, error)) { return FALSE; } if (!mmd_emitter_scalar (emitter, modulemd_obsoletes_get_obsoleted_by_module_stream ( MODULEMD_OBSOLETES (self)), YAML_DOUBLE_QUOTED_SCALAR_STYLE, error)) { return FALSE; } /* End the mapping for "obsoleted_by:" */ if (!mmd_emitter_end_mapping (emitter, error)) { return FALSE; } return TRUE; } gboolean modulemd_obsoletes_emit_yaml (ModulemdObsoletes *self, yaml_emitter_t *emitter, GError **error) { MODULEMD_INIT_TRACE (); g_autoptr (GError) nested_error = NULL; guint64 eol_date; g_autofree gchar *modified_string = NULL; g_autofree gchar *eol_date_string = NULL; const gchar *module_context = NULL; if (!modulemd_obsoletes_validate (MODULEMD_OBSOLETES (self), &nested_error)) { /* Validation failed */ g_propagate_prefixed_error (error, g_steal_pointer (&nested_error), "Obsoletes object failed validation: "); return FALSE; } /* First emit the standard document headers */ if (!modulemd_yaml_emit_document_headers ( emitter, MODULEMD_YAML_DOC_OBSOLETES, modulemd_obsoletes_get_mdversion (MODULEMD_OBSOLETES (self)), error)) { return FALSE; } /* Start the data: section mapping */ if (!mmd_emitter_start_mapping (emitter, YAML_BLOCK_MAPPING_STYLE, error)) { return FALSE; } /* Fill in the default data */ /* The modified field is mandatory */ if (!mmd_emitter_scalar ( emitter, "modified", YAML_PLAIN_SCALAR_STYLE, error)) { return FALSE; } modified_string = modulemd_guint64_to_iso8601date ( modulemd_obsoletes_get_modified (MODULEMD_OBSOLETES (self))); if (!modified_string) { g_set_error ( error, MODULEMD_ERROR, MMD_ERROR_VALIDATE, "Cannot convert modified date: %" PRIu64 " to iso8601 date.", modulemd_obsoletes_get_modified (MODULEMD_OBSOLETES (self))); return FALSE; } if (!mmd_emitter_scalar ( emitter, modified_string, YAML_PLAIN_SCALAR_STYLE, error)) { return FALSE; } /* Only output reset if it's TRUE */ if (modulemd_obsoletes_get_reset (self)) { EMIT_KEY_VALUE (emitter, error, "reset", "true"); } /* The module name is mandatory */ if (!mmd_emitter_scalar (emitter, "module", YAML_PLAIN_SCALAR_STYLE, error)) { return FALSE; } if (!mmd_emitter_scalar_string ( emitter, modulemd_obsoletes_get_module_name (MODULEMD_OBSOLETES (self)), error)) { return FALSE; } /* The module stream is mandatory */ if (!mmd_emitter_scalar (emitter, "stream", YAML_PLAIN_SCALAR_STYLE, error)) { return FALSE; } if (!mmd_emitter_scalar ( emitter, modulemd_obsoletes_get_module_stream (MODULEMD_OBSOLETES (self)), YAML_DOUBLE_QUOTED_SCALAR_STYLE, error)) { return FALSE; } /* The module context is optional */ module_context = modulemd_obsoletes_get_module_context (MODULEMD_OBSOLETES (self)); if (module_context) { if (!mmd_emitter_scalar ( emitter, "context", YAML_PLAIN_SCALAR_STYLE, error)) { return FALSE; } if (!mmd_emitter_scalar_string (emitter, module_context, error)) { return FALSE; } } /* The eol_date field is optional */ eol_date = modulemd_obsoletes_get_eol_date (MODULEMD_OBSOLETES (self)); if (eol_date) { eol_date_string = modulemd_guint64_to_iso8601date (eol_date); if (eol_date_string == NULL) { g_set_error (error, MODULEMD_ERROR, MMD_ERROR_VALIDATE, "Cannot convert eol_date: %" PRIu64 " to iso8601 date.", eol_date); return FALSE; } EMIT_KEY_VALUE (emitter, error, "eol_date", eol_date_string); } /* The message is mandatory */ if (!mmd_emitter_scalar (emitter, "message", YAML_PLAIN_SCALAR_STYLE, error)) { return FALSE; } if (!mmd_emitter_scalar_string ( emitter, modulemd_obsoletes_get_message (MODULEMD_OBSOLETES (self)), error)) { return FALSE; } /* Obsoleted_by are optional */ if (modulemd_obsoletes_get_obsoleted_by_module_name ( MODULEMD_OBSOLETES (self)) && modulemd_obsoletes_get_obsoleted_by_module_stream ( MODULEMD_OBSOLETES (self))) { if (!modulemd_obsoletes_emit_obsoleted_by (self, emitter, error)) { return FALSE; } } /* Close the data: section mapping */ if (!mmd_emitter_end_mapping (emitter, error)) { return FALSE; } /* Close the top-level section mapping */ if (!mmd_emitter_end_mapping (emitter, error)) { return FALSE; } /* End the document */ if (!mmd_emitter_end_document (emitter, error)) { return FALSE; } return TRUE; } gboolean modulemd_obsoletes_is_active (ModulemdObsoletes *self) { time_t rawtime; struct tm *tm; time (&rawtime); tm = gmtime (&rawtime); char buf[255]; strftime (buf, sizeof (buf), "%Y%m%d%H%M", tm); guint64 now = g_ascii_strtoull (buf, NULL, 0); if (now >= modulemd_obsoletes_get_eol_date (self)) { return TRUE; } return FALSE; } fedora-modularity-libmodulemd-357799c/modulemd/modulemd-packager-v3.c000066400000000000000000001636121502446517500256330ustar00rootroot00000000000000/* * This file is part of libmodulemd * Copyright (C) 2020 Red Hat, Inc. * * Fedora-License-Identifier: MIT * SPDX-2.0-License-Identifier: MIT * SPDX-3.0-License-Identifier: MIT * * This program is free software. * For more information on the license, see COPYING. * For more information on free software, see . */ #include "private/modulemd-build-config-private.h" #include "private/modulemd-component-private.h" #include "private/modulemd-component-module-private.h" #include "private/modulemd-component-rpm-private.h" #include "private/modulemd-defaults-v1-private.h" #include "private/modulemd-module-stream-private.h" #include "private/modulemd-packager-v3-private.h" #include "private/modulemd-profile-private.h" #include "private/modulemd-subdocument-info-private.h" #include "private/modulemd-util.h" #include "private/modulemd-yaml.h" struct _ModulemdPackagerV3 { GObject parent_instance; gchar *module_name; gchar *stream_name; gchar *summary; gchar *description; GHashTable *module_licenses; /* string set */ GVariant *xmd; GHashTable *build_configs; /* */ gchar *community; gchar *documentation; gchar *tracker; GHashTable *profiles; /* */ GHashTable *rpm_api; /* string set */ GHashTable *rpm_filters; /* string set */ GHashTable *demodularized_rpms; /* string set */ GHashTable *rpm_components; /* */ GHashTable *module_components; /* module_name, g_free); g_clear_pointer (&self->stream_name, g_free); g_clear_pointer (&self->summary, g_free); g_clear_pointer (&self->description, g_free); g_clear_pointer (&self->module_licenses, g_hash_table_unref); g_clear_pointer (&self->xmd, g_variant_unref); g_clear_pointer (&self->build_configs, g_hash_table_unref); g_clear_pointer (&self->community, g_free); g_clear_pointer (&self->documentation, g_free); g_clear_pointer (&self->tracker, g_free); g_clear_pointer (&self->profiles, g_hash_table_unref); g_clear_pointer (&self->rpm_api, g_hash_table_unref); g_clear_pointer (&self->rpm_filters, g_hash_table_unref); g_clear_pointer (&self->demodularized_rpms, g_hash_table_unref); g_clear_pointer (&self->rpm_components, g_hash_table_unref); g_clear_pointer (&self->module_components, g_hash_table_unref); G_OBJECT_CLASS (modulemd_packager_v3_parent_class)->finalize (object); } static void modulemd_packager_v3_class_init (ModulemdPackagerV3Class *klass) { GObjectClass *object_class = G_OBJECT_CLASS (klass); object_class->finalize = modulemd_packager_v3_finalize; } static void modulemd_packager_v3_init (ModulemdPackagerV3 *self) { self->module_licenses = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, NULL); self->build_configs = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, g_object_unref); self->profiles = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, g_object_unref); self->rpm_api = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, NULL); self->rpm_filters = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, NULL); self->demodularized_rpms = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, NULL); self->rpm_components = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, g_object_unref); self->module_components = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, g_object_unref); } ModulemdPackagerV3 * modulemd_packager_v3_copy (ModulemdPackagerV3 *self) { g_autoptr (ModulemdPackagerV3) copy = modulemd_packager_v3_new (); modulemd_packager_v3_set_module_name ( copy, modulemd_packager_v3_get_module_name (self)); modulemd_packager_v3_set_stream_name ( copy, modulemd_packager_v3_get_stream_name (self)); modulemd_packager_v3_set_summary (copy, modulemd_packager_v3_get_summary (self)); modulemd_packager_v3_set_description ( copy, modulemd_packager_v3_get_description (self)); MODULEMD_REPLACE_SET (copy->module_licenses, self->module_licenses); modulemd_packager_v3_set_xmd (copy, modulemd_packager_v3_get_xmd (self)); COPY_HASHTABLE_BY_VALUE_ADDER ( copy, self, build_configs, modulemd_packager_v3_add_build_config); modulemd_packager_v3_set_community ( copy, modulemd_packager_v3_get_community (self)); modulemd_packager_v3_set_documentation ( copy, modulemd_packager_v3_get_documentation (self)); modulemd_packager_v3_set_tracker (copy, modulemd_packager_v3_get_tracker (self)); COPY_HASHTABLE_BY_VALUE_ADDER ( copy, self, profiles, modulemd_packager_v3_add_profile); modulemd_packager_v3_replace_rpm_api (copy, self->rpm_api); modulemd_packager_v3_replace_rpm_filters (copy, self->rpm_filters); modulemd_packager_v3_replace_demodularized_rpms (copy, self->demodularized_rpms); COPY_HASHTABLE_BY_VALUE_ADDER ( copy, self, rpm_components, modulemd_packager_v3_add_component); COPY_HASHTABLE_BY_VALUE_ADDER ( copy, self, module_components, modulemd_packager_v3_add_component); return g_steal_pointer (©); } void modulemd_packager_v3_set_module_name (ModulemdPackagerV3 *self, const gchar *module_name) { g_return_if_fail (MODULEMD_IS_PACKAGER_V3 (self)); g_clear_pointer (&self->module_name, g_free); if (module_name) { self->module_name = g_strdup (module_name); } } const gchar * modulemd_packager_v3_get_module_name (ModulemdPackagerV3 *self) { g_return_val_if_fail (MODULEMD_IS_PACKAGER_V3 (self), NULL); return self->module_name; } void modulemd_packager_v3_set_stream_name (ModulemdPackagerV3 *self, const gchar *stream_name) { g_return_if_fail (MODULEMD_IS_PACKAGER_V3 (self)); g_clear_pointer (&self->stream_name, g_free); if (stream_name) { self->stream_name = g_strdup (stream_name); } } const gchar * modulemd_packager_v3_get_stream_name (ModulemdPackagerV3 *self) { g_return_val_if_fail (MODULEMD_IS_PACKAGER_V3 (self), NULL); return self->stream_name; } void modulemd_packager_v3_set_summary (ModulemdPackagerV3 *self, const gchar *summary) { g_return_if_fail (MODULEMD_IS_PACKAGER_V3 (self)); g_clear_pointer (&self->summary, g_free); if (summary) { self->summary = g_strdup (summary); } } const gchar * modulemd_packager_v3_get_summary (ModulemdPackagerV3 *self) { g_return_val_if_fail (MODULEMD_IS_PACKAGER_V3 (self), NULL); return self->summary; } void modulemd_packager_v3_set_description (ModulemdPackagerV3 *self, const gchar *description) { g_return_if_fail (MODULEMD_IS_PACKAGER_V3 (self)); g_clear_pointer (&self->description, g_free); if (description) { self->description = g_strdup (description); } } const gchar * modulemd_packager_v3_get_description (ModulemdPackagerV3 *self) { g_return_val_if_fail (MODULEMD_IS_PACKAGER_V3 (self), NULL); return self->description; } void modulemd_packager_v3_add_module_license (ModulemdPackagerV3 *self, const gchar *license) { g_return_if_fail (MODULEMD_IS_PACKAGER_V3 (self)); if (!license) { return; } g_hash_table_add (self->module_licenses, g_strdup (license)); } void modulemd_packager_v3_remove_module_license (ModulemdPackagerV3 *self, const gchar *license) { g_return_if_fail (MODULEMD_IS_PACKAGER_V3 (self)); if (!license) { return; } g_hash_table_remove (self->module_licenses, license); } void modulemd_packager_v3_clear_module_licenses (ModulemdPackagerV3 *self) { g_return_if_fail (MODULEMD_IS_PACKAGER_V3 (self)); g_hash_table_remove_all (self->module_licenses); } GStrv modulemd_packager_v3_get_module_licenses_as_strv (ModulemdPackagerV3 *self) { g_return_val_if_fail (MODULEMD_IS_PACKAGER_V3 (self), NULL); return modulemd_ordered_str_keys_as_strv (self->module_licenses); } void modulemd_packager_v3_set_xmd (ModulemdPackagerV3 *self, GVariant *xmd) { g_return_if_fail (MODULEMD_IS_PACKAGER_V3 (self)); /* Do nothing if we were passed the same pointer */ if (self->xmd == xmd) { return; } g_clear_pointer (&self->xmd, g_variant_unref); self->xmd = modulemd_variant_deep_copy (xmd); } GVariant * modulemd_packager_v3_get_xmd (ModulemdPackagerV3 *self) { g_return_val_if_fail (MODULEMD_IS_PACKAGER_V3 (self), NULL); return self->xmd; } guint64 modulemd_packager_v3_get_mdversion (ModulemdPackagerV3 *UNUSED (self)) { return MD_PACKAGER_VERSION_THREE; } void modulemd_packager_v3_add_build_config (ModulemdPackagerV3 *self, ModulemdBuildConfig *buildconfig) { if (!buildconfig) return; g_return_if_fail (MODULEMD_IS_PACKAGER_V3 (self)); g_return_if_fail (MODULEMD_IS_BUILD_CONFIG (buildconfig)); g_hash_table_replace ( self->build_configs, g_strdup (modulemd_build_config_get_context (buildconfig)), modulemd_build_config_copy (buildconfig)); } void modulemd_packager_v3_clear_build_configs (ModulemdPackagerV3 *self) { g_return_if_fail (MODULEMD_IS_PACKAGER_V3 (self)); g_hash_table_remove_all (self->build_configs); } GStrv modulemd_packager_v3_get_build_config_contexts_as_strv ( ModulemdPackagerV3 *self) { g_return_val_if_fail (MODULEMD_IS_PACKAGER_V3 (self), NULL); return modulemd_ordered_str_keys_as_strv (self->build_configs); } ModulemdBuildConfig * modulemd_packager_v3_get_build_config (ModulemdPackagerV3 *self, const gchar *context) { g_return_val_if_fail (MODULEMD_IS_PACKAGER_V3 (self), NULL); return g_hash_table_lookup (self->build_configs, context); } void modulemd_packager_v3_set_community (ModulemdPackagerV3 *self, const gchar *community) { g_return_if_fail (MODULEMD_IS_PACKAGER_V3 (self)); g_clear_pointer (&self->community, g_free); if (community) { self->community = g_strdup (community); } } const gchar * modulemd_packager_v3_get_community (ModulemdPackagerV3 *self) { g_return_val_if_fail (MODULEMD_IS_PACKAGER_V3 (self), NULL); return self->community; } void modulemd_packager_v3_set_documentation (ModulemdPackagerV3 *self, const gchar *documentation) { g_return_if_fail (MODULEMD_IS_PACKAGER_V3 (self)); g_clear_pointer (&self->documentation, g_free); if (documentation) { self->documentation = g_strdup (documentation); } } const gchar * modulemd_packager_v3_get_documentation (ModulemdPackagerV3 *self) { g_return_val_if_fail (MODULEMD_IS_PACKAGER_V3 (self), NULL); return self->documentation; } void modulemd_packager_v3_set_tracker (ModulemdPackagerV3 *self, const gchar *tracker) { g_return_if_fail (MODULEMD_IS_PACKAGER_V3 (self)); g_clear_pointer (&self->tracker, g_free); if (tracker) { self->tracker = g_strdup (tracker); } } const gchar * modulemd_packager_v3_get_tracker (ModulemdPackagerV3 *self) { g_return_val_if_fail (MODULEMD_IS_PACKAGER_V3 (self), NULL); return self->tracker; } void modulemd_packager_v3_add_profile (ModulemdPackagerV3 *self, ModulemdProfile *profile) { if (!profile) { return; } g_return_if_fail (MODULEMD_IS_PACKAGER_V3 (self)); g_return_if_fail (MODULEMD_IS_PROFILE (profile)); ModulemdProfile *copied_profile = modulemd_profile_copy (profile); g_hash_table_replace (self->profiles, g_strdup (modulemd_profile_get_name (profile)), copied_profile); } void modulemd_packager_v3_clear_profiles (ModulemdPackagerV3 *self) { g_return_if_fail (MODULEMD_IS_PACKAGER_V3 (self)); g_hash_table_remove_all (self->profiles); } GStrv modulemd_packager_v3_get_profile_names_as_strv (ModulemdPackagerV3 *self) { g_return_val_if_fail (MODULEMD_IS_PACKAGER_V3 (self), NULL); return modulemd_ordered_str_keys_as_strv (self->profiles); } ModulemdProfile * modulemd_packager_v3_get_profile (ModulemdPackagerV3 *self, const gchar *profile_name) { g_return_val_if_fail (MODULEMD_IS_PACKAGER_V3 (self), NULL); return g_hash_table_lookup (self->profiles, profile_name); } void modulemd_packager_v3_add_rpm_api (ModulemdPackagerV3 *self, const gchar *rpm) { if (!rpm) { return; } g_return_if_fail (MODULEMD_IS_PACKAGER_V3 (self)); g_hash_table_add (self->rpm_api, g_strdup (rpm)); } void modulemd_packager_v3_replace_rpm_api (ModulemdPackagerV3 *self, GHashTable *set) { g_return_if_fail (MODULEMD_IS_PACKAGER_V3 (self)); MODULEMD_REPLACE_SET (self->rpm_api, set); } void modulemd_packager_v3_remove_rpm_api (ModulemdPackagerV3 *self, const gchar *rpm) { if (!rpm) { return; } g_return_if_fail (MODULEMD_IS_PACKAGER_V3 (self)); g_hash_table_remove (self->rpm_api, rpm); } void modulemd_packager_v3_clear_rpm_api (ModulemdPackagerV3 *self) { g_return_if_fail (MODULEMD_IS_PACKAGER_V3 (self)); g_hash_table_remove_all (self->rpm_api); } GStrv modulemd_packager_v3_get_rpm_api_as_strv (ModulemdPackagerV3 *self) { g_return_val_if_fail (MODULEMD_IS_PACKAGER_V3 (self), NULL); return modulemd_ordered_str_keys_as_strv (self->rpm_api); } void modulemd_packager_v3_add_rpm_filter (ModulemdPackagerV3 *self, const gchar *rpm) { if (!rpm) { return; } g_return_if_fail (MODULEMD_IS_PACKAGER_V3 (self)); g_hash_table_add (self->rpm_filters, g_strdup (rpm)); } void modulemd_packager_v3_replace_rpm_filters (ModulemdPackagerV3 *self, GHashTable *set) { g_return_if_fail (MODULEMD_IS_PACKAGER_V3 (self)); MODULEMD_REPLACE_SET (self->rpm_filters, set); } void modulemd_packager_v3_remove_rpm_filter (ModulemdPackagerV3 *self, const gchar *rpm) { if (!rpm) { return; } g_return_if_fail (MODULEMD_IS_PACKAGER_V3 (self)); g_hash_table_remove (self->rpm_filters, rpm); } void modulemd_packager_v3_clear_rpm_filters (ModulemdPackagerV3 *self) { g_return_if_fail (MODULEMD_IS_PACKAGER_V3 (self)); g_hash_table_remove_all (self->rpm_filters); } GStrv modulemd_packager_v3_get_rpm_filters_as_strv (ModulemdPackagerV3 *self) { g_return_val_if_fail (MODULEMD_IS_PACKAGER_V3 (self), NULL); return modulemd_ordered_str_keys_as_strv (self->rpm_filters); } void modulemd_packager_v3_add_demodularized_rpm (ModulemdPackagerV3 *self, const gchar *rpm) { if (!rpm) { return; } g_return_if_fail (MODULEMD_IS_PACKAGER_V3 (self)); g_hash_table_add (self->demodularized_rpms, g_strdup (rpm)); } void modulemd_packager_v3_replace_demodularized_rpms (ModulemdPackagerV3 *self, GHashTable *set) { g_return_if_fail (MODULEMD_IS_PACKAGER_V3 (self)); MODULEMD_REPLACE_SET (self->demodularized_rpms, set); } void modulemd_packager_v3_remove_demodularized_rpm (ModulemdPackagerV3 *self, const gchar *rpm) { if (!rpm) { return; } g_return_if_fail (MODULEMD_IS_PACKAGER_V3 (self)); g_hash_table_remove (self->demodularized_rpms, rpm); } void modulemd_packager_v3_clear_demodularized_rpms (ModulemdPackagerV3 *self) { g_return_if_fail (MODULEMD_IS_PACKAGER_V3 (self)); g_hash_table_remove_all (self->demodularized_rpms); } GStrv modulemd_packager_v3_get_demodularized_rpms (ModulemdPackagerV3 *self) { g_return_val_if_fail (MODULEMD_IS_PACKAGER_V3 (self), NULL); return modulemd_ordered_str_keys_as_strv (self->demodularized_rpms); } void modulemd_packager_v3_add_component (ModulemdPackagerV3 *self, ModulemdComponent *component) { GHashTable *table = NULL; /* Do nothing if we were passed a NULL component */ if (!component) { return; } g_return_if_fail (MODULEMD_IS_PACKAGER_V3 (self)); g_return_if_fail (MODULEMD_IS_COMPONENT (component)); if (MODULEMD_IS_COMPONENT_RPM (component)) { table = self->rpm_components; } else if (MODULEMD_IS_COMPONENT_MODULE (component)) { table = self->module_components; } else { /* Unknown component. Raise a warning and return */ g_return_if_reached (); } /* Add the component to the table. This will replace an existing component * with the same name */ g_hash_table_replace (table, g_strdup (modulemd_component_get_key (component)), modulemd_component_copy (component, NULL)); } void modulemd_packager_v3_remove_module_component (ModulemdPackagerV3 *self, const gchar *component_name) { /* Do nothing if we were passed a NULL component_name */ if (!component_name) { return; } g_return_if_fail (MODULEMD_IS_PACKAGER_V3 (self)); g_hash_table_remove (self->module_components, component_name); } void modulemd_packager_v3_clear_module_components (ModulemdPackagerV3 *self) { g_return_if_fail (MODULEMD_IS_PACKAGER_V3 (self)); g_hash_table_remove_all (self->module_components); } void modulemd_packager_v3_remove_rpm_component (ModulemdPackagerV3 *self, const gchar *component_name) { /* Do nothing if we were passed a NULL component_name */ if (!component_name) { return; } g_return_if_fail (MODULEMD_IS_PACKAGER_V3 (self)); g_hash_table_remove (self->rpm_components, component_name); } void modulemd_packager_v3_clear_rpm_components (ModulemdPackagerV3 *self) { g_return_if_fail (MODULEMD_IS_PACKAGER_V3 (self)); g_hash_table_remove_all (self->rpm_components); } GStrv modulemd_packager_v3_get_module_component_names_as_strv ( ModulemdPackagerV3 *self) { g_return_val_if_fail (MODULEMD_IS_PACKAGER_V3 (self), NULL); return modulemd_ordered_str_keys_as_strv (self->module_components); } GStrv modulemd_packager_v3_get_rpm_component_names_as_strv (ModulemdPackagerV3 *self) { g_return_val_if_fail (MODULEMD_IS_PACKAGER_V3 (self), NULL); return modulemd_ordered_str_keys_as_strv (self->rpm_components); } ModulemdComponentModule * modulemd_packager_v3_get_module_component (ModulemdPackagerV3 *self, const gchar *component_name) { g_return_val_if_fail (MODULEMD_IS_PACKAGER_V3 (self), NULL); return g_hash_table_lookup (self->module_components, component_name); } ModulemdComponentRpm * modulemd_packager_v3_get_rpm_component (ModulemdPackagerV3 *self, const gchar *component_name) { g_return_val_if_fail (MODULEMD_IS_PACKAGER_V3 (self), NULL); return g_hash_table_lookup (self->rpm_components, component_name); } gboolean modulemd_packager_v3_to_defaults (ModulemdPackagerV3 *self, ModulemdDefaults **defaults_ptr, GError **error) { g_autoptr (ModulemdDefaultsV1) defaults = NULL; ModulemdProfile *profile; g_autoptr (GError) nested_error = NULL; GHashTableIter iter; gpointer value; g_return_val_if_fail (error == NULL || *error == NULL, FALSE); g_return_val_if_fail (defaults_ptr == NULL || *defaults_ptr == NULL, FALSE); g_return_val_if_fail (MODULEMD_IS_PACKAGER_V3 (self), FALSE); g_hash_table_iter_init (&iter, self->profiles); while (g_hash_table_iter_next (&iter, NULL, &value)) { profile = MODULEMD_PROFILE (value); if (modulemd_profile_is_default (profile)) { if (!self->module_name) { g_set_error ( error, MODULEMD_ERROR, MMD_ERROR_MISSING_REQUIRED, "A module name is required when generating " "a modulemd-defaults document for a default profile %s", modulemd_profile_get_name (profile)); return FALSE; } if (!self->stream_name) { g_set_error ( error, MODULEMD_ERROR, MMD_ERROR_MISSING_REQUIRED, "A module stream is required when generating " "a modulemd-defaults document for a default profile %s", modulemd_profile_get_name (profile)); return FALSE; } if (!defaults) { defaults = modulemd_defaults_v1_new (self->module_name); } modulemd_defaults_v1_add_default_profile_for_stream ( defaults, self->stream_name, modulemd_profile_get_name (profile), NULL); } } if (!defaults) { return TRUE; } if (!modulemd_defaults_validate (MODULEMD_DEFAULTS (defaults), &nested_error)) { g_propagate_error (error, g_steal_pointer (&nested_error)); return FALSE; } *defaults_ptr = MODULEMD_DEFAULTS (g_steal_pointer (&defaults)); return TRUE; } static void copy_packager_v3_common_to_stream_v2 (ModulemdModuleStreamV2 *stream_v2, ModulemdPackagerV3 *packager_v3) { g_autoptr (ModulemdProfile) profile = NULL; GHashTableIter iter; gpointer value; modulemd_module_stream_v2_set_summary ( stream_v2, modulemd_packager_v3_get_summary (packager_v3)); modulemd_module_stream_v2_set_description ( stream_v2, modulemd_packager_v3_get_description (packager_v3)); /* Packager v3 "license" is optional. Stream v2 "license" is required * Fill in the default Packager v3 license if none has been specified. */ if (g_hash_table_size (packager_v3->module_licenses) == 0) { modulemd_module_stream_v2_add_module_license ( stream_v2, MMD_PACKAGER_DEFAULT_MODULE_LICENSE); } else { MODULEMD_REPLACE_SET (stream_v2->module_licenses, packager_v3->module_licenses); } modulemd_module_stream_v2_set_xmd ( stream_v2, modulemd_packager_v3_get_xmd (packager_v3)); modulemd_module_stream_v2_set_community ( stream_v2, modulemd_packager_v3_get_community (packager_v3)); modulemd_module_stream_v2_set_documentation ( stream_v2, modulemd_packager_v3_get_documentation (packager_v3)); modulemd_module_stream_v2_set_tracker ( stream_v2, modulemd_packager_v3_get_tracker (packager_v3)); g_hash_table_iter_init (&iter, packager_v3->profiles); while (g_hash_table_iter_next (&iter, NULL, &value)) { profile = modulemd_profile_copy (MODULEMD_PROFILE (value)); modulemd_profile_unset_default (profile); modulemd_module_stream_v2_add_profile (stream_v2, profile); g_clear_object (&profile); } modulemd_module_stream_v2_replace_rpm_api (stream_v2, packager_v3->rpm_api); modulemd_module_stream_v2_replace_rpm_filters (stream_v2, packager_v3->rpm_filters); modulemd_module_stream_v2_replace_demodularized_rpms ( stream_v2, packager_v3->demodularized_rpms); COPY_HASHTABLE_BY_VALUE_ADDER (stream_v2, packager_v3, rpm_components, modulemd_module_stream_v2_add_component); COPY_HASHTABLE_BY_VALUE_ADDER (stream_v2, packager_v3, module_components, modulemd_module_stream_v2_add_component); } static void copy_packager_v3_buildconfig_to_stream_v2 (ModulemdModuleStreamV2 *stream_v2, ModulemdBuildConfig *bc) { g_autoptr (ModulemdDependencies) deps = NULL; g_auto (GStrv) modules = NULL; modulemd_module_stream_v2_set_buildopts ( stream_v2, modulemd_build_config_get_buildopts (bc)); deps = modulemd_dependencies_new (); modulemd_dependencies_add_buildtime_stream ( deps, "platform", modulemd_build_config_get_platform (bc)); modulemd_dependencies_add_runtime_stream ( deps, "platform", modulemd_build_config_get_platform (bc)); modules = modulemd_build_config_get_buildtime_modules_as_strv (bc); for (guint j = 0; j < g_strv_length (modules); j++) { modulemd_dependencies_add_buildtime_stream ( deps, modules[j], modulemd_build_config_get_buildtime_requirement_stream (bc, modules[j])); } g_clear_pointer (&modules, g_strfreev); modules = modulemd_build_config_get_runtime_modules_as_strv (bc); for (guint j = 0; j < g_strv_length (modules); j++) { modulemd_dependencies_add_runtime_stream ( deps, modules[j], modulemd_build_config_get_runtime_requirement_stream (bc, modules[j])); } g_clear_pointer (&modules, g_strfreev); modulemd_module_stream_v2_add_dependencies (stream_v2, deps); g_clear_object (&deps); } ModulemdModuleStreamV2 * modulemd_packager_v3_to_stream_v2 (ModulemdPackagerV3 *self, GError **error) { g_autoptr (ModulemdModuleStreamV2) v2_stream = NULL; g_auto (GStrv) contexts = NULL; g_autoptr (GError) nested_error = NULL; ModulemdBuildopts *buildopts = NULL; ModulemdBuildConfig *bc; g_return_val_if_fail (error == NULL || *error == NULL, NULL); g_return_val_if_fail (MODULEMD_IS_PACKAGER_V3 (self), NULL); v2_stream = modulemd_module_stream_v2_new ( modulemd_packager_v3_get_module_name (self), modulemd_packager_v3_get_stream_name (self)); /* set attributes that are the same for all streams */ copy_packager_v3_common_to_stream_v2 (v2_stream, self); /* get the list of packager build configuration contexts */ contexts = modulemd_packager_v3_get_build_config_contexts_as_strv (self); /* If there is exactly one build configuration, use it for the stream */ /* context. Otherwise, leave the stream context unset. */ if (g_strv_length (contexts) == 1) { modulemd_module_stream_set_context (MODULEMD_MODULE_STREAM (v2_stream), contexts[0]); } /* map each BuildConfig object to a Dependencies object within the same StreamV2 object */ for (guint i = 0; i < g_strv_length (contexts); i++) { bc = modulemd_packager_v3_get_build_config (self, contexts[i]); if (i == 0) { /* Save the buildopts from the first build configuration to */ /* set the stream buildopts. */ buildopts = modulemd_build_config_get_buildopts (bc); } /* set attributes that are unique per build configuration */ copy_packager_v3_buildconfig_to_stream_v2 (v2_stream, bc); } g_clear_pointer (&contexts, g_strfreev); /* set the saved buildopts from the first build configuration */ modulemd_module_stream_v2_set_buildopts (v2_stream, buildopts); if (!modulemd_module_stream_validate (MODULEMD_MODULE_STREAM (v2_stream), &nested_error)) { g_propagate_error (error, g_steal_pointer (&nested_error)); return NULL; } return g_steal_pointer (&v2_stream); } ModulemdModuleIndex * modulemd_packager_v3_to_stream_v2_ext (ModulemdPackagerV3 *self, GError **error) { g_autoptr (ModulemdModuleIndex) index = NULL; g_autoptr (ModulemdModuleStreamV2) v2_stream = NULL; g_autoptr (ModulemdDefaults) defaults = NULL; g_autoptr (GError) nested_error = NULL; g_return_val_if_fail (error == NULL || *error == NULL, NULL); g_return_val_if_fail (MODULEMD_IS_PACKAGER_V3 (self), NULL); v2_stream = modulemd_packager_v3_to_stream_v2 (self, &nested_error); if (!v2_stream) { g_propagate_error (error, g_steal_pointer (&nested_error)); return NULL; } /* autogen module/stream names if necessary for adding to index */ modulemd_module_stream_set_autogen_module_name ( MODULEMD_MODULE_STREAM (v2_stream), 0); modulemd_module_stream_set_autogen_stream_name ( MODULEMD_MODULE_STREAM (v2_stream), 0); index = modulemd_module_index_new (); if (!modulemd_module_index_add_module_stream ( index, MODULEMD_MODULE_STREAM (v2_stream), &nested_error)) { g_propagate_error (error, g_steal_pointer (&nested_error)); return NULL; } g_clear_object (&v2_stream); if (!modulemd_packager_v3_to_defaults (self, &defaults, &nested_error)) { g_propagate_error (error, g_steal_pointer (&nested_error)); return NULL; } if (defaults) { if (!modulemd_module_index_add_defaults (index, defaults, &nested_error)) { g_propagate_error (error, g_steal_pointer (&nested_error)); return NULL; } g_clear_object (&defaults); } return g_steal_pointer (&index); } ModulemdModuleIndex * modulemd_packager_v3_convert_to_index (ModulemdPackagerV3 *self, GError **error) { g_auto (GStrv) contexts = NULL; g_autoptr (ModulemdModuleIndex) index = NULL; g_autoptr (ModulemdModuleStreamV2) v2_stream = NULL; g_autoptr (ModulemdDefaults) defaults = NULL; g_autoptr (GError) nested_error = NULL; ModulemdBuildConfig *bc; g_return_val_if_fail (error == NULL || *error == NULL, NULL); g_return_val_if_fail (MODULEMD_IS_PACKAGER_V3 (self), NULL); /* get the list of packager build configuration contexts */ contexts = modulemd_packager_v3_get_build_config_contexts_as_strv (self); if (g_strv_length (contexts) == 0) { g_set_error_literal (error, MODULEMD_ERROR, MMD_ERROR_VALIDATE, "Packager document with no build configurations " "cannot be converted to stream"); return NULL; } /* create a ModuleIndex to contain the results */ index = modulemd_module_index_new (); /* create a StreamV2 object for each BuildConfig object */ for (guint i = 0; i < g_strv_length (contexts); i++) { bc = modulemd_packager_v3_get_build_config (self, contexts[i]); v2_stream = modulemd_module_stream_v2_new ( modulemd_packager_v3_get_module_name (self), modulemd_packager_v3_get_stream_name (self)); modulemd_module_stream_set_context (MODULEMD_MODULE_STREAM (v2_stream), contexts[i]); /* set attributes that are the same for all streams */ copy_packager_v3_common_to_stream_v2 (v2_stream, self); /* set attributes that are unique per build configuration */ copy_packager_v3_buildconfig_to_stream_v2 (v2_stream, bc); if (!modulemd_module_stream_validate (MODULEMD_MODULE_STREAM (v2_stream), &nested_error)) { g_propagate_error (error, g_steal_pointer (&nested_error)); return NULL; } /* autogen module/stream names if necessary for adding to index */ modulemd_module_stream_set_autogen_module_name ( MODULEMD_MODULE_STREAM (v2_stream), 0); modulemd_module_stream_set_autogen_stream_name ( MODULEMD_MODULE_STREAM (v2_stream), 0); if (!modulemd_module_index_add_module_stream ( index, MODULEMD_MODULE_STREAM (v2_stream), &nested_error)) { g_propagate_error (error, g_steal_pointer (&nested_error)); return NULL; } g_clear_object (&v2_stream); } g_clear_pointer (&contexts, g_strfreev); if (!modulemd_packager_v3_to_defaults (self, &defaults, &nested_error)) { g_propagate_error (error, g_steal_pointer (&nested_error)); return NULL; } if (defaults) { if (!modulemd_module_index_add_defaults (index, defaults, &nested_error)) { g_propagate_error (error, g_steal_pointer (&nested_error)); return NULL; } g_clear_object (&defaults); } return g_steal_pointer (&index); } static gboolean modulemd_packager_v3_parse_build_configs (yaml_parser_t *parser, ModulemdPackagerV3 *packager, gboolean strict, GError **error); static gboolean modulemd_packager_v3_parse_refs (yaml_parser_t *parser, ModulemdPackagerV3 *packager, gboolean strict, GError **error); static gboolean modulemd_packager_v3_parse_profiles (yaml_parser_t *parser, ModulemdPackagerV3 *packager, gboolean strict, GError **error); static gboolean modulemd_packager_v3_parse_components (yaml_parser_t *parser, ModulemdPackagerV3 *packager, gboolean strict, GError **error); ModulemdPackagerV3 * modulemd_packager_v3_parse_yaml (ModulemdSubdocumentInfo *subdoc, GError **error) { MODULEMD_INIT_TRACE (); MMD_INIT_YAML_PARSER (parser); MMD_INIT_YAML_EVENT (event); gboolean done = FALSE; const gboolean strict = TRUE; /* PackagerV3 should always parse strictly */ g_autoptr (GError) nested_error = NULL; g_autoptr (ModulemdPackagerV3) packager = NULL; g_autoptr (GHashTable) set = NULL; g_autoptr (GVariant) xmd = NULL; g_return_val_if_fail (error == NULL || *error == NULL, FALSE); if (!modulemd_subdocument_info_get_data_parser ( subdoc, &parser, strict, error)) { return FALSE; } packager = modulemd_packager_v3_new (); /* Read the MAPPING_START */ YAML_PARSER_PARSE_WITH_EXIT (&parser, &event, error); if (event.type != YAML_MAPPING_START_EVENT) { MMD_YAML_ERROR_EVENT_EXIT ( error, event, "Data section did not begin with a map."); } /* Process through the mapping */ while (!done) { YAML_PARSER_PARSE_WITH_EXIT (&parser, &event, error); switch (event.type) { case YAML_MAPPING_END_EVENT: done = TRUE; break; case YAML_SCALAR_EVENT: /* Mapping Keys */ if (g_str_equal ((const gchar *)event.data.scalar.value, "name")) { MMD_SET_PARSED_YAML_STRING (&parser, error, modulemd_packager_v3_set_module_name, packager); } else if (g_str_equal ((const gchar *)event.data.scalar.value, "stream")) { MMD_SET_PARSED_YAML_STRING (&parser, error, modulemd_packager_v3_set_stream_name, packager); } else if (g_str_equal ((const gchar *)event.data.scalar.value, "summary")) { MMD_SET_PARSED_YAML_STRING ( &parser, error, modulemd_packager_v3_set_summary, packager); } else if (g_str_equal ((const gchar *)event.data.scalar.value, "description")) { MMD_SET_PARSED_YAML_STRING (&parser, error, modulemd_packager_v3_set_description, packager); } else if (g_str_equal ((const gchar *)event.data.scalar.value, "license")) { set = modulemd_yaml_parse_string_set (&parser, &nested_error); MODULEMD_REPLACE_SET (packager->module_licenses, set); g_clear_pointer (&set, g_hash_table_unref); } else if (g_str_equal ((const gchar *)event.data.scalar.value, "xmd")) { xmd = mmd_parse_xmd (&parser, &nested_error); if (!xmd) { g_propagate_error (error, g_steal_pointer (&nested_error)); return NULL; } modulemd_packager_v3_set_xmd (packager, xmd); g_clear_pointer (&xmd, g_variant_unref); } else if (g_str_equal ((const gchar *)event.data.scalar.value, "configurations")) { if (!modulemd_packager_v3_parse_build_configs ( &parser, packager, strict, &nested_error)) { g_propagate_error (error, g_steal_pointer (&nested_error)); return NULL; } } else if (g_str_equal ((const gchar *)event.data.scalar.value, "references")) { if (!modulemd_packager_v3_parse_refs ( &parser, packager, strict, &nested_error)) { g_propagate_error (error, g_steal_pointer (&nested_error)); return NULL; } } else if (g_str_equal ((const gchar *)event.data.scalar.value, "profiles")) { if (!modulemd_packager_v3_parse_profiles ( &parser, packager, strict, &nested_error)) { g_propagate_error (error, g_steal_pointer (&nested_error)); return NULL; } } else if (g_str_equal ((const gchar *)event.data.scalar.value, "api")) { set = modulemd_yaml_parse_string_set_from_map ( &parser, "rpms", strict, &nested_error); modulemd_packager_v3_replace_rpm_api (packager, set); g_clear_pointer (&set, g_hash_table_unref); } else if (g_str_equal ((const gchar *)event.data.scalar.value, "filter")) { set = modulemd_yaml_parse_string_set_from_map ( &parser, "rpms", strict, &nested_error); modulemd_packager_v3_replace_rpm_filters (packager, set); g_clear_pointer (&set, g_hash_table_unref); } else if (g_str_equal ((const gchar *)event.data.scalar.value, "demodularized")) { set = modulemd_yaml_parse_string_set_from_map ( &parser, "rpms", strict, &nested_error); modulemd_packager_v3_replace_demodularized_rpms (packager, set); g_clear_pointer (&set, g_hash_table_unref); } else if (g_str_equal ((const gchar *)event.data.scalar.value, "components")) { if (!modulemd_packager_v3_parse_components ( &parser, packager, strict, &nested_error)) { g_propagate_error (error, g_steal_pointer (&nested_error)); return NULL; } } else { SKIP_UNKNOWN (&parser, NULL, "Unexpected key in packager v3 document: %s", (const gchar *)event.data.scalar.value); break; } break; default: MMD_YAML_ERROR_EVENT_EXIT ( error, event, "Unexpected YAML event in ModuleStreamV2: %s", mmd_yaml_get_event_name (event.type)); break; } yaml_event_delete (&event); } return g_steal_pointer (&packager); } static gboolean modulemd_packager_v3_parse_build_configs (yaml_parser_t *parser, ModulemdPackagerV3 *packager, gboolean strict, GError **error) { MMD_INIT_YAML_EVENT (event); gboolean done = FALSE; g_autoptr (ModulemdBuildConfig) buildconfig = NULL; g_autoptr (GError) nested_error = NULL; const gchar *context; YAML_PARSER_PARSE_WITH_EXIT_BOOL (parser, &event, error); if (event.type != YAML_SEQUENCE_START_EVENT) { MMD_YAML_ERROR_EVENT_EXIT_BOOL ( error, event, "Unexpected YAML event in build_configs"); } while (!done) { YAML_PARSER_PARSE_WITH_EXIT_BOOL (parser, &event, error); switch (event.type) { case YAML_SEQUENCE_END_EVENT: done = TRUE; break; case YAML_MAPPING_START_EVENT: buildconfig = modulemd_build_config_parse_yaml (parser, strict, &nested_error); if (!buildconfig) { g_propagate_error (error, g_steal_pointer (&nested_error)); return FALSE; } /* A context must be unique. We check explicitly here because glib2 * < 2.40 does not distinguish a replacement from an addition. */ context = modulemd_build_config_get_context (buildconfig); if (g_hash_table_contains (packager->build_configs, context)) { g_set_error (error, MODULEMD_ERROR, MMD_ERROR_VALIDATE, "Duplicate context: %s", context); return FALSE; } modulemd_packager_v3_add_build_config (packager, buildconfig); g_clear_object (&buildconfig); break; default: MMD_YAML_ERROR_EVENT_EXIT_BOOL ( error, event, "Unexpected YAML event in build_config list"); break; } yaml_event_delete (&event); } return TRUE; } static gboolean modulemd_packager_v3_parse_refs (yaml_parser_t *parser, ModulemdPackagerV3 *packager, gboolean strict, GError **error) { MODULEMD_INIT_TRACE (); MMD_INIT_YAML_EVENT (event); gboolean done = FALSE; g_autofree gchar *scalar = NULL; g_autoptr (GError) nested_error = NULL; g_return_val_if_fail (error == NULL || *error == NULL, FALSE); /* Process through the map */ /* We *must* get a MAPPING_START here */ YAML_PARSER_PARSE_WITH_EXIT_BOOL (parser, &event, error); if (event.type != YAML_MAPPING_START_EVENT) { MMD_YAML_ERROR_EVENT_EXIT_BOOL ( error, event, "Got %s instead of MAPPING_START in references.", mmd_yaml_get_event_name (event.type)); } while (!done) { YAML_PARSER_PARSE_WITH_EXIT_BOOL (parser, &event, error); switch (event.type) { case YAML_MAPPING_END_EVENT: done = TRUE; break; case YAML_SCALAR_EVENT: if (g_str_equal ((const gchar *)event.data.scalar.value, "community")) { scalar = modulemd_yaml_parse_string (parser, &nested_error); if (!scalar) { g_propagate_error (error, g_steal_pointer (&nested_error)); return FALSE; } modulemd_packager_v3_set_community (packager, scalar); g_clear_pointer (&scalar, g_free); } else if (g_str_equal ((const gchar *)event.data.scalar.value, "documentation")) { scalar = modulemd_yaml_parse_string (parser, &nested_error); if (!scalar) { g_propagate_error (error, g_steal_pointer (&nested_error)); return FALSE; } modulemd_packager_v3_set_documentation (packager, scalar); g_clear_pointer (&scalar, g_free); } else if (g_str_equal ((const gchar *)event.data.scalar.value, "tracker")) { scalar = modulemd_yaml_parse_string (parser, &nested_error); if (!scalar) { g_propagate_error (error, g_steal_pointer (&nested_error)); return FALSE; } modulemd_packager_v3_set_tracker (packager, scalar); g_clear_pointer (&scalar, g_free); } else { SKIP_UNKNOWN (parser, FALSE, "Unexpected key in references: %s", (const gchar *)event.data.scalar.value); break; } break; default: MMD_YAML_ERROR_EVENT_EXIT_BOOL ( error, event, "Unexpected YAML event in references: %s", mmd_yaml_get_event_name (event.type)); break; } yaml_event_delete (&event); } return TRUE; } static gboolean modulemd_packager_v3_parse_profiles (yaml_parser_t *parser, ModulemdPackagerV3 *packager, gboolean strict, GError **error) { MODULEMD_INIT_TRACE (); MMD_INIT_YAML_EVENT (event); gboolean done = FALSE; g_autoptr (GError) nested_error = NULL; g_autoptr (ModulemdProfile) profile = NULL; g_return_val_if_fail (error == NULL || *error == NULL, FALSE); /* Process through the map */ /* We *must* get a MAPPING_START here */ YAML_PARSER_PARSE_WITH_EXIT_BOOL (parser, &event, error); if (event.type != YAML_MAPPING_START_EVENT) { MMD_YAML_ERROR_EVENT_EXIT_BOOL ( error, event, "Got %s instead of MAPPING_START in profiles.", mmd_yaml_get_event_name (event.type)); } while (!done) { YAML_PARSER_PARSE_WITH_EXIT_BOOL (parser, &event, error); switch (event.type) { case YAML_MAPPING_END_EVENT: done = TRUE; break; case YAML_SCALAR_EVENT: profile = modulemd_profile_parse_yaml ( parser, (const gchar *)event.data.scalar.value, strict, &nested_error); if (!profile) { g_propagate_error (error, g_steal_pointer (&nested_error)); return FALSE; } modulemd_packager_v3_add_profile (packager, profile); g_clear_pointer (&profile, g_object_unref); break; default: MMD_YAML_ERROR_EVENT_EXIT_BOOL ( error, event, "Unexpected YAML event in profiles: %s", mmd_yaml_get_event_name (event.type)); break; } yaml_event_delete (&event); } return TRUE; } static gboolean modulemd_packager_v3_parse_rpm_components (yaml_parser_t *parser, ModulemdPackagerV3 *packager, gboolean strict, GError **error); static gboolean modulemd_packager_v3_parse_module_components (yaml_parser_t *parser, ModulemdPackagerV3 *packager, gboolean strict, GError **error); static gboolean modulemd_packager_v3_parse_components (yaml_parser_t *parser, ModulemdPackagerV3 *packager, gboolean strict, GError **error) { MODULEMD_INIT_TRACE (); MMD_INIT_YAML_EVENT (event); gboolean done = FALSE; g_autoptr (GError) nested_error = NULL; g_return_val_if_fail (error == NULL || *error == NULL, FALSE); /* Process through the sequence */ /* We *must* get a MAPPING_START here */ YAML_PARSER_PARSE_WITH_EXIT_BOOL (parser, &event, error); if (event.type != YAML_MAPPING_START_EVENT) { MMD_YAML_ERROR_EVENT_EXIT_BOOL ( error, event, "Got %s instead of MAPPING_START in components.", mmd_yaml_get_event_name (event.type)); } while (!done) { YAML_PARSER_PARSE_WITH_EXIT_BOOL (parser, &event, error); switch (event.type) { case YAML_MAPPING_END_EVENT: done = TRUE; break; case YAML_SCALAR_EVENT: if (g_str_equal ((const gchar *)event.data.scalar.value, "rpms")) { if (!modulemd_packager_v3_parse_rpm_components ( parser, packager, strict, &nested_error)) { g_propagate_error (error, g_steal_pointer (&nested_error)); return FALSE; } } else if (g_str_equal ((const gchar *)event.data.scalar.value, "modules")) { if (!modulemd_packager_v3_parse_module_components ( parser, packager, strict, &nested_error)) { g_propagate_error (error, g_steal_pointer (&nested_error)); return FALSE; } } else { SKIP_UNKNOWN (parser, FALSE, "Unexpected key in components: %s", (const gchar *)event.data.scalar.value); } break; default: MMD_YAML_ERROR_EVENT_EXIT_BOOL ( error, event, "Unexpected YAML event in components: %s", mmd_yaml_get_event_name (event.type)); break; } yaml_event_delete (&event); } return TRUE; } static gboolean modulemd_packager_v3_parse_rpm_components (yaml_parser_t *parser, ModulemdPackagerV3 *packager, gboolean strict, GError **error) { MODULEMD_INIT_TRACE (); MMD_INIT_YAML_EVENT (event); gboolean done = FALSE; g_autoptr (GError) nested_error = NULL; g_autoptr (ModulemdComponentRpm) component = NULL; g_return_val_if_fail (error == NULL || *error == NULL, FALSE); /* We *must* get a MAPPING_START here */ YAML_PARSER_PARSE_WITH_EXIT_BOOL (parser, &event, error); if (event.type != YAML_MAPPING_START_EVENT) { MMD_YAML_ERROR_EVENT_EXIT_BOOL ( error, event, "Got %s instead of MAPPING_START in rpm components.", mmd_yaml_get_event_name (event.type)); } while (!done) { YAML_PARSER_PARSE_WITH_EXIT_BOOL (parser, &event, error); switch (event.type) { case YAML_MAPPING_END_EVENT: done = TRUE; break; case YAML_SCALAR_EVENT: component = modulemd_component_rpm_parse_yaml ( parser, (const gchar *)event.data.scalar.value, strict, &nested_error); if (!component) { g_propagate_error (error, g_steal_pointer (&nested_error)); return FALSE; } modulemd_packager_v3_add_component (packager, (ModulemdComponent *)component); g_clear_pointer (&component, g_object_unref); break; default: MMD_YAML_ERROR_EVENT_EXIT_BOOL ( error, event, "Unexpected YAML event in RPM component: %s", mmd_yaml_get_event_name (event.type)); break; } yaml_event_delete (&event); } return TRUE; } static gboolean modulemd_packager_v3_parse_module_components (yaml_parser_t *parser, ModulemdPackagerV3 *packager, gboolean strict, GError **error) { MODULEMD_INIT_TRACE (); MMD_INIT_YAML_EVENT (event); gboolean done = FALSE; g_autoptr (GError) nested_error = NULL; g_autoptr (ModulemdComponentModule) component = NULL; g_return_val_if_fail (error == NULL || *error == NULL, FALSE); /* We *must* get a MAPPING_START here */ YAML_PARSER_PARSE_WITH_EXIT_BOOL (parser, &event, error); if (event.type != YAML_MAPPING_START_EVENT) { MMD_YAML_ERROR_EVENT_EXIT_BOOL ( error, event, "Got %s instead of MAPPING_START in module components.", mmd_yaml_get_event_name (event.type)); } while (!done) { YAML_PARSER_PARSE_WITH_EXIT_BOOL (parser, &event, error); switch (event.type) { case YAML_MAPPING_END_EVENT: done = TRUE; break; case YAML_SCALAR_EVENT: component = modulemd_component_module_parse_yaml ( parser, (const gchar *)event.data.scalar.value, strict, &nested_error); if (!component) { g_propagate_error (error, g_steal_pointer (&nested_error)); return FALSE; } modulemd_packager_v3_add_component (packager, (ModulemdComponent *)component); g_clear_pointer (&component, g_object_unref); break; default: MMD_YAML_ERROR_EVENT_EXIT_BOOL ( error, event, "Unexpected YAML event in module component: %s", mmd_yaml_get_event_name (event.type)); break; } yaml_event_delete (&event); } return TRUE; } gboolean modulemd_packager_v3_emit_yaml (ModulemdPackagerV3 *self, yaml_emitter_t *emitter, GError **error) { MODULEMD_INIT_TRACE (); gsize i; g_autoptr (GPtrArray) keys = NULL; gboolean ret; /* Emit document headers */ if (!modulemd_yaml_emit_document_headers ( emitter, MODULEMD_YAML_DOC_PACKAGER, MD_PACKAGER_VERSION_THREE, error)) { return FALSE; } /* Start data: */ EMIT_MAPPING_START (emitter, error); if (modulemd_packager_v3_get_module_name (self) != NULL) { EMIT_KEY_VALUE ( emitter, error, "name", modulemd_packager_v3_get_module_name (self)); } if (modulemd_packager_v3_get_stream_name (self) != NULL) { EMIT_KEY_VALUE_FULL (emitter, error, "stream", modulemd_packager_v3_get_stream_name (self), YAML_DOUBLE_QUOTED_SCALAR_STYLE); } EMIT_KEY_VALUE ( emitter, error, "summary", modulemd_packager_v3_get_summary (self)); EMIT_KEY_VALUE_FULL (emitter, error, "description", modulemd_packager_v3_get_description (self), YAML_FOLDED_SCALAR_STYLE); if (NON_EMPTY_TABLE (self->module_licenses)) { EMIT_STRING_SET (emitter, error, "license", self->module_licenses); } if (self->xmd != NULL) { EMIT_SCALAR (emitter, error, "xmd"); if (!modulemd_yaml_emit_variant (emitter, self->xmd, error)) { return FALSE; } } if (NON_EMPTY_TABLE (self->build_configs)) { EMIT_SCALAR (emitter, error, "configurations"); EMIT_SEQUENCE_START (emitter, error); keys = modulemd_ordered_str_keys (self->build_configs, modulemd_strcmp_sort); for (i = 0; i < keys->len; i++) { ret = modulemd_build_config_emit_yaml ( g_hash_table_lookup (self->build_configs, g_ptr_array_index (keys, i)), emitter, error); if (!ret) { return FALSE; } } EMIT_SEQUENCE_END (emitter, error); } if (self->community || self->documentation || self->tracker) { EMIT_SCALAR (emitter, error, "references"); EMIT_MAPPING_START (emitter, error); EMIT_KEY_VALUE_STRING_IF_SET ( emitter, error, "community", self->community); EMIT_KEY_VALUE_STRING_IF_SET ( emitter, error, "documentation", self->documentation); EMIT_KEY_VALUE_STRING_IF_SET (emitter, error, "tracker", self->tracker); EMIT_MAPPING_END (emitter, error); } EMIT_HASHTABLE_VALUES_IF_NON_EMPTY ( emitter, error, "profiles", self->profiles, modulemd_profile_emit_yaml); if (NON_EMPTY_TABLE (self->rpm_api)) { EMIT_SCALAR (emitter, error, "api"); EMIT_MAPPING_START (emitter, error); EMIT_STRING_SET (emitter, error, "rpms", self->rpm_api); EMIT_MAPPING_END (emitter, error); } if (NON_EMPTY_TABLE (self->rpm_filters)) { EMIT_SCALAR (emitter, error, "filter"); EMIT_MAPPING_START (emitter, error); EMIT_STRING_SET (emitter, error, "rpms", self->rpm_filters); EMIT_MAPPING_END (emitter, error); } if (NON_EMPTY_TABLE (self->demodularized_rpms)) { EMIT_SCALAR (emitter, error, "demodularized"); EMIT_MAPPING_START (emitter, error); EMIT_STRING_SET (emitter, error, "rpms", self->demodularized_rpms); EMIT_MAPPING_END (emitter, error); } if (NON_EMPTY_TABLE (self->rpm_components) || NON_EMPTY_TABLE (self->module_components)) { EMIT_SCALAR (emitter, error, "components"); EMIT_MAPPING_START (emitter, error); EMIT_HASHTABLE_VALUES_IF_NON_EMPTY (emitter, error, "rpms", self->rpm_components, modulemd_component_rpm_emit_yaml); EMIT_HASHTABLE_VALUES_IF_NON_EMPTY (emitter, error, "modules", self->module_components, modulemd_component_module_emit_yaml); EMIT_MAPPING_END (emitter, error); } /* The "data" mapping */ EMIT_MAPPING_END (emitter, error); /* The overall document mapping */ EMIT_MAPPING_END (emitter, error); if (!mmd_emitter_end_document (emitter, error)) { return FALSE; } return TRUE; } fedora-modularity-libmodulemd-357799c/modulemd/modulemd-profile.c000066400000000000000000000331411502446517500251610ustar00rootroot00000000000000/* * This file is part of libmodulemd * Copyright (C) 2018 Red Hat, Inc. * * Fedora-License-Identifier: MIT * SPDX-2.0-License-Identifier: MIT * SPDX-3.0-License-Identifier: MIT * * This program is free software. * For more information on the license, see COPYING. * For more information on free software, see . */ #include #include #include "modulemd-module-stream.h" #include "modulemd-profile.h" #include "private/glib-extensions.h" #include "private/modulemd-module-stream-private.h" #include "private/modulemd-profile-private.h" #include "private/modulemd-util.h" #include "private/modulemd-yaml.h" #define P_DEFAULT_STRING "__PROFILE_NAME_UNSET__" struct _ModulemdProfile { GObject parent_instance; gchar *name; gchar *description; gboolean is_default; GHashTable *rpms; ModulemdModuleStream *owner; }; G_DEFINE_TYPE (ModulemdProfile, modulemd_profile, G_TYPE_OBJECT) enum { PROP_0, PROP_NAME, N_PROPS }; static GParamSpec *properties[N_PROPS]; gboolean modulemd_profile_equals_wrapper (const void *a, const void *b) { g_return_val_if_fail (MODULEMD_IS_PROFILE ((ModulemdProfile *)a), FALSE); g_return_val_if_fail (MODULEMD_IS_PROFILE ((ModulemdProfile *)b), FALSE); return modulemd_profile_equals ((ModulemdProfile *)a, (ModulemdProfile *)b); } gboolean modulemd_profile_equals (ModulemdProfile *self_1, ModulemdProfile *self_2) { g_return_val_if_fail (MODULEMD_IS_PROFILE (self_1), FALSE); g_return_val_if_fail (MODULEMD_IS_PROFILE (self_2), FALSE); if (g_strcmp0 (modulemd_profile_get_name (self_1), modulemd_profile_get_name (self_2)) != 0) { return FALSE; } if (g_strcmp0 (modulemd_profile_get_description (self_1, NULL), modulemd_profile_get_description (self_2, NULL))) { return FALSE; } //Check rpms: size, set values if (!modulemd_hash_table_sets_are_equal (self_1->rpms, self_2->rpms)) { return FALSE; } /* Test the negations of is_default just in case somehow they are different * non-zero values */ if (!self_1->is_default != !self_2->is_default) { return FALSE; } return TRUE; } ModulemdProfile * modulemd_profile_new (const gchar *name) { return g_object_new (MODULEMD_TYPE_PROFILE, "name", name, NULL); } ModulemdProfile * modulemd_profile_copy (ModulemdProfile *self) { g_autoptr (ModulemdProfile) p = NULL; g_return_val_if_fail (MODULEMD_IS_PROFILE (self), NULL); p = modulemd_profile_new (modulemd_profile_get_name (self)); modulemd_profile_set_description ( p, modulemd_profile_get_description (self, NULL)); g_hash_table_unref (p->rpms); p->rpms = g_hash_table_ref (self->rpms); if (modulemd_profile_is_default (self)) { modulemd_profile_set_default (p); } return g_steal_pointer (&p); } static void modulemd_profile_finalize (GObject *object) { ModulemdProfile *self = (ModulemdProfile *)object; g_clear_pointer (&self->name, g_free); g_clear_pointer (&self->description, g_free); g_clear_pointer (&self->rpms, g_hash_table_unref); G_OBJECT_CLASS (modulemd_profile_parent_class)->finalize (object); } static void modulemd_profile_set_name (ModulemdProfile *self, const gchar *name) { g_return_if_fail (MODULEMD_IS_PROFILE (self)); g_return_if_fail (name); g_return_if_fail (g_strcmp0 (name, P_DEFAULT_STRING)); g_clear_pointer (&self->name, g_free); self->name = g_strdup (name); g_object_notify_by_pspec (G_OBJECT (self), properties[PROP_NAME]); } const gchar * modulemd_profile_get_name (ModulemdProfile *self) { g_return_val_if_fail (MODULEMD_IS_PROFILE (self), NULL); return self->name; } void modulemd_profile_set_description (ModulemdProfile *self, const gchar *description) { g_return_if_fail (MODULEMD_IS_PROFILE (self)); g_clear_pointer (&self->description, g_free); self->description = g_strdup (description); } const gchar * modulemd_profile_get_description (ModulemdProfile *self, const gchar *locale) { g_return_val_if_fail (MODULEMD_IS_PROFILE (self), NULL); /* Retrieve translated strings, if available */ if (self->owner) { ModulemdTranslationEntry *entry = modulemd_module_stream_get_translation_entry (self->owner, locale); if (entry != NULL) { const gchar *translation = modulemd_translation_entry_get_profile_description (entry, self->name); if (translation != NULL) { return translation; } } } return self->description; } void modulemd_profile_set_default (ModulemdProfile *self) { g_return_if_fail (MODULEMD_IS_PROFILE (self)); self->is_default = TRUE; } void modulemd_profile_unset_default (ModulemdProfile *self) { g_return_if_fail (MODULEMD_IS_PROFILE (self)); self->is_default = FALSE; } gboolean modulemd_profile_is_default (ModulemdProfile *self) { g_return_val_if_fail (MODULEMD_IS_PROFILE (self), FALSE); return self->is_default; } void modulemd_profile_add_rpm (ModulemdProfile *self, const gchar *rpm) { g_return_if_fail (MODULEMD_IS_PROFILE (self)); g_hash_table_add (self->rpms, g_strdup (rpm)); } void modulemd_profile_remove_rpm (ModulemdProfile *self, const gchar *rpm) { g_return_if_fail (MODULEMD_IS_PROFILE (self)); g_hash_table_remove (self->rpms, rpm); } void modulemd_profile_clear_rpms (ModulemdProfile *self) { g_return_if_fail (MODULEMD_IS_PROFILE (self)); g_hash_table_remove_all (self->rpms); } GStrv modulemd_profile_get_rpms_as_strv (ModulemdProfile *self) { g_return_val_if_fail (MODULEMD_IS_PROFILE (self), NULL); return modulemd_ordered_str_keys_as_strv (self->rpms); } void modulemd_profile_set_owner (ModulemdProfile *self, ModulemdModuleStream *owner) { g_return_if_fail (MODULEMD_IS_PROFILE (self)); g_return_if_fail (MODULEMD_IS_MODULE_STREAM (owner)); self->owner = owner; } static void modulemd_profile_get_property (GObject *object, guint prop_id, GValue *value, GParamSpec *pspec) { ModulemdProfile *self = MODULEMD_PROFILE (object); switch (prop_id) { case PROP_NAME: g_value_set_string (value, modulemd_profile_get_name (self)); break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); } } static void modulemd_profile_set_property (GObject *object, guint prop_id, const GValue *value, GParamSpec *pspec) { ModulemdProfile *self = MODULEMD_PROFILE (object); switch (prop_id) { case PROP_NAME: modulemd_profile_set_name (self, g_value_get_string (value)); break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); } } static void modulemd_profile_class_init (ModulemdProfileClass *klass) { GObjectClass *object_class = G_OBJECT_CLASS (klass); object_class->finalize = modulemd_profile_finalize; object_class->get_property = modulemd_profile_get_property; object_class->set_property = modulemd_profile_set_property; properties[PROP_NAME] = g_param_spec_string ( "name", "Name", "The name of this profile.", P_DEFAULT_STRING, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS | G_PARAM_CONSTRUCT_ONLY); g_object_class_install_properties (object_class, N_PROPS, properties); } static void modulemd_profile_init (ModulemdProfile *self) { self->rpms = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, NULL); } /* === YAML Functions === */ ModulemdProfile * modulemd_profile_parse_yaml (yaml_parser_t *parser, const gchar *name, gboolean strict, GError **error) { MODULEMD_INIT_TRACE (); MMD_INIT_YAML_EVENT (event); gboolean done = FALSE; gboolean is_default = FALSE; g_autofree gchar *value = NULL; g_autoptr (ModulemdProfile) p = NULL; g_autoptr (GError) nested_error = NULL; g_return_val_if_fail (error == NULL || *error == NULL, FALSE); YAML_PARSER_PARSE_WITH_EXIT (parser, &event, error); if (event.type != YAML_MAPPING_START_EVENT) { MMD_YAML_ERROR_EVENT_EXIT (error, event, "No map in profile"); } p = modulemd_profile_new (name); /* Read in additional attributes */ while (!done) { YAML_PARSER_PARSE_WITH_EXIT (parser, &event, error); switch (event.type) { case YAML_MAPPING_END_EVENT: done = TRUE; break; case YAML_SCALAR_EVENT: if (g_str_equal ((const gchar *)event.data.scalar.value, "rpms")) { g_hash_table_unref (p->rpms); p->rpms = modulemd_yaml_parse_string_set (parser, &nested_error); if (p->rpms == NULL) { MMD_YAML_ERROR_EVENT_EXIT ( error, event, "Failed to parse rpm list in profile: %s", nested_error->message); } } else if (g_str_equal ((const gchar *)event.data.scalar.value, "description")) { value = modulemd_yaml_parse_string (parser, &nested_error); if (!value) { MMD_YAML_ERROR_EVENT_EXIT ( error, event, "Failed to parse description in profile: %s", nested_error->message); } modulemd_profile_set_description (p, value); g_clear_pointer (&value, g_free); } else if (g_str_equal ((const gchar *)event.data.scalar.value, "default")) { is_default = modulemd_yaml_parse_bool (parser, &nested_error); if (nested_error) { g_propagate_error (error, g_steal_pointer (&nested_error)); return NULL; } if (is_default) { modulemd_profile_set_default (p); } else { modulemd_profile_unset_default (p); } } else { SKIP_UNKNOWN (parser, FALSE, "Unexpected key in profile body: %s", (const gchar *)event.data.scalar.value); break; } break; default: MMD_YAML_ERROR_EVENT_EXIT ( error, event, "Unexpected YAML event in profile"); break; } yaml_event_delete (&event); } return g_steal_pointer (&p); } gboolean modulemd_profile_emit_yaml (ModulemdProfile *self, yaml_emitter_t *emitter, GError **error) { MODULEMD_INIT_TRACE (); int ret; g_auto (GStrv) rpms = NULL; g_autoptr (GError) nested_error = NULL; MMD_INIT_YAML_EVENT (event); ret = mmd_emitter_scalar_string ( emitter, modulemd_profile_get_name (self), &nested_error); if (!ret) { g_propagate_prefixed_error (error, g_steal_pointer (&nested_error), "Failed to emit profile name: "); return FALSE; } ret = mmd_emitter_start_mapping ( emitter, YAML_BLOCK_MAPPING_STYLE, &nested_error); if (!ret) { g_propagate_prefixed_error (error, g_steal_pointer (&nested_error), "Failed to start profile mapping: "); return FALSE; } if (modulemd_profile_get_description (self, NULL) != NULL) { ret = mmd_emitter_scalar ( emitter, "description", YAML_PLAIN_SCALAR_STYLE, &nested_error); if (!ret) { g_propagate_prefixed_error ( error, g_steal_pointer (&nested_error), "Failed to emit profile description key: "); return FALSE; } ret = mmd_emitter_scalar_string ( emitter, modulemd_profile_get_description (self, NULL), &nested_error); if (!ret) { g_propagate_prefixed_error ( error, g_steal_pointer (&nested_error), "Failed to emit profile description value: "); return FALSE; } } if (g_hash_table_size (self->rpms) != 0) { ret = mmd_emitter_scalar ( emitter, "rpms", YAML_PLAIN_SCALAR_STYLE, &nested_error); if (!ret) { g_propagate_prefixed_error (error, g_steal_pointer (&nested_error), "Failed to emit profile rpms key: "); return FALSE; } rpms = modulemd_profile_get_rpms_as_strv (self); ret = mmd_emitter_strv ( emitter, YAML_BLOCK_SEQUENCE_STYLE, rpms, &nested_error); if (!ret) { g_propagate_prefixed_error (error, g_steal_pointer (&nested_error), "Failed to emit profile rpms: "); return FALSE; } } /* Only output default if it's TRUE */ if (modulemd_profile_is_default (self)) { EMIT_KEY_VALUE (emitter, error, "default", "true"); } ret = mmd_emitter_end_mapping (emitter, &nested_error); if (!ret) { g_propagate_prefixed_error (error, g_steal_pointer (&nested_error), "Failed to end profile mapping"); return FALSE; } return TRUE; } fedora-modularity-libmodulemd-357799c/modulemd/modulemd-rpm-map-entry.c000066400000000000000000000415531502446517500262370ustar00rootroot00000000000000/* * This file is part of libmodulemd * Copyright (C) 2018 Red Hat, Inc. * * Fedora-License-Identifier: MIT * SPDX-2.0-License-Identifier: MIT * SPDX-3.0-License-Identifier: MIT * * This program is free software. * For more information on the license, see COPYING. * For more information on free software, see . */ #include "yaml.h" #include #include "modulemd-errors.h" #include "modulemd-rpm-map-entry.h" #include "private/modulemd-rpm-map-entry-private.h" #include "private/modulemd-util.h" #include "private/modulemd-yaml.h" struct _ModulemdRpmMapEntry { GObject parent_instance; gchar *name; guint64 epoch; gchar *version; gchar *release; gchar *arch; }; G_DEFINE_TYPE (ModulemdRpmMapEntry, modulemd_rpm_map_entry, G_TYPE_OBJECT) enum { PROP_0, PROP_NAME, PROP_EPOCH, PROP_VERSION, PROP_RELEASE, PROP_ARCH, PROP_NEVRA, N_PROPS }; static GParamSpec *properties[N_PROPS]; ModulemdRpmMapEntry * modulemd_rpm_map_entry_new (const gchar *name, guint64 epoch, const gchar *version, const gchar *release, const gchar *arch) { // clang-format off return g_object_new (MODULEMD_TYPE_RPM_MAP_ENTRY, "name", name, "epoch", epoch, "version", version, "release", release, "arch", arch, NULL); // clang-format on } gboolean modulemd_rpm_map_entry_equals_wrapper (const void *a, const void *b) { g_return_val_if_fail (MODULEMD_IS_RPM_MAP_ENTRY ((ModulemdRpmMapEntry *)a), FALSE); g_return_val_if_fail (MODULEMD_IS_RPM_MAP_ENTRY ((ModulemdRpmMapEntry *)b), FALSE); return modulemd_rpm_map_entry_equals ((ModulemdRpmMapEntry *)a, (ModulemdRpmMapEntry *)b); } gboolean modulemd_RpmMapEntry_hash_table_equals_wrapper (const void *a, const void *b) { return modulemd_hash_table_equals ( (GHashTable *)a, (GHashTable *)b, modulemd_rpm_map_entry_equals_wrapper); } static void modulemd_rpm_map_entry_finalize (GObject *object) { ModulemdRpmMapEntry *self = (ModulemdRpmMapEntry *)object; g_clear_pointer (&self->name, g_free); g_clear_pointer (&self->version, g_free); g_clear_pointer (&self->release, g_free); g_clear_pointer (&self->arch, g_free); G_OBJECT_CLASS (modulemd_rpm_map_entry_parent_class)->finalize (object); } ModulemdRpmMapEntry * modulemd_rpm_map_entry_copy (ModulemdRpmMapEntry *self) { return modulemd_rpm_map_entry_new ( self->name, self->epoch, self->version, self->release, self->arch); } gboolean modulemd_rpm_map_entry_equals (ModulemdRpmMapEntry *self, ModulemdRpmMapEntry *other) { g_autofree gchar *self_nevra = NULL; g_autofree gchar *other_nevra = NULL; g_return_val_if_fail (MODULEMD_IS_RPM_MAP_ENTRY (self), FALSE); g_return_val_if_fail (MODULEMD_IS_RPM_MAP_ENTRY (other), FALSE); if (self == other) { return TRUE; } /* Since all of the public attributes of these entries are captured by the * NEVRA output, we can short-cut the comparison process and just compare * the two NEVRAs instead. */ self_nevra = modulemd_rpm_map_entry_get_nevra_as_string (self); other_nevra = modulemd_rpm_map_entry_get_nevra_as_string (other); return !g_strcmp0 (self_nevra, other_nevra); } gboolean modulemd_rpm_map_entry_validate (ModulemdRpmMapEntry *self, GError **error) { if (!self->name) { g_set_error_literal ( error, MODULEMD_ERROR, MMD_ERROR_VALIDATE, "Missing name attribute"); return FALSE; } if (!self->version) { g_set_error_literal (error, MODULEMD_ERROR, MMD_ERROR_VALIDATE, "Missing version attribute"); return FALSE; } if (!self->release) { g_set_error_literal (error, MODULEMD_ERROR, MMD_ERROR_VALIDATE, "Missing release attribute"); return FALSE; } if (!self->arch) { g_set_error_literal ( error, MODULEMD_ERROR, MMD_ERROR_VALIDATE, "Missing arch attribute"); return FALSE; } return TRUE; } MODULEMD_SETTER_GETTER_STRING ( ModulemdRpmMapEntry, rpm_map_entry, RPM_MAP_ENTRY, name, NAME) MODULEMD_SETTER_GETTER_STRING ( ModulemdRpmMapEntry, rpm_map_entry, RPM_MAP_ENTRY, version, VERSION) MODULEMD_SETTER_GETTER_STRING ( ModulemdRpmMapEntry, rpm_map_entry, RPM_MAP_ENTRY, release, RELEASE) MODULEMD_SETTER_GETTER_STRING ( ModulemdRpmMapEntry, rpm_map_entry, RPM_MAP_ENTRY, arch, ARCH) void modulemd_rpm_map_entry_set_epoch (ModulemdRpmMapEntry *self, guint64 epoch) { g_return_if_fail (MODULEMD_IS_RPM_MAP_ENTRY (self)); self->epoch = epoch; g_object_notify_by_pspec (G_OBJECT (self), properties[PROP_EPOCH]); } guint64 modulemd_rpm_map_entry_get_epoch (ModulemdRpmMapEntry *self) { g_return_val_if_fail (MODULEMD_IS_RPM_MAP_ENTRY (self), 0); return self->epoch; } gchar * modulemd_rpm_map_entry_get_nevra_as_string (ModulemdRpmMapEntry *self) { g_return_val_if_fail (MODULEMD_IS_RPM_MAP_ENTRY (self), 0); if (!modulemd_rpm_map_entry_validate (self, NULL)) { /* None of the strings are optional and if any are missing, we can't * generate a valid NEVRA */ return NULL; } return g_strdup_printf ("%s-%" PRIu64 ":%s-%s.%s", self->name, self->epoch, self->version, self->release, self->arch); } static void modulemd_rpm_map_entry_get_property (GObject *object, guint prop_id, GValue *value, GParamSpec *pspec) { ModulemdRpmMapEntry *self = MODULEMD_RPM_MAP_ENTRY (object); switch (prop_id) { case PROP_NAME: g_value_set_string (value, modulemd_rpm_map_entry_get_name (self)); break; case PROP_EPOCH: g_value_set_uint64 (value, modulemd_rpm_map_entry_get_epoch (self)); break; case PROP_VERSION: g_value_set_string (value, modulemd_rpm_map_entry_get_version (self)); break; case PROP_RELEASE: g_value_set_string (value, modulemd_rpm_map_entry_get_release (self)); break; case PROP_ARCH: g_value_set_string (value, modulemd_rpm_map_entry_get_arch (self)); break; case PROP_NEVRA: g_value_take_string (value, modulemd_rpm_map_entry_get_nevra_as_string (self)); break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); } } static void modulemd_rpm_map_entry_set_property (GObject *object, guint prop_id, const GValue *value, GParamSpec *pspec) { ModulemdRpmMapEntry *self = MODULEMD_RPM_MAP_ENTRY (object); switch (prop_id) { case PROP_NAME: modulemd_rpm_map_entry_set_name (self, g_value_get_string (value)); break; case PROP_EPOCH: modulemd_rpm_map_entry_set_epoch (self, g_value_get_uint64 (value)); break; case PROP_VERSION: modulemd_rpm_map_entry_set_version (self, g_value_get_string (value)); break; case PROP_RELEASE: modulemd_rpm_map_entry_set_release (self, g_value_get_string (value)); break; case PROP_ARCH: modulemd_rpm_map_entry_set_arch (self, g_value_get_string (value)); break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); } } static void modulemd_rpm_map_entry_class_init (ModulemdRpmMapEntryClass *klass) { GObjectClass *object_class = G_OBJECT_CLASS (klass); object_class->finalize = modulemd_rpm_map_entry_finalize; object_class->get_property = modulemd_rpm_map_entry_get_property; object_class->set_property = modulemd_rpm_map_entry_set_property; properties[PROP_NAME] = g_param_spec_string ( "name", "Artifact name", "The artifact package name", NULL, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS | G_PARAM_CONSTRUCT); properties[PROP_EPOCH] = g_param_spec_uint64 ( "epoch", "Artifact epoch", "The artifact package epoch", 0, G_MAXUINT32, 0, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS | G_PARAM_CONSTRUCT); properties[PROP_VERSION] = g_param_spec_string ( "version", "Artifact version", "The artifact package version", NULL, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS | G_PARAM_CONSTRUCT); properties[PROP_RELEASE] = g_param_spec_string ( "release", "Artifact release string", "The artifact package release string", NULL, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS | G_PARAM_CONSTRUCT); properties[PROP_ARCH] = g_param_spec_string ( "arch", "Artifact architecture", "The artifact package architecture", NULL, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS | G_PARAM_CONSTRUCT); properties[PROP_NEVRA] = g_param_spec_string ("nevra", "Artifact N-E:V-R.A", "The artifact package N-E:V-R.A", NULL, G_PARAM_READABLE | G_PARAM_STATIC_STRINGS); g_object_class_install_properties (object_class, N_PROPS, properties); } static void modulemd_rpm_map_entry_init (ModulemdRpmMapEntry *UNUSED (self)) { } /* === YAML Functions === */ ModulemdRpmMapEntry * modulemd_rpm_map_entry_parse_yaml (yaml_parser_t *parser, gboolean strict, GError **error) { MODULEMD_INIT_TRACE (); MMD_INIT_YAML_EVENT (event); gboolean done = FALSE; gboolean seen_epoch = FALSE; g_autoptr (ModulemdRpmMapEntry) entry = NULL; g_autoptr (GError) nested_error = NULL; guint64 epoch = 0; g_autofree gchar *scalar = NULL; g_autofree gchar *nevra = NULL; g_autofree gchar *built_nevra = NULL; g_return_val_if_fail (error == NULL || *error == NULL, FALSE); entry = g_object_new (MODULEMD_TYPE_RPM_MAP_ENTRY, NULL); YAML_PARSER_PARSE_WITH_EXIT (parser, &event, error); if (event.type != YAML_MAPPING_START_EVENT) { MMD_YAML_ERROR_EVENT_EXIT ( error, event, "Missing mapping in rpm-map entry"); } while (!done) { YAML_PARSER_PARSE_WITH_EXIT (parser, &event, error); switch (event.type) { case YAML_MAPPING_END_EVENT: done = TRUE; break; case YAML_SCALAR_EVENT: if (g_str_equal ((const gchar *)event.data.scalar.value, "name")) { scalar = modulemd_yaml_parse_string (parser, &nested_error); if (!scalar) { MMD_YAML_ERROR_EVENT_EXIT ( error, event, "Failed to parse package name: %s", nested_error->message); } modulemd_rpm_map_entry_set_name (entry, scalar); g_clear_pointer (&scalar, g_free); } else if (g_str_equal ((const gchar *)event.data.scalar.value, "epoch")) { epoch = modulemd_yaml_parse_uint64 (parser, &nested_error); if (nested_error) { MMD_YAML_ERROR_EVENT_EXIT ( error, event, "Failed to parse package epoch: %s", nested_error->message); } modulemd_rpm_map_entry_set_epoch (entry, epoch); seen_epoch = TRUE; } else if (g_str_equal ((const gchar *)event.data.scalar.value, "version")) { scalar = modulemd_yaml_parse_string (parser, &nested_error); if (!scalar) { MMD_YAML_ERROR_EVENT_EXIT ( error, event, "Failed to parse package version: %s", nested_error->message); } modulemd_rpm_map_entry_set_version (entry, scalar); g_clear_pointer (&scalar, g_free); } else if (g_str_equal ((const gchar *)event.data.scalar.value, "release")) { scalar = modulemd_yaml_parse_string (parser, &nested_error); if (!scalar) { MMD_YAML_ERROR_EVENT_EXIT ( error, event, "Failed to parse package release: %s", nested_error->message); } modulemd_rpm_map_entry_set_release (entry, scalar); g_clear_pointer (&scalar, g_free); } else if (g_str_equal ((const gchar *)event.data.scalar.value, "arch")) { scalar = modulemd_yaml_parse_string (parser, &nested_error); if (!scalar) { MMD_YAML_ERROR_EVENT_EXIT ( error, event, "Failed to parse package architecture: %s", nested_error->message); } modulemd_rpm_map_entry_set_arch (entry, scalar); g_clear_pointer (&scalar, g_free); } else if (g_str_equal ((const gchar *)event.data.scalar.value, "nevra")) { nevra = modulemd_yaml_parse_string (parser, &nested_error); if (!nevra) { MMD_YAML_ERROR_EVENT_EXIT ( error, event, "Failed to parse package nevra: %s", nested_error->message); } } else { SKIP_UNKNOWN (parser, NULL, "Unexpected key in rpm-map entry: %s", (const gchar *)event.data.scalar.value); break; } break; default: MMD_YAML_ERROR_EVENT_EXIT ( error, event, "Unexpected YAML event %s in defaults data", mmd_yaml_get_event_name (event.type)); break; } yaml_event_delete (&event); } if (!modulemd_rpm_map_entry_validate (entry, &nested_error)) { g_propagate_prefixed_error ( error, g_steal_pointer (&nested_error), "Validation of entry failed"); return NULL; } /* Check that we got the epoch */ if (!seen_epoch) { g_set_error_literal (error, MODULEMD_YAML_ERROR, MMD_YAML_ERROR_MISSING_REQUIRED, "Missing 'epoch' in rpm-map entry"); return NULL; } /* check that we got the NEVRA and that it matches the exploded version */ if (!nevra) { g_set_error_literal (error, MODULEMD_YAML_ERROR, MMD_YAML_ERROR_MISSING_REQUIRED, "Missing 'nevra' in rpm-map entry"); return NULL; } built_nevra = modulemd_rpm_map_entry_get_nevra_as_string (entry); if (!g_str_equal (nevra, built_nevra)) { g_set_error (error, MODULEMD_YAML_ERROR, MMD_YAML_ERROR_INCONSISTENT, "'nevra' field (%s) differs from exploded version (%s)", nevra, built_nevra); return NULL; } return g_steal_pointer (&entry); } gboolean modulemd_rpm_map_entry_emit_yaml (ModulemdRpmMapEntry *self, yaml_emitter_t *emitter, GError **error) { MODULEMD_INIT_TRACE (); g_autoptr (GError) nested_error = NULL; g_autofree gchar *epoch = NULL; g_autofree gchar *nevra = NULL; if (!modulemd_rpm_map_entry_validate (self, &nested_error)) { g_propagate_prefixed_error (error, g_steal_pointer (&nested_error), "rpm-map entry failed to validate: "); return FALSE; } epoch = g_strdup_printf ("%" PRIu64, self->epoch); nevra = modulemd_rpm_map_entry_get_nevra_as_string (self); EMIT_MAPPING_START_WITH_STYLE (emitter, error, YAML_BLOCK_MAPPING_STYLE); EMIT_KEY_VALUE_STRING (emitter, error, "name", self->name); EMIT_KEY_VALUE (emitter, error, "epoch", epoch); EMIT_KEY_VALUE_STRING (emitter, error, "version", self->version); EMIT_KEY_VALUE_STRING (emitter, error, "release", self->release); EMIT_KEY_VALUE_STRING (emitter, error, "arch", self->arch); EMIT_KEY_VALUE_STRING (emitter, error, "nevra", nevra); EMIT_MAPPING_END (emitter, &nested_error); return TRUE; } fedora-modularity-libmodulemd-357799c/modulemd/modulemd-service-level.c000066400000000000000000000305611502446517500262710ustar00rootroot00000000000000/* * This file is part of libmodulemd * Copyright (C) 2017-2018 Stephen Gallagher * * Fedora-License-Identifier: MIT * SPDX-2.0-License-Identifier: MIT * SPDX-3.0-License-Identifier: MIT * * This program is free software. * For more information on the license, see COPYING. * For more information on free software, see . */ #include #include #include "modulemd-service-level.h" #include "private/glib-extensions.h" #include "private/modulemd-service-level-private.h" #include "private/modulemd-util.h" #include "private/modulemd-yaml.h" #define SL_DEFAULT_STRING "__NAME_UNSET__" struct _ModulemdServiceLevel { GObject parent_instance; gchar *name; GDate *eol; }; G_DEFINE_TYPE (ModulemdServiceLevel, modulemd_service_level, G_TYPE_OBJECT) enum { PROP_0, PROP_NAME, N_PROPS }; static GParamSpec *properties[N_PROPS]; ModulemdServiceLevel * modulemd_service_level_new (const gchar *name) { // clang-format off return g_object_new (MODULEMD_TYPE_SERVICE_LEVEL, "name", name, NULL); // clang-format on } gboolean modulemd_service_level_equals_wrapper (const void *a, const void *b) { g_return_val_if_fail (MODULEMD_IS_SERVICE_LEVEL ((ModulemdServiceLevel *)a), FALSE); g_return_val_if_fail (MODULEMD_IS_SERVICE_LEVEL ((ModulemdServiceLevel *)b), FALSE); return modulemd_service_level_equals ((ModulemdServiceLevel *)a, (ModulemdServiceLevel *)b); } gboolean modulemd_service_level_equals (ModulemdServiceLevel *self_1, ModulemdServiceLevel *self_2) { if (!self_1 && !self_2) { return TRUE; } if (!self_1 || !self_2) { return FALSE; } g_return_val_if_fail (MODULEMD_IS_SERVICE_LEVEL (self_1), FALSE); g_return_val_if_fail (MODULEMD_IS_SERVICE_LEVEL (self_2), FALSE); if (g_strcmp0 (modulemd_service_level_get_name (self_1), modulemd_service_level_get_name (self_2)) != 0) { return FALSE; } /*if both eols are invalid, its equivalent*/ if (!g_date_valid (self_1->eol) && !g_date_valid (self_2->eol)) { return TRUE; } if (!g_date_valid (self_1->eol) || !g_date_valid (self_2->eol)) { return FALSE; } if (g_date_compare (self_1->eol, self_2->eol) != 0) { return FALSE; } return TRUE; } ModulemdServiceLevel * modulemd_service_level_copy (ModulemdServiceLevel *self) { g_autoptr (ModulemdServiceLevel) sl = NULL; g_return_val_if_fail (MODULEMD_IS_SERVICE_LEVEL (self), NULL); sl = modulemd_service_level_new (modulemd_service_level_get_name (self)); modulemd_service_level_set_eol (sl, modulemd_service_level_get_eol (self)); return g_object_ref (sl); } static void modulemd_service_level_finalize (GObject *object) { ModulemdServiceLevel *self = (ModulemdServiceLevel *)object; g_clear_pointer (&self->name, g_free); g_clear_pointer (&self->eol, g_date_free); G_OBJECT_CLASS (modulemd_service_level_parent_class)->finalize (object); } static void modulemd_service_level_set_name (ModulemdServiceLevel *self, const gchar *name) { g_return_if_fail (MODULEMD_IS_SERVICE_LEVEL (self)); /* It is a coding error if we ever get a NULL name here */ g_return_if_fail (name); /* It is a coding error if we ever get the default name here */ g_return_if_fail (g_strcmp0 (name, SL_DEFAULT_STRING)); g_clear_pointer (&self->name, g_free); self->name = g_strdup (name); g_object_notify_by_pspec (G_OBJECT (self), properties[PROP_NAME]); } const gchar * modulemd_service_level_get_name (ModulemdServiceLevel *self) { g_return_val_if_fail (MODULEMD_IS_SERVICE_LEVEL (self), NULL); return self->name; } void modulemd_service_level_set_eol (ModulemdServiceLevel *self, GDate *date) { g_return_if_fail (MODULEMD_IS_SERVICE_LEVEL (self)); if (!date || !g_date_valid (date)) { g_date_clear (self->eol, 1); return; } if (!g_date_valid (self->eol) || g_date_compare (date, self->eol) != 0) { /* Date is changing. Update it */ g_date_set_year (self->eol, g_date_get_year (date)); g_date_set_month (self->eol, g_date_get_month (date)); g_date_set_day (self->eol, g_date_get_day (date)); } } void modulemd_service_level_set_eol_ymd (ModulemdServiceLevel *self, GDateYear year, GDateMonth month, GDateDay day) { g_autoptr (GDate) date = NULL; g_return_if_fail (MODULEMD_IS_SERVICE_LEVEL (self)); if (!g_date_valid_dmy (day, month, year)) { /* Treat invalid dates as NULL */ return modulemd_service_level_set_eol (self, NULL); } date = g_date_new_dmy (day, month, year); return modulemd_service_level_set_eol (self, date); } void modulemd_service_level_remove_eol (ModulemdServiceLevel *self) { return modulemd_service_level_set_eol (self, NULL); } GDate * modulemd_service_level_get_eol (ModulemdServiceLevel *self) { g_return_val_if_fail (MODULEMD_IS_SERVICE_LEVEL (self), NULL); if (self->eol && g_date_valid (self->eol)) { return self->eol; } return NULL; } gchar * modulemd_service_level_get_eol_as_string (ModulemdServiceLevel *self) { if (self->eol && g_date_valid (self->eol)) { return g_strdup_printf ("%.4d-%.2d-%.2d", g_date_get_year (self->eol), g_date_get_month (self->eol), g_date_get_day (self->eol)); } return NULL; } static void modulemd_service_level_get_property (GObject *object, guint prop_id, GValue *value, GParamSpec *pspec) { ModulemdServiceLevel *self = MODULEMD_SERVICE_LEVEL (object); switch (prop_id) { case PROP_NAME: g_value_set_string (value, modulemd_service_level_get_name (self)); break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); } } static void modulemd_service_level_set_property (GObject *object, guint prop_id, const GValue *value, GParamSpec *pspec) { ModulemdServiceLevel *self = MODULEMD_SERVICE_LEVEL (object); switch (prop_id) { case PROP_NAME: modulemd_service_level_set_name (self, g_value_get_string (value)); break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); } } static void modulemd_service_level_class_init (ModulemdServiceLevelClass *klass) { GObjectClass *object_class = G_OBJECT_CLASS (klass); object_class->finalize = modulemd_service_level_finalize; object_class->get_property = modulemd_service_level_get_property; object_class->set_property = modulemd_service_level_set_property; properties[PROP_NAME] = g_param_spec_string ( "name", "Name", "A human-readable name for this servicelevel", SL_DEFAULT_STRING, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS | G_PARAM_CONSTRUCT_ONLY); g_object_class_install_properties (object_class, N_PROPS, properties); } static void modulemd_service_level_init (ModulemdServiceLevel *self) { self->eol = g_date_new (); } /* === YAML Functions === */ ModulemdServiceLevel * modulemd_service_level_parse_yaml (yaml_parser_t *parser, const gchar *name, gboolean strict, GError **error) { MODULEMD_INIT_TRACE (); MMD_INIT_YAML_EVENT (event); gboolean done = FALSE; gboolean in_map = FALSE; g_autoptr (ModulemdServiceLevel) sl = NULL; GDate *eol = NULL; g_autoptr (GError) nested_error = NULL; g_return_val_if_fail (error == NULL || *error == NULL, FALSE); sl = modulemd_service_level_new (name); /* Read in any supplementary attributes of the service level, * such as 'eol' */ while (!done) { YAML_PARSER_PARSE_WITH_EXIT (parser, &event, error); switch (event.type) { case YAML_MAPPING_START_EVENT: /* This is the start of the service level content. */ in_map = TRUE; break; case YAML_MAPPING_END_EVENT: if (!in_map) { MMD_YAML_ERROR_EVENT_EXIT ( error, event, "Unexpected MAPPING_END in service level"); break; } /* We're done processing the service level content */ in_map = FALSE; done = TRUE; break; case YAML_SCALAR_EVENT: if (!in_map) { /* We must be in the map before we handle scalars */ MMD_YAML_ERROR_EVENT_EXIT ( error, event, "Missing mapping in service level"); break; } /* Only "eol" is supported right now */ if (!g_strcmp0 ((const gchar *)event.data.scalar.value, "eol")) { /* Get the EOL date */ eol = modulemd_yaml_parse_date (parser, &nested_error); if (!eol) { MMD_YAML_ERROR_EVENT_EXIT ( error, event, "Failed to parse EOL date in service level: %s", nested_error->message); } modulemd_service_level_set_eol (sl, eol); g_date_free (eol); } else { /* Unknown field in service level */ SKIP_UNKNOWN (parser, FALSE, "Unexpected key in service level body: %s", (const gchar *)event.data.scalar.value); } break; default: /* We received a YAML event we shouldn't expect at this level */ MMD_YAML_ERROR_EVENT_EXIT ( error, event, "Unexpected YAML event in service level"); break; } yaml_event_delete (&event); } return g_object_ref (sl); } gboolean modulemd_service_level_emit_yaml (ModulemdServiceLevel *self, yaml_emitter_t *emitter, GError **error) { MODULEMD_INIT_TRACE (); int ret; g_autoptr (GError) nested_error = NULL; g_autofree gchar *eol_string = NULL; MMD_INIT_YAML_EVENT (event); /* Emit the Service Level Name */ ret = mmd_emitter_scalar_string ( emitter, modulemd_service_level_get_name (self), &nested_error); if (!ret) { g_propagate_prefixed_error (error, g_steal_pointer (&nested_error), "Failed to emit service level name: "); return FALSE; } /* Start the mapping for additional attributes of this service level */ ret = mmd_emitter_start_mapping ( emitter, YAML_BLOCK_MAPPING_STYLE, &nested_error); if (!ret) { g_propagate_prefixed_error (error, g_steal_pointer (&nested_error), "Failed to start service level mapping: "); return FALSE; } /* Add service level attributes if available */ if (modulemd_service_level_get_eol (self) != NULL) { ret = mmd_emitter_scalar ( emitter, "eol", YAML_PLAIN_SCALAR_STYLE, &nested_error); if (!ret) { g_propagate_prefixed_error (error, g_steal_pointer (&nested_error), "Failed to emit EOL key: "); return FALSE; } eol_string = modulemd_service_level_get_eol_as_string (self); ret = mmd_emitter_scalar ( emitter, eol_string, YAML_PLAIN_SCALAR_STYLE, &nested_error); if (!ret) { g_propagate_prefixed_error (error, g_steal_pointer (&nested_error), "Failed to emit EOL string [%s]: ", eol_string); return FALSE; } } /* End the mapping */ ret = mmd_emitter_end_mapping (emitter, &nested_error); if (!ret) { g_propagate_prefixed_error (error, g_steal_pointer (&nested_error), "Failed to end service level mapping: "); return FALSE; } return TRUE; } fedora-modularity-libmodulemd-357799c/modulemd/modulemd-subdocument-info.c000066400000000000000000000244721502446517500270110ustar00rootroot00000000000000/* * This file is part of libmodulemd * Copyright (C) 2018 Red Hat, Inc. * * Fedora-License-Identifier: MIT * SPDX-2.0-License-Identifier: MIT * SPDX-3.0-License-Identifier: MIT * * This program is free software. * For more information on the license, see COPYING. * For more information on free software, see . */ #include #include #include "modulemd-errors.h" #include "modulemd-subdocument-info.h" #include "private/glib-extensions.h" #include "private/modulemd-subdocument-info-private.h" #include "private/modulemd-util.h" #include "private/modulemd-yaml.h" #define SD_DEFAULT_STRING "__SUBDOCUMENT_INFO_VALUE_UNSET__" struct _ModulemdSubdocumentInfo { GObject parent_instance; ModulemdYamlDocumentTypeEnum doctype; guint64 mdversion; GError *error; gchar *contents; }; G_DEFINE_TYPE (ModulemdSubdocumentInfo, modulemd_subdocument_info, G_TYPE_OBJECT) ModulemdSubdocumentInfo * modulemd_subdocument_info_new (void) { return g_object_new (MODULEMD_TYPE_SUBDOCUMENT_INFO, NULL); } ModulemdSubdocumentInfo * modulemd_subdocument_info_copy (ModulemdSubdocumentInfo *self) { g_autoptr (ModulemdSubdocumentInfo) s = NULL; g_return_val_if_fail (MODULEMD_IS_SUBDOCUMENT_INFO (self), NULL); s = modulemd_subdocument_info_new (); modulemd_subdocument_info_set_doctype ( s, modulemd_subdocument_info_get_doctype (self)); modulemd_subdocument_info_set_mdversion ( s, modulemd_subdocument_info_get_mdversion (self)); modulemd_subdocument_info_set_gerror ( s, modulemd_subdocument_info_get_gerror (self)); modulemd_subdocument_info_set_yaml ( s, modulemd_subdocument_info_get_yaml (self)); return g_steal_pointer (&s); } static void modulemd_subdocument_info_finalize (GObject *object) { ModulemdSubdocumentInfo *self = (ModulemdSubdocumentInfo *)object; g_clear_pointer (&self->error, g_error_free); g_clear_pointer (&self->contents, g_free); G_OBJECT_CLASS (modulemd_subdocument_info_parent_class)->finalize (object); } void modulemd_subdocument_info_set_yaml (ModulemdSubdocumentInfo *self, const gchar *contents) { g_return_if_fail (MODULEMD_IS_SUBDOCUMENT_INFO (self)); g_debug ("Setting YAML: %s\n", contents); g_clear_pointer (&self->contents, g_free); self->contents = g_strdup (contents); } const gchar * modulemd_subdocument_info_get_yaml (ModulemdSubdocumentInfo *self) { g_return_val_if_fail (MODULEMD_IS_SUBDOCUMENT_INFO (self), NULL); return self->contents; } void modulemd_subdocument_info_set_gerror (ModulemdSubdocumentInfo *self, const GError *error) { g_return_if_fail (MODULEMD_IS_SUBDOCUMENT_INFO (self)); g_clear_pointer (&self->error, g_error_free); /* Sets NULL. */ if (error) { self->error = g_error_copy (error); } } const GError * modulemd_subdocument_info_get_gerror (ModulemdSubdocumentInfo *self) { g_return_val_if_fail (MODULEMD_IS_SUBDOCUMENT_INFO (self), NULL); return self->error; } void modulemd_subdocument_info_set_doctype (ModulemdSubdocumentInfo *self, ModulemdYamlDocumentTypeEnum doctype) { g_return_if_fail (MODULEMD_IS_SUBDOCUMENT_INFO (self)); self->doctype = doctype; } ModulemdYamlDocumentTypeEnum modulemd_subdocument_info_get_doctype (ModulemdSubdocumentInfo *self) { g_return_val_if_fail (MODULEMD_IS_SUBDOCUMENT_INFO (self), MODULEMD_YAML_DOC_UNKNOWN); return self->doctype; } void modulemd_subdocument_info_set_mdversion (ModulemdSubdocumentInfo *self, guint64 mdversion) { g_return_if_fail (MODULEMD_IS_SUBDOCUMENT_INFO (self)); self->mdversion = mdversion; } guint64 modulemd_subdocument_info_get_mdversion (ModulemdSubdocumentInfo *self) { g_return_val_if_fail (MODULEMD_IS_SUBDOCUMENT_INFO (self), 0); return self->mdversion; } gboolean modulemd_subdocument_info_get_data_parser (ModulemdSubdocumentInfo *self, yaml_parser_t *parser, gboolean strict, GError **error) { g_return_val_if_fail (MODULEMD_IS_SUBDOCUMENT_INFO (self), FALSE); g_return_val_if_fail (error == NULL || *error == NULL, FALSE); MMD_INIT_YAML_EVENT (event); MODULEMD_INIT_TRACE (); gsize depth = 0; yaml_parser_set_input_string ( parser, (const unsigned char *)self->contents, strlen (self->contents)); YAML_PARSER_PARSE_WITH_EXIT_BOOL (parser, &event, error); if (event.type != YAML_STREAM_START_EVENT) { MMD_YAML_ERROR_EVENT_EXIT_BOOL ( error, event, "Subdocument did not begin with a STREAM_START."); } yaml_event_delete (&event); /* The second event must be the document start */ YAML_PARSER_PARSE_WITH_EXIT_BOOL (parser, &event, error); if (event.type != YAML_DOCUMENT_START_EVENT) { MMD_YAML_ERROR_EVENT_EXIT_BOOL ( error, event, "Subdocument did not begin with a DOCUMENT_START."); } yaml_event_delete (&event); YAML_PARSER_PARSE_WITH_EXIT_BOOL (parser, &event, error); if (event.type != YAML_MAPPING_START_EVENT) { MMD_YAML_ERROR_EVENT_EXIT_BOOL ( error, event, "Subdocument did not begin with a MAPPING_START."); } yaml_event_delete (&event); while (TRUE) { YAML_PARSER_PARSE_WITH_EXIT_BOOL (parser, &event, error); if (event.type == 0) { g_set_error (error, MODULEMD_YAML_ERROR, MMD_YAML_ERROR_UNPARSEABLE, "Unexpected end while waiting for data"); return FALSE; } switch (event.type) { case YAML_SCALAR_EVENT: if (depth == 0) { if (g_str_equal ((const gchar *)event.data.scalar.value, "data")) { /* We have arrived at the "data". Return. */ return TRUE; } if (g_str_equal ((const gchar *)event.data.scalar.value, "document") || g_str_equal ((const gchar *)event.data.scalar.value, "version")) { /* Always kip over the contents of document and version, * since it was already parsed when we created this subdoc. */ if (!skip_unknown_yaml (parser, error)) { return FALSE; } } else { /* There shouldn't be any other fields at the root of the * document. Reject or ignore based on 'strict' setting. */ SKIP_UNKNOWN (parser, FALSE, "Unexpected key in root: %s", (const gchar *)event.data.scalar.value); } } break; case YAML_SEQUENCE_START_EVENT: case YAML_MAPPING_START_EVENT: depth++; break; case YAML_SEQUENCE_END_EVENT: case YAML_MAPPING_END_EVENT: depth--; FALLTHROUGH; default: if (depth == 0) { g_set_error (error, MODULEMD_YAML_ERROR, MMD_YAML_ERROR_UNPARSEABLE, "Unexpected event while waiting for data: %s", mmd_yaml_get_event_name (event.type)); return FALSE; } break; } yaml_event_delete (&event); } return FALSE; } static void modulemd_subdocument_info_get_property (GObject *object, guint prop_id, GValue *UNUSED (value), GParamSpec *pspec) { // ModulemdSubdocumentInfo *self = MODULEMD_SUBDOCUMENT_INFO (object); switch (prop_id) { default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); } } static void modulemd_subdocument_info_set_property (GObject *object, guint prop_id, const GValue *UNUSED (value), GParamSpec *pspec) { // ModulemdSubdocumentInfo *self = MODULEMD_SUBDOCUMENT_INFO (object); switch (prop_id) { default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); } } static void modulemd_subdocument_info_class_init (ModulemdSubdocumentInfoClass *klass) { GObjectClass *object_class = G_OBJECT_CLASS (klass); object_class->finalize = modulemd_subdocument_info_finalize; object_class->get_property = modulemd_subdocument_info_get_property; object_class->set_property = modulemd_subdocument_info_set_property; } static void modulemd_subdocument_info_init (ModulemdSubdocumentInfo *UNUSED (self)) { /* Nothing to init */ } void modulemd_subdocument_info_debug_dump_failures (GPtrArray *failures) { if (failures && failures->len) { if (failures->len == 1) { g_debug ("%u YAML subdocument was invalid:", failures->len); } else { g_debug ("%u YAML subdocuments were invalid:", failures->len); } for (guint i = 0; i < failures->len; i++) { ModulemdSubdocumentInfo *doc = NULL; const GError *error = NULL; const gchar *message = NULL; const gchar *yaml = NULL; doc = MODULEMD_SUBDOCUMENT_INFO (g_ptr_array_index (failures, i)); if (doc) { error = modulemd_subdocument_info_get_gerror (doc); if (error && error->message) { message = error->message; } else { message = "unknown reason"; } yaml = modulemd_subdocument_info_get_yaml (doc); } else { message = "undefined document"; } if (yaml) { g_debug ( "Failed subdocument #%u (%s):\n%s", i + 1, message, yaml); } else { g_debug ("Failed subdocument #%u (%s).", i + 1, message); } } } } fedora-modularity-libmodulemd-357799c/modulemd/modulemd-translation-entry.c000066400000000000000000000474621502446517500272310ustar00rootroot00000000000000/* * This file is part of libmodulemd * Copyright (C) 2018 Red Hat, Inc. * * Fedora-License-Identifier: MIT * SPDX-2.0-License-Identifier: MIT * SPDX-3.0-License-Identifier: MIT * * This program is free software. * For more information on the license, see COPYING. * For more information on free software, see . */ #include #include #include "modulemd-errors.h" #include "modulemd-translation-entry.h" #include "private/glib-extensions.h" #include "private/modulemd-translation-entry-private.h" #include "private/modulemd-util.h" #include "private/modulemd-yaml.h" #define TE_DEFAULT_STRING "__LOCALE_UNSET__" struct _ModulemdTranslationEntry { GObject parent_instance; gchar *locale; gchar *summary; gchar *description; GHashTable *profile_descriptions; }; G_DEFINE_TYPE (ModulemdTranslationEntry, modulemd_translation_entry, G_TYPE_OBJECT) enum { PROP_0, PROP_LOCALE, PROP_SUMMARY, PROP_DESCRIPTION, N_PROPS }; static GParamSpec *properties[N_PROPS]; ModulemdTranslationEntry * modulemd_translation_entry_new (const gchar *locale) { // clang-format off return g_object_new (MODULEMD_TYPE_TRANSLATION_ENTRY, "locale", locale, NULL); // clang-format on } ModulemdTranslationEntry * modulemd_translation_entry_copy (ModulemdTranslationEntry *self) { g_autoptr (ModulemdTranslationEntry) te = NULL; g_return_val_if_fail (MODULEMD_IS_TRANSLATION_ENTRY (self), NULL); te = modulemd_translation_entry_new ( modulemd_translation_entry_get_locale (self)); modulemd_translation_entry_set_summary ( te, modulemd_translation_entry_get_summary (self)); modulemd_translation_entry_set_description ( te, modulemd_translation_entry_get_description (self)); g_hash_table_unref (te->profile_descriptions); te->profile_descriptions = modulemd_hash_table_deep_str_copy (self->profile_descriptions); return g_object_ref (te); } static void modulemd_translation_entry_finalize (GObject *object) { ModulemdTranslationEntry *self = (ModulemdTranslationEntry *)object; g_clear_pointer (&self->locale, g_free); g_clear_pointer (&self->summary, g_free); g_clear_pointer (&self->description, g_free); g_clear_pointer (&self->profile_descriptions, g_hash_table_unref); G_OBJECT_CLASS (modulemd_translation_entry_parent_class)->finalize (object); } void modulemd_translation_entry_set_summary (ModulemdTranslationEntry *self, const gchar *summary) { g_return_if_fail (MODULEMD_IS_TRANSLATION_ENTRY (self)); g_clear_pointer (&self->summary, g_free); self->summary = g_strdup (summary); g_object_notify_by_pspec (G_OBJECT (self), properties[PROP_SUMMARY]); } const gchar * modulemd_translation_entry_get_summary (ModulemdTranslationEntry *self) { g_return_val_if_fail (MODULEMD_IS_TRANSLATION_ENTRY (self), NULL); return self->summary; } void modulemd_translation_entry_set_description (ModulemdTranslationEntry *self, const gchar *description) { g_return_if_fail (MODULEMD_IS_TRANSLATION_ENTRY (self)); g_clear_pointer (&self->description, g_free); self->description = g_strdup (description); g_object_notify_by_pspec (G_OBJECT (self), properties[PROP_DESCRIPTION]); } const gchar * modulemd_translation_entry_get_description (ModulemdTranslationEntry *self) { g_return_val_if_fail (MODULEMD_IS_TRANSLATION_ENTRY (self), NULL); return self->description; } static void modulemd_translation_entry_set_locale (ModulemdTranslationEntry *self, const gchar *locale) { g_return_if_fail (MODULEMD_IS_TRANSLATION_ENTRY (self)); /* It is a coding error if we ever get a NULL name here */ g_return_if_fail (locale); /* It is a coding error if we ever get the default string here */ g_return_if_fail (g_strcmp0 (locale, TE_DEFAULT_STRING)); g_clear_pointer (&self->locale, g_free); self->locale = g_strdup (locale); g_object_notify_by_pspec (G_OBJECT (self), properties[PROP_LOCALE]); } const gchar * modulemd_translation_entry_get_locale (ModulemdTranslationEntry *self) { g_return_val_if_fail (MODULEMD_IS_TRANSLATION_ENTRY (self), NULL); return self->locale; } GStrv modulemd_translation_entry_get_profiles_as_strv ( ModulemdTranslationEntry *self) { return modulemd_ordered_str_keys_as_strv (self->profile_descriptions); } void modulemd_translation_entry_set_profile_description ( ModulemdTranslationEntry *self, const gchar *profile_name, const gchar *profile_description) { g_hash_table_replace (self->profile_descriptions, g_strdup (profile_name), g_strdup (profile_description)); } const gchar * modulemd_translation_entry_get_profile_description ( ModulemdTranslationEntry *self, const gchar *profile_name) { return (const gchar *)g_hash_table_lookup (self->profile_descriptions, profile_name); } static void modulemd_translation_entry_get_property (GObject *object, guint prop_id, GValue *value, GParamSpec *pspec) { ModulemdTranslationEntry *self = MODULEMD_TRANSLATION_ENTRY (object); switch (prop_id) { case PROP_LOCALE: g_value_set_string (value, modulemd_translation_entry_get_locale (self)); break; case PROP_SUMMARY: g_value_set_string (value, modulemd_translation_entry_get_summary (self)); break; case PROP_DESCRIPTION: g_value_set_string (value, modulemd_translation_entry_get_description (self)); break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); } } static void modulemd_translation_entry_set_property (GObject *object, guint prop_id, const GValue *value, GParamSpec *pspec) { ModulemdTranslationEntry *self = MODULEMD_TRANSLATION_ENTRY (object); switch (prop_id) { case PROP_LOCALE: modulemd_translation_entry_set_locale (self, g_value_get_string (value)); break; case PROP_SUMMARY: modulemd_translation_entry_set_summary (self, g_value_get_string (value)); break; case PROP_DESCRIPTION: modulemd_translation_entry_set_description (self, g_value_get_string (value)); break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); } } static void modulemd_translation_entry_class_init (ModulemdTranslationEntryClass *klass) { GObjectClass *object_class = G_OBJECT_CLASS (klass); object_class->finalize = modulemd_translation_entry_finalize; object_class->get_property = modulemd_translation_entry_get_property; object_class->set_property = modulemd_translation_entry_set_property; properties[PROP_LOCALE] = g_param_spec_string ( "locale", "Locale", "The locale for this translation entry. It must correspond to the format " "specified by libc locale names. This field may only be set on object " "construction and is immutable afterwards.", TE_DEFAULT_STRING, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS | G_PARAM_CONSTRUCT_ONLY); properties[PROP_SUMMARY] = g_param_spec_string ("summary", "Summary", "The summary of this module stream translated into " "the language specified by locale.", TE_DEFAULT_STRING, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS); properties[PROP_DESCRIPTION] = g_param_spec_string ("description", "Description", "The description of this module stream translated " "into the language specified by locale.", TE_DEFAULT_STRING, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS); g_object_class_install_properties (object_class, N_PROPS, properties); } static void modulemd_translation_entry_init (ModulemdTranslationEntry *self) { self->profile_descriptions = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, g_free); } /* === YAML Functions === */ static GHashTable * modulemd_translation_entry_parse_yaml_profiles (yaml_parser_t *parser, GError **error) { MODULEMD_INIT_TRACE (); MMD_INIT_YAML_EVENT (event); gboolean done = FALSE; gboolean in_map = FALSE; g_autofree gchar *profile_name = NULL; g_autofree gchar *value = NULL; g_autoptr (GHashTable) profiles = NULL; g_autoptr (GError) nested_error = NULL; g_return_val_if_fail (error == NULL || *error == NULL, FALSE); profiles = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, g_free); /* Parse the profiles */ while (!done) { YAML_PARSER_PARSE_WITH_EXIT (parser, &event, error); switch (event.type) { case YAML_MAPPING_START_EVENT: in_map = TRUE; break; case YAML_MAPPING_END_EVENT: in_map = FALSE; done = TRUE; break; case YAML_SCALAR_EVENT: if (!in_map) { MMD_YAML_ERROR_EVENT_EXIT ( error, event, "Missing mapping in translation entry profiles"); break; } profile_name = g_strdup ((const gchar *)event.data.scalar.value); value = modulemd_yaml_parse_string (parser, &nested_error); if (!value) { MMD_YAML_ERROR_EVENT_EXIT (error, event, "Error parsing profile value: %s", nested_error->message); } g_hash_table_replace (profiles, g_steal_pointer (&profile_name), g_steal_pointer (&value)); break; default: /* We received a YAML event we shouldn't expect at this level */ MMD_YAML_ERROR_EVENT_EXIT ( error, event, "Unexpected YAML event in translation entry profile"); break; } yaml_event_delete (&event); } /* Work around false-positive in clang static analysis which thinks it's * possible for this function to return NULL and not set error. */ if (G_UNLIKELY (profiles == NULL)) { g_set_error (error, MODULEMD_YAML_ERROR, MMD_YAML_ERROR_EMIT, "Somehow got a NULL hash table here."); } return g_steal_pointer (&profiles); } ModulemdTranslationEntry * modulemd_translation_entry_parse_yaml (yaml_parser_t *parser, const gchar *locale, gboolean strict, GError **error) { MODULEMD_INIT_TRACE (); MMD_INIT_YAML_EVENT (event); gboolean done = FALSE; gboolean in_map = FALSE; g_autofree gchar *value = NULL; GHashTable *profiles = NULL; g_autoptr (ModulemdTranslationEntry) te = NULL; g_autoptr (GError) nested_error = NULL; g_return_val_if_fail (error == NULL || *error == NULL, FALSE); te = modulemd_translation_entry_new (locale); /* Read in any supplementary attributes of the translation entry */ while (!done) { YAML_PARSER_PARSE_WITH_EXIT (parser, &event, error); switch (event.type) { case YAML_MAPPING_START_EVENT: in_map = TRUE; break; case YAML_MAPPING_END_EVENT: in_map = FALSE; done = TRUE; break; case YAML_SCALAR_EVENT: if (!in_map) { MMD_YAML_ERROR_EVENT_EXIT ( error, event, "Missing mapping in translation entry"); break; } if (!g_strcmp0 ((const gchar *)event.data.scalar.value, "summary")) { value = modulemd_yaml_parse_string (parser, &nested_error); if (!value) { MMD_YAML_ERROR_EVENT_EXIT ( error, event, "Failed to parse summary in translation entry: %s", nested_error->message); } modulemd_translation_entry_set_summary (te, value); g_clear_pointer (&value, g_free); } else if (!g_strcmp0 ((const gchar *)event.data.scalar.value, "description")) { value = modulemd_yaml_parse_string (parser, &nested_error); if (!value) { MMD_YAML_ERROR_EVENT_EXIT ( error, event, "Failed to parse description in translation entry: %s", nested_error->message); } modulemd_translation_entry_set_description (te, value); g_clear_pointer (&value, g_free); } else if (!g_strcmp0 ((const gchar *)event.data.scalar.value, "profiles")) { profiles = modulemd_translation_entry_parse_yaml_profiles ( parser, &nested_error); if (profiles == NULL) { MMD_YAML_ERROR_EVENT_EXIT (error, event, "Failed to parse profiles: %s", nested_error->message); } g_hash_table_unref (te->profile_descriptions); te->profile_descriptions = profiles; } else { SKIP_UNKNOWN (parser, NULL, "Unexpected key in translation entry body: %s", (const gchar *)event.data.scalar.value); } break; default: /* We received a YAML event we shouldn't expect at this level */ MMD_YAML_ERROR_EVENT_EXIT ( error, event, "Unexpected YAML event in translation entry"); break; } yaml_event_delete (&event); } return g_steal_pointer (&te); } static gboolean modulemd_translation_entry_emit_yaml_profiles (ModulemdTranslationEntry *self, yaml_emitter_t *emitter, GError **error) { MODULEMD_INIT_TRACE (); int ret; g_autoptr (GError) nested_error = NULL; GHashTableIter iter; gpointer key; gpointer value; MMD_INIT_YAML_EVENT (event); ret = mmd_emitter_scalar ( emitter, "profiles", YAML_PLAIN_SCALAR_STYLE, &nested_error); if (!ret) { g_propagate_prefixed_error (error, g_steal_pointer (&nested_error), "Failed to emit profiles key: "); return FALSE; } ret = mmd_emitter_start_mapping ( emitter, YAML_BLOCK_MAPPING_STYLE, &nested_error); if (!ret) { g_propagate_prefixed_error (error, g_steal_pointer (&nested_error), "Failed to emit profiles start: "); return FALSE; } g_hash_table_iter_init (&iter, self->profile_descriptions); while (g_hash_table_iter_next (&iter, &key, &value)) { ret = mmd_emitter_scalar_string (emitter, (const gchar *)key, &nested_error); if (!ret) { g_propagate_prefixed_error (error, g_steal_pointer (&nested_error), "Failed to emit profile key: "); return FALSE; } ret = mmd_emitter_scalar_string ( emitter, (const gchar *)value, &nested_error); if (!ret) { g_propagate_prefixed_error (error, g_steal_pointer (&nested_error), "Failed to emit profile value: "); return FALSE; } } ret = mmd_emitter_end_mapping (emitter, &nested_error); if (!ret) { g_propagate_prefixed_error (error, g_steal_pointer (&nested_error), "Failed to emit profiles end: "); return FALSE; } return TRUE; } gboolean modulemd_translation_entry_emit_yaml (ModulemdTranslationEntry *self, yaml_emitter_t *emitter, GError **error) { MODULEMD_INIT_TRACE (); int ret; g_autoptr (GError) nested_error = NULL; MMD_INIT_YAML_EVENT (event); /* Emit the Translation Entry Locale */ ret = mmd_emitter_scalar_string ( emitter, modulemd_translation_entry_get_locale (self), &nested_error); if (!ret) { g_propagate_prefixed_error (error, g_steal_pointer (&nested_error), "Failed to emit translation entry locale: "); return FALSE; } /* Start the mapping for additional attributes of this translation entry */ ret = mmd_emitter_start_mapping ( emitter, YAML_BLOCK_MAPPING_STYLE, &nested_error); if (!ret) { g_propagate_prefixed_error ( error, g_steal_pointer (&nested_error), "Failed to start translation entry mapping: "); return FALSE; } /* Add translation entry attributes if available */ if (modulemd_translation_entry_get_summary (self) != NULL) { ret = mmd_emitter_scalar ( emitter, "summary", YAML_PLAIN_SCALAR_STYLE, &nested_error); if (!ret) { g_propagate_prefixed_error (error, g_steal_pointer (&nested_error), "Failed to emit summary key: "); return FALSE; } ret = mmd_emitter_scalar_string ( emitter, modulemd_translation_entry_get_summary (self), &nested_error); if (!ret) { g_propagate_prefixed_error ( error, g_steal_pointer (&nested_error), "Failed to emit translation entry summary: "); return FALSE; } } if (modulemd_translation_entry_get_description (self) != NULL) { ret = mmd_emitter_scalar ( emitter, "description", YAML_PLAIN_SCALAR_STYLE, &nested_error); if (!ret) { g_propagate_prefixed_error (error, g_steal_pointer (&nested_error), "Failed to emit description key: "); return FALSE; } ret = mmd_emitter_scalar_string ( emitter, modulemd_translation_entry_get_description (self), &nested_error); if (!ret) { g_propagate_prefixed_error ( error, g_steal_pointer (&nested_error), "Failed to emit translation entry description: "); return FALSE; } } if (g_hash_table_size (self->profile_descriptions) != 0) { ret = modulemd_translation_entry_emit_yaml_profiles ( self, emitter, &nested_error); if (!ret) { g_propagate_prefixed_error (error, g_steal_pointer (&nested_error), "Failed to emit profiles: "); return FALSE; } } /* End the mapping */ ret = mmd_emitter_end_mapping (emitter, &nested_error); if (!ret) { g_propagate_prefixed_error (error, g_steal_pointer (&nested_error), "Failed to end translation entry mapping: "); return FALSE; } return TRUE; } fedora-modularity-libmodulemd-357799c/modulemd/modulemd-translation.c000066400000000000000000000533161502446517500260650ustar00rootroot00000000000000/* * This file is part of libmodulemd * Copyright (C) 2018 Red Hat, Inc. * * Fedora-License-Identifier: MIT * SPDX-2.0-License-Identifier: MIT * SPDX-3.0-License-Identifier: MIT * * This program is free software. * For more information on the license, see COPYING. * For more information on free software, see . */ #include #include #include #include "modulemd-errors.h" #include "modulemd-translation-entry.h" #include "modulemd-translation.h" #include "private/glib-extensions.h" #include "private/modulemd-subdocument-info-private.h" #include "private/modulemd-translation-entry-private.h" #include "private/modulemd-translation-private.h" #include "private/modulemd-util.h" #include "private/modulemd-yaml.h" #define T_DEFAULT_STRING "__TRANSLATION_VALUE_UNSET__" #define T_PLACEHOLDER_STRING "__TRANSLATION_VALUE_NOT_YET_SET__" struct _ModulemdTranslation { GObject parent_instance; guint64 version; gchar *module_name; gchar *module_stream; guint64 modified; GHashTable *translation_entries; }; G_DEFINE_TYPE (ModulemdTranslation, modulemd_translation, G_TYPE_OBJECT) enum { PROP_0, PROP_VERSION, PROP_MODULE_NAME, PROP_MODULE_STREAM, PROP_MODIFIED, N_PROPS }; static GParamSpec *properties[N_PROPS]; ModulemdTranslation * modulemd_translation_new (guint64 version, const gchar *module_name, const gchar *module_stream, guint64 modified) { // clang-format off return g_object_new (MODULEMD_TYPE_TRANSLATION, "version", version, "module_name", module_name, "module_stream", module_stream, "modified", modified, NULL); // clang-format on } ModulemdTranslation * modulemd_translation_copy (ModulemdTranslation *self) { g_autoptr (ModulemdTranslation) t = NULL; gpointer key; gpointer value; GHashTableIter iter; g_return_val_if_fail (MODULEMD_IS_TRANSLATION (self), NULL); t = modulemd_translation_new (modulemd_translation_get_version (self), modulemd_translation_get_module_name (self), modulemd_translation_get_module_stream (self), modulemd_translation_get_modified (self)); g_hash_table_iter_init (&iter, self->translation_entries); while (g_hash_table_iter_next (&iter, &key, &value)) { modulemd_translation_set_translation_entry (t, value); } return g_steal_pointer (&t); } gboolean modulemd_translation_validate (ModulemdTranslation *self, GError **error) { g_return_val_if_fail (MODULEMD_IS_TRANSLATION (self), FALSE); if (g_str_equal (modulemd_translation_get_module_name (self), T_PLACEHOLDER_STRING)) { g_set_error_literal (error, MODULEMD_ERROR, MMD_ERROR_VALIDATE, "Translation module name is unset."); return FALSE; } if (strlen (modulemd_translation_get_module_name (self)) == 0) { g_set_error_literal (error, MODULEMD_ERROR, MMD_ERROR_VALIDATE, "Translation module name is empty."); return FALSE; } if (g_str_equal (modulemd_translation_get_module_stream (self), T_PLACEHOLDER_STRING)) { g_set_error_literal (error, MODULEMD_ERROR, MMD_ERROR_VALIDATE, "Translation module stream is unset."); return FALSE; } if (strlen (modulemd_translation_get_module_stream (self)) == 0) { g_set_error_literal (error, MODULEMD_ERROR, MMD_ERROR_VALIDATE, "Translation module stream is unset."); return FALSE; } if (modulemd_translation_get_modified (self) == 0) { g_set_error_literal (error, MODULEMD_ERROR, MMD_ERROR_VALIDATE, "Translation module modified is empty."); return FALSE; } return TRUE; } static void modulemd_translation_finalize (GObject *object) { ModulemdTranslation *self = (ModulemdTranslation *)object; g_clear_pointer (&self->module_name, g_free); g_clear_pointer (&self->module_stream, g_free); g_clear_pointer (&self->translation_entries, g_hash_table_unref); G_OBJECT_CLASS (modulemd_translation_parent_class)->finalize (object); } guint64 modulemd_translation_get_version (ModulemdTranslation *self) { return self->version; } const gchar * modulemd_translation_get_module_name (ModulemdTranslation *self) { return self->module_name; } const gchar * modulemd_translation_get_module_stream (ModulemdTranslation *self) { return self->module_stream; } guint64 modulemd_translation_get_modified (ModulemdTranslation *self) { return self->modified; } static void modulemd_translation_set_version (ModulemdTranslation *self, guint64 version) { g_return_if_fail (MODULEMD_IS_TRANSLATION (self)); g_return_if_fail (version != 0); self->version = version; g_object_notify_by_pspec (G_OBJECT (self), properties[PROP_VERSION]); } static void modulemd_translation_set_module_name (ModulemdTranslation *self, const gchar *module_name) { g_return_if_fail (MODULEMD_IS_TRANSLATION (self)); g_return_if_fail (module_name); g_return_if_fail (g_strcmp0 (module_name, T_DEFAULT_STRING)); g_clear_pointer (&self->module_name, g_free); self->module_name = g_strdup (module_name); g_object_notify_by_pspec (G_OBJECT (self), properties[PROP_MODULE_NAME]); } static void modulemd_translation_set_module_stream (ModulemdTranslation *self, const gchar *module_stream) { g_return_if_fail (MODULEMD_IS_TRANSLATION (self)); g_return_if_fail (module_stream); g_return_if_fail (g_strcmp0 (module_stream, T_DEFAULT_STRING)); g_clear_pointer (&self->module_stream, g_free); self->module_stream = g_strdup (module_stream); g_object_notify_by_pspec (G_OBJECT (self), properties[PROP_MODULE_STREAM]); } void modulemd_translation_set_modified (ModulemdTranslation *self, guint64 modified) { g_return_if_fail (MODULEMD_IS_TRANSLATION (self)); self->modified = modified; g_object_notify_by_pspec (G_OBJECT (self), properties[PROP_MODIFIED]); } GStrv modulemd_translation_get_locales_as_strv (ModulemdTranslation *self) { g_return_val_if_fail (MODULEMD_IS_TRANSLATION (self), NULL); return modulemd_ordered_str_keys_as_strv (self->translation_entries); } void modulemd_translation_set_translation_entry ( ModulemdTranslation *self, ModulemdTranslationEntry *translation_entry) { g_return_if_fail (MODULEMD_IS_TRANSLATION (self)); g_hash_table_insert ( self->translation_entries, g_strdup (modulemd_translation_entry_get_locale (translation_entry)), modulemd_translation_entry_copy (translation_entry)); } ModulemdTranslationEntry * modulemd_translation_get_translation_entry (ModulemdTranslation *self, const gchar *locale) { g_return_val_if_fail (MODULEMD_IS_TRANSLATION (self), NULL); return g_hash_table_lookup (self->translation_entries, locale); } static void modulemd_translation_get_property (GObject *object, guint prop_id, GValue *value, GParamSpec *pspec) { ModulemdTranslation *self = MODULEMD_TRANSLATION (object); switch (prop_id) { case PROP_VERSION: g_value_set_uint64 (value, modulemd_translation_get_version (self)); break; case PROP_MODULE_NAME: g_value_set_string (value, modulemd_translation_get_module_name (self)); break; case PROP_MODULE_STREAM: g_value_set_string (value, modulemd_translation_get_module_stream (self)); break; case PROP_MODIFIED: g_value_set_uint64 (value, modulemd_translation_get_modified (self)); break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); } } static void modulemd_translation_set_property (GObject *object, guint prop_id, const GValue *value, GParamSpec *pspec) { ModulemdTranslation *self = MODULEMD_TRANSLATION (object); switch (prop_id) { case PROP_VERSION: modulemd_translation_set_version (self, g_value_get_uint64 (value)); break; case PROP_MODULE_NAME: modulemd_translation_set_module_name (self, g_value_get_string (value)); break; case PROP_MODULE_STREAM: modulemd_translation_set_module_stream (self, g_value_get_string (value)); break; case PROP_MODIFIED: modulemd_translation_set_modified (self, g_value_get_uint64 (value)); break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); } } static void modulemd_translation_class_init (ModulemdTranslationClass *klass) { GObjectClass *object_class = G_OBJECT_CLASS (klass); object_class->finalize = modulemd_translation_finalize; object_class->get_property = modulemd_translation_get_property; object_class->set_property = modulemd_translation_set_property; properties[PROP_VERSION] = g_param_spec_uint64 ("version", "Version", "The metadata version of this Translation object.", 0, G_MAXUINT64, 0, G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY); properties[PROP_MODULE_NAME] = g_param_spec_string ( "module-name", "Module name", "The name of the module to which these translations apply.", T_DEFAULT_STRING, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS | G_PARAM_CONSTRUCT_ONLY); properties[PROP_MODULE_STREAM] = g_param_spec_string ( "module-stream", "Module stream", "The name of the module stream to which these translations apply.", T_DEFAULT_STRING, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS | G_PARAM_CONSTRUCT_ONLY); properties[PROP_MODIFIED] = g_param_spec_uint64 ( "modified", "Modified", "The last modified time represented as a 64-bit integer " "(such as 201807011200)", 0, G_MAXUINT64, 0, G_PARAM_READWRITE); g_object_class_install_properties (object_class, N_PROPS, properties); } static void modulemd_translation_init (ModulemdTranslation *self) { self->translation_entries = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, g_object_unref); } /* === YAML Functions === */ static GHashTable * modulemd_translation_parse_yaml_entries (yaml_parser_t *parser, gboolean strict, GError **error) { MODULEMD_INIT_TRACE (); MMD_INIT_YAML_EVENT (event); g_autoptr (GError) nested_error = NULL; gboolean in_map = FALSE; gboolean done = FALSE; gchar *locale; g_autoptr (GHashTable) translation_entries = NULL; g_autoptr (ModulemdTranslationEntry) te = NULL; g_return_val_if_fail (error == NULL || *error == NULL, FALSE); translation_entries = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, g_object_unref); while (!done) { YAML_PARSER_PARSE_WITH_EXIT (parser, &event, error); switch (event.type) { case YAML_MAPPING_START_EVENT: in_map = TRUE; break; case YAML_MAPPING_END_EVENT: in_map = FALSE; done = TRUE; break; case YAML_SCALAR_EVENT: if (!in_map) { MMD_YAML_ERROR_EVENT_EXIT_BOOL ( error, event, "Missing mapping in translation data entry"); } te = modulemd_translation_entry_parse_yaml ( parser, (const gchar *)event.data.scalar.value, strict, &nested_error); if (te == NULL) { MMD_YAML_ERROR_EVENT_EXIT ( error, event, "Failed to parse translation entry: %s", nested_error->message); } locale = g_strdup (modulemd_translation_entry_get_locale (te)); g_hash_table_insert ( translation_entries, locale, g_steal_pointer (&te)); break; default: MMD_YAML_ERROR_EVENT_EXIT ( error, event, "Unexpected YAML event %s in translation entries data", mmd_yaml_get_event_name (event.type)); break; } yaml_event_delete (&event); } /* Work around false-positive in clang static analysis which thinks it's * possible for this function to return NULL and not set error. */ if (G_UNLIKELY (translation_entries == NULL)) { g_set_error (error, MODULEMD_YAML_ERROR, MMD_YAML_ERROR_EMIT, "Somehow got a NULL hash table here."); } return g_steal_pointer (&translation_entries); } ModulemdTranslation * modulemd_translation_parse_yaml (ModulemdSubdocumentInfo *subdoc, gboolean strict, GError **error) { MODULEMD_INIT_TRACE (); MMD_INIT_YAML_PARSER (parser); MMD_INIT_YAML_EVENT (event); gboolean done = FALSE; g_autoptr (ModulemdTranslation) t = NULL; g_autoptr (GError) nested_error = NULL; g_autofree gchar *value = NULL; guint64 modified; g_autoptr (GHashTable) entries = NULL; guint64 version = modulemd_subdocument_info_get_mdversion (subdoc); if (!modulemd_subdocument_info_get_data_parser ( subdoc, &parser, strict, error)) { return NULL; } g_return_val_if_fail (error == NULL || *error == NULL, FALSE); /* Create a translation with placeholder module info. */ t = modulemd_translation_new ( version, T_PLACEHOLDER_STRING, T_PLACEHOLDER_STRING, 0); YAML_PARSER_PARSE_WITH_EXIT (&parser, &event, error); if (event.type != YAML_MAPPING_START_EVENT) { MMD_YAML_ERROR_EVENT_EXIT_BOOL ( error, event, "Missing mapping in translation data entry"); } while (!done) { YAML_PARSER_PARSE_WITH_EXIT (&parser, &event, error); switch (event.type) { case YAML_MAPPING_END_EVENT: done = TRUE; break; case YAML_SCALAR_EVENT: if (g_str_equal ((const gchar *)event.data.scalar.value, "module")) { if (!g_str_equal (modulemd_translation_get_module_name (t), T_PLACEHOLDER_STRING)) { MMD_YAML_ERROR_EVENT_EXIT ( error, event, "Module name encountered twice"); } value = modulemd_yaml_parse_string (&parser, &nested_error); if (!value) { MMD_YAML_ERROR_EVENT_EXIT ( error, event, "Failed to parse module name in translation data: %s", nested_error->message); } modulemd_translation_set_module_name (t, value); g_clear_pointer (&value, g_free); } else if (g_str_equal ((const gchar *)event.data.scalar.value, "stream")) { if (!g_str_equal (modulemd_translation_get_module_stream (t), T_PLACEHOLDER_STRING)) { MMD_YAML_ERROR_EVENT_EXIT ( error, event, "Module stream encountered twice"); } value = modulemd_yaml_parse_string (&parser, &nested_error); if (!value) { MMD_YAML_ERROR_EVENT_EXIT ( error, event, "Failed to parse module stream in translation data: %s", nested_error->message); } modulemd_translation_set_module_stream (t, value); g_clear_pointer (&value, g_free); } else if (g_str_equal ((const gchar *)event.data.scalar.value, "modified")) { modified = modulemd_yaml_parse_uint64 (&parser, &nested_error); if (nested_error) { MMD_YAML_ERROR_EVENT_EXIT ( error, event, "Failed to parse modified in translation data: %s", nested_error->message); } modulemd_translation_set_modified (t, modified); } else if (g_str_equal ((const gchar *)event.data.scalar.value, "translations")) { entries = modulemd_translation_parse_yaml_entries ( &parser, strict, &nested_error); if (!entries) { MMD_YAML_ERROR_EVENT_EXIT ( error, event, "Failed to parse translations in translation data: %s", nested_error->message); } g_hash_table_unref (t->translation_entries); t->translation_entries = g_steal_pointer (&entries); } else { SKIP_UNKNOWN (&parser, NULL, "Unexpected key in translation data: %s", (const gchar *)event.data.scalar.value); break; } break; default: MMD_YAML_ERROR_EVENT_EXIT ( error, event, "Unexpected YAML event %s in translation data", mmd_yaml_get_event_name (event.type)); break; } yaml_event_delete (&event); } if (!modulemd_translation_validate (t, &nested_error)) { MMD_YAML_ERROR_EVENT_EXIT (error, event, "Unable to validate translation object: %s", nested_error->message); } return g_steal_pointer (&t); } static gboolean modulemd_translation_emit_yaml_entries (ModulemdTranslation *self, yaml_emitter_t *emitter, GError **error) { GHashTableIter iter; g_autoptr (GError) nested_error = NULL; gpointer key; gpointer value; if (!mmd_emitter_start_mapping (emitter, YAML_BLOCK_MAPPING_STYLE, error)) { return FALSE; } g_hash_table_iter_init (&iter, self->translation_entries); while (g_hash_table_iter_next (&iter, &key, &value)) { if (!modulemd_translation_entry_emit_yaml ( (ModulemdTranslationEntry *)value, emitter, &nested_error)) { g_propagate_prefixed_error (error, g_steal_pointer (&nested_error), "Error emitting translation entry: "); return FALSE; } } if (!mmd_emitter_end_mapping (emitter, error)) { return FALSE; } return TRUE; } gboolean modulemd_translation_emit_yaml (ModulemdTranslation *self, yaml_emitter_t *emitter, GError **error) { MODULEMD_INIT_TRACE (); g_autoptr (GError) nested_error = NULL; g_autofree gchar *modified_string = NULL; if (!modulemd_translation_validate (self, &nested_error)) { g_propagate_prefixed_error (error, g_steal_pointer (&nested_error), "Translation object failed validation: "); return FALSE; } modified_string = g_strdup_printf ("%" PRIu64, modulemd_translation_get_modified (self)); /* Emit document headers */ if (!modulemd_yaml_emit_document_headers ( emitter, MODULEMD_YAML_DOC_TRANSLATIONS, modulemd_translation_get_version (self), error)) { return FALSE; } /* Start data: */ if (!mmd_emitter_start_mapping (emitter, YAML_BLOCK_MAPPING_STYLE, error)) { return FALSE; } if (!mmd_emitter_scalar (emitter, "module", YAML_PLAIN_SCALAR_STYLE, error)) { return FALSE; } if (!mmd_emitter_scalar_string ( emitter, modulemd_translation_get_module_name (self), error)) { return FALSE; } if (!mmd_emitter_scalar (emitter, "stream", YAML_PLAIN_SCALAR_STYLE, error)) { return FALSE; } if (!mmd_emitter_scalar (emitter, modulemd_translation_get_module_stream (self), YAML_DOUBLE_QUOTED_SCALAR_STYLE, error)) { return FALSE; } if (!mmd_emitter_scalar ( emitter, "modified", YAML_PLAIN_SCALAR_STYLE, error)) { return FALSE; } if (!mmd_emitter_scalar ( emitter, modified_string, YAML_PLAIN_SCALAR_STYLE, error)) { return FALSE; } if (g_hash_table_size (self->translation_entries) != 0) { if (!mmd_emitter_scalar ( emitter, "translations", YAML_PLAIN_SCALAR_STYLE, error)) { return FALSE; } if (!modulemd_translation_emit_yaml_entries (self, emitter, error)) { return FALSE; } } /* Close the data: mapping */ if (!mmd_emitter_end_mapping (emitter, error)) { return FALSE; } /* Close top-level mapping */ if (!mmd_emitter_end_mapping (emitter, error)) { return FALSE; } /* Close document */ if (!mmd_emitter_end_document (emitter, error)) { return FALSE; } return TRUE; } fedora-modularity-libmodulemd-357799c/modulemd/modulemd-util.c000066400000000000000000000377551502446517500245150ustar00rootroot00000000000000/* * This file is part of libmodulemd * Copyright (C) 2017-2018 Stephen Gallagher * * Fedora-License-Identifier: MIT * SPDX-2.0-License-Identifier: MIT * SPDX-3.0-License-Identifier: MIT * * This program is free software. * For more information on the license, see COPYING. * For more information on free software, see . */ #include #include #include #include "modulemd-errors.h" #include "modulemd-module-stream.h" #include "private/glib-extensions.h" #include "private/modulemd-util.h" GQuark modulemd_error_quark (void) { return g_quark_from_static_string ("modulemd-error-quark"); } modulemd_tracer * modulemd_trace_init (const gchar *function_name) { modulemd_tracer *self = g_malloc0_n (1, sizeof (modulemd_tracer)); self->function_name = g_strdup (function_name); g_debug ("TRACE: Entering %s", self->function_name); return self; } void modulemd_trace_free (modulemd_tracer *tracer) { g_debug ("TRACE: Exiting %s", tracer->function_name); g_clear_pointer (&tracer->function_name, g_free); g_free (tracer); } GHashTable * modulemd_hash_table_deep_str_copy (GHashTable *orig) { GHashTable *new; GHashTableIter iter; gpointer key; gpointer value; g_return_val_if_fail (orig, NULL); new = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, g_free); g_hash_table_iter_init (&iter, orig); while (g_hash_table_iter_next (&iter, &key, &value)) { g_hash_table_insert ( new, g_strdup ((const gchar *)key), g_strdup ((const gchar *)value)); } return new; } GHashTable * modulemd_hash_table_deep_set_copy (GHashTable *orig) { GHashTable *new; GHashTableIter iter; gpointer key; gpointer value; g_return_val_if_fail (orig, NULL); new = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, NULL); g_hash_table_iter_init (&iter, orig); while (g_hash_table_iter_next (&iter, &key, &value)) { g_hash_table_add (new, g_strdup ((const gchar *)key)); } return new; } GHashTable * modulemd_hash_table_deep_str_set_copy (GHashTable *orig) { GHashTable *new; GHashTableIter iter; gpointer key; gpointer value; g_return_val_if_fail (orig, NULL); new = g_hash_table_new_full ( g_str_hash, g_str_equal, g_free, modulemd_hash_table_unref); g_hash_table_iter_init (&iter, orig); while (g_hash_table_iter_next (&iter, &key, &value)) { g_hash_table_insert (new, g_strdup ((const gchar *)key), modulemd_hash_table_deep_set_copy (value)); } return new; } GHashTable * modulemd_hash_table_deep_str_str_set_copy (GHashTable *orig) { GHashTable *new; GHashTableIter iter; gpointer key; gpointer value; g_return_val_if_fail (orig, NULL); new = g_hash_table_new_full ( g_str_hash, g_str_equal, g_free, modulemd_hash_table_unref); g_hash_table_iter_init (&iter, orig); while (g_hash_table_iter_next (&iter, &key, &value)) { g_hash_table_insert (new, g_strdup ((const gchar *)key), modulemd_hash_table_deep_str_set_copy (value)); } return new; } gboolean modulemd_hash_table_sets_are_equal_wrapper (const void *a, const void *b) { return modulemd_hash_table_sets_are_equal ((GHashTable *)a, (GHashTable *)b); } gboolean modulemd_hash_table_sets_are_equal (GHashTable *a, GHashTable *b) { g_autoptr (GPtrArray) set_a = NULL; g_autoptr (GPtrArray) set_b = NULL; if (g_hash_table_size (a) != g_hash_table_size (b)) { /* If they have a different number of strings in the set, they can't * be identical. */ return FALSE; } set_a = modulemd_ordered_str_keys (a, modulemd_strcmp_sort); set_b = modulemd_ordered_str_keys (b, modulemd_strcmp_sort); for (guint i = 0; i < set_a->len; i++) { /* These are guaranteed to be returned ordered, so we can * assume that any difference at any index means that the * lists are not identical. */ if (!g_str_equal (g_ptr_array_index (set_a, i), g_ptr_array_index (set_b, i))) { /* No match, so this simpleset is not equal */ return FALSE; } } /* If we made it here, everything must have matched */ return TRUE; } /* Processes the set of keys first, then calls a unique compare function to handle any kind of value*/ gboolean modulemd_hash_table_equals (GHashTable *a, GHashTable *b, GEqualFunc compare_func) { g_autoptr (GPtrArray) set_a = NULL; g_autoptr (GPtrArray) set_b = NULL; guint i = 0; gchar *key = NULL; gchar *value_a = NULL; gchar *value_b = NULL; /*Check size*/ if (g_hash_table_size (a) != g_hash_table_size (b)) { return FALSE; } /*Equality check on keys of hashtable*/ set_a = modulemd_ordered_str_keys (a, modulemd_strcmp_sort); set_b = modulemd_ordered_str_keys (b, modulemd_strcmp_sort); for (i = 0; i < set_a->len; i++) { if (!g_str_equal (g_ptr_array_index (set_a, i), g_ptr_array_index (set_b, i))) { return FALSE; } } /*Equality check for each value of all keys of hashtable*/ for (i = 0; i < set_a->len; i++) { key = g_ptr_array_index (set_a, i); value_a = g_hash_table_lookup (a, key); value_b = g_hash_table_lookup (b, key); if (!compare_func (value_a, value_b)) { return FALSE; } } return TRUE; } gint modulemd_hash_table_compare (GHashTable *a, GHashTable *b, GCompareFunc value_compare_func) { g_autoptr (GPtrArray) set_a = NULL; g_autoptr (GPtrArray) set_b = NULL; guint i = 0; gchar *key = NULL; gchar *value_a = NULL; gchar *value_b = NULL; gint cmp; /* Get the ordered list of keys from each hashtable. */ set_a = modulemd_ordered_str_keys (a, modulemd_strcmp_sort); set_b = modulemd_ordered_str_keys (b, modulemd_strcmp_sort); for (i = 0; i < set_a->len; i++) { /* If we ran out of elements in the second set, it is shorter and thus the * lesser one. */ if (i >= set_b->len) { return 1; } /* Compare the keys. */ cmp = g_strcmp0 (g_ptr_array_index (set_a, i), g_ptr_array_index (set_b, i)); if (cmp != 0) { return cmp; } /* If the keys match, compare the values if needed. */ if (value_compare_func) { key = g_ptr_array_index (set_a, i); value_a = g_hash_table_lookup (a, key); value_b = g_hash_table_lookup (b, key); cmp = value_compare_func (value_a, value_b); if (cmp != 0) { return cmp; } } } /* If everything has been the same so far but there are more elements in the * second set, it is longer and thus the greater one. */ if (set_a->len < set_b->len) { return -1; } /* If we made it this far, they are equal. */ return 0; } gint modulemd_strcmp_sort (gconstpointer a, gconstpointer b) { return g_strcmp0 (*(const gchar **)a, *(const gchar **)b); } gint modulemd_strcmp_wrapper (gconstpointer a, gconstpointer b) { return g_strcmp0 ((gchar *)a, (gchar *)b); } GPtrArray * modulemd_ordered_str_keys (GHashTable *htable, GCompareFunc compare_func) { GPtrArray *keys; GHashTableIter iter; gpointer key; keys = g_ptr_array_new_full (g_hash_table_size (htable), g_free); g_hash_table_iter_init (&iter, htable); while (g_hash_table_iter_next (&iter, &key, NULL)) { g_ptr_array_add (keys, g_strdup ((const gchar *)key)); } g_ptr_array_sort (keys, compare_func); return keys; } GStrv modulemd_ordered_str_keys_as_strv (GHashTable *htable) { GPtrArray *keys = modulemd_ordered_str_keys (htable, modulemd_strcmp_sort); // Add the NULL sentinel g_ptr_array_add (keys, NULL); // Store the pdata for returning after we free the container GStrv result = (GStrv)keys->pdata; g_ptr_array_free (keys, FALSE); return result; } void modulemd_hash_table_unref (void *table) { if (!table) { return; } g_hash_table_unref ((GHashTable *)table); } static void destroy_variant_data (gpointer data) { g_free (data); } GVariant * modulemd_variant_deep_copy (GVariant *variant) { const GVariantType *data_type = g_variant_get_type (variant); gsize data_size = g_variant_get_size (variant); gpointer data = NULL; if (data_size > 0) { data = g_malloc0 (data_size); g_variant_store (variant, data); } return g_variant_ref_sink (g_variant_new_from_data ( data_type, data, data_size, FALSE, destroy_variant_data, data)); } gboolean modulemd_validate_nevra (const gchar *nevra) { g_autofree gchar *tmp = g_strdup (nevra); gsize len = strlen (nevra); gchar *i; gchar *endptr; /* Since the "name" portion of a NEVRA can have an infinite number of * hyphens, we need to parse from the end backwards. */ i = &tmp[len - 1]; /* Everything after the last '.' must be the architecture */ while (i >= tmp) { if (*i == '.') { break; } i--; } if (i < tmp) { /* We hit the start of the string without hitting '.' */ return FALSE; } /* * TODO: Compare the architecture suffix with a list of known-valid ones * This needs to come from an external source that's kept up to date or * this will regularly break. */ /* Process the "release" tag */ while (i >= tmp) { if (*i == '-') { break; } i--; } if (i < tmp) { /* We hit the start of the string without hitting '-' */ return FALSE; } /* No need to validate Release; it's fairly arbitrary */ i--; /* Process the version */ while (i >= tmp) { if (*i == ':') { break; } if (*i == '-') { /* '-' between version and epoch is not allowed */ return FALSE; } i--; } if (i < tmp) { /* We hit the start of the string without hitting ':' */ return FALSE; } /* Process the epoch */ *i = '\0'; while (i >= tmp) { if (*i == '-') { break; } i--; } if (i < tmp) { /* We hit the start of the string without hitting '-' */ return FALSE; } /* Validate that this section is a number */ g_ascii_strtoll (i, &endptr, 10); if (endptr == i) { /* String conversion failed */ return FALSE; } /* No need to specifically parse the name section here */ return TRUE; } gboolean modulemd_boolean_equals (gboolean a, gboolean b) { /* * There is no validation when assigning to a gboolean variable and so it * could contain any value represented by a gint. Thus, each value needs to * be canonicalized before comparing for equality. */ if (!!a == !!b) { return TRUE; } return FALSE; } gboolean modulemd_is_glob_pattern (const char *pattern) { g_return_val_if_fail (pattern, FALSE); return strpbrk (pattern, "*[?") != NULL; } gint compare_streams (gconstpointer a, gconstpointer b) { int cmp = 0; guint64 a_ver; guint64 b_ver; ModulemdModuleStream *a_ = *(ModulemdModuleStream **)a; ModulemdModuleStream *b_ = *(ModulemdModuleStream **)b; /* Sort alphabetically by module name */ cmp = g_strcmp0 (modulemd_module_stream_get_module_name (a_), modulemd_module_stream_get_module_name (b_)); if (cmp != 0) { return cmp; } /* Sort alphabetically by stream name */ cmp = g_strcmp0 (modulemd_module_stream_get_stream_name (a_), modulemd_module_stream_get_stream_name (b_)); if (cmp != 0) { return cmp; } /* Sort by the version, highest first */ a_ver = modulemd_module_stream_get_version (a_); b_ver = modulemd_module_stream_get_version (b_); if (b_ver > a_ver) { return 1; } if (a_ver > b_ver) { return -1; } /* Sort alphabetically by context */ cmp = g_strcmp0 (modulemd_module_stream_get_context (a_), modulemd_module_stream_get_context (b_)); if (cmp != 0) { return cmp; } /* Sort alphabetically by architecture */ cmp = g_strcmp0 (modulemd_module_stream_get_arch (a_), modulemd_module_stream_get_arch (b_)); return cmp; } gboolean modulemd_fnmatch (const gchar *pattern, const gchar *string) { if (!pattern) { return TRUE; } if (!string) { return FALSE; } return !fnmatch (pattern, string, 0); } gboolean modulemd_rpm_match (gpointer key, gpointer UNUSED (value), gpointer user_data) { return modulemd_fnmatch (user_data, key); } guint64 modulemd_iso8601date_to_guint64 (const gchar *iso8601) { struct tm tm = { 0 }; char *s = strptime (iso8601, "%FT%H:%MZ", &tm); if (s == NULL || *s != '\0') { return 0; } char buf[32]; strftime (buf, sizeof (buf), "%Y%m%d%H%M", &tm); return g_ascii_strtoull (buf, NULL, 0); } gchar * modulemd_guint64_to_iso8601date (guint64 date) { char date_str[32]; sprintf (date_str, "%" PRIu64, date); struct tm tm = { 0 }; char *s = strptime (date_str, "%Y%m%d%H%M", &tm); if (s == NULL || *s != '\0') { return NULL; } gchar *buf = g_malloc0_n (32, sizeof (gchar)); strftime (buf, 32, "%FT%H:%MZ", &tm); return buf; } #ifndef HAVE_EXTEND_AND_STEAL #ifndef MIN_ARRAY_SIZE #define MIN_ARRAY_SIZE 16 #endif typedef volatile gint gatomicrefcount; /* * GPtrArray: * @pdata: points to the array of pointers, which may be moved when the * array grows * @len: number of pointers in the array * * Contains the public fields of a pointer array. */ struct _GRealPtrArray { gpointer *pdata; guint len; guint alloc; gatomicrefcount ref_count; GDestroyNotify element_free_func; }; typedef struct _GRealPtrArray GRealPtrArray; /* Returns the smallest power of 2 greater than n, or n if * such power does not fit in a guint */ static guint g_nearest_pow (guint num) { guint n = num - 1; g_assert (num > 0); n |= n >> 1; n |= n >> 2; n |= n >> 4; n |= n >> 8; n |= n >> 16; #if SIZEOF_INT == 8 n |= n >> 32; #endif return n + 1; } static void g_ptr_array_maybe_expand (GRealPtrArray *array, guint len) { /* Detect potential overflow */ if (G_UNLIKELY ((G_MAXUINT - array->len) < len)) g_error ("adding %u to array would overflow", len); if ((array->len + len) > array->alloc) { guint old_alloc = array->alloc; array->alloc = g_nearest_pow (array->len + len); array->alloc = MAX (array->alloc, MIN_ARRAY_SIZE); array->pdata = g_realloc (array->pdata, sizeof (gpointer) * array->alloc); if (G_UNLIKELY (g_mem_gc_friendly)) for (; old_alloc < array->alloc; old_alloc++) array->pdata[old_alloc] = NULL; } } void g_ptr_array_extend (GPtrArray *array_to_extend, GPtrArray *array, GCopyFunc func, gpointer user_data) { GRealPtrArray *rarray_to_extend = (GRealPtrArray *)array_to_extend; gsize i; g_return_if_fail (array_to_extend != NULL); g_return_if_fail (array != NULL); g_ptr_array_maybe_expand (rarray_to_extend, array->len); if (func != NULL) { for (i = 0; i < array->len; i++) rarray_to_extend->pdata[i + rarray_to_extend->len] = func (array->pdata[i], user_data); } else if (array->len > 0) { memcpy (rarray_to_extend->pdata + rarray_to_extend->len, array->pdata, array->len * sizeof (*array->pdata)); } rarray_to_extend->len += array->len; } void g_ptr_array_extend_and_steal (GPtrArray *array_to_extend, GPtrArray *array) { gpointer *pdata; g_ptr_array_extend (array_to_extend, array, NULL, NULL); /* Get rid of @array without triggering the GDestroyNotify attached * to the elements moved from @array to @array_to_extend. */ pdata = g_steal_pointer (&array->pdata); array->len = 0; g_ptr_array_unref (array); g_free (pdata); } #endif fedora-modularity-libmodulemd-357799c/modulemd/modulemd-validator.1000066400000000000000000000054231502446517500254260ustar00rootroot00000000000000.TH MODULEMD-VALIDATOR "1" "" "libmodulemd" "User Commands" .SH NAME modulemd-validator \- validate modulemd documents .SH SYNOPSIS .SY modulemd\-validator [\fB\-\-quiet\fP|\fB\-\-verbose\fP|\fB\-\-debug\fP] \fIFILE\fP\&.\|.\|.\& .SY modulemd\-validator [\fB\-\-quiet\fP|\fB\-\-verbose\fP|\fB\-\-debug\fP] \fB\-\-type\fP=\fITYPE\fP .I FILE .SY modulemd\-validator {\fB\-\-version\fP|\fB\-\-help\fP} .YS .SH DESCRIPTION This tool validates modulemd documents specified with the positional arguments using a libmodulemd parser. .P Without a \fB--type\fP option, all document types which can be found in a\~YUM repository will be recognized. In this case each \fIFILE\fP can contain multiple modulemd documents. .P Otherwise, exactly one \fIFILE\fP containing exactly one modulemd document must be provided and the document will be validated against the given \fITYPE\fP. .SH OPTIONS .TP \fB\-\-type\fP=\fI\,TYPE\/\fP Constrain a document type. The recognized types are: .RS .TP .B modulemd\-v1 An obsolete format used for building and installing modules. .TP .B modulemd\-v2 A deprecated format for building modules and a contemporary format for built modules which can be placed into a\~YUM repository and installed by a package manager. .TP .B modulemd\-defaults\-v1 A format for defining default streams and default profiles of a module. Found in YUM repositories. .TP .B modulemd\-obsoletes\-v1 A format for defining streams which reach or will reach its end of life. It can also recommend a new stream which obsoleted the old one. Found in YUM repositories. .TP .B modulemd\-packager\-v2 An obsolete format for building modules. .TP .B modulemd\-packager\-v3 A contemporary format for building modules. .TP .B modulemd\-translations\-v1 A contemporary format for delivering localized human-oriented texts (e.\|g.\& a description or a summary) associated with a module. Found in YUM repositories. .RE .IP Only single\-document files are supported. For compatibility, if this options is not provided, any document type loadable into a modulemd index (i.\|e.\& those intended for YUM repositories) is acceptable. .TP \fB\-\-debug\fP Output debugging messages. .TP \fB\-q\fP, \fB\-\-quiet\fP Print no output. .TP \fB\-v\fP, \fB\-\-verbose\fP Be verbose. .TP \fB\-h\fP, \fB\-\-help\fP Print a usage text and then exit. .TP \fB\-V\fP, \fB\-\-version\fP Print a version number and then exit. .SH EXIT CODE If the supplied documents are valid (and satisfy the \fB--type\fP constrain), zero exit code will be returned. Otherwise a non-zero code will be emitted. .SH REPORTING BUGS Bugs and feature requests can be reported at the .UR https\://github.com/fedora-modularity/libmodulemd libmodulemd home page .UE . .SH SEE ALSO Specification of the modulemd documents is available in a \fByaml_spec\fP directory at the libmodulemd home page. fedora-modularity-libmodulemd-357799c/modulemd/modulemd-validator.c000066400000000000000000000415611502446517500255130ustar00rootroot00000000000000/* * This file is part of libmodulemd * Copyright 2018 Stephen Gallagher * * Fedora-License-Identifier: MIT * SPDX-2.0-License-Identifier: MIT * SPDX-3.0-License-Identifier: MIT * * This program is free software. * For more information on the license, see COPYING. * For more information on free software, see . */ #include "modulemd.h" #include "modulemd-errors.h" #include "private/modulemd-defaults-v1-private.h" #include "private/modulemd-module-index-private.h" #include "private/modulemd-module-stream-v1-private.h" #include "private/modulemd-module-stream-v2-private.h" #include "private/modulemd-obsoletes-private.h" #include "private/modulemd-subdocument-info-private.h" #include "private/modulemd-translation-private.h" #include "private/modulemd-yaml.h" #include "private/modulemd-util.h" #include #include #include #include #include #include enum mmd_verbosity { MMD_QUIET = -1, MMD_DEFAULT, MMD_VERBOSE, MMD_DEBUG }; /* Identifiers for modulemd type-version documents. * We cannot use GTypes, e.g. MODULEMD_TYPE_PACKAGER_V3, because * modulemd-packager-v2 GType does not exist (the format is parsed into * a modulemd-v2 data structure). Also GTypes are not constants. They are * a run-time computed value and hence cannot be used in switch-cases. */ enum mmd_type { MMD_TYPE_INDEX, /* Untyped validation by loading into an index */ MMD_TYPE_MODULEMD_V1, MMD_TYPE_MODULEMD_V2, MMD_TYPE_MODULEMD_DEFAULTS_V1, MMD_TYPE_MODULEMD_OBSOLETES_V1, MMD_TYPE_MODULEMD_PACKAGER_V2, MMD_TYPE_MODULEMD_PACKAGER_V3, MMD_TYPE_MODULEMD_TRANSLATIONS_V1 }; struct validator_options { enum mmd_verbosity verbosity; GType type; gchar **filenames; gboolean report_version; }; struct validator_options options = { 0 }; static gboolean set_report_version (const gchar *UNUSED (option_name), const gchar *UNUSED (value), gpointer UNUSED (data), GError **UNUSED (error)) { options.report_version = TRUE; return TRUE; } static gboolean set_verbosity (const gchar *option_name, const gchar *UNUSED (value), gpointer UNUSED (data), GError **error) { g_autofree gchar *debugging_env = NULL; if (g_strcmp0 ("-v", option_name) == 0 || g_strcmp0 ("--verbose", option_name) == 0) { if (options.verbosity < MMD_VERBOSE) { options.verbosity = MMD_VERBOSE; } } else if (g_strcmp0 ("--debug", option_name) == 0) { if (options.verbosity < MMD_DEBUG) { options.verbosity = MMD_DEBUG; const gchar *old_debug = g_getenv ("G_MESSAGES_DEBUG"); if (old_debug != NULL) { debugging_env = g_strdup_printf ("%s,%s", old_debug, G_LOG_DOMAIN); } else { debugging_env = g_strdup (G_LOG_DOMAIN); } if (!g_setenv ("G_MESSAGES_DEBUG", debugging_env, TRUE)) { g_set_error ( error, G_OPTION_ERROR, G_OPTION_ERROR_FAILED, "Could not set G_MESSAGES_DEBUG environment variable"); return FALSE; } } } else if (g_strcmp0 ("-q", option_name) == 0 || g_strcmp0 ("--quiet", option_name) == 0) { options.verbosity = MMD_QUIET; } else { /* We shouldn't be called under any other circumstance */ g_set_error (error, G_OPTION_ERROR, G_OPTION_ERROR_FAILED, "Called for unknown option \"%s\"", option_name); return FALSE; } return TRUE; } static gboolean set_type (const gchar *UNUSED (option_name), const gchar *value, gpointer UNUSED (data), GError **error) { if (!g_strcmp0 (value, "modulemd-v1")) options.type = MMD_TYPE_MODULEMD_V1; else if (!g_strcmp0 (value, "modulemd-v2")) options.type = MMD_TYPE_MODULEMD_V2; else if (!g_strcmp0 (value, "modulemd-defaults-v1")) options.type = MMD_TYPE_MODULEMD_DEFAULTS_V1; else if (!g_strcmp0 (value, "modulemd-obsoletes-v1")) options.type = MMD_TYPE_MODULEMD_OBSOLETES_V1; else if (!g_strcmp0 (value, "modulemd-packager-v2")) options.type = MMD_TYPE_MODULEMD_PACKAGER_V2; else if (!g_strcmp0 (value, "modulemd-packager-v3")) options.type = MMD_TYPE_MODULEMD_PACKAGER_V3; else if (!g_strcmp0 (value, "modulemd-translations-v1")) options.type = MMD_TYPE_MODULEMD_TRANSLATIONS_V1; else { g_set_error (error, G_OPTION_ERROR, G_OPTION_ERROR_FAILED, "Unknown document type: %s", value); return FALSE; } return TRUE; } static const gchar * mmd_type2astring (enum mmd_type type) { switch (type) { case MMD_TYPE_INDEX: return "an index"; case MMD_TYPE_MODULEMD_V1: return "a modulemd-v1"; case MMD_TYPE_MODULEMD_V2: return "a modulemd-v2"; case MMD_TYPE_MODULEMD_DEFAULTS_V1: return "a modulemd-defaults-v1"; case MMD_TYPE_MODULEMD_OBSOLETES_V1: return "a modulemd-obsoletes-v1"; case MMD_TYPE_MODULEMD_PACKAGER_V2: return "a modulemd-packager-v2"; case MMD_TYPE_MODULEMD_PACKAGER_V3: return "a modulemd-packager-v3"; case MMD_TYPE_MODULEMD_TRANSLATIONS_V1: return "a modulemd-translations-v1"; } return "an unknown document type"; } // clang-format off static GOptionEntry entries[] = { { "debug", 0, G_OPTION_FLAG_NO_ARG, G_OPTION_ARG_CALLBACK, set_verbosity, "Output debugging messages", NULL }, { "type", 0, G_OPTION_FLAG_NONE, G_OPTION_ARG_CALLBACK, set_type, "Constrain a document type (modulemd-v1, modulemd-v2, modulemd-defaults-v1, modulemd-obsoletes-v1, modulemd-packager-v2, modulemd-packager-v3, modulemd-translations-v1); by default any document type loadable into a modulemd index is acceptable; this option only supports single-document files", "TYPE" }, { "quiet", 'q', G_OPTION_FLAG_NO_ARG, G_OPTION_ARG_CALLBACK, set_verbosity, "Print no output", NULL }, { "verbose", 'v', G_OPTION_FLAG_NO_ARG, G_OPTION_ARG_CALLBACK, set_verbosity, "Be verbose", NULL }, { "version", 'V', G_OPTION_FLAG_NO_ARG, G_OPTION_ARG_CALLBACK, set_report_version, "Print version number, then exit", NULL }, { G_OPTION_REMAINING, 0, 0, G_OPTION_ARG_FILENAME_ARRAY, &options.filenames, "Files to be validated", NULL }, { 0 } }; // clang-format on static const gchar * ModulemdYamlDocumentTypeEnum2string (ModulemdYamlDocumentTypeEnum type) { switch (type) { case MODULEMD_YAML_DOC_MODULESTREAM: return "modulemd"; case MODULEMD_YAML_DOC_DEFAULTS: return "modulemd-defaults"; case MODULEMD_YAML_DOC_TRANSLATIONS: return "modulemd-translations"; case MODULEMD_YAML_DOC_PACKAGER: return "modulemd-packager"; case MODULEMD_YAML_DOC_OBSOLETES: return "modulemd-obsoletes"; case MODULEMD_YAML_DOC_UNKNOWN: /* fall through */ default: return "unknown type"; } } /* We cannot load by index as it converts from old versions before * a return and as it does not provide enumeration functions for * subdocuments. We will use private modulemd_defaults_v1_parse_yaml() etc. * parsers. */ static gboolean parse_file_as_subdoc_and_validate (const gchar *filename, enum mmd_type validation_type, ModulemdYamlDocumentTypeEnum expected_type, guint64 expected_version, GError **error) { g_autoptr (FILE) file = NULL; MMD_INIT_YAML_PARSER (parser); MMD_INIT_YAML_EVENT (event); g_autoptr (ModulemdSubdocumentInfo) subdoc = NULL; const GError *subdoc_error; ModulemdYamlDocumentTypeEnum type; guint64 version; g_autoptr (GObject) object = NULL; /* Open the file and determine a document type */ file = fopen (filename, "r"); if (!file) { g_set_error (error, MODULEMD_YAML_ERROR, MMD_YAML_ERROR_OPEN, "Could not open %s file: %s", filename, strerror (errno)); return FALSE; } yaml_parser_set_input_file (&parser, file); if (!yaml_parser_parse (&parser, &event)) { MMD_YAML_ERROR_EVENT_EXIT_BOOL (error, event, "Invalid YAML"); } if (event.type != YAML_STREAM_START_EVENT) { { MMD_YAML_ERROR_EVENT_EXIT_BOOL ( error, event, "YAML parser could not find a start of a YAML stream"); } } yaml_event_delete (&event); if (!yaml_parser_parse (&parser, &event)) { MMD_YAML_ERROR_EVENT_EXIT_BOOL (error, event, "Invalid YAML"); } if (event.type != YAML_DOCUMENT_START_EVENT) { { MMD_YAML_ERROR_EVENT_EXIT_BOOL ( error, event, "YAML parser could not find a start of a YAML document"); } } yaml_event_delete (&event); subdoc = modulemd_yaml_parse_document_type (&parser); subdoc_error = modulemd_subdocument_info_get_gerror (subdoc); if (subdoc_error) { *error = g_error_copy (subdoc_error); return FALSE; } type = modulemd_subdocument_info_get_doctype (subdoc); if (type != expected_type) { g_set_error (error, MODULEMD_ERROR, 0, "Not %s document; it is %s", mmd_type2astring (validation_type), ModulemdYamlDocumentTypeEnum2string (type)); return FALSE; } version = modulemd_subdocument_info_get_mdversion (subdoc); if (version != expected_version) { g_set_error (error, MODULEMD_ERROR, 0, "Not %s document; it is %" G_GUINT64_FORMAT " version", mmd_type2astring (validation_type), version); return FALSE; } /* Parse and validate the document body */ switch (validation_type) { case MMD_TYPE_MODULEMD_V1: object = G_OBJECT (modulemd_module_stream_v1_parse_yaml (subdoc, TRUE, error)); if (object && !modulemd_module_stream_validate ( MODULEMD_MODULE_STREAM (object), error)) g_clear_object (&object); break; case MMD_TYPE_MODULEMD_DEFAULTS_V1: object = G_OBJECT (modulemd_defaults_v1_parse_yaml (subdoc, TRUE, error)); /* validated implicitly */ break; case MMD_TYPE_MODULEMD_OBSOLETES_V1: object = G_OBJECT (modulemd_obsoletes_parse_yaml (subdoc, TRUE, error)); /* validated implicitly */ break; case MMD_TYPE_MODULEMD_PACKAGER_V2: object = G_OBJECT ( modulemd_module_stream_v2_parse_yaml (subdoc, TRUE, TRUE, error)); if (object && !modulemd_module_stream_validate ( MODULEMD_MODULE_STREAM (object), error)) g_clear_object (&object); break; case MMD_TYPE_MODULEMD_TRANSLATIONS_V1: object = G_OBJECT (modulemd_translation_parse_yaml (subdoc, TRUE, error)); /* validated implicitly */ break; default: g_set_error (error, MODULEMD_ERROR, 0, "Internal error: %s type is not supported", mmd_type2astring (validation_type)); return FALSE; } if (!object) return FALSE; /* Check for a garbage past the first document */ if (!yaml_parser_parse (&parser, &event)) { MMD_YAML_ERROR_EVENT_EXIT_BOOL ( error, event, "Invalid YAML after first document"); } if (event.type != YAML_STREAM_END_EVENT) { { MMD_YAML_ERROR_EVENT_EXIT_BOOL ( error, event, "Another YAML document after the first one"); return FALSE; } } yaml_event_delete (&event); return TRUE; } static gboolean parse_file (const gchar *filename, GPtrArray **failures, GError **error) { if (options.verbosity >= MMD_VERBOSE) { g_fprintf (stdout, "Validating %s\n", filename); } switch (options.type) { case MMD_TYPE_INDEX: { g_autoptr (ModulemdModuleIndex) index = NULL; index = modulemd_module_index_new (); return modulemd_module_index_update_from_file_ext ( index, filename, TRUE, TRUE, failures, error); } case MMD_TYPE_MODULEMD_V1: return parse_file_as_subdoc_and_validate ( filename, options.type, MODULEMD_YAML_DOC_MODULESTREAM, 1u, error); case MMD_TYPE_MODULEMD_V2: { GType type; g_autoptr (GObject) object = NULL; type = modulemd_read_packager_file (filename, &object, error); if (type == G_TYPE_INVALID) return FALSE; if (type != MODULEMD_TYPE_MODULE_STREAM_V2) { g_set_error (error, MODULEMD_ERROR, 0, "Not a modulemd-v2 document; it is %s", g_type_name (type)); return FALSE; } return modulemd_module_stream_validate ( MODULEMD_MODULE_STREAM (object), error); } case MMD_TYPE_MODULEMD_DEFAULTS_V1: return parse_file_as_subdoc_and_validate ( filename, options.type, MODULEMD_YAML_DOC_DEFAULTS, 1u, error); case MMD_TYPE_MODULEMD_OBSOLETES_V1: return parse_file_as_subdoc_and_validate ( filename, options.type, MODULEMD_YAML_DOC_OBSOLETES, 1u, error); case MMD_TYPE_MODULEMD_PACKAGER_V2: return parse_file_as_subdoc_and_validate ( filename, options.type, MODULEMD_YAML_DOC_PACKAGER, 2u, error); case MMD_TYPE_MODULEMD_PACKAGER_V3: { GType type; g_autoptr (GObject) object = NULL; type = modulemd_read_packager_file (filename, &object, error); if (type == G_TYPE_INVALID) return FALSE; if (type != MODULEMD_TYPE_PACKAGER_V3) { g_set_error (error, MODULEMD_ERROR, 0, "Not a modulemd-packager-v3 document; it is %s", g_type_name (type)); return FALSE; } /* modulemd_packager_v3 is validated implicitly by * modulemd_read_packager_file (). */ return TRUE; } case MMD_TYPE_MODULEMD_TRANSLATIONS_V1: return parse_file_as_subdoc_and_validate ( filename, options.type, MODULEMD_YAML_DOC_TRANSLATIONS, 1u, error); } g_fprintf (stderr, "Internal error: unsupported document type: %s\n", mmd_type2astring (options.type)); exit (EXIT_FAILURE); } int main (int argc, char *argv[]) { const char *filename; g_autoptr (GOptionContext) context = NULL; g_autoptr (GError) error = NULL; gsize num_invalid = 0; gboolean ret; g_autoptr (GPtrArray) failures = NULL; ModulemdSubdocumentInfo *doc = NULL; setlocale (LC_ALL, ""); options.type = MMD_TYPE_INDEX; context = g_option_context_new ("FILES - Simple modulemd YAML validator"); g_option_context_add_main_entries (context, entries, "modulemd-validator"); if (!g_option_context_parse (context, &argc, &argv, &error)) { g_fprintf (stderr, "option parsing failed: %s\n", error->message); exit (EXIT_FAILURE); } if (options.report_version) { g_fprintf (stdout, "modulemd-validator %s\n", modulemd_get_version ()); exit (EXIT_SUCCESS); } if (!(options.filenames && options.filenames[0])) { g_fprintf (stderr, "At least one file must be specified on the command-line\n"); exit (EXIT_FAILURE); } for (gsize i = 0; options.filenames[i]; i++) { filename = options.filenames[i]; ret = parse_file (filename, &failures, &error); if (!ret) { num_invalid++; if (options.verbosity >= MMD_DEFAULT) { g_fprintf (stderr, "%s failed to validate\n", filename); if (error != NULL) { /* Unparseable content */ g_fprintf (stderr, "%s could not be read in its entirety: %s\n", filename, error->message); } if (failures) { for (gsize j = 0; j < failures->len; j++) { doc = MODULEMD_SUBDOCUMENT_INFO ( g_ptr_array_index (failures, j)); g_printf ( "\nFailed subdocument (%s): \n%s\n", modulemd_subdocument_info_get_gerror (doc)->message, modulemd_subdocument_info_get_yaml (doc)); } } } } else { if (options.verbosity >= MMD_DEFAULT) { g_printf ("%s validated successfully\n", filename); } } g_clear_error (&error); g_clear_pointer (&failures, g_ptr_array_unref); } return num_invalid; } fedora-modularity-libmodulemd-357799c/modulemd/modulemd-yaml-util.c000066400000000000000000001432001502446517500254340ustar00rootroot00000000000000/* * This file is part of libmodulemd * Copyright (C) 2017-2020 Stephen Gallagher * * Fedora-License-Identifier: MIT * SPDX-2.0-License-Identifier: MIT * SPDX-3.0-License-Identifier: MIT * * This program is free software. * For more information on the license, see COPYING. * For more information on free software, see . */ #include "config.h" #include "modulemd-errors.h" #include "private/modulemd-subdocument-info-private.h" #include "private/modulemd-util.h" #include "private/modulemd-yaml.h" #include #include #include #include GQuark modulemd_yaml_error_quark (void) { return g_quark_from_static_string ("modulemd-yaml-error-quark"); } void modulemd_yaml_string_free (modulemd_yaml_string *yaml_string) { g_clear_pointer (&yaml_string->str, g_free); g_clear_pointer (&yaml_string, g_free); } int write_yaml_string (void *data, unsigned char *buffer, size_t size) { modulemd_yaml_string *yaml_string = (modulemd_yaml_string *)data; gsize total; if (!g_size_checked_add (&total, yaml_string->len, size + 1)) { return 0; } yaml_string->str = g_realloc_n (yaml_string->str, total, sizeof (char)); memcpy (yaml_string->str + yaml_string->len, buffer, size); yaml_string->len += size; yaml_string->str[yaml_string->len] = '\0'; return 1; } const gchar * mmd_yaml_get_event_name (yaml_event_type_t type) { switch (type) { case YAML_NO_EVENT: return "YAML_NO_EVENT"; case YAML_STREAM_START_EVENT: return "YAML_STREAM_START_EVENT"; case YAML_STREAM_END_EVENT: return "YAML_STREAM_END_EVENT"; case YAML_DOCUMENT_START_EVENT: return "YAML_DOCUMENT_START_EVENT"; case YAML_DOCUMENT_END_EVENT: return "YAML_DOCUMENT_END_EVENT"; case YAML_ALIAS_EVENT: return "YAML_ALIAS_EVENT"; case YAML_SCALAR_EVENT: return "YAML_SCALAR_EVENT"; case YAML_SEQUENCE_START_EVENT: return "YAML_SEQUENCE_START_EVENT"; case YAML_SEQUENCE_END_EVENT: return "YAML_SEQUENCE_END_EVENT"; case YAML_MAPPING_START_EVENT: return "YAML_MAPPING_START_EVENT"; case YAML_MAPPING_END_EVENT: return "YAML_MAPPING_END_EVENT"; } /* Should be unreachable */ return "Unknown YAML Event"; } gboolean mmd_emitter_start_stream (yaml_emitter_t *emitter, GError **error) { int ret; MMD_INIT_YAML_EVENT (event); yaml_emitter_set_unicode (emitter, TRUE); ret = yaml_stream_start_event_initialize (&event, YAML_UTF8_ENCODING); if (!ret) { g_set_error (error, MODULEMD_YAML_ERROR, MMD_YAML_ERROR_EVENT_INIT, "Could not initialize the stream start event"); return FALSE; } MMD_EMIT_WITH_EXIT ( emitter, &event, error, "Could not start the YAML stream"); return TRUE; } gboolean mmd_emitter_end_stream (yaml_emitter_t *emitter, GError **error) { int ret; MMD_INIT_YAML_EVENT (event); ret = yaml_stream_end_event_initialize (&event); if (!ret) { g_set_error (error, MODULEMD_YAML_ERROR, MMD_YAML_ERROR_EVENT_INIT, "Could not initialize the stream end event"); return FALSE; } MMD_EMIT_WITH_EXIT (emitter, &event, error, "Could not end the YAML stream"); return TRUE; } gboolean mmd_emitter_start_document (yaml_emitter_t *emitter, GError **error) { int ret; MMD_INIT_YAML_EVENT (event); ret = yaml_document_start_event_initialize (&event, NULL, NULL, NULL, 0); if (!ret) { g_set_error (error, MODULEMD_YAML_ERROR, MMD_YAML_ERROR_EVENT_INIT, "Could not initialize the document start event"); return FALSE; } MMD_EMIT_WITH_EXIT ( emitter, &event, error, "Could not start the YAML document"); return TRUE; } gboolean mmd_emitter_end_document (yaml_emitter_t *emitter, GError **error) { int ret; MMD_INIT_YAML_EVENT (event); ret = yaml_document_end_event_initialize (&event, 0); if (!ret) { g_set_error (error, MODULEMD_YAML_ERROR, MMD_YAML_ERROR_EVENT_INIT, "Could not initialize the document end event"); return FALSE; } MMD_EMIT_WITH_EXIT ( emitter, &event, error, "Could not end the YAML document"); return TRUE; } gboolean mmd_emitter_start_mapping (yaml_emitter_t *emitter, yaml_mapping_style_t style, GError **error) { int ret; MMD_INIT_YAML_EVENT (event); ret = yaml_mapping_start_event_initialize (&event, NULL, NULL, 1, style); if (!ret) { g_set_error (error, MODULEMD_YAML_ERROR, MMD_YAML_ERROR_EVENT_INIT, "Could not initialize the mapping start event"); return FALSE; } MMD_EMIT_WITH_EXIT (emitter, &event, error, "Could not start the mapping"); return TRUE; } gboolean mmd_emitter_end_mapping (yaml_emitter_t *emitter, GError **error) { int ret; MMD_INIT_YAML_EVENT (event); ret = yaml_mapping_end_event_initialize (&event); if (!ret) { g_set_error (error, MODULEMD_YAML_ERROR, MMD_YAML_ERROR_EVENT_INIT, "Could not initialize the mapping end event"); return FALSE; } MMD_EMIT_WITH_EXIT (emitter, &event, error, "Could not end the mapping"); return TRUE; } gboolean mmd_emitter_start_sequence (yaml_emitter_t *emitter, yaml_sequence_style_t style, GError **error) { int ret; MMD_INIT_YAML_EVENT (event); ret = yaml_sequence_start_event_initialize (&event, NULL, NULL, 1, style); if (!ret) { g_set_error (error, MODULEMD_YAML_ERROR, MMD_YAML_ERROR_EVENT_INIT, "Could not initialize the sequence start event"); return FALSE; } MMD_EMIT_WITH_EXIT (emitter, &event, error, "Could not start the sequence"); return TRUE; } gboolean mmd_emitter_end_sequence (yaml_emitter_t *emitter, GError **error) { int ret; MMD_INIT_YAML_EVENT (event); ret = yaml_sequence_end_event_initialize (&event); if (!ret) { g_set_error (error, MODULEMD_YAML_ERROR, MMD_YAML_ERROR_EVENT_INIT, "Could not initialize the sequence end event"); return FALSE; } MMD_EMIT_WITH_EXIT (emitter, &event, error, "Could not end the sequence"); return TRUE; } gboolean mmd_emitter_scalar (yaml_emitter_t *emitter, const gchar *scalar, yaml_scalar_style_t style, GError **error) { int ret; MMD_INIT_YAML_EVENT (event); g_debug ("SCALAR: %s", scalar); ret = yaml_scalar_event_initialize (&event, NULL, NULL, (yaml_char_t *)scalar, (int)strlen (scalar), 1, 1, style); if (!ret) { g_set_error (error, MODULEMD_YAML_ERROR, MMD_YAML_ERROR_EVENT_INIT, "Could not initialize the scalar event"); return FALSE; } MMD_EMIT_WITH_EXIT (emitter, &event, error, "Could not emit scalar value"); return TRUE; } /** * mmd_string_is_empty_or_a_number * @string (in) (nullable) * * A purpose is to catch the strings which could be mistaken with a number. * * Returns: True if the @string is %NULL, empty, or looks like a number. * False otherwise (looks like a string). * * Since 2.15 */ static gboolean string_is_empty_or_a_number (const gchar *string) { int fractional = 0; int exponent = 0; int hexadecimal = 0; int octal = 0; if (string == NULL) return TRUE; if (string[0] == '\0') return TRUE; if (!g_strcmp0 (string, ".nan")) return TRUE; /* not a number symbol */ if (string[0] == '+' || string[0] == '-') string++; /* accept a leading sign */ if (!g_strcmp0 (string, ".inf")) return TRUE; /* infinity symbol */ if (string[0] == '.') { fractional = 1; /* accept a leading decimal point */ string++; } else if (string[0] == '0' && string[1] == 'x') { hexadecimal = 1; string += 2; } else if (string[0] == '0' && string[1] == 'o') { octal = 1; string += 2; } if (string[0] == '\0') return FALSE; /* incomplete notation */ for (const gchar *character = string; *character != '\0'; character++) { if (hexadecimal) { if (!((*character >= '0' && *character <= '9') || (*character >= 'a' && *character <= 'f') || (*character >= 'A' && *character <= 'F'))) return FALSE; continue; } else if (octal) { if (!(*character >= '0' && *character <= '7')) return FALSE; continue; } else /* decimal */ { if (*character == '.') { if (fractional) return FALSE; /* multiple decimal points */ else { fractional = 1; continue; } } if (fractional && (*character == 'e' || *character == 'E')) { if (exponent) return FALSE; /* multiple franctional exponents */ else { exponent = 1; continue; } } if (exponent == 1 && (*character == '+' || *character == '-')) { exponent = 2; /* a sign of the exponent */ continue; } if (*character < '0' || *character > '9') return FALSE; } } return TRUE; } gboolean mmd_emitter_scalar_string (yaml_emitter_t *emitter, const gchar *scalar, GError **error) { return mmd_emitter_scalar (emitter, scalar, string_is_empty_or_a_number (scalar) ? YAML_DOUBLE_QUOTED_SCALAR_STYLE : YAML_PLAIN_SCALAR_STYLE, error); } gboolean mmd_emitter_strv (yaml_emitter_t *emitter, yaml_sequence_style_t seq_style, const GStrv list, GError **error) { int ret; g_autoptr (GError) nested_error = NULL; MMD_INIT_YAML_EVENT (event); int numentries = g_strv_length (list); ret = mmd_emitter_start_sequence (emitter, seq_style, &nested_error); if (!ret) { g_propagate_prefixed_error ( error, nested_error, "Failed to emit list start: "); return FALSE; } for (int i = 0; i < numentries; i++) { ret = mmd_emitter_scalar (emitter, list[i], string_is_empty_or_a_number (list[i]) ? YAML_DOUBLE_QUOTED_SCALAR_STYLE : YAML_PLAIN_SCALAR_STYLE, &nested_error); if (!ret) { g_propagate_prefixed_error ( error, nested_error, "Failed to emit list entry: "); return FALSE; } } ret = mmd_emitter_end_sequence (emitter, &nested_error); if (!ret) { g_propagate_prefixed_error ( error, nested_error, "Failed to emit list end: "); return FALSE; } return TRUE; } GDate * modulemd_yaml_parse_date (yaml_parser_t *parser, GError **error) { MMD_INIT_YAML_EVENT (event); g_auto (GStrv) strv = NULL; YAML_PARSER_PARSE_WITH_EXIT (parser, &event, error); if (event.type != YAML_SCALAR_EVENT) { MMD_YAML_ERROR_EVENT_EXIT (error, event, "Date was not a scalar"); } g_debug ("Parsing scalar: %s", (const gchar *)event.data.scalar.value); strv = g_strsplit ((const gchar *)event.data.scalar.value, "-", 4); if (!strv[0] || !strv[1] || !strv[2]) { MMD_YAML_ERROR_EVENT_EXIT ( error, event, "Date not in the form YYYY-MM-DD"); } return g_date_new_dmy (g_ascii_strtoull (strv[2], NULL, 10), /* Day */ g_ascii_strtoull (strv[1], NULL, 10), /* Month */ g_ascii_strtoull (strv[0], NULL, 10)); /* Year */ } gchar * modulemd_yaml_parse_string (yaml_parser_t *parser, GError **error) { MMD_INIT_YAML_EVENT (event); YAML_PARSER_PARSE_WITH_EXIT (parser, &event, error); if (event.type != YAML_SCALAR_EVENT) { MMD_YAML_ERROR_EVENT_EXIT (error, event, "String was not a scalar"); } g_debug ("Parsing scalar: %s", (const gchar *)event.data.scalar.value); return g_strdup ((const gchar *)event.data.scalar.value); } gboolean modulemd_yaml_parse_bool (yaml_parser_t *parser, GError **error) { MMD_INIT_YAML_EVENT (event); YAML_PARSER_PARSE_WITH_EXIT_BOOL (parser, &event, error); if (event.type != YAML_SCALAR_EVENT) { MMD_YAML_ERROR_EVENT_EXIT_INT ( error, event, "Expected a scalar boolean"); } if (g_str_equal ((const gchar *)event.data.scalar.value, "false")) { return FALSE; } if (g_str_equal ((const gchar *)event.data.scalar.value, "true")) { return TRUE; } MMD_YAML_ERROR_EVENT_EXIT_INT ( error, event, "Boolean value was neither \"true\" nor \"false\": %s", (const gchar *)event.data.scalar.value); } gint64 modulemd_yaml_parse_int64 (yaml_parser_t *parser, GError **error) { gint64 value; gchar *endptr; MMD_INIT_YAML_EVENT (event); YAML_PARSER_PARSE_WITH_EXIT_INT (parser, &event, error); if (event.type != YAML_SCALAR_EVENT) { MMD_YAML_ERROR_EVENT_EXIT_INT (error, event, "String was not a scalar"); } value = g_ascii_strtoll ((const gchar *)event.data.scalar.value, &endptr, 10); if ((value == G_MAXINT64 && errno == ERANGE)) { #ifdef HAVE_OVERFLOWED_BUILDORDER /* A temporary hack. Remove when RHEL 8 goes end of life. */ if (g_str_equal ((const gchar *)event.data.scalar.value, "18446744073709551615")) { g_debug ("Coercing an invalid signed 64-bit integer to -1: %s", (const gchar *)event.data.scalar.value); return -1; } #endif g_set_error (error, MODULEMD_YAML_ERROR, MODULEMD_ERROR_VALIDATE, "%s: The integer value is larger than %" G_GINT64_FORMAT, (const gchar *)event.data.scalar.value, G_MAXINT64); return 0; } if ((value == G_MININT64 && errno == ERANGE)) { g_set_error (error, MODULEMD_YAML_ERROR, MODULEMD_ERROR_VALIDATE, "%s: The integer value is samller than %" G_GINT64_FORMAT, (const gchar *)event.data.scalar.value, G_MININT64); return 0; } if (value == 0 && errno == EINVAL) { g_set_error_literal ( error, MODULEMD_YAML_ERROR, MODULEMD_ERROR_NOT_IMPLEMENTED, "Your GLib library does not support parsing integers in 10 base"); return 0; } if ((value == 0 && endptr == (gchar *)event.data.scalar.value) || *endptr != '\0') { g_set_error (error, MODULEMD_YAML_ERROR, MMD_ERROR_VALIDATE, "%s: The string is not a valid integer", (const gchar *)event.data.scalar.value); return 0; } return value; } guint64 modulemd_yaml_parse_uint64 (yaml_parser_t *parser, GError **error) { guint64 value; gchar *endptr; MMD_INIT_YAML_EVENT (event); YAML_PARSER_PARSE_WITH_EXIT_INT (parser, &event, error); if (event.type != YAML_SCALAR_EVENT) { MMD_YAML_ERROR_EVENT_EXIT_INT (error, event, "String was not a scalar"); } g_debug ("Parsing scalar: %s", (const gchar *)event.data.scalar.value); /* g_ascii_strtoull() accepts negative values by definition. */ if (event.data.scalar.value[0] == '-') { g_set_error (error, MODULEMD_YAML_ERROR, MODULEMD_ERROR_VALIDATE, "%s: The integer value is negative", (const gchar *)event.data.scalar.value); return 0u; } value = g_ascii_strtoull ((const gchar *)event.data.scalar.value, &endptr, 10); if (value == G_MAXUINT64 && errno == ERANGE) { g_set_error (error, MODULEMD_YAML_ERROR, MODULEMD_ERROR_VALIDATE, "%s: The integer value is larger than %" G_GUINT64_FORMAT, (const gchar *)event.data.scalar.value, G_MAXUINT64); return 0u; } if (value == 0u && errno == EINVAL) { g_set_error_literal ( error, MODULEMD_YAML_ERROR, MODULEMD_ERROR_NOT_IMPLEMENTED, "Your GLib library does not support parsing integers in 10 base"); return 0u; } if ((value == 0u && endptr == (gchar *)event.data.scalar.value) || *endptr != '\0') { g_set_error (error, MODULEMD_YAML_ERROR, MMD_ERROR_VALIDATE, "%s: The string is not a valid integer", (const gchar *)event.data.scalar.value); return 0u; } return value; } GHashTable * modulemd_yaml_parse_string_set (yaml_parser_t *parser, GError **error) { MMD_INIT_YAML_EVENT (event); gboolean done = FALSE; gboolean in_list = FALSE; g_autoptr (GHashTable) result = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, NULL); while (!done) { YAML_PARSER_PARSE_WITH_EXIT (parser, &event, error); switch (event.type) { case YAML_SEQUENCE_START_EVENT: in_list = TRUE; break; case YAML_SEQUENCE_END_EVENT: if (!in_list) { MMD_YAML_ERROR_EVENT_EXIT ( error, event, "Unexpected end of list"); } in_list = FALSE; done = TRUE; break; case YAML_SCALAR_EVENT: g_debug ("Parsing scalar: %s", (const gchar *)event.data.scalar.value); if (in_list) { g_hash_table_add ( result, g_strdup ((const gchar *)event.data.scalar.value)); } else { /* We got a scalar instead of a sequence. */ if (event.data.scalar.value && event.data.scalar.value[0]) { /* Treat it as a list with a single entry * if it's nonempty. */ g_hash_table_add ( result, g_strdup ((const gchar *)event.data.scalar.value)); done = TRUE; } else { /* Otherwise, it's an empty value node ("foo:") or an empty * string value node ("foo:''"), both which libyaml reports * as an empty string. Then keep the result hash table empty * as it's more helpful than a list with an empty string * which would be nevertheless invalid. */ done = TRUE; } } break; default: MMD_YAML_ERROR_EVENT_EXIT ( error, event, "Unexpected YAML event in list"); break; } yaml_event_delete (&event); } /* Work around false-positive in clang static analysis which thinks it's * possible for this function to return NULL and not set error. */ if (G_UNLIKELY (result == NULL)) { g_set_error (error, MODULEMD_YAML_ERROR, MMD_YAML_ERROR_EMIT, "Somehow got a NULL hash table here."); } return g_steal_pointer (&result); } GHashTable * modulemd_yaml_parse_string_set_from_map (yaml_parser_t *parser, const gchar *key, gboolean strict, GError **error) { MMD_INIT_YAML_EVENT (event); gboolean done = FALSE; gboolean in_map = FALSE; g_autoptr (GHashTable) set = NULL; g_autoptr (GError) nested_error = NULL; while (!done) { YAML_PARSER_PARSE_WITH_EXIT (parser, &event, error); switch (event.type) { case YAML_MAPPING_START_EVENT: in_map = TRUE; break; case YAML_MAPPING_END_EVENT: if (!in_map) { MMD_YAML_ERROR_EVENT_EXIT ( error, event, "Unexpected end of map"); } in_map = FALSE; done = TRUE; break; case YAML_SCALAR_EVENT: if (!in_map) { MMD_YAML_ERROR_EVENT_EXIT ( error, event, "Unexpected scalar outside of map."); } if (g_str_equal ((const gchar *)event.data.scalar.value, key)) { set = modulemd_yaml_parse_string_set (parser, &nested_error); if (!set) { g_propagate_error (error, g_steal_pointer (&nested_error)); return NULL; } } else { /* Encountered a key other than the expected one. */ SKIP_UNKNOWN (parser, NULL, "Unexpected key in map: %s", (const gchar *)event.data.scalar.value); } break; default: MMD_YAML_ERROR_EVENT_EXIT ( error, event, "Unexpected YAML event in map"); break; } yaml_event_delete (&event); } return g_steal_pointer (&set); } GHashTable * modulemd_yaml_parse_string_string_map (yaml_parser_t *parser, GError **error) { MMD_INIT_YAML_EVENT (event); gboolean done = FALSE; g_autoptr (GHashTable) table = NULL; g_autoptr (GError) nested_error = NULL; const gchar *key = NULL; g_autofree gchar *value = NULL; table = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, g_free); YAML_PARSER_PARSE_WITH_EXIT (parser, &event, error); if (event.type != YAML_MAPPING_START_EVENT) { MMD_YAML_ERROR_EVENT_EXIT (error, event, "Got %s instead of MAPPING_START.", mmd_yaml_get_event_name (event.type)); } while (!done) { YAML_PARSER_PARSE_WITH_EXIT (parser, &event, error); switch (event.type) { case YAML_MAPPING_END_EVENT: done = TRUE; break; case YAML_SCALAR_EVENT: /* Parse the value */ key = (const gchar *)event.data.scalar.value; value = modulemd_yaml_parse_string (parser, &nested_error); if (!value) { g_propagate_error (error, g_steal_pointer (&nested_error)); return NULL; } g_hash_table_replace ( table, g_strdup (key), g_steal_pointer (&value)); break; default: MMD_YAML_ERROR_EVENT_EXIT ( error, event, "Unexpected YAML event in map"); break; } yaml_event_delete (&event); } return g_steal_pointer (&table); } GHashTable * modulemd_yaml_parse_nested_set (yaml_parser_t *parser, GError **error) { MODULEMD_INIT_TRACE (); MMD_INIT_YAML_EVENT (event); gboolean done = FALSE; g_autofree gchar *key = NULL; g_autoptr (GHashTable) value = NULL; g_autoptr (GHashTable) t = NULL; g_autoptr (GError) nested_error = NULL; g_return_val_if_fail (error == NULL || *error == NULL, NULL); t = g_hash_table_new_full ( g_str_hash, g_str_equal, g_free, (GDestroyNotify)g_hash_table_unref); /* The first event must be a MAPPING_START */ YAML_PARSER_PARSE_WITH_EXIT (parser, &event, error); if (event.type != YAML_MAPPING_START_EVENT) { MMD_YAML_ERROR_EVENT_EXIT ( error, event, "Missing mapping in nested set"); } while (!done) { YAML_PARSER_PARSE_WITH_EXIT (parser, &event, error); switch (event.type) { case YAML_MAPPING_END_EVENT: done = TRUE; break; case YAML_SCALAR_EVENT: key = g_strdup ((const gchar *)event.data.scalar.value); if (g_hash_table_contains (t, (const gchar *)event.data.scalar.value)) { MMD_YAML_ERROR_EVENT_EXIT ( error, event, "Key %s encountered twice in nested set", (const gchar *)event.data.scalar.value); } value = modulemd_yaml_parse_string_set (parser, &nested_error); if (value == NULL) { MMD_YAML_ERROR_EVENT_EXIT (error, event, "Failed to parse nested set: %s", nested_error->message); } g_hash_table_insert ( t, g_steal_pointer (&key), g_steal_pointer (&value)); break; default: MMD_YAML_ERROR_EVENT_EXIT (error, event, "Unexpected YAML event in nested set: %d", event.type); break; } yaml_event_delete (&event); } /* Work around false-positive in clang static analysis which thinks it's * possible for this function to return NULL and not set error. */ if (G_UNLIKELY (t == NULL)) { g_set_error (error, MODULEMD_YAML_ERROR, MMD_YAML_ERROR_EMIT, "Somehow got a NULL hash table here."); } return g_steal_pointer (&t); } gboolean modulemd_yaml_emit_nested_set (yaml_emitter_t *emitter, GHashTable *table, GError **error) { MODULEMD_INIT_TRACE (); int ret; g_autoptr (GError) nested_error = NULL; MMD_INIT_YAML_EVENT (event); g_autoptr (GPtrArray) keys = NULL; GHashTable *dep = NULL; gchar *key = NULL; ret = mmd_emitter_start_mapping ( emitter, YAML_BLOCK_MAPPING_STYLE, &nested_error); if (!ret) { g_propagate_prefixed_error ( error, g_steal_pointer (&nested_error), "Failed to start dependencies nested mapping: "); return FALSE; } keys = modulemd_ordered_str_keys (table, modulemd_strcmp_sort); for (guint i = 0; i < keys->len; i++) { key = g_ptr_array_index (keys, i); dep = g_hash_table_lookup (table, key); EMIT_STRING_SET_FULL ( emitter, error, key, dep, YAML_FLOW_SEQUENCE_STYLE); } ret = mmd_emitter_end_mapping (emitter, &nested_error); if (!ret) { g_propagate_prefixed_error (error, g_steal_pointer (&nested_error), "Failed to end nested mapping"); return FALSE; } return TRUE; } static gboolean modulemd_yaml_parse_document_type_internal ( yaml_parser_t *parser, ModulemdYamlDocumentTypeEnum *_doctype, guint64 *_mdversion, yaml_emitter_t *emitter, GError **error) { MODULEMD_INIT_TRACE (); MMD_INIT_YAML_EVENT (event); gboolean done = FALSE; gboolean had_data = FALSE; ModulemdYamlDocumentTypeEnum doctype = MODULEMD_YAML_DOC_UNKNOWN; guint64 mdversion = 0; g_autofree gchar *doctype_scalar = NULL; g_autofree gchar *mdversion_string = NULL; g_autoptr (GError) nested_error = NULL; int depth = 0; if (!mmd_emitter_start_stream (emitter, &nested_error)) { g_propagate_prefixed_error ( error, nested_error, "Error emitting stream: "); return FALSE; } /* * We should assume the initial document start is consumed by the Index. * But we still emit it. */ if (!mmd_emitter_start_document (emitter, error)) { return FALSE; } /* The second event must be the mapping start */ YAML_PARSER_PARSE_WITH_EXIT_BOOL (parser, &event, error); if (event.type != YAML_MAPPING_START_EVENT) { MMD_YAML_ERROR_EVENT_EXIT_BOOL ( error, event, "Document did not start with a mapping"); } MMD_EMIT_WITH_EXIT_FULL ( emitter, FALSE, &event, error, "Error starting mapping"); yaml_event_delete (&event); depth++; /* Now process through the document top-level */ while (!done) { YAML_PARSER_PARSE_WITH_EXIT_BOOL (parser, &event, error); switch (event.type) { case YAML_MAPPING_END_EVENT: if (!mmd_emitter_end_mapping (emitter, error)) { return FALSE; } depth--; if (depth == 0) { done = TRUE; } break; case YAML_MAPPING_START_EVENT: if (!mmd_emitter_start_mapping ( emitter, event.data.mapping_start.style, error)) { return FALSE; } depth++; break; case YAML_SCALAR_EVENT: if (!mmd_emitter_scalar (emitter, (const gchar *)event.data.scalar.value, event.data.scalar.style, error)) { return FALSE; } if (depth == 1 && g_str_equal ((const gchar *)event.data.scalar.value, "document")) { if (doctype != MODULEMD_YAML_DOC_UNKNOWN) { MMD_YAML_ERROR_EVENT_EXIT_BOOL ( error, event, "Document type encountered twice."); } doctype_scalar = modulemd_yaml_parse_string (parser, &nested_error); if (!doctype_scalar) { g_propagate_error (error, g_steal_pointer (&nested_error)); return FALSE; } if (!mmd_emitter_scalar (emitter, (const gchar *)doctype_scalar, YAML_PLAIN_SCALAR_STYLE, error)) { return FALSE; } if (g_str_equal (doctype_scalar, "modulemd") || g_str_equal (doctype_scalar, "modulemd-stream")) { doctype = MODULEMD_YAML_DOC_MODULESTREAM; } else if (g_str_equal (doctype_scalar, "modulemd-defaults")) { doctype = MODULEMD_YAML_DOC_DEFAULTS; } else if (g_str_equal (doctype_scalar, "modulemd-translations")) { doctype = MODULEMD_YAML_DOC_TRANSLATIONS; } else if (g_str_equal (doctype_scalar, "modulemd-packager")) { doctype = MODULEMD_YAML_DOC_PACKAGER; } else if (g_str_equal (doctype_scalar, "modulemd-obsoletes")) { doctype = MODULEMD_YAML_DOC_OBSOLETES; } else { MMD_YAML_ERROR_EVENT_EXIT_BOOL ( error, event, "Document type %s unknown.", doctype_scalar); } g_clear_pointer (&doctype_scalar, g_free); } else if (depth == 1 && g_str_equal ((const gchar *)event.data.scalar.value, "version")) { if (mdversion != 0) { MMD_YAML_ERROR_EVENT_EXIT_BOOL ( error, event, "Metadata version encountered twice."); } mdversion = modulemd_yaml_parse_uint64 (parser, &nested_error); if (nested_error) { /* If we got a parsing error, report it. Otherwise, continue * and we'll catch the invalid mdversion further on */ g_propagate_error (error, g_steal_pointer (&nested_error)); return FALSE; } mdversion_string = g_strdup_printf ("%" PRIu64, mdversion); if (!mmd_emitter_scalar ( emitter, mdversion_string, YAML_PLAIN_SCALAR_STYLE, error)) { return FALSE; } } else if (depth == 1 && g_str_equal ((const gchar *)event.data.scalar.value, "data")) { had_data = TRUE; } break; default: /* Anything else, we just re-emit into the subdocument */ MMD_EMIT_WITH_EXIT_FULL ( emitter, FALSE, &event, error, "Error re-emiting event"); ; break; } yaml_event_delete (&event); } /* The final event must be the document end */ YAML_PARSER_PARSE_WITH_EXIT_BOOL (parser, &event, error); if (event.type != YAML_DOCUMENT_END_EVENT) { MMD_YAML_ERROR_EVENT_EXIT_BOOL ( error, event, "Document did not end. It just goes on forever..."); } MMD_EMIT_WITH_EXIT_FULL ( emitter, FALSE, &event, error, "Error ending document"); yaml_event_delete (&event); if (!mmd_emitter_end_stream (emitter, error)) { return FALSE; } if (doctype == MODULEMD_YAML_DOC_UNKNOWN) { g_set_error_literal (error, MODULEMD_YAML_ERROR, MMD_YAML_ERROR_MISSING_REQUIRED, "No document type specified"); return FALSE; } if (!mdversion) { g_set_error_literal (error, MODULEMD_YAML_ERROR, MMD_YAML_ERROR_MISSING_REQUIRED, "No metadata version specified"); return FALSE; } if (doctype == MODULEMD_YAML_DOC_PACKAGER && mdversion < 2) { g_set_error_literal (error, MODULEMD_YAML_ERROR, MMD_YAML_ERROR_INCONSISTENT, "Document type 'modulemd-packager' is permissible " "only for module stream version 2 or higher."); return FALSE; } if (!had_data) { g_set_error_literal (error, MODULEMD_YAML_ERROR, MMD_YAML_ERROR_MISSING_REQUIRED, "No data section provided"); return FALSE; } *_doctype = doctype; *_mdversion = mdversion; return TRUE; } ModulemdSubdocumentInfo * modulemd_yaml_parse_document_type (yaml_parser_t *parser) { MMD_INIT_YAML_EMITTER (emitter); MMD_INIT_YAML_STRING (&emitter, yaml_string); g_autoptr (ModulemdSubdocumentInfo) s = modulemd_subdocument_info_new (); ModulemdYamlDocumentTypeEnum doctype = MODULEMD_YAML_DOC_UNKNOWN; guint64 mdversion = 0; g_autoptr (GError) error = NULL; if (!modulemd_yaml_parse_document_type_internal ( parser, &doctype, &mdversion, &emitter, &error)) { modulemd_subdocument_info_set_gerror (s, error); } modulemd_subdocument_info_set_doctype (s, doctype); modulemd_subdocument_info_set_mdversion (s, mdversion); modulemd_subdocument_info_set_yaml (s, yaml_string->str); return g_steal_pointer (&s); } static const gchar * modulemd_yaml_get_doctype_string (ModulemdYamlDocumentTypeEnum doctype, guint64 mdversion) { switch (doctype) { case MODULEMD_YAML_DOC_MODULESTREAM: if (mdversion <= 2) { return "modulemd"; } return "modulemd-stream"; case MODULEMD_YAML_DOC_DEFAULTS: return "modulemd-defaults"; case MODULEMD_YAML_DOC_TRANSLATIONS: return "modulemd-translations"; case MODULEMD_YAML_DOC_OBSOLETES: return "modulemd-obsoletes"; case MODULEMD_YAML_DOC_PACKAGER: return "modulemd-packager"; default: return NULL; } } gboolean modulemd_yaml_emit_document_headers (yaml_emitter_t *emitter, ModulemdYamlDocumentTypeEnum doctype, guint64 mdversion, GError **error) { MODULEMD_INIT_TRACE (); const gchar *doctype_string = modulemd_yaml_get_doctype_string (doctype, mdversion); g_autofree gchar *mdversion_string = g_strdup_printf ("%" PRIu64, mdversion); if (!mmd_emitter_start_document (emitter, error)) { return FALSE; } if (!mmd_emitter_start_mapping (emitter, YAML_BLOCK_MAPPING_STYLE, error)) { return FALSE; } if (!mmd_emitter_scalar ( emitter, "document", YAML_PLAIN_SCALAR_STYLE, error)) { return FALSE; } if (!mmd_emitter_scalar ( emitter, doctype_string, YAML_PLAIN_SCALAR_STYLE, error)) { return FALSE; } if (!mmd_emitter_scalar (emitter, "version", YAML_PLAIN_SCALAR_STYLE, error)) { return FALSE; } if (!mmd_emitter_scalar ( emitter, mdversion_string, YAML_PLAIN_SCALAR_STYLE, error)) { return FALSE; } if (!mmd_emitter_scalar (emitter, "data", YAML_PLAIN_SCALAR_STYLE, error)) { return FALSE; } return TRUE; } gboolean modulemd_yaml_emit_variant (yaml_emitter_t *emitter, GVariant *variant, GError **error) { GVariantIter iter; g_autofree gchar *key = NULL; g_autoptr (GVariant) value = NULL; g_autoptr (GPtrArray) keys = NULL; g_autoptr (GVariantDict) dict = NULL; if (g_variant_is_of_type (variant, G_VARIANT_TYPE_STRING)) { EMIT_SCALAR_STRING ( emitter, error, g_variant_get_string (variant, NULL)); } else if (g_variant_is_of_type (variant, G_VARIANT_TYPE_BOOLEAN)) { if (g_variant_get_boolean (variant)) { EMIT_SCALAR (emitter, error, "TRUE"); } else { EMIT_SCALAR (emitter, error, "FALSE"); } } else if (g_variant_is_of_type (variant, G_VARIANT_TYPE_DICTIONARY)) { EMIT_MAPPING_START (emitter, error); keys = g_ptr_array_new_with_free_func (g_free); dict = g_variant_dict_new (variant); g_variant_iter_init (&iter, variant); /* Get a list of the keys to sort */ while (g_variant_iter_next (&iter, "{sv}", &key, &value)) { g_ptr_array_add (keys, g_steal_pointer (&key)); g_clear_pointer (&value, g_variant_unref); } /* Sort the keys alphabetically */ g_ptr_array_sort (keys, modulemd_strcmp_sort); /* Write out the keys and recurse into their values */ for (guint i = 0; i < keys->len; i++) { value = g_variant_dict_lookup_value ( dict, g_ptr_array_index (keys, i), NULL); if (!value) { g_set_error ( error, MODULEMD_YAML_ERROR, MMD_YAML_ERROR_EMIT, "Got unexpected type while processing XMD dictionary."); return FALSE; } EMIT_SCALAR_STRING (emitter, error, g_ptr_array_index (keys, i)); if (!modulemd_yaml_emit_variant (emitter, value, error)) { return FALSE; } g_clear_pointer (&value, g_variant_unref); } g_clear_pointer (&keys, g_ptr_array_unref); EMIT_MAPPING_END (emitter, error); } else if (g_variant_is_of_type (variant, G_VARIANT_TYPE_ARRAY)) { EMIT_SEQUENCE_START (emitter, error); g_variant_iter_init (&iter, variant); while ((value = g_variant_iter_next_value (&iter))) { if (!modulemd_yaml_emit_variant (emitter, value, error)) { return FALSE; } g_clear_pointer (&value, g_variant_unref); } EMIT_SEQUENCE_END (emitter, error); } else { g_set_error (error, MODULEMD_YAML_ERROR, MMD_YAML_ERROR_EMIT, "Unhandled variant type: \"%s\": %s", g_variant_get_type_string (variant), g_variant_print (variant, TRUE)); return FALSE; } return TRUE; } GVariant * mmd_variant_from_scalar (const gchar *scalar) { MODULEMD_INIT_TRACE (); GVariant *variant = NULL; g_debug ("Variant from scalar: %s", scalar); g_return_val_if_fail (scalar, NULL); /* Treat "TRUE" and "FALSE" as boolean values */ if (g_str_equal (scalar, "TRUE")) { variant = g_variant_new_boolean (TRUE); } else if (g_str_equal (scalar, "FALSE")) { variant = g_variant_new_boolean (FALSE); } else if (scalar) { /* Any value we don't handle specifically becomes a string */ variant = g_variant_new_string (scalar); } return variant; } GVariant * mmd_variant_from_mapping (yaml_parser_t *parser, GError **error) { MODULEMD_INIT_TRACE (); gboolean done = FALSE; MMD_INIT_YAML_EVENT (event); MMD_INIT_YAML_EVENT (value_event); g_autoptr (GVariantDict) dict = NULL; g_autoptr (GVariant) value = NULL; g_autofree gchar *key = NULL; g_autoptr (GError) nested_error = NULL; dict = g_variant_dict_new (NULL); while (!done) { YAML_PARSER_PARSE_WITH_EXIT (parser, &event, error); switch (event.type) { case YAML_MAPPING_END_EVENT: /* We've processed the whole dictionary */ done = TRUE; break; case YAML_SCALAR_EVENT: /* All mapping keys must be scalars */ key = g_strdup ((const gchar *)event.data.scalar.value); YAML_PARSER_PARSE_WITH_EXIT (parser, &value_event, error); switch (value_event.type) { case YAML_SCALAR_EVENT: value = mmd_variant_from_scalar ( (const gchar *)value_event.data.scalar.value); if (!value) { MMD_YAML_ERROR_EVENT_EXIT ( error, event, "Error parsing scalar"); } break; case YAML_MAPPING_START_EVENT: value = mmd_variant_from_mapping (parser, &nested_error); if (!value) { g_propagate_error (error, g_steal_pointer (&nested_error)); return NULL; } break; case YAML_SEQUENCE_START_EVENT: value = mmd_variant_from_sequence (parser, &nested_error); if (!value) { g_propagate_error (error, g_steal_pointer (&nested_error)); return NULL; } break; default: /* We received a YAML event we shouldn't expect at this level */ MMD_YAML_ERROR_EVENT_EXIT ( error, event, "Unexpected YAML event in inner raw mapping: %s", mmd_yaml_get_event_name (value_event.type)); break; } yaml_event_delete (&value_event); g_variant_dict_insert_value (dict, key, g_steal_pointer (&value)); g_clear_pointer (&key, g_free); break; default: /* We received a YAML event we shouldn't expect at this level */ MMD_YAML_ERROR_EVENT_EXIT ( error, event, "Unexpected YAML event in raw mapping: %s", mmd_yaml_get_event_name (event.type)); break; } yaml_event_delete (&event); } return g_variant_dict_end (dict); } GVariant * mmd_variant_from_sequence (yaml_parser_t *parser, GError **error) { MODULEMD_INIT_TRACE (); gboolean done = FALSE; MMD_INIT_YAML_EVENT (event); g_auto (GVariantBuilder) builder; g_autoptr (GVariant) value = NULL; g_autoptr (GError) nested_error = NULL; gboolean empty_array = TRUE; GVariant *result = NULL; g_variant_builder_init (&builder, G_VARIANT_TYPE_ARRAY); while (!done) { YAML_PARSER_PARSE_WITH_EXIT (parser, &event, error); switch (event.type) { case YAML_SEQUENCE_END_EVENT: /* We've processed the whole sequence */ done = TRUE; break; case YAML_SCALAR_EVENT: value = mmd_variant_from_scalar ((const gchar *)event.data.scalar.value); if (!value) { MMD_YAML_ERROR_EVENT_EXIT (error, event, "Error parsing scalar"); } break; case YAML_MAPPING_START_EVENT: value = mmd_variant_from_mapping (parser, &nested_error); if (!value) { g_propagate_error (error, g_steal_pointer (&nested_error)); return NULL; } break; case YAML_SEQUENCE_START_EVENT: value = mmd_variant_from_sequence (parser, &nested_error); if (!value) { g_propagate_error (error, g_steal_pointer (&nested_error)); return NULL; } break; default: /* We received a YAML event we shouldn't expect at this level */ MMD_YAML_ERROR_EVENT_EXIT ( error, event, "Unexpected YAML event in raw sequence: %s", mmd_yaml_get_event_name (event.type)); break; } if (value) { g_variant_builder_add_value (&builder, g_steal_pointer (&value)); empty_array = FALSE; } yaml_event_delete (&event); } if (empty_array) { /* If we got an empty array, treat it as a zero-length array of * GVariants */ result = g_variant_new ("av", NULL); } else { /* Otherwise, finish it up */ result = g_variant_builder_end (&builder); } return result; } GVariant * mmd_parse_xmd (yaml_parser_t *parser, GError **error) { MODULEMD_INIT_TRACE (); MMD_INIT_YAML_EVENT (event); GVariant *variant = NULL; g_autoptr (GError) nested_error = NULL; g_return_val_if_fail (error == NULL || *error == NULL, FALSE); YAML_PARSER_PARSE_WITH_EXIT (parser, &event, error); switch (event.type) { case YAML_SCALAR_EVENT: variant = mmd_variant_from_scalar ((const gchar *)event.data.scalar.value); if (!variant) { MMD_YAML_ERROR_EVENT_EXIT (error, event, "Error parsing scalar"); } break; case YAML_MAPPING_START_EVENT: variant = mmd_variant_from_mapping (parser, &nested_error); break; default: MMD_YAML_ERROR_EVENT_EXIT (error, event, "Unexpected YAML event in raw parsing: %s", mmd_yaml_get_event_name (event.type)); break; } return g_variant_ref_sink (variant); } static gboolean skip_unknown_yaml_mapping (yaml_parser_t *parser, GError **error); static gboolean skip_unknown_yaml_sequence (yaml_parser_t *parser, GError **error); gboolean skip_unknown_yaml (yaml_parser_t *parser, GError **error) { MMD_INIT_YAML_EVENT (event); MODULEMD_INIT_TRACE (); /* This function is called when an unknown key appears in a mapping. * Read the next event and then skip to the end of it. */ YAML_PARSER_PARSE_WITH_EXIT_BOOL (parser, &event, error); switch (event.type) { case YAML_SCALAR_EVENT: /* If we get a scalar key, we can just return here */ break; case YAML_MAPPING_START_EVENT: return skip_unknown_yaml_mapping (parser, error); case YAML_SEQUENCE_START_EVENT: return skip_unknown_yaml_sequence (parser, error); default: /* We received a YAML event we shouldn't expect at this level */ g_set_error (error, MODULEMD_YAML_ERROR, MMD_YAML_ERROR_PARSE, "Unexpected YAML event %s in skip_unknown_yaml()", mmd_yaml_get_event_name (event.type)); return FALSE; } return TRUE; } static gboolean skip_unknown_yaml_sequence (yaml_parser_t *parser, GError **error) { MMD_INIT_YAML_EVENT (event); gsize depth = 0; gboolean done = FALSE; while (!done) { YAML_PARSER_PARSE_WITH_EXIT_BOOL (parser, &event, error); switch (event.type) { case YAML_SCALAR_EVENT: break; case YAML_MAPPING_START_EVENT: case YAML_SEQUENCE_START_EVENT: depth++; break; case YAML_MAPPING_END_EVENT: depth--; break; case YAML_SEQUENCE_END_EVENT: if (depth == 0) { done = TRUE; break; } depth--; break; default: /* We received a YAML event we shouldn't expect at this level */ g_set_error ( error, MODULEMD_YAML_ERROR, MMD_YAML_ERROR_PARSE, "Unexpected YAML event %s in skip_unknown_yaml_sequence()", mmd_yaml_get_event_name (event.type)); return FALSE; } yaml_event_delete (&event); } return TRUE; } static gboolean skip_unknown_yaml_mapping (yaml_parser_t *parser, GError **error) { MMD_INIT_YAML_EVENT (event); gsize depth = 0; gboolean done = FALSE; while (!done) { YAML_PARSER_PARSE_WITH_EXIT_BOOL (parser, &event, error); switch (event.type) { case YAML_SCALAR_EVENT: break; case YAML_MAPPING_START_EVENT: case YAML_SEQUENCE_START_EVENT: depth++; break; case YAML_SEQUENCE_END_EVENT: depth--; break; case YAML_MAPPING_END_EVENT: if (depth == 0) { done = TRUE; break; } depth--; break; default: /* We received a YAML event we shouldn't expect at this level */ g_set_error ( error, MODULEMD_YAML_ERROR, MMD_YAML_ERROR_PARSE, "Unexpected YAML event %s in skip_unknown_yaml_sequence()", mmd_yaml_get_event_name (event.type)); return FALSE; } yaml_event_delete (&event); } return TRUE; } fedora-modularity-libmodulemd-357799c/modulemd/modulemd.c000066400000000000000000000310231502446517500235200ustar00rootroot00000000000000/* * This file is part of libmodulemd * Copyright (C) 2018 Red Hat, Inc. * * Fedora-License-Identifier: MIT * SPDX-2.0-License-Identifier: MIT * SPDX-3.0-License-Identifier: MIT * * This program is free software. * For more information on the license, see COPYING. * For more information on free software, see . */ #include "modulemd.h" #include "config.h" #include "private/modulemd-util.h" #include "private/modulemd-module-stream-private.h" #include "private/modulemd-subdocument-info-private.h" #include "private/modulemd-packager-v3-private.h" #include #include const gchar * modulemd_get_version (void) { return LIBMODULEMD_VERSION; } static ModulemdModuleIndex * verify_load (int ret, ModulemdModuleIndex *idx, GPtrArray *failures, GError **error, GError **nested_error); ModulemdModuleIndex * modulemd_load_file (const gchar *yaml_file, GError **error) { gboolean ret; g_autoptr (ModulemdModuleIndex) idx = NULL; g_autoptr (GError) nested_error = NULL; g_autoptr (GPtrArray) failures = NULL; g_return_val_if_fail (yaml_file, NULL); g_return_val_if_fail (error == NULL || *error == NULL, NULL); failures = g_ptr_array_new_with_free_func (g_object_unref); idx = modulemd_module_index_new (); ret = modulemd_module_index_update_from_file ( idx, yaml_file, FALSE, &failures, &nested_error); return verify_load (ret, idx, failures, error, &nested_error); } ModulemdModuleIndex * modulemd_load_string (const gchar *yaml_string, GError **error) { gboolean ret; g_autoptr (ModulemdModuleIndex) idx = NULL; g_autoptr (GError) nested_error = NULL; g_autoptr (GPtrArray) failures = NULL; g_return_val_if_fail (yaml_string, NULL); g_return_val_if_fail (error == NULL || *error == NULL, NULL); failures = g_ptr_array_new_with_free_func (g_object_unref); idx = modulemd_module_index_new (); ret = modulemd_module_index_update_from_string ( idx, yaml_string, FALSE, &failures, &nested_error); return verify_load (ret, idx, failures, error, &nested_error); } static ModulemdModuleIndex * verify_load (gboolean ret, ModulemdModuleIndex *idx, GPtrArray *failures, GError **error, GError **nested_error) { if (!ret) { if (*nested_error) { g_propagate_error (error, g_steal_pointer (nested_error)); return NULL; } else if (failures && failures->len) { modulemd_subdocument_info_debug_dump_failures (failures); g_set_error (error, MODULEMD_ERROR, MMD_ERROR_VALIDATE, "One or more YAML subdocuments were invalid."); return NULL; } /* Should never get here, must be a programming error */ g_set_error ( error, MODULEMD_ERROR, MMD_ERROR_VALIDATE, "Unknown internal error."); g_return_val_if_reached (NULL); } return g_object_ref (idx); } static GType modulemd_read_packager_from_parser (yaml_parser_t *parser, GObject **object, const gchar *module_name, const gchar *module_stream, GError **error); GType modulemd_read_packager_file (const gchar *yaml_path, GObject **object, GError **error) { return modulemd_read_packager_file_ext ( yaml_path, object, NULL, NULL, error); } GType modulemd_read_packager_file_ext (const gchar *yaml_path, GObject **object, const gchar *module_name, const gchar *module_stream, GError **error) { MMD_INIT_YAML_PARSER (parser); g_autoptr (FILE) yaml_stream = NULL; gint err; g_return_val_if_fail (yaml_path, G_TYPE_INVALID); g_return_val_if_fail (object, G_TYPE_INVALID); g_return_val_if_fail (error == NULL || *error == NULL, G_TYPE_INVALID); errno = 0; yaml_stream = g_fopen (yaml_path, "rbe"); err = errno; if (!yaml_stream) { g_set_error (error, MODULEMD_YAML_ERROR, MMD_YAML_ERROR_OPEN, "%s", g_strerror (err)); return G_TYPE_INVALID; } yaml_parser_set_input_file (&parser, yaml_stream); return modulemd_read_packager_from_parser ( &parser, object, module_name, module_stream, error); } GType modulemd_read_packager_string (const gchar *yaml_string, GObject **object, GError **error) { return modulemd_read_packager_string_ext ( yaml_string, object, NULL, NULL, error); } GType modulemd_read_packager_string_ext (const gchar *yaml_string, GObject **object, const gchar *module_name, const gchar *module_stream, GError **error) { MMD_INIT_YAML_PARSER (parser); g_return_val_if_fail (yaml_string, G_TYPE_INVALID); g_return_val_if_fail (object, G_TYPE_INVALID); g_return_val_if_fail (error == NULL || *error == NULL, G_TYPE_INVALID); yaml_parser_set_input_string ( &parser, (const unsigned char *)yaml_string, strlen (yaml_string)); return modulemd_read_packager_from_parser ( &parser, object, module_name, module_stream, error); } static GType modulemd_read_packager_from_parser (yaml_parser_t *parser, GObject **object, const gchar *module_name, const gchar *module_stream, GError **error) { MMD_INIT_YAML_EVENT (event); g_autoptr (ModulemdModuleStreamV1) stream_v1 = NULL; g_autoptr (ModulemdModuleStreamV2) stream_v2 = NULL; g_autoptr (ModulemdPackagerV3) packager_v3 = NULL; g_autoptr (ModulemdSubdocumentInfo) subdoc = NULL; ModulemdYamlDocumentTypeEnum doctype; const GError *gerror = NULL; g_autoptr (GObject) return_object = NULL; GType return_type = G_TYPE_INVALID; /* The first event must be the stream start */ if (!yaml_parser_parse (parser, &event)) { g_set_error_literal (error, MODULEMD_YAML_ERROR, MMD_YAML_ERROR_UNPARSEABLE, "Parser error"); return G_TYPE_INVALID; } if (event.type != YAML_STREAM_START_EVENT) { g_set_error_literal (error, MODULEMD_YAML_ERROR, MMD_YAML_ERROR_PARSE, "YAML didn't begin with STREAM_START."); return G_TYPE_INVALID; } yaml_event_delete (&event); /* The second event must be the document start */ if (!yaml_parser_parse (parser, &event)) { g_set_error_literal (error, MODULEMD_YAML_ERROR, MMD_YAML_ERROR_UNPARSEABLE, "Parser error"); return G_TYPE_INVALID; } if (event.type != YAML_DOCUMENT_START_EVENT) { g_set_error_literal (error, MODULEMD_YAML_ERROR, MMD_YAML_ERROR_PARSE, "YAML didn't begin with STREAM_START."); return G_TYPE_INVALID; } yaml_event_delete (&event); subdoc = modulemd_yaml_parse_document_type (parser); gerror = modulemd_subdocument_info_get_gerror (subdoc); if (gerror) { g_set_error (error, gerror->domain, gerror->code, "Parse error identifying document type and version: %s", gerror->message); return G_TYPE_INVALID; } doctype = modulemd_subdocument_info_get_doctype (subdoc); switch (doctype) { case MODULEMD_YAML_DOC_PACKAGER: if (modulemd_subdocument_info_get_mdversion (subdoc) < MD_PACKAGER_VERSION_TWO) { g_set_error (error, MODULEMD_YAML_ERROR, MMD_YAML_ERROR_PARSE, "Invalid mdversion for a packager document"); return G_TYPE_INVALID; } if (modulemd_subdocument_info_get_mdversion (subdoc) == MD_PACKAGER_VERSION_THREE) { packager_v3 = modulemd_packager_v3_parse_yaml (subdoc, error); if (!packager_v3) { return G_TYPE_INVALID; } if (module_name) { modulemd_packager_v3_set_module_name (packager_v3, module_name); } if (module_stream) { modulemd_packager_v3_set_stream_name (packager_v3, module_stream); } return_object = (GObject *)g_steal_pointer (&packager_v3); return_type = MODULEMD_TYPE_PACKAGER_V3; break; } FALLTHROUGH; /* Packager V2 format is handled below. */ case MODULEMD_YAML_DOC_MODULESTREAM: switch (modulemd_subdocument_info_get_mdversion (subdoc)) { case MD_MODULESTREAM_VERSION_ONE: stream_v1 = modulemd_module_stream_v1_parse_yaml (subdoc, FALSE, error); if (!stream_v1) { return G_TYPE_INVALID; } stream_v2 = MODULEMD_MODULE_STREAM_V2 ( modulemd_module_stream_upgrade_v1_to_v2 ( MODULEMD_MODULE_STREAM (stream_v1))); if (!stream_v2) { /* This should be impossible, since there are no failure returns * from modulemd_module_stream_upgrade_v1_to_v2() */ g_set_error (error, MODULEMD_ERROR, MMD_ERROR_UPGRADE, "Upgrading to v2 failed for an unknown reason"); return G_TYPE_INVALID; } if (module_name) { modulemd_module_stream_set_module_name ( MODULEMD_MODULE_STREAM (stream_v2), module_name); } if (module_stream) { modulemd_module_stream_set_stream_name ( MODULEMD_MODULE_STREAM (stream_v2), module_stream); } return_object = (GObject *)g_steal_pointer (&stream_v2); return_type = MODULEMD_TYPE_MODULE_STREAM_V2; break; case MD_MODULESTREAM_VERSION_TWO: stream_v2 = modulemd_module_stream_v2_parse_yaml ( subdoc, FALSE, doctype == MODULEMD_YAML_DOC_PACKAGER, error); if (!stream_v2) { return G_TYPE_INVALID; } if (module_name) { modulemd_module_stream_set_module_name ( MODULEMD_MODULE_STREAM (stream_v2), module_name); } if (module_stream) { modulemd_module_stream_set_stream_name ( MODULEMD_MODULE_STREAM (stream_v2), module_stream); } return_object = (GObject *)g_steal_pointer (&stream_v2); return_type = MODULEMD_TYPE_MODULE_STREAM_V2; break; default: g_set_error (error, MODULEMD_YAML_ERROR, MMD_YAML_ERROR_PARSE, "Invalid mdversion (%" PRIu64 ") for a modulemd[-stream] document", modulemd_subdocument_info_get_mdversion (subdoc)); return G_TYPE_INVALID; } break; default: g_set_error ( error, MODULEMD_YAML_ERROR, MMD_YAML_ERROR_PARSE, "Expected `document: modulemd[-stream] or modulemd-packager`, got %d", modulemd_subdocument_info_get_doctype (subdoc)); return G_TYPE_INVALID; } /* The last event must be the stream end */ if (!yaml_parser_parse (parser, &event)) { g_set_error_literal (error, MODULEMD_YAML_ERROR, MMD_YAML_ERROR_UNPARSEABLE, "Parser error"); return G_TYPE_INVALID; } if (event.type != YAML_STREAM_END_EVENT) { g_set_error_literal (error, MODULEMD_YAML_ERROR, MMD_YAML_ERROR_PARSE, "YAML contained more than a single subdocument"); return G_TYPE_INVALID; } yaml_event_delete (&event); *object = g_steal_pointer (&return_object); return return_type; } fedora-modularity-libmodulemd-357799c/modulemd/tests/000077500000000000000000000000001502446517500227115ustar00rootroot00000000000000fedora-modularity-libmodulemd-357799c/modulemd/tests/ModulemdTests/000077500000000000000000000000001502446517500255025ustar00rootroot00000000000000fedora-modularity-libmodulemd-357799c/modulemd/tests/ModulemdTests/base.py000066400000000000000000000041301502446517500267640ustar00rootroot00000000000000#!/usr/bin/python3 # This file is part of libmodulemd # Copyright (C) 2018 Red Hat, Inc. # # Fedora-License-Identifier: MIT # SPDX-2.0-License-Identifier: MIT # SPDX-3.0-License-Identifier: MIT # # This program is free software. # For more information on the license, see COPYING. # For more information on free software, see # . from contextlib import contextmanager import signal import os import unittest class TestBase(unittest.TestCase): def __init__(self, *args, **kwargs): super(TestBase, self).__init__(*args, **kwargs) self._caught_signal = False @property def source_root(self): return os.getenv("MESON_SOURCE_ROOT") @property def test_data_path(self): return os.getenv("TEST_DATA_PATH") def _catch_signal(self, *sigargs): if self._caught_signal: raise AssertionError("Multiple signals were caught") self._caught_signal = True @contextmanager def expect_signal( self, expected_signal=signal.SIGTRAP, only_on_fatal_warnings=False ): expect_signal = (not only_on_fatal_warnings) or self.warnings_fatal self._caught_signal = False saved_signal = signal.signal(expected_signal, self._catch_signal) yield None signal.signal(expected_signal, saved_signal) if not self._caught_signal and expect_signal: raise AssertionError("No signal got caught") elif self._caught_signal and not expect_signal: raise AssertionError("Signal caught in non-warning state") @property def warnings_fatal(self): gdebug = os.getenv("G_DEBUG", "").split(",") return "fatal-warnings" in gdebug def assertRaisesRegex(self, *args, **kwargs): """Asserts that the message in a raised exception matches a regex. Args: The same as unittest.TestCase.assertRaisesRegex(). """ try: return super(TestBase, self).assertRaisesRegex(*args, **kwargs) except AttributeError: return self.assertRaisesRegexp(*args, **kwargs) fedora-modularity-libmodulemd-357799c/modulemd/tests/ModulemdTests/buildopts.py000066400000000000000000000101731502446517500300630ustar00rootroot00000000000000#!/usr/bin/python3 # This file is part of libmodulemd # Copyright (C) 2018 Red Hat, Inc. # # Fedora-License-Identifier: MIT # SPDX-2.0-License-Identifier: MIT # SPDX-3.0-License-Identifier: MIT # # This program is free software. # For more information on the license, see COPYING. # For more information on free software, see # . import sys try: import unittest import gi gi.require_version("Modulemd", "2.0") from gi.repository import Modulemd except ImportError: # Return error 77 to skip this test on platforms without the necessary # python modules sys.exit(77) from base import TestBase class TestBuildopts(TestBase): def test_constructor(self): # Test that the new() function works b = Modulemd.Buildopts.new() assert b assert b.props.rpm_macros is None assert b.get_rpm_macros() is None assert b.get_rpm_whitelist() == [] assert b.get_arches() == [] # Test that init works with rpm_macros b = Modulemd.Buildopts(rpm_macros="Test macros") assert b assert b.props.rpm_macros == "Test macros" assert b.get_rpm_macros() == "Test macros" assert b.get_rpm_whitelist() == [] assert b.get_arches() == [] def test_copy(self): b_orig = Modulemd.Buildopts() b = b_orig.copy() assert b assert b.props.rpm_macros is None assert b.get_rpm_macros() is None assert b.get_rpm_whitelist() == [] assert b.get_arches() == [] b.add_rpm_to_whitelist("test2") b.add_rpm_to_whitelist("test3") b.add_rpm_to_whitelist("test1") b.add_arch("x86_64") b.add_arch("ppc64le") b = b_orig.copy() assert b # make sure lists added to b above got clobbered by copy assert b.get_rpm_whitelist() == [] assert b.get_arches() == [] b_orig.set_rpm_macros("Test macros") b_orig.add_rpm_to_whitelist("test2") b_orig.add_rpm_to_whitelist("test3") b_orig.add_rpm_to_whitelist("test1") b_orig.add_arch("x86_64") b_orig.add_arch("ppc64le") b = b_orig.copy() assert b assert b.props.rpm_macros == "Test macros" assert b.get_rpm_macros() == "Test macros" assert b.get_rpm_whitelist() == ["test1", "test2", "test3"] assert b.get_arches() == ["ppc64le", "x86_64"] def test_get_set_rpm_macros(self): b = Modulemd.Buildopts() assert b.props.rpm_macros is None assert b.get_rpm_macros() is None b.set_rpm_macros("foobar") assert b.props.rpm_macros == "foobar" assert b.get_rpm_macros() == "foobar" b.props.rpm_macros = "barfoo" assert b.props.rpm_macros == "barfoo" assert b.get_rpm_macros() == "barfoo" b.props.rpm_macros = None assert b.props.rpm_macros is None assert b.get_rpm_macros() is None def test_whitelist(self): b = Modulemd.Buildopts() assert b.get_rpm_whitelist() == [] b.add_rpm_to_whitelist("test2") assert b.get_rpm_whitelist() == ["test2"] b.add_rpm_to_whitelist("test3") b.add_rpm_to_whitelist("test1") assert b.get_rpm_whitelist() == ["test1", "test2", "test3"] b.add_rpm_to_whitelist("test2") assert b.get_rpm_whitelist() == ["test1", "test2", "test3"] b.remove_rpm_from_whitelist("test1") assert b.get_rpm_whitelist() == ["test2", "test3"] b.clear_rpm_whitelist() assert b.get_rpm_whitelist() == [] def test_arches(self): b = Modulemd.Buildopts() assert b.get_arches() == [] b.add_arch("s390x") assert b.get_arches() == ["s390x"] b.add_arch("x86_64") b.add_arch("ppc64le") assert b.get_arches() == ["ppc64le", "s390x", "x86_64"] b.add_arch("s390x") assert b.get_arches() == ["ppc64le", "s390x", "x86_64"] b.remove_arch("ppc64le") assert b.get_arches() == ["s390x", "x86_64"] b.clear_arches() assert b.get_arches() == [] if __name__ == "__main__": unittest.main() fedora-modularity-libmodulemd-357799c/modulemd/tests/ModulemdTests/common.py000066400000000000000000000175561502446517500273620ustar00rootroot00000000000000import json import logging import os import sys try: import unittest import gi gi.require_version("Modulemd", "2.0") from gi.repository import GLib from gi.repository import Modulemd except ImportError: # Return error 77 to skip this test on platforms without the necessary # python modules sys.exit(77) from base import TestBase logging.basicConfig(level=logging.DEBUG) class TestCommon(TestBase): def test_packager_read_file(self): # We have a chicken-egg problem with overrides, since they can only # be tested if they are already installed. This means they need to # be run in the CI. In order to avoid changes to these tests or the # overrides breaking things, we'll skip them if the appropriate # override is not installed. if not ( "_overrides_module" in dir(Modulemd) and hasattr(gi.overrides.Modulemd, "read_packager_file") ): logging.debug( "read_packager_file() override not installed, skipping tests" ) return # Validate that the PackagerV2 specification parses correctly doc = Modulemd.read_packager_file( os.path.join( self.source_root, "yaml_specs/modulemd_packager_v2.yaml" ) ) self.assertIsNotNone(doc) # Once read in, a modulemd-packager v2 document is a ModuleStream of the # same version. self.assertIs(type(doc), Modulemd.ModuleStreamV2) # Confirm module and stream names are undefined self.assertIsNone(doc.get_module_name()) self.assertIsNone(doc.get_stream_name()) # Read the PackagerV2 specification with module/stream name overrides doc = Modulemd.read_packager_file( os.path.join( self.source_root, "yaml_specs/modulemd_packager_v2.yaml" ), "modulename-override", "streamname-override", ) self.assertIsNotNone(doc) self.assertIs(type(doc), Modulemd.ModuleStreamV2) # Confirm module and stream names were set self.assertEqual(doc.get_module_name(), "modulename-override") self.assertEqual(doc.get_stream_name(), "streamname-override") # Valid PackagerV3 file doc = Modulemd.read_packager_file( os.path.join( self.source_root, "yaml_specs/modulemd_packager_v3.yaml" ) ) self.assertIsNotNone(doc) self.assertIs(type(doc), Modulemd.PackagerV3) # Read PackagerV3 with module/stream name overrides doc = Modulemd.read_packager_file( os.path.join( self.source_root, "yaml_specs/modulemd_packager_v3.yaml" ), "modulename-override", "streamname-override", ) self.assertIsNotNone(doc) self.assertIs(type(doc), Modulemd.PackagerV3) # Confirm module and stream names were set self.assertEqual(doc.get_module_name(), "modulename-override") self.assertEqual(doc.get_stream_name(), "streamname-override") # Validate that the ModuleStreamV2 specification parses correctly doc = Modulemd.read_packager_file( os.path.join( self.source_root, "yaml_specs/modulemd_stream_v2.yaml" ) ) self.assertIsNotNone(doc) self.assertIs(type(doc), Modulemd.ModuleStreamV2) # Confirm module and stream names are correct self.assertEqual(doc.get_module_name(), "foo") self.assertEqual(doc.get_stream_name(), "latest") # Read the ModuleStreamV2 specification with module/stream name overrides doc = Modulemd.read_packager_file( os.path.join( self.source_root, "yaml_specs/modulemd_stream_v2.yaml" ), "modulename-override", "streamname-override", ) self.assertIsNotNone(doc) self.assertIs(type(doc), Modulemd.ModuleStreamV2) # Confirm module and stream names were set self.assertEqual(doc.get_module_name(), "modulename-override") self.assertEqual(doc.get_stream_name(), "streamname-override") def test_packager_read_string(self): # We have a chicken-egg problem with overrides, since they can only # be tested if they are already installed. This means they need to # be run in the CI. In order to avoid changes to these tests or the # overrides breaking things, we'll skip them if the appropriate # override is not installed. if not ( "_overrides_module" in dir(Modulemd) and hasattr(gi.overrides.Modulemd, "read_packager_string") ): logging.debug( "read_packager_string() override not installed, skipping tests" ) return # PackagerV2 minimal_valid = """--- document: modulemd-packager version: 2 data: summary: A minimal valid module description: A minimalistic module description license: module: - DUMMY ... """ doc = Modulemd.read_packager_string(minimal_valid) self.assertIsNotNone(doc) # Once read in, a modulemd-packager document is a ModuleStream of the # same version. self.assertIs(type(doc), Modulemd.ModuleStreamV2) # Confirm module and stream names are undefined self.assertIsNone(doc.get_module_name()) self.assertIsNone(doc.get_stream_name()) # Read again with module/stream name overrides doc = Modulemd.read_packager_string( minimal_valid, "modulename-override", "streamname-override" ) self.assertIsNotNone(doc) self.assertIs(type(doc), Modulemd.ModuleStreamV2) # Confirm module and stream names were set self.assertEqual(doc.get_module_name(), "modulename-override") self.assertEqual(doc.get_stream_name(), "streamname-override") # PackagerV3 minimal_valid = """--- document: modulemd-packager version: 3 data: summary: A minimal valid module description: A minimalistic module description license: - DUMMY ... """ doc = Modulemd.read_packager_string(minimal_valid) self.assertIsNotNone(doc) self.assertIs(type(doc), Modulemd.PackagerV3) # Confirm module and stream names are undefined self.assertIsNone(doc.get_module_name()) self.assertIsNone(doc.get_stream_name()) # Read again with module/stream name overrides doc = Modulemd.read_packager_string( minimal_valid, "modulename-override", "streamname-override" ) self.assertIsNotNone(doc) self.assertIs(type(doc), Modulemd.PackagerV3) # Confirm module and stream names were set self.assertEqual(doc.get_module_name(), "modulename-override") self.assertEqual(doc.get_stream_name(), "streamname-override") # ModuleStreamV2 minimal_valid = """--- document: modulemd-stream version: 2 data: summary: A minimal valid module description: A minimalistic module description license: module: - DUMMY ... """ doc = Modulemd.read_packager_string(minimal_valid) self.assertIsNotNone(doc) self.assertIs(type(doc), Modulemd.ModuleStreamV2) # Confirm module and stream names are undefined self.assertIsNone(doc.get_module_name()) self.assertIsNone(doc.get_stream_name()) # Read again with module/stream name overrides doc = Modulemd.read_packager_string( minimal_valid, "modulename-override", "streamname-override" ) self.assertIsNotNone(doc) self.assertIs(type(doc), Modulemd.ModuleStreamV2) # Confirm module and stream names were set self.assertEqual(doc.get_module_name(), "modulename-override") self.assertEqual(doc.get_stream_name(), "streamname-override") if __name__ == "__main__": unittest.main() fedora-modularity-libmodulemd-357799c/modulemd/tests/ModulemdTests/componentrpm.py000066400000000000000000000110421502446517500305730ustar00rootroot00000000000000#!/usr/bin/python3 # This file is part of libmodulemd # Copyright (C) 2018 Red Hat, Inc. # # Fedora-License-Identifier: MIT # SPDX-2.0-License-Identifier: MIT # SPDX-3.0-License-Identifier: MIT # # This program is free software. # For more information on the license, see COPYING. # For more information on free software, see # . import sys try: import unittest import gi gi.require_version("Modulemd", "2.0") from gi.repository.Modulemd import ComponentRpm except ImportError: # Return error 77 to skip this test on platforms without the necessary # python modules sys.exit(77) from base import TestBase class TestComponentRpm(TestBase): def test_constructors(self): # Test that the new() function works rpm = ComponentRpm.new("testrpm") assert rpm assert rpm.props.buildorder == 0 assert rpm.get_buildorder() == 0 assert rpm.props.buildonly is False assert rpm.get_buildonly() is False assert rpm.props.name == "testrpm" assert rpm.get_name() == "testrpm" assert rpm.props.rationale is None assert rpm.get_rationale() is None assert rpm.props.ref is None assert rpm.get_ref() is None assert rpm.props.repository is None assert rpm.get_repository() is None assert rpm.props.cache is None assert rpm.get_cache() is None assert rpm.get_arches() == [] assert rpm.get_multilib_arches() == [] # Test that object instantiation works rpm = ComponentRpm( buildorder=42, buildonly=True, name="testrpm", rationale="Testing all the things", ref="someref", repository="somerepo", cache="somecache", ) assert rpm assert rpm.props.buildorder == 42 assert rpm.get_buildorder() == 42 assert rpm.props.buildonly is True assert rpm.get_buildonly() is True assert rpm.props.name == "testrpm" assert rpm.get_name() == "testrpm" assert rpm.props.rationale == "Testing all the things" assert rpm.get_rationale() == "Testing all the things" assert rpm.props.ref == "someref" assert rpm.get_ref() == "someref" assert rpm.props.repository == "somerepo" assert rpm.get_repository() == "somerepo" assert rpm.props.cache == "somecache" assert rpm.get_cache() == "somecache" assert rpm.get_arches() == [] assert rpm.get_multilib_arches() == [] def test_copy(self): rpm_orig = ComponentRpm( buildorder=42, buildonly=True, name="testrpm", rationale="Testing all the things", ref="someref", repository="somerepo", cache="somecache", ) rpm_orig.add_restricted_arch("x86_64") rpm_orig.add_restricted_arch("i386") rpm_orig.add_multilib_arch("ppc64le") rpm_orig.add_multilib_arch("s390x") rpm = rpm_orig.copy() assert rpm assert rpm.props.buildorder == 42 assert rpm.get_buildorder() == 42 assert rpm.props.buildonly is True assert rpm.get_buildonly() is True assert rpm.props.name == "testrpm" assert rpm.get_name() == "testrpm" assert rpm.props.rationale == "Testing all the things" assert rpm.get_rationale() == "Testing all the things" assert rpm.props.ref == "someref" assert rpm.get_ref() == "someref" assert rpm.props.repository == "somerepo" assert rpm.get_repository() == "somerepo" assert rpm.props.cache == "somecache" assert rpm.get_cache() == "somecache" self.assertListEqual(rpm.get_arches(), ["i386", "x86_64"]) self.assertListEqual(rpm.get_multilib_arches(), ["ppc64le", "s390x"]) def test_arches(self): rpm = ComponentRpm.new("testrpm") assert rpm rpm.add_restricted_arch("x86_64") rpm.add_restricted_arch("i386") self.assertListEqual(rpm.get_arches(), ["i386", "x86_64"]) rpm.reset_arches() self.assertListEqual(rpm.get_arches(), []) def test_multilib(self): rpm = ComponentRpm.new("testrpm") assert rpm rpm.add_multilib_arch("ppc64le") rpm.add_multilib_arch("s390x") self.assertListEqual(rpm.get_multilib_arches(), ["ppc64le", "s390x"]) rpm.reset_multilib_arches() self.assertListEqual(rpm.get_multilib_arches(), []) if __name__ == "__main__": unittest.main() fedora-modularity-libmodulemd-357799c/modulemd/tests/ModulemdTests/defaults.py000066400000000000000000000115321502446517500276650ustar00rootroot00000000000000#!/usr/bin/python3 # This file is part of libmodulemd # Copyright (C) 2018 Red Hat, Inc. # # Fedora-License-Identifier: MIT # SPDX-2.0-License-Identifier: MIT # SPDX-3.0-License-Identifier: MIT # # This program is free software. # For more information on the license, see COPYING. # For more information on free software, see # . import os import sys try: import unittest import gi gi.require_version("Modulemd", "2.0") from gi.repository import Modulemd except ImportError: # Return error 77 to skip this test on platforms without the necessary # python modules sys.exit(77) from base import TestBase class TestDefaults(TestBase): def test_constructors(self): # Test that the new() function works defs = Modulemd.Defaults.new(Modulemd.DefaultsVersionEnum.ONE, "foo") assert defs assert defs.props.mdversion == Modulemd.DefaultsVersionEnum.ONE assert defs.get_mdversion() == Modulemd.DefaultsVersionEnum.ONE assert defs.props.module_name == "foo" assert defs.get_module_name() == "foo" # Test that we cannot instantiate directly with self.assertRaisesRegex( TypeError, "cannot create instance of abstract" ): Modulemd.Defaults() # Test with a zero mdversion with self.assertRaisesRegex(TypeError, "constructor returned NULL"): with self.expect_signal(): defs = Modulemd.Defaults.new(0, "foo") # Test with an unknown mdversion with self.assertRaisesRegex(TypeError, "constructor returned NULL"): with self.expect_signal(): defs = Modulemd.Defaults.new( Modulemd.DefaultsVersionEnum.LATEST + 1, "foo" ) # Test with no name with self.assertRaisesRegex( TypeError, "does not allow None as a value" ): defs = Modulemd.Defaults.new( Modulemd.DefaultsVersionEnum.ONE, None ) def test_copy(self): defs = Modulemd.Defaults.new(Modulemd.DefaultsVersionEnum.ONE, "foo") assert defs copied_defs = defs.copy() assert copied_defs assert copied_defs.props.mdversion == defs.props.mdversion assert copied_defs.props.module_name == defs.props.module_name def test_mdversion(self): defs = Modulemd.Defaults.new( Modulemd.DefaultsVersionEnum.LATEST, "foo" ) assert defs assert defs.props.mdversion == Modulemd.DefaultsVersionEnum.ONE assert defs.get_mdversion() == Modulemd.DefaultsVersionEnum.ONE # Ensure we cannot set the mdversion with self.assertRaisesRegex(TypeError, "is not writable"): defs.props.mdversion = 0 def test_module_name(self): defs = Modulemd.Defaults.new( Modulemd.DefaultsVersionEnum.LATEST, "foo" ) assert defs assert defs.props.module_name == "foo" assert defs.get_module_name() == "foo" # Ensure we cannot set the module_name with self.expect_signal(): defs.props.module_name = None def test_modified(self): defs = Modulemd.Defaults.new( Modulemd.DefaultsVersionEnum.LATEST, "foo" ) self.assertIsNotNone(defs) self.assertEqual(defs.get_modified(), 0) defs.set_modified(201901110830) self.assertEqual(defs.get_modified(), 201901110830) # Load a defaults object into an Index index = Modulemd.ModuleIndex.new() index.update_from_file( "%s/yaml_specs/modulemd_defaults_v1.yaml" % (os.getenv("MESON_SOURCE_ROOT")), True, ) module_names = index.get_module_names() self.assertEqual(len(module_names), 1) defs = index.get_module(index.get_module_names()[0]).get_defaults() self.assertIsNotNone(defs) self.assertEqual(defs.get_modified(), 201812071200) def test_validate(self): defs = Modulemd.Defaults.new( Modulemd.DefaultsVersionEnum.LATEST, "foo" ) assert defs assert defs.validate() def test_upgrade(self): defs = Modulemd.Defaults.new(Modulemd.DefaultsVersionEnum.ONE, "foo") assert defs # test upgrading to the same version upgraded_defs = defs.upgrade(Modulemd.DefaultsVersionEnum.ONE) assert upgraded_defs assert defs.props.mdversion == Modulemd.DefaultsVersionEnum.ONE assert defs.props.module_name == "foo" # test upgrading to the latest version upgraded_defs = defs.upgrade(Modulemd.DefaultsVersionEnum.LATEST) assert upgraded_defs assert defs.props.mdversion == Modulemd.DefaultsVersionEnum.LATEST assert defs.props.module_name == "foo" if __name__ == "__main__": unittest.main() fedora-modularity-libmodulemd-357799c/modulemd/tests/ModulemdTests/defaultsv1.py000066400000000000000000000072461502446517500301430ustar00rootroot00000000000000#!/usr/bin/python3 # This file is part of libmodulemd # Copyright (C) 2018 Red Hat, Inc. # # Fedora-License-Identifier: MIT # SPDX-2.0-License-Identifier: MIT # SPDX-3.0-License-Identifier: MIT # # This program is free software. # For more information on the license, see COPYING. # For more information on free software, see # . import sys try: import unittest import gi gi.require_version("Modulemd", "2.0") from gi.repository import Modulemd except ImportError: # Return error 77 to skip this test on platforms without the necessary # python modules sys.exit(77) from base import TestBase class TestDefaults(TestBase): def test_constructors(self): # Test that the new() function works defs = Modulemd.DefaultsV1.new("foo") assert defs assert defs.props.mdversion == Modulemd.DefaultsVersionEnum.ONE assert defs.get_mdversion() == Modulemd.DefaultsVersionEnum.ONE assert defs.props.module_name == "foo" assert defs.get_module_name() == "foo" # Test gobject instantiation defs = Modulemd.DefaultsV1(module_name="foo") assert defs assert defs.props.mdversion == Modulemd.DefaultsVersionEnum.ONE assert defs.get_mdversion() == Modulemd.DefaultsVersionEnum.ONE assert defs.props.module_name == "foo" assert defs.get_module_name() == "foo" # Test with no name with self.assertRaisesRegex( TypeError, "does not allow None as a value" ): defs = Modulemd.DefaultsV1.new(None) def test_copy(self): defs = Modulemd.DefaultsV1.new("foo") assert defs copied_defs = defs.copy() assert copied_defs assert copied_defs.props.mdversion == defs.props.mdversion assert copied_defs.props.module_name == defs.props.module_name # Add some actual intents and streams and compare the copy defs.set_default_stream("latest") defs.set_default_stream("latest", "server_intent") copied_defs = defs.copy() assert copied_defs assert copied_defs.props.mdversion == defs.props.mdversion assert copied_defs.props.module_name == defs.props.module_name assert copied_defs.get_default_stream() == defs.get_default_stream() assert copied_defs.get_default_stream( "server_intent" ) == defs.get_default_stream("server_intent") def test_get_set_default_stream(self): defs = Modulemd.DefaultsV1.new("foo") assert defs defs.set_default_stream("latest") assert defs.get_default_stream() == "latest" defs.set_default_stream("experimental", "workstation_intent") assert defs.get_default_stream("workstation_intent") == "experimental" defs.set_default_stream(None) assert defs.get_default_stream() is None defs.set_default_stream(None, "minimal_intent") assert defs.get_default_stream("minimal_intent") is None def test_get_set_profiles(self): defs = Modulemd.DefaultsV1.new("foo") defs.add_default_profile_for_stream("latest", "client") defs.add_default_profile_for_stream("latest", "server") defs.add_default_profile_for_stream( "latest", "server", "server_intent" ) assert "client" in defs.get_default_profiles_for_stream("latest") assert "client" in defs.get_default_profiles_for_stream("latest") def test_validate(self): defs = Modulemd.Defaults.new( Modulemd.DefaultsVersionEnum.LATEST, "foo" ) assert defs assert defs.validate() if __name__ == "__main__": unittest.main() fedora-modularity-libmodulemd-357799c/modulemd/tests/ModulemdTests/dependencies.py000066400000000000000000000054401502446517500305050ustar00rootroot00000000000000#!/usr/bin/python3 # This file is part of libmodulemd # Copyright (C) 2018 Red Hat, Inc. # # Fedora-License-Identifier: MIT # SPDX-2.0-License-Identifier: MIT # SPDX-3.0-License-Identifier: MIT # # This program is free software. # For more information on the license, see COPYING. # For more information on free software, see # . import sys try: import unittest import gi gi.require_version("Modulemd", "2.0") from gi.repository import Modulemd except ImportError: # Return error 77 to skip this test on platforms without the necessary # python modules sys.exit(77) from base import TestBase class TestDependencies(TestBase): def test_constructor(self): # Test that the new() function works d = Modulemd.Dependencies.new() assert d assert d.get_buildtime_modules() == [] with self.expect_signal(only_on_fatal_warnings=True): d.get_buildtime_streams("foobar123") assert d.get_runtime_modules() == [] with self.expect_signal(only_on_fatal_warnings=True): d.get_runtime_streams("foobar123") # Test that keyword name is accepted d = Modulemd.Dependencies() assert d assert d.get_buildtime_modules() == [] with self.expect_signal(only_on_fatal_warnings=True): d.get_buildtime_streams("foobar123") assert d.get_runtime_modules() == [] with self.expect_signal(only_on_fatal_warnings=True): d.get_runtime_streams("foobar123") def test_copy(self): d_orig = Modulemd.Dependencies() d = d_orig.copy() assert d assert d.get_buildtime_modules() == [] with self.expect_signal(only_on_fatal_warnings=True): d.get_buildtime_streams("foobar123") assert d.get_runtime_modules() == [] with self.expect_signal(only_on_fatal_warnings=True): d.get_runtime_streams("foobar123") d_orig.add_buildtime_stream("buildmod1", "stream2") d_orig.add_buildtime_stream("buildmod1", "stream1") d_orig.set_empty_buildtime_dependencies_for_module("builddef") d_orig.add_runtime_stream("runmod1", "stream3") d_orig.add_runtime_stream("runmod1", "stream4") d_orig.set_empty_runtime_dependencies_for_module("rundef") d = d_orig.copy() assert d assert d.get_buildtime_modules() == ["builddef", "buildmod1"] assert d.get_buildtime_streams("builddef") == [] assert d.get_buildtime_streams("buildmod1") == ["stream1", "stream2"] assert d.get_runtime_modules() == ["rundef", "runmod1"] assert d.get_runtime_streams("rundef") == [] assert d.get_runtime_streams("runmod1") == ["stream3", "stream4"] if __name__ == "__main__": unittest.main() fedora-modularity-libmodulemd-357799c/modulemd/tests/ModulemdTests/merger.py000066400000000000000000000415521502446517500273440ustar00rootroot00000000000000#!/usr/bin/python3 # This file is part of libmodulemd # Copyright (C) 2017-2018 Stephen Gallagher # # Fedora-License-Identifier: MIT # SPDX-2.0-License-Identifier: MIT # SPDX-3.0-License-Identifier: MIT # # This program is free software. # For more information on the license, see COPYING. # For more information on free software, see # . from os import path import sys import logging try: import unittest import gi gi.require_version("Modulemd", "2.0") from gi.repository import Modulemd from gi.repository import GLib except ImportError: # Return error 77 to skip this test on platforms without the necessary # python modules sys.exit(77) from base import TestBase import random class TestModuleIndexMerger(TestBase): def test_constructors(self): merger = Modulemd.ModuleIndexMerger() self.assertIsNotNone(merger) merger = Modulemd.ModuleIndexMerger.new() self.assertIsNotNone(merger) def test_deduplicate(self): merger = Modulemd.ModuleIndexMerger() idx1 = Modulemd.ModuleIndex() idx2 = Modulemd.ModuleIndex() res, failures = idx1.update_from_file( path.join(self.test_data_path, "long-valid.yaml"), True ) self.assertTrue(res) self.assertEqual(len(failures), 0) res, failures = idx2.update_from_file( path.join(self.test_data_path, "long-valid.yaml"), True ) self.assertTrue(res) self.assertEqual(len(failures), 0) # Save the original document for comparing later baseline = idx1.dump_to_string() # Add the same index twice merger.associate_index(idx1, 0) merger.associate_index(idx2, 0) deduplicated_idx = merger.resolve() final = deduplicated_idx.dump_to_string() # Verify that it outputs the same content as the baseline self.assertEqual(baseline, final) def test_merger(self): # Get a set of objects in a ModuleIndex base_index = Modulemd.ModuleIndex() base_index.update_from_file( path.join(self.test_data_path, "merging-base.yaml"), True ) # Baseline httpd_defaults = base_index.get_module("httpd").get_defaults() self.assertIsNotNone(httpd_defaults) self.assertEqual(httpd_defaults.get_default_stream(), "2.2") httpd_profile_streams = ( httpd_defaults.get_streams_with_default_profiles() ) self.assertEqual(len(httpd_profile_streams), 2) self.assertTrue("2.2" in httpd_profile_streams) self.assertTrue("2.8" in httpd_profile_streams) self.assertEqual( len(httpd_defaults.get_default_profiles_for_stream("2.2")), 2 ) self.assertTrue( "client" in httpd_defaults.get_default_profiles_for_stream("2.2") ) self.assertTrue( "server" in httpd_defaults.get_default_profiles_for_stream("2.2") ) self.assertTrue( "notreal" in httpd_defaults.get_default_profiles_for_stream("2.8") ) self.assertEqual( httpd_defaults.get_default_stream("workstation"), "2.4" ) httpd_profile_streams = ( httpd_defaults.get_streams_with_default_profiles("workstation") ) self.assertEqual(len(httpd_profile_streams), 2) self.assertTrue("2.4" in httpd_profile_streams) self.assertTrue("2.6" in httpd_profile_streams) self.assertEqual( len( httpd_defaults.get_default_profiles_for_stream( "2.4", "workstation" ) ), 1, ) self.assertEqual( len( httpd_defaults.get_default_profiles_for_stream( "2.6", "workstation" ) ), 3, ) # Get another set of objects that will override the default stream for # nodejs override_nodejs_index = Modulemd.ModuleIndex() override_nodejs_index.update_from_file( path.join(self.test_data_path, "overriding-nodejs.yaml"), True ) # Test that adding both of these at the same priority level results in # the no default stream merger = Modulemd.ModuleIndexMerger() merger.associate_index(base_index, 0) merger.associate_index(override_nodejs_index, 0) merged_index = merger.resolve() self.assertIsNotNone(merged_index) nodejs = merged_index.get_module("nodejs") self.assertIsNotNone(nodejs) nodejs_defaults = nodejs.get_defaults() self.assertIsNotNone(nodejs_defaults) self.assertIsNone(nodejs_defaults.get_default_stream()) # Get another set of objects that will override the above override_index = Modulemd.ModuleIndex() override_index.update_from_file( path.join(self.test_data_path, "overriding.yaml"), True ) # Test that override_index at a higher priority level succeeds # Test that adding both of these at the same priority level fails # with a merge conflict. # Use randomly-selected high and low values to make sure we don't have # sorting issues. merger = Modulemd.ModuleIndexMerger() random_low = random.randint(1, 100) random_high = random.randint(101, 999) print( "Low priority: %d, High priority: %d" % (random_low, random_high) ) merger.associate_index(base_index, random_low) merger.associate_index(override_index, random_high) merged_index = merger.resolve() self.assertIsNotNone(merged_index) # Validate merged results # HTTPD httpd_defaults = merged_index.get_module("httpd").get_defaults() self.assertIsNotNone(httpd_defaults) self.assertEqual(httpd_defaults.get_default_stream(), "2.4") httpd_profile_streams = ( httpd_defaults.get_streams_with_default_profiles() ) self.assertEqual(len(httpd_profile_streams), 2) self.assertTrue("2.2" in httpd_profile_streams) self.assertTrue("2.4" in httpd_profile_streams) self.assertEqual( len(httpd_defaults.get_default_profiles_for_stream("2.2")), 2 ) self.assertTrue( "client" in httpd_defaults.get_default_profiles_for_stream("2.2") ) self.assertTrue( "server" in httpd_defaults.get_default_profiles_for_stream("2.2") ) self.assertTrue( "client" in httpd_defaults.get_default_profiles_for_stream("2.4") ) self.assertTrue( "server" in httpd_defaults.get_default_profiles_for_stream("2.4") ) self.assertEqual( httpd_defaults.get_default_stream("workstation"), "2.8" ) httpd_profile_streams = ( httpd_defaults.get_streams_with_default_profiles("workstation") ) self.assertEqual(len(httpd_profile_streams), 3) self.assertTrue("2.4" in httpd_profile_streams) self.assertTrue("2.6" in httpd_profile_streams) self.assertTrue("2.8" in httpd_profile_streams) self.assertEqual( len( httpd_defaults.get_default_profiles_for_stream( "2.4", "workstation" ) ), 1, ) self.assertEqual( len( httpd_defaults.get_default_profiles_for_stream( "2.6", "workstation" ) ), 3, ) self.assertEqual( len( httpd_defaults.get_default_profiles_for_stream( "2.8", "workstation" ) ), 4, ) def test_merger_with_real_world_data(self): fedora_index = Modulemd.ModuleIndex() fedora_index.update_from_file( path.join(self.test_data_path, "f29.yaml"), True ) updates_index = Modulemd.ModuleIndex() updates_index.update_from_file( path.join(self.test_data_path, "f29-updates.yaml"), True ) merger = Modulemd.ModuleIndexMerger() merger.associate_index(fedora_index, 0) merger.associate_index(updates_index, 0) merged_index = merger.resolve() self.assertIsNotNone(merged_index) def test_merger_with_modified(self): pass def test_strict_default_streams(self): merger = Modulemd.ModuleIndexMerger.new() for stream in ("27", "38"): default = """ --- document: modulemd-defaults version: 1 data: module: python stream: %s ... """ % ( stream ) index = Modulemd.ModuleIndex() index.update_from_string(default, strict=True) merger.associate_index(index, 0) with self.assertRaisesRegex( gi.repository.GLib.GError, "Default stream mismatch in module python", ): merger.resolve_ext(True) def test_merge_add_only(self): base_idx = Modulemd.ModuleIndex() self.assertTrue( base_idx.update_from_file( path.join(self.test_data_path, "merger", "base.yaml"), True ) ) add_only_idx = Modulemd.ModuleIndex() self.assertTrue( add_only_idx.update_from_file( path.join(self.test_data_path, "merger", "add_only.yaml"), True ) ) merger = Modulemd.ModuleIndexMerger() merger.associate_index(base_idx, 0) merger.associate_index(add_only_idx, 0) merged_idx = merger.resolve() self.assertIsNotNone(merged_idx) httpd = merged_idx.get_module("httpd") self.assertIsNotNone(httpd) httpd_defs = httpd.get_defaults() self.assertEqual(httpd_defs.get_default_stream(), "2.8") expected_profile_defs = { "2.2": set(["client", "server"]), "2.8": set(["notreal"]), "2.10": set(["notreal"]), } for stream in expected_profile_defs.keys(): self.assertEqual( set(httpd_defs.get_default_profiles_for_stream(stream)), expected_profile_defs[stream], ) self.assertEqual(httpd_defs.get_default_stream("workstation"), "2.4") def test_merge_add_conflicting_stream(self): base_idx = Modulemd.ModuleIndex() self.assertTrue( base_idx.update_from_file( path.join(self.test_data_path, "merger", "base.yaml"), True ) ) add_only_idx = Modulemd.ModuleIndex() self.assertTrue( add_only_idx.update_from_file( path.join( self.test_data_path, "merger", "add_conflicting_stream.yaml", ), True, ) ) merger = Modulemd.ModuleIndexMerger() merger.associate_index(base_idx, 0) merger.associate_index(add_only_idx, 0) merged_idx = merger.resolve() self.assertIsNotNone(merged_idx) psql = merged_idx.get_module("postgresql") self.assertIsNotNone(psql) psql_defs = psql.get_defaults() self.assertIsNotNone(psql_defs) self.assertIsNone(psql_defs.get_default_stream()) expected_profile_defs = { "8.1": set(["client", "server", "foo"]), "8.2": set(["client", "server", "foo"]), } for stream in expected_profile_defs.keys(): self.assertEqual( set(psql_defs.get_default_profiles_for_stream(stream)), expected_profile_defs[stream], ) def test_merge_add_conflicting_stream_and_profile_modified(self): base_idx = Modulemd.ModuleIndex() self.assertTrue( base_idx.update_from_file( path.join(self.test_data_path, "merger", "base.yaml"), True ) ) add_conflicting_idx = Modulemd.ModuleIndex() self.assertTrue( add_conflicting_idx.update_from_file( path.join( self.test_data_path, "merger", "add_conflicting_stream_and_profile_modified.yaml", ), True, ) ) merger = Modulemd.ModuleIndexMerger() merger.associate_index(base_idx, 0) merger.associate_index(add_conflicting_idx, 0) merged_idx = merger.resolve() self.assertIsNotNone(merged_idx) psql = merged_idx.get_module("postgresql") self.assertIsNotNone(psql) psql_defs = psql.get_defaults() self.assertIsNotNone(psql_defs) self.assertEqual(psql_defs.get_default_stream(), "8.2") expected_profile_defs = { "8.1": set(["client", "server"]), "8.2": set(["client", "server", "foo"]), "8.3": set(["client", "server"]), } for stream in expected_profile_defs: self.assertEqual( set(psql_defs.get_default_profiles_for_stream(stream)), expected_profile_defs[stream], ) def test_merge_incompatible_streams(self): # This test verifies that if we encounter two streams with the same # NSVCA, but different content, we only retain one of them. # Note: the specification of the merger states that the behavior is # undefined, so we will only validate that the merge completes and # it only contains a single stream merger = Modulemd.ModuleIndexMerger.new() base_idx = Modulemd.ModuleIndex() self.assertTrue( base_idx.update_from_file( path.join(self.test_data_path, "merger", "conflict_base.yaml"), True, ) ) merger.associate_index(base_idx, 0) bad_idx = Modulemd.ModuleIndex() self.assertTrue( bad_idx.update_from_file( path.join(self.test_data_path, "merger", "conflict_base.yaml"), True, ) ) # Modify the stream to have a different summary stream = bad_idx.search_streams_by_nsvca_glob()[0] stream.set_summary("Invalid summary, should not merge successfully") merger.associate_index(bad_idx, 0) merged_idx = merger.resolve() all_streams = merged_idx.search_streams_by_nsvca_glob() self.assertEqual(len(all_streams), 1) self.assertEqual(all_streams[0].props.module_name, "nodejs") def test_merge_order_independent_obsoletes(self): # This test verifies that if we encounter two obsoletes with the same # module, stream and context we associate the newer one with exisitng # stream idx = Modulemd.ModuleIndex.new() stream = Modulemd.ModuleStream.new(2, "nodejs", "8.0") stream.props.context = "42" res = idx.add_module_stream(stream) newer_idx = Modulemd.ModuleIndex() self.assertTrue( newer_idx.update_from_file( path.join( self.test_data_path, "merger", "newer_obsoletes_resseted.yaml", ), True, ) ) base_idx = Modulemd.ModuleIndex() self.assertTrue( base_idx.update_from_file( path.join( self.test_data_path, "merger", "base_obsoletes.yaml" ), True, ) ) merger = Modulemd.ModuleIndexMerger.new() merger.associate_index(idx, 0) merger.associate_index(newer_idx, 0) merger.associate_index(base_idx, 0) merged_idx = merger.resolve() module = merged_idx.get_module("nodejs") self.assertEqual(len(module.get_obsoletes()), 2) all_streams = merged_idx.search_streams_by_nsvca_glob() self.assertEqual(len(all_streams), 1) self.assertEqual(all_streams[0].props.module_name, "nodejs") obsoletes = all_streams[0].get_obsoletes_resolved() # obsoletes is None because it has reset: true self.assertEqual(obsoletes, None) # Merge the indexes in reverse order merger = Modulemd.ModuleIndexMerger.new() merger.associate_index(idx, 0) merger.associate_index(base_idx, 0) merger.associate_index(newer_idx, 0) merged_idx = merger.resolve() module = merged_idx.get_module("nodejs") self.assertEqual(len(module.get_obsoletes()), 2) all_streams = merged_idx.search_streams_by_nsvca_glob() self.assertEqual(len(all_streams), 1) self.assertEqual(all_streams[0].props.module_name, "nodejs") obsoletes = all_streams[0].get_obsoletes_resolved() # obsoletes is None because it has reset: true self.assertEqual(obsoletes, None) if __name__ == "__main__": unittest.main() fedora-modularity-libmodulemd-357799c/modulemd/tests/ModulemdTests/module.py000066400000000000000000000063461502446517500273520ustar00rootroot00000000000000#!/usr/bin/python3 # This file is part of libmodulemd # Copyright (C) 2017-2018 Stephen Gallagher # # Fedora-License-Identifier: MIT # SPDX-2.0-License-Identifier: MIT # SPDX-3.0-License-Identifier: MIT # # This program is free software. # For more information on the license, see COPYING. # For more information on free software, see # . from os import path import sys try: import unittest import gi gi.require_version("Modulemd", "2.0") from gi.repository import Modulemd from gi.repository.Modulemd import ModuleIndex from gi.repository import GLib except ImportError: # Return error 77 to skip this test on platforms without the necessary # python modules sys.exit(77) from base import TestBase class TestModule(TestBase): def test_search_streams(self): idx = Modulemd.ModuleIndex.new() idx.update_from_file(path.join(self.test_data_path, "f29.yaml"), True) module = idx.get_module("nodejs") self.assertEqual(len(module.search_streams("8", 0)), 1) self.assertEqual(len(module.search_streams("10", 0)), 1) def test_copy_with_obsoletes(self): idx = Modulemd.ModuleIndex.new() e = Modulemd.Obsoletes.new(1, 2, "testmodule", "teststream", "testmsg") e.set_obsoleted_by("module_obsoleter", "stream_obsoleter") idx.add_obsoletes(e) m = idx.get_module("testmodule") assert m assert m.get_module_name() == "testmodule" obsoletes_from_orig = m.get_newest_active_obsoletes("teststream", None) assert ( obsoletes_from_orig.get_obsoleted_by_module_name() == "module_obsoleter" ) m_copy = m.copy() assert m_copy.get_module_name() == "testmodule" obsoletes_from_copy = m_copy.get_newest_active_obsoletes( "teststream", None ) assert ( obsoletes_from_copy.get_obsoleted_by_module_name() == "module_obsoleter" ) def test_adding_obsoletes_is_order_independent(self): obsoletes_without_context = """ --- document: modulemd-obsoletes version: 1 data: module: nodejs stream: 10 context: deadbeef modified: 2019-07-27T00:00Z message: test message obsoleted_by: module: nodejs stream: 12 ... """ obsoletes_with_context = """ --- document: modulemd-obsoletes version: 1 data: module: nodejs stream: 10 modified: 2019-09-27T00:00Z message: test message obsoleted_by: module: nodejs stream: 14 ... """ for ordered_yaml in [ obsoletes_without_context + obsoletes_with_context, obsoletes_with_context + obsoletes_without_context, ]: idx = ModuleIndex.new() stream = Modulemd.ModuleStream.new(2, "nodejs", "10") stream.props.context = "deadbeef" res = idx.add_module_stream(stream) res, failures = idx.update_from_string(ordered_yaml, True) m = idx.get_module("nodejs") streams = m.get_all_streams() s = streams[0] assert ( s.get_obsoletes_resolved().get_obsoleted_by_module_stream() == "14" ) if __name__ == "__main__": unittest.main() fedora-modularity-libmodulemd-357799c/modulemd/tests/ModulemdTests/moduleindex.py000066400000000000000000000230561502446517500303770ustar00rootroot00000000000000#!/usr/bin/python3 # This file is part of libmodulemd # Copyright (C) 2017-2018 Stephen Gallagher # # Fedora-License-Identifier: MIT # SPDX-2.0-License-Identifier: MIT # SPDX-3.0-License-Identifier: MIT # # This program is free software. # For more information on the license, see COPYING. # For more information on free software, see # . from os import path import sys try: import unittest import gi gi.require_version("Modulemd", "2.0") from gi.repository import Modulemd from gi.repository.Modulemd import ModuleIndex from gi.repository import GLib except ImportError: # Return error 77 to skip this test on platforms without the necessary # python modules sys.exit(77) from base import TestBase def debug_dump_failures(failures): if failures is None or len(failures) == 0: return print("{} YAML subdocuments were invalid".format(len(failures))) for f in failures: print( "Failed subdocument ({}):\n{}\n".format( str(f.get_gerror()), f.get_yaml() ) ) class TestModuleIndex(TestBase): def test_constructors(self): # Test that the new() function works idx = ModuleIndex.new() self.assertIsNotNone(idx) self.assertListEqual(idx.get_module_names(), []) self.assertIsNone(idx.get_module("foo")) def test_read(self): idx = ModuleIndex.new() with open( path.join(self.source_root, "yaml_specs/modulemd_stream_v1.yaml"), "r", ) as v1: res, failures = idx.update_from_string(v1.read(), True) debug_dump_failures(failures) self.assertListEqual(failures, []) self.assertTrue(res) for fname in [ "yaml_specs/modulemd_stream_v2.yaml", "yaml_specs/modulemd_translations_v1.yaml", "yaml_specs/modulemd_defaults_v1.yaml", ]: res, failures = idx.update_from_file( path.join(self.source_root, fname), True ) debug_dump_failures(failures) self.assertListEqual(failures, []) self.assertTrue(res) res, failures = idx.update_from_file( path.join(self.test_data_path, "te.yaml"), True ) self.assertFalse(res) self.assertEqual(len(failures), 1) self.assertIn( "No document type specified", str(failures[0].get_gerror()) ) self.assertMultiLineEqual( failures[0].get_yaml(), """--- summary: An example module description: An example module. profiles: profile_a: An example profile ... """, ) self.assertListEqual(idx.get_module_names(), ["foo"]) mod_foo = idx.get_module("foo") self.assertTrue(mod_foo.validate()) self.assertEqual(mod_foo.get_module_name(), "foo") with self.assertRaisesRegex( gi.repository.GLib.GError, "No streams matched" ): mod_foo.get_stream_by_NSVCA("a", 5, "c") self.assertEqual(len(mod_foo.get_all_streams()), 2) self.assertIsNotNone(mod_foo.get_defaults()) defaults = mod_foo.get_defaults() self.assertIsNotNone(defaults) self.assertEqual(defaults.get_default_stream(), "x.y") stream = mod_foo.get_stream_by_NSVCA( "latest", 20160927144203, "c0ffee43" ) self.assertIsNotNone(stream) self.assertEqual( stream.get_nsvc(), "foo:latest:20160927144203:c0ffee43" ) self.assertEqual( stream.get_description(None), "A module for the demonstration of the metadata format. Also, the " "obligatory lorem ipsum dolor sit amet goes right here.", ) self.assertEqual( stream.get_description("C"), "A module for the demonstration of the metadata format. Also, the " "obligatory lorem ipsum dolor sit amet goes right here.", ) self.assertEqual(stream.get_description("en_GB"), "An example module.") def test_get_default_streams(self): idx = Modulemd.ModuleIndex.new() idx.update_from_file(path.join(self.test_data_path, "f29.yaml"), True) default_streams = idx.get_default_streams() self.assertIsNotNone(default_streams) self.assertIn("dwm", default_streams.keys()) self.assertEqual("6.1", default_streams["dwm"]) self.assertIn("stratis", default_streams.keys()) self.assertEqual("1", default_streams["stratis"]) self.assertNotIn("nodejs", default_streams.keys()) def test_dump_empty_index(self): idx = Modulemd.ModuleIndex.new() with self.assertRaisesRegex( gi.repository.GLib.GError, "Index contains no modules." ): yaml = idx.dump_to_string() self.assertIsNone(yaml) def test_update_from_defaults_directory(self): idx = Modulemd.ModuleIndex.new() self.assertIsNotNone(idx) # First, verify that it works without overrides ret = idx.update_from_defaults_directory( path=path.join(self.test_data_path, "defaults"), strict=True ) self.assertTrue(ret) # There should be three modules here: meson, ninja and nodejs self.assertEqual(len(idx.get_module_names()), 3) self.assertIn("meson", idx.get_module_names()) self.assertIn("ninja", idx.get_module_names()) self.assertIn("nodejs", idx.get_module_names()) # Check default streams defs = idx.get_default_streams() self.assertIn("meson", defs) self.assertEqual("latest", defs["meson"]) self.assertIn("ninja", defs) self.assertEqual("latest", defs["ninja"]) self.assertNotIn("nodejs", defs) # Now add overrides too # First, verify that it works without overrides ret = idx.update_from_defaults_directory( path=path.join(self.test_data_path, "defaults"), overrides_path=path.join( self.test_data_path, "defaults", "overrides" ), strict=True, ) self.assertTrue(ret) # There should be four modules here: meson, ninja, nodejs and # testmodule self.assertEqual(len(idx.get_module_names()), 4) self.assertIn("meson", idx.get_module_names()) self.assertIn("ninja", idx.get_module_names()) self.assertIn("nodejs", idx.get_module_names()) self.assertIn("testmodule", idx.get_module_names()) # Check default streams defs = idx.get_default_streams() self.assertIn("meson", defs) self.assertEqual("latest", defs["meson"]) self.assertIn("ninja", defs) self.assertEqual("latest", defs["ninja"]) self.assertIn("nodejs", defs) self.assertEqual("12", defs["nodejs"]) self.assertIn("testmodule", defs) self.assertIn("teststream", defs["testmodule"]) # Nonexistent defaults dir with self.assertRaisesRegex(GLib.Error, "No such file or directory"): ret = idx.update_from_defaults_directory( path=path.join(self.test_data_path, "defaults_nonexistent"), strict=True, ) self.assertFalse(ret) # Nonexistent override dir with self.assertRaisesRegex(GLib.Error, "No such file or directory"): ret = idx.update_from_defaults_directory( path=path.join(self.test_data_path, "defaults"), overrides_path="overrides_nonexistent", strict=True, ) self.assertFalse(ret) def test_clear_xmds(self): if "_overrides_module" in dir(Modulemd) and hasattr( gi.overrides.Modulemd, "ModuleStreamV2" ): idx = Modulemd.ModuleIndex.new() self.assertIsNotNone(idx) ret, failures = idx.update_from_string( """ --- document: modulemd version: 2 data: name: foo stream: latest version: 1 static_context: true context: c0ffee43 arch: s390x summary: An example module description: A longer description license: module: MIT xmd: a_key: a_value another_key: another_value an_array: - a - b ... --- document: modulemd version: 2 data: name: foo stream: latest version: 2 static_context: true context: c0ffee43 arch: s390x summary: An example module description: A longer description license: module: MIT xmd: a_key: a_value another_key: another_value an_array: - a - b ... """, strict=True, ) self.assertEqual(len(failures), 0) module_names = idx.get_module_names() self.assertEqual(len(module_names), 1) self.assertEqual(module_names[0], "foo") module = idx.get_module(module_names[0]) self.assertEqual(len(module.get_all_streams()), 2) ref_xmd = { "a_key": "a_value", "another_key": "another_value", "an_array": ["a", "b"], } for stream in module.get_all_streams(): # Verify that the XMD data is present. xmd = stream.get_xmd() self.assertEqual(xmd, ref_xmd) idx.clear_xmds() for stream in module.get_all_streams(): # Verify that the XMD data is gone now. self.assertEqual(stream.get_xmd(), {}) if __name__ == "__main__": unittest.main() fedora-modularity-libmodulemd-357799c/modulemd/tests/ModulemdTests/modulepackager.py000066400000000000000000000150341502446517500310420ustar00rootroot00000000000000import json import logging import os import sys try: import unittest import gi gi.require_version("Modulemd", "2.0") from gi.repository import GLib from gi.repository import Modulemd except ImportError: # Return error 77 to skip this test on platforms without the necessary # python modules sys.exit(77) from copy import deepcopy from base import TestBase logging.basicConfig(level=logging.DEBUG) class TestModulemdPackager(TestBase): def test_sanity(self): # Validate that the specification parses correctly stream = Modulemd.ModuleStream.read_file( os.path.join( self.source_root, "yaml_specs/modulemd_packager_v2.yaml" ), True, ) self.assertIsNotNone(stream) # Once read in, a modulemd-packager document is a ModuleStream of the # same version. self.assertIs(type(stream), Modulemd.ModuleStreamV2) def test_read_minimal(self): minimal_valid = """--- document: modulemd-packager version: 2 data: summary: A minimal valid module description: A minimalistic module description license: module: - DUMMY ... """ stream = Modulemd.ModuleStream.read_string(minimal_valid, True) self.assertIsNotNone(stream) # Once read in, a modulemd-packager document is a ModuleStream of the # same version. self.assertIs(type(stream), Modulemd.ModuleStreamV2) def test_read_extra_values(self): minimal_valid = { "document": "modulemd-packager", "version": 2, "data": { "summary": "A minimal valid module", "description": "A minimalistic module description", "license": {"module": ["DUMMY1", "DUMMY2"]}, }, } extra_attrs = [ "name", "stream", "context", "arch", "servicelevels", "xmd", "buildopts", "artifacts", ] for attr in extra_attrs: minimal_plus_extra = deepcopy(minimal_valid) # We can just pretend they're all scalars, because the parser will # halt before it tries to validate the value. minimal_plus_extra["data"][attr] = "invalid key" logging.debug( "YAML: {}".format(json.dumps(minimal_plus_extra, indent=2)) ) # This code takes advantage of the fact that JSON is a proper # subset of YAML, so we can avoid requiring pyYAML for the # tests. with self.assertRaises(gi.repository.GLib.GError) as cm: stream = Modulemd.ModuleStream.read_string( json.dumps(minimal_plus_extra), True ) gerror = cm.exception self.assertTrue( gerror.matches( domain=Modulemd.yaml_error_quark(), code=Modulemd.YamlError.UNKNOWN_ATTR, ) ) # Handle license.content as a special case since it's not directly # under `data`. minimal_plus_extra = deepcopy(minimal_valid) minimal_plus_extra["data"]["license"]["content"] = "invalid key" logging.debug( "YAML: {}".format(json.dumps(minimal_plus_extra, indent=2)) ) # This code takes advantage of the fact that JSON is a proper # subset of YAML, so we can avoid requiring pyYAML for the tests. with self.assertRaises(gi.repository.GLib.GError) as cm: stream = Modulemd.ModuleStream.read_string( json.dumps(minimal_plus_extra), True ) gerror = cm.exception self.assertTrue( gerror.matches( domain=Modulemd.yaml_error_quark(), code=Modulemd.YamlError.UNKNOWN_ATTR, ) ) def test_fail_v1(self): minimal_v1 = { "document": "modulemd-packager", "version": 1, "data": { "summary": "A minimal valid module", "description": "A minimalistic module description", "license": {"module": ["DUMMY1", "DUMMY2"]}, }, } with self.assertRaises(gi.repository.GLib.Error) as cm: stream = Modulemd.ModuleStream.read_string( json.dumps(minimal_v1), True ) gerror = cm.exception self.assertTrue( gerror.matches( domain=Modulemd.yaml_error_quark(), code=Modulemd.YamlError.INCONSISTENT, ) ) def test_v3_xmd(self): # We have a chicken-egg problem with overrides, since they can only # be tested if they are already installed. This means they need to # be run in the CI. In order to avoid changes to these tests or the # overrides breaking things, we'll skip them if the appropriate # override is not installed. if "_overrides_module" in dir(Modulemd) and hasattr( gi.overrides.Modulemd, "PackagerV3" ): # The XMD python tests can only be run against the installed lib # because the overrides that translate between python and GVariant # must be installed in /usr/lib/python*/site-packages/gi/overrides # or they are not included when importing Modulemd packager = Modulemd.PackagerV3.new() # An empty dictionary should be returned if no xmd value is set self.assertEqual(packager.get_xmd(), dict()) xmd = {"outer_key": {"inner_key": ["scalar", "another_scalar"]}} packager.set_xmd(xmd) xmd_copy = packager.get_xmd() assert xmd_copy assert "outer_key" in xmd_copy assert "inner_key" in xmd_copy["outer_key"] assert "scalar" in xmd_copy["outer_key"]["inner_key"] assert "another_scalar" in xmd_copy["outer_key"]["inner_key"] # Verify that we can add content and save it back xmd["something"] = ["foo", "bar"] packager.set_xmd(xmd) xmd_copy = packager.get_xmd() assert xmd_copy assert "outer_key" in xmd_copy assert "inner_key" in xmd_copy["outer_key"] assert "scalar" in xmd_copy["outer_key"]["inner_key"] assert "another_scalar" in xmd_copy["outer_key"]["inner_key"] assert "something" in xmd_copy assert xmd_copy["something"] == ["foo", "bar"] if __name__ == "__main__": unittest.main() fedora-modularity-libmodulemd-357799c/modulemd/tests/ModulemdTests/modulestream.py000066400000000000000000001532611502446517500305650ustar00rootroot00000000000000#!/usr/bin/python3 # -*- coding: utf-8 -*- # This file is part of libmodulemd # Copyright (C) 2018-2020 Red Hat, Inc. # # Fedora-License-Identifier: MIT # SPDX-2.0-License-Identifier: MIT # SPDX-3.0-License-Identifier: MIT # # This program is free software. # For more information on the license, see COPYING. # For more information on free software, see # . import os import sys try: import unittest import gi if os.getenv("MMD_TEST_INSTALLED_LIBS") != "TRUE": gi._overridesdir = os.path.join( os.getenv("MESON_SOURCE_ROOT"), "bindings", "python", "gi", "overrides", ) gi.require_version("Modulemd", "2.0") from gi.repository import GLib from gi.repository import Modulemd except ImportError: # Return error 77 to skip this test on platforms without the necessary # python modules sys.exit(77) from base import TestBase modulestream_versions = [ Modulemd.ModuleStreamVersionEnum.ONE, Modulemd.ModuleStreamVersionEnum.TWO, ] class TestModuleStream(TestBase): def test_constructors(self): for version in modulestream_versions: # Test that the new() function works stream = Modulemd.ModuleStream.new(version, "foo", "latest") assert stream assert isinstance(stream, Modulemd.ModuleStream) assert stream.props.mdversion == version assert stream.get_mdversion() == version assert stream.props.module_name == "foo" assert stream.get_module_name() == "foo" assert stream.props.stream_name == "latest" assert stream.get_stream_name() == "latest" # Test that the new() function works without a stream name stream = Modulemd.ModuleStream.new(version, "foo") assert stream assert isinstance(stream, Modulemd.ModuleStream) assert stream.props.mdversion == version assert stream.get_mdversion() == version assert stream.props.module_name == "foo" assert stream.get_module_name() == "foo" assert stream.props.stream_name is None assert stream.get_stream_name() is None # Test that the new() function works with no module name stream = Modulemd.ModuleStream.new(version, None, "latest") assert stream assert isinstance(stream, Modulemd.ModuleStream) assert stream.props.mdversion == version assert stream.get_mdversion() == version assert stream.props.module_name is None assert stream.get_module_name() is None assert stream.props.stream_name == "latest" assert stream.get_stream_name() == "latest" # Test that the new() function works with no module or stream stream = Modulemd.ModuleStream.new(version) assert stream assert isinstance(stream, Modulemd.ModuleStream) assert stream.props.mdversion == version assert stream.get_mdversion() == version assert stream.props.module_name is None assert stream.get_module_name() is None assert stream.props.stream_name is None assert stream.get_stream_name() is None # Test that we cannot instantiate directly with self.assertRaisesRegex( TypeError, "cannot create instance of abstract" ): Modulemd.ModuleStream() # Test with a zero mdversion with self.assertRaisesRegex(TypeError, "constructor returned NULL"): with self.expect_signal(): defs = Modulemd.ModuleStream.new(0) # Test with an unknown mdversion with self.assertRaisesRegex(TypeError, "constructor returned NULL"): with self.expect_signal(): defs = Modulemd.ModuleStream.new( Modulemd.ModuleStreamVersionEnum.LATEST + 1 ) def test_copy(self): for version in modulestream_versions: # Test that copying a stream with a stream name works stream = Modulemd.ModuleStream.new(version, "foo", "stable") copied_stream = stream.copy() assert copied_stream.props.module_name == stream.props.module_name assert copied_stream.get_module_name() == stream.get_module_name() assert copied_stream.props.stream_name == stream.props.stream_name assert copied_stream.get_stream_name() == stream.get_stream_name() # Test that copying a stream without a stream name works stream = Modulemd.ModuleStream.new(version, "foo") copied_stream = stream.copy() assert copied_stream.props.module_name == stream.props.module_name assert copied_stream.get_module_name() == stream.get_module_name() assert copied_stream.props.stream_name == stream.props.stream_name assert copied_stream.get_stream_name() == stream.get_stream_name() # Test that copying a stream and changing the stream works stream = Modulemd.ModuleStream.new(version, "foo", "stable") copied_stream = stream.copy(module_stream="latest") assert copied_stream.props.module_name == stream.props.module_name assert copied_stream.get_module_name() == stream.get_module_name() assert copied_stream.props.stream_name != stream.props.stream_name assert copied_stream.get_stream_name() != stream.get_stream_name() assert copied_stream.props.stream_name == "latest" assert copied_stream.get_stream_name() == "latest" # Test that copying a stream without a module name works stream = Modulemd.ModuleStream.new(version, None, "stable") copied_stream = stream.copy() assert copied_stream.props.module_name == stream.props.module_name assert copied_stream.get_module_name() == stream.get_module_name() assert copied_stream.props.stream_name == stream.props.stream_name assert copied_stream.get_stream_name() == stream.get_stream_name() # Test that copying a stream and changing the name works stream = Modulemd.ModuleStream.new(version, "foo", "stable") copied_stream = stream.copy(module_name="bar") assert copied_stream.props.module_name == "bar" assert copied_stream.get_module_name() == "bar" assert copied_stream.props.stream_name == stream.props.stream_name assert copied_stream.get_stream_name() == stream.get_stream_name() # Test the version and context assert copied_stream.props.version == 0 assert copied_stream.get_version() == 0 assert copied_stream.props.context is None assert copied_stream.get_context() is None # Set a version and check the copy stream.props.version = 42 copied_stream = stream.copy() assert copied_stream.props.version == 42 assert copied_stream.get_version() == 42 # Set a context and check the copy stream.props.context = "c0ffee42" copied_stream = stream.copy() assert copied_stream.props.context == "c0ffee42" assert copied_stream.get_context() == "c0ffee42" def test_nsvc(self): for version in modulestream_versions: # First test that NSVC is None for a module with no name stream = Modulemd.ModuleStream.new(version) assert stream.get_nsvc() is None # Next, test for no stream name stream = Modulemd.ModuleStream.new(version, "modulename") assert stream.get_nsvc() is None # Now with valid module and stream names stream = Modulemd.ModuleStream.new( version, "modulename", "streamname" ) assert stream.get_nsvc() == "modulename:streamname:0" # Add a version number stream.props.version = 42 assert stream.get_nsvc() == "modulename:streamname:42" # Add a context stream.props.context = "deadbeef" assert stream.get_nsvc() == "modulename:streamname:42:deadbeef" def test_nsvca(self): for version in modulestream_versions: # First test that NSVCA is None for a module with no name stream = Modulemd.ModuleStream.new(version) self.assertIsNone(stream.get_NSVCA()) # Next, test for no stream name stream = Modulemd.ModuleStream.new(version, "modulename") self.assertEqual(stream.get_NSVCA(), "modulename") # Now with valid module and stream names stream = Modulemd.ModuleStream.new( version, "modulename", "streamname" ) self.assertEqual(stream.get_NSVCA(), "modulename:streamname") # Add a version number stream.props.version = 42 self.assertEqual(stream.get_NSVCA(), "modulename:streamname:42") # Add a context stream.props.context = "deadbeef" self.assertEqual( stream.get_NSVCA(), "modulename:streamname:42:deadbeef" ) # Add an architecture stream.props.arch = "x86_64" self.assertEqual( stream.get_NSVCA(), "modulename:streamname:42:deadbeef:x86_64" ) # Now try removing some of the bits in the middle stream.props.context = None self.assertEqual( stream.get_NSVCA(), "modulename:streamname:42::x86_64" ) stream = Modulemd.ModuleStream.new(version, "modulename") stream.props.arch = "x86_64" self.assertEqual(stream.get_NSVCA(), "modulename::::x86_64") stream.props.version = 2019 self.assertEqual(stream.get_NSVCA(), "modulename::2019::x86_64") # Add a context stream.props.context = "feedfeed" self.assertEqual( stream.get_NSVCA(), "modulename::2019:feedfeed:x86_64" ) def test_arch(self): for version in modulestream_versions: stream = Modulemd.ModuleStream.new(version) # Check the defaults assert stream.props.arch is None assert stream.get_arch() is None # Test property setting stream.props.arch = "x86_64" assert stream.props.arch == "x86_64" assert stream.get_arch() == "x86_64" # Test set_arch() stream.set_arch("ppc64le") assert stream.props.arch == "ppc64le" assert stream.get_arch() == "ppc64le" # Test setting it to None stream.props.arch = None assert stream.props.arch is None assert stream.get_arch() is None def test_buildopts(self): for version in modulestream_versions: stream = Modulemd.ModuleStream.new(version) # Check the defaults assert stream.props.buildopts is None assert stream.get_buildopts() is None buildopts = Modulemd.Buildopts() buildopts.props.rpm_macros = "%demomacro 1" stream.set_buildopts(buildopts) assert stream.props.buildopts is not None assert stream.props.buildopts is not None assert stream.props.buildopts.props.rpm_macros == "%demomacro 1" def test_community(self): for version in modulestream_versions: stream = Modulemd.ModuleStream.new(version) # Check the defaults assert stream.props.community is None assert stream.get_community() is None # Test property setting stream.props.community = "http://example.com" assert stream.props.community == "http://example.com" assert stream.get_community() == "http://example.com" # Test set_community() stream.set_community("http://redhat.com") assert stream.props.community == "http://redhat.com" assert stream.get_community() == "http://redhat.com" # Test setting it to None stream.props.community = None assert stream.props.community is None assert stream.get_community() is None def test_description(self): for version in modulestream_versions: stream = Modulemd.ModuleStream.new(version) # Check the defaults assert stream.get_description(locale="C") is None # Test set_description() stream.set_description("A different description") assert ( stream.get_description(locale="C") == "A different description" ) # Test setting it to None stream.set_description(None) assert stream.get_description(locale="C") is None def test_documentation(self): for version in modulestream_versions: stream = Modulemd.ModuleStream.new(version) # Check the defaults assert stream.props.documentation is None assert stream.get_documentation() is None # Test property setting stream.props.documentation = "http://example.com" assert stream.props.documentation == "http://example.com" assert stream.get_documentation() == "http://example.com" # Test set_documentation() stream.set_documentation("http://redhat.com") assert stream.props.documentation == "http://redhat.com" assert stream.get_documentation() == "http://redhat.com" # Test setting it to None stream.props.documentation = None assert stream.props.documentation is None assert stream.get_documentation() is None # Test unicode characters unicode_test_str = ( "À϶¥🌭∮⇒⇔¬β∀₂⌀ıəˈ⍳⍴V)═€ίζησθლბშიнстемองจึองታሽ።ደለᚢᛞᚦᚹ⠳⠞⠊⠎▉▒▒▓😃" ) stream.props.documentation = unicode_test_str assert stream.props.documentation == unicode_test_str assert stream.get_documentation() == unicode_test_str def test_summary(self): for version in modulestream_versions: stream = Modulemd.ModuleStream.new(version) # Check the defaults assert stream.get_summary(locale="C") is None # Test set_summary() stream.set_summary("A different summary") assert stream.get_summary(locale="C") == "A different summary" # Test setting it to None stream.set_summary(None) assert stream.get_summary(locale="C") is None def test_tracker(self): for version in modulestream_versions: stream = Modulemd.ModuleStream.new(version) # Check the defaults assert stream.props.tracker is None assert stream.get_tracker() is None # Test property setting stream.props.tracker = "http://example.com" assert stream.props.tracker == "http://example.com" assert stream.get_tracker() == "http://example.com" # Test set_tracker() stream.set_tracker("http://redhat.com") assert stream.props.tracker == "http://redhat.com" assert stream.get_tracker() == "http://redhat.com" # Test setting it to None stream.props.tracker = None assert stream.props.tracker is None assert stream.get_tracker() is None def test_components(self): for version in modulestream_versions: stream = Modulemd.ModuleStream.new(version) # Add an RPM component to a stream rpm_comp = Modulemd.ComponentRpm(name="rpmcomponent") stream.add_component(rpm_comp) assert "rpmcomponent" in stream.get_rpm_component_names() retrieved_comp = stream.get_rpm_component("rpmcomponent") assert retrieved_comp assert retrieved_comp.props.name == "rpmcomponent" # Add a Module component to a stream mod_comp = Modulemd.ComponentModule(name="modulecomponent") stream.add_component(mod_comp) assert "modulecomponent" in stream.get_module_component_names() retrieved_comp = stream.get_module_component("modulecomponent") assert retrieved_comp assert retrieved_comp.props.name == "modulecomponent" # Remove an RPM component from a stream stream.remove_rpm_component("rpmcomponent") # Remove a Module component from a stream stream.remove_module_component("modulecomponent") def test_licenses(self): for version in modulestream_versions: stream = Modulemd.ModuleStream.new(version) stream.add_content_license("DUMMY1") assert "DUMMY1" in stream.get_content_licenses() stream.add_module_license("DUMMY2") assert "DUMMY2" in stream.get_module_licenses() stream.remove_content_license("DUMMY1") stream.remove_module_license("DUMMY2") def test_profiles(self): for version in modulestream_versions: stream = Modulemd.ModuleStream.new(version, "sssd") profile = Modulemd.Profile(name="client") profile.add_rpm("sssd-client") stream.add_profile(profile) assert len(stream.get_profile_names()) == 1 assert "client" in stream.get_profile_names() assert "sssd-client" in stream.get_profile("client").get_rpms() stream.clear_profiles() assert len(stream.get_profile_names()) == 0 def test_rpm_api(self): for version in modulestream_versions: stream = Modulemd.ModuleStream.new(version, "sssd") stream.add_rpm_api("sssd-common") assert "sssd-common" in stream.get_rpm_api() stream.remove_rpm_api("sssd-common") assert len(stream.get_rpm_api()) == 0 def test_rpm_artifacts(self): for version in modulestream_versions: stream = Modulemd.ModuleStream.new(version) stream.add_rpm_artifact("bar-0:1.23-1.module_deadbeef.x86_64") assert ( "bar-0:1.23-1.module_deadbeef.x86_64" in stream.get_rpm_artifacts() ) stream.remove_rpm_artifact("bar-0:1.23-1.module_deadbeef.x86_64") assert len(stream.get_rpm_artifacts()) == 0 def test_rpm_filters(self): for version in modulestream_versions: stream = Modulemd.ModuleStream.new(version) stream.add_rpm_filter("foo") stream.add_rpm_filter("bar") assert "foo" in stream.get_rpm_filters() assert "bar" in stream.get_rpm_filters() assert len(stream.get_rpm_filters()) == 2 stream.remove_rpm_filter("bar") assert "foo" in stream.get_rpm_filters() assert len(stream.get_rpm_filters()) == 1 stream.clear_rpm_filters() assert len(stream.get_rpm_filters()) == 0 def test_demodularized_rpms(self): for version in modulestream_versions: stream = Modulemd.ModuleStream.new(version) # demodularized_rpms are supported since v2 if version < Modulemd.ModuleStreamVersionEnum.TWO: continue stream.add_demodularized_rpm("foo") stream.add_demodularized_rpm("bar") assert "foo" in stream.get_demodularized_rpms() assert "bar" in stream.get_demodularized_rpms() assert len(stream.get_demodularized_rpms()) == 2 stream.remove_demodularized_rpm("bar") assert "foo" in stream.get_demodularized_rpms() assert len(stream.get_demodularized_rpms()) == 1 stream.clear_demodularized_rpms() assert len(stream.get_demodularized_rpms()) == 0 def test_servicelevels(self): for version in modulestream_versions: # servicelevels are not supported after v2 if version > Modulemd.ModuleStreamVersionEnum.TWO: continue stream = Modulemd.ModuleStream.new(version) sl = Modulemd.ServiceLevel.new("rawhide") sl.set_eol_ymd(1980, 3, 2) stream.add_servicelevel(sl) assert "rawhide" in stream.get_servicelevel_names() retrieved_sl = stream.get_servicelevel("rawhide") assert retrieved_sl.props.name == "rawhide" assert retrieved_sl.get_eol_as_string() == "1980-03-02" def test_v1_eol(self): stream = Modulemd.ModuleStreamV1.new() eol = GLib.Date.new_dmy(3, 2, 1998) stream.set_eol(eol) retrieved_eol = stream.get_eol() assert retrieved_eol.get_day() == 3 assert retrieved_eol.get_month() == 2 assert retrieved_eol.get_year() == 1998 sl = stream.get_servicelevel("rawhide") assert sl.get_eol_as_string() == "1998-02-03" def test_v1_dependencies(self): stream = Modulemd.ModuleStreamV1.new() stream.add_buildtime_requirement("testmodule", "stable") assert len(stream.get_buildtime_modules()) == 1 assert "testmodule" in stream.get_buildtime_modules() assert ( stream.get_buildtime_requirement_stream("testmodule") == "stable" ) stream.add_runtime_requirement("testmodule", "latest") assert len(stream.get_runtime_modules()) == 1 assert "testmodule" in stream.get_runtime_modules() assert stream.get_runtime_requirement_stream("testmodule") == "latest" def test_v2_dependencies(self): stream = Modulemd.ModuleStreamV2.new() deps = Modulemd.Dependencies() deps.add_buildtime_stream("foo", "stable") deps.set_empty_runtime_dependencies_for_module("bar") stream.add_dependencies(deps) assert len(stream.get_dependencies()) == 1 assert len(stream.get_dependencies()) == 1 assert "foo" in stream.get_dependencies()[0].get_buildtime_modules() assert "stable" in stream.get_dependencies()[0].get_buildtime_streams( "foo" ) assert "bar" in stream.get_dependencies()[0].get_runtime_modules() retrieved_deps = stream.get_dependencies() stream.clear_dependencies() self.assertEqual(len(retrieved_deps), 1) self.assertEqual(len(stream.get_dependencies()), 0) stream.add_dependencies(deps) self.assertEqual(len(stream.get_dependencies()), 1) stream.remove_dependencies(deps) self.assertEqual(len(stream.get_dependencies()), 0) def test_xmd(self): for version in modulestream_versions: # We have a chicken-egg problem with overrides, since they can only # be tested if they are already installed. This means they need to # be run in the CI. In order to avoid changes to these tests or the # overrides breaking things, we'll skip them if the appropriate # override is not installed. if "_overrides_module" in dir(Modulemd) and hasattr( gi.overrides.Modulemd, type(Modulemd.ModuleStream.new(version)).__name__, ): # The XMD python tests can only be run against the installed lib # because the overrides that translate between python and GVariant # must be installed in /usr/lib/python*/site-packages/gi/overrides # or they are not included when importing Modulemd stream = Modulemd.ModuleStream.new(version, "foo", "bar") # An empty dictionary should be returned if no xmd value is set self.assertEqual(stream.get_xmd(), dict()) xmd = { "outer_key": {"inner_key": ["scalar", "another_scalar"]} } stream.set_xmd(xmd) xmd_copy = stream.get_xmd() assert xmd_copy assert "outer_key" in xmd_copy assert "inner_key" in xmd_copy["outer_key"] assert "scalar" in xmd_copy["outer_key"]["inner_key"] assert "another_scalar" in xmd_copy["outer_key"]["inner_key"] # Verify that we can add content and save it back xmd["something"] = ["foo", "bar"] stream.set_xmd(xmd) stream.set_summary("foo") stream.set_description("bar") stream.add_module_license("DUMMY") if hasattr(stream, "set_platform"): stream.set_platform("f33") index = Modulemd.ModuleIndex() index.add_module_stream(stream) out_yaml = index.dump_to_string() self.assertIsNotNone(out_yaml) def test_upgrade_v1_to_v2(self): v1_stream = Modulemd.ModuleStreamV1.new("SuperModule", "latest") v1_stream.set_context("ctx") v1_stream.set_summary("Summary") v1_stream.set_description("Description") v1_stream.add_module_license("DUMMY") v1_stream.add_buildtime_requirement("ModuleA", "streamZ") v1_stream.add_buildtime_requirement("ModuleB", "streamY") v1_stream.add_runtime_requirement("ModuleA", "streamZ") v1_stream.add_runtime_requirement("ModuleB", "streamY") v1_stream.add_runtime_requirement("platform", "f33") v2_stream = v1_stream.upgrade(Modulemd.ModuleStreamVersionEnum.TWO) self.assertIsNotNone(v2_stream) idx = Modulemd.ModuleIndex.new() idx.add_module_stream(v2_stream) self.assertEqual( idx.dump_to_string(), """--- document: modulemd version: 2 data: name: SuperModule stream: \"latest\" context: ctx summary: Summary description: >- Description license: module: - DUMMY dependencies: - buildrequires: ModuleA: [streamZ] ModuleB: [streamY] requires: ModuleA: [streamZ] ModuleB: [streamY] platform: [f33] ... """, ) def test_v2_yaml(self): yaml = """ --- document: modulemd version: 2 data: name: modulename stream: \"streamname\" version: 1 context: c0ffe3 arch: x86_64 summary: Module Summary description: >- Module Description api: rpms: - rpm_a - rpm_b filter: rpms: rpm_c demodularized: rpms: - rpm_d artifacts: rpms: - bar-0:1.23-1.module_deadbeef.x86_64 servicelevels: rawhide: {} production: eol: 2099-12-31 license: content: - DUMMY1 - DUMMY2 module: DUMMY3 dependencies: - buildrequires: platform: [-f27, -f28, -epel7] requires: platform: [-f27, -f28, -epel7] - buildrequires: platform: [f27] buildtools: [v1, v2] compatible: [v3] requires: platform: [f27] compatible: [v3, v4] - buildrequires: platform: [f28] requires: platform: [f28] runtime: [a, b] - buildrequires: platform: [epel7] extras: [] moreextras: [foo, bar] requires: platform: [epel7] extras: [] moreextras: [foo, bar] references: community: http://www.example.com/ documentation: http://www.example.com/ tracker: http://www.example.com/ profiles: default: rpms: - bar - bar-extras - baz container: rpms: - bar - bar-devel minimal: description: Minimal profile installing only the bar package. rpms: - bar buildroot: rpms: - bar-devel srpm-buildroot: rpms: - bar-extras buildopts: rpms: macros: | %demomacro 1 %demomacro2 %{demomacro}23 whitelist: - fooscl-1-bar - fooscl-1-baz - xxx - xyz arches: [i686, x86_64] components: rpms: bar: rationale: We need this to demonstrate stuff. repository: https://pagure.io/bar.git cache: https://example.com/cache ref: 26ca0c0 baz: rationale: This one is here to demonstrate other stuff. xxx: rationale: xxx demonstrates arches and multilib. arches: [i686, x86_64] multilib: [x86_64] xyz: rationale: xyz is a bundled dependency of xxx. buildorder: 10 modules: includedmodule: rationale: Included in the stack, just because. repository: https://pagure.io/includedmodule.git ref: somecoolbranchname buildorder: 100 xmd: some_key: some_data some_list: - a - b some_dict: a: alpha b: beta some_other_list: - c - d some_other_dict: another_key: more_data yet_another_key: - this - is - getting - silly can_bool: TRUE ... """ stream = Modulemd.ModuleStream.read_string(yaml, True) assert stream is not None assert stream.props.module_name == "modulename" assert stream.props.stream_name == "streamname" assert stream.props.version == 1 assert stream.props.context == "c0ffe3" assert stream.props.arch == "x86_64" assert stream.get_summary(locale="C") == "Module Summary" assert stream.get_description(locale="C") == "Module Description" assert "rpm_a" in stream.get_rpm_api() assert "rpm_b" in stream.get_rpm_api() assert "rpm_c" in stream.get_rpm_filters() assert "rpm_d" in stream.get_demodularized_rpms() assert ( "bar-0:1.23-1.module_deadbeef.x86_64" in stream.get_rpm_artifacts() ) assert "rawhide" in stream.get_servicelevel_names() assert "production" in stream.get_servicelevel_names() sl = stream.get_servicelevel("rawhide") assert sl is not None assert sl.props.name == "rawhide" assert sl.get_eol() is None sl = stream.get_servicelevel("production") assert sl is not None assert sl.props.name == "production" assert sl.get_eol() is not None assert sl.get_eol_as_string() == "2099-12-31" assert "DUMMY1" in stream.get_content_licenses() assert "DUMMY2" in stream.get_content_licenses() assert len(stream.get_dependencies()) == 4 assert stream.props.community == "http://www.example.com/" assert stream.props.documentation == "http://www.example.com/" assert stream.props.tracker == "http://www.example.com/" assert len(stream.get_profile_names()) == 5 buildopts = stream.get_buildopts() assert buildopts is not None assert ( "%demomacro 1\n%demomacro2 %{demomacro}23\n" == buildopts.props.rpm_macros ) assert "fooscl-1-bar" in buildopts.get_rpm_whitelist() assert "fooscl-1-baz" in buildopts.get_rpm_whitelist() assert "xxx" in buildopts.get_rpm_whitelist() assert "xyz" in buildopts.get_rpm_whitelist() assert "i686" in buildopts.get_arches() assert "x86_64" in buildopts.get_arches() if os.getenv("MMD_TEST_INSTALLED_LIB"): # The XMD python tests can only be run against the installed # lib because the overrides that translate between python and # GVariant must be installed in # /usr/lib/python*/site-packages/gi/overrides # or they are not included when importing Modulemd xmd = stream.get_xmd() assert xmd is not None assert "some_key" in xmd assert xmd["some_key"] == "some_data" assert "some_list" in xmd assert "a" in xmd["some_list"] assert "b" in xmd["some_list"] assert "some_dict" in xmd assert "a" in xmd["some_dict"] assert xmd["some_dict"]["a"] == "alpha" assert "some_other_dict" in xmd["some_dict"] assert "yet_another_key" in xmd["some_dict"]["some_other_dict"] assert ( "silly" in xmd["some_dict"]["some_other_dict"]["yet_another_key"] ) assert "can_bool" in xmd assert xmd["can_bool"] is True # Validate a trivial modulemd trivial_yaml = """ --- document: modulemd version: 2 data: summary: Trivial Summary description: >- Trivial Description license: module: DUMMY ... """ stream = Modulemd.ModuleStream.read_string(trivial_yaml, True) assert stream # Sanity check of spec.v2.yaml stream = Modulemd.ModuleStream.read_file( os.path.join( self.source_root, "yaml_specs/modulemd_stream_v2.yaml" ), True, ) assert stream def test_v1_yaml(self): for version in modulestream_versions: yaml = """ --- document: modulemd version: 1 data: name: modulename stream: streamname version: 1 context: c0ffe3 arch: x86_64 summary: Module Summary description: >- Module Description api: rpms: - rpm_a - rpm_b filter: rpms: rpm_c artifacts: rpms: - bar-0:1.23-1.module_deadbeef.x86_64 eol: 2033-08-04 servicelevels: foo: {} production: eol: 2099-12-31 license: content: - DUMMY1 - DUMMY2 module: DUMMY3 dependencies: buildrequires: platform: and-its-stream-name extra-build-env: and-its-stream-name-too requires: runtimeplatform: and-its-stream-name-2 references: community: http://www.example.com/ documentation: http://www.example.com/ tracker: http://www.example.com/ profiles: default: rpms: - bar - bar-extras - baz container: rpms: - bar - bar-devel minimal: description: Minimal profile installing only the bar package. rpms: - bar buildroot: rpms: - bar-devel srpm-buildroot: rpms: - bar-extras buildopts: rpms: macros: | %demomacro 1 %demomacro2 %{demomacro}23 whitelist: - fooscl-1-bar - fooscl-1-baz - xxx - xyz components: rpms: bar: rationale: We need this to demonstrate stuff. repository: https://pagure.io/bar.git cache: https://example.com/cache ref: 26ca0c0 baz: rationale: This one is here to demonstrate other stuff. xxx: rationale: xxx demonstrates arches and multilib. arches: [i686, x86_64] multilib: [x86_64] xyz: rationale: xyz is a bundled dependency of xxx. buildorder: 10 modules: includedmodule: rationale: Included in the stack, just because. repository: https://pagure.io/includedmodule.git ref: somecoolbranchname buildorder: 100 xmd: some_key: some_data some_list: - a - b some_dict: a: alpha b: beta some_other_list: - c - d some_other_dict: another_key: more_data yet_another_key: - this - is - getting - silly can_bool: TRUE ... """ stream = Modulemd.ModuleStream.read_string(yaml, True) assert stream is not None assert stream.props.module_name == "modulename" assert stream.props.stream_name == "streamname" assert stream.props.version == 1 assert stream.props.context == "c0ffe3" assert stream.props.arch == "x86_64" assert stream.get_summary(locale="C") == "Module Summary" assert stream.get_description(locale="C") == "Module Description" assert "rpm_a" in stream.get_rpm_api() assert "rpm_b" in stream.get_rpm_api() assert "rpm_c" in stream.get_rpm_filters() assert ( "bar-0:1.23-1.module_deadbeef.x86_64" in stream.get_rpm_artifacts() ) assert "rawhide" in stream.get_servicelevel_names() assert "production" in stream.get_servicelevel_names() sl = stream.get_servicelevel("rawhide") assert sl is not None assert sl.props.name == "rawhide" assert sl.get_eol_as_string() == "2033-08-04" sl = stream.get_servicelevel("foo") assert sl is not None assert sl.props.name == "foo" assert sl.get_eol() is None sl = stream.get_servicelevel("production") assert sl is not None assert sl.props.name == "production" assert sl.get_eol() is not None assert sl.get_eol_as_string() == "2099-12-31" assert "DUMMY1" in stream.get_content_licenses() assert "DUMMY2" in stream.get_content_licenses() buildrequires = stream.get_buildtime_modules() assert len(buildrequires) == 2 assert "platform" in buildrequires assert ( stream.get_buildtime_requirement_stream("platform") == "and-its-stream-name" ) assert "extra-build-env" in buildrequires assert ( stream.get_buildtime_requirement_stream("extra-build-env") == "and-its-stream-name-too" ) requires = stream.get_runtime_modules() assert len(requires) == 1 assert "runtimeplatform" in requires assert ( stream.get_runtime_requirement_stream("runtimeplatform") == "and-its-stream-name-2" ) assert stream.props.community == "http://www.example.com/" assert stream.props.documentation == "http://www.example.com/" assert stream.props.tracker == "http://www.example.com/" assert len(stream.get_profile_names()) == 5 buildopts = stream.get_buildopts() assert buildopts is not None assert ( "%demomacro 1\n%demomacro2 %{demomacro}23\n" == buildopts.props.rpm_macros ) assert "fooscl-1-bar" in buildopts.get_rpm_whitelist() assert "fooscl-1-baz" in buildopts.get_rpm_whitelist() assert "xxx" in buildopts.get_rpm_whitelist() assert "xyz" in buildopts.get_rpm_whitelist() if os.getenv("MMD_TEST_INSTALLED_LIB"): # The XMD python tests can only be run against the installed # lib because the overrides that translate between python and # GVariant must be installed in # /usr/lib/python*/site-packages/gi/overrides # or they are not included when importing Modulemd xmd = stream.get_xmd() assert xmd is not None assert "some_key" in xmd assert xmd["some_key"] == "some_data" assert "some_list" in xmd assert "a" in xmd["some_list"] assert "b" in xmd["some_list"] assert "some_dict" in xmd assert "a" in xmd["some_dict"] assert xmd["some_dict"]["a"] == "alpha" assert "some_other_dict" in xmd["some_dict"] assert "yet_another_key" in xmd["some_dict"]["some_other_dict"] assert ( "silly" in xmd["some_dict"]["some_other_dict"]["yet_another_key"] ) assert "can_bool" in xmd assert xmd["can_bool"] is True # Validate a trivial modulemd trivial_yaml = """ --- document: modulemd version: 1 data: summary: Trivial Summary description: >- Trivial Description license: module: DUMMY ... """ stream = Modulemd.ModuleStream.read_string(trivial_yaml, True) assert stream # Sanity check of spec.v1.yaml stream = Modulemd.ModuleStream.read_file( "%s/yaml_specs/modulemd_stream_v1.yaml" % os.getenv("MESON_SOURCE_ROOT"), True, ) assert stream def test_packager_sanity(self): stream = Modulemd.ModuleStream.read_file( "%s/yaml_specs/modulemd_packager_v2.yaml" % os.getenv("MESON_SOURCE_ROOT"), True, ) assert stream def test_depends_on_stream(self): for version in modulestream_versions: stream = Modulemd.ModuleStream.read_file( "%s/dependson_v%d.yaml" % (os.getenv("TEST_DATA_PATH"), version), True, ) self.assertIsNotNone(stream) self.assertEqual(stream.depends_on_stream("platform", "f30"), True) self.assertEqual( stream.build_depends_on_stream("platform", "f30"), True ) self.assertEqual( stream.depends_on_stream("platform", "f28"), False ) self.assertEqual( stream.build_depends_on_stream("platform", "f28"), False ) self.assertEqual(stream.depends_on_stream("base", "f30"), False) self.assertEqual( stream.build_depends_on_stream("base", "f30"), False ) if version >= Modulemd.ModuleStreamVersionEnum.TWO: self.assertEqual( stream.depends_on_stream("streamname", "f30"), True ) self.assertEqual( stream.build_depends_on_stream("streamname", "f30"), True ) def test_validate_buildafter(self): for version in modulestream_versions: # buildafter is supported starting with v2 if version < Modulemd.ModuleStreamVersionEnum.TWO: continue # Test a valid module stream with buildafter set stream = Modulemd.ModuleStream.read_file( "%s/buildafter/good_buildafter_v%d.yaml" % (self.test_data_path, version), True, ) self.assertIsNotNone(stream) self.assertTrue(stream.validate()) # Should fail validation if both buildorder and buildafter are set for # the same component. with self.assertRaisesRegex( gi.repository.GLib.GError, "Cannot mix buildorder and buildafter", ): stream = Modulemd.ModuleStream.read_file( "%s/buildafter/both_same_component_v%d.yaml" % (self.test_data_path, version), True, ) # Should fail validation if both buildorder and buildafter are set in # different components of the same stream. with self.assertRaisesRegex( gi.repository.GLib.GError, "Cannot mix buildorder and buildafter", ): stream = Modulemd.ModuleStream.read_file( "%s/buildafter/mixed_buildorder_v%d.yaml" % (self.test_data_path, version), True, ) # Should fail if a key specified in a buildafter set does not exist # for this module stream. with self.assertRaisesRegex( gi.repository.GLib.GError, "not found in components list" ): stream = Modulemd.ModuleStream.read_file( "%s/buildafter/invalid_key_v%d.yaml" % (self.test_data_path, version), True, ) def test_unicode_desc(self): for version in modulestream_versions: # Test a valid module stream with unicode in the description stream = Modulemd.ModuleStream.read_file( "%s/stream_unicode_v%d.yaml" % (os.getenv("TEST_DATA_PATH"), version), True, "", "", ) self.assertIsNotNone(stream) self.assertTrue(stream.validate()) def test_xmd_issue_274(self): # Test a valid module stream with unicode in the description stream = Modulemd.ModuleStream.read_file( "%s/stream_unicode_v2.yaml" % (os.getenv("TEST_DATA_PATH")), True, "", "", ) # In this bug, we were getting a traceback attemping to call # get_xmd() more than once on the same stream. There were subtle # memory issues at play here. if "_overrides_module" in dir(Modulemd): # The XMD python tests can only be run against the installed lib # because the overrides that translate between python and GVariant # must be installed in /usr/lib/python*/site-packages/gi/overrides # or they are not included when importing Modulemd xmd = stream.get_xmd() mbs_xmd = stream.get_xmd()["mbs"] mbs_xmd2 = stream.get_xmd()["mbs"] else: stream.get_xmd() stream.get_xmd() def test_xmd_issue_290(self): if "_overrides_module" in dir(Modulemd): stream = Modulemd.ModuleStream.read_file( "%s/290.yaml" % (os.getenv("TEST_DATA_PATH")), True, "", "" ) self.assertIsNotNone(stream) xmd = stream.get_xmd() xmd["something"] = ["foo", "bar"] stream.set_xmd(xmd) index = Modulemd.ModuleIndex() index.add_module_stream(stream) self.maxDiff = None output_yaml = index.dump_to_string() self.assertIsNotNone(output_yaml) pass def test_search_profiles(self): stream = Modulemd.ModuleStreamV2.new("themodule", "thestream") # First with no profiles added. Make sure we get back a zero-length # array profiles = stream.search_profiles(None) self.assertIsNotNone(profiles) self.assertEqual(len(profiles), 0) profiles = stream.search_profiles("*") self.assertIsNotNone(profiles) self.assertEqual(len(profiles), 0) profiles = stream.search_profiles("thefirstprofile") self.assertIsNotNone(profiles) self.assertEqual(len(profiles), 0) # Now add three profiles, and confirm that searches are # returned in alphabetical order stream.add_profile(Modulemd.Profile.new("thesecondprofile")) stream.add_profile(Modulemd.Profile.new("thefirstprofile")) stream.add_profile(Modulemd.Profile.new("thethirdprofile")) profiles = stream.search_profiles(None) self.assertIsNotNone(profiles) self.assertEqual(len(profiles), 3) self.assertIsInstance(profiles[0], Modulemd.Profile) self.assertEqual(profiles[0].get_name(), "thefirstprofile") self.assertIsInstance(profiles[1], Modulemd.Profile) self.assertEqual(profiles[1].get_name(), "thesecondprofile") self.assertIsInstance(profiles[2], Modulemd.Profile) self.assertEqual(profiles[2].get_name(), "thethirdprofile") profiles = stream.search_profiles("*") self.assertIsNotNone(profiles) self.assertEqual(len(profiles), 3) self.assertIsInstance(profiles[0], Modulemd.Profile) self.assertEqual(profiles[0].get_name(), "thefirstprofile") self.assertIsInstance(profiles[1], Modulemd.Profile) self.assertEqual(profiles[1].get_name(), "thesecondprofile") self.assertIsInstance(profiles[2], Modulemd.Profile) self.assertEqual(profiles[2].get_name(), "thethirdprofile") profiles = stream.search_profiles("thefirstprofile") self.assertIsNotNone(profiles) self.assertEqual(len(profiles), 1) self.assertIsInstance(profiles[0], Modulemd.Profile) self.assertEqual(profiles[0].get_name(), "thefirstprofile") profiles = stream.search_profiles("*profile") self.assertIsNotNone(profiles) self.assertEqual(len(profiles), 3) self.assertIsInstance(profiles[0], Modulemd.Profile) self.assertEqual(profiles[0].get_name(), "thefirstprofile") self.assertIsInstance(profiles[1], Modulemd.Profile) self.assertEqual(profiles[1].get_name(), "thesecondprofile") self.assertIsInstance(profiles[2], Modulemd.Profile) self.assertEqual(profiles[2].get_name(), "thethirdprofile") profiles = stream.search_profiles("*dprofile*") self.assertIsNotNone(profiles) self.assertEqual(len(profiles), 2) self.assertIsInstance(profiles[0], Modulemd.Profile) self.assertEqual(profiles[0].get_name(), "thesecondprofile") self.assertIsInstance(profiles[1], Modulemd.Profile) self.assertEqual(profiles[1].get_name(), "thethirdprofile") profiles = stream.search_profiles("the*profile") self.assertIsNotNone(profiles) self.assertEqual(len(profiles), 3) self.assertIsInstance(profiles[0], Modulemd.Profile) self.assertEqual(profiles[0].get_name(), "thefirstprofile") self.assertIsInstance(profiles[1], Modulemd.Profile) self.assertEqual(profiles[1].get_name(), "thesecondprofile") self.assertIsInstance(profiles[2], Modulemd.Profile) self.assertEqual(profiles[2].get_name(), "thethirdprofile") profiles = stream.search_profiles("the*") self.assertIsNotNone(profiles) self.assertEqual(len(profiles), 3) self.assertIsInstance(profiles[0], Modulemd.Profile) self.assertEqual(profiles[0].get_name(), "thefirstprofile") self.assertIsInstance(profiles[1], Modulemd.Profile) self.assertEqual(profiles[1].get_name(), "thesecondprofile") self.assertIsInstance(profiles[2], Modulemd.Profile) self.assertEqual(profiles[2].get_name(), "thethirdprofile") def test_static_context(self): stream = Modulemd.ModuleStreamV2.new("themodule", "thestream") # Verify that it defaults to FALSE self.assertFalse(stream.props.static_context) self.assertFalse(stream.is_static_context()) # Test setting and unsetting it via methods stream.set_static_context() self.assertTrue(stream.props.static_context) self.assertTrue(stream.is_static_context()) stream.unset_static_context() self.assertFalse(stream.props.static_context) self.assertFalse(stream.is_static_context()) # Test setting and unsetting it via properties stream.props.static_context = True self.assertTrue(stream.props.static_context) self.assertTrue(stream.is_static_context()) stream.props.static_context = False self.assertFalse(stream.props.static_context) self.assertFalse(stream.is_static_context()) # Read in a stream with a static context idx = Modulemd.load_file( "%s/static_context.yaml" % (os.getenv("TEST_DATA_PATH")) ) streams = idx.search_streams() self.assertEqual(1, len(streams)) stream = streams[0] self.assertTrue(stream.props.static_context) self.assertTrue(stream.is_static_context()) expected = """--- document: modulemd version: 2 data: name: nodejs stream: "8" version: 20180816123422 context: RealCTX static_context: true arch: x86_64 summary: Javascript runtime description: >- Node.js is a platform built on Chrome''s JavaScript runtime for easily building fast, scalable network applications. Node.js uses an event-driven, non-blocking I/O model that makes it lightweight and efficient, perfect for data-intensive real-time applications that run across distributed devices. license: module: - MIT content: - DUMMY dependencies: - buildrequires: platform: [f29] requires: platform: [f29] references: community: http://nodejs.org documentation: http://nodejs.org/en/docs tracker: https://github.com/nodejs/node/issues profiles: default: rpms: - nodejs - npm development: rpms: - nodejs - nodejs-devel - npm minimal: rpms: - nodejs api: rpms: - nodejs - nodejs-devel - npm components: rpms: nodejs: rationale: Javascript runtime and npm package manager. repository: git://pkgs.fedoraproject.org/rpms/nodejs cache: http://pkgs.fedoraproject.org/repo/pkgs/nodejs ref: "8" buildorder: 10 artifacts: rpms: - nodejs-1:8.11.4-1.module_2030+42747d40.x86_64 - nodejs-devel-1:8.11.4-1.module_2030+42747d40.x86_64 - nodejs-docs-1:8.11.4-1.module_2030+42747d40.noarch - npm-1:5.6.0-1.8.11.4.1.module_2030+42747d40.x86_64 ... """ self.maxDiff = None self.assertEqual(expected, idx.dump_to_string()) if __name__ == "__main__": unittest.main() fedora-modularity-libmodulemd-357799c/modulemd/tests/ModulemdTests/obsoletes.py000066400000000000000000000041041502446517500300520ustar00rootroot00000000000000#!/usr/bin/python3 # This file is part of libmodulemd # Copyright (C) 2020 Red Hat, Inc. # # Fedora-License-Identifier: MIT # SPDX-2.0-License-Identifier: MIT # SPDX-3.0-License-Identifier: MIT # # This program is free software. # For more information on the license, see COPYING. # For more information on free software, see # . import sys try: import unittest import gi gi.require_version("Modulemd", "2.0") from gi.repository import Modulemd except ImportError: # Return error 77 to skip this test on platforms without the necessary # python modules sys.exit(77) from base import TestBase class TestObsoletes(TestBase): def test_constructors(self): # Test that the new() function works o = Modulemd.Obsoletes.new(1, 2, "testmodule", "teststream", "testmsg") assert o assert o.props.mdversion == 1 assert o.props.modified == 2 assert o.props.module_name == "testmodule" assert o.props.module_stream == "teststream" assert o.props.message == "testmsg" # Test that keywords are accepted o = Modulemd.Obsoletes( mdversion=1, modified=42, module_name="testmodule2", module_stream="teststream2", message="testmessage2", ) assert o assert o.validate() assert o.props.mdversion == 1 assert o.props.modified == 42 assert o.props.module_name == "testmodule2" assert o.props.module_stream == "teststream2" assert o.props.message == "testmessage2" def test_copy(self): o = Modulemd.Obsoletes.new(1, 2, "testmodule", "teststream", "testmsg") o_copy = o.copy() assert o_copy assert o_copy.validate() assert o_copy.props.mdversion == 1 assert o_copy.props.modified == 2 assert o_copy.props.module_name == "testmodule" assert o_copy.props.module_stream == "teststream" assert o_copy.props.message == "testmsg" if __name__ == "__main__": unittest.main() fedora-modularity-libmodulemd-357799c/modulemd/tests/ModulemdTests/profile.py000066400000000000000000000064311502446517500275200ustar00rootroot00000000000000#!/usr/bin/python3 # This file is part of libmodulemd # Copyright (C) 2018 Red Hat, Inc. # # Fedora-License-Identifier: MIT # SPDX-2.0-License-Identifier: MIT # SPDX-3.0-License-Identifier: MIT # # This program is free software. # For more information on the license, see COPYING. # For more information on free software, see # . import sys try: import unittest import gi gi.require_version("Modulemd", "2.0") from gi.repository import Modulemd except ImportError: # Return error 77 to skip this test on platforms without the necessary # python modules sys.exit(77) from base import TestBase class TestProfile(TestBase): def test_constructor(self): # Test that the new() function works p = Modulemd.Profile.new("testprofile") assert p assert p.props.name == "testprofile" assert p.get_name() == "testprofile" assert p.get_description() is None assert p.get_rpms() == [] # Test that keyword name is accepted p = Modulemd.Profile(name="testprofile") assert p assert p.props.name == "testprofile" assert p.get_name() == "testprofile" assert p.get_description() is None assert p.get_rpms() == [] # Test that we fail without name with self.assertRaises(TypeError) as cm: Modulemd.Profile.new(None) assert "does not allow None as a value" in cm.exception.__str__() with self.expect_signal(): Modulemd.Profile() with self.expect_signal(): Modulemd.Profile(name=None) def test_copy(self): p_orig = Modulemd.Profile(name="testprofile") p = p_orig.copy() assert p assert p.props.name == "testprofile" assert p.get_name() == "testprofile" assert p.get_description() is None assert p.get_rpms() == [] p_orig.set_description("Test profile") p.add_rpm("test2") p.add_rpm("test3") p.add_rpm("test1") p = p_orig.copy() assert p assert p.props.name == "testprofile" assert p.get_name() == "testprofile" assert p.get_description() == "Test profile" assert p.get_rpms() == ["test1", "test2", "test3"] def test_get_name(self): p = Modulemd.Profile(name="testprofile") assert p.get_name() == "testprofile" assert p.props.name == "testprofile" with self.expect_signal(): p.props.name = "notadrill" def test_get_set_description(self): p = Modulemd.Profile(name="testprofile") assert p.get_description() is None p.set_description("foobar") assert p.get_description() == "foobar" p.set_description(None) assert p.get_description() is None def test_rpms(self): p = Modulemd.Profile(name="testprofile") assert p.get_rpms() == [] p.add_rpm("test2") assert p.get_rpms() == ["test2"] p.add_rpm("test3") p.add_rpm("test1") assert p.get_rpms() == ["test1", "test2", "test3"] p.add_rpm("test2") assert p.get_rpms() == ["test1", "test2", "test3"] p.remove_rpm("test1") assert p.get_rpms() == ["test2", "test3"] if __name__ == "__main__": unittest.main() fedora-modularity-libmodulemd-357799c/modulemd/tests/ModulemdTests/rpmmap.py000066400000000000000000000071711502446517500273560ustar00rootroot00000000000000#!/usr/bin/python3 # This file is part of libmodulemd # Copyright (C) 2017-2018 Stephen Gallagher # # Fedora-License-Identifier: MIT # SPDX-2.0-License-Identifier: MIT # SPDX-3.0-License-Identifier: MIT # # This program is free software. # For more information on the license, see COPYING. # For more information on free software, see # . import os import sys try: import unittest import gi gi.require_version("Modulemd", "2.0") from gi.repository import GLib from gi.repository import Modulemd except ImportError: # Return error 77 to skip this test on platforms without the necessary # python modules sys.exit(77) from base import TestBase class TestRpmMapEntry(TestBase): def test_basic(self): # Test that the new() function works entry = Modulemd.RpmMapEntry.new( "bar", 0, "1.23", "1.module_deadbeef", "x86_64" ) self.assertIsNotNone(entry) self.assertEqual(entry.props.name, "bar") self.assertEqual(entry.props.epoch, 0) self.assertEqual(entry.props.version, "1.23") self.assertEqual(entry.props.release, "1.module_deadbeef") self.assertEqual(entry.props.arch, "x86_64") self.assertEqual( entry.props.nevra, "bar-0:1.23-1.module_deadbeef.x86_64" ) # Test that object instantiation with attributes works entry2 = Modulemd.RpmMapEntry( name="bar", version="1.23", release="1.module_deadbeef", arch="x86_64", ) self.assertEqual( entry2.props.nevra, "bar-0:1.23-1.module_deadbeef.x86_64" ) # Test that nevra returns NULL if attributes are missing # Remove name entry2.props.name = None with self.assertRaisesRegex( gi.repository.GLib.GError, "Missing name attribute" ): entry2.validate() self.assertIsNone(entry2.props.nevra) entry2.props.name = "bar" # Remove the version entry2.props.version = None with self.assertRaisesRegex( gi.repository.GLib.GError, "Missing version attribute" ): entry2.validate() self.assertIsNone(entry2.props.nevra) entry2.props.version = "1.23" # Remove the release entry2.props.release = None with self.assertRaisesRegex( gi.repository.GLib.GError, "Missing release attribute" ): entry2.validate() self.assertIsNone(entry2.props.nevra) entry2.props.release = "1.module_deadbeef" # Remove the arch entry2.props.arch = None with self.assertRaisesRegex( gi.repository.GLib.GError, "Missing arch attribute" ): entry2.validate() self.assertIsNone(entry2.props.nevra) entry2.props.arch = "x86_64" self.assertEqual( entry2.props.nevra, "bar-0:1.23-1.module_deadbeef.x86_64" ) def test_compare(self): entry = Modulemd.RpmMapEntry.new( "bar", 0, "1.23", "1.module_deadbeef", "x86_64" ) self.assertIsNotNone(entry) entry2 = Modulemd.RpmMapEntry.new( "bar", 0, "1.23", "1.module_deadbeef", "x86_64" ) self.assertIsNotNone(entry2) entry3 = Modulemd.RpmMapEntry.new( "foo", 0, "1.23", "1.module_deadbeef", "x86_64" ) self.assertIsNotNone(entry3) self.assertTrue(entry.equals(entry)) self.assertTrue(entry.equals(entry2)) self.assertFalse(entry.equals(entry3)) if __name__ == "__main__": unittest.main() fedora-modularity-libmodulemd-357799c/modulemd/tests/ModulemdTests/servicelevel.py000066400000000000000000000121741502446517500305510ustar00rootroot00000000000000#!/usr/bin/python3 # This file is part of libmodulemd # Copyright (C) 2017-2018 Stephen Gallagher # # Fedora-License-Identifier: MIT # SPDX-2.0-License-Identifier: MIT # SPDX-3.0-License-Identifier: MIT # # This program is free software. # For more information on the license, see COPYING. # For more information on free software, see # . import sys try: import unittest import gi gi.require_version("Modulemd", "2.0") from gi.repository import Modulemd from gi.repository import GLib except ImportError: # Return error 77 to skip this test on platforms without the necessary # python modules sys.exit(77) from base import TestBase import datetime class TestServiceLevel(TestBase): def test_constructors(self): # Test that the new() function works sl = Modulemd.ServiceLevel.new("foo") assert sl assert sl.props.name == "foo" assert sl.get_name() == "foo" assert sl.get_eol() is None assert sl.get_eol_as_string() is None # Test that standard object instatiation works with a name sl = Modulemd.ServiceLevel(name="foo") assert sl assert sl.props.name == "foo" assert sl.get_name() == "foo" assert sl.get_eol() is None assert sl.get_eol_as_string() is None # Test that we fail if we call new() with a None name try: sl = Modulemd.ServiceLevel.new(None) assert False except TypeError as e: assert "does not allow None as a value" in e.__str__() # Test that we fail if object is instantiated without a name with self.expect_signal(): sl = Modulemd.ServiceLevel() # Test that we fail if object is instantiated with a None name with self.expect_signal(): sl = Modulemd.ServiceLevel(name=None) def test_copy(self): sl = Modulemd.ServiceLevel.new("foo") assert sl assert sl.props.name == "foo" assert sl.get_name() == "foo" assert sl.get_eol() is None assert sl.get_eol_as_string() is None sl_copy = sl.copy() assert sl_copy assert sl_copy.props.name == "foo" assert sl_copy.get_name() == "foo" assert sl_copy.get_eol() is None assert sl_copy.get_eol_as_string() is None sl.set_eol_ymd(2018, 11, 13) sl_copy = sl.copy() assert sl_copy assert sl_copy.props.name == "foo" assert sl_copy.get_name() == "foo" assert sl_copy.get_eol() is not None assert sl_copy.get_eol_as_string() == "2018-11-13" def test_get_name(self): sl = Modulemd.ServiceLevel.new("foo") assert sl.get_name() == "foo" assert sl.props.name == "foo" # This property is not writable, make sure it fails to attempt it with self.expect_signal(): sl.props.name = "bar" def test_get_set_eol(self): sl = Modulemd.ServiceLevel.new("foo") if "_overrides_module" in dir(Modulemd): # Test that EOL is initialized to None assert sl.get_eol() is None # Test the set_eol() method eol = datetime.date(2018, 11, 7) sl.set_eol(eol) returned_eol = sl.get_eol() assert returned_eol is not None assert returned_eol == eol assert sl.get_eol_as_string() == "2018-11-07" # Test the set_eol_ymd() method sl.set_eol_ymd(2019, 12, 3) returned_eol = sl.get_eol() assert returned_eol is not None assert returned_eol.day == 3 assert returned_eol.month == 12 assert returned_eol.year == 2019 assert sl.get_eol_as_string() == "2019-12-03" # There is no February 31 sl.set_eol_ymd(2011, 2, 31) assert sl.get_eol() is None else: # Test that EOL is initialized to None assert sl.get_eol() is None # Test the set_eol() method eol = GLib.Date.new_dmy(7, 11, 2018) sl.set_eol(eol) returned_eol = sl.get_eol() assert returned_eol is not None assert returned_eol.get_day() == eol.get_day() assert returned_eol.get_month() == eol.get_month() assert returned_eol.get_year() == eol.get_year() assert sl.get_eol_as_string() == "2018-11-07" # Test the set_eol_ymd() method sl.set_eol_ymd(2019, 12, 3) returned_eol = sl.get_eol() assert returned_eol is not None assert returned_eol.get_day() == 3 assert returned_eol.get_month() == 12 assert returned_eol.get_year() == 2019 assert sl.get_eol_as_string() == "2019-12-03" # Try setting some invalid dates # An initialized but unset date eol = GLib.Date.new() sl.set_eol(eol) assert sl.get_eol() is None # There is no February 31 sl.set_eol_ymd(2011, 2, 31) assert sl.get_eol() is None if __name__ == "__main__": unittest.main() fedora-modularity-libmodulemd-357799c/modulemd/tests/ModulemdTests/translation.py000066400000000000000000000026261502446517500304200ustar00rootroot00000000000000#!/usr/bin/python3 # This file is part of libmodulemd # Copyright (C) 2018 Red Hat, Inc. # # Fedora-License-Identifier: MIT # SPDX-2.0-License-Identifier: MIT # SPDX-3.0-License-Identifier: MIT # # This program is free software. # For more information on the license, see COPYING. # For more information on free software, see # . import sys try: import unittest import gi gi.require_version("Modulemd", "2.0") from gi.repository import Modulemd except ImportError: # Return error 77 to skip this test on platforms without the necessary # python modules sys.exit(77) from base import TestBase class TestTranslation(TestBase): def test_constructors(self): # Test that the new() function works t = Modulemd.Translation.new(1, "testmodule", "teststream", 42) assert t # Test that keywords are accepted t = Modulemd.Translation( version=1, module_name="testmodule", module_stream="teststream", modified=42, ) assert t assert t.validate() assert t.get_locales() == [] def test_copy(self): t_orig = Modulemd.Translation.new(1, "testmodule", "teststream", 42) t = t_orig.copy() assert t assert t.validate() assert t.get_locales() == [] if __name__ == "__main__": unittest.main() fedora-modularity-libmodulemd-357799c/modulemd/tests/ModulemdTests/translationentry.py000066400000000000000000000211621502446517500314760ustar00rootroot00000000000000#!/usr/bin/python3 # -*- coding: utf-8 -*- # This file is part of libmodulemd # Copyright (C) 2018 Red Hat, Inc. # # Fedora-License-Identifier: MIT # SPDX-2.0-License-Identifier: MIT # SPDX-3.0-License-Identifier: MIT # # This program is free software. # For more information on the license, see COPYING. # For more information on free software, see # . import sys try: import unittest import gi gi.require_version("Modulemd", "2.0") from gi.repository import Modulemd except ImportError: # Return error 77 to skip this test on platforms without the necessary # python modules sys.exit(77) from base import TestBase class TestTranslationEntry(TestBase): def test_constructors(self): # Test that the new() function works te = Modulemd.TranslationEntry.new("en_US") assert te assert te.props.locale == "en_US" assert te.get_locale() == "en_US" assert te.props.summary is None assert te.get_summary() is None assert te.props.description is None assert te.get_description() is None assert te.get_profiles() == [] assert te.get_profile_description("test") is None # Test that keyword arg locale is accepted te = Modulemd.TranslationEntry(locale="en_US") assert te assert te.props.locale == "en_US" assert te.get_locale() == "en_US" assert te.props.summary is None assert te.get_summary() is None assert te.props.description is None assert te.get_description() is None assert te.get_profiles() == [] assert te.get_profile_description("test") is None # Test that init works with locale and summary te = Modulemd.TranslationEntry(locale="en_US", summary="foobar") assert te assert te.props.locale == "en_US" assert te.get_locale() == "en_US" assert te.props.summary == "foobar" assert te.get_summary() == "foobar" assert te.props.description is None assert te.get_description() is None assert te.get_profiles() == [] assert te.get_profile_description("test") is None # Test that init works with locale and description te = Modulemd.TranslationEntry(locale="en_US", description="barfoo") assert te assert te.props.locale == "en_US" assert te.get_locale() == "en_US" assert te.props.summary is None assert te.get_summary() is None assert te.props.description == "barfoo" assert te.get_description() == "barfoo" assert te.get_profiles() == [] assert te.get_profile_description("test") is None # Test that init works with locale, summary and description te = Modulemd.TranslationEntry( locale="en_US", summary="foobar", description="barfoo" ) assert te assert te.props.locale == "en_US" assert te.get_locale() == "en_US" assert te.props.summary == "foobar" assert te.get_summary() == "foobar" assert te.props.description == "barfoo" assert te.get_description() == "barfoo" assert te.get_profiles() == [] assert te.get_profile_description("test") is None # Test that init works with locale, unicode summary and unicode # description te = Modulemd.TranslationEntry( locale="ro_TA", # robots_Tables summary="(┛ಠ_ಠ)┛彡┻━┻", description="(┛ಠ_ಠ)┛彡", ) assert te assert te.props.locale == "ro_TA" assert te.get_locale() == "ro_TA" assert te.props.summary == "(┛ಠ_ಠ)┛彡┻━┻" assert te.get_summary() == "(┛ಠ_ಠ)┛彡┻━┻" assert te.props.description == "(┛ಠ_ಠ)┛彡" assert te.get_description() == "(┛ಠ_ಠ)┛彡" assert te.get_profiles() == [] assert te.get_profile_description("test") is None # Test that we fail if we call new() with a None locale try: te = Modulemd.TranslationEntry.new(None) assert False except TypeError as e: assert "does not allow None as a value" in e.__str__() # Test that we fail if object is instantiated without a locale with self.expect_signal(): Modulemd.TranslationEntry() # Test that we fail if object is instantiated with a None locale with self.expect_signal(): Modulemd.TranslationEntry(locale=None) def test_copy(self): te_orig = Modulemd.TranslationEntry(locale="en_US") te = te_orig.copy() assert te assert te.props.locale == "en_US" assert te.get_locale() == "en_US" assert te.props.summary is None assert te.get_summary() is None assert te.props.description is None assert te.get_description() is None assert te.get_profiles() == [] assert te.get_profile_description("test") is None te_orig.set_summary("foobar") te_orig.set_description("barfoo") te_orig.set_profile_description("test1", "brown fox") te_orig.set_profile_description("test2", "jumped") te = te_orig.copy() assert te assert te.props.locale == "en_US" assert te.get_locale() == "en_US" assert te.props.summary == "foobar" assert te.get_summary() == "foobar" assert te.props.description == "barfoo" assert te.get_description() == "barfoo" assert te.get_profiles() == ["test1", "test2"] assert te.get_profile_description("test") is None assert te.get_profile_description("test1") == "brown fox" assert te.get_profile_description("test2") == "jumped" def test_get_locale(self): te = Modulemd.TranslationEntry(locale="en_US") assert te.get_locale() == "en_US" assert te.props.locale == "en_US" with self.expect_signal(): te.props.locale = "en_GB" def test_get_set_summary(self): te = Modulemd.TranslationEntry(locale="en_US") assert te.props.locale == "en_US" assert te.get_locale() == "en_US" assert te.props.summary is None assert te.get_summary() is None te.set_summary("foobar") assert te.props.summary == "foobar" assert te.get_summary() == "foobar" te.props.summary = "barfoo" assert te.props.summary == "barfoo" assert te.get_summary() == "barfoo" te.props.summary = None assert te.props.summary is None assert te.get_summary() is None def test_get_set_description(self): te = Modulemd.TranslationEntry(locale="en_US") assert te.props.locale == "en_US" assert te.get_locale() == "en_US" assert te.props.description is None assert te.get_description() is None te.set_description("foobar") assert te.props.description == "foobar" assert te.get_description() == "foobar" te.props.description = "barfoo" assert te.props.description == "barfoo" assert te.get_description() == "barfoo" te.props.description = None assert te.props.description is None assert te.get_description() is None def test_profile_descriptions(self): te = Modulemd.TranslationEntry(locale="en_US") assert te.props.locale == "en_US" assert te.get_locale() == "en_US" assert te.get_profiles() == [] assert te.get_profile_description("test1") is None assert te.get_profile_description("test2") is None assert te.get_profile_description("test3") is None # Add a profile te.set_profile_description("test1", "foobar") assert te.get_profiles() == ["test1"] assert te.get_profile_description("test1") == "foobar" assert te.get_profile_description("test2") is None assert te.get_profile_description("test3") is None # Add a second profile te.set_profile_description("test2", "barfoo") assert te.get_profiles() == ["test1", "test2"] assert te.get_profile_description("test1") == "foobar" assert te.get_profile_description("test2") == "barfoo" assert te.get_profile_description("test3") is None # Add a third one that is supposed to go before the others te.set_profile_description("test3", "foobarfoo") assert te.get_profiles() == ["test1", "test2", "test3"] assert te.get_profile_description("test1") == "foobar" assert te.get_profile_description("test2") == "barfoo" assert te.get_profile_description("test3") == "foobarfoo" if __name__ == "__main__": unittest.main() fedora-modularity-libmodulemd-357799c/modulemd/tests/test-import-headers.sh000077500000000000000000000023561502446517500271560ustar00rootroot00000000000000#!/bin/bash # This file is part of libmodulemd # Copyright (C) 2017-2018 Stephen Gallagher # # Fedora-License-Identifier: MIT # SPDX-2.0-License-Identifier: MIT # SPDX-3.0-License-Identifier: MIT # # This program is free software. # For more information on the license, see COPYING. # For more information on free software, see # . set -e tempdir=`mktemp -d` pushd $tempdir for arg; do header=`basename $arg` cat << EOF > $header.c #include "$header" int main (int argc, char **argv) { return 0; } EOF cat $header.c echo "gcc \`pkg-config --cflags gobject-2.0\` \ \`pkg-config --cflags yaml-0.1\` \ -I `dirname $arg` \ -o $header.out \ $header.c" gcc `pkg-config --cflags gobject-2.0` \ `pkg-config --cflags yaml-0.1` \ -I `dirname $arg` \ -o $header.out \ $header.c echo "g++ \`pkg-config --cflags gobject-2.0\` \ \`pkg-config --cflags yaml-0.1\` \ -I `dirname $arg` \ -o $header.out \ $header.c" g++ `pkg-config --cflags gobject-2.0` \ `pkg-config --cflags yaml-0.1` \ -I `dirname $arg` \ -o $header.out \ $header.c done popd rm -Rf $tempdirfedora-modularity-libmodulemd-357799c/modulemd/tests/test-modulemd-build-config.c000066400000000000000000001147221502446517500302070ustar00rootroot00000000000000/* * This file is part of libmodulemd * Copyright (C) 2020 Red Hat, Inc. * * Fedora-License-Identifier: MIT * SPDX-2.0-License-Identifier: MIT * SPDX-3.0-License-Identifier: MIT * * This program is free software. * For more information on the license, see COPYING. * For more information on free software, see . */ #include #include #include #include #include "private/glib-extensions.h" #include "private/modulemd-build-config-private.h" #include "private/modulemd-yaml.h" #include "private/test-utils.h" static void buildconfig_test_construct (void) { g_autoptr (ModulemdBuildConfig) bc = NULL; g_auto (GStrv) requires = NULL; /* == Test that the new() function works == */ bc = modulemd_build_config_new (); g_assert_nonnull (bc); g_assert_true (MODULEMD_IS_BUILD_CONFIG (bc)); /* == Verify that it is constructed properly == */ /* context should be NULL */ g_assert_null (modulemd_build_config_get_context (bc)); /* platform should be NULL */ g_assert_null (modulemd_build_config_get_platform (bc)); /* runtime requires should be empty */ requires = modulemd_build_config_get_runtime_modules_as_strv (bc); g_assert_nonnull (requires); g_assert_null (requires[0]); g_clear_pointer (&requires, g_strfreev); /* buildtime requires should be empty */ requires = modulemd_build_config_get_buildtime_modules_as_strv (bc); g_assert_nonnull (requires); g_assert_null (requires[0]); g_clear_pointer (&requires, g_strfreev); /* There should be no associated build options */ g_assert_null (modulemd_build_config_get_buildopts (bc)); } static void buildconfig_test_context (void) { g_autoptr (ModulemdBuildConfig) bc = NULL; bc = modulemd_build_config_new (); g_assert_nonnull (bc); g_assert_true (MODULEMD_IS_BUILD_CONFIG (bc)); /* context should be NULL */ g_assert_null (modulemd_build_config_get_context (bc)); /* Set a context value */ modulemd_build_config_set_context (bc, "CTX1"); /* Verify that we can retrieve this value */ g_assert_nonnull (modulemd_build_config_get_context (bc)); g_assert_cmpstr ("CTX1", ==, modulemd_build_config_get_context (bc)); /* Unset the context */ modulemd_build_config_set_context (bc, NULL); /* context should be NULL */ g_assert_null (modulemd_build_config_get_context (bc)); } static void buildconfig_test_platform (void) { g_autoptr (ModulemdBuildConfig) bc = NULL; bc = modulemd_build_config_new (); g_assert_nonnull (bc); g_assert_true (MODULEMD_IS_BUILD_CONFIG (bc)); /* platform should be NULL */ g_assert_null (modulemd_build_config_get_platform (bc)); /* Set a platform value */ modulemd_build_config_set_platform (bc, "f33"); /* Verify that we can retrieve this value */ g_assert_nonnull (modulemd_build_config_get_platform (bc)); g_assert_cmpstr ("f33", ==, modulemd_build_config_get_platform (bc)); /* Unset the platform */ modulemd_build_config_set_platform (bc, NULL); /* platform should be NULL */ g_assert_null (modulemd_build_config_get_platform (bc)); } static void buildconfig_test_requires (void) { g_autoptr (ModulemdBuildConfig) bc = NULL; g_auto (GStrv) required_modules = NULL; bc = modulemd_build_config_new (); g_assert_nonnull (bc); g_assert_true (MODULEMD_IS_BUILD_CONFIG (bc)); /* Add a runtime requirement */ modulemd_build_config_add_runtime_requirement (bc, "framework", "1.0"); /* Confirm that it was added */ required_modules = modulemd_build_config_get_runtime_modules_as_strv (bc); g_assert_nonnull (required_modules); g_assert_nonnull (required_modules[0]); g_assert_cmpstr ("framework", ==, required_modules[0]); g_assert_cmpstr ( "1.0", ==, modulemd_build_config_get_runtime_requirement_stream (bc, "framework")); g_assert_null (required_modules[1]); g_clear_pointer (&required_modules, g_strfreev); /* Add another requirement */ modulemd_build_config_add_runtime_requirement (bc, "docbuilder", "rolling"); /* Confirm that it was added */ required_modules = modulemd_build_config_get_runtime_modules_as_strv (bc); g_assert_nonnull (required_modules); g_assert_nonnull (required_modules[0]); g_assert_cmpstr ("docbuilder", ==, required_modules[0]); g_assert_cmpstr ( "rolling", ==, modulemd_build_config_get_runtime_requirement_stream (bc, "docbuilder")); g_assert_nonnull (required_modules[1]); g_assert_cmpstr ("framework", ==, required_modules[1]); g_assert_cmpstr ( "1.0", ==, modulemd_build_config_get_runtime_requirement_stream (bc, "framework")); g_assert_null (required_modules[2]); g_clear_pointer (&required_modules, g_strfreev); /* Replace a dependency with a different stream */ modulemd_build_config_add_runtime_requirement (bc, "docbuilder", "stable"); /* Confirm that it was added */ required_modules = modulemd_build_config_get_runtime_modules_as_strv (bc); g_assert_nonnull (required_modules); g_assert_nonnull (required_modules[0]); g_assert_cmpstr ("docbuilder", ==, required_modules[0]); g_assert_cmpstr ( "stable", ==, modulemd_build_config_get_runtime_requirement_stream (bc, "docbuilder")); g_assert_nonnull (required_modules[1]); g_assert_cmpstr ("framework", ==, required_modules[1]); g_assert_cmpstr ( "1.0", ==, modulemd_build_config_get_runtime_requirement_stream (bc, "framework")); g_assert_null (required_modules[2]); g_clear_pointer (&required_modules, g_strfreev); /* Remove a dependency */ modulemd_build_config_remove_runtime_requirement (bc, "framework"); /* Confirm that it was removed */ required_modules = modulemd_build_config_get_runtime_modules_as_strv (bc); g_assert_nonnull (required_modules); g_assert_nonnull (required_modules[0]); g_assert_cmpstr ("docbuilder", ==, required_modules[0]); g_assert_cmpstr ( "stable", ==, modulemd_build_config_get_runtime_requirement_stream (bc, "docbuilder")); g_assert_null (required_modules[1]); g_clear_pointer (&required_modules, g_strfreev); /* Remove a nonexistent dependency */ modulemd_build_config_remove_runtime_requirement (bc, "notpresent"); /* Confirm that nothing changed */ required_modules = modulemd_build_config_get_runtime_modules_as_strv (bc); g_assert_nonnull (required_modules); g_assert_nonnull (required_modules[0]); g_assert_cmpstr ("docbuilder", ==, required_modules[0]); g_assert_cmpstr ( "stable", ==, modulemd_build_config_get_runtime_requirement_stream (bc, "docbuilder")); g_assert_null (required_modules[1]); g_clear_pointer (&required_modules, g_strfreev); /* Clear all the requirements */ modulemd_build_config_clear_runtime_requirements (bc); required_modules = modulemd_build_config_get_runtime_modules_as_strv (bc); g_assert_nonnull (required_modules); g_assert_null (required_modules[0]); g_clear_pointer (&required_modules, g_strfreev); } static void buildconfig_test_buildrequires (void) { g_autoptr (ModulemdBuildConfig) bc = NULL; g_auto (GStrv) required_modules = NULL; bc = modulemd_build_config_new (); g_assert_nonnull (bc); g_assert_true (MODULEMD_IS_BUILD_CONFIG (bc)); /* Add a buildtime requirement */ modulemd_build_config_add_buildtime_requirement (bc, "framework", "1.0"); /* Confirm that it was added */ required_modules = modulemd_build_config_get_buildtime_modules_as_strv (bc); g_assert_nonnull (required_modules); g_assert_nonnull (required_modules[0]); g_assert_cmpstr ("framework", ==, required_modules[0]); g_assert_cmpstr ( "1.0", ==, modulemd_build_config_get_buildtime_requirement_stream (bc, "framework")); g_assert_null (required_modules[1]); g_clear_pointer (&required_modules, g_strfreev); /* Add another requirement */ modulemd_build_config_add_buildtime_requirement ( bc, "docbuilder", "rolling"); /* Confirm that it was added */ required_modules = modulemd_build_config_get_buildtime_modules_as_strv (bc); g_assert_nonnull (required_modules); g_assert_nonnull (required_modules[0]); g_assert_cmpstr ("docbuilder", ==, required_modules[0]); g_assert_cmpstr ( "rolling", ==, modulemd_build_config_get_buildtime_requirement_stream (bc, "docbuilder")); g_assert_nonnull (required_modules[1]); g_assert_cmpstr ("framework", ==, required_modules[1]); g_assert_cmpstr ( "1.0", ==, modulemd_build_config_get_buildtime_requirement_stream (bc, "framework")); g_assert_null (required_modules[2]); g_clear_pointer (&required_modules, g_strfreev); /* Replace a dependency with a different stream */ modulemd_build_config_add_buildtime_requirement (bc, "docbuilder", "stable"); /* Confirm that it was added */ required_modules = modulemd_build_config_get_buildtime_modules_as_strv (bc); g_assert_nonnull (required_modules); g_assert_nonnull (required_modules[0]); g_assert_cmpstr ("docbuilder", ==, required_modules[0]); g_assert_cmpstr ( "stable", ==, modulemd_build_config_get_buildtime_requirement_stream (bc, "docbuilder")); g_assert_nonnull (required_modules[1]); g_assert_cmpstr ("framework", ==, required_modules[1]); g_assert_cmpstr ( "1.0", ==, modulemd_build_config_get_buildtime_requirement_stream (bc, "framework")); g_assert_null (required_modules[2]); g_clear_pointer (&required_modules, g_strfreev); /* Remove a dependency */ modulemd_build_config_remove_buildtime_requirement (bc, "framework"); /* Confirm that it was removed */ required_modules = modulemd_build_config_get_buildtime_modules_as_strv (bc); g_assert_nonnull (required_modules); g_assert_nonnull (required_modules[0]); g_assert_cmpstr ("docbuilder", ==, required_modules[0]); g_assert_cmpstr ( "stable", ==, modulemd_build_config_get_buildtime_requirement_stream (bc, "docbuilder")); g_assert_null (required_modules[1]); g_clear_pointer (&required_modules, g_strfreev); /* Remove a nonexistent dependency */ modulemd_build_config_remove_buildtime_requirement (bc, "notpresent"); /* Confirm that nothing changed */ required_modules = modulemd_build_config_get_buildtime_modules_as_strv (bc); g_assert_nonnull (required_modules); g_assert_nonnull (required_modules[0]); g_assert_cmpstr ("docbuilder", ==, required_modules[0]); g_assert_cmpstr ( "stable", ==, modulemd_build_config_get_buildtime_requirement_stream (bc, "docbuilder")); g_assert_null (required_modules[1]); g_clear_pointer (&required_modules, g_strfreev); /* Clear all the requirements */ modulemd_build_config_clear_buildtime_requirements (bc); required_modules = modulemd_build_config_get_buildtime_modules_as_strv (bc); g_assert_nonnull (required_modules); g_assert_null (required_modules[0]); g_clear_pointer (&required_modules, g_strfreev); } static void buildconfig_test_buildopts (void) { g_autoptr (ModulemdBuildConfig) bc = NULL; g_autoptr (ModulemdBuildopts) opts = NULL; ModulemdBuildopts *retrieved = NULL; bc = modulemd_build_config_new (); g_assert_nonnull (bc); g_assert_true (MODULEMD_IS_BUILD_CONFIG (bc)); g_assert_null (modulemd_build_config_get_buildopts (bc)); /* Create a buildopts object to store */ opts = modulemd_buildopts_new (); modulemd_buildopts_set_rpm_macros (opts, "%global test 1"); modulemd_build_config_set_buildopts (bc, opts); retrieved = modulemd_build_config_get_buildopts (bc); g_assert_nonnull (retrieved); g_assert_true (modulemd_buildopts_equals (opts, retrieved)); /* Confirm we're getting back a copy and not the same pointer */ g_assert_false (opts == retrieved); /* Unset the buildopts */ modulemd_build_config_set_buildopts (bc, NULL); g_assert_null (modulemd_build_config_get_buildopts (bc)); } static void buildconfig_test_parse_yaml (void) { MMD_INIT_YAML_EVENT (event); MMD_INIT_YAML_PARSER (parser); g_autofree gchar *yaml_path = NULL; g_autoptr (ModulemdBuildConfig) bc = NULL; ModulemdBuildopts *opts = NULL; g_autoptr (FILE) yaml_stream = NULL; g_autoptr (GError) error = NULL; g_auto (GStrv) dep_modules = NULL; /* Verify a valid YAML file */ yaml_path = g_strdup_printf ("%s/buildconfig/good_bc.yaml", g_getenv ("TEST_DATA_PATH")); g_assert_nonnull (yaml_path); yaml_stream = g_fopen (yaml_path, "rbe"); g_assert_nonnull (yaml_stream); yaml_parser_set_input_file (&parser, yaml_stream); parser_skip_headers (&parser); bc = modulemd_build_config_parse_yaml (&parser, TRUE, &error); g_assert_no_error (error); g_assert_nonnull (bc); g_assert_true (MODULEMD_IS_BUILD_CONFIG (bc)); g_assert_nonnull (modulemd_build_config_get_context (bc)); g_assert_cmpstr ("CTX1", ==, modulemd_build_config_get_context (bc)); g_assert_nonnull (modulemd_build_config_get_platform (bc)); g_assert_cmpstr ("f32", ==, modulemd_build_config_get_platform (bc)); dep_modules = modulemd_build_config_get_runtime_modules_as_strv (bc); g_assert_nonnull (dep_modules); g_assert_nonnull (dep_modules[0]); g_assert_cmpstr ("appframework", ==, dep_modules[0]); g_assert_null (dep_modules[1]); g_assert_cmpstr ( "v2", ==, modulemd_build_config_get_runtime_requirement_stream (bc, "appframework")); g_clear_pointer (&dep_modules, &g_strfreev); dep_modules = modulemd_build_config_get_buildtime_modules_as_strv (bc); g_assert_nonnull (dep_modules); g_assert_nonnull (dep_modules[0]); g_assert_cmpstr ("appframework", ==, dep_modules[0]); g_assert_nonnull (dep_modules[1]); g_assert_cmpstr ("doctool", ==, dep_modules[1]); g_assert_null (dep_modules[2]); g_assert_cmpstr ("v1", ==, modulemd_build_config_get_buildtime_requirement_stream ( bc, "appframework")); g_assert_cmpstr ( "rolling", ==, modulemd_build_config_get_buildtime_requirement_stream (bc, "doctool")); g_clear_pointer (&dep_modules, &g_strfreev); /* Test that we constructed a ModulemdBuildopts object. * We don't need to check all of its values because that's already done in * the buildopts tests */ opts = modulemd_build_config_get_buildopts (bc); g_assert_nonnull (opts); g_assert_true (MODULEMD_IS_BUILDOPTS (opts)); } static void buildconfig_test_parse_yaml_unknown_key (void) { MMD_INIT_YAML_EVENT (event); MMD_INIT_YAML_PARSER (parser); g_autofree gchar *yaml_path = NULL; g_autoptr (ModulemdBuildConfig) bc = NULL; ModulemdBuildopts *opts = NULL; g_autoptr (FILE) yaml_stream = NULL; g_autoptr (GError) error = NULL; g_auto (GStrv) dep_modules = NULL; /* Read a good YAML file with an unknown key */ yaml_path = g_strdup_printf ("%s/buildconfig/unknown_key.yaml", g_getenv ("TEST_DATA_PATH")); g_assert_nonnull (yaml_path); /* First try it in non-strict mode */ yaml_stream = g_fopen (yaml_path, "rbe"); g_assert_nonnull (yaml_stream); yaml_parser_set_input_file (&parser, yaml_stream); parser_skip_headers (&parser); bc = modulemd_build_config_parse_yaml (&parser, FALSE, &error); g_assert_no_error (error); g_assert_nonnull (bc); g_assert_true (MODULEMD_IS_BUILD_CONFIG (bc)); g_assert_nonnull (modulemd_build_config_get_context (bc)); g_assert_cmpstr ("CTX1", ==, modulemd_build_config_get_context (bc)); g_assert_nonnull (modulemd_build_config_get_platform (bc)); g_assert_cmpstr ("f32", ==, modulemd_build_config_get_platform (bc)); dep_modules = modulemd_build_config_get_runtime_modules_as_strv (bc); g_assert_nonnull (dep_modules); g_assert_nonnull (dep_modules[0]); g_assert_cmpstr ("appframework", ==, dep_modules[0]); g_assert_null (dep_modules[1]); g_assert_cmpstr ( "v2", ==, modulemd_build_config_get_runtime_requirement_stream (bc, "appframework")); g_clear_pointer (&dep_modules, &g_strfreev); dep_modules = modulemd_build_config_get_buildtime_modules_as_strv (bc); g_assert_nonnull (dep_modules); g_assert_nonnull (dep_modules[0]); g_assert_cmpstr ("appframework", ==, dep_modules[0]); g_assert_nonnull (dep_modules[1]); g_assert_cmpstr ("doctool", ==, dep_modules[1]); g_assert_null (dep_modules[2]); g_assert_cmpstr ("v1", ==, modulemd_build_config_get_buildtime_requirement_stream ( bc, "appframework")); g_assert_cmpstr ( "rolling", ==, modulemd_build_config_get_buildtime_requirement_stream (bc, "doctool")); g_clear_pointer (&dep_modules, &g_strfreev); /* Test that we constructed a ModulemdBuildopts object. * We don't need to check all of its values because that's already done in * the buildopts tests */ opts = modulemd_build_config_get_buildopts (bc); g_assert_nonnull (opts); g_assert_true (MODULEMD_IS_BUILDOPTS (opts)); g_clear_object (&bc); /* This should fail in strict mode */ MMD_INIT_YAML_PARSER (strictparser); yaml_stream = g_fopen (yaml_path, "rbe"); g_assert_nonnull (yaml_stream); yaml_parser_set_input_file (&strictparser, yaml_stream); parser_skip_headers (&strictparser); bc = modulemd_build_config_parse_yaml (&strictparser, TRUE, &error); g_assert_error (error, MODULEMD_YAML_ERROR, MMD_YAML_ERROR_UNKNOWN_ATTR); g_assert_null (bc); } static void buildconfig_test_parse_yaml_no_context (void) { MMD_INIT_YAML_EVENT (event); MMD_INIT_YAML_PARSER (parser); g_autofree gchar *yaml_path = NULL; g_autoptr (ModulemdBuildConfig) bc = NULL; g_autoptr (FILE) yaml_stream = NULL; g_autoptr (GError) error = NULL; /* Read a YAML file that is missing context */ yaml_path = g_strdup_printf ("%s/buildconfig/no_context.yaml", g_getenv ("TEST_DATA_PATH")); g_assert_nonnull (yaml_path); yaml_stream = g_fopen (yaml_path, "rbe"); g_assert_nonnull (yaml_stream); yaml_parser_set_input_file (&parser, yaml_stream); parser_skip_headers (&parser); bc = modulemd_build_config_parse_yaml (&parser, TRUE, &error); g_assert_error (error, MODULEMD_ERROR, MMD_ERROR_VALIDATE); g_assert_null (bc); } static void buildconfig_test_parse_yaml_short_context (void) { MMD_INIT_YAML_EVENT (event); MMD_INIT_YAML_PARSER (parser); g_autofree gchar *yaml_path = NULL; g_autoptr (ModulemdBuildConfig) bc = NULL; g_autoptr (FILE) yaml_stream = NULL; g_autoptr (GError) error = NULL; /* Read a YAML file with an empty context */ yaml_path = g_strdup_printf ("%s/buildconfig/short_context.yaml", g_getenv ("TEST_DATA_PATH")); g_assert_nonnull (yaml_path); yaml_stream = g_fopen (yaml_path, "rbe"); g_assert_nonnull (yaml_stream); yaml_parser_set_input_file (&parser, yaml_stream); parser_skip_headers (&parser); bc = modulemd_build_config_parse_yaml (&parser, TRUE, &error); g_assert_error (error, MODULEMD_ERROR, MMD_ERROR_VALIDATE); g_assert_null (bc); } static void buildconfig_test_parse_yaml_long_context (void) { MMD_INIT_YAML_EVENT (event); MMD_INIT_YAML_PARSER (parser); g_autofree gchar *yaml_path = NULL; g_autoptr (ModulemdBuildConfig) bc = NULL; g_autoptr (FILE) yaml_stream = NULL; g_autoptr (GError) error = NULL; /* Read a YAML file that has a context that is too long */ yaml_path = g_strdup_printf ("%s/buildconfig/long_context.yaml", g_getenv ("TEST_DATA_PATH")); g_assert_nonnull (yaml_path); yaml_stream = g_fopen (yaml_path, "rbe"); g_assert_nonnull (yaml_stream); yaml_parser_set_input_file (&parser, yaml_stream); parser_skip_headers (&parser); bc = modulemd_build_config_parse_yaml (&parser, TRUE, &error); g_assert_error (error, MODULEMD_ERROR, MMD_ERROR_VALIDATE); g_assert_null (bc); } static void buildconfig_test_parse_yaml_nonalphanum (void) { MMD_INIT_YAML_EVENT (event); MMD_INIT_YAML_PARSER (parser); g_autofree gchar *yaml_path = NULL; g_autoptr (ModulemdBuildConfig) bc = NULL; g_autoptr (FILE) yaml_stream = NULL; g_autoptr (GError) error = NULL; /* Read a YAML file that has a context with a disallowed character */ yaml_path = g_strdup_printf ("%s/buildconfig/nonalphanum_context.yaml", g_getenv ("TEST_DATA_PATH")); g_assert_nonnull (yaml_path); yaml_stream = g_fopen (yaml_path, "rbe"); g_assert_nonnull (yaml_stream); yaml_parser_set_input_file (&parser, yaml_stream); parser_skip_headers (&parser); bc = modulemd_build_config_parse_yaml (&parser, TRUE, &error); g_assert_error (error, MODULEMD_ERROR, MMD_ERROR_VALIDATE); g_assert_null (bc); } static void buildconfig_test_parse_yaml_no_platform (void) { MMD_INIT_YAML_EVENT (event); MMD_INIT_YAML_PARSER (parser); g_autofree gchar *yaml_path = NULL; g_autoptr (ModulemdBuildConfig) bc = NULL; g_autoptr (FILE) yaml_stream = NULL; g_autoptr (GError) error = NULL; /* Read a YAML file that is missing platform */ yaml_path = g_strdup_printf ("%s/buildconfig/no_platform.yaml", g_getenv ("TEST_DATA_PATH")); g_assert_nonnull (yaml_path); yaml_stream = g_fopen (yaml_path, "rbe"); g_assert_nonnull (yaml_stream); yaml_parser_set_input_file (&parser, yaml_stream); parser_skip_headers (&parser); bc = modulemd_build_config_parse_yaml (&parser, TRUE, &error); g_assert_error (error, MODULEMD_ERROR, MMD_ERROR_VALIDATE); g_assert_null (bc); } static void buildconfig_test_emit_yaml (void) { g_autoptr (ModulemdBuildConfig) bc = NULL; g_autoptr (ModulemdBuildopts) opts = NULL; g_autoptr (GError) error = NULL; MMD_INIT_YAML_EMITTER (emitter); MMD_INIT_YAML_STRING (&emitter, yaml_string); bc = modulemd_build_config_new (); modulemd_build_config_set_context (bc, "CTX1"); modulemd_build_config_set_platform (bc, "f32"); g_assert_true (mmd_emitter_start_stream (&emitter, &error)); g_assert_true (mmd_emitter_start_document (&emitter, &error)); g_assert_true (modulemd_build_config_emit_yaml (bc, &emitter, &error)); g_assert_true (mmd_emitter_end_document (&emitter, &error)); g_assert_true (mmd_emitter_end_stream (&emitter, &error)); g_assert_cmpstr (yaml_string->str, ==, "---\n" "context: CTX1\n" "platform: f32\n" "...\n"); MMD_REINIT_YAML_STRING (&emitter, yaml_string); opts = modulemd_buildopts_new (); modulemd_buildopts_set_rpm_macros (opts, "%global test 1"); modulemd_build_config_set_buildopts (bc, opts); g_assert_true (mmd_emitter_start_stream (&emitter, &error)); g_assert_true (mmd_emitter_start_document (&emitter, &error)); g_assert_true (modulemd_build_config_emit_yaml (bc, &emitter, &error)); g_assert_true (mmd_emitter_end_document (&emitter, &error)); g_assert_true (mmd_emitter_end_stream (&emitter, &error)); g_assert_cmpstr (yaml_string->str, ==, "---\n" "context: CTX1\n" "platform: f32\n" "buildopts:\n" " rpms:\n" " macros: >-\n" " %global test 1\n" "...\n"); MMD_REINIT_YAML_STRING (&emitter, yaml_string); modulemd_build_config_add_buildtime_requirement (bc, "appframework", "v1"); modulemd_build_config_add_buildtime_requirement (bc, "doctool", "rolling"); modulemd_build_config_add_runtime_requirement (bc, "appframework", "v2"); g_assert_true (mmd_emitter_start_stream (&emitter, &error)); g_assert_true (mmd_emitter_start_document (&emitter, &error)); g_assert_true (modulemd_build_config_emit_yaml (bc, &emitter, &error)); g_assert_true (mmd_emitter_end_document (&emitter, &error)); g_assert_true (mmd_emitter_end_stream (&emitter, &error)); g_assert_cmpstr (yaml_string->str, ==, "---\n" "context: CTX1\n" "platform: f32\n" "buildrequires:\n" " appframework: [v1]\n" " doctool: [rolling]\n" "requires:\n" " appframework: [v2]\n" "buildopts:\n" " rpms:\n" " macros: >-\n" " %global test 1\n" "...\n"); } static void buildconfig_test_quoting_yaml (void) { g_autoptr (ModulemdBuildConfig) bc = NULL; g_autoptr (ModulemdBuildopts) opts = NULL; g_autoptr (GError) error = NULL; MMD_INIT_YAML_EMITTER (emitter); MMD_INIT_YAML_STRING (&emitter, yaml_string); bc = modulemd_build_config_new (); modulemd_build_config_set_context (bc, "0"); modulemd_build_config_set_platform (bc, "1"); opts = modulemd_buildopts_new (); modulemd_buildopts_set_rpm_macros (opts, "2"); modulemd_build_config_set_buildopts (bc, opts); modulemd_build_config_add_buildtime_requirement (bc, "3", "4"); modulemd_build_config_add_runtime_requirement (bc, "5", "6"); g_assert_true (mmd_emitter_start_stream (&emitter, &error)); g_assert_true (mmd_emitter_start_document (&emitter, &error)); g_assert_true (modulemd_build_config_emit_yaml (bc, &emitter, &error)); g_assert_true (mmd_emitter_end_document (&emitter, &error)); g_assert_true (mmd_emitter_end_stream (&emitter, &error)); g_assert_cmpstr (yaml_string->str, ==, "---\n" "context: \"0\"\n" "platform: \"1\"\n" "buildrequires:\n" " \"3\": [\"4\"]\n" "requires:\n" " \"5\": [\"6\"]\n" "buildopts:\n" " rpms:\n" " macros: >-\n" " 2\n" "...\n"); } static void buildconfig_test_comparison (void) { g_autoptr (ModulemdBuildConfig) bc_1 = NULL; g_autoptr (ModulemdBuildConfig) bc_2 = NULL; g_autoptr (ModulemdBuildopts) opts = NULL; /* with no properties */ bc_1 = modulemd_build_config_new (); g_assert_nonnull (bc_1); g_assert_true (MODULEMD_IS_BUILD_CONFIG (bc_1)); bc_2 = modulemd_build_config_new (); g_assert_nonnull (bc_2); g_assert_true (MODULEMD_IS_BUILD_CONFIG (bc_2)); g_assert_true (modulemd_build_config_equals (bc_1, bc_2)); g_assert_cmpint (modulemd_build_config_compare (bc_1, bc_2), ==, 0); g_assert_cmpint (modulemd_build_config_compare (bc_2, bc_1), ==, 0); /* checks when NULL is involved */ g_assert_true (modulemd_build_config_equals (NULL, NULL)); g_assert_false (modulemd_build_config_equals (NULL, bc_2)); g_assert_false (modulemd_build_config_equals (bc_1, NULL)); g_assert_cmpint (modulemd_build_config_compare (NULL, NULL), ==, 0); g_assert_cmpint (modulemd_build_config_compare (NULL, bc_2), <, 0); g_assert_cmpint (modulemd_build_config_compare (bc_1, NULL), >, 0); g_clear_object (&bc_1); g_clear_object (&bc_2); /* with same contexts */ bc_1 = modulemd_build_config_new (); g_assert_nonnull (bc_1); g_assert_true (MODULEMD_IS_BUILD_CONFIG (bc_1)); modulemd_build_config_set_context (bc_1, "CTX1"); bc_2 = modulemd_build_config_new (); g_assert_nonnull (bc_2); g_assert_true (MODULEMD_IS_BUILD_CONFIG (bc_2)); modulemd_build_config_set_context (bc_2, "CTX1"); g_assert_true (modulemd_build_config_equals (bc_1, bc_2)); g_assert_cmpint (modulemd_build_config_compare (bc_1, bc_2), ==, 0); g_assert_cmpint (modulemd_build_config_compare (bc_2, bc_1), ==, 0); g_clear_object (&bc_1); g_clear_object (&bc_2); /* with different contexts */ bc_1 = modulemd_build_config_new (); g_assert_nonnull (bc_1); g_assert_true (MODULEMD_IS_BUILD_CONFIG (bc_1)); modulemd_build_config_set_context (bc_1, "CTX1"); bc_2 = modulemd_build_config_new (); g_assert_nonnull (bc_2); g_assert_true (MODULEMD_IS_BUILD_CONFIG (bc_2)); modulemd_build_config_set_context (bc_2, "CTX2"); g_assert_false (modulemd_build_config_equals (bc_1, bc_2)); g_assert_cmpint (modulemd_build_config_compare (bc_1, bc_2), <, 0); g_assert_cmpint (modulemd_build_config_compare (bc_2, bc_1), >, 0); g_clear_object (&bc_1); g_clear_object (&bc_2); /* with same platforms */ bc_1 = modulemd_build_config_new (); g_assert_nonnull (bc_1); g_assert_true (MODULEMD_IS_BUILD_CONFIG (bc_1)); modulemd_build_config_set_platform (bc_1, "f33"); bc_2 = modulemd_build_config_new (); g_assert_nonnull (bc_2); g_assert_true (MODULEMD_IS_BUILD_CONFIG (bc_2)); modulemd_build_config_set_platform (bc_2, "f33"); g_assert_true (modulemd_build_config_equals (bc_1, bc_2)); g_assert_cmpint (modulemd_build_config_compare (bc_1, bc_2), ==, 0); g_assert_cmpint (modulemd_build_config_compare (bc_2, bc_1), ==, 0); g_clear_object (&bc_1); g_clear_object (&bc_2); /* with different platforms */ bc_1 = modulemd_build_config_new (); g_assert_nonnull (bc_1); g_assert_true (MODULEMD_IS_BUILD_CONFIG (bc_1)); modulemd_build_config_set_platform (bc_1, "f33"); bc_2 = modulemd_build_config_new (); g_assert_nonnull (bc_2); g_assert_true (MODULEMD_IS_BUILD_CONFIG (bc_2)); modulemd_build_config_set_platform (bc_2, "f32"); g_assert_false (modulemd_build_config_equals (bc_1, bc_2)); g_assert_cmpint (modulemd_build_config_compare (bc_1, bc_2), >, 0); g_assert_cmpint (modulemd_build_config_compare (bc_2, bc_1), <, 0); g_clear_object (&bc_1); g_clear_object (&bc_2); /* with same buildtime requirements */ bc_1 = modulemd_build_config_new (); g_assert_nonnull (bc_1); g_assert_true (MODULEMD_IS_BUILD_CONFIG (bc_1)); modulemd_build_config_add_buildtime_requirement ( bc_1, "buildmod1", "stream1"); modulemd_build_config_add_buildtime_requirement ( bc_1, "buildmod2", "stream2"); bc_2 = modulemd_build_config_new (); g_assert_nonnull (bc_2); g_assert_true (MODULEMD_IS_BUILD_CONFIG (bc_2)); modulemd_build_config_add_buildtime_requirement ( bc_2, "buildmod1", "stream1"); modulemd_build_config_add_buildtime_requirement ( bc_2, "buildmod2", "stream2"); g_assert_true (modulemd_build_config_equals (bc_1, bc_2)); g_assert_cmpint (modulemd_build_config_compare (bc_1, bc_2), ==, 0); g_assert_cmpint (modulemd_build_config_compare (bc_2, bc_1), ==, 0); g_clear_object (&bc_1); g_clear_object (&bc_2); /* with different buildtime requirements */ bc_1 = modulemd_build_config_new (); g_assert_nonnull (bc_1); g_assert_true (MODULEMD_IS_BUILD_CONFIG (bc_1)); modulemd_build_config_add_buildtime_requirement ( bc_1, "buildmod1", "stream1"); modulemd_build_config_add_buildtime_requirement ( bc_1, "buildmod2", "stream2"); bc_2 = modulemd_build_config_new (); g_assert_nonnull (bc_2); g_assert_true (MODULEMD_IS_BUILD_CONFIG (bc_2)); modulemd_build_config_add_buildtime_requirement ( bc_2, "buildmod1", "stream1"); modulemd_build_config_add_buildtime_requirement ( bc_2, "buildmod2", "stream2"); modulemd_build_config_add_buildtime_requirement ( bc_2, "buildmod3", "stream3"); g_assert_false (modulemd_build_config_equals (bc_1, bc_2)); g_assert_cmpint (modulemd_build_config_compare (bc_1, bc_2), <, 0); g_assert_cmpint (modulemd_build_config_compare (bc_2, bc_1), >, 0); g_clear_object (&bc_1); g_clear_object (&bc_2); /* with same runtime requirements */ bc_1 = modulemd_build_config_new (); g_assert_nonnull (bc_1); g_assert_true (MODULEMD_IS_BUILD_CONFIG (bc_1)); modulemd_build_config_add_runtime_requirement (bc_1, "runmod1", "stream3"); modulemd_build_config_add_runtime_requirement (bc_1, "runmod2", "stream4"); bc_2 = modulemd_build_config_new (); g_assert_nonnull (bc_2); g_assert_true (MODULEMD_IS_BUILD_CONFIG (bc_2)); modulemd_build_config_add_runtime_requirement (bc_2, "runmod1", "stream3"); modulemd_build_config_add_runtime_requirement (bc_2, "runmod2", "stream4"); g_assert_true (modulemd_build_config_equals (bc_1, bc_2)); g_assert_cmpint (modulemd_build_config_compare (bc_1, bc_2), ==, 0); g_assert_cmpint (modulemd_build_config_compare (bc_2, bc_1), ==, 0); g_clear_object (&bc_1); g_clear_object (&bc_2); /* with different runtime requirements */ bc_1 = modulemd_build_config_new (); g_assert_nonnull (bc_1); g_assert_true (MODULEMD_IS_BUILD_CONFIG (bc_1)); modulemd_build_config_add_runtime_requirement (bc_1, "runmod1", "stream3"); modulemd_build_config_add_runtime_requirement (bc_1, "runmod2", "stream4"); bc_2 = modulemd_build_config_new (); g_assert_nonnull (bc_2); g_assert_true (MODULEMD_IS_BUILD_CONFIG (bc_2)); modulemd_build_config_add_runtime_requirement (bc_2, "runmod1", "stream3"); modulemd_build_config_add_runtime_requirement (bc_2, "runmod2", "stream4"); modulemd_build_config_add_runtime_requirement (bc_2, "runmod3", "stream5"); g_assert_false (modulemd_build_config_equals (bc_1, bc_2)); g_assert_cmpint (modulemd_build_config_compare (bc_1, bc_2), <, 0); g_assert_cmpint (modulemd_build_config_compare (bc_2, bc_1), >, 0); g_clear_object (&bc_1); g_clear_object (&bc_2); /* with same buildtime and runtime requirements */ bc_1 = modulemd_build_config_new (); g_assert_nonnull (bc_1); g_assert_true (MODULEMD_IS_BUILD_CONFIG (bc_1)); modulemd_build_config_add_buildtime_requirement ( bc_1, "buildmod1", "stream1"); modulemd_build_config_add_buildtime_requirement ( bc_1, "buildmod2", "stream2"); modulemd_build_config_add_runtime_requirement (bc_1, "runmod1", "stream3"); modulemd_build_config_add_runtime_requirement (bc_1, "runmod2", "stream4"); bc_2 = modulemd_build_config_new (); g_assert_nonnull (bc_2); g_assert_true (MODULEMD_IS_BUILD_CONFIG (bc_2)); modulemd_build_config_add_buildtime_requirement ( bc_2, "buildmod1", "stream1"); modulemd_build_config_add_buildtime_requirement ( bc_2, "buildmod2", "stream2"); modulemd_build_config_add_runtime_requirement (bc_2, "runmod1", "stream3"); modulemd_build_config_add_runtime_requirement (bc_2, "runmod2", "stream4"); g_assert_true (modulemd_build_config_equals (bc_1, bc_2)); g_assert_cmpint (modulemd_build_config_compare (bc_1, bc_2), ==, 0); g_assert_cmpint (modulemd_build_config_compare (bc_2, bc_1), ==, 0); g_clear_object (&bc_1); g_clear_object (&bc_2); /* with different buildtime and same runtime requirements */ bc_1 = modulemd_build_config_new (); g_assert_nonnull (bc_1); g_assert_true (MODULEMD_IS_BUILD_CONFIG (bc_1)); modulemd_build_config_add_buildtime_requirement ( bc_1, "buildmod1", "stream1"); modulemd_build_config_add_buildtime_requirement ( bc_1, "buildmod2", "stream2"); modulemd_build_config_add_buildtime_requirement ( bc_1, "buildmod3", "stream8"); modulemd_build_config_add_runtime_requirement (bc_1, "runmod1", "stream3"); modulemd_build_config_add_runtime_requirement (bc_1, "runmod2", "stream4"); bc_2 = modulemd_build_config_new (); g_assert_nonnull (bc_2); g_assert_true (MODULEMD_IS_BUILD_CONFIG (bc_2)); modulemd_build_config_add_buildtime_requirement ( bc_2, "buildmod1", "stream1"); modulemd_build_config_add_buildtime_requirement ( bc_2, "buildmod2", "stream2"); modulemd_build_config_add_runtime_requirement (bc_2, "runmod1", "stream3"); modulemd_build_config_add_runtime_requirement (bc_2, "runmod2", "stream4"); g_assert_false (modulemd_build_config_equals (bc_1, bc_2)); g_assert_cmpint (modulemd_build_config_compare (bc_1, bc_2), >, 0); g_assert_cmpint (modulemd_build_config_compare (bc_2, bc_1), <, 0); g_clear_object (&bc_1); g_clear_object (&bc_2); /* with same buildopts */ opts = modulemd_buildopts_new (); modulemd_buildopts_set_rpm_macros (opts, "%global test 1"); bc_1 = modulemd_build_config_new (); g_assert_nonnull (bc_1); g_assert_true (MODULEMD_IS_BUILD_CONFIG (bc_1)); modulemd_build_config_set_buildopts (bc_1, opts); bc_2 = modulemd_build_config_new (); g_assert_nonnull (bc_2); g_assert_true (MODULEMD_IS_BUILD_CONFIG (bc_2)); modulemd_build_config_set_buildopts (bc_2, opts); g_assert_true (modulemd_build_config_equals (bc_1, bc_2)); g_assert_cmpint (modulemd_build_config_compare (bc_1, bc_2), ==, 0); g_assert_cmpint (modulemd_build_config_compare (bc_2, bc_1), ==, 0); g_clear_object (&bc_1); g_clear_object (&bc_2); g_clear_object (&opts); /* with different buildopts */ opts = modulemd_buildopts_new (); modulemd_buildopts_set_rpm_macros (opts, "%global test 1"); bc_1 = modulemd_build_config_new (); g_assert_nonnull (bc_1); g_assert_true (MODULEMD_IS_BUILD_CONFIG (bc_1)); modulemd_build_config_set_buildopts (bc_1, opts); g_clear_object (&opts); opts = modulemd_buildopts_new (); modulemd_buildopts_set_rpm_macros (opts, "%global test 2"); bc_2 = modulemd_build_config_new (); g_assert_nonnull (bc_2); g_assert_true (MODULEMD_IS_BUILD_CONFIG (bc_2)); modulemd_build_config_set_buildopts (bc_2, opts); g_assert_false (modulemd_build_config_equals (bc_1, bc_2)); g_assert_cmpint (modulemd_build_config_compare (bc_1, bc_2), <, 0); g_assert_cmpint (modulemd_build_config_compare (bc_2, bc_1), >, 0); g_clear_object (&bc_1); g_clear_object (&bc_2); g_clear_object (&opts); } int main (int argc, char *argv[]) { setlocale (LC_ALL, ""); g_test_init (&argc, &argv, NULL); g_test_bug_base ("https://bugzilla.redhat.com/show_bug.cgi?id="); g_test_add_func ("/modulemd/v2/buildconfig/construct", buildconfig_test_construct); g_test_add_func ("/modulemd/v2/buildconfig/context", buildconfig_test_context); g_test_add_func ("/modulemd/v2/buildconfig/platform", buildconfig_test_platform); g_test_add_func ("/modulemd/v2/buildconfig/requires", buildconfig_test_requires); g_test_add_func ("/modulemd/v2/buildconfig/buildrequires", buildconfig_test_buildrequires); g_test_add_func ("/modulemd/v2/buildconfig/buildopts", buildconfig_test_buildopts); g_test_add_func ("/modulemd/v2/buildconfig/yaml/parse", buildconfig_test_parse_yaml); g_test_add_func ("/modulemd/v2/buildconfig/yaml/parse/bad/unknown_key", buildconfig_test_parse_yaml_unknown_key); g_test_add_func ("/modulemd/v2/buildconfig/yaml/parse/bad/context/none", buildconfig_test_parse_yaml_no_context); g_test_add_func ("/modulemd/v2/buildconfig/yaml/parse/bad/context/short", buildconfig_test_parse_yaml_short_context); g_test_add_func ("/modulemd/v2/buildconfig/yaml/parse/bad/context/long", buildconfig_test_parse_yaml_long_context); g_test_add_func ( "/modulemd/v2/buildconfig/yaml/parse/bad/context/nonalphanum", buildconfig_test_parse_yaml_nonalphanum); g_test_add_func ("/modulemd/v2/buildconfig/yaml/parse/bad/platform/none", buildconfig_test_parse_yaml_no_platform); g_test_add_func ("/modulemd/v2/buildconfig/yaml/emit", buildconfig_test_emit_yaml); g_test_add_func ("/modulemd/v2/buildconfig/yaml/quoting", buildconfig_test_quoting_yaml); g_test_add_func ("/modulemd/v2/buildconfig/comparison", buildconfig_test_comparison); return g_test_run (); } fedora-modularity-libmodulemd-357799c/modulemd/tests/test-modulemd-buildopts.c000066400000000000000000000560131502446517500276500ustar00rootroot00000000000000/* * This file is part of libmodulemd * Copyright (C) 2018 Red Hat, Inc. * * Fedora-License-Identifier: MIT * SPDX-2.0-License-Identifier: MIT * SPDX-3.0-License-Identifier: MIT * * This program is free software. * For more information on the license, see COPYING. * For more information on free software, see . */ #include #include #include #include #include "modulemd-buildopts.h" #include "private/glib-extensions.h" #include "private/modulemd-buildopts-private.h" #include "private/modulemd-yaml.h" #include "private/test-utils.h" typedef struct _BuildoptsFixture { } BuildoptsFixture; static void buildopts_test_construct (void) { g_autoptr (ModulemdBuildopts) b = NULL; g_auto (GStrv) allowed_build_names = NULL; g_auto (GStrv) arches = NULL; /* Test that the new() function works */ b = modulemd_buildopts_new (); g_assert_nonnull (b); g_assert_true (MODULEMD_IS_BUILDOPTS (b)); g_assert_null (modulemd_buildopts_get_rpm_macros (b)); allowed_build_names = modulemd_buildopts_get_rpm_whitelist_as_strv (b); g_assert_nonnull (allowed_build_names); g_assert_cmpint (g_strv_length (allowed_build_names), ==, 0); arches = modulemd_buildopts_get_arches_as_strv (b); g_assert_nonnull (arches); g_assert_cmpint (g_strv_length (arches), ==, 0); g_clear_object (&b); /* Test that object instantiation works */ b = g_object_new (MODULEMD_TYPE_BUILDOPTS, NULL); g_assert_true (MODULEMD_IS_BUILDOPTS (b)); g_clear_object (&b); /* Test instantiation works with rpm_macros */ b = g_object_new (MODULEMD_TYPE_BUILDOPTS, "rpm_macros", "A test", NULL); g_assert_true (MODULEMD_IS_BUILDOPTS (b)); g_assert_cmpstr (modulemd_buildopts_get_rpm_macros (b), ==, "A test"); g_clear_object (&b); } static void buildopts_test_comparison (void) { g_autoptr (ModulemdBuildopts) b_1 = NULL; g_autoptr (ModulemdBuildopts) b_2 = NULL; /*Test 2 objects with no rpm_macros*/ b_1 = modulemd_buildopts_new (); g_assert_nonnull (b_1); g_assert_true (MODULEMD_IS_BUILDOPTS (b_1)); b_2 = modulemd_buildopts_new (); g_assert_nonnull (b_2); g_assert_true (MODULEMD_IS_BUILDOPTS (b_2)); g_assert_true (modulemd_buildopts_equals (b_1, b_2)); g_assert_cmpint (modulemd_buildopts_compare (b_1, b_2), ==, 0); g_assert_cmpint (modulemd_buildopts_compare (b_2, b_1), ==, 0); g_clear_object (&b_1); g_clear_object (&b_2); /*Test 2 objects with matching rpm_macros*/ b_1 = modulemd_buildopts_new (); modulemd_buildopts_set_rpm_macros (b_1, "a test"); g_assert_nonnull (b_1); g_assert_true (MODULEMD_IS_BUILDOPTS (b_1)); b_2 = modulemd_buildopts_new (); modulemd_buildopts_set_rpm_macros (b_2, "a test"); g_assert_nonnull (b_2); g_assert_true (MODULEMD_IS_BUILDOPTS (b_2)); g_assert_true (modulemd_buildopts_equals (b_1, b_2)); g_assert_cmpint (modulemd_buildopts_compare (b_1, b_2), ==, 0); g_assert_cmpint (modulemd_buildopts_compare (b_2, b_1), ==, 0); g_clear_object (&b_1); g_clear_object (&b_2); /*Test 2 objects with different rpm_macros*/ b_1 = modulemd_buildopts_new (); modulemd_buildopts_set_rpm_macros (b_1, "a test"); g_assert_nonnull (b_1); g_assert_true (MODULEMD_IS_BUILDOPTS (b_1)); b_2 = modulemd_buildopts_new (); modulemd_buildopts_set_rpm_macros (b_2, "b test"); g_assert_nonnull (b_2); g_assert_true (MODULEMD_IS_BUILDOPTS (b_2)); g_assert_false (modulemd_buildopts_equals (b_1, b_2)); g_assert_cmpint (modulemd_buildopts_compare (b_1, b_2), <, 0); g_assert_cmpint (modulemd_buildopts_compare (b_2, b_1), >, 0); g_clear_object (&b_1); g_clear_object (&b_2); /*Test 2 objects with matching rpm_macros, rpm_whitelist, and arches*/ b_1 = modulemd_buildopts_new (); modulemd_buildopts_set_rpm_macros (b_1, "a test"); modulemd_buildopts_add_rpm_to_whitelist (b_1, "testrpm"); modulemd_buildopts_add_arch (b_1, "x86_64"); g_assert_nonnull (b_1); g_assert_true (MODULEMD_IS_BUILDOPTS (b_1)); b_2 = modulemd_buildopts_new (); modulemd_buildopts_set_rpm_macros (b_2, "a test"); modulemd_buildopts_add_rpm_to_whitelist (b_2, "testrpm"); modulemd_buildopts_add_arch (b_2, "x86_64"); g_assert_nonnull (b_2); g_assert_true (MODULEMD_IS_BUILDOPTS (b_2)); g_assert_true (modulemd_buildopts_equals (b_1, b_2)); g_assert_cmpint (modulemd_buildopts_compare (b_1, b_2), ==, 0); g_assert_cmpint (modulemd_buildopts_compare (b_2, b_1), ==, 0); g_clear_object (&b_1); g_clear_object (&b_2); /*Test 2 objects with matching rpm_macros and different whitelist*/ b_1 = modulemd_buildopts_new (); modulemd_buildopts_set_rpm_macros (b_1, "a test"); modulemd_buildopts_add_rpm_to_whitelist (b_1, "testrpm"); g_assert_nonnull (b_1); g_assert_true (MODULEMD_IS_BUILDOPTS (b_1)); b_2 = modulemd_buildopts_new (); modulemd_buildopts_set_rpm_macros (b_2, "a test"); modulemd_buildopts_add_rpm_to_whitelist (b_2, "testing"); g_assert_nonnull (b_2); g_assert_true (MODULEMD_IS_BUILDOPTS (b_2)); g_assert_false (modulemd_buildopts_equals (b_1, b_2)); g_assert_cmpint (modulemd_buildopts_compare (b_1, b_2), >, 0); g_assert_cmpint (modulemd_buildopts_compare (b_2, b_1), <, 0); g_clear_object (&b_1); g_clear_object (&b_2); /*Test 2 objects with matching rpm_macros and subsets of matching whitelist*/ b_1 = modulemd_buildopts_new (); modulemd_buildopts_set_rpm_macros (b_1, "a test"); modulemd_buildopts_add_rpm_to_whitelist (b_1, "a"); modulemd_buildopts_add_rpm_to_whitelist (b_1, "b"); g_assert_nonnull (b_1); g_assert_true (MODULEMD_IS_BUILDOPTS (b_1)); b_2 = modulemd_buildopts_new (); modulemd_buildopts_set_rpm_macros (b_2, "a test"); modulemd_buildopts_add_rpm_to_whitelist (b_2, "a"); modulemd_buildopts_add_rpm_to_whitelist (b_2, "b"); modulemd_buildopts_add_rpm_to_whitelist (b_2, "c"); g_assert_nonnull (b_2); g_assert_true (MODULEMD_IS_BUILDOPTS (b_2)); g_assert_false (modulemd_buildopts_equals (b_1, b_2)); g_assert_cmpint (modulemd_buildopts_compare (b_1, b_2), <, 0); g_assert_cmpint (modulemd_buildopts_compare (b_2, b_1), >, 0); g_clear_object (&b_1); g_clear_object (&b_2); /*Test 2 objects with matching rpm_macros and rpm_whitelist, * but different arches*/ b_1 = modulemd_buildopts_new (); modulemd_buildopts_set_rpm_macros (b_1, "a test"); modulemd_buildopts_add_rpm_to_whitelist (b_1, "testrpm"); modulemd_buildopts_add_arch (b_1, "x86_64"); g_assert_nonnull (b_1); g_assert_true (MODULEMD_IS_BUILDOPTS (b_1)); b_2 = modulemd_buildopts_new (); modulemd_buildopts_set_rpm_macros (b_2, "a test"); modulemd_buildopts_add_rpm_to_whitelist (b_2, "testrpm"); modulemd_buildopts_add_arch (b_2, "ppc64le"); g_assert_nonnull (b_2); g_assert_true (MODULEMD_IS_BUILDOPTS (b_2)); g_assert_false (modulemd_buildopts_equals (b_1, b_2)); g_assert_cmpint (modulemd_buildopts_compare (b_1, b_2), >, 0); g_assert_cmpint (modulemd_buildopts_compare (b_2, b_1), <, 0); g_clear_object (&b_1); g_clear_object (&b_2); /*Test 2 objects with matching rpm_macros and rpm_whitelist, * and subsets of matching arches*/ b_1 = modulemd_buildopts_new (); modulemd_buildopts_set_rpm_macros (b_1, "a test"); modulemd_buildopts_add_rpm_to_whitelist (b_1, "testrpm"); modulemd_buildopts_add_arch (b_1, "x86_64"); modulemd_buildopts_add_arch (b_1, "ppc64le"); g_assert_nonnull (b_1); g_assert_true (MODULEMD_IS_BUILDOPTS (b_1)); b_2 = modulemd_buildopts_new (); modulemd_buildopts_set_rpm_macros (b_2, "a test"); modulemd_buildopts_add_rpm_to_whitelist (b_2, "testrpm"); modulemd_buildopts_add_arch (b_2, "x86_64"); modulemd_buildopts_add_arch (b_2, "ppc64le"); modulemd_buildopts_add_arch (b_2, "s390x"); g_assert_nonnull (b_2); g_assert_true (MODULEMD_IS_BUILDOPTS (b_2)); g_assert_false (modulemd_buildopts_equals (b_1, b_2)); g_assert_cmpint (modulemd_buildopts_compare (b_1, b_2), >, 0); g_assert_cmpint (modulemd_buildopts_compare (b_2, b_1), <, 0); g_clear_object (&b_1); g_clear_object (&b_2); } static void buildopts_test_copy (void) { g_autoptr (ModulemdBuildopts) b = NULL; g_autoptr (ModulemdBuildopts) b_copy = NULL; g_auto (GStrv) allowed_build_names = NULL; g_auto (GStrv) arches = NULL; b = modulemd_buildopts_new (); g_assert_nonnull (b); g_assert_true (MODULEMD_IS_BUILDOPTS (b)); g_assert_null (modulemd_buildopts_get_rpm_macros (b)); allowed_build_names = modulemd_buildopts_get_rpm_whitelist_as_strv (b); g_assert_nonnull (allowed_build_names); g_assert_cmpint (g_strv_length (allowed_build_names), ==, 0); g_clear_pointer (&allowed_build_names, g_strfreev); arches = modulemd_buildopts_get_arches_as_strv (b); g_assert_nonnull (arches); g_assert_cmpint (g_strv_length (arches), ==, 0); g_clear_pointer (&arches, g_strfreev); b_copy = modulemd_buildopts_copy (b); g_assert_nonnull (b_copy); g_assert_true (MODULEMD_IS_BUILDOPTS (b_copy)); g_assert_null (modulemd_buildopts_get_rpm_macros (b_copy)); allowed_build_names = modulemd_buildopts_get_rpm_whitelist_as_strv (b_copy); g_assert_nonnull (allowed_build_names); g_assert_cmpint (g_strv_length (allowed_build_names), ==, 0); g_clear_pointer (&allowed_build_names, g_strfreev); arches = modulemd_buildopts_get_arches_as_strv (b_copy); g_assert_nonnull (arches); g_assert_cmpint (g_strv_length (arches), ==, 0); g_clear_pointer (&arches, g_strfreev); g_clear_object (&b); g_clear_object (&b_copy); /* Test copying buildopts with rpm_macros */ b = modulemd_buildopts_new (); modulemd_buildopts_set_rpm_macros (b, "a test"); g_assert_nonnull (b); g_assert_true (MODULEMD_IS_BUILDOPTS (b)); g_assert_cmpstr (modulemd_buildopts_get_rpm_macros (b), ==, "a test"); allowed_build_names = modulemd_buildopts_get_rpm_whitelist_as_strv (b); g_assert_nonnull (allowed_build_names); g_assert_cmpint (g_strv_length (allowed_build_names), ==, 0); g_clear_pointer (&allowed_build_names, g_strfreev); arches = modulemd_buildopts_get_arches_as_strv (b); g_assert_nonnull (arches); g_assert_cmpint (g_strv_length (arches), ==, 0); g_clear_pointer (&arches, g_strfreev); b_copy = modulemd_buildopts_copy (b); g_assert_nonnull (b_copy); g_assert_true (MODULEMD_IS_BUILDOPTS (b_copy)); g_assert_cmpstr (modulemd_buildopts_get_rpm_macros (b_copy), ==, "a test"); allowed_build_names = modulemd_buildopts_get_rpm_whitelist_as_strv (b_copy); g_assert_nonnull (allowed_build_names); g_assert_cmpint (g_strv_length (allowed_build_names), ==, 0); g_clear_pointer (&allowed_build_names, g_strfreev); arches = modulemd_buildopts_get_arches_as_strv (b_copy); g_assert_nonnull (arches); g_assert_cmpint (g_strv_length (arches), ==, 0); g_clear_pointer (&arches, g_strfreev); g_clear_object (&b); g_clear_object (&b_copy); /* Test copying buildopts with whitelist */ b = modulemd_buildopts_new (); modulemd_buildopts_add_rpm_to_whitelist (b, "testrpm"); g_assert_nonnull (b); g_assert_true (MODULEMD_IS_BUILDOPTS (b)); g_assert_null (modulemd_buildopts_get_rpm_macros (b)); allowed_build_names = modulemd_buildopts_get_rpm_whitelist_as_strv (b); g_assert_nonnull (allowed_build_names); g_assert_cmpint (g_strv_length (allowed_build_names), ==, 1); g_assert_cmpstr (allowed_build_names[0], ==, "testrpm"); g_clear_pointer (&allowed_build_names, g_strfreev); arches = modulemd_buildopts_get_arches_as_strv (b); g_assert_nonnull (arches); g_assert_cmpint (g_strv_length (arches), ==, 0); g_clear_pointer (&arches, g_strfreev); b_copy = modulemd_buildopts_copy (b); g_assert_nonnull (b_copy); g_assert_true (MODULEMD_IS_BUILDOPTS (b_copy)); g_assert_null (modulemd_buildopts_get_rpm_macros (b_copy)); allowed_build_names = modulemd_buildopts_get_rpm_whitelist_as_strv (b_copy); g_assert_nonnull (allowed_build_names); g_assert_cmpint (g_strv_length (allowed_build_names), ==, 1); g_assert_cmpstr (allowed_build_names[0], ==, "testrpm"); g_clear_pointer (&allowed_build_names, g_strfreev); arches = modulemd_buildopts_get_arches_as_strv (b_copy); g_assert_nonnull (arches); g_assert_cmpint (g_strv_length (arches), ==, 0); g_clear_pointer (&arches, g_strfreev); g_clear_object (&b); g_clear_object (&b_copy); /* Test copying buildopts with arches */ b = modulemd_buildopts_new (); modulemd_buildopts_add_arch (b, "x86_64"); g_assert_nonnull (b); g_assert_true (MODULEMD_IS_BUILDOPTS (b)); g_assert_null (modulemd_buildopts_get_rpm_macros (b)); allowed_build_names = modulemd_buildopts_get_rpm_whitelist_as_strv (b); g_assert_nonnull (allowed_build_names); g_assert_cmpint (g_strv_length (allowed_build_names), ==, 0); g_clear_pointer (&allowed_build_names, g_strfreev); arches = modulemd_buildopts_get_arches_as_strv (b); g_assert_nonnull (arches); g_assert_cmpint (g_strv_length (arches), ==, 1); g_assert_cmpstr (arches[0], ==, "x86_64"); g_clear_pointer (&arches, g_strfreev); b_copy = modulemd_buildopts_copy (b); g_assert_nonnull (b_copy); g_assert_true (MODULEMD_IS_BUILDOPTS (b_copy)); g_assert_null (modulemd_buildopts_get_rpm_macros (b_copy)); allowed_build_names = modulemd_buildopts_get_rpm_whitelist_as_strv (b_copy); g_assert_nonnull (allowed_build_names); g_assert_cmpint (g_strv_length (allowed_build_names), ==, 0); g_clear_pointer (&allowed_build_names, g_strfreev); arches = modulemd_buildopts_get_arches_as_strv (b_copy); g_assert_nonnull (arches); g_assert_cmpint (g_strv_length (arches), ==, 1); g_assert_cmpstr (arches[0], ==, "x86_64"); g_clear_pointer (&arches, g_strfreev); g_clear_object (&b); g_clear_object (&b_copy); } static void buildopts_test_get_set_rpm_macros (void) { g_autoptr (ModulemdBuildopts) b = NULL; g_autofree gchar *rpm_macros; b = modulemd_buildopts_new (); g_assert_nonnull (b); g_assert_true (MODULEMD_IS_BUILDOPTS (b)); g_assert_null (modulemd_buildopts_get_rpm_macros (b)); g_object_get (b, "rpm_macros", &rpm_macros, NULL); g_assert_null (rpm_macros); g_clear_pointer (&rpm_macros, g_free); /* Set rpm macros */ modulemd_buildopts_set_rpm_macros (b, "Some macro"); g_assert_cmpstr (modulemd_buildopts_get_rpm_macros (b), ==, "Some macro"); g_object_get (b, "rpm_macros", &rpm_macros, NULL); g_assert_cmpstr (rpm_macros, ==, "Some macro"); g_clear_pointer (&rpm_macros, g_free); /* Clear rpm_macros */ modulemd_buildopts_set_rpm_macros (b, NULL); g_object_get (b, "rpm_macros", &rpm_macros, NULL); g_assert_null (rpm_macros); g_clear_pointer (&rpm_macros, g_free); } static void buildopts_test_whitelist (void) { g_autoptr (ModulemdBuildopts) b = NULL; g_auto (GStrv) allowed_build_names = NULL; b = modulemd_buildopts_new (); g_assert_nonnull (b); g_assert_true (MODULEMD_IS_BUILDOPTS (b)); /* Assert we start with 0 rpms */ allowed_build_names = modulemd_buildopts_get_rpm_whitelist_as_strv (b); g_assert_cmpint (g_strv_length (allowed_build_names), ==, 0); g_clear_pointer (&allowed_build_names, g_strfreev); /* Allow some rpms */ modulemd_buildopts_add_rpm_to_whitelist (b, "test2"); modulemd_buildopts_add_rpm_to_whitelist (b, "test3"); modulemd_buildopts_add_rpm_to_whitelist (b, "test1"); allowed_build_names = modulemd_buildopts_get_rpm_whitelist_as_strv (b); g_assert_cmpint (g_strv_length (allowed_build_names), ==, 3); // They should be sorted g_assert_cmpstr (allowed_build_names[0], ==, "test1"); g_assert_cmpstr (allowed_build_names[1], ==, "test2"); g_assert_cmpstr (allowed_build_names[2], ==, "test3"); g_clear_pointer (&allowed_build_names, g_strfreev); /* Remove some rpms */ modulemd_buildopts_remove_rpm_from_whitelist (b, "test2"); allowed_build_names = modulemd_buildopts_get_rpm_whitelist_as_strv (b); g_assert_cmpint (g_strv_length (allowed_build_names), ==, 2); // They should be sorted g_assert_cmpstr (allowed_build_names[0], ==, "test1"); g_assert_cmpstr (allowed_build_names[1], ==, "test3"); g_clear_pointer (&allowed_build_names, g_strfreev); } static void buildopts_test_arches (void) { g_autoptr (ModulemdBuildopts) b = NULL; g_auto (GStrv) arches = NULL; b = modulemd_buildopts_new (); g_assert_nonnull (b); g_assert_true (MODULEMD_IS_BUILDOPTS (b)); /* Assert we start with no arches */ arches = modulemd_buildopts_get_arches_as_strv (b); g_assert_cmpint (g_strv_length (arches), ==, 0); g_clear_pointer (&arches, g_strfreev); /* Add some arches */ modulemd_buildopts_add_arch (b, "s390x"); modulemd_buildopts_add_arch (b, "x86_64"); modulemd_buildopts_add_arch (b, "ppc64le"); arches = modulemd_buildopts_get_arches_as_strv (b); g_assert_cmpint (g_strv_length (arches), ==, 3); // They should be sorted g_assert_cmpstr (arches[0], ==, "ppc64le"); g_assert_cmpstr (arches[1], ==, "s390x"); g_assert_cmpstr (arches[2], ==, "x86_64"); g_clear_pointer (&arches, g_strfreev); /* Remove an arch */ modulemd_buildopts_remove_arch (b, "s390x"); arches = modulemd_buildopts_get_arches_as_strv (b); g_assert_cmpint (g_strv_length (arches), ==, 2); // They should be sorted g_assert_cmpstr (arches[0], ==, "ppc64le"); g_assert_cmpstr (arches[1], ==, "x86_64"); g_clear_pointer (&arches, g_strfreev); } static void buildopts_test_parse_yaml (void) { g_autoptr (ModulemdBuildopts) b = NULL; g_autoptr (GError) error = NULL; MMD_INIT_YAML_PARSER (parser); g_autofree gchar *yaml_path = NULL; g_auto (GStrv) allowed_build_names = NULL; g_auto (GStrv) arches = NULL; g_autoptr (FILE) yaml_stream = NULL; yaml_path = g_strdup_printf ("%s/b.yaml", g_getenv ("TEST_DATA_PATH")); g_assert_nonnull (yaml_path); yaml_stream = g_fopen (yaml_path, "rbe"); g_assert_nonnull (yaml_stream); yaml_parser_set_input_file (&parser, yaml_stream); parser_skip_document_start (&parser); b = modulemd_buildopts_parse_yaml (&parser, TRUE, &error); g_assert_nonnull (b); g_assert_true (MODULEMD_IS_BUILDOPTS (b)); g_assert_cmpstr (modulemd_buildopts_get_rpm_macros (b), ==, "%demomacro 1\n" "%demomacro2 %{demomacro}23\n"); allowed_build_names = modulemd_buildopts_get_rpm_whitelist_as_strv (b); g_assert_cmpint (g_strv_length (allowed_build_names), ==, 4); g_assert_cmpstr (allowed_build_names[0], ==, "fooscl-1-bar"); g_assert_cmpstr (allowed_build_names[1], ==, "fooscl-1-baz"); g_assert_cmpstr (allowed_build_names[2], ==, "xxx"); g_assert_cmpstr (allowed_build_names[3], ==, "xyz"); arches = modulemd_buildopts_get_arches_as_strv (b); g_assert_cmpint (g_strv_length (arches), ==, 2); g_assert_cmpstr (arches[0], ==, "ppc64le"); g_assert_cmpstr (arches[1], ==, "x86_64"); } static void buildopts_test_emit_yaml (void) { g_autoptr (ModulemdBuildopts) b = NULL; g_autoptr (GError) error = NULL; MMD_INIT_YAML_EMITTER (emitter); MMD_INIT_YAML_STRING (&emitter, yaml_string); b = modulemd_buildopts_new (); g_assert_true (mmd_emitter_start_stream (&emitter, &error)); g_assert_true (mmd_emitter_start_document (&emitter, &error)); g_assert_true ( mmd_emitter_start_mapping (&emitter, YAML_BLOCK_MAPPING_STYLE, &error)); g_assert_true (modulemd_buildopts_emit_yaml (b, &emitter, &error)); g_assert_true (mmd_emitter_end_mapping (&emitter, &error)); g_assert_true (mmd_emitter_end_document (&emitter, &error)); g_assert_true (mmd_emitter_end_stream (&emitter, &error)); g_assert_cmpstr (yaml_string->str, ==, "---\n" "rpms: {}\n" "...\n"); g_clear_pointer (&yaml_string, modulemd_yaml_string_free); yaml_emitter_delete (&emitter); yaml_emitter_initialize (&emitter); yaml_string = g_malloc0_n (1, sizeof (modulemd_yaml_string)); yaml_emitter_set_output (&emitter, write_yaml_string, (void *)yaml_string); modulemd_buildopts_set_rpm_macros (b, "%testmacro 1\n%anothermacro 2"); modulemd_buildopts_add_rpm_to_whitelist (b, "test2"); modulemd_buildopts_add_rpm_to_whitelist (b, "test3"); modulemd_buildopts_add_rpm_to_whitelist (b, "test1"); modulemd_buildopts_add_arch (b, "s390x"); modulemd_buildopts_add_arch (b, "x86_64"); modulemd_buildopts_add_arch (b, "ppc64le"); g_assert_true (mmd_emitter_start_stream (&emitter, &error)); g_assert_true (mmd_emitter_start_document (&emitter, &error)); g_assert_true ( mmd_emitter_start_mapping (&emitter, YAML_BLOCK_MAPPING_STYLE, &error)); g_assert_true (modulemd_buildopts_emit_yaml (b, &emitter, &error)); g_assert_true (mmd_emitter_end_mapping (&emitter, &error)); g_assert_true (mmd_emitter_end_document (&emitter, &error)); g_assert_true (mmd_emitter_end_stream (&emitter, &error)); g_assert_cmpstr (yaml_string->str, ==, "---\n" "rpms:\n" " macros: >-\n" " %testmacro 1\n" "\n" " %anothermacro 2\n" " whitelist:\n" " - test1\n" " - test2\n" " - test3\n" "arches: [ppc64le, s390x, x86_64]\n" "...\n"); } static void buildopts_test_quoting_yaml (void) { g_autoptr (ModulemdBuildopts) b = NULL; g_autoptr (GError) error = NULL; MMD_INIT_YAML_EMITTER (emitter); MMD_INIT_YAML_STRING (&emitter, yaml_string); b = modulemd_buildopts_new (); modulemd_buildopts_set_rpm_macros (b, "0"); modulemd_buildopts_add_rpm_to_whitelist (b, "1"); modulemd_buildopts_add_arch (b, "2"); g_assert_true (mmd_emitter_start_stream (&emitter, &error)); g_assert_true (mmd_emitter_start_document (&emitter, &error)); g_assert_true ( mmd_emitter_start_mapping (&emitter, YAML_BLOCK_MAPPING_STYLE, &error)); g_assert_true (modulemd_buildopts_emit_yaml (b, &emitter, &error)); g_assert_true (mmd_emitter_end_mapping (&emitter, &error)); g_assert_true (mmd_emitter_end_document (&emitter, &error)); g_assert_true (mmd_emitter_end_stream (&emitter, &error)); g_assert_cmpstr (yaml_string->str, ==, "---\n" "rpms:\n" " macros: >-\n" " 0\n" " whitelist:\n" " - \"1\"\n" "arches: [\"2\"]\n" "...\n"); } int main (int argc, char *argv[]) { setlocale (LC_ALL, ""); g_test_init (&argc, &argv, NULL); g_test_bug_base ("https://bugzilla.redhat.com/show_bug.cgi?id="); // Define the tests. g_test_add_func ("/modulemd/v2/buildopts/construct", buildopts_test_construct); g_test_add_func ("/modulemd/v2/buildopts/comparison", buildopts_test_comparison); g_test_add_func ("/modulemd/v2/buildopts/copy", buildopts_test_copy); g_test_add_func ("/modulemd/v2/buildopts/get_set_rpm_macros", buildopts_test_get_set_rpm_macros); g_test_add_func ("/modulemd/v2/buildopts/whitelist", buildopts_test_whitelist); g_test_add_func ("/modulemd/v2/buildopts/arches", buildopts_test_arches); g_test_add_func ("/modulemd/v2/buildopts/yaml/parse", buildopts_test_parse_yaml); g_test_add_func ("/modulemd/v2/buildopts/yaml/emit", buildopts_test_emit_yaml); g_test_add_func ("/modulemd/v2/buildopts/yaml/quoting", buildopts_test_quoting_yaml); return g_test_run (); } fedora-modularity-libmodulemd-357799c/modulemd/tests/test-modulemd-common.c000066400000000000000000000506521502446517500271360ustar00rootroot00000000000000/* * This file is part of libmodulemd * Copyright (C) 2018 Red Hat, Inc. * * Fedora-License-Identifier: MIT * SPDX-2.0-License-Identifier: MIT * SPDX-3.0-License-Identifier: MIT * * This program is free software. * For more information on the license, see COPYING. * For more information on free software, see . */ #include #include #include #include #include "modulemd.h" #include "config.h" #include "private/test-utils.h" static void test_modulemd_get_version (void) { g_assert_cmpstr (modulemd_get_version (), ==, LIBMODULEMD_VERSION); } static void test_modulemd_load_file (void) { g_autofree gchar *yaml_file = NULL; g_autoptr (GError) error = NULL; g_autoptr (ModulemdModuleIndex) idx = NULL; /* This function is a wrapper around lower-level functions, so it should be * okay to just test basic success and failure here. */ /* Valid, large datafile */ g_clear_error (&error); g_clear_object (&idx); g_clear_pointer (&yaml_file, g_free); yaml_file = g_strdup_printf ("%s/f29.yaml", g_getenv ("TEST_DATA_PATH")); idx = modulemd_load_file (yaml_file, &error); g_assert_no_error (error); g_assert_nonnull (idx); /* Nonexistent file */ g_clear_error (&error); g_clear_object (&idx); g_clear_pointer (&yaml_file, g_free); yaml_file = g_strdup_printf ("%s/nosuchfile.yaml", g_getenv ("TEST_DATA_PATH")); idx = modulemd_load_file (yaml_file, &error); g_assert_null (idx); g_assert_error (error, MODULEMD_YAML_ERROR, MMD_YAML_ERROR_OPEN); /* Readable, non-YAML file */ g_clear_error (&error); g_clear_object (&idx); g_clear_pointer (&yaml_file, g_free); yaml_file = g_strdup_printf ("%s/nl.po", g_getenv ("TEST_DATA_PATH")); idx = modulemd_load_file (yaml_file, &error); g_assert_null (idx); g_assert_error (error, MODULEMD_YAML_ERROR, MMD_YAML_ERROR_UNPARSEABLE); /* Readable, but invalid YAML file */ g_clear_error (&error); g_clear_object (&idx); g_clear_pointer (&yaml_file, g_free); yaml_file = g_strdup_printf ("%s/good_and_bad.yaml", g_getenv ("TEST_DATA_PATH")); idx = modulemd_load_file (yaml_file, &error); g_assert_null (idx); g_assert_error (error, MODULEMD_ERROR, MMD_ERROR_VALIDATE); } static void test_modulemd_load_string (void) { const gchar *yaml_string = NULL; g_autoptr (GError) error = NULL; g_autoptr (ModulemdModuleIndex) idx = NULL; g_autofree gchar *output = NULL; /* This function is a wrapper around lower-level functions, so it should be * okay to just test basic success and failure here. */ /* Trivial modulemd */ g_clear_error (&error); g_clear_object (&idx); yaml_string = "---\n" "document: modulemd\n" "version: 2\n" "data:\n" " name: trivialname\n" " stream: trivialstream\n" " summary: Trivial Summary\n" " description: >-\n" " Trivial Description\n" " license:\n" " module: DUMMY\n" "...\n"; idx = modulemd_load_string (yaml_string, &error); g_assert_no_error (error); g_assert_nonnull (idx); /* Make sure loaded index dumps to string cleanly */ g_clear_error (&error); g_clear_pointer (&output, g_free); output = modulemd_module_index_dump_to_string (idx, &error); g_assert_no_error (error); g_assert_nonnull (output); /* NULL string should raise an exception */ g_clear_error (&error); g_clear_object (&idx); modulemd_test_signal = 0; signal (SIGTRAP, modulemd_test_signal_handler); idx = modulemd_load_string (NULL, &error); g_assert_cmpint (modulemd_test_signal, ==, SIGTRAP); g_assert_null (idx); /* An empty string is valid YAML, so it returns a non-NULL but empty index. */ g_clear_error (&error); g_clear_object (&idx); yaml_string = ""; idx = modulemd_load_string (yaml_string, &error); g_assert_no_error (error); g_assert_nonnull (idx); /* Invalid YAML string */ g_clear_error (&error); g_clear_object (&idx); yaml_string = "Hello, World!\n"; idx = modulemd_load_string (yaml_string, &error); g_assert_error (error, MODULEMD_YAML_ERROR, MMD_YAML_ERROR_PARSE); g_assert_null (idx); } static void test_packager_read_file (void) { g_autofree gchar *yaml_file = NULL; g_autoptr (GError) error = NULL; g_autoptr (GObject) object = NULL; GType otype = G_TYPE_INVALID; /* This function is a wrapper around lower-level functions, so it should be * okay to just test basic success and failure here. */ /* Valid packager v2 file */ g_clear_error (&error); g_clear_object (&object); g_clear_pointer (&yaml_file, g_free); yaml_file = g_strdup_printf ("%s/yaml_specs/modulemd_packager_v2.yaml", g_getenv ("MESON_SOURCE_ROOT")); otype = modulemd_read_packager_file (yaml_file, &object, &error); g_assert_no_error (error); g_assert_true (otype == MODULEMD_TYPE_MODULE_STREAM_V2); g_assert_nonnull (object); g_assert_true (MODULEMD_IS_MODULE_STREAM_V2 (object)); /* Valid packager v2 file with module/stream name overrides */ g_clear_error (&error); g_clear_object (&object); g_clear_pointer (&yaml_file, g_free); yaml_file = g_strdup_printf ("%s/yaml_specs/modulemd_packager_v2.yaml", g_getenv ("MESON_SOURCE_ROOT")); otype = modulemd_read_packager_file_ext ( yaml_file, &object, "modulename-override", "streamname-override", &error); g_assert_no_error (error); g_assert_true (otype == MODULEMD_TYPE_MODULE_STREAM_V2); g_assert_nonnull (object); g_assert_true (MODULEMD_IS_MODULE_STREAM_V2 (object)); g_assert_cmpstr ( modulemd_module_stream_get_module_name (MODULEMD_MODULE_STREAM (object)), ==, "modulename-override"); g_assert_cmpstr ( modulemd_module_stream_get_stream_name (MODULEMD_MODULE_STREAM (object)), ==, "streamname-override"); /* Valid packager v3 file */ g_clear_error (&error); g_clear_object (&object); g_clear_pointer (&yaml_file, g_free); yaml_file = g_strdup_printf ("%s/yaml_specs/modulemd_packager_v3.yaml", g_getenv ("MESON_SOURCE_ROOT")); otype = modulemd_read_packager_file (yaml_file, &object, &error); g_assert_no_error (error); g_assert_true (otype == MODULEMD_TYPE_PACKAGER_V3); g_assert_nonnull (object); g_assert_true (MODULEMD_IS_PACKAGER_V3 (object)); /* Valid packager v3 file with module/stream name overrides */ g_clear_error (&error); g_clear_object (&object); g_clear_pointer (&yaml_file, g_free); yaml_file = g_strdup_printf ("%s/yaml_specs/modulemd_packager_v3.yaml", g_getenv ("MESON_SOURCE_ROOT")); otype = modulemd_read_packager_file_ext ( yaml_file, &object, "modulename-override", "streamname-override", &error); g_assert_no_error (error); g_assert_true (otype == MODULEMD_TYPE_PACKAGER_V3); g_assert_nonnull (object); g_assert_true (MODULEMD_IS_PACKAGER_V3 (object)); g_assert_cmpstr ( modulemd_packager_v3_get_module_name (MODULEMD_PACKAGER_V3 (object)), ==, "modulename-override"); g_assert_cmpstr ( modulemd_packager_v3_get_stream_name (MODULEMD_PACKAGER_V3 (object)), ==, "streamname-override"); /* Valid stream v2 file */ g_clear_error (&error); g_clear_object (&object); g_clear_pointer (&yaml_file, g_free); yaml_file = g_strdup_printf ("%s/yaml_specs/modulemd_stream_v2.yaml", g_getenv ("MESON_SOURCE_ROOT")); otype = modulemd_read_packager_file (yaml_file, &object, &error); g_assert_no_error (error); g_assert_true (otype == MODULEMD_TYPE_MODULE_STREAM_V2); g_assert_nonnull (object); g_assert_true (MODULEMD_IS_MODULE_STREAM_V2 (object)); /* Valid stream v2 file with module/stream name overrides */ g_clear_error (&error); g_clear_object (&object); g_clear_pointer (&yaml_file, g_free); yaml_file = g_strdup_printf ("%s/yaml_specs/modulemd_stream_v2.yaml", g_getenv ("MESON_SOURCE_ROOT")); otype = modulemd_read_packager_file_ext ( yaml_file, &object, "modulename-override", "streamname-override", &error); g_assert_no_error (error); g_assert_true (otype == MODULEMD_TYPE_MODULE_STREAM_V2); g_assert_nonnull (object); g_assert_true (MODULEMD_IS_MODULE_STREAM_V2 (object)); g_assert_cmpstr ( modulemd_module_stream_get_module_name (MODULEMD_MODULE_STREAM (object)), ==, "modulename-override"); g_assert_cmpstr ( modulemd_module_stream_get_stream_name (MODULEMD_MODULE_STREAM (object)), ==, "streamname-override"); /* Valid stream v1 file, should get upgraded to v2 */ g_clear_error (&error); g_clear_object (&object); g_clear_pointer (&yaml_file, g_free); yaml_file = g_strdup_printf ("%s/yaml_specs/modulemd_stream_v1.yaml", g_getenv ("MESON_SOURCE_ROOT")); otype = modulemd_read_packager_file (yaml_file, &object, &error); g_assert_no_error (error); g_assert_true (otype == MODULEMD_TYPE_MODULE_STREAM_V2); g_assert_nonnull (object); g_assert_true (MODULEMD_IS_MODULE_STREAM_V2 (object)); /* Valid stream v1 file, should get upgraded to v2, * with module/stream name overrides */ g_clear_error (&error); g_clear_object (&object); g_clear_pointer (&yaml_file, g_free); yaml_file = g_strdup_printf ("%s/yaml_specs/modulemd_stream_v1.yaml", g_getenv ("MESON_SOURCE_ROOT")); otype = modulemd_read_packager_file_ext ( yaml_file, &object, "modulename-override", "streamname-override", &error); g_assert_no_error (error); g_assert_true (otype == MODULEMD_TYPE_MODULE_STREAM_V2); g_assert_nonnull (object); g_assert_true (MODULEMD_IS_MODULE_STREAM_V2 (object)); g_assert_cmpstr ( modulemd_module_stream_get_module_name (MODULEMD_MODULE_STREAM (object)), ==, "modulename-override"); g_assert_cmpstr ( modulemd_module_stream_get_stream_name (MODULEMD_MODULE_STREAM (object)), ==, "streamname-override"); /* Nonexistent file */ g_clear_error (&error); g_clear_object (&object); g_clear_pointer (&yaml_file, g_free); yaml_file = g_strdup_printf ("%s/nosuchfile.yaml", g_getenv ("TEST_DATA_PATH")); otype = modulemd_read_packager_file (yaml_file, &object, &error); g_assert_error (error, MODULEMD_YAML_ERROR, MMD_YAML_ERROR_OPEN); g_assert_true (otype == G_TYPE_INVALID); g_assert_null (object); /* Readable, non-YAML file */ g_clear_error (&error); g_clear_object (&object); g_clear_pointer (&yaml_file, g_free); yaml_file = g_strdup_printf ("%s/nl.po", g_getenv ("TEST_DATA_PATH")); otype = modulemd_read_packager_file (yaml_file, &object, &error); g_assert_error (error, MODULEMD_YAML_ERROR, MMD_YAML_ERROR_PARSE); g_assert_true (otype == G_TYPE_INVALID); g_assert_null (object); /* Readable, but invalid YAML packager file */ g_clear_error (&error); g_clear_object (&object); g_clear_pointer (&yaml_file, g_free); yaml_file = g_strdup_printf ("%s/broken_stream.yaml", g_getenv ("TEST_DATA_PATH")); otype = modulemd_read_packager_file (yaml_file, &object, &error); g_assert_error (error, MODULEMD_YAML_ERROR, MMD_YAML_ERROR_PARSE); g_assert_true (otype == G_TYPE_INVALID); g_assert_null (object); /* YAML file with multiple documents */ g_clear_error (&error); g_clear_object (&object); g_clear_pointer (&yaml_file, g_free); yaml_file = g_strdup_printf ("%s/f29.yaml", g_getenv ("TEST_DATA_PATH")); otype = modulemd_read_packager_file (yaml_file, &object, &error); g_assert_error (error, MODULEMD_YAML_ERROR, MMD_YAML_ERROR_PARSE); g_assert_true (otype == G_TYPE_INVALID); g_assert_null (object); } static void test_packager_read_string (void) { const gchar *yaml_string = NULL; g_autoptr (GError) error = NULL; g_autoptr (GObject) object = NULL; GType otype = G_TYPE_INVALID; /* This function is a wrapper around lower-level functions, so it should be * okay to just test basic success and failure here. */ /* Trivial modulemd packager v2 */ g_clear_error (&error); g_clear_object (&object); yaml_string = "---\n" "document: modulemd-packager\n" "version: 2\n" "data:\n" " name: trivialname\n" " stream: trivialstream\n" " summary: Trivial Summary\n" " description: >-\n" " Trivial Description\n" " license:\n" " module: DUMMY\n" "...\n"; otype = modulemd_read_packager_string (yaml_string, &object, &error); g_assert_no_error (error); g_assert_true (otype == MODULEMD_TYPE_MODULE_STREAM_V2); g_assert_nonnull (object); g_assert_true (MODULEMD_IS_MODULE_STREAM_V2 (object)); /* with module/stream name overrides */ g_clear_error (&error); g_clear_object (&object); otype = modulemd_read_packager_string_ext (yaml_string, &object, "modulename-override", "streamname-override", &error); g_assert_no_error (error); g_assert_true (otype == MODULEMD_TYPE_MODULE_STREAM_V2); g_assert_nonnull (object); g_assert_true (MODULEMD_IS_MODULE_STREAM_V2 (object)); g_assert_cmpstr ( modulemd_module_stream_get_module_name (MODULEMD_MODULE_STREAM (object)), ==, "modulename-override"); g_assert_cmpstr ( modulemd_module_stream_get_stream_name (MODULEMD_MODULE_STREAM (object)), ==, "streamname-override"); /* Trivial modulemd packager v3 */ g_clear_error (&error); g_clear_object (&object); yaml_string = "---\n" "document: modulemd-packager\n" "version: 3\n" "data:\n" " name: trivialname\n" " stream: trivialstream\n" " summary: Trivial Summary\n" " description: >-\n" " Trivial Description\n" " license: DUMMY\n" "...\n"; otype = modulemd_read_packager_string (yaml_string, &object, &error); g_assert_no_error (error); g_assert_true (otype == MODULEMD_TYPE_PACKAGER_V3); g_assert_nonnull (object); g_assert_true (MODULEMD_IS_PACKAGER_V3 (object)); /* with module/stream name overrides */ g_clear_error (&error); g_clear_object (&object); otype = modulemd_read_packager_string_ext (yaml_string, &object, "modulename-override", "streamname-override", &error); g_assert_no_error (error); g_assert_true (otype == MODULEMD_TYPE_PACKAGER_V3); g_assert_nonnull (object); g_assert_true (MODULEMD_IS_PACKAGER_V3 (object)); g_assert_cmpstr ( modulemd_packager_v3_get_module_name (MODULEMD_PACKAGER_V3 (object)), ==, "modulename-override"); g_assert_cmpstr ( modulemd_packager_v3_get_stream_name (MODULEMD_PACKAGER_V3 (object)), ==, "streamname-override"); /* Trivial modulemd stream v2 */ g_clear_error (&error); g_clear_object (&object); yaml_string = "---\n" "document: modulemd\n" "version: 2\n" "data:\n" " name: trivialname\n" " stream: trivialstream\n" " summary: Trivial Summary\n" " description: >-\n" " Trivial Description\n" " license:\n" " module: DUMMY\n" "...\n"; otype = modulemd_read_packager_string (yaml_string, &object, &error); g_assert_no_error (error); g_assert_true (otype == MODULEMD_TYPE_MODULE_STREAM_V2); g_assert_nonnull (object); g_assert_true (MODULEMD_IS_MODULE_STREAM_V2 (object)); /* with module/stream name overrides */ g_clear_error (&error); g_clear_object (&object); otype = modulemd_read_packager_string_ext (yaml_string, &object, "modulename-override", "streamname-override", &error); g_assert_no_error (error); g_assert_true (otype == MODULEMD_TYPE_MODULE_STREAM_V2); g_assert_nonnull (object); g_assert_true (MODULEMD_IS_MODULE_STREAM_V2 (object)); g_assert_cmpstr ( modulemd_module_stream_get_module_name (MODULEMD_MODULE_STREAM (object)), ==, "modulename-override"); g_assert_cmpstr ( modulemd_module_stream_get_stream_name (MODULEMD_MODULE_STREAM (object)), ==, "streamname-override"); /* Trivial modulemd stream v1, should get upgraded to v2 */ g_clear_error (&error); g_clear_object (&object); yaml_string = "---\n" "document: modulemd\n" "version: 1\n" "data:\n" " name: trivialname\n" " stream: trivialstream\n" " summary: Trivial Summary\n" " description: >-\n" " Trivial Description\n" " license:\n" " module: DUMMY\n" "...\n"; otype = modulemd_read_packager_string (yaml_string, &object, &error); g_assert_no_error (error); g_assert_true (otype == MODULEMD_TYPE_MODULE_STREAM_V2); g_assert_nonnull (object); g_assert_true (MODULEMD_IS_MODULE_STREAM_V2 (object)); /* with module/stream name overrides */ g_clear_error (&error); g_clear_object (&object); otype = modulemd_read_packager_string_ext (yaml_string, &object, "modulename-override", "streamname-override", &error); g_assert_no_error (error); g_assert_true (otype == MODULEMD_TYPE_MODULE_STREAM_V2); g_assert_nonnull (object); g_assert_true (MODULEMD_IS_MODULE_STREAM_V2 (object)); g_assert_cmpstr ( modulemd_module_stream_get_module_name (MODULEMD_MODULE_STREAM (object)), ==, "modulename-override"); g_assert_cmpstr ( modulemd_module_stream_get_stream_name (MODULEMD_MODULE_STREAM (object)), ==, "streamname-override"); /* NULL string should raise an exception */ g_clear_error (&error); g_clear_object (&object); modulemd_test_signal = 0; signal (SIGTRAP, modulemd_test_signal_handler); otype = modulemd_read_packager_string (NULL, &object, &error); g_assert_cmpint (modulemd_test_signal, ==, SIGTRAP); g_assert_cmpint (otype, ==, G_TYPE_INVALID); g_assert_null (object); /* An empty string is not a valid packager format */ g_clear_error (&error); g_clear_object (&object); otype = modulemd_read_packager_string ("", &object, &error); g_assert_error (error, MODULEMD_YAML_ERROR, MMD_YAML_ERROR_PARSE); g_assert_true (otype == G_TYPE_INVALID); g_assert_null (object); /* Invalid YAML string */ g_clear_error (&error); g_clear_object (&object); otype = modulemd_read_packager_string ("Hello, World!\n", &object, &error); g_assert_error (error, MODULEMD_YAML_ERROR, MMD_YAML_ERROR_PARSE); g_assert_true (otype == G_TYPE_INVALID); g_assert_null (object); } /* * Empty profiles are legal. Parser misinterpreted them as a list of one * package with an empty package name. */ static void test_empty_profile (void) { const gchar *yaml_string = NULL; g_autoptr (GError) error = NULL; g_autoptr (GObject) module = NULL; ModulemdProfile *profile; g_auto (GStrv) rpms = NULL; GType otype = G_TYPE_INVALID; /* A document with an empty rpms list. */ yaml_string = "document: modulemd\n" "version: 2\n" "data:\n" " name: test\n" " stream: A\n" " summary: Test.\n" " description: >\n" " Test.\n" " license:\n" " module: [ MIT ]\n" " profiles:\n" " profileA:\n" " rpms:\n"; otype = modulemd_read_packager_string (yaml_string, &module, &error); g_assert_no_error (error); g_assert_true (otype == MODULEMD_TYPE_MODULE_STREAM_V2); g_assert_nonnull (module); g_assert_true (MODULEMD_IS_MODULE_STREAM_V2 (module)); profile = modulemd_module_stream_v2_get_profile ( MODULEMD_MODULE_STREAM_V2 (module), "profileA"); g_assert_nonnull (profile); rpms = modulemd_profile_get_rpms_as_strv (profile); g_assert_nonnull (rpms); g_assert_cmpint (g_strv_length (rpms), ==, 0); } int main (int argc, char *argv[]) { setlocale (LC_ALL, ""); g_test_init (&argc, &argv, NULL); g_test_bug_base ("https://bugzilla.redhat.com/show_bug.cgi?id="); g_test_add_func ("/modulemd/v2/common/get_version", test_modulemd_get_version); g_test_add_func ("/modulemd/v2/common/load_file", test_modulemd_load_file); g_test_add_func ("/modulemd/v2/common/load_string", test_modulemd_load_string); g_test_add_func ("/modulemd/v2/common/packager/read_file", test_packager_read_file); g_test_add_func ("/modulemd/v2/common/packager/read_string", test_packager_read_string); g_test_add_func ("/modulemd/v2/common/empty_profile", test_empty_profile); return g_test_run (); } fedora-modularity-libmodulemd-357799c/modulemd/tests/test-modulemd-component-module.c000066400000000000000000000406521502446517500311320ustar00rootroot00000000000000/* * This file is part of libmodulemd * Copyright (C) 2018 Red Hat, Inc. * * Fedora-License-Identifier: MIT * SPDX-2.0-License-Identifier: MIT * SPDX-3.0-License-Identifier: MIT * * This program is free software. * For more information on the license, see COPYING. * For more information on free software, see . */ #include #include #include #include #include "modulemd-component-module.h" #include "modulemd-component.h" #include "private/glib-extensions.h" #include "private/modulemd-component-module-private.h" #include "private/modulemd-util.h" #include "private/modulemd-yaml.h" #include "private/test-utils.h" typedef struct _ComponentModuleFixture { } ComponentModuleFixture; gboolean signaled = FALSE; static void sigtrap_handler (int UNUSED (sig_num)) { signaled = TRUE; } static void component_module_test_construct (void) { g_autoptr (ModulemdComponentModule) m = NULL; ModulemdComponent *mc = NULL; gint64 buildorder = 42; /* Test that the new() function works */ m = modulemd_component_module_new ("testmodule"); mc = MODULEMD_COMPONENT (m); g_assert_nonnull (m); g_assert_true (MODULEMD_IS_COMPONENT_MODULE (m)); g_assert_cmpint (modulemd_component_get_buildorder (mc), ==, 0); g_assert_cmpstr (modulemd_component_get_name (mc), ==, "testmodule"); g_assert_null (modulemd_component_get_rationale (mc)); g_assert_null (modulemd_component_module_get_ref (m)); g_assert_null (modulemd_component_module_get_repository (m)); mc = NULL; g_clear_object (&m); /* Test that object instantiation works */ m = g_object_new (MODULEMD_TYPE_COMPONENT_MODULE, "name", "testmodule2", NULL); g_assert_true (MODULEMD_IS_COMPONENT_MODULE (m)); g_clear_object (&m); /* Instantiate with some argument */ // clang-format off m = g_object_new (MODULEMD_TYPE_COMPONENT_MODULE, "buildorder", buildorder, "name", "testmodule", "rationale", "Testing all the stuff", "ref", "someref", "repository", "somerepo", NULL); // clang-format on g_assert_nonnull (m); g_assert_true (MODULEMD_IS_COMPONENT_MODULE (m)); mc = MODULEMD_COMPONENT (m); g_assert_cmpint (modulemd_component_get_buildorder (mc), ==, buildorder); g_assert_cmpstr (modulemd_component_get_name (mc), ==, "testmodule"); g_assert_cmpstr ( modulemd_component_get_rationale (mc), ==, "Testing all the stuff"); g_assert_cmpstr (modulemd_component_module_get_ref (m), ==, "someref"); g_assert_cmpstr ( modulemd_component_module_get_repository (m), ==, "somerepo"); mc = NULL; g_clear_object (&m); /* Test that we abort with a NULL name to new() */ signaled = FALSE; signal (SIGTRAP, sigtrap_handler); m = modulemd_component_module_new (NULL); g_assert_true (signaled); g_clear_object (&m); /* Test that init fails without name */ signaled = FALSE; signal (SIGTRAP, sigtrap_handler); m = g_object_new (MODULEMD_TYPE_COMPONENT_MODULE, NULL); g_assert_true (signaled); g_clear_object (&m); /* Test that init fails with a NULL name */ signaled = FALSE; signal (SIGTRAP, sigtrap_handler); m = g_object_new (MODULEMD_TYPE_COMPONENT_MODULE, "name", NULL, NULL); g_assert_true (signaled); g_clear_object (&m); } static void component_module_test_equals (void) { g_autoptr (ModulemdComponentModule) m_1 = NULL; g_autoptr (ModulemdComponentModule) m_2 = NULL; /*Everything is same*/ m_1 = modulemd_component_module_new ("testmodule"); modulemd_component_set_buildorder (MODULEMD_COMPONENT (m_1), 42); modulemd_component_set_rationale (MODULEMD_COMPONENT (m_1), "Testing all the stuff"); modulemd_component_module_set_ref (m_1, "someref"); modulemd_component_module_set_repository (m_1, "somerepo"); m_2 = modulemd_component_module_new ("testmodule"); modulemd_component_set_buildorder (MODULEMD_COMPONENT (m_2), 42); modulemd_component_set_rationale (MODULEMD_COMPONENT (m_2), "Testing all the stuff"); modulemd_component_module_set_ref (m_2, "someref"); modulemd_component_module_set_repository (m_2, "somerepo"); g_assert_true (modulemd_component_equals (MODULEMD_COMPONENT (m_1), MODULEMD_COMPONENT (m_2))); g_clear_object (&m_1); g_clear_object (&m_2); /*repository is different*/ m_1 = modulemd_component_module_new ("testmodule"); modulemd_component_set_buildorder (MODULEMD_COMPONENT (m_1), 42); modulemd_component_set_rationale (MODULEMD_COMPONENT (m_1), "Testing all the stuff"); modulemd_component_module_set_ref (m_1, "someref"); modulemd_component_module_set_repository (m_1, "repoA"); m_2 = modulemd_component_module_new ("testmodule"); modulemd_component_set_buildorder (MODULEMD_COMPONENT (m_2), 42); modulemd_component_set_rationale (MODULEMD_COMPONENT (m_2), "Testing all the stuff"); modulemd_component_module_set_ref (m_2, "someref"); modulemd_component_module_set_repository (m_2, "somerepo"); g_assert_false (modulemd_component_equals (MODULEMD_COMPONENT (m_1), MODULEMD_COMPONENT (m_2))); g_clear_object (&m_1); g_clear_object (&m_2); /*ref is different*/ m_1 = modulemd_component_module_new ("testmodule"); modulemd_component_set_buildorder (MODULEMD_COMPONENT (m_1), 42); modulemd_component_set_rationale (MODULEMD_COMPONENT (m_1), "Testing all the stuff"); modulemd_component_module_set_ref (m_1, "someref"); modulemd_component_module_set_repository (m_1, "somerepo"); m_2 = modulemd_component_module_new ("testmodule"); modulemd_component_set_buildorder (MODULEMD_COMPONENT (m_2), 42); modulemd_component_set_rationale (MODULEMD_COMPONENT (m_2), "Testing all the stuff"); modulemd_component_module_set_ref (m_2, "refA"); modulemd_component_module_set_repository (m_2, "somerepo"); g_assert_false (modulemd_component_equals (MODULEMD_COMPONENT (m_1), MODULEMD_COMPONENT (m_2))); g_clear_object (&m_1); g_clear_object (&m_2); /*No ref*/ m_1 = modulemd_component_module_new ("testmodule"); modulemd_component_set_buildorder (MODULEMD_COMPONENT (m_1), 42); modulemd_component_set_rationale (MODULEMD_COMPONENT (m_1), "Testing all the stuff"); modulemd_component_module_set_repository (m_1, "somerepo"); m_2 = modulemd_component_module_new ("testmodule"); modulemd_component_set_buildorder (MODULEMD_COMPONENT (m_2), 42); modulemd_component_set_rationale (MODULEMD_COMPONENT (m_2), "Testing all the stuff"); modulemd_component_module_set_repository (m_2, "somerepo"); g_assert_true (modulemd_component_equals (MODULEMD_COMPONENT (m_1), MODULEMD_COMPONENT (m_2))); g_clear_object (&m_1); g_clear_object (&m_2); /*No repository*/ m_1 = modulemd_component_module_new ("testmodule"); modulemd_component_set_buildorder (MODULEMD_COMPONENT (m_1), 42); modulemd_component_set_rationale (MODULEMD_COMPONENT (m_1), "Testing all the stuff"); modulemd_component_module_set_ref (m_1, "someref"); m_2 = modulemd_component_module_new ("testmodule"); modulemd_component_set_buildorder (MODULEMD_COMPONENT (m_2), 42); modulemd_component_set_rationale (MODULEMD_COMPONENT (m_2), "Testing all the stuff"); modulemd_component_module_set_ref (m_2, "someref"); g_assert_true (modulemd_component_equals (MODULEMD_COMPONENT (m_1), MODULEMD_COMPONENT (m_2))); g_clear_object (&m_1); g_clear_object (&m_2); /*different ref and no repo*/ m_1 = modulemd_component_module_new ("testmodule"); modulemd_component_set_buildorder (MODULEMD_COMPONENT (m_1), 42); modulemd_component_set_rationale (MODULEMD_COMPONENT (m_1), "Testing all the stuff"); modulemd_component_module_set_ref (m_1, "someref"); m_2 = modulemd_component_module_new ("testmodule"); modulemd_component_set_buildorder (MODULEMD_COMPONENT (m_2), 42); modulemd_component_set_rationale (MODULEMD_COMPONENT (m_2), "Testing all the stuff"); modulemd_component_module_set_ref (m_2, "refAA"); g_assert_false (modulemd_component_equals (MODULEMD_COMPONENT (m_1), MODULEMD_COMPONENT (m_2))); g_clear_object (&m_1); g_clear_object (&m_2); } static void component_module_test_copy (void) { g_autoptr (ModulemdComponentModule) m_orig = NULL; g_autoptr (ModulemdComponentModule) m = NULL; ModulemdComponent *mc = NULL; m_orig = modulemd_component_module_new ("testmodule"); modulemd_component_set_buildorder (MODULEMD_COMPONENT (m_orig), 42); modulemd_component_set_rationale (MODULEMD_COMPONENT (m_orig), "Testing all the stuff"); modulemd_component_module_set_ref (m_orig, "someref"); modulemd_component_module_set_repository (m_orig, "somerepo"); g_assert_nonnull (m_orig); g_assert_true (MODULEMD_IS_COMPONENT_MODULE (m_orig)); m = MODULEMD_COMPONENT_MODULE ( modulemd_component_copy (MODULEMD_COMPONENT (m_orig), NULL)); g_assert_nonnull (m); g_assert_true (MODULEMD_IS_COMPONENT_MODULE (m)); mc = MODULEMD_COMPONENT (m); g_assert_cmpint (modulemd_component_get_buildorder (mc), ==, 42); g_assert_cmpstr (modulemd_component_get_name (mc), ==, "testmodule"); g_assert_cmpstr ( modulemd_component_get_rationale (mc), ==, "Testing all the stuff"); g_assert_cmpstr (modulemd_component_module_get_ref (m), ==, "someref"); g_assert_cmpstr ( modulemd_component_module_get_repository (m), ==, "somerepo"); mc = NULL; g_clear_object (&m); m = MODULEMD_COMPONENT_MODULE ( modulemd_component_copy (MODULEMD_COMPONENT (m_orig), "renamedmodule")); g_assert_nonnull (m); g_assert_true (MODULEMD_IS_COMPONENT_MODULE (m)); mc = MODULEMD_COMPONENT (m); g_assert_cmpint (modulemd_component_get_buildorder (mc), ==, 42); g_assert_cmpstr (modulemd_component_get_name (mc), ==, "renamedmodule"); g_assert_cmpstr ( modulemd_component_get_rationale (mc), ==, "Testing all the stuff"); g_assert_cmpstr (modulemd_component_module_get_ref (m), ==, "someref"); g_assert_cmpstr ( modulemd_component_module_get_repository (m), ==, "somerepo"); mc = NULL; g_clear_object (&m); } static void component_module_test_emit_yaml (void) { g_autoptr (ModulemdComponentModule) m = NULL; g_autoptr (GError) error = NULL; MMD_INIT_YAML_EMITTER (emitter); MMD_INIT_YAML_STRING (&emitter, yaml_string); m = modulemd_component_module_new ("testcomponent"); g_assert_true (mmd_emitter_start_stream (&emitter, &error)); g_assert_true (mmd_emitter_start_document (&emitter, &error)); g_assert_true ( mmd_emitter_start_mapping (&emitter, YAML_BLOCK_MAPPING_STYLE, &error)); g_assert_true (modulemd_component_module_emit_yaml (m, &emitter, &error)); g_assert_true (mmd_emitter_end_mapping (&emitter, &error)); g_assert_true (mmd_emitter_end_document (&emitter, &error)); g_assert_true (mmd_emitter_end_stream (&emitter, &error)); g_assert_cmpstr (yaml_string->str, ==, "---\n" "testcomponent: {}\n" "...\n"); g_clear_pointer (&yaml_string, modulemd_yaml_string_free); yaml_emitter_delete (&emitter); yaml_emitter_initialize (&emitter); yaml_string = g_malloc0_n (1, sizeof (modulemd_yaml_string)); yaml_emitter_set_output (&emitter, write_yaml_string, (void *)yaml_string); modulemd_component_set_rationale (MODULEMD_COMPONENT (m), "testrationale"); modulemd_component_set_buildorder (MODULEMD_COMPONENT (m), 42); modulemd_component_module_set_repository (m, "testrepository"); modulemd_component_module_set_ref (m, "testref"); g_assert_true (mmd_emitter_start_stream (&emitter, &error)); g_assert_true (mmd_emitter_start_document (&emitter, &error)); g_assert_true ( mmd_emitter_start_mapping (&emitter, YAML_BLOCK_MAPPING_STYLE, &error)); g_assert_true (modulemd_component_module_emit_yaml (m, &emitter, &error)); g_assert_true (mmd_emitter_end_mapping (&emitter, &error)); g_assert_true (mmd_emitter_end_document (&emitter, &error)); g_assert_true (mmd_emitter_end_stream (&emitter, &error)); g_assert_cmpstr (yaml_string->str, ==, "---\n" "testcomponent:\n" " rationale: testrationale\n" " repository: testrepository\n" " ref: testref\n" " buildorder: 42\n" "...\n"); } static void component_module_test_quoting_yaml (void) { g_autoptr (ModulemdComponentModule) m = NULL; g_autoptr (GError) error = NULL; MMD_INIT_YAML_EMITTER (emitter); MMD_INIT_YAML_STRING (&emitter, yaml_string); m = modulemd_component_module_new ("0"); modulemd_component_set_rationale (MODULEMD_COMPONENT (m), "1"); modulemd_component_set_buildorder (MODULEMD_COMPONENT (m), 2); modulemd_component_module_set_repository (m, "3"); modulemd_component_module_set_ref (m, "4"); g_assert_true (mmd_emitter_start_stream (&emitter, &error)); g_assert_true (mmd_emitter_start_document (&emitter, &error)); g_assert_true ( mmd_emitter_start_mapping (&emitter, YAML_BLOCK_MAPPING_STYLE, &error)); g_assert_true (modulemd_component_module_emit_yaml (m, &emitter, &error)); g_assert_true (mmd_emitter_end_mapping (&emitter, &error)); g_assert_true (mmd_emitter_end_document (&emitter, &error)); g_assert_true (mmd_emitter_end_stream (&emitter, &error)); g_assert_cmpstr (yaml_string->str, ==, "---\n" "\"0\":\n" " rationale: \"1\"\n" " repository: \"3\"\n" " ref: \"4\"\n" " buildorder: 2\n" "...\n"); } static void component_module_test_parse_yaml (void) { g_autoptr (ModulemdComponentModule) m = NULL; g_autoptr (GError) error = NULL; int result; MMD_INIT_YAML_EVENT (event); MMD_INIT_YAML_PARSER (parser); g_autofree gchar *yaml_path = NULL; g_autoptr (FILE) yaml_stream = NULL; yaml_path = g_strdup_printf ("%s/cm.yaml", g_getenv ("TEST_DATA_PATH")); g_assert_nonnull (yaml_path); yaml_stream = g_fopen (yaml_path, "rbe"); g_assert_nonnull (yaml_stream); yaml_parser_set_input_file (&parser, yaml_stream); parser_skip_headers (&parser); result = yaml_parser_parse (&parser, &event); g_assert_cmpint (result, ==, 1); g_assert_cmpint (event.type, ==, YAML_SCALAR_EVENT); yaml_event_delete (&event); m = modulemd_component_module_parse_yaml ( &parser, "includedmodule", TRUE, &error); g_assert_nonnull (m); g_assert_true (MODULEMD_IS_COMPONENT_MODULE (m)); g_assert_cmpstr (modulemd_component_get_name (MODULEMD_COMPONENT (m)), ==, "includedmodule"); g_assert_cmpstr (modulemd_component_get_rationale (MODULEMD_COMPONENT (m)), ==, "Included in the stack, just because."); g_assert_cmpint ( modulemd_component_get_buildorder (MODULEMD_COMPONENT (m)), ==, 100); g_assert_cmpstr (modulemd_component_module_get_repository (m), ==, "https://pagure.io/includedmodule.git"); g_assert_cmpstr ( modulemd_component_module_get_ref (m), ==, "somecoolbranchname"); } int main (int argc, char *argv[]) { setlocale (LC_ALL, ""); g_test_init (&argc, &argv, NULL); g_test_bug_base ("https://bugzilla.redhat.com/show_bug.cgi?id="); // Define the tests. g_test_add_func ("/modulemd/v2/component/module/construct", component_module_test_construct); g_test_add_func ("/modulemd/v2/component/module/equals", component_module_test_equals); g_test_add_func ("/modulemd/v2/component/module/copy", component_module_test_copy); g_test_add_func ("/modulemd/v2/component/module/yaml/emit", component_module_test_emit_yaml); g_test_add_func ("/modulemd/v2/component/module/yaml/quoting", component_module_test_quoting_yaml); g_test_add_func ("/modulemd/v2/component/module/yaml/parse", component_module_test_parse_yaml); return g_test_run (); } fedora-modularity-libmodulemd-357799c/modulemd/tests/test-modulemd-component-rpm.c000066400000000000000000000610511502446517500304370ustar00rootroot00000000000000/* * This file is part of libmodulemd * Copyright (C) 2018 Red Hat, Inc. * * Fedora-License-Identifier: MIT * SPDX-2.0-License-Identifier: MIT * SPDX-3.0-License-Identifier: MIT * * This program is free software. * For more information on the license, see COPYING. * For more information on free software, see . */ #include #include #include #include #include "modulemd-component-rpm.h" #include "modulemd-component.h" #include "private/glib-extensions.h" #include "private/modulemd-component-rpm-private.h" #include "private/modulemd-util.h" #include "private/modulemd-yaml.h" #include "private/test-utils.h" typedef struct _ComponentRpmFixture { } ComponentRpmFixture; static void component_rpm_test_construct (void) { g_autoptr (ModulemdComponentRpm) r = NULL; ModulemdComponent *mc = NULL; gint64 buildorder = 42; /* Test that the new() function works */ r = modulemd_component_rpm_new ("testcomponent"); mc = MODULEMD_COMPONENT (r); g_assert_nonnull (r); g_assert_true (MODULEMD_IS_COMPONENT_RPM (r)); g_assert_cmpint (modulemd_component_get_buildorder (mc), ==, 0); g_assert_cmpstr (modulemd_component_get_name (mc), ==, "testcomponent"); g_assert_null (modulemd_component_get_rationale (mc)); g_assert_null (modulemd_component_rpm_get_ref (r)); g_assert_null (modulemd_component_rpm_get_repository (r)); g_assert_null (modulemd_component_rpm_get_cache (r)); mc = NULL; g_clear_object (&r); /* Test that object instantiation works */ r = g_object_new (MODULEMD_TYPE_COMPONENT_RPM, "name", "testcomponent2", NULL); g_assert_true (MODULEMD_IS_COMPONENT_RPM (r)); g_clear_object (&r); /* Instantiate with some argument */ // clang-format off r = g_object_new (MODULEMD_TYPE_COMPONENT_RPM, "buildorder", buildorder, "name", "testmodule", "rationale", "Testing all the stuff", "ref", "someref", "repository", "somerepo", "cache", "somecache", NULL); // clang-format on g_assert_nonnull (r); g_assert_true (MODULEMD_IS_COMPONENT_RPM (r)); mc = MODULEMD_COMPONENT (r); g_assert_cmpint (modulemd_component_get_buildorder (mc), ==, buildorder); g_assert_cmpstr (modulemd_component_get_name (mc), ==, "testmodule"); g_assert_cmpstr ( modulemd_component_get_rationale (mc), ==, "Testing all the stuff"); g_assert_cmpstr (modulemd_component_rpm_get_ref (r), ==, "someref"); g_assert_cmpstr (modulemd_component_rpm_get_repository (r), ==, "somerepo"); g_assert_cmpstr (modulemd_component_rpm_get_cache (r), ==, "somecache"); mc = NULL; g_clear_object (&r); } static void component_rpm_test_equals (void) { g_autoptr (ModulemdComponentRpm) r_1 = NULL; g_autoptr (ModulemdComponentRpm) r_2 = NULL; /*Everything is same*/ r_1 = modulemd_component_rpm_new ("testmodule"); modulemd_component_set_buildorder (MODULEMD_COMPONENT (r_1), 42); modulemd_component_set_rationale (MODULEMD_COMPONENT (r_1), "Testing all the stuff"); modulemd_component_rpm_set_ref (r_1, "someref"); modulemd_component_rpm_set_repository (r_1, "somerepo"); modulemd_component_rpm_set_cache (r_1, "somecache"); modulemd_component_rpm_set_buildroot (r_1, TRUE); modulemd_component_rpm_set_srpm_buildroot (r_1, TRUE); modulemd_component_rpm_add_restricted_arch (r_1, "x86_64"); modulemd_component_rpm_add_restricted_arch (r_1, "i686"); modulemd_component_rpm_add_multilib_arch (r_1, "ppc64le"); modulemd_component_rpm_add_multilib_arch (r_1, "s390x"); r_2 = modulemd_component_rpm_new ("testmodule"); modulemd_component_set_buildorder (MODULEMD_COMPONENT (r_2), 42); modulemd_component_set_rationale (MODULEMD_COMPONENT (r_2), "Testing all the stuff"); modulemd_component_rpm_set_ref (r_2, "someref"); modulemd_component_rpm_set_repository (r_2, "somerepo"); modulemd_component_rpm_set_cache (r_2, "somecache"); modulemd_component_rpm_set_buildroot (r_2, TRUE); modulemd_component_rpm_set_srpm_buildroot (r_2, TRUE); modulemd_component_rpm_add_restricted_arch (r_2, "x86_64"); modulemd_component_rpm_add_restricted_arch (r_2, "i686"); modulemd_component_rpm_add_multilib_arch (r_2, "ppc64le"); modulemd_component_rpm_add_multilib_arch (r_2, "s390x"); g_assert_true (modulemd_component_equals (MODULEMD_COMPONENT (r_1), MODULEMD_COMPONENT (r_2))); g_clear_object (&r_1); g_clear_object (&r_2); /*Different ref and cache, everything else matching*/ r_1 = modulemd_component_rpm_new ("testmodule"); modulemd_component_set_buildorder (MODULEMD_COMPONENT (r_1), 42); modulemd_component_set_rationale (MODULEMD_COMPONENT (r_1), "Testing all the stuff"); modulemd_component_rpm_set_ref (r_1, "refA"); modulemd_component_rpm_set_repository (r_1, "somerepo"); modulemd_component_rpm_set_cache (r_1, "cacheA"); modulemd_component_rpm_set_buildroot (r_1, TRUE); modulemd_component_rpm_set_srpm_buildroot (r_1, TRUE); modulemd_component_rpm_add_restricted_arch (r_1, "x86_64"); modulemd_component_rpm_add_restricted_arch (r_1, "i686"); modulemd_component_rpm_add_multilib_arch (r_1, "ppc64le"); modulemd_component_rpm_add_multilib_arch (r_1, "s390x"); r_2 = modulemd_component_rpm_new ("testmodule"); modulemd_component_set_buildorder (MODULEMD_COMPONENT (r_2), 42); modulemd_component_set_rationale (MODULEMD_COMPONENT (r_2), "Testing all the stuff"); modulemd_component_rpm_set_ref (r_2, "someref"); modulemd_component_rpm_set_repository (r_2, "somerepo"); modulemd_component_rpm_set_cache (r_2, "somecache"); modulemd_component_rpm_set_buildroot (r_2, TRUE); modulemd_component_rpm_set_srpm_buildroot (r_2, TRUE); modulemd_component_rpm_add_restricted_arch (r_2, "x86_64"); modulemd_component_rpm_add_restricted_arch (r_2, "i686"); modulemd_component_rpm_add_multilib_arch (r_2, "ppc64le"); modulemd_component_rpm_add_multilib_arch (r_2, "s390x"); g_assert_false (modulemd_component_equals (MODULEMD_COMPONENT (r_1), MODULEMD_COMPONENT (r_2))); g_clear_object (&r_1); g_clear_object (&r_2); /*Different hashtables,everything else matching*/ r_1 = modulemd_component_rpm_new ("testmodule"); modulemd_component_set_buildorder (MODULEMD_COMPONENT (r_1), 42); modulemd_component_set_rationale (MODULEMD_COMPONENT (r_1), "Testing all the stuff"); modulemd_component_rpm_set_ref (r_1, "someref"); modulemd_component_rpm_set_repository (r_1, "somerepo"); modulemd_component_rpm_set_cache (r_1, "somecache"); modulemd_component_rpm_set_buildroot (r_1, TRUE); modulemd_component_rpm_set_srpm_buildroot (r_1, TRUE); modulemd_component_rpm_add_restricted_arch (r_1, "x86_65"); modulemd_component_rpm_add_restricted_arch (r_1, "i687"); modulemd_component_rpm_add_multilib_arch (r_1, "ppc64le"); modulemd_component_rpm_add_multilib_arch (r_1, "s390x"); r_2 = modulemd_component_rpm_new ("testmodule"); modulemd_component_set_buildorder (MODULEMD_COMPONENT (r_2), 42); modulemd_component_set_rationale (MODULEMD_COMPONENT (r_2), "Testing all the stuff"); modulemd_component_rpm_set_ref (r_2, "someref"); modulemd_component_rpm_set_repository (r_2, "somerepo"); modulemd_component_rpm_set_cache (r_2, "somecache"); modulemd_component_rpm_set_buildroot (r_2, TRUE); modulemd_component_rpm_set_srpm_buildroot (r_2, TRUE); modulemd_component_rpm_add_restricted_arch (r_2, "x86_64"); modulemd_component_rpm_add_restricted_arch (r_2, "i686"); modulemd_component_rpm_add_multilib_arch (r_2, "ppc64le"); modulemd_component_rpm_add_multilib_arch (r_2, "s390x"); g_assert_false (modulemd_component_equals (MODULEMD_COMPONENT (r_1), MODULEMD_COMPONENT (r_2))); g_clear_object (&r_1); g_clear_object (&r_2); } static void component_rpm_test_copy (void) { g_autoptr (ModulemdComponentRpm) r_orig = NULL; g_autoptr (ModulemdComponentRpm) r = NULL; g_auto (GStrv) list = NULL; ModulemdComponent *mc = NULL; r_orig = modulemd_component_rpm_new ("testmodule"); modulemd_component_set_buildorder (MODULEMD_COMPONENT (r_orig), 42); modulemd_component_set_rationale (MODULEMD_COMPONENT (r_orig), "Testing all the stuff"); modulemd_component_rpm_set_ref (r_orig, "someref"); modulemd_component_rpm_set_repository (r_orig, "somerepo"); modulemd_component_rpm_set_cache (r_orig, "somecache"); modulemd_component_rpm_set_buildroot (r_orig, TRUE); modulemd_component_rpm_set_srpm_buildroot (r_orig, TRUE); modulemd_component_rpm_add_restricted_arch (r_orig, "x86_64"); modulemd_component_rpm_add_restricted_arch (r_orig, "i686"); modulemd_component_rpm_add_multilib_arch (r_orig, "ppc64le"); modulemd_component_rpm_add_multilib_arch (r_orig, "s390x"); g_assert_nonnull (r_orig); g_assert_true (MODULEMD_IS_COMPONENT_RPM (r_orig)); r = MODULEMD_COMPONENT_RPM ( modulemd_component_copy (MODULEMD_COMPONENT (r_orig), NULL)); g_assert_nonnull (r); g_assert_true (MODULEMD_IS_COMPONENT_RPM (r)); mc = MODULEMD_COMPONENT (r); g_assert_cmpint (modulemd_component_get_buildorder (mc), ==, 42); g_assert_cmpstr (modulemd_component_get_name (mc), ==, "testmodule"); g_assert_cmpstr ( modulemd_component_get_rationale (mc), ==, "Testing all the stuff"); g_assert_cmpstr (modulemd_component_rpm_get_ref (r), ==, "someref"); g_assert_cmpstr (modulemd_component_rpm_get_repository (r), ==, "somerepo"); g_assert_cmpstr (modulemd_component_rpm_get_cache (r), ==, "somecache"); g_assert_true (modulemd_component_rpm_get_buildroot (r)); g_assert_true (modulemd_component_rpm_get_srpm_buildroot (r)); list = modulemd_component_rpm_get_arches_as_strv (r); g_assert_cmpint (g_strv_length (list), ==, 2); g_assert_cmpstr (list[0], ==, "i686"); g_assert_cmpstr (list[1], ==, "x86_64"); g_clear_pointer (&list, g_strfreev); list = modulemd_component_rpm_get_multilib_arches_as_strv (r); g_assert_cmpint (g_strv_length (list), ==, 2); g_assert_cmpstr (list[0], ==, "ppc64le"); g_assert_cmpstr (list[1], ==, "s390x"); g_clear_pointer (&list, g_strfreev); mc = NULL; g_clear_object (&r); r = MODULEMD_COMPONENT_RPM ( modulemd_component_copy (MODULEMD_COMPONENT (r_orig), "renamedrpm")); g_assert_nonnull (r); g_assert_true (MODULEMD_IS_COMPONENT_RPM (r)); mc = MODULEMD_COMPONENT (r); g_assert_cmpint (modulemd_component_get_buildorder (mc), ==, 42); g_assert_cmpstr (modulemd_component_get_name (mc), ==, "renamedrpm"); g_assert_cmpstr ( modulemd_component_get_rationale (mc), ==, "Testing all the stuff"); g_assert_cmpstr (modulemd_component_rpm_get_ref (r), ==, "someref"); g_assert_cmpstr (modulemd_component_rpm_get_repository (r), ==, "somerepo"); g_assert_cmpstr (modulemd_component_rpm_get_cache (r), ==, "somecache"); g_assert_true (modulemd_component_rpm_get_buildroot (r)); g_assert_true (modulemd_component_rpm_get_srpm_buildroot (r)); list = modulemd_component_rpm_get_arches_as_strv (r); g_assert_cmpint (g_strv_length (list), ==, 2); g_assert_cmpstr (list[0], ==, "i686"); g_assert_cmpstr (list[1], ==, "x86_64"); g_clear_pointer (&list, g_strfreev); list = modulemd_component_rpm_get_multilib_arches_as_strv (r); g_assert_cmpint (g_strv_length (list), ==, 2); g_assert_cmpstr (list[0], ==, "ppc64le"); g_assert_cmpstr (list[1], ==, "s390x"); g_clear_pointer (&list, g_strfreev); mc = NULL; g_clear_object (&r); } static void component_rpm_test_arches (void) { g_autoptr (ModulemdComponentRpm) r = NULL; g_auto (GStrv) list = NULL; r = modulemd_component_rpm_new ("testmodule"); modulemd_component_rpm_add_restricted_arch (r, "x86_64"); modulemd_component_rpm_add_restricted_arch (r, "i686"); modulemd_component_rpm_add_multilib_arch (r, "ppc64le"); modulemd_component_rpm_add_multilib_arch (r, "s390x"); g_assert_nonnull (r); g_assert_true (MODULEMD_IS_COMPONENT_RPM (r)); list = modulemd_component_rpm_get_arches_as_strv (r); g_assert_cmpint (g_strv_length (list), ==, 2); g_assert_cmpstr (list[0], ==, "i686"); g_assert_cmpstr (list[1], ==, "x86_64"); g_clear_pointer (&list, g_strfreev); list = modulemd_component_rpm_get_multilib_arches_as_strv (r); g_assert_cmpint (g_strv_length (list), ==, 2); g_assert_cmpstr (list[0], ==, "ppc64le"); g_assert_cmpstr (list[1], ==, "s390x"); g_clear_pointer (&list, g_strfreev); // Test rpm_clear_arches modulemd_component_rpm_clear_arches (r); list = modulemd_component_rpm_get_arches_as_strv (r); g_assert_cmpint (g_strv_length (list), ==, 0); g_clear_pointer (&list, g_strfreev); list = modulemd_component_rpm_get_multilib_arches_as_strv (r); g_assert_cmpint (g_strv_length (list), ==, 2); g_clear_pointer (&list, g_strfreev); // Test rpm_clear_multilib_arches modulemd_component_rpm_clear_multilib_arches (r); list = modulemd_component_rpm_get_arches_as_strv (r); g_assert_cmpint (g_strv_length (list), ==, 0); g_clear_pointer (&list, g_strfreev); list = modulemd_component_rpm_get_multilib_arches_as_strv (r); g_assert_cmpint (g_strv_length (list), ==, 0); g_clear_pointer (&list, g_strfreev); g_clear_object (&r); } static void component_rpm_test_emit_yaml (void) { g_autoptr (ModulemdComponentRpm) r = NULL; g_autoptr (GError) error = NULL; MMD_INIT_YAML_EMITTER (emitter); MMD_INIT_YAML_STRING (&emitter, yaml_string); r = modulemd_component_rpm_new ("testcomponent"); g_assert_true (mmd_emitter_start_stream (&emitter, &error)); g_assert_true (mmd_emitter_start_document (&emitter, &error)); g_assert_true ( mmd_emitter_start_mapping (&emitter, YAML_BLOCK_MAPPING_STYLE, &error)); g_assert_true (modulemd_component_rpm_emit_yaml (r, &emitter, &error)); g_assert_true (mmd_emitter_end_mapping (&emitter, &error)); g_assert_true (mmd_emitter_end_document (&emitter, &error)); g_assert_true (mmd_emitter_end_stream (&emitter, &error)); g_assert_cmpstr (yaml_string->str, ==, "---\n" "testcomponent: {}\n" "...\n"); g_clear_pointer (&yaml_string, modulemd_yaml_string_free); yaml_emitter_delete (&emitter); yaml_emitter_initialize (&emitter); yaml_string = g_malloc0_n (1, sizeof (modulemd_yaml_string)); yaml_emitter_set_output (&emitter, write_yaml_string, (void *)yaml_string); modulemd_component_set_rationale (MODULEMD_COMPONENT (r), "testrationale"); modulemd_component_set_buildorder (MODULEMD_COMPONENT (r), 42); modulemd_component_rpm_set_repository (r, "testrepository"); modulemd_component_rpm_set_ref (r, "testref"); modulemd_component_rpm_set_cache (r, "testcache"); modulemd_component_rpm_set_buildroot (r, TRUE); modulemd_component_rpm_set_srpm_buildroot (r, TRUE); modulemd_component_rpm_add_restricted_arch (r, "x86_64"); modulemd_component_rpm_add_restricted_arch (r, "i686"); modulemd_component_rpm_add_multilib_arch (r, "ppc64le"); modulemd_component_rpm_add_multilib_arch (r, "s390x"); g_assert_true (mmd_emitter_start_stream (&emitter, &error)); g_assert_true (mmd_emitter_start_document (&emitter, &error)); g_assert_true ( mmd_emitter_start_mapping (&emitter, YAML_BLOCK_MAPPING_STYLE, &error)); g_assert_true (modulemd_component_rpm_emit_yaml (r, &emitter, &error)); g_assert_true (mmd_emitter_end_mapping (&emitter, &error)); g_assert_true (mmd_emitter_end_document (&emitter, &error)); g_assert_true (mmd_emitter_end_stream (&emitter, &error)); g_assert_cmpstr (yaml_string->str, ==, "---\n" "testcomponent:\n" " rationale: testrationale\n" " repository: testrepository\n" " cache: testcache\n" " ref: testref\n" " buildroot: true\n" " srpm-buildroot: true\n" " buildorder: 42\n" " arches: [i686, x86_64]\n" " multilib: [ppc64le, s390x]\n" "...\n"); } static void component_rpm_test_quoting_yaml (void) { g_autoptr (ModulemdComponentRpm) r = NULL; g_autoptr (GError) error = NULL; MMD_INIT_YAML_EMITTER (emitter); MMD_INIT_YAML_STRING (&emitter, yaml_string); r = modulemd_component_rpm_new ("0"); modulemd_component_set_rationale (MODULEMD_COMPONENT (r), "1"); modulemd_component_set_buildorder (MODULEMD_COMPONENT (r), 2); modulemd_component_rpm_set_repository (r, "3"); modulemd_component_rpm_set_ref (r, "4"); modulemd_component_rpm_set_cache (r, "5"); modulemd_component_rpm_set_buildroot (r, TRUE); modulemd_component_rpm_set_srpm_buildroot (r, TRUE); modulemd_component_rpm_add_restricted_arch (r, "6"); modulemd_component_rpm_add_multilib_arch (r, "7"); g_assert_true (mmd_emitter_start_stream (&emitter, &error)); g_assert_true (mmd_emitter_start_document (&emitter, &error)); g_assert_true ( mmd_emitter_start_mapping (&emitter, YAML_BLOCK_MAPPING_STYLE, &error)); g_assert_true (modulemd_component_rpm_emit_yaml (r, &emitter, &error)); g_assert_true (mmd_emitter_end_mapping (&emitter, &error)); g_assert_true (mmd_emitter_end_document (&emitter, &error)); g_assert_true (mmd_emitter_end_stream (&emitter, &error)); g_assert_cmpstr (yaml_string->str, ==, "---\n" "\"0\":\n" " rationale: \"1\"\n" " repository: \"3\"\n" " cache: \"5\"\n" " ref: \"4\"\n" " buildroot: true\n" " srpm-buildroot: true\n" " buildorder: 2\n" " arches: [\"6\"]\n" " multilib: [\"7\"]\n" "...\n"); } static void component_rpm_test_parse_yaml (void) { g_autoptr (ModulemdComponentRpm) r = NULL; g_autoptr (GError) error = NULL; int result; MMD_INIT_YAML_EVENT (event); MMD_INIT_YAML_PARSER (parser); g_autofree gchar *yaml_path = NULL; g_auto (GStrv) list = NULL; g_autoptr (FILE) yaml_stream = NULL; yaml_path = g_strdup_printf ("%s/component-rpm/cr.yaml", g_getenv ("TEST_DATA_PATH")); g_assert_nonnull (yaml_path); yaml_stream = g_fopen (yaml_path, "rbe"); g_assert_nonnull (yaml_stream); yaml_parser_set_input_file (&parser, yaml_stream); parser_skip_headers (&parser); result = yaml_parser_parse (&parser, &event); g_assert_cmpint (result, ==, 1); g_assert_cmpint (event.type, ==, YAML_SCALAR_EVENT); yaml_event_delete (&event); r = modulemd_component_rpm_parse_yaml (&parser, "bar", TRUE, &error); g_assert_nonnull (r); g_assert_true (MODULEMD_IS_COMPONENT_RPM (r)); g_assert_cmpstr ( modulemd_component_get_name (MODULEMD_COMPONENT (r)), ==, "bar"); g_assert_cmpstr (modulemd_component_get_rationale (MODULEMD_COMPONENT (r)), ==, "We need this to demonstrate stuff."); g_assert_cmpint ( modulemd_component_get_buildorder (MODULEMD_COMPONENT (r)), ==, 100); g_assert_cmpstr (modulemd_component_rpm_get_repository (r), ==, "https://pagure.io/bar.git"); g_assert_cmpstr (modulemd_component_rpm_get_ref (r), ==, "26ca0c0"); g_assert_cmpstr ( modulemd_component_rpm_get_cache (r), ==, "https://example.com/cache"); g_assert_true (modulemd_component_rpm_get_buildroot (r)); g_assert_true (modulemd_component_rpm_get_srpm_buildroot (r)); list = modulemd_component_rpm_get_arches_as_strv (r); g_assert_cmpint (g_strv_length (list), ==, 2); g_assert_cmpstr (list[0], ==, "i686"); g_assert_cmpstr (list[1], ==, "x86_64"); g_clear_pointer (&list, g_strfreev); list = modulemd_component_rpm_get_multilib_arches_as_strv (r); g_assert_cmpint (g_strv_length (list), ==, 1); g_assert_cmpstr (list[0], ==, "x86_64"); g_clear_pointer (&list, g_strfreev); } static void component_rpm_test_parse_packager_yaml (void) { g_autoptr (ModulemdComponentRpm) r = NULL; g_autoptr (GError) error = NULL; int result; MMD_INIT_YAML_EVENT (event); MMD_INIT_YAML_PARSER (parser); g_autofree gchar *yaml_path = NULL; g_auto (GStrv) list = NULL; g_autoptr (FILE) yaml_stream = NULL; /* First test a valid component RPM */ yaml_path = g_strdup_printf ("%s/component-rpm/cr_buildafter.yaml", g_getenv ("TEST_DATA_PATH")); g_assert_nonnull (yaml_path); yaml_stream = g_fopen (yaml_path, "rbe"); g_assert_nonnull (yaml_stream); yaml_parser_set_input_file (&parser, yaml_stream); parser_skip_headers (&parser); result = yaml_parser_parse (&parser, &event); g_assert_cmpint (result, ==, 1); g_assert_cmpint (event.type, ==, YAML_SCALAR_EVENT); yaml_event_delete (&event); r = modulemd_component_rpm_parse_yaml (&parser, "bar", TRUE, &error); g_assert_no_error (error); g_assert_nonnull (r); g_assert_true (MODULEMD_IS_COMPONENT_RPM (r)); g_assert_cmpstr ( modulemd_component_get_name (MODULEMD_COMPONENT (r)), ==, "bar"); g_assert_cmpstr (modulemd_component_get_rationale (MODULEMD_COMPONENT (r)), ==, "We need this to demonstrate stuff."); list = modulemd_component_get_buildafter_as_strv (MODULEMD_COMPONENT (r)); g_assert_nonnull (list); g_assert_cmpstr (list[0], ==, "foo"); g_assert_null (list[1]); g_clear_pointer (&list, g_strfreev); g_assert_cmpstr (modulemd_component_rpm_get_repository (r), ==, "https://pagure.io/bar.git"); g_assert_cmpstr (modulemd_component_rpm_get_ref (r), ==, "26ca0c0"); g_assert_cmpstr ( modulemd_component_rpm_get_cache (r), ==, "https://example.com/cache"); g_assert_true (modulemd_component_rpm_get_buildroot (r)); g_assert_true (modulemd_component_rpm_get_srpm_buildroot (r)); list = modulemd_component_rpm_get_arches_as_strv (r); g_assert_cmpint (g_strv_length (list), ==, 2); g_assert_cmpstr (list[0], ==, "i686"); g_assert_cmpstr (list[1], ==, "x86_64"); g_clear_pointer (&list, g_strfreev); list = modulemd_component_rpm_get_multilib_arches_as_strv (r); g_assert_cmpint (g_strv_length (list), ==, 1); g_assert_cmpstr (list[0], ==, "x86_64"); g_clear_pointer (&list, g_strfreev); } static void component_rpm_test_override_name (void) { g_autoptr (ModulemdComponentRpm) r = NULL; r = modulemd_component_rpm_new ("a_key"); /* Right after construction, the key and name must have the same value */ g_assert_cmpstr ( modulemd_component_get_key (MODULEMD_COMPONENT (r)), ==, "a_key"); g_assert_cmpstr (modulemd_component_get_key (MODULEMD_COMPONENT (r)), ==, modulemd_component_get_name (MODULEMD_COMPONENT (r))); modulemd_component_set_name (MODULEMD_COMPONENT (r), "a_name"); /* The key must remain the same */ g_assert_cmpstr ( modulemd_component_get_key (MODULEMD_COMPONENT (r)), ==, "a_key"); /* The name will now be "a_name" */ g_assert_cmpstr ( modulemd_component_get_name (MODULEMD_COMPONENT (r)), ==, "a_name"); /* Unset the name and make sure it's back to returning the original value */ modulemd_component_set_name (MODULEMD_COMPONENT (r), NULL); g_assert_cmpstr ( modulemd_component_get_key (MODULEMD_COMPONENT (r)), ==, "a_key"); g_assert_cmpstr (modulemd_component_get_key (MODULEMD_COMPONENT (r)), ==, modulemd_component_get_name (MODULEMD_COMPONENT (r))); } int main (int argc, char *argv[]) { setlocale (LC_ALL, ""); g_test_init (&argc, &argv, NULL); g_test_bug_base ("https://bugzilla.redhat.com/show_bug.cgi?id="); // Define the tests. g_test_add_func ("/modulemd/v2/component/rpm/construct", component_rpm_test_construct); g_test_add_func ("/modulemd/v2/component/rpm/equals", component_rpm_test_equals); g_test_add_func ("/modulemd/v2/component/rpm/copy", component_rpm_test_copy); g_test_add_func ("/modulemd/v2/component/rpm/arches", component_rpm_test_arches); g_test_add_func ("/modulemd/v2/component/rpm/yaml/emit", component_rpm_test_emit_yaml); g_test_add_func ("/modulemd/v2/component/rpm/yaml/quoting", component_rpm_test_quoting_yaml); g_test_add_func ("/modulemd/v2/component/rpm/yaml/parse", component_rpm_test_parse_yaml); g_test_add_func ("/modulemd/v2/component/rpm/yaml/parse/packager", component_rpm_test_parse_packager_yaml); g_test_add_func ("/modulemd/v2/component/rpm/override_name", component_rpm_test_override_name); return g_test_run (); } fedora-modularity-libmodulemd-357799c/modulemd/tests/test-modulemd-compression.c000066400000000000000000000176531502446517500302130ustar00rootroot00000000000000/* * This file is part of libmodulemd * Copyright (C) 2018 Red Hat, Inc. * * Fedora-License-Identifier: MIT * SPDX-2.0-License-Identifier: MIT * SPDX-3.0-License-Identifier: MIT * * This program is free software. * For more information on the license, see COPYING. * For more information on free software, see . */ #include #include #include "modulemd-compression.h" #include "private/modulemd-compression-private.h" #include "private/modulemd-yaml.h" #include "private/test-utils.h" /* == Public Functions == */ static void test_modulemd_compression_type (void) { g_assert_cmpint (modulemd_compression_type ("gz"), ==, MODULEMD_COMPRESSION_TYPE_GZ_COMPRESSION); g_assert_cmpint (modulemd_compression_type ("gzip"), ==, MODULEMD_COMPRESSION_TYPE_GZ_COMPRESSION); g_assert_cmpint (modulemd_compression_type ("bz2"), ==, MODULEMD_COMPRESSION_TYPE_BZ2_COMPRESSION); g_assert_cmpint (modulemd_compression_type ("bzip2"), ==, MODULEMD_COMPRESSION_TYPE_BZ2_COMPRESSION); g_assert_cmpint (modulemd_compression_type ("xz"), ==, MODULEMD_COMPRESSION_TYPE_XZ_COMPRESSION); g_assert_cmpint (modulemd_compression_type ("zstd"), ==, MODULEMD_COMPRESSION_TYPE_ZSTD_COMPRESSION); g_assert_cmpint (modulemd_compression_type ("garbage"), ==, MODULEMD_COMPRESSION_TYPE_UNKNOWN_COMPRESSION); g_assert_cmpint (modulemd_compression_type (NULL), ==, MODULEMD_COMPRESSION_TYPE_UNKNOWN_COMPRESSION); } struct expected_compression_t { const char *filename; ModulemdCompressionTypeEnum type; }; /* == Private Functions == */ static void test_modulemd_detect_compression (void) { int fd; g_autofree gchar *filename = NULL; g_autoptr (FILE) filestream = NULL; g_autoptr (GError) error = NULL; ModulemdCompressionTypeEnum result; struct expected_compression_t expected[] = { { .filename = "bzipped.yaml.bz2", .type = MODULEMD_COMPRESSION_TYPE_BZ2_COMPRESSION }, { .filename = "gzipped.yaml.gz", .type = MODULEMD_COMPRESSION_TYPE_GZ_COMPRESSION }, { .filename = "xzipped.yaml.xz", .type = MODULEMD_COMPRESSION_TYPE_XZ_COMPRESSION }, { .filename = "zstded.yaml.zst", .type = MODULEMD_COMPRESSION_TYPE_ZSTD_COMPRESSION }, { .filename = "uncompressed.yaml", .type = MODULEMD_COMPRESSION_TYPE_NO_COMPRESSION }, { .filename = "empty", .type = MODULEMD_COMPRESSION_TYPE_NO_COMPRESSION }, { .filename = NULL } }; /* == Detect by file extension == */ for (size_t i = 0; expected[i].filename; i++) { filename = g_strdup_printf ("%s/compression/%s", g_getenv ("TEST_DATA_PATH"), expected[i].filename); g_debug ("Getting compression type for %s", filename); filestream = g_fopen (filename, "rbe"); g_assert_nonnull (filestream); fd = fileno (filestream); result = modulemd_detect_compression (filename, fd, &error); g_assert_no_error (error); g_assert_cmpint (result, ==, expected[i].type); g_clear_error (&error); g_clear_pointer (&filestream, fclose); g_clear_pointer (&filename, g_free); } /* == Test detection by content == */ struct expected_compression_t expected_magic[] = { { .filename = "bzipped", .type = MODULEMD_COMPRESSION_TYPE_BZ2_COMPRESSION }, { .filename = "gzipped", .type = MODULEMD_COMPRESSION_TYPE_GZ_COMPRESSION }, { .filename = "xzipped", .type = MODULEMD_COMPRESSION_TYPE_XZ_COMPRESSION }, { .filename = "zstded", .type = MODULEMD_COMPRESSION_TYPE_ZSTD_COMPRESSION }, { .filename = "uncompressed", .type = MODULEMD_COMPRESSION_TYPE_NO_COMPRESSION }, { .filename = "empty", .type = MODULEMD_COMPRESSION_TYPE_NO_COMPRESSION }, { .filename = NULL } }; for (size_t j = 0; expected_magic[j].filename; j++) { filename = g_strdup_printf ("%s/compression/%s", g_getenv ("TEST_DATA_PATH"), expected_magic[j].filename); g_debug ("Getting compression type for %s", filename); filestream = g_fopen (filename, "rbe"); g_assert_nonnull (filestream); fd = fileno (filestream); result = modulemd_detect_compression (filename, fd, &error); g_assert_no_error (error); g_assert_cmpint (result, ==, expected_magic[j].type); g_clear_error (&error); g_clear_pointer (&filestream, fclose); g_clear_pointer (&filename, g_free); } } struct expected_suffix_t { ModulemdCompressionTypeEnum type; const char *suffix; }; static void test_modulemd_compression_suffix (void) { struct expected_suffix_t expected[] = { { .type = MODULEMD_COMPRESSION_TYPE_DETECTION_FAILED, .suffix = NULL }, { .type = MODULEMD_COMPRESSION_TYPE_UNKNOWN_COMPRESSION, .suffix = NULL }, { .type = MODULEMD_COMPRESSION_TYPE_NO_COMPRESSION, .suffix = NULL }, { .type = MODULEMD_COMPRESSION_TYPE_GZ_COMPRESSION, .suffix = ".gz" }, { .type = MODULEMD_COMPRESSION_TYPE_BZ2_COMPRESSION, .suffix = ".bz2" }, { .type = MODULEMD_COMPRESSION_TYPE_XZ_COMPRESSION, .suffix = ".xz" }, { .type = MODULEMD_COMPRESSION_TYPE_ZSTD_COMPRESSION, .suffix = ".zst" }, { .type = MODULEMD_COMPRESSION_TYPE_SENTINEL, .suffix = NULL } }; for (size_t i = 0; expected[i].type != MODULEMD_COMPRESSION_TYPE_SENTINEL; i++) { g_assert_cmpstr (modulemd_compression_suffix (expected[i].type), ==, expected[i].suffix); } } struct expected_fmode_t { ModulemdCompressionTypeEnum type; const gchar *suffix; }; static void test_modulemd_get_rpmio_fmode (void) { struct expected_fmode_t expected[] = { { .type = MODULEMD_COMPRESSION_TYPE_DETECTION_FAILED, .suffix = NULL }, { .type = MODULEMD_COMPRESSION_TYPE_UNKNOWN_COMPRESSION, .suffix = NULL }, { .type = MODULEMD_COMPRESSION_TYPE_NO_COMPRESSION, .suffix = "fdio" }, { .type = MODULEMD_COMPRESSION_TYPE_GZ_COMPRESSION, .suffix = "gzdio" }, { .type = MODULEMD_COMPRESSION_TYPE_BZ2_COMPRESSION, .suffix = "bzdio" }, { .type = MODULEMD_COMPRESSION_TYPE_XZ_COMPRESSION, .suffix = "xzdio" }, { .type = MODULEMD_COMPRESSION_TYPE_ZSTD_COMPRESSION, .suffix = "zstdio" }, { .type = MODULEMD_COMPRESSION_TYPE_SENTINEL, .suffix = NULL } }; const char *mode[] = { "r", "w", "a", "r+", "w+", "a+", NULL }; g_autofree gchar *fmode = NULL; g_autofree gchar *expected_fmode = NULL; for (size_t i = 0; expected[i].type != MODULEMD_COMPRESSION_TYPE_SENTINEL; i++) { for (size_t j = 0; mode[j]; j++) { fmode = modulemd_get_rpmio_fmode (mode[j], expected[i].type); if (expected[i].suffix == NULL) { g_assert_null (fmode); g_clear_pointer (&fmode, g_free); continue; } expected_fmode = g_strdup_printf ("%s.%s", mode[j], expected[i].suffix); g_assert_cmpstr (fmode, ==, expected_fmode); g_clear_pointer (&expected_fmode, g_free); g_clear_pointer (&fmode, g_free); } } } int main (int argc, char *argv[]) { setlocale (LC_ALL, ""); g_test_init (&argc, &argv, NULL); g_test_bug_base ("https://bugzilla.redhat.com/show_bug.cgi?id="); g_test_add_func ("/modulemd/compression/type", test_modulemd_compression_type); g_test_add_func ("/modulemd/compression/detect", test_modulemd_detect_compression); g_test_add_func ("/modulemd/compression/suffix", test_modulemd_compression_suffix); g_test_add_func ("/modulemd/compression/rmpio/fmode", test_modulemd_get_rpmio_fmode); return g_test_run (); } fedora-modularity-libmodulemd-357799c/modulemd/tests/test-modulemd-context.c000066400000000000000000000156171502446517500273340ustar00rootroot00000000000000/* * This file is part of libmodulemd * Copyright (C) 2021 Red Hat, Inc. * * Fedora-License-Identifier: MIT * SPDX-2.0-License-Identifier: MIT * SPDX-3.0-License-Identifier: MIT * * This program is free software. * For more information on the license, see COPYING. * For more information on free software, see . */ #include #include #include "modulemd.h" #include "config.h" static void test_modulemd_v3_context_valid (void) { const gchar *yaml_string = NULL; g_autoptr (GError) error = NULL; g_autoptr (GObject) object = NULL; GType type = G_TYPE_INVALID; yaml_string = "---\n" "document: modulemd-packager\n" "version: 3\n" "data:\n" " name: trivialname\n" " stream: trivialstream\n" " summary: Trivial Summary\n" " description: >-\n" " Trivial Description\n" " license: [DUMMY]\n" " configurations:\n" " - context: a234567890\n" " platform: foo\n" "...\n"; type = modulemd_read_packager_string (yaml_string, &object, &error); g_assert_true (type == MODULEMD_TYPE_PACKAGER_V3); g_assert_no_error (error); } static void test_modulemd_v3_context_overlong (void) { const gchar *yaml_string = NULL; g_autoptr (GError) error = NULL; g_autoptr (GObject) object = NULL; GType type = G_TYPE_INVALID; yaml_string = "---\n" "document: modulemd-packager\n" "version: 3\n" "data:\n" " name: trivialname\n" " stream: trivialstream\n" " summary: Trivial Summary\n" " description: >-\n" " Trivial Description\n" " license: [DUMMY]\n" " configurations:\n" " - context: a2345678901\n" " platform: foo\n" "...\n"; type = modulemd_read_packager_string (yaml_string, &object, &error); g_assert_true (type == G_TYPE_INVALID); g_assert_error (error, MODULEMD_ERROR, MMD_ERROR_VALIDATE); } static void test_modulemd_v3_context_bad_underscore (void) { const gchar *yaml_string = NULL; g_autoptr (GError) error = NULL; g_autoptr (GObject) object = NULL; GType type = G_TYPE_INVALID; yaml_string = "---\n" "document: modulemd-packager\n" "version: 3\n" "data:\n" " name: trivialname\n" " stream: trivialstream\n" " summary: Trivial Summary\n" " description: >-\n" " Trivial Description\n" " license: [DUMMY]\n" " configurations:\n" " - context: _\n" " platform: foo\n" "...\n"; type = modulemd_read_packager_string (yaml_string, &object, &error); g_assert_true (type == G_TYPE_INVALID); g_assert_error (error, MODULEMD_ERROR, MMD_ERROR_VALIDATE); } static void test_modulemd_v3_context_duplicate (void) { const gchar *yaml_string = NULL; g_autoptr (GError) error = NULL; g_autoptr (GObject) object = NULL; GType type = G_TYPE_INVALID; yaml_string = "---\n" "document: modulemd-packager\n" "version: 3\n" "data:\n" " name: foo\n" " stream: bar\n" " license: [DUMMY]\n" " configurations:\n" " - context: A\n" " platform: 1\n" " - context: A\n" " platform: 2\n" "...\n"; type = modulemd_read_packager_string (yaml_string, &object, &error); g_assert_true (type == G_TYPE_INVALID); g_assert_error (error, MODULEMD_ERROR, MMD_ERROR_VALIDATE); } static void test_modulemd_v2_context_valid (void) { const gchar *yaml_string = NULL; g_autoptr (GError) error = NULL; g_autoptr (GObject) object = NULL; GType type = G_TYPE_INVALID; yaml_string = "---\n" "document: modulemd\n" "version: 2\n" "data:\n" " name: trivialname\n" " stream: trivialstream\n" " summary: Trivial Summary\n" " description: >-\n" " Trivial Description\n" " license:\n" " module: [DUMMY]\n" " static_context: true\n" " context: a234567890_23\n" "...\n"; type = modulemd_read_packager_string (yaml_string, &object, &error); g_assert_true (type == MODULEMD_TYPE_MODULE_STREAM_V2); g_assert_no_error (error); /* Reading v2 document does not validate it; validating explictly */ g_assert_true ( modulemd_module_stream_validate (MODULEMD_MODULE_STREAM (object), &error)); } static void test_modulemd_v2_context_overlong (void) { const gchar *yaml_string = NULL; g_autoptr (GError) error = NULL; g_autoptr (GObject) object = NULL; GType type = G_TYPE_INVALID; yaml_string = "---\n" "document: modulemd\n" "version: 2\n" "data:\n" " name: trivialname\n" " stream: trivialstream\n" " summary: Trivial Summary\n" " description: >-\n" " Trivial Description\n" " license:\n" " module: [DUMMY]\n" " static_context: true\n" " context: a234567890_234\n" "...\n"; type = modulemd_read_packager_string (yaml_string, &object, &error); g_assert_true (type == MODULEMD_TYPE_MODULE_STREAM_V2); g_assert_no_error (error); /* Reading v2 document does not validate it; validating explictly */ g_assert_false ( modulemd_module_stream_validate (MODULEMD_MODULE_STREAM (object), &error)); } static void test_modulemd_v2_context_bad_character (void) { const gchar *yaml_string = NULL; g_autoptr (GError) error = NULL; g_autoptr (GObject) object = NULL; GType type = G_TYPE_INVALID; yaml_string = "---\n" "document: modulemd\n" "version: 2\n" "data:\n" " name: trivialname\n" " stream: trivialstream\n" " summary: Trivial Summary\n" " description: >-\n" " Trivial Description\n" " license:\n" " module: [DUMMY]\n" " static_context: true\n" " context: '-'\n" "...\n"; type = modulemd_read_packager_string (yaml_string, &object, &error); g_assert_true (type == MODULEMD_TYPE_MODULE_STREAM_V2); g_assert_no_error (error); /* Reading v2 document does not validate it; validating explictly */ g_assert_false ( modulemd_module_stream_validate (MODULEMD_MODULE_STREAM (object), &error)); } int main (int argc, char *argv[]) { setlocale (LC_ALL, ""); g_test_init (&argc, &argv, NULL); g_test_set_nonfatal_assertions (); g_test_bug_base ("https://github.com/fedora-modularity/libmodulemd/issues/"); g_test_bug ("549"); g_test_add_func ("/modulemd/v3/context/valid", test_modulemd_v3_context_valid); g_test_add_func ("/modulemd/v3/context/overlong", test_modulemd_v3_context_overlong); g_test_add_func ("/modulemd/v3/context/bad_underscore", test_modulemd_v3_context_bad_underscore); g_test_add_func ("/modulemd/v3/context/duplicate", test_modulemd_v3_context_duplicate); g_test_add_func ("/modulemd/v2/context/valid", test_modulemd_v2_context_valid); g_test_add_func ("/modulemd/v2/context/overlong", test_modulemd_v2_context_overlong); g_test_add_func ("/modulemd/v2/context/bad_character", test_modulemd_v2_context_bad_character); return g_test_run (); } fedora-modularity-libmodulemd-357799c/modulemd/tests/test-modulemd-defaults-v1.c000066400000000000000000000752411502446517500300020ustar00rootroot00000000000000/* * This file is part of libmodulemd * Copyright (C) 2017-2018 Stephen Gallagher * * Fedora-License-Identifier: MIT * SPDX-2.0-License-Identifier: MIT * SPDX-3.0-License-Identifier: MIT * * This program is free software. * For more information on the license, see COPYING. * For more information on free software, see . */ #include #include #include #include #include "modulemd-defaults-v1.h" #include "private/glib-extensions.h" #include "private/modulemd-defaults-v1-private.h" #include "private/modulemd-subdocument-info-private.h" #include "private/modulemd-translation-entry-private.h" #include "private/modulemd-yaml.h" #include "private/test-utils.h" static void defaults_test_construct (void) { g_autoptr (ModulemdDefaultsV1) defaults = NULL; /* Test new() with a valid module name */ defaults = modulemd_defaults_v1_new ("foo"); g_assert_nonnull (defaults); g_assert_true (MODULEMD_IS_DEFAULTS (defaults)); g_assert_true (MODULEMD_IS_DEFAULTS_V1 (defaults)); g_clear_object (&defaults); /* Test new() with a NULL module_name */ modulemd_test_signal = 0; signal (SIGTRAP, modulemd_test_signal_handler); defaults = modulemd_defaults_v1_new (NULL); g_assert_cmpint (modulemd_test_signal, ==, SIGTRAP); g_clear_object (&defaults); /* Test object instantiation with a valid module name */ // clang-format off defaults = g_object_new (MODULEMD_TYPE_DEFAULTS_V1, "module-name", "bar", NULL); // clang-format on g_assert_nonnull (defaults); g_assert_true (MODULEMD_IS_DEFAULTS (defaults)); g_assert_true (MODULEMD_IS_DEFAULTS_V1 (defaults)); g_clear_object (&defaults); /* Test object instantiation with a NULL module name */ modulemd_test_signal = 0; signal (SIGTRAP, modulemd_test_signal_handler); // clang-format off defaults = g_object_new (MODULEMD_TYPE_DEFAULTS_V1, "module-name", NULL, NULL); // clang-format on g_assert_cmpint (modulemd_test_signal, ==, SIGTRAP); g_clear_object (&defaults); /* Test object instantiation without specifying the module name */ modulemd_test_signal = 0; signal (SIGTRAP, modulemd_test_signal_handler); // clang-format off defaults = g_object_new (MODULEMD_TYPE_DEFAULTS_V1, NULL); // clang-format on g_assert_cmpint (modulemd_test_signal, ==, SIGTRAP); g_clear_object (&defaults); } static void defaults_test_copy (void) { g_autoptr (ModulemdDefaultsV1) defaults = NULL; g_autoptr (ModulemdDefaultsV1) copied_defaults = NULL; defaults = modulemd_defaults_v1_new ("foo"); g_assert_nonnull (defaults); g_assert_true (MODULEMD_IS_DEFAULTS (defaults)); g_assert_true (MODULEMD_IS_DEFAULTS_V1 (defaults)); copied_defaults = MODULEMD_DEFAULTS_V1 ( modulemd_defaults_copy (MODULEMD_DEFAULTS (defaults))); g_assert_nonnull (copied_defaults); g_assert_true (MODULEMD_IS_DEFAULTS (copied_defaults)); g_assert_true (MODULEMD_IS_DEFAULTS_V1 (copied_defaults)); g_assert_cmpuint ( modulemd_defaults_get_mdversion (MODULEMD_DEFAULTS (defaults)), ==, modulemd_defaults_get_mdversion (MODULEMD_DEFAULTS (copied_defaults))); g_assert_cmpstr ( modulemd_defaults_get_module_name (MODULEMD_DEFAULTS (defaults)), ==, modulemd_defaults_get_module_name (MODULEMD_DEFAULTS (copied_defaults))); g_assert_cmpstr ( modulemd_defaults_v1_get_default_stream (defaults, NULL), ==, modulemd_defaults_v1_get_default_stream (copied_defaults, NULL)); /* TODO: deep compare of profile copying */ g_clear_object (&defaults); g_clear_object (&copied_defaults); // clang-format off defaults = g_object_new (MODULEMD_TYPE_DEFAULTS_V1, "module-name", "foo", NULL); // clang-format on g_assert_nonnull (defaults); g_assert_true (MODULEMD_IS_DEFAULTS (defaults)); g_assert_true (MODULEMD_IS_DEFAULTS_V1 (defaults)); copied_defaults = MODULEMD_DEFAULTS_V1 ( modulemd_defaults_copy (MODULEMD_DEFAULTS (defaults))); g_assert_nonnull (copied_defaults); g_assert_true (MODULEMD_IS_DEFAULTS (copied_defaults)); g_assert_true (MODULEMD_IS_DEFAULTS_V1 (copied_defaults)); g_assert_cmpuint ( modulemd_defaults_get_mdversion (MODULEMD_DEFAULTS (defaults)), ==, modulemd_defaults_get_mdversion (MODULEMD_DEFAULTS (copied_defaults))); g_assert_cmpstr ( modulemd_defaults_get_module_name (MODULEMD_DEFAULTS (defaults)), ==, modulemd_defaults_get_module_name (MODULEMD_DEFAULTS (copied_defaults))); g_assert_cmpstr ( modulemd_defaults_v1_get_default_stream (defaults, NULL), ==, modulemd_defaults_v1_get_default_stream (copied_defaults, NULL)); /* TODO: deep compare of profile copying */ } static void defaults_test_get_set_default_stream (void) { g_autoptr (ModulemdDefaultsV1) defaults = NULL; defaults = modulemd_defaults_v1_new ("foo"); g_assert_true (MODULEMD_IS_DEFAULTS_V1 (defaults)); /* Test set_default_stream() with valid string */ modulemd_defaults_v1_set_default_stream (defaults, "latest", NULL); g_assert_cmpstr ( modulemd_defaults_v1_get_default_stream (defaults, NULL), ==, "latest"); /* TODO: Remove the default stream */ /* TODO: Get, set and remove default streams for an intent */ } static void defaults_test_equals (void) { g_autoptr (ModulemdDefaultsV1) defaults_1 = NULL; g_autoptr (ModulemdDefaultsV1) defaults_2 = NULL; g_auto (GStrv) profiles_1 = NULL; g_auto (GStrv) profiles_2 = NULL; /*Two defaults objects containing only a matched module name*/ defaults_1 = modulemd_defaults_v1_new ("foo"); g_assert_nonnull (defaults_1); g_assert_true (MODULEMD_IS_DEFAULTS (defaults_1)); g_assert_true (MODULEMD_IS_DEFAULTS_V1 (defaults_1)); defaults_2 = modulemd_defaults_v1_new ("foo"); g_assert_nonnull (defaults_2); g_assert_true (MODULEMD_IS_DEFAULTS (defaults_2)); g_assert_true (MODULEMD_IS_DEFAULTS_V1 (defaults_2)); g_assert_true (modulemd_defaults_equals (MODULEMD_DEFAULTS (defaults_1), MODULEMD_DEFAULTS (defaults_2))); g_clear_object (&defaults_1); g_clear_object (&defaults_2); /*Two defaults objects containing different module names*/ defaults_1 = modulemd_defaults_v1_new ("foo"); g_assert_nonnull (defaults_1); g_assert_true (MODULEMD_IS_DEFAULTS (defaults_1)); g_assert_true (MODULEMD_IS_DEFAULTS_V1 (defaults_1)); defaults_2 = modulemd_defaults_v1_new ("bar"); g_assert_nonnull (defaults_2); g_assert_true (MODULEMD_IS_DEFAULTS (defaults_2)); g_assert_true (MODULEMD_IS_DEFAULTS_V1 (defaults_2)); g_assert_false (modulemd_defaults_equals (MODULEMD_DEFAULTS (defaults_1), MODULEMD_DEFAULTS (defaults_2))); g_clear_object (&defaults_1); g_clear_object (&defaults_2); /*Two defaults objects that contain a matching module name and a matching module stream*/ defaults_1 = modulemd_defaults_v1_new ("foo"); g_assert_nonnull (defaults_1); g_assert_true (MODULEMD_IS_DEFAULTS (defaults_1)); g_assert_true (MODULEMD_IS_DEFAULTS_V1 (defaults_1)); modulemd_defaults_v1_set_default_stream (defaults_1, "latest", NULL); defaults_2 = modulemd_defaults_v1_new ("foo"); g_assert_nonnull (defaults_2); g_assert_true (MODULEMD_IS_DEFAULTS (defaults_2)); g_assert_true (MODULEMD_IS_DEFAULTS_V1 (defaults_2)); modulemd_defaults_v1_set_default_stream (defaults_2, "latest", NULL); g_assert_true (modulemd_defaults_equals (MODULEMD_DEFAULTS (defaults_1), MODULEMD_DEFAULTS (defaults_2))); g_clear_object (&defaults_1); g_clear_object (&defaults_2); /*Two defaults objects that contain a different module name and a matching module stream*/ defaults_1 = modulemd_defaults_v1_new ("foo"); g_assert_nonnull (defaults_1); g_assert_true (MODULEMD_IS_DEFAULTS (defaults_1)); g_assert_true (MODULEMD_IS_DEFAULTS_V1 (defaults_1)); modulemd_defaults_v1_set_default_stream (defaults_1, "latest", NULL); defaults_2 = modulemd_defaults_v1_new ("bar"); g_assert_nonnull (defaults_2); g_assert_true (MODULEMD_IS_DEFAULTS (defaults_2)); g_assert_true (MODULEMD_IS_DEFAULTS_V1 (defaults_2)); modulemd_defaults_v1_set_default_stream (defaults_2, "latest", NULL); g_assert_false (modulemd_defaults_equals (MODULEMD_DEFAULTS (defaults_1), MODULEMD_DEFAULTS (defaults_2))); g_clear_object (&defaults_1); g_clear_object (&defaults_2); /*Two defaults objects that contain a matching module name and a different module stream*/ defaults_1 = modulemd_defaults_v1_new ("foo"); g_assert_nonnull (defaults_1); g_assert_true (MODULEMD_IS_DEFAULTS (defaults_1)); g_assert_true (MODULEMD_IS_DEFAULTS_V1 (defaults_1)); modulemd_defaults_v1_set_default_stream (defaults_1, "latest", NULL); defaults_2 = modulemd_defaults_v1_new ("foo"); g_assert_nonnull (defaults_2); g_assert_true (MODULEMD_IS_DEFAULTS (defaults_2)); g_assert_true (MODULEMD_IS_DEFAULTS_V1 (defaults_2)); modulemd_defaults_v1_set_default_stream (defaults_2, "super_old", NULL); g_assert_false (modulemd_defaults_equals (MODULEMD_DEFAULTS (defaults_1), MODULEMD_DEFAULTS (defaults_2))); g_clear_object (&defaults_1); g_clear_object (&defaults_2); /* Add matched profile defaults to objects with matched module and stream names. */ defaults_1 = modulemd_defaults_v1_new ("foo"); g_assert_nonnull (defaults_1); g_assert_true (MODULEMD_IS_DEFAULTS (defaults_1)); g_assert_true (MODULEMD_IS_DEFAULTS_V1 (defaults_1)); modulemd_defaults_v1_set_default_stream (defaults_1, "latest", NULL); modulemd_defaults_v1_add_default_profile_for_stream ( defaults_1, "latest", "server", NULL); modulemd_defaults_v1_add_default_profile_for_stream ( defaults_1, "latest", "client", NULL); defaults_2 = modulemd_defaults_v1_new ("foo"); g_assert_nonnull (defaults_2); g_assert_true (MODULEMD_IS_DEFAULTS (defaults_2)); g_assert_true (MODULEMD_IS_DEFAULTS_V1 (defaults_2)); modulemd_defaults_v1_set_default_stream (defaults_2, "latest", NULL); modulemd_defaults_v1_add_default_profile_for_stream ( defaults_2, "latest", "server", NULL); modulemd_defaults_v1_add_default_profile_for_stream ( defaults_2, "latest", "client", NULL); /* The profiles must be in lexical order */ profiles_1 = modulemd_defaults_v1_get_default_profiles_for_stream_as_strv ( defaults_1, "latest", NULL); profiles_2 = modulemd_defaults_v1_get_default_profiles_for_stream_as_strv ( defaults_2, "latest", NULL); g_assert_cmpstr (profiles_1[0], ==, "client"); g_assert_cmpstr (profiles_1[0], ==, profiles_2[0]); g_assert_cmpstr (profiles_1[1], ==, "server"); g_assert_cmpstr (profiles_1[1], ==, profiles_2[1]); g_assert_null (profiles_1[2]); g_assert_null (profiles_2[2]); g_clear_pointer (&profiles_1, g_strfreev); g_clear_pointer (&profiles_2, g_strfreev); g_assert_true (modulemd_defaults_equals (MODULEMD_DEFAULTS (defaults_1), MODULEMD_DEFAULTS (defaults_2))); g_clear_object (&defaults_1); g_clear_object (&defaults_2); /*Add mismatched profile defaults to objects with matched module and stream names.*/ defaults_1 = modulemd_defaults_v1_new ("foo"); g_assert_nonnull (defaults_1); g_assert_true (MODULEMD_IS_DEFAULTS (defaults_1)); g_assert_true (MODULEMD_IS_DEFAULTS_V1 (defaults_1)); modulemd_defaults_v1_set_default_stream (defaults_1, "latest", NULL); modulemd_defaults_v1_add_default_profile_for_stream ( defaults_1, "latest", "selena", NULL); modulemd_defaults_v1_add_default_profile_for_stream ( defaults_1, "latest", "client", NULL); defaults_2 = modulemd_defaults_v1_new ("foo"); g_assert_nonnull (defaults_2); g_assert_true (MODULEMD_IS_DEFAULTS (defaults_2)); g_assert_true (MODULEMD_IS_DEFAULTS_V1 (defaults_2)); modulemd_defaults_v1_set_default_stream (defaults_2, "latest", NULL); modulemd_defaults_v1_add_default_profile_for_stream ( defaults_2, "latest", "niharika", NULL); modulemd_defaults_v1_add_default_profile_for_stream ( defaults_2, "latest", "client", NULL); /* The profiles must be in lexical order */ profiles_1 = modulemd_defaults_v1_get_default_profiles_for_stream_as_strv ( defaults_1, "latest", NULL); profiles_2 = modulemd_defaults_v1_get_default_profiles_for_stream_as_strv ( defaults_2, "latest", NULL); g_assert_cmpstr (profiles_1[0], ==, "client"); g_assert_cmpstr (profiles_1[0], ==, profiles_2[0]); g_assert_cmpstr (profiles_1[1], ==, "selena"); g_assert_cmpstr (profiles_1[1], !=, profiles_2[1]); g_assert_null (profiles_1[2]); g_assert_null (profiles_2[2]); g_clear_pointer (&profiles_1, g_strfreev); g_clear_pointer (&profiles_2, g_strfreev); g_assert_false (modulemd_defaults_equals (MODULEMD_DEFAULTS (defaults_1), MODULEMD_DEFAULTS (defaults_2))); g_clear_object (&defaults_1); g_clear_object (&defaults_2); } static void defaults_test_validate (void) { g_autoptr (ModulemdDefaultsV1) defaults = NULL; defaults = modulemd_defaults_v1_new ("foo"); g_assert_true (MODULEMD_IS_DEFAULTS_V1 (defaults)); /* Currently there is no way for validation to fail, since all of its * properties are forced to be valid at object instantiation or are optional. */ g_assert_true ( modulemd_defaults_validate (MODULEMD_DEFAULTS (defaults), NULL)); } static void defaults_test_profiles (void) { g_autoptr (ModulemdDefaultsV1) defaults = NULL; g_auto (GStrv) streams = NULL; g_auto (GStrv) profiles = NULL; defaults = modulemd_defaults_v1_new ("foo"); g_assert_true (MODULEMD_IS_DEFAULTS_V1 (defaults)); /* Add profiles "server" and "client" to the streams "stable" and * "experimental". */ modulemd_defaults_v1_add_default_profile_for_stream ( defaults, "stable", "server", NULL); modulemd_defaults_v1_add_default_profile_for_stream ( defaults, "stable", "client", NULL); modulemd_defaults_v1_add_default_profile_for_stream ( defaults, "experimental", "server", NULL); modulemd_defaults_v1_add_default_profile_for_stream ( defaults, "experimental", "client", NULL); /* Get the list of streams with default profiles back */ streams = modulemd_defaults_v1_get_streams_with_default_profiles_as_strv ( defaults, NULL); /* The streams must be in lexical order */ g_assert_cmpstr (streams[0], ==, "experimental"); g_assert_cmpstr (streams[1], ==, "stable"); g_assert_null (streams[2]); g_clear_pointer (&streams, g_strfreev); /* The profiles must be in lexical order */ profiles = modulemd_defaults_v1_get_default_profiles_for_stream_as_strv ( defaults, "stable", NULL); g_assert_cmpstr (profiles[0], ==, "client"); g_assert_cmpstr (profiles[1], ==, "server"); g_assert_null (profiles[2]); g_clear_pointer (&profiles, g_strfreev); profiles = modulemd_defaults_v1_get_default_profiles_for_stream_as_strv ( defaults, "experimental", NULL); g_assert_cmpstr (profiles[0], ==, "client"); g_assert_cmpstr (profiles[1], ==, "server"); g_assert_null (profiles[2]); g_clear_pointer (&profiles, g_strfreev); /* Verify that looking up a nonexistent stream returns NULL */ profiles = modulemd_defaults_v1_get_default_profiles_for_stream_as_strv ( defaults, "nonexistent", NULL); g_assert_null (profiles); /* Test adding an empty set of profiles */ modulemd_defaults_v1_set_empty_default_profiles_for_stream ( defaults, "empty", NULL); streams = modulemd_defaults_v1_get_streams_with_default_profiles_as_strv ( defaults, NULL); /* The streams must be in lexical order */ g_assert_cmpstr (streams[0], ==, "empty"); g_assert_cmpstr (streams[1], ==, "experimental"); g_assert_cmpstr (streams[2], ==, "stable"); g_assert_null (streams[3]); g_clear_pointer (&streams, g_strfreev); /* Test that looking up these profiles returns a zero-length array */ profiles = modulemd_defaults_v1_get_default_profiles_for_stream_as_strv ( defaults, "empty", NULL); g_assert_nonnull (profiles); g_assert_null (profiles[0]); g_clear_pointer (&profiles, g_strfreev); /* Test removing the profiles for a stream */ modulemd_defaults_v1_remove_default_profiles_for_stream ( defaults, "empty", NULL); profiles = modulemd_defaults_v1_get_default_profiles_for_stream_as_strv ( defaults, "empty", NULL); g_assert_null (profiles); streams = modulemd_defaults_v1_get_streams_with_default_profiles_as_strv ( defaults, NULL); /* The streams must be in lexical order */ g_assert_cmpstr (streams[0], ==, "experimental"); g_assert_cmpstr (streams[1], ==, "stable"); g_assert_null (streams[2]); g_clear_pointer (&streams, g_strfreev); } static void defaults_test_parse_yaml (void) { MMD_INIT_YAML_PARSER (parser); MMD_INIT_YAML_EVENT (event); g_autofree gchar *yaml_path = NULL; g_autoptr (ModulemdDefaultsV1) defaults = NULL; int yaml_ret; g_autoptr (FILE) yaml_stream = NULL; g_autoptr (GError) error = NULL; g_autoptr (ModulemdSubdocumentInfo) subdoc = NULL; g_auto (GStrv) streams = NULL; g_auto (GStrv) default_profiles = NULL; /* Validate that we can read the specification without issues */ yaml_path = g_strdup_printf ("%s/yaml_specs/modulemd_defaults_v1.yaml", g_getenv ("MESON_SOURCE_ROOT")); g_assert_nonnull (yaml_path); yaml_stream = g_fopen (yaml_path, "rbe"); g_assert_nonnull (yaml_stream); yaml_parser_set_input_file (&parser, yaml_stream); /* The first event must be the stream start */ yaml_ret = yaml_parser_parse (&parser, &event); g_assert_true (yaml_ret); g_assert_cmpint (event.type, ==, YAML_STREAM_START_EVENT); yaml_event_delete (&event); /* The second event must be the document start */ yaml_ret = yaml_parser_parse (&parser, &event); g_assert_true (yaml_ret); g_assert_cmpint (event.type, ==, YAML_DOCUMENT_START_EVENT); yaml_event_delete (&event); subdoc = modulemd_yaml_parse_document_type (&parser); g_assert_nonnull (subdoc); g_assert_null (modulemd_subdocument_info_get_gerror (subdoc)); g_assert_cmpint (modulemd_subdocument_info_get_doctype (subdoc), ==, MODULEMD_YAML_DOC_DEFAULTS); g_assert_cmpint (modulemd_subdocument_info_get_mdversion (subdoc), ==, MD_DEFAULTS_VERSION_ONE); g_assert_nonnull (modulemd_subdocument_info_get_yaml (subdoc)); g_assert_cmpstr (modulemd_subdocument_info_get_yaml (subdoc), ==, "---\n" "document: modulemd-defaults\n" "version: 1\n" "data:\n" " module: foo\n" " modified: 201812071200\n" " stream: \"x.y\"\n" " profiles:\n" " 'x.y': []\n" " bar: [baz, snafu]\n" " intents:\n" " desktop:\n" " stream: \"y.z\"\n" " profiles:\n" " 'y.z': [blah]\n" " 'x.y': [other]\n" " server:\n" " stream: \"x.y\"\n" " profiles:\n" " 'x.y': []\n"); /* Parse the data section and validate the content */ defaults = modulemd_defaults_v1_parse_yaml (subdoc, TRUE, &error); g_assert_nonnull (defaults); g_assert_null (error); g_assert_true ( modulemd_defaults_validate (MODULEMD_DEFAULTS (defaults), &error)); /* Validate individual pieces */ g_assert_cmpstr ( modulemd_defaults_get_module_name (MODULEMD_DEFAULTS (defaults)), ==, "foo"); g_assert_cmpint ( modulemd_defaults_get_modified (MODULEMD_DEFAULTS (defaults)), ==, 201812071200); g_assert_cmpstr ( modulemd_defaults_v1_get_default_stream (defaults, NULL), ==, "x.y"); streams = modulemd_defaults_v1_get_streams_with_default_profiles_as_strv ( defaults, NULL); g_assert_nonnull (streams); g_assert_cmpstr (streams[0], ==, "bar"); g_assert_cmpstr (streams[1], ==, "x.y"); g_assert_null (streams[2]); default_profiles = modulemd_defaults_v1_get_default_profiles_for_stream_as_strv ( defaults, "bar", NULL); g_assert_nonnull (default_profiles); g_assert_cmpstr (default_profiles[0], ==, "baz"); g_assert_cmpstr (default_profiles[1], ==, "snafu"); g_assert_null (default_profiles[2]); g_clear_pointer (&default_profiles, g_strfreev); default_profiles = modulemd_defaults_v1_get_default_profiles_for_stream_as_strv ( defaults, "x.y", NULL); g_assert_nonnull (default_profiles); g_assert_null (default_profiles[0]); g_clear_pointer (&default_profiles, g_strfreev); } static void defaults_test_emit_yaml (void) { MMD_INIT_YAML_EMITTER (emitter); MMD_INIT_YAML_EVENT (event); MMD_INIT_YAML_STRING (&emitter, yaml_string); g_autoptr (GError) error = NULL; g_autoptr (ModulemdDefaultsV1) defaults = modulemd_defaults_v1_new ("foo"); g_assert_true (mmd_emitter_start_stream (&emitter, &error)); g_assert_true (modulemd_defaults_v1_emit_yaml (defaults, &emitter, &error)); g_assert_true (mmd_emitter_end_stream (&emitter, &error)); g_assert_nonnull (yaml_string->str); g_assert_cmpstr (yaml_string->str, ==, "---\n" "document: modulemd-defaults\n" "version: 1\n" "data:\n" " module: foo\n" "...\n"); /* Add a default stream and emit again */ modulemd_defaults_v1_set_default_stream (defaults, "latest", NULL); MMD_REINIT_YAML_STRING (&emitter, yaml_string); g_assert_true (mmd_emitter_start_stream (&emitter, &error)); g_assert_true (modulemd_defaults_v1_emit_yaml (defaults, &emitter, &error)); g_assert_true (mmd_emitter_end_stream (&emitter, &error)); g_assert_nonnull (yaml_string->str); g_assert_cmpstr (yaml_string->str, ==, "---\n" "document: modulemd-defaults\n" "version: 1\n" "data:\n" " module: foo\n" " stream: \"latest\"\n" "...\n"); /* Add an empty profile default and emit again */ modulemd_defaults_v1_set_empty_default_profiles_for_stream ( defaults, "libonly", NULL); MMD_REINIT_YAML_STRING (&emitter, yaml_string); g_assert_true (mmd_emitter_start_stream (&emitter, &error)); g_assert_true (modulemd_defaults_v1_emit_yaml (defaults, &emitter, &error)); g_assert_true (mmd_emitter_end_stream (&emitter, &error)); g_assert_nonnull (yaml_string->str); g_assert_cmpstr (yaml_string->str, ==, "---\n" "document: modulemd-defaults\n" "version: 1\n" "data:\n" " module: foo\n" " stream: \"latest\"\n" " profiles:\n" " libonly: []\n" "...\n"); /* Add a real profile default and emit again */ modulemd_defaults_v1_add_default_profile_for_stream ( defaults, "latest", "bar", NULL); MMD_REINIT_YAML_STRING (&emitter, yaml_string); g_assert_true (mmd_emitter_start_stream (&emitter, &error)); g_assert_true (modulemd_defaults_v1_emit_yaml (defaults, &emitter, &error)); g_assert_true (mmd_emitter_end_stream (&emitter, &error)); g_assert_nonnull (yaml_string->str); g_assert_cmpstr (yaml_string->str, ==, "---\n" "document: modulemd-defaults\n" "version: 1\n" "data:\n" " module: foo\n" " stream: \"latest\"\n" " profiles:\n" " latest: [bar]\n" " libonly: []\n" "...\n"); /* Add another real profile default to the same stream and emit again */ modulemd_defaults_v1_add_default_profile_for_stream ( defaults, "latest", "baz", NULL); MMD_REINIT_YAML_STRING (&emitter, yaml_string); g_assert_true (mmd_emitter_start_stream (&emitter, &error)); g_assert_true (modulemd_defaults_v1_emit_yaml (defaults, &emitter, &error)); g_assert_true (mmd_emitter_end_stream (&emitter, &error)); g_assert_nonnull (yaml_string->str); g_assert_cmpstr (yaml_string->str, ==, "---\n" "document: modulemd-defaults\n" "version: 1\n" "data:\n" " module: foo\n" " stream: \"latest\"\n" " profiles:\n" " latest: [bar, baz]\n" " libonly: []\n" "...\n"); /* Add an intent-specific default stream and emit again */ modulemd_defaults_v1_set_default_stream (defaults, "earliest", "intense"); MMD_REINIT_YAML_STRING (&emitter, yaml_string); g_assert_true (mmd_emitter_start_stream (&emitter, &error)); g_assert_true (modulemd_defaults_v1_emit_yaml (defaults, &emitter, &error)); g_assert_true (mmd_emitter_end_stream (&emitter, &error)); g_assert_nonnull (yaml_string->str); g_assert_cmpstr (yaml_string->str, ==, "---\n" "document: modulemd-defaults\n" "version: 1\n" "data:\n" " module: foo\n" " stream: \"latest\"\n" " profiles:\n" " latest: [bar, baz]\n" " libonly: []\n" " intents:\n" " intense:\n" " stream: \"earliest\"\n" "...\n"); /* Add an intent-specific profile default and emit again */ modulemd_defaults_v1_add_default_profile_for_stream ( defaults, "earliest", "client", "intense"); MMD_REINIT_YAML_STRING (&emitter, yaml_string); g_assert_true (mmd_emitter_start_stream (&emitter, &error)); g_assert_true (modulemd_defaults_v1_emit_yaml (defaults, &emitter, &error)); g_assert_true (mmd_emitter_end_stream (&emitter, &error)); g_assert_nonnull (yaml_string->str); g_assert_cmpstr (yaml_string->str, ==, "---\n" "document: modulemd-defaults\n" "version: 1\n" "data:\n" " module: foo\n" " stream: \"latest\"\n" " profiles:\n" " latest: [bar, baz]\n" " libonly: []\n" " intents:\n" " intense:\n" " stream: \"earliest\"\n" " profiles:\n" " earliest: [client]\n" "...\n"); } static void defaults_test_quoting (void) { MMD_INIT_YAML_EMITTER (emitter); MMD_INIT_YAML_EVENT (event); MMD_INIT_YAML_STRING (&emitter, yaml_string); g_autoptr (GError) error = NULL; g_autoptr (ModulemdDefaultsV1) defaults = NULL; /* Module name which does not need quoting. */ defaults = modulemd_defaults_v1_new ("unquoted"); modulemd_defaults_v1_set_default_stream (defaults, "alwaysquoted", NULL); g_assert_true (mmd_emitter_start_stream (&emitter, &error)); g_assert_true (modulemd_defaults_v1_emit_yaml (defaults, &emitter, &error)); g_assert_true (mmd_emitter_end_stream (&emitter, &error)); g_assert_nonnull (yaml_string->str); g_assert_cmpstr (yaml_string->str, ==, "---\n" "document: modulemd-defaults\n" "version: 1\n" "data:\n" " module: unquoted\n" " stream: \"alwaysquoted\"\n" "...\n"); g_clear_object (&defaults); /* A module name which needs quoting. */ defaults = modulemd_defaults_v1_new ("1.0"); modulemd_defaults_v1_set_default_stream (defaults, "alwaysquoted", NULL); modulemd_defaults_v1_set_empty_default_profiles_for_stream ( defaults, "unquoted", NULL); modulemd_defaults_v1_add_default_profile_for_stream ( defaults, "2.0", "unquoted", NULL); modulemd_defaults_v1_add_default_profile_for_stream ( defaults, "2.0", "3.0", NULL); modulemd_defaults_v1_set_default_stream ( defaults, "alwaysquoted", "unquoted"); modulemd_defaults_v1_set_empty_default_profiles_for_stream ( defaults, "unquoted", "unquoted"); modulemd_defaults_v1_add_default_profile_for_stream ( defaults, "2.0", "unquoted", "unquoted"); modulemd_defaults_v1_add_default_profile_for_stream ( defaults, "2.0", "3.0", "unquoted"); modulemd_defaults_v1_set_default_stream (defaults, "alwaysquoted", "4.0"); MMD_REINIT_YAML_STRING (&emitter, yaml_string); g_assert_true (mmd_emitter_start_stream (&emitter, &error)); g_assert_true (modulemd_defaults_v1_emit_yaml (defaults, &emitter, &error)); g_assert_true (mmd_emitter_end_stream (&emitter, &error)); g_assert_nonnull (yaml_string->str); g_assert_cmpstr (yaml_string->str, ==, "---\n" "document: modulemd-defaults\n" "version: 1\n" "data:\n" " module: \"1.0\"\n" " stream: \"alwaysquoted\"\n" " profiles:\n" " \"2.0\": [\"3.0\", unquoted]\n" " unquoted: []\n" " intents:\n" " \"4.0\":\n" " stream: \"alwaysquoted\"\n" " unquoted:\n" " stream: \"alwaysquoted\"\n" " profiles:\n" " \"2.0\": [\"3.0\", unquoted]\n" " unquoted: []\n" "...\n"); } int main (int argc, char *argv[]) { setlocale (LC_ALL, ""); g_test_init (&argc, &argv, NULL); g_test_bug_base ("https://bugzilla.redhat.com/show_bug.cgi?id="); // Define the tests. g_test_add_func ("/modulemd/v2/defaults/v1/equals", defaults_test_equals); g_test_add_func ("/modulemd/v2/defaults/v1/construct", defaults_test_construct); g_test_add_func ("/modulemd/v2/defaults/v1/copy", defaults_test_copy); g_test_add_func ("/modulemd/v2/defaults/v1/default_stream", defaults_test_get_set_default_stream); g_test_add_func ("/modulemd/v2/defaults/v1/validate", defaults_test_validate); g_test_add_func ("/modulemd/v2/defaults/v1/profile_defaults", defaults_test_profiles); g_test_add_func ("/modulemd/v2/defaults/v1/yaml/parse", defaults_test_parse_yaml); g_test_add_func ("/modulemd/v2/defaults/v1/yaml/emit", defaults_test_emit_yaml); g_test_add_func ("/modulemd/v2/defaults/v1/yaml/quoting", defaults_test_quoting); return g_test_run (); } fedora-modularity-libmodulemd-357799c/modulemd/tests/test-modulemd-defaults.c000066400000000000000000000157741502446517500274630ustar00rootroot00000000000000/* * This file is part of libmodulemd * Copyright (C) 2017-2018 Stephen Gallagher * * Fedora-License-Identifier: MIT * SPDX-2.0-License-Identifier: MIT * SPDX-3.0-License-Identifier: MIT * * This program is free software. * For more information on the license, see COPYING. * For more information on free software, see . */ #include #include #include #include #include "modulemd-defaults-v1.h" #include "modulemd-defaults.h" #include "private/glib-extensions.h" #include "private/modulemd-translation-entry-private.h" #include "private/modulemd-yaml.h" #include "private/test-utils.h" static void defaults_test_construct (void) { g_autoptr (ModulemdDefaults) defaults = NULL; /* Test new() with a valid mdversion and module name */ defaults = modulemd_defaults_new (MD_DEFAULTS_VERSION_ONE, "foo"); g_assert_nonnull (defaults); g_assert_true (MODULEMD_IS_DEFAULTS (defaults)); g_assert_true (MODULEMD_IS_DEFAULTS_V1 (defaults)); g_clear_object (&defaults); /* Test new() with a zero mdversion */ modulemd_test_signal = 0; signal (SIGTRAP, modulemd_test_signal_handler); defaults = modulemd_defaults_new (0, "foo"); g_assert_cmpint (modulemd_test_signal, ==, SIGTRAP); g_assert_null (defaults); /* Test new() with a too-high mdversion */ modulemd_test_signal = 0; signal (SIGTRAP, modulemd_test_signal_handler); defaults = modulemd_defaults_new (MD_DEFAULTS_VERSION_LATEST + 1, "foo"); g_assert_cmpint (modulemd_test_signal, ==, SIGTRAP); g_assert_null (defaults); /* Test new() with a NULL module_name */ modulemd_test_signal = 0; signal (SIGTRAP, modulemd_test_signal_handler); defaults = modulemd_defaults_new (MD_DEFAULTS_VERSION_ONE, NULL); g_assert_cmpint (modulemd_test_signal, ==, SIGTRAP); /* If we trap the error, defaults actually returns a value here, so free * it */ g_clear_object (&defaults); } static void defaults_test_copy (void) { g_autoptr (ModulemdDefaults) defaults = NULL; g_autoptr (ModulemdDefaults) copied_defaults = NULL; defaults = modulemd_defaults_new (MD_DEFAULTS_VERSION_LATEST, "foo"); g_assert_nonnull (defaults); g_assert_true (MODULEMD_IS_DEFAULTS (defaults)); g_assert_true (MODULEMD_IS_DEFAULTS_V1 (defaults)); copied_defaults = modulemd_defaults_copy (defaults); g_assert_nonnull (copied_defaults); g_assert_true (MODULEMD_IS_DEFAULTS (copied_defaults)); g_assert_true (MODULEMD_IS_DEFAULTS_V1 (copied_defaults)); g_assert_cmpuint (modulemd_defaults_get_mdversion (defaults), ==, modulemd_defaults_get_mdversion (copied_defaults)); g_assert_cmpstr (modulemd_defaults_get_module_name (defaults), ==, modulemd_defaults_get_module_name (copied_defaults)); } static void defaults_test_get_mdversion (void) { g_autoptr (ModulemdDefaults) defaults = NULL; guint64 mdversion; defaults = modulemd_defaults_new (MD_DEFAULTS_VERSION_LATEST, "foo"); g_assert_true (MODULEMD_IS_DEFAULTS (defaults)); mdversion = modulemd_defaults_get_mdversion (defaults); g_assert_cmpuint (mdversion, ==, MD_DEFAULTS_VERSION_LATEST); } static void defaults_test_get_module_name (void) { g_autoptr (ModulemdDefaults) defaults = NULL; const gchar *module_name; defaults = modulemd_defaults_new (MD_DEFAULTS_VERSION_LATEST, "foo"); g_assert_true (MODULEMD_IS_DEFAULTS (defaults)); module_name = modulemd_defaults_get_module_name (defaults); g_assert_cmpstr (module_name, ==, "foo"); } static void defaults_test_validate (void) { g_autoptr (ModulemdDefaults) defaults = NULL; defaults = modulemd_defaults_new (MD_DEFAULTS_VERSION_ONE, "foo"); g_assert_true (MODULEMD_IS_DEFAULTS (defaults)); /* Currently there is no way for validation to fail, since all of its * properties are forced to be valid at object instantiation. * This will need to be updated once the subclasses have reimplimented this. */ g_assert_true (modulemd_defaults_validate (defaults, NULL)); } static void defaults_test_equals (void) { g_autoptr (ModulemdDefaults) defaults_1 = NULL; g_autoptr (ModulemdDefaults) defaults_2 = NULL; /*Check equality for 2 default objects with same module name and mdversion*/ defaults_1 = modulemd_defaults_new (MD_DEFAULTS_VERSION_ONE, "foo"); g_assert_true (MODULEMD_IS_DEFAULTS (defaults_1)); defaults_2 = modulemd_defaults_new (MD_DEFAULTS_VERSION_ONE, "foo"); g_assert_true (MODULEMD_IS_DEFAULTS (defaults_2)); g_assert_true (modulemd_defaults_equals (defaults_1, defaults_2)); g_clear_object (&defaults_1); g_clear_object (&defaults_2); /*Check equality for 2 default objects with different module name and same mdversion*/ defaults_1 = modulemd_defaults_new (MD_DEFAULTS_VERSION_ONE, "foo"); g_assert_true (MODULEMD_IS_DEFAULTS (defaults_1)); defaults_2 = modulemd_defaults_new (MD_DEFAULTS_VERSION_ONE, "bar"); g_assert_true (MODULEMD_IS_DEFAULTS (defaults_2)); g_assert_false (modulemd_defaults_equals (defaults_1, defaults_2)); g_clear_object (&defaults_1); g_clear_object (&defaults_2); } static void defaults_test_upgrade (void) { g_autoptr (ModulemdDefaults) defaults = NULL; g_autoptr (ModulemdDefaults) upgraded_defaults = NULL; g_autoptr (GError) error = NULL; defaults = modulemd_defaults_new (MD_DEFAULTS_VERSION_ONE, "foo"); g_assert_true (MODULEMD_IS_DEFAULTS (defaults)); /* Currently, we have only a single version, so the "upgrade" just makes a * copy */ upgraded_defaults = modulemd_defaults_upgrade (defaults, MD_DEFAULTS_VERSION_ONE, &error); g_assert_nonnull (upgraded_defaults); g_assert_true (MODULEMD_IS_DEFAULTS (upgraded_defaults)); g_assert_true (MODULEMD_IS_DEFAULTS_V1 (upgraded_defaults)); g_assert_cmpint (modulemd_defaults_get_mdversion (upgraded_defaults), ==, MD_DEFAULTS_VERSION_ONE); g_assert_cmpstr ( modulemd_defaults_get_module_name (upgraded_defaults), ==, "foo"); g_clear_object (&upgraded_defaults); /* Test attempting to upgrade to an unknown mdversion */ upgraded_defaults = modulemd_defaults_upgrade ( defaults, MD_DEFAULTS_VERSION_LATEST + 1, &error); g_assert_null (upgraded_defaults); g_assert_nonnull (error); } int main (int argc, char *argv[]) { setlocale (LC_ALL, ""); g_test_init (&argc, &argv, NULL); g_test_bug_base ("https://bugzilla.redhat.com/show_bug.cgi?id="); // Define the tests. g_test_add_func ("/modulemd/v2/defaults/construct", defaults_test_construct); g_test_add_func ("/modulemd/v2/defaults/copy", defaults_test_copy); g_test_add_func ("/modulemd/v2/defaults/mdversion", defaults_test_get_mdversion); g_test_add_func ("/modulemd/v2/defaults/module_name", defaults_test_get_module_name); g_test_add_func ("/modulemd/v2/defaults/validate", defaults_test_validate); g_test_add_func ("/modulemd/v2/defaults/equals", defaults_test_equals); g_test_add_func ("/modulemd/v2/defaults/upgrade", defaults_test_upgrade); return g_test_run (); } fedora-modularity-libmodulemd-357799c/modulemd/tests/test-modulemd-dependencies.c000066400000000000000000000631741502446517500302770ustar00rootroot00000000000000/* * This file is part of libmodulemd * Copyright (C) 2018 Red Hat, Inc. * * Fedora-License-Identifier: MIT * SPDX-2.0-License-Identifier: MIT * SPDX-3.0-License-Identifier: MIT * * This program is free software. * For more information on the license, see COPYING. * For more information on free software, see . */ #include #include #include #include #include "modulemd-dependencies.h" #include "private/glib-extensions.h" #include "private/modulemd-dependencies-private.h" #include "private/modulemd-util.h" #include "private/modulemd-yaml.h" #include "private/test-utils.h" typedef struct _DependenciesFixture { } DependenciesFixture; gboolean signaled = FALSE; static void sigtrap_handler (int UNUSED (sig_num)) { signaled = TRUE; } static void dependencies_test_construct (void) { g_autoptr (ModulemdDependencies) d = NULL; g_auto (GStrv) list = NULL; /* Test that the new() function works */ d = modulemd_dependencies_new (); g_assert_nonnull (d); g_assert_true (MODULEMD_IS_DEPENDENCIES (d)); list = modulemd_dependencies_get_buildtime_modules_as_strv (d); g_assert_nonnull (list); g_assert_cmpint (g_strv_length (list), ==, 0); g_clear_pointer (&list, g_strfreev); g_clear_object (&d); /* Test that object instantiation works */ d = g_object_new (MODULEMD_TYPE_DEPENDENCIES, NULL); g_assert_true (MODULEMD_IS_DEPENDENCIES (d)); g_clear_object (&d); } static void dependencies_test_dependencies (void) { g_autoptr (ModulemdDependencies) d = NULL; g_auto (GStrv) list = NULL; d = modulemd_dependencies_new (); g_assert_nonnull (d); g_assert_true (MODULEMD_IS_DEPENDENCIES (d)); list = modulemd_dependencies_get_buildtime_modules_as_strv (d); g_assert_nonnull (list); g_assert_cmpint (g_strv_length (list), ==, 0); g_clear_pointer (&list, g_strfreev); signal (SIGTRAP, sigtrap_handler); list = modulemd_dependencies_get_buildtime_streams_as_strv (d, "buildmod1"); g_assert_null (list); g_clear_pointer (&list, g_strfreev); /* Add some deps */ modulemd_dependencies_add_buildtime_stream (d, "buildmod1", "stream1"); modulemd_dependencies_add_runtime_stream (d, "runmod1", "stream2"); modulemd_dependencies_add_runtime_stream (d, "runmod1", "stream1"); modulemd_dependencies_set_empty_buildtime_dependencies_for_module ( d, "defbuild"); modulemd_dependencies_set_empty_runtime_dependencies_for_module (d, "defrun"); list = modulemd_dependencies_get_buildtime_modules_as_strv (d); g_assert_nonnull (list); g_assert_cmpint (g_strv_length (list), ==, 2); g_assert_cmpstr (list[0], ==, "buildmod1"); g_assert_cmpstr (list[1], ==, "defbuild"); g_clear_pointer (&list, g_strfreev); list = modulemd_dependencies_get_buildtime_streams_as_strv (d, "buildmod1"); g_assert_nonnull (list); g_assert_cmpint (g_strv_length (list), ==, 1); g_assert_cmpstr (list[0], ==, "stream1"); g_clear_pointer (&list, g_strfreev); list = modulemd_dependencies_get_buildtime_streams_as_strv (d, "defbuild"); g_assert_nonnull (list); g_assert_cmpint (g_strv_length (list), ==, 0); g_clear_pointer (&list, g_strfreev); signal (SIGTRAP, sigtrap_handler); list = modulemd_dependencies_get_runtime_streams_as_strv (d, "buildmod1"); g_assert_null (list); g_clear_pointer (&list, g_strfreev); list = modulemd_dependencies_get_runtime_modules_as_strv (d); g_assert_nonnull (list); g_assert_cmpint (g_strv_length (list), ==, 2); g_assert_cmpstr (list[0], ==, "defrun"); g_assert_cmpstr (list[1], ==, "runmod1"); g_clear_pointer (&list, g_strfreev); list = modulemd_dependencies_get_runtime_streams_as_strv (d, "defrun"); g_assert_nonnull (list); g_assert_cmpint (g_strv_length (list), ==, 0); g_clear_pointer (&list, g_strfreev); signal (SIGTRAP, sigtrap_handler); list = modulemd_dependencies_get_runtime_streams_as_strv (d, "buildmod1"); g_assert_null (list); g_clear_pointer (&list, g_strfreev); list = modulemd_dependencies_get_runtime_streams_as_strv (d, "runmod1"); g_assert_nonnull (list); g_assert_cmpint (g_strv_length (list), ==, 2); g_assert_cmpstr (list[0], ==, "stream1"); g_assert_cmpstr (list[1], ==, "stream2"); g_clear_pointer (&list, g_strfreev); } static void dependencies_test_equals (void) { g_autoptr (ModulemdDependencies) d_1 = NULL; g_autoptr (ModulemdDependencies) d_2 = NULL; /*With no hashtables*/ d_1 = modulemd_dependencies_new (); g_assert_nonnull (d_1); g_assert_true (MODULEMD_IS_DEPENDENCIES (d_1)); d_2 = modulemd_dependencies_new (); g_assert_nonnull (d_2); g_assert_true (MODULEMD_IS_DEPENDENCIES (d_2)); g_assert_true (modulemd_dependencies_equals (d_1, d_2)); g_clear_object (&d_1); g_clear_object (&d_2); /*With same buildtime_stream hashtables*/ d_1 = modulemd_dependencies_new (); g_assert_nonnull (d_1); g_assert_true (MODULEMD_IS_DEPENDENCIES (d_1)); modulemd_dependencies_add_buildtime_stream (d_1, "buildmod1", "stream2"); modulemd_dependencies_add_buildtime_stream (d_1, "buildmod1", "stream1"); modulemd_dependencies_set_empty_buildtime_dependencies_for_module ( d_1, "builddef"); d_2 = modulemd_dependencies_new (); g_assert_nonnull (d_2); g_assert_true (MODULEMD_IS_DEPENDENCIES (d_2)); modulemd_dependencies_add_buildtime_stream (d_2, "buildmod1", "stream2"); modulemd_dependencies_add_buildtime_stream (d_2, "buildmod1", "stream1"); modulemd_dependencies_set_empty_buildtime_dependencies_for_module ( d_2, "builddef"); g_assert_true (modulemd_dependencies_equals (d_1, d_2)); g_clear_object (&d_1); g_clear_object (&d_2); /*With different buildtime_stream hashtables*/ d_1 = modulemd_dependencies_new (); g_assert_nonnull (d_1); g_assert_true (MODULEMD_IS_DEPENDENCIES (d_1)); modulemd_dependencies_add_buildtime_stream (d_1, "buildmod1", "stream2"); modulemd_dependencies_add_buildtime_stream (d_1, "buildmod1", "stream1"); modulemd_dependencies_set_empty_buildtime_dependencies_for_module ( d_1, "builddef"); d_2 = modulemd_dependencies_new (); g_assert_nonnull (d_2); g_assert_true (MODULEMD_IS_DEPENDENCIES (d_2)); modulemd_dependencies_add_buildtime_stream (d_2, "buildmod1", "stream2"); modulemd_dependencies_add_buildtime_stream (d_2, "buildmod1", "stream1"); modulemd_dependencies_add_buildtime_stream (d_2, "buildmod1", "stream3"); modulemd_dependencies_set_empty_buildtime_dependencies_for_module ( d_2, "builddef"); g_assert_false (modulemd_dependencies_equals (d_1, d_2)); g_clear_object (&d_1); g_clear_object (&d_2); /*With same runtime_stream hashtables*/ d_1 = modulemd_dependencies_new (); g_assert_nonnull (d_1); g_assert_true (MODULEMD_IS_DEPENDENCIES (d_1)); modulemd_dependencies_add_runtime_stream (d_1, "runmod1", "stream3"); modulemd_dependencies_add_runtime_stream (d_1, "runmod1", "stream4"); modulemd_dependencies_set_empty_runtime_dependencies_for_module (d_1, "rundef"); d_2 = modulemd_dependencies_new (); g_assert_nonnull (d_2); g_assert_true (MODULEMD_IS_DEPENDENCIES (d_2)); modulemd_dependencies_add_runtime_stream (d_2, "runmod1", "stream3"); modulemd_dependencies_add_runtime_stream (d_2, "runmod1", "stream4"); modulemd_dependencies_set_empty_runtime_dependencies_for_module (d_2, "rundef"); g_assert_true (modulemd_dependencies_equals (d_1, d_2)); g_clear_object (&d_1); g_clear_object (&d_2); /*With different runtime_stream hashtables*/ d_1 = modulemd_dependencies_new (); g_assert_nonnull (d_1); g_assert_true (MODULEMD_IS_DEPENDENCIES (d_1)); modulemd_dependencies_add_runtime_stream (d_1, "runmod1", "stream3"); modulemd_dependencies_add_runtime_stream (d_1, "runmod1", "stream4"); modulemd_dependencies_set_empty_runtime_dependencies_for_module (d_1, "rundef"); d_2 = modulemd_dependencies_new (); g_assert_nonnull (d_2); g_assert_true (MODULEMD_IS_DEPENDENCIES (d_2)); modulemd_dependencies_add_runtime_stream (d_2, "runmod1", "stream3"); modulemd_dependencies_add_runtime_stream (d_2, "runmod1", "stream4"); modulemd_dependencies_add_runtime_stream (d_2, "runmod1", "stream5"); modulemd_dependencies_set_empty_runtime_dependencies_for_module (d_2, "rundef"); g_assert_false (modulemd_dependencies_equals (d_1, d_2)); g_clear_object (&d_1); g_clear_object (&d_2); /*With same bulidtime_stream and runtime_stream hashtables*/ d_1 = modulemd_dependencies_new (); g_assert_nonnull (d_1); g_assert_true (MODULEMD_IS_DEPENDENCIES (d_1)); modulemd_dependencies_add_buildtime_stream (d_1, "buildmod1", "stream2"); modulemd_dependencies_add_buildtime_stream (d_1, "buildmod1", "stream1"); modulemd_dependencies_set_empty_buildtime_dependencies_for_module ( d_1, "builddef"); modulemd_dependencies_add_runtime_stream (d_1, "runmod1", "stream3"); modulemd_dependencies_add_runtime_stream (d_1, "runmod1", "stream4"); modulemd_dependencies_set_empty_runtime_dependencies_for_module (d_1, "rundef"); d_2 = modulemd_dependencies_new (); g_assert_nonnull (d_2); g_assert_true (MODULEMD_IS_DEPENDENCIES (d_2)); modulemd_dependencies_add_buildtime_stream (d_2, "buildmod1", "stream2"); modulemd_dependencies_add_buildtime_stream (d_2, "buildmod1", "stream1"); modulemd_dependencies_set_empty_buildtime_dependencies_for_module ( d_2, "builddef"); modulemd_dependencies_add_runtime_stream (d_2, "runmod1", "stream3"); modulemd_dependencies_add_runtime_stream (d_2, "runmod1", "stream4"); modulemd_dependencies_set_empty_runtime_dependencies_for_module (d_2, "rundef"); g_assert_true (modulemd_dependencies_equals (d_1, d_2)); g_clear_object (&d_1); g_clear_object (&d_2); /*With different bulidtime_stream and same runtime_stream hashtables*/ d_1 = modulemd_dependencies_new (); g_assert_nonnull (d_1); g_assert_true (MODULEMD_IS_DEPENDENCIES (d_1)); modulemd_dependencies_add_buildtime_stream (d_1, "buildmod1", "stream2"); modulemd_dependencies_add_buildtime_stream (d_1, "buildmod1", "stream1"); modulemd_dependencies_add_buildtime_stream (d_1, "buildmod1", "stream8"); modulemd_dependencies_set_empty_buildtime_dependencies_for_module ( d_1, "builddef"); modulemd_dependencies_add_runtime_stream (d_1, "runmod1", "stream3"); modulemd_dependencies_add_runtime_stream (d_1, "runmod1", "stream4"); modulemd_dependencies_set_empty_runtime_dependencies_for_module (d_1, "rundef"); d_2 = modulemd_dependencies_new (); g_assert_nonnull (d_2); g_assert_true (MODULEMD_IS_DEPENDENCIES (d_2)); modulemd_dependencies_add_buildtime_stream (d_2, "buildmod1", "stream2"); modulemd_dependencies_add_buildtime_stream (d_2, "buildmod1", "stream1"); modulemd_dependencies_set_empty_buildtime_dependencies_for_module ( d_2, "builddef"); modulemd_dependencies_add_runtime_stream (d_2, "runmod1", "stream3"); modulemd_dependencies_add_runtime_stream (d_2, "runmod1", "stream4"); modulemd_dependencies_add_runtime_stream (d_2, "runmod1", "stream5"); modulemd_dependencies_set_empty_runtime_dependencies_for_module (d_2, "rundef"); g_assert_false (modulemd_dependencies_equals (d_1, d_2)); g_clear_object (&d_1); g_clear_object (&d_2); } static void dependencies_test_copy (void) { g_autoptr (ModulemdDependencies) d = NULL; g_autoptr (ModulemdDependencies) d_copy = NULL; g_auto (GStrv) list = NULL; d = modulemd_dependencies_new (); g_assert_nonnull (d); g_assert_true (MODULEMD_IS_DEPENDENCIES (d)); list = modulemd_dependencies_get_buildtime_modules_as_strv (d); g_assert_nonnull (list); g_assert_cmpint (g_strv_length (list), ==, 0); g_clear_pointer (&list, g_strfreev); signal (SIGTRAP, sigtrap_handler); list = modulemd_dependencies_get_buildtime_streams_as_strv (d, "module1"); g_assert_null (list); g_clear_pointer (&list, g_strfreev); d_copy = modulemd_dependencies_copy (d); g_assert_nonnull (d_copy); g_assert_true (MODULEMD_IS_DEPENDENCIES (d_copy)); list = modulemd_dependencies_get_buildtime_modules_as_strv (d_copy); g_assert_nonnull (list); g_assert_cmpint (g_strv_length (list), ==, 0); g_clear_pointer (&list, g_strfreev); signal (SIGTRAP, sigtrap_handler); list = modulemd_dependencies_get_buildtime_streams_as_strv (d, "module1"); g_assert_null (list); g_clear_pointer (&list, g_strfreev); g_clear_object (&d_copy); modulemd_dependencies_add_buildtime_stream (d, "buildmod1", "stream2"); modulemd_dependencies_add_buildtime_stream (d, "buildmod1", "stream1"); modulemd_dependencies_set_empty_buildtime_dependencies_for_module ( d, "builddef"); modulemd_dependencies_add_runtime_stream (d, "runmod1", "stream3"); modulemd_dependencies_add_runtime_stream (d, "runmod1", "stream4"); modulemd_dependencies_set_empty_runtime_dependencies_for_module (d, "rundef"); d_copy = modulemd_dependencies_copy (d); g_assert_nonnull (d_copy); g_assert_true (MODULEMD_IS_DEPENDENCIES (d_copy)); list = modulemd_dependencies_get_buildtime_modules_as_strv (d_copy); g_assert_nonnull (list); g_assert_cmpint (g_strv_length (list), ==, 2); g_assert_cmpstr (list[0], ==, "builddef"); g_assert_cmpstr (list[1], ==, "buildmod1"); g_clear_pointer (&list, g_strfreev); signal (SIGTRAP, sigtrap_handler); list = modulemd_dependencies_get_buildtime_streams_as_strv (d_copy, "nosuchmodule"); g_assert_null (list); g_clear_pointer (&list, g_strfreev); list = modulemd_dependencies_get_buildtime_streams_as_strv (d_copy, "buildmod1"); g_assert_nonnull (list); g_assert_cmpint (g_strv_length (list), ==, 2); g_assert_cmpstr (list[0], ==, "stream1"); g_assert_cmpstr (list[1], ==, "stream2"); g_clear_pointer (&list, g_strfreev); list = modulemd_dependencies_get_buildtime_streams_as_strv (d_copy, "builddef"); g_assert_nonnull (list); g_assert_cmpint (g_strv_length (list), ==, 0); g_clear_pointer (&list, g_strfreev); list = modulemd_dependencies_get_runtime_modules_as_strv (d_copy); g_assert_nonnull (list); g_assert_cmpint (g_strv_length (list), ==, 2); g_assert_cmpstr (list[0], ==, "rundef"); g_assert_cmpstr (list[1], ==, "runmod1"); g_clear_pointer (&list, g_strfreev); signal (SIGTRAP, sigtrap_handler); list = modulemd_dependencies_get_runtime_streams_as_strv (d_copy, "nosuchmodule"); g_assert_null (list); g_clear_pointer (&list, g_strfreev); list = modulemd_dependencies_get_runtime_streams_as_strv (d_copy, "runmod1"); g_assert_nonnull (list); g_assert_cmpint (g_strv_length (list), ==, 2); g_assert_cmpstr (list[0], ==, "stream3"); g_assert_cmpstr (list[1], ==, "stream4"); g_clear_pointer (&list, g_strfreev); list = modulemd_dependencies_get_runtime_streams_as_strv (d_copy, "rundef"); g_assert_nonnull (list); g_assert_cmpint (g_strv_length (list), ==, 0); g_clear_pointer (&list, g_strfreev); } static void dependencies_test_parse_yaml (void) { g_autoptr (ModulemdDependencies) d = NULL; g_autoptr (GError) error = NULL; MMD_INIT_YAML_PARSER (parser); g_autofree gchar *yaml_path = NULL; g_auto (GStrv) list = NULL; g_autoptr (FILE) yaml_stream = NULL; yaml_path = g_strdup_printf ("%s/d.yaml", g_getenv ("TEST_DATA_PATH")); g_assert_nonnull (yaml_path); yaml_stream = g_fopen (yaml_path, "rbe"); g_assert_nonnull (yaml_stream); yaml_parser_set_input_file (&parser, yaml_stream); parser_skip_headers (&parser); d = modulemd_dependencies_parse_yaml (&parser, TRUE, &error); g_assert_nonnull (d); g_assert_true (MODULEMD_IS_DEPENDENCIES (d)); list = modulemd_dependencies_get_buildtime_modules_as_strv (d); g_assert_cmpint (g_strv_length (list), ==, 1); g_assert_cmpstr (list[0], ==, "platform"); g_clear_pointer (&list, g_strfreev); list = modulemd_dependencies_get_buildtime_streams_as_strv (d, "platform"); g_assert_cmpint (g_strv_length (list), ==, 3); g_assert_cmpstr (list[0], ==, "-epel7"); g_assert_cmpstr (list[1], ==, "-f27"); g_assert_cmpstr (list[2], ==, "-f28"); g_clear_pointer (&list, g_strfreev); list = modulemd_dependencies_get_runtime_modules_as_strv (d); g_assert_cmpint (g_strv_length (list), ==, 1); g_assert_cmpstr (list[0], ==, "platform"); g_clear_pointer (&list, g_strfreev); list = modulemd_dependencies_get_runtime_streams_as_strv (d, "platform"); g_assert_cmpint (g_strv_length (list), ==, 3); g_assert_cmpstr (list[0], ==, "-epel7"); g_assert_cmpstr (list[1], ==, "-f27"); g_assert_cmpstr (list[2], ==, "-f28"); g_clear_pointer (&list, g_strfreev); } static void dependencies_test_parse_bad_yaml (void) { g_autoptr (ModulemdDependencies) d = NULL; g_autoptr (GError) error = NULL; MMD_INIT_YAML_PARSER (parser); g_autofree gchar *yaml_path = NULL; g_autoptr (FILE) yaml_stream = NULL; yaml_path = g_strdup_printf ("%s/mismatched-deps.yaml", g_getenv ("TEST_DATA_PATH")); g_assert_nonnull (yaml_path); yaml_stream = g_fopen (yaml_path, "rbe"); g_assert_nonnull (yaml_stream); yaml_parser_set_input_file (&parser, yaml_stream); parser_skip_headers (&parser); d = modulemd_dependencies_parse_yaml (&parser, TRUE, &error); g_assert_nonnull (d); g_assert_true (MODULEMD_IS_DEPENDENCIES (d)); g_assert_false (modulemd_dependencies_validate (d, &error)); g_assert_error (error, MODULEMD_ERROR, MMD_ERROR_VALIDATE); } static void dependencies_test_emit_yaml (void) { g_autoptr (ModulemdDependencies) d = NULL; g_autoptr (GError) error = NULL; MMD_INIT_YAML_EMITTER (emitter); MMD_INIT_YAML_STRING (&emitter, yaml_string); d = modulemd_dependencies_new (); g_assert_true (mmd_emitter_start_stream (&emitter, &error)); g_assert_true (mmd_emitter_start_document (&emitter, &error)); g_assert_true ( mmd_emitter_start_sequence (&emitter, YAML_BLOCK_SEQUENCE_STYLE, &error)); g_assert_true (modulemd_dependencies_emit_yaml (d, &emitter, &error)); g_assert_true (mmd_emitter_end_sequence (&emitter, &error)); g_assert_true (mmd_emitter_end_document (&emitter, &error)); g_assert_true (mmd_emitter_end_stream (&emitter, &error)); g_assert_cmpstr (yaml_string->str, ==, "---\n- {}\n...\n"); g_clear_pointer (&yaml_string, modulemd_yaml_string_free); yaml_emitter_delete (&emitter); yaml_emitter_initialize (&emitter); yaml_string = g_malloc0_n (1, sizeof (modulemd_yaml_string)); yaml_emitter_set_output (&emitter, write_yaml_string, (void *)yaml_string); modulemd_dependencies_add_buildtime_stream (d, "buildmod1", "stream2"); modulemd_dependencies_add_buildtime_stream (d, "buildmod1", "stream1"); modulemd_dependencies_set_empty_buildtime_dependencies_for_module ( d, "builddef"); modulemd_dependencies_add_runtime_stream (d, "runmod1", "stream3"); modulemd_dependencies_add_runtime_stream (d, "runmod1", "stream4"); modulemd_dependencies_set_empty_runtime_dependencies_for_module (d, "rundef"); g_assert_true (mmd_emitter_start_stream (&emitter, &error)); g_assert_true (mmd_emitter_start_document (&emitter, &error)); g_assert_true ( mmd_emitter_start_sequence (&emitter, YAML_BLOCK_SEQUENCE_STYLE, &error)); g_assert_true (modulemd_dependencies_emit_yaml (d, &emitter, &error)); g_assert_true (mmd_emitter_end_sequence (&emitter, &error)); g_assert_true (mmd_emitter_end_document (&emitter, &error)); g_assert_true (mmd_emitter_end_stream (&emitter, &error)); g_assert_cmpstr (yaml_string->str, ==, "---\n" "- buildrequires:\n" " builddef: []\n" " buildmod1: [stream1, stream2]\n" " requires:\n" " rundef: []\n" " runmod1: [stream3, stream4]\n" "...\n"); /* Test with only adding a buildrequires */ g_clear_pointer (&yaml_string, modulemd_yaml_string_free); yaml_emitter_delete (&emitter); yaml_emitter_initialize (&emitter); yaml_string = g_malloc0_n (1, sizeof (modulemd_yaml_string)); yaml_emitter_set_output (&emitter, write_yaml_string, (void *)yaml_string); g_clear_object (&d); d = modulemd_dependencies_new (); modulemd_dependencies_add_buildtime_stream (d, "buildmod1", "stream2"); modulemd_dependencies_add_buildtime_stream (d, "buildmod1", "stream1"); modulemd_dependencies_set_empty_buildtime_dependencies_for_module ( d, "builddef"); g_assert_true (mmd_emitter_start_stream (&emitter, &error)); g_assert_true (mmd_emitter_start_document (&emitter, &error)); g_assert_true ( mmd_emitter_start_sequence (&emitter, YAML_BLOCK_SEQUENCE_STYLE, &error)); g_assert_true (modulemd_dependencies_emit_yaml (d, &emitter, &error)); g_assert_true (mmd_emitter_end_sequence (&emitter, &error)); g_assert_true (mmd_emitter_end_document (&emitter, &error)); g_assert_true (mmd_emitter_end_stream (&emitter, &error)); g_assert_cmpstr (yaml_string->str, ==, "---\n" "- buildrequires:\n" " builddef: []\n" " buildmod1: [stream1, stream2]\n" "...\n"); /* Test with only adding a runtime requires */ g_clear_pointer (&yaml_string, modulemd_yaml_string_free); yaml_emitter_delete (&emitter); yaml_emitter_initialize (&emitter); yaml_string = g_malloc0_n (1, sizeof (modulemd_yaml_string)); yaml_emitter_set_output (&emitter, write_yaml_string, (void *)yaml_string); g_clear_object (&d); d = modulemd_dependencies_new (); modulemd_dependencies_add_runtime_stream (d, "runmod1", "stream3"); modulemd_dependencies_add_runtime_stream (d, "runmod1", "stream4"); modulemd_dependencies_set_empty_runtime_dependencies_for_module (d, "rundef"); g_assert_true (mmd_emitter_start_stream (&emitter, &error)); g_assert_true (mmd_emitter_start_document (&emitter, &error)); g_assert_true ( mmd_emitter_start_sequence (&emitter, YAML_BLOCK_SEQUENCE_STYLE, &error)); g_assert_true (modulemd_dependencies_emit_yaml (d, &emitter, &error)); g_assert_true (mmd_emitter_end_sequence (&emitter, &error)); g_assert_true (mmd_emitter_end_document (&emitter, &error)); g_assert_true (mmd_emitter_end_stream (&emitter, &error)); g_assert_cmpstr (yaml_string->str, ==, "---\n" "- requires:\n" " rundef: []\n" " runmod1: [stream3, stream4]\n" "...\n"); } static void dependencies_test_quoting_yaml (void) { g_autoptr (ModulemdDependencies) d = NULL; g_autoptr (GError) error = NULL; MMD_INIT_YAML_EMITTER (emitter); MMD_INIT_YAML_STRING (&emitter, yaml_string); d = modulemd_dependencies_new (); modulemd_dependencies_add_buildtime_stream (d, "0", "1"); modulemd_dependencies_set_empty_buildtime_dependencies_for_module (d, "2"); modulemd_dependencies_add_runtime_stream (d, "3", "4"); modulemd_dependencies_set_empty_runtime_dependencies_for_module (d, "5"); g_assert_true (mmd_emitter_start_stream (&emitter, &error)); g_assert_true (mmd_emitter_start_document (&emitter, &error)); g_assert_true ( mmd_emitter_start_sequence (&emitter, YAML_BLOCK_SEQUENCE_STYLE, &error)); g_assert_true (modulemd_dependencies_emit_yaml (d, &emitter, &error)); g_assert_true (mmd_emitter_end_sequence (&emitter, &error)); g_assert_true (mmd_emitter_end_document (&emitter, &error)); g_assert_true (mmd_emitter_end_stream (&emitter, &error)); g_assert_cmpstr (yaml_string->str, ==, "---\n" "- buildrequires:\n" " \"0\": [\"1\"]\n" " \"2\": []\n" " requires:\n" " \"3\": [\"4\"]\n" " \"5\": []\n" "...\n"); } int main (int argc, char *argv[]) { setlocale (LC_ALL, ""); g_test_init (&argc, &argv, NULL); g_test_bug_base ("https://bugzilla.redhat.com/show_bug.cgi?id="); // Define the tests. g_test_add_func ("/modulemd/v2/dependencies/construct", dependencies_test_construct); g_test_add_func ("/modulemd/v2/dependencies/dependencies", dependencies_test_dependencies); g_test_add_func ("/modulemd/v2/dependencies/equals", dependencies_test_equals); g_test_add_func ("/modulemd/v2/dependencies/copy", dependencies_test_copy); g_test_add_func ("/modulemd/v2/dependencies/yaml/parse", dependencies_test_parse_yaml); g_test_add_func ("/modulemd/v2/dependencies/yaml/parse/bad", dependencies_test_parse_bad_yaml); g_test_add_func ("/modulemd/v2/dependencies/yaml/emit", dependencies_test_emit_yaml); g_test_add_func ("/modulemd/v2/dependencies/yaml/quoting", dependencies_test_quoting_yaml); /* g_test_add_func ("/modulemd/v2/profile/copy",profile_test_copy); g_test_add_func ("/modulemd/v2/profile/get_name",profile_test_get_name); g_test_add_func ("/modulemd/v2/profile/get_set_description",profile_test_get_set_description); g_test_add_func ("/modulemd/v2/profile/rpms",profile_test_rpms); g_test_add_func ("/modulemd/v2/profile/yaml/parse",profile_test_parse_yaml); g_test_add _func("/modulemd/v2/profile/yaml/emit",profile_test_emit_yaml); */ return g_test_run (); } fedora-modularity-libmodulemd-357799c/modulemd/tests/test-modulemd-merger.c000066400000000000000000001013021502446517500271140ustar00rootroot00000000000000/* * This file is part of libmodulemd * Copyright (C) 2018 Red Hat, Inc. * * Fedora-License-Identifier: MIT * SPDX-2.0-License-Identifier: MIT * SPDX-3.0-License-Identifier: MIT * * This program is free software. * For more information on the license, see COPYING. * For more information on free software, see . */ #include #include #include "modulemd-defaults-v1.h" #include "modulemd-defaults.h" #include "modulemd-obsoletes.h" #include "modulemd-module-index-merger.h" #include "modulemd-module-index.h" #include "private/test-utils.h" #include "private/modulemd-module-private.h" #include "private/modulemd-obsoletes-private.h" #include "private/modulemd-subdocument-info-private.h" static void merger_test_constructors (void) { g_autoptr (ModulemdModuleIndexMerger) merger = NULL; /* Test standard object instantiation */ merger = g_object_new (MODULEMD_TYPE_MODULE_INDEX_MERGER, NULL); g_assert_nonnull (merger); g_clear_object (&merger); /* Test new() */ merger = modulemd_module_index_merger_new (); g_assert_nonnull (merger); g_clear_object (&merger); } static void merger_test_deduplicate (void) { gboolean ret; g_autoptr (ModulemdModuleIndex) index = NULL; g_autoptr (ModulemdModuleIndex) index2 = NULL; g_autoptr (ModulemdModuleIndex) merged_index = NULL; g_autoptr (ModulemdModuleIndexMerger) merger = NULL; g_autofree gchar *yaml_path = NULL; g_autoptr (GPtrArray) failures = NULL; g_autoptr (GError) error = NULL; g_autofree gchar *baseline = NULL; g_autofree gchar *deduplicated = NULL; yaml_path = g_strdup_printf ("%s/f29-updates.yaml", g_getenv ("TEST_DATA_PATH")); index = modulemd_module_index_new (); g_assert_nonnull (yaml_path); ret = modulemd_module_index_update_from_file ( index, yaml_path, TRUE, &failures, &error); modulemd_subdocument_info_debug_dump_failures (failures); g_assert_no_error (error); g_assert_true (ret); g_assert_cmpint (failures->len, ==, 0); g_clear_pointer (&failures, g_ptr_array_unref); /* Save the baseline output for later comparison */ baseline = modulemd_module_index_dump_to_string (index, &error); g_assert_nonnull (baseline); g_assert_null (error); index2 = modulemd_module_index_new (); g_assert_nonnull (yaml_path); ret = modulemd_module_index_update_from_file ( index2, yaml_path, TRUE, &failures, &error); modulemd_subdocument_info_debug_dump_failures (failures); g_assert_no_error (error); g_assert_true (ret); g_assert_cmpint (failures->len, ==, 0); g_assert_nonnull (index2); g_assert_null (error); g_clear_pointer (&failures, g_ptr_array_unref); /* Create a ModuleIndexMerger and add both copies to it */ merger = modulemd_module_index_merger_new (); g_assert_nonnull (merger); modulemd_module_index_merger_associate_index (merger, index, 0); modulemd_module_index_merger_associate_index (merger, index2, 0); /* Resolve the merge, which should deduplicate all entries */ merged_index = modulemd_module_index_merger_resolve (merger, &error); g_assert_no_error (error); g_assert_nonnull (merged_index); deduplicated = modulemd_module_index_dump_to_string (merged_index, &error); g_assert_nonnull (deduplicated); g_assert_null (error); g_assert_cmpstr (baseline, ==, deduplicated); } static void merger_test_merger (void) { gboolean ret; g_autoptr (ModulemdModuleIndex) base_index = NULL; g_autofree gchar *yaml_path = NULL; ModulemdModule *httpd = NULL; ModulemdDefaultsV1 *httpd_defaults = NULL; GStrv httpd_profile_streams = NULL; g_autoptr (ModulemdModuleIndex) override_nodejs_index = NULL; g_autoptr (ModulemdModuleIndexMerger) merger = NULL; g_autoptr (ModulemdModuleIndex) merged_index = NULL; ModulemdModule *nodejs = NULL; ModulemdDefaultsV1 *nodejs_defaults = NULL; ModulemdDefaultsV1 *merged_httpd_defaults = NULL; g_autoptr (ModulemdModuleIndex) override_index = NULL; g_autoptr (GPtrArray) failures = NULL; g_autoptr (GError) error = NULL; gint32 random_low; gint32 random_high; /* Get a set of o = NULLbjects in a ModuleIndex */ yaml_path = g_strdup_printf ("%s/merging-base.yaml", g_getenv ("TEST_DATA_PATH")); base_index = modulemd_module_index_new (); ret = modulemd_module_index_update_from_file ( base_index, yaml_path, TRUE, &failures, &error); modulemd_subdocument_info_debug_dump_failures (failures); g_assert_no_error (error); g_assert_true (ret); g_clear_pointer (&yaml_path, g_free); /* Baseline */ httpd = modulemd_module_index_get_module (base_index, "httpd"); httpd_defaults = (ModulemdDefaultsV1 *)modulemd_module_get_defaults (httpd); g_assert_nonnull (httpd_defaults); g_assert_cmpstr ( modulemd_defaults_v1_get_default_stream (httpd_defaults, NULL), ==, "2.2"); httpd_profile_streams = modulemd_defaults_v1_get_streams_with_default_profiles_as_strv ( httpd_defaults, NULL); g_assert_cmpint (g_strv_length (httpd_profile_streams), ==, 2); g_assert_true ( g_strv_contains ((const char **)httpd_profile_streams, "2.2")); g_assert_true ( g_strv_contains ((const char **)httpd_profile_streams, "2.8")); g_clear_pointer (&httpd_profile_streams, g_strfreev); httpd_profile_streams = modulemd_defaults_v1_get_default_profiles_for_stream_as_strv ( httpd_defaults, "2.2", NULL); g_assert_cmpint (g_strv_length (httpd_profile_streams), ==, 2); g_assert_true ( g_strv_contains ((const char **)httpd_profile_streams, "client")); g_assert_true ( g_strv_contains ((const char **)httpd_profile_streams, "server")); g_clear_pointer (&httpd_profile_streams, g_strfreev); httpd_profile_streams = modulemd_defaults_v1_get_default_profiles_for_stream_as_strv ( httpd_defaults, "2.8", NULL); g_assert_true ( g_strv_contains ((const char **)httpd_profile_streams, "notreal")); g_clear_pointer (&httpd_profile_streams, g_strfreev); g_assert_cmpstr ( modulemd_defaults_v1_get_default_stream (httpd_defaults, "workstation"), ==, "2.4"); httpd_profile_streams = modulemd_defaults_v1_get_streams_with_default_profiles_as_strv ( httpd_defaults, "workstation"); g_assert_cmpint (g_strv_length (httpd_profile_streams), ==, 2); g_assert_true ( g_strv_contains ((const char **)httpd_profile_streams, "2.4")); g_assert_true ( g_strv_contains ((const char **)httpd_profile_streams, "2.6")); g_clear_pointer (&httpd_profile_streams, g_strfreev); httpd_profile_streams = modulemd_defaults_v1_get_default_profiles_for_stream_as_strv ( httpd_defaults, "2.4", "workstation"); g_assert_cmpint (g_strv_length (httpd_profile_streams), ==, 1); g_clear_pointer (&httpd_profile_streams, g_strfreev); httpd_profile_streams = modulemd_defaults_v1_get_default_profiles_for_stream_as_strv ( httpd_defaults, "2.6", "workstation"); g_assert_cmpint (g_strv_length (httpd_profile_streams), ==, 3); g_clear_pointer (&httpd_profile_streams, g_strfreev); /* * Get another set of objects that will override the default stream for * nodejs */ yaml_path = g_strdup_printf ("%s/overriding-nodejs.yaml", g_getenv ("TEST_DATA_PATH")); override_nodejs_index = modulemd_module_index_new (); ret = modulemd_module_index_update_from_file ( override_nodejs_index, yaml_path, TRUE, &failures, &error); g_assert_no_error (error); g_assert_true (ret); g_clear_pointer (&yaml_path, g_free); /* * Test that adding both of these at the same priority level results in * the no default stream */ merger = modulemd_module_index_merger_new (); modulemd_module_index_merger_associate_index (merger, base_index, 0); modulemd_module_index_merger_associate_index ( merger, override_nodejs_index, 0); merged_index = modulemd_module_index_merger_resolve (merger, NULL); g_clear_object (&merger); nodejs = modulemd_module_index_get_module (merged_index, "nodejs"); g_assert_nonnull (nodejs); nodejs_defaults = (ModulemdDefaultsV1 *)modulemd_module_get_defaults (nodejs); g_assert_nonnull (nodejs_defaults); g_assert_null ( modulemd_defaults_v1_get_default_stream (nodejs_defaults, NULL)); g_clear_object (&merged_index); /* Get another set of objects that will override g_assert_null(modulemd_defaults_v1_get_default_stream the above */ yaml_path = g_strdup_printf ("%s/overriding.yaml", g_getenv ("TEST_DATA_PATH")); override_index = modulemd_module_index_new (); ret = modulemd_module_index_update_from_file ( override_index, yaml_path, TRUE, &failures, &error); g_assert_no_error (error); g_assert_true (ret); g_clear_pointer (&yaml_path, g_free); /* * Test that override_index at a higher priority level succeeds * Test that adding both of these at the same priority level fails * with a merge conflict. * Use randomly-selected high and low values to make sure we don't have * sorting issues. */ merger = modulemd_module_index_merger_new (); random_low = g_random_int_range (1, 100); random_high = g_random_int_range (101, 999); printf ("Low priority: %d, High priority: %d", random_low, random_high); modulemd_module_index_merger_associate_index ( merger, base_index, random_low); modulemd_module_index_merger_associate_index ( merger, override_index, random_high); merged_index = modulemd_module_index_merger_resolve (merger, NULL); g_assert_nonnull (merged_index); g_clear_object (&merger); /*Validate merged results*/ /*HTTPD*/ merged_httpd_defaults = (ModulemdDefaultsV1 *)modulemd_module_get_defaults ( modulemd_module_index_get_module (merged_index, "httpd")); g_assert_nonnull (merged_httpd_defaults); g_assert_cmpstr ( modulemd_defaults_v1_get_default_stream (merged_httpd_defaults, NULL), ==, "2.4"); httpd_profile_streams = modulemd_defaults_v1_get_streams_with_default_profiles_as_strv ( merged_httpd_defaults, NULL); g_assert_true ( g_strv_contains ((const char **)httpd_profile_streams, "2.2")); g_assert_true ( g_strv_contains ((const char **)httpd_profile_streams, "2.4")); g_clear_pointer (&httpd_profile_streams, g_strfreev); httpd_profile_streams = modulemd_defaults_v1_get_default_profiles_for_stream_as_strv ( merged_httpd_defaults, "2.2", NULL); g_assert_cmpint (g_strv_length (httpd_profile_streams), ==, 2); g_assert_true ( g_strv_contains ((const char **)httpd_profile_streams, "client")); g_assert_true ( g_strv_contains ((const char **)httpd_profile_streams, "server")); g_clear_pointer (&httpd_profile_streams, g_strfreev); httpd_profile_streams = modulemd_defaults_v1_get_default_profiles_for_stream_as_strv ( merged_httpd_defaults, "2.4", NULL); g_assert_true ( g_strv_contains ((const char **)httpd_profile_streams, "client")); g_assert_true ( g_strv_contains ((const char **)httpd_profile_streams, "server")); g_clear_pointer (&httpd_profile_streams, g_strfreev); g_assert_cmpstr (modulemd_defaults_v1_get_default_stream ( merged_httpd_defaults, "workstation"), ==, "2.8"); httpd_profile_streams = modulemd_defaults_v1_get_streams_with_default_profiles_as_strv ( merged_httpd_defaults, "workstation"); g_assert_cmpint (g_strv_length (httpd_profile_streams), ==, 3); g_assert_true ( g_strv_contains ((const char **)httpd_profile_streams, "2.4")); g_assert_true ( g_strv_contains ((const char **)httpd_profile_streams, "2.6")); g_assert_true ( g_strv_contains ((const char **)httpd_profile_streams, "2.8")); g_clear_pointer (&httpd_profile_streams, g_strfreev); httpd_profile_streams = modulemd_defaults_v1_get_default_profiles_for_stream_as_strv ( merged_httpd_defaults, "2.4", "workstation"); g_assert_cmpint (g_strv_length (httpd_profile_streams), ==, 1); g_clear_pointer (&httpd_profile_streams, g_strfreev); httpd_profile_streams = modulemd_defaults_v1_get_default_profiles_for_stream_as_strv ( merged_httpd_defaults, "2.6", "workstation"); g_assert_cmpint (g_strv_length (httpd_profile_streams), ==, 3); g_clear_pointer (&httpd_profile_streams, g_strfreev); httpd_profile_streams = modulemd_defaults_v1_get_default_profiles_for_stream_as_strv ( merged_httpd_defaults, "2.8", "workstation"); g_assert_cmpint (g_strv_length (httpd_profile_streams), ==, 4); g_clear_pointer (&httpd_profile_streams, g_strfreev); } static void merger_test_add_only (void) { gboolean ret; g_autoptr (GPtrArray) failures = NULL; g_autoptr (GError) error = NULL; g_autoptr (ModulemdModuleIndex) base_idx = modulemd_module_index_new (); g_autoptr (ModulemdModuleIndex) add_only_idx = modulemd_module_index_new (); g_autoptr (ModulemdModuleIndex) merged_idx = NULL; g_autoptr (ModulemdModuleIndexMerger) merger = modulemd_module_index_merger_new (); ModulemdModule *httpd = NULL; ModulemdDefaults *httpd_defs = NULL; g_autofree gchar *base_yaml = g_strdup_printf ("%s/merger/base.yaml", g_getenv ("TEST_DATA_PATH")); g_autofree gchar *add_only_yaml = g_strdup_printf ("%s/merger/add_only.yaml", g_getenv ("TEST_DATA_PATH")); ret = modulemd_module_index_update_from_file ( base_idx, base_yaml, TRUE, &failures, &error); modulemd_subdocument_info_debug_dump_failures (failures); g_assert_no_error (error); g_assert_true (ret); ret = modulemd_module_index_update_from_file ( add_only_idx, add_only_yaml, TRUE, &failures, &error); modulemd_subdocument_info_debug_dump_failures (failures); g_assert_no_error (error); g_assert_true (ret); modulemd_module_index_merger_associate_index (merger, base_idx, 0); modulemd_module_index_merger_associate_index (merger, add_only_idx, 0); merged_idx = modulemd_module_index_merger_resolve_ext (merger, TRUE, &error); g_assert_no_error (error); g_assert_nonnull (merged_idx); httpd = modulemd_module_index_get_module (merged_idx, "httpd"); g_assert_nonnull (httpd); httpd_defs = modulemd_module_get_defaults (httpd); g_assert_nonnull (httpd_defs); g_assert_cmpstr (modulemd_defaults_v1_get_default_stream ( MODULEMD_DEFAULTS_V1 (httpd_defs), NULL), ==, "2.8"); g_assert_cmpstr (modulemd_defaults_v1_get_default_stream ( MODULEMD_DEFAULTS_V1 (httpd_defs), "workstation"), ==, "2.4"); } static void merger_test_add_conflicting_stream (void) { gboolean ret; g_autoptr (GPtrArray) failures = NULL; g_autoptr (GError) error = NULL; g_autoptr (ModulemdModuleIndex) base_idx = modulemd_module_index_new (); g_autoptr (ModulemdModuleIndex) add_conflicting_idx = modulemd_module_index_new (); g_autoptr (ModulemdModuleIndex) merged_idx = NULL; g_autoptr (ModulemdModuleIndexMerger) merger = modulemd_module_index_merger_new (); ModulemdModule *psql = NULL; ModulemdDefaults *psql_defs = NULL; g_autofree gchar *base_yaml = g_strdup_printf ("%s/merger/base.yaml", g_getenv ("TEST_DATA_PATH")); g_autofree gchar *add_conflicting_yaml = g_strdup_printf ( "%s/merger/add_conflicting_stream.yaml", g_getenv ("TEST_DATA_PATH")); ret = modulemd_module_index_update_from_file ( base_idx, base_yaml, TRUE, &failures, &error); modulemd_subdocument_info_debug_dump_failures (failures); g_assert_no_error (error); g_assert_true (ret); ret = modulemd_module_index_update_from_file ( add_conflicting_idx, add_conflicting_yaml, TRUE, &failures, &error); modulemd_subdocument_info_debug_dump_failures (failures); g_assert_no_error (error); g_assert_true (ret); modulemd_module_index_merger_associate_index (merger, base_idx, 0); modulemd_module_index_merger_associate_index ( merger, add_conflicting_idx, 0); merged_idx = modulemd_module_index_merger_resolve_ext (merger, FALSE, &error); g_assert_no_error (error); g_assert_nonnull (merged_idx); psql = modulemd_module_index_get_module (merged_idx, "postgresql"); g_assert_nonnull (psql); psql_defs = modulemd_module_get_defaults (psql); g_assert_nonnull (psql_defs); g_assert_null (modulemd_defaults_v1_get_default_stream ( MODULEMD_DEFAULTS_V1 (psql_defs), NULL)); } static void merger_test_add_conflicting_stream_and_profile_modified (void) { gboolean ret; g_autoptr (GPtrArray) failures = NULL; g_autoptr (GError) error = NULL; g_autoptr (ModulemdModuleIndex) base_idx = modulemd_module_index_new (); g_autoptr (ModulemdModuleIndex) add_conflicting_idx = modulemd_module_index_new (); g_autoptr (ModulemdModuleIndex) merged_idx = NULL; g_autoptr (ModulemdModuleIndexMerger) merger = modulemd_module_index_merger_new (); ModulemdModule *psql = NULL; ModulemdDefaults *psql_defs = NULL; g_autofree gchar *base_yaml = g_strdup_printf ("%s/merger/base.yaml", g_getenv ("TEST_DATA_PATH")); g_autofree gchar *add_conflicting_yaml = g_strdup_printf ( "%s/merger/add_conflicting_stream_and_profile_modified.yaml", g_getenv ("TEST_DATA_PATH")); ret = modulemd_module_index_update_from_file ( base_idx, base_yaml, TRUE, &failures, &error); modulemd_subdocument_info_debug_dump_failures (failures); g_assert_no_error (error); g_assert_true (ret); ret = modulemd_module_index_update_from_file ( add_conflicting_idx, add_conflicting_yaml, TRUE, &failures, &error); modulemd_subdocument_info_debug_dump_failures (failures); g_assert_no_error (error); g_assert_true (ret); modulemd_module_index_merger_associate_index (merger, base_idx, 0); modulemd_module_index_merger_associate_index ( merger, add_conflicting_idx, 0); merged_idx = modulemd_module_index_merger_resolve_ext (merger, FALSE, &error); g_assert_no_error (error); g_assert_nonnull (merged_idx); psql = modulemd_module_index_get_module (merged_idx, "postgresql"); g_assert_nonnull (psql); psql_defs = modulemd_module_get_defaults (psql); g_assert_nonnull (psql_defs); g_assert_cmpstr (modulemd_defaults_v1_get_default_stream ( MODULEMD_DEFAULTS_V1 (psql_defs), NULL), ==, "8.2"); } static void merger_test_with_real_world_data (void) { gboolean ret; g_autoptr (ModulemdModuleIndex) f29 = NULL; g_autoptr (ModulemdModuleIndex) f29_updates = NULL; g_autoptr (ModulemdModuleIndex) index = NULL; g_autoptr (ModulemdModuleIndexMerger) merger = NULL; g_autoptr (GError) error = NULL; g_autoptr (GPtrArray) failures = NULL; g_autofree gchar *yaml_path = NULL; f29 = modulemd_module_index_new (); yaml_path = g_strdup_printf ("%s/f29.yaml", g_getenv ("TEST_DATA_PATH")); ret = modulemd_module_index_update_from_file ( f29, yaml_path, TRUE, &failures, &error); modulemd_subdocument_info_debug_dump_failures (failures); g_assert_no_error (error); g_assert_true (ret); g_assert_cmpint (failures->len, ==, 0); g_clear_pointer (&yaml_path, g_free); g_clear_pointer (&failures, g_ptr_array_unref); f29_updates = modulemd_module_index_new (); yaml_path = g_strdup_printf ("%s/f29-updates.yaml", g_getenv ("TEST_DATA_PATH")); ret = modulemd_module_index_update_from_file ( f29_updates, yaml_path, TRUE, &failures, &error); modulemd_subdocument_info_debug_dump_failures (failures); g_assert_no_error (error); g_assert_true (ret); g_assert_cmpint (failures->len, ==, 0); g_clear_pointer (&yaml_path, g_free); g_clear_pointer (&failures, g_ptr_array_unref); merger = modulemd_module_index_merger_new (); modulemd_module_index_merger_associate_index (merger, f29, 0); modulemd_module_index_merger_associate_index (merger, f29_updates, 0); index = modulemd_module_index_merger_resolve (merger, &error); g_assert_nonnull (index); g_assert_no_error (error); } static void merger_test_obsoletes_add (void) { gboolean ret; g_autoptr (GPtrArray) failures = NULL; g_autoptr (GError) error = NULL; g_autoptr (ModulemdModuleIndex) base_idx = modulemd_module_index_new (); g_autoptr (ModulemdModuleIndex) add_idx = modulemd_module_index_new (); g_autoptr (ModulemdModuleIndex) merged_idx = NULL; g_autoptr (ModulemdModuleIndexMerger) merger = modulemd_module_index_merger_new (); ModulemdModule *module = NULL; ModulemdObsoletes *o = NULL; g_autofree gchar *base_yaml = g_strdup_printf ( "%s/merger/base_obsoletes.yaml", g_getenv ("TEST_DATA_PATH")); g_autofree gchar *add_yaml = g_strdup_printf ("%s/merger/add_obsoletes.yaml", g_getenv ("TEST_DATA_PATH")); ret = modulemd_module_index_update_from_file ( base_idx, base_yaml, TRUE, &failures, &error); modulemd_subdocument_info_debug_dump_failures (failures); g_assert_no_error (error); g_assert_true (ret); ret = modulemd_module_index_update_from_file ( add_idx, add_yaml, TRUE, &failures, &error); modulemd_subdocument_info_debug_dump_failures (failures); g_assert_no_error (error); g_assert_true (ret); modulemd_module_index_merger_associate_index (merger, base_idx, 0); modulemd_module_index_merger_associate_index (merger, add_idx, 0); merged_idx = modulemd_module_index_merger_resolve_ext (merger, TRUE, &error); g_assert_no_error (error); g_assert_nonnull (merged_idx); module = modulemd_module_index_get_module (merged_idx, "nodejs"); g_assert_nonnull (module); GPtrArray *obsoletes = NULL; obsoletes = modulemd_module_get_obsoletes (module); g_assert_cmpuint (obsoletes->len, ==, 2); o = g_ptr_array_index (obsoletes, 0); g_assert_nonnull (o); g_assert_cmpstr (modulemd_obsoletes_get_module_name (o), ==, "nodejs"); g_assert_cmpstr (modulemd_obsoletes_get_module_stream (o), ==, "8.0"); g_assert_cmpstr (modulemd_obsoletes_get_message (o), ==, "test message"); g_assert_cmpuint (modulemd_obsoletes_get_eol_date (o), ==, 0); g_assert_cmpstr ( modulemd_obsoletes_get_obsoleted_by_module_name (o), ==, "nodejs"); g_assert_cmpstr ( modulemd_obsoletes_get_obsoleted_by_module_stream (o), ==, "12"); o = g_ptr_array_index (obsoletes, 1); g_assert_nonnull (o); g_assert_cmpstr (modulemd_obsoletes_get_module_name (o), ==, "nodejs"); g_assert_cmpstr (modulemd_obsoletes_get_module_stream (o), ==, "devel"); g_assert_cmpstr (modulemd_obsoletes_get_message (o), ==, "test message"); g_assert_cmpuint (modulemd_obsoletes_get_eol_date (o), ==, 0); g_assert_null (modulemd_obsoletes_get_obsoleted_by_module_name (o)); g_assert_null (modulemd_obsoletes_get_obsoleted_by_module_stream (o)); } static void merger_test_obsoletes_newer (void) { gboolean ret; g_autoptr (GPtrArray) failures = NULL; g_autoptr (GError) error = NULL; g_autoptr (ModulemdModuleIndex) base_idx = modulemd_module_index_new (); g_autoptr (ModulemdModuleIndex) newer_idx = modulemd_module_index_new (); g_autoptr (ModulemdModuleIndex) merged_idx = NULL; g_autoptr (ModulemdModuleIndexMerger) merger = modulemd_module_index_merger_new (); ModulemdModule *module = NULL; ModulemdObsoletes *o = NULL; g_autofree gchar *base_yaml = g_strdup_printf ( "%s/merger/base_obsoletes.yaml", g_getenv ("TEST_DATA_PATH")); g_autofree gchar *newer_yaml = g_strdup_printf ( "%s/merger/newer_obsoletes.yaml", g_getenv ("TEST_DATA_PATH")); ret = modulemd_module_index_update_from_file ( base_idx, base_yaml, TRUE, &failures, &error); modulemd_subdocument_info_debug_dump_failures (failures); g_assert_no_error (error); g_assert_true (ret); ret = modulemd_module_index_update_from_file ( newer_idx, newer_yaml, TRUE, &failures, &error); modulemd_subdocument_info_debug_dump_failures (failures); g_assert_no_error (error); g_assert_true (ret); modulemd_module_index_merger_associate_index (merger, base_idx, 0); modulemd_module_index_merger_associate_index (merger, newer_idx, 0); merged_idx = modulemd_module_index_merger_resolve_ext (merger, TRUE, &error); g_assert_no_error (error); g_assert_nonnull (merged_idx); module = modulemd_module_index_get_module (merged_idx, "nodejs"); g_assert_nonnull (module); GPtrArray *obsoletes = NULL; obsoletes = modulemd_module_get_obsoletes (module); g_assert_cmpint (obsoletes->len, ==, 2); o = g_ptr_array_index (obsoletes, 0); g_assert_nonnull (o); g_assert_cmpstr (modulemd_obsoletes_get_module_name (o), ==, "nodejs"); g_assert_cmpstr (modulemd_obsoletes_get_module_stream (o), ==, "8.0"); g_assert_cmpstr (modulemd_obsoletes_get_message (o), ==, "test message"); g_assert_cmpuint (modulemd_obsoletes_get_modified (o), ==, 201909270000); o = g_ptr_array_index (obsoletes, 1); g_assert_nonnull (o); g_assert_cmpstr (modulemd_obsoletes_get_module_name (o), ==, "nodejs"); g_assert_cmpstr (modulemd_obsoletes_get_module_stream (o), ==, "8.0"); g_assert_cmpstr (modulemd_obsoletes_get_message (o), ==, "test message"); g_assert_cmpuint (modulemd_obsoletes_get_eol_date (o), ==, 202005231425); g_assert_null (modulemd_obsoletes_get_obsoleted_by_module_name (o)); g_assert_null (modulemd_obsoletes_get_obsoleted_by_module_stream (o)); } static void merger_test_obsoletes_priority (void) { // When priority specified override existing obsolete gboolean ret; g_autoptr (GPtrArray) failures = NULL; g_autoptr (GError) error = NULL; g_autoptr (ModulemdModuleIndex) base_idx = modulemd_module_index_new (); g_autoptr (ModulemdModuleIndex) conflicting_idx = modulemd_module_index_new (); g_autoptr (ModulemdModuleIndex) merged_idx = NULL; g_autoptr (ModulemdModuleIndexMerger) merger = modulemd_module_index_merger_new (); ModulemdModule *module = NULL; ModulemdObsoletes *o = NULL; g_autofree gchar *base_yaml = g_strdup_printf ( "%s/merger/base_obsoletes.yaml", g_getenv ("TEST_DATA_PATH")); g_autofree gchar *newer_yaml = g_strdup_printf ( "%s/merger/conflict_obsoletes.yaml", g_getenv ("TEST_DATA_PATH")); ret = modulemd_module_index_update_from_file ( base_idx, base_yaml, TRUE, &failures, &error); modulemd_subdocument_info_debug_dump_failures (failures); g_assert_no_error (error); g_assert_true (ret); ret = modulemd_module_index_update_from_file ( conflicting_idx, newer_yaml, TRUE, &failures, &error); modulemd_subdocument_info_debug_dump_failures (failures); g_assert_no_error (error); g_assert_true (ret); modulemd_module_index_merger_associate_index (merger, base_idx, 1); modulemd_module_index_merger_associate_index (merger, conflicting_idx, 0); merged_idx = modulemd_module_index_merger_resolve_ext (merger, TRUE, &error); g_assert_no_error (error); g_assert_nonnull (merged_idx); module = modulemd_module_index_get_module (merged_idx, "nodejs"); g_assert_nonnull (module); GPtrArray *obsoletes = NULL; obsoletes = modulemd_module_get_obsoletes (module); g_assert_cmpint (obsoletes->len, ==, 1); o = g_ptr_array_index (obsoletes, 0); g_assert_nonnull (o); g_assert_cmpstr (modulemd_obsoletes_get_module_name (o), ==, "nodejs"); g_assert_cmpstr (modulemd_obsoletes_get_module_stream (o), ==, "8.0"); g_assert_cmpstr (modulemd_obsoletes_get_message (o), ==, "test message"); g_assert_cmpuint (modulemd_obsoletes_get_eol_date (o), ==, 0); g_assert_cmpstr ( modulemd_obsoletes_get_obsoleted_by_module_name (o), ==, "nodejs"); g_assert_cmpstr ( modulemd_obsoletes_get_obsoleted_by_module_stream (o), ==, "12"); } static void merger_test_obsoletes_incompatible (void) { /* This test verifies that if we encounter two obsoletes with the same * stream, context and modified date, but different content, we * only retain one of them. * Note: the specification of the merger states that the behavior is * undefined, so we will only validate that the merge completes and * it only contains a single obsoletes */ gboolean ret; g_autoptr (GPtrArray) failures = NULL; g_autoptr (GError) error = NULL; g_autoptr (ModulemdModuleIndex) base_idx = modulemd_module_index_new (); g_autoptr (ModulemdModuleIndex) incompatible_idx = modulemd_module_index_new (); g_autoptr (ModulemdModuleIndex) merged_idx = NULL; g_autoptr (ModulemdModuleIndexMerger) merger = modulemd_module_index_merger_new (); ModulemdModule *module = NULL; g_autofree gchar *base_yaml = g_strdup_printf ( "%s/merger/base_obsoletes.yaml", g_getenv ("TEST_DATA_PATH")); g_autofree gchar *incompatible_yaml = g_strdup_printf ( "%s/merger/conflict_obsoletes.yaml", g_getenv ("TEST_DATA_PATH")); ret = modulemd_module_index_update_from_file ( base_idx, base_yaml, TRUE, &failures, &error); modulemd_subdocument_info_debug_dump_failures (failures); g_assert_no_error (error); g_assert_true (ret); ret = modulemd_module_index_update_from_file ( incompatible_idx, incompatible_yaml, TRUE, &failures, &error); modulemd_subdocument_info_debug_dump_failures (failures); g_assert_no_error (error); g_assert_true (ret); modulemd_module_index_merger_associate_index (merger, base_idx, 0); modulemd_module_index_merger_associate_index (merger, incompatible_idx, 0); merged_idx = modulemd_module_index_merger_resolve_ext (merger, TRUE, &error); g_assert_no_error (error); g_assert_nonnull (merged_idx); module = modulemd_module_index_get_module (merged_idx, "nodejs"); g_assert_nonnull (module); GPtrArray *obsoletes = NULL; obsoletes = modulemd_module_get_obsoletes (module); g_assert_cmpint (obsoletes->len, ==, 1); } static void merger_test_obsoletes_lone_obsolete (void) { // clang-format off g_autofree gchar *obsolete_str = g_strdup( "---\n" "document: modulemd-obsoletes\n" "version: 1\n" "data:\n" " modified: 2020-05-01T00:00Z\n" " module: nodejs\n" " context: 6c81f848\n" " stream: 5\n" " message: \"obsoleting obsoletes\"\n" " obsoleted_by:\n" " module: nodejs\n" " stream: 10\n" "...\n"); // clang-format on // clang-format off g_autofree gchar *stream_str = g_strdup( "---\n" "document: modulemd\n" "version: 2\n" "data:\n" " name: nodejs\n" " stream: 5\n" " version: 99\n" " context: 6c81f848\n" " arch: x86_64\n" " summary: Javascript runtime\n" " description: >-\n" " Node.js is a platform built on Chrome''s JavaScript runtime.\n" " license:\n" " module:\n" " - MIT\n" "...\n"); // clang-format on g_autoptr (GPtrArray) failures = NULL; g_autoptr (GError) error = NULL; g_autoptr (ModulemdModuleIndex) obsolete_idx = modulemd_module_index_new (); g_autoptr (ModulemdModuleIndex) stream_idx = modulemd_module_index_new (); g_autoptr (ModulemdModuleIndex) merged_idx = NULL; g_autoptr (ModulemdModuleIndexMerger) merger = modulemd_module_index_merger_new (); gboolean ret; ret = modulemd_module_index_update_from_string ( obsolete_idx, obsolete_str, TRUE, &failures, &error); modulemd_subdocument_info_debug_dump_failures (failures); g_assert_no_error (error); g_assert_true (ret); ret = modulemd_module_index_update_from_string ( stream_idx, stream_str, TRUE, &failures, &error); modulemd_subdocument_info_debug_dump_failures (failures); g_assert_no_error (error); g_assert_true (ret); modulemd_module_index_merger_associate_index (merger, obsolete_idx, 0); modulemd_module_index_merger_associate_index (merger, stream_idx, 0); merged_idx = modulemd_module_index_merger_resolve (merger, &error); g_assert_nonnull (merged_idx); g_assert_no_error (error); g_autoptr (ModulemdModuleStream) stream = NULL; stream = g_object_ref (modulemd_module_get_stream_by_NSVCA ( modulemd_module_index_get_module (merged_idx, "nodejs"), "5", 99, NULL, NULL, &error)); g_assert_nonnull (stream); g_assert_no_error (error); } int main (int argc, char *argv[]) { setlocale (LC_ALL, ""); g_test_init (&argc, &argv, NULL); g_test_bug_base ("https://bugzilla.redhat.com/show_bug.cgi?id="); // Define the tests. g_test_add_func ("/modulemd/v2/module/index/merger/constructors", merger_test_constructors); g_test_add_func ("/modulemd/v2/module/index/merger/deduplicate", merger_test_deduplicate); g_test_add_func ("/modulemd/v2/module/index/merger/merger", merger_test_merger); g_test_add_func ("/modulemd/module/index/merger/add_only", merger_test_add_only); g_test_add_func ("/modulemd/module/index/merger/add_conflicting_stream", merger_test_add_conflicting_stream); g_test_add_func ("/modulemd/module/index/merger/add_conflicting_both", merger_test_add_conflicting_stream_and_profile_modified); g_test_add_func ( "/modulemd/module/index/merger/test_merger_with_real_world_data", merger_test_with_real_world_data); g_test_add_func ("/modulemd/module/index/merger/obsoletes/add", merger_test_obsoletes_add); g_test_add_func ("/modulemd/module/index/merger/obsoletes/newer", merger_test_obsoletes_newer); g_test_add_func ("/modulemd/module/index/merger/obsoletes/priority", merger_test_obsoletes_priority); g_test_add_func ("/modulemd/module/index/merger/obsoletes/incompatibility", merger_test_obsoletes_incompatible); g_test_add_func ("/modulemd/module/index/merger/obsoletes/lone_obsolete", merger_test_obsoletes_lone_obsolete); return g_test_run (); } fedora-modularity-libmodulemd-357799c/modulemd/tests/test-modulemd-module.c000066400000000000000000000721721502446517500271340ustar00rootroot00000000000000/* * This file is part of libmodulemd * Copyright (C) 2018-2020 Red Hat, Inc. * * Fedora-License-Identifier: MIT * SPDX-2.0-License-Identifier: MIT * SPDX-3.0-License-Identifier: MIT * * This program is free software. * For more information on the license, see COPYING. * For more information on free software, see . */ #include #include #include #include #include "modulemd-defaults.h" #include "modulemd-module-index-merger.h" #include "modulemd-module-index.h" #include "modulemd-module-stream-v2.h" #include "modulemd-module-stream.h" #include "modulemd-module.h" #include "private/glib-extensions.h" #include "private/modulemd-defaults-v1-private.h" #include "private/modulemd-module-private.h" #include "private/modulemd-module-stream-private.h" #include "private/modulemd-obsoletes-private.h" #include "private/modulemd-subdocument-info-private.h" #include "private/modulemd-util.h" #include "private/modulemd-yaml.h" #include "private/test-utils.h" typedef struct _ModuleFixture { } ModuleFixture; static void module_test_construct (void) { g_autoptr (ModulemdModule) m = NULL; g_autoptr (GPtrArray) list = NULL; g_autoptr (GError) error = NULL; /* Test that the new() function works */ m = modulemd_module_new ("testmodule"); g_assert_nonnull (m); g_assert_true (MODULEMD_IS_MODULE (m)); g_assert_true (modulemd_module_validate (m, &error)); g_assert_no_error (error); g_assert_cmpstr (modulemd_module_get_module_name (m), ==, "testmodule"); g_assert_null (modulemd_module_get_defaults (m)); list = modulemd_module_get_streams_by_stream_name_as_list (m, "teststream"); g_assert_cmpint (list->len, ==, 0); g_clear_pointer (&list, g_ptr_array_unref); g_assert_null ( modulemd_module_get_stream_by_NSVCA (m, "test", 42, "test", NULL, &error)); g_assert_error (error, MODULEMD_ERROR, MMD_ERROR_NO_MATCHES); g_clear_error (&error); g_clear_object (&m); /* Test that object instantiation works with a name */ m = g_object_new (MODULEMD_TYPE_MODULE, "module-name", "testmodule", NULL); g_assert_true (MODULEMD_IS_MODULE (m)); g_assert_cmpstr (modulemd_module_get_module_name (m), ==, "testmodule"); g_clear_object (&m); /* Test that we abort with a NULL name to new() */ modulemd_test_signal = 0; signal (SIGTRAP, modulemd_test_signal_handler); m = modulemd_module_new (NULL); g_assert_cmpint (modulemd_test_signal, ==, SIGTRAP); g_clear_object (&m); /* Test that we abort if we instantiate without a name */ modulemd_test_signal = 0; signal (SIGTRAP, modulemd_test_signal_handler); m = g_object_new (MODULEMD_TYPE_MODULE, NULL); g_assert_cmpint (modulemd_test_signal, ==, SIGTRAP); g_clear_object (&m); /* test that we abort if we instantiate with a NULL name */ modulemd_test_signal = 0; signal (SIGTRAP, modulemd_test_signal_handler); m = g_object_new (MODULEMD_TYPE_MODULE, "module-name", NULL, NULL); g_assert_cmpint (modulemd_test_signal, ==, SIGTRAP); g_clear_object (&m); } static void module_test_defaults (void) { g_autoptr (ModulemdModule) m = NULL; g_autoptr (ModulemdDefaultsV1) d = NULL; g_autoptr (GError) nested_error = NULL; ModulemdDefaults *d_got, *d_got2; m = modulemd_module_new ("testmodule"); /* Setting defaults-v1 with a matching name succeeds. */ d = modulemd_defaults_v1_new ("testmodule"); g_assert_nonnull (d); g_assert_cmpint ( modulemd_module_set_defaults ( m, MODULEMD_DEFAULTS (d), MD_DEFAULTS_VERSION_UNSET, NULL), ==, MD_DEFAULTS_VERSION_ONE); d_got = modulemd_module_get_defaults (m); g_assert_nonnull (d_got); g_assert_cmpstr ( modulemd_defaults_get_module_name (d_got), ==, "testmodule"); g_clear_object (&d); /* Setting defaults that don't match this module name fails, * returns an error, and does not clobber the module. */ d = modulemd_defaults_v1_new ("test"); g_assert_nonnull (d); g_assert_cmpint ( modulemd_module_set_defaults ( m, MODULEMD_DEFAULTS (d), MD_DEFAULTS_VERSION_UNSET, &nested_error), ==, MD_DEFAULTS_VERSION_ERROR); g_assert_nonnull (nested_error); g_clear_pointer (&nested_error, g_error_free); d_got2 = modulemd_module_get_defaults (m); g_assert_true (d_got2 == d_got); g_clear_object (&d); /* Setting defaults with upgrading to an unsupported version fails, * returns an error, and does not clobber the module. */ d = modulemd_defaults_v1_new ("testmodule"); g_assert_nonnull (d); g_assert_cmpint ( modulemd_module_set_defaults ( m, MODULEMD_DEFAULTS (d), MD_DEFAULTS_VERSION_LATEST + 1, &nested_error), ==, MD_DEFAULTS_VERSION_ERROR); g_assert_nonnull (nested_error); g_clear_pointer (&nested_error, g_error_free); d_got2 = modulemd_module_get_defaults (m); g_assert_true (d_got2 == d_got); g_clear_object (&d); /* Unsetting defaults. */ g_assert_cmpint ( modulemd_module_set_defaults (m, NULL, MD_DEFAULTS_VERSION_UNSET, NULL), ==, MD_DEFAULTS_VERSION_UNSET); g_assert_null (modulemd_module_get_defaults (m)); } static void module_test_streams (void) { g_autoptr (ModulemdModule) m = modulemd_module_new ("testmodule"); g_autoptr (ModulemdTranslation) t = NULL; g_autoptr (ModulemdTranslationEntry) te = NULL; ModulemdObsoletes *o = NULL; g_autoptr (GError) error = NULL; ModulemdModuleStream *stream = NULL; GPtrArray *list = NULL; /* Create a translation pre-adding streams */ te = modulemd_translation_entry_new ("nl_NL"); modulemd_translation_entry_set_summary (te, "Een test omschrijving"); t = modulemd_translation_new (1, "testmodule", "stream1", 42); modulemd_translation_set_translation_entry (t, te); g_clear_pointer (&te, g_object_unref); modulemd_module_add_translation (m, t); g_clear_pointer (&t, g_object_unref); /* Create an obsoletes pre-adding streams */ o = modulemd_obsoletes_new ( 1, 2, "testmodule", "stream1", "obsolete1 added to context1"); modulemd_obsoletes_set_module_context (o, "context1"); modulemd_module_add_obsoletes (m, o); g_clear_pointer (&o, g_object_unref); /* Create and add some streams to cross */ stream = modulemd_module_stream_new (2, "testmodule", "stream1"); modulemd_module_stream_set_version (stream, 1); modulemd_module_stream_set_context (stream, "context1"); modulemd_module_stream_v2_set_summary (MODULEMD_MODULE_STREAM_V2 (stream), "Stream 1"); g_assert_cmpint ( modulemd_module_add_stream (m, stream, MD_MODULESTREAM_VERSION_TWO, NULL), ==, MD_MODULESTREAM_VERSION_TWO); g_clear_object (&stream); stream = modulemd_module_stream_new (2, "testmodule", "stream1"); modulemd_module_stream_set_version (stream, 3); modulemd_module_stream_set_context (stream, "context2"); modulemd_module_stream_v2_set_summary (MODULEMD_MODULE_STREAM_V2 (stream), "Stream 1"); g_assert_cmpint ( modulemd_module_add_stream (m, stream, MD_MODULESTREAM_VERSION_TWO, NULL), ==, MD_MODULESTREAM_VERSION_TWO); g_clear_object (&stream); stream = modulemd_module_stream_new (2, "testmodule", "stream1"); modulemd_module_stream_set_version (stream, 1); modulemd_module_stream_set_context (stream, "context2"); modulemd_module_stream_v2_set_summary (MODULEMD_MODULE_STREAM_V2 (stream), "Stream 1"); g_assert_cmpint ( modulemd_module_add_stream (m, stream, MD_MODULESTREAM_VERSION_TWO, NULL), ==, MD_MODULESTREAM_VERSION_TWO); g_clear_object (&stream); stream = modulemd_module_stream_new (2, "testmodule", "stream2"); modulemd_module_stream_set_version (stream, 42); modulemd_module_stream_set_context (stream, "context42"); modulemd_module_stream_v2_set_summary (MODULEMD_MODULE_STREAM_V2 (stream), "Stream 2"); g_assert_cmpint ( modulemd_module_add_stream (m, stream, MD_MODULESTREAM_VERSION_TWO, NULL), ==, MD_MODULESTREAM_VERSION_TWO); g_clear_object (&stream); /* Create a translation post-adding streams */ te = modulemd_translation_entry_new ("en_GB"); modulemd_translation_entry_set_summary (te, "A test summary"); t = modulemd_translation_new (1, "testmodule", "stream2", 42); modulemd_translation_set_translation_entry (t, te); g_clear_pointer (&te, g_object_unref); modulemd_module_add_translation (m, t); g_clear_pointer (&t, g_object_unref); /* Create an obsoletes post-adding streams */ o = modulemd_obsoletes_new ( 1, 2, "testmodule", "stream1", "obsolete2 added to all stream"); modulemd_module_add_obsoletes (m, o); g_clear_pointer (&o, g_object_unref); /* Verify that we get all streams */ list = modulemd_module_get_all_streams (m); g_assert_cmpint (list->len, ==, 4); list = NULL; /* get_all_streams is transfer none */ /* Test by_stream_name */ list = modulemd_module_get_streams_by_stream_name_as_list (m, "nosuchstream"); g_assert_nonnull (list); g_assert_cmpint (list->len, ==, 0); g_clear_pointer (&list, g_ptr_array_unref); list = modulemd_module_get_streams_by_stream_name_as_list (m, "stream2"); g_assert_nonnull (list); g_assert_cmpint (list->len, ==, 1); stream = (ModulemdModuleStream *)g_ptr_array_index (list, 0); g_assert_cmpstr ( modulemd_module_stream_get_context (stream), ==, "context42"); g_clear_pointer (&list, g_ptr_array_unref); /* Verify that ordering in the by_stream_name is right */ list = modulemd_module_get_streams_by_stream_name_as_list (m, "stream1"); g_assert_nonnull (list); g_assert_cmpint (list->len, ==, 3); stream = (ModulemdModuleStream *)g_ptr_array_index (list, 0); g_assert_nonnull (stream); g_assert_cmpint (modulemd_module_stream_get_version (stream), ==, 3); stream = (ModulemdModuleStream *)g_ptr_array_index (list, 1); g_assert_nonnull (stream); g_assert_cmpint (modulemd_module_stream_get_version (stream), ==, 1); stream = (ModulemdModuleStream *)g_ptr_array_index (list, 2); g_assert_nonnull (stream); g_assert_cmpint (modulemd_module_stream_get_version (stream), ==, 1); g_clear_pointer (&list, g_ptr_array_unref); /* Get streams by NSVC */ G_GNUC_BEGIN_IGNORE_DEPRECATIONS stream = modulemd_module_get_stream_by_NSVC (m, "nosuch", 3, "nosuchctx"); g_assert_null (stream); g_clear_error (&error); stream = modulemd_module_get_stream_by_NSVC (m, "stream1", 1, "context1"); g_assert_nonnull (stream); G_GNUC_END_IGNORE_DEPRECATIONS /* Get streams by NSVCA */ stream = modulemd_module_get_stream_by_NSVCA ( m, "nosuch", 3, "nosuchctx", NULL, &error); g_assert_null (stream); g_assert_error (error, MODULEMD_ERROR, MMD_ERROR_NO_MATCHES); g_clear_error (&error); stream = modulemd_module_get_stream_by_NSVCA (m, "stream1", 1, NULL, NULL, &error); g_assert_null (stream); g_assert_error (error, MODULEMD_ERROR, MMD_ERROR_TOO_MANY_MATCHES); g_clear_error (&error); stream = modulemd_module_get_stream_by_NSVCA ( m, "stream1", 1, "context1", NULL, &error); g_assert_nonnull (stream); g_assert_no_error (error); g_assert_cmpstr ( modulemd_module_stream_get_stream_name (stream), ==, "stream1"); g_assert_cmpint (modulemd_module_stream_get_version (stream), ==, 1); g_assert_cmpstr ( modulemd_module_stream_get_context (stream), ==, "context1"); g_assert_cmpstr (modulemd_module_stream_v2_get_summary ( MODULEMD_MODULE_STREAM_V2 (stream), NULL), ==, "Stream 1"); g_assert_cmpstr (modulemd_module_stream_v2_get_summary ( MODULEMD_MODULE_STREAM_V2 (stream), "nl_NL"), ==, "Een test omschrijving"); o = modulemd_module_stream_v2_get_obsoletes_resolved ( (ModulemdModuleStreamV2 *)stream); g_assert_nonnull (o); g_assert_cmpstr ( modulemd_obsoletes_get_message (o), ==, "obsolete1 added to context1"); stream = modulemd_module_get_stream_by_NSVCA ( m, "stream1", 1, "context2", NULL, &error); g_assert_nonnull (stream); g_assert_no_error (error); g_assert_cmpstr ( modulemd_module_stream_get_stream_name (stream), ==, "stream1"); g_assert_cmpint (modulemd_module_stream_get_version (stream), ==, 1); g_assert_cmpstr ( modulemd_module_stream_get_context (stream), ==, "context2"); o = modulemd_module_stream_v2_get_obsoletes_resolved ( (ModulemdModuleStreamV2 *)stream); g_assert_nonnull (o); g_assert_cmpstr ( modulemd_obsoletes_get_message (o), ==, "obsolete2 added to all stream"); stream = modulemd_module_get_stream_by_NSVCA ( m, "stream1", 3, "context1", NULL, &error); g_assert_null (stream); g_assert_error (error, MODULEMD_ERROR, MMD_ERROR_NO_MATCHES); g_clear_error (&error); stream = modulemd_module_get_stream_by_NSVCA ( m, "stream1", 3, "context2", NULL, &error); g_assert_nonnull (stream); g_assert_no_error (error); o = modulemd_module_stream_v2_get_obsoletes_resolved ( (ModulemdModuleStreamV2 *)stream); g_assert_nonnull (o); g_assert_cmpstr ( modulemd_obsoletes_get_message (o), ==, "obsolete2 added to all stream"); g_assert_cmpstr ( modulemd_module_stream_get_stream_name (stream), ==, "stream1"); g_assert_cmpint (modulemd_module_stream_get_version (stream), ==, 3); g_assert_cmpstr ( modulemd_module_stream_get_context (stream), ==, "context2"); stream = modulemd_module_get_stream_by_NSVCA ( m, "stream2", 42, "context42", NULL, &error); g_assert_nonnull (stream); g_assert_no_error (error); g_assert_cmpstr ( modulemd_module_stream_get_stream_name (stream), ==, "stream2"); g_assert_cmpint (modulemd_module_stream_get_version (stream), ==, 42); g_assert_cmpstr ( modulemd_module_stream_get_context (stream), ==, "context42"); g_assert_cmpstr (modulemd_module_stream_v2_get_summary ( MODULEMD_MODULE_STREAM_V2 (stream), NULL), ==, "Stream 2"); g_assert_cmpstr (modulemd_module_stream_v2_get_summary ( MODULEMD_MODULE_STREAM_V2 (stream), "en_GB"), ==, "A test summary"); } static void module_test_get_stream_names (void) { g_autoptr (ModulemdModule) m = NULL; g_autoptr (ModulemdModuleStream) stream = NULL; g_auto (GStrv) list = NULL; /*Test module with no streams*/ m = modulemd_module_new ("testmodule"); list = modulemd_module_get_stream_names_as_strv (m); g_assert_nonnull (list); g_assert_cmpint (g_strv_length (list), ==, 0); g_clear_pointer (&list, g_strfreev); g_clear_object (&m); /*Test module with all same stream names*/ m = modulemd_module_new ("testmodule"); stream = modulemd_module_stream_new ( MD_MODULESTREAM_VERSION_TWO, "testmodule", "stream1"); modulemd_module_add_stream (m, stream, MD_MODULESTREAM_VERSION_TWO, NULL); g_clear_object (&stream); stream = modulemd_module_stream_new ( MD_MODULESTREAM_VERSION_TWO, "testmodule", "stream1"); modulemd_module_add_stream (m, stream, MD_MODULESTREAM_VERSION_TWO, NULL); g_clear_object (&stream); list = modulemd_module_get_stream_names_as_strv (m); g_assert_nonnull (list); g_assert_cmpint (g_strv_length (list), ==, 1); g_clear_pointer (&list, g_strfreev); g_clear_object (&m); /*Test module with all different stream names*/ m = modulemd_module_new ("testmodule"); stream = modulemd_module_stream_new ( MD_MODULESTREAM_VERSION_TWO, "testmodule", "stream1"); modulemd_module_add_stream (m, stream, MD_MODULESTREAM_VERSION_TWO, NULL); g_clear_object (&stream); stream = modulemd_module_stream_new ( MD_MODULESTREAM_VERSION_TWO, "testmodule", "stream2"); modulemd_module_add_stream (m, stream, MD_MODULESTREAM_VERSION_TWO, NULL); g_clear_object (&stream); stream = modulemd_module_stream_new ( MD_MODULESTREAM_VERSION_TWO, "testmodule", "stream3"); modulemd_module_add_stream (m, stream, MD_MODULESTREAM_VERSION_TWO, NULL); g_clear_object (&stream); list = modulemd_module_get_stream_names_as_strv (m); g_assert_nonnull (list); g_assert_cmpint (g_strv_length (list), ==, 3); g_assert_cmpstr (list[0], ==, "stream1"); g_assert_cmpstr (list[1], ==, "stream2"); g_assert_cmpstr (list[2], ==, "stream3"); g_clear_pointer (&list, g_strfreev); g_clear_object (&m); /*Test module with some same/different stream names*/ m = modulemd_module_new ("testmodule"); stream = modulemd_module_stream_new ( MD_MODULESTREAM_VERSION_TWO, "testmodule", "stream1"); modulemd_module_add_stream (m, stream, MD_MODULESTREAM_VERSION_TWO, NULL); g_clear_object (&stream); stream = modulemd_module_stream_new ( MD_MODULESTREAM_VERSION_TWO, "testmodule", "stream1"); modulemd_module_add_stream (m, stream, MD_MODULESTREAM_VERSION_TWO, NULL); g_clear_object (&stream); stream = modulemd_module_stream_new ( MD_MODULESTREAM_VERSION_TWO, "testmodule", "stream2"); modulemd_module_add_stream (m, stream, MD_MODULESTREAM_VERSION_TWO, NULL); g_clear_object (&stream); list = modulemd_module_get_stream_names_as_strv (m); g_assert_nonnull (list); g_assert_cmpint (g_strv_length (list), ==, 2); g_assert_cmpstr (list[0], ==, "stream1"); g_assert_cmpstr (list[1], ==, "stream2"); g_clear_pointer (&list, g_strfreev); g_clear_object (&m); } static void modulemd_test_remove_streams (void) { g_autoptr (ModulemdModuleIndex) f29 = NULL; g_autoptr (ModulemdModuleIndex) f29_updates = NULL; g_autoptr (ModulemdModuleIndex) index = NULL; g_autoptr (ModulemdModuleIndexMerger) merger = NULL; ModulemdModule *nodejs_module = NULL; g_autoptr (GError) error = NULL; g_autoptr (GPtrArray) failures = NULL; g_autofree gchar *yaml_path = NULL; gboolean ret; /* Get the f29 and f29-updates indexes. They have multiple streams and * versions for the 'dwm' module */ f29 = modulemd_module_index_new (); yaml_path = g_strdup_printf ("%s/f29.yaml", g_getenv ("TEST_DATA_PATH")); ret = modulemd_module_index_update_from_file ( f29, yaml_path, TRUE, &failures, &error); modulemd_subdocument_info_debug_dump_failures (failures); g_assert_no_error (error); g_assert_true (ret); g_assert_cmpint (failures->len, ==, 0); g_clear_pointer (&yaml_path, g_free); g_clear_pointer (&failures, g_ptr_array_unref); f29_updates = modulemd_module_index_new (); yaml_path = g_strdup_printf ("%s/f29-updates.yaml", g_getenv ("TEST_DATA_PATH")); ret = modulemd_module_index_update_from_file ( f29_updates, yaml_path, TRUE, &failures, &error); g_assert_no_error (error); g_assert_true (ret); g_assert_cmpint (failures->len, ==, 0); g_clear_pointer (&yaml_path, g_free); g_clear_pointer (&failures, g_ptr_array_unref); /* Merge them so we're operating on a combined index */ merger = modulemd_module_index_merger_new (); modulemd_module_index_merger_associate_index (merger, f29, 0); modulemd_module_index_merger_associate_index (merger, f29_updates, 0); index = modulemd_module_index_merger_resolve (merger, &error); g_assert_nonnull (index); g_assert_no_error (error); /* Now get the 'nodejs' module */ nodejs_module = modulemd_module_index_get_module (index, "nodejs"); g_assert_nonnull (nodejs_module); g_assert_true (MODULEMD_IS_MODULE (nodejs_module)); g_assert_cmpuint ( modulemd_module_get_all_streams (nodejs_module)->len, ==, 4); /* Remove the `nodejs:10:20181101171344:6c81f848:x86_64` item from the * index. */ modulemd_module_remove_streams_by_NSVCA ( nodejs_module, "10", 20181101171344, "6c81f848", "x86_64"); /* This should remove exactly one item */ g_assert_cmpuint ( modulemd_module_get_all_streams (nodejs_module)->len, ==, 3); /* Try to remove the same stream from the index a second time, which should * do nothing. */ modulemd_module_remove_streams_by_NSVCA ( nodejs_module, "10", 20181101171344, "6c81f848", "x86_64"); /* This should remove exactly one item */ g_assert_cmpuint ( modulemd_module_get_all_streams (nodejs_module)->len, ==, 3); /* Remove all dwm stream objects for the "11" stream from the index. */ modulemd_module_remove_streams_by_name (nodejs_module, "11"); /* This should remove two items */ g_assert_cmpuint ( modulemd_module_get_all_streams (nodejs_module)->len, ==, 2); } static void module_test_search_streams_by_glob (void) { gboolean ret; g_autoptr (ModulemdModuleIndex) index = modulemd_module_index_new (); g_autoptr (GError) error = NULL; g_autoptr (GPtrArray) failures = NULL; g_autoptr (GPtrArray) streams = NULL; g_autofree gchar *yaml_path = NULL; ModulemdModule *module = NULL; yaml_path = g_strdup_printf ("%s/search_streams/search_streams.yaml", g_getenv ("TEST_DATA_PATH")); ret = modulemd_module_index_update_from_file ( index, yaml_path, TRUE, &failures, &error); g_assert_no_error (error); g_assert_true (ret); module = modulemd_module_index_get_module (index, "nodejs"); g_assert_nonnull (module); streams = modulemd_module_search_streams_by_glob (module, NULL, NULL, NULL, NULL); g_assert_nonnull (streams); g_assert_cmpint (streams->len, ==, 3); g_clear_pointer (&streams, g_ptr_array_unref); streams = modulemd_module_search_streams_by_glob (module, "8", NULL, NULL, NULL); g_assert_nonnull (streams); g_assert_cmpint (streams->len, ==, 1); g_clear_pointer (&streams, g_ptr_array_unref); streams = modulemd_module_search_streams_by_glob (module, "7", NULL, NULL, NULL); g_assert_nonnull (streams); g_assert_cmpint (streams->len, ==, 0); g_clear_pointer (&streams, g_ptr_array_unref); streams = modulemd_module_search_streams_by_glob (module, NULL, "1", NULL, NULL); g_assert_nonnull (streams); g_assert_cmpint (streams->len, ==, 3); g_clear_pointer (&streams, g_ptr_array_unref); streams = modulemd_module_search_streams_by_glob (module, NULL, "42", NULL, NULL); g_assert_nonnull (streams); g_assert_cmpint (streams->len, ==, 0); g_clear_pointer (&streams, g_ptr_array_unref); streams = modulemd_module_search_streams_by_glob ( module, NULL, NULL, "c2c572ec", NULL); g_assert_nonnull (streams); g_assert_cmpint (streams->len, ==, 3); g_clear_pointer (&streams, g_ptr_array_unref); streams = modulemd_module_search_streams_by_glob ( module, NULL, NULL, "deadbeef", NULL); g_assert_nonnull (streams); g_assert_cmpint (streams->len, ==, 0); g_clear_pointer (&streams, g_ptr_array_unref); streams = modulemd_module_search_streams_by_glob ( module, NULL, NULL, NULL, "x86_64"); g_assert_nonnull (streams); g_assert_cmpint (streams->len, ==, 2); g_clear_pointer (&streams, g_ptr_array_unref); streams = modulemd_module_search_streams_by_glob (module, NULL, NULL, NULL, "i686"); g_assert_nonnull (streams); g_assert_cmpint (streams->len, ==, 0); g_clear_pointer (&streams, g_ptr_array_unref); } static void module_test_search_streams_by_nsvca_glob (void) { gboolean ret; g_autoptr (ModulemdModuleIndex) index = modulemd_module_index_new (); g_autoptr (GError) error = NULL; g_autoptr (GPtrArray) failures = NULL; g_autoptr (GPtrArray) streams = NULL; g_autofree gchar *yaml_path = NULL; ModulemdModule *module = NULL; yaml_path = g_strdup_printf ("%s/search_streams/search_streams.yaml", g_getenv ("TEST_DATA_PATH")); ret = modulemd_module_index_update_from_file ( index, yaml_path, TRUE, &failures, &error); g_assert_no_error (error); g_assert_true (ret); module = modulemd_module_index_get_module (index, "nodejs"); g_assert_nonnull (module); streams = modulemd_module_search_streams_by_nsvca_glob (module, "*"); g_assert_nonnull (streams); g_assert_cmpint (streams->len, ==, 3); g_clear_pointer (&streams, g_ptr_array_unref); streams = modulemd_module_search_streams_by_nsvca_glob (module, NULL); g_assert_nonnull (streams); g_assert_cmpint (streams->len, ==, 3); g_clear_pointer (&streams, g_ptr_array_unref); streams = modulemd_module_search_streams_by_nsvca_glob (module, "nodejs*"); g_assert_nonnull (streams); g_assert_cmpint (streams->len, ==, 3); g_clear_pointer (&streams, g_ptr_array_unref); streams = modulemd_module_search_streams_by_nsvca_glob (module, "nodejs:?*"); g_assert_nonnull (streams); g_assert_cmpint (streams->len, ==, 3); g_clear_pointer (&streams, g_ptr_array_unref); streams = modulemd_module_search_streams_by_nsvca_glob (module, "*8*"); g_assert_nonnull (streams); g_assert_cmpint (streams->len, ==, 2); g_clear_pointer (&streams, g_ptr_array_unref); } static void module_test_get_newest_active_obsoletes (void) { ModulemdModule *m = NULL; ModulemdObsoletes *o = NULL; m = modulemd_module_new ("testmodule"); o = modulemd_obsoletes_new ( 1, 3, "testmodule", "stream1", "The newest active obsolete"); modulemd_obsoletes_set_eol_date (o, 201807011200); modulemd_module_add_obsoletes (m, o); g_clear_pointer (&o, g_object_unref); o = modulemd_obsoletes_new ( 1, 1, "testmodule", "stream1", "obsolete2 added to all stream"); modulemd_obsoletes_set_eol_date (o, 2); modulemd_module_add_obsoletes (m, o); g_clear_pointer (&o, g_object_unref); o = modulemd_obsoletes_new ( 1, 1, "testmodule", "stream1", "obsolete3 added to all stream"); modulemd_obsoletes_set_eol_date (o, 291807011200); modulemd_module_add_obsoletes (m, o); g_clear_pointer (&o, g_object_unref); o = modulemd_module_get_newest_active_obsoletes (m, "stream1", NULL); g_assert_nonnull (o); g_assert_cmpstr ( modulemd_obsoletes_get_message (o), ==, "The newest active obsolete"); g_clear_object (&m); } static void module_test_get_obsoletes (void) { ModulemdModule *m = NULL; ModulemdModuleStream *stream = NULL; ModulemdObsoletes *o = NULL; m = modulemd_module_new ("testmodule"); stream = modulemd_module_stream_new (2, "testmodule", "stream1"); modulemd_module_add_stream (m, stream, MD_MODULESTREAM_VERSION_UNSET, NULL); g_clear_object (&stream); stream = modulemd_module_stream_new (2, "testmodule", "stream2"); modulemd_module_add_stream (m, stream, MD_MODULESTREAM_VERSION_UNSET, NULL); g_clear_object (&stream); stream = modulemd_module_stream_new (2, "testmodule", "stream3"); modulemd_module_add_stream (m, stream, MD_MODULESTREAM_VERSION_UNSET, NULL); g_clear_object (&stream); o = modulemd_obsoletes_new ( 1, 2, "testmodule", "stream1", "obsolete1 added to all stream1"); modulemd_module_add_obsoletes (m, o); g_clear_pointer (&o, g_object_unref); o = modulemd_obsoletes_new ( 1, 3, "testmodule", "stream2", "obsolete2 added to all stream2"); modulemd_module_add_obsoletes (m, o); g_clear_pointer (&o, g_object_unref); o = modulemd_obsoletes_new ( 1, 3, "testmodule", "stream2", "obsolete3 added to all stream2"); modulemd_obsoletes_set_module_context (o, "context"); modulemd_module_add_obsoletes (m, o); g_clear_pointer (&o, g_object_unref); GPtrArray *obsoletes = modulemd_module_get_obsoletes (m); g_assert_cmpint (obsoletes->len, ==, 3); g_clear_object (&m); } static void module_test_add_stream_to_module_with_obsoletes (void) { ModulemdModule *m = NULL; GPtrArray *streams = NULL; ModulemdModuleStream *s = NULL; ModulemdObsoletes *o = NULL; m = modulemd_module_new ("nodejs"); g_assert_nonnull (m); o = modulemd_obsoletes_new (1, 3, "nodejs", "8.0", "test message"); modulemd_obsoletes_set_module_context (o, "42"); modulemd_obsoletes_set_obsoleted_by (o, "nodejs", "12"); modulemd_module_add_obsoletes (m, o); g_clear_pointer (&o, g_object_unref); s = modulemd_module_stream_new (MD_MODULESTREAM_VERSION_TWO, "nodejs", "8.0"); modulemd_module_stream_set_context (s, "42"); modulemd_module_add_stream (m, s, MD_MODULESTREAM_VERSION_TWO, NULL); g_clear_pointer (&s, g_object_unref); streams = modulemd_module_get_all_streams (m); g_assert_cmpint (streams->len, ==, 1); s = g_ptr_array_index (streams, 0); g_assert_nonnull (s); o = modulemd_module_stream_v2_get_obsoletes_resolved ( (ModulemdModuleStreamV2 *)s); g_assert_nonnull (o); g_assert_cmpstr ( modulemd_obsoletes_get_obsoleted_by_module_name (o), ==, "nodejs"); g_assert_cmpstr ( modulemd_obsoletes_get_obsoleted_by_module_stream (o), ==, "12"); g_clear_pointer (&m, g_object_unref); } int main (int argc, char *argv[]) { setlocale (LC_ALL, ""); g_test_init (&argc, &argv, NULL); g_test_bug_base ("https://bugzilla.redhat.com/show_bug.cgi?id="); // Define the tests. g_test_add_func ("/modulemd/v2/module/construct", module_test_construct); g_test_add_func ("/modulemd/v2/module/defaults", module_test_defaults); g_test_add_func ("/modulemd/v2/module/stream_names", module_test_get_stream_names); g_test_add_func ("/modulemd/v2/module/streams", module_test_streams); g_test_add_func ("/modulemd/v2/module/streams/remove", modulemd_test_remove_streams); g_test_add_func ("/modulemd/v2/module/streams/glob", module_test_search_streams_by_glob); g_test_add_func ("/modulemd/v2/module/streams/glob_nsvca", module_test_search_streams_by_nsvca_glob); g_test_add_func ("/modulemd/v2/module/obsoletes/get_newest_active_obsoletes", module_test_get_newest_active_obsoletes); g_test_add_func ("/modulemd/v2/module/obsoletes/get_obsoletes", module_test_get_obsoletes); g_test_add_func ( "/modulemd/v2/module/obsoletes/add_stream_to_module_with_obsoletes", module_test_add_stream_to_module_with_obsoletes); return g_test_run (); } fedora-modularity-libmodulemd-357799c/modulemd/tests/test-modulemd-moduleindex.c000066400000000000000000002137161502446517500301650ustar00rootroot00000000000000/* * This file is part of libmodulemd * Copyright (C) 2018 Red Hat, Inc. * * Fedora-License-Identifier: MIT * SPDX-2.0-License-Identifier: MIT * SPDX-3.0-License-Identifier: MIT * * This program is free software. * For more information on the license, see COPYING. * For more information on free software, see . */ #include "config.h" #include #include #include #include #include #ifdef HAVE_RPMIO #include #endif #include "modulemd.h" #include "modulemd-defaults.h" #include "modulemd-obsoletes.h" #include "modulemd-module-index.h" #include "modulemd-module-stream-v1.h" #include "modulemd-module-stream-v2.h" #include "modulemd-module.h" #include "modulemd-subdocument-info.h" #include "private/glib-extensions.h" #include "private/modulemd-module-private.h" #include "private/modulemd-subdocument-info-private.h" #include "private/modulemd-util.h" #include "private/modulemd-yaml.h" #include "private/test-utils.h" typedef struct _ModuleIndexFixture { } ModuleIndexFixture; static void module_index_test_dump (void) { gboolean ret; g_autoptr (ModulemdModuleIndex) index = NULL; g_autoptr (ModulemdTranslation) translation = NULL; g_autoptr (ModulemdObsoletes) obsoletes = NULL; g_autoptr (ModulemdTranslationEntry) translation_entry = NULL; g_autoptr (ModulemdDefaults) defaults = NULL; g_autoptr (ModulemdModuleStream) stream = NULL; g_autoptr (GError) error = NULL; g_autofree const gchar *string = NULL; /* Construct an Index with some objects */ index = modulemd_module_index_new (); /* First: translations */ translation = modulemd_translation_new (1, "testmodule1", "teststream1", 42); translation_entry = modulemd_translation_entry_new ("ro_TA"); modulemd_translation_entry_set_summary (translation_entry, "Testsummary in ro_TA"); modulemd_translation_set_translation_entry (translation, translation_entry); g_clear_pointer (&translation_entry, g_object_unref); translation_entry = modulemd_translation_entry_new ("nl_NL"); modulemd_translation_entry_set_summary (translation_entry, "Een test omschrijving"); modulemd_translation_set_translation_entry (translation, translation_entry); g_clear_pointer (&translation_entry, g_object_unref); ret = modulemd_module_index_add_translation (index, translation, &error); g_assert_no_error (error); g_assert_true (ret); g_clear_pointer (&translation, g_object_unref); /* Second: defaults */ defaults = modulemd_defaults_new (1, "testmodule1"); ret = modulemd_module_index_add_defaults (index, defaults, &error); g_assert_no_error (error); g_assert_true (ret); g_clear_pointer (&defaults, g_object_unref); /* Third: some obsoletes */ obsoletes = modulemd_obsoletes_new ( 1, 202001012020, "testmodule1", "teststream2", "testmessage"); ret = modulemd_module_index_add_obsoletes (index, obsoletes, &error); g_assert_no_error (error); g_assert_true (ret); g_clear_pointer (&obsoletes, g_object_unref); /* Fourth: some streams */ stream = (ModulemdModuleStream *)modulemd_module_stream_v1_new ( "testmodule1", "teststream1"); modulemd_module_stream_set_version (stream, 1); modulemd_module_stream_set_context (stream, "deadbeef"); modulemd_module_stream_v1_set_summary (MODULEMD_MODULE_STREAM_V1 (stream), "A test stream"); modulemd_module_stream_v1_set_description ( MODULEMD_MODULE_STREAM_V1 (stream), "A test stream's description"); modulemd_module_stream_v1_add_module_license ( MODULEMD_MODULE_STREAM_V1 (stream), "DUMMY1"); ret = modulemd_module_index_add_module_stream (index, stream, &error); g_assert_no_error (error); g_assert_true (ret); g_clear_pointer (&stream, g_object_unref); stream = (ModulemdModuleStream *)modulemd_module_stream_v2_new ( "testmodule1", "teststream2"); modulemd_module_stream_set_version (stream, 2); modulemd_module_stream_set_context (stream, "c0ff33"); modulemd_module_stream_v2_set_summary (MODULEMD_MODULE_STREAM_V2 (stream), "A second stream"); modulemd_module_stream_v2_set_description ( MODULEMD_MODULE_STREAM_V2 (stream), "A second stream's description"); modulemd_module_stream_v2_add_module_license ( MODULEMD_MODULE_STREAM_V2 (stream), "DUMMY2"); ret = modulemd_module_index_add_module_stream (index, stream, &error); g_assert_no_error (error); g_assert_true (ret); g_clear_pointer (&stream, g_object_unref); /* And now... emit */ string = modulemd_module_index_dump_to_string (index, &error); g_assert_no_error (error); g_assert_nonnull (string); /* Verify that all streams and defaults have been upgraded to the highest * version added */ g_assert_cmpstr (string, ==, "---\n" "document: modulemd-defaults\n" "version: 1\n" "data:\n" " module: testmodule1\n" "...\n" "---\n" "document: modulemd-obsoletes\n" "version: 1\n" "data:\n" " modified: 2020-01-01T20:20Z\n" " module: testmodule1\n" " stream: \"teststream2\"\n" " message: testmessage\n" "...\n" "---\n" "document: modulemd-translations\n" "version: 1\n" "data:\n" " module: testmodule1\n" " stream: \"teststream1\"\n" " modified: 42\n" " translations:\n" " nl_NL:\n" " summary: Een test omschrijving\n" " ro_TA:\n" " summary: Testsummary in ro_TA\n" "...\n" "---\n" "document: modulemd\n" "version: 2\n" "data:\n" " name: testmodule1\n" " stream: \"teststream1\"\n" " version: 1\n" " context: deadbeef\n" " summary: A test stream\n" " description: >-\n" " A test stream's description\n" " license:\n" " module:\n" " - DUMMY1\n" "...\n" "---\n" "document: modulemd\n" "version: 2\n" "data:\n" " name: testmodule1\n" " stream: \"teststream2\"\n" " version: 2\n" " context: c0ff33\n" " summary: A second stream\n" " description: >-\n" " A second stream's description\n" " license:\n" " module:\n" " - DUMMY2\n" "...\n"); } static void module_index_test_read (void) { gboolean ret; g_autoptr (ModulemdModuleIndex) index = NULL; g_autoptr (GError) error = NULL; g_autoptr (GPtrArray) failures = NULL; ModulemdSubdocumentInfo *subdoc = NULL; g_autofree gchar *yaml_path = NULL; g_auto (GStrv) module_names = NULL; /* Read the specification files all in */ index = modulemd_module_index_new (); /* The two stream definitions */ yaml_path = g_strdup_printf ("%s/yaml_specs/modulemd_stream_v1.yaml", g_getenv ("MESON_SOURCE_ROOT")); ret = modulemd_module_index_update_from_file ( index, yaml_path, TRUE, &failures, &error); modulemd_subdocument_info_debug_dump_failures (failures); g_assert_no_error (error); g_assert_true (ret); g_assert_cmpint (failures->len, ==, 0); g_clear_pointer (&yaml_path, g_free); g_clear_pointer (&failures, g_ptr_array_unref); yaml_path = g_strdup_printf ("%s/yaml_specs/modulemd_stream_v2.yaml", g_getenv ("MESON_SOURCE_ROOT")); ret = modulemd_module_index_update_from_file ( index, yaml_path, TRUE, &failures, &error); modulemd_subdocument_info_debug_dump_failures (failures); g_assert_no_error (error); g_assert_true (ret); g_assert_cmpint (failures->len, ==, 0); g_clear_pointer (&yaml_path, g_free); g_clear_pointer (&failures, g_ptr_array_unref); /* The modulemd-packager v2 definition * Reading a packager document into an index can only be done by calling * modulemd_read_packager_file(). Attempting to read it directly * using modulemd_module_index_update_from_file() should ignore the document * and report it as a failure. */ yaml_path = g_strdup_printf ("%s/yaml_specs/modulemd_packager_v2.yaml", g_getenv ("MESON_SOURCE_ROOT")); ret = modulemd_module_index_update_from_file ( index, yaml_path, TRUE, &failures, &error); modulemd_subdocument_info_debug_dump_failures (failures); g_assert_no_error (error); g_assert_cmpint (failures->len, ==, 1); g_assert_false (ret); g_assert_error ( modulemd_subdocument_info_get_gerror (g_ptr_array_index (failures, 0)), MODULEMD_YAML_ERROR, MMD_YAML_ERROR_PARSE); g_clear_pointer (&yaml_path, g_free); g_clear_pointer (&failures, g_ptr_array_unref); /* the index must still contain only the "foo" module */ module_names = modulemd_module_index_get_module_names_as_strv (index); g_assert_cmpint (g_strv_length (module_names), ==, 1); g_assert_true (g_strv_contains ((const gchar *const *)module_names, "foo")); g_clear_pointer (&module_names, g_strfreev); /* The translation definitions */ yaml_path = g_strdup_printf ("%s/yaml_specs/modulemd_translations_v1.yaml", g_getenv ("MESON_SOURCE_ROOT")); ret = modulemd_module_index_update_from_file ( index, yaml_path, TRUE, &failures, &error); modulemd_subdocument_info_debug_dump_failures (failures); g_assert_no_error (error); g_assert_true (ret); g_assert_cmpint (failures->len, ==, 0); g_clear_pointer (&yaml_path, g_free); g_clear_pointer (&failures, g_ptr_array_unref); /* The obsoletes definitions */ yaml_path = g_strdup_printf ("%s/yaml_specs/modulemd_obsoletes_v1.yaml", g_getenv ("MESON_SOURCE_ROOT")); ret = modulemd_module_index_update_from_file ( index, yaml_path, TRUE, &failures, &error); modulemd_subdocument_info_debug_dump_failures (failures); g_assert_no_error (error); g_assert_true (ret); g_assert_cmpint (failures->len, ==, 0); g_clear_pointer (&yaml_path, g_free); g_clear_pointer (&failures, g_ptr_array_unref); /* The defaults definitions */ yaml_path = g_strdup_printf ("%s/yaml_specs/modulemd_defaults_v1.yaml", g_getenv ("MESON_SOURCE_ROOT")); ret = modulemd_module_index_update_from_file ( index, yaml_path, TRUE, &failures, &error); modulemd_subdocument_info_debug_dump_failures (failures); g_assert_no_error (error); g_assert_true (ret); g_assert_cmpint (failures->len, ==, 0); g_clear_pointer (&yaml_path, g_free); g_clear_pointer (&failures, g_ptr_array_unref); /* A stream that has nonsense in "data" */ yaml_path = g_strdup_printf ("%s/broken_stream.yaml", g_getenv ("TEST_DATA_PATH")); g_assert_false (modulemd_module_index_update_from_file ( index, yaml_path, TRUE, &failures, &error)); g_assert_no_error (error); g_assert_cmpint (failures->len, ==, 1); subdoc = g_ptr_array_index (failures, 0); g_assert_cmpstr (modulemd_subdocument_info_get_yaml (subdoc), ==, "---\n" "document: modulemd\n" "version: 2\n" "data: foobar\n" "...\n"); g_clear_pointer (&yaml_path, g_free); g_clear_pointer (&failures, g_ptr_array_unref); g_clear_pointer (&error, g_error_free); /* A stream that has nonsense in "data" with NULL error parameter. * It makes sure that subdocument errors are reported independently * from the global error. It used to crash. */ yaml_path = g_strdup_printf ("%s/broken_stream.yaml", g_getenv ("TEST_DATA_PATH")); g_assert_false (modulemd_module_index_update_from_file ( index, yaml_path, TRUE, &failures, NULL)); g_assert_cmpint (failures->len, ==, 1); subdoc = g_ptr_array_index (failures, 0); g_assert_error (modulemd_subdocument_info_get_gerror (subdoc), MODULEMD_YAML_ERROR, MMD_YAML_ERROR_PARSE); g_assert_cmpstr (modulemd_subdocument_info_get_yaml (subdoc), ==, "---\n" "document: modulemd\n" "version: 2\n" "data: foobar\n" "...\n"); g_clear_pointer (&yaml_path, g_free); g_clear_pointer (&failures, g_ptr_array_unref); g_clear_pointer (&error, g_error_free); /* A non-existing file */ yaml_path = g_strdup_printf ("%s/nothinghere.yaml", g_getenv ("TEST_DATA_PATH")); g_assert_false (modulemd_module_index_update_from_file ( index, yaml_path, TRUE, &failures, &error)); g_assert_nonnull (error); g_assert_cmpint (failures->len, ==, 0); g_clear_pointer (&yaml_path, g_free); g_clear_pointer (&failures, g_ptr_array_unref); g_clear_pointer (&error, g_error_free); /* An empty stream */ g_assert_false (modulemd_module_index_update_from_stream ( index, NULL, TRUE, &failures, &error)); g_assert_nonnull (error); g_assert_cmpint (failures->len, ==, 0); g_clear_pointer (&yaml_path, g_free); g_clear_pointer (&failures, g_ptr_array_unref); g_clear_pointer (&error, g_error_free); /* An empty string */ g_assert_false (modulemd_module_index_update_from_string ( index, NULL, TRUE, &failures, &error)); g_assert_nonnull (error); g_assert_cmpint (failures->len, ==, 0); g_clear_pointer (&yaml_path, g_free); g_clear_pointer (&failures, g_ptr_array_unref); g_clear_pointer (&error, g_error_free); /* * Also try to ingest a TranslationEntry. * This should fail, and return a failure, since it's not a top-level subdoc. */ yaml_path = g_strdup_printf ("%s/te.yaml", g_getenv ("TEST_DATA_PATH")); g_assert_false (modulemd_module_index_update_from_file ( index, yaml_path, TRUE, &failures, &error)); g_assert_no_error (error); g_assert_cmpint (failures->len, ==, 1); g_clear_pointer (&yaml_path, g_free); g_clear_pointer (&failures, g_ptr_array_unref); /* Actually verifying the contents is left to Python tests */ } static void module_index_test_read_mixed (void) { gboolean ret; g_autoptr (ModulemdModuleIndex) index = NULL; g_autofree gchar *yaml_path = NULL; g_autoptr (GPtrArray) failures = NULL; g_autoptr (GError) error = NULL; g_autofree gchar *output = NULL; index = modulemd_module_index_new (); yaml_path = g_strdup_printf ("%s/long-valid.yaml", g_getenv ("TEST_DATA_PATH")); g_assert_nonnull (yaml_path); ret = modulemd_module_index_update_from_file ( index, yaml_path, TRUE, &failures, &error); modulemd_subdocument_info_debug_dump_failures (failures); g_assert_no_error (error); g_assert_true (ret); g_assert_cmpint (failures->len, ==, 0); g_clear_pointer (&failures, g_ptr_array_unref); /* Verify that we can output it cleanly */ output = modulemd_module_index_dump_to_string (index, &error); g_assert_nonnull (output); g_assert_null (error); } static void module_index_test_read_mixed_packager (void) { gboolean ret; g_autoptr (ModulemdModuleIndex) index = NULL; g_autofree gchar *yaml_path = NULL; g_autoptr (GPtrArray) failures = NULL; g_autoptr (GError) error = NULL; g_autofree gchar *output = NULL; g_auto (GStrv) module_names = NULL; index = modulemd_module_index_new (); /* Reading a packager document into an index can only be done by calling * modulemd_read_packager_file(). Attempting to directly read a file * containing a mix of stream and packager documents using * modulemd_module_index_update_from_file() should trigger errors and * ignore the packager documents while successfully loading the streams. */ yaml_path = g_strdup_printf ("%s/stream_packager_mix.yaml", g_getenv ("TEST_DATA_PATH")); g_assert_nonnull (yaml_path); ret = modulemd_module_index_update_from_file ( index, yaml_path, TRUE, &failures, &error); modulemd_subdocument_info_debug_dump_failures (failures); g_assert_no_error (error); g_assert_cmpint (failures->len, ==, 2); g_assert_false (ret); g_assert_error ( modulemd_subdocument_info_get_gerror (g_ptr_array_index (failures, 0)), MODULEMD_YAML_ERROR, MMD_YAML_ERROR_PARSE); g_assert_error ( modulemd_subdocument_info_get_gerror (g_ptr_array_index (failures, 1)), MODULEMD_YAML_ERROR, MMD_YAML_ERROR_PARSE); /* Make sure the streams were successfully loaded into the index */ module_names = modulemd_module_index_get_module_names_as_strv (index); g_assert_cmpint (g_strv_length (module_names), ==, 2); g_assert_true (g_strv_contains ((const gchar *const *)module_names, "foo")); g_assert_true (g_strv_contains ((const gchar *const *)module_names, "qux")); g_clear_pointer (&module_names, g_strfreev); g_clear_pointer (&failures, g_ptr_array_unref); /* Verify that we can output it cleanly */ output = modulemd_module_index_dump_to_string (index, &error); g_assert_nonnull (output); g_assert_null (error); } static void module_index_test_read_unknown (void) { gboolean ret; g_autoptr (ModulemdModuleIndex) index = NULL; g_autofree gchar *yaml_path = NULL; g_autoptr (GPtrArray) failures = NULL; g_autoptr (GError) error = NULL; index = modulemd_module_index_new (); yaml_path = g_strdup_printf ("%s/good-v2-extra-keys.yaml", g_getenv ("TEST_DATA_PATH")); g_assert_nonnull (yaml_path); g_assert_false (modulemd_module_index_update_from_file ( index, yaml_path, TRUE, &failures, &error)); g_assert_cmpint (failures->len, ==, 3); g_clear_pointer (&failures, g_ptr_array_unref); ret = modulemd_module_index_update_from_file ( index, yaml_path, FALSE, &failures, &error); modulemd_subdocument_info_debug_dump_failures (failures); g_assert_no_error (error); g_assert_true (ret); g_assert_cmpint (failures->len, ==, 0); g_clear_pointer (&failures, g_ptr_array_unref); } static void module_index_test_defaults_upgrade (void) { g_autoptr (ModulemdModuleIndex) index = NULL; g_autoptr (ModulemdDefaults) defaults = NULL; gboolean retval; g_autoptr (GError) error = NULL; /* An index without any defaults starts with MD_DEFAULTS_VERSION_UNSET * defaults version. */ index = modulemd_module_index_new (); g_assert_cmpint (modulemd_module_index_get_defaults_mdversion (index), ==, MD_DEFAULTS_VERSION_UNSET); /* Adding a modulemd-defaults-v1 sets defaults version of index to 1. */ defaults = modulemd_defaults_new (MD_DEFAULTS_VERSION_ONE, "foo"); retval = modulemd_module_index_add_defaults (index, defaults, NULL); g_assert_true (retval); g_assert_cmpint (modulemd_module_index_get_defaults_mdversion (index), ==, MD_DEFAULTS_VERSION_ONE); /* Upgrading defaults of an index upgrades a version of the index and * the versions of the particular defaults. */ retval = modulemd_module_index_upgrade_defaults ( index, MD_DEFAULTS_VERSION_LATEST, &error); g_assert_true (retval); g_assert_null (error); g_assert_cmpint (modulemd_module_index_get_defaults_mdversion (index), ==, MD_DEFAULTS_VERSION_LATEST); g_assert_cmpint ( modulemd_defaults_get_mdversion (modulemd_module_get_defaults ( modulemd_module_index_get_module (index, "foo"))), ==, MD_DEFAULTS_VERSION_LATEST); /* Downgrading defaults of an index is forbidden. It returns an error and * does not clobber the index. */ retval = modulemd_module_index_upgrade_defaults ( index, MD_DEFAULTS_VERSION_LATEST - 1, &error); g_assert_false (retval); g_assert_nonnull (error); g_clear_error (&error); g_assert_cmpint (modulemd_module_index_get_defaults_mdversion (index), ==, MD_DEFAULTS_VERSION_LATEST); g_assert_cmpint ( modulemd_defaults_get_mdversion (modulemd_module_get_defaults ( modulemd_module_index_get_module (index, "foo"))), ==, MD_DEFAULTS_VERSION_LATEST); /* Upgrading defaults of an index to an unsupported version fails. It returns * an error and does not clobber the index. */ retval = modulemd_module_index_upgrade_defaults ( index, MD_DEFAULTS_VERSION_LATEST + 1, &error); g_assert_false (retval); g_assert_nonnull (error); g_clear_error (&error); g_assert_cmpint (modulemd_module_index_get_defaults_mdversion (index), ==, MD_DEFAULTS_VERSION_LATEST); g_assert_cmpint ( modulemd_defaults_get_mdversion (modulemd_module_get_defaults ( modulemd_module_index_get_module (index, "foo"))), ==, MD_DEFAULTS_VERSION_LATEST); /* A failure of upgrading a particular default in a range which is * accaptable by the index should return an error. But there is now way of * testing it. */ } static void module_index_test_stream_upgrade (void) { gboolean ret; g_autoptr (ModulemdModuleIndex) index = NULL; g_autoptr (ModulemdModuleStream) stream = NULL; g_autoptr (GError) error = NULL; /* Construct an Index with some objects */ index = modulemd_module_index_new (); /* Add some streams */ /* First, a v1 stream */ stream = (ModulemdModuleStream *)modulemd_module_stream_v1_new ( "testmodule1", "teststream1"); modulemd_module_stream_set_version (stream, 1); modulemd_module_stream_set_context (stream, "deadbeef"); modulemd_module_stream_v1_set_summary (MODULEMD_MODULE_STREAM_V1 (stream), "A test stream"); modulemd_module_stream_v1_set_description ( MODULEMD_MODULE_STREAM_V1 (stream), "A test stream's description"); modulemd_module_stream_v1_add_module_license ( MODULEMD_MODULE_STREAM_V1 (stream), "DUMMY"); ret = modulemd_module_index_add_module_stream (index, stream, &error); g_assert_no_error (error); g_assert_true (ret); g_clear_pointer (&stream, g_object_unref); /* Verify that it was added as a StreamV1 object */ stream = g_object_ref (modulemd_module_get_stream_by_NSVCA ( modulemd_module_index_get_module (index, "testmodule1"), "teststream1", 1, "deadbeef", NULL, &error)); g_assert_nonnull (stream); g_assert_no_error (error); g_assert_cmpint (modulemd_module_stream_get_mdversion (stream), ==, MD_MODULESTREAM_VERSION_ONE); g_clear_object (&stream); /* Next, add a v2 Stream */ stream = (ModulemdModuleStream *)modulemd_module_stream_v2_new ( "testmodule1", "teststream2"); modulemd_module_stream_set_version (stream, 2); modulemd_module_stream_set_context (stream, "c0ff33"); modulemd_module_stream_v2_set_summary (MODULEMD_MODULE_STREAM_V2 (stream), "A second stream"); modulemd_module_stream_v2_set_description ( MODULEMD_MODULE_STREAM_V2 (stream), "A second stream's description"); modulemd_module_stream_v2_add_module_license ( MODULEMD_MODULE_STREAM_V2 (stream), "DUMMY"); ret = modulemd_module_index_add_module_stream (index, stream, &error); g_assert_no_error (error); g_assert_true (ret); g_clear_pointer (&stream, g_object_unref); g_clear_object (&index); /* Construct another Index with some objects */ index = modulemd_module_index_new (); /* Add some streams */ /* First, a v1 stream */ stream = (ModulemdModuleStream *)modulemd_module_stream_v1_new ( "testmodule1", "teststream1"); modulemd_module_stream_set_version (stream, 1); modulemd_module_stream_set_context (stream, "deadbeef"); modulemd_module_stream_v1_set_summary (MODULEMD_MODULE_STREAM_V1 (stream), "A test stream"); modulemd_module_stream_v1_set_description ( MODULEMD_MODULE_STREAM_V1 (stream), "A test stream's description"); modulemd_module_stream_v1_add_module_license ( MODULEMD_MODULE_STREAM_V1 (stream), "DUMMY"); ret = modulemd_module_index_add_module_stream (index, stream, &error); g_assert_no_error (error); g_assert_true (ret); g_clear_pointer (&stream, g_object_unref); /* Verify that it was added as a StreamV1 */ stream = g_object_ref (modulemd_module_get_stream_by_NSVCA ( modulemd_module_index_get_module (index, "testmodule1"), "teststream1", 1, "deadbeef", NULL, &error)); g_assert_nonnull (stream); g_assert_no_error (error); g_assert_cmpint (modulemd_module_stream_get_mdversion (stream), ==, MD_MODULESTREAM_VERSION_ONE); g_clear_object (&stream); /* Next, add a v2 Stream */ stream = (ModulemdModuleStream *)modulemd_module_stream_v2_new ( "testmodule1", "teststream2"); modulemd_module_stream_set_version (stream, 2); modulemd_module_stream_set_context (stream, "c0ff33"); modulemd_module_stream_v2_set_summary (MODULEMD_MODULE_STREAM_V2 (stream), "A second stream"); modulemd_module_stream_v2_set_description ( MODULEMD_MODULE_STREAM_V2 (stream), "A second stream's description"); modulemd_module_stream_v2_add_module_license ( MODULEMD_MODULE_STREAM_V2 (stream), "DUMMY"); ret = modulemd_module_index_add_module_stream (index, stream, &error); g_assert_no_error (error); g_assert_true (ret); g_clear_pointer (&stream, g_object_unref); /* Verify that it was added as a StreamV2 object */ stream = g_object_ref (modulemd_module_get_stream_by_NSVCA ( modulemd_module_index_get_module (index, "testmodule1"), "teststream2", 2, "c0ff33", NULL, &error)); g_assert_nonnull (stream); g_assert_no_error (error); g_assert_cmpint (modulemd_module_stream_get_mdversion (stream), ==, MD_MODULESTREAM_VERSION_TWO); g_clear_object (&stream); g_clear_object (&index); } static void module_index_test_index_upgrade (void) { gboolean ret; g_autoptr (ModulemdModuleIndex) index = NULL; g_autoptr (ModulemdModuleStream) stream = NULL; g_autoptr (ModulemdDefaults) defaults = NULL; g_autoptr (GError) error = NULL; /* * Tests starting with a v1 Index */ /* Construct an Index with some v1 streams */ index = modulemd_module_index_new (); /* Add some streams */ /* Add a v1 streams */ stream = (ModulemdModuleStream *)modulemd_module_stream_v1_new ( "testmodule1", "teststream1"); modulemd_module_stream_set_version (stream, 1); modulemd_module_stream_set_context (stream, "deadbeef"); modulemd_module_stream_v1_set_summary (MODULEMD_MODULE_STREAM_V1 (stream), "A test stream"); modulemd_module_stream_v1_set_description ( MODULEMD_MODULE_STREAM_V1 (stream), "A test stream's description"); modulemd_module_stream_v1_add_module_license ( MODULEMD_MODULE_STREAM_V1 (stream), "DUMMY"); ret = modulemd_module_index_add_module_stream (index, stream, &error); g_assert_no_error (error); g_assert_true (ret); g_clear_pointer (&stream, g_object_unref); /* Verify that it was added as a StreamV1 object */ stream = g_object_ref (modulemd_module_get_stream_by_NSVCA ( modulemd_module_index_get_module (index, "testmodule1"), "teststream1", 1, "deadbeef", NULL, &error)); g_assert_nonnull (stream); g_assert_no_error (error); g_assert_cmpint (modulemd_module_stream_get_mdversion (stream), ==, MD_MODULESTREAM_VERSION_ONE); g_clear_object (&stream); /* Add one more v1 Stream */ stream = (ModulemdModuleStream *)modulemd_module_stream_v1_new ( "testmodule1", "teststream3"); modulemd_module_stream_set_version (stream, 3); modulemd_module_stream_set_context (stream, "badfeed"); modulemd_module_stream_v1_set_summary (MODULEMD_MODULE_STREAM_V1 (stream), "A test stream"); modulemd_module_stream_v1_set_description ( MODULEMD_MODULE_STREAM_V1 (stream), "A test stream's description"); modulemd_module_stream_v1_add_module_license ( MODULEMD_MODULE_STREAM_V1 (stream), "DUMMY"); ret = modulemd_module_index_add_module_stream (index, stream, &error); g_assert_no_error (error); g_assert_true (ret); g_clear_pointer (&stream, g_object_unref); /* Verify that it was added as a StreamV1 object */ stream = g_object_ref (modulemd_module_get_stream_by_NSVCA ( modulemd_module_index_get_module (index, "testmodule1"), "teststream3", 3, "badfeed", NULL, &error)); g_assert_nonnull (stream); g_assert_no_error (error); g_assert_cmpint (modulemd_module_stream_get_mdversion (stream), ==, MD_MODULESTREAM_VERSION_ONE); g_clear_object (&stream); /* Add some defaults */ defaults = modulemd_defaults_new (1, "testmodule1"); ret = modulemd_module_index_add_defaults (index, defaults, &error); g_assert_no_error (error); g_assert_true (ret); g_clear_pointer (&defaults, g_object_unref); /* Verify that the index is at stream and defaults v1 */ g_assert_cmpint (modulemd_module_index_get_stream_mdversion (index), ==, MD_MODULESTREAM_VERSION_ONE); g_assert_cmpint (modulemd_module_index_get_defaults_mdversion (index), ==, MD_MODULESTREAM_VERSION_ONE); /* Verify that upgrades to the same stream version work. */ g_assert_true (modulemd_module_index_upgrade_streams ( index, MD_MODULESTREAM_VERSION_ONE, NULL)); g_assert_cmpint (modulemd_module_index_get_stream_mdversion (index), ==, MD_MODULESTREAM_VERSION_ONE); stream = g_object_ref (modulemd_module_get_stream_by_NSVCA ( modulemd_module_index_get_module (index, "testmodule1"), "teststream1", 1, "deadbeef", NULL, &error)); g_assert_nonnull (stream); g_assert_no_error (error); g_assert_cmpint (modulemd_module_stream_get_mdversion (stream), ==, MD_MODULESTREAM_VERSION_ONE); g_clear_object (&stream); stream = g_object_ref (modulemd_module_get_stream_by_NSVCA ( modulemd_module_index_get_module (index, "testmodule1"), "teststream3", 3, "badfeed", NULL, &error)); g_assert_nonnull (stream); g_assert_no_error (error); g_assert_cmpint (modulemd_module_stream_get_mdversion (stream), ==, MD_MODULESTREAM_VERSION_ONE); g_clear_object (&stream); /* Verify that upgrade from stream v1 to v2 is allowed */ ret = modulemd_module_index_upgrade_streams ( index, MD_MODULESTREAM_VERSION_TWO, &error); g_assert_no_error (error); g_assert_true (ret); g_clear_error (&error); /* confirm index and original v1 object are upgraded to stream v2 */ g_assert_cmpint (modulemd_module_index_get_stream_mdversion (index), ==, MD_MODULESTREAM_VERSION_TWO); stream = g_object_ref (modulemd_module_get_stream_by_NSVCA ( modulemd_module_index_get_module (index, "testmodule1"), "teststream1", 1, "deadbeef", NULL, &error)); g_assert_no_error (error); g_assert_nonnull (stream); g_assert_cmpint (modulemd_module_stream_get_mdversion (stream), ==, MD_MODULESTREAM_VERSION_TWO); g_clear_object (&stream); g_clear_object (&index); /* * Tests starting with a v2 Index */ /* Construct an Index with some v2 objects */ index = modulemd_module_index_new (); /* Add some streams */ /* Add a v2 streams */ stream = (ModulemdModuleStream *)modulemd_module_stream_v2_new ( "testmodule1", "teststream1"); modulemd_module_stream_set_version (stream, 1); modulemd_module_stream_set_context (stream, "deadbeef"); modulemd_module_stream_v2_set_summary (MODULEMD_MODULE_STREAM_V2 (stream), "A test stream"); modulemd_module_stream_v2_set_description ( MODULEMD_MODULE_STREAM_V2 (stream), "A test stream's description"); modulemd_module_stream_v2_add_module_license ( MODULEMD_MODULE_STREAM_V2 (stream), "DUMMY"); ret = modulemd_module_index_add_module_stream (index, stream, &error); g_assert_no_error (error); g_assert_true (ret); g_clear_pointer (&stream, g_object_unref); /* Verify that it was added as a StreamV2 object */ stream = g_object_ref (modulemd_module_get_stream_by_NSVCA ( modulemd_module_index_get_module (index, "testmodule1"), "teststream1", 1, "deadbeef", NULL, &error)); g_assert_nonnull (stream); g_assert_no_error (error); g_assert_cmpint (modulemd_module_stream_get_mdversion (stream), ==, MD_MODULESTREAM_VERSION_TWO); g_clear_object (&stream); /* Add one more v2 Stream */ stream = (ModulemdModuleStream *)modulemd_module_stream_v2_new ( "testmodule1", "teststream3"); modulemd_module_stream_set_version (stream, 3); modulemd_module_stream_set_context (stream, "badfeed"); modulemd_module_stream_v2_set_summary (MODULEMD_MODULE_STREAM_V2 (stream), "A test stream"); modulemd_module_stream_v2_set_description ( MODULEMD_MODULE_STREAM_V2 (stream), "A test stream's description"); modulemd_module_stream_v2_add_module_license ( MODULEMD_MODULE_STREAM_V2 (stream), "DUMMY"); ret = modulemd_module_index_add_module_stream (index, stream, &error); g_assert_no_error (error); g_assert_true (ret); g_clear_pointer (&stream, g_object_unref); /* Verify that it was added as a StreamV2 object */ stream = g_object_ref (modulemd_module_get_stream_by_NSVCA ( modulemd_module_index_get_module (index, "testmodule1"), "teststream3", 3, "badfeed", NULL, &error)); g_assert_nonnull (stream); g_assert_no_error (error); g_assert_cmpint (modulemd_module_stream_get_mdversion (stream), ==, MD_MODULESTREAM_VERSION_TWO); g_clear_object (&stream); /* Add some defaults */ defaults = modulemd_defaults_new (1, "testmodule1"); ret = modulemd_module_index_add_defaults (index, defaults, &error); g_assert_no_error (error); g_assert_true (ret); g_clear_pointer (&defaults, g_object_unref); /* Verify that the index is at stream v2 and defaults v1 */ g_assert_cmpint (modulemd_module_index_get_stream_mdversion (index), ==, MD_MODULESTREAM_VERSION_TWO); g_assert_cmpint (modulemd_module_index_get_defaults_mdversion (index), ==, MD_MODULESTREAM_VERSION_ONE); /* Verify that upgrades to the same stream version work. */ g_assert_true (modulemd_module_index_upgrade_streams ( index, MD_MODULESTREAM_VERSION_TWO, NULL)); g_assert_cmpint (modulemd_module_index_get_stream_mdversion (index), ==, MD_MODULESTREAM_VERSION_TWO); stream = g_object_ref (modulemd_module_get_stream_by_NSVCA ( modulemd_module_index_get_module (index, "testmodule1"), "teststream1", 1, "deadbeef", NULL, &error)); g_assert_nonnull (stream); g_assert_no_error (error); g_assert_cmpint (modulemd_module_stream_get_mdversion (stream), ==, MD_MODULESTREAM_VERSION_TWO); g_clear_object (&stream); stream = g_object_ref (modulemd_module_get_stream_by_NSVCA ( modulemd_module_index_get_module (index, "testmodule1"), "teststream3", 3, "badfeed", NULL, &error)); g_assert_nonnull (stream); g_assert_no_error (error); g_assert_cmpint (modulemd_module_stream_get_mdversion (stream), ==, MD_MODULESTREAM_VERSION_TWO); g_clear_object (&stream); /* Verify that downgrade from stream v2 to v1 is forbidden */ ret = modulemd_module_index_upgrade_streams ( index, MD_MODULESTREAM_VERSION_ONE, &error); g_assert_false (ret); g_assert_error (error, MODULEMD_ERROR, MMD_ERROR_UPGRADE); g_clear_error (&error); /* confirm index and original v2 object are still stream v2 */ g_assert_cmpint (modulemd_module_index_get_stream_mdversion (index), ==, MD_MODULESTREAM_VERSION_TWO); stream = g_object_ref (modulemd_module_get_stream_by_NSVCA ( modulemd_module_index_get_module (index, "testmodule1"), "teststream1", 1, "deadbeef", NULL, &error)); g_assert_no_error (error); g_assert_nonnull (stream); g_assert_cmpint (modulemd_module_stream_get_mdversion (stream), ==, MD_MODULESTREAM_VERSION_TWO); g_clear_object (&stream); g_clear_object (&index); } static void module_index_test_remove_module (void) { gboolean ret; g_autoptr (ModulemdModuleIndex) index = NULL; g_autofree gchar *yaml_path = NULL; g_autoptr (GPtrArray) failures = NULL; g_autoptr (GError) error = NULL; index = modulemd_module_index_new (); yaml_path = g_strdup_printf ("%s/long-valid.yaml", g_getenv ("TEST_DATA_PATH")); g_assert_nonnull (yaml_path); ret = modulemd_module_index_update_from_file ( index, yaml_path, TRUE, &failures, &error); modulemd_subdocument_info_debug_dump_failures (failures); g_assert_no_error (error); g_assert_true (ret); g_assert_cmpint (failures->len, ==, 0); g_clear_pointer (&failures, g_ptr_array_unref); /* Verify that the 'reviewboard' module exists in the index */ g_assert_nonnull (modulemd_module_index_get_module (index, "reviewboard")); /* Remove the 'reviewboard' module from the index */ g_assert_true (modulemd_module_index_remove_module (index, "reviewboard")); /* Verify that the 'reviewboard' module no longer exists in the index */ g_assert_null (modulemd_module_index_get_module (index, "reviewboard")); /* Remove a nonexistent module from the index */ g_assert_null (modulemd_module_index_get_module (index, "nosuchmodule")); g_assert_false (modulemd_module_index_remove_module (index, "nosuchmodule")); g_assert_null (modulemd_module_index_get_module (index, "nosuchmodule")); } struct custom_string { gchar *string; gchar *current; }; static int custom_string_read_handler (void *data, unsigned char *buffer, size_t size, size_t *size_read) { struct custom_string *custom = (struct custom_string *)data; const gchar *end = custom->string + strlen (custom->string); if (custom->current == end) { *size_read = 0; return 1; } if (size > (size_t)(end - custom->current)) { size = end - custom->current; } memcpy (buffer, custom->current, size); custom->current += size; *size_read = size; return 1; } static void module_index_test_custom_read (void) { gboolean ret; g_autoptr (ModulemdModuleIndex) index = NULL; g_autoptr (GPtrArray) failures = NULL; g_autoptr (GError) error = NULL; // clang-format off g_autofree gchar *str = g_strdup( "---\n" "document: modulemd\n" "version: 2\n" "data:\n" " name: testmodule\n" " stream: main\n" " version: 20180405123256\n" " context: c2c572ec\n" " arch: x86_64\n" " summary: A test module in all its beautiful beauty\n" " description: >-\n" " This module demonstrates how to write simple modulemd files And can be used for\n" " testing the build and release pipeline.\n" " license:\n" " module:\n" " - DUMMY\n" " content:\n" " - DUMMY\n" " xmd:\n" " mbs:\n" " scmurl: https://src.fedoraproject.org/modules/testmodule.git?#0d33e028e4561f82ea43f670ee6366675cd6a6fe\n" " commit: 0d33e028e4561f82ea43f670ee6366675cd6a6fe\n" " buildrequires:\n" " platform:\n" " ref: virtual\n" " stream: f29\n" " filtered_rpms: []\n" " version: 4\n" " rpms:\n" " perl-List-Compare:\n" " ref: c6a689a6ce2683b15b32f83e6cb5d43ffd3816f5\n" " tangerine:\n" " ref: 239ada495d941ceefd8f359e1d8a47877fbba4a9\n" " perl-Tangerine:\n" " ref: 7e96446223f1ad84a26c7cf23d6591cd9f6326c6\n" " requires:\n" " platform:\n" " ref: virtual\n" " stream: f29\n" " filtered_rpms: []\n" " version: 4\n" " dependencies:\n" " - buildrequires:\n" " platform: [f29]\n" " requires:\n" " platform: [f29]\n" " references:\n" " community: https://docs.pagure.org/modularity/\n" " documentation: https://fedoraproject.org/wiki/Fedora_Packaging_Guidelines_for_Modules\n" " profiles:\n" " default:\n" " rpms:\n" " - tangerine\n" " api:\n" " rpms:\n" " - perl-Tangerine\n" " - tangerine\n" " components:\n" " rpms:\n" " perl-List-Compare:\n" " rationale: A dependency of tangerine.\n" " repository: git://pkgs.fedoraproject.org/rpms/perl-List-Compare\n" " cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-List-Compare\n" " ref: main\n" " perl-Tangerine:\n" " rationale: Provides API for this module and is a dependency of tangerine.\n" " repository: git://pkgs.fedoraproject.org/rpms/perl-Tangerine\n" " cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-Tangerine\n" " ref: 7e96446\n" " tangerine:\n" " rationale: Provides API for this module.\n" " repository: git://pkgs.fedoraproject.org/rpms/tangerine\n" " cache: http://pkgs.fedoraproject.org/repo/pkgs/tangerine\n" " ref: main\n" " buildorder: 10\n" " artifacts:\n" " rpms:\n" " - perl-List-Compare-0:0.53-9.module_1588+5eed94c6.noarch\n" " - perl-Tangerine-0:0.22-2.module_1588+5eed94c6.noarch\n" " - tangerine-0:0.22-7.module_1588+5eed94c6.noarch\n" "...\n"); // clang-format on struct custom_string custom; custom.string = str; custom.current = str; index = modulemd_module_index_new (); ret = modulemd_module_index_update_from_custom ( index, custom_string_read_handler, &custom, TRUE, &failures, &error); modulemd_subdocument_info_debug_dump_failures (failures); g_assert_no_error (error); g_assert_true (ret); g_assert_cmpint (failures->len, ==, 0); g_clear_pointer (&failures, g_ptr_array_unref); /* Verify we did indeed get the module we expected */ g_assert_nonnull (modulemd_module_index_get_module (index, "testmodule")); } static void module_index_test_custom_write (void) { gboolean ret; g_autoptr (ModulemdModuleIndex) index = NULL; g_autoptr (GPtrArray) failures = NULL; g_autoptr (GError) error = NULL; g_autofree gchar *output_string = NULL; g_autoptr (modulemd_yaml_string) yaml_string = g_malloc0_n (1, sizeof (modulemd_yaml_string)); // clang-format off g_autofree gchar *str = g_strdup( "---\n" "document: modulemd\n" "version: 2\n" "data:\n" " name: testmodule\n" " stream: main\n" " version: 20180405123256\n" " context: c2c572ec\n" " arch: x86_64\n" " summary: A test module in all its beautiful beauty\n" " description: >-\n" " This module demonstrates how to write simple modulemd files And can be used for\n" " testing the build and release pipeline.\n" " license:\n" " module:\n" " - DUMMY\n" " content:\n" " - DUMMY\n" " xmd:\n" " mbs:\n" " scmurl: https://src.fedoraproject.org/modules/testmodule.git?#0d33e028e4561f82ea43f670ee6366675cd6a6fe\n" " commit: 0d33e028e4561f82ea43f670ee6366675cd6a6fe\n" " buildrequires:\n" " platform:\n" " ref: virtual\n" " stream: f29\n" " filtered_rpms: []\n" " version: 4\n" " rpms:\n" " perl-List-Compare:\n" " ref: c6a689a6ce2683b15b32f83e6cb5d43ffd3816f5\n" " tangerine:\n" " ref: 239ada495d941ceefd8f359e1d8a47877fbba4a9\n" " perl-Tangerine:\n" " ref: 7e96446223f1ad84a26c7cf23d6591cd9f6326c6\n" " requires:\n" " platform:\n" " ref: virtual\n" " stream: f29\n" " filtered_rpms: []\n" " version: 4\n" " dependencies:\n" " - buildrequires:\n" " platform: [f29]\n" " requires:\n" " platform: [f29]\n" " references:\n" " community: https://docs.pagure.org/modularity/\n" " documentation: https://fedoraproject.org/wiki/Fedora_Packaging_Guidelines_for_Modules\n" " profiles:\n" " default:\n" " rpms:\n" " - tangerine\n" " api:\n" " rpms:\n" " - perl-Tangerine\n" " - tangerine\n" " components:\n" " rpms:\n" " perl-List-Compare:\n" " rationale: A dependency of tangerine.\n" " repository: git://pkgs.fedoraproject.org/rpms/perl-List-Compare\n" " cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-List-Compare\n" " ref: main\n" " perl-Tangerine:\n" " rationale: Provides API for this module and is a dependency of tangerine.\n" " repository: git://pkgs.fedoraproject.org/rpms/perl-Tangerine\n" " cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-Tangerine\n" " ref: 7e96446\n" " tangerine:\n" " rationale: Provides API for this module.\n" " repository: git://pkgs.fedoraproject.org/rpms/tangerine\n" " cache: http://pkgs.fedoraproject.org/repo/pkgs/tangerine\n" " ref: main\n" " buildorder: 10\n" " artifacts:\n" " rpms:\n" " - perl-List-Compare-0:0.53-9.module_1588+5eed94c6.noarch\n" " - perl-Tangerine-0:0.22-2.module_1588+5eed94c6.noarch\n" " - tangerine-0:0.22-7.module_1588+5eed94c6.noarch\n" "...\n"); // clang-format on index = modulemd_module_index_new (); ret = modulemd_module_index_update_from_string ( index, str, TRUE, &failures, &error); modulemd_subdocument_info_debug_dump_failures (failures); g_assert_no_error (error); g_assert_true (ret); g_assert_cmpint (failures->len, ==, 0); g_clear_pointer (&failures, g_ptr_array_unref); /* Verify we did indeed get the module we expected */ g_assert_nonnull (modulemd_module_index_get_module (index, "testmodule")); /* Write it out to another string * This is mainly to have a baseline to compare against */ output_string = modulemd_module_index_dump_to_string (index, &error); g_assert_nonnull (output_string); g_assert_no_error (error); /* Write it out to a string using a custom emitter */ ret = modulemd_module_index_dump_to_custom ( index, write_yaml_string, yaml_string, &error); g_assert_no_error (error); g_assert_true (ret); g_assert_nonnull (yaml_string->str); g_assert_cmpstr (yaml_string->str, ==, output_string); } static void module_index_test_get_default_streams (void) { gboolean ret; g_autofree gchar *yaml_path = NULL; g_autoptr (ModulemdModuleIndex) index = NULL; g_autoptr (GPtrArray) failures = NULL; g_autoptr (GError) error = NULL; g_autoptr (GHashTable) default_streams = NULL; yaml_path = g_strdup_printf ("%s/f29-updates.yaml", g_getenv ("TEST_DATA_PATH")); g_assert_nonnull (yaml_path); index = modulemd_module_index_new (); g_assert_nonnull (index); ret = modulemd_module_index_update_from_file ( index, yaml_path, TRUE, &failures, &error); modulemd_subdocument_info_debug_dump_failures (failures); g_assert_no_error (error); g_assert_true (ret); g_assert_cmpint (failures->len, ==, 0); default_streams = modulemd_module_index_get_default_streams_as_hash_table (index, NULL); g_assert_nonnull (default_streams); g_assert_cmpint (g_hash_table_size (default_streams), ==, 3); g_assert_true (g_hash_table_contains (default_streams, "bat")); g_assert_cmpstr (g_hash_table_lookup (default_streams, "bat"), ==, "latest"); g_assert_true (g_hash_table_contains (default_streams, "dwm")); g_assert_cmpstr (g_hash_table_lookup (default_streams, "dwm"), ==, "6.1"); g_assert_true (g_hash_table_contains (default_streams, "stratis")); g_assert_cmpstr (g_hash_table_lookup (default_streams, "stratis"), ==, "1"); g_assert_false (g_hash_table_contains (default_streams, "nodejs")); } static void module_index_test_dump_empty_index (void) { g_autoptr (GError) error = NULL; g_autofree gchar *yaml = NULL; g_autoptr (ModulemdModuleIndex) index = modulemd_module_index_new (); g_assert_nonnull (index); g_assert_true (MODULEMD_IS_MODULE_INDEX (index)); yaml = modulemd_module_index_dump_to_string (index, &error); g_assert_null (yaml); g_assert_error (error, MODULEMD_ERROR, MMD_ERROR_VALIDATE); } struct expected_compressed_read_t { const gchar *filename; #ifdef HAVE_RPMIO /* Determines a compression type */ const gchar *rpmio_mode; #endif /* Whether this should succeed at reading */ gboolean succeeds; /* If it fails, the expected error */ GQuark error_domain; int error_code; }; #ifdef HAVE_RPMIO /* Probe whether rpmio library supports that type of compression. * @file_path is a file name to open * @compression_type is rpmio mode string specifying the desired compression * format. * It assumes that an uncompressed content of the file starts with "---\n" * string and checks the first chararter is '-'. That's because rpmio library * silenty returns original, undecompressed, content if it does not support * the compression format. */ static gboolean rpmio_can_read_compressed_file (const gchar *file_path, const gchar *compression_type) { FD_t rpmfd; ssize_t read; unsigned char buffer; rpmfd = Fopen ((const char *)file_path, (const char *)compression_type); g_assert_nonnull (rpmfd); read = Fread (&buffer, sizeof (buffer), 1, rpmfd); Fclose (rpmfd); g_assert_cmpint (read, ==, 1); return (buffer == (unsigned char)'-'); } #endif static void test_module_index_read_compressed (void) { gboolean bret; g_autoptr (ModulemdModuleIndex) baseline_idx = NULL; g_autoptr (ModulemdModuleIndex) compressed_idx = NULL; g_autofree gchar *file_path = NULL; g_autoptr (GError) error = NULL; g_autoptr (GPtrArray) failures = NULL; g_autofree gchar *baseline_text = NULL; g_autofree gchar *compressed_text = NULL; #ifdef HAVE_RPMIO struct expected_compressed_read_t expected[] = { { .filename = "bzipped", .rpmio_mode = "r.bzdio", .succeeds = TRUE, }, { .filename = "bzipped.yaml.bz2", .rpmio_mode = "r.bzdio", .succeeds = TRUE, }, { .filename = "gzipped", .rpmio_mode = "r.gzdio", .succeeds = TRUE }, { .filename = "gzipped.yaml.gz", .rpmio_mode = "r.gzdio", .succeeds = TRUE }, { .filename = "xzipped", .rpmio_mode = "r.xzdio", .succeeds = TRUE }, { .filename = "xzipped.yaml.xz", .rpmio_mode = "r.xzdio", .succeeds = TRUE }, { .filename = NULL } }; #else /* HAVE_RPMIO */ struct expected_compressed_read_t expected[] = { { .filename = "bzipped", .succeeds = FALSE, .error_domain = MODULEMD_ERROR, .error_code = MMD_ERROR_NOT_IMPLEMENTED }, { .filename = "bzipped.yaml.bz2", .succeeds = FALSE, .error_domain = MODULEMD_ERROR, .error_code = MMD_ERROR_NOT_IMPLEMENTED }, { .filename = "gzipped", .succeeds = FALSE, .error_domain = MODULEMD_ERROR, .error_code = MMD_ERROR_NOT_IMPLEMENTED }, { .filename = "gzipped.yaml.gz", .succeeds = FALSE, .error_domain = MODULEMD_ERROR, .error_code = MMD_ERROR_NOT_IMPLEMENTED }, { .filename = "xzipped", .succeeds = FALSE, .error_domain = MODULEMD_ERROR, .error_code = MMD_ERROR_NOT_IMPLEMENTED }, { .filename = "xzipped.yaml.xz", .succeeds = FALSE, .error_domain = MODULEMD_ERROR, .error_code = MMD_ERROR_NOT_IMPLEMENTED }, { .filename = NULL } }; #endif /* HAVE_RPMIO */ baseline_idx = modulemd_module_index_new (); g_assert_nonnull (baseline_idx); file_path = g_strdup_printf ("%s/compression/uncompressed.yaml", g_getenv ("TEST_DATA_PATH")); g_assert_nonnull (file_path); bret = modulemd_module_index_update_from_file ( baseline_idx, file_path, TRUE, &failures, &error); modulemd_subdocument_info_debug_dump_failures (failures); g_assert_no_error (error); g_assert_true (bret); g_assert_cmpint (failures->len, ==, 0); baseline_text = modulemd_module_index_dump_to_string (baseline_idx, &error); g_assert_nonnull (baseline_text); g_assert_no_error (error); g_clear_pointer (&file_path, g_free); for (size_t i = 0; expected[i].filename; i++) { compressed_idx = modulemd_module_index_new (); g_assert_nonnull (compressed_idx); file_path = g_strdup_printf ("%s/compression/%s", g_getenv ("TEST_DATA_PATH"), expected[i].filename); g_assert_nonnull (file_path); #ifdef HAVE_RPMIO /* Support for various compression formats in RPMIO is optional. Probe * the support first and set expected success/error accordingly. */ if (!rpmio_can_read_compressed_file (file_path, expected[i].rpmio_mode)) { g_debug ("rpmio library does not support %s compression mode", expected[i].rpmio_mode); expected[i].succeeds = FALSE; expected[i].error_domain = MODULEMD_YAML_ERROR; expected[i].error_code = MMD_YAML_ERROR_UNPARSEABLE; } #endif g_debug ("Processing %s, expecting %s", file_path, expected[i].succeeds ? "success" : "failure"); bret = modulemd_module_index_update_from_file ( compressed_idx, file_path, TRUE, &failures, &error); modulemd_subdocument_info_debug_dump_failures (failures); if (error) { g_debug ("Error: %s", error->message); } if (expected[i].succeeds) { g_assert_no_error (error); g_assert_true (bret); } else { g_assert_false (bret); g_assert_error ( error, expected[i].error_domain, expected[i].error_code); g_clear_error (&error); g_clear_pointer (&file_path, g_free); g_clear_object (&compressed_idx); continue; } g_assert_cmpint (failures->len, ==, 0); compressed_text = modulemd_module_index_dump_to_string (compressed_idx, &error); g_assert_nonnull (compressed_text); g_assert_no_error (error); g_assert_cmpstr (baseline_text, ==, compressed_text); g_clear_pointer (&compressed_text, g_free); g_clear_pointer (&file_path, g_free); g_clear_object (&compressed_idx); } } static void test_module_index_read_def_dir (void) { gboolean ret; g_autoptr (ModulemdModuleIndex) idx = modulemd_module_index_new (); g_autoptr (GError) error = NULL; g_autofree gchar *path = g_build_path ("/", g_getenv ("TEST_DATA_PATH"), "defaults", NULL); g_autofree gchar *bad_path = g_build_path ("/", g_getenv ("TEST_DATA_PATH"), "bad_defaults", NULL); g_autofree gchar *overrides_path = g_build_path ("/", path, "overrides", NULL); g_auto (GStrv) module_names = NULL; g_autoptr (GHashTable) defaultdict = NULL; g_assert_nonnull (idx); /* First verify that it works without overrides */ ret = modulemd_module_index_update_from_defaults_directory ( idx, path, TRUE, NULL, &error); g_assert_no_error (error); g_assert_true (ret); /* There should be three modules in the index now: * - meson * - ninja * - nodejs */ module_names = modulemd_module_index_get_module_names_as_strv (idx); g_assert_nonnull (module_names); g_assert_true ( g_strv_contains ((const gchar *const *)module_names, "meson")); g_assert_true ( g_strv_contains ((const gchar *const *)module_names, "ninja")); g_assert_true ( g_strv_contains ((const gchar *const *)module_names, "nodejs")); g_assert_cmpint (g_strv_length (module_names), ==, 3); defaultdict = modulemd_module_index_get_default_streams_as_hash_table (idx, NULL); g_assert_nonnull (defaultdict); g_assert_cmpstr (g_hash_table_lookup (defaultdict, "meson"), ==, "latest"); g_assert_cmpstr (g_hash_table_lookup (defaultdict, "ninja"), ==, "latest"); g_assert_cmpstr (g_hash_table_lookup (defaultdict, "nodejs"), ==, NULL); g_clear_pointer (&module_names, g_strfreev); g_clear_pointer (&defaultdict, g_hash_table_unref); /* Verify with overrides */ ret = modulemd_module_index_update_from_defaults_directory ( idx, path, TRUE, overrides_path, &error); g_assert_no_error (error); g_assert_true (ret); /* There should be four modules in the index now: * - meson * - ninja * - nodejs * - testmodule */ module_names = modulemd_module_index_get_module_names_as_strv (idx); g_assert_nonnull (module_names); g_assert_true ( g_strv_contains ((const gchar *const *)module_names, "meson")); g_assert_true ( g_strv_contains ((const gchar *const *)module_names, "ninja")); g_assert_true ( g_strv_contains ((const gchar *const *)module_names, "nodejs")); g_assert_true ( g_strv_contains ((const gchar *const *)module_names, "testmodule")); g_assert_cmpint (g_strv_length (module_names), ==, 4); defaultdict = modulemd_module_index_get_default_streams_as_hash_table (idx, NULL); g_assert_nonnull (defaultdict); g_assert_cmpstr (g_hash_table_lookup (defaultdict, "meson"), ==, "latest"); g_assert_cmpstr (g_hash_table_lookup (defaultdict, "ninja"), ==, "latest"); g_assert_cmpstr (g_hash_table_lookup (defaultdict, "nodejs"), ==, "12"); g_assert_cmpstr ( g_hash_table_lookup (defaultdict, "testmodule"), ==, "teststream"); g_clear_pointer (&module_names, g_strfreev); g_clear_pointer (&defaultdict, g_hash_table_unref); /* Nonexistent defaults dir */ g_assert_false (modulemd_module_index_update_from_defaults_directory ( idx, "nonexistent", TRUE, NULL, &error)); g_assert_error (error, G_FILE_ERROR, G_FILE_ERROR_NOENT); g_clear_error (&error); /* Nonexistent overrides dir */ g_assert_false (modulemd_module_index_update_from_defaults_directory ( idx, path, TRUE, "nonexistent", &error)); g_assert_error (error, G_FILE_ERROR, G_FILE_ERROR_NOENT); g_clear_error (&error); g_clear_object (&idx); idx = modulemd_module_index_new (); g_assert_nonnull (idx); /* Base directory contains two defaults with conflicting streams for the * same module in separate files. Strict mode. */ g_assert_false (modulemd_module_index_update_from_defaults_directory ( idx, bad_path, TRUE, NULL, &error)); g_assert_error (error, MODULEMD_ERROR, MMD_ERROR_VALIDATE); g_clear_error (&error); /* Verify that the index has not been modified as a side-effect */ module_names = modulemd_module_index_get_module_names_as_strv (idx); g_assert_cmpint (g_strv_length (module_names), ==, 0); g_clear_pointer (&module_names, g_strfreev); g_clear_object (&idx); idx = modulemd_module_index_new (); g_assert_nonnull (idx); /* Base directory contains two defaults with conflicting streams for the * same module in separate files. Non-strict mode. */ ret = modulemd_module_index_update_from_defaults_directory ( idx, bad_path, FALSE, NULL, &error); g_assert_no_error (error); g_assert_true (ret); /* There should be three modules in the index now: * - meson * - ninja * - nodejs */ module_names = modulemd_module_index_get_module_names_as_strv (idx); g_assert_nonnull (module_names); g_assert_true ( g_strv_contains ((const gchar *const *)module_names, "meson")); g_assert_true ( g_strv_contains ((const gchar *const *)module_names, "ninja")); g_assert_true ( g_strv_contains ((const gchar *const *)module_names, "nodejs")); g_assert_cmpint (g_strv_length (module_names), ==, 3); defaultdict = modulemd_module_index_get_default_streams_as_hash_table (idx, NULL); g_assert_nonnull (defaultdict); /* Make sure that in non-strict mode, meson's default is reset to NULL */ g_assert_cmpstr (g_hash_table_lookup (defaultdict, "meson"), ==, NULL); g_assert_cmpstr (g_hash_table_lookup (defaultdict, "ninja"), ==, "latest"); g_assert_cmpstr (g_hash_table_lookup (defaultdict, "nodejs"), ==, NULL); g_clear_pointer (&module_names, g_strfreev); g_clear_pointer (&defaultdict, g_hash_table_unref); } static void test_modulemd_index_search_streams (void) { gboolean ret; g_autoptr (ModulemdModuleIndex) index = modulemd_module_index_new (); g_autoptr (GError) error = NULL; g_autoptr (GPtrArray) failures = NULL; g_autoptr (GPtrArray) streams = NULL; g_autofree gchar *yaml_path = NULL; yaml_path = g_strdup_printf ("%s/search_streams/search_streams.yaml", g_getenv ("TEST_DATA_PATH")); ret = modulemd_module_index_update_from_file ( index, yaml_path, TRUE, &failures, &error); modulemd_subdocument_info_debug_dump_failures (failures); g_assert_no_error (error); g_assert_true (ret); g_assert_cmpint (failures->len, ==, 0); g_clear_pointer (&failures, g_ptr_array_unref); streams = modulemd_module_index_search_streams ( index, "nodejs", NULL, NULL, NULL, NULL); g_assert_nonnull (streams); g_assert_cmpint (streams->len, ==, 3); g_clear_pointer (&streams, g_ptr_array_unref); streams = modulemd_module_index_search_streams ( index, "nonexistent", NULL, NULL, NULL, NULL); g_assert_nonnull (streams); g_assert_cmpint (streams->len, ==, 0); g_clear_pointer (&streams, g_ptr_array_unref); streams = modulemd_module_index_search_streams (index, NULL, NULL, NULL, NULL, NULL); g_assert_nonnull (streams); g_assert_cmpint (streams->len, ==, 5); g_clear_pointer (&streams, g_ptr_array_unref); streams = modulemd_module_index_search_streams (index, NULL, "8", NULL, NULL, NULL); g_assert_nonnull (streams); g_assert_cmpint (streams->len, ==, 1); g_clear_pointer (&streams, g_ptr_array_unref); streams = modulemd_module_index_search_streams ( index, NULL, "nosuchstream", NULL, NULL, NULL); g_assert_nonnull (streams); g_assert_cmpint (streams->len, ==, 0); g_clear_pointer (&streams, g_ptr_array_unref); streams = modulemd_module_index_search_streams (index, NULL, NULL, "1", NULL, NULL); g_assert_nonnull (streams); g_assert_cmpint (streams->len, ==, 3); g_clear_pointer (&streams, g_ptr_array_unref); streams = modulemd_module_index_search_streams (index, NULL, NULL, "10", NULL, NULL); g_assert_nonnull (streams); g_assert_cmpint (streams->len, ==, 0); g_clear_pointer (&streams, g_ptr_array_unref); streams = modulemd_module_index_search_streams ( index, NULL, NULL, NULL, "e0c83381", NULL); g_assert_nonnull (streams); g_assert_cmpint (streams->len, ==, 1); g_clear_pointer (&streams, g_ptr_array_unref); streams = modulemd_module_index_search_streams ( index, NULL, NULL, NULL, "c2c572ec", NULL); g_assert_nonnull (streams); g_assert_cmpint (streams->len, ==, 4); g_clear_pointer (&streams, g_ptr_array_unref); streams = modulemd_module_index_search_streams ( index, NULL, NULL, NULL, "deadbeef", NULL); g_assert_nonnull (streams); g_assert_cmpint (streams->len, ==, 0); g_clear_pointer (&streams, g_ptr_array_unref); streams = modulemd_module_index_search_streams ( index, NULL, NULL, NULL, NULL, "i686"); g_assert_nonnull (streams); g_assert_cmpint (streams->len, ==, 0); g_clear_pointer (&streams, g_ptr_array_unref); streams = modulemd_module_index_search_streams ( index, NULL, NULL, NULL, NULL, "x86_64"); g_assert_nonnull (streams); g_assert_cmpint (streams->len, ==, 2); g_clear_pointer (&streams, g_ptr_array_unref); streams = modulemd_module_index_search_streams ( index, NULL, NULL, NULL, NULL, "ppc64le"); g_assert_nonnull (streams); g_assert_cmpint (streams->len, ==, 1); g_clear_pointer (&streams, g_ptr_array_unref); streams = modulemd_module_index_search_streams (index, NULL, "2*", NULL, NULL, NULL); g_assert_nonnull (streams); g_assert_cmpint (streams->len, ==, 1); g_clear_pointer (&streams, g_ptr_array_unref); streams = modulemd_module_index_search_streams ( index, NULL, "[68]", NULL, NULL, NULL); g_assert_nonnull (streams); g_assert_cmpint (streams->len, ==, 2); g_clear_pointer (&streams, g_ptr_array_unref); streams = modulemd_module_index_search_streams ( index, NULL, "1.?", NULL, NULL, NULL); g_assert_nonnull (streams); g_assert_cmpint (streams->len, ==, 1); g_clear_pointer (&streams, g_ptr_array_unref); streams = modulemd_module_index_search_streams (index, NULL, "*", NULL, NULL, NULL); g_assert_nonnull (streams); g_assert_cmpint (streams->len, ==, 5); g_clear_pointer (&streams, g_ptr_array_unref); } static void test_module_index_search_streams_by_nsvca_glob (void) { gboolean ret; g_autoptr (ModulemdModuleIndex) index = modulemd_module_index_new (); g_autoptr (GError) error = NULL; g_autoptr (GPtrArray) failures = NULL; g_autoptr (GPtrArray) streams = NULL; g_autofree gchar *yaml_path = NULL; yaml_path = g_strdup_printf ("%s/search_streams/search_streams.yaml", g_getenv ("TEST_DATA_PATH")); ret = modulemd_module_index_update_from_file ( index, yaml_path, TRUE, &failures, &error); modulemd_subdocument_info_debug_dump_failures (failures); g_assert_no_error (error); g_assert_true (ret); g_assert_cmpint (failures->len, ==, 0); g_clear_pointer (&failures, g_ptr_array_unref); streams = modulemd_module_index_search_streams_by_nsvca_glob (index, "*"); g_assert_nonnull (streams); g_assert_cmpint (streams->len, ==, 5); g_clear_pointer (&streams, g_ptr_array_unref); streams = modulemd_module_index_search_streams_by_nsvca_glob (index, NULL); g_assert_nonnull (streams); g_assert_cmpint (streams->len, ==, 5); g_clear_pointer (&streams, g_ptr_array_unref); streams = modulemd_module_index_search_streams_by_nsvca_glob (index, "nodejs*"); g_assert_nonnull (streams); g_assert_cmpint (streams->len, ==, 3); g_clear_pointer (&streams, g_ptr_array_unref); streams = modulemd_module_index_search_streams_by_nsvca_glob (index, "nodejs:?*"); g_assert_nonnull (streams); g_assert_cmpint (streams->len, ==, 3); g_clear_pointer (&streams, g_ptr_array_unref); streams = modulemd_module_index_search_streams_by_nsvca_glob (index, "*8*"); g_assert_nonnull (streams); g_assert_cmpint (streams->len, ==, 4); g_clear_pointer (&streams, g_ptr_array_unref); streams = modulemd_module_index_search_streams_by_nsvca_glob (index, "nodejs:[68]*"); g_assert_nonnull (streams); g_assert_cmpint (streams->len, ==, 2); g_clear_pointer (&streams, g_ptr_array_unref); } static void test_module_index_search_rpms (void) { gboolean ret; g_autoptr (ModulemdModuleIndex) index = modulemd_module_index_new (); g_autoptr (GError) error = NULL; g_autoptr (GPtrArray) failures = NULL; g_autoptr (GPtrArray) streams = NULL; g_autofree gchar *yaml_path = NULL; yaml_path = g_strdup_printf ("%s/search_streams/search_streams.yaml", g_getenv ("TEST_DATA_PATH")); ret = modulemd_module_index_update_from_file ( index, yaml_path, TRUE, &failures, &error); modulemd_subdocument_info_debug_dump_failures (failures); g_assert_no_error (error); g_assert_true (ret); g_assert_cmpint (failures->len, ==, 0); g_clear_pointer (&failures, g_ptr_array_unref); /* Searching for "python*" should give us ReviewBoard and Django */ streams = modulemd_module_index_search_rpms (index, "python*"); g_assert_cmpint (streams->len, ==, 2); g_clear_pointer (&streams, g_ptr_array_unref); /* Searching for "[nR]*" should give us three Node.js streams, plus * ReviewBoard */ streams = modulemd_module_index_search_rpms (index, "[nR]*"); g_assert_cmpint (streams->len, ==, 4); g_clear_pointer (&streams, g_ptr_array_unref); /* Searching for "*1.6*" should give us Django and Node.js 6 (because of * npm-1:3.10.10-1.6.13.1.1.module_1575+55808bea.x86_64) */ streams = modulemd_module_index_search_rpms (index, "*1.6*"); g_assert_cmpint (streams->len, ==, 2); g_clear_pointer (&streams, g_ptr_array_unref); /* Searching for "*" should give us all five streams */ streams = modulemd_module_index_search_rpms (index, "*"); g_assert_cmpint (streams->len, ==, 5); g_clear_pointer (&streams, g_ptr_array_unref); /* Searching for NULL should give us all five streams */ streams = modulemd_module_index_search_rpms (index, NULL); g_assert_cmpint (streams->len, ==, 5); g_clear_pointer (&streams, g_ptr_array_unref); /* Searching for "perl-*" should give us nothing */ streams = modulemd_module_index_search_rpms (index, "perl-*"); g_assert_cmpint (streams->len, ==, 0); g_clear_pointer (&streams, g_ptr_array_unref); } int main (int argc, char *argv[]) { setlocale (LC_ALL, ""); g_test_init (&argc, &argv, NULL); g_test_bug_base ("https://bugzilla.redhat.com/show_bug.cgi?id="); // Define the tests. g_test_add_func ("/modulemd/v2/module/index/dump", module_index_test_dump); g_test_add_func ("/modulemd/v2/module/index/read", module_index_test_read); g_test_add_func ("/modulemd/v2/module/index/read/mixed", module_index_test_read_mixed); g_test_add_func ("/modulemd/v2/module/index/read/mixed_packager", module_index_test_read_mixed_packager); g_test_add_func ("/modulemd/v2/module/index/read/unknown", module_index_test_read_unknown); g_test_add_func ("/modulemd/v2/module/index/upgrade/defaults", module_index_test_defaults_upgrade); g_test_add_func ("/modulemd/v2/module/index/upgrade/stream", module_index_test_stream_upgrade); g_test_add_func ("/modulemd/v2/module/index/upgrade/index", module_index_test_index_upgrade); g_test_add_func ("/modulemd/v2/module/index/remove_module", module_index_test_remove_module); g_test_add_func ("/modulemd/v2/module/index/custom_read", module_index_test_custom_read); g_test_add_func ("/modulemd/v2/module/index/custom_write", module_index_test_custom_write); g_test_add_func ("/modulemd/v2/module/index/get_default_streams", module_index_test_get_default_streams); g_test_add_func ("/modulemd/v2/module/index/empty", module_index_test_dump_empty_index); g_test_add_func ("/modulemd/v2/module/index/compressed", test_module_index_read_compressed); g_test_add_func ("/modulemd/v2/module/index/defaultdir", test_module_index_read_def_dir); g_test_add_func ("/modulemd/v2/module/index/search", test_modulemd_index_search_streams); g_test_add_func ("/modulemd/v2/module/index/search_nsvca", test_module_index_search_streams_by_nsvca_glob); g_test_add_func ("/modulemd/v2/module/index/search_rpms", test_module_index_search_rpms); return g_test_run (); } fedora-modularity-libmodulemd-357799c/modulemd/tests/test-modulemd-modulestream.c000066400000000000000000004055501502446517500303500ustar00rootroot00000000000000/* * This file is part of libmodulemd * Copyright (C) 2018-2020 Red Hat, Inc. * * Fedora-License-Identifier: MIT * SPDX-2.0-License-Identifier: MIT * SPDX-3.0-License-Identifier: MIT * * This program is free software. * For more information on the license, see COPYING. * For more information on free software, see . */ #include #include #include #include #include #include "modulemd-module-index.h" #include "modulemd-module-stream.h" #include "private/glib-extensions.h" #include "private/modulemd-build-config-private.h" #include "private/modulemd-module-stream-private.h" #include "private/modulemd-module-stream-v1-private.h" #include "private/modulemd-module-stream-v2-private.h" #include "private/modulemd-subdocument-info-private.h" #include "private/modulemd-obsoletes-private.h" #include "private/modulemd-util.h" #include "private/modulemd-yaml.h" #include "private/test-utils.h" #define MMD_TEST_DOC_TEXT "http://example.com" #define MMD_TEST_DOC_TEXT2 "http://redhat.com" #define MMD_TEST_DOC_PROP "documentation" #define MMD_TEST_COM_PROP "community" #define MMD_TEST_DOC_UNICODE_TEXT \ "À϶¥🌭∮⇒⇔¬β∀₂⌀ıəˈ⍳⍴V)" \ "═€ίζησθლბშიнстемองจึองታሽ።ደለᚢᛞᚦᚹ⠳⠞⠊⠎▉▒▒▓😃" #define MMD_TEST_TRACKER_PROP "tracker" #define MMD_TEST_DESC_TEXT "A different description" #define MMD_TEST_SUM_TEXT "A different summary" static void module_stream_test_construct (void) { g_autoptr (ModulemdModuleStream) stream = NULL; guint64 version; for (version = MD_MODULESTREAM_VERSION_ONE; version <= MD_MODULESTREAM_VERSION_LATEST; version++) { /* Test that the new() function works */ stream = modulemd_module_stream_new (version, "foo", "latest"); g_assert_nonnull (stream); g_assert_true (MODULEMD_IS_MODULE_STREAM (stream)); g_assert_cmpint ( modulemd_module_stream_get_mdversion (stream), ==, version); g_assert_cmpstr ( modulemd_module_stream_get_module_name (stream), ==, "foo"); g_assert_cmpstr ( modulemd_module_stream_get_stream_name (stream), ==, "latest"); g_clear_object (&stream); /* Test that the new() function works without a stream name */ stream = modulemd_module_stream_new (version, "foo", NULL); g_assert_nonnull (stream); g_assert_true (MODULEMD_IS_MODULE_STREAM (stream)); g_assert_cmpint ( modulemd_module_stream_get_mdversion (stream), ==, version); g_assert_cmpstr ( modulemd_module_stream_get_module_name (stream), ==, "foo"); g_assert_null (modulemd_module_stream_get_stream_name (stream)); g_clear_object (&stream); /* Test with no module name */ stream = modulemd_module_stream_new (version, NULL, NULL); g_assert_nonnull (stream); g_assert_true (MODULEMD_IS_MODULE_STREAM (stream)); g_assert_cmpint ( modulemd_module_stream_get_mdversion (stream), ==, version); g_assert_null (modulemd_module_stream_get_module_name (stream)); g_assert_null (modulemd_module_stream_get_stream_name (stream)); g_clear_object (&stream); } /* Test with a zero mdversion */ stream = modulemd_module_stream_new (0, "foo", "latest"); g_assert_null (stream); g_clear_object (&stream); /* Test with an unknown mdversion */ stream = modulemd_module_stream_new ( MD_MODULESTREAM_VERSION_LATEST + 1, "foo", "latest"); g_assert_null (stream); g_clear_object (&stream); } static void module_stream_test_arch (void) { g_autoptr (ModulemdModuleStream) stream = NULL; guint64 version; g_autofree gchar *arch = NULL; for (version = MD_MODULESTREAM_VERSION_ONE; version <= MD_MODULESTREAM_VERSION_LATEST; version++) { /* Test the parent class set_arch() and get_arch() */ stream = modulemd_module_stream_new (version, "foo", "latest"); g_assert_nonnull (stream); g_assert_null (modulemd_module_stream_get_arch (stream)); // clang-format off g_object_get (stream, "arch", &arch, NULL); // clang-format on g_assert_null (arch); modulemd_module_stream_set_arch (stream, "x86_64"); g_assert_cmpstr (modulemd_module_stream_get_arch (stream), ==, "x86_64"); // clang-format off g_object_set (stream, "arch", "aarch64", NULL); g_object_get (stream, "arch", &arch, NULL); // clang-format on g_assert_cmpstr (arch, ==, "aarch64"); g_clear_pointer (&arch, g_free); g_clear_object (&stream); } } static void module_stream_v1_test_licenses (void) { g_autoptr (ModulemdModuleStreamV1) stream = NULL; g_auto (GStrv) licenses = NULL; stream = modulemd_module_stream_v1_new (NULL, NULL); modulemd_module_stream_v1_add_content_license (stream, "DUMMY1"); licenses = modulemd_module_stream_v1_get_content_licenses_as_strv (stream); g_assert_true (g_strv_contains ((const gchar *const *)licenses, "DUMMY1")); g_assert_cmpint (g_strv_length (licenses), ==, 1); g_clear_pointer (&licenses, g_strfreev); modulemd_module_stream_v1_add_module_license (stream, "DUMMY2"); licenses = modulemd_module_stream_v1_get_module_licenses_as_strv (stream); g_assert_true (g_strv_contains ((const gchar *const *)licenses, "DUMMY2")); g_assert_cmpint (g_strv_length (licenses), ==, 1); g_clear_pointer (&licenses, g_strfreev); modulemd_module_stream_v1_remove_content_license (stream, "DUMMY1"); licenses = modulemd_module_stream_v1_get_content_licenses_as_strv (stream); g_assert_cmpint (g_strv_length (licenses), ==, 0); g_clear_pointer (&licenses, g_strfreev); modulemd_module_stream_v1_remove_module_license (stream, "DUMMY2"); licenses = modulemd_module_stream_v1_get_module_licenses_as_strv (stream); g_assert_cmpint (g_strv_length (licenses), ==, 0); g_clear_pointer (&licenses, g_strfreev); g_clear_object (&stream); } static void module_stream_v2_test_licenses (void) { g_autoptr (ModulemdModuleStreamV2) stream = NULL; g_auto (GStrv) licenses = NULL; stream = modulemd_module_stream_v2_new (NULL, NULL); modulemd_module_stream_v2_add_content_license (stream, "DUMMY1"); licenses = modulemd_module_stream_v2_get_content_licenses_as_strv (stream); g_assert_true (g_strv_contains ((const gchar *const *)licenses, "DUMMY1")); g_assert_cmpint (g_strv_length (licenses), ==, 1); g_clear_pointer (&licenses, g_strfreev); modulemd_module_stream_v2_add_module_license (stream, "DUMMY2"); licenses = modulemd_module_stream_v2_get_module_licenses_as_strv (stream); g_assert_true (g_strv_contains ((const gchar *const *)licenses, "DUMMY2")); g_assert_cmpint (g_strv_length (licenses), ==, 1); g_clear_pointer (&licenses, g_strfreev); modulemd_module_stream_v2_remove_content_license (stream, "DUMMY1"); licenses = modulemd_module_stream_v2_get_content_licenses_as_strv (stream); g_assert_cmpint (g_strv_length (licenses), ==, 0); g_clear_pointer (&licenses, g_strfreev); modulemd_module_stream_v2_remove_module_license (stream, "DUMMY2"); licenses = modulemd_module_stream_v2_get_module_licenses_as_strv (stream); g_assert_cmpint (g_strv_length (licenses), ==, 0); g_clear_pointer (&licenses, g_strfreev); g_clear_object (&stream); } static void module_stream_v1_test_profiles (void) { g_autoptr (ModulemdModuleStreamV1) stream = NULL; g_autoptr (ModulemdProfile) profile = NULL; g_auto (GStrv) profiles = NULL; g_auto (GStrv) rpms = NULL; stream = modulemd_module_stream_v1_new ("sssd", NULL); profile = modulemd_profile_new ("client"); modulemd_profile_add_rpm (profile, "sssd-client"); modulemd_module_stream_v1_add_profile (stream, profile); profiles = modulemd_module_stream_v1_get_profile_names_as_strv (stream); g_assert_cmpint (g_strv_length (profiles), ==, 1); g_assert_true (g_strv_contains ((const gchar *const *)profiles, "client")); g_clear_pointer (&profiles, g_strfreev); rpms = modulemd_profile_get_rpms_as_strv ( modulemd_module_stream_v1_get_profile (stream, "client")); g_assert_true (g_strv_contains ((const gchar *const *)rpms, "sssd-client")); modulemd_module_stream_v1_clear_profiles (stream); profiles = modulemd_module_stream_v1_get_profile_names_as_strv (stream); g_assert_cmpint (g_strv_length (profiles), ==, 0); g_clear_object (&stream); g_clear_object (&profile); g_clear_pointer (&profiles, g_strfreev); g_clear_pointer (&rpms, g_strfreev); } static void module_stream_v2_test_profiles (void) { g_autoptr (ModulemdModuleStreamV2) stream = NULL; g_autoptr (ModulemdProfile) profile = NULL; g_auto (GStrv) profiles = NULL; g_auto (GStrv) rpms = NULL; stream = modulemd_module_stream_v2_new ("sssd", NULL); profile = modulemd_profile_new ("client"); modulemd_profile_add_rpm (profile, "sssd-client"); modulemd_module_stream_v2_add_profile (stream, profile); profiles = modulemd_module_stream_v2_get_profile_names_as_strv (stream); g_assert_cmpint (g_strv_length (profiles), ==, 1); g_assert_true (g_strv_contains ((const gchar *const *)profiles, "client")); g_clear_pointer (&profiles, g_strfreev); rpms = modulemd_profile_get_rpms_as_strv ( modulemd_module_stream_v2_get_profile (stream, "client")); g_assert_true (g_strv_contains ((const gchar *const *)rpms, "sssd-client")); modulemd_module_stream_v2_clear_profiles (stream); profiles = modulemd_module_stream_v2_get_profile_names_as_strv (stream); g_assert_cmpint (g_strv_length (profiles), ==, 0); g_clear_object (&stream); g_clear_object (&profile); g_clear_pointer (&profiles, g_strfreev); g_clear_pointer (&rpms, g_strfreev); } static void module_stream_v1_test_summary (void) { g_autoptr (ModulemdModuleStreamV1) stream = NULL; const gchar *summary = NULL; stream = modulemd_module_stream_v1_new (NULL, NULL); // Check the defaults summary = modulemd_module_stream_v1_get_summary (stream, "C"); g_assert_null (summary); // Test setting summary modulemd_module_stream_v1_set_summary (stream, MMD_TEST_SUM_TEXT); summary = modulemd_module_stream_v1_get_summary (stream, "C"); g_assert_cmpstr (summary, ==, MMD_TEST_SUM_TEXT); // Test setting it back to NULL modulemd_module_stream_v1_set_summary (stream, NULL); summary = modulemd_module_stream_v1_get_summary (stream, "C"); g_assert_null (summary); // Test setting unicode characters modulemd_module_stream_v1_set_summary (stream, MMD_TEST_DOC_UNICODE_TEXT); summary = modulemd_module_stream_v1_get_summary (stream, "C"); g_assert_cmpstr (summary, ==, MMD_TEST_DOC_UNICODE_TEXT); } static void module_stream_v2_test_summary (void) { g_autoptr (ModulemdModuleStreamV2) stream = NULL; const gchar *summary = NULL; stream = modulemd_module_stream_v2_new (NULL, NULL); // Check the defaults summary = modulemd_module_stream_v2_get_summary (stream, "C"); g_assert_null (summary); // Test setting summary modulemd_module_stream_v2_set_summary (stream, MMD_TEST_SUM_TEXT); summary = modulemd_module_stream_v2_get_summary (stream, "C"); g_assert_cmpstr (summary, ==, MMD_TEST_SUM_TEXT); // Test setting it back to NULL modulemd_module_stream_v2_set_summary (stream, NULL); summary = modulemd_module_stream_v2_get_summary (stream, "C"); g_assert_null (summary); // Test setting unicode characters modulemd_module_stream_v2_set_summary (stream, MMD_TEST_DOC_UNICODE_TEXT); summary = modulemd_module_stream_v2_get_summary (stream, "C"); g_assert_cmpstr (summary, ==, MMD_TEST_DOC_UNICODE_TEXT); } static void module_stream_v1_test_description (void) { g_autoptr (ModulemdModuleStreamV1) stream = NULL; const gchar *description = NULL; stream = modulemd_module_stream_v1_new (NULL, NULL); // Check the defaults description = modulemd_module_stream_v1_get_description (stream, "C"); g_assert_null (description); // Test setting description modulemd_module_stream_v1_set_description (stream, MMD_TEST_DESC_TEXT); description = modulemd_module_stream_v1_get_description (stream, "C"); g_assert_cmpstr (description, ==, MMD_TEST_DESC_TEXT); // Test setting it back to NULL modulemd_module_stream_v1_set_description (stream, NULL); description = modulemd_module_stream_v1_get_description (stream, "C"); g_assert_null (description); // Test unicode characters modulemd_module_stream_v1_set_description (stream, MMD_TEST_DOC_UNICODE_TEXT); description = modulemd_module_stream_v1_get_description (stream, "C"); g_assert_cmpstr (description, ==, MMD_TEST_DOC_UNICODE_TEXT); g_clear_object (&stream); } static void module_stream_v2_test_description (void) { g_autoptr (ModulemdModuleStreamV2) stream = NULL; const gchar *description = NULL; stream = modulemd_module_stream_v2_new (NULL, NULL); // Check the defaults description = modulemd_module_stream_v2_get_description (stream, "C"); g_assert_null (description); // Test setting description modulemd_module_stream_v2_set_description (stream, MMD_TEST_DESC_TEXT); description = modulemd_module_stream_v2_get_description (stream, "C"); g_assert_cmpstr (description, ==, MMD_TEST_DESC_TEXT); // Test setting it back to NULL modulemd_module_stream_v2_set_description (stream, NULL); description = modulemd_module_stream_v2_get_description (stream, "C"); g_assert_null (description); // Test unicode characters modulemd_module_stream_v2_set_description (stream, MMD_TEST_DOC_UNICODE_TEXT); description = modulemd_module_stream_v2_get_description (stream, "C"); g_assert_cmpstr (description, ==, MMD_TEST_DOC_UNICODE_TEXT); g_clear_object (&stream); } static void module_stream_v1_test_rpm_api (void) { g_autoptr (ModulemdModuleStreamV1) stream = NULL; g_auto (GStrv) rpm_apis = NULL; stream = modulemd_module_stream_v1_new ("sssd", NULL); modulemd_module_stream_v1_add_rpm_api (stream, "sssd-common"); rpm_apis = modulemd_module_stream_v1_get_rpm_api_as_strv (stream); g_assert_true ( g_strv_contains ((const gchar *const *)rpm_apis, "sssd-common")); g_assert_cmpint (g_strv_length (rpm_apis), ==, 1); g_clear_pointer (&rpm_apis, g_strfreev); modulemd_module_stream_v1_remove_rpm_api (stream, "sssd-common"); rpm_apis = modulemd_module_stream_v1_get_rpm_api_as_strv (stream); g_assert_cmpint (g_strv_length (rpm_apis), ==, 0); g_clear_pointer (&rpm_apis, g_strfreev); g_clear_object (&stream); } static void module_stream_v2_test_rpm_api (void) { g_autoptr (ModulemdModuleStreamV2) stream = NULL; g_auto (GStrv) rpm_apis = NULL; stream = modulemd_module_stream_v2_new ("sssd", NULL); modulemd_module_stream_v2_add_rpm_api (stream, "sssd-common"); rpm_apis = modulemd_module_stream_v2_get_rpm_api_as_strv (stream); g_assert_true ( g_strv_contains ((const gchar *const *)rpm_apis, "sssd-common")); g_assert_cmpint (g_strv_length (rpm_apis), ==, 1); g_clear_pointer (&rpm_apis, g_strfreev); modulemd_module_stream_v2_remove_rpm_api (stream, "sssd-common"); rpm_apis = modulemd_module_stream_v2_get_rpm_api_as_strv (stream); g_assert_cmpint (g_strv_length (rpm_apis), ==, 0); g_clear_pointer (&rpm_apis, g_strfreev); g_clear_object (&stream); } static void module_stream_v1_test_rpm_filters (void) { g_autoptr (ModulemdModuleStreamV1) stream = NULL; g_auto (GStrv) filters = NULL; stream = modulemd_module_stream_v1_new ("sssd", NULL); // Test add_rpm_filter modulemd_module_stream_v1_add_rpm_filter (stream, "foo"); modulemd_module_stream_v1_add_rpm_filter (stream, "bar"); filters = modulemd_module_stream_v1_get_rpm_filters_as_strv (stream); g_assert_true (g_strv_contains ((const gchar *const *)filters, "foo")); g_assert_true (g_strv_contains ((const gchar *const *)filters, "bar")); g_assert_cmpint (g_strv_length (filters), ==, 2); g_clear_pointer (&filters, g_strfreev); // Test remove_rpm_filter modulemd_module_stream_v1_remove_rpm_filter (stream, "foo"); filters = modulemd_module_stream_v1_get_rpm_filters_as_strv (stream); g_assert_true (g_strv_contains ((const gchar *const *)filters, "bar")); g_assert_cmpint (g_strv_length (filters), ==, 1); g_clear_pointer (&filters, g_strfreev); // Test clear_rpm_filters modulemd_module_stream_v1_clear_rpm_filters (stream); filters = modulemd_module_stream_v1_get_rpm_filters_as_strv (stream); g_assert_cmpint (g_strv_length (filters), ==, 0); g_clear_pointer (&filters, g_strfreev); g_clear_object (&stream); } static void module_stream_v2_test_rpm_filters (void) { g_autoptr (ModulemdModuleStreamV2) stream = NULL; g_auto (GStrv) filters = NULL; stream = modulemd_module_stream_v2_new ("sssd", NULL); // Test add_rpm_filter modulemd_module_stream_v2_add_rpm_filter (stream, "foo"); modulemd_module_stream_v2_add_rpm_filter (stream, "bar"); filters = modulemd_module_stream_v2_get_rpm_filters_as_strv (stream); g_assert_true (g_strv_contains ((const gchar *const *)filters, "foo")); g_assert_true (g_strv_contains ((const gchar *const *)filters, "bar")); g_assert_cmpint (g_strv_length (filters), ==, 2); g_clear_pointer (&filters, g_strfreev); // Test remove_rpm_filter modulemd_module_stream_v2_remove_rpm_filter (stream, "foo"); filters = modulemd_module_stream_v2_get_rpm_filters_as_strv (stream); g_assert_true (g_strv_contains ((const gchar *const *)filters, "bar")); g_assert_cmpint (g_strv_length (filters), ==, 1); g_clear_pointer (&filters, g_strfreev); // Test clear_rpm_filters modulemd_module_stream_v2_clear_rpm_filters (stream); filters = modulemd_module_stream_v2_get_rpm_filters_as_strv (stream); g_assert_cmpint (g_strv_length (filters), ==, 0); g_clear_pointer (&filters, g_strfreev); g_clear_object (&stream); } static void module_stream_v2_test_demodularized_rpms (void) { g_autoptr (ModulemdModuleStreamV2) stream = NULL; g_auto (GStrv) demodularized = NULL; stream = modulemd_module_stream_v2_new ("sssd", NULL); // Test add_demodularized_rpm modulemd_module_stream_v2_add_demodularized_rpm (stream, "foo"); modulemd_module_stream_v2_add_demodularized_rpm (stream, "bar"); demodularized = modulemd_module_stream_v2_get_demodularized_rpms (stream); g_assert_true (g_strv_contains ((const gchar *const *)demodularized, "foo")); g_assert_true (g_strv_contains ((const gchar *const *)demodularized, "bar")); g_assert_cmpint (g_strv_length (demodularized), ==, 2); g_clear_pointer (&demodularized, g_strfreev); // Test remove_demodularized_rpm modulemd_module_stream_v2_remove_demodularized_rpm (stream, "foo"); demodularized = modulemd_module_stream_v2_get_demodularized_rpms (stream); g_assert_true (g_strv_contains ((const gchar *const *)demodularized, "bar")); g_assert_cmpint (g_strv_length (demodularized), ==, 1); g_clear_pointer (&demodularized, g_strfreev); // Test clear_demodularized_rpms modulemd_module_stream_v2_clear_demodularized_rpms (stream); demodularized = modulemd_module_stream_v2_get_demodularized_rpms (stream); g_assert_cmpint (g_strv_length (demodularized), ==, 0); g_clear_pointer (&demodularized, g_strfreev); g_clear_object (&stream); } static void module_stream_test_upgrade_v1_to_v2 (void) { gboolean ret; g_autoptr (ModulemdModuleStreamV1) streamV1 = NULL; g_autoptr (ModulemdModuleStream) updated_stream = NULL; g_autoptr (ModulemdModuleIndex) index = NULL; g_autoptr (GError) error = NULL; g_autofree gchar *yaml_str = NULL; streamV1 = modulemd_module_stream_v1_new ("SuperModule", "latest"); modulemd_module_stream_v1_set_summary (streamV1, "Summary"); modulemd_module_stream_v1_set_description (streamV1, "Description"); modulemd_module_stream_v1_add_module_license (streamV1, "DUMMY"); modulemd_module_stream_v1_add_buildtime_requirement ( streamV1, "ModuleA", "streamZ"); modulemd_module_stream_v1_add_buildtime_requirement ( streamV1, "ModuleB", "streamY"); modulemd_module_stream_v1_add_runtime_requirement ( streamV1, "ModuleA", "streamZ"); modulemd_module_stream_v1_add_runtime_requirement ( streamV1, "ModuleB", "streamY"); G_GNUC_BEGIN_IGNORE_DEPRECATIONS updated_stream = modulemd_module_stream_upgrade ( MODULEMD_MODULE_STREAM (streamV1), MD_MODULESTREAM_VERSION_TWO, &error); G_GNUC_END_IGNORE_DEPRECATIONS g_assert_no_error (error); g_assert_nonnull (updated_stream); index = modulemd_module_index_new (); ret = modulemd_module_index_add_module_stream ( index, MODULEMD_MODULE_STREAM (updated_stream), &error); g_assert_no_error (error); g_assert_true (ret); yaml_str = modulemd_module_index_dump_to_string (index, &error); g_assert_no_error (error); g_assert_cmpstr (yaml_str, ==, "---\n" "document: modulemd\n" "version: 2\n" "data:\n" " name: SuperModule\n" " stream: \"latest\"\n" " summary: Summary\n" " description: >-\n" " Description\n" " license:\n" " module:\n" " - DUMMY\n" " dependencies:\n" " - buildrequires:\n" " ModuleA: [streamZ]\n" " ModuleB: [streamY]\n" " requires:\n" " ModuleA: [streamZ]\n" " ModuleB: [streamY]\n" "...\n"); g_clear_object (&streamV1); g_clear_object (&updated_stream); g_clear_object (&index); g_clear_object (&error); g_clear_pointer (&yaml_str, g_free); } static void module_stream_test_v2_yaml (void) { g_autoptr (ModulemdModuleStream) stream = NULL; ModulemdModuleStreamV2 *streamV2 = NULL; g_autofree gchar *module_name_prop = NULL; g_autofree gchar *stream_name_prop = NULL; g_autofree gchar *context_prop = NULL; g_autofree gchar *arch_prop = NULL; guint64 version_prop = 0; g_autoptr (GError) error = NULL; g_auto (GStrv) rpm_apis = NULL; g_auto (GStrv) rpm_filters = NULL; g_auto (GStrv) demodularized_rpms = NULL; g_auto (GStrv) rpm_artifacts = NULL; g_auto (GStrv) servicelevel_names = NULL; ModulemdServiceLevel *sl = NULL; g_autofree gchar *sl_name_prop = NULL; g_autofree gchar *sl_eol_string = NULL; g_auto (GStrv) content_licenses = NULL; g_auto (GStrv) module_licenses = NULL; g_auto (GStrv) stream_dependencies = NULL; g_autofree gchar *community_prop = NULL; g_autofree gchar *documentation_prop = NULL; g_autofree gchar *tracker_prop = NULL; g_auto (GStrv) profile_names = NULL; ModulemdBuildopts *buildopts = NULL; g_autofree gchar *buildopts_rpm_macros_prop = NULL; g_auto (GStrv) buildopts_rpm_allowed_build_names = NULL; g_auto (GStrv) buildopts_arches = NULL; GVariant *tmp_variant = NULL; GVariantDict *xmd_dict = NULL; GVariantDict *tmp_dict = NULL; gchar *tmp_str = NULL; gboolean *tmp_bool = NULL; GPtrArray *dependencies = NULL; G_GNUC_BEGIN_IGNORE_DEPRECATIONS stream = modulemd_module_stream_read_string ( "---\n" "document: modulemd\n" "version: 2\n" "data:\n" " name: modulename\n" " stream: \"streamname\"\n" " version: 1\n" " context: c0ffe3\n" " arch: x86_64\n" " summary: Module Summary\n" " description: >-\n" " Module Description\n" " api:\n" " rpms:\n" " - rpm_a\n" " - rpm_b\n" " filter:\n" " rpms: rpm_c\n" " demodularized:\n" " rpms:\n" " - rpm_d\n" " artifacts:\n" " rpms:\n" " - bar-0:1.23-1.module_deadbeef.x86_64\n" " servicelevels:\n" " rawhide: {}\n" " production:\n" " eol: 2099-12-31\n" " license:\n" " content:\n" " - DUMMY1\n" " - DUMMY2\n" " module: DUMMY3\n" " dependencies:\n" " - buildrequires:\n" " platform: [-f27, -f28, -epel7]\n" " requires:\n" " platform: [-f27, -f28, -epel7]\n" " - buildrequires:\n" " platform: [f27]\n" " buildtools: [v1, v2]\n" " compatible: [v3]\n" " requires:\n" " platform: [f27]\n" " compatible: [v3, v4]\n" " - buildrequires:\n" " platform: [f28]\n" " requires:\n" " platform: [f28]\n" " runtime: [a, b]\n" " - buildrequires:\n" " platform: [epel7]\n" " extras: []\n" " moreextras: [foo, bar]\n" " requires:\n" " platform: [epel7]\n" " extras: []\n" " moreextras: [foo, bar]\n" " references:\n" " community: http://www.example.com/\n" " documentation: http://www.example.com/\n" " tracker: http://www.example.com/\n" " profiles:\n" " default:\n" " rpms:\n" " - bar\n" " - bar-extras\n" " - baz\n" " container:\n" " rpms:\n" " - bar\n" " - bar-devel\n" " minimal:\n" " description: Minimal profile installing only the bar " "package.\n" " rpms:\n" " - bar\n" " buildroot:\n" " rpms:\n" " - bar-devel\n" " srpm-buildroot:\n" " rpms:\n" " - bar-extras\n" " buildopts:\n" " rpms:\n" " macros: |\n" " %demomacro 1\n" " %demomacro2 %{demomacro}23\n" " whitelist:\n" " - fooscl-1-bar\n" " - fooscl-1-baz\n" " - xxx\n" " - xyz\n" " arches: [i686, x86_64]\n" " components:\n" " rpms:\n" " bar:\n" " rationale: We need this to demonstrate stuff.\n" " repository: https://pagure.io/bar.git\n" " cache: https://example.com/cache\n" " ref: 26ca0c0\n" " baz:\n" " rationale: This one is here to demonstrate other stuff.\n" " xxx:\n" " rationale: xxx demonstrates arches and multilib.\n" " arches: [i686, x86_64]\n" " multilib: [x86_64]\n" " xyz:\n" " rationale: xyz is a bundled dependency of xxx.\n" " buildorder: 10\n" " modules:\n" " includedmodule:\n" " rationale: Included in the stack, just because.\n" " repository: https://pagure.io/includedmodule.git\n" " ref: somecoolbranchname\n" " buildorder: 100\n" " xmd:\n" " some_key: some_data\n" " some_list:\n" " - a\n" " - b\n" " some_dict:\n" " a: alpha\n" " b: beta\n" " some_other_list:\n" " - c\n" " - d\n" " some_other_dict:\n" " another_key: more_data\n" " yet_another_key:\n" " - this\n" " - is\n" " - getting\n" " - silly\n" " can_bool: TRUE\n" "...\n", TRUE, NULL, NULL, &error); G_GNUC_END_IGNORE_DEPRECATIONS g_assert_no_error (error); g_assert_nonnull (stream); streamV2 = MODULEMD_MODULE_STREAM_V2 (stream); g_object_get (streamV2, "module-name", &module_name_prop, NULL); g_object_get (streamV2, "stream-name", &stream_name_prop, NULL); g_object_get (streamV2, "version", &version_prop, NULL); g_object_get (streamV2, "context", &context_prop, NULL); g_object_get (streamV2, "arch", &arch_prop, NULL); g_assert_cmpstr (module_name_prop, ==, "modulename"); g_assert_cmpstr (stream_name_prop, ==, "streamname"); g_assert_cmpuint (version_prop, ==, 1); g_assert_cmpstr (context_prop, ==, "c0ffe3"); g_assert_cmpstr (arch_prop, ==, "x86_64"); g_assert_cmpstr (modulemd_module_stream_v2_get_summary (streamV2, "C"), ==, "Module Summary"); g_assert_cmpstr (modulemd_module_stream_v2_get_description (streamV2, "C"), ==, "Module Description"); rpm_apis = modulemd_module_stream_v2_get_rpm_api_as_strv (streamV2); rpm_filters = modulemd_module_stream_v2_get_rpm_filters_as_strv (streamV2); demodularized_rpms = modulemd_module_stream_v2_get_demodularized_rpms (streamV2); rpm_artifacts = modulemd_module_stream_v2_get_rpm_artifacts_as_strv (streamV2); servicelevel_names = modulemd_module_stream_v2_get_servicelevel_names_as_strv (streamV2); g_assert_true (g_strv_contains ((const gchar *const *)rpm_apis, "rpm_a")); g_assert_true (g_strv_contains ((const gchar *const *)rpm_apis, "rpm_b")); g_assert_true (g_strv_contains ((const gchar *const *)rpm_filters, "rpm_c")); g_assert_true ( g_strv_contains ((const gchar *const *)demodularized_rpms, "rpm_d")); g_assert_true (g_strv_contains ((const gchar *const *)rpm_artifacts, "bar-0:1.23-1.module_deadbeef.x86_64")); g_assert_true ( g_strv_contains ((const gchar *const *)servicelevel_names, "rawhide")); g_assert_true ( g_strv_contains ((const gchar *const *)servicelevel_names, "production")); sl = modulemd_module_stream_v2_get_servicelevel (streamV2, "rawhide"); g_assert_nonnull (sl); g_object_get (sl, "name", &sl_name_prop, NULL); g_assert_cmpstr (sl_name_prop, ==, "rawhide"); g_assert_null (modulemd_service_level_get_eol (sl)); g_clear_pointer (&sl_name_prop, g_free); sl = modulemd_module_stream_v2_get_servicelevel (streamV2, "production"); g_assert_nonnull (sl); g_object_get (sl, "name", &sl_name_prop, NULL); g_assert_cmpstr (sl_name_prop, ==, "production"); g_assert_nonnull (modulemd_service_level_get_eol (sl)); sl_eol_string = modulemd_service_level_get_eol_as_string (sl); g_assert_cmpstr (sl_eol_string, ==, "2099-12-31"); g_clear_pointer (&sl_name_prop, g_free); g_clear_pointer (&sl_eol_string, g_free); content_licenses = modulemd_module_stream_v2_get_content_licenses_as_strv (streamV2); module_licenses = modulemd_module_stream_v2_get_module_licenses_as_strv (streamV2); g_assert_true ( g_strv_contains ((const gchar *const *)content_licenses, "DUMMY1")); g_assert_true ( g_strv_contains ((const gchar *const *)content_licenses, "DUMMY2")); g_assert_true ( g_strv_contains ((const gchar *const *)module_licenses, "DUMMY3")); dependencies = modulemd_module_stream_v2_get_dependencies (streamV2); g_assert_cmpint (dependencies->len, ==, 4); g_object_get (streamV2, "community", &community_prop, NULL); g_object_get (streamV2, "documentation", &documentation_prop, NULL); g_object_get (streamV2, "tracker", &tracker_prop, NULL); g_assert_cmpstr (community_prop, ==, "http://www.example.com/"); g_assert_cmpstr (documentation_prop, ==, "http://www.example.com/"); g_assert_cmpstr (tracker_prop, ==, "http://www.example.com/"); profile_names = modulemd_module_stream_v2_get_profile_names_as_strv (streamV2); g_assert_cmpint (g_strv_length (profile_names), ==, 5); buildopts = modulemd_module_stream_v2_get_buildopts (streamV2); g_assert_nonnull (buildopts); g_object_get (buildopts, "rpm_macros", &buildopts_rpm_macros_prop, NULL); g_assert_cmpstr (buildopts_rpm_macros_prop, ==, "%demomacro 1\n%demomacro2 %{demomacro}23\n"); buildopts_rpm_allowed_build_names = modulemd_buildopts_get_rpm_whitelist_as_strv (buildopts); buildopts_arches = modulemd_buildopts_get_arches_as_strv (buildopts); g_assert_true (g_strv_contains ( (const gchar *const *)buildopts_rpm_allowed_build_names, "fooscl-1-bar")); g_assert_true (g_strv_contains ( (const gchar *const *)buildopts_rpm_allowed_build_names, "fooscl-1-baz")); g_assert_true (g_strv_contains ( (const gchar *const *)buildopts_rpm_allowed_build_names, "xxx")); g_assert_true (g_strv_contains ( (const gchar *const *)buildopts_rpm_allowed_build_names, "xyz")); g_assert_true ( g_strv_contains ((const gchar *const *)buildopts_arches, "i686")); g_assert_true ( g_strv_contains ((const gchar *const *)buildopts_arches, "x86_64")); // Load XMD into dictionary tmp_variant = modulemd_module_stream_v2_get_xmd (streamV2); g_assert_nonnull (tmp_variant); xmd_dict = g_variant_dict_new (tmp_variant); // Check xmd["some_key"] == "some_data" g_assert_true (g_variant_dict_contains (xmd_dict, "some_key")); g_assert_true (g_variant_dict_lookup (xmd_dict, "some_key", "&s", &tmp_str)); g_assert_cmpstr (tmp_str, ==, "some_data"); // Check xmd["some_list"][0] == "a" and xmd["some_list"][1] == "b" g_assert_true (g_variant_dict_contains (xmd_dict, "some_list")); g_assert_true ( g_variant_dict_lookup (xmd_dict, "some_list", "@as", &tmp_variant)); g_variant_get_child (tmp_variant, 0, "&s", &tmp_str); g_assert_cmpstr (tmp_str, ==, "a"); g_variant_get_child (tmp_variant, 1, "&s", &tmp_str); g_assert_cmpstr (tmp_str, ==, "b"); g_clear_pointer (&tmp_variant, g_variant_unref); // Check xmd["some_dict"]["a"] == "alpha" g_assert_true (g_variant_dict_contains (xmd_dict, "some_dict")); g_assert_true ( g_variant_dict_lookup (xmd_dict, "some_dict", "@a{sv}", &tmp_variant)); tmp_dict = g_variant_dict_new (tmp_variant); g_assert_true (g_variant_dict_contains (tmp_dict, "a")); g_assert_true (g_variant_dict_lookup (tmp_dict, "a", "&s", &tmp_str)); g_assert_cmpstr (tmp_str, ==, "alpha"); g_clear_pointer (&tmp_variant, g_variant_unref); // Check xmd["some_dict"]["some_other_dict"]["another_key"] == "more_data" g_assert_true (g_variant_dict_contains (tmp_dict, "some_other_dict")); g_assert_true (g_variant_dict_lookup ( tmp_dict, "some_other_dict", "@a{sv}", &tmp_variant)); g_clear_pointer (&tmp_dict, g_variant_dict_unref); tmp_dict = g_variant_dict_new (tmp_variant); g_assert_true (g_variant_dict_contains (tmp_dict, "another_key")); g_assert_true ( g_variant_dict_lookup (tmp_dict, "another_key", "&s", &tmp_str)); g_assert_cmpstr (tmp_str, ==, "more_data"); g_clear_pointer (&tmp_variant, g_variant_unref); // Check xmd["some_dict"]["some_other_dict"]["yet_another_key"][3] == "silly" g_assert_true ( g_variant_dict_lookup (tmp_dict, "yet_another_key", "@as", &tmp_variant)); g_variant_get_child (tmp_variant, 3, "&s", &tmp_str); g_assert_cmpstr (tmp_str, ==, "silly"); g_clear_pointer (&tmp_variant, g_variant_unref); g_clear_pointer (&tmp_dict, g_variant_dict_unref); // Check xmd["can_bool"] == TRUE g_assert_true (g_variant_dict_lookup (xmd_dict, "can_bool", "b", &tmp_bool)); g_assert_true (tmp_bool); g_clear_pointer (&xmd_dict, g_variant_dict_unref); // Cleanup g_clear_object (&stream); g_clear_pointer (&module_name_prop, g_free); g_clear_pointer (&stream_name_prop, g_free); g_clear_pointer (&context_prop, g_free); g_clear_pointer (&arch_prop, g_free); g_clear_pointer (&error, g_error_free); g_clear_pointer (&rpm_apis, g_strfreev); g_clear_pointer (&rpm_filters, g_strfreev); g_clear_pointer (&demodularized_rpms, g_strfreev); g_clear_pointer (&rpm_artifacts, g_strfreev); g_clear_pointer (&servicelevel_names, g_strfreev); g_clear_pointer (&sl_name_prop, g_free); g_clear_pointer (&sl_eol_string, g_free); g_clear_pointer (&content_licenses, g_strfreev); g_clear_pointer (&module_licenses, g_strfreev); g_clear_pointer (&stream_dependencies, g_strfreev); g_clear_pointer (&community_prop, g_free); g_clear_pointer (&documentation_prop, g_free); g_clear_pointer (&tracker_prop, g_free); g_clear_pointer (&profile_names, g_strfreev); g_clear_pointer (&buildopts_rpm_macros_prop, g_free); g_clear_pointer (&buildopts_rpm_allowed_build_names, g_strfreev); g_clear_pointer (&buildopts_arches, g_strfreev); // Validate a trivial modulemd G_GNUC_BEGIN_IGNORE_DEPRECATIONS stream = modulemd_module_stream_read_string ( "---\n" "document: modulemd\n" "version: 2\n" "data:\n" " summary: Trivial Summary\n" " description: >-\n" " Trivial Description\n" " license:\n" " module: DUMMY\n" "...\n", TRUE, NULL, NULL, &error); G_GNUC_END_IGNORE_DEPRECATIONS g_assert_no_error (error); g_assert_nonnull (stream); g_clear_object (&stream); // Sanity check spec.v2.yaml gchar *specV2Path = g_strdup_printf ("%s/yaml_specs/modulemd_stream_v2.yaml", g_getenv ("MESON_SOURCE_ROOT")); G_GNUC_BEGIN_IGNORE_DEPRECATIONS stream = modulemd_module_stream_read_file (specV2Path, TRUE, NULL, NULL, &error); G_GNUC_END_IGNORE_DEPRECATIONS g_assert_no_error (error); g_assert_nonnull (stream); g_clear_object (&stream); g_clear_pointer (&specV2Path, g_free); } static void module_packager_v2_sanity (void) { g_autoptr (ModulemdModuleStream) stream = NULL; g_autoptr (GError) error = NULL; g_autofree gchar *specV2Path = g_strdup_printf ( "%s/yaml_specs/modulemd_packager_v2.yaml", g_getenv ("MESON_SOURCE_ROOT")); G_GNUC_BEGIN_IGNORE_DEPRECATIONS stream = modulemd_module_stream_read_file (specV2Path, TRUE, NULL, NULL, &error); G_GNUC_END_IGNORE_DEPRECATIONS g_assert_no_error (error); g_assert_nonnull (stream); g_clear_object (&stream); g_clear_pointer (&specV2Path, g_free); } static void module_packager_v3_sanity (void) { g_autoptr (ModulemdModuleStream) stream = NULL; g_autoptr (GError) error = NULL; g_autofree gchar *packagerV3Path = g_strdup_printf ( "%s/yaml_specs/modulemd_packager_v3.yaml", g_getenv ("MESON_SOURCE_ROOT")); G_GNUC_BEGIN_IGNORE_DEPRECATIONS stream = modulemd_module_stream_read_file ( packagerV3Path, TRUE, NULL, NULL, &error); G_GNUC_END_IGNORE_DEPRECATIONS g_assert_no_error (error); g_assert_nonnull (stream); /* confirm packager v3 document was returned as stream v2 */ g_assert_true (MODULEMD_IS_MODULE_STREAM_V2 (stream)); g_clear_object (&stream); g_clear_pointer (&packagerV3Path, g_free); } static void module_stream_v1_test_rpm_artifacts (void) { g_autoptr (ModulemdModuleStreamV1) stream = NULL; g_auto (GStrv) artifacts = NULL; stream = modulemd_module_stream_v1_new (NULL, NULL); modulemd_module_stream_v1_add_rpm_artifact ( stream, "bar-0:1.23-1.module_deadbeef.x86_64"); artifacts = modulemd_module_stream_v1_get_rpm_artifacts_as_strv (stream); g_assert_true (g_strv_contains ((const gchar *const *)artifacts, "bar-0:1.23-1.module_deadbeef.x86_64")); g_assert_cmpint (g_strv_length (artifacts), ==, 1); g_clear_pointer (&artifacts, g_strfreev); modulemd_module_stream_v1_remove_rpm_artifact ( stream, "bar-0:1.23-1.module_deadbeef.x86_64"); artifacts = modulemd_module_stream_v1_get_rpm_artifacts_as_strv (stream); g_assert_cmpint (g_strv_length (artifacts), ==, 0); g_clear_pointer (&artifacts, g_strfreev); g_clear_object (&stream); } static void module_stream_v2_test_rpm_artifacts (void) { g_autoptr (ModulemdModuleStreamV2) stream = NULL; g_auto (GStrv) artifacts = NULL; stream = modulemd_module_stream_v2_new (NULL, NULL); modulemd_module_stream_v2_add_rpm_artifact ( stream, "bar-0:1.23-1.module_deadbeef.x86_64"); artifacts = modulemd_module_stream_v2_get_rpm_artifacts_as_strv (stream); g_assert_true (g_strv_contains ((const gchar *const *)artifacts, "bar-0:1.23-1.module_deadbeef.x86_64")); g_assert_cmpint (g_strv_length (artifacts), ==, 1); g_clear_pointer (&artifacts, g_strfreev); modulemd_module_stream_v2_remove_rpm_artifact ( stream, "bar-0:1.23-1.module_deadbeef.x86_64"); artifacts = modulemd_module_stream_v2_get_rpm_artifacts_as_strv (stream); g_assert_cmpint (g_strv_length (artifacts), ==, 0); g_clear_pointer (&artifacts, g_strfreev); g_clear_object (&stream); } static void module_stream_v1_test_servicelevels (void) { g_autoptr (ModulemdModuleStreamV1) stream = NULL; g_auto (GStrv) servicelevel_names = NULL; g_autoptr (ModulemdServiceLevel) sl = NULL; ModulemdServiceLevel *sl_retrieved = NULL; g_autofree gchar *name_prop = NULL; g_autofree gchar *eol_str = NULL; stream = modulemd_module_stream_v1_new (NULL, NULL); sl = modulemd_service_level_new ("rawhide"); modulemd_service_level_set_eol_ymd (sl, 1980, 3, 2); modulemd_module_stream_v1_add_servicelevel (stream, sl); servicelevel_names = modulemd_module_stream_v1_get_servicelevel_names_as_strv (stream); g_assert_true ( g_strv_contains ((const gchar *const *)servicelevel_names, "rawhide")); g_assert_cmpint (g_strv_length (servicelevel_names), ==, 1); sl_retrieved = modulemd_module_stream_v1_get_servicelevel (stream, "rawhide"); g_object_get (sl_retrieved, "name", &name_prop, NULL); eol_str = modulemd_service_level_get_eol_as_string (sl_retrieved); g_assert_cmpstr (name_prop, ==, "rawhide"); g_assert_cmpstr (eol_str, ==, "1980-03-02"); g_clear_object (&sl); g_clear_object (&stream); g_clear_pointer (&name_prop, g_free); g_clear_pointer (&eol_str, g_free); g_clear_pointer (&servicelevel_names, g_strfreev); } static void module_stream_v2_test_servicelevels (void) { g_autoptr (ModulemdModuleStreamV2) stream = NULL; g_auto (GStrv) servicelevel_names = NULL; g_autoptr (ModulemdServiceLevel) sl = NULL; ModulemdServiceLevel *sl_retrieved = NULL; g_autofree gchar *name_prop = NULL; g_autofree gchar *eol_str = NULL; stream = modulemd_module_stream_v2_new (NULL, NULL); sl = modulemd_service_level_new ("rawhide"); modulemd_service_level_set_eol_ymd (sl, 1980, 3, 2); modulemd_module_stream_v2_add_servicelevel (stream, sl); servicelevel_names = modulemd_module_stream_v2_get_servicelevel_names_as_strv (stream); g_assert_true ( g_strv_contains ((const gchar *const *)servicelevel_names, "rawhide")); g_assert_cmpint (g_strv_length (servicelevel_names), ==, 1); sl_retrieved = modulemd_module_stream_v2_get_servicelevel (stream, "rawhide"); g_object_get (sl_retrieved, "name", &name_prop, NULL); eol_str = modulemd_service_level_get_eol_as_string (sl_retrieved); g_assert_cmpstr (name_prop, ==, "rawhide"); g_assert_cmpstr (eol_str, ==, "1980-03-02"); g_clear_object (&sl); g_clear_object (&stream); g_clear_pointer (&name_prop, g_free); g_clear_pointer (&eol_str, g_free); g_clear_pointer (&servicelevel_names, g_strfreev); } static void module_stream_v1_test_documentation (void) { g_autoptr (ModulemdModuleStreamV1) stream = NULL; const gchar *documentation = NULL; g_autofree gchar *documentation_prop = NULL; stream = modulemd_module_stream_v1_new (NULL, NULL); // Check the defaults documentation = modulemd_module_stream_v1_get_documentation (stream); g_object_get (stream, MMD_TEST_DOC_PROP, &documentation_prop, NULL); g_assert_null (documentation); g_assert_null (documentation_prop); g_clear_pointer (&documentation_prop, g_free); // Test property setting g_object_set (stream, MMD_TEST_DOC_PROP, MMD_TEST_DOC_TEXT, NULL); documentation = modulemd_module_stream_v1_get_documentation (stream); g_object_get (stream, MMD_TEST_DOC_PROP, &documentation_prop, NULL); g_assert_cmpstr (documentation_prop, ==, MMD_TEST_DOC_TEXT); g_assert_cmpstr (documentation, ==, MMD_TEST_DOC_TEXT); g_clear_pointer (&documentation_prop, g_free); // Test set_documentation() modulemd_module_stream_v1_set_documentation (stream, MMD_TEST_DOC_TEXT2); documentation = modulemd_module_stream_v1_get_documentation (stream); g_object_get (stream, MMD_TEST_DOC_PROP, &documentation_prop, NULL); g_assert_cmpstr (documentation_prop, ==, MMD_TEST_DOC_TEXT2); g_assert_cmpstr (documentation, ==, MMD_TEST_DOC_TEXT2); g_clear_pointer (&documentation_prop, g_free); // Test setting to NULL g_object_set (stream, MMD_TEST_DOC_PROP, NULL, NULL); documentation = modulemd_module_stream_v1_get_documentation (stream); g_object_get (stream, MMD_TEST_DOC_PROP, &documentation_prop, NULL); g_assert_null (documentation); g_assert_null (documentation_prop); g_clear_pointer (&documentation_prop, g_free); // Test unicode characters modulemd_module_stream_v1_set_documentation (stream, MMD_TEST_DOC_UNICODE_TEXT); documentation = modulemd_module_stream_v1_get_documentation (stream); g_object_get (stream, MMD_TEST_DOC_PROP, &documentation_prop, NULL); g_assert_cmpstr (documentation_prop, ==, MMD_TEST_DOC_UNICODE_TEXT); g_assert_cmpstr (documentation, ==, MMD_TEST_DOC_UNICODE_TEXT); g_clear_pointer (&documentation_prop, g_free); g_clear_object (&stream); } static void module_stream_v2_test_documentation (void) { g_autoptr (ModulemdModuleStreamV2) stream = NULL; const gchar *documentation = NULL; g_autofree gchar *documentation_prop = NULL; stream = modulemd_module_stream_v2_new (NULL, NULL); // Check the defaults documentation = modulemd_module_stream_v2_get_documentation (stream); g_object_get (stream, MMD_TEST_DOC_PROP, &documentation_prop, NULL); g_assert_null (documentation); g_assert_null (documentation_prop); g_clear_pointer (&documentation_prop, g_free); // Test property setting g_object_set (stream, MMD_TEST_DOC_PROP, MMD_TEST_DOC_TEXT, NULL); documentation = modulemd_module_stream_v2_get_documentation (stream); g_object_get (stream, MMD_TEST_DOC_PROP, &documentation_prop, NULL); g_assert_cmpstr (documentation_prop, ==, MMD_TEST_DOC_TEXT); g_assert_cmpstr (documentation, ==, MMD_TEST_DOC_TEXT); g_clear_pointer (&documentation_prop, g_free); // Test set_documentation() modulemd_module_stream_v2_set_documentation (stream, MMD_TEST_DOC_TEXT2); documentation = modulemd_module_stream_v2_get_documentation (stream); g_object_get (stream, MMD_TEST_DOC_PROP, &documentation_prop, NULL); g_assert_cmpstr (documentation_prop, ==, MMD_TEST_DOC_TEXT2); g_assert_cmpstr (documentation, ==, MMD_TEST_DOC_TEXT2); g_clear_pointer (&documentation_prop, g_free); // Test setting to NULL g_object_set (stream, MMD_TEST_DOC_PROP, NULL, NULL); documentation = modulemd_module_stream_v2_get_documentation (stream); g_object_get (stream, MMD_TEST_DOC_PROP, &documentation_prop, NULL); g_assert_null (documentation); g_assert_null (documentation_prop); g_clear_pointer (&documentation_prop, g_free); // Test unicode characters modulemd_module_stream_v2_set_documentation (stream, MMD_TEST_DOC_UNICODE_TEXT); documentation = modulemd_module_stream_v2_get_documentation (stream); g_object_get (stream, MMD_TEST_DOC_PROP, &documentation_prop, NULL); g_assert_cmpstr (documentation_prop, ==, MMD_TEST_DOC_UNICODE_TEXT); g_assert_cmpstr (documentation, ==, MMD_TEST_DOC_UNICODE_TEXT); g_clear_pointer (&documentation_prop, g_free); g_clear_object (&stream); } static void module_stream_v1_test_tracker (void) { g_autoptr (ModulemdModuleStreamV1) stream = NULL; g_autofree gchar *tracker_prop = NULL; const gchar *tracker = NULL; stream = modulemd_module_stream_v1_new (NULL, NULL); // Check the defaults g_object_get (stream, MMD_TEST_TRACKER_PROP, &tracker_prop, NULL); tracker = modulemd_module_stream_v1_get_tracker (stream); g_assert_null (tracker); g_assert_null (tracker_prop); g_clear_pointer (&tracker_prop, g_free); // Test property setting g_object_set (stream, MMD_TEST_TRACKER_PROP, MMD_TEST_DOC_TEXT, NULL); g_object_get (stream, MMD_TEST_TRACKER_PROP, &tracker_prop, NULL); tracker = modulemd_module_stream_v1_get_tracker (stream); g_assert_cmpstr (tracker, ==, MMD_TEST_DOC_TEXT); g_assert_cmpstr (tracker_prop, ==, MMD_TEST_DOC_TEXT); g_clear_pointer (&tracker_prop, g_free); // Test set_tracker modulemd_module_stream_v1_set_tracker (stream, MMD_TEST_DOC_TEXT2); g_object_get (stream, MMD_TEST_TRACKER_PROP, &tracker_prop, NULL); tracker = modulemd_module_stream_v1_get_tracker (stream); g_assert_cmpstr (tracker, ==, MMD_TEST_DOC_TEXT2); g_assert_cmpstr (tracker_prop, ==, MMD_TEST_DOC_TEXT2); g_clear_pointer (&tracker_prop, g_free); // Test setting it to NULL g_object_set (stream, MMD_TEST_TRACKER_PROP, NULL, NULL); g_object_get (stream, MMD_TEST_TRACKER_PROP, &tracker_prop, NULL); tracker = modulemd_module_stream_v1_get_tracker (stream); g_assert_null (tracker); g_assert_null (tracker_prop); g_clear_pointer (&tracker_prop, g_free); // Test Unicode values modulemd_module_stream_v1_set_tracker (stream, MMD_TEST_DOC_UNICODE_TEXT); g_object_get (stream, MMD_TEST_TRACKER_PROP, &tracker_prop, NULL); tracker = modulemd_module_stream_v1_get_tracker (stream); g_assert_cmpstr (tracker, ==, MMD_TEST_DOC_UNICODE_TEXT); g_assert_cmpstr (tracker_prop, ==, MMD_TEST_DOC_UNICODE_TEXT); g_clear_pointer (&tracker_prop, g_free); g_clear_object (&stream); } static void module_stream_v2_test_tracker (void) { g_autoptr (ModulemdModuleStreamV2) stream = NULL; g_autofree gchar *tracker_prop = NULL; const gchar *tracker = NULL; stream = modulemd_module_stream_v2_new (NULL, NULL); // Check the defaults g_object_get (stream, MMD_TEST_TRACKER_PROP, &tracker_prop, NULL); tracker = modulemd_module_stream_v2_get_tracker (stream); g_assert_null (tracker); g_assert_null (tracker_prop); g_clear_pointer (&tracker_prop, g_free); // Test property setting g_object_set (stream, MMD_TEST_TRACKER_PROP, MMD_TEST_DOC_TEXT, NULL); g_object_get (stream, MMD_TEST_TRACKER_PROP, &tracker_prop, NULL); tracker = modulemd_module_stream_v2_get_tracker (stream); g_assert_cmpstr (tracker, ==, MMD_TEST_DOC_TEXT); g_assert_cmpstr (tracker_prop, ==, MMD_TEST_DOC_TEXT); g_clear_pointer (&tracker_prop, g_free); // Test set_tracker modulemd_module_stream_v2_set_tracker (stream, MMD_TEST_DOC_TEXT2); g_object_get (stream, MMD_TEST_TRACKER_PROP, &tracker_prop, NULL); tracker = modulemd_module_stream_v2_get_tracker (stream); g_assert_cmpstr (tracker, ==, MMD_TEST_DOC_TEXT2); g_assert_cmpstr (tracker_prop, ==, MMD_TEST_DOC_TEXT2); g_clear_pointer (&tracker_prop, g_free); // Test setting it to NULL g_object_set (stream, MMD_TEST_TRACKER_PROP, NULL, NULL); g_object_get (stream, MMD_TEST_TRACKER_PROP, &tracker_prop, NULL); tracker = modulemd_module_stream_v2_get_tracker (stream); g_assert_null (tracker); g_assert_null (tracker_prop); g_clear_pointer (&tracker_prop, g_free); // Test Unicode values modulemd_module_stream_v2_set_tracker (stream, MMD_TEST_DOC_UNICODE_TEXT); g_object_get (stream, MMD_TEST_TRACKER_PROP, &tracker_prop, NULL); tracker = modulemd_module_stream_v2_get_tracker (stream); g_assert_cmpstr (tracker, ==, MMD_TEST_DOC_UNICODE_TEXT); g_assert_cmpstr (tracker_prop, ==, MMD_TEST_DOC_UNICODE_TEXT); g_clear_pointer (&tracker_prop, g_free); g_clear_object (&stream); } static void module_stream_v1_test_components (void) { g_autoptr (ModulemdModuleStreamV1) stream = NULL; g_autoptr (ModulemdComponentRpm) rpm_component = NULL; g_autoptr (ModulemdComponentModule) module_component = NULL; ModulemdComponent *retrieved_component = NULL; g_auto (GStrv) component_names = NULL; stream = modulemd_module_stream_v1_new (NULL, NULL); // Add a RPM component to a stream rpm_component = modulemd_component_rpm_new ("rpmcomponent"); modulemd_module_stream_v1_add_component (stream, (ModulemdComponent *)rpm_component); component_names = modulemd_module_stream_v1_get_rpm_component_names_as_strv (stream); g_assert_true ( g_strv_contains ((const gchar *const *)component_names, "rpmcomponent")); g_assert_cmpint (g_strv_length (component_names), ==, 1); retrieved_component = (ModulemdComponent *)modulemd_module_stream_v1_get_rpm_component ( stream, "rpmcomponent"); g_assert_nonnull (retrieved_component); g_assert_true (modulemd_component_equals ( retrieved_component, (ModulemdComponent *)rpm_component)); g_clear_pointer (&component_names, g_strfreev); // Add a Module component to a stream module_component = modulemd_component_module_new ("modulecomponent"); modulemd_module_stream_v1_add_component ( stream, (ModulemdComponent *)module_component); component_names = modulemd_module_stream_v1_get_module_component_names_as_strv (stream); g_assert_true (g_strv_contains ((const gchar *const *)component_names, "modulecomponent")); g_assert_cmpint (g_strv_length (component_names), ==, 1); retrieved_component = (ModulemdComponent *)modulemd_module_stream_v1_get_module_component ( stream, "modulecomponent"); g_assert_nonnull (retrieved_component); g_assert_true (modulemd_component_equals ( retrieved_component, (ModulemdComponent *)module_component)); g_clear_pointer (&component_names, g_strfreev); // Remove an RPM component from a stream modulemd_module_stream_v1_remove_rpm_component (stream, "rpmcomponent"); component_names = modulemd_module_stream_v1_get_rpm_component_names_as_strv (stream); g_assert_cmpint (g_strv_length (component_names), ==, 0); g_clear_pointer (&component_names, g_strfreev); // Remove a Module component from a stream modulemd_module_stream_v1_remove_module_component (stream, "modulecomponent"); component_names = modulemd_module_stream_v1_get_module_component_names_as_strv (stream); g_assert_cmpint (g_strv_length (component_names), ==, 0); g_clear_pointer (&component_names, g_strfreev); g_clear_object (&module_component); g_clear_object (&rpm_component); g_clear_object (&stream); } static void module_stream_v2_test_components (void) { g_autoptr (ModulemdModuleStreamV2) stream = NULL; g_autoptr (ModulemdComponentRpm) rpm_component = NULL; g_autoptr (ModulemdComponentModule) module_component = NULL; ModulemdComponent *retrieved_component = NULL; g_auto (GStrv) component_names = NULL; stream = modulemd_module_stream_v2_new (NULL, NULL); // Add a RPM component to a stream rpm_component = modulemd_component_rpm_new ("rpmcomponent"); modulemd_module_stream_v2_add_component (stream, (ModulemdComponent *)rpm_component); component_names = modulemd_module_stream_v2_get_rpm_component_names_as_strv (stream); g_assert_true ( g_strv_contains ((const gchar *const *)component_names, "rpmcomponent")); g_assert_cmpint (g_strv_length (component_names), ==, 1); retrieved_component = (ModulemdComponent *)modulemd_module_stream_v2_get_rpm_component ( stream, "rpmcomponent"); g_assert_nonnull (retrieved_component); g_assert_true (modulemd_component_equals ( retrieved_component, (ModulemdComponent *)rpm_component)); g_clear_pointer (&component_names, g_strfreev); // Add a Module component to a stream module_component = modulemd_component_module_new ("modulecomponent"); modulemd_module_stream_v2_add_component ( stream, (ModulemdComponent *)module_component); component_names = modulemd_module_stream_v2_get_module_component_names_as_strv (stream); g_assert_true (g_strv_contains ((const gchar *const *)component_names, "modulecomponent")); g_assert_cmpint (g_strv_length (component_names), ==, 1); retrieved_component = (ModulemdComponent *)modulemd_module_stream_v2_get_module_component ( stream, "modulecomponent"); g_assert_nonnull (retrieved_component); g_assert_true (modulemd_component_equals ( retrieved_component, (ModulemdComponent *)module_component)); g_clear_pointer (&component_names, g_strfreev); // Remove an RPM component from a stream modulemd_module_stream_v2_remove_rpm_component (stream, "rpmcomponent"); component_names = modulemd_module_stream_v2_get_rpm_component_names_as_strv (stream); g_assert_cmpint (g_strv_length (component_names), ==, 0); g_clear_pointer (&component_names, g_strfreev); // Remove a Module component from a stream modulemd_module_stream_v2_remove_module_component (stream, "modulecomponent"); component_names = modulemd_module_stream_v2_get_module_component_names_as_strv (stream); g_assert_cmpint (g_strv_length (component_names), ==, 0); g_clear_pointer (&component_names, g_strfreev); g_clear_object (&module_component); g_clear_object (&rpm_component); g_clear_object (&stream); } static void module_stream_test_copy (void) { g_autoptr (ModulemdModuleStream) stream = NULL; g_autoptr (ModulemdModuleStream) copied_stream = NULL; guint64 version; for (version = MD_MODULESTREAM_VERSION_ONE; version <= MD_MODULESTREAM_VERSION_LATEST; version++) { /* Test copying with a stream name */ stream = modulemd_module_stream_new (version, "foo", "latest"); copied_stream = modulemd_module_stream_copy (stream, NULL, NULL); g_assert_nonnull (copied_stream); g_assert_true (MODULEMD_IS_MODULE_STREAM (copied_stream)); g_assert_cmpstr (modulemd_module_stream_get_module_name (stream), ==, modulemd_module_stream_get_module_name (copied_stream)); g_assert_cmpstr (modulemd_module_stream_get_stream_name (stream), ==, modulemd_module_stream_get_stream_name (copied_stream)); g_clear_object (&stream); g_clear_object (&copied_stream); /* Test copying without a stream name */ stream = modulemd_module_stream_new (version, "foo", NULL); copied_stream = modulemd_module_stream_copy (stream, NULL, NULL); g_assert_nonnull (copied_stream); g_assert_true (MODULEMD_IS_MODULE_STREAM (copied_stream)); g_assert_cmpstr (modulemd_module_stream_get_module_name (stream), ==, modulemd_module_stream_get_module_name (copied_stream)); g_assert_cmpstr (modulemd_module_stream_get_stream_name (stream), ==, modulemd_module_stream_get_stream_name (copied_stream)); g_clear_object (&stream); g_clear_object (&copied_stream); /* Test copying with and renaming the stream name */ stream = modulemd_module_stream_new (version, "foo", "latest"); copied_stream = modulemd_module_stream_copy (stream, NULL, "earliest"); g_assert_nonnull (copied_stream); g_assert_true (MODULEMD_IS_MODULE_STREAM (copied_stream)); g_assert_cmpstr (modulemd_module_stream_get_module_name (stream), ==, modulemd_module_stream_get_module_name (copied_stream)); g_assert_cmpstr ( modulemd_module_stream_get_stream_name (stream), ==, "latest"); g_assert_cmpstr (modulemd_module_stream_get_stream_name (copied_stream), ==, "earliest"); g_clear_object (&stream); g_clear_object (&copied_stream); } } static void module_stream_test_equals (void) { g_autoptr (ModulemdModuleStream) stream_1 = NULL; g_autoptr (ModulemdModuleStream) stream_2 = NULL; guint64 version; for (version = MD_MODULESTREAM_VERSION_ONE; version <= MD_MODULESTREAM_VERSION_LATEST; version++) { /* Test equality with same stream and module names */ stream_1 = modulemd_module_stream_new (version, "foo", "latest"); stream_2 = modulemd_module_stream_new (version, "foo", "latest"); g_assert_true (modulemd_module_stream_equals (stream_1, stream_2)); g_clear_object (&stream_1); g_clear_object (&stream_2); /* Test equality with different stream names*/ stream_1 = modulemd_module_stream_new (version, "foo", NULL); stream_2 = modulemd_module_stream_new (version, "bar", NULL); g_assert_false (modulemd_module_stream_equals (stream_1, stream_2)); g_clear_object (&stream_1); g_clear_object (&stream_2); /* Test equality with different module name */ stream_1 = modulemd_module_stream_new (version, "bar", "thor"); stream_2 = modulemd_module_stream_new (version, "bar", "loki"); g_assert_false (modulemd_module_stream_equals (stream_1, stream_2)); g_clear_object (&stream_1); g_clear_object (&stream_2); /* Test equality with same arch */ stream_1 = modulemd_module_stream_new (version, "bar", "thor"); modulemd_module_stream_set_arch (stream_1, "x86_64"); stream_2 = modulemd_module_stream_new (version, "bar", "thor"); modulemd_module_stream_set_arch (stream_2, "x86_64"); g_assert_true (modulemd_module_stream_equals (stream_1, stream_2)); g_clear_object (&stream_1); g_clear_object (&stream_2); /* Test equality with different arch */ stream_1 = modulemd_module_stream_new (version, "bar", "thor"); modulemd_module_stream_set_arch (stream_1, "x86_64"); stream_2 = modulemd_module_stream_new (version, "bar", "thor"); modulemd_module_stream_set_arch (stream_2, "x86_25"); g_assert_false (modulemd_module_stream_equals (stream_1, stream_2)); g_clear_object (&stream_1); g_clear_object (&stream_2); } } G_GNUC_BEGIN_IGNORE_DEPRECATIONS static void module_stream_test_nsvc (void) { g_autoptr (ModulemdModuleStream) stream = NULL; g_autofree gchar *s_nsvc = NULL; guint64 version; for (version = MD_MODULESTREAM_VERSION_ONE; version <= MD_MODULESTREAM_VERSION_LATEST; version++) { // First test that nsvc is None for a module with no name stream = modulemd_module_stream_new (version, NULL, NULL); s_nsvc = modulemd_module_stream_get_nsvc_as_string (stream); g_assert_null (s_nsvc); g_clear_pointer (&s_nsvc, g_free); g_clear_object (&stream); // Now with valid module and stream names stream = modulemd_module_stream_new (version, "modulename", NULL); s_nsvc = modulemd_module_stream_get_nsvc_as_string (stream); g_assert_null (s_nsvc); g_clear_pointer (&s_nsvc, g_free); g_clear_object (&stream); // Now with valid module and stream names stream = modulemd_module_stream_new (version, "modulename", "streamname"); s_nsvc = modulemd_module_stream_get_nsvc_as_string (stream); g_assert_cmpstr (s_nsvc, ==, "modulename:streamname:0"); g_clear_pointer (&s_nsvc, g_free); //# Add a version number modulemd_module_stream_set_version (stream, 42); s_nsvc = modulemd_module_stream_get_nsvc_as_string (stream); g_assert_cmpstr (s_nsvc, ==, "modulename:streamname:42"); g_clear_pointer (&s_nsvc, g_free); // Add a context modulemd_module_stream_set_context (stream, "deadbeef"); s_nsvc = modulemd_module_stream_get_nsvc_as_string (stream); g_assert_cmpstr (s_nsvc, ==, "modulename:streamname:42:deadbeef"); g_clear_pointer (&s_nsvc, g_free); g_clear_object (&stream); } } G_GNUC_END_IGNORE_DEPRECATIONS static void module_stream_test_nsvca (void) { g_autoptr (ModulemdModuleStream) stream = NULL; g_autofree gchar *s_nsvca = NULL; guint64 version; for (version = MD_MODULESTREAM_VERSION_ONE; version <= MD_MODULESTREAM_VERSION_LATEST; version++) { // First test that NSVCA is None for a module with no name stream = modulemd_module_stream_new (version, NULL, NULL); s_nsvca = modulemd_module_stream_get_NSVCA_as_string (stream); g_assert_null (s_nsvca); g_clear_pointer (&s_nsvca, g_free); g_clear_object (&stream); // Now with valid module and stream names stream = modulemd_module_stream_new (version, "modulename", NULL); s_nsvca = modulemd_module_stream_get_NSVCA_as_string (stream); g_assert_cmpstr (s_nsvca, ==, "modulename"); g_clear_pointer (&s_nsvca, g_free); g_clear_object (&stream); // Now with valid module and stream names stream = modulemd_module_stream_new (version, "modulename", "streamname"); s_nsvca = modulemd_module_stream_get_NSVCA_as_string (stream); g_assert_cmpstr (s_nsvca, ==, "modulename:streamname"); g_clear_pointer (&s_nsvca, g_free); //# Add a version number modulemd_module_stream_set_version (stream, 42); s_nsvca = modulemd_module_stream_get_NSVCA_as_string (stream); g_assert_cmpstr (s_nsvca, ==, "modulename:streamname:42"); g_clear_pointer (&s_nsvca, g_free); // Add a context modulemd_module_stream_set_context (stream, "deadbeef"); s_nsvca = modulemd_module_stream_get_NSVCA_as_string (stream); g_assert_cmpstr (s_nsvca, ==, "modulename:streamname:42:deadbeef"); g_clear_pointer (&s_nsvca, g_free); // Add an architecture modulemd_module_stream_set_arch (stream, "x86_64"); s_nsvca = modulemd_module_stream_get_NSVCA_as_string (stream); g_assert_cmpstr ( s_nsvca, ==, "modulename:streamname:42:deadbeef:x86_64"); g_clear_pointer (&s_nsvca, g_free); // Now try removing some of the bits in the middle modulemd_module_stream_set_context (stream, NULL); s_nsvca = modulemd_module_stream_get_NSVCA_as_string (stream); g_assert_cmpstr (s_nsvca, ==, "modulename:streamname:42::x86_64"); g_clear_pointer (&s_nsvca, g_free); g_clear_object (&stream); stream = modulemd_module_stream_new (version, "modulename", NULL); modulemd_module_stream_set_arch (stream, "x86_64"); s_nsvca = modulemd_module_stream_get_NSVCA_as_string (stream); g_assert_cmpstr (s_nsvca, ==, "modulename::::x86_64"); g_clear_pointer (&s_nsvca, g_free); modulemd_module_stream_set_version (stream, 2019); s_nsvca = modulemd_module_stream_get_NSVCA_as_string (stream); g_assert_cmpstr (s_nsvca, ==, "modulename::2019::x86_64"); g_clear_pointer (&s_nsvca, g_free); // Add a context modulemd_module_stream_set_context (stream, "feedfeed"); s_nsvca = modulemd_module_stream_get_NSVCA_as_string (stream); g_assert_cmpstr (s_nsvca, ==, "modulename::2019:feedfeed:x86_64"); g_clear_pointer (&s_nsvca, g_free); g_clear_object (&stream); } } static void module_stream_v1_test_equals (void) { g_autoptr (ModulemdModuleStreamV1) stream_1 = NULL; g_autoptr (ModulemdModuleStreamV1) stream_2 = NULL; g_autoptr (ModulemdProfile) profile_1 = NULL; g_autoptr (ModulemdServiceLevel) servicelevel_1 = NULL; g_autoptr (ModulemdServiceLevel) servicelevel_2 = NULL; g_autoptr (ModulemdComponentModule) component_1 = NULL; g_autoptr (ModulemdComponentRpm) component_2 = NULL; /*Test equality of 2 streams with same string constants*/ stream_1 = modulemd_module_stream_v1_new (NULL, NULL); modulemd_module_stream_v1_set_community (stream_1, "community_1"); modulemd_module_stream_v1_set_description (stream_1, "description_1"); modulemd_module_stream_v1_set_documentation (stream_1, "documentation_1"); modulemd_module_stream_v1_set_summary (stream_1, "summary_1"); modulemd_module_stream_v1_set_tracker (stream_1, "tracker_1"); stream_2 = modulemd_module_stream_v1_new (NULL, NULL); modulemd_module_stream_v1_set_community (stream_2, "community_1"); modulemd_module_stream_v1_set_description (stream_2, "description_1"); modulemd_module_stream_v1_set_documentation (stream_2, "documentation_1"); modulemd_module_stream_v1_set_summary (stream_2, "summary_1"); modulemd_module_stream_v1_set_tracker (stream_2, "tracker_1"); g_assert_true (modulemd_module_stream_equals ( (ModulemdModuleStream *)stream_1, (ModulemdModuleStream *)stream_2)); g_clear_object (&stream_1); g_clear_object (&stream_2); /*Test equality of 2 streams with certain different string constants*/ stream_1 = modulemd_module_stream_v1_new (NULL, NULL); modulemd_module_stream_v1_set_community (stream_1, "community_1"); modulemd_module_stream_v1_set_description (stream_1, "description_1"); modulemd_module_stream_v1_set_documentation (stream_1, "documentation_1"); modulemd_module_stream_v1_set_summary (stream_1, "summary_1"); modulemd_module_stream_v1_set_tracker (stream_1, "tracker_1"); stream_2 = modulemd_module_stream_v1_new (NULL, NULL); modulemd_module_stream_v1_set_community (stream_2, "community_1"); modulemd_module_stream_v1_set_description (stream_2, "description_2"); modulemd_module_stream_v1_set_documentation (stream_2, "documentation_1"); modulemd_module_stream_v1_set_summary (stream_2, "summary_2"); modulemd_module_stream_v1_set_tracker (stream_2, "tracker_2"); g_assert_false (modulemd_module_stream_equals ( (ModulemdModuleStream *)stream_1, (ModulemdModuleStream *)stream_2)); g_clear_object (&stream_1); g_clear_object (&stream_2); /*Test equality of 2 streams with same hashtable sets*/ stream_1 = modulemd_module_stream_v1_new (NULL, NULL); modulemd_module_stream_v1_add_rpm_api (stream_1, "rpm_1"); modulemd_module_stream_v1_add_rpm_api (stream_1, "rpm_2"); modulemd_module_stream_v1_add_module_license (stream_1, "module_a"); modulemd_module_stream_v1_add_module_license (stream_1, "module_b"); modulemd_module_stream_v1_add_content_license (stream_1, "content_a"); modulemd_module_stream_v1_add_content_license (stream_1, "content_b"); modulemd_module_stream_v1_add_rpm_artifact (stream_1, "artifact_a"); modulemd_module_stream_v1_add_rpm_artifact (stream_1, "artifact_b"); modulemd_module_stream_v1_add_rpm_filter (stream_1, "filter_a"); modulemd_module_stream_v1_add_rpm_filter (stream_1, "filter_b"); stream_2 = modulemd_module_stream_v1_new (NULL, NULL); modulemd_module_stream_v1_add_rpm_api (stream_2, "rpm_1"); modulemd_module_stream_v1_add_rpm_api (stream_2, "rpm_2"); modulemd_module_stream_v1_add_module_license (stream_2, "module_a"); modulemd_module_stream_v1_add_module_license (stream_2, "module_b"); modulemd_module_stream_v1_add_content_license (stream_2, "content_a"); modulemd_module_stream_v1_add_content_license (stream_2, "content_b"); modulemd_module_stream_v1_add_rpm_artifact (stream_2, "artifact_a"); modulemd_module_stream_v1_add_rpm_artifact (stream_2, "artifact_b"); modulemd_module_stream_v1_add_rpm_filter (stream_2, "filter_a"); modulemd_module_stream_v1_add_rpm_filter (stream_2, "filter_b"); g_assert_true (modulemd_module_stream_equals ( (ModulemdModuleStream *)stream_1, (ModulemdModuleStream *)stream_2)); g_clear_object (&stream_1); g_clear_object (&stream_2); /*Test equality of 2 streams with different hashtable sets*/ stream_1 = modulemd_module_stream_v1_new (NULL, NULL); modulemd_module_stream_v1_add_rpm_api (stream_1, "rpm_1"); modulemd_module_stream_v1_add_rpm_api (stream_1, "rpm_2"); modulemd_module_stream_v1_add_module_license (stream_1, "module_a"); modulemd_module_stream_v1_add_module_license (stream_1, "module_b"); modulemd_module_stream_v1_add_content_license (stream_1, "content_a"); modulemd_module_stream_v1_add_content_license (stream_1, "content_b"); modulemd_module_stream_v1_add_rpm_artifact (stream_1, "artifact_a"); modulemd_module_stream_v1_add_rpm_artifact (stream_1, "artifact_b"); modulemd_module_stream_v1_add_rpm_artifact (stream_1, "artifact_c"); modulemd_module_stream_v1_add_rpm_filter (stream_1, "filter_a"); modulemd_module_stream_v1_add_rpm_filter (stream_1, "filter_b"); stream_2 = modulemd_module_stream_v1_new (NULL, NULL); modulemd_module_stream_v1_add_rpm_api (stream_2, "rpm_1"); modulemd_module_stream_v1_add_module_license (stream_2, "module_a"); modulemd_module_stream_v1_add_module_license (stream_2, "module_b"); modulemd_module_stream_v1_add_content_license (stream_2, "content_a"); modulemd_module_stream_v1_add_content_license (stream_2, "content_b"); modulemd_module_stream_v1_add_rpm_artifact (stream_2, "artifact_a"); modulemd_module_stream_v1_add_rpm_artifact (stream_2, "artifact_b"); modulemd_module_stream_v1_add_rpm_filter (stream_2, "filter_a"); modulemd_module_stream_v1_add_rpm_filter (stream_2, "filter_b"); g_assert_false (modulemd_module_stream_equals ( (ModulemdModuleStream *)stream_1, (ModulemdModuleStream *)stream_2)); g_clear_object (&stream_1); g_clear_object (&stream_2); /*Test equality of 2 streams with same dependencies*/ stream_1 = modulemd_module_stream_v1_new (NULL, NULL); modulemd_module_stream_v1_add_buildtime_requirement ( stream_1, "testmodule", "stable"); modulemd_module_stream_v1_add_runtime_requirement ( stream_1, "testmodule", "latest"); stream_2 = modulemd_module_stream_v1_new (NULL, NULL); modulemd_module_stream_v1_add_buildtime_requirement ( stream_2, "testmodule", "stable"); modulemd_module_stream_v1_add_runtime_requirement ( stream_2, "testmodule", "latest"); g_assert_true (modulemd_module_stream_equals ( (ModulemdModuleStream *)stream_1, (ModulemdModuleStream *)stream_2)); g_clear_object (&stream_1); g_clear_object (&stream_2); /*Test equality of 2 streams with different dependencies*/ stream_1 = modulemd_module_stream_v1_new (NULL, NULL); modulemd_module_stream_v1_add_buildtime_requirement ( stream_1, "test", "stable"); modulemd_module_stream_v1_add_runtime_requirement ( stream_1, "testmodule", "latest"); stream_2 = modulemd_module_stream_v1_new (NULL, NULL); modulemd_module_stream_v1_add_buildtime_requirement ( stream_2, "testmodule", "stable"); modulemd_module_stream_v1_add_runtime_requirement ( stream_2, "testmodule", "not_latest"); g_assert_false (modulemd_module_stream_equals ( (ModulemdModuleStream *)stream_1, (ModulemdModuleStream *)stream_2)); g_clear_object (&stream_1); g_clear_object (&stream_2); /*Test equality of 2 streams with same hashtables*/ profile_1 = modulemd_profile_new ("testprofile"); component_1 = modulemd_component_module_new ("testmodule"); servicelevel_1 = modulemd_service_level_new ("foo"); stream_1 = modulemd_module_stream_v1_new (NULL, NULL); modulemd_module_stream_v1_add_profile (stream_1, profile_1); modulemd_module_stream_v1_add_component (stream_1, (ModulemdComponent *)component_1); modulemd_module_stream_v1_add_servicelevel (stream_1, servicelevel_1); stream_2 = modulemd_module_stream_v1_new (NULL, NULL); modulemd_module_stream_v1_add_profile (stream_2, profile_1); modulemd_module_stream_v1_add_component (stream_2, (ModulemdComponent *)component_1); modulemd_module_stream_v1_add_servicelevel (stream_2, servicelevel_1); g_assert_true (modulemd_module_stream_equals ( (ModulemdModuleStream *)stream_1, (ModulemdModuleStream *)stream_2)); g_clear_object (&stream_1); g_clear_object (&stream_2); g_clear_object (&profile_1); g_clear_object (&component_1); g_clear_object (&servicelevel_1); /*Test equality of 2 streams with different hashtables*/ profile_1 = modulemd_profile_new ("testprofile"); component_1 = modulemd_component_module_new ("testmodule"); component_2 = modulemd_component_rpm_new ("something"); servicelevel_1 = modulemd_service_level_new ("foo"); servicelevel_2 = modulemd_service_level_new ("bar"); stream_1 = modulemd_module_stream_v1_new (NULL, NULL); modulemd_module_stream_v1_add_profile (stream_1, profile_1); modulemd_module_stream_v1_add_component (stream_1, (ModulemdComponent *)component_1); modulemd_module_stream_v1_add_servicelevel (stream_1, servicelevel_1); stream_2 = modulemd_module_stream_v1_new (NULL, NULL); modulemd_module_stream_v1_add_profile (stream_2, profile_1); modulemd_module_stream_v1_add_component (stream_2, (ModulemdComponent *)component_2); modulemd_module_stream_v1_add_servicelevel (stream_2, servicelevel_2); g_assert_false (modulemd_module_stream_equals ( (ModulemdModuleStream *)stream_1, (ModulemdModuleStream *)stream_2)); g_clear_object (&stream_1); g_clear_object (&stream_2); g_clear_object (&profile_1); g_clear_object (&component_1); g_clear_object (&component_2); g_clear_object (&servicelevel_1); g_clear_object (&servicelevel_2); } static void module_stream_v2_test_equals (void) { g_autoptr (ModulemdModuleStreamV2) stream_1 = NULL; g_autoptr (ModulemdModuleStreamV2) stream_2 = NULL; g_autoptr (ModulemdProfile) profile_1 = NULL; g_autoptr (ModulemdServiceLevel) servicelevel_1 = NULL; g_autoptr (ModulemdServiceLevel) servicelevel_2 = NULL; g_autoptr (ModulemdComponentModule) component_1 = NULL; g_autoptr (ModulemdComponentRpm) component_2 = NULL; g_autoptr (ModulemdDependencies) dep_1 = NULL; g_autoptr (ModulemdDependencies) dep_2 = NULL; g_autoptr (ModulemdRpmMapEntry) entry_1 = NULL; /*Test equality of 2 streams with same string constants*/ stream_1 = modulemd_module_stream_v2_new (NULL, NULL); modulemd_module_stream_v2_set_community (stream_1, "community_1"); modulemd_module_stream_v2_set_description (stream_1, "description_1"); modulemd_module_stream_v2_set_documentation (stream_1, "documentation_1"); modulemd_module_stream_v2_set_summary (stream_1, "summary_1"); modulemd_module_stream_v2_set_tracker (stream_1, "tracker_1"); stream_2 = modulemd_module_stream_v2_new (NULL, NULL); modulemd_module_stream_v2_set_community (stream_2, "community_1"); modulemd_module_stream_v2_set_description (stream_2, "description_1"); modulemd_module_stream_v2_set_documentation (stream_2, "documentation_1"); modulemd_module_stream_v2_set_summary (stream_2, "summary_1"); modulemd_module_stream_v2_set_tracker (stream_2, "tracker_1"); g_assert_true (modulemd_module_stream_equals ( (ModulemdModuleStream *)stream_1, (ModulemdModuleStream *)stream_2)); g_clear_object (&stream_1); g_clear_object (&stream_2); /*Test equality of 2 streams with certain different string constants*/ stream_1 = modulemd_module_stream_v2_new (NULL, NULL); modulemd_module_stream_v2_set_community (stream_1, "community_1"); modulemd_module_stream_v2_set_description (stream_1, "description_1"); modulemd_module_stream_v2_set_documentation (stream_1, "documentation_1"); modulemd_module_stream_v2_set_summary (stream_1, "summary_1"); modulemd_module_stream_v2_set_tracker (stream_1, "tracker_1"); stream_2 = modulemd_module_stream_v2_new (NULL, NULL); modulemd_module_stream_v2_set_community (stream_2, "community_1"); modulemd_module_stream_v2_set_description (stream_2, "description_2"); modulemd_module_stream_v2_set_documentation (stream_2, "documentation_1"); modulemd_module_stream_v2_set_summary (stream_2, "summary_2"); modulemd_module_stream_v2_set_tracker (stream_2, "tracker_2"); g_assert_false (modulemd_module_stream_equals ( (ModulemdModuleStream *)stream_1, (ModulemdModuleStream *)stream_2)); g_clear_object (&stream_1); g_clear_object (&stream_2); /*Test equality of 2 streams with same hashtable sets*/ stream_1 = modulemd_module_stream_v2_new (NULL, NULL); modulemd_module_stream_v2_add_rpm_api (stream_1, "rpm_1"); modulemd_module_stream_v2_add_rpm_api (stream_1, "rpm_2"); modulemd_module_stream_v2_add_module_license (stream_1, "module_a"); modulemd_module_stream_v2_add_module_license (stream_1, "module_b"); modulemd_module_stream_v2_add_content_license (stream_1, "content_a"); modulemd_module_stream_v2_add_content_license (stream_1, "content_b"); modulemd_module_stream_v2_add_rpm_artifact (stream_1, "artifact_a"); modulemd_module_stream_v2_add_rpm_artifact (stream_1, "artifact_b"); modulemd_module_stream_v2_add_rpm_filter (stream_1, "filter_a"); modulemd_module_stream_v2_add_rpm_filter (stream_1, "filter_b"); modulemd_module_stream_v2_add_demodularized_rpm (stream_1, "rpm_3"); modulemd_module_stream_v2_add_demodularized_rpm (stream_1, "rpm_4"); stream_2 = modulemd_module_stream_v2_new (NULL, NULL); modulemd_module_stream_v2_add_rpm_api (stream_2, "rpm_1"); modulemd_module_stream_v2_add_rpm_api (stream_2, "rpm_2"); modulemd_module_stream_v2_add_module_license (stream_2, "module_a"); modulemd_module_stream_v2_add_module_license (stream_2, "module_b"); modulemd_module_stream_v2_add_content_license (stream_2, "content_a"); modulemd_module_stream_v2_add_content_license (stream_2, "content_b"); modulemd_module_stream_v2_add_rpm_artifact (stream_2, "artifact_a"); modulemd_module_stream_v2_add_rpm_artifact (stream_2, "artifact_b"); modulemd_module_stream_v2_add_rpm_filter (stream_2, "filter_a"); modulemd_module_stream_v2_add_rpm_filter (stream_2, "filter_b"); modulemd_module_stream_v2_add_demodularized_rpm (stream_2, "rpm_3"); modulemd_module_stream_v2_add_demodularized_rpm (stream_2, "rpm_4"); g_assert_true (modulemd_module_stream_equals ( (ModulemdModuleStream *)stream_1, (ModulemdModuleStream *)stream_2)); g_clear_object (&stream_1); g_clear_object (&stream_2); /*Test equality of 2 streams with different hashtable sets*/ stream_1 = modulemd_module_stream_v2_new (NULL, NULL); modulemd_module_stream_v2_add_rpm_api (stream_1, "rpm_1"); modulemd_module_stream_v2_add_rpm_api (stream_1, "rpm_2"); modulemd_module_stream_v2_add_module_license (stream_1, "module_a"); modulemd_module_stream_v2_add_module_license (stream_1, "module_b"); modulemd_module_stream_v2_add_content_license (stream_1, "content_a"); modulemd_module_stream_v2_add_content_license (stream_1, "content_b"); modulemd_module_stream_v2_add_rpm_artifact (stream_1, "artifact_a"); modulemd_module_stream_v2_add_rpm_artifact (stream_1, "artifact_b"); modulemd_module_stream_v2_add_rpm_artifact (stream_1, "artifact_c"); modulemd_module_stream_v2_add_rpm_filter (stream_1, "filter_a"); modulemd_module_stream_v2_add_rpm_filter (stream_1, "filter_b"); modulemd_module_stream_v2_add_demodularized_rpm (stream_1, "rpm_3"); modulemd_module_stream_v2_add_demodularized_rpm (stream_1, "rpm_4"); stream_2 = modulemd_module_stream_v2_new (NULL, NULL); modulemd_module_stream_v2_add_rpm_api (stream_2, "rpm_1"); modulemd_module_stream_v2_add_module_license (stream_2, "module_a"); modulemd_module_stream_v2_add_module_license (stream_2, "module_b"); modulemd_module_stream_v2_add_content_license (stream_2, "content_a"); modulemd_module_stream_v2_add_content_license (stream_2, "content_b"); modulemd_module_stream_v2_add_rpm_artifact (stream_2, "artifact_a"); modulemd_module_stream_v2_add_rpm_artifact (stream_2, "artifact_b"); modulemd_module_stream_v2_add_rpm_filter (stream_2, "filter_a"); modulemd_module_stream_v2_add_rpm_filter (stream_2, "filter_b"); modulemd_module_stream_v2_add_demodularized_rpm (stream_2, "rpm_3"); modulemd_module_stream_v2_add_demodularized_rpm (stream_2, "rpm_4"); g_assert_false (modulemd_module_stream_equals ( (ModulemdModuleStream *)stream_1, (ModulemdModuleStream *)stream_2)); g_clear_object (&stream_1); g_clear_object (&stream_2); /*Test equality of 2 streams with same hashtables*/ profile_1 = modulemd_profile_new ("testprofile"); component_1 = modulemd_component_module_new ("testmodule"); servicelevel_1 = modulemd_service_level_new ("foo"); stream_1 = modulemd_module_stream_v2_new (NULL, NULL); modulemd_module_stream_v2_add_profile (stream_1, profile_1); modulemd_module_stream_v2_add_component (stream_1, (ModulemdComponent *)component_1); modulemd_module_stream_v2_add_servicelevel (stream_1, servicelevel_1); stream_2 = modulemd_module_stream_v2_new (NULL, NULL); modulemd_module_stream_v2_add_profile (stream_2, profile_1); modulemd_module_stream_v2_add_component (stream_2, (ModulemdComponent *)component_1); modulemd_module_stream_v2_add_servicelevel (stream_2, servicelevel_1); g_assert_true (modulemd_module_stream_equals ( (ModulemdModuleStream *)stream_1, (ModulemdModuleStream *)stream_2)); g_clear_object (&stream_1); g_clear_object (&stream_2); g_clear_object (&profile_1); g_clear_object (&component_1); g_clear_object (&servicelevel_1); /*Test equality of 2 streams with different hashtables*/ profile_1 = modulemd_profile_new ("testprofile"); component_1 = modulemd_component_module_new ("testmodule"); component_2 = modulemd_component_rpm_new ("something"); servicelevel_1 = modulemd_service_level_new ("foo"); servicelevel_2 = modulemd_service_level_new ("bar"); stream_1 = modulemd_module_stream_v2_new (NULL, NULL); modulemd_module_stream_v2_add_profile (stream_1, profile_1); modulemd_module_stream_v2_add_component (stream_1, (ModulemdComponent *)component_1); modulemd_module_stream_v2_add_servicelevel (stream_1, servicelevel_1); stream_2 = modulemd_module_stream_v2_new (NULL, NULL); modulemd_module_stream_v2_add_profile (stream_2, profile_1); modulemd_module_stream_v2_add_component (stream_2, (ModulemdComponent *)component_2); modulemd_module_stream_v2_add_servicelevel (stream_2, servicelevel_2); g_assert_false (modulemd_module_stream_equals ( (ModulemdModuleStream *)stream_1, (ModulemdModuleStream *)stream_2)); g_clear_object (&stream_1); g_clear_object (&stream_2); g_clear_object (&profile_1); g_clear_object (&component_1); g_clear_object (&component_2); g_clear_object (&servicelevel_1); g_clear_object (&servicelevel_2); /*Test equality of 2 streams with same dependencies*/ dep_1 = modulemd_dependencies_new (); modulemd_dependencies_add_buildtime_stream (dep_1, "foo", "stable"); stream_1 = modulemd_module_stream_v2_new (NULL, NULL); modulemd_module_stream_v2_add_dependencies (stream_1, dep_1); stream_2 = modulemd_module_stream_v2_new (NULL, NULL); modulemd_module_stream_v2_add_dependencies (stream_2, dep_1); g_assert_true (modulemd_module_stream_equals ( (ModulemdModuleStream *)stream_1, (ModulemdModuleStream *)stream_2)); g_clear_object (&stream_1); g_clear_object (&stream_2); g_clear_object (&dep_1); /*Test equality of 2 streams with different dependencies*/ dep_1 = modulemd_dependencies_new (); modulemd_dependencies_add_buildtime_stream (dep_1, "foo", "stable"); dep_2 = modulemd_dependencies_new (); modulemd_dependencies_add_buildtime_stream (dep_2, "foo", "latest"); stream_1 = modulemd_module_stream_v2_new (NULL, NULL); modulemd_module_stream_v2_add_dependencies (stream_1, dep_1); stream_2 = modulemd_module_stream_v2_new (NULL, NULL); modulemd_module_stream_v2_add_dependencies (stream_2, dep_2); g_assert_false (modulemd_module_stream_equals ( (ModulemdModuleStream *)stream_1, (ModulemdModuleStream *)stream_2)); g_clear_object (&stream_1); g_clear_object (&stream_2); g_clear_object (&dep_1); g_clear_object (&dep_2); /*Test equality of 2 streams with same rpm artifact map entry*/ entry_1 = modulemd_rpm_map_entry_new ( "bar", 0, "1.23", "1.module_deadbeef", "x86_64"); stream_1 = modulemd_module_stream_v2_new (NULL, NULL); modulemd_module_stream_v2_set_rpm_artifact_map_entry ( stream_1, entry_1, "sha256", "baddad"); stream_2 = modulemd_module_stream_v2_new (NULL, NULL); modulemd_module_stream_v2_set_rpm_artifact_map_entry ( stream_2, entry_1, "sha256", "baddad"); g_assert_true (modulemd_module_stream_equals ( (ModulemdModuleStream *)stream_1, (ModulemdModuleStream *)stream_2)); g_clear_object (&stream_1); g_clear_object (&stream_2); g_clear_object (&entry_1); /*Test equality of 2 streams with different rpm artifact map entry*/ entry_1 = modulemd_rpm_map_entry_new ( "bar", 0, "1.23", "1.module_deadbeef", "x86_64"); stream_1 = modulemd_module_stream_v2_new (NULL, NULL); modulemd_module_stream_v2_set_rpm_artifact_map_entry ( stream_1, entry_1, "sha256", "baddad"); stream_2 = modulemd_module_stream_v2_new (NULL, NULL); modulemd_module_stream_v2_set_rpm_artifact_map_entry ( stream_2, entry_1, "sha256", "badmom"); g_assert_false (modulemd_module_stream_equals ( (ModulemdModuleStream *)stream_1, (ModulemdModuleStream *)stream_2)); g_clear_object (&stream_1); g_clear_object (&stream_2); g_clear_object (&entry_1); /* Test equality of 2 streams with same NSVC and static_context attributes */ stream_1 = modulemd_module_stream_v2_new ("name_1", "stream_1"); modulemd_module_stream_set_version (MODULEMD_MODULE_STREAM (stream_1), 11); modulemd_module_stream_set_context (MODULEMD_MODULE_STREAM (stream_1), "context_1"); modulemd_module_stream_v2_set_static_context (stream_1); stream_2 = modulemd_module_stream_v2_new ("name_1", "stream_1"); modulemd_module_stream_set_version (MODULEMD_MODULE_STREAM (stream_2), 11); modulemd_module_stream_set_context (MODULEMD_MODULE_STREAM (stream_2), "context_1"); modulemd_module_stream_v2_set_static_context (stream_2); g_assert_true (modulemd_module_stream_equals ( (ModulemdModuleStream *)stream_1, (ModulemdModuleStream *)stream_2)); g_clear_object (&stream_1); g_clear_object (&stream_2); /* Test equality of 2 streams with same NSVC but different static_context attributes */ stream_1 = modulemd_module_stream_v2_new ("name_1", "stream_1"); modulemd_module_stream_set_version (MODULEMD_MODULE_STREAM (stream_1), 11); modulemd_module_stream_set_context (MODULEMD_MODULE_STREAM (stream_1), "context_1"); modulemd_module_stream_v2_set_static_context (stream_1); stream_2 = modulemd_module_stream_v2_new ("name_1", "stream_1"); modulemd_module_stream_set_version (MODULEMD_MODULE_STREAM (stream_2), 11); modulemd_module_stream_set_context (MODULEMD_MODULE_STREAM (stream_2), "context_1"); modulemd_module_stream_v2_unset_static_context (stream_2); g_assert_false (modulemd_module_stream_equals ( (ModulemdModuleStream *)stream_1, (ModulemdModuleStream *)stream_2)); g_clear_object (&stream_1); g_clear_object (&stream_2); } static void module_stream_v1_test_dependencies (void) { g_auto (GStrv) list = NULL; g_autoptr (ModulemdModuleStreamV1) stream = NULL; stream = modulemd_module_stream_v1_new (NULL, NULL); modulemd_module_stream_v1_add_buildtime_requirement ( stream, "testmodule", "stable"); list = modulemd_module_stream_v1_get_buildtime_modules_as_strv (stream); g_assert_cmpint (g_strv_length (list), ==, 1); g_assert_cmpstr (list[0], ==, "testmodule"); g_assert_cmpstr (modulemd_module_stream_v1_get_buildtime_requirement_stream ( stream, "testmodule"), ==, "stable"); g_clear_pointer (&list, g_strfreev); modulemd_module_stream_v1_add_runtime_requirement ( stream, "testmodule", "latest"); list = modulemd_module_stream_v1_get_runtime_modules_as_strv (stream); g_assert_cmpint (g_strv_length (list), ==, 1); g_assert_cmpstr (list[0], ==, "testmodule"); g_assert_cmpstr (modulemd_module_stream_v1_get_runtime_requirement_stream ( stream, "testmodule"), ==, "latest"); g_clear_pointer (&list, g_strfreev); g_clear_object (&stream); } static void module_stream_v2_test_dependencies (void) { g_auto (GStrv) list = NULL; g_autoptr (ModulemdModuleStreamV2) stream = NULL; g_autoptr (ModulemdDependencies) dep = NULL; stream = modulemd_module_stream_v2_new (NULL, NULL); dep = modulemd_dependencies_new (); modulemd_dependencies_add_buildtime_stream (dep, "foo", "stable"); modulemd_dependencies_set_empty_runtime_dependencies_for_module (dep, "bar"); modulemd_module_stream_v2_add_dependencies (stream, dep); GPtrArray *deps_list = modulemd_module_stream_v2_get_dependencies (stream); g_assert_cmpint (deps_list->len, ==, 1); list = modulemd_dependencies_get_buildtime_modules_as_strv ( g_ptr_array_index (deps_list, 0)); g_assert_cmpstr (list[0], ==, "foo"); g_clear_pointer (&list, g_strfreev); list = modulemd_dependencies_get_buildtime_streams_as_strv ( g_ptr_array_index (deps_list, 0), "foo"); g_assert_nonnull (list); g_assert_cmpstr (list[0], ==, "stable"); g_assert_null (list[1]); g_clear_pointer (&list, g_strfreev); list = modulemd_dependencies_get_runtime_modules_as_strv ( g_ptr_array_index (deps_list, 0)); g_assert_nonnull (list); g_assert_cmpstr (list[0], ==, "bar"); g_assert_null (list[1]); g_clear_pointer (&list, g_strfreev); g_clear_object (&dep); g_clear_object (&stream); } static void module_stream_v1_test_parse_dump (void) { g_autoptr (ModulemdModuleStreamV1) stream = NULL; g_autoptr (GError) error = NULL; gboolean ret; MMD_INIT_YAML_PARSER (parser); MMD_INIT_YAML_EVENT (event); MMD_INIT_YAML_EMITTER (emitter); MMD_INIT_YAML_STRING (&emitter, yaml_string); g_autofree gchar *yaml_path = NULL; g_autoptr (FILE) yaml_stream = NULL; g_autoptr (ModulemdSubdocumentInfo) subdoc = NULL; yaml_path = g_strdup_printf ("%s/yaml_specs/modulemd_stream_v1.yaml", g_getenv ("MESON_SOURCE_ROOT")); g_assert_nonnull (yaml_path); yaml_stream = g_fopen (yaml_path, "rbe"); g_assert_nonnull (yaml_stream); /* First parse it */ yaml_parser_set_input_file (&parser, yaml_stream); g_assert_true (yaml_parser_parse (&parser, &event)); g_assert_cmpint (event.type, ==, YAML_STREAM_START_EVENT); yaml_event_delete (&event); g_assert_true (yaml_parser_parse (&parser, &event)); g_assert_cmpint (event.type, ==, YAML_DOCUMENT_START_EVENT); yaml_event_delete (&event); subdoc = modulemd_yaml_parse_document_type (&parser); g_assert_nonnull (subdoc); g_assert_null (modulemd_subdocument_info_get_gerror (subdoc)); g_assert_cmpint (modulemd_subdocument_info_get_doctype (subdoc), ==, MODULEMD_YAML_DOC_MODULESTREAM); g_assert_cmpint (modulemd_subdocument_info_get_mdversion (subdoc), ==, 1); g_assert_nonnull (modulemd_subdocument_info_get_yaml (subdoc)); stream = modulemd_module_stream_v1_parse_yaml (subdoc, TRUE, &error); g_assert_no_error (error); g_assert_nonnull (stream); /* Then dump it */ g_debug ("Starting dumping"); g_assert_true (mmd_emitter_start_stream (&emitter, &error)); ret = modulemd_module_stream_v1_emit_yaml (stream, &emitter, &error); g_assert_no_error (error); g_assert_true (ret); ret = mmd_emitter_end_stream (&emitter, &error); g_assert_no_error (error); g_assert_true (ret); g_assert_nonnull (yaml_string->str); g_assert_cmpstr ( yaml_string->str, ==, "---\n" "document: modulemd\n" "version: 1\n" "data:\n" " name: foo\n" " stream: \"stream-name\"\n" " version: 20160927144203\n" " context: c0ffee43\n" " arch: x86_64\n" " summary: An example module\n" " description: >-\n" " A module for the demonstration of the metadata format. Also, the " "obligatory lorem\n" " ipsum dolor sit amet goes right here.\n" " servicelevels:\n" " bug_fixes:\n" " eol: 2077-10-23\n" " rawhide:\n" " eol: 2077-10-23\n" " security_fixes:\n" " eol: 2077-10-23\n" " stable_api:\n" " eol: 2077-10-23\n" " license:\n" " module:\n" " - MIT\n" " content:\n" " - Apache-2.0\n" " - GPL-1.0-or-later OR Artistic-1.0-Perl\n" " xmd:\n" " some_key: some_data\n" " dependencies:\n" " buildrequires:\n" " extra-build-env: and-its-stream-name-too\n" " platform: and-its-stream-name\n" " requires:\n" " platform: and-its-stream-name\n" " references:\n" " community: http://www.example.com/\n" " documentation: http://www.example.com/\n" " tracker: http://www.example.com/\n" " profiles:\n" " buildroot:\n" " rpms:\n" " - bar-devel\n" " container:\n" " rpms:\n" " - bar\n" " - bar-devel\n" " default:\n" " rpms:\n" " - bar\n" " - bar-extras\n" " - baz\n" " minimal:\n" " description: Minimal profile installing only the bar package.\n" " rpms:\n" " - bar\n" " srpm-buildroot:\n" " rpms:\n" " - bar-extras\n" " api:\n" " rpms:\n" " - bar\n" " - bar-devel\n" " - bar-extras\n" " - baz\n" " - xxx\n" " filter:\n" " rpms:\n" " - baz-nonfoo\n" " buildopts:\n" " rpms:\n" " macros: >\n" " %demomacro 1\n" "\n" " %demomacro2 %{demomacro}23\n" " components:\n" " rpms:\n" " bar:\n" " rationale: We need this to demonstrate stuff.\n" " repository: https://pagure.io/bar.git\n" " cache: https://example.com/cache\n" " ref: 26ca0c0\n" " baz:\n" " rationale: This one is here to demonstrate other stuff.\n" " xxx:\n" " rationale: xxx demonstrates arches and multilib.\n" " arches: [i686, x86_64]\n" " multilib: [x86_64]\n" " xyz:\n" " rationale: xyz is a bundled dependency of xxx.\n" " buildorder: 10\n" " modules:\n" " includedmodule:\n" " rationale: Included in the stack, just because.\n" " repository: https://pagure.io/includedmodule.git\n" " ref: somecoolbranchname\n" " buildorder: 100\n" " artifacts:\n" " rpms:\n" " - bar-0:1.23-1.module_deadbeef.x86_64\n" " - bar-devel-0:1.23-1.module_deadbeef.x86_64\n" " - bar-extras-0:1.23-1.module_deadbeef.x86_64\n" " - baz-0:42-42.module_deadbeef.x86_64\n" " - xxx-0:1-1.module_deadbeef.i686\n" " - xxx-0:1-1.module_deadbeef.x86_64\n" " - xyz-0:1-1.module_deadbeef.x86_64\n" "...\n"); } static void module_stream_v2_test_parse_dump (void) { g_autoptr (ModulemdModuleStreamV2) stream = NULL; g_autoptr (GError) error = NULL; gboolean ret; MMD_INIT_YAML_PARSER (parser); MMD_INIT_YAML_EVENT (event); MMD_INIT_YAML_EMITTER (emitter); MMD_INIT_YAML_STRING (&emitter, yaml_string); g_autofree gchar *yaml_path = NULL; g_autoptr (FILE) yaml_stream = NULL; g_autoptr (ModulemdSubdocumentInfo) subdoc = NULL; yaml_path = g_strdup_printf ("%s/yaml_specs/modulemd_stream_v2.yaml", g_getenv ("MESON_SOURCE_ROOT")); g_assert_nonnull (yaml_path); yaml_stream = g_fopen (yaml_path, "rbe"); g_assert_nonnull (yaml_stream); /* First parse it */ yaml_parser_set_input_file (&parser, yaml_stream); g_assert_true (yaml_parser_parse (&parser, &event)); g_assert_cmpint (event.type, ==, YAML_STREAM_START_EVENT); yaml_event_delete (&event); g_assert_true (yaml_parser_parse (&parser, &event)); g_assert_cmpint (event.type, ==, YAML_DOCUMENT_START_EVENT); yaml_event_delete (&event); subdoc = modulemd_yaml_parse_document_type (&parser); g_assert_nonnull (subdoc); g_assert_null (modulemd_subdocument_info_get_gerror (subdoc)); g_assert_cmpint (modulemd_subdocument_info_get_doctype (subdoc), ==, MODULEMD_YAML_DOC_MODULESTREAM); g_assert_cmpint (modulemd_subdocument_info_get_mdversion (subdoc), ==, 2); g_assert_nonnull (modulemd_subdocument_info_get_yaml (subdoc)); stream = modulemd_module_stream_v2_parse_yaml (subdoc, TRUE, FALSE, &error); g_assert_no_error (error); g_assert_nonnull (stream); /* Then dump it */ g_debug ("Starting dumping"); g_assert_true (mmd_emitter_start_stream (&emitter, &error)); ret = modulemd_module_stream_v2_emit_yaml (stream, &emitter, &error); g_assert_no_error (error); g_assert_true (ret); ret = mmd_emitter_end_stream (&emitter, &error); g_assert_no_error (error); g_assert_true (ret); g_assert_nonnull (yaml_string->str); g_assert_cmpstr ( yaml_string->str, ==, "---\n" "document: modulemd\n" "version: 2\n" "data:\n" " name: foo\n" " stream: \"latest\"\n" " version: 20160927144203\n" " context: c0ffee43\n" " arch: x86_64\n" " summary: An example module\n" " description: >-\n" " A module for the demonstration of the metadata format. Also, the " "obligatory lorem\n" " ipsum dolor sit amet goes right here.\n" " servicelevels:\n" " bug_fixes:\n" " eol: 2077-10-23\n" " rawhide:\n" " eol: 2077-10-23\n" " security_fixes:\n" " eol: 2077-10-23\n" " stable_api:\n" " eol: 2077-10-23\n" " license:\n" " module:\n" " - MIT\n" " content:\n" " - Apache-2.0\n" " - GPL-1.0-or-later OR Artistic-1.0-Perl\n" " xmd:\n" " some_key: some_data\n" " dependencies:\n" " - buildrequires:\n" " platform: [-epel7, -f27, -f28]\n" " requires:\n" " platform: [-epel7, -f27, -f28]\n" " - buildrequires:\n" " buildtools: [v1, v2]\n" " compatible: [v3]\n" " platform: [f27]\n" " requires:\n" " compatible: [v3, v4]\n" " platform: [f27]\n" " - buildrequires:\n" " platform: [f28]\n" " requires:\n" " platform: [f28]\n" " runtime: [a, b]\n" " - buildrequires:\n" " extras: []\n" " moreextras: [bar, foo]\n" " platform: [epel7]\n" " requires:\n" " extras: []\n" " moreextras: [bar, foo]\n" " platform: [epel7]\n" " references:\n" " community: http://www.example.com/\n" " documentation: http://www.example.com/\n" " tracker: http://www.example.com/\n" " profiles:\n" " buildroot:\n" " rpms:\n" " - bar-devel\n" " container:\n" " rpms:\n" " - bar\n" " - bar-devel\n" " minimal:\n" " description: Minimal profile installing only the bar package.\n" " rpms:\n" " - bar\n" " srpm-buildroot:\n" " rpms:\n" " - bar-extras\n" " api:\n" " rpms:\n" " - bar\n" " - bar-devel\n" " - bar-extras\n" " - baz\n" " - xxx\n" " filter:\n" " rpms:\n" " - baz-nonfoo\n" " demodularized:\n" " rpms:\n" " - bar-old\n" " buildopts:\n" " rpms:\n" " macros: >\n" " %demomacro 1\n" "\n" " %demomacro2 %{demomacro}23\n" " whitelist:\n" " - fooscl-1-bar\n" " - fooscl-1-baz\n" " - xxx\n" " - xyz\n" " arches: [i686, x86_64]\n" " components:\n" " rpms:\n" " bar:\n" " rationale: We need this to demonstrate stuff.\n" " name: bar-real\n" " repository: https://pagure.io/bar.git\n" " cache: https://example.com/cache\n" " ref: 26ca0c0\n" " baz:\n" " rationale: Demonstrate updating the buildroot contents.\n" " buildroot: true\n" " srpm-buildroot: true\n" " buildorder: -1\n" " xxx:\n" " rationale: xxx demonstrates arches and multilib.\n" " arches: [i686, x86_64]\n" " multilib: [x86_64]\n" " xyz:\n" " rationale: xyz is a bundled dependency of xxx.\n" " buildorder: 10\n" " modules:\n" " includedmodule:\n" " rationale: Included in the stack, just because.\n" " repository: https://pagure.io/includedmodule.git\n" " ref: somecoolbranchname\n" " buildorder: 100\n" " artifacts:\n" " rpms:\n" " - bar-0:1.23-1.module_deadbeef.x86_64\n" " - bar-devel-0:1.23-1.module_deadbeef.x86_64\n" " - bar-extras-0:1.23-1.module_deadbeef.x86_64\n" " - baz-0:42-42.module_deadbeef.x86_64\n" " - xxx-0:1-1.module_deadbeef.i686\n" " - xxx-0:1-1.module_deadbeef.x86_64\n" " - xyz-0:1-1.module_deadbeef.x86_64\n" " rpm-map:\n" " sha256:\n" " " "ee47083ed80146eb2c84e9a94d0836393912185dcda62b9d93ee0c2ea5dc795b:\n" " name: bar\n" " epoch: 0\n" " version: \"1.23\"\n" " release: 1.module_deadbeef\n" " arch: x86_64\n" " nevra: bar-0:1.23-1.module_deadbeef.x86_64\n" "...\n"); } static void module_stream_v1_test_depends_on_stream (void) { g_autoptr (ModulemdModuleStream) stream = NULL; g_autofree gchar *path = NULL; g_autoptr (GError) error = NULL; g_autofree gchar *module_name = NULL; g_autofree gchar *module_stream = NULL; path = g_strdup_printf ("%s/dependson_v1.yaml", g_getenv ("TEST_DATA_PATH")); g_assert_nonnull (path); G_GNUC_BEGIN_IGNORE_DEPRECATIONS stream = modulemd_module_stream_read_file ( path, TRUE, module_name, module_stream, &error); G_GNUC_END_IGNORE_DEPRECATIONS g_assert_nonnull (stream); g_assert_true ( modulemd_module_stream_depends_on_stream (stream, "platform", "f30")); g_assert_true (modulemd_module_stream_build_depends_on_stream ( stream, "platform", "f30")); g_assert_false ( modulemd_module_stream_depends_on_stream (stream, "platform", "f28")); g_assert_false (modulemd_module_stream_build_depends_on_stream ( stream, "platform", "f28")); g_assert_false ( modulemd_module_stream_depends_on_stream (stream, "base", "f30")); g_assert_false ( modulemd_module_stream_build_depends_on_stream (stream, "base", "f30")); g_clear_object (&stream); } static void module_stream_v2_test_depends_on_stream (void) { g_autoptr (ModulemdModuleStream) stream = NULL; g_autofree gchar *path = NULL; g_autoptr (GError) error = NULL; g_autofree gchar *module_name = NULL; g_autofree gchar *module_stream = NULL; path = g_strdup_printf ("%s/dependson_v2.yaml", g_getenv ("TEST_DATA_PATH")); g_assert_nonnull (path); G_GNUC_BEGIN_IGNORE_DEPRECATIONS stream = modulemd_module_stream_read_file ( path, TRUE, module_name, module_stream, &error); G_GNUC_END_IGNORE_DEPRECATIONS g_assert_nonnull (stream); g_assert_true ( modulemd_module_stream_depends_on_stream (stream, "platform", "f30")); g_assert_true (modulemd_module_stream_build_depends_on_stream ( stream, "platform", "f30")); g_assert_false ( modulemd_module_stream_depends_on_stream (stream, "platform", "f28")); g_assert_false (modulemd_module_stream_build_depends_on_stream ( stream, "platform", "f28")); g_assert_false ( modulemd_module_stream_depends_on_stream (stream, "base", "f30")); g_assert_false ( modulemd_module_stream_build_depends_on_stream (stream, "base", "f30")); g_clear_object (&stream); } static void module_stream_test_validate_buildafter (void) { g_autoptr (ModulemdModuleStream) stream = NULL; g_autofree gchar *path = NULL; g_autoptr (GError) error = NULL; guint64 version; /* buildafter is supported starting with v2 */ for (version = MD_MODULESTREAM_VERSION_TWO; version <= MD_MODULESTREAM_VERSION_LATEST; version++) { /* Test a valid module stream with buildafter set */ path = g_strdup_printf ("%s/buildafter/good_buildafter_v%" PRIu64 ".yaml", g_getenv ("TEST_DATA_PATH"), version); g_assert_nonnull (path); G_GNUC_BEGIN_IGNORE_DEPRECATIONS stream = modulemd_module_stream_read_file (path, TRUE, NULL, NULL, &error); G_GNUC_END_IGNORE_DEPRECATIONS g_assert_nonnull (stream); g_assert_null (error); g_clear_pointer (&path, g_free); g_clear_object (&stream); /* Should fail validation if both buildorder and buildafter are set for the * same component. */ path = g_strdup_printf ("%s/buildafter/both_same_component_v%" PRIu64 ".yaml", g_getenv ("TEST_DATA_PATH"), version); g_assert_nonnull (path); G_GNUC_BEGIN_IGNORE_DEPRECATIONS stream = modulemd_module_stream_read_file (path, TRUE, NULL, NULL, &error); G_GNUC_END_IGNORE_DEPRECATIONS g_assert_error (error, MODULEMD_ERROR, MMD_ERROR_VALIDATE); g_assert_null (stream); g_clear_error (&error); g_clear_pointer (&path, g_free); /* Should fail validation if both buildorder and buildafter are set in * different components of the same stream. */ path = g_strdup_printf ("%s/buildafter/mixed_buildorder_v%" PRIu64 ".yaml", g_getenv ("TEST_DATA_PATH"), version); g_assert_nonnull (path); G_GNUC_BEGIN_IGNORE_DEPRECATIONS stream = modulemd_module_stream_read_file (path, TRUE, NULL, NULL, &error); G_GNUC_END_IGNORE_DEPRECATIONS g_assert_error (error, MODULEMD_ERROR, MMD_ERROR_VALIDATE); g_assert_null (stream); g_clear_error (&error); g_clear_pointer (&path, g_free); /* Should fail if a key specified in a buildafter set does not exist for this * module stream. */ path = g_strdup_printf ("%s/buildafter/invalid_key_v%" PRIu64 ".yaml", g_getenv ("TEST_DATA_PATH"), version); g_assert_nonnull (path); G_GNUC_BEGIN_IGNORE_DEPRECATIONS stream = modulemd_module_stream_read_file (path, TRUE, NULL, NULL, &error); G_GNUC_END_IGNORE_DEPRECATIONS g_assert_error (error, MODULEMD_ERROR, MMD_ERROR_VALIDATE); g_assert_null (stream); g_clear_error (&error); g_clear_pointer (&path, g_free); } } static void module_stream_test_validate_buildarches (void) { g_autoptr (ModulemdModuleStream) stream = NULL; g_autofree gchar *path = NULL; g_autoptr (GError) error = NULL; guint64 version; /* skipping v1 because spec does not require build arch validation */ for (version = MD_MODULESTREAM_VERSION_TWO; version <= MD_MODULESTREAM_VERSION_LATEST; version++) { /* Test a valid module stream with no buildopts or component * rpm arches set. */ path = g_strdup_printf ("%s/buildarches/good_no_arches_v%" PRIu64 ".yaml", g_getenv ("TEST_DATA_PATH"), version); g_assert_nonnull (path); G_GNUC_BEGIN_IGNORE_DEPRECATIONS stream = modulemd_module_stream_read_file (path, TRUE, NULL, NULL, &error); G_GNUC_END_IGNORE_DEPRECATIONS g_assert_nonnull (stream); g_assert_null (error); g_clear_pointer (&path, g_free); g_clear_object (&stream); /* Test a valid module stream with buildopts arches but no component rpm * arches set. */ path = g_strdup_printf ("%s/buildarches/only_module_arches_v%" PRIu64 ".yaml", g_getenv ("TEST_DATA_PATH"), version); g_assert_nonnull (path); G_GNUC_BEGIN_IGNORE_DEPRECATIONS stream = modulemd_module_stream_read_file (path, TRUE, NULL, NULL, &error); G_GNUC_END_IGNORE_DEPRECATIONS g_assert_nonnull (stream); g_assert_null (error); g_clear_pointer (&path, g_free); g_clear_object (&stream); /* Test a valid module stream with component rpm arches but no buildopts * arches set. */ path = g_strdup_printf ("%s/buildarches/only_rpm_arches_v%" PRIu64 ".yaml", g_getenv ("TEST_DATA_PATH"), version); g_assert_nonnull (path); G_GNUC_BEGIN_IGNORE_DEPRECATIONS stream = modulemd_module_stream_read_file (path, TRUE, NULL, NULL, &error); G_GNUC_END_IGNORE_DEPRECATIONS g_assert_nonnull (stream); g_assert_null (error); g_clear_pointer (&path, g_free); g_clear_object (&stream); /* Test a valid module stream with buildopts arches set and a component rpm * specified containing a subset of archs specified at the module level. */ path = g_strdup_printf ("%s/buildarches/good_combo_arches_v%" PRIu64 ".yaml", g_getenv ("TEST_DATA_PATH"), version); g_assert_nonnull (path); G_GNUC_BEGIN_IGNORE_DEPRECATIONS stream = modulemd_module_stream_read_file (path, TRUE, NULL, NULL, &error); G_GNUC_END_IGNORE_DEPRECATIONS g_assert_nonnull (stream); g_assert_null (error); g_clear_pointer (&path, g_free); g_clear_object (&stream); /* Should fail validation if buildopts arches is set and a component rpm * specified an arch not specified at the module level. */ path = g_strdup_printf ("%s/buildarches/bad_combo_arches_v%" PRIu64 ".yaml", g_getenv ("TEST_DATA_PATH"), version); g_assert_nonnull (path); G_GNUC_BEGIN_IGNORE_DEPRECATIONS stream = modulemd_module_stream_read_file (path, TRUE, NULL, NULL, &error); G_GNUC_END_IGNORE_DEPRECATIONS g_assert_error (error, MODULEMD_ERROR, MMD_ERROR_VALIDATE); g_assert_null (stream); g_clear_error (&error); g_clear_pointer (&path, g_free); } } static void module_stream_v2_test_rpm_map (void) { g_autoptr (ModulemdModuleStreamV2) stream = NULL; g_autoptr (ModulemdRpmMapEntry) entry = NULL; ModulemdRpmMapEntry *retrieved_entry = NULL; stream = modulemd_module_stream_v2_new ("foo", "bar"); g_assert_nonnull (stream); entry = modulemd_rpm_map_entry_new ( "bar", 0, "1.23", "1.module_deadbeef", "x86_64"); g_assert_nonnull (entry); modulemd_module_stream_v2_set_rpm_artifact_map_entry ( stream, entry, "sha256", "baddad"); retrieved_entry = modulemd_module_stream_v2_get_rpm_artifact_map_entry ( stream, "sha256", "baddad"); g_assert_nonnull (retrieved_entry); g_assert_true (modulemd_rpm_map_entry_equals (entry, retrieved_entry)); } static void module_stream_test_unicode_desc (void) { g_autoptr (ModulemdModuleStream) stream = NULL; g_autofree gchar *path = NULL; g_autoptr (GError) error = NULL; guint64 version; for (version = MD_MODULESTREAM_VERSION_ONE; version <= MD_MODULESTREAM_VERSION_LATEST; version++) { /* Test a module stream with unicode in description */ path = g_strdup_printf ("%s/stream_unicode_v%" PRIu64 ".yaml", g_getenv ("TEST_DATA_PATH"), version); g_assert_nonnull (path); G_GNUC_BEGIN_IGNORE_DEPRECATIONS stream = modulemd_module_stream_read_file (path, TRUE, NULL, NULL, &error); G_GNUC_END_IGNORE_DEPRECATIONS g_assert_nonnull (stream); g_assert_no_error (error); g_clear_object (&stream); g_clear_error (&error); g_clear_pointer (&path, g_free); } } static void module_stream_v1_test_xmd_issue_274 (void) { g_autoptr (ModulemdModuleStream) stream = NULL; g_autofree gchar *path = NULL; g_autoptr (GError) error = NULL; GVariant *xmd1 = NULL; GVariant *xmd2 = NULL; path = g_strdup_printf ("%s/stream_unicode_v1.yaml", g_getenv ("TEST_DATA_PATH")); g_assert_nonnull (path); G_GNUC_BEGIN_IGNORE_DEPRECATIONS stream = modulemd_module_stream_read_file (path, TRUE, NULL, NULL, &error); G_GNUC_END_IGNORE_DEPRECATIONS g_assert_nonnull (stream); g_assert_no_error (error); g_assert_cmpint (modulemd_module_stream_get_mdversion (stream), ==, MD_MODULESTREAM_VERSION_ONE); xmd1 = modulemd_module_stream_v1_get_xmd (MODULEMD_MODULE_STREAM_V1 (stream)); xmd2 = modulemd_module_stream_v1_get_xmd (MODULEMD_MODULE_STREAM_V1 (stream)); g_assert_true (xmd1 == xmd2); } static void module_stream_v2_test_xmd_issue_290 (void) { gboolean ret; g_auto (GVariantBuilder) builder; g_autoptr (GVariant) xmd = NULL; GVariant *xmd_array = NULL; g_autoptr (GVariantDict) xmd_dict = NULL; g_autoptr (GError) error = NULL; g_autoptr (ModulemdModuleIndex) index = modulemd_module_index_new (); g_autofree gchar *yaml_str = NULL; g_autoptr (ModulemdModuleStreamV2) stream = modulemd_module_stream_v2_new ("foo", "bar"); modulemd_module_stream_v2_set_summary (stream, "summary"); modulemd_module_stream_v2_set_description (stream, "desc"); modulemd_module_stream_v2_add_module_license (stream, "DUMMY"); g_variant_builder_init (&builder, G_VARIANT_TYPE_ARRAY); g_variant_builder_add_value (&builder, g_variant_new_string ("foo")); g_variant_builder_add_value (&builder, g_variant_new_string ("bar")); xmd_array = g_variant_builder_end (&builder); xmd_dict = g_variant_dict_new (NULL); g_variant_dict_insert_value ( xmd_dict, "something", g_steal_pointer (&xmd_array)); xmd = g_variant_ref_sink (g_variant_dict_end (xmd_dict)); modulemd_module_stream_v2_set_xmd (stream, xmd); ret = modulemd_module_index_add_module_stream ( index, MODULEMD_MODULE_STREAM (stream), &error); g_assert_no_error (error); g_assert_true (ret); yaml_str = modulemd_module_index_dump_to_string (index, &error); // clang-format off g_assert_cmpstr (yaml_str, ==, "---\n" "document: modulemd\n" "version: 2\n" "data:\n" " name: foo\n" " stream: \"bar\"\n" " summary: summary\n" " description: >-\n" " desc\n" " license:\n" " module:\n" " - DUMMY\n" " xmd:\n" " something:\n" " - foo\n" " - bar\n" "...\n"); // clang-format on g_assert_no_error (error); } static void module_stream_v2_test_xmd_issue_290_with_example (void) { gboolean ret; g_autoptr (ModulemdModuleStream) stream = NULL; g_autofree gchar *path = NULL; g_autoptr (GError) error = NULL; g_autoptr (ModulemdModuleIndex) index = modulemd_module_index_new (); g_autofree gchar *output_yaml = NULL; g_autoptr (GVariant) xmd = NULL; path = g_strdup_printf ("%s/290.yaml", g_getenv ("TEST_DATA_PATH")); g_assert_nonnull (path); G_GNUC_BEGIN_IGNORE_DEPRECATIONS stream = modulemd_module_stream_read_file (path, TRUE, NULL, NULL, &error); G_GNUC_END_IGNORE_DEPRECATIONS g_assert_nonnull (stream); g_assert_no_error (error); xmd = modulemd_variant_deep_copy ( modulemd_module_stream_v1_get_xmd (MODULEMD_MODULE_STREAM_V1 (stream))); modulemd_module_stream_v1_set_xmd (MODULEMD_MODULE_STREAM_V1 (stream), xmd); ret = modulemd_module_index_add_module_stream (index, stream, &error); g_assert_no_error (error); g_assert_true (ret); output_yaml = modulemd_module_index_dump_to_string (index, &error); g_assert_no_error (error); g_assert_nonnull (output_yaml); } static void module_stream_v1_test_community (void) { g_autoptr (ModulemdModuleStreamV1) stream = NULL; const gchar *community = NULL; g_autofree gchar *community_prop = NULL; stream = modulemd_module_stream_v1_new (NULL, NULL); // Check the defaults community = modulemd_module_stream_v1_get_community (stream); g_object_get (stream, MMD_TEST_COM_PROP, &community_prop, NULL); g_assert_null (community); g_assert_null (community_prop); g_clear_pointer (&community_prop, g_free); // Test property setting g_object_set (stream, MMD_TEST_COM_PROP, MMD_TEST_DOC_TEXT, NULL); community = modulemd_module_stream_v1_get_community (stream); g_object_get (stream, MMD_TEST_COM_PROP, &community_prop, NULL); g_assert_cmpstr (community_prop, ==, MMD_TEST_DOC_TEXT); g_assert_cmpstr (community, ==, MMD_TEST_DOC_TEXT); g_clear_pointer (&community_prop, g_free); // Test set_community() modulemd_module_stream_v1_set_community (stream, MMD_TEST_DOC_TEXT2); community = modulemd_module_stream_v1_get_community (stream); g_object_get (stream, MMD_TEST_COM_PROP, &community_prop, NULL); g_assert_cmpstr (community_prop, ==, MMD_TEST_DOC_TEXT2); g_assert_cmpstr (community, ==, MMD_TEST_DOC_TEXT2); g_clear_pointer (&community_prop, g_free); // Test setting to NULL g_object_set (stream, MMD_TEST_COM_PROP, NULL, NULL); community = modulemd_module_stream_v1_get_community (stream); g_object_get (stream, MMD_TEST_COM_PROP, &community_prop, NULL); g_assert_null (community); g_assert_null (community_prop); g_clear_pointer (&community_prop, g_free); g_clear_object (&stream); } static void module_stream_v2_test_community (void) { g_autoptr (ModulemdModuleStreamV2) stream = NULL; const gchar *community = NULL; g_autofree gchar *community_prop = NULL; stream = modulemd_module_stream_v2_new (NULL, NULL); // Check the defaults community = modulemd_module_stream_v2_get_community (stream); g_object_get (stream, MMD_TEST_COM_PROP, &community_prop, NULL); g_assert_null (community); g_assert_null (community_prop); g_clear_pointer (&community_prop, g_free); // Test property setting g_object_set (stream, MMD_TEST_COM_PROP, MMD_TEST_DOC_TEXT, NULL); community = modulemd_module_stream_v2_get_community (stream); g_object_get (stream, MMD_TEST_COM_PROP, &community_prop, NULL); g_assert_cmpstr (community_prop, ==, MMD_TEST_DOC_TEXT); g_assert_cmpstr (community, ==, MMD_TEST_DOC_TEXT); g_clear_pointer (&community_prop, g_free); // Test set_community() modulemd_module_stream_v2_set_community (stream, MMD_TEST_DOC_TEXT2); community = modulemd_module_stream_v2_get_community (stream); g_object_get (stream, MMD_TEST_COM_PROP, &community_prop, NULL); g_assert_cmpstr (community_prop, ==, MMD_TEST_DOC_TEXT2); g_assert_cmpstr (community, ==, MMD_TEST_DOC_TEXT2); g_clear_pointer (&community_prop, g_free); // Test setting to NULL g_object_set (stream, MMD_TEST_COM_PROP, NULL, NULL); community = modulemd_module_stream_v2_get_community (stream); g_object_get (stream, MMD_TEST_COM_PROP, &community_prop, NULL); g_assert_null (community); g_assert_null (community_prop); g_clear_pointer (&community_prop, g_free); g_clear_object (&stream); } /* * This is a regression test for a memory leak that occurred when reading a * v1 ModuleStream YAML document if the `data.license.content` field appeared * before the `data.license.module` field. */ static void module_stream_v1_regression_content_license (void) { g_autoptr (ModulemdModuleStream) stream = NULL; g_autoptr (GError) error = NULL; const char *content_first = "---\n" "document: modulemd\n" "version: 1\n" "data:\n" " summary: summary\n" " description: >-\n" " desc\n" " license:\n" " content:\n" " - DUMMY\n" " module:\n" " - DUMMY\n" " xmd:\n" " something:\n" " - foo\n" " - bar\n" "...\n"; G_GNUC_BEGIN_IGNORE_DEPRECATIONS stream = modulemd_module_stream_read_string ( content_first, TRUE, NULL, NULL, &error); G_GNUC_END_IGNORE_DEPRECATIONS g_assert_no_error (error); g_assert_nonnull (stream); g_assert_true (MODULEMD_IS_MODULE_STREAM_V1 (stream)); } static void module_stream_v2_test_obsoletes (void) { g_autoptr (ModulemdModuleStreamV2) stream = NULL; g_autoptr (ModulemdObsoletes) o = NULL; stream = modulemd_module_stream_v2_new ("foo", "latest"); g_assert_nonnull (stream); o = modulemd_obsoletes_new (1, 2, "testmodule", "teststream", "testmessage"); g_assert_nonnull (o); g_assert_null (modulemd_module_stream_v2_get_obsoletes_resolved (stream)); modulemd_module_stream_v2_associate_obsoletes (stream, o); g_clear_object (&o); o = modulemd_module_stream_v2_get_obsoletes_resolved (stream); g_assert_nonnull (o); g_assert_cmpstr (modulemd_obsoletes_get_module_name (o), ==, "testmodule"); g_assert_cmpstr (modulemd_obsoletes_get_module_stream (o), ==, "teststream"); g_assert_null (modulemd_obsoletes_get_module_context (o)); o = modulemd_obsoletes_new (1, 2, "testmodule", "teststream", "testmessage"); g_assert_nonnull (o); modulemd_obsoletes_set_reset (o, TRUE); modulemd_module_stream_v2_associate_obsoletes (stream, o); o = modulemd_module_stream_v2_get_obsoletes_resolved (stream); g_assert_null (o); g_clear_object (&o); o = modulemd_module_stream_v2_get_obsoletes (stream); g_assert_nonnull (o); g_assert_cmpstr (modulemd_obsoletes_get_module_name (o), ==, "testmodule"); g_assert_cmpstr (modulemd_obsoletes_get_module_stream (o), ==, "teststream"); g_assert_null (modulemd_obsoletes_get_module_context (o)); g_clear_object (&o); g_clear_object (&stream); } static void module_stream_v2_test_quoting (void) { gboolean ret; g_auto (GVariantBuilder) builder; g_autoptr (GVariant) xmd = NULL; GVariant *xmd_array = NULL; g_autoptr (GVariantDict) xmd_dict = NULL; g_autoptr (GError) error = NULL; g_autoptr (ModulemdModuleIndex) index = modulemd_module_index_new (); g_autofree gchar *yaml_str = NULL; g_autoptr (ModulemdModuleStreamV2) stream = modulemd_module_stream_v2_new ("0", "1"); modulemd_module_stream_v2_set_summary (stream, "2"); modulemd_module_stream_v2_set_description (stream, "3"); modulemd_module_stream_v2_add_module_license (stream, "4"); g_variant_builder_init (&builder, G_VARIANT_TYPE_ARRAY); g_variant_builder_add_value (&builder, g_variant_new_string ("5")); xmd_array = g_variant_builder_end (&builder); xmd_dict = g_variant_dict_new (NULL); g_variant_dict_insert_value (xmd_dict, "6", g_steal_pointer (&xmd_array)); xmd = g_variant_ref_sink (g_variant_dict_end (xmd_dict)); modulemd_module_stream_v2_set_xmd (stream, xmd); ret = modulemd_module_index_add_module_stream ( index, MODULEMD_MODULE_STREAM (stream), &error); g_assert_no_error (error); g_assert_true (ret); yaml_str = modulemd_module_index_dump_to_string (index, &error); g_assert_cmpstr (yaml_str, ==, "---\n" "document: modulemd\n" "version: 2\n" "data:\n" " name: \"0\"\n" " stream: \"1\"\n" " summary: \"2\"\n" " description: >-\n" " 3\n" " license:\n" " module:\n" " - \"4\"\n" " xmd:\n" " \"6\":\n" " - \"5\"\n" "...\n"); g_assert_no_error (error); } int main (int argc, char *argv[]) { setlocale (LC_ALL, ""); g_test_init (&argc, &argv, NULL); g_test_bug_base ("https://bugzilla.redhat.com/show_bug.cgi?id="); // Define the tests.o g_test_add_func ("/modulemd/v2/modulestream/construct", module_stream_test_construct); g_test_add_func ("/modulemd/v2/modulestream/arch", module_stream_test_arch); g_test_add_func ("/modulemd/v2/modulestream/v1/documentation", module_stream_v1_test_documentation); g_test_add_func ("/modulemd/v2/modulestream/v2/documentation", module_stream_v2_test_documentation); g_test_add_func ("/modulemd/v2/modulestream/v1/summary", module_stream_v1_test_summary); g_test_add_func ("/modulemd/v2/modulestream/v2/summary", module_stream_v2_test_summary); g_test_add_func ("/modulemd/v2/modulestream/v1/description", module_stream_v1_test_description); g_test_add_func ("/modulemd/v2/modulestream/v2/description", module_stream_v2_test_description); g_test_add_func ("/modulemd/v2/modulestream/v1/licenses", module_stream_v1_test_licenses); g_test_add_func ("/modulemd/v2/modulestream/v2/licenses", module_stream_v2_test_licenses); g_test_add_func ("/modulemd/v2/modulestream/v1/tracker", module_stream_v1_test_tracker); g_test_add_func ("/modulemd/v2/modulestream/v2/tracker", module_stream_v2_test_tracker); g_test_add_func ("/modulemd/v2/modulestream/v1/profiles", module_stream_v1_test_profiles); g_test_add_func ("/modulemd/v2/modulestream/v2/profiles", module_stream_v2_test_profiles); g_test_add_func ("/modulemd/v2/modulestream/v1/rpm_api", module_stream_v1_test_rpm_api); g_test_add_func ("/modulemd/v2/modulestream/v2/rpm_api", module_stream_v2_test_rpm_api); g_test_add_func ("/modulemd/v2/modulestream/v1/rpm_filters", module_stream_v1_test_rpm_filters); g_test_add_func ("/modulemd/v2/modulestream/v2/rpm_filters", module_stream_v2_test_rpm_filters); g_test_add_func ("/modulemd/v2/modulestream/v2/demodularized_rpms", module_stream_v2_test_demodularized_rpms); g_test_add_func ("/modulemd/v2/modulestream/v2_yaml", module_stream_test_v2_yaml); g_test_add_func ("/modulemd/v2/packager/v2_sanity", module_packager_v2_sanity); g_test_add_func ("/modulemd/v2/packager/v3_sanity", module_packager_v3_sanity); g_test_add_func ("/modulemd/v2/modulestream/upgrade_v1_to_v2", module_stream_test_upgrade_v1_to_v2); g_test_add_func ("/modulemd/v2/modulestream/v1/rpm_artifacts", module_stream_v1_test_rpm_artifacts); g_test_add_func ("/modulemd/v2/modulestream/v2/rpm_artifacts", module_stream_v2_test_rpm_artifacts); g_test_add_func ("/modulemd/v2/modulestream/v1/servicelevels", module_stream_v2_test_servicelevels); g_test_add_func ("/modulemd/v2/modulestream/v2/servicelevels", module_stream_v1_test_servicelevels); g_test_add_func ("/modulemd/v2/modulestream/v1/components", module_stream_v1_test_components); g_test_add_func ("/modulemd/v2/modulestream/v2/components", module_stream_v2_test_components); g_test_add_func ("/modulemd/v2/modulestream/copy", module_stream_test_copy); g_test_add_func ("/modulemd/v2/modulestream/equals", module_stream_test_equals); g_test_add_func ("/modulemd/v2/modulestream/nsvc", module_stream_test_nsvc); g_test_add_func ("/modulemd/v2/modulestream/nsvca", module_stream_test_nsvca); g_test_add_func ("/modulemd/v2/modulestream/v1/equals", module_stream_v1_test_equals); g_test_add_func ("/modulemd/v2/modulestream/v2/equals", module_stream_v2_test_equals); g_test_add_func ("/modulemd/v2/modulestream/v1/dependencies", module_stream_v1_test_dependencies); g_test_add_func ("/modulemd/v2/modulestream/v2/dependencies", module_stream_v2_test_dependencies); g_test_add_func ("/modulemd/v2/modulestream/v1/parse_dump", module_stream_v1_test_parse_dump); g_test_add_func ("/modulemd/v2/modulestream/v2/parse_dump", module_stream_v2_test_parse_dump); g_test_add_func ("/modulemd/v2/modulestream/v1/depends_on_stream", module_stream_v1_test_depends_on_stream); g_test_add_func ("/modulemd/v2/modulestream/v2/depends_on_stream", module_stream_v2_test_depends_on_stream); g_test_add_func ("/modulemd/v2/modulestream/validate/buildafter", module_stream_test_validate_buildafter); g_test_add_func ("/modulemd/v2/modulestream/validate/buildarches", module_stream_test_validate_buildarches); g_test_add_func ("/modulemd/v2/modulestream/v2/rpm_map", module_stream_v2_test_rpm_map); g_test_add_func ("/modulemd/v2/modulestream/v1/community", module_stream_v1_test_community); g_test_add_func ("/modulemd/v2/modulestream/v2/community", module_stream_v2_test_community); g_test_add_func ("/modulemd/v2/modulestream/unicode/description", module_stream_test_unicode_desc); g_test_add_func ("/modulemd/v2/modulestream/v1/xmd/issue274", module_stream_v1_test_xmd_issue_274); g_test_add_func ("/modulemd/v2/modulestream/v2/xmd/issue290", module_stream_v2_test_xmd_issue_290); g_test_add_func ("/modulemd/v2/modulestream/v2/xmd/issue290plus", module_stream_v2_test_xmd_issue_290_with_example); g_test_add_func ("/modulemd/v2/modulestream/regression/memleak/v1_licenses", module_stream_v1_regression_content_license); g_test_add_func ("/modulemd/v2/modulestream/v2/obsoletes", module_stream_v2_test_obsoletes); g_test_add_func ("/modulemd/v2/modulestream/v2/quoting", module_stream_v2_test_quoting); return g_test_run (); } fedora-modularity-libmodulemd-357799c/modulemd/tests/test-modulemd-obsoletes.c000066400000000000000000000434351502446517500276460ustar00rootroot00000000000000/* * This file is part of libmodulemd * Copyright (C) 2018 Red Hat, Inc. * * Fedora-License-Identifier: MIT * SPDX-2.0-License-Identifier: MIT * SPDX-3.0-License-Identifier: MIT * * This program is free software. * For more information on the license, see COPYING. * For more information on free software, see . */ #include #include #include #include #include "modulemd-subdocument-info.h" #include "modulemd-obsoletes.h" #include "private/glib-extensions.h" #include "private/modulemd-subdocument-info-private.h" #include "private/modulemd-obsoletes-private.h" #include "private/modulemd-util.h" #include "private/modulemd-yaml.h" #include "private/test-utils.h" static void obsoletes_test_construct (void) { g_autoptr (ModulemdObsoletes) e = NULL; /* Test new() with a valid mdversion and module name */ e = modulemd_obsoletes_new (1, 2, "testmodule", "teststream", "testmessage"); g_assert_nonnull (e); g_assert_true (MODULEMD_IS_OBSOLETES (e)); g_assert_cmpint (modulemd_obsoletes_get_mdversion (e), ==, 1); g_assert_cmpstr (modulemd_obsoletes_get_module_name (e), ==, "testmodule"); g_assert_cmpstr (modulemd_obsoletes_get_module_stream (e), ==, "teststream"); g_assert_cmpstr (modulemd_obsoletes_get_message (e), ==, "testmessage"); g_clear_object (&e); /* Test new() with a NULL module_name */ modulemd_test_signal = 0; signal (SIGTRAP, modulemd_test_signal_handler); e = modulemd_obsoletes_new ( MD_OBSOLETES_VERSION_ONE, 2, NULL, "teststream", "testmessage"); g_assert_cmpint (modulemd_test_signal, ==, SIGTRAP); /* If we trap the error, obsoletes actually returns a value here, so free it */ g_clear_object (&e); /* Test new() with a NULL module_context */ modulemd_test_signal = 0; signal (SIGTRAP, modulemd_test_signal_handler); e = modulemd_obsoletes_new ( MD_OBSOLETES_VERSION_ONE, 2, "testmodule", NULL, "testmessage"); g_assert_cmpint (modulemd_test_signal, ==, SIGTRAP); /* If we trap the error, obsoletes actually returns a value here, so free it */ g_clear_object (&e); /* Test new() with a NULL message */ modulemd_test_signal = 0; signal (SIGTRAP, modulemd_test_signal_handler); e = modulemd_obsoletes_new ( MD_OBSOLETES_VERSION_ONE, 2, "testmodule", "teststream", NULL); g_assert_cmpint (modulemd_test_signal, ==, SIGTRAP); /* If we trap the error, obsoletes actually returns a value here, so free it */ g_clear_object (&e); } static void obsoletes_test_copy (void) { g_autoptr (ModulemdObsoletes) e = NULL; g_autoptr (ModulemdObsoletes) e_copy = NULL; e = modulemd_obsoletes_new ( MD_OBSOLETES_VERSION_ONE, 2, "testmodule", "teststream", "testmessage"); e_copy = modulemd_obsoletes_copy (e); g_assert_nonnull (e_copy); g_assert_true (MODULEMD_IS_OBSOLETES (e_copy)); g_assert_cmpint (modulemd_obsoletes_get_mdversion (e_copy), ==, 1); g_assert_cmpint (modulemd_obsoletes_get_modified (e_copy), ==, 2); g_assert_cmpstr ( modulemd_obsoletes_get_module_name (e_copy), ==, "testmodule"); g_assert_cmpstr ( modulemd_obsoletes_get_module_stream (e_copy), ==, "teststream"); g_assert_cmpstr (modulemd_obsoletes_get_message (e_copy), ==, "testmessage"); g_clear_object (&e_copy); /* Test if we also copy optional field */ modulemd_obsoletes_set_module_context (e, "testcontext"); modulemd_obsoletes_set_eol_date (e, 9); modulemd_obsoletes_set_obsoleted_by (e, "nodejs", "12"); e_copy = modulemd_obsoletes_copy (e); g_assert_nonnull (e_copy); g_assert_true (MODULEMD_IS_OBSOLETES (e_copy)); g_assert_cmpint (modulemd_obsoletes_get_mdversion (e_copy), ==, 1); g_assert_cmpint (modulemd_obsoletes_get_modified (e_copy), ==, 2); g_assert_cmpuint (modulemd_obsoletes_get_reset (e), ==, FALSE); g_assert_cmpstr ( modulemd_obsoletes_get_module_name (e_copy), ==, "testmodule"); g_assert_cmpstr ( modulemd_obsoletes_get_module_stream (e_copy), ==, "teststream"); g_assert_cmpstr ( modulemd_obsoletes_get_module_context (e_copy), ==, "testcontext"); g_assert_cmpuint (modulemd_obsoletes_get_eol_date (e_copy), ==, 9); g_assert_cmpstr (modulemd_obsoletes_get_message (e_copy), ==, "testmessage"); g_assert_cmpstr ( modulemd_obsoletes_get_obsoleted_by_module_name (e_copy), ==, "nodejs"); g_assert_cmpstr ( modulemd_obsoletes_get_obsoleted_by_module_stream (e_copy), ==, "12"); g_clear_object (&e_copy); g_clear_object (&e); } static void obsoletes_test_validate (void) { g_autoptr (ModulemdObsoletes) e = NULL; g_autoptr (GError) error = NULL; e = modulemd_obsoletes_new ( MD_OBSOLETES_VERSION_ONE, 2, "module", "stream", "message"); g_assert_nonnull (e); g_assert_true (modulemd_obsoletes_validate (e, &error)); g_assert_null (error); g_clear_object (&e); /* Invalid mdversion */ e = modulemd_obsoletes_new (999, 2, "module", "stream", "message"); g_assert_nonnull (e); g_assert_false (modulemd_obsoletes_validate (e, &error)); g_assert_nonnull (error); g_assert_error (error, MODULEMD_ERROR, MMD_ERROR_VALIDATE); g_clear_object (&e); g_clear_error (&error); /* Invalid modified */ e = modulemd_obsoletes_new ( MD_OBSOLETES_VERSION_ONE, 0, "module", "stream", "message"); g_assert_nonnull (e); g_assert_false (modulemd_obsoletes_validate (e, &error)); g_assert_nonnull (error); g_assert_error (error, MODULEMD_ERROR, MMD_ERROR_VALIDATE); g_clear_object (&e); g_clear_error (&error); /* obsoleted_by have to be both set or unset */ e = modulemd_obsoletes_new ( MD_OBSOLETES_VERSION_ONE, 2, "module", "stream", "message"); modulemd_obsoletes_set_obsoleted_by_module_name (e, "only name without stream"); g_assert_nonnull (e); g_assert_false (modulemd_obsoletes_validate (e, &error)); g_assert_nonnull (error); g_assert_error (error, MODULEMD_ERROR, MMD_ERROR_VALIDATE); g_clear_object (&e); g_clear_error (&error); e = modulemd_obsoletes_new ( MD_OBSOLETES_VERSION_ONE, 2, "module", "stream", "message"); modulemd_obsoletes_set_obsoleted_by_module_stream ( e, "only stream without module name"); g_assert_nonnull (e); g_assert_false (modulemd_obsoletes_validate (e, &error)); g_assert_nonnull (error); g_assert_error (error, MODULEMD_ERROR, MMD_ERROR_VALIDATE); g_clear_object (&e); g_clear_error (&error); } static void obsoletes_test_get_mdversion (void) { g_autoptr (ModulemdObsoletes) e = NULL; guint64 mdversion; e = modulemd_obsoletes_new ( MD_OBSOLETES_VERSION_LATEST, 2, "testmodule", "teststream", "testmessage"); g_assert_true (MODULEMD_IS_OBSOLETES (e)); mdversion = modulemd_obsoletes_get_mdversion (e); g_assert_cmpuint (mdversion, ==, MD_OBSOLETES_VERSION_LATEST); } static void obsoletes_test_modified (void) { g_autoptr (ModulemdObsoletes) e = NULL; guint64 modified; e = modulemd_obsoletes_new ( MD_OBSOLETES_VERSION_LATEST, 2, "testmodule", "teststream", "testmessage"); g_assert_true (MODULEMD_IS_OBSOLETES (e)); modified = modulemd_obsoletes_get_modified (e); g_assert_cmpuint (modified, ==, 2); modulemd_obsoletes_set_modified (e, 9); modified = modulemd_obsoletes_get_modified (e); g_assert_cmpuint (modified, ==, 9); } static void obsoletes_test_reset (void) { g_autoptr (ModulemdObsoletes) e = NULL; e = modulemd_obsoletes_new ( MD_OBSOLETES_VERSION_LATEST, 2, "testmodule", "teststream", "testmessage"); g_assert_true (MODULEMD_IS_OBSOLETES (e)); g_assert_cmpuint (modulemd_obsoletes_get_reset (e), ==, FALSE); modulemd_obsoletes_set_reset (e, TRUE); g_assert_cmpuint (modulemd_obsoletes_get_reset (e), ==, TRUE); g_clear_object (&e); } static void obsoletes_test_eol_date (void) { g_autoptr (ModulemdObsoletes) e = NULL; e = modulemd_obsoletes_new ( MD_OBSOLETES_VERSION_LATEST, 2, "testmodule", "teststream", "testmessage"); g_assert_true (MODULEMD_IS_OBSOLETES (e)); g_assert_cmpuint (modulemd_obsoletes_get_eol_date (e), ==, 0); modulemd_obsoletes_set_eol_date (e, 9); g_assert_cmpuint (modulemd_obsoletes_get_eol_date (e), ==, 9); } static void obsoletes_test_message (void) { g_autoptr (ModulemdObsoletes) e = NULL; const gchar *message; e = modulemd_obsoletes_new ( MD_OBSOLETES_VERSION_LATEST, 2, "testmodule", "teststream", "testmessage"); g_assert_true (MODULEMD_IS_OBSOLETES (e)); message = modulemd_obsoletes_get_message (e); g_assert_cmpstr (message, ==, "testmessage"); modulemd_obsoletes_set_message (e, "test"); message = modulemd_obsoletes_get_message (e); g_assert_cmpstr (message, ==, "test"); } static void obsoletes_test_context (void) { g_autoptr (ModulemdObsoletes) e = NULL; const gchar *context; e = modulemd_obsoletes_new ( MD_OBSOLETES_VERSION_LATEST, 2, "testmodule", "teststream", "testmessage"); g_assert_true (MODULEMD_IS_OBSOLETES (e)); context = modulemd_obsoletes_get_module_context (e); g_assert_null (context); modulemd_obsoletes_set_module_context (e, "testcontext"); context = modulemd_obsoletes_get_module_context (e); g_assert_cmpstr (context, ==, "testcontext"); } static void obsoletes_test_obsoleted_by (void) { g_autoptr (ModulemdObsoletes) e = NULL; const gchar *obsoleted_by_module_name; const gchar *obsoleted_by_module_stream; e = modulemd_obsoletes_new ( MD_OBSOLETES_VERSION_LATEST, 2, "testmodule", "teststream", "testcontext"); g_assert_true (MODULEMD_IS_OBSOLETES (e)); obsoleted_by_module_name = modulemd_obsoletes_get_obsoleted_by_module_name (e); obsoleted_by_module_stream = modulemd_obsoletes_get_obsoleted_by_module_stream (e); g_assert_null (obsoleted_by_module_name); g_assert_null (obsoleted_by_module_stream); modulemd_obsoletes_set_obsoleted_by (e, "nodejs", "12"); obsoleted_by_module_name = modulemd_obsoletes_get_obsoleted_by_module_name (e); obsoleted_by_module_stream = modulemd_obsoletes_get_obsoleted_by_module_stream (e); g_assert_cmpstr (obsoleted_by_module_name, ==, "nodejs"); g_assert_cmpstr (obsoleted_by_module_stream, ==, "12"); } static void obsoletes_test_is_active (void) { g_autoptr (ModulemdObsoletes) e = NULL; e = modulemd_obsoletes_new ( MD_OBSOLETES_VERSION_LATEST, 2, "testmodule", "teststream", "testmessage"); g_assert_true (MODULEMD_IS_OBSOLETES (e)); g_assert_cmpuint (modulemd_obsoletes_get_eol_date (e), ==, 0); g_assert_true (modulemd_obsoletes_is_active (e)); modulemd_obsoletes_set_eol_date (e, 290001011200); g_assert_false (modulemd_obsoletes_is_active (e)); modulemd_obsoletes_set_eol_date (e, 199901011200); g_assert_true (modulemd_obsoletes_is_active (e)); } static void obsoletes_test_parse_yaml (void) { MMD_INIT_YAML_PARSER (parser); MMD_INIT_YAML_EVENT (event); g_autofree gchar *yaml_path = NULL; g_autoptr (ModulemdObsoletes) e = NULL; int yaml_ret; g_autoptr (FILE) yaml_stream = NULL; g_autoptr (GError) error = NULL; g_autoptr (ModulemdSubdocumentInfo) subdoc = NULL; /* Validate that we can read the specification without issues */ yaml_path = g_strdup_printf ("%s/yaml_specs/modulemd_obsoletes_v1.yaml", g_getenv ("MESON_SOURCE_ROOT")); g_assert_nonnull (yaml_path); yaml_stream = g_fopen (yaml_path, "rbe"); g_assert_nonnull (yaml_stream); yaml_parser_set_input_file (&parser, yaml_stream); /* The first event must be the stream start */ yaml_ret = yaml_parser_parse (&parser, &event); g_assert_true (yaml_ret); g_assert_cmpint (event.type, ==, YAML_STREAM_START_EVENT); yaml_event_delete (&event); /* The second event must be the document start */ yaml_ret = yaml_parser_parse (&parser, &event); g_assert_true (yaml_ret); g_assert_cmpint (event.type, ==, YAML_DOCUMENT_START_EVENT); yaml_event_delete (&event); subdoc = modulemd_yaml_parse_document_type (&parser); g_assert_nonnull (subdoc); g_assert_null (modulemd_subdocument_info_get_gerror (subdoc)); g_assert_cmpint (modulemd_subdocument_info_get_doctype (subdoc), ==, MODULEMD_YAML_DOC_OBSOLETES); g_assert_cmpint (modulemd_subdocument_info_get_mdversion (subdoc), ==, 1); g_assert_nonnull (modulemd_subdocument_info_get_yaml (subdoc)); e = modulemd_obsoletes_parse_yaml (subdoc, TRUE, &error); g_assert_no_error (error); g_assert_null (error); g_assert_nonnull (e); g_assert_cmpint (modulemd_obsoletes_get_mdversion (e), ==, 1); g_assert_cmpstr (modulemd_obsoletes_get_module_name (e), ==, "nodejs"); g_assert_cmpstr (modulemd_obsoletes_get_module_stream (e), ==, "11"); g_assert_cmpint (modulemd_obsoletes_get_modified (e), ==, 201805231425); g_assert_cmpstr (modulemd_obsoletes_get_message (e), ==, "Module stream nodejs:11 is no longer supported. It is " "recommended to switch to nodejs:12"); g_assert_cmpstr ( modulemd_obsoletes_get_obsoleted_by_module_name (e), ==, "nodejs"); g_assert_cmpstr ( modulemd_obsoletes_get_obsoleted_by_module_stream (e), ==, "12"); } static void obsoletes_test_emit_yaml (void) { MMD_INIT_YAML_EMITTER (emitter); MMD_INIT_YAML_EVENT (event); MMD_INIT_YAML_STRING (&emitter, yaml_string); g_autoptr (GError) error = NULL; g_autoptr (ModulemdObsoletes) e = NULL; e = modulemd_obsoletes_new (MD_OBSOLETES_VERSION_LATEST, 202001012020, "testmodule", "teststream", "testmessage"); g_assert_true (mmd_emitter_start_stream (&emitter, &error)); g_assert_true (modulemd_obsoletes_emit_yaml (e, &emitter, &error)); g_assert_true (mmd_emitter_end_stream (&emitter, &error)); g_assert_nonnull (yaml_string->str); g_assert_cmpstr (yaml_string->str, ==, "---\n" "document: modulemd-obsoletes\n" "version: 1\n" "data:\n" " modified: 2020-01-01T20:20Z\n" " module: testmodule\n" " stream: \"teststream\"\n" " message: testmessage\n" "...\n"); modulemd_obsoletes_set_module_context (e, "testcontext"); modulemd_obsoletes_set_eol_date (e, 202001010000); modulemd_obsoletes_set_obsoleted_by (e, "nodejs", "12"); MMD_REINIT_YAML_STRING (&emitter, yaml_string); g_assert_true (mmd_emitter_start_stream (&emitter, &error)); g_assert_true (modulemd_obsoletes_emit_yaml (e, &emitter, &error)); g_assert_true (mmd_emitter_end_stream (&emitter, &error)); g_assert_nonnull (yaml_string->str); g_assert_cmpstr (yaml_string->str, ==, "---\n" "document: modulemd-obsoletes\n" "version: 1\n" "data:\n" " modified: 2020-01-01T20:20Z\n" " module: testmodule\n" " stream: \"teststream\"\n" " context: testcontext\n" " eol_date: 2020-01-01T00:00Z\n" " message: testmessage\n" " obsoleted_by:\n" " module: nodejs\n" " stream: \"12\"\n" "...\n"); } static void obsoletes_test_quoting (void) { MMD_INIT_YAML_EMITTER (emitter); MMD_INIT_YAML_EVENT (event); MMD_INIT_YAML_STRING (&emitter, yaml_string); g_autoptr (GError) error = NULL; g_autoptr (ModulemdObsoletes) e = NULL; e = modulemd_obsoletes_new ( MD_OBSOLETES_VERSION_LATEST, 202001012020, "0", "1", "2"); modulemd_obsoletes_set_module_context (e, "3"); modulemd_obsoletes_set_eol_date (e, 202001010000); modulemd_obsoletes_set_obsoleted_by (e, "4", "5"); g_assert_true (mmd_emitter_start_stream (&emitter, &error)); g_assert_true (modulemd_obsoletes_emit_yaml (e, &emitter, &error)); g_assert_true (mmd_emitter_end_stream (&emitter, &error)); g_assert_nonnull (yaml_string->str); g_assert_cmpstr (yaml_string->str, ==, "---\n" "document: modulemd-obsoletes\n" "version: 1\n" "data:\n" " modified: 2020-01-01T20:20Z\n" " module: \"0\"\n" " stream: \"1\"\n" " context: \"3\"\n" " eol_date: 2020-01-01T00:00Z\n" " message: \"2\"\n" " obsoleted_by:\n" " module: \"4\"\n" " stream: \"5\"\n" "...\n"); } int main (int argc, char *argv[]) { setlocale (LC_ALL, ""); g_test_init (&argc, &argv, NULL); g_test_bug_base ("https://bugzilla.redhat.com/show_bug.cgi?id="); // Define the tests. g_test_add_func ("/modulemd/v2/obsoletes/construct", obsoletes_test_construct); g_test_add_func ("/modulemd/v2/obsoletes/copy", obsoletes_test_copy); g_test_add_func ("/modulemd/v2/obsoletes/validate", obsoletes_test_validate); g_test_add_func ("/modulemd/v2/obsoletes/version", obsoletes_test_get_mdversion); g_test_add_func ("/modulemd/v2/obsoletes/modified", obsoletes_test_modified); g_test_add_func ("/modulemd/v2/obsoletes/reset", obsoletes_test_reset); g_test_add_func ("/modulemd/v2/obsoletes/eol_date", obsoletes_test_eol_date); g_test_add_func ("/modulemd/v2/obsoletes/message", obsoletes_test_message); g_test_add_func ("/modulemd/v2/obsoletes/context", obsoletes_test_context); g_test_add_func ("/modulemd/v2/obsoletes/obsoletes_by", obsoletes_test_obsoleted_by); g_test_add_func ("/modulemd/v2/obsoletes/active", obsoletes_test_is_active); g_test_add_func ("/modulemd/v2/obsoletes/yaml/parse", obsoletes_test_parse_yaml); g_test_add_func ("/modulemd/v2/obsoletes/yaml/emit", obsoletes_test_emit_yaml); g_test_add_func ("/modulemd/v2/obsoletes/yaml/quoting", obsoletes_test_quoting); return g_test_run (); } fedora-modularity-libmodulemd-357799c/modulemd/tests/test-modulemd-packager-v3.c000066400000000000000000000611101502446517500277400ustar00rootroot00000000000000/* * This file is part of libmodulemd * Copyright (C) 2020 Red Hat, Inc. * * Fedora-License-Identifier: MIT * SPDX-2.0-License-Identifier: MIT * SPDX-3.0-License-Identifier: MIT * * This program is free software. * For more information on the license, see COPYING. * For more information on free software, see . */ #include #include #include #include #include "modulemd.h" #include "private/glib-extensions.h" #include "private/modulemd-packager-v3-private.h" #include "private/modulemd-subdocument-info-private.h" #include "private/modulemd-yaml.h" #include "private/test-utils.h" static void packager_test_construct (void) { g_autoptr (ModulemdPackagerV3) packager = NULL; g_auto (GStrv) list = NULL; /* == Test that the new() function works == */ packager = modulemd_packager_v3_new (); g_assert_nonnull (packager); g_assert_true (MODULEMD_IS_PACKAGER_V3 (packager)); /* == Verify that it was constructed properly empty == */ g_assert_cmpuint (modulemd_packager_v3_get_mdversion (packager), ==, MD_PACKAGER_VERSION_THREE); g_assert_null (modulemd_packager_v3_get_module_name (packager)); g_assert_null (modulemd_packager_v3_get_stream_name (packager)); g_assert_null (modulemd_packager_v3_get_summary (packager)); g_assert_null (modulemd_packager_v3_get_description (packager)); list = modulemd_packager_v3_get_module_licenses_as_strv (packager); g_assert_nonnull (list); g_assert_null (list[0]); g_clear_pointer (&list, g_strfreev); g_assert_null (modulemd_packager_v3_get_xmd (packager)); list = modulemd_packager_v3_get_build_config_contexts_as_strv (packager); g_assert_nonnull (list); g_assert_null (list[0]); g_clear_pointer (&list, g_strfreev); g_assert_null (modulemd_packager_v3_get_community (packager)); g_assert_null (modulemd_packager_v3_get_documentation (packager)); g_assert_null (modulemd_packager_v3_get_tracker (packager)); list = modulemd_packager_v3_get_profile_names_as_strv (packager); g_assert_nonnull (list); g_assert_null (list[0]); g_clear_pointer (&list, g_strfreev); list = modulemd_packager_v3_get_rpm_api_as_strv (packager); g_assert_nonnull (list); g_assert_null (list[0]); g_clear_pointer (&list, g_strfreev); list = modulemd_packager_v3_get_rpm_filters_as_strv (packager); g_assert_nonnull (list); g_assert_null (list[0]); g_clear_pointer (&list, g_strfreev); list = modulemd_packager_v3_get_demodularized_rpms (packager); g_assert_nonnull (list); g_assert_null (list[0]); g_clear_pointer (&list, g_strfreev); list = modulemd_packager_v3_get_rpm_component_names_as_strv (packager); g_assert_nonnull (list); g_assert_null (list[0]); g_clear_pointer (&list, g_strfreev); list = modulemd_packager_v3_get_module_component_names_as_strv (packager); g_assert_nonnull (list); g_assert_null (list[0]); g_clear_pointer (&list, g_strfreev); } static ModulemdPackagerV3 * parse_yaml (yaml_parser_t *parser) { MMD_INIT_YAML_EVENT (event); g_autoptr (ModulemdPackagerV3) packager = NULL; g_autoptr (GError) error = NULL; g_autoptr (ModulemdSubdocumentInfo) subdoc = NULL; /* First parse to the subdocument */ g_assert_true (yaml_parser_parse (parser, &event)); g_assert_cmpint (YAML_STREAM_START_EVENT, ==, event.type); yaml_event_delete (&event); g_assert_true (yaml_parser_parse (parser, &event)); g_assert_cmpint (YAML_DOCUMENT_START_EVENT, ==, event.type); yaml_event_delete (&event); subdoc = modulemd_yaml_parse_document_type (parser); g_assert_nonnull (subdoc); g_assert_no_error (modulemd_subdocument_info_get_gerror (subdoc)); g_assert_cmpint (MODULEMD_YAML_DOC_PACKAGER, ==, modulemd_subdocument_info_get_doctype (subdoc)); g_assert_cmpint (MD_PACKAGER_VERSION_THREE, ==, modulemd_subdocument_info_get_mdversion (subdoc)); g_assert_nonnull (modulemd_subdocument_info_get_yaml (subdoc)); packager = modulemd_packager_v3_parse_yaml (subdoc, &error); g_assert_no_error (error); g_assert_nonnull (packager); g_assert_true (MODULEMD_IS_PACKAGER_V3 (packager)); return g_steal_pointer (&packager); } static ModulemdPackagerV3 * read_string (const gchar *yaml_string) { MMD_INIT_YAML_EVENT (event); MMD_INIT_YAML_PARSER (parser); g_autoptr (ModulemdPackagerV3) packager = NULL; g_autoptr (GError) error = NULL; yaml_parser_set_input_string ( &parser, (const unsigned char *)yaml_string, strlen (yaml_string)); packager = parse_yaml (&parser); g_assert_no_error (error); g_assert_nonnull (packager); g_assert_true (MODULEMD_IS_PACKAGER_V3 (packager)); return g_steal_pointer (&packager); } static ModulemdPackagerV3 * read_spec (void) { MMD_INIT_YAML_EVENT (event); MMD_INIT_YAML_PARSER (parser); g_autofree gchar *yaml_path = NULL; g_autoptr (ModulemdPackagerV3) packager = NULL; g_autoptr (FILE) yaml_stream = NULL; g_autoptr (GError) error = NULL; /* Verify a valid YAML file */ yaml_path = g_strdup_printf ("%s/yaml_specs/modulemd_packager_v3.yaml", g_getenv ("MESON_SOURCE_ROOT")); g_assert_nonnull (yaml_path); yaml_stream = g_fopen (yaml_path, "rbe"); g_assert_nonnull (yaml_stream); /* First parse to the subdocument */ yaml_parser_set_input_file (&parser, yaml_stream); packager = parse_yaml (&parser); g_assert_no_error (error); g_assert_nonnull (packager); g_assert_true (MODULEMD_IS_PACKAGER_V3 (packager)); return g_steal_pointer (&packager); } static void validate_spec (ModulemdPackagerV3 *packager) { g_auto (GStrv) strv = NULL; g_assert_true (MODULEMD_IS_PACKAGER_V3 (packager)); g_assert_cmpstr ("foo", ==, modulemd_packager_v3_get_module_name (packager)); g_assert_cmpstr ( "latest", ==, modulemd_packager_v3_get_stream_name (packager)); g_assert_cmpstr ( "An example module", ==, modulemd_packager_v3_get_summary (packager)); g_assert_cmpstr ( "A module for the demonstration of the metadata format. Also, the " "obligatory lorem ipsum dolor sit amet goes right here.", ==, modulemd_packager_v3_get_description (packager)); strv = modulemd_packager_v3_get_module_licenses_as_strv (packager); g_assert_nonnull (strv); g_assert_nonnull (strv[0]); g_assert_cmpstr ("MIT", ==, strv[0]); g_assert_null (strv[1]); g_clear_pointer (&strv, g_strfreev); /* Skipping XMD because those will be much easier to validate in Python */ strv = modulemd_packager_v3_get_build_config_contexts_as_strv (packager); g_assert_nonnull (strv); g_assert_nonnull (strv[0]); g_assert_cmpstr ("CTX1", ==, strv[0]); g_assert_nonnull (strv[1]); g_assert_cmpstr ("CTX2", ==, strv[1]); g_assert_null (strv[2]); g_clear_pointer (&strv, g_strfreev); g_assert_cmpstr ("http://www.example.com/", ==, modulemd_packager_v3_get_community (packager)); g_assert_cmpstr ("http://www.example.com/", ==, modulemd_packager_v3_get_documentation (packager)); g_assert_cmpstr ("http://www.example.com/", ==, modulemd_packager_v3_get_tracker (packager)); strv = modulemd_packager_v3_get_profile_names_as_strv (packager); g_assert_nonnull (strv); g_assert_nonnull (strv[0]); g_assert_cmpstr ("buildroot", ==, strv[0]); g_assert_nonnull (strv[1]); g_assert_cmpstr ("container", ==, strv[1]); g_assert_nonnull (strv[2]); g_assert_cmpstr ("minimal", ==, strv[2]); g_assert_nonnull (strv[3]); g_assert_cmpstr ("srpm-buildroot", ==, strv[3]); g_assert_null (strv[4]); g_clear_pointer (&strv, g_strfreev); strv = modulemd_packager_v3_get_rpm_api_as_strv (packager); g_assert_nonnull (strv); g_assert_nonnull (strv[0]); g_assert_cmpstr ("bar", ==, strv[0]); g_assert_nonnull (strv[1]); g_assert_cmpstr ("bar-devel", ==, strv[1]); g_assert_nonnull (strv[2]); g_assert_cmpstr ("bar-extras", ==, strv[2]); g_assert_nonnull (strv[3]); g_assert_cmpstr ("baz", ==, strv[3]); g_assert_nonnull (strv[4]); g_assert_cmpstr ("xxx", ==, strv[4]); g_assert_null (strv[5]); g_clear_pointer (&strv, g_strfreev); strv = modulemd_packager_v3_get_rpm_filters_as_strv (packager); g_assert_nonnull (strv); g_assert_nonnull (strv[0]); g_assert_cmpstr ("baz-nonfoo", ==, strv[0]); g_assert_null (strv[1]); g_clear_pointer (&strv, g_strfreev); strv = modulemd_packager_v3_get_demodularized_rpms (packager); g_assert_nonnull (strv); g_assert_nonnull (strv[0]); g_assert_cmpstr ("bar-old", ==, strv[0]); g_assert_null (strv[1]); g_clear_pointer (&strv, g_strfreev); strv = modulemd_packager_v3_get_rpm_component_names_as_strv (packager); g_assert_nonnull (strv); g_assert_nonnull (strv[0]); g_assert_cmpstr ("bar", ==, strv[0]); g_assert_nonnull (strv[1]); g_assert_cmpstr ("baz", ==, strv[1]); g_assert_nonnull (strv[2]); g_assert_cmpstr ("xxx", ==, strv[2]); g_assert_null (strv[3]); g_clear_pointer (&strv, g_strfreev); strv = modulemd_packager_v3_get_module_component_names_as_strv (packager); g_assert_nonnull (strv); g_assert_nonnull (strv[0]); g_assert_cmpstr ("includedmodule", ==, strv[0]); g_assert_null (strv[1]); g_clear_pointer (&strv, g_strfreev); } static void validate_yaml (ModulemdPackagerV3 *packager) { g_autoptr (GError) error = NULL; g_autoptr (ModulemdPackagerV3) repackaged = NULL; gboolean ret; MMD_INIT_YAML_EMITTER (emitter); MMD_INIT_YAML_STRING (&emitter, yaml_string); g_debug ("Starting dumping"); g_assert_true (mmd_emitter_start_stream (&emitter, &error)); ret = modulemd_packager_v3_emit_yaml (packager, &emitter, &error); g_assert_no_error (error); g_assert_true (ret); ret = mmd_emitter_end_stream (&emitter, &error); g_assert_no_error (error); g_assert_true (ret); g_assert_nonnull (yaml_string->str); g_assert_cmpstr ( yaml_string->str, ==, "---\n" "document: modulemd-packager\n" "version: 3\n" "data:\n" " name: foo\n" " stream: \"latest\"\n" " summary: An example module\n" " description: >-\n" " A module for the demonstration of the metadata format. Also, the " "obligatory lorem\n" " ipsum dolor sit amet goes right here.\n" " license:\n" " - MIT\n" " xmd:\n" " some_key: some_data\n" " configurations:\n" " - context: CTX1\n" " platform: f32\n" " buildrequires:\n" " appframework: [v1]\n" " requires:\n" " appframework: [v1]\n" " buildopts:\n" " rpms:\n" " macros: >\n" " %demomacro 1\n" "\n" " %demomacro2 %{demomacro}23\n" " whitelist:\n" " - fooscl-1-bar\n" " - fooscl-1-baz\n" " - xxx\n" " - xyz\n" " arches: [i686, x86_64]\n" " - context: CTX2\n" " platform: f33\n" " references:\n" " community: http://www.example.com/\n" " documentation: http://www.example.com/\n" " tracker: http://www.example.com/\n" " profiles:\n" " buildroot:\n" " rpms:\n" " - bar-devel\n" " container:\n" " rpms:\n" " - bar\n" " - bar-devel\n" " minimal:\n" " description: Minimal profile installing only the bar package.\n" " rpms:\n" " - bar\n" " default: true\n" " srpm-buildroot:\n" " rpms:\n" " - bar-extras\n" " api:\n" " rpms:\n" " - bar\n" " - bar-devel\n" " - bar-extras\n" " - baz\n" " - xxx\n" " filter:\n" " rpms:\n" " - baz-nonfoo\n" " demodularized:\n" " rpms:\n" " - bar-old\n" " components:\n" " rpms:\n" " bar:\n" " rationale: We need this to demonstrate stuff.\n" " name: bar-real\n" " repository: https://pagure.io/bar.git\n" " cache: https://example.com/cache\n" " ref: 26ca0c0\n" " baz:\n" " rationale: Demonstrate updating the buildroot contents.\n" " buildroot: true\n" " srpm-buildroot: true\n" " xxx:\n" " rationale: xxx demonstrates arches and multilib.\n" " buildorder: 10\n" " arches: [i686, x86_64]\n" " multilib: [x86_64]\n" " modules:\n" " includedmodule:\n" " rationale: Included in the stack, just because.\n" " repository: https://pagure.io/includedmodule.git\n" " ref: somecoolbranchname\n" " buildorder: 100\n" "...\n"); /* re-parse the YAML string and verify everything is still there */ repackaged = read_string (yaml_string->str); validate_spec (repackaged); } static void packager_test_parse_spec (void) { g_autoptr (ModulemdPackagerV3) packager = NULL; packager = read_spec (); validate_spec (packager); validate_yaml (packager); } static void packager_test_parse_spec_copy (void) { g_autoptr (ModulemdPackagerV3) orig = NULL; g_autoptr (ModulemdPackagerV3) packager = NULL; orig = read_spec (); packager = modulemd_packager_v3_copy (orig); validate_spec (packager); } static void packager_test_map_to_stream_v2 (void) { g_autoptr (ModulemdPackagerV3) packager = NULL; g_autoptr (ModulemdModuleStreamV2) v2_stream = NULL; g_autoptr (ModulemdModuleIndex) index = NULL; g_autoptr (GError) error = NULL; g_autofree gchar *yaml_str = NULL; g_autofree gchar *expected_path = NULL; g_autofree gchar *expected_str = NULL; packager = read_spec (); v2_stream = modulemd_packager_v3_to_stream_v2 (packager, &error); g_assert_no_error (error); g_assert_nonnull (v2_stream); g_assert_true (MODULEMD_IS_MODULE_STREAM_V2 (v2_stream)); g_clear_object (&v2_stream); index = modulemd_packager_v3_to_stream_v2_ext (packager, &error); g_assert_no_error (error); g_assert_nonnull (index); g_assert_true (MODULEMD_IS_MODULE_INDEX (index)); yaml_str = modulemd_module_index_dump_to_string (index, &error); g_assert_no_error (error); g_assert_nonnull (yaml_str); g_debug ("YAML dump of index from PackageV3 to StreamV2 mapping:\n%s", yaml_str); expected_path = g_strdup_printf ("%s/upgrades/packager_v3_to_stream_v2.yaml", g_getenv ("TEST_DATA_PATH")); g_assert_nonnull (expected_path); g_assert_true ( g_file_get_contents (expected_path, &expected_str, NULL, &error)); g_assert_no_error (error); g_assert_nonnull (expected_str); g_assert_cmpstr (expected_str, ==, yaml_str); g_clear_object (&index); g_clear_pointer (&yaml_str, g_free); g_clear_pointer (&expected_path, g_free); g_clear_pointer (&expected_str, g_free); } /* * Converting modulemd-packager-v3 with module a name and a stream and * a default profile should succeed. */ static void packager_test_convert_to_index_with_name_stream_default_profile (void) { g_autoptr (ModulemdPackagerV3) packager = NULL; g_autoptr (ModulemdModuleIndex) index = NULL; g_autoptr (GError) error = NULL; g_autofree gchar *yaml_str = NULL; g_autofree gchar *expected_path = NULL; g_autofree gchar *expected_str = NULL; packager = read_spec (); index = modulemd_packager_v3_convert_to_index (packager, &error); g_assert_no_error (error); g_assert_nonnull (index); g_assert_true (MODULEMD_IS_MODULE_INDEX (index)); yaml_str = modulemd_module_index_dump_to_string (index, &error); g_assert_no_error (error); g_assert_nonnull (yaml_str); g_debug ("YAML dump of index from PackageV3 to Index mapping:\n%s", yaml_str); expected_path = g_strdup_printf ("%s/upgrades/packager_v3_to_index.yaml", g_getenv ("TEST_DATA_PATH")); g_assert_nonnull (expected_path); g_assert_true ( g_file_get_contents (expected_path, &expected_str, NULL, &error)); g_assert_no_error (error); g_assert_nonnull (expected_str); g_assert_cmpstr (expected_str, ==, yaml_str); g_clear_object (&index); g_clear_pointer (&yaml_str, g_free); g_clear_pointer (&expected_path, g_free); g_clear_pointer (&expected_str, g_free); } /* * Converting modulemd-packager-v3 without a module name but with a default * profile should fail. Because modulemd-default-v1 needs a name and a stream. */ static void packager_test_convert_to_index_without_name_with_default_profile (void) { g_autoptr (ModulemdPackagerV3) packager = NULL; g_autoptr (ModulemdModuleIndex) index = NULL; g_autoptr (ModulemdBuildConfig) config = NULL; g_autoptr (ModulemdProfile) profile = NULL; g_autoptr (GError) error = NULL; packager = modulemd_packager_v3_new (); g_assert_nonnull (packager); g_assert_true (MODULEMD_IS_PACKAGER_V3 (packager)); /* Keep module name unset */ modulemd_packager_v3_set_stream_name (packager, "Stream"); modulemd_packager_v3_set_summary (packager, "Summary"); modulemd_packager_v3_set_description (packager, "Description"); config = modulemd_build_config_new (); g_assert_nonnull (config); modulemd_build_config_set_context (config, "Context"); modulemd_build_config_set_platform (config, "Platform"); modulemd_packager_v3_add_build_config (packager, config); profile = modulemd_profile_new ("Profile"); g_assert_nonnull (profile); modulemd_profile_set_default (profile); /* This triggers the failure. */ modulemd_packager_v3_add_profile (packager, profile); index = modulemd_packager_v3_convert_to_index (packager, &error); g_assert_error (error, MODULEMD_ERROR, MMD_ERROR_MISSING_REQUIRED); g_assert_null (index); } /* * Converting modulemd-packager-v3 without a stream name but with a default * profile should fail. Because modulemd-default-v1 needs a name and a stream. */ static void packager_test_convert_to_index_without_stream_with_default_profile (void) { g_autoptr (ModulemdPackagerV3) packager = NULL; g_autoptr (ModulemdModuleIndex) index = NULL; g_autoptr (ModulemdBuildConfig) config = NULL; g_autoptr (ModulemdProfile) profile = NULL; g_autoptr (GError) error = NULL; packager = modulemd_packager_v3_new (); g_assert_nonnull (packager); g_assert_true (MODULEMD_IS_PACKAGER_V3 (packager)); modulemd_packager_v3_set_module_name (packager, "Module"); /* Keep stream name unset */ modulemd_packager_v3_set_summary (packager, "Summary"); modulemd_packager_v3_set_description (packager, "Description"); config = modulemd_build_config_new (); g_assert_nonnull (config); modulemd_build_config_set_context (config, "Context"); modulemd_build_config_set_platform (config, "Platform"); modulemd_packager_v3_add_build_config (packager, config); profile = modulemd_profile_new ("Profile"); g_assert_nonnull (profile); modulemd_profile_set_default (profile); /* This triggers the failure. */ modulemd_packager_v3_add_profile (packager, profile); index = modulemd_packager_v3_convert_to_index (packager, &error); g_assert_error (error, MODULEMD_ERROR, MMD_ERROR_MISSING_REQUIRED); g_assert_null (index); } static void packager_test_map_to_stream_v2_autoname (void) { g_autoptr (ModulemdPackagerV3) packager = NULL; g_autoptr (ModulemdModuleStreamV2) v2_stream = NULL; g_autoptr (ModulemdModuleIndex) index = NULL; g_autoptr (GError) error = NULL; g_autofree gchar *yaml_str = NULL; g_auto (GStrv) list = NULL; MMD_INIT_YAML_EMITTER (emitter); MMD_INIT_YAML_STRING (&emitter, yaml_string); /* Construct a minimal PackagerV3 with no module/stream name */ packager = modulemd_packager_v3_new (); g_assert_nonnull (packager); g_assert_true (MODULEMD_IS_PACKAGER_V3 (packager)); modulemd_packager_v3_set_summary (packager, "Summary"); modulemd_packager_v3_set_description (packager, "Description"); /* PackagerV3 to StreamV2 conversion should succeed and validate, even without * a module/stream name */ v2_stream = modulemd_packager_v3_to_stream_v2 (packager, &error); g_assert_no_error (error); g_assert_nonnull (v2_stream); g_assert_true (MODULEMD_IS_MODULE_STREAM_V2 (v2_stream)); /* confirm everything comes back that we expect */ g_assert_null (modulemd_module_stream_get_module_name ( MODULEMD_MODULE_STREAM (v2_stream))); g_assert_null (modulemd_module_stream_get_stream_name ( MODULEMD_MODULE_STREAM (v2_stream))); g_assert_cmpstr ( "Summary", ==, modulemd_module_stream_v2_get_summary (v2_stream, "C")); g_assert_cmpstr ("Description", ==, modulemd_module_stream_v2_get_description (v2_stream, "C")); /* the default module license is required for StreamV2 and should have been filled in */ list = modulemd_module_stream_v2_get_module_licenses_as_strv (v2_stream); g_assert_nonnull (list); g_assert_nonnull (list[0]); g_assert_cmpstr ("MIT", ==, list[0]); g_assert_null (list[1]); g_clear_pointer (&list, g_strfreev); /* PackagerV3 to Index conversion should automatically generate a module and * stream name so it can be added to an index */ index = modulemd_packager_v3_to_stream_v2_ext (packager, &error); g_assert_no_error (error); g_assert_nonnull (index); g_assert_true (MODULEMD_IS_MODULE_INDEX (index)); /* however, the automatic module/stream names should not appear in an index dump */ yaml_str = modulemd_module_index_dump_to_string (index, &error); g_assert_no_error (error); g_assert_nonnull (yaml_str); g_assert_cmpstr (yaml_str, ==, "---\n" "document: modulemd\n" "version: 2\n" "data:\n" " summary: Summary\n" " description: >-\n" " Description\n" " license:\n" " module:\n" " - MIT\n" "...\n"); g_clear_pointer (&yaml_str, g_free); g_clear_object (&v2_stream); g_clear_object (&packager); g_clear_object (&index); } static void packager_test_read_to_index (void) { gboolean ret; g_autoptr (ModulemdModuleIndex) index = NULL; g_autoptr (GError) error = NULL; g_autoptr (GPtrArray) failures = NULL; g_autofree gchar *yaml_path = NULL; g_auto (GStrv) module_names = NULL; /* create an index */ index = modulemd_module_index_new (); /* The modulemd-packager v3 definition * Reading a packager v3 document into an index can only be done by calling * modulemd_read_packager_file() and then calling * modulemd_packager_v3_convert_to_index(), or internally by calling * modulemd_packager_v3_to_stream_v2_ext(). Attempting to read it directly * using modulemd_module_index_update_from_file() should trigger a warning * and ignore the document. */ yaml_path = g_strdup_printf ("%s/yaml_specs/modulemd_packager_v3.yaml", g_getenv ("MESON_SOURCE_ROOT")); ret = modulemd_module_index_update_from_file ( index, yaml_path, TRUE, &failures, &error); g_assert_no_error (error); modulemd_subdocument_info_debug_dump_failures (failures); g_assert_cmpint (failures->len, ==, 1); g_assert_false (ret); g_assert_error ( modulemd_subdocument_info_get_gerror (g_ptr_array_index (failures, 0)), MODULEMD_YAML_ERROR, MMD_YAML_ERROR_PARSE); g_clear_pointer (&yaml_path, g_free); g_clear_pointer (&failures, g_ptr_array_unref); /* the index must still be empty */ module_names = modulemd_module_index_get_module_names_as_strv (index); g_assert_cmpint (g_strv_length (module_names), ==, 0); g_clear_pointer (&module_names, g_strfreev); g_clear_object (&index); } int main (int argc, char *argv[]) { setlocale (LC_ALL, ""); g_test_init (&argc, &argv, NULL); g_test_bug_base ("https://bugzilla.redhat.com/show_bug.cgi?id="); g_test_add_func ("/modulemd/v2/packager/construct", packager_test_construct); g_test_add_func ("/modulemd/v2/packager/yaml/spec", packager_test_parse_spec); g_test_add_func ("/modulemd/v2/packager/yaml/spec/copy", packager_test_parse_spec_copy); g_test_add_func ("/modulemd/v2/packager/to_stream_v2", packager_test_map_to_stream_v2); g_test_add_func ("/modulemd/v2/packager/to_stream_v2/autoname", packager_test_map_to_stream_v2_autoname); g_test_add_func ("/modulemd/v2/packager/index/read", packager_test_read_to_index); g_test_add_func ( "/modulemd/v2/packager/to_index_with_name_stream_default_profile", packager_test_convert_to_index_with_name_stream_default_profile); g_test_add_func ( "/modulemd/v2/packager/to_index_without_name_with_default_profile", packager_test_convert_to_index_without_name_with_default_profile); g_test_add_func ( "/modulemd/v2/packager/to_index_without_stream_with_default_profile", packager_test_convert_to_index_without_stream_with_default_profile); return g_test_run (); } fedora-modularity-libmodulemd-357799c/modulemd/tests/test-modulemd-parse_int64.c000066400000000000000000000101141502446517500277710ustar00rootroot00000000000000/* * This file is part of libmodulemd * Copyright (C) 2021 Red Hat, Inc. * * Fedora-License-Identifier: MIT * SPDX-2.0-License-Identifier: MIT * SPDX-3.0-License-Identifier: MIT * * This program is free software. * For more information on the license, see COPYING. * For more information on free software, see . */ #include "config.h" #include #include #include #include "private/modulemd-yaml.h" #include "private/test-utils.h" #include static void test (const char *input, gint64 expected_value, gboolean expected_error) { gint64 parsed; g_autoptr (GError) error = NULL; MMD_INIT_YAML_EVENT (event); MMD_INIT_YAML_PARSER (parser); yaml_parser_set_input_string ( &parser, (const unsigned char *)input, strlen (input)); parser_skip_document_start (&parser); parsed = modulemd_yaml_parse_int64 (&parser, &error); if (expected_error) g_assert_nonnull (error); else g_assert_null (error); g_assert_cmpint (parsed, ==, expected_value); } static void test_int64_valid (void) { test ("42", 42, FALSE); } static void test_int64_invalid_no_digit (void) { test ("foo", 0, TRUE); } static void test_int64_invalid_incomplete (void) { test ("42foo", 0, TRUE); } static void test_int64_valid_negative (void) { test ("-42", -42, FALSE); } static void test_int64_invalid_too_big (void) { test ("9223372036854775808", 0, TRUE); } static void test_int64_invalid_overflowed (void) { #ifdef HAVE_OVERFLOWED_BUILDORDER test ("18446744073709551615", -1, FALSE); #else test ("18446744073709551615", 0, TRUE); #endif } static void test_int64_invalid_too_small (void) { test ("-9223372036854775809", 0, TRUE); } static void utest (const char *input, guint64 expected_value, gboolean expected_error) { guint64 parsed; g_autoptr (GError) error = NULL; MMD_INIT_YAML_EVENT (event); MMD_INIT_YAML_PARSER (parser); yaml_parser_set_input_string ( &parser, (const unsigned char *)input, strlen (input)); parser_skip_document_start (&parser); parsed = modulemd_yaml_parse_uint64 (&parser, &error); if (expected_error) g_assert_nonnull (error); else g_assert_null (error); g_assert_cmpuint (parsed, ==, expected_value); } static void test_uint64_valid (void) { utest ("42", 42u, FALSE); } static void test_uint64_invalid_no_digit (void) { utest ("foo", 0u, TRUE); } static void test_uint64_invalid_incomplete (void) { utest ("42foo", 0u, TRUE); } static void test_uint64_invalid_negative (void) { utest ("-42", 0u, TRUE); } static void test_uint64_invalid_too_big (void) { utest ("18446744073709551616", 0u, TRUE); } int main (int argc, char *argv[]) { setlocale (LC_ALL, ""); g_test_init (&argc, &argv, NULL); g_test_add_func ("/modulemd/v2/int64/yaml/parse/valid", test_int64_valid); g_test_add_func ("/modulemd/v2/int64/yaml/parse/invalid_no_digit", test_int64_invalid_no_digit); g_test_add_func ("/modulemd/v2/int64/yaml/parse/invalid_incomplete", test_int64_invalid_incomplete); g_test_add_func ("/modulemd/v2/int64/yaml/parse/valid_negative", test_int64_valid_negative); g_test_add_func ("/modulemd/v2/int64/yaml/parse/invalid_too_big", test_int64_invalid_too_big); g_test_add_func ("/modulemd/v2/int64/yaml/parse/invalid_too_small", test_int64_invalid_too_small); g_test_add_func ("/modulemd/v2/int64/yaml/parse/invalid_overflowed", test_int64_invalid_overflowed); g_test_add_func ("/modulemd/v2/uint64/yaml/parse/valid", test_uint64_valid); g_test_add_func ("/modulemd/v2/uint64/yaml/parse/invalid_no_digit", test_uint64_invalid_no_digit); g_test_add_func ("/modulemd/v2/uint64/yaml/parse/invalid_incomplete", test_uint64_invalid_incomplete); g_test_add_func ("/modulemd/v2/uint64/yaml/parse/invalid_negative", test_uint64_invalid_negative); g_test_add_func ("/modulemd/v2/uint64/yaml/parse/invalid_too_big", test_uint64_invalid_too_big); return g_test_run (); } fedora-modularity-libmodulemd-357799c/modulemd/tests/test-modulemd-profile.c000066400000000000000000000460571502446517500273120ustar00rootroot00000000000000/* * This file is part of libmodulemd * Copyright (C) 2018 Red Hat, Inc. * * Fedora-License-Identifier: MIT * SPDX-2.0-License-Identifier: MIT * SPDX-3.0-License-Identifier: MIT * * This program is free software. * For more information on the license, see COPYING. * For more information on free software, see . */ #include #include #include #include #include "modulemd-profile.h" #include "private/glib-extensions.h" #include "private/modulemd-profile-private.h" #include "private/modulemd-yaml.h" #include "private/test-utils.h" typedef struct _ProfileFixture { } ProfileFixture; gboolean signaled = FALSE; static void sigtrap_handler (int UNUSED (sig_num)) { signaled = TRUE; } static void profile_test_construct (void) { g_autoptr (ModulemdProfile) p = NULL; g_auto (GStrv) rpms = NULL; /* Test that the new() function works */ p = modulemd_profile_new ("testprofile"); g_assert_nonnull (p); g_assert_true (MODULEMD_IS_PROFILE (p)); g_assert_cmpstr (modulemd_profile_get_name (p), ==, "testprofile"); g_assert_null (modulemd_profile_get_description (p, "C")); rpms = modulemd_profile_get_rpms_as_strv (p); g_assert_nonnull (rpms); g_assert_cmpint (g_strv_length (rpms), ==, 0); g_clear_object (&p); /* Test that object instantiation works with a name */ p = g_object_new (MODULEMD_TYPE_PROFILE, "name", "testprofile", NULL); g_assert_true (MODULEMD_IS_PROFILE (p)); g_assert_cmpstr (modulemd_profile_get_name (p), ==, "testprofile"); g_clear_object (&p); /* Test that we abort with a NULL name to new() */ signaled = FALSE; signal (SIGTRAP, sigtrap_handler); p = modulemd_profile_new (NULL); g_assert_true (signaled); g_clear_object (&p); /* Test that we abort if we instantiate without a name */ signaled = FALSE; signal (SIGTRAP, sigtrap_handler); p = g_object_new (MODULEMD_TYPE_PROFILE, NULL); g_assert_true (signaled); g_clear_object (&p); /* test that we abort if we instantiate with a NULL name */ signaled = FALSE; signal (SIGTRAP, sigtrap_handler); p = g_object_new (MODULEMD_TYPE_PROFILE, "name", NULL, NULL); g_assert_true (signaled); g_clear_object (&p); } static void profile_test_equals (void) { g_autoptr (ModulemdProfile) p_1 = NULL; g_autoptr (ModulemdProfile) p_2 = NULL; /*Test 2 objects with same name*/ p_1 = modulemd_profile_new ("testprofile"); g_assert_nonnull (p_1); g_assert_true (MODULEMD_IS_PROFILE (p_1)); p_2 = modulemd_profile_new ("testprofile"); g_assert_nonnull (p_2); g_assert_true (MODULEMD_IS_PROFILE (p_2)); g_assert_true (modulemd_profile_equals (p_1, p_2)); g_clear_object (&p_1); g_clear_object (&p_2); /*Test 2 objects with different name*/ p_1 = modulemd_profile_new ("testing"); g_assert_nonnull (p_1); g_assert_true (MODULEMD_IS_PROFILE (p_1)); p_2 = modulemd_profile_new ("testprofile"); g_assert_nonnull (p_2); g_assert_true (MODULEMD_IS_PROFILE (p_2)); g_assert_false (modulemd_profile_equals (p_1, p_2)); g_clear_object (&p_1); g_clear_object (&p_2); /* Test 2 profile objects with same name and description */ p_1 = modulemd_profile_new ("testprofile"); modulemd_profile_set_description (p_1, "a test"); g_assert_nonnull (p_1); g_assert_true (MODULEMD_IS_PROFILE (p_1)); p_2 = modulemd_profile_new ("testprofile"); modulemd_profile_set_description (p_2, "a test"); g_assert_nonnull (p_2); g_assert_true (MODULEMD_IS_PROFILE (p_2)); g_assert_true (modulemd_profile_equals (p_1, p_2)); g_clear_object (&p_1); g_clear_object (&p_2); /* Test 2 profile objects with same name and different description */ p_1 = modulemd_profile_new ("testprofile"); modulemd_profile_set_description (p_1, "a test"); g_assert_nonnull (p_1); g_assert_true (MODULEMD_IS_PROFILE (p_1)); p_2 = modulemd_profile_new ("testprofile"); modulemd_profile_set_description (p_2, "b test"); g_assert_nonnull (p_2); g_assert_true (MODULEMD_IS_PROFILE (p_2)); g_assert_false (modulemd_profile_equals (p_1, p_2)); g_clear_object (&p_1); g_clear_object (&p_2); /* Test 2 profile objects with same name, description, and rpms */ p_1 = modulemd_profile_new ("testprofile"); modulemd_profile_set_description (p_1, "a test"); modulemd_profile_add_rpm (p_1, "testrpm"); g_assert_nonnull (p_1); g_assert_true (MODULEMD_IS_PROFILE (p_1)); p_2 = modulemd_profile_new ("testprofile"); modulemd_profile_set_description (p_2, "a test"); modulemd_profile_add_rpm (p_2, "testrpm"); g_assert_nonnull (p_2); g_assert_true (MODULEMD_IS_PROFILE (p_2)); g_assert_true (modulemd_profile_equals (p_1, p_2)); g_clear_object (&p_1); g_clear_object (&p_2); /* Test 2 profile objects with same name, description, and different rpms */ p_1 = modulemd_profile_new ("testprofile"); modulemd_profile_set_description (p_1, "a test"); modulemd_profile_add_rpm (p_1, "testrpm"); g_assert_nonnull (p_1); g_assert_true (MODULEMD_IS_PROFILE (p_1)); p_2 = modulemd_profile_new ("testprofile"); modulemd_profile_set_description (p_2, "a test"); modulemd_profile_add_rpm (p_2, "testingrpm"); g_assert_nonnull (p_2); g_assert_true (MODULEMD_IS_PROFILE (p_2)); g_assert_false (modulemd_profile_equals (p_1, p_2)); g_clear_object (&p_1); g_clear_object (&p_2); /*Compare two RPM sets where the first sorted value matches and the second does not.*/ p_1 = modulemd_profile_new ("testprofile"); modulemd_profile_set_description (p_1, "a test"); modulemd_profile_add_rpm (p_1, "a"); modulemd_profile_add_rpm (p_1, "b"); g_assert_nonnull (p_1); g_assert_true (MODULEMD_IS_PROFILE (p_1)); p_2 = modulemd_profile_new ("testprofile"); modulemd_profile_set_description (p_2, "a test"); modulemd_profile_add_rpm (p_1, "a"); modulemd_profile_add_rpm (p_1, "c"); g_assert_nonnull (p_2); g_assert_true (MODULEMD_IS_PROFILE (p_2)); g_assert_false (modulemd_profile_equals (p_1, p_2)); g_clear_object (&p_1); g_clear_object (&p_2); /*Compare two RPM sets where the first sorted value matches, but one has more entries than the other.*/ p_1 = modulemd_profile_new ("testprofile"); modulemd_profile_set_description (p_1, "a test"); modulemd_profile_add_rpm (p_1, "a"); modulemd_profile_add_rpm (p_1, "b"); g_assert_nonnull (p_1); g_assert_true (MODULEMD_IS_PROFILE (p_1)); p_2 = modulemd_profile_new ("testprofile"); modulemd_profile_set_description (p_2, "a test"); modulemd_profile_add_rpm (p_1, "a"); modulemd_profile_add_rpm (p_1, "b"); modulemd_profile_add_rpm (p_1, "c"); g_assert_nonnull (p_2); g_assert_true (MODULEMD_IS_PROFILE (p_2)); g_assert_false (modulemd_profile_equals (p_1, p_2)); g_clear_object (&p_1); g_clear_object (&p_2); } static void profile_test_copy (void) { g_autoptr (ModulemdProfile) p = NULL; g_autoptr (ModulemdProfile) p_copy = NULL; g_auto (GStrv) rpms = NULL; p = modulemd_profile_new ("testprofile"); g_assert_nonnull (p); g_assert_true (MODULEMD_IS_PROFILE (p)); g_assert_cmpstr (modulemd_profile_get_name (p), ==, "testprofile"); g_assert_null (modulemd_profile_get_description (p, "C")); rpms = modulemd_profile_get_rpms_as_strv (p); g_assert_nonnull (rpms); g_assert_cmpint (g_strv_length (rpms), ==, 0); g_clear_pointer (&rpms, g_strfreev); p_copy = modulemd_profile_copy (p); g_assert_nonnull (p_copy); g_assert_true (MODULEMD_IS_PROFILE (p_copy)); g_assert_cmpstr (modulemd_profile_get_name (p_copy), ==, "testprofile"); g_assert_null (modulemd_profile_get_description (p_copy, "C")); rpms = modulemd_profile_get_rpms_as_strv (p_copy); g_assert_nonnull (rpms); g_assert_cmpint (g_strv_length (rpms), ==, 0); g_clear_pointer (&rpms, g_strfreev); g_clear_object (&p); g_clear_object (&p_copy); /* Test copying profile with a description */ p = modulemd_profile_new ("testprofile"); modulemd_profile_set_description (p, "a test"); g_assert_nonnull (p); g_assert_true (MODULEMD_IS_PROFILE (p)); g_assert_cmpstr (modulemd_profile_get_name (p), ==, "testprofile"); g_assert_cmpstr (modulemd_profile_get_description (p, "C"), ==, "a test"); rpms = modulemd_profile_get_rpms_as_strv (p); g_assert_nonnull (rpms); g_assert_cmpint (g_strv_length (rpms), ==, 0); g_clear_pointer (&rpms, g_strfreev); p_copy = modulemd_profile_copy (p); g_assert_nonnull (p_copy); g_assert_true (MODULEMD_IS_PROFILE (p_copy)); g_assert_cmpstr (modulemd_profile_get_name (p_copy), ==, "testprofile"); g_assert_cmpstr ( modulemd_profile_get_description (p_copy, "C"), ==, "a test"); rpms = modulemd_profile_get_rpms_as_strv (p_copy); g_assert_nonnull (rpms); g_assert_cmpint (g_strv_length (rpms), ==, 0); g_clear_pointer (&rpms, g_strfreev); g_clear_object (&p); g_clear_object (&p_copy); /* Test copying profile with rpms */ p = modulemd_profile_new ("testprofile"); modulemd_profile_add_rpm (p, "testrpm"); g_assert_nonnull (p); g_assert_true (MODULEMD_IS_PROFILE (p)); g_assert_cmpstr (modulemd_profile_get_name (p), ==, "testprofile"); g_assert_null (modulemd_profile_get_description (p, "C")); rpms = modulemd_profile_get_rpms_as_strv (p); g_assert_nonnull (rpms); g_assert_cmpint (g_strv_length (rpms), ==, 1); g_assert_cmpstr (rpms[0], ==, "testrpm"); g_clear_pointer (&rpms, g_strfreev); p_copy = modulemd_profile_copy (p); g_assert_nonnull (p_copy); g_assert_true (MODULEMD_IS_PROFILE (p_copy)); g_assert_cmpstr (modulemd_profile_get_name (p_copy), ==, "testprofile"); g_assert_null (modulemd_profile_get_description (p_copy, "C")); rpms = modulemd_profile_get_rpms_as_strv (p_copy); g_assert_nonnull (rpms); g_assert_cmpint (g_strv_length (rpms), ==, 1); g_assert_cmpstr (rpms[0], ==, "testrpm"); g_clear_pointer (&rpms, g_strfreev); g_clear_object (&p); g_clear_object (&p_copy); /* Test copying profile with default set */ p = modulemd_profile_new ("testprofile"); modulemd_profile_set_default (p); g_assert_nonnull (p); g_assert_true (MODULEMD_IS_PROFILE (p)); g_assert_cmpstr (modulemd_profile_get_name (p), ==, "testprofile"); g_assert_true (modulemd_profile_is_default (p)); p_copy = modulemd_profile_copy (p); g_assert_nonnull (p_copy); g_assert_true (MODULEMD_IS_PROFILE (p_copy)); g_assert_cmpstr (modulemd_profile_get_name (p_copy), ==, "testprofile"); g_assert_true (modulemd_profile_is_default (p_copy)); g_clear_object (&p); g_clear_object (&p_copy); /* Test copying profile with default unset */ p = modulemd_profile_new ("testprofile"); modulemd_profile_unset_default (p); g_assert_nonnull (p); g_assert_true (MODULEMD_IS_PROFILE (p)); g_assert_cmpstr (modulemd_profile_get_name (p), ==, "testprofile"); g_assert_false (modulemd_profile_is_default (p)); p_copy = modulemd_profile_copy (p); g_assert_nonnull (p_copy); g_assert_true (MODULEMD_IS_PROFILE (p_copy)); g_assert_cmpstr (modulemd_profile_get_name (p_copy), ==, "testprofile"); g_assert_false (modulemd_profile_is_default (p_copy)); g_clear_object (&p); g_clear_object (&p_copy); } static void profile_test_get_name (void) { g_autoptr (ModulemdProfile) p = NULL; g_autofree gchar *name; p = modulemd_profile_new ("testprofile"); g_assert_nonnull (p); g_assert_true (MODULEMD_IS_PROFILE (p)); g_assert_cmpstr (modulemd_profile_get_name (p), ==, "testprofile"); g_object_get (p, "name", &name, NULL); g_assert_cmpstr (name, ==, "testprofile"); /* Test that name is immutable */ signaled = FALSE; signal (SIGTRAP, sigtrap_handler); g_object_set (p, "name", "notatest", NULL); g_assert_true (signaled); } static void profile_test_get_set_description (void) { g_autoptr (ModulemdProfile) p = NULL; p = modulemd_profile_new ("testprofile"); g_assert_nonnull (p); g_assert_true (MODULEMD_IS_PROFILE (p)); g_assert_null (modulemd_profile_get_description (p, "C")); /* Set a description */ modulemd_profile_set_description (p, "Some description"); g_assert_cmpstr ( modulemd_profile_get_description (p, "C"), ==, "Some description"); /* Clear the description */ modulemd_profile_set_description (p, NULL); g_assert_null (modulemd_profile_get_description (p, "C")); } static void profile_test_default (void) { g_autoptr (ModulemdProfile) p = NULL; p = modulemd_profile_new ("testprofile"); g_assert_nonnull (p); g_assert_true (MODULEMD_IS_PROFILE (p)); g_assert_false (modulemd_profile_is_default (p)); modulemd_profile_set_default (p); g_assert_true (modulemd_profile_is_default (p)); modulemd_profile_unset_default (p); g_assert_false (modulemd_profile_is_default (p)); } static void profile_test_rpms (void) { g_autoptr (ModulemdProfile) p = NULL; g_auto (GStrv) rpms = NULL; p = modulemd_profile_new ("testprofile"); g_assert_nonnull (p); g_assert_true (MODULEMD_IS_PROFILE (p)); /* Assert we start with 0 rpms */ rpms = modulemd_profile_get_rpms_as_strv (p); g_assert_cmpint (g_strv_length (rpms), ==, 0); g_clear_pointer (&rpms, g_strfreev); /* Add some rpms */ modulemd_profile_add_rpm (p, "test2"); modulemd_profile_add_rpm (p, "test3"); modulemd_profile_add_rpm (p, "test1"); rpms = modulemd_profile_get_rpms_as_strv (p); g_assert_cmpint (g_strv_length (rpms), ==, 3); // They should be sorted g_assert_cmpstr (rpms[0], ==, "test1"); g_assert_cmpstr (rpms[1], ==, "test2"); g_assert_cmpstr (rpms[2], ==, "test3"); g_clear_pointer (&rpms, g_strfreev); /* Remove some rpms */ modulemd_profile_remove_rpm (p, "test2"); rpms = modulemd_profile_get_rpms_as_strv (p); g_assert_cmpint (g_strv_length (rpms), ==, 2); // They should be sorted g_assert_cmpstr (rpms[0], ==, "test1"); g_assert_cmpstr (rpms[1], ==, "test3"); g_clear_pointer (&rpms, g_strfreev); } static void profile_test_parse_yaml (void) { g_autoptr (ModulemdProfile) p = NULL; g_autoptr (GError) error = NULL; MMD_INIT_YAML_PARSER (parser); g_autofree gchar *yaml_path = NULL; g_auto (GStrv) rpms = NULL; g_autoptr (FILE) yaml_stream = NULL; g_autofree gchar *name = NULL; yaml_path = g_strdup_printf ("%s/p.yaml", g_getenv ("TEST_DATA_PATH")); g_assert_nonnull (yaml_path); yaml_stream = g_fopen (yaml_path, "rbe"); g_assert_nonnull (yaml_stream); yaml_parser_set_input_file (&parser, yaml_stream); parser_skip_headers (&parser); /* Parse the name */ name = modulemd_yaml_parse_string (&parser, &error); g_assert_nonnull (name); g_assert_cmpstr (name, ==, "default"); p = modulemd_profile_parse_yaml (&parser, name, TRUE, &error); g_assert_nonnull (p); g_assert_true (MODULEMD_IS_PROFILE (p)); g_assert_cmpstr (modulemd_profile_get_name (p), ==, "default"); g_assert_cmpstr (modulemd_profile_get_description (p, NULL), ==, "An example profile for tests"); rpms = modulemd_profile_get_rpms_as_strv (p); g_assert_cmpint (g_strv_length (rpms), ==, 3); g_assert_cmpstr (rpms[0], ==, "bar"); g_assert_cmpstr (rpms[1], ==, "bar-extras"); g_assert_cmpstr (rpms[2], ==, "baz"); } static void profile_test_emit_yaml (void) { g_autoptr (ModulemdProfile) p = NULL; g_autoptr (GError) error = NULL; MMD_INIT_YAML_EMITTER (emitter); MMD_INIT_YAML_STRING (&emitter, yaml_string); p = modulemd_profile_new ("testprofile"); g_assert_true (mmd_emitter_start_stream (&emitter, &error)); g_assert_true (mmd_emitter_start_document (&emitter, &error)); g_assert_true ( mmd_emitter_start_mapping (&emitter, YAML_BLOCK_MAPPING_STYLE, &error)); g_assert_true (modulemd_profile_emit_yaml (p, &emitter, &error)); g_assert_true (mmd_emitter_end_mapping (&emitter, &error)); g_assert_true (mmd_emitter_end_document (&emitter, &error)); g_assert_true (mmd_emitter_end_stream (&emitter, &error)); g_assert_cmpstr (yaml_string->str, ==, "---\ntestprofile: {}\n...\n"); g_clear_pointer (&yaml_string, modulemd_yaml_string_free); yaml_emitter_delete (&emitter); yaml_emitter_initialize (&emitter); yaml_string = g_malloc0_n (1, sizeof (modulemd_yaml_string)); yaml_emitter_set_output (&emitter, write_yaml_string, (void *)yaml_string); modulemd_profile_set_description (p, "A test profile"); modulemd_profile_add_rpm (p, "test2"); modulemd_profile_add_rpm (p, "test3"); modulemd_profile_add_rpm (p, "test1"); modulemd_profile_set_default (p); g_assert_true (mmd_emitter_start_stream (&emitter, &error)); g_assert_true (mmd_emitter_start_document (&emitter, &error)); g_assert_true ( mmd_emitter_start_mapping (&emitter, YAML_BLOCK_MAPPING_STYLE, &error)); g_assert_true (modulemd_profile_emit_yaml (p, &emitter, &error)); g_assert_true (mmd_emitter_end_mapping (&emitter, &error)); g_assert_true (mmd_emitter_end_document (&emitter, &error)); g_assert_true (mmd_emitter_end_stream (&emitter, &error)); g_assert_cmpstr (yaml_string->str, ==, "---\n" "testprofile:\n" " description: A test profile\n" " rpms:\n" " - test1\n" " - test2\n" " - test3\n" " default: true\n" "...\n"); } static void profile_test_quoting_yaml (void) { g_autoptr (ModulemdProfile) p = NULL; g_autoptr (GError) error = NULL; MMD_INIT_YAML_EMITTER (emitter); MMD_INIT_YAML_STRING (&emitter, yaml_string); p = modulemd_profile_new ("0"); modulemd_profile_set_description (p, "1"); modulemd_profile_add_rpm (p, "2"); modulemd_profile_set_default (p); g_assert_true (mmd_emitter_start_stream (&emitter, &error)); g_assert_true (mmd_emitter_start_document (&emitter, &error)); g_assert_true ( mmd_emitter_start_mapping (&emitter, YAML_BLOCK_MAPPING_STYLE, &error)); g_assert_true (modulemd_profile_emit_yaml (p, &emitter, &error)); g_assert_true (mmd_emitter_end_mapping (&emitter, &error)); g_assert_true (mmd_emitter_end_document (&emitter, &error)); g_assert_true (mmd_emitter_end_stream (&emitter, &error)); g_assert_cmpstr (yaml_string->str, ==, "---\n" "\"0\":\n" " description: \"1\"\n" " rpms:\n" " - \"2\"\n" " default: true\n" "...\n"); } int main (int argc, char *argv[]) { setlocale (LC_ALL, ""); g_test_init (&argc, &argv, NULL); g_test_bug_base ("https://bugzilla.redhat.com/show_bug.cgi?id="); // Define the tests. g_test_add_func ("/modulemd/v2/profile/construct", profile_test_construct); g_test_add_func ("/modulemd/v2/profile/equals", profile_test_equals); g_test_add_func ("/modulemd/v2/profile/copy", profile_test_copy); g_test_add_func ("/modulemd/v2/profile/get_name", profile_test_get_name); g_test_add_func ("/modulemd/v2/profile/get_set_description", profile_test_get_set_description); g_test_add_func ("/modulemd/v2/profile/default", profile_test_default); g_test_add_func ("/modulemd/v2/profile/rpms", profile_test_rpms); g_test_add_func ("/modulemd/v2/profile/yaml/parse", profile_test_parse_yaml); g_test_add_func ("/modulemd/v2/profile/yaml/emit", profile_test_emit_yaml); g_test_add_func ("/modulemd/v2/profile/yaml/quoting", profile_test_quoting_yaml); return g_test_run (); } fedora-modularity-libmodulemd-357799c/modulemd/tests/test-modulemd-quoting.c000066400000000000000000000101601502446517500273220ustar00rootroot00000000000000/* * This file is part of libmodulemd * Copyright (C) 2023 Red Hat, Inc. * * Fedora-License-Identifier: MIT * SPDX-2.0-License-Identifier: MIT * SPDX-3.0-License-Identifier: MIT * * This program is free software. * For more information on the license, see COPYING. * For more information on free software, see . */ #include #include #include "modulemd-profile.h" #include "private/modulemd-yaml.h" #include "private/modulemd-profile-private.h" /*#include #include "private/glib-extensions.h" #include "private/test-utils.h"*/ struct item { const char *input; int quoted; /* true for quoting expected, otherwise unquoted expected */ }; /* * Test that strings only consisting of a number are quoted to prevent * consumers from interpretting them as a number and thus mangling the * string value by normalizing the number. * Ability to quote numerical strings at each part of a YAML document is * tested in tests for the particular document type, i.e. not in this file. * This code uses an RPM package list of a stream profile for the purpose * of testing. It's the most brief usage of quoting. */ static void test_quoting (gconstpointer data) { const struct item *test_case = (const struct item *)data; g_autoptr (ModulemdProfile) p = NULL; g_autoptr (GError) error = NULL; MMD_INIT_YAML_EMITTER (emitter); MMD_INIT_YAML_STRING (&emitter, yaml_string); g_autoptr (GString) expected = g_string_new (NULL); if (test_case->quoted) g_string_printf (expected, "---\n" "\"0\":\n" " rpms:\n" " - \"%s\"\n" "...\n", test_case->input); else g_string_printf (expected, "---\n" "\"0\":\n" " rpms:\n" " - %s\n" "...\n", test_case->input); p = modulemd_profile_new ("0"); modulemd_profile_add_rpm (p, test_case->input); g_assert_true (mmd_emitter_start_stream (&emitter, &error)); g_assert_true (mmd_emitter_start_document (&emitter, &error)); g_assert_true ( mmd_emitter_start_mapping (&emitter, YAML_BLOCK_MAPPING_STYLE, &error)); g_assert_true (modulemd_profile_emit_yaml (p, &emitter, &error)); g_assert_true (mmd_emitter_end_mapping (&emitter, &error)); g_assert_true (mmd_emitter_end_document (&emitter, &error)); g_assert_true (mmd_emitter_end_stream (&emitter, &error)); if (g_strcmp0 (yaml_string->str, expected->str)) { g_test_message ( "Expected=\"%s\"\nGot=\"%s\"", expected->str, yaml_string->str); g_test_fail (); } } int main (int argc, char *argv[]) { /* clang-format off */ struct item test_cases[] = { {"0", 1}, /* YAML/JSON floats */ {"0.", 1}, {"0.0", 1}, {".0", 1}, {"-1", 1}, {"-1.", 1}, {"-1.0", 1}, {"-.0", 1}, {"+1", 1}, /* Handle "+" for sure */ {"+1.", 1}, {"+1.0", 1}, {"+.0", 1}, {"1.0e1", 1}, {"-1.0e1", 1}, {"+1.0e1", 1}, {"1.0e-1", 1}, {"-1.0e-1", 1}, {"+1.0e-1", 1}, {"1.0e+1", 1}, {"-1.0e+1", 1}, {"+1.0e+1", 1}, {".inf", 1}, {"-.inf", 1}, {"+.inf", 1}, {".nan", 1}, {"0x", 0}, /* Incomplete hexadecimal */ {"0x0", 1}, /* YAML hexadecicmal notation */ {"0xa", 1}, {"0xA", 1}, {"0xg", 0}, /* Invalid hexadecimal */ {"0o", 0}, /* Incomplete octal */ {"0o0", 1}, /* YAML octal notation */ {"0o8", 0}, /* Invalid octal */ {"0a", 0}, /* This does not need quoting. Common in refs. */ {NULL, 0} }; /* clang-format on */ struct item *test_case; g_autoptr (GString) testpath = g_string_new (NULL); setlocale (LC_ALL, ""); g_test_init (&argc, &argv, NULL); g_test_set_nonfatal_assertions (); for (test_case = test_cases; test_case->input != NULL; test_case++) { g_string_printf ( testpath, "/modulemd/yaml/quoting/%s", test_case->input); g_test_add_data_func ( testpath->str, (gconstpointer)test_case, test_quoting); } return g_test_run (); } fedora-modularity-libmodulemd-357799c/modulemd/tests/test-modulemd-rpmmap.c000066400000000000000000000245131502446517500271370ustar00rootroot00000000000000/* * This file is part of libmodulemd * Copyright (C) 2018 Red Hat, Inc. * * Fedora-License-Identifier: MIT * SPDX-2.0-License-Identifier: MIT * SPDX-3.0-License-Identifier: MIT * * This program is free software. * For more information on the license, see COPYING. * For more information on free software, see . */ #include #include #include #include #include "modulemd-rpm-map-entry.h" #include "private/modulemd-rpm-map-entry-private.h" #include "private/modulemd-util.h" #include "private/modulemd-yaml.h" #include "private/test-utils.h" static void test_basic (void) { g_autoptr (ModulemdRpmMapEntry) entry = NULL; g_autoptr (GError) error = NULL; g_autofree gchar *nevra = NULL; guint64 epoch = 0; /* Test that the new() function works */ entry = modulemd_rpm_map_entry_new ( "bar", 0, "1.23", "1.module_deadbeef", "x86_64"); g_assert_nonnull (entry); g_assert_cmpstr (modulemd_rpm_map_entry_get_name (entry), ==, "bar"); g_assert_cmpuint (modulemd_rpm_map_entry_get_epoch (entry), ==, 0); g_assert_cmpstr (modulemd_rpm_map_entry_get_version (entry), ==, "1.23"); g_assert_cmpstr ( modulemd_rpm_map_entry_get_release (entry), ==, "1.module_deadbeef"); g_assert_cmpstr (modulemd_rpm_map_entry_get_arch (entry), ==, "x86_64"); g_assert_true (modulemd_rpm_map_entry_validate (entry, &error)); g_assert_null (error); nevra = modulemd_rpm_map_entry_get_nevra_as_string (entry); g_assert_nonnull (nevra); g_assert_cmpstr (nevra, ==, "bar-0:1.23-1.module_deadbeef.x86_64"); g_clear_pointer (&nevra, g_free); g_clear_object (&entry); /* Test that object instantiation with no attributes works */ entry = g_object_new (MODULEMD_TYPE_RPM_MAP_ENTRY, NULL); // clang-format on g_assert_nonnull (entry); g_assert_null (modulemd_rpm_map_entry_get_name (entry)); g_assert_cmpuint (modulemd_rpm_map_entry_get_epoch (entry), ==, 0); g_assert_null (modulemd_rpm_map_entry_get_version (entry)); g_assert_null (modulemd_rpm_map_entry_get_release (entry)); g_assert_null (modulemd_rpm_map_entry_get_arch (entry)); g_assert_false (modulemd_rpm_map_entry_validate (entry, &error)); g_assert_error (error, MODULEMD_ERROR, MMD_ERROR_VALIDATE); g_clear_error (&error); nevra = modulemd_rpm_map_entry_get_nevra_as_string (entry); g_assert_null (nevra); g_clear_pointer (&nevra, g_free); g_clear_object (&entry); /* Test that object instantiation with attributes works */ // clang-format off entry = g_object_new (MODULEMD_TYPE_RPM_MAP_ENTRY, "name", "bar", "epoch", epoch, "version", "1.23", "release", "1.module_deadbeef", "arch", "x86_64", NULL); // clang-format on g_assert_nonnull (entry); g_assert_cmpstr (modulemd_rpm_map_entry_get_name (entry), ==, "bar"); g_assert_cmpuint (modulemd_rpm_map_entry_get_epoch (entry), ==, 0); g_assert_cmpstr (modulemd_rpm_map_entry_get_version (entry), ==, "1.23"); g_assert_cmpstr ( modulemd_rpm_map_entry_get_release (entry), ==, "1.module_deadbeef"); g_assert_cmpstr (modulemd_rpm_map_entry_get_arch (entry), ==, "x86_64"); g_assert_true (modulemd_rpm_map_entry_validate (entry, &error)); g_assert_null (error); nevra = modulemd_rpm_map_entry_get_nevra_as_string (entry); g_assert_nonnull (nevra); g_assert_cmpstr (nevra, ==, "bar-0:1.23-1.module_deadbeef.x86_64"); g_clear_pointer (&nevra, g_free); g_clear_object (&entry); } static void test_compare (void) { g_autoptr (ModulemdRpmMapEntry) entry = NULL; ModulemdRpmMapEntry *entry_pointer; g_autoptr (ModulemdRpmMapEntry) entry2 = NULL; g_autoptr (ModulemdRpmMapEntry) entry3 = NULL; entry = modulemd_rpm_map_entry_new ( "bar", 0, "1.23", "1.module_deadbeef", "x86_64"); g_assert_nonnull (entry); entry_pointer = entry; entry2 = modulemd_rpm_map_entry_new ( "bar", 0, "1.23", "1.module_deadbeef", "x86_64"); g_assert_nonnull (entry2); entry3 = modulemd_rpm_map_entry_new ( "foo", 0, "1.23", "1.module_deadbeef", "x86_64"); g_assert_nonnull (entry3); /* Test that passing the same pointer returns TRUE */ g_assert_true (modulemd_rpm_map_entry_equals (entry, entry_pointer)); /* Test that passing two equivalent entries returns TRUE */ g_assert_true (modulemd_rpm_map_entry_equals (entry, entry2)); /* Test that passing an entry with a different name returns FALSE */ g_assert_false (modulemd_rpm_map_entry_equals (entry, entry3)); } static void test_parse_yaml_valid (void) { g_autoptr (ModulemdRpmMapEntry) entry = NULL; g_autoptr (GError) error = NULL; MMD_INIT_YAML_EVENT (event); MMD_INIT_YAML_PARSER (parser); g_autofree gchar *yaml_path = NULL; g_autoptr (FILE) yaml_stream = NULL; /* Parse a valid rpm-map entry */ yaml_path = g_strdup_printf ("%s/rpm-map/valid.yaml", g_getenv ("TEST_DATA_PATH")); g_assert_nonnull (yaml_path); yaml_stream = g_fopen (yaml_path, "rbe"); g_assert_nonnull (yaml_stream); yaml_parser_set_input_file (&parser, yaml_stream); parser_skip_document_start (&parser); entry = modulemd_rpm_map_entry_parse_yaml (&parser, TRUE, &error); g_assert_nonnull (entry); g_assert_null (error); g_assert_true (modulemd_rpm_map_entry_validate (entry, &error)); g_assert_null (error); } static void test_parse_yaml_missing (void) { g_autoptr (ModulemdRpmMapEntry) entry = NULL; g_autoptr (GError) error = NULL; MMD_INIT_YAML_EVENT (event); MMD_INIT_YAML_PARSER (parser); g_autofree gchar *yaml_path = NULL; g_autoptr (FILE) yaml_stream = NULL; /* Try an entry that's missing a field */ yaml_path = g_strdup_printf ("%s/rpm-map/missing-version.yaml", g_getenv ("TEST_DATA_PATH")); g_assert_nonnull (yaml_path); yaml_stream = g_fopen (yaml_path, "rbe"); g_assert_nonnull (yaml_stream); yaml_parser_set_input_file (&parser, yaml_stream); parser_skip_document_start (&parser); entry = modulemd_rpm_map_entry_parse_yaml (&parser, TRUE, &error); g_assert_null (entry); g_assert_error (error, MODULEMD_ERROR, MMD_ERROR_VALIDATE); } static void test_parse_yaml_mismatch (void) { g_autoptr (ModulemdRpmMapEntry) entry = NULL; g_autoptr (GError) error = NULL; MMD_INIT_YAML_EVENT (event); MMD_INIT_YAML_PARSER (parser); g_autofree gchar *yaml_path = NULL; g_autoptr (FILE) yaml_stream = NULL; /* Try an entry with mismatched nevra */ yaml_path = g_strdup_printf ("%s/rpm-map/wrong-nevra.yaml", g_getenv ("TEST_DATA_PATH")); g_assert_nonnull (yaml_path); yaml_stream = g_fopen (yaml_path, "rbe"); g_assert_nonnull (yaml_stream); yaml_parser_set_input_file (&parser, yaml_stream); parser_skip_document_start (&parser); entry = modulemd_rpm_map_entry_parse_yaml (&parser, TRUE, &error); g_assert_null (entry); g_assert_error (error, MODULEMD_YAML_ERROR, MMD_YAML_ERROR_INCONSISTENT); } static void test_emit_yaml_valid (void) { g_autoptr (ModulemdRpmMapEntry) entry = NULL; g_autoptr (GError) error = NULL; MMD_INIT_YAML_EMITTER (emitter); MMD_INIT_YAML_STRING (&emitter, yaml_string); // clang-format off const gchar *baseline = "---\n" "name: baz\n" "epoch: 2\n" "version: \"2.18\"\n" "release: 3.module_baddad\n" "arch: s390x\n" "nevra: baz-2:2.18-3.module_baddad.s390x\n" "...\n"; // clang-format on entry = modulemd_rpm_map_entry_new ("baz", 2, "2.18", "3.module_baddad", "s390x"); g_assert_true (mmd_emitter_start_stream (&emitter, &error)); g_assert_true (mmd_emitter_start_document (&emitter, &error)); g_assert_true (modulemd_rpm_map_entry_emit_yaml (entry, &emitter, &error)); g_assert_no_error (error); g_assert_true (mmd_emitter_end_document (&emitter, &error)); g_assert_true (mmd_emitter_end_stream (&emitter, &error)); g_assert_cmpstr (yaml_string->str, ==, baseline); g_clear_pointer (&yaml_string, modulemd_yaml_string_free); } static void test_emit_yaml_invalid (void) { g_autoptr (ModulemdRpmMapEntry) entry = NULL; g_autoptr (GError) error = NULL; MMD_INIT_YAML_EMITTER (emitter); MMD_INIT_YAML_STRING (&emitter, yaml_string); entry = modulemd_rpm_map_entry_new (NULL, 2, "2.18", "3.module_baddad", "s390x"); g_assert_true (mmd_emitter_start_stream (&emitter, &error)); g_assert_true (mmd_emitter_start_document (&emitter, &error)); g_assert_false (modulemd_rpm_map_entry_emit_yaml (entry, &emitter, &error)); g_assert_error (error, MODULEMD_ERROR, MMD_ERROR_VALIDATE); } static void test_emit_yaml_quoting (void) { g_autoptr (ModulemdRpmMapEntry) entry = NULL; g_autoptr (GError) error = NULL; MMD_INIT_YAML_EMITTER (emitter); MMD_INIT_YAML_STRING (&emitter, yaml_string); const gchar *baseline = "---\n" "name: \"0\"\n" "epoch: 1\n" "version: \"2\"\n" "release: \"3\"\n" "arch: \"4\"\n" "nevra: 0-1:2-3.4\n" "...\n"; entry = modulemd_rpm_map_entry_new ("0", 1, "2", "3", "4"); g_assert_true (mmd_emitter_start_stream (&emitter, &error)); g_assert_true (mmd_emitter_start_document (&emitter, &error)); g_assert_true (modulemd_rpm_map_entry_emit_yaml (entry, &emitter, &error)); g_assert_no_error (error); g_assert_true (mmd_emitter_end_document (&emitter, &error)); g_assert_true (mmd_emitter_end_stream (&emitter, &error)); g_assert_cmpstr (yaml_string->str, ==, baseline); g_clear_pointer (&yaml_string, modulemd_yaml_string_free); } int main (int argc, char *argv[]) { setlocale (LC_ALL, ""); g_test_init (&argc, &argv, NULL); g_test_bug_base ("https://bugzilla.redhat.com/show_bug.cgi?id="); g_test_add_func ("/modulemd/v2/rpm_map/basic", test_basic); g_test_add_func ("/modulemd/v2/rpm_map/compare", test_compare); g_test_add_func ("/modulemd/v2/rpm_map/yaml/parse/valid", test_parse_yaml_valid); g_test_add_func ("/modulemd/v2/rpm_map/yaml/parse/missing", test_parse_yaml_missing); g_test_add_func ("/modulemd/v2/rpm_map/yaml/parse/mismatch", test_parse_yaml_mismatch); g_test_add_func ("/modulemd/v2/rpm_map/yaml/emit/valid", test_emit_yaml_valid); g_test_add_func ("/modulemd/v2/rpm_map/yaml/emit/invalid", test_emit_yaml_invalid); g_test_add_func ("/modulemd/v2/rpm_map/yaml/emit/quoting", test_emit_yaml_quoting); return g_test_run (); } fedora-modularity-libmodulemd-357799c/modulemd/tests/test-modulemd-service-level.c000066400000000000000000000372311502446517500304110ustar00rootroot00000000000000/* * This file is part of libmodulemd * Copyright (C) 2017-2018 Stephen Gallagher * * Fedora-License-Identifier: MIT * SPDX-2.0-License-Identifier: MIT * SPDX-3.0-License-Identifier: MIT * * This program is free software. * For more information on the license, see COPYING. * For more information on free software, see . */ #include #include #include #include #include "modulemd-service-level.h" #include "private/glib-extensions.h" #include "private/modulemd-service-level-private.h" #include "private/modulemd-yaml.h" #include "private/test-utils.h" typedef struct _ServiceLevelFixture { } ServiceLevelFixture; gboolean signaled = FALSE; static void sigtrap_handler (int UNUSED (sig_num)) { signaled = TRUE; } static void service_level_test_construct (void) { g_autoptr (ModulemdServiceLevel) sl = NULL; /* Test that the new() function works */ sl = modulemd_service_level_new ("foo"); g_assert_nonnull (sl); g_assert_true (MODULEMD_IS_SERVICE_LEVEL (sl)); g_assert_cmpstr (modulemd_service_level_get_name (sl), ==, "foo"); g_assert_null (modulemd_service_level_get_eol (sl)); g_clear_object (&sl); /* Test that standard object instantiation works with a name */ // clang-format off sl = g_object_new (MODULEMD_TYPE_SERVICE_LEVEL, "name", "bar", NULL); // clang-format on g_assert_true (MODULEMD_IS_SERVICE_LEVEL (sl)); g_assert_cmpstr (modulemd_service_level_get_name (sl), ==, "bar"); g_assert_null (modulemd_service_level_get_eol (sl)); g_clear_object (&sl); /* Test that we abort if we call new() with a NULL name */ signaled = FALSE; signal (SIGTRAP, sigtrap_handler); sl = modulemd_service_level_new (NULL); g_assert_true (signaled); g_clear_object (&sl); /* Test that we abort if we instatiate without a name */ signaled = FALSE; signal (SIGTRAP, sigtrap_handler); sl = g_object_new (MODULEMD_TYPE_SERVICE_LEVEL, NULL); g_assert_true (signaled); g_clear_object (&sl); /* Test that we abort if we instatiate with a NULL name */ signaled = FALSE; signal (SIGTRAP, sigtrap_handler); // clang-format off sl = g_object_new (MODULEMD_TYPE_SERVICE_LEVEL, "name", NULL, NULL); // clang-format on g_assert_true (signaled); g_clear_object (&sl); } static void service_level_test_equals (void) { g_autoptr (ModulemdServiceLevel) sl_1 = NULL; g_autoptr (ModulemdServiceLevel) sl_2 = NULL; /* Test 2 service levels with same name*/ sl_1 = modulemd_service_level_new ("foo"); g_assert_nonnull (sl_1); g_assert_true (MODULEMD_IS_SERVICE_LEVEL (sl_1)); sl_2 = modulemd_service_level_new ("foo"); g_assert_nonnull (sl_2); g_assert_true (MODULEMD_IS_SERVICE_LEVEL (sl_2)); g_assert_true (modulemd_service_level_equals (sl_1, sl_2)); g_clear_object (&sl_1); g_clear_object (&sl_2); /* Test 2 service levels with different names*/ sl_1 = modulemd_service_level_new ("foo"); g_assert_nonnull (sl_1); g_assert_true (MODULEMD_IS_SERVICE_LEVEL (sl_1)); sl_2 = modulemd_service_level_new ("bar"); g_assert_nonnull (sl_2); g_assert_true (MODULEMD_IS_SERVICE_LEVEL (sl_2)); g_assert_false (modulemd_service_level_equals (sl_1, sl_2)); g_clear_object (&sl_1); g_clear_object (&sl_2); /* Test 2 service levels with same name and same eol*/ sl_1 = modulemd_service_level_new ("foo"); g_assert_nonnull (sl_1); g_assert_true (MODULEMD_IS_SERVICE_LEVEL (sl_1)); modulemd_service_level_set_eol_ymd (sl_1, 2018, 11, 13); g_assert_nonnull (modulemd_service_level_get_eol (sl_1)); sl_2 = modulemd_service_level_new ("foo"); g_assert_nonnull (sl_2); g_assert_true (MODULEMD_IS_SERVICE_LEVEL (sl_2)); modulemd_service_level_set_eol_ymd (sl_2, 2018, 11, 13); g_assert_nonnull (modulemd_service_level_get_eol (sl_2)); g_assert_true (modulemd_service_level_equals (sl_1, sl_2)); g_clear_object (&sl_1); g_clear_object (&sl_2); /* Test 2 service levels with same name and different eol*/ sl_1 = modulemd_service_level_new ("foo"); g_assert_nonnull (sl_1); g_assert_true (MODULEMD_IS_SERVICE_LEVEL (sl_1)); modulemd_service_level_set_eol_ymd (sl_1, 2018, 11, 13); g_assert_nonnull (modulemd_service_level_get_eol (sl_1)); sl_2 = modulemd_service_level_new ("foo"); g_assert_nonnull (sl_2); g_assert_true (MODULEMD_IS_SERVICE_LEVEL (sl_2)); modulemd_service_level_set_eol_ymd (sl_2, 1998, 05, 25); g_assert_nonnull (modulemd_service_level_get_eol (sl_2)); g_assert_false (modulemd_service_level_equals (sl_1, sl_2)); g_clear_object (&sl_1); g_clear_object (&sl_2); /* Test 2 service levels with same name and 1 invalid eol*/ sl_1 = modulemd_service_level_new ("foo"); g_assert_nonnull (sl_1); g_assert_true (MODULEMD_IS_SERVICE_LEVEL (sl_1)); modulemd_service_level_set_eol_ymd (sl_1, 9999, 99, 99); g_assert_null (modulemd_service_level_get_eol (sl_1)); sl_2 = modulemd_service_level_new ("foo"); g_assert_nonnull (sl_2); g_assert_true (MODULEMD_IS_SERVICE_LEVEL (sl_2)); modulemd_service_level_set_eol_ymd (sl_2, 1998, 05, 25); g_assert_nonnull (modulemd_service_level_get_eol (sl_2)); g_assert_false (modulemd_service_level_equals (sl_1, sl_2)); g_clear_object (&sl_1); g_clear_object (&sl_2); /* Test 2 service levels with same name and both invalid eol*/ sl_1 = modulemd_service_level_new ("foo"); g_assert_nonnull (sl_1); g_assert_true (MODULEMD_IS_SERVICE_LEVEL (sl_1)); modulemd_service_level_set_eol_ymd (sl_1, 9999, 99, 99); g_assert_null (modulemd_service_level_get_eol (sl_1)); sl_2 = modulemd_service_level_new ("foo"); g_assert_nonnull (sl_2); g_assert_true (MODULEMD_IS_SERVICE_LEVEL (sl_2)); modulemd_service_level_set_eol_ymd (sl_2, 9999, 99, 98); g_assert_null (modulemd_service_level_get_eol (sl_2)); g_assert_true (modulemd_service_level_equals (sl_1, sl_2)); g_clear_object (&sl_1); g_clear_object (&sl_2); } static void service_level_test_copy (void) { g_autoptr (ModulemdServiceLevel) sl = NULL; g_autoptr (ModulemdServiceLevel) sl_copy = NULL; g_autofree gchar *eol_string = NULL; /* Test copying a service level with no EOL */ sl = modulemd_service_level_new ("foo"); g_assert_nonnull (sl); g_assert_true (MODULEMD_IS_SERVICE_LEVEL (sl)); g_assert_cmpstr (modulemd_service_level_get_name (sl), ==, "foo"); g_assert_null (modulemd_service_level_get_eol (sl)); sl_copy = modulemd_service_level_copy (sl); g_assert_nonnull (sl_copy); g_assert_true (MODULEMD_IS_SERVICE_LEVEL (sl_copy)); g_assert_cmpstr (modulemd_service_level_get_name (sl_copy), ==, "foo"); g_assert_null (modulemd_service_level_get_eol (sl_copy)); g_clear_object (&sl_copy); /* Test copying a service level with an EOL */ modulemd_service_level_set_eol_ymd (sl, 2018, 11, 13); sl_copy = modulemd_service_level_copy (sl); g_assert_nonnull (sl_copy); g_assert_true (MODULEMD_IS_SERVICE_LEVEL (sl_copy)); g_assert_cmpstr (modulemd_service_level_get_name (sl_copy), ==, "foo"); g_assert_nonnull (modulemd_service_level_get_eol (sl_copy)); eol_string = modulemd_service_level_get_eol_as_string (sl_copy); g_assert_cmpstr (eol_string, ==, "2018-11-13"); } static void service_level_test_get_name (void) { g_autoptr (ModulemdServiceLevel) sl = NULL; g_autofree gchar *name = NULL; /* First create a service level */ sl = modulemd_service_level_new ("foo"); g_assert_nonnull (sl); g_assert_true (MODULEMD_IS_SERVICE_LEVEL (sl)); /* Test that get_name() returns the correct value */ g_assert_cmpstr (modulemd_service_level_get_name (sl), ==, "foo"); /* Test looking up the name by object properties */ // clang-format off g_object_get (sl, "name", &name, NULL); // clang-format on g_assert_cmpstr (name, ==, "foo"); /* Test that trying to set the name by object properties fails. * The name must be immutable for the life of the object. */ signaled = FALSE; signal (SIGTRAP, sigtrap_handler); // clang-format off g_object_set (sl, "name", "bar", NULL); // clang-format on g_assert_true (signaled); } static void service_level_test_get_set_eol (void) { g_autoptr (ModulemdServiceLevel) sl = NULL; g_autoptr (GDate) eol = NULL; GDate *returned_eol = NULL; g_autofree gchar *eol_string = NULL; /* First create a service level */ sl = modulemd_service_level_new ("foo"); g_assert_nonnull (sl); g_assert_true (MODULEMD_IS_SERVICE_LEVEL (sl)); /* Test that get_eol() returns NULL at first */ g_assert_null (modulemd_service_level_get_eol (sl)); /* coverity[leaked_storage] */ g_assert_null (modulemd_service_level_get_eol_as_string (sl)); /* Set the EOL with the set_eol() method */ eol = g_date_new_dmy (7, 11, 2018); modulemd_service_level_set_eol (sl, eol); returned_eol = modulemd_service_level_get_eol (sl); g_assert_nonnull (returned_eol); g_assert_true (g_date_valid (returned_eol)); g_assert_cmpint (g_date_compare (eol, returned_eol), ==, 0); eol_string = modulemd_service_level_get_eol_as_string (sl); g_assert_nonnull (eol_string); g_assert_cmpstr (eol_string, ==, "2018-11-07"); g_clear_pointer (&eol_string, g_free); /* Set the EOL with the set_eol_ymd() method */ modulemd_service_level_set_eol_ymd (sl, 2018, 11, 7); returned_eol = modulemd_service_level_get_eol (sl); g_assert_nonnull (returned_eol); g_assert_true (g_date_valid (returned_eol)); g_assert_cmpint (g_date_compare (eol, returned_eol), ==, 0); eol_string = modulemd_service_level_get_eol_as_string (sl); g_assert_nonnull (eol_string); g_assert_cmpstr (eol_string, ==, "2018-11-07"); g_clear_pointer (&eol_string, g_free); /* Set an invalid date */ g_clear_pointer (&eol, g_date_free); eol = g_date_new (); modulemd_service_level_set_eol (sl, eol); g_assert_null (modulemd_service_level_get_eol (sl)); modulemd_service_level_set_eol_ymd (sl, 2018, 2, 31); g_assert_null (modulemd_service_level_get_eol (sl)); modulemd_service_level_set_eol_ymd (sl, 9999, 99, 99); g_assert_null (modulemd_service_level_get_eol (sl)); /* Set the EOL back to something valid */ modulemd_service_level_set_eol_ymd (sl, 2018, 11, 7); returned_eol = modulemd_service_level_get_eol (sl); g_assert_nonnull (returned_eol); eol_string = modulemd_service_level_get_eol_as_string (sl); g_assert_nonnull (eol_string); g_assert_cmpstr (eol_string, ==, "2018-11-07"); g_clear_pointer (&eol_string, g_free); /* Test the remove_eol() function */ modulemd_service_level_remove_eol (sl); g_assert_null (modulemd_service_level_get_eol (sl)); } static void service_level_test_parse_yaml (void) { g_autoptr (ModulemdServiceLevel) sl = NULL; g_autoptr (GError) error = NULL; MMD_INIT_YAML_PARSER (parser); g_autofree gchar *yaml_path = NULL; g_autoptr (FILE) yaml_stream = NULL; g_autofree gchar *name = NULL; GDate *eol = NULL; yaml_path = g_strdup_printf ("%s/sl_with_eol.yaml", g_getenv ("TEST_DATA_PATH")); g_assert_nonnull (yaml_path); yaml_stream = g_fopen (yaml_path, "rbe"); g_assert_nonnull (yaml_stream); yaml_parser_set_input_file (&parser, yaml_stream); /* Advance the parser past STREAM_START, DOCUMENT_START and MAPPING_START */ parser_skip_headers (&parser); /* Read the name */ name = modulemd_yaml_parse_string (&parser, &error); g_assert_nonnull (name); g_assert_cmpstr (name, ==, "sl_name"); sl = modulemd_service_level_parse_yaml (&parser, name, TRUE, &error); g_assert_nonnull (sl); g_assert_true (MODULEMD_IS_SERVICE_LEVEL (sl)); g_assert_cmpstr (modulemd_service_level_get_name (sl), ==, "sl_name"); g_assert_nonnull (modulemd_service_level_get_eol (sl)); eol = modulemd_service_level_get_eol (sl); g_assert_cmpint (g_date_get_year (eol), ==, 2018); g_assert_cmpint (g_date_get_month (eol), ==, 7); g_assert_cmpint (g_date_get_day (eol), ==, 11); } static void service_level_test_emit_yaml (void) { g_autoptr (ModulemdServiceLevel) sl = NULL; g_autoptr (GError) error = NULL; MMD_INIT_YAML_EMITTER (emitter); MMD_INIT_YAML_STRING (&emitter, yaml_string); /* Service Level without EOL */ sl = modulemd_service_level_new ("foo"); g_assert_true (mmd_emitter_start_stream (&emitter, &error)); g_assert_true (mmd_emitter_start_document (&emitter, &error)); g_assert_true ( mmd_emitter_start_mapping (&emitter, YAML_BLOCK_MAPPING_STYLE, &error)); g_assert_true (modulemd_service_level_emit_yaml (sl, &emitter, &error)); g_assert_true (mmd_emitter_end_mapping (&emitter, &error)); g_assert_true (mmd_emitter_end_document (&emitter, &error)); g_assert_true (mmd_emitter_end_stream (&emitter, &error)); g_assert_cmpstr (yaml_string->str, ==, "---\nfoo: {}\n...\n"); /* Service Level with EOL */ g_clear_pointer (&yaml_string, modulemd_yaml_string_free); yaml_emitter_delete (&emitter); yaml_emitter_initialize (&emitter); yaml_string = g_malloc0_n (1, sizeof (modulemd_yaml_string)); yaml_emitter_set_output (&emitter, write_yaml_string, (void *)yaml_string); modulemd_service_level_set_eol_ymd (sl, 2018, 11, 13); g_assert_true (mmd_emitter_start_stream (&emitter, &error)); g_assert_true (mmd_emitter_start_document (&emitter, &error)); g_assert_true ( mmd_emitter_start_mapping (&emitter, YAML_BLOCK_MAPPING_STYLE, &error)); g_assert_true (modulemd_service_level_emit_yaml (sl, &emitter, &error)); g_assert_true (mmd_emitter_end_mapping (&emitter, &error)); g_assert_true (mmd_emitter_end_document (&emitter, &error)); g_assert_true (mmd_emitter_end_stream (&emitter, &error)); g_assert_cmpstr (yaml_string->str, ==, "---\n" "foo:\n" " eol: 2018-11-13\n" "...\n"); } static void service_level_test_quoting_yaml (void) { g_autoptr (ModulemdServiceLevel) sl = NULL; g_autoptr (GError) error = NULL; MMD_INIT_YAML_EMITTER (emitter); MMD_INIT_YAML_STRING (&emitter, yaml_string); sl = modulemd_service_level_new ("0"); modulemd_service_level_set_eol_ymd (sl, 2018, 11, 13); g_assert_true (mmd_emitter_start_stream (&emitter, &error)); g_assert_true (mmd_emitter_start_document (&emitter, &error)); g_assert_true ( mmd_emitter_start_mapping (&emitter, YAML_BLOCK_MAPPING_STYLE, &error)); g_assert_true (modulemd_service_level_emit_yaml (sl, &emitter, &error)); g_assert_true (mmd_emitter_end_mapping (&emitter, &error)); g_assert_true (mmd_emitter_end_document (&emitter, &error)); g_assert_true (mmd_emitter_end_stream (&emitter, &error)); g_assert_cmpstr (yaml_string->str, ==, "---\n" "\"0\":\n" " eol: 2018-11-13\n" "...\n"); } int main (int argc, char *argv[]) { setlocale (LC_ALL, ""); g_test_init (&argc, &argv, NULL); g_test_bug_base ("https://bugzilla.redhat.com/show_bug.cgi?id="); // Define the tests. g_test_add_func ("/modulemd/v2/servicelevel/construct", service_level_test_construct); g_test_add_func ("/modulemd/v2/servicelevel/get_set_name", service_level_test_get_name); g_test_add_func ("/modulemd/v2/servicelevel/equals", service_level_test_equals); g_test_add_func ("/modulemd/v2/servicelevel/copy", service_level_test_copy); g_test_add_func ("/modulemd/v2/servicelevel/get_set_eol", service_level_test_get_set_eol); g_test_add_func ("/modulemd/v2/servicelevel/yaml/parse", service_level_test_parse_yaml); g_test_add_func ("/modulemd/v2/servicelevel/yaml/emit", service_level_test_emit_yaml); g_test_add_func ("/modulemd/v2/servicelevel/yaml/quoting", service_level_test_quoting_yaml); return g_test_run (); } fedora-modularity-libmodulemd-357799c/modulemd/tests/test-modulemd-translation-entry.c000066400000000000000000000576311502446517500313470ustar00rootroot00000000000000/* * This file is part of libmodulemd * Copyright (C) 2018 Red Hat, Inc. * * Fedora-License-Identifier: MIT * SPDX-2.0-License-Identifier: MIT * SPDX-3.0-License-Identifier: MIT * * This program is free software. * For more information on the license, see COPYING. * For more information on free software, see . */ #include #include #include #include #include "modulemd-translation-entry.h" #include "private/glib-extensions.h" #include "private/modulemd-translation-entry-private.h" #include "private/modulemd-yaml.h" #include "private/test-utils.h" typedef struct _TranslationEntryFixture { } TranslationEntryFixture; gboolean signaled = FALSE; static void sigtrap_handler (int UNUSED (sig_num)) { signaled = TRUE; } static void translation_entry_test_construct (void) { g_autoptr (ModulemdTranslationEntry) te = NULL; g_auto (GStrv) profile_names = NULL; /* Test that the new() function works */ te = modulemd_translation_entry_new ("en_US"); g_assert_nonnull (te); g_assert_true (MODULEMD_IS_TRANSLATION_ENTRY (te)); g_assert_cmpstr (modulemd_translation_entry_get_locale (te), ==, "en_US"); g_assert_null (modulemd_translation_entry_get_summary (te)); g_assert_null (modulemd_translation_entry_get_description (te)); profile_names = modulemd_translation_entry_get_profiles_as_strv (te); g_assert_nonnull (profile_names); g_assert_cmpint (g_strv_length (profile_names), ==, 0); g_assert_null ( modulemd_translation_entry_get_profile_description (te, "test")); g_clear_object (&te); /* Test that standard object instantiation works with a locale */ // clang-format off te = g_object_new (MODULEMD_TYPE_TRANSLATION_ENTRY, "locale", "en_GB", NULL); // clang-format on g_assert_true (MODULEMD_IS_TRANSLATION_ENTRY (te)); g_assert_cmpstr (modulemd_translation_entry_get_locale (te), ==, "en_GB"); g_clear_object (&te); /* Test that standard object instantiation works with a locale and summary */ // clang-format off te = g_object_new (MODULEMD_TYPE_TRANSLATION_ENTRY, "locale", "en_GB", "summary", "foobar", NULL); // clang-format on g_assert_true (MODULEMD_IS_TRANSLATION_ENTRY (te)); g_assert_cmpstr (modulemd_translation_entry_get_locale (te), ==, "en_GB"); g_assert_cmpstr (modulemd_translation_entry_get_summary (te), ==, "foobar"); g_assert_null (modulemd_translation_entry_get_description (te)); g_clear_object (&te); /* Test that standard object instantiation works with a locale and description */ // clang-format off te = g_object_new (MODULEMD_TYPE_TRANSLATION_ENTRY, "locale", "en_GB", "description", "barfoo", NULL); // clang-format on g_assert_true (MODULEMD_IS_TRANSLATION_ENTRY (te)); g_assert_cmpstr (modulemd_translation_entry_get_locale (te), ==, "en_GB"); g_assert_null (modulemd_translation_entry_get_summary (te)); g_assert_cmpstr ( modulemd_translation_entry_get_description (te), ==, "barfoo"); g_clear_object (&te); /* Test that standard object instantiation works with a locale, summary and description */ // clang-format off te = g_object_new (MODULEMD_TYPE_TRANSLATION_ENTRY, "locale", "en_GB", "summary", "brown fox", "description", "jumped", NULL); // clang-format on g_assert_true (MODULEMD_IS_TRANSLATION_ENTRY (te)); g_assert_cmpstr (modulemd_translation_entry_get_locale (te), ==, "en_GB"); g_assert_cmpstr ( modulemd_translation_entry_get_summary (te), ==, "brown fox"); g_assert_cmpstr ( modulemd_translation_entry_get_description (te), ==, "jumped"); g_clear_object (&te); /* Test that we abort if we call new() with a NULL locale */ signaled = FALSE; signal (SIGTRAP, sigtrap_handler); te = modulemd_translation_entry_new (NULL); g_assert_true (signaled); g_clear_object (&te); /* Test that we abort if we instatiate without a locale */ signaled = FALSE; signal (SIGTRAP, sigtrap_handler); te = g_object_new (MODULEMD_TYPE_TRANSLATION_ENTRY, NULL); g_assert_true (signaled); g_clear_object (&te); /* Test that we abort if we instatiate with a NULL locale */ signaled = FALSE; signal (SIGTRAP, sigtrap_handler); // clang-format off te = g_object_new (MODULEMD_TYPE_TRANSLATION_ENTRY, "locale", NULL, NULL); // clang-format on g_assert_true (signaled); g_clear_object (&te); } static void translation_entry_test_copy (void) { g_autoptr (ModulemdTranslationEntry) te = NULL; g_autoptr (ModulemdTranslationEntry) te_copy = NULL; g_auto (GStrv) profile_names = NULL; /* Test copying an empty translation entry */ te = modulemd_translation_entry_new ("en_GB"); g_assert_nonnull (te); g_assert_true (MODULEMD_IS_TRANSLATION_ENTRY (te)); g_assert_cmpstr (modulemd_translation_entry_get_locale (te), ==, "en_GB"); g_assert_null (modulemd_translation_entry_get_summary (te)); g_assert_null (modulemd_translation_entry_get_description (te)); profile_names = modulemd_translation_entry_get_profiles_as_strv (te); g_assert_nonnull (profile_names); g_assert_cmpint (g_strv_length (profile_names), ==, 0); g_assert_null ( modulemd_translation_entry_get_profile_description (te, "test")); g_clear_pointer (&profile_names, g_strfreev); te_copy = modulemd_translation_entry_copy (te); g_assert_nonnull (te_copy); g_assert_true (MODULEMD_IS_TRANSLATION_ENTRY (te_copy)); g_assert_cmpstr ( modulemd_translation_entry_get_locale (te_copy), ==, "en_GB"); g_assert_null (modulemd_translation_entry_get_summary (te_copy)); g_assert_null (modulemd_translation_entry_get_description (te_copy)); profile_names = modulemd_translation_entry_get_profiles_as_strv (te_copy); g_assert_nonnull (profile_names); g_assert_cmpint (g_strv_length (profile_names), ==, 0); g_assert_null ( modulemd_translation_entry_get_profile_description (te_copy, "test")); g_clear_pointer (&profile_names, g_strfreev); g_clear_object (&te); g_clear_object (&te_copy); /* Test copying a translation entry with a summary */ te = modulemd_translation_entry_new ("en_GB"); modulemd_translation_entry_set_summary (te, "foobar"); g_assert_nonnull (te); g_assert_true (MODULEMD_IS_TRANSLATION_ENTRY (te)); g_assert_cmpstr (modulemd_translation_entry_get_locale (te), ==, "en_GB"); g_assert_cmpstr (modulemd_translation_entry_get_summary (te), ==, "foobar"); g_assert_null (modulemd_translation_entry_get_description (te)); profile_names = modulemd_translation_entry_get_profiles_as_strv (te); g_assert_nonnull (profile_names); g_assert_cmpint (g_strv_length (profile_names), ==, 0); g_assert_null ( modulemd_translation_entry_get_profile_description (te, "test")); g_clear_pointer (&profile_names, g_strfreev); te_copy = modulemd_translation_entry_copy (te); g_assert_nonnull (te_copy); g_assert_true (MODULEMD_IS_TRANSLATION_ENTRY (te_copy)); g_assert_cmpstr ( modulemd_translation_entry_get_locale (te_copy), ==, "en_GB"); g_assert_cmpstr ( modulemd_translation_entry_get_summary (te_copy), ==, "foobar"); g_assert_null (modulemd_translation_entry_get_description (te_copy)); profile_names = modulemd_translation_entry_get_profiles_as_strv (te_copy); g_assert_nonnull (profile_names); g_assert_cmpint (g_strv_length (profile_names), ==, 0); g_assert_null ( modulemd_translation_entry_get_profile_description (te_copy, "test")); g_clear_pointer (&profile_names, g_strfreev); g_clear_object (&te); g_clear_object (&te_copy); /* Test copying a translation entry with a description */ te = modulemd_translation_entry_new ("en_GB"); modulemd_translation_entry_set_description (te, "barfoo"); g_assert_nonnull (te); g_assert_true (MODULEMD_IS_TRANSLATION_ENTRY (te)); g_assert_cmpstr (modulemd_translation_entry_get_locale (te), ==, "en_GB"); g_assert_null (modulemd_translation_entry_get_summary (te)); g_assert_cmpstr ( modulemd_translation_entry_get_description (te), ==, "barfoo"); profile_names = modulemd_translation_entry_get_profiles_as_strv (te); g_assert_nonnull (profile_names); g_assert_cmpint (g_strv_length (profile_names), ==, 0); g_assert_null ( modulemd_translation_entry_get_profile_description (te, "test")); g_clear_pointer (&profile_names, g_strfreev); te_copy = modulemd_translation_entry_copy (te); g_assert_nonnull (te_copy); g_assert_true (MODULEMD_IS_TRANSLATION_ENTRY (te_copy)); g_assert_cmpstr ( modulemd_translation_entry_get_locale (te_copy), ==, "en_GB"); g_assert_null (modulemd_translation_entry_get_summary (te_copy)); g_assert_cmpstr ( modulemd_translation_entry_get_description (te_copy), ==, "barfoo"); profile_names = modulemd_translation_entry_get_profiles_as_strv (te_copy); g_assert_nonnull (profile_names); g_assert_cmpint (g_strv_length (profile_names), ==, 0); g_assert_null ( modulemd_translation_entry_get_profile_description (te_copy, "test")); g_clear_pointer (&profile_names, g_strfreev); g_clear_object (&te); g_clear_object (&te_copy); /* Test copying a translation entry with a summary and description */ te = modulemd_translation_entry_new ("en_GB"); modulemd_translation_entry_set_summary (te, "foobar"); modulemd_translation_entry_set_description (te, "barfoo"); g_assert_nonnull (te); g_assert_true (MODULEMD_IS_TRANSLATION_ENTRY (te)); g_assert_cmpstr (modulemd_translation_entry_get_locale (te), ==, "en_GB"); g_assert_cmpstr (modulemd_translation_entry_get_summary (te), ==, "foobar"); g_assert_cmpstr ( modulemd_translation_entry_get_description (te), ==, "barfoo"); profile_names = modulemd_translation_entry_get_profiles_as_strv (te); g_assert_nonnull (profile_names); g_assert_cmpint (g_strv_length (profile_names), ==, 0); g_assert_null ( modulemd_translation_entry_get_profile_description (te, "test")); g_clear_pointer (&profile_names, g_strfreev); te_copy = modulemd_translation_entry_copy (te); g_assert_nonnull (te_copy); g_assert_true (MODULEMD_IS_TRANSLATION_ENTRY (te_copy)); g_assert_cmpstr ( modulemd_translation_entry_get_locale (te_copy), ==, "en_GB"); g_assert_cmpstr ( modulemd_translation_entry_get_summary (te_copy), ==, "foobar"); g_assert_cmpstr ( modulemd_translation_entry_get_description (te_copy), ==, "barfoo"); profile_names = modulemd_translation_entry_get_profiles_as_strv (te_copy); g_assert_nonnull (profile_names); g_assert_cmpint (g_strv_length (profile_names), ==, 0); g_assert_null ( modulemd_translation_entry_get_profile_description (te_copy, "test")); g_clear_pointer (&profile_names, g_strfreev); g_clear_object (&te); g_clear_object (&te_copy); /* Test copying a translation entry with a summary, description and a profile */ te = modulemd_translation_entry_new ("en_GB"); modulemd_translation_entry_set_summary (te, "foobar"); modulemd_translation_entry_set_description (te, "barfoo"); modulemd_translation_entry_set_profile_description (te, "test", "brown fox"); g_assert_nonnull (te); g_assert_true (MODULEMD_IS_TRANSLATION_ENTRY (te)); g_assert_cmpstr (modulemd_translation_entry_get_locale (te), ==, "en_GB"); g_assert_cmpstr (modulemd_translation_entry_get_summary (te), ==, "foobar"); g_assert_cmpstr ( modulemd_translation_entry_get_description (te), ==, "barfoo"); profile_names = modulemd_translation_entry_get_profiles_as_strv (te); g_assert_nonnull (profile_names); g_assert_cmpint (g_strv_length (profile_names), ==, 1); g_assert_cmpstr ( modulemd_translation_entry_get_profile_description (te, "test"), ==, "brown fox"); g_clear_pointer (&profile_names, g_strfreev); te_copy = modulemd_translation_entry_copy (te); g_assert_nonnull (te_copy); g_assert_true (MODULEMD_IS_TRANSLATION_ENTRY (te_copy)); g_assert_cmpstr ( modulemd_translation_entry_get_locale (te_copy), ==, "en_GB"); g_assert_cmpstr ( modulemd_translation_entry_get_summary (te_copy), ==, "foobar"); g_assert_cmpstr ( modulemd_translation_entry_get_description (te_copy), ==, "barfoo"); profile_names = modulemd_translation_entry_get_profiles_as_strv (te_copy); g_assert_nonnull (profile_names); g_assert_cmpint (g_strv_length (profile_names), ==, 1); g_assert_cmpstr ( modulemd_translation_entry_get_profile_description (te_copy, "test"), ==, "brown fox"); g_clear_pointer (&profile_names, g_strfreev); g_clear_object (&te); g_clear_object (&te_copy); } static void translation_entry_test_get_locale (void) { g_autoptr (ModulemdTranslationEntry) te = NULL; g_autofree gchar *locale; te = modulemd_translation_entry_new ("en_US"); g_assert_nonnull (te); g_assert_true (MODULEMD_IS_TRANSLATION_ENTRY (te)); g_assert_cmpstr (modulemd_translation_entry_get_locale (te), ==, "en_US"); g_object_get (te, "locale", &locale, NULL); g_assert_cmpstr (locale, ==, "en_US"); /* Test that locale is immutable */ signaled = FALSE; signal (SIGTRAP, sigtrap_handler); g_object_set (te, "locale", "en_GB", NULL); g_assert_true (signaled); } static void translation_entry_test_get_set_summary (void) { g_autoptr (ModulemdTranslationEntry) te = NULL; g_autofree gchar *summary; te = modulemd_translation_entry_new ("en_US"); g_assert_nonnull (te); g_assert_true (MODULEMD_IS_TRANSLATION_ENTRY (te)); /* Check that summary is empty */ g_assert_null (modulemd_translation_entry_get_summary (te)); g_object_get (te, "summary", &summary, NULL); g_assert_null (summary); g_clear_pointer (&summary, g_free); /* Set a summary */ modulemd_translation_entry_set_summary (te, "foobar"); g_assert_cmpstr (modulemd_translation_entry_get_summary (te), ==, "foobar"); g_object_get (te, "summary", &summary, NULL); g_assert_cmpstr (summary, ==, "foobar"); g_clear_pointer (&summary, g_free); /* Clear the summary */ modulemd_translation_entry_set_summary (te, NULL); g_assert_null (modulemd_translation_entry_get_summary (te)); g_object_get (te, "summary", &summary, NULL); g_assert_null (summary); g_clear_pointer (&summary, g_free); /* Try setting summary to unicode */ modulemd_translation_entry_set_summary (te, "��"); g_assert_cmpstr (modulemd_translation_entry_get_summary (te), ==, "��"); g_object_get (te, "summary", &summary, NULL); g_assert_cmpstr (summary, ==, "��"); g_clear_pointer (&summary, g_free); } static void translation_entry_test_get_set_description (void) { g_autoptr (ModulemdTranslationEntry) te = NULL; g_autofree gchar *description; te = modulemd_translation_entry_new ("en_US"); g_assert_nonnull (te); g_assert_true (MODULEMD_IS_TRANSLATION_ENTRY (te)); /* Check that description is empty */ g_assert_null (modulemd_translation_entry_get_description (te)); g_object_get (te, "description", &description, NULL); g_assert_null (description); g_clear_pointer (&description, g_free); /* Set a description */ modulemd_translation_entry_set_description (te, "foobar"); g_assert_cmpstr ( modulemd_translation_entry_get_description (te), ==, "foobar"); g_object_get (te, "description", &description, NULL); g_assert_cmpstr (description, ==, "foobar"); g_clear_pointer (&description, g_free); /* Clear the description */ modulemd_translation_entry_set_description (te, NULL); g_assert_null (modulemd_translation_entry_get_description (te)); g_object_get (te, "description", &description, NULL); g_assert_null (description); g_clear_pointer (&description, g_free); /* Try setting description to unicode */ modulemd_translation_entry_set_description (te, "��"); g_assert_cmpstr (modulemd_translation_entry_get_description (te), ==, "��"); g_object_get (te, "description", &description, NULL); g_assert_cmpstr (description, ==, "��"); g_clear_pointer (&description, g_free); } static void translation_entry_test_profile_descriptions (void) { g_autoptr (ModulemdTranslationEntry) te = NULL; g_auto (GStrv) profile_names = NULL; te = modulemd_translation_entry_new ("en_US"); g_assert_nonnull (te); g_assert_true (MODULEMD_IS_TRANSLATION_ENTRY (te)); /* Assert we start with 0 profiles */ profile_names = modulemd_translation_entry_get_profiles_as_strv (te); g_assert_cmpint (g_strv_length (profile_names), ==, 0); g_assert_false (g_strv_contains ((const gchar **)profile_names, "test1")); g_assert_false (g_strv_contains ((const gchar **)profile_names, "test2")); g_assert_null ( modulemd_translation_entry_get_profile_description (te, "test1")); g_assert_null ( modulemd_translation_entry_get_profile_description (te, "test2")); g_clear_pointer (&profile_names, g_strfreev); /* Add a profile */ modulemd_translation_entry_set_profile_description (te, "test1", "foobar"); profile_names = modulemd_translation_entry_get_profiles_as_strv (te); g_assert_cmpint (g_strv_length (profile_names), ==, 1); g_assert_true (g_strv_contains ((const gchar **)profile_names, "test1")); g_assert_false (g_strv_contains ((const gchar **)profile_names, "test2")); g_assert_cmpstr ( modulemd_translation_entry_get_profile_description (te, "test1"), ==, "foobar"); g_assert_null ( modulemd_translation_entry_get_profile_description (te, "test2")); g_clear_pointer (&profile_names, g_strfreev); /* Add a second profile */ modulemd_translation_entry_set_profile_description (te, "test2", "barfoo"); profile_names = modulemd_translation_entry_get_profiles_as_strv (te); g_assert_cmpint (g_strv_length (profile_names), ==, 2); g_assert_true (g_strv_contains ((const gchar **)profile_names, "test1")); g_assert_true (g_strv_contains ((const gchar **)profile_names, "test2")); g_assert_cmpstr ( modulemd_translation_entry_get_profile_description (te, "test1"), ==, "foobar"); g_assert_cmpstr ( modulemd_translation_entry_get_profile_description (te, "test2"), ==, "barfoo"); g_clear_pointer (&profile_names, g_strfreev); } static void translation_entry_test_parse_yaml (void) { g_autoptr (ModulemdTranslationEntry) te = NULL; g_autoptr (GError) error = NULL; MMD_INIT_YAML_PARSER (parser); g_autofree gchar *yaml_path = NULL; g_auto (GStrv) profile_names = NULL; g_autoptr (FILE) yaml_stream = NULL; yaml_path = g_strdup_printf ("%s/te.yaml", g_getenv ("TEST_DATA_PATH")); g_assert_nonnull (yaml_path); yaml_stream = g_fopen (yaml_path, "rbe"); g_assert_nonnull (yaml_stream); yaml_parser_set_input_file (&parser, yaml_stream); /* Advance the parser past STREAM_START and DOCUMENT_START */ parser_skip_document_start (&parser); te = modulemd_translation_entry_parse_yaml (&parser, "en_GB", TRUE, &error); g_assert_nonnull (te); g_assert_true (MODULEMD_IS_TRANSLATION_ENTRY (te)); g_assert_cmpstr (modulemd_translation_entry_get_locale (te), ==, "en_GB"); g_assert_cmpstr ( modulemd_translation_entry_get_summary (te), ==, "An example module"); g_assert_cmpstr ( modulemd_translation_entry_get_description (te), ==, "An example module."); profile_names = modulemd_translation_entry_get_profiles_as_strv (te); g_assert_cmpint (g_strv_length (profile_names), ==, 1); g_assert_cmpstr ( modulemd_translation_entry_get_profile_description (te, "profile_a"), ==, "An example profile"); } static void translation_entry_test_emit_yaml (void) { g_autoptr (ModulemdTranslationEntry) te = NULL; g_autoptr (GError) error = NULL; MMD_INIT_YAML_EMITTER (emitter); MMD_INIT_YAML_STRING (&emitter, yaml_string); te = modulemd_translation_entry_new ("en_GB"); g_assert_true (mmd_emitter_start_stream (&emitter, &error)); g_assert_true (mmd_emitter_start_document (&emitter, &error)); g_assert_true ( mmd_emitter_start_mapping (&emitter, YAML_BLOCK_MAPPING_STYLE, &error)); g_assert_true (modulemd_translation_entry_emit_yaml (te, &emitter, &error)); g_assert_true (mmd_emitter_end_mapping (&emitter, &error)); g_assert_true (mmd_emitter_end_document (&emitter, &error)); g_assert_true (mmd_emitter_end_stream (&emitter, &error)); g_assert_cmpstr (yaml_string->str, ==, "---\n" "en_GB: {}\n" "...\n"); g_clear_pointer (&yaml_string, modulemd_yaml_string_free); yaml_emitter_delete (&emitter); yaml_emitter_initialize (&emitter); yaml_string = g_malloc0_n (1, sizeof (modulemd_yaml_string)); yaml_emitter_set_output (&emitter, write_yaml_string, (void *)yaml_string); modulemd_translation_entry_set_summary (te, "An example module"); modulemd_translation_entry_set_description (te, "An example module."); modulemd_translation_entry_set_profile_description ( te, "profile_a", "An example profile"); g_assert_true (mmd_emitter_start_stream (&emitter, &error)); g_assert_true (mmd_emitter_start_document (&emitter, &error)); g_assert_true ( mmd_emitter_start_mapping (&emitter, YAML_BLOCK_MAPPING_STYLE, &error)); g_assert_true (modulemd_translation_entry_emit_yaml (te, &emitter, &error)); g_assert_true (mmd_emitter_end_mapping (&emitter, &error)); g_assert_true (mmd_emitter_end_document (&emitter, &error)); g_assert_true (mmd_emitter_end_stream (&emitter, &error)); g_assert_cmpstr (yaml_string->str, ==, "---\n" "en_GB:\n" " summary: An example module\n" " description: An example module.\n" " profiles:\n" " profile_a: An example profile\n" "...\n"); } static void translation_entry_test_quoting_yaml (void) { g_autoptr (ModulemdTranslationEntry) te = NULL; g_autoptr (GError) error = NULL; MMD_INIT_YAML_EMITTER (emitter); MMD_INIT_YAML_STRING (&emitter, yaml_string); te = modulemd_translation_entry_new ("0"); modulemd_translation_entry_set_summary (te, "1"); modulemd_translation_entry_set_description (te, "2"); modulemd_translation_entry_set_profile_description (te, "3", "4"); g_assert_true (mmd_emitter_start_stream (&emitter, &error)); g_assert_true (mmd_emitter_start_document (&emitter, &error)); g_assert_true ( mmd_emitter_start_mapping (&emitter, YAML_BLOCK_MAPPING_STYLE, &error)); g_assert_true (modulemd_translation_entry_emit_yaml (te, &emitter, &error)); g_assert_true (mmd_emitter_end_mapping (&emitter, &error)); g_assert_true (mmd_emitter_end_document (&emitter, &error)); g_assert_true (mmd_emitter_end_stream (&emitter, &error)); g_assert_cmpstr (yaml_string->str, ==, "---\n" "\"0\":\n" " summary: \"1\"\n" " description: \"2\"\n" " profiles:\n" " \"3\": \"4\"\n" "...\n"); } int main (int argc, char *argv[]) { setlocale (LC_ALL, ""); g_test_init (&argc, &argv, NULL); g_test_bug_base ("https://bugzilla.redhat.com/show_bug.cgi?id="); // Define the tests. g_test_add_func ("/modulemd/v2/translationentry/construct", translation_entry_test_construct); g_test_add_func ("/modulemd/v2/translationentry/copy", translation_entry_test_copy); g_test_add_func ("/modulemd/v2/translationentry/get_locale", translation_entry_test_get_locale); g_test_add_func ("/modulemd/v2/translationentry/get_set_summary", translation_entry_test_get_set_summary); g_test_add_func ("/modulemd/v2/translationentry/get_set_description", translation_entry_test_get_set_description); g_test_add_func ("/modulemd/v2/translationentry/profile_descriptions", translation_entry_test_profile_descriptions); g_test_add_func ("/modulemd/v2/translationentry/yaml/parse", translation_entry_test_parse_yaml); g_test_add_func ("/modulemd/v2/translationentry/yaml/emit", translation_entry_test_emit_yaml); g_test_add_func ("/modulemd/v2/translationentry/yaml/quoting", translation_entry_test_quoting_yaml); return g_test_run (); } fedora-modularity-libmodulemd-357799c/modulemd/tests/test-modulemd-translation.c000066400000000000000000000355601502446517500302050ustar00rootroot00000000000000/* * This file is part of libmodulemd * Copyright (C) 2018 Red Hat, Inc. * * Fedora-License-Identifier: MIT * SPDX-2.0-License-Identifier: MIT * SPDX-3.0-License-Identifier: MIT * * This program is free software. * For more information on the license, see COPYING. * For more information on free software, see . */ #include #include #include #include #include "modulemd-subdocument-info.h" #include "modulemd-translation-entry.h" #include "modulemd-translation.h" #include "private/glib-extensions.h" #include "private/modulemd-subdocument-info-private.h" #include "private/modulemd-translation-private.h" #include "private/modulemd-util.h" #include "private/modulemd-yaml.h" #include "private/test-utils.h" typedef struct _TranslationFixture { } TranslationFixture; gboolean signaled = FALSE; static void sigtrap_handler (int UNUSED (sig_num)) { signaled = TRUE; } static void translation_test_construct (void) { g_autoptr (ModulemdTranslation) t = NULL; g_auto (GStrv) locales = NULL; guint64 translation_version = 1; guint64 modified = 3; /* Test that the new() function works */ t = modulemd_translation_new (1, "testmodule", "teststream", 2); g_assert_nonnull (t); g_assert_true (MODULEMD_IS_TRANSLATION (t)); g_assert_cmpint (modulemd_translation_get_version (t), ==, 1); g_assert_cmpstr (modulemd_translation_get_module_name (t), ==, "testmodule"); g_assert_cmpstr ( modulemd_translation_get_module_stream (t), ==, "teststream"); g_assert_cmpint (modulemd_translation_get_modified (t), ==, 2); locales = modulemd_translation_get_locales_as_strv (t); g_assert_nonnull (locales); g_assert_cmpint (g_strv_length (locales), ==, 0); g_clear_object (&t); /* Test that object_new works */ // clang-format off t = g_object_new (MODULEMD_TYPE_TRANSLATION, "version", translation_version, "module_name", "testmod", "module_stream", "teststr", NULL); //clang-format on g_assert_nonnull (t); g_assert_true (MODULEMD_IS_TRANSLATION (t)); g_assert_cmpint (modulemd_translation_get_version (t), ==, 1); g_assert_cmpstr (modulemd_translation_get_module_name (t), ==, "testmod"); g_assert_cmpstr (modulemd_translation_get_module_stream (t), ==, "teststr"); g_assert_cmpint (modulemd_translation_get_modified (t), ==, 0); g_clear_object (&t); /* Test that object_new works with modified */ // clang-format off t = g_object_new (MODULEMD_TYPE_TRANSLATION, "version", translation_version, "module_name", "testmod", "module_stream", "teststr", "modified", modified, NULL); // clang-format on g_assert_nonnull (t); g_assert_true (MODULEMD_IS_TRANSLATION (t)); g_assert_cmpint ( modulemd_translation_get_version (t), ==, translation_version); g_assert_cmpstr (modulemd_translation_get_module_name (t), ==, "testmod"); g_assert_cmpstr (modulemd_translation_get_module_stream (t), ==, "teststr"); g_assert_cmpint (modulemd_translation_get_modified (t), ==, modified); g_clear_object (&t); /* Test that object_new does not work without a version */ signaled = FALSE; signal (SIGTRAP, sigtrap_handler); // clang-format off t = g_object_new (MODULEMD_TYPE_TRANSLATION, "module_name", "testmod", "module_stream", "teststr", NULL); // clang-format on g_assert_true (signaled); g_clear_object (&t); /* Test that object_new does not work without a name */ signaled = FALSE; signal (SIGTRAP, sigtrap_handler); // clang-format off t = g_object_new (MODULEMD_TYPE_TRANSLATION, "version", translation_version, "module_stream", "teststr", NULL); // clang-format on g_assert_true (signaled); g_clear_object (&t); /* Test that object_new does not work without a stream */ signaled = FALSE; signal (SIGTRAP, sigtrap_handler); // clang-format off t = g_object_new (MODULEMD_TYPE_TRANSLATION, "version", translation_version, "module_name", "testmod", NULL); // clang-format on g_assert_true (signaled); g_clear_object (&t); } static void translation_test_copy (void) { g_autoptr (ModulemdTranslation) t = NULL; g_autoptr (ModulemdTranslation) t_copy = NULL; ModulemdTranslationEntry *te = NULL; g_auto (GStrv) locales = NULL; t = modulemd_translation_new (1, "testmod", "teststr", 5); g_assert_nonnull (t); g_assert_true (MODULEMD_IS_TRANSLATION (t)); g_assert_cmpint (modulemd_translation_get_version (t), ==, 1); g_assert_cmpstr (modulemd_translation_get_module_name (t), ==, "testmod"); g_assert_cmpstr (modulemd_translation_get_module_stream (t), ==, "teststr"); g_assert_cmpint (modulemd_translation_get_modified (t), ==, 5); t_copy = modulemd_translation_copy (t); g_assert_nonnull (t_copy); g_assert_true (MODULEMD_IS_TRANSLATION (t_copy)); g_assert_cmpint (modulemd_translation_get_version (t_copy), ==, 1); g_assert_cmpstr ( modulemd_translation_get_module_name (t_copy), ==, "testmod"); g_assert_cmpstr ( modulemd_translation_get_module_stream (t_copy), ==, "teststr"); g_assert_cmpint (modulemd_translation_get_modified (t_copy), ==, 5); g_clear_object (&t_copy); te = modulemd_translation_entry_new ("en_US"); modulemd_translation_entry_set_summary (te, "Some summary"); modulemd_translation_set_translation_entry (t, te); g_clear_pointer (&te, g_object_unref); t_copy = modulemd_translation_copy (t); g_assert_nonnull (t_copy); g_assert_true (MODULEMD_IS_TRANSLATION (t_copy)); g_assert_cmpint (modulemd_translation_get_version (t_copy), ==, 1); g_assert_cmpstr ( modulemd_translation_get_module_name (t_copy), ==, "testmod"); g_assert_cmpstr ( modulemd_translation_get_module_stream (t_copy), ==, "teststr"); g_assert_cmpint (modulemd_translation_get_modified (t_copy), ==, 5); locales = modulemd_translation_get_locales_as_strv (t_copy); g_assert_nonnull (locales); g_assert_cmpint (g_strv_length (locales), ==, 1); g_assert_cmpstr (locales[0], ==, "en_US"); te = modulemd_translation_get_translation_entry (t_copy, "en_US"); g_assert_nonnull (te); g_assert_cmpstr ( modulemd_translation_entry_get_summary (te), ==, "Some summary"); } static void translation_test_validate (void) { g_autoptr (ModulemdTranslation) t = NULL; g_autoptr (GError) error = NULL; /* Valid, but empty translation */ t = modulemd_translation_new (1, "testmodule", "teststream", 5); g_assert_nonnull (t); g_assert_true (modulemd_translation_validate (t, &error)); g_assert_null (error); g_clear_object (&t); /* No modified value set */ t = modulemd_translation_new (1, "testmodule", "teststream", 0); g_assert_nonnull (t); g_assert_false (modulemd_translation_validate (t, &error)); g_assert_nonnull (error); g_assert_error (error, MODULEMD_ERROR, MMD_ERROR_VALIDATE); g_clear_object (&t); } static void translation_test_set_modified (void) { g_autoptr (ModulemdTranslation) t = NULL; t = modulemd_translation_new (1, "testmodule", "teststream", 0); g_assert_cmpint (modulemd_translation_get_modified (t), ==, 0); modulemd_translation_set_modified (t, 42); g_assert_cmpint (modulemd_translation_get_modified (t), ==, 42); modulemd_translation_set_modified (t, 0); g_assert_cmpint (modulemd_translation_get_modified (t), ==, 0); } static void translation_test_translations (void) { g_autoptr (ModulemdTranslation) t = NULL; ModulemdTranslationEntry *te = NULL; g_auto (GStrv) locales = NULL; t = modulemd_translation_new (1, "testmodule", "teststream", 5); te = modulemd_translation_entry_new ("en_US"); modulemd_translation_entry_set_summary (te, "Some summary"); modulemd_translation_set_translation_entry (t, te); g_clear_pointer (&te, g_object_unref); locales = modulemd_translation_get_locales_as_strv (t); g_assert_nonnull (locales); g_assert_cmpint (g_strv_length (locales), ==, 1); g_assert_cmpstr (locales[0], ==, "en_US"); te = modulemd_translation_get_translation_entry (t, "en_US"); g_assert_nonnull (te); g_assert_cmpstr ( modulemd_translation_entry_get_summary (te), ==, "Some summary"); } static void translation_test_parse_yaml (void) { MMD_INIT_YAML_PARSER (parser); MMD_INIT_YAML_EVENT (event); g_autofree gchar *yaml_path = NULL; g_autoptr (ModulemdTranslation) t = NULL; int yaml_ret; g_autoptr (FILE) yaml_stream = NULL; g_autoptr (GError) error = NULL; g_autoptr (ModulemdSubdocumentInfo) subdoc = NULL; /* Validate that we can read the specification without issues */ yaml_path = g_strdup_printf ("%s/yaml_specs/modulemd_translations_v1.yaml", g_getenv ("MESON_SOURCE_ROOT")); g_assert_nonnull (yaml_path); yaml_stream = g_fopen (yaml_path, "rbe"); g_assert_nonnull (yaml_stream); yaml_parser_set_input_file (&parser, yaml_stream); /* The first event must be the stream start */ yaml_ret = yaml_parser_parse (&parser, &event); g_assert_true (yaml_ret); g_assert_cmpint (event.type, ==, YAML_STREAM_START_EVENT); yaml_event_delete (&event); /* The second event must be the document start */ yaml_ret = yaml_parser_parse (&parser, &event); g_assert_true (yaml_ret); g_assert_cmpint (event.type, ==, YAML_DOCUMENT_START_EVENT); yaml_event_delete (&event); subdoc = modulemd_yaml_parse_document_type (&parser); g_assert_nonnull (subdoc); g_assert_null (modulemd_subdocument_info_get_gerror (subdoc)); g_assert_cmpint (modulemd_subdocument_info_get_doctype (subdoc), ==, MODULEMD_YAML_DOC_TRANSLATIONS); g_assert_cmpint (modulemd_subdocument_info_get_mdversion (subdoc), ==, 1); g_assert_nonnull (modulemd_subdocument_info_get_yaml (subdoc)); t = modulemd_translation_parse_yaml (subdoc, TRUE, &error); g_assert_no_error (error); g_assert_null (error); g_assert_nonnull (t); g_assert_true (modulemd_translation_validate (t, &error)); g_assert_null (error); g_assert_cmpint (modulemd_translation_get_version (t), ==, modulemd_subdocument_info_get_mdversion (subdoc)); } static void translation_test_emit_yaml (void) { MMD_INIT_YAML_EMITTER (emitter); MMD_INIT_YAML_EVENT (event); MMD_INIT_YAML_STRING (&emitter, yaml_string); g_autoptr (GError) error = NULL; g_autoptr (ModulemdTranslation) t = NULL; g_autoptr (ModulemdTranslationEntry) te = NULL; t = modulemd_translation_new (1, "testmodule", "teststream", 42); g_assert_true (mmd_emitter_start_stream (&emitter, &error)); g_assert_true (modulemd_translation_emit_yaml (t, &emitter, &error)); g_assert_true (mmd_emitter_end_stream (&emitter, &error)); g_assert_nonnull (yaml_string->str); g_assert_cmpstr (yaml_string->str, ==, "---\n" "document: modulemd-translations\n" "version: 1\n" "data:\n" " module: testmodule\n" " stream: \"teststream\"\n" " modified: 42\n" "...\n"); te = modulemd_translation_entry_new ("en_US"); modulemd_translation_entry_set_summary (te, "Some summary"); modulemd_translation_entry_set_description (te, "Test description"); modulemd_translation_entry_set_profile_description ( te, "testprofile", "Test Profile Description"); modulemd_translation_set_translation_entry (t, te); g_clear_pointer (&te, g_object_unref); MMD_REINIT_YAML_STRING (&emitter, yaml_string); g_assert_true (mmd_emitter_start_stream (&emitter, &error)); g_assert_true (modulemd_translation_emit_yaml (t, &emitter, &error)); g_assert_true (mmd_emitter_end_stream (&emitter, &error)); g_assert_nonnull (yaml_string->str); g_assert_cmpstr (yaml_string->str, ==, "---\n" "document: modulemd-translations\n" "version: 1\n" "data:\n" " module: testmodule\n" " stream: \"teststream\"\n" " modified: 42\n" " translations:\n" " en_US:\n" " summary: Some summary\n" " description: Test description\n" " profiles:\n" " testprofile: Test Profile Description\n" "...\n"); } static void translation_test_quoting (void) { MMD_INIT_YAML_EMITTER (emitter); MMD_INIT_YAML_EVENT (event); MMD_INIT_YAML_STRING (&emitter, yaml_string); g_autoptr (GError) error = NULL; g_autoptr (ModulemdTranslation) t = NULL; g_autoptr (ModulemdTranslationEntry) te = NULL; t = modulemd_translation_new (1, "0", "1", 42); te = modulemd_translation_entry_new ("2"); modulemd_translation_entry_set_summary (te, "3"); modulemd_translation_entry_set_description (te, "4"); modulemd_translation_entry_set_profile_description (te, "5", "6"); modulemd_translation_set_translation_entry (t, te); g_assert_true (mmd_emitter_start_stream (&emitter, &error)); g_assert_true (modulemd_translation_emit_yaml (t, &emitter, &error)); g_assert_true (mmd_emitter_end_stream (&emitter, &error)); g_assert_nonnull (yaml_string->str); g_assert_cmpstr (yaml_string->str, ==, "---\n" "document: modulemd-translations\n" "version: 1\n" "data:\n" " module: \"0\"\n" " stream: \"1\"\n" " modified: 42\n" " translations:\n" " \"2\":\n" " summary: \"3\"\n" " description: \"4\"\n" " profiles:\n" " \"5\": \"6\"\n" "...\n"); } int main (int argc, char *argv[]) { setlocale (LC_ALL, ""); g_test_init (&argc, &argv, NULL); g_test_bug_base ("https://bugzilla.redhat.com/show_bug.cgi?id="); // Define the tests. g_test_add_func ("/modulemd/v2/translation/construct", translation_test_construct); g_test_add_func ("/modulemd/v2/translation/copy", translation_test_copy); g_test_add_func ("/modulemd/v2/translation/validate", translation_test_validate); g_test_add_func ("/modulemd/v2/translation/set_modified", translation_test_set_modified); g_test_add_func ("/modulemd/v2/translation/translations", translation_test_translations); g_test_add_func ("/modulemd/v2/translation/yaml/parse", translation_test_parse_yaml); g_test_add_func ("/modulemd/v2/translation/yaml/emit", translation_test_emit_yaml); g_test_add_func ("/modulemd/v2/translation/yaml/quoting", translation_test_quoting); return g_test_run (); } fedora-modularity-libmodulemd-357799c/modulemd/tests/test-modulemd-validator.c000066400000000000000000000125061502446517500276270ustar00rootroot00000000000000/* * This file is part of libmodulemd * Copyright (C) 2021 Red Hat, Inc. * * Fedora-License-Identifier: MIT * SPDX-2.0-License-Identifier: MIT * SPDX-3.0-License-Identifier: MIT * * This program is free software. * For more information on the license, see COPYING. * For more information on free software, see . */ #include "config.h" #include #include #include #include gint test_number = 0; gint failed = 0; gchar **validator_argv = NULL; gchar *validator_stdout = NULL; gchar *validator_stderr = NULL; gint validator_exit_status = 0; gint expected_exit_code = 0; gchar *expected_stdout = NULL; gchar *expected_stderr = NULL; static void ok (gboolean value, const gchar *name) { test_number++; if (value) { g_fprintf (stdout, "ok %d - %s\n", test_number, name); } else { failed++; g_fprintf (stdout, "not ok %d - %s\n", test_number, name); } } static void skip_n (gint tests, const gchar *reason) { while (tests-- > 0) { test_number++; if (!reason) reason = ""; g_fprintf (stdout, "ok %d # SKIP %s\n", test_number, reason); } } static void skip (const gchar *reason) { test_number++; if (!reason) reason = ""; g_fprintf (stdout, "ok %d # SKIP %s\n", test_number, reason); } static gboolean test_execute (void) { gboolean executed; g_autoptr (GError) error = NULL; g_autofree gchar *command = g_strjoinv (" ", validator_argv); g_fprintf (stdout, "# Executing: %s\n", command); executed = g_spawn_sync (NULL, validator_argv, NULL, G_SPAWN_SEARCH_PATH, NULL, NULL, &validator_stdout, &validator_stderr, &validator_exit_status, &error); ok (executed, "command executed"); if (error) { g_fprintf (stdout, "# Exec failed with: %s\n", error->message); } return executed; } static void test_stdout (void) { if (expected_stdout) { const gchar *found = g_strstr_len (validator_stdout, -1, expected_stdout); ok (NULL != found, "standard output conforms"); if (!found) g_fprintf (stdout, "# expected: %s\n# got: %s\n", expected_stdout, validator_stdout); } else { skip ("no check for standard output specified"); } } static void test_stderr (void) { if (expected_stderr) { const gchar *found = g_strstr_len (validator_stderr, -1, expected_stderr); ok (NULL != found, "error output conforms"); if (!found) g_fprintf (stderr, "# expected: %s\n# got: %s\n", expected_stderr, validator_stderr); } else { skip ("no check for error output specified"); } } static void test_exit_code (void) { g_autoptr (GError) error = NULL; g_autofree gchar *message = NULL; #ifdef HAVE_G_SPAWN_CHECK_WAIT_STATUS g_spawn_check_wait_status (validator_exit_status, &error); #else g_spawn_check_exit_status (validator_exit_status, &error); #endif message = g_strdup_printf ("exit code was %d", expected_exit_code); if (0 == expected_exit_code) ok (!error, message); else ok (error && error->domain == G_SPAWN_EXIT_ERROR && error->code == expected_exit_code, message); } int main (int argc, char *argv[]) { GOptionEntry entries[] = { { "code", '\0', G_OPTION_FLAG_NONE, G_OPTION_ARG_INT, &expected_exit_code, "Expected exit code (default is 0)", NULL }, { "stdout", '\0', G_OPTION_FLAG_NONE, G_OPTION_ARG_STRING, &expected_stdout, "Check standard output for a substring (default is no check)", NULL }, { "stderr", '\0', G_OPTION_FLAG_NONE, G_OPTION_ARG_STRING, &expected_stderr, "Check error output for a substring (default is no check)", NULL }, { 0 } }; GOptionContext *context; g_autoptr (GError) error = NULL; setlocale (LC_ALL, ""); /* "-- --help" is not handled as a non-option if g_test_init() is used. * Therefore this program does not Glib test frame work. */ context = g_option_context_new ( "MODULEMD_VALIDATOR_EXECUTABLE [MODULEMD_VALIDATOR_ARGUMENT...] - " "test modulemd-validator behavior"); g_option_context_add_main_entries (context, entries, NULL); if (!g_option_context_parse (context, &argc, &argv, &error)) { g_fprintf (stderr, "Could not parse arguments: %s\n", error->message); exit (EXIT_FAILURE); } g_option_context_free (context); validator_argv = argv + 1; if (!g_strcmp0 (validator_argv[0], "--")) { validator_argv++; } if (!validator_argv[0]) { g_fprintf (stderr, "No positional arguments.\n"); exit (EXIT_FAILURE); } g_fprintf (stdout, "1..4\n"); if (test_execute ()) { test_exit_code (); test_stdout (); test_stderr (); } else { skip_n (3, "program failed to execute"); } g_free (expected_stdout); g_free (expected_stderr); g_free (validator_stdout); g_free (validator_stderr); exit (failed ? EXIT_FAILURE : EXIT_SUCCESS); } fedora-modularity-libmodulemd-357799c/modulemd/tests/test-modulemd-variant_deep_copy.c000066400000000000000000000037021502446517500313330ustar00rootroot00000000000000/* * This file is part of libmodulemd * Copyright (C) 2025 Red Hat, Inc. * * Fedora-License-Identifier: MIT * SPDX-2.0-License-Identifier: MIT * SPDX-3.0-License-Identifier: MIT * * This program is free software. * For more information on the license, see COPYING. * For more information on free software, see . */ #include #include #include #include #include "private/modulemd-util.h" /* * modulemd_variant_deep_copy() triggered a GLib critical warning * from glib >= 2.84.1 when parsing a /data/xmd modulemd-stream-v2 element * with {} value (an empty flow mapping). This test exhibits that code path * and relies on G_DEBUG=fatal-criticals environment variable to crash the * test. * . */ static void test_empty_a_sv (void) { g_autoptr (GVariantDict) dictionary = NULL; /* g_variant_dict_end() does not free */ g_autoptr (GVariant) input = NULL; g_autoptr (GVariant) output = NULL; /* Build a GVariant with an empty dictionary, results to an "a{sv}" of * zero size. */ dictionary = g_variant_dict_new (NULL); input = g_variant_dict_end (dictionary); /* Exhibit the library. */ output = modulemd_variant_deep_copy (input); g_assert_true (output != NULL); /* Compare the content. */ g_assert_true (g_variant_get_type (output) == g_variant_get_type (input)); g_assert_true (g_variant_get_size (output) == g_variant_get_size (input)); } int main (int argc, char *argv[]) { setlocale (LC_ALL, ""); g_test_init (&argc, &argv, NULL); g_test_set_nonfatal_assertions (); if (!g_setenv ("G_DEBUG", "fatal-criticals", TRUE)) { g_fprintf (stderr, "Failed to set G_DEBUG environment variable.\n"); exit (EXIT_FAILURE); } g_test_add_func ("/modulemd/util/variant_deep_copy/empty_a{sv}", test_empty_a_sv); return g_test_run (); } fedora-modularity-libmodulemd-357799c/modulemd/tests/test-utils.c000066400000000000000000000026471502446517500252030ustar00rootroot00000000000000/* * This file is part of libmodulemd * Copyright (C) 2017-2018 Stephen Gallagher * * Fedora-License-Identifier: MIT * SPDX-2.0-License-Identifier: MIT * SPDX-3.0-License-Identifier: MIT * * This program is free software. * For more information on the license, see COPYING. * For more information on free software, see . */ #include #include #include #include "private/modulemd-yaml.h" #include "private/test-utils.h" int modulemd_test_signal; void modulemd_test_signal_handler (int sig_num) { modulemd_test_signal = sig_num; } void parser_skip_document_start (yaml_parser_t *parser) { int result; MMD_INIT_YAML_EVENT (event); /* Advance the parser past STREAM_START and DOCUMENT_START */ result = yaml_parser_parse (parser, &event); g_assert_cmpint (result, ==, 1); g_assert_cmpint (event.type, ==, YAML_STREAM_START_EVENT); result = yaml_parser_parse (parser, &event); g_assert_cmpint (result, ==, 1); g_assert_cmpint (event.type, ==, YAML_DOCUMENT_START_EVENT); } void parser_skip_headers (yaml_parser_t *parser) { int result; MMD_INIT_YAML_EVENT (event); /* Advance the parser past STREAM_START, DOCUMENT_START and MAPPING_START */ parser_skip_document_start (parser); result = yaml_parser_parse (parser, &event); g_assert_cmpint (result, ==, 1); g_assert_cmpint (event.type, ==, YAML_MAPPING_START_EVENT); } fedora-modularity-libmodulemd-357799c/modulemd/tests/test_data/000077500000000000000000000000001502446517500246615ustar00rootroot00000000000000fedora-modularity-libmodulemd-357799c/modulemd/tests/test_data/290.yaml000066400000000000000000000042271502446517500260640ustar00rootroot00000000000000document: modulemd version: 1 data: name: testmodule stream: main version: 20180205135154 context: 9c690d0e summary: A test module in all its beautiful beauty description: This module demonstrates how to write simple modulemd files And can be used for testing the build and release pipeline. ’ license: module: - DUMMY dependencies: buildrequires: platform: f28 requires: platform: f28 references: community: https://docs.pagure.org/modularity/ documentation: https://fedoraproject.org/wiki/Fedora_Packaging_Guidelines_for_Modules xmd: mbs: buildrequires: platform: filtered_rpms: [] ref: virtual stream: f28 version: '3' context: '00000000' commit: 65a7721ee4eff44d2a63fb8f3a8da6e944ab7f4d requires: platform: filtered_rpms: [] ref: virtual stream: f28 version: '3' rpms: perl-List-Compare: ref: ac0f3bccca9dcb8465c434ac4c38974bf6205c28 perl-Tangerine: ref: 7e96446223f1ad84a26c7cf23d6591cd9f6326c6 tangerine: ref: c0f9a7dbd8cf823a2bdc19eeeed20d22b0aa52bf mse: true scmurl: https://src.fedoraproject.org/modules/testmodule.git?#65a7721ee4eff44d2a63fb8f3a8da6e944ab7f4d profiles: default: rpms: - tangerine api: rpms: - perl-Tangerine - tangerine components: rpms: perl-List-Compare: rationale: A dependency of tangerine. repository: https://src.fedoraproject.org/rpms/perl-List-Compare ref: main cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-List-Compare tangerine: rationale: Provides API for this module. buildorder: 10 repository: https://src.fedoraproject.org/rpms/tangerine ref: main cache: http://pkgs.fedoraproject.org/repo/pkgs/tangerine perl-Tangerine: rationale: Provides API for this module and is a dependency of tangerine. repository: https://src.fedoraproject.org/rpms/perl-Tangerine ref: main cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-Tangerine fedora-modularity-libmodulemd-357799c/modulemd/tests/test_data/b.yaml000066400000000000000000000003071502446517500257660ustar00rootroot00000000000000--- rpms: macros: | %demomacro 1 %demomacro2 %{demomacro}23 whitelist: - fooscl-1-bar - fooscl-1-baz - xxx - xyz arches: [ppc64le, x86_64] ... fedora-modularity-libmodulemd-357799c/modulemd/tests/test_data/bad_defaults/000077500000000000000000000000001502446517500272765ustar00rootroot00000000000000fedora-modularity-libmodulemd-357799c/modulemd/tests/test_data/bad_defaults/meson-2.yaml000066400000000000000000000001551502446517500314430ustar00rootroot00000000000000document: modulemd-defaults version: 1 data: module: meson stream: old profiles: latest: [default] fedora-modularity-libmodulemd-357799c/modulemd/tests/test_data/bad_defaults/meson.yaml000066400000000000000000000001601502446517500313000ustar00rootroot00000000000000document: modulemd-defaults version: 1 data: module: meson stream: latest profiles: latest: [default] fedora-modularity-libmodulemd-357799c/modulemd/tests/test_data/bad_defaults/ninja.yaml000066400000000000000000000001601502446517500312560ustar00rootroot00000000000000document: modulemd-defaults version: 1 data: module: ninja stream: latest profiles: latest: [default] fedora-modularity-libmodulemd-357799c/modulemd/tests/test_data/bad_defaults/nodejs.yaml000066400000000000000000000002521502446517500314430ustar00rootroot00000000000000document: modulemd-defaults version: 1 data: modified: 201906261200 module: nodejs profiles: 8: [default] 10: [default] 12: [default] fedora-modularity-libmodulemd-357799c/modulemd/tests/test_data/bad_packager_v2.yaml000066400000000000000000000002501502446517500305340ustar00rootroot00000000000000--- document: modulemd-packager version: 2 data: summary: Trivial Summary description: >- Trivial Description #license: a missing license breaks validity ... fedora-modularity-libmodulemd-357799c/modulemd/tests/test_data/bad_packager_v3.yaml000066400000000000000000000003721502446517500305420ustar00rootroot00000000000000--- document: modulemd-packager version: 3 data: name: trivialname stream: trivialstream summary: Trivial Summary description: >- Trivial Description license: [DUMMY] configurations: - context: a2345678901 platform: foo ... fedora-modularity-libmodulemd-357799c/modulemd/tests/test_data/bad_stream_v1.yaml000066400000000000000000000003601502446517500302530ustar00rootroot00000000000000--- document: modulemd version: 1 data: name: trivialname stream: trivialstream summary: Trivial Summary description: >- Trivial Description license: module: [DUMMY] artifacts: rpms: - "MissingEpoch-0-0.src" ... fedora-modularity-libmodulemd-357799c/modulemd/tests/test_data/bad_stream_v2.yaml000066400000000000000000000003421502446517500302540ustar00rootroot00000000000000--- document: modulemd version: 2 data: name: trivialname stream: trivialstream summary: Trivial Summary description: >- Trivial Description license: module: [DUMMY] static_context: true context: '-' ... fedora-modularity-libmodulemd-357799c/modulemd/tests/test_data/bad_translations_v1.yaml000066400000000000000000000001731502446517500315030ustar00rootroot00000000000000document: modulemd-translations version: 1 data: module: foo stream: bar modified: 42invalid translations: fedora-modularity-libmodulemd-357799c/modulemd/tests/test_data/broken_stream.yaml000066400000000000000000000000631502446517500303770ustar00rootroot00000000000000--- document: modulemd version: 2 data: foobar ... fedora-modularity-libmodulemd-357799c/modulemd/tests/test_data/buildafter/000077500000000000000000000000001502446517500270025ustar00rootroot00000000000000both_same_component_v2.yaml000066400000000000000000000025431502446517500342450ustar00rootroot00000000000000fedora-modularity-libmodulemd-357799c/modulemd/tests/test_data/buildafter--- document: modulemd version: 2 data: summary: Javascript runtime description: >- Node.js is a platform built on Chrome''s JavaScript runtime for easily building fast, scalable network applications. Node.js uses an event-driven, non-blocking I/O model that makes it lightweight and efficient, perfect for data-intensive real-time applications that run across distributed devices. license: module: - MIT dependencies: - buildrequires: platform: [ ] requires: platform: [ ] references: community: http://nodejs.org documentation: http://nodejs.org/en/docs tracker: https://github.com/nodejs/node/issues profiles: default: rpms: - nodejs - npm development: rpms: - nodejs - nodejs-devel - npm minimal: rpms: - nodejs api: rpms: - nodejs - nodejs-devel - npm components: rpms: libuv: rationale: Platform abstraction layer for Node.js ref: 1 http-parser: rationale: Needed for parsing HTTP requests ref: main nghttp2: rationale: Needed for HTTP2 support ref: main nodejs: rationale: Javascript runtime and npm package manager. ref: 10 buildorder: 30 buildafter: - libuv - http-parser - nghttp2 ... fedora-modularity-libmodulemd-357799c/modulemd/tests/test_data/buildafter/good_buildafter_v2.yaml000066400000000000000000000025141502446517500334300ustar00rootroot00000000000000--- document: modulemd version: 2 data: summary: Javascript runtime description: >- Node.js is a platform built on Chrome''s JavaScript runtime for easily building fast, scalable network applications. Node.js uses an event-driven, non-blocking I/O model that makes it lightweight and efficient, perfect for data-intensive real-time applications that run across distributed devices. license: module: - MIT dependencies: - buildrequires: platform: [ ] requires: platform: [ ] references: community: http://nodejs.org documentation: http://nodejs.org/en/docs tracker: https://github.com/nodejs/node/issues profiles: default: rpms: - nodejs - npm development: rpms: - nodejs - nodejs-devel - npm minimal: rpms: - nodejs api: rpms: - nodejs - nodejs-devel - npm components: rpms: libuv: rationale: Platform abstraction layer for Node.js ref: 1 http-parser: rationale: Needed for parsing HTTP requests ref: main nghttp2: rationale: Needed for HTTP2 support ref: main nodejs: rationale: Javascript runtime and npm package manager. ref: 10 buildafter: - libuv - http-parser - nghttp2 ... fedora-modularity-libmodulemd-357799c/modulemd/tests/test_data/buildafter/invalid_key_v2.yaml000066400000000000000000000025401502446517500325740ustar00rootroot00000000000000--- document: modulemd version: 2 data: summary: Javascript runtime description: >- Node.js is a platform built on Chrome''s JavaScript runtime for easily building fast, scalable network applications. Node.js uses an event-driven, non-blocking I/O model that makes it lightweight and efficient, perfect for data-intensive real-time applications that run across distributed devices. license: module: - MIT dependencies: - buildrequires: platform: [ ] requires: platform: [ ] references: community: http://nodejs.org documentation: http://nodejs.org/en/docs tracker: https://github.com/nodejs/node/issues profiles: default: rpms: - nodejs - npm development: rpms: - nodejs - nodejs-devel - npm minimal: rpms: - nodejs api: rpms: - nodejs - nodejs-devel - npm components: rpms: libuv: rationale: Platform abstraction layer for Node.js ref: 1 http-parser: rationale: Needed for parsing HTTP requests ref: main nghttp2: rationale: Needed for HTTP2 support ref: main nodejs: rationale: Javascript runtime and npm package manager. ref: 10 buildafter: - libuv - http-parser - nghttp2 - nosuchkey ... fedora-modularity-libmodulemd-357799c/modulemd/tests/test_data/buildafter/mixed_buildorder_v2.yaml000066400000000000000000000025531502446517500336230ustar00rootroot00000000000000--- document: modulemd version: 2 data: summary: Javascript runtime description: >- Node.js is a platform built on Chrome''s JavaScript runtime for easily building fast, scalable network applications. Node.js uses an event-driven, non-blocking I/O model that makes it lightweight and efficient, perfect for data-intensive real-time applications that run across distributed devices. license: module: - MIT dependencies: - buildrequires: platform: [ ] requires: platform: [ ] references: community: http://nodejs.org documentation: http://nodejs.org/en/docs tracker: https://github.com/nodejs/node/issues profiles: default: rpms: - nodejs - npm development: rpms: - nodejs - nodejs-devel - npm minimal: rpms: - nodejs api: rpms: - nodejs - nodejs-devel - npm components: rpms: libuv: rationale: Platform abstraction layer for Node.js ref: 1 buildorder: 10 http-parser: rationale: Needed for parsing HTTP requests ref: main buildorder: 10 nghttp2: rationale: Needed for HTTP2 support ref: main buildorder: 10 nodejs: rationale: Javascript runtime and npm package manager. ref: 10 buildafter: - libuv ... fedora-modularity-libmodulemd-357799c/modulemd/tests/test_data/buildarches/000077500000000000000000000000001502446517500271465ustar00rootroot00000000000000fedora-modularity-libmodulemd-357799c/modulemd/tests/test_data/buildarches/bad_combo_arches_v2.yaml000066400000000000000000000025321502446517500336750ustar00rootroot00000000000000--- document: modulemd version: 2 data: summary: Javascript runtime description: >- Node.js is a platform built on Chrome''s JavaScript runtime for easily building fast, scalable network applications. Node.js uses an event-driven, non-blocking I/O model that makes it lightweight and efficient, perfect for data-intensive real-time applications that run across distributed devices. license: module: - MIT dependencies: - buildrequires: platform: [ ] requires: platform: [ ] references: community: http://nodejs.org documentation: http://nodejs.org/en/docs tracker: https://github.com/nodejs/node/issues profiles: default: rpms: - nodejs - npm development: rpms: - nodejs - nodejs-devel - npm minimal: rpms: - nodejs api: rpms: - nodejs - nodejs-devel - npm buildopts: arches: [aarch64, ppc64le, s390x, x86_64] components: rpms: libuv: rationale: Platform abstraction layer for Node.js ref: 1 http-parser: rationale: Needed for parsing HTTP requests ref: main arches: [i686, x86_64] nghttp2: rationale: Needed for HTTP2 support ref: main nodejs: rationale: Javascript runtime and npm package manager. ref: 10 ... fedora-modularity-libmodulemd-357799c/modulemd/tests/test_data/buildarches/good_combo_arches_v2.yaml000066400000000000000000000025351502446517500341020ustar00rootroot00000000000000--- document: modulemd version: 2 data: summary: Javascript runtime description: >- Node.js is a platform built on Chrome''s JavaScript runtime for easily building fast, scalable network applications. Node.js uses an event-driven, non-blocking I/O model that makes it lightweight and efficient, perfect for data-intensive real-time applications that run across distributed devices. license: module: - MIT dependencies: - buildrequires: platform: [ ] requires: platform: [ ] references: community: http://nodejs.org documentation: http://nodejs.org/en/docs tracker: https://github.com/nodejs/node/issues profiles: default: rpms: - nodejs - npm development: rpms: - nodejs - nodejs-devel - npm minimal: rpms: - nodejs api: rpms: - nodejs - nodejs-devel - npm buildopts: arches: [aarch64, ppc64le, s390x, x86_64] components: rpms: libuv: rationale: Platform abstraction layer for Node.js ref: 1 http-parser: rationale: Needed for parsing HTTP requests ref: main arches: [ppc64le, x86_64] nghttp2: rationale: Needed for HTTP2 support ref: main nodejs: rationale: Javascript runtime and npm package manager. ref: 10 ... fedora-modularity-libmodulemd-357799c/modulemd/tests/test_data/buildarches/good_no_arches_v2.yaml000066400000000000000000000024001502446517500334060ustar00rootroot00000000000000--- document: modulemd version: 2 data: summary: Javascript runtime description: >- Node.js is a platform built on Chrome''s JavaScript runtime for easily building fast, scalable network applications. Node.js uses an event-driven, non-blocking I/O model that makes it lightweight and efficient, perfect for data-intensive real-time applications that run across distributed devices. license: module: - MIT dependencies: - buildrequires: platform: [ ] requires: platform: [ ] references: community: http://nodejs.org documentation: http://nodejs.org/en/docs tracker: https://github.com/nodejs/node/issues profiles: default: rpms: - nodejs - npm development: rpms: - nodejs - nodejs-devel - npm minimal: rpms: - nodejs api: rpms: - nodejs - nodejs-devel - npm components: rpms: libuv: rationale: Platform abstraction layer for Node.js ref: 1 http-parser: rationale: Needed for parsing HTTP requests ref: main nghttp2: rationale: Needed for HTTP2 support ref: main nodejs: rationale: Javascript runtime and npm package manager. ref: 10 ... only_module_arches_v2.yaml000066400000000000000000000024731502446517500342430ustar00rootroot00000000000000fedora-modularity-libmodulemd-357799c/modulemd/tests/test_data/buildarches--- document: modulemd version: 2 data: summary: Javascript runtime description: >- Node.js is a platform built on Chrome''s JavaScript runtime for easily building fast, scalable network applications. Node.js uses an event-driven, non-blocking I/O model that makes it lightweight and efficient, perfect for data-intensive real-time applications that run across distributed devices. license: module: - MIT dependencies: - buildrequires: platform: [ ] requires: platform: [ ] references: community: http://nodejs.org documentation: http://nodejs.org/en/docs tracker: https://github.com/nodejs/node/issues profiles: default: rpms: - nodejs - npm development: rpms: - nodejs - nodejs-devel - npm minimal: rpms: - nodejs api: rpms: - nodejs - nodejs-devel - npm buildopts: arches: [aarch64, ppc64le, s390x, x86_64] components: rpms: libuv: rationale: Platform abstraction layer for Node.js ref: 1 http-parser: rationale: Needed for parsing HTTP requests ref: main nghttp2: rationale: Needed for HTTP2 support ref: main nodejs: rationale: Javascript runtime and npm package manager. ref: 10 ... fedora-modularity-libmodulemd-357799c/modulemd/tests/test_data/buildarches/only_rpm_arches_v2.yaml000066400000000000000000000024421502446517500336270ustar00rootroot00000000000000--- document: modulemd version: 2 data: summary: Javascript runtime description: >- Node.js is a platform built on Chrome''s JavaScript runtime for easily building fast, scalable network applications. Node.js uses an event-driven, non-blocking I/O model that makes it lightweight and efficient, perfect for data-intensive real-time applications that run across distributed devices. license: module: - MIT dependencies: - buildrequires: platform: [ ] requires: platform: [ ] references: community: http://nodejs.org documentation: http://nodejs.org/en/docs tracker: https://github.com/nodejs/node/issues profiles: default: rpms: - nodejs - npm development: rpms: - nodejs - nodejs-devel - npm minimal: rpms: - nodejs api: rpms: - nodejs - nodejs-devel - npm components: rpms: libuv: rationale: Platform abstraction layer for Node.js ref: 1 http-parser: rationale: Needed for parsing HTTP requests ref: main arches: [ppc64le, x86_64] nghttp2: rationale: Needed for HTTP2 support ref: main nodejs: rationale: Javascript runtime and npm package manager. ref: 10 ... fedora-modularity-libmodulemd-357799c/modulemd/tests/test_data/buildconfig/000077500000000000000000000000001502446517500271465ustar00rootroot00000000000000fedora-modularity-libmodulemd-357799c/modulemd/tests/test_data/buildconfig/good_bc.yaml000066400000000000000000000004241502446517500314260ustar00rootroot00000000000000--- context: CTX1 platform: f32 buildrequires: appframework: v1 doctool: rolling requires: appframework: v2 buildopts: rpms: macros: | %demomacro 1 %demomacro2 %{demomacro}23 whitelist: - fooscl-1-bar - fooscl-1-baz - xxx - xyz ... fedora-modularity-libmodulemd-357799c/modulemd/tests/test_data/buildconfig/long_context.yaml000066400000000000000000000004351502446517500325370ustar00rootroot00000000000000--- context: CTX1234567890 platform: f32 buildrequires: appframework: v1 doctool: rolling requires: appframework: v2 buildopts: rpms: macros: | %demomacro 1 %demomacro2 %{demomacro}23 whitelist: - fooscl-1-bar - fooscl-1-baz - xxx - xyz ... fedora-modularity-libmodulemd-357799c/modulemd/tests/test_data/buildconfig/no_context.yaml000066400000000000000000000004061502446517500322120ustar00rootroot00000000000000--- platform: f32 buildrequires: appframework: v1 doctool: rolling requires: appframework: v2 buildopts: rpms: macros: | %demomacro 1 %demomacro2 %{demomacro}23 whitelist: - fooscl-1-bar - fooscl-1-baz - xxx - xyz ... fedora-modularity-libmodulemd-357799c/modulemd/tests/test_data/buildconfig/no_platform.yaml000066400000000000000000000004061502446517500323520ustar00rootroot00000000000000--- context: CTX1 buildrequires: appframework: v1 doctool: rolling requires: appframework: v2 buildopts: rpms: macros: | %demomacro 1 %demomacro2 %{demomacro}23 whitelist: - fooscl-1-bar - fooscl-1-baz - xxx - xyz ... fedora-modularity-libmodulemd-357799c/modulemd/tests/test_data/buildconfig/nonalphanum_context.yaml000066400000000000000000000004251502446517500341170ustar00rootroot00000000000000--- context: CTX_1 platform: f32 buildrequires: appframework: v1 doctool: rolling requires: appframework: v2 buildopts: rpms: macros: | %demomacro 1 %demomacro2 %{demomacro}23 whitelist: - fooscl-1-bar - fooscl-1-baz - xxx - xyz ... fedora-modularity-libmodulemd-357799c/modulemd/tests/test_data/buildconfig/short_context.yaml000066400000000000000000000004221502446517500327330ustar00rootroot00000000000000--- context: "" platform: f32 buildrequires: appframework: v1 doctool: rolling requires: appframework: v2 buildopts: rpms: macros: | %demomacro 1 %demomacro2 %{demomacro}23 whitelist: - fooscl-1-bar - fooscl-1-baz - xxx - xyz ... fedora-modularity-libmodulemd-357799c/modulemd/tests/test_data/buildconfig/unknown_key.yaml000066400000000000000000000004411502446517500324000ustar00rootroot00000000000000--- context: CTX1 platform: f32 unknown: key buildrequires: appframework: v1 doctool: rolling requires: appframework: v2 buildopts: rpms: macros: | %demomacro 1 %demomacro2 %{demomacro}23 whitelist: - fooscl-1-bar - fooscl-1-baz - xxx - xyz ... fedora-modularity-libmodulemd-357799c/modulemd/tests/test_data/cm.yaml000066400000000000000000000006471502446517500261530ustar00rootroot00000000000000--- includedmodule: # Why is this module included? # Required rationale: Included in the stack, just because. # Link to VCS repository that contains the modulemd file # if it differs from the buildsystem default configuration. # Optional. repository: https://pagure.io/includedmodule.git # See the rpms ref. ref: somecoolbranchname # See the rpms buildorder. buildorder: 100 ... fedora-modularity-libmodulemd-357799c/modulemd/tests/test_data/component-rpm/000077500000000000000000000000001502446517500274575ustar00rootroot00000000000000fedora-modularity-libmodulemd-357799c/modulemd/tests/test_data/component-rpm/cr.yaml000066400000000000000000000004221502446517500307450ustar00rootroot00000000000000--- bar: rationale: We need this to demonstrate stuff. repository: https://pagure.io/bar.git cache: https://example.com/cache buildorder: 100 ref: 26ca0c0 buildroot: true srpm-buildroot: true arches: [i686, x86_64] multilib: [x86_64] ... fedora-modularity-libmodulemd-357799c/modulemd/tests/test_data/component-rpm/cr_buildafter.yaml000066400000000000000000000004341502446517500331510ustar00rootroot00000000000000--- bar: rationale: We need this to demonstrate stuff. repository: https://pagure.io/bar.git cache: https://example.com/cache buildafter: - foo ref: 26ca0c0 buildroot: true srpm-buildroot: true arches: [i686, x86_64] multilib: [x86_64] ... fedora-modularity-libmodulemd-357799c/modulemd/tests/test_data/compression/000077500000000000000000000000001502446517500272225ustar00rootroot00000000000000fedora-modularity-libmodulemd-357799c/modulemd/tests/test_data/compression/bzipped000066400000000000000000000055501502446517500306070ustar00rootroot00000000000000BZh91AY&SY߀UHsܪ`~wuco[ ^3ݸmmTHQ D G6Q64ڀ$dɦ hhD&2a4F!56 Oj'IzLzBhM&L&DhDڙh r*'T?n'?|XyXOٓFV'U\G,%*J0v%-T|R@*%o:~s\<ѷ5VW ͺH਎buVŒa;jnmeO)˳}SppO45bz* ”|Ͱ蔫z[ÑT̵xgb^ӱ%z:NfiF܍¯¢z#f^;7)v#?'UU/ըxsDYzAAW}S(&Aʅ*1ujPg}>]ED(5!B9`ˠui܃Dwke{zas#>SdT  Ђ'Yʼe:Lڝ%S H@$ ޯsn&d4sz˿@C) Cqwˌ3݂]3>hI&Q×Ԕ! kn[en1d͡ei|OŗoH`.TV7)AiU&ï`l#R)H=2ZⅣ)| ŤjexFѭs?`e]Htum+#n c@p>HIԐcrA 롎Z%a?KA txjSCFI؍xХQ@RNa sis4^ZIN&fZh+1 HԂDrL}"vR%3ه_#e1"2ObnF\vqAp&\0=j`H z{,*o5kV%kYm$B؈"vCV-IU$f6#`0yp=55dLLM&jTвM@^P*b1]/TDMpyLT3{M^ %H*! ڵIɐ#0taR*Ϭ4a` M~t *7NqwOsIG'W%*T+s)Y? z$ 3%$-9BtF4r6$)~P]1r1εDb4[j|uoدR&%*QX(T(Ro <u gP\^{+/&YK1+GSܗ9Q[jԩRsD#l1rG ^ѸR+ =gE3bFr\^+C=ޢLp(6B 8j̛8=y= bh}VT&Q#3чZRs=͘{3pXvL`BwJp*1"Iug#c3M|%%?ʩܖXwdIɕ _$D%9$4{{iH>L$Mĭ(& ^CR!ǒ>İ6sK˦w}[42J`8=MSR 7Ͳ;15-'BM7Uf: Y k{$_,@)=ZVr!gQ]ED(5!B9`ˠui܃Dwke{zas#>SdT  Ђ'Yʼe:Lڝ%S H@$ ޯsn&d4sz˿@C) Cqwˌ3݂]3>hI&Q×Ԕ! kn[en1d͡ei|OŗoH`.TV7)AiU&ï`l#R)H=2ZⅣ)| ŤjexFѭs?`e]Htum+#n c@p>HIԐcrA 롎Z%a?KA txjSCFI؍xХQ@RNa sis4^ZIN&fZh+1 HԂDrL}"vR%3ه_#e1"2ObnF\vqAp&\0=j`H z{,*o5kV%kYm$B؈"vCV-IU$f6#`0yp=55dLLM&jTвM@^P*b1]/TDMpyLT3{M^ %H*! ڵIɐ#0taR*Ϭ4a` M~t *7NqwOsIG'W%*T+s)Y? z$ 3%$-9BtF4r6$)~P]1r1εDb4[j|uoدR&%*QX(T(Ro <u gP\^{+/&YK1+GSܗ9Q[jԩRsD#l1rG ^ѸR+ =gE3bFr\^+C=ޢLp(6B 8j̛8=y= bh}VT&Q#3чZRs=͘{3pXvL`BwJp*1"Iug#c3M|%%?ʩܖXwdIɕ _$D%9$4{{iH>L$Mĭ(& ^CR!ǒ>İ6sK˦w}[42J`8=MSR 7Ͳ;15-'BM7Uf: Y k{$_,@)=ZVr!gQ_C, /ky;_6rĊlv`VS@n sF:pd}oe1v̫"!\ ؎"v:g;DQ"r @@'J)$XedG(z>4aBqǜN'/e%D$r"HSy0FW?rqBzqSVOO[grc93pbe*֢|D,֎L!;:"' hp|4Q JWxӥo(8:}Px 7Js-i>f3~$0_0~m> Ƨh5gJr%05DD8I#R؞S4c$1S%Q:9ˢG >׮F.r\0\!6| C~ݴᡜDR Q@G@L^DK>K iy.X4d@wN-@1>e< 6B1G40Ւ J4𘥂 Q2L aH Tƌ"I#u#|$7C:~ c UgzAg { {$1c<֑L)M';GMWouu]7~_=;myF@i_EtG;qoQ GZے.KdRD}VRU}٪ t'Bw0rB܎ l:AWW.Yơo^h>8 7bJP?"r}C#7HRB:z0go(f֢L6P~wpTi>ۍ'FOc|M8rK`^Rߒ}$m kTi^tԳ+k~>lNG( (r>j6%<:y"vRkvx6rSh٣T.w49jt 4vE?vXtY8xԧ.wO[桖>Ozk/ɛ{)Tط|Rd:ϝ,Q:shA| qd'̽yٗB%:L^`8Wދ3{/U ,2aV~Az?.U4fedora-modularity-libmodulemd-357799c/modulemd/tests/test_data/compression/gzipped.yaml.gz000066400000000000000000000051501502446517500321700ustar00rootroot00000000000000g]gzipped.yamlZ[۸~ϯ ЇHoŶ-m.P, x%$3-cOI0msQR/T-k]u նktRtE]/t—/'.PU+kX/P/ a"۲LMQ^D(^;7dEՁ^ =- ּ̻X:56л|l/Z#8/3uWb=<,t¯N#%F8bpEְ?A$'DK+]Es@?U\%}+_#Ӏ]d[Ωs-i@JtHW6b[ԈM@+lQT tR5DM,P!/U~ꐁ( ĶjD[mVשV7?XW/;Fo4+8 L,6A,Z7S=@? |V|̭\orV]i77m#CU mZva,oc,!$L*9a8$M: ezC^ +mQF-qnY? (@wEmE9Rΐt4 FfBz]ۧ%ݜ._XRaS(ylRmI4X*Mł?S o?! ymJsoȵn(䡷_ '$-\ @1{V77~~`Ć GBYh#üY馮jD5.V_lOF8d4mOmnL[7v:+~F k'q 0BN._C, /ky;_6rĊlv`VS@n sF:pd}oe1v̫"!\ ؎"v:g;DQ"r @@'J)$XedG(z>4aBqǜN'/e%D$r"HSy0FW?rqBzqSVOO[grc93pbe*֢|D,֎L!;:"' hp|4Q JWxӥo(8:}Px 7Js-i>f3~$0_0~m> Ƨh5gJr%05DD8I#R؞S4c$1S%Q:9ˢG >׮F.r\0\!6| C~ݴᡜDR Q@G@L^DK>K iy.X4d@wN-@1>e< 6B1G40Ւ J4𘥂 Q2L aH Tƌ"I#u#|$7C:~ c UgzAg { {$1c<֑L)M';GMWouu]7~_=;myF@i_EtG;qoQ GZے.KdRD}VRU}٪ t'Bw0rB܎ l:AWW.Yơo^h>8 7bJP?"r}C#7HRB:z0go(f֢L6P~wpTi>ۍ'FOc|M8rK`^Rߒ}$m kTi^tԳ+k~>lNG( (r>j6%<:y"vRkvx6rSh٣T.w49jt 4vE?vXtY8xԧ.wO[桖>Ozk/ɛ{)Tط|Rd:ϝ,Q:shA| qd'̽yٗB%:L^`8Wދ3{/U ,2aV~Az?.U4fedora-modularity-libmodulemd-357799c/modulemd/tests/test_data/compression/uncompressed000066400000000000000000000322211502446517500316540ustar00rootroot00000000000000--- document: modulemd-translations version: 1 data: module: nodejs stream: 8 modified: 1 ... --- document: modulemd-defaults version: 1 data: module: nodejs profiles: 6: [default] 8: [default] 9: [default] intents: server: stream: 8 profiles: 6: [server] 8: [server] ... --- document: modulemd-defaults version: 1 data: module: reviewboard stream: 2.5 profiles: 2.5: [default] ... --- document: modulemd-defaults version: 1 data: module: django profiles: 1.6: [default] ... --- document: modulemd version: 2 data: name: django stream: 1.6 version: 20180307130104 context: c2c572ec summary: A high-level Python Web framework description: >- Django is a high-level Python Web framework that encourages rapid development and a clean, pragmatic design. It focuses on automating as much as possible and adhering to the DRY (Don't Repeat Yourself) principle. license: module: - MIT xmd: mbs: scmurl: https://src.fedoraproject.org/modules/django.git?#90c50f8ad1cb5ca41d62632699c375dce6353adf commit: 90c50f8ad1cb5ca41d62632699c375dce6353adf buildrequires: platform: ref: virtual stream: f28 filtered_rpms: [] version: 4 rpms: python-django: ref: 1c3a01558a435b56f8ef4f8fc0e5c1cd35f006a5 requires: platform: ref: virtual stream: f28 filtered_rpms: [] version: 4 dependencies: - buildrequires: platform: [f28] requires: platform: [f28] references: community: https://www.djangoproject.com documentation: https://docs.djangoproject.com tracker: https://code.djangoproject.com/query profiles: default: rpms: - python2-django python2_development: rpms: - python2-django api: rpms: - python2-django components: rpms: python-django: rationale: The Django python web framework repository: git://pkgs.fedoraproject.org/rpms/python-django cache: http://pkgs.fedoraproject.org/repo/pkgs/python-django ref: 1.6 artifacts: rpms: - python-django-bash-completion-0:1.6.11.7-1.module_1560+089ce146.noarch - python2-django-0:1.6.11.7-1.module_1560+089ce146.noarch ... --- document: modulemd version: 2 data: name: nodejs stream: 6 version: 20180308155546 context: c2c572ec summary: Javascript runtime description: >- Node.js is a platform built on Chrome''s JavaScript runtime for easily building fast, scalable network applications. Node.js uses an event-driven, non-blocking I/O model that makes it lightweight and efficient, perfect for data-intensive real-time applications that run across distributed devices. license: module: - MIT xmd: mbs: scmurl: https://src.fedoraproject.org/modules/nodejs.git?#2d349c5055939081aefa37d71cd77051d235cb79 commit: 2d349c5055939081aefa37d71cd77051d235cb79 buildrequires: platform: ref: virtual stream: f28 filtered_rpms: [] version: 4 rpms: nodejs: ref: 374ae23edf3676653fec706a5c81c5cdf019ce11 requires: platform: ref: virtual stream: f28 filtered_rpms: [] version: 4 dependencies: - buildrequires: platform: [f28] requires: platform: [f28] references: community: http://nodejs.org documentation: http://nodejs.org/en/docs tracker: https://github.com/nodejs/node/issues profiles: default: rpms: - nodejs - npm development: rpms: - nodejs - nodejs-devel - npm minimal: rpms: - nodejs api: rpms: - nodejs - nodejs-devel - npm components: rpms: nodejs: rationale: Javascript runtime and npm package manager. repository: git://pkgs.fedoraproject.org/rpms/nodejs cache: http://pkgs.fedoraproject.org/repo/pkgs/nodejs ref: 6 buildorder: 10 artifacts: rpms: - nodejs-1:6.13.1-1.module_1575+55808bea.x86_64 - nodejs-devel-1:6.13.1-1.module_1575+55808bea.x86_64 - nodejs-docs-1:6.13.1-1.module_1575+55808bea.noarch - npm-1:3.10.10-1.6.13.1.1.module_1575+55808bea.x86_64 ... --- document: modulemd version: 2 data: name: nodejs stream: 8 version: 20180308143646 context: c2c572ec summary: Javascript runtime description: >- Node.js is a platform built on Chrome''s JavaScript runtime for easily building fast, scalable network applications. Node.js uses an event-driven, non-blocking I/O model that makes it lightweight and efficient, perfect for data-intensive real-time applications that run across distributed devices. license: module: - MIT xmd: mbs: scmurl: https://src.fedoraproject.org/modules/nodejs.git?#4dc5da13fa51c5a5cc9f02a81d71416bc6ce787e commit: 4dc5da13fa51c5a5cc9f02a81d71416bc6ce787e buildrequires: platform: ref: virtual stream: f28 filtered_rpms: [] version: 4 rpms: nodejs: ref: 64f8f82763943f764d25225c2d95ae065490b10a requires: platform: ref: virtual stream: f28 filtered_rpms: [] version: 4 mbs_options: blocked_pacakges: - blocked1 - blocked2 dependencies: - buildrequires: platform: [f28] requires: platform: [f28] references: community: http://nodejs.org documentation: http://nodejs.org/en/docs tracker: https://github.com/nodejs/node/issues profiles: default: rpms: - nodejs - npm development: rpms: - nodejs - nodejs-devel - npm minimal: rpms: - nodejs api: rpms: - nodejs - nodejs-devel - npm components: rpms: nodejs: rationale: Javascript runtime and npm package manager. repository: git://pkgs.fedoraproject.org/rpms/nodejs cache: http://pkgs.fedoraproject.org/repo/pkgs/nodejs ref: 8 buildorder: 10 artifacts: rpms: - nodejs-1:8.10.0-3.module_1572+d7ec111e.x86_64 - nodejs-devel-1:8.10.0-3.module_1572+d7ec111e.x86_64 - nodejs-docs-1:8.10.0-3.module_1572+d7ec111e.noarch - npm-1:5.6.0-1.8.10.0.3.module_1572+d7ec111e.x86_64 ... --- document: modulemd version: 2 data: name: nodejs stream: 9 version: 20180308142225 context: c2c572ec summary: Javascript runtime description: >- Node.js is a platform built on Chrome''s JavaScript runtime for easily building fast, scalable network applications. Node.js uses an event-driven, non-blocking I/O model that makes it lightweight and efficient, perfect for data-intensive real-time applications that run across distributed devices. license: module: - MIT xmd: mbs: scmurl: https://src.fedoraproject.org/modules/nodejs.git?#3f3665745cb84576f1faa66646cb8c37913ec461 commit: 3f3665745cb84576f1faa66646cb8c37913ec461 buildrequires: platform: ref: virtual stream: f28 filtered_rpms: [] version: 4 rpms: nodejs: ref: 65648a2672dc03641b9eaa4d25a8f19d94fd90c3 requires: platform: ref: virtual stream: f28 filtered_rpms: [] version: 4 dependencies: - buildrequires: platform: [f28] requires: platform: [f28] references: community: http://nodejs.org documentation: http://nodejs.org/en/docs tracker: https://github.com/nodejs/node/issues profiles: default: rpms: - nodejs - npm development: rpms: - nodejs - nodejs-devel - npm minimal: rpms: - nodejs api: rpms: - nodejs - nodejs-devel - npm components: rpms: nodejs: rationale: Javascript runtime and npm package manager. repository: git://pkgs.fedoraproject.org/rpms/nodejs cache: http://pkgs.fedoraproject.org/repo/pkgs/nodejs ref: 9 buildorder: 10 artifacts: rpms: - nodejs-1:9.8.0-1.module_1571+4f4bc63d.x86_64 - nodejs-devel-1:9.8.0-1.module_1571+4f4bc63d.x86_64 - nodejs-docs-1:9.8.0-1.module_1571+4f4bc63d.noarch - npm-1:5.6.0-1.9.8.0.1.module_1571+4f4bc63d.x86_64 ... --- document: modulemd version: 2 data: name: reviewboard stream: 2.5 version: 20180206144254 context: e0c83381 summary: A web-based code review tool description: >- Review Board is a powerful web-based code review tool that offers developers an easy way to handle code reviews. It scales well from small projects to large companies and offers a variety of tools to take much of the stress and time out of the code review process. license: module: - MIT xmd: mbs: scmurl: https://src.fedoraproject.org/modules/reviewboard.git?#1738e1ce6352c0d4da31ba137cab0b5dc5f30166 commit: 1738e1ce6352c0d4da31ba137cab0b5dc5f30166 buildrequires: platform: ref: virtual stream: f28 filtered_rpms: [] version: 3 django: ref: 14fb96b250feec2e2c883e06255de2c36faa7313 stream: 1.6 filtered_rpms: [] version: 20180117164842 rpms: python-django-multiselectfield: ref: 149bf58875fb7b55efe29e1735baf96d44eb99a9 ReviewBoard: ref: 5d28213f6a797e5ce28ad05ab23f80fe67353da8 python-django-evolution: ref: 512424e1fc4b99f6f74c01a4130a4d9402b56b4e python-django-pipeline: ref: f019137be96cf86f49a81001fef47a0c7ab6aa35 python-markdown: ref: 0af9dd03b4822c04be2742b39b5a4d48ef2d2222 python-django-haystack: ref: 20fe71a6fc50a83b24578fbaf86e94a4ca584d31 python-djblets: ref: d5634779089456ff3d0ac7b78eec81e13ff4c733 requires: platform: ref: virtual stream: f28 filtered_rpms: [] version: 3 django: ref: 14fb96b250feec2e2c883e06255de2c36faa7313 stream: 1.6 filtered_rpms: [] version: 20180117164842 dependencies: - buildrequires: django: [1.6] platform: [f28] requires: django: [1.6] platform: [f28] references: community: https://www.reviewboard.org documentation: https://www.reviewboard.org/docs tracker: https://hellosplat.com/s/beanbag/tickets/ profiles: default: rpms: - ReviewBoard server: rpms: - ReviewBoard api: rpms: - ReviewBoard - python2-djblets components: rpms: ReviewBoard: rationale: The Review Board code review tool repository: git://pkgs.fedoraproject.org/rpms/ReviewBoard cache: http://pkgs.fedoraproject.org/repo/pkgs/ReviewBoard ref: 2.5 buildorder: 20 python-django-evolution: rationale: A database modification library used and maintained by the Review Board upstream repository: git://pkgs.fedoraproject.org/rpms/python-django-evolution cache: http://pkgs.fedoraproject.org/repo/pkgs/python-django-evolution ref: 0.7 python-django-haystack: rationale: An older version of the Haystack search library for Django, needed for compatibility. repository: git://pkgs.fedoraproject.org/rpms/python-django-haystack cache: http://pkgs.fedoraproject.org/repo/pkgs/python-django-haystack ref: 2.4 python-django-multiselectfield: rationale: An older version of a mult-select form field needed by Review Board. repository: git://pkgs.fedoraproject.org/rpms/python-django-multiselectfield cache: http://pkgs.fedoraproject.org/repo/pkgs/python-django-multiselectfield ref: 0.1 python-django-pipeline: rationale: An older version of this asset-packaging library for Django that is compatible with Review Board. repository: git://pkgs.fedoraproject.org/rpms/python-django-pipeline cache: http://pkgs.fedoraproject.org/repo/pkgs/python-django-pipeline ref: 1.3 python-djblets: rationale: Review Board tool library repository: git://pkgs.fedoraproject.org/rpms/python-djblets cache: http://pkgs.fedoraproject.org/repo/pkgs/python-djblets ref: 0.9 buildorder: 10 python-markdown: rationale: An older version of this Markdown implementation that is compatible with Review Board. repository: git://pkgs.fedoraproject.org/rpms/python-markdown cache: http://pkgs.fedoraproject.org/repo/pkgs/python-markdown ref: 2.4 artifacts: rpms: - ReviewBoard-0:2.5.17-17.module_d032b812.noarch - python-django-haystack-docs-0:2.4.1-12.module_d032b812.noarch - python2-django-evolution-1:0.7.7-12.module_d032b812.noarch - python2-django-haystack-0:2.4.1-12.module_d032b812.noarch - python2-django-multiselectfield-0:0.1.3-10.module_d032b812.noarch - python2-django-pipeline-0:1.3.27-11.module_d032b812.noarch - python2-djblets-0:0.9.9-13.module_d032b812.noarch - python2-markdown-0:2.4.1-11.module_d032b812.noarch - python3-markdown-0:2.4.1-11.module_d032b812.noarch ... fedora-modularity-libmodulemd-357799c/modulemd/tests/test_data/compression/uncompressed.yaml000066400000000000000000000322211502446517500326150ustar00rootroot00000000000000--- document: modulemd-translations version: 1 data: module: nodejs stream: 8 modified: 1 ... --- document: modulemd-defaults version: 1 data: module: nodejs profiles: 6: [default] 8: [default] 9: [default] intents: server: stream: 8 profiles: 6: [server] 8: [server] ... --- document: modulemd-defaults version: 1 data: module: reviewboard stream: 2.5 profiles: 2.5: [default] ... --- document: modulemd-defaults version: 1 data: module: django profiles: 1.6: [default] ... --- document: modulemd version: 2 data: name: django stream: 1.6 version: 20180307130104 context: c2c572ec summary: A high-level Python Web framework description: >- Django is a high-level Python Web framework that encourages rapid development and a clean, pragmatic design. It focuses on automating as much as possible and adhering to the DRY (Don't Repeat Yourself) principle. license: module: - MIT xmd: mbs: scmurl: https://src.fedoraproject.org/modules/django.git?#90c50f8ad1cb5ca41d62632699c375dce6353adf commit: 90c50f8ad1cb5ca41d62632699c375dce6353adf buildrequires: platform: ref: virtual stream: f28 filtered_rpms: [] version: 4 rpms: python-django: ref: 1c3a01558a435b56f8ef4f8fc0e5c1cd35f006a5 requires: platform: ref: virtual stream: f28 filtered_rpms: [] version: 4 dependencies: - buildrequires: platform: [f28] requires: platform: [f28] references: community: https://www.djangoproject.com documentation: https://docs.djangoproject.com tracker: https://code.djangoproject.com/query profiles: default: rpms: - python2-django python2_development: rpms: - python2-django api: rpms: - python2-django components: rpms: python-django: rationale: The Django python web framework repository: git://pkgs.fedoraproject.org/rpms/python-django cache: http://pkgs.fedoraproject.org/repo/pkgs/python-django ref: 1.6 artifacts: rpms: - python-django-bash-completion-0:1.6.11.7-1.module_1560+089ce146.noarch - python2-django-0:1.6.11.7-1.module_1560+089ce146.noarch ... --- document: modulemd version: 2 data: name: nodejs stream: 6 version: 20180308155546 context: c2c572ec summary: Javascript runtime description: >- Node.js is a platform built on Chrome''s JavaScript runtime for easily building fast, scalable network applications. Node.js uses an event-driven, non-blocking I/O model that makes it lightweight and efficient, perfect for data-intensive real-time applications that run across distributed devices. license: module: - MIT xmd: mbs: scmurl: https://src.fedoraproject.org/modules/nodejs.git?#2d349c5055939081aefa37d71cd77051d235cb79 commit: 2d349c5055939081aefa37d71cd77051d235cb79 buildrequires: platform: ref: virtual stream: f28 filtered_rpms: [] version: 4 rpms: nodejs: ref: 374ae23edf3676653fec706a5c81c5cdf019ce11 requires: platform: ref: virtual stream: f28 filtered_rpms: [] version: 4 dependencies: - buildrequires: platform: [f28] requires: platform: [f28] references: community: http://nodejs.org documentation: http://nodejs.org/en/docs tracker: https://github.com/nodejs/node/issues profiles: default: rpms: - nodejs - npm development: rpms: - nodejs - nodejs-devel - npm minimal: rpms: - nodejs api: rpms: - nodejs - nodejs-devel - npm components: rpms: nodejs: rationale: Javascript runtime and npm package manager. repository: git://pkgs.fedoraproject.org/rpms/nodejs cache: http://pkgs.fedoraproject.org/repo/pkgs/nodejs ref: 6 buildorder: 10 artifacts: rpms: - nodejs-1:6.13.1-1.module_1575+55808bea.x86_64 - nodejs-devel-1:6.13.1-1.module_1575+55808bea.x86_64 - nodejs-docs-1:6.13.1-1.module_1575+55808bea.noarch - npm-1:3.10.10-1.6.13.1.1.module_1575+55808bea.x86_64 ... --- document: modulemd version: 2 data: name: nodejs stream: 8 version: 20180308143646 context: c2c572ec summary: Javascript runtime description: >- Node.js is a platform built on Chrome''s JavaScript runtime for easily building fast, scalable network applications. Node.js uses an event-driven, non-blocking I/O model that makes it lightweight and efficient, perfect for data-intensive real-time applications that run across distributed devices. license: module: - MIT xmd: mbs: scmurl: https://src.fedoraproject.org/modules/nodejs.git?#4dc5da13fa51c5a5cc9f02a81d71416bc6ce787e commit: 4dc5da13fa51c5a5cc9f02a81d71416bc6ce787e buildrequires: platform: ref: virtual stream: f28 filtered_rpms: [] version: 4 rpms: nodejs: ref: 64f8f82763943f764d25225c2d95ae065490b10a requires: platform: ref: virtual stream: f28 filtered_rpms: [] version: 4 mbs_options: blocked_pacakges: - blocked1 - blocked2 dependencies: - buildrequires: platform: [f28] requires: platform: [f28] references: community: http://nodejs.org documentation: http://nodejs.org/en/docs tracker: https://github.com/nodejs/node/issues profiles: default: rpms: - nodejs - npm development: rpms: - nodejs - nodejs-devel - npm minimal: rpms: - nodejs api: rpms: - nodejs - nodejs-devel - npm components: rpms: nodejs: rationale: Javascript runtime and npm package manager. repository: git://pkgs.fedoraproject.org/rpms/nodejs cache: http://pkgs.fedoraproject.org/repo/pkgs/nodejs ref: 8 buildorder: 10 artifacts: rpms: - nodejs-1:8.10.0-3.module_1572+d7ec111e.x86_64 - nodejs-devel-1:8.10.0-3.module_1572+d7ec111e.x86_64 - nodejs-docs-1:8.10.0-3.module_1572+d7ec111e.noarch - npm-1:5.6.0-1.8.10.0.3.module_1572+d7ec111e.x86_64 ... --- document: modulemd version: 2 data: name: nodejs stream: 9 version: 20180308142225 context: c2c572ec summary: Javascript runtime description: >- Node.js is a platform built on Chrome''s JavaScript runtime for easily building fast, scalable network applications. Node.js uses an event-driven, non-blocking I/O model that makes it lightweight and efficient, perfect for data-intensive real-time applications that run across distributed devices. license: module: - MIT xmd: mbs: scmurl: https://src.fedoraproject.org/modules/nodejs.git?#3f3665745cb84576f1faa66646cb8c37913ec461 commit: 3f3665745cb84576f1faa66646cb8c37913ec461 buildrequires: platform: ref: virtual stream: f28 filtered_rpms: [] version: 4 rpms: nodejs: ref: 65648a2672dc03641b9eaa4d25a8f19d94fd90c3 requires: platform: ref: virtual stream: f28 filtered_rpms: [] version: 4 dependencies: - buildrequires: platform: [f28] requires: platform: [f28] references: community: http://nodejs.org documentation: http://nodejs.org/en/docs tracker: https://github.com/nodejs/node/issues profiles: default: rpms: - nodejs - npm development: rpms: - nodejs - nodejs-devel - npm minimal: rpms: - nodejs api: rpms: - nodejs - nodejs-devel - npm components: rpms: nodejs: rationale: Javascript runtime and npm package manager. repository: git://pkgs.fedoraproject.org/rpms/nodejs cache: http://pkgs.fedoraproject.org/repo/pkgs/nodejs ref: 9 buildorder: 10 artifacts: rpms: - nodejs-1:9.8.0-1.module_1571+4f4bc63d.x86_64 - nodejs-devel-1:9.8.0-1.module_1571+4f4bc63d.x86_64 - nodejs-docs-1:9.8.0-1.module_1571+4f4bc63d.noarch - npm-1:5.6.0-1.9.8.0.1.module_1571+4f4bc63d.x86_64 ... --- document: modulemd version: 2 data: name: reviewboard stream: 2.5 version: 20180206144254 context: e0c83381 summary: A web-based code review tool description: >- Review Board is a powerful web-based code review tool that offers developers an easy way to handle code reviews. It scales well from small projects to large companies and offers a variety of tools to take much of the stress and time out of the code review process. license: module: - MIT xmd: mbs: scmurl: https://src.fedoraproject.org/modules/reviewboard.git?#1738e1ce6352c0d4da31ba137cab0b5dc5f30166 commit: 1738e1ce6352c0d4da31ba137cab0b5dc5f30166 buildrequires: platform: ref: virtual stream: f28 filtered_rpms: [] version: 3 django: ref: 14fb96b250feec2e2c883e06255de2c36faa7313 stream: 1.6 filtered_rpms: [] version: 20180117164842 rpms: python-django-multiselectfield: ref: 149bf58875fb7b55efe29e1735baf96d44eb99a9 ReviewBoard: ref: 5d28213f6a797e5ce28ad05ab23f80fe67353da8 python-django-evolution: ref: 512424e1fc4b99f6f74c01a4130a4d9402b56b4e python-django-pipeline: ref: f019137be96cf86f49a81001fef47a0c7ab6aa35 python-markdown: ref: 0af9dd03b4822c04be2742b39b5a4d48ef2d2222 python-django-haystack: ref: 20fe71a6fc50a83b24578fbaf86e94a4ca584d31 python-djblets: ref: d5634779089456ff3d0ac7b78eec81e13ff4c733 requires: platform: ref: virtual stream: f28 filtered_rpms: [] version: 3 django: ref: 14fb96b250feec2e2c883e06255de2c36faa7313 stream: 1.6 filtered_rpms: [] version: 20180117164842 dependencies: - buildrequires: django: [1.6] platform: [f28] requires: django: [1.6] platform: [f28] references: community: https://www.reviewboard.org documentation: https://www.reviewboard.org/docs tracker: https://hellosplat.com/s/beanbag/tickets/ profiles: default: rpms: - ReviewBoard server: rpms: - ReviewBoard api: rpms: - ReviewBoard - python2-djblets components: rpms: ReviewBoard: rationale: The Review Board code review tool repository: git://pkgs.fedoraproject.org/rpms/ReviewBoard cache: http://pkgs.fedoraproject.org/repo/pkgs/ReviewBoard ref: 2.5 buildorder: 20 python-django-evolution: rationale: A database modification library used and maintained by the Review Board upstream repository: git://pkgs.fedoraproject.org/rpms/python-django-evolution cache: http://pkgs.fedoraproject.org/repo/pkgs/python-django-evolution ref: 0.7 python-django-haystack: rationale: An older version of the Haystack search library for Django, needed for compatibility. repository: git://pkgs.fedoraproject.org/rpms/python-django-haystack cache: http://pkgs.fedoraproject.org/repo/pkgs/python-django-haystack ref: 2.4 python-django-multiselectfield: rationale: An older version of a mult-select form field needed by Review Board. repository: git://pkgs.fedoraproject.org/rpms/python-django-multiselectfield cache: http://pkgs.fedoraproject.org/repo/pkgs/python-django-multiselectfield ref: 0.1 python-django-pipeline: rationale: An older version of this asset-packaging library for Django that is compatible with Review Board. repository: git://pkgs.fedoraproject.org/rpms/python-django-pipeline cache: http://pkgs.fedoraproject.org/repo/pkgs/python-django-pipeline ref: 1.3 python-djblets: rationale: Review Board tool library repository: git://pkgs.fedoraproject.org/rpms/python-djblets cache: http://pkgs.fedoraproject.org/repo/pkgs/python-djblets ref: 0.9 buildorder: 10 python-markdown: rationale: An older version of this Markdown implementation that is compatible with Review Board. repository: git://pkgs.fedoraproject.org/rpms/python-markdown cache: http://pkgs.fedoraproject.org/repo/pkgs/python-markdown ref: 2.4 artifacts: rpms: - ReviewBoard-0:2.5.17-17.module_d032b812.noarch - python-django-haystack-docs-0:2.4.1-12.module_d032b812.noarch - python2-django-evolution-1:0.7.7-12.module_d032b812.noarch - python2-django-haystack-0:2.4.1-12.module_d032b812.noarch - python2-django-multiselectfield-0:0.1.3-10.module_d032b812.noarch - python2-django-pipeline-0:1.3.27-11.module_d032b812.noarch - python2-djblets-0:0.9.9-13.module_d032b812.noarch - python2-markdown-0:2.4.1-11.module_d032b812.noarch - python3-markdown-0:2.4.1-11.module_d032b812.noarch ... fedora-modularity-libmodulemd-357799c/modulemd/tests/test_data/compression/xzipped000066400000000000000000000050041502446517500306270ustar00rootroot000000000000007zXZִF!t/4 ]f=3z@b>:ƆO!HKgJ5qu b\51Õ.46zcu8=2ğ|8t3@mHcP$0![6Bz~yx$z_P ;_C> pΨc"m iS{:qM|ZQe~)9'pfa4ѧ@:RNp4wmP5?F4bc˲N0 wg3S<8 !x`S ΛBpCRwKBna:'~Nm3cqo« ;Ϫf?R{@߀(jjWkJl)u| L\̆:ؒM N'[hri!+\){BG7f@3qu9gOԬ_J--~6 "zehW [lz} \C[c΀6R AvC?C|je .Ga*<Bfhwݓha]6g!טźV:Yn:/z15-9ۓ^tiDg,,&Q,Emֿ-M8sWup'95#<.=Ev"# .  ŲBJ~nFǡ,Յ{#CncAL*u,B1`|1FW83Y-_3ׇ]vo{d,T@\ɲImҬKm9ÅxFavIY|{[lUM>*ڡi p.#~0g&$9԰P^[4$\sw{3¢m 7|<1@JYQ #F喷a>=}gh(I`D&ؒ-f-n+B^f5|URr77<2C|[ Ԯh竓^ǐb-7ck)NM[8%~LȊJؕlW\{HݦD@>X.!ҍާj^%β:b3+@:Ϛ ":/*`AO9=x>=)ݷ+]T0Q 0]>v>yoӒ}s2wXt|'hnȵgS2B-| */ $ -˩UдBz)Ju[j/2@3k9|&{k' ӘMߧ N?*# K hp"W!yLUnDmʀTP5$vݮM繟~ a Bq 8sp!=]rDžq7TT9fL7_W†,9URE.HQH;Xm#{;X+S3=\sBV)8^9Q-j=pWgnҸ$OzMQpiC˔}l H_Z5ܘoKZ0F(w.Q~9O&n> ixcX ϾBsͻb{vErA{D=^=eo\Wc<b;~-~RO} -uuoGr ^lb`2 t"+:1t}Wwe/\83AƲ|4h:p8{60ڼC4}`džVQO D( q!#:/LC M2Cq?$H_ÌdWR?%;eRAlIOU?/tL4g̝7 U!T.x0 W6$V[Vh;riWUrHU=;e=$ -Ew2 VQ, Ju2́2UnyUPž!$Q\KqKac} 4Kno~`ez%eM WNn5,ȧnVR#al_plA\4dE\1/}i2ێgYZfedora-modularity-libmodulemd-357799c/modulemd/tests/test_data/compression/xzipped.yaml.xz000066400000000000000000000050041502446517500322300ustar00rootroot000000000000007zXZִF!t/4 ]f=3z@b>:ƆO!HKgJ5qu b\51Õ.46zcu8=2ğ|8t3@mHcP$0![6Bz~yx$z_P ;_C> pΨc"m iS{:qM|ZQe~)9'pfa4ѧ@:RNp4wmP5?F4bc˲N0 wg3S<8 !x`S ΛBpCRwKBna:'~Nm3cqo« ;Ϫf?R{@߀(jjWkJl)u| L\̆:ؒM N'[hri!+\){BG7f@3qu9gOԬ_J--~6 "zehW [lz} \C[c΀6R AvC?C|je .Ga*<Bfhwݓha]6g!טźV:Yn:/z15-9ۓ^tiDg,,&Q,Emֿ-M8sWup'95#<.=Ev"# .  ŲBJ~nFǡ,Յ{#CncAL*u,B1`|1FW83Y-_3ׇ]vo{d,T@\ɲImҬKm9ÅxFavIY|{[lUM>*ڡi p.#~0g&$9԰P^[4$\sw{3¢m 7|<1@JYQ #F喷a>=}gh(I`D&ؒ-f-n+B^f5|URr77<2C|[ Ԯh竓^ǐb-7ck)NM[8%~LȊJؕlW\{HݦD@>X.!ҍާj^%β:b3+@:Ϛ ":/*`AO9=x>=)ݷ+]T0Q 0]>v>yoӒ}s2wXt|'hnȵgS2B-| */ $ -˩UдBz)Ju[j/2@3k9|&{k' ӘMߧ N?*# K hp"W!yLUnDmʀTP5$vݮM繟~ a Bq 8sp!=]rDžq7TT9fL7_W†,9URE.HQH;Xm#{;X+S3=\sBV)8^9Q-j=pWgnҸ$OzMQpiC˔}l H_Z5ܘoKZ0F(w.Q~9O&n> ixcX ϾBsͻb{vErA{D=^=eo\Wc<b;~-~RO} -uuoGr ^lb`2 t"+:1t}Wwe/\83AƲ|4h:p8{60ڼC4}`džVQO D( q!#:/LC M2Cq?$H_ÌdWR?%;eRAlIOU?/tL4g̝7 U!T.x0 W6$V[Vh;riWUrHU=;e=$ -Ew2 VQ, Ju2́2UnyUPž!$Q\KqKac} 4Kno~`ez%eM WNn5,ȧnVR#al_plA\4dE\1/}i2ێgYZfedora-modularity-libmodulemd-357799c/modulemd/tests/test_data/compression/zstded000066400000000000000000000050241502446517500304430ustar00rootroot00000000000000(/d35Pj~x%RBu@BG&6YJoe6(lRn3iUSF.Sb}̩$-D#Ix2e `\eZ+ r%b(,(Hb~AoJ_lD$$$&2M}e}%vdJFٟ8\l 21C/\ gΗM4or̮06J6 sMΫba խ:j(<УS!R.<1!^&7o3!gF ʸHB7``\ʦNt*bIhG'x{}>T@b;X]_ivE/ө 1=addbV XL_+41@LW@a[(5&֡a)dg.u~$TcOhbY^ ߌVtaa:֧#LX]ː%TkcrIG(?0QSd|&Vdi g8t nx(y#~<(%Vx:738Cg=i?a̵f㸜?$~g`<,^U"O^X)bOTYq +Gʛ&G!Wd2j] ik@[cuq]tgSdM ȏ<䚖?Ҫ9Jsr#<Ѷ@|Fo4wOے@uQHڭ*CQ_̋mMWh t -g֋4tЫ3k [b pO|(hZSVO7<̞sL yy=d9r"LԍRpDRz x_" mlp2f&*a&Msɂ6e6/A11Ub\ɽݡrdoBh3̱ w7NpHN#r߲>YWh[T<.;2^RꆏyLx5B|_-jɷ3p7t{ /Y` pE _0H8@*$P#r"5XڍX )21,(Hb~AoJ_lD$$$&2M}e}%vdJFٟ8\l 21C/\ gΗM4or̮06J6 sMΫba խ:j(<УS!R.<1!^&7o3!gF ʸHB7``\ʦNt*bIhG'x{}>T@b;X]_ivE/ө 1=addbV XL_+41@LW@a[(5&֡a)dg.u~$TcOhbY^ ߌVtaa:֧#LX]ː%TkcrIG(?0QSd|&Vdi g8t nx(y#~<(%Vx:738Cg=i?a̵f㸜?$~g`<,^U"O^X)bOTYq +Gʛ&G!Wd2j] ik@[cuq]tgSdM ȏ<䚖?Ҫ9Jsr#<Ѷ@|Fo4wOے@uQHڭ*CQ_̋mMWh t -g֋4tЫ3k [b pO|(hZSVO7<̞sL yy=d9r"LԍRpDRz x_" mlp2f&*a&Msɂ6e6/A11Ub\ɽݡrdoBh3̱ w7NpHN#r߲>YWh[T<.;2^RꆏyLx5B|_-jɷ3p7t{ /Y` pE _0H8@*$P#r"5XڍX )21- Node.js is a platform built on Chrome''s JavaScript runtime for easily building fast, scalable network applications. Node.js uses an event-driven, non-blocking I/O model that makes it lightweight and efficient, perfect for data-intensive real-time applications that run across distributed devices. license: module: - MIT dependencies: buildrequires: platform: f30 requires: platform: f30 references: community: http://nodejs.org documentation: http://nodejs.org/en/docs tracker: https://github.com/nodejs/node/issues profiles: default: rpms: - nodejs - npm development: rpms: - nodejs - nodejs-devel - npm minimal: rpms: - nodejs api: rpms: - nodejs - nodejs-devel - npm components: rpms: libuv: rationale: Platform abstraction layer for Node.js ref: 1 buildorder: 0 http-parser: rationale: Needed for parsing HTTP requests ref: main buildorder: 0 nghttp2: rationale: Needed for HTTP2 support ref: main buildorder: 0 nodejs: rationale: Javascript runtime and npm package manager. ref: 10 buildorder: 10 ... fedora-modularity-libmodulemd-357799c/modulemd/tests/test_data/dependson_v2.yaml000066400000000000000000000026241502446517500301370ustar00rootroot00000000000000--- document: modulemd version: 2 data: summary: Javascript runtime description: >- Node.js is a platform built on Chrome''s JavaScript runtime for easily building fast, scalable network applications. Node.js uses an event-driven, non-blocking I/O model that makes it lightweight and efficient, perfect for data-intensive real-time applications that run across distributed devices. license: module: - MIT dependencies: - buildrequires: platform: [ f30 ] streamname: [ ] requires: platform: [ -f28 ] streamname: [ ] references: community: http://nodejs.org documentation: http://nodejs.org/en/docs tracker: https://github.com/nodejs/node/issues profiles: default: rpms: - nodejs - npm development: rpms: - nodejs - nodejs-devel - npm minimal: rpms: - nodejs api: rpms: - nodejs - nodejs-devel - npm components: rpms: libuv: rationale: Platform abstraction layer for Node.js ref: 1 buildorder: 0 http-parser: rationale: Needed for parsing HTTP requests ref: main buildorder: 0 nghttp2: rationale: Needed for HTTP2 support ref: main buildorder: 0 nodejs: rationale: Javascript runtime and npm package manager. ref: 10 buildorder: 10 ... fedora-modularity-libmodulemd-357799c/modulemd/tests/test_data/f29-updates.yaml000066400000000000000000023376711502446517500276330ustar00rootroot00000000000000--- document: modulemd version: 2 data: name: testmodule stream: main version: 20180405123256 context: c2c572ec arch: x86_64 summary: A test module in all its beautiful beauty description: >- This module demonstrates how to write simple modulemd files And can be used for testing the build and release pipeline. license: module: - MIT content: - MIT xmd: mbs: scmurl: https://src.fedoraproject.org/modules/testmodule.git?#0d33e028e4561f82ea43f670ee6366675cd6a6fe commit: 0d33e028e4561f82ea43f670ee6366675cd6a6fe buildrequires: platform: ref: virtual stream: f29 filtered_rpms: [] version: 4 rpms: perl-List-Compare: ref: c6a689a6ce2683b15b32f83e6cb5d43ffd3816f5 tangerine: ref: 239ada495d941ceefd8f359e1d8a47877fbba4a9 perl-Tangerine: ref: 7e96446223f1ad84a26c7cf23d6591cd9f6326c6 requires: platform: ref: virtual stream: f29 filtered_rpms: [] version: 4 dependencies: - buildrequires: platform: [f29] requires: platform: [f29] references: community: https://docs.pagure.org/modularity/ documentation: https://fedoraproject.org/wiki/Fedora_Packaging_Guidelines_for_Modules profiles: default: rpms: - tangerine api: rpms: - perl-Tangerine - tangerine components: rpms: perl-List-Compare: rationale: A dependency of tangerine. repository: git://pkgs.fedoraproject.org/rpms/perl-List-Compare cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-List-Compare ref: main perl-Tangerine: rationale: Provides API for this module and is a dependency of tangerine. repository: git://pkgs.fedoraproject.org/rpms/perl-Tangerine cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-Tangerine ref: 7e96446 tangerine: rationale: Provides API for this module. repository: git://pkgs.fedoraproject.org/rpms/tangerine cache: http://pkgs.fedoraproject.org/repo/pkgs/tangerine ref: main buildorder: 10 artifacts: rpms: - perl-List-Compare-0:0.53-9.module_1588+5eed94c6.noarch - perl-Tangerine-0:0.22-2.module_1588+5eed94c6.noarch - tangerine-0:0.22-7.module_1588+5eed94c6.noarch ... --- document: modulemd version: 2 data: name: stratis stream: main version: 20180726133047 context: b33445dc arch: x86_64 summary: Stratis Storage description: >- Easy to use local storage management. license: module: - MIT content: - MIT xmd: mbs: mse: TRUE scmurl: https://src.fedoraproject.org/modules/stratis.git?#9b532650b3aa46f31e204f9e592f77092b39d84c commit: 9b532650b3aa46f31e204f9e592f77092b39d84c buildrequires: platform: ref: f29 stream: f29 context: 00000000 version: 5 filtered_rpms: [] rpms: stratisd: ref: fdbba2c34c470cc375c439c92a5d88093a6c5a5b dependencies: - buildrequires: platform: [f29] requires: platform: [] references: community: https://github.com/stratis-storage documentation: https://stratis-storage.github.io tracker: https://github.com/stratis-storage/stratisd/issues profiles: default: rpms: - stratis-cli - stratisd api: rpms: - stratisd components: rpms: stratisd: rationale: 'Daemon that manages a pool of block devices to create flexible filesystems. Main component. ' repository: git://pkgs.fedoraproject.org/rpms/stratisd cache: http://pkgs.fedoraproject.org/repo/pkgs/stratisd ref: main artifacts: rpms: - stratisd-0:0.5.4-3.module_1955+a3f37153.x86_64 ... --- document: modulemd version: 2 data: name: stratis stream: 1 version: 20181109160136 context: 6c81f848 arch: x86_64 summary: Stratis Storage description: >- Easy to use local storage management. license: module: - MIT content: - MIT xmd: mbs: mse: TRUE scmurl: https://src.fedoraproject.org/modules/stratis.git?#ce65afbb40873abbc52bf78148fff7ed590269dd commit: ce65afbb40873abbc52bf78148fff7ed590269dd buildrequires: platform: ref: f29 stream: f29 context: 00000000 version: 5 filtered_rpms: [] rpms: rust-errno: ref: c53e20309d905de0a6da0872f690925a8db5ed42 rust-strsim: ref: 3a1928c8136b290a3fadab301fbc4bf1b7d56931 rust-byteorder: ref: 35aaadf1730f3e63acd50b840f429a5c5420fd3d rust-indexmap: ref: 3d839547100cbed3db4fdb0820453bbe8ddaaf92 rust-devicemapper: ref: b99aed83f34f6def10f184d2eca50038881b3417 rust-packaging: ref: 04e7ad287a632a68ccd10cfd35a636852108ad28 rust-quick-error: ref: f612214953cdf2c776ce141f5299f6b222fb778b rust-no-panic: ref: d78ce0575bcca63209fd5b548a39836f6b4ee767 rust-crossbeam-deque0.4: ref: 6127953b009eeca38b9cc83ffa7eb1e255f49fe4 rust-serde_derive: ref: 40e60857b9cd3c056c2aa748dbb7c95b9ccbbbe2 rust-heapsize: ref: 5d1d4b2c2356f42760dd4cbb90b7cbe982f98d95 rust-newtype_derive: ref: 8bf6359fd714878feaebafa99ec1af10fee9291f rust-memchr: ref: d120e8a40f353875824c64b40552636a3909eaee rust-nodrop: ref: e34f4c89e485813dc026385cad714e0a289ec26e rust-arrayvec: ref: 24a1a39e20b3a7dd3ac99cd0e2497f6873d79eaf rust-dbus: ref: 8e1dc964a7e77d4a598b24894d7e41ed99767363 rust-ansi_term: ref: aa0509304673d8e85ed10b2faff32a88da30fcc9 rust-crc: ref: 4fa0c9f411333ff766d7a05a1fd1976e84a70300 rust-rand_core0.2: ref: 7e53c7b53cad8bd7c4461cfe9943f753dca387fd rust-same-file: ref: 470c5feeacc4d128a7b2c3796cc92e480cdddf5e rust-serde: ref: 21cd19ce4eb8e00fc1b50e8166dfcf30a48d1578 rust-rand: ref: a5ffd6a802c4d192024250b53744eb82d4129db8 rust-rand0.4: ref: 07c8d720dfc54c5594cb99aececc6ab5d3753ed3 rust-serde_test: ref: 44281935d7ee03e797f656f75a9d582848bad5e6 rust-either: ref: 5046abacfee588fd28ae7a73a8ab4166d669ef7c rust-proc-macro2: ref: 7c38fd6963b75147e46fcd771fcc68ac416fdb58 rust-crossbeam-epoch0.5: ref: d2bd3e0a22b054d723fc31144206bd4cc04b781a rust-quote: ref: bcfb70145c5382f461795c19a9a1105317e5148e rust-syn: ref: f38c9c3981efccbdc4dcb54fa74dc9c15cd5f069 rust-walkdir: ref: f5a5bffe5d7143111908c5df36a6c423f239f6c0 rust-rayon: ref: e9eb09faa3e501c814db53a0c3291a26d8f4b33c rust-num_cpus: ref: 54a3646595ccb45c6a04c0e3fec41ad14402d631 rust-num-traits: ref: 4e2949127b5f08f46a8d6dcf0734f814068b5392 rust-uuid: ref: 751ec69432e02ed8c75999c87433c136ff14b256 rust-nix: ref: b8ba0ad9023296e588d9184110913aebcfe35a0c rust-unicode-xid: ref: e67cc74e1354143c0fb5edf7af67c176ae7edcaa rust-ucd-util: ref: 27620e66367adf48808a04002e94b4fcadcc415c rust-lazy_static: ref: abdefd9d971dc70073fdc6adddbcb0ff18340a0e rust-yaml-rust0.3: ref: 5ecf7d35b65788bd2a4ce03258c229476ddae35f rust-backtrace: ref: ec392d1c50365099965d064a27ef2dcc04322c01 rust-regex: ref: 2229a1ea0cbbaf676496339c1e81864cd4003fc6 rust-atty: ref: ac26eb2fbd95334a8310a4fad799ca9044bc12c1 rust-semver-parser0.7: ref: 37048a01c68df96f31b0b867bb7730a37b5a8ebe rust-rustc-demangle: ref: 90626dce0c46fb5345a2f56eaa343c7e974eebb9 stratis-cli: ref: 9aefac4b6c4a215793828903b433fe3bacc481f6 rust-sha1: ref: e9270274339c2485c76e81a6e2bd7f9b1cca3aeb rust-aho-corasick: ref: 2133a27af85565874a0d9c8d15e18037244ff38a rust-humantime: ref: 054caed9ce3a930f1255fc78a7f34610f526334d rust-chrono: ref: 6d71f62ed6b5e291be41c181b20beb0e11a6d06b rust-rustc_version: ref: 0aed6639ef0f23bca9c76a95a9dabc7a4d40744f stratisd: ref: 6ecaae566fc848bcc322dfeb30080df0c1ca82aa rust-semver: ref: ecb153f342062549c1d129fd88fc51cfb82ca610 rust-bitflags: ref: aab0778768757e462b20bc4d77e70bae43c1d0ad rust-time: ref: 8101c26a92d86a7a84474ee824dceacf6398d7a2 rust-serde_json: ref: da3aa74649a01ffe901136b2285998bf9e03a3f2 rust-backtrace-sys: ref: 63730f1800ad92312bd517bdadec0fac5fbed012 rust-cfg-if: ref: 3ff094ad603593adc3a036e1610b239fb8480142 rust-quickcheck0.6: ref: 0779326fdaf2de36e44a14d48da41201fc071621 rust-rustc-serialize: ref: b9b6a9aa8f91f45e8eb624abac6c08385993f890 rust-libdbus-sys: ref: 1a93fab75d75adf741bccc51a1a25376bfbec211 rust-num-integer: ref: 4f03bdde59b7c8661e6aa18ad253c0c3c5dd64ff rust-utf8-ranges: ref: 3c8bb35c329c1133e596dd94754dfc5fe2e42641 rust-env_logger: ref: 87d004618b011013b0d95a49fa95a7a93b6117c8 rust-log: ref: 8e19b2e015c86d959a2a69f391f8e84585f2f0ed rust-cc: ref: 44faccd5aa73354a6643769755cf98da94ffece2 rust-textwrap: ref: cf2ce1a4cef3436fd130838c4dfa7a9cfbdea512 rust-tempfile: ref: 4a36299a562f07be9868f33243666d95408f434b rust-linked-hash-map: ref: f0e7523a34b8ec7a8c9051e33f22577772da6b83 rust-itoa: ref: a74464c89c102e86d26cbc500d853ae626a30100 rust-scopeguard: ref: 53c1fd50c528fa9ddf49d8c4b996e7acde05bc05 rust-rand_core: ref: df6ff2cd8a67a3b277509f5aa4bf3ddfa755587e rust-remove_dir_all: ref: 32d46357989efa9c0d518c5cbb51d74f1aeec01b rust-unicode-width: ref: 6599a5158eea49a44ee255445af3b1fc5bfc4661 rust-clap: ref: 49f0406741f0e9b2fe4b6ed19aa809302adaa0a2 rust-bytes: ref: 0cee9ee117a1566e41ffacd980af92696fb6bc84 rust-crossbeam-utils: ref: fa961b60d20ed68c7598a1634bd387f56dd43da8 rust-regex-syntax: ref: 39c750b81b1bd8bbc97f9804008ea09382d5f68c rust-ryu: ref: 824f092151ea888af1fc590dbdf7bef11ce71389 rust-pkg-config: ref: 349c7189cb33d384e542ddf3ccf4b53c607b5dd1 rust-vec_map: ref: 18b851a496671350e388786f18d3ec18c610d603 rust-iovec: ref: e432ee0eef42b32e6f6d42917b74ecc1cbec565a rust-macro-attr: ref: b50327af5ed7dce400814814051edc34512ada65 rust-loopdev: ref: 572fb473b9223ac25b0f26e21094419277cc721b rust-timerfd: ref: 03fcbbea6dcd9e90b71a38cb3efadb68d86e68b3 rust-void: ref: c0d2cf66ed917dce908190930a7337723a388645 rust-glob: ref: 1aa02b1bea883cbcb8a2e8f7787b859e80616f9e rust-rayon-core: ref: d0107623e5c040be5a17ef61447b79e701d1dc3b rust-cpp_demangle: ref: 3f1ad60f2da422a7094ccc01786e822b5b1023a0 rust-error-chain: ref: 73336d5d0209cd5826348b4e5fc551656627b8e8 rust-version_check: ref: 11ca374687fe9a9db49be1ede98a4c92b492e1e1 rust-libudev-sys: ref: 07573c661d859725a709a3b53f5d0f13d16200c8 rust-libc: ref: b4916eac7d00ad4d6865282f07dc71b46437bf1f rust-build_const: ref: d0c58db506cb4f2226e59ddb4a6f070969301b64 rust-termcolor: ref: a68dc908bc946b62c6e758a1a01494dc2f4aa76e rust-libmount: ref: 90ec9bfe997b6120433857b2cf6afc06d613e2b2 rust-thread_local: ref: 0679edb992d183e75f282660ee632fcdfea7ea15 rust-md5: ref: 44a72f0a6c18831957a8d925ef190ad484039f3b rust-memoffset: ref: 62c46ec2976e1dccf3d18e0e2ff01699492413f5 rust-libudev: ref: 1cd04ccd6897f2a0f809d932d82663da38817ea5 rust-term_size: ref: 7c62e64aa170d34ec9ea65b7dfd286e19d9b7b0c dependencies: - buildrequires: platform: [f29] requires: platform: [f29] references: community: https://github.com/stratis-storage documentation: https://stratis-storage.github.io tracker: https://github.com/stratis-storage/stratisd/issues profiles: default: rpms: - stratis-cli - stratisd api: rpms: - stratis-cli - stratisd filter: rpms: - python3-rust2rpm - rust-aho-corasick+default-devel - rust-aho-corasick-devel - rust-ansi_term+default-devel - rust-ansi_term-devel - rust-arrayvec+default-devel - rust-arrayvec+serde-1-devel - rust-arrayvec+serde-devel - rust-arrayvec+std-devel - rust-arrayvec-devel - rust-atty+default-devel - rust-atty-devel - rust-backtrace+backtrace-sys-devel - rust-backtrace+cpp_demangle-devel - rust-backtrace+default-devel - rust-backtrace+dladdr-devel - rust-backtrace+libbacktrace-devel - rust-backtrace+libunwind-devel - rust-backtrace+rustc-serialize-devel - rust-backtrace+serde-devel - rust-backtrace+serde_derive-devel - rust-backtrace+serialize-rustc-devel - rust-backtrace+serialize-serde-devel - rust-backtrace+unix-backtrace-devel - rust-backtrace-devel - rust-backtrace-sys+default-devel - rust-backtrace-sys-devel - rust-bitflags+default-devel - rust-bitflags-devel - rust-build_const+default-devel - rust-build_const+std-devel - rust-build_const-devel - rust-byteorder+default-devel - rust-byteorder+i128-devel - rust-byteorder+std-devel - rust-byteorder-devel - rust-bytes+default-devel - rust-bytes+either-devel - rust-bytes+i128-devel - rust-bytes+serde-devel - rust-bytes-devel - rust-cc+default-devel - rust-cc+parallel-devel - rust-cc+rayon-devel - rust-cc-devel - rust-cfg-if+default-devel - rust-cfg-if-devel - rust-chrono+clock-devel - rust-chrono+default-devel - rust-chrono+rustc-serialize-devel - rust-chrono+serde-devel - rust-chrono+time-devel - rust-chrono-devel - rust-clap+ansi_term-devel - rust-clap+atty-devel - rust-clap+color-devel - rust-clap+debug-devel - rust-clap+default-devel - rust-clap+no_cargo-devel - rust-clap+strsim-devel - rust-clap+suggestions-devel - rust-clap+term_size-devel - rust-clap+unstable-devel - rust-clap+vec_map-devel - rust-clap+wrap_help-devel - rust-clap+yaml-devel - rust-clap+yaml-rust-devel - rust-clap-devel - rust-cpp_demangle+alloc-devel - rust-cpp_demangle+default-devel - rust-cpp_demangle+logging-devel - rust-cpp_demangle+std-devel - rust-cpp_demangle-devel - rust-crc+default-devel - rust-crc+std-devel - rust-crc-devel - rust-crossbeam-deque0.4+default-devel - rust-crossbeam-deque0.4-devel - rust-crossbeam-epoch0.5+default-devel - rust-crossbeam-epoch0.5+lazy_static-devel - rust-crossbeam-epoch0.5+sanitize-devel - rust-crossbeam-epoch0.5+use_std-devel - rust-crossbeam-epoch0.5-devel - rust-crossbeam-utils+default-devel - rust-crossbeam-utils+use_std-devel - rust-crossbeam-utils-devel - rust-dbus+default-devel - rust-dbus+no-string-validation-devel - rust-dbus-devel - rust-devicemapper+default-devel - rust-devicemapper-devel - rust-either+default-devel - rust-either+serde-devel - rust-either+use_std-devel - rust-either-devel - rust-env_logger+default-devel - rust-env_logger+regex-devel - rust-env_logger-devel - rust-errno+default-devel - rust-errno-devel - rust-error-chain+backtrace-devel - rust-error-chain+default-devel - rust-error-chain+example_generated-devel - rust-error-chain-devel - rust-glob+default-devel - rust-glob-devel - rust-heapsize+default-devel - rust-heapsize+unstable-devel - rust-heapsize-devel - rust-humantime+default-devel - rust-humantime-devel - rust-indexmap+default-devel - rust-indexmap+serde-1-devel - rust-indexmap+serde-devel - rust-indexmap-devel - rust-iovec+default-devel - rust-iovec-devel - rust-itoa+default-devel - rust-itoa+i128-devel - rust-itoa+std-devel - rust-itoa-devel - rust-lazy_static+default-devel - rust-lazy_static-devel - rust-libc+align-devel - rust-libc+default-devel - rust-libc+use_std-devel - rust-libc-devel - rust-libdbus-sys+default-devel - rust-libdbus-sys-devel - rust-libmount+default-devel - rust-libmount-devel - rust-libudev+default-devel - rust-libudev-devel - rust-libudev-sys+default-devel - rust-libudev-sys-devel - rust-linked-hash-map+default-devel - rust-linked-hash-map+heapsize-devel - rust-linked-hash-map+heapsize_impl-devel - rust-linked-hash-map+serde-devel - rust-linked-hash-map+serde_impl-devel - rust-linked-hash-map-devel - rust-log+default-devel - rust-log+max_level_debug-devel - rust-log+max_level_error-devel - rust-log+max_level_info-devel - rust-log+max_level_off-devel - rust-log+max_level_trace-devel - rust-log+max_level_warn-devel - rust-log+release_max_level_debug-devel - rust-log+release_max_level_error-devel - rust-log+release_max_level_info-devel - rust-log+release_max_level_off-devel - rust-log+release_max_level_trace-devel - rust-log+release_max_level_warn-devel - rust-log+serde-devel - rust-log+std-devel - rust-log-devel - rust-loopdev+default-devel - rust-loopdev-devel - rust-macro-attr+default-devel - rust-macro-attr+std-devel - rust-macro-attr+unstable-macros-1-1-devel - rust-macro-attr-devel - rust-md5+default-devel - rust-md5-devel - rust-memchr+default-devel - rust-memchr+libc-devel - rust-memchr+use_std-devel - rust-memchr-devel - rust-memoffset+default-devel - rust-memoffset-devel - rust-newtype_derive+default-devel - rust-newtype_derive+std-devel - rust-newtype_derive+std-unstable-devel - rust-newtype_derive-devel - rust-nix+default-devel - rust-nix-devel - rust-no-panic+default-devel - rust-no-panic-devel - rust-nodrop+default-devel - rust-nodrop+std-devel - rust-nodrop+use_needs_drop-devel - rust-nodrop-devel - rust-num-integer+default-devel - rust-num-integer+i128-devel - rust-num-integer+std-devel - rust-num-integer-devel - rust-num-traits+default-devel - rust-num-traits+i128-devel - rust-num-traits+std-devel - rust-num-traits-devel - rust-num_cpus+default-devel - rust-num_cpus-devel - rust-packaging - rust-pkg-config+default-devel - rust-pkg-config-devel - rust-proc-macro2+default-devel - rust-proc-macro2+proc-macro-devel - rust-proc-macro2-devel - rust-quick-error+default-devel - rust-quick-error-devel - rust-quickcheck0.6+default-devel - rust-quickcheck0.6+env_logger-devel - rust-quickcheck0.6+i128-devel - rust-quickcheck0.6+log-devel - rust-quickcheck0.6+regex-devel - rust-quickcheck0.6+unstable-devel - rust-quickcheck0.6+use_logging-devel - rust-quickcheck0.6-devel - rust-quote+default-devel - rust-quote+proc-macro-devel - rust-quote-devel - rust-rand+alloc-devel - rust-rand+default-devel - rust-rand+i128_support-devel - rust-rand+libc-devel - rust-rand+log-devel - rust-rand+serde-devel - rust-rand+serde1-devel - rust-rand+serde_derive-devel - rust-rand+std-devel - rust-rand-devel - rust-rand0.4+alloc-devel - rust-rand0.4+default-devel - rust-rand0.4+i128_support-devel - rust-rand0.4+libc-devel - rust-rand0.4+std-devel - rust-rand0.4-devel - rust-rand_core+alloc-devel - rust-rand_core+default-devel - rust-rand_core+serde-devel - rust-rand_core+serde1-devel - rust-rand_core+serde_derive-devel - rust-rand_core+std-devel - rust-rand_core-devel - rust-rand_core0.2+alloc-devel - rust-rand_core0.2+default-devel - rust-rand_core0.2+serde1-devel - rust-rand_core0.2+std-devel - rust-rand_core0.2-devel - rust-rayon+default-devel - rust-rayon-core+default-devel - rust-rayon-core-devel - rust-rayon-devel - rust-regex+default-devel - rust-regex+pattern-devel - rust-regex+unstable-devel - rust-regex+use_std-devel - rust-regex-devel - rust-regex-syntax+default-devel - rust-regex-syntax-devel - rust-remove_dir_all+default-devel - rust-remove_dir_all-devel - rust-rustc-demangle+default-devel - rust-rustc-demangle-devel - rust-rustc-serialize+default-devel - rust-rustc-serialize-devel - rust-rustc_version+default-devel - rust-rustc_version-devel - rust-ryu+default-devel - rust-ryu+no-panic-devel - rust-ryu+small-devel - rust-ryu-devel - rust-same-file+default-devel - rust-same-file-devel - rust-scopeguard+default-devel - rust-scopeguard+use_std-devel - rust-scopeguard-devel - rust-semver+default-devel - rust-semver+serde-devel - rust-semver-devel - rust-semver-parser0.7+default-devel - rust-semver-parser0.7-devel - rust-serde+alloc-devel - rust-serde+default-devel - rust-serde+derive-devel - rust-serde+rc-devel - rust-serde+serde_derive-devel - rust-serde+std-devel - rust-serde+unstable-devel - rust-serde-devel - rust-serde_derive+default-devel - rust-serde_derive+deserialize_in_place-devel - rust-serde_derive-devel - rust-serde_json+arbitrary_precision-devel - rust-serde_json+default-devel - rust-serde_json+indexmap-devel - rust-serde_json+preserve_order-devel - rust-serde_json+raw_value-devel - rust-serde_json-devel - rust-serde_test+default-devel - rust-serde_test-devel - rust-sha1+default-devel - rust-sha1+serde-devel - rust-sha1+std-devel - rust-sha1-devel - rust-strsim+default-devel - rust-strsim-devel - rust-syn+clone-impls-devel - rust-syn+default-devel - rust-syn+derive-devel - rust-syn+extra-traits-devel - rust-syn+fold-devel - rust-syn+full-devel - rust-syn+parsing-devel - rust-syn+printing-devel - rust-syn+proc-macro-devel - rust-syn+quote-devel - rust-syn+visit-devel - rust-syn+visit-mut-devel - rust-syn-devel - rust-tempfile+default-devel - rust-tempfile-devel - rust-term_size+debug-devel - rust-term_size+default-devel - rust-term_size+unstable-devel - rust-term_size-devel - rust-termcolor+default-devel - rust-termcolor-devel - rust-textwrap+default-devel - rust-textwrap+term_size-devel - rust-textwrap-devel - rust-thread_local+default-devel - rust-thread_local-devel - rust-time+default-devel - rust-time+rustc-serialize-devel - rust-time-devel - rust-timerfd+default-devel - rust-timerfd-devel - rust-ucd-util+default-devel - rust-ucd-util-devel - rust-unicode-width+default-devel - rust-unicode-width+no_std-devel - rust-unicode-width-devel - rust-unicode-xid+default-devel - rust-unicode-xid+no_std-devel - rust-unicode-xid-devel - rust-utf8-ranges+default-devel - rust-utf8-ranges-devel - rust-uuid+byteorder-devel - rust-uuid+const_fn-devel - rust-uuid+default-devel - rust-uuid+md5-devel - rust-uuid+nightly-devel - rust-uuid+rand-devel - rust-uuid+serde-devel - rust-uuid+sha1-devel - rust-uuid+std-devel - rust-uuid+u128-devel - rust-uuid+use_std-devel - rust-uuid+v1-devel - rust-uuid+v3-devel - rust-uuid+v4-devel - rust-uuid+v5-devel - rust-uuid-devel - rust-vec_map+default-devel - rust-vec_map+eders-devel - rust-vec_map+serde-devel - rust-vec_map-devel - rust-version_check+default-devel - rust-version_check-devel - rust-void+default-devel - rust-void+std-devel - rust-void-devel - rust-walkdir+default-devel - rust-walkdir-devel - rust-yaml-rust0.3+default-devel - rust-yaml-rust0.3+linked-hash-map-devel - rust-yaml-rust0.3+preserve_order-devel - rust-yaml-rust0.3-devel components: rpms: rust-aho-corasick: rationale: Dependency of rust-regex. repository: git+https://src.fedoraproject.org/rpms/rust-aho-corasick cache: https://src.fedoraproject.org/repo/pkgs/rust-aho-corasick ref: main buildorder: 30 rust-ansi_term: rationale: Dependency of rust-clap. repository: git+https://src.fedoraproject.org/rpms/rust-ansi_term cache: https://src.fedoraproject.org/repo/pkgs/rust-ansi_term ref: main buildorder: 10 rust-arrayvec: rationale: Dependency of rust-crossbeam-epoch0.5. repository: git+https://src.fedoraproject.org/rpms/rust-arrayvec cache: https://src.fedoraproject.org/repo/pkgs/rust-arrayvec ref: main buildorder: 70 rust-atty: rationale: Dependency of rust-clap, rust-env_logger. repository: git+https://src.fedoraproject.org/rpms/rust-atty cache: https://src.fedoraproject.org/repo/pkgs/rust-atty ref: main buildorder: 20 rust-backtrace: rationale: Dependency of rust-error-chain. repository: git+https://src.fedoraproject.org/rpms/rust-backtrace cache: https://src.fedoraproject.org/repo/pkgs/rust-backtrace ref: main buildorder: 140 rust-backtrace-sys: rationale: Dependency of rust-backtrace. repository: git+https://src.fedoraproject.org/rpms/rust-backtrace-sys cache: https://src.fedoraproject.org/repo/pkgs/rust-backtrace-sys ref: main buildorder: 130 rust-bitflags: rationale: Dependency of rust-clap, rust-devicemapper, rust-nix. repository: git+https://src.fedoraproject.org/rpms/rust-bitflags cache: https://src.fedoraproject.org/repo/pkgs/rust-bitflags ref: main buildorder: 10 rust-build_const: rationale: Dependency of rust-crc. repository: git+https://src.fedoraproject.org/rpms/rust-build_const cache: https://src.fedoraproject.org/repo/pkgs/rust-build_const ref: main buildorder: 10 rust-byteorder: rationale: Dependency of rust-bytes, rust-uuid, stratisd. repository: git+https://src.fedoraproject.org/rpms/rust-byteorder cache: https://src.fedoraproject.org/repo/pkgs/rust-byteorder ref: main buildorder: 10 rust-bytes: rationale: Dependency of rust-nix. repository: git+https://src.fedoraproject.org/rpms/rust-bytes cache: https://src.fedoraproject.org/repo/pkgs/rust-bytes ref: main buildorder: 80 rust-cc: rationale: Dependency of rust-backtrace-sys. repository: git+https://src.fedoraproject.org/rpms/rust-cc cache: https://src.fedoraproject.org/repo/pkgs/rust-cc ref: main buildorder: 120 rust-cfg-if: rationale: Dependency of rust-backtrace, rust-cpp_demangle, rust-crossbeam-epoch0.5, rust-log, rust-memchr, rust-nix, rust-tempfile, rust-uuid. repository: git+https://src.fedoraproject.org/rpms/rust-cfg-if cache: https://src.fedoraproject.org/repo/pkgs/rust-cfg-if ref: main buildorder: 10 rust-chrono: rationale: Dependency of stratisd. repository: git+https://src.fedoraproject.org/rpms/rust-chrono cache: https://src.fedoraproject.org/repo/pkgs/rust-chrono ref: main buildorder: 90 rust-clap: rationale: Dependency of stratisd. repository: git+https://src.fedoraproject.org/rpms/rust-clap cache: https://src.fedoraproject.org/repo/pkgs/rust-clap ref: main buildorder: 90 rust-cpp_demangle: rationale: Dependency of rust-backtrace. repository: git+https://src.fedoraproject.org/rpms/rust-cpp_demangle cache: https://src.fedoraproject.org/repo/pkgs/rust-cpp_demangle ref: main buildorder: 20 rust-crc: rationale: Dependency of stratisd. repository: git+https://src.fedoraproject.org/rpms/rust-crc cache: https://src.fedoraproject.org/repo/pkgs/rust-crc ref: main buildorder: 20 rust-crossbeam-deque0.4: rationale: Dependency of rust-rayon, rust-rayon-core. repository: git+https://src.fedoraproject.org/rpms/rust-crossbeam-deque0.4 cache: https://src.fedoraproject.org/repo/pkgs/rust-crossbeam-deque0.4 ref: main buildorder: 90 rust-crossbeam-epoch0.5: rationale: Dependency of rust-crossbeam-deque0.4. repository: git+https://src.fedoraproject.org/rpms/rust-crossbeam-epoch0.5 cache: https://src.fedoraproject.org/repo/pkgs/rust-crossbeam-epoch0.5 ref: main buildorder: 80 rust-crossbeam-utils: rationale: Dependency of rust-crossbeam-deque0.4, rust-crossbeam-epoch0.5. repository: git+https://src.fedoraproject.org/rpms/rust-crossbeam-utils cache: https://src.fedoraproject.org/repo/pkgs/rust-crossbeam-utils ref: main buildorder: 10 rust-dbus: rationale: Dependency of stratisd. repository: git+https://src.fedoraproject.org/rpms/rust-dbus cache: https://src.fedoraproject.org/repo/pkgs/rust-dbus ref: main buildorder: 30 rust-devicemapper: rationale: Dependency of stratisd. repository: git+https://src.fedoraproject.org/rpms/rust-devicemapper cache: https://src.fedoraproject.org/repo/pkgs/rust-devicemapper ref: main buildorder: 160 rust-either: rationale: Dependency of rust-bytes, rust-rayon, stratisd. repository: git+https://src.fedoraproject.org/rpms/rust-either cache: https://src.fedoraproject.org/repo/pkgs/rust-either ref: main buildorder: 70 rust-env_logger: rationale: Dependency of rust-quickcheck0.6, stratisd. repository: git+https://src.fedoraproject.org/rpms/rust-env_logger cache: https://src.fedoraproject.org/repo/pkgs/rust-env_logger ref: main buildorder: 80 rust-errno: rationale: Dependency of rust-loopdev. repository: git+https://src.fedoraproject.org/rpms/rust-errno cache: https://src.fedoraproject.org/repo/pkgs/rust-errno ref: main buildorder: 20 rust-error-chain: rationale: Dependency of rust-devicemapper, stratisd. repository: git+https://src.fedoraproject.org/rpms/rust-error-chain cache: https://src.fedoraproject.org/repo/pkgs/rust-error-chain ref: main buildorder: 150 rust-glob: rationale: Dependency of rust-cpp_demangle. repository: git+https://src.fedoraproject.org/rpms/rust-glob cache: https://src.fedoraproject.org/repo/pkgs/rust-glob ref: main buildorder: 10 rust-heapsize: rationale: Dependency of rust-linked-hash-map. repository: git+https://src.fedoraproject.org/rpms/rust-heapsize cache: https://src.fedoraproject.org/repo/pkgs/rust-heapsize ref: main buildorder: 10 rust-humantime: rationale: Dependency of rust-env_logger. repository: git+https://src.fedoraproject.org/rpms/rust-humantime cache: https://src.fedoraproject.org/repo/pkgs/rust-humantime ref: main buildorder: 20 rust-indexmap: rationale: Dependency of rust-serde_json. repository: git+https://src.fedoraproject.org/rpms/rust-indexmap cache: https://src.fedoraproject.org/repo/pkgs/rust-indexmap ref: main buildorder: 70 rust-iovec: rationale: Dependency of rust-bytes. repository: git+https://src.fedoraproject.org/rpms/rust-iovec cache: https://src.fedoraproject.org/repo/pkgs/rust-iovec ref: main buildorder: 20 rust-itoa: rationale: Dependency of rust-serde_json. repository: git+https://src.fedoraproject.org/rpms/rust-itoa cache: https://src.fedoraproject.org/repo/pkgs/rust-itoa ref: main buildorder: 10 rust-lazy_static: rationale: Dependency of rust-crossbeam-epoch0.5, rust-nix, rust-rayon-core, rust-thread_local, stratisd. repository: git+https://src.fedoraproject.org/rpms/rust-lazy_static cache: https://src.fedoraproject.org/repo/pkgs/rust-lazy_static ref: main buildorder: 20 rust-libc: rationale: Dependency of rust-atty, rust-backtrace, rust-backtrace-sys, rust-dbus, rust-devicemapper, rust-errno, rust-iovec, rust-libmount, rust-libudev, rust-libudev-sys, rust-loopdev, rust-memchr, rust-nix, rust-num_cpus, rust-rand, rust-rand0.4, rust-rayon-core, rust-tempfile, rust-term_size, rust-time, rust-timerfd, stratisd. repository: git+https://src.fedoraproject.org/rpms/rust-libc cache: https://src.fedoraproject.org/repo/pkgs/rust-libc ref: main buildorder: 10 rust-libdbus-sys: rationale: Dependency of rust-dbus. repository: git+https://src.fedoraproject.org/rpms/rust-libdbus-sys cache: https://src.fedoraproject.org/repo/pkgs/rust-libdbus-sys ref: main buildorder: 20 rust-libmount: rationale: Dependency of rust-devicemapper, stratisd. repository: git+https://src.fedoraproject.org/rpms/rust-libmount cache: https://src.fedoraproject.org/repo/pkgs/rust-libmount ref: main buildorder: 120 rust-libudev: rationale: Dependency of rust-devicemapper, stratisd. repository: git+https://src.fedoraproject.org/rpms/rust-libudev cache: https://src.fedoraproject.org/repo/pkgs/rust-libudev ref: main buildorder: 30 rust-libudev-sys: rationale: Dependency of rust-libudev. repository: git+https://src.fedoraproject.org/rpms/rust-libudev-sys cache: https://src.fedoraproject.org/repo/pkgs/rust-libudev-sys ref: main buildorder: 20 rust-linked-hash-map: rationale: Dependency of rust-yaml-rust0.3. repository: git+https://src.fedoraproject.org/rpms/rust-linked-hash-map cache: https://src.fedoraproject.org/repo/pkgs/rust-linked-hash-map ref: main buildorder: 70 rust-log: rationale: Dependency of rust-env_logger, rust-quickcheck0.6, rust-rand, rust-time, stratisd. repository: git+https://src.fedoraproject.org/rpms/rust-log cache: https://src.fedoraproject.org/repo/pkgs/rust-log ref: main buildorder: 70 rust-loopdev: rationale: Dependency of rust-devicemapper, stratisd. repository: git+https://src.fedoraproject.org/rpms/rust-loopdev cache: https://src.fedoraproject.org/repo/pkgs/rust-loopdev ref: main buildorder: 30 rust-macro-attr: rationale: Dependency of rust-devicemapper, stratisd. repository: git+https://src.fedoraproject.org/rpms/rust-macro-attr cache: https://src.fedoraproject.org/repo/pkgs/rust-macro-attr ref: main buildorder: 40 rust-md5: rationale: Dependency of rust-uuid. repository: git+https://src.fedoraproject.org/rpms/rust-md5 cache: https://src.fedoraproject.org/repo/pkgs/rust-md5 ref: main buildorder: 10 rust-memchr: rationale: Dependency of rust-aho-corasick, rust-regex. repository: git+https://src.fedoraproject.org/rpms/rust-memchr cache: https://src.fedoraproject.org/repo/pkgs/rust-memchr ref: main buildorder: 20 rust-memoffset: rationale: Dependency of rust-crossbeam-epoch0.5. repository: git+https://src.fedoraproject.org/rpms/rust-memoffset cache: https://src.fedoraproject.org/repo/pkgs/rust-memoffset ref: main buildorder: 10 rust-newtype_derive: rationale: Dependency of rust-devicemapper. repository: git+https://src.fedoraproject.org/rpms/rust-newtype_derive cache: https://src.fedoraproject.org/repo/pkgs/rust-newtype_derive ref: main buildorder: 90 rust-nix: rationale: Dependency of rust-devicemapper, rust-libmount, stratisd. repository: git+https://src.fedoraproject.org/rpms/rust-nix cache: https://src.fedoraproject.org/repo/pkgs/rust-nix ref: main buildorder: 110 rust-no-panic: rationale: Dependency of rust-ryu. repository: git+https://src.fedoraproject.org/rpms/rust-no-panic cache: https://src.fedoraproject.org/repo/pkgs/rust-no-panic ref: main buildorder: 50 rust-nodrop: rationale: Dependency of rust-arrayvec. repository: git+https://src.fedoraproject.org/rpms/rust-nodrop cache: https://src.fedoraproject.org/repo/pkgs/rust-nodrop ref: main buildorder: 10 rust-num-integer: rationale: Dependency of rust-chrono. repository: git+https://src.fedoraproject.org/rpms/rust-num-integer cache: https://src.fedoraproject.org/repo/pkgs/rust-num-integer ref: main buildorder: 20 rust-num-traits: rationale: Dependency of rust-chrono, rust-num-integer. repository: git+https://src.fedoraproject.org/rpms/rust-num-traits cache: https://src.fedoraproject.org/repo/pkgs/rust-num-traits ref: main buildorder: 10 rust-num_cpus: rationale: Dependency of rust-rayon-core. repository: git+https://src.fedoraproject.org/rpms/rust-num_cpus cache: https://src.fedoraproject.org/repo/pkgs/rust-num_cpus ref: main buildorder: 20 rust-packaging: rationale: Something needs to orchestrate build of all stuff below. repository: git+https://src.fedoraproject.org/rpms/rust-packaging cache: https://src.fedoraproject.org/repo/pkgs/rust-packaging ref: main rust-pkg-config: rationale: Dependency of rust-libdbus-sys, rust-libudev-sys. repository: git+https://src.fedoraproject.org/rpms/rust-pkg-config cache: https://src.fedoraproject.org/repo/pkgs/rust-pkg-config ref: main buildorder: 10 rust-proc-macro2: rationale: Dependency of rust-no-panic, rust-quote, rust-serde_derive, rust-syn. repository: git+https://src.fedoraproject.org/rpms/rust-proc-macro2 cache: https://src.fedoraproject.org/repo/pkgs/rust-proc-macro2 ref: main buildorder: 20 rust-quick-error: rationale: Dependency of rust-humantime, rust-libmount. repository: git+https://src.fedoraproject.org/rpms/rust-quick-error cache: https://src.fedoraproject.org/repo/pkgs/rust-quick-error ref: main buildorder: 10 rust-quickcheck0.6: rationale: Dependency of stratisd. repository: git+https://src.fedoraproject.org/rpms/rust-quickcheck0.6 cache: https://src.fedoraproject.org/repo/pkgs/rust-quickcheck0.6 ref: main buildorder: 90 rust-quote: rationale: Dependency of rust-no-panic, rust-serde_derive, rust-syn. repository: git+https://src.fedoraproject.org/rpms/rust-quote cache: https://src.fedoraproject.org/repo/pkgs/rust-quote ref: main buildorder: 30 rust-rand: rationale: Dependency of rust-tempfile. repository: git+https://src.fedoraproject.org/rpms/rust-rand cache: https://src.fedoraproject.org/repo/pkgs/rust-rand ref: main buildorder: 90 rust-rand0.4: rationale: Dependency of rust-nix, rust-quickcheck0.6, rust-rustc-serialize, rust-uuid, stratisd. repository: git+https://src.fedoraproject.org/rpms/rust-rand0.4 cache: https://src.fedoraproject.org/repo/pkgs/rust-rand0.4 ref: main buildorder: 20 rust-rand_core: rationale: Dependency of rust-rand_core0.2. repository: git+https://src.fedoraproject.org/rpms/rust-rand_core cache: https://src.fedoraproject.org/repo/pkgs/rust-rand_core ref: main buildorder: 70 rust-rand_core0.2: rationale: Dependency of rust-rand. repository: git+https://src.fedoraproject.org/rpms/rust-rand_core0.2 cache: https://src.fedoraproject.org/repo/pkgs/rust-rand_core0.2 ref: main buildorder: 80 rust-rayon: rationale: Dependency of rust-cc. repository: git+https://src.fedoraproject.org/rpms/rust-rayon cache: https://src.fedoraproject.org/repo/pkgs/rust-rayon ref: main buildorder: 110 rust-rayon-core: rationale: Dependency of rust-rayon. repository: git+https://src.fedoraproject.org/rpms/rust-rayon-core cache: https://src.fedoraproject.org/repo/pkgs/rust-rayon-core ref: main buildorder: 100 rust-regex: rationale: Dependency of rust-env_logger. repository: git+https://src.fedoraproject.org/rpms/rust-regex cache: https://src.fedoraproject.org/repo/pkgs/rust-regex ref: main buildorder: 40 rust-regex-syntax: rationale: Dependency of rust-regex. repository: git+https://src.fedoraproject.org/rpms/rust-regex-syntax cache: https://src.fedoraproject.org/repo/pkgs/rust-regex-syntax ref: main buildorder: 20 rust-remove_dir_all: rationale: Dependency of rust-tempfile. repository: git+https://src.fedoraproject.org/rpms/rust-remove_dir_all cache: https://src.fedoraproject.org/repo/pkgs/rust-remove_dir_all ref: main buildorder: 10 rust-rustc-demangle: rationale: Dependency of rust-backtrace. repository: git+https://src.fedoraproject.org/rpms/rust-rustc-demangle cache: https://src.fedoraproject.org/repo/pkgs/rust-rustc-demangle ref: main buildorder: 10 rust-rustc-serialize: rationale: Dependency of rust-backtrace, rust-chrono, rust-macro-attr, rust-time. repository: git+https://src.fedoraproject.org/rpms/rust-rustc-serialize cache: https://src.fedoraproject.org/repo/pkgs/rust-rustc-serialize ref: main buildorder: 30 rust-rustc_version: rationale: Dependency of rust-newtype_derive. repository: git+https://src.fedoraproject.org/rpms/rust-rustc_version cache: https://src.fedoraproject.org/repo/pkgs/rust-rustc_version ref: main buildorder: 80 rust-ryu: rationale: Dependency of rust-serde_json. repository: git+https://src.fedoraproject.org/rpms/rust-ryu cache: https://src.fedoraproject.org/repo/pkgs/rust-ryu ref: main buildorder: 60 rust-same-file: rationale: Dependency of rust-walkdir. repository: git+https://src.fedoraproject.org/rpms/rust-same-file cache: https://src.fedoraproject.org/repo/pkgs/rust-same-file ref: main buildorder: 10 rust-scopeguard: rationale: Dependency of rust-crossbeam-epoch0.5. repository: git+https://src.fedoraproject.org/rpms/rust-scopeguard cache: https://src.fedoraproject.org/repo/pkgs/rust-scopeguard ref: main buildorder: 10 rust-semver: rationale: Dependency of rust-rustc_version. repository: git+https://src.fedoraproject.org/rpms/rust-semver cache: https://src.fedoraproject.org/repo/pkgs/rust-semver ref: main buildorder: 70 rust-semver-parser0.7: rationale: Dependency of rust-semver. repository: git+https://src.fedoraproject.org/rpms/rust-semver-parser0.7 cache: https://src.fedoraproject.org/repo/pkgs/rust-semver-parser0.7 ref: main buildorder: 10 rust-serde: rationale: Dependency of rust-arrayvec, rust-backtrace, rust-bytes, rust-chrono, rust-devicemapper, rust-either, rust-indexmap, rust-linked-hash-map, rust-log, rust-rand, rust-rand_core, rust-semver, rust-serde_json, rust-serde_test, rust-sha1, rust-uuid, rust-vec_map, stratisd. repository: git+https://src.fedoraproject.org/rpms/rust-serde cache: https://src.fedoraproject.org/repo/pkgs/rust-serde ref: main buildorder: 60 rust-serde_derive: rationale: Dependency of rust-backtrace, rust-rand, rust-rand_core, rust-serde, stratisd. repository: git+https://src.fedoraproject.org/rpms/rust-serde_derive cache: https://src.fedoraproject.org/repo/pkgs/rust-serde_derive ref: main buildorder: 50 rust-serde_json: rationale: Dependency of stratisd. repository: git+https://src.fedoraproject.org/rpms/rust-serde_json cache: https://src.fedoraproject.org/repo/pkgs/rust-serde_json ref: main buildorder: 80 rust-serde_test: rationale: Dependency of rust-uuid. repository: git+https://src.fedoraproject.org/rpms/rust-serde_test cache: https://src.fedoraproject.org/repo/pkgs/rust-serde_test ref: main buildorder: 70 rust-sha1: rationale: Dependency of rust-uuid. repository: git+https://src.fedoraproject.org/rpms/rust-sha1 cache: https://src.fedoraproject.org/repo/pkgs/rust-sha1 ref: main buildorder: 70 rust-strsim: rationale: Dependency of rust-clap. repository: git+https://src.fedoraproject.org/rpms/rust-strsim cache: https://src.fedoraproject.org/repo/pkgs/rust-strsim ref: main buildorder: 10 rust-syn: rationale: Dependency of rust-no-panic, rust-serde_derive. repository: git+https://src.fedoraproject.org/rpms/rust-syn cache: https://src.fedoraproject.org/repo/pkgs/rust-syn ref: main buildorder: 40 rust-tempfile: rationale: Dependency of rust-devicemapper, rust-nix, stratisd. repository: git+https://src.fedoraproject.org/rpms/rust-tempfile cache: https://src.fedoraproject.org/repo/pkgs/rust-tempfile ref: main buildorder: 100 rust-term_size: rationale: Dependency of rust-clap, rust-textwrap. repository: git+https://src.fedoraproject.org/rpms/rust-term_size cache: https://src.fedoraproject.org/repo/pkgs/rust-term_size ref: main buildorder: 20 rust-termcolor: rationale: Dependency of rust-env_logger. repository: git+https://src.fedoraproject.org/rpms/rust-termcolor cache: https://src.fedoraproject.org/repo/pkgs/rust-termcolor ref: main buildorder: 10 rust-textwrap: rationale: Dependency of rust-clap. repository: git+https://src.fedoraproject.org/rpms/rust-textwrap cache: https://src.fedoraproject.org/repo/pkgs/rust-textwrap ref: main buildorder: 30 rust-thread_local: rationale: Dependency of rust-regex. repository: git+https://src.fedoraproject.org/rpms/rust-thread_local cache: https://src.fedoraproject.org/repo/pkgs/rust-thread_local ref: main buildorder: 30 rust-time: rationale: Dependency of rust-chrono. repository: git+https://src.fedoraproject.org/rpms/rust-time cache: https://src.fedoraproject.org/repo/pkgs/rust-time ref: main buildorder: 80 rust-timerfd: rationale: Dependency of stratisd. repository: git+https://src.fedoraproject.org/rpms/rust-timerfd cache: https://src.fedoraproject.org/repo/pkgs/rust-timerfd ref: main buildorder: 20 rust-ucd-util: rationale: Dependency of rust-regex-syntax. repository: git+https://src.fedoraproject.org/rpms/rust-ucd-util cache: https://src.fedoraproject.org/repo/pkgs/rust-ucd-util ref: main buildorder: 10 rust-unicode-width: rationale: Dependency of rust-clap, rust-textwrap. repository: git+https://src.fedoraproject.org/rpms/rust-unicode-width cache: https://src.fedoraproject.org/repo/pkgs/rust-unicode-width ref: main buildorder: 10 rust-unicode-xid: rationale: Dependency of rust-proc-macro2, rust-syn. repository: git+https://src.fedoraproject.org/rpms/rust-unicode-xid cache: https://src.fedoraproject.org/repo/pkgs/rust-unicode-xid ref: main buildorder: 10 rust-utf8-ranges: rationale: Dependency of rust-regex. repository: git+https://src.fedoraproject.org/rpms/rust-utf8-ranges cache: https://src.fedoraproject.org/repo/pkgs/rust-utf8-ranges ref: main buildorder: 10 rust-uuid: rationale: Dependency of rust-devicemapper, stratisd. repository: git+https://src.fedoraproject.org/rpms/rust-uuid cache: https://src.fedoraproject.org/repo/pkgs/rust-uuid ref: main buildorder: 80 rust-vec_map: rationale: Dependency of rust-clap. repository: git+https://src.fedoraproject.org/rpms/rust-vec_map cache: https://src.fedoraproject.org/repo/pkgs/rust-vec_map ref: main buildorder: 70 rust-version_check: rationale: Dependency of rust-lazy_static, rust-memchr. repository: git+https://src.fedoraproject.org/rpms/rust-version_check cache: https://src.fedoraproject.org/repo/pkgs/rust-version_check ref: main buildorder: 10 rust-void: rationale: Dependency of rust-nix. repository: git+https://src.fedoraproject.org/rpms/rust-void cache: https://src.fedoraproject.org/repo/pkgs/rust-void ref: main buildorder: 10 rust-walkdir: rationale: Dependency of stratisd. repository: git+https://src.fedoraproject.org/rpms/rust-walkdir cache: https://src.fedoraproject.org/repo/pkgs/rust-walkdir ref: main buildorder: 20 rust-yaml-rust0.3: rationale: Dependency of rust-clap. repository: git+https://src.fedoraproject.org/rpms/rust-yaml-rust0.3 cache: https://src.fedoraproject.org/repo/pkgs/rust-yaml-rust0.3 ref: main buildorder: 80 stratis-cli: rationale: Main component. repository: git+https://src.fedoraproject.org/rpms/stratis-cli cache: https://src.fedoraproject.org/repo/pkgs/stratis-cli ref: 1 buildorder: 170 stratisd: rationale: Main component. repository: git+https://src.fedoraproject.org/rpms/stratisd cache: https://src.fedoraproject.org/repo/pkgs/stratisd ref: 1 buildorder: 170 artifacts: rpms: - rust-clap+doc-devel-0:2.32.0-6.module_2441+4b0168b8.noarch - stratis-cli-0:1.0.1-1.module_2441+4b0168b8.x86_64 - stratisd-0:1.0.1-1.module_2441+4b0168b8.x86_64 ... --- document: modulemd version: 2 data: name: skychart stream: devel version: 20181103131755 context: 6c81f848 arch: x86_64 summary: Planetarium software for the advanced amateur astronomer description: >- This program enables you to draw sky charts, making use of the data in 16 catalogs of stars and nebulae. In addition the position of planets, asteroids and comets are shown. The purpose of this program is to prepare different sky maps for a particular observation. A large number of parameters help you to choose specifically or automatically which catalogs to use, the colour and the dimension of stars and nebulae, the representation of planets, the display of labels and coordinate grids, the superposition of pictures, the condition of visibility and more. All these features make this celestial atlas more complete than a conventional planetarium. license: module: - MIT content: - MIT xmd: mbs: mse: TRUE scmurl: https://src.fedoraproject.org/modules/skychart.git?#0747bddb5da15a91c0077d715723c82495307493 commit: 0747bddb5da15a91c0077d715723c82495307493 buildrequires: platform: ref: f29 stream: f29 context: 00000000 version: 5 filtered_rpms: [] rpms: skychart: ref: 70b2092cc102e538a7a01463fae064a53d6fb032 dependencies: - buildrequires: platform: [f29] requires: platform: [f29] profiles: additional-dso: description: Core program, documentation and additional Deep Sky catalogs. rpms: - skychart - skychart-data-dso - skychart-doc additional-stars: description: Core program, documentation and additional star catalogs. rpms: - skychart - skychart-data-stars - skychart-doc default: description: Minimal installation with default catalogs and documentation. rpms: - skychart - skychart-doc full: description: Core program, documentation and all available additional catalogs. rpms: - skychart - skychart-data-dso - skychart-data-stars - skychart-doc api: rpms: - skychart components: rpms: skychart: rationale: Package in api repository: git+https://src.fedoraproject.org/rpms/skychart cache: https://src.fedoraproject.org/repo/pkgs/skychart ref: devel buildorder: 10 artifacts: rpms: - skychart-0:4.1.1-1.3792svn.module_2397+85a4f010.x86_64 - skychart-data-dso-0:4.1.1-1.3792svn.module_2397+85a4f010.noarch - skychart-data-stars-0:4.1.1-1.3792svn.module_2397+85a4f010.noarch - skychart-doc-0:4.1.1-1.3792svn.module_2397+85a4f010.noarch ... --- document: modulemd version: 2 data: name: scala stream: 2.10 version: 20180702155503 context: 819b5873 arch: x86_64 summary: A hybrid functional/object-oriented language for the JVM description: >- Scala is a general purpose programming language designed to express common programming patterns in a concise, elegant, and type-safe way. It smoothly integrates features of object-oriented and functional languages. It is also fully interoperable with Java. license: module: - MIT content: - MIT xmd: mbs: mse: TRUE scmurl: https://src.fedoraproject.org/modules/scala.git?#90dc1eed8ec4fbf279c20f5f4ec59d01efc2890a commit: 90dc1eed8ec4fbf279c20f5f4ec59d01efc2890a buildrequires: javapackages-tools: ref: 1e429a4d686d3fdd1d93ce7e8ac7254148ea3471 stream: 201801 context: b43b0c8f version: 20180629150827 filtered_rpms: [] platform: ref: virtual stream: f28 context: 00000000 version: 4 filtered_rpms: [] rpms: jline: ref: 7b4b53826f84932425353b5ebebe2e607fa6964c scala: ref: da70d06a833057731e73c845aa338b1bd6d04ded jansi: ref: 4bdd2387b97de8352a0f7a976b7d8ccde8db0b24 jansi-native: ref: 544b397797de885ca9b65442a4f956f817b76ddc hawtjni: ref: 93281e0174d79dfd549e57818292b1cbec5a7703 dependencies: - requires: platform: [] profiles: default: rpms: - scala api: rpms: - scala - scala-apidoc - scala-swing filter: rpms: - ant-scala - hawtjni - hawtjni-javadoc - jansi-javadoc - jansi-native-javadoc - jline-javadoc - maven-hawtjni-plugin buildopts: rpms: macros: | %_with_xmvn_javadoc 1 %_without_asciidoc 1 %_without_avalon 1 %_without_bouncycastle 1 %_without_cython 1 %_without_dafsa 1 %_without_desktop 1 %_without_doxygen 1 %_without_dtd 1 %_without_eclipse 1 %_without_ehcache 1 %_without_emacs 1 %_without_equinox 1 %_without_fop 1 %_without_ftp 1 %_without_gradle 1 %_without_groovy 1 %_without_hadoop 1 %_without_hsqldb 1 %_without_itext 1 %_without_jackson 1 %_without_jmh 1 %_without_jna 1 %_without_jpa 1 %_without_junit5 1 %_without_logback 1 %_without_markdown 1 %_without_memcached 1 %_without_memoryfilesystem 1 %_without_obr 1 %_without_python 1 %_without_reporting 1 %_without_scm 1 %_without_snappy 1 %_without_spring 1 %_without_ssh 1 %_without_testlib 1 components: rpms: hawtjni: rationale: 'Runtime dependency of jansi, jansi-native. ' repository: git://pkgs.fedoraproject.org/rpms/hawtjni cache: http://pkgs.fedoraproject.org/repo/pkgs/hawtjni ref: javapackages buildorder: 10 jansi: rationale: 'Runtime dependency of jline, scala. ' repository: git://pkgs.fedoraproject.org/rpms/jansi cache: http://pkgs.fedoraproject.org/repo/pkgs/jansi ref: javapackages buildorder: 30 jansi-native: rationale: 'Runtime dependency of jansi. ' repository: git://pkgs.fedoraproject.org/rpms/jansi-native cache: http://pkgs.fedoraproject.org/repo/pkgs/jansi-native ref: javapackages buildorder: 20 jline: rationale: 'Runtime dependency of scala. ' repository: git://pkgs.fedoraproject.org/rpms/jline cache: http://pkgs.fedoraproject.org/repo/pkgs/jline ref: javapackages buildorder: 40 scala: rationale: 'Module API. ' repository: git://pkgs.fedoraproject.org/rpms/scala cache: http://pkgs.fedoraproject.org/repo/pkgs/scala ref: javapackages buildorder: 50 artifacts: rpms: - hawtjni-runtime-0:1.16-1.module_1889+fac7270b.noarch - jansi-0:1.17.1-1.module_1889+fac7270b.noarch - jansi-native-0:1.7-5.module_1889+fac7270b.x86_64 - jline-0:2.14.6-2.module_1889+fac7270b.noarch - scala-0:2.10.6-8.module_1889+fac7270b.noarch - scala-apidoc-0:2.10.6-8.module_1889+fac7270b.noarch - scala-swing-0:2.10.6-8.module_1889+fac7270b.noarch ... --- document: modulemd version: 2 data: name: ripgrep stream: main version: 20180804140932 context: b33445dc arch: x86_64 summary: Line oriented search tool using Rust's regex library description: > Line oriented search tool using Rust's regex library. Combines the raw performance of grep with the usability of the silver searcher. license: module: - MIT content: - MIT xmd: mbs: mse: TRUE scmurl: https://src.fedoraproject.org/modules/ripgrep.git?#44a146a6fc3cc5311c2dd585e66d34006e539d38 commit: 44a146a6fc3cc5311c2dd585e66d34006e539d38 buildrequires: platform: ref: f29 stream: f29 context: 00000000 version: 5 filtered_rpms: [] rpms: rust-ripgrep: ref: 844193e3738eeda66372e1016b7d1dbc2f5259ba dependencies: - buildrequires: platform: [f29] requires: platform: [] references: community: https://github.com/BurntSushi/ripgrep documentation: https://github.com/BurntSushi/ripgrep/blob/6afdf15d85579bb759f5311d867cf5003064e594/FAQ.md tracker: https://github.com/BurntSushi/ripgrep/issues profiles: default: rpms: - ripgrep api: rpms: - ripgrep components: rpms: rust-ripgrep: rationale: Main component. repository: git://pkgs.fedoraproject.org/rpms/rust-ripgrep cache: http://pkgs.fedoraproject.org/repo/pkgs/rust-ripgrep ref: main artifacts: rpms: - ripgrep-0:0.9.0-1.module_1969+efa3f7be.x86_64 ... --- document: modulemd version: 2 data: name: ripgrep stream: latest version: 20181104174352 context: 6c81f848 arch: x86_64 summary: Line oriented search tool using Rust's regex library description: > Line oriented search tool using Rust's regex library. Combines the raw performance of grep with the usability of the silver searcher. license: module: - MIT content: - MIT xmd: mbs: mse: TRUE scmurl: https://src.fedoraproject.org/modules/ripgrep.git?#cf5d62ae3fccb7ce777789f88e395d421cd0a78b commit: cf5d62ae3fccb7ce777789f88e395d421cd0a78b buildrequires: platform: ref: f29 stream: f29 context: 00000000 version: 5 filtered_rpms: [] rpms: rust-strsim: ref: 3a1928c8136b290a3fadab301fbc4bf1b7d56931 rust-byteorder: ref: 35aaadf1730f3e63acd50b840f429a5c5420fd3d rust-fnv: ref: f76a15cf2fc96595594e47651fab208c9fdeb0ab rust-indexmap: ref: 3d839547100cbed3db4fdb0820453bbe8ddaaf92 rust-memmap: ref: 5a79f71aeaf1a379d64f6c165ab7b0adb91dcaa9 rust-packaging: ref: 04e7ad287a632a68ccd10cfd35a636852108ad28 rust-no-panic: ref: d78ce0575bcca63209fd5b548a39836f6b4ee767 rust-grep: ref: e177d250a1c8b8c4e6ce8136f4be90d143a73acc rust-crossbeam-deque0.4: ref: 6127953b009eeca38b9cc83ffa7eb1e255f49fe4 rust-serde_derive: ref: 40e60857b9cd3c056c2aa748dbb7c95b9ccbbbe2 rust-heapsize: ref: 5d1d4b2c2356f42760dd4cbb90b7cbe982f98d95 rust-smallvec: ref: 7e30de0d469c3b4573945a98103e902ed4617dfd rust-memchr: ref: d120e8a40f353875824c64b40552636a3909eaee rust-same-file: ref: 470c5feeacc4d128a7b2c3796cc92e480cdddf5e rust-arrayvec: ref: 24a1a39e20b3a7dd3ac99cd0e2497f6873d79eaf rust-unreachable: ref: 412ff0e1022e5d6d6c023b02e0d549d2ef449e57 rust-ansi_term: ref: aa0509304673d8e85ed10b2faff32a88da30fcc9 rust-serde: ref: 21cd19ce4eb8e00fc1b50e8166dfcf30a48d1578 rust-rand_core0.2: ref: 7e53c7b53cad8bd7c4461cfe9943f753dca387fd rust-nodrop: ref: e34f4c89e485813dc026385cad714e0a289ec26e rust-rand: ref: a5ffd6a802c4d192024250b53744eb82d4129db8 rust-pcre2: ref: 565ffdd31cbaee086f966b8a0cbc68b51c860261 rust-grep-matcher: ref: 162a39ff559d9c1b10c783e5df890c70471ea073 rust-crossbeam-channel: ref: d1ce7ae184178e75f406becb40cc8a59a91cce3b rust-either: ref: 5046abacfee588fd28ae7a73a8ab4166d669ef7c rust-proc-macro2: ref: 7c38fd6963b75147e46fcd771fcc68ac416fdb58 rust-crossbeam-epoch0.5: ref: d2bd3e0a22b054d723fc31144206bd4cc04b781a rust-base64: ref: cf9ae0b254bff6efa2e66ab32342276c9f63d20d rust-syn: ref: f38c9c3981efccbdc4dcb54fa74dc9c15cd5f069 rust-walkdir: ref: f5a5bffe5d7143111908c5df36a6c423f239f6c0 rust-rayon: ref: e9eb09faa3e501c814db53a0c3291a26d8f4b33c rust-num_cpus: ref: 54a3646595ccb45c6a04c0e3fec41ad14402d631 rust-grep-cli: ref: c26fc8d820487228fb1ebfcde82f1cd643c79c96 rust-unicode-xid: ref: e67cc74e1354143c0fb5edf7af67c176ae7edcaa rust-regex: ref: 2229a1ea0cbbaf676496339c1e81864cd4003fc6 rust-ucd-util: ref: 27620e66367adf48808a04002e94b4fcadcc415c rust-lazy_static: ref: abdefd9d971dc70073fdc6adddbcb0ff18340a0e rust-yaml-rust0.3: ref: 5ecf7d35b65788bd2a4ce03258c229476ddae35f rust-grep-printer: ref: 0b368aeaf0ebacd4da5f0c5418e82ba415e12a5d rust-ripgrep: ref: ac77813999f50770a1f12bfe6fc7a581e8cebd9d rust-parking_lot: ref: 4f81ecce318725c7bdd2cf655c13fa09cb378a01 rust-atty: ref: ac26eb2fbd95334a8310a4fad799ca9044bc12c1 rust-semver-parser0.7: ref: 37048a01c68df96f31b0b867bb7730a37b5a8ebe rust-pcre2-sys: ref: d4958c4948c8f31eed60b0865a8a0de51ddcc2f3 rust-globset: ref: 68369b8fb4fe628110db7e3ef5ef6df10ef2faf5 rust-grep-pcre2: ref: 7385e55d920546785f5baf06347295d1590dc672 rust-safemem: ref: 65e99ff2d15feeb99e56e610f5ea8b82236edddb rust-aho-corasick: ref: 2133a27af85565874a0d9c8d15e18037244ff38a rust-rustc_version: ref: 0aed6639ef0f23bca9c76a95a9dabc7a4d40744f rust-quote: ref: bcfb70145c5382f461795c19a9a1105317e5148e rust-semver: ref: ecb153f342062549c1d129fd88fc51cfb82ca610 rust-bitflags: ref: aab0778768757e462b20bc4d77e70bae43c1d0ad rust-serde_json: ref: da3aa74649a01ffe901136b2285998bf9e03a3f2 rust-grep-regex: ref: b6174dc2a693c989e2d7518c5053d975a74f23e0 rust-crossbeam-epoch: ref: d1157276fd2e6dfaf6d903eddb3864380dfcbc82 rust-cfg-if: ref: 3ff094ad603593adc3a036e1610b239fb8480142 rust-utf8-ranges: ref: 3c8bb35c329c1133e596dd94754dfc5fe2e42641 rust-encoding_rs_io: ref: 94041c97a6f7a1c46e1fcbe943d83d9d00eedcc6 rust-parking_lot_core: ref: 34ffbd3102fc2ded0c331370665c2ec9b0f9b30e rust-log: ref: 8e19b2e015c86d959a2a69f391f8e84585f2f0ed rust-cc: ref: 44faccd5aa73354a6643769755cf98da94ffece2 rust-ignore: ref: 959da02b79a4c484e0486101856970e6f658b640 rust-textwrap: ref: cf2ce1a4cef3436fd130838c4dfa7a9cfbdea512 rust-linked-hash-map: ref: f0e7523a34b8ec7a8c9051e33f22577772da6b83 rust-lock_api: ref: 0e520bea0c4a3889369e730fd418a3e5195b3062 rust-itoa: ref: a74464c89c102e86d26cbc500d853ae626a30100 rust-stable_deref_trait: ref: 8f35830900bc71d1a85fc6a02215f1d154c997f6 rust-scopeguard: ref: 53c1fd50c528fa9ddf49d8c4b996e7acde05bc05 rust-rand_core: ref: df6ff2cd8a67a3b277509f5aa4bf3ddfa755587e rust-bytecount: ref: ad6a26ef9ef26895d813b3a5d87c12a11b8bdbad rust-unicode-width: ref: 6599a5158eea49a44ee255445af3b1fc5bfc4661 rust-clap: ref: 6a5b0bbaa7fb2b920d62e93dced74907d26ddee8 rust-crossbeam-utils: ref: fa961b60d20ed68c7598a1634bd387f56dd43da8 rust-regex-syntax: ref: 39c750b81b1bd8bbc97f9804008ea09382d5f68c rust-ryu: ref: 824f092151ea888af1fc590dbdf7bef11ce71389 rust-pkg-config: ref: 349c7189cb33d384e542ddf3ccf4b53c607b5dd1 rust-vec_map: ref: 18b851a496671350e388786f18d3ec18c610d603 rust-grep-searcher: ref: f6b3678353645b0458f1181c09993522dbecd46f rust-void: ref: c0d2cf66ed917dce908190930a7337723a388645 rust-rayon-core: ref: d0107623e5c040be5a17ef61447b79e701d1dc3b rust-version_check: ref: 11ca374687fe9a9db49be1ede98a4c92b492e1e1 rust-libc: ref: b4916eac7d00ad4d6865282f07dc71b46437bf1f rust-termcolor: ref: a68dc908bc946b62c6e758a1a01494dc2f4aa76e rust-encoding_rs: ref: 59c584af8c5462b92a6f3667bbc3186a9d66d1bd rust-thread_local: ref: 0679edb992d183e75f282660ee632fcdfea7ea15 rust-memoffset: ref: 62c46ec2976e1dccf3d18e0e2ff01699492413f5 rust-owning_ref: ref: 62553b334cc987af96f9dce1412d5aacf9cb55c4 rust-term_size: ref: 7c62e64aa170d34ec9ea65b7dfd286e19d9b7b0c dependencies: - buildrequires: platform: [f29] requires: platform: [f29] references: community: https://github.com/BurntSushi/ripgrep documentation: https://github.com/BurntSushi/ripgrep/blob/6afdf15d85579bb759f5311d867cf5003064e594/FAQ.md tracker: https://github.com/BurntSushi/ripgrep/issues profiles: default: rpms: - ripgrep api: rpms: - ripgrep filter: rpms: - python3-rust2rpm - rust-aho-corasick+default-devel - rust-aho-corasick-devel - rust-ansi_term+default-devel - rust-ansi_term-devel - rust-arrayvec+default-devel - rust-arrayvec+serde-1-devel - rust-arrayvec+serde-devel - rust-arrayvec+std-devel - rust-arrayvec-devel - rust-atty+default-devel - rust-atty-devel - rust-base64+default-devel - rust-base64-devel - rust-bitflags+default-devel - rust-bitflags-devel - rust-bytecount+default-devel - rust-bytecount-devel - rust-byteorder+default-devel - rust-byteorder+i128-devel - rust-byteorder+std-devel - rust-byteorder-devel - rust-cc+default-devel - rust-cc+parallel-devel - rust-cc+rayon-devel - rust-cc-devel - rust-cfg-if+default-devel - rust-cfg-if-devel - rust-clap+ansi_term-devel - rust-clap+atty-devel - rust-clap+color-devel - rust-clap+debug-devel - rust-clap+default-devel - rust-clap+no_cargo-devel - rust-clap+strsim-devel - rust-clap+suggestions-devel - rust-clap+term_size-devel - rust-clap+unstable-devel - rust-clap+vec_map-devel - rust-clap+wrap_help-devel - rust-clap+yaml-devel - rust-clap+yaml-rust-devel - rust-clap-devel - rust-crossbeam-channel+default-devel - rust-crossbeam-channel-devel - rust-crossbeam-deque0.4+default-devel - rust-crossbeam-deque0.4-devel - rust-crossbeam-epoch+default-devel - rust-crossbeam-epoch+lazy_static-devel - rust-crossbeam-epoch+sanitize-devel - rust-crossbeam-epoch+use_std-devel - rust-crossbeam-epoch-devel - rust-crossbeam-epoch0.5+default-devel - rust-crossbeam-epoch0.5+lazy_static-devel - rust-crossbeam-epoch0.5+sanitize-devel - rust-crossbeam-epoch0.5+use_std-devel - rust-crossbeam-epoch0.5-devel - rust-crossbeam-utils+default-devel - rust-crossbeam-utils+use_std-devel - rust-crossbeam-utils-devel - rust-either+default-devel - rust-either+serde-devel - rust-either+use_std-devel - rust-either-devel - rust-encoding_rs+default-devel - rust-encoding_rs+less-slow-big5-hanzi-encode-devel - rust-encoding_rs+less-slow-gb-hanzi-encode-devel - rust-encoding_rs+less-slow-kanji-encode-devel - rust-encoding_rs+serde-devel - rust-encoding_rs-devel - rust-encoding_rs_io+default-devel - rust-encoding_rs_io-devel - rust-fnv+default-devel - rust-fnv-devel - rust-globset+default-devel - rust-globset+simd-accel-devel - rust-globset-devel - rust-grep+default-devel - rust-grep+grep-pcre2-devel - rust-grep+pcre2-devel - rust-grep-cli+default-devel - rust-grep-cli-devel - rust-grep-devel - rust-grep-matcher+default-devel - rust-grep-matcher-devel - rust-grep-pcre2+default-devel - rust-grep-pcre2-devel - rust-grep-printer+base64-devel - rust-grep-printer+default-devel - rust-grep-printer+serde-devel - rust-grep-printer+serde1-devel - rust-grep-printer+serde_derive-devel - rust-grep-printer+serde_json-devel - rust-grep-printer-devel - rust-grep-regex+default-devel - rust-grep-regex-devel - rust-grep-searcher+default-devel - rust-grep-searcher-devel - rust-heapsize+default-devel - rust-heapsize+unstable-devel - rust-heapsize-devel - rust-ignore+default-devel - rust-ignore+simd-accel-devel - rust-ignore-devel - rust-indexmap+default-devel - rust-indexmap+serde-1-devel - rust-indexmap+serde-devel - rust-indexmap-devel - rust-itoa+default-devel - rust-itoa+i128-devel - rust-itoa+std-devel - rust-itoa-devel - rust-lazy_static+default-devel - rust-lazy_static-devel - rust-libc+align-devel - rust-libc+default-devel - rust-libc+use_std-devel - rust-libc-devel - rust-linked-hash-map+default-devel - rust-linked-hash-map+heapsize-devel - rust-linked-hash-map+heapsize_impl-devel - rust-linked-hash-map+serde-devel - rust-linked-hash-map+serde_impl-devel - rust-linked-hash-map-devel - rust-lock_api+default-devel - rust-lock_api+owning_ref-devel - rust-lock_api-devel - rust-log+default-devel - rust-log+max_level_debug-devel - rust-log+max_level_error-devel - rust-log+max_level_info-devel - rust-log+max_level_off-devel - rust-log+max_level_trace-devel - rust-log+max_level_warn-devel - rust-log+release_max_level_debug-devel - rust-log+release_max_level_error-devel - rust-log+release_max_level_info-devel - rust-log+release_max_level_off-devel - rust-log+release_max_level_trace-devel - rust-log+release_max_level_warn-devel - rust-log+serde-devel - rust-log+std-devel - rust-log-devel - rust-memchr+default-devel - rust-memchr+libc-devel - rust-memchr+use_std-devel - rust-memchr-devel - rust-memmap+default-devel - rust-memmap-devel - rust-memoffset+default-devel - rust-memoffset-devel - rust-no-panic+default-devel - rust-no-panic-devel - rust-nodrop+default-devel - rust-nodrop+std-devel - rust-nodrop+use_needs_drop-devel - rust-nodrop-devel - rust-num_cpus+default-devel - rust-num_cpus-devel - rust-owning_ref+default-devel - rust-owning_ref-devel - rust-packaging - rust-parking_lot+default-devel - rust-parking_lot+owning_ref-devel - rust-parking_lot-devel - rust-parking_lot_core+default-devel - rust-parking_lot_core-devel - rust-pcre2+default-devel - rust-pcre2-devel - rust-pcre2-sys+default-devel - rust-pcre2-sys-devel - rust-pkg-config+default-devel - rust-pkg-config-devel - rust-proc-macro2+default-devel - rust-proc-macro2+proc-macro-devel - rust-proc-macro2-devel - rust-quote+default-devel - rust-quote+proc-macro-devel - rust-quote-devel - rust-rand+alloc-devel - rust-rand+default-devel - rust-rand+i128_support-devel - rust-rand+libc-devel - rust-rand+log-devel - rust-rand+serde-devel - rust-rand+serde1-devel - rust-rand+serde_derive-devel - rust-rand+std-devel - rust-rand-devel - rust-rand_core+alloc-devel - rust-rand_core+default-devel - rust-rand_core+serde-devel - rust-rand_core+serde1-devel - rust-rand_core+serde_derive-devel - rust-rand_core+std-devel - rust-rand_core-devel - rust-rand_core0.2+alloc-devel - rust-rand_core0.2+default-devel - rust-rand_core0.2+serde1-devel - rust-rand_core0.2+std-devel - rust-rand_core0.2-devel - rust-rayon+default-devel - rust-rayon-core+default-devel - rust-rayon-core-devel - rust-rayon-devel - rust-regex+default-devel - rust-regex+pattern-devel - rust-regex+unstable-devel - rust-regex+use_std-devel - rust-regex-devel - rust-regex-syntax+default-devel - rust-regex-syntax-devel - rust-rustc_version+default-devel - rust-rustc_version-devel - rust-ryu+default-devel - rust-ryu+no-panic-devel - rust-ryu+small-devel - rust-ryu-devel - rust-safemem+default-devel - rust-safemem+std-devel - rust-safemem-devel - rust-same-file+default-devel - rust-same-file-devel - rust-scopeguard+default-devel - rust-scopeguard+use_std-devel - rust-scopeguard-devel - rust-semver+default-devel - rust-semver+serde-devel - rust-semver-devel - rust-semver-parser0.7+default-devel - rust-semver-parser0.7-devel - rust-serde+alloc-devel - rust-serde+default-devel - rust-serde+derive-devel - rust-serde+rc-devel - rust-serde+serde_derive-devel - rust-serde+std-devel - rust-serde+unstable-devel - rust-serde-devel - rust-serde_derive+default-devel - rust-serde_derive+deserialize_in_place-devel - rust-serde_derive-devel - rust-serde_json+arbitrary_precision-devel - rust-serde_json+default-devel - rust-serde_json+indexmap-devel - rust-serde_json+preserve_order-devel - rust-serde_json+raw_value-devel - rust-serde_json-devel - rust-smallvec+default-devel - rust-smallvec+serde-devel - rust-smallvec+std-devel - rust-smallvec-devel - rust-stable_deref_trait+default-devel - rust-stable_deref_trait+std-devel - rust-stable_deref_trait-devel - rust-strsim+default-devel - rust-strsim-devel - rust-syn+clone-impls-devel - rust-syn+default-devel - rust-syn+derive-devel - rust-syn+extra-traits-devel - rust-syn+fold-devel - rust-syn+full-devel - rust-syn+parsing-devel - rust-syn+printing-devel - rust-syn+proc-macro-devel - rust-syn+quote-devel - rust-syn+visit-devel - rust-syn+visit-mut-devel - rust-syn-devel - rust-term_size+debug-devel - rust-term_size+default-devel - rust-term_size+unstable-devel - rust-term_size-devel - rust-termcolor+default-devel - rust-termcolor-devel - rust-textwrap+default-devel - rust-textwrap+term_size-devel - rust-textwrap-devel - rust-thread_local+default-devel - rust-thread_local-devel - rust-ucd-util+default-devel - rust-ucd-util-devel - rust-unicode-width+default-devel - rust-unicode-width+no_std-devel - rust-unicode-width-devel - rust-unicode-xid+default-devel - rust-unicode-xid+no_std-devel - rust-unicode-xid-devel - rust-unreachable+default-devel - rust-unreachable-devel - rust-utf8-ranges+default-devel - rust-utf8-ranges-devel - rust-vec_map+default-devel - rust-vec_map+eders-devel - rust-vec_map+serde-devel - rust-vec_map-devel - rust-version_check+default-devel - rust-version_check-devel - rust-void+default-devel - rust-void+std-devel - rust-void-devel - rust-walkdir+default-devel - rust-walkdir-devel - rust-yaml-rust0.3+default-devel - rust-yaml-rust0.3+linked-hash-map-devel - rust-yaml-rust0.3+preserve_order-devel - rust-yaml-rust0.3-devel components: rpms: rust-aho-corasick: rationale: Dependency of rust-globset, rust-regex. repository: git+https://src.fedoraproject.org/rpms/rust-aho-corasick cache: https://src.fedoraproject.org/repo/pkgs/rust-aho-corasick ref: main buildorder: 30 rust-ansi_term: rationale: Dependency of rust-clap. repository: git+https://src.fedoraproject.org/rpms/rust-ansi_term cache: https://src.fedoraproject.org/repo/pkgs/rust-ansi_term ref: main buildorder: 10 rust-arrayvec: rationale: Dependency of rust-crossbeam-epoch, rust-crossbeam-epoch0.5. repository: git+https://src.fedoraproject.org/rpms/rust-arrayvec cache: https://src.fedoraproject.org/repo/pkgs/rust-arrayvec ref: main buildorder: 70 rust-atty: rationale: Dependency of rust-clap, rust-grep-cli. repository: git+https://src.fedoraproject.org/rpms/rust-atty cache: https://src.fedoraproject.org/repo/pkgs/rust-atty ref: main buildorder: 20 rust-base64: rationale: Dependency of rust-grep-printer. repository: git+https://src.fedoraproject.org/rpms/rust-base64 cache: https://src.fedoraproject.org/repo/pkgs/rust-base64 ref: main buildorder: 20 rust-bitflags: rationale: Dependency of rust-clap. repository: git+https://src.fedoraproject.org/rpms/rust-bitflags cache: https://src.fedoraproject.org/repo/pkgs/rust-bitflags ref: main buildorder: 10 rust-bytecount: rationale: Dependency of rust-grep-searcher. repository: git+https://src.fedoraproject.org/rpms/rust-bytecount cache: https://src.fedoraproject.org/repo/pkgs/rust-bytecount ref: main buildorder: 10 rust-byteorder: rationale: Dependency of rust-base64. repository: git+https://src.fedoraproject.org/rpms/rust-byteorder cache: https://src.fedoraproject.org/repo/pkgs/rust-byteorder ref: main buildorder: 10 rust-cc: rationale: Dependency of rust-pcre2-sys. repository: git+https://src.fedoraproject.org/rpms/rust-cc cache: https://src.fedoraproject.org/repo/pkgs/rust-cc ref: main buildorder: 120 rust-cfg-if: rationale: Dependency of rust-crossbeam-epoch, rust-crossbeam-epoch0.5, rust-encoding_rs, rust-log, rust-memchr. repository: git+https://src.fedoraproject.org/rpms/rust-cfg-if cache: https://src.fedoraproject.org/repo/pkgs/rust-cfg-if ref: main buildorder: 10 rust-clap: rationale: Dependency of rust-ripgrep. repository: git+https://src.fedoraproject.org/rpms/rust-clap cache: https://src.fedoraproject.org/repo/pkgs/rust-clap ref: main buildorder: 90 rust-crossbeam-channel: rationale: Dependency of rust-ignore. repository: git+https://src.fedoraproject.org/rpms/rust-crossbeam-channel cache: https://src.fedoraproject.org/repo/pkgs/rust-crossbeam-channel ref: main buildorder: 120 rust-crossbeam-deque0.4: rationale: Dependency of rust-rayon, rust-rayon-core. repository: git+https://src.fedoraproject.org/rpms/rust-crossbeam-deque0.4 cache: https://src.fedoraproject.org/repo/pkgs/rust-crossbeam-deque0.4 ref: main buildorder: 90 rust-crossbeam-epoch: rationale: Dependency of rust-crossbeam-channel. repository: git+https://src.fedoraproject.org/rpms/rust-crossbeam-epoch cache: https://src.fedoraproject.org/repo/pkgs/rust-crossbeam-epoch ref: main buildorder: 80 rust-crossbeam-epoch0.5: rationale: Dependency of rust-crossbeam-deque0.4. repository: git+https://src.fedoraproject.org/rpms/rust-crossbeam-epoch0.5 cache: https://src.fedoraproject.org/repo/pkgs/rust-crossbeam-epoch0.5 ref: main buildorder: 80 rust-crossbeam-utils: rationale: Dependency of rust-crossbeam-channel, rust-crossbeam-deque0.4, rust-crossbeam-epoch, rust-crossbeam-epoch0.5. repository: git+https://src.fedoraproject.org/rpms/rust-crossbeam-utils cache: https://src.fedoraproject.org/repo/pkgs/rust-crossbeam-utils ref: main buildorder: 10 rust-either: rationale: Dependency of rust-rayon. repository: git+https://src.fedoraproject.org/rpms/rust-either cache: https://src.fedoraproject.org/repo/pkgs/rust-either ref: main buildorder: 70 rust-encoding_rs: rationale: Dependency of rust-encoding_rs_io, rust-grep-searcher. repository: git+https://src.fedoraproject.org/rpms/rust-encoding_rs cache: https://src.fedoraproject.org/repo/pkgs/rust-encoding_rs ref: main buildorder: 70 rust-encoding_rs_io: rationale: Dependency of rust-grep-searcher. repository: git+https://src.fedoraproject.org/rpms/rust-encoding_rs_io cache: https://src.fedoraproject.org/repo/pkgs/rust-encoding_rs_io ref: main buildorder: 80 rust-fnv: rationale: Dependency of rust-globset. repository: git+https://src.fedoraproject.org/rpms/rust-fnv cache: https://src.fedoraproject.org/repo/pkgs/rust-fnv ref: main buildorder: 10 rust-globset: rationale: Dependency of rust-grep-cli, rust-ignore. repository: git+https://src.fedoraproject.org/rpms/rust-globset cache: https://src.fedoraproject.org/repo/pkgs/rust-globset ref: main buildorder: 80 rust-grep: rationale: Dependency of rust-ripgrep. repository: git+https://src.fedoraproject.org/rpms/rust-grep cache: https://src.fedoraproject.org/repo/pkgs/rust-grep ref: main buildorder: 160 rust-grep-cli: rationale: Dependency of rust-grep. repository: git+https://src.fedoraproject.org/rpms/rust-grep-cli cache: https://src.fedoraproject.org/repo/pkgs/rust-grep-cli ref: main buildorder: 90 rust-grep-matcher: rationale: Dependency of rust-grep, rust-grep-pcre2, rust-grep-printer, rust-grep-regex, rust-grep-searcher. repository: git+https://src.fedoraproject.org/rpms/rust-grep-matcher cache: https://src.fedoraproject.org/repo/pkgs/rust-grep-matcher ref: main buildorder: 30 rust-grep-pcre2: rationale: Dependency of rust-grep. repository: git+https://src.fedoraproject.org/rpms/rust-grep-pcre2 cache: https://src.fedoraproject.org/repo/pkgs/rust-grep-pcre2 ref: main buildorder: 150 rust-grep-printer: rationale: Dependency of rust-grep. repository: git+https://src.fedoraproject.org/rpms/rust-grep-printer cache: https://src.fedoraproject.org/repo/pkgs/rust-grep-printer ref: main buildorder: 100 rust-grep-regex: rationale: Dependency of rust-grep. repository: git+https://src.fedoraproject.org/rpms/rust-grep-regex cache: https://src.fedoraproject.org/repo/pkgs/rust-grep-regex ref: main buildorder: 80 rust-grep-searcher: rationale: Dependency of rust-grep, rust-grep-printer. repository: git+https://src.fedoraproject.org/rpms/rust-grep-searcher cache: https://src.fedoraproject.org/repo/pkgs/rust-grep-searcher ref: main buildorder: 90 rust-heapsize: rationale: Dependency of rust-linked-hash-map. repository: git+https://src.fedoraproject.org/rpms/rust-heapsize cache: https://src.fedoraproject.org/repo/pkgs/rust-heapsize ref: main buildorder: 10 rust-ignore: rationale: Dependency of rust-ripgrep. repository: git+https://src.fedoraproject.org/rpms/rust-ignore cache: https://src.fedoraproject.org/repo/pkgs/rust-ignore ref: main buildorder: 130 rust-indexmap: rationale: Dependency of rust-serde_json. repository: git+https://src.fedoraproject.org/rpms/rust-indexmap cache: https://src.fedoraproject.org/repo/pkgs/rust-indexmap ref: main buildorder: 70 rust-itoa: rationale: Dependency of rust-serde_json. repository: git+https://src.fedoraproject.org/rpms/rust-itoa cache: https://src.fedoraproject.org/repo/pkgs/rust-itoa ref: main buildorder: 10 rust-lazy_static: rationale: Dependency of rust-crossbeam-epoch, rust-crossbeam-epoch0.5, rust-grep-cli, rust-ignore, rust-rayon-core, rust-ripgrep, rust-thread_local. repository: git+https://src.fedoraproject.org/rpms/rust-lazy_static cache: https://src.fedoraproject.org/repo/pkgs/rust-lazy_static ref: main buildorder: 20 rust-libc: rationale: Dependency of rust-atty, rust-memchr, rust-memmap, rust-num_cpus, rust-parking_lot_core, rust-pcre2, rust-pcre2-sys, rust-rand, rust-rayon-core, rust-term_size. repository: git+https://src.fedoraproject.org/rpms/rust-libc cache: https://src.fedoraproject.org/repo/pkgs/rust-libc ref: main buildorder: 10 rust-linked-hash-map: rationale: Dependency of rust-yaml-rust0.3. repository: git+https://src.fedoraproject.org/rpms/rust-linked-hash-map cache: https://src.fedoraproject.org/repo/pkgs/rust-linked-hash-map ref: main buildorder: 70 rust-lock_api: rationale: Dependency of rust-parking_lot. repository: git+https://src.fedoraproject.org/rpms/rust-lock_api cache: https://src.fedoraproject.org/repo/pkgs/rust-lock_api ref: main buildorder: 30 rust-log: rationale: Dependency of rust-globset, rust-grep-cli, rust-grep-regex, rust-grep-searcher, rust-ignore, rust-pcre2, rust-rand, rust-ripgrep. repository: git+https://src.fedoraproject.org/rpms/rust-log cache: https://src.fedoraproject.org/repo/pkgs/rust-log ref: main buildorder: 70 rust-memchr: rationale: Dependency of rust-aho-corasick, rust-globset, rust-grep-matcher, rust-grep-searcher, rust-ignore, rust-regex. repository: git+https://src.fedoraproject.org/rpms/rust-memchr cache: https://src.fedoraproject.org/repo/pkgs/rust-memchr ref: main buildorder: 20 rust-memmap: rationale: Dependency of rust-grep-searcher. repository: git+https://src.fedoraproject.org/rpms/rust-memmap cache: https://src.fedoraproject.org/repo/pkgs/rust-memmap ref: main buildorder: 20 rust-memoffset: rationale: Dependency of rust-crossbeam-epoch, rust-crossbeam-epoch0.5. repository: git+https://src.fedoraproject.org/rpms/rust-memoffset cache: https://src.fedoraproject.org/repo/pkgs/rust-memoffset ref: main buildorder: 10 rust-no-panic: rationale: Dependency of rust-ryu. repository: git+https://src.fedoraproject.org/rpms/rust-no-panic cache: https://src.fedoraproject.org/repo/pkgs/rust-no-panic ref: main buildorder: 50 rust-nodrop: rationale: Dependency of rust-arrayvec. repository: git+https://src.fedoraproject.org/rpms/rust-nodrop cache: https://src.fedoraproject.org/repo/pkgs/rust-nodrop ref: main buildorder: 10 rust-num_cpus: rationale: Dependency of rust-rayon-core, rust-ripgrep. repository: git+https://src.fedoraproject.org/rpms/rust-num_cpus cache: https://src.fedoraproject.org/repo/pkgs/rust-num_cpus ref: main buildorder: 20 rust-owning_ref: rationale: Dependency of rust-lock_api. repository: git+https://src.fedoraproject.org/rpms/rust-owning_ref cache: https://src.fedoraproject.org/repo/pkgs/rust-owning_ref ref: main buildorder: 20 rust-packaging: rationale: Something needs to orchestrate build of all stuff below. repository: git+https://src.fedoraproject.org/rpms/rust-packaging cache: https://src.fedoraproject.org/repo/pkgs/rust-packaging ref: main rust-parking_lot: rationale: Dependency of rust-crossbeam-channel. repository: git+https://src.fedoraproject.org/rpms/rust-parking_lot cache: https://src.fedoraproject.org/repo/pkgs/rust-parking_lot ref: main buildorder: 110 rust-parking_lot_core: rationale: Dependency of rust-parking_lot. repository: git+https://src.fedoraproject.org/rpms/rust-parking_lot_core cache: https://src.fedoraproject.org/repo/pkgs/rust-parking_lot_core ref: main buildorder: 100 rust-pcre2: rationale: Dependency of rust-grep-pcre2. repository: git+https://src.fedoraproject.org/rpms/rust-pcre2 cache: https://src.fedoraproject.org/repo/pkgs/rust-pcre2 ref: main buildorder: 140 rust-pcre2-sys: rationale: Dependency of rust-pcre2. repository: git+https://src.fedoraproject.org/rpms/rust-pcre2-sys cache: https://src.fedoraproject.org/repo/pkgs/rust-pcre2-sys ref: main buildorder: 130 rust-pkg-config: rationale: Dependency of rust-pcre2-sys. repository: git+https://src.fedoraproject.org/rpms/rust-pkg-config cache: https://src.fedoraproject.org/repo/pkgs/rust-pkg-config ref: main buildorder: 10 rust-proc-macro2: rationale: Dependency of rust-no-panic, rust-quote, rust-serde_derive, rust-syn. repository: git+https://src.fedoraproject.org/rpms/rust-proc-macro2 cache: https://src.fedoraproject.org/repo/pkgs/rust-proc-macro2 ref: main buildorder: 20 rust-quote: rationale: Dependency of rust-no-panic, rust-serde_derive, rust-syn. repository: git+https://src.fedoraproject.org/rpms/rust-quote cache: https://src.fedoraproject.org/repo/pkgs/rust-quote ref: main buildorder: 30 rust-rand: rationale: Dependency of rust-crossbeam-channel, rust-parking_lot_core. repository: git+https://src.fedoraproject.org/rpms/rust-rand cache: https://src.fedoraproject.org/repo/pkgs/rust-rand ref: main buildorder: 90 rust-rand_core: rationale: Dependency of rust-rand_core0.2. repository: git+https://src.fedoraproject.org/rpms/rust-rand_core cache: https://src.fedoraproject.org/repo/pkgs/rust-rand_core ref: main buildorder: 70 rust-rand_core0.2: rationale: Dependency of rust-rand. repository: git+https://src.fedoraproject.org/rpms/rust-rand_core0.2 cache: https://src.fedoraproject.org/repo/pkgs/rust-rand_core0.2 ref: main buildorder: 80 rust-rayon: rationale: Dependency of rust-cc. repository: git+https://src.fedoraproject.org/rpms/rust-rayon cache: https://src.fedoraproject.org/repo/pkgs/rust-rayon ref: main buildorder: 110 rust-rayon-core: rationale: Dependency of rust-rayon. repository: git+https://src.fedoraproject.org/rpms/rust-rayon-core cache: https://src.fedoraproject.org/repo/pkgs/rust-rayon-core ref: main buildorder: 100 rust-regex: rationale: Dependency of rust-globset, rust-grep-cli, rust-grep-regex, rust-ignore, rust-ripgrep. repository: git+https://src.fedoraproject.org/rpms/rust-regex cache: https://src.fedoraproject.org/repo/pkgs/rust-regex ref: main buildorder: 40 rust-regex-syntax: rationale: Dependency of rust-grep-regex, rust-regex. repository: git+https://src.fedoraproject.org/rpms/rust-regex-syntax cache: https://src.fedoraproject.org/repo/pkgs/rust-regex-syntax ref: main buildorder: 20 rust-ripgrep: rationale: Main component. repository: git+https://src.fedoraproject.org/rpms/rust-ripgrep cache: https://src.fedoraproject.org/repo/pkgs/rust-ripgrep ref: main buildorder: 170 rust-rustc_version: rationale: Dependency of rust-parking_lot_core. repository: git+https://src.fedoraproject.org/rpms/rust-rustc_version cache: https://src.fedoraproject.org/repo/pkgs/rust-rustc_version ref: main buildorder: 80 rust-ryu: rationale: Dependency of rust-serde_json. repository: git+https://src.fedoraproject.org/rpms/rust-ryu cache: https://src.fedoraproject.org/repo/pkgs/rust-ryu ref: main buildorder: 60 rust-safemem: rationale: Dependency of rust-base64. repository: git+https://src.fedoraproject.org/rpms/rust-safemem cache: https://src.fedoraproject.org/repo/pkgs/rust-safemem ref: main buildorder: 10 rust-same-file: rationale: Dependency of rust-grep-cli, rust-ignore, rust-walkdir. repository: git+https://src.fedoraproject.org/rpms/rust-same-file cache: https://src.fedoraproject.org/repo/pkgs/rust-same-file ref: main buildorder: 10 rust-scopeguard: rationale: Dependency of rust-crossbeam-epoch, rust-crossbeam-epoch0.5, rust-lock_api. repository: git+https://src.fedoraproject.org/rpms/rust-scopeguard cache: https://src.fedoraproject.org/repo/pkgs/rust-scopeguard ref: main buildorder: 10 rust-semver: rationale: Dependency of rust-rustc_version. repository: git+https://src.fedoraproject.org/rpms/rust-semver cache: https://src.fedoraproject.org/repo/pkgs/rust-semver ref: main buildorder: 70 rust-semver-parser0.7: rationale: Dependency of rust-semver. repository: git+https://src.fedoraproject.org/rpms/rust-semver-parser0.7 cache: https://src.fedoraproject.org/repo/pkgs/rust-semver-parser0.7 ref: main buildorder: 10 rust-serde: rationale: Dependency of rust-arrayvec, rust-either, rust-encoding_rs, rust-grep-printer, rust-indexmap, rust-linked-hash-map, rust-log, rust-rand, rust-rand_core, rust-ripgrep, rust-semver, rust-serde_json, rust-smallvec, rust-vec_map. repository: git+https://src.fedoraproject.org/rpms/rust-serde cache: https://src.fedoraproject.org/repo/pkgs/rust-serde ref: main buildorder: 60 rust-serde_derive: rationale: Dependency of rust-grep-printer, rust-rand, rust-rand_core, rust-ripgrep, rust-serde. repository: git+https://src.fedoraproject.org/rpms/rust-serde_derive cache: https://src.fedoraproject.org/repo/pkgs/rust-serde_derive ref: main buildorder: 50 rust-serde_json: rationale: Dependency of rust-grep-printer, rust-ripgrep. repository: git+https://src.fedoraproject.org/rpms/rust-serde_json cache: https://src.fedoraproject.org/repo/pkgs/rust-serde_json ref: main buildorder: 80 rust-smallvec: rationale: Dependency of rust-crossbeam-channel, rust-parking_lot_core. repository: git+https://src.fedoraproject.org/rpms/rust-smallvec cache: https://src.fedoraproject.org/repo/pkgs/rust-smallvec ref: main buildorder: 70 rust-stable_deref_trait: rationale: Dependency of rust-owning_ref. repository: git+https://src.fedoraproject.org/rpms/rust-stable_deref_trait cache: https://src.fedoraproject.org/repo/pkgs/rust-stable_deref_trait ref: main buildorder: 10 rust-strsim: rationale: Dependency of rust-clap. repository: git+https://src.fedoraproject.org/rpms/rust-strsim cache: https://src.fedoraproject.org/repo/pkgs/rust-strsim ref: main buildorder: 10 rust-syn: rationale: Dependency of rust-no-panic, rust-serde_derive. repository: git+https://src.fedoraproject.org/rpms/rust-syn cache: https://src.fedoraproject.org/repo/pkgs/rust-syn ref: main buildorder: 40 rust-term_size: rationale: Dependency of rust-clap, rust-textwrap. repository: git+https://src.fedoraproject.org/rpms/rust-term_size cache: https://src.fedoraproject.org/repo/pkgs/rust-term_size ref: main buildorder: 20 rust-termcolor: rationale: Dependency of rust-grep-cli, rust-grep-printer, rust-ripgrep. repository: git+https://src.fedoraproject.org/rpms/rust-termcolor cache: https://src.fedoraproject.org/repo/pkgs/rust-termcolor ref: main buildorder: 10 rust-textwrap: rationale: Dependency of rust-clap. repository: git+https://src.fedoraproject.org/rpms/rust-textwrap cache: https://src.fedoraproject.org/repo/pkgs/rust-textwrap ref: main buildorder: 30 rust-thread_local: rationale: Dependency of rust-grep-regex, rust-ignore, rust-pcre2, rust-regex. repository: git+https://src.fedoraproject.org/rpms/rust-thread_local cache: https://src.fedoraproject.org/repo/pkgs/rust-thread_local ref: main buildorder: 30 rust-ucd-util: rationale: Dependency of rust-regex-syntax. repository: git+https://src.fedoraproject.org/rpms/rust-ucd-util cache: https://src.fedoraproject.org/repo/pkgs/rust-ucd-util ref: main buildorder: 10 rust-unicode-width: rationale: Dependency of rust-clap, rust-textwrap. repository: git+https://src.fedoraproject.org/rpms/rust-unicode-width cache: https://src.fedoraproject.org/repo/pkgs/rust-unicode-width ref: main buildorder: 10 rust-unicode-xid: rationale: Dependency of rust-proc-macro2, rust-syn. repository: git+https://src.fedoraproject.org/rpms/rust-unicode-xid cache: https://src.fedoraproject.org/repo/pkgs/rust-unicode-xid ref: main buildorder: 10 rust-unreachable: rationale: Dependency of rust-smallvec. repository: git+https://src.fedoraproject.org/rpms/rust-unreachable cache: https://src.fedoraproject.org/repo/pkgs/rust-unreachable ref: main buildorder: 20 rust-utf8-ranges: rationale: Dependency of rust-grep-regex, rust-regex. repository: git+https://src.fedoraproject.org/rpms/rust-utf8-ranges cache: https://src.fedoraproject.org/repo/pkgs/rust-utf8-ranges ref: main buildorder: 10 rust-vec_map: rationale: Dependency of rust-clap. repository: git+https://src.fedoraproject.org/rpms/rust-vec_map cache: https://src.fedoraproject.org/repo/pkgs/rust-vec_map ref: main buildorder: 70 rust-version_check: rationale: Dependency of rust-lazy_static, rust-memchr. repository: git+https://src.fedoraproject.org/rpms/rust-version_check cache: https://src.fedoraproject.org/repo/pkgs/rust-version_check ref: main buildorder: 10 rust-void: rationale: Dependency of rust-unreachable. repository: git+https://src.fedoraproject.org/rpms/rust-void cache: https://src.fedoraproject.org/repo/pkgs/rust-void ref: main buildorder: 10 rust-walkdir: rationale: Dependency of rust-ignore. repository: git+https://src.fedoraproject.org/rpms/rust-walkdir cache: https://src.fedoraproject.org/repo/pkgs/rust-walkdir ref: main buildorder: 20 rust-yaml-rust0.3: rationale: Dependency of rust-clap. repository: git+https://src.fedoraproject.org/rpms/rust-yaml-rust0.3 cache: https://src.fedoraproject.org/repo/pkgs/rust-yaml-rust0.3 ref: main buildorder: 80 artifacts: rpms: - ripgrep-0:0.10.0-4.module_2340+13d7c316.x86_64 ... --- document: modulemd version: 2 data: name: reviewboard stream: 3.0 version: 20181108043759 context: 083bce86 arch: x86_64 summary: A web-based code review tool description: >- Review Board is a powerful web-based code review tool that offers developers an easy way to handle code reviews. It scales well from small projects to large companies and offers a variety of tools to take much of the stress and time out of the code review process. license: module: - MIT content: - MIT xmd: mbs: mse: TRUE scmurl: https://src.fedoraproject.org/modules/reviewboard.git?#33f2968622048a58df1f2fa4a48f6111ffe3852d commit: 33f2968622048a58df1f2fa4a48f6111ffe3852d buildrequires: platform: ref: f29 stream: f29 context: 00000000 version: 5 filtered_rpms: [] django: ref: da53d66d3db1aa5f6afd75887b00fa26849bcc0a stream: 1.6 context: 6c81f848 version: 20180828135711 filtered_rpms: [] rpms: ReviewBoard: ref: dec951a56d39939ec3506e0749b17fa568ff7fc3 python-django-cors-headers: ref: 1c0762b2af97e2ddaef3e1847fdb06d950e61ff3 python-django-braces: ref: 172667f02de94fec7cc7c3d64e6c86c2c9e9f41c python-oauthlib: ref: 74c26e26899c3217d93f72ae7e0ccde0053dc5f0 python-django-multiselectfield: ref: 149bf58875fb7b55efe29e1735baf96d44eb99a9 python-publicsuffix: ref: 7667ae904083200453a2d5b9b119306310a6ca1d python-django-haystack: ref: 999cea3a5a6ead6f6ca9f45a60c7c62da1011ae6 python-django-oauth-toolkit: ref: 2bbcf8bcefef32936d4e36e9468280bf99ea8532 python-django-pipeline: ref: 92809ad85daf2270bb6d192adc3106fb1089cc60 python-jwt: ref: fab2b87a56b230362e251bf20aea8dba542d8713 python-asana: ref: e8395e75464604bbf4ebe55a0ee3074aafa8ca2a python-djblets: ref: a7cf64cf86b86001e1131501008b17cd82552401 python-pymdown-extensions: ref: 78a87635b426ca7e8c6f608a38789e82b5611dc9 python-django-evolution: ref: 9d0f9f5c4b7a1ed1680b16fa0688bf45d7fa4cca dependencies: - buildrequires: django: [1.6] platform: [f29] requires: django: [1.6] platform: [f29] references: community: https://www.reviewboard.org documentation: https://www.reviewboard.org/docs tracker: https://hellosplat.com/s/beanbag/tickets/ profiles: default: rpms: - ReviewBoard server: rpms: - ReviewBoard api: rpms: - ReviewBoard - python2-djblets components: rpms: ReviewBoard: rationale: The Review Board code review tool repository: git+https://src.fedoraproject.org/rpms/ReviewBoard cache: https://src.fedoraproject.org/repo/pkgs/ReviewBoard ref: 3.0 buildorder: 20 python-asana: rationale: Required by ReviewBoard to interact with Asana repository: git+https://src.fedoraproject.org/rpms/python-asana cache: https://src.fedoraproject.org/repo/pkgs/python-asana ref: 0.7 buildorder: 5 python-django-braces: rationale: Required by django-oauth-toolkit repository: git+https://src.fedoraproject.org/rpms/python-django-braces cache: https://src.fedoraproject.org/repo/pkgs/python-django-braces ref: 1 python-django-cors-headers: rationale: Required by ReviewBoard repository: git+https://src.fedoraproject.org/rpms/python-django-cors-headers cache: https://src.fedoraproject.org/repo/pkgs/python-django-cors-headers ref: 1.1 python-django-evolution: rationale: A database modification library used and maintained by the Review Board upstream repository: git+https://src.fedoraproject.org/rpms/python-django-evolution cache: https://src.fedoraproject.org/repo/pkgs/python-django-evolution ref: 0.7 python-django-haystack: rationale: An older version of the Haystack search library for Django, needed for compatibility. repository: git+https://src.fedoraproject.org/rpms/python-django-haystack cache: https://src.fedoraproject.org/repo/pkgs/python-django-haystack ref: 2.4 python-django-multiselectfield: rationale: An older version of a mult-select form field needed by Review Board. repository: git+https://src.fedoraproject.org/rpms/python-django-multiselectfield cache: https://src.fedoraproject.org/repo/pkgs/python-django-multiselectfield ref: 0.1 python-django-oauth-toolkit: rationale: Required by ReviewBoard for OAuth2 support repository: git+https://src.fedoraproject.org/rpms/python-django-oauth-toolkit cache: https://src.fedoraproject.org/repo/pkgs/python-django-oauth-toolkit ref: 0.9 buildorder: 10 python-django-pipeline: rationale: An older version of this asset-packaging library for Django that is compatible with Review Board. repository: git+https://src.fedoraproject.org/rpms/python-django-pipeline cache: https://src.fedoraproject.org/repo/pkgs/python-django-pipeline ref: 1.6 python-djblets: rationale: Review Board tool library repository: git+https://src.fedoraproject.org/rpms/python-djblets cache: https://src.fedoraproject.org/repo/pkgs/python-djblets ref: 1.0 buildorder: 10 python-jwt: rationale: Required for asana and oauthlib repository: git+https://src.fedoraproject.org/rpms/python-jwt cache: https://src.fedoraproject.org/repo/pkgs/python-jwt ref: reviewboard-3.0 python-oauthlib: rationale: Required by django-oauth-toolkit repository: git+https://src.fedoraproject.org/rpms/python-oauthlib cache: https://src.fedoraproject.org/repo/pkgs/python-oauthlib ref: 1.0 buildorder: 5 python-publicsuffix: rationale: Required by python-djblets repository: git+https://src.fedoraproject.org/rpms/python-publicsuffix cache: https://src.fedoraproject.org/repo/pkgs/python-publicsuffix ref: reviewboard-3.0 python-pymdown-extensions: rationale: Required by ReviewBoard for Markdown support repository: git+https://src.fedoraproject.org/rpms/python-pymdown-extensions cache: https://src.fedoraproject.org/repo/pkgs/python-pymdown-extensions ref: 3 artifacts: rpms: - ReviewBoard-0:3.0.10-1.module_2426+bdefa782.noarch - python-django-haystack-docs-0:2.4.1-13.module_2432+6ad09d5e.noarch - python2-asana-0:0.7.0-3.module_2082+1fa91c5a.noarch - python2-django-braces-0:1.12.0-3.module_1655+c1bb0ce4.noarch - python2-django-cors-headers-0:1.1.0-1.module_1655+c1bb0ce4.noarch - python2-django-evolution-1:0.7.7-13.module_2432+6ad09d5e.noarch - python2-django-haystack-0:2.4.1-13.module_2432+6ad09d5e.noarch - python2-django-multiselectfield-0:0.1.3-10.module_1655+c1bb0ce4.noarch - python2-django-oauth-toolkit-0:0.9.0-3.module_1655+c1bb0ce4.noarch - python2-django-pipeline-0:1.6.14-2.module_2082+1fa91c5a.noarch - python2-djblets-0:1.0.8-2.module_2426+bdefa782.noarch - python2-jwt-0:1.6.4-2.2.module_2435+f8c8a84e.noarch - python2-oauthlib-0:1.0.3-5.module_1655+c1bb0ce4.noarch - python2-publicsuffix-0:1.1.0-7.1.module_2438+f05f2c6f.noarch - python2-pymdown-extensions-0:3.5-5.module_1655+c1bb0ce4.noarch - python3-django-cors-headers-0:1.1.0-1.module_1655+c1bb0ce4.noarch - python3-jwt-0:1.6.4-2.2.module_2435+f8c8a84e.noarch - python3-oauthlib-0:1.0.3-5.module_1655+c1bb0ce4.noarch - python3-publicsuffix-0:1.1.0-7.1.module_2438+f05f2c6f.noarch ... --- document: modulemd version: 2 data: name: reviewboard stream: 2.5 version: 20180828143308 context: 083bce86 arch: x86_64 summary: A web-based code review tool description: >- Review Board is a powerful web-based code review tool that offers developers an easy way to handle code reviews. It scales well from small projects to large companies and offers a variety of tools to take much of the stress and time out of the code review process. license: module: - MIT content: - MIT xmd: mbs: mse: TRUE scmurl: https://src.fedoraproject.org/modules/reviewboard.git?#0fc31243aa85666e4e584aebda7a74e430cd0698 commit: 0fc31243aa85666e4e584aebda7a74e430cd0698 buildrequires: platform: ref: f29 stream: f29 context: 00000000 version: 5 filtered_rpms: [] django: ref: da53d66d3db1aa5f6afd75887b00fa26849bcc0a stream: 1.6 context: 6c81f848 version: 20180828135711 filtered_rpms: [] rpms: python-django-multiselectfield: ref: 149bf58875fb7b55efe29e1735baf96d44eb99a9 python-markdown: ref: 96c1b2f925c2ad3b7aae04ab7ebf25ae1d714ebf python-django-evolution: ref: 512424e1fc4b99f6f74c01a4130a4d9402b56b4e python-django-pipeline: ref: f019137be96cf86f49a81001fef47a0c7ab6aa35 ReviewBoard: ref: 5d28213f6a797e5ce28ad05ab23f80fe67353da8 python-djblets: ref: d5634779089456ff3d0ac7b78eec81e13ff4c733 python-django-haystack: ref: 20fe71a6fc50a83b24578fbaf86e94a4ca584d31 dependencies: - buildrequires: django: [1.6] platform: [f29] requires: django: [1.6] platform: [f29] references: community: https://www.reviewboard.org documentation: https://www.reviewboard.org/docs tracker: https://hellosplat.com/s/beanbag/tickets/ profiles: default: rpms: - ReviewBoard server: rpms: - ReviewBoard api: rpms: - ReviewBoard - python2-djblets components: rpms: ReviewBoard: rationale: The Review Board code review tool repository: git+https://src.fedoraproject.org/rpms/ReviewBoard cache: https://src.fedoraproject.org/repo/pkgs/ReviewBoard ref: 2.5 buildorder: 20 python-django-evolution: rationale: A database modification library used and maintained by the Review Board upstream repository: git+https://src.fedoraproject.org/rpms/python-django-evolution cache: https://src.fedoraproject.org/repo/pkgs/python-django-evolution ref: 0.7 python-django-haystack: rationale: An older version of the Haystack search library for Django, needed for compatibility. repository: git+https://src.fedoraproject.org/rpms/python-django-haystack cache: https://src.fedoraproject.org/repo/pkgs/python-django-haystack ref: 2.4 python-django-multiselectfield: rationale: An older version of a mult-select form field needed by Review Board. repository: git+https://src.fedoraproject.org/rpms/python-django-multiselectfield cache: https://src.fedoraproject.org/repo/pkgs/python-django-multiselectfield ref: 0.1 python-django-pipeline: rationale: An older version of this asset-packaging library for Django that is compatible with Review Board. repository: git+https://src.fedoraproject.org/rpms/python-django-pipeline cache: https://src.fedoraproject.org/repo/pkgs/python-django-pipeline ref: 1.3 python-djblets: rationale: Review Board tool library repository: git+https://src.fedoraproject.org/rpms/python-djblets cache: https://src.fedoraproject.org/repo/pkgs/python-djblets ref: 0.9 buildorder: 10 python-markdown: rationale: An older version of this Markdown implementation that is compatible with Review Board. repository: git+https://src.fedoraproject.org/rpms/python-markdown cache: https://src.fedoraproject.org/repo/pkgs/python-markdown ref: 2.4 artifacts: rpms: - ReviewBoard-0:2.5.17-17.module_1631+4353a891.noarch - python-django-haystack-docs-0:2.4.1-12.module_1631+4353a891.noarch - python2-django-evolution-1:0.7.7-12.module_1631+4353a891.noarch - python2-django-haystack-0:2.4.1-12.module_1631+4353a891.noarch - python2-django-multiselectfield-0:0.1.3-10.module_1631+4353a891.noarch - python2-django-pipeline-0:1.3.27-11.module_1631+4353a891.noarch - python2-djblets-0:0.9.9-13.module_1631+4353a891.noarch - python2-markdown-0:2.4.1-12.module_2085+40241970.noarch - python3-markdown-0:2.4.1-12.module_2085+40241970.noarch ... --- document: modulemd version: 2 data: name: postgresql stream: 9.6 version: 20180816142114 context: 6c81f848 arch: x86_64 summary: PostgreSQL module description: >- PostgreSQL is an advanced Object-Relational database management system (DBMS). The PostgreSQL server can be found in the postgresql-server sub-package. license: module: - MIT content: - MIT xmd: mbs: mse: TRUE scmurl: https://src.fedoraproject.org/modules/postgresql.git?#8765a18f16976cfe6122319e337c27e9ec40206a commit: 8765a18f16976cfe6122319e337c27e9ec40206a buildrequires: platform: ref: f29 stream: f29 context: 00000000 version: 5 filtered_rpms: [] rpms: postgresql: ref: 3f21ecc4af44639c7cb40244f5db7a48936e3452 dependencies: - buildrequires: platform: [f29] requires: platform: [f29] references: community: https://docs.pagure.org/modularity/ documentation: https://www.postgresql.org/docs/ tracker: https://github.com/modularity-modules/postgresql profiles: client: rpms: - postgresql default: rpms: - postgresql-server server: rpms: - postgresql-server api: rpms: - postgresql - postgresql-server buildopts: rpms: macros: | %runselftest 0 components: rpms: postgresql: rationale: main server component repository: git://pkgs.fedoraproject.org/rpms/postgresql cache: http://pkgs.fedoraproject.org/repo/pkgs/postgresql ref: 3f21ecc4 artifacts: rpms: - postgresql-0:9.6.8-1.module_1710+b535a823.x86_64 - postgresql-contrib-0:9.6.8-1.module_1710+b535a823.x86_64 - postgresql-devel-0:9.6.8-1.module_1710+b535a823.x86_64 - postgresql-docs-0:9.6.8-1.module_1710+b535a823.x86_64 - postgresql-libs-0:9.6.8-1.module_1710+b535a823.x86_64 - postgresql-plperl-0:9.6.8-1.module_1710+b535a823.x86_64 - postgresql-plpython-0:9.6.8-1.module_1710+b535a823.x86_64 - postgresql-plpython3-0:9.6.8-1.module_1710+b535a823.x86_64 - postgresql-pltcl-0:9.6.8-1.module_1710+b535a823.x86_64 - postgresql-server-0:9.6.8-1.module_1710+b535a823.x86_64 - postgresql-static-0:9.6.8-1.module_1710+b535a823.x86_64 - postgresql-test-0:9.6.8-1.module_1710+b535a823.x86_64 - postgresql-upgrade-0:9.6.8-1.module_1710+b535a823.x86_64 ... --- document: modulemd version: 2 data: name: pki stream: 10.6 version: 20180816141946 context: 6c81f848 arch: x86_64 summary: Dogtag PKI description: >- A module for Dogtag PKI. license: module: - MIT content: - MIT xmd: mbs: mse: TRUE scmurl: https://src.fedoraproject.org/modules/pki.git?#ae3c166e41f4a0c896667f2c4949c8b923421625 commit: ae3c166e41f4a0c896667f2c4949c8b923421625 buildrequires: platform: ref: f29 stream: f29 context: 00000000 version: 5 filtered_rpms: [] rpms: pki-core: ref: 55207954907bfc90c746358248d21d7f21f5362c jss: ref: cb35c90824e12860c131a565ca18fcaacfbce156 tomcatjss: ref: 7487d4dca363dd965ba35c8732fa86c65c69f1aa dogtag-pki: ref: 8c9a1c4bdb4ef13a3df0a173adfecc102a28c89b dependencies: - buildrequires: platform: [f29] requires: platform: [f29] references: community: http://www.dogtagpki.org documentation: http://www.dogtagpki.org tracker: https://pagure.io/dogtagpki/issues profiles: default: rpms: - dogtag-pki components: rpms: dogtag-pki: rationale: Dogtag PKI packages repository: git://pkgs.fedoraproject.org/rpms/dogtag-pki cache: http://pkgs.fedoraproject.org/repo/pkgs/dogtag-pki ref: 10.6 buildorder: 20 jss: rationale: JSS packages repository: git://pkgs.fedoraproject.org/rpms/jss cache: http://pkgs.fedoraproject.org/repo/pkgs/jss ref: 4.5 pki-core: rationale: PKI Core packages repository: git://pkgs.fedoraproject.org/rpms/pki-core cache: http://pkgs.fedoraproject.org/repo/pkgs/pki-core ref: 10.6 buildorder: 20 tomcatjss: rationale: TomcatJSS packages repository: git://pkgs.fedoraproject.org/rpms/tomcatjss cache: http://pkgs.fedoraproject.org/repo/pkgs/tomcatjss ref: 7.3 buildorder: 10 artifacts: rpms: - dogtag-pki-0:10.6.3-1.module_1909+cebfdf1a.x86_64 - dogtag-pki-console-theme-0:10.6.3-1.module_1909+cebfdf1a.noarch - dogtag-pki-server-theme-0:10.6.3-1.module_1909+cebfdf1a.noarch - jss-0:4.5.0-0.4.module_1913+819762cf.x86_64 - jss-javadoc-0:4.5.0-0.4.module_1913+819762cf.x86_64 - pki-base-0:10.6.3-1.module_1909+cebfdf1a.noarch - pki-base-java-0:10.6.3-1.module_1909+cebfdf1a.noarch - pki-ca-0:10.6.3-1.module_1909+cebfdf1a.noarch - pki-console-0:10.6.3-1.module_1909+cebfdf1a.noarch - pki-javadoc-0:10.6.3-1.module_1909+cebfdf1a.noarch - pki-kra-0:10.6.3-1.module_1909+cebfdf1a.noarch - pki-ocsp-0:10.6.3-1.module_1909+cebfdf1a.noarch - pki-server-0:10.6.3-1.module_1909+cebfdf1a.noarch - pki-symkey-0:10.6.3-1.module_1909+cebfdf1a.x86_64 - pki-tks-0:10.6.3-1.module_1909+cebfdf1a.noarch - pki-tools-0:10.6.3-1.module_1909+cebfdf1a.x86_64 - pki-tps-0:10.6.3-1.module_1909+cebfdf1a.x86_64 - python3-pki-0:10.6.3-1.module_1909+cebfdf1a.noarch - tomcatjss-0:7.3.2-1.module_1913+819762cf.noarch ... --- document: modulemd version: 2 data: name: perl-bootstrap stream: 5.26 version: 20180816141919 context: 6c81f848 arch: x86_64 summary: Perl bootstrap module for bootrapping Perl module description: > This is the Perl interpreter and a set of modules written in Perl language intended for bootstrapping the perl module. This module disables some optional tests to limit amount of components. This module is not intended for public use. It's an intermediate step for building perl module. license: module: - MIT content: - MIT xmd: mbs: mse: TRUE scmurl: https://src.fedoraproject.org/modules/perl-bootstrap.git?#ea11aea44aca54021cb782f1e243ff03722f86a5 commit: ea11aea44aca54021cb782f1e243ff03722f86a5 buildrequires: platform: ref: f29 stream: f29 context: 00000000 version: 5 filtered_rpms: [] rpms: perl-Devel-Symdump: ref: 777175a55451fddc85329a437c755efd410264da perl-Test-Pod: ref: b4f74114b955cfee96c10b0f04444ae6b4d2f4ce perl-File-Which: ref: 0c9cbe3a1d01d42035314f8d5527e6f505142cab perl-Test-Needs: ref: 2b9911794ccae86c53d0e4c6013fcb961e67f250 perl-Digest-MD5: ref: 8fad912c493bc960566e5ce7118e0cdce3b9a769 perl-Perl-Version: ref: 3d5649c15b5a2501e0e1ca057129ed3cb6166d65 perl-Pod-Escapes: ref: b86907d1d42dbd25c327e34b09b061f0a3f96d8a perl-Text-ParseWords: ref: 809c9bd7181b286d5e14e80a73f6ea50ac3b62b3 perl-IO-Socket-INET6: ref: f750541d79d2f642a06b52e6803f9c1cf81e70bf perl-podlators: ref: f3046951a9e1a70ccf2215f31e74c0accecd9770 perl-Pod-Eventual: ref: 9a1fa2670ce5ae1fa9730625bc5eb657ba0b1d5b perl-IPC-Cmd: ref: a22c9a02e64eaca7d7ebd7326ddc2baece702cd4 perl-Test-Output: ref: ccffd17b4ddd2bf2f739889e7b603f3071bccb97 perl-SUPER: ref: a5b2533172574285c2ea051300f06357982e2ea9 perl-MRO-Compat: ref: 7b9d4772b76353d755f44acc9a686e9566a1a4b7 perl-IPC-SysV: ref: 4cf56fbde1b8a369fb6114d0f2dc7866dd835b71 perl-Package-Generator: ref: 8a4118f2e4299109b3a7e6e0dea5ee7424e632bf perl-IO-HTML: ref: cf5155257c1a690461c0a0d54fa7af196b45898c perl-Time-Local: ref: ad2b9372902fb6279ca783752d56632d54e263b5 perl-Compress-Raw-Bzip2: ref: 2a51171531415b788d4bc6cdd05a823fb4b831b5 perl-IO-String: ref: b99e305978ee5a51efefa31c50ba2a0e502a71cc perl: ref: 8a371bbe29d1908077211d14e9e701b836c81540 perl-File-Slurp-Tiny: ref: fbf489950350c0fc8d7a3cb883820993e7df457b perl-Params-Util: ref: a69abfa9df18bb76b6ccb98caa103795abc5d083 perl-File-Path: ref: ac6856f118e7aa9a3a709c6202ab06494ecdd9b3 perl-Sub-Uplevel: ref: 865c6011e62e5b0b8a16ce433b0ce7618d62e9a2 perl-Module-Load: ref: 4f363f0c7d356591f33a22a930f4501167b01053 perl-CPAN-Meta-Requirements: ref: f25cbf2508f08dcb618b5e097cda6023aea94101 perl-Test-CPAN-Meta: ref: e495a7b866c6c955fdc577ae3408bdf2f7d4c7e6 perl-IO-Socket-IP: ref: 1a65c1170f6582ad9ece8fe9c76c540e18cd3264 perl-Test-Harness: ref: 65288c532917fea41328a20520e0755f6eb18463 perl-parent: ref: c3649d1868f869883423867076131c1604fd4467 perl-ExtUtils-CBuilder: ref: 4e5e482495a977c28396e2d1149def8dcb12e15f perl-perlfaq: ref: d5a90bd6871ae7a66cd64494b37727986b6eccbf perl-Sub-Install: ref: f3365c2a0b610eb21f6c1c786958c0e8ba08a47c perl-IPC-System-Simple: ref: 5b4319c5aabf7945208163c339c112b68b40d36a perl-Socket: ref: 20b784e3737e5842c973bd31f1735b67e77b050f perl-Perl-OSType: ref: 7191911473475122ff950ed36748133d8b2f968b perl-ExtUtils-ParseXS: ref: c84346769c6a5009890661786a061af1e06d32dd perl-Test-Deep: ref: 625b3e04a145219386254fde3ee2b5b3cc314567 perl-IPC-Run: ref: 1de5fa3ae2b8d01f5e7d8f41c55dd81989176b0b perl-Import-Into: ref: 6abf828544edc542b88bf9f8c27886e0c4db3ab7 perl-ExtUtils-Install: ref: 5eb9021663b033a695802e5d960795c1b338f1d1 perl-BSD-Resource: ref: 73ae1d113bdb6c8ada065344912685ca438cc987 perl-autodie: ref: 08926569224919ffa066397ca80c5b1818a89e90 perl-Locale-Maketext: ref: 6dd172c644c44c07b1613b0870a119ee5e6d4116 perl-Test-Warnings: ref: 1fb68d7818c1340f1b3d83e40bdf8556252d6e8a perl-Module-Runtime: ref: 47cdddc1405a658f52bd3e49321fccb776bbdfd0 perl-Data-OptList: ref: 55696a188230a0b16e32bc0cc6183cc0683753e3 perl-LWP-MediaTypes: ref: 5b66591ed99089c03052cd17d43fe48947e79fd1 perl-CPAN-Meta-YAML: ref: 04a0e2e11487241ed251223755f1abe43bbe392a perl-Math-BigInt-FastCalc: ref: fd294a4d494055cd4f3f7e22f0f0c361162dedfa perl-File-Temp: ref: ac22a248d28a1f81c99b73a7a6eaa5773f98c419 perl-JSON-PP: ref: 02d427bafed752ddfd755e1cfcd71c4daaa7b336 perl-Test-Simple: ref: 96c4c3b6c0172748a9a9c95fb2c1fefc9f73ee04 perl-File-Find-Object: ref: 0a1402388468fdd180b1b0875a6d9949cca924cc perl-Capture-Tiny: ref: 243ed7f00a6dea11dbdcb564f698573288e3e967 perl-HTTP-Message: ref: 363ac19afb23d8e519db09bad96ed8e19f93e45a perl-Pod-Coverage-TrustPod: ref: 7b67d6d5912228964a685e53a9076b568cbcfa2a perl-inc-latest: ref: b94b9e6f144d6ce856e827a2cb9c16c42cce56b5 perl-Module-Build: ref: a9f6bbfbfc8303db7b57cbea35e53de61a46a165 perl-Module-Load-Conditional: ref: 532fb21fdf6ff39b29abaccbdc4a1f87941521f2 perl-Filter: ref: 78296ad909c75c445e4c43526e3ae57f25de7c34 perl-Pod-Checker: ref: dd7b179ffb95412b1f28d3b825d87132f391821e perl-Sort-Versions: ref: fdc05a617f83b5f46838821619843d5fbf563ab2 perl-Thread-Queue: ref: 388cd4478b7d3e8ef552292fa77937aee27e9c0e perl-IO-Compress: ref: bb10d2103bf534e10a4a1d1bc987a4314cb5de48 perl-Math-BigInt: ref: 76c86fadeda569a2ebd6439f12e7f69f74c8df67 perl-File-Find-Rule: ref: 008055e020aa78373cb53e2925821fed986d32be perl-Text-Template: ref: c3ff74620de07ec5a20b398981cfe60bc23b7533 perl-Test-Exception: ref: 3fe9c62023b87199f3d296242d6656cdbcbada6d perl-Unicode-Normalize: ref: c7a4b3f134e101eb452b949eeda6497d6ea9e520 perl-HTML-Tagset: ref: 7cfcf4bcca6272bfa3d1bac71703acd696d78f1b perl-URI: ref: 8696c54987665ac968cb66d98b69e49a37a89b52 perl-Test-Version: ref: 1032b0ab580387f8781aec3d73408514cda3460c perl-Text-Glob: ref: b19ed6fe9d0ff70870939d2bfe33e2bd059b732a perl-Pod-Simple: ref: 05a654f26321267554e75398eb19f704b4b97e17 perl-Algorithm-Diff: ref: b572ed3bbdd7421c4ec31da90602f12f7a8c951c perl-Class-XSAccessor: ref: 4deb91539b2ec953c6535fb3baceda3b15a60b76 perl-Digest: ref: b3f866352aea430935df7f2f0afaaf3cced7d214 perl-Test-FailWarnings: ref: 1183728f2daf4a869e335bb0f79d63ff0adc7163 perl-Tie-IxHash: ref: 483692cdeeffae0e302d06287044cc6dd356230d perl-ExtUtils-MakeMaker: ref: c88d4cf08d3e3ddc8c113a430d287a830c1133e6 perl-Compress-Raw-Zlib: ref: c9d37e07af93fe0a5e4886536b27f016260074ca perl-Devel-StackTrace: ref: 953656c854cc43a45ef690a55978a62464019803 perl-ExtUtils-Manifest: ref: f1169d7bb27bfb1b2db567be1f0ff112a9069246 perl-Pod-Parser: ref: 13b1e60337a84241ed263e3a62af46005bec3b8c perl-Exporter: ref: 68f93042fb090750ccc7022bd957fa12ff184ecb perl-MIME-Base64: ref: c099afc6b1d7eec124f46bea88b86a2edd0f7b56 perl-version: ref: ef428f4f5c736e1c3af8343191aad3fd8f288692 perl-experimental: ref: f6265c90e007af2ae3882852d66e41c4f0294530 perl-CPAN: ref: c91f221d2bbde2992152786a94b3da8899d7a628 perl-Text-Balanced: ref: 8c14f0f727543b80dc9cacba0422bcc1653d0290 perl-PathTools: ref: a0ed8e15339741624d99094a261ecef2f2bef816 perl-Compress-Bzip2: ref: 4ca6f6001d529639ad9af34f6a4829371ed7c88c perl-Number-Compare: ref: 7dc6d151bfde123a33d29c4c1af0e4abafcccd00 perl-Fedora-VSP: ref: 90425acf3b0601d4feb86e0339f0c0efdd0435ae perl-Test-NoWarnings: ref: 68965e00ff2d48d2a31182cd6ca4032e6e246c98 perl-Locale-Codes: ref: e1436faa7dcf2c0cb70ead02bfbdca7fcbf7b531 perl-Module-CoreList: ref: 3a48c78df9faa9efb5b12f33d1d3c067f4321a8a perl-Scalar-List-Utils: ref: c0ea69a001e7bb2a50a9c122dcc5ce792125f6e4 perl-Digest-SHA: ref: a854293a4d31671e043e58f1efcd3848c05051c5 perl-CPAN-Meta-Check: ref: 08fa92e0015579217acb945950b5513883a7a3e5 perl-Expect: ref: 47e40dd9b1ecfb0a5910e6b041380568b23bb10b perl-TimeDate: ref: 323459d241244ac7f1de7e8a3eda452fdaf91c63 perl-Pod-Coverage: ref: 3155ccedc6d02a815b2a5201be75f6a3a9bd8157 perl-generators: ref: 3517fe526a3f0bb16c097eecd05bfe9dfb94c42e perl-Pod-Perldoc: ref: 97a96bfb531f584eaa7d70f309ca9f24699af42f perl-Sub-Exporter: ref: 34cd68b9ccfbae47690795a40a14a236ff0b2319 perl-Time-HiRes: ref: 400def5c2f8c642b692a22c7a6f45da6f4cbd868 perl-HTTP-Tiny: ref: 0353adf841dad88f6fb3d8770742b3989363c688 perl-Test-Taint: ref: f7e00eace8747a9a77b6594648e55692180f4c42 perl-Text-Tabs+Wrap: ref: 84d9073a2276ee2310cfc7e633c08e271c2f2319 perl-B-Debug: ref: 5a7c0b7619476154ff3129fe449afabb1b450279 perl-File-HomeDir: ref: 253a5f4a3d03187c799904441650124e8ec832ea perl-threads: ref: 96ef6a4161926a852227a37db2a82769df38ebc5 perl-Unicode-Collate: ref: 3a0555a1c080f2bba8e052c32ce35d4c1fca429a perl-Encode-Locale: ref: 4a07f2dc5f13dfe03aceffeae98a4ad6cf55f8f3 perl-Try-Tiny: ref: 844122c4abfa6248b2e8bbbf3124772c62f69525 perl-Text-Diff: ref: 435597b4b8f23cdb4b5d08a83526f3a0ba180ba4 perl-threads-shared: ref: 236010203776860d682ee2e6d37529e8e4aaa90a perl-Math-BigRat: ref: 12a221b50a7d62e76aea4bb924f502d287e86081 perl-HTML-Parser: ref: a4851da917c159c9ec3e2a0e262a33e7b20ec333 perl-Storable: ref: e470bb35a115fbcde8f94559e3bb9dcab0e39c97 perl-Getopt-Long: ref: 3fcd385e78c21d29488f8e020e2b9df21c54900f perl-bignum: ref: e1753ef99cc972644a0a217e676467b8fd5d5788 perl-Net-SSLeay: ref: bb304e2e37562e29cacfe38b2be1aee45553d603 perl-Term-ANSIColor: ref: 7e942843d7f43f5535e55f7709943e210743f4fe perl-IO-Tty: ref: cf1db7dbd0312e7e7f47e5514d8ab31c8bba0af0 perl-Net-IDN-Encode: ref: ab799c23d30edaa81d76e126fd771826fc7a6a3e perl-Carp: ref: 217d519372b989049db02455e4fd53e238bf8675 perl-libnet: ref: 8799d71bc96c9db7a72658edcd27f9f21b260f71 perl-Test-TrailingSpace: ref: 0c7fbdc7c25b65a32036d9e7f8af740d1d033bb8 perl-local-lib: ref: 0716ed7be631222c11ec33672373662daa6b00bf perl-Params-Check: ref: 94989a67e37e22221a55b1d39dfb9f804122f928 perl-File-Find-Rule-Perl: ref: dbda2b929804a36785ee66f4303df70d176ad1b1 perl-Mixin-Linewise: ref: 5d8ee6f3040dde6651a61ffc0882f2dfbf605fe3 perl-Test-Pod-Coverage: ref: f11cb72d99f17be5cb87770bbdd204c78ed750fa perl-Data-Dumper: ref: 8e85cc7e6166838184b034d875759a39df4d10d3 perl-Data-Section: ref: ce79e1d99123d4220543d1eb2d2806673277cad4 perl-Socket6: ref: 97074976ca50b6f7fd7b98a2110e24bb23cbba9b perl-File-Fetch: ref: 7e786fd7e77fd794553f84ff29dc777cd9f73ca2 perl-HTTP-Date: ref: cd8b6842046370b72d530dc9aa714525d41014b3 perl-Software-License: ref: dbee7688f08ab815650fd845122a8ee8cfb0294c perl-IO-Socket-SSL: ref: da2796e619b0650410425d31e1cf3659a3a8fcc5 perl-Archive-Tar: ref: 6baa268adbe88e2afac55a5947342b7d1c2500fa perl-Config-Perl-V: ref: ae30cc26220da556c9fa448172710e4522fa6735 perl-Pod-Usage: ref: 98983d9f8b961510acff3a1190c7ea62d447699f perl-Env: ref: 201efc08b7115ab13b1402f76ed05e5c8ed686d4 perl-Test-Warn: ref: 90bfb89225f8505aba28f74138269a7281b03172 perl-Devel-Size: ref: 59a39ceb2d9141d9fd9733280220395be02e83a6 perl-Test-MockModule: ref: 8b278927b93037a9b2a93a47f68cdcfd4c090ff2 perl-Term-Cap: ref: 1d444a86d772b87c5b0484e3639f7bac52de8afe perl-Sys-Syslog: ref: b83dcfb81b92c0617bee60d8ac89d1d228b88d8e perl-Devel-PPPort: ref: 17c87af74208a53d3202030ad52862fd376123fc perl-CGI: ref: 9e750f4b5aecfaf628c615831fdc30f3d396baaf perl-CPAN-Meta: ref: f8259dccb36b9a47dc6bad88847c3fcd3563a196 perl-File-Find-Object-Rule: ref: 69cfed894fcb5fb7fc1b4b7d5701195285279000 perl-Archive-Zip: ref: 09e89616f0acea510d1e85c69e12b961c28f4bb6 perl-DB_File: ref: 462f0f70ba43c2b21811e8517b5f7c0fe2aa0ca6 perl-PerlIO-utf8_strict: ref: 081963e3f8eb01e77546e781eceb5a68ca88fa34 perl-YAML: ref: bc07cedbcda09b33873e03730b5d869c6f87f217 perl-Sub-Identify: ref: b1765a68a41efd165cda6663fc9c26d2d2f44bbd perl-Filter-Simple: ref: 08e79709ade8905bc3212d2c7dbb1d168d578dba perl-Module-Metadata: ref: 1578659d3194251b91e39887baf3ad56689fad90 perl-Net-LibIDN: ref: b62c33bc0db667bcfa1486b0bd3eaf349b295e6c perl-PerlIO-via-QuotedPrint: ref: 7d17de12fac09e63e1c14ed17229c6d23e923830 perl-constant: ref: bce81fc9c982eeee92490116718ab9ed652eb0e7 perl-Encode: ref: 5417f768a229062a55dde8f25b5b9aac039f96e1 mbs_options: blocked_packages: - perl - perl-Algorithm-Diff - perl-Archive-Tar - perl-Archive-Zip - perl-autodie - perl-B-Debug - perl-bignum - perl-BSD-Resource - perl-Capture-Tiny - perl-Carp - perl-CGI - perl-Class-XSAccessor - perl-Compress-Bzip2 - perl-Compress-Raw-Bzip2 - perl-Compress-Raw-Zlib - perl-Config-Perl-V - perl-constant - perl-CPAN - perl-CPAN-Meta - perl-CPAN-Meta-Check - perl-CPAN-Meta-Requirements - perl-CPAN-Meta-YAML - perl-Data-Dumper - perl-Data-OptList - perl-Data-Section - perl-DB_File - perl-Devel-PPPort - perl-Devel-Size - perl-Devel-StackTrace - perl-Devel-Symdump - perl-Digest - perl-Digest-MD5 - perl-Digest-SHA - perl-Encode - perl-Encode-Locale - perl-Env - perl-Expect - perl-experimental - perl-Exporter - perl-ExtUtils-CBuilder - perl-ExtUtils-Install - perl-ExtUtils-MakeMaker - perl-ExtUtils-Manifest - perl-ExtUtils-ParseXS - perl-Fedora-VSP - perl-File-Fetch - perl-File-Find-Object - perl-File-Find-Object-Rule - perl-File-Find-Rule - perl-File-Find-Rule-Perl - perl-File-HomeDir - perl-File-Path - perl-File-Slurp-Tiny - perl-File-Temp - perl-File-Which - perl-Filter - perl-Filter-Simple - perl-generators - perl-Getopt-Long - perl-HTML-Parser - perl-HTML-Tagset - perl-HTTP-Date - perl-HTTP-Message - perl-HTTP-Tiny - perl-Import-Into - perl-inc-latest - perl-IO-Compress - perl-IO-HTML - perl-IO-Socket-INET6 - perl-IO-Socket-IP - perl-IO-Socket-SSL - perl-IO-String - perl-IO-Tty - perl-IPC-Cmd - perl-IPC-Run - perl-IPC-System-Simple - perl-IPC-SysV - perl-JSON-PP - perl-libnet - perl-local-lib - perl-Locale-Codes - perl-Locale-Maketext - perl-LWP-MediaTypes - perl-Math-BigInt - perl-Math-BigInt-FastCalc - perl-Math-BigRat - perl-MIME-Base64 - perl-Mixin-Linewise - perl-Module-Build - perl-Module-CoreList - perl-Module-Load - perl-Module-Load-Conditional - perl-Module-Metadata - perl-Module-Runtime - perl-MRO-Compat - perl-Net-IDN-Encode - perl-Net-LibIDN - perl-Net-SSLeay - perl-Number-Compare - perl-Package-Generator - perl-Params-Check - perl-Params-Util - perl-parent - perl-PathTools - perl-Perl-OSType - perl-Perl-Version - perl-perlfaq - perl-PerlIO-utf8_strict - perl-PerlIO-via-QuotedPrint - perl-Pod-Checker - perl-Pod-Coverage - perl-Pod-Coverage-TrustPod - perl-Pod-Escapes - perl-Pod-Eventual - perl-Pod-Parser - perl-Pod-Perldoc - perl-Pod-Simple - perl-Pod-Usage - perl-podlators - perl-Scalar-List-Utils - perl-Socket - perl-Socket6 - perl-Software-License - perl-Sort-Versions - perl-Storable - perl-Sub-Exporter - perl-Sub-Identify - perl-Sub-Install - perl-Sub-Uplevel - perl-SUPER - perl-Sys-Syslog - perl-Term-ANSIColor - perl-Term-Cap - perl-Test-CPAN-Meta - perl-Test-Deep - perl-Test-Exception - perl-Test-FailWarnings - perl-Test-Harness - perl-Test-MockModule - perl-Test-Needs - perl-Test-NoWarnings - perl-Test-Output - perl-Test-Pod - perl-Test-Pod-Coverage - perl-Test-Simple - perl-Test-Taint - perl-Test-TrailingSpace - perl-Test-Version - perl-Test-Warn - perl-Test-Warnings - perl-Text-Balanced - perl-Text-Diff - perl-Text-Glob - perl-Text-ParseWords - perl-Text-Tabs+Wrap - perl-Text-Template - perl-Thread-Queue - perl-threads - perl-threads-shared - perl-Tie-IxHash - perl-Time-HiRes - perl-Time-Local - perl-TimeDate - perl-Try-Tiny - perl-Unicode-Collate - perl-Unicode-Normalize - perl-URI - perl-version - perl-YAML dependencies: - buildrequires: platform: [f29] requires: platform: [f29] references: community: https://fedoraproject.org/wiki/Modularity documentation: https://fedoraproject.org/wiki/Fedora_Packaging_Guidelines_for_Modules buildopts: rpms: macros: | %perl_bootstrap 1 %_with_perl_enables_groff 1 %_without_perl_enables_syslog_test 1 %_with_perl_enables_systemtap 1 %_without_perl_enables_tcsh 1 %_without_perl_Compress_Bzip2_enables_optional_test 1 %_without_perl_CPAN_Meta_Requirements_enables_optional_test 1 %_without_perl_IPC_System_Simple_enables_optional_test 1 %_without_perl_LWP_MediaTypes_enables_mailcap 1 %_without_perl_Module_Build_enables_optional_test 1 %_without_perl_Perl_OSType_enables_optional_test 1 %_without_perl_Pod_Perldoc_enables_tk_test 1 %_without_perl_Software_License_enables_optional_test 1 %_without_perl_Sys_Syslog_enables_optional_test 1 %_without_perl_Test_Harness_enables_optional_test 1 %_without_perl_Test_Simple_enables_optional_test 1 %_without_perl_Test_Warnings_enables_optional_test 1 %_without_perl_URI_enables_Business_ISBN 1 components: rpms: perl: rationale: The Perl interpreter. repository: git://pkgs.fedoraproject.org/rpms/perl cache: http://pkgs.fedoraproject.org/repo/pkgs/perl ref: f28 perl-Algorithm-Diff: rationale: build dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-Algorithm-Diff cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-Algorithm-Diff ref: f28 buildorder: 3 perl-Archive-Tar: rationale: build dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-Archive-Tar cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-Archive-Tar ref: f28 buildorder: 3 perl-Archive-Zip: rationale: build dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-Archive-Zip cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-Archive-Zip ref: f28 buildorder: 7 perl-B-Debug: rationale: build dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-B-Debug cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-B-Debug ref: f28 buildorder: 3 perl-BSD-Resource: rationale: build dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-BSD-Resource cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-BSD-Resource ref: f28 buildorder: 6 perl-CGI: rationale: build dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-CGI cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-CGI ref: f28 buildorder: 12 perl-CPAN: rationale: build dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-CPAN cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-CPAN ref: f28 buildorder: 3 perl-CPAN-Meta: rationale: build dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-CPAN-Meta cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-CPAN-Meta ref: f28 buildorder: 3 perl-CPAN-Meta-Check: rationale: build dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-CPAN-Meta-Check cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-CPAN-Meta-Check ref: f28 buildorder: 9 perl-CPAN-Meta-Requirements: rationale: build dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-CPAN-Meta-Requirements cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-CPAN-Meta-Requirements ref: f28 buildorder: 3 perl-CPAN-Meta-YAML: rationale: build dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-CPAN-Meta-YAML cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-CPAN-Meta-YAML ref: f28 buildorder: 3 perl-Capture-Tiny: rationale: build dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-Capture-Tiny cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-Capture-Tiny ref: f28 buildorder: 3 perl-Carp: rationale: build dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-Carp cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-Carp ref: f28 buildorder: 3 perl-Class-XSAccessor: rationale: build dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-Class-XSAccessor cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-Class-XSAccessor ref: f28 buildorder: 3 perl-Compress-Bzip2: rationale: build dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-Compress-Bzip2 cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-Compress-Bzip2 ref: f28 buildorder: 3 perl-Compress-Raw-Bzip2: rationale: build dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-Compress-Raw-Bzip2 cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-Compress-Raw-Bzip2 ref: f28 buildorder: 3 perl-Compress-Raw-Zlib: rationale: build dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-Compress-Raw-Zlib cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-Compress-Raw-Zlib ref: f28 buildorder: 3 perl-Config-Perl-V: rationale: build dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-Config-Perl-V cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-Config-Perl-V ref: f28 buildorder: 3 perl-DB_File: rationale: build dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-DB_File cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-DB_File ref: f28 buildorder: 3 perl-Data-Dumper: rationale: build dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-Data-Dumper cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-Data-Dumper ref: f28 buildorder: 3 perl-Data-OptList: rationale: build dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-Data-OptList cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-Data-OptList ref: f28 buildorder: 4 perl-Data-Section: rationale: build dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-Data-Section cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-Data-Section ref: f28 buildorder: 6 perl-Devel-PPPort: rationale: build dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-Devel-PPPort cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-Devel-PPPort ref: f28 buildorder: 3 perl-Devel-Size: rationale: build dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-Devel-Size cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-Devel-Size ref: f28 buildorder: 6 perl-Devel-StackTrace: rationale: build dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-Devel-StackTrace cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-Devel-StackTrace ref: f28 buildorder: 3 perl-Devel-Symdump: rationale: build dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-Devel-Symdump cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-Devel-Symdump ref: f28 buildorder: 3 perl-Digest: rationale: build dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-Digest cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-Digest ref: f28 buildorder: 3 perl-Digest-MD5: rationale: build dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-Digest-MD5 cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-Digest-MD5 ref: f28 buildorder: 3 perl-Digest-SHA: rationale: build dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-Digest-SHA cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-Digest-SHA ref: f28 buildorder: 3 perl-Encode: rationale: build dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-Encode cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-Encode ref: f28 buildorder: 3 perl-Encode-Locale: rationale: build dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-Encode-Locale cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-Encode-Locale ref: f28 buildorder: 3 perl-Env: rationale: build dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-Env cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-Env ref: f28 buildorder: 3 perl-Expect: rationale: build dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-Expect cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-Expect ref: f28 buildorder: 4 perl-Exporter: rationale: build dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-Exporter cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-Exporter ref: f28 buildorder: 3 perl-ExtUtils-CBuilder: rationale: build dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-ExtUtils-CBuilder cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-ExtUtils-CBuilder ref: f28 buildorder: 3 perl-ExtUtils-Install: rationale: build dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-ExtUtils-Install cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-ExtUtils-Install ref: f28 buildorder: 3 perl-ExtUtils-MakeMaker: rationale: build dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-ExtUtils-MakeMaker cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-ExtUtils-MakeMaker ref: f28 buildorder: 3 perl-ExtUtils-Manifest: rationale: build dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-ExtUtils-Manifest cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-ExtUtils-Manifest ref: f28 buildorder: 3 perl-ExtUtils-ParseXS: rationale: build dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-ExtUtils-ParseXS cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-ExtUtils-ParseXS ref: f28 buildorder: 3 perl-Fedora-VSP: rationale: RPM dependency generator. repository: git://pkgs.fedoraproject.org/rpms/perl-Fedora-VSP cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-Fedora-VSP ref: f28 buildorder: 1 perl-File-Fetch: rationale: build dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-File-Fetch cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-File-Fetch ref: f28 buildorder: 3 perl-File-Find-Object: rationale: build dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-File-Find-Object cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-File-Find-Object ref: f28 buildorder: 4 perl-File-Find-Object-Rule: rationale: build dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-File-Find-Object-Rule cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-File-Find-Object-Rule ref: f28 buildorder: 5 perl-File-Find-Rule: rationale: build dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-File-Find-Rule cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-File-Find-Rule ref: f28 buildorder: 4 perl-File-Find-Rule-Perl: rationale: build dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-File-Find-Rule-Perl cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-File-Find-Rule-Perl ref: f28 buildorder: 5 perl-File-HomeDir: rationale: build dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-File-HomeDir cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-File-HomeDir ref: f28 buildorder: 4 perl-File-Path: rationale: build dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-File-Path cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-File-Path ref: f28 buildorder: 3 perl-File-Slurp-Tiny: rationale: build dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-File-Slurp-Tiny cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-File-Slurp-Tiny ref: f28 buildorder: 3 perl-File-Temp: rationale: build dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-File-Temp cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-File-Temp ref: f28 buildorder: 3 perl-File-Which: rationale: build dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-File-Which cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-File-Which ref: f28 buildorder: 3 perl-Filter: rationale: build dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-Filter cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-Filter ref: f28 buildorder: 3 perl-Filter-Simple: rationale: build dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-Filter-Simple cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-Filter-Simple ref: f28 buildorder: 3 perl-Getopt-Long: rationale: build dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-Getopt-Long cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-Getopt-Long ref: f28 buildorder: 3 perl-HTML-Parser: rationale: build dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-HTML-Parser cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-HTML-Parser ref: f28 buildorder: 5 perl-HTML-Tagset: rationale: build dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-HTML-Tagset cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-HTML-Tagset ref: f28 buildorder: 3 perl-HTTP-Date: rationale: build dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-HTTP-Date cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-HTTP-Date ref: f28 buildorder: 3 perl-HTTP-Message: rationale: build dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-HTTP-Message cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-HTTP-Message ref: f28 buildorder: 11 perl-HTTP-Tiny: rationale: build dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-HTTP-Tiny cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-HTTP-Tiny ref: f28 buildorder: 3 perl-IO-Compress: rationale: build dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-IO-Compress cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-IO-Compress ref: f28 buildorder: 4 perl-IO-HTML: rationale: build dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-IO-HTML cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-IO-HTML ref: f28 buildorder: 3 perl-IO-Socket-INET6: rationale: build dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-IO-Socket-INET6 cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-IO-Socket-INET6 ref: f28 buildorder: 7 perl-IO-Socket-IP: rationale: build dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-IO-Socket-IP cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-IO-Socket-IP ref: f28 buildorder: 3 perl-IO-Socket-SSL: rationale: build dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-IO-Socket-SSL cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-IO-Socket-SSL ref: f28 buildorder: 8 perl-IO-String: rationale: build dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-IO-String cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-IO-String ref: f28 buildorder: 3 perl-IO-Tty: rationale: build dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-IO-Tty cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-IO-Tty ref: f28 buildorder: 3 perl-IPC-Cmd: rationale: build dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-IPC-Cmd cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-IPC-Cmd ref: f28 buildorder: 3 perl-IPC-Run: rationale: build dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-IPC-Run cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-IPC-Run ref: f28 buildorder: 4 perl-IPC-SysV: rationale: build dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-IPC-SysV cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-IPC-SysV ref: f28 buildorder: 3 perl-IPC-System-Simple: rationale: build dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-IPC-System-Simple cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-IPC-System-Simple ref: f28 buildorder: 3 perl-Import-Into: rationale: build dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-Import-Into cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-Import-Into ref: f28 buildorder: 7 perl-JSON-PP: rationale: build dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-JSON-PP cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-JSON-PP ref: f28 buildorder: 3 perl-LWP-MediaTypes: rationale: build dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-LWP-MediaTypes cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-LWP-MediaTypes ref: f28 buildorder: 3 perl-Locale-Codes: rationale: build dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-Locale-Codes cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-Locale-Codes ref: f28 buildorder: 3 perl-Locale-Maketext: rationale: build dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-Locale-Maketext cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-Locale-Maketext ref: f28 buildorder: 3 perl-MIME-Base64: rationale: build dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-MIME-Base64 cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-MIME-Base64 ref: f28 buildorder: 3 perl-MRO-Compat: rationale: build dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-MRO-Compat cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-MRO-Compat ref: f28 buildorder: 3 perl-Math-BigInt: rationale: build dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-Math-BigInt cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-Math-BigInt ref: f28 buildorder: 3 perl-Math-BigInt-FastCalc: rationale: build dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-Math-BigInt-FastCalc cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-Math-BigInt-FastCalc ref: f28 buildorder: 4 perl-Math-BigRat: rationale: build dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-Math-BigRat cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-Math-BigRat ref: f28 buildorder: 3 perl-Mixin-Linewise: rationale: build dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-Mixin-Linewise cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-Mixin-Linewise ref: f28 buildorder: 6 perl-Module-Build: rationale: build dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-Module-Build cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-Module-Build ref: f28 buildorder: 4 perl-Module-CoreList: rationale: build dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-Module-CoreList cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-Module-CoreList ref: f28 buildorder: 3 perl-Module-Load: rationale: build dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-Module-Load cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-Module-Load ref: f28 buildorder: 3 perl-Module-Load-Conditional: rationale: build dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-Module-Load-Conditional cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-Module-Load-Conditional ref: f28 buildorder: 3 perl-Module-Metadata: rationale: build dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-Module-Metadata cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-Module-Metadata ref: f28 buildorder: 3 perl-Module-Runtime: rationale: build dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-Module-Runtime cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-Module-Runtime ref: f28 buildorder: 6 perl-Net-IDN-Encode: rationale: build dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-Net-IDN-Encode cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-Net-IDN-Encode ref: f28 buildorder: 5 perl-Net-LibIDN: rationale: build dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-Net-LibIDN cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-Net-LibIDN ref: f28 buildorder: 3 perl-Net-SSLeay: rationale: build dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-Net-SSLeay cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-Net-SSLeay ref: f28 buildorder: 5 perl-Number-Compare: rationale: build dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-Number-Compare cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-Number-Compare ref: f28 buildorder: 3 perl-Package-Generator: rationale: build dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-Package-Generator cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-Package-Generator ref: f28 buildorder: 4 perl-Params-Check: rationale: build dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-Params-Check cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-Params-Check ref: f28 buildorder: 3 perl-Params-Util: rationale: build dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-Params-Util cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-Params-Util ref: f28 buildorder: 3 perl-PathTools: rationale: build dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-PathTools cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-PathTools ref: f28 buildorder: 3 perl-Perl-OSType: rationale: build dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-Perl-OSType cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-Perl-OSType ref: f28 buildorder: 3 perl-Perl-Version: rationale: build dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-Perl-Version cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-Perl-Version ref: f28 buildorder: 6 perl-PerlIO-utf8_strict: rationale: build dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-PerlIO-utf8_strict cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-PerlIO-utf8_strict ref: f28 buildorder: 5 perl-PerlIO-via-QuotedPrint: rationale: build dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-PerlIO-via-QuotedPrint cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-PerlIO-via-QuotedPrint ref: f28 buildorder: 3 perl-Pod-Checker: rationale: build dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-Pod-Checker cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-Pod-Checker ref: f28 buildorder: 3 perl-Pod-Coverage: rationale: build dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-Pod-Coverage cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-Pod-Coverage ref: f28 buildorder: 4 perl-Pod-Coverage-TrustPod: rationale: build dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-Pod-Coverage-TrustPod cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-Pod-Coverage-TrustPod ref: f28 buildorder: 8 perl-Pod-Escapes: rationale: build dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-Pod-Escapes cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-Pod-Escapes ref: f28 buildorder: 3 perl-Pod-Eventual: rationale: build dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-Pod-Eventual cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-Pod-Eventual ref: f28 buildorder: 7 perl-Pod-Parser: rationale: build dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-Pod-Parser cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-Pod-Parser ref: f28 buildorder: 3 perl-Pod-Perldoc: rationale: build dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-Pod-Perldoc cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-Pod-Perldoc ref: f28 buildorder: 3 perl-Pod-Simple: rationale: build dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-Pod-Simple cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-Pod-Simple ref: f28 buildorder: 3 perl-Pod-Usage: rationale: build dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-Pod-Usage cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-Pod-Usage ref: f28 buildorder: 3 perl-SUPER: rationale: build dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-SUPER cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-SUPER ref: f28 buildorder: 5 perl-Scalar-List-Utils: rationale: build dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-Scalar-List-Utils cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-Scalar-List-Utils ref: f28 buildorder: 3 perl-Socket: rationale: build dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-Socket cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-Socket ref: f28 buildorder: 3 perl-Socket6: rationale: build dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-Socket6 cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-Socket6 ref: f28 buildorder: 3 perl-Software-License: rationale: build dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-Software-License cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-Software-License ref: f28 buildorder: 11 perl-Sort-Versions: rationale: build dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-Sort-Versions cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-Sort-Versions ref: f28 buildorder: 3 perl-Storable: rationale: build dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-Storable cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-Storable ref: f28 buildorder: 3 perl-Sub-Exporter: rationale: build dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-Sub-Exporter cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-Sub-Exporter ref: f28 buildorder: 5 perl-Sub-Identify: rationale: build dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-Sub-Identify cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-Sub-Identify ref: f28 buildorder: 4 perl-Sub-Install: rationale: build dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-Sub-Install cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-Sub-Install ref: f28 buildorder: 3 perl-Sub-Uplevel: rationale: build dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-Sub-Uplevel cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-Sub-Uplevel ref: f28 buildorder: 3 perl-Sys-Syslog: rationale: build dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-Sys-Syslog cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-Sys-Syslog ref: f28 buildorder: 3 perl-Term-ANSIColor: rationale: build dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-Term-ANSIColor cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-Term-ANSIColor ref: f28 buildorder: 3 perl-Term-Cap: rationale: build dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-Term-Cap cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-Term-Cap ref: f28 buildorder: 3 perl-Test-CPAN-Meta: rationale: build dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-Test-CPAN-Meta cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-Test-CPAN-Meta ref: f28 buildorder: 6 perl-Test-Deep: rationale: build dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-Test-Deep cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-Test-Deep ref: f28 buildorder: 3 perl-Test-Exception: rationale: build dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-Test-Exception cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-Test-Exception ref: f28 buildorder: 4 perl-Test-FailWarnings: rationale: build dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-Test-FailWarnings cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-Test-FailWarnings ref: f28 buildorder: 4 perl-Test-Harness: rationale: build dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-Test-Harness cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-Test-Harness ref: f28 buildorder: 3 perl-Test-MockModule: rationale: build dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-Test-MockModule cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-Test-MockModule ref: f28 buildorder: 6 perl-Test-Needs: rationale: build dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-Test-Needs cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-Test-Needs ref: f28 buildorder: 3 perl-Test-NoWarnings: rationale: build dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-Test-NoWarnings cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-Test-NoWarnings ref: f28 buildorder: 4 perl-Test-Output: rationale: build dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-Test-Output cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-Test-Output ref: f28 buildorder: 6 perl-Test-Pod: rationale: build dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-Test-Pod cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-Test-Pod ref: f28 buildorder: 3 perl-Test-Pod-Coverage: rationale: build dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-Test-Pod-Coverage cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-Test-Pod-Coverage ref: f28 buildorder: 5 perl-Test-Simple: rationale: build dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-Test-Simple cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-Test-Simple ref: f28 buildorder: 3 perl-Test-Taint: rationale: build dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-Test-Taint cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-Test-Taint ref: f28 buildorder: 6 perl-Test-TrailingSpace: rationale: build dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-Test-TrailingSpace cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-Test-TrailingSpace ref: f28 buildorder: 6 perl-Test-Version: rationale: build dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-Test-Version cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-Test-Version ref: f28 buildorder: 6 perl-Test-Warn: rationale: build dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-Test-Warn cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-Test-Warn ref: f28 buildorder: 4 perl-Test-Warnings: rationale: build dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-Test-Warnings cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-Test-Warnings ref: f28 buildorder: 3 perl-Text-Balanced: rationale: build dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-Text-Balanced cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-Text-Balanced ref: f28 buildorder: 3 perl-Text-Diff: rationale: build dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-Text-Diff cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-Text-Diff ref: f28 buildorder: 4 perl-Text-Glob: rationale: build dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-Text-Glob cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-Text-Glob ref: f28 buildorder: 3 perl-Text-ParseWords: rationale: build dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-Text-ParseWords cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-Text-ParseWords ref: f28 buildorder: 3 perl-Text-Tabs+Wrap: rationale: build dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-Text-Tabs+Wrap cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-Text-Tabs+Wrap ref: f28 buildorder: 3 perl-Text-Template: rationale: build dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-Text-Template cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-Text-Template ref: f28 buildorder: 4 perl-Thread-Queue: rationale: build dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-Thread-Queue cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-Thread-Queue ref: f28 buildorder: 3 perl-Tie-IxHash: rationale: build dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-Tie-IxHash cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-Tie-IxHash ref: f28 buildorder: 3 perl-Time-HiRes: rationale: build dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-Time-HiRes cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-Time-HiRes ref: f28 buildorder: 3 perl-Time-Local: rationale: build dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-Time-Local cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-Time-Local ref: f28 buildorder: 3 perl-TimeDate: rationale: build dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-TimeDate cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-TimeDate ref: f28 buildorder: 3 perl-Try-Tiny: rationale: build dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-Try-Tiny cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-Try-Tiny ref: f28 buildorder: 10 perl-URI: rationale: build dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-URI cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-URI ref: f28 buildorder: 4 perl-Unicode-Collate: rationale: build dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-Unicode-Collate cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-Unicode-Collate ref: f28 buildorder: 3 perl-Unicode-Normalize: rationale: build dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-Unicode-Normalize cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-Unicode-Normalize ref: f28 buildorder: 3 perl-YAML: rationale: build dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-YAML cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-YAML ref: f28 buildorder: 3 perl-autodie: rationale: build dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-autodie cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-autodie ref: f28 buildorder: 3 perl-bignum: rationale: build dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-bignum cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-bignum ref: f28 buildorder: 3 perl-constant: rationale: build dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-constant cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-constant ref: f28 buildorder: 3 perl-experimental: rationale: build dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-experimental cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-experimental ref: f28 buildorder: 3 perl-generators: rationale: RPM dependency generator. repository: git://pkgs.fedoraproject.org/rpms/perl-generators cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-generators ref: f28 buildorder: 2 perl-inc-latest: rationale: build dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-inc-latest cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-inc-latest ref: f28 buildorder: 3 perl-libnet: rationale: build dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-libnet cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-libnet ref: f28 buildorder: 3 perl-local-lib: rationale: build dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-local-lib cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-local-lib ref: f28 buildorder: 5 perl-parent: rationale: build dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-parent cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-parent ref: f28 buildorder: 3 perl-perlfaq: rationale: build dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-perlfaq cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-perlfaq ref: f28 buildorder: 3 perl-podlators: rationale: build dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-podlators cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-podlators ref: f28 buildorder: 3 perl-threads: rationale: build dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-threads cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-threads ref: f28 buildorder: 3 perl-threads-shared: rationale: build dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-threads-shared cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-threads-shared ref: f28 buildorder: 3 perl-version: rationale: build dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-version cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-version ref: f28 buildorder: 3 artifacts: rpms: - perl-4:5.26.2-413.module_2073+eebc5b71.x86_64 - perl-Algorithm-Diff-0:1.1903-9.module_1675+7c48d950.noarch - perl-Archive-Tar-0:2.24-413.module_2073+eebc5b71.noarch - perl-Archive-Tar-0:2.28-1.module_2073+eebc5b71.noarch - perl-Archive-Zip-0:1.60-3.module_2073+eebc5b71.noarch - perl-Attribute-Handlers-0:0.99-413.module_2073+eebc5b71.noarch - perl-B-Debug-0:1.24-413.module_2073+eebc5b71.noarch - perl-B-Debug-0:1.26-2.module_1675+7c48d950.noarch - perl-BSD-Resource-0:1.291.100-5.module_1675+7c48d950.x86_64 - perl-CGI-0:4.38-2.module_1675+7c48d950.noarch - perl-CPAN-0:2.18-397.module_1675+7c48d950.noarch - perl-CPAN-0:2.18-413.module_2073+eebc5b71.noarch - perl-CPAN-Meta-0:2.150010-396.module_1675+7c48d950.noarch - perl-CPAN-Meta-0:2.150010-413.module_2073+eebc5b71.noarch - perl-CPAN-Meta-Check-0:0.014-5.module_1675+7c48d950.noarch - perl-CPAN-Meta-Requirements-0:2.140-396.module_1675+7c48d950.noarch - perl-CPAN-Meta-Requirements-0:2.140-413.module_2073+eebc5b71.noarch - perl-CPAN-Meta-YAML-0:0.018-397.module_1675+7c48d950.noarch - perl-CPAN-Meta-YAML-0:0.018-413.module_2073+eebc5b71.noarch - perl-Capture-Tiny-0:0.46-4.module_1675+7c48d950.noarch - perl-Carp-0:1.42-396.module_2073+eebc5b71.noarch - perl-Carp-0:1.42-413.module_2073+eebc5b71.noarch - perl-Class-XSAccessor-0:1.19-14.module_1675+7c48d950.x86_64 - perl-Compress-Bzip2-0:2.26-6.module_1675+7c48d950.x86_64 - perl-Compress-Raw-Bzip2-0:2.074-413.module_2073+eebc5b71.x86_64 - perl-Compress-Raw-Bzip2-0:2.081-1.module_1675+7c48d950.x86_64 - perl-Compress-Raw-Zlib-0:2.074-413.module_2073+eebc5b71.x86_64 - perl-Compress-Raw-Zlib-0:2.081-1.module_1675+7c48d950.x86_64 - perl-Config-Perl-V-0:0.28-413.module_2073+eebc5b71.noarch - perl-Config-Perl-V-0:0.30-1.module_2073+eebc5b71.noarch - perl-DB_File-0:1.840-413.module_2073+eebc5b71.x86_64 - perl-DB_File-0:1.842-1.module_2073+eebc5b71.x86_64 - perl-Data-Dumper-0:2.167-399.module_1675+7c48d950.x86_64 - perl-Data-Dumper-0:2.167-413.module_2073+eebc5b71.x86_64 - perl-Data-OptList-0:0.110-6.module_1675+7c48d950.noarch - perl-Data-Section-0:0.200007-3.module_1675+7c48d950.noarch - perl-Devel-PPPort-0:3.35-413.module_2073+eebc5b71.x86_64 - perl-Devel-PPPort-0:3.36-5.module_1675+7c48d950.x86_64 - perl-Devel-Peek-0:1.26-413.module_2073+eebc5b71.x86_64 - perl-Devel-SelfStubber-0:1.06-413.module_2073+eebc5b71.noarch - perl-Devel-Size-0:0.82-1.module_2073+eebc5b71.x86_64 - perl-Devel-StackTrace-1:2.03-2.module_1675+7c48d950.noarch - perl-Devel-Symdump-1:2.18-5.module_1675+7c48d950.noarch - perl-Digest-0:1.17-395.module_1675+7c48d950.noarch - perl-Digest-0:1.17-413.module_2073+eebc5b71.noarch - perl-Digest-MD5-0:2.55-396.module_1675+7c48d950.x86_64 - perl-Digest-MD5-0:2.55-413.module_2073+eebc5b71.x86_64 - perl-Digest-SHA-1:5.96-413.module_2073+eebc5b71.x86_64 - perl-Digest-SHA-1:6.02-1.module_2073+eebc5b71.x86_64 - perl-Encode-4:2.88-413.module_2073+eebc5b71.x86_64 - perl-Encode-4:2.97-3.module_1675+7c48d950.x86_64 - perl-Encode-Locale-0:1.05-9.module_1675+7c48d950.noarch - perl-Encode-devel-4:2.88-413.module_2073+eebc5b71.noarch - perl-Encode-devel-4:2.97-3.module_1675+7c48d950.x86_64 - perl-Env-0:1.04-395.module_1675+7c48d950.noarch - perl-Env-0:1.04-413.module_2073+eebc5b71.noarch - perl-Errno-0:1.28-413.module_2073+eebc5b71.x86_64 - perl-Expect-0:1.35-4.module_1675+7c48d950.noarch - perl-Exporter-0:5.72-396.module_1675+7c48d950.noarch - perl-Exporter-0:5.72-413.module_2073+eebc5b71.noarch - perl-ExtUtils-CBuilder-1:0.280225-413.module_2073+eebc5b71.noarch - perl-ExtUtils-CBuilder-1:0.280230-2.module_1675+7c48d950.noarch - perl-ExtUtils-Command-1:7.24-413.module_2073+eebc5b71.noarch - perl-ExtUtils-Command-1:7.34-1.module_1675+7c48d950.noarch - perl-ExtUtils-Embed-0:1.34-413.module_2073+eebc5b71.noarch - perl-ExtUtils-Install-0:2.04-413.module_2073+eebc5b71.noarch - perl-ExtUtils-Install-0:2.14-4.module_1675+7c48d950.noarch - perl-ExtUtils-MM-Utils-1:7.24-413.module_2073+eebc5b71.noarch - perl-ExtUtils-MM-Utils-1:7.34-1.module_1675+7c48d950.noarch - perl-ExtUtils-MakeMaker-1:7.24-413.module_2073+eebc5b71.noarch - perl-ExtUtils-MakeMaker-1:7.34-1.module_1675+7c48d950.noarch - perl-ExtUtils-Manifest-0:1.70-395.module_1675+7c48d950.noarch - perl-ExtUtils-Manifest-0:1.70-413.module_2073+eebc5b71.noarch - perl-ExtUtils-Miniperl-0:1.06-413.module_2073+eebc5b71.noarch - perl-ExtUtils-ParseXS-1:3.34-413.module_2073+eebc5b71.noarch - perl-ExtUtils-ParseXS-1:3.35-2.module_1675+7c48d950.noarch - perl-Fedora-VSP-0:0.001-9.module_1675+7c48d950.noarch - perl-File-Fetch-0:0.52-413.module_2073+eebc5b71.noarch - perl-File-Fetch-0:0.56-2.module_1675+7c48d950.noarch - perl-File-Find-Object-0:0.3.2-5.module_1675+7c48d950.noarch - perl-File-Find-Object-Rule-0:0.0306-6.module_1675+7c48d950.noarch - perl-File-Find-Rule-0:0.34-8.module_1675+7c48d950.noarch - perl-File-Find-Rule-Perl-0:1.15-10.module_1675+7c48d950.noarch - perl-File-HomeDir-0:1.002-4.module_1675+7c48d950.noarch - perl-File-Path-0:2.12-413.module_2073+eebc5b71.noarch - perl-File-Path-0:2.15-2.module_1675+7c48d950.noarch - perl-File-Slurp-Tiny-0:0.004-7.module_1675+7c48d950.noarch - perl-File-Temp-0:0.230.400-413.module_2073+eebc5b71.noarch - perl-File-Temp-0:0.230.600-1.module_2073+eebc5b71.noarch - perl-File-Which-0:1.22-2.module_1675+7c48d950.noarch - perl-Filter-2:1.55-413.module_2073+eebc5b71.x86_64 - perl-Filter-2:1.58-2.module_1675+7c48d950.x86_64 - perl-Filter-Simple-0:0.93-413.module_2073+eebc5b71.noarch - perl-Filter-Simple-0:0.94-2.module_1675+7c48d950.noarch - perl-Getopt-Long-1:2.49-413.module_2073+eebc5b71.noarch - perl-Getopt-Long-1:2.50-4.module_1675+7c48d950.noarch - perl-HTML-Parser-0:3.72-11.module_1675+7c48d950.x86_64 - perl-HTML-Parser-tests-0:3.72-11.module_1675+7c48d950.x86_64 - perl-HTML-Tagset-0:3.20-33.module_1675+7c48d950.noarch - perl-HTTP-Date-0:6.02-18.module_1675+7c48d950.noarch - perl-HTTP-Message-0:6.18-1.module_2073+eebc5b71.noarch - perl-HTTP-Tiny-0:0.070-413.module_2073+eebc5b71.noarch - perl-HTTP-Tiny-0:0.076-1.module_2073+eebc5b71.noarch - perl-IO-0:1.38-413.module_2073+eebc5b71.x86_64 - perl-IO-Compress-0:2.074-413.module_2073+eebc5b71.noarch - perl-IO-Compress-0:2.081-1.module_1675+7c48d950.noarch - perl-IO-HTML-0:1.001-10.module_1675+7c48d950.noarch - perl-IO-Socket-INET6-0:2.72-12.module_1675+7c48d950.noarch - perl-IO-Socket-IP-0:0.38-413.module_2073+eebc5b71.noarch - perl-IO-Socket-IP-0:0.39-5.module_1675+7c48d950.noarch - perl-IO-Socket-SSL-0:2.056-1.module_1675+7c48d950.noarch - perl-IO-String-0:1.08-31.module_1675+7c48d950.noarch - perl-IO-Tty-0:1.12-11.module_1675+7c48d950.x86_64 - perl-IO-Zlib-1:1.10-413.module_2073+eebc5b71.noarch - perl-IPC-Cmd-2:0.96-413.module_2073+eebc5b71.noarch - perl-IPC-Cmd-2:1.02-1.module_2073+eebc5b71.noarch - perl-IPC-Run-0:0.99-1.module_1675+7c48d950.noarch - perl-IPC-SysV-0:2.07-397.module_1675+7c48d950.x86_64 - perl-IPC-SysV-0:2.07-413.module_2073+eebc5b71.x86_64 - perl-IPC-System-Simple-0:1.25-17.module_1675+7c48d950.noarch - perl-Import-Into-0:1.002005-7.module_1675+7c48d950.noarch - perl-JSON-PP-1:2.27.400-413.module_2073+eebc5b71.noarch - perl-JSON-PP-1:2.97.001-2.module_1675+7c48d950.noarch - perl-LWP-MediaTypes-0:6.02-14.module_1675+7c48d950.noarch - perl-Locale-Codes-0:3.25-413.module_2073+eebc5b71.noarch - perl-Locale-Codes-0:3.57-1.module_2073+eebc5b71.noarch - perl-Locale-Maketext-0:1.28-396.module_1675+7c48d950.noarch - perl-Locale-Maketext-0:1.28-413.module_2073+eebc5b71.noarch - perl-Locale-Maketext-Simple-1:0.21-413.module_2073+eebc5b71.noarch - perl-MIME-Base64-0:3.15-396.module_1675+7c48d950.x86_64 - perl-MIME-Base64-0:3.15-413.module_2073+eebc5b71.x86_64 - perl-MRO-Compat-0:0.13-4.module_1675+7c48d950.noarch - perl-Math-BigInt-1:1.9998.06-413.module_2073+eebc5b71.noarch - perl-Math-BigInt-1:1.9998.11-5.module_1675+7c48d950.noarch - perl-Math-BigInt-FastCalc-0:0.500.500-413.module_2073+eebc5b71.x86_64 - perl-Math-BigInt-FastCalc-0:0.500.600-6.module_1675+7c48d950.x86_64 - perl-Math-BigRat-0:0.2611-413.module_2073+eebc5b71.noarch - perl-Math-BigRat-0:0.2614-1.module_2073+eebc5b71.noarch - perl-Math-Complex-0:1.59-413.module_2073+eebc5b71.noarch - perl-Memoize-0:1.03-413.module_2073+eebc5b71.noarch - perl-Mixin-Linewise-0:0.108-9.module_1675+7c48d950.noarch - perl-Module-Build-2:0.42.24-5.module_1675+7c48d950.noarch - perl-Module-CoreList-1:5.20180414-413.module_2073+eebc5b71.noarch - perl-Module-CoreList-1:5.20180720-1.module_2073+eebc5b71.noarch - perl-Module-CoreList-tools-1:5.20180414-413.module_2073+eebc5b71.noarch - perl-Module-CoreList-tools-1:5.20180720-1.module_2073+eebc5b71.noarch - perl-Module-Load-1:0.32-395.module_1675+7c48d950.noarch - perl-Module-Load-1:0.32-413.module_2073+eebc5b71.noarch - perl-Module-Load-Conditional-0:0.68-395.module_1675+7c48d950.noarch - perl-Module-Load-Conditional-0:0.68-413.module_2073+eebc5b71.noarch - perl-Module-Loaded-1:0.08-413.module_2073+eebc5b71.noarch - perl-Module-Metadata-0:1.000033-395.module_1675+7c48d950.noarch - perl-Module-Metadata-0:1.000033-413.module_2073+eebc5b71.noarch - perl-Module-Runtime-0:0.016-2.module_1675+7c48d950.noarch - perl-Net-IDN-Encode-0:2.400-6.module_1675+7c48d950.x86_64 - perl-Net-LibIDN-0:0.12-29.module_1675+7c48d950.x86_64 - perl-Net-Ping-0:2.55-413.module_2073+eebc5b71.noarch - perl-Net-SSLeay-0:1.85-1.module_1675+7c48d950.x86_64 - perl-Number-Compare-0:0.03-19.module_1675+7c48d950.noarch - perl-Package-Generator-0:1.106-11.module_1675+7c48d950.noarch - perl-Params-Check-1:0.38-395.module_1675+7c48d950.noarch - perl-Params-Check-1:0.38-413.module_2073+eebc5b71.noarch - perl-Params-Util-0:1.07-22.module_1675+7c48d950.x86_64 - perl-PathTools-0:3.67-413.module_2073+eebc5b71.x86_64 - perl-PathTools-0:3.74-1.module_1675+7c48d950.x86_64 - perl-Perl-OSType-0:1.010-396.module_1675+7c48d950.noarch - perl-Perl-OSType-0:1.010-413.module_2073+eebc5b71.noarch - perl-Perl-Version-0:1.013-9.module_1675+7c48d950.noarch - perl-PerlIO-utf8_strict-0:0.007-5.module_1675+7c48d950.x86_64 - perl-PerlIO-via-QuotedPrint-0:0.08-395.module_1675+7c48d950.noarch - perl-PerlIO-via-QuotedPrint-0:0.08-413.module_2073+eebc5b71.noarch - perl-Pod-Checker-4:1.73-395.module_1675+7c48d950.noarch - perl-Pod-Checker-4:1.73-413.module_2073+eebc5b71.noarch - perl-Pod-Coverage-0:0.23-14.module_1675+7c48d950.noarch - perl-Pod-Coverage-TrustPod-0:0.100005-1.module_1675+7c48d950.noarch - perl-Pod-Escapes-1:1.07-395.module_1675+7c48d950.noarch - perl-Pod-Escapes-1:1.07-413.module_2073+eebc5b71.noarch - perl-Pod-Eventual-0:0.094001-9.module_1675+7c48d950.noarch - perl-Pod-Html-0:1.22.02-413.module_2073+eebc5b71.noarch - perl-Pod-Parser-0:1.63-396.module_1675+7c48d950.noarch - perl-Pod-Parser-0:1.63-413.module_2073+eebc5b71.noarch - perl-Pod-Perldoc-0:3.28-413.module_2073+eebc5b71.noarch - perl-Pod-Perldoc-0:3.28.01-1.module_2073+eebc5b71.noarch - perl-Pod-Simple-1:3.35-395.module_1675+7c48d950.noarch - perl-Pod-Simple-1:3.35-413.module_2073+eebc5b71.noarch - perl-Pod-Usage-4:1.69-395.module_1675+7c48d950.noarch - perl-Pod-Usage-4:1.69-413.module_2073+eebc5b71.noarch - perl-SUPER-0:1.20141117-10.module_1675+7c48d950.noarch - perl-Scalar-List-Utils-3:1.46-413.module_2073+eebc5b71.x86_64 - perl-Scalar-List-Utils-3:1.49-2.module_1675+7c48d950.x86_64 - perl-SelfLoader-0:1.23-413.module_2073+eebc5b71.noarch - perl-Socket-4:2.020-413.module_2073+eebc5b71.x86_64 - perl-Socket-4:2.027-2.module_1675+7c48d950.x86_64 - perl-Socket6-0:0.28-6.module_1675+7c48d950.x86_64 - perl-Software-License-0:0.103013-2.module_1675+7c48d950.noarch - perl-Sort-Versions-0:1.62-8.module_1675+7c48d950.noarch - perl-Storable-1:2.62-413.module_2073+eebc5b71.x86_64 - perl-Storable-1:3.11-2.module_2073+eebc5b71.x86_64 - perl-Sub-Exporter-0:0.987-15.module_1675+7c48d950.noarch - perl-Sub-Identify-0:0.14-6.module_1675+7c48d950.x86_64 - perl-Sub-Install-0:0.928-14.module_1675+7c48d950.noarch - perl-Sub-Uplevel-1:0.2800-4.module_1675+7c48d950.noarch - perl-Sys-Syslog-0:0.35-397.module_1675+7c48d950.x86_64 - perl-Sys-Syslog-0:0.35-413.module_2073+eebc5b71.x86_64 - perl-Term-ANSIColor-0:4.06-396.module_1675+7c48d950.noarch - perl-Term-ANSIColor-0:4.06-413.module_2073+eebc5b71.noarch - perl-Term-Cap-0:1.17-395.module_1675+7c48d950.noarch - perl-Term-Cap-0:1.17-413.module_2073+eebc5b71.noarch - perl-Test-0:1.30-413.module_2073+eebc5b71.noarch - perl-Test-CPAN-Meta-0:0.25-12.module_1675+7c48d950.noarch - perl-Test-Deep-0:1.127-4.module_1675+7c48d950.noarch - perl-Test-Exception-0:0.43-7.module_1675+7c48d950.noarch - perl-Test-FailWarnings-0:0.008-12.module_1675+7c48d950.noarch - perl-Test-Harness-1:3.38-413.module_2073+eebc5b71.noarch - perl-Test-Harness-1:3.42-1.module_1675+7c48d950.noarch - perl-Test-MockModule-0:0.13-3.module_1675+7c48d950.noarch - perl-Test-Needs-0:0.002005-5.module_1675+7c48d950.noarch - perl-Test-NoWarnings-0:1.04-15.module_1675+7c48d950.noarch - perl-Test-Output-0:1.03.1-4.module_1675+7c48d950.noarch - perl-Test-Pod-0:1.51-8.module_1675+7c48d950.noarch - perl-Test-Pod-Coverage-0:1.10-10.module_1675+7c48d950.noarch - perl-Test-Simple-1:1.302073-413.module_2073+eebc5b71.noarch - perl-Test-Simple-1:1.302135-1.module_1675+7c48d950.noarch - perl-Test-Taint-0:1.06-19.module_1675+7c48d950.x86_64 - perl-Test-TrailingSpace-0:0.0301-5.module_1675+7c48d950.noarch - perl-Test-Version-0:2.07-1.module_1675+7c48d950.noarch - perl-Test-Warn-0:0.32-5.module_1675+7c48d950.noarch - perl-Test-Warnings-0:0.026-7.module_1675+7c48d950.noarch - perl-Text-Balanced-0:2.03-395.module_1675+7c48d950.noarch - perl-Text-Balanced-0:2.03-413.module_2073+eebc5b71.noarch - perl-Text-Diff-0:1.45-2.module_1675+7c48d950.noarch - perl-Text-Glob-0:0.11-4.module_1675+7c48d950.noarch - perl-Text-ParseWords-0:3.30-395.module_1675+7c48d950.noarch - perl-Text-ParseWords-0:3.30-413.module_2073+eebc5b71.noarch - perl-Text-Tabs+Wrap-0:2013.0523-395.module_1675+7c48d950.noarch - perl-Text-Tabs+Wrap-0:2013.0523-413.module_2073+eebc5b71.noarch - perl-Text-Template-0:1.51-1.module_1675+7c48d950.noarch - perl-Thread-Queue-0:3.12-413.module_2073+eebc5b71.noarch - perl-Thread-Queue-0:3.13-1.module_2073+eebc5b71.noarch - perl-Tie-IxHash-0:1.23-13.module_1675+7c48d950.noarch - perl-Time-HiRes-0:1.9741-413.module_2073+eebc5b71.x86_64 - perl-Time-HiRes-0:1.9758-1.module_1675+7c48d950.x86_64 - perl-Time-Local-0:1.250-413.module_2073+eebc5b71.noarch - perl-Time-Local-1:1.280-1.module_2073+eebc5b71.noarch - perl-Time-Piece-0:1.31-413.module_2073+eebc5b71.x86_64 - perl-TimeDate-1:2.30-13.module_1675+7c48d950.noarch - perl-Try-Tiny-0:0.30-2.module_1675+7c48d950.noarch - perl-URI-0:1.73-2.module_1675+7c48d950.noarch - perl-Unicode-Collate-0:1.19-413.module_2073+eebc5b71.x86_64 - perl-Unicode-Collate-0:1.25-2.module_1675+7c48d950.x86_64 - perl-Unicode-Normalize-0:1.25-396.module_1675+7c48d950.x86_64 - perl-Unicode-Normalize-0:1.25-413.module_2073+eebc5b71.x86_64 - perl-YAML-0:1.24-2.module_1675+7c48d950.noarch - perl-autodie-0:2.29-396.module_1675+7c48d950.noarch - perl-autodie-0:2.29-413.module_2073+eebc5b71.noarch - perl-bignum-0:0.47-413.module_2073+eebc5b71.noarch - perl-bignum-0:0.49-2.module_1675+7c48d950.noarch - perl-constant-0:1.33-396.module_1675+7c48d950.noarch - perl-constant-0:1.33-413.module_2073+eebc5b71.noarch - perl-devel-4:5.26.2-413.module_2073+eebc5b71.x86_64 - perl-encoding-4:2.19-413.module_2073+eebc5b71.x86_64 - perl-encoding-4:2.22-3.module_1675+7c48d950.x86_64 - perl-experimental-0:0.016-413.module_2073+eebc5b71.noarch - perl-experimental-0:0.020-1.module_2073+eebc5b71.noarch - perl-generators-0:1.10-7.module_1675+7c48d950.noarch - perl-homedir-0:2.000024-2.module_1675+7c48d950.noarch - perl-inc-latest-2:0.500-9.module_1675+7c48d950.noarch - perl-interpreter-4:5.26.2-413.module_2073+eebc5b71.x86_64 - perl-libnet-0:3.10-413.module_2073+eebc5b71.noarch - perl-libnet-0:3.11-3.module_1675+7c48d950.noarch - perl-libnetcfg-4:5.26.2-413.module_2073+eebc5b71.noarch - perl-libs-4:5.26.2-413.module_2073+eebc5b71.x86_64 - perl-local-lib-0:2.000024-2.module_1675+7c48d950.noarch - perl-macros-4:5.26.2-413.module_2073+eebc5b71.x86_64 - perl-open-0:1.11-413.module_2073+eebc5b71.noarch - perl-parent-1:0.236-395.module_1675+7c48d950.noarch - perl-parent-1:0.236-413.module_2073+eebc5b71.noarch - perl-perlfaq-0:5.021011-413.module_2073+eebc5b71.noarch - perl-perlfaq-0:5.20180605-1.module_2073+eebc5b71.noarch - perl-podlators-0:4.09-413.module_2073+eebc5b71.noarch - perl-podlators-0:4.11-1.module_2073+eebc5b71.noarch - perl-tests-4:5.26.2-413.module_2073+eebc5b71.x86_64 - perl-threads-1:2.15-413.module_2073+eebc5b71.x86_64 - perl-threads-1:2.21-2.module_1675+7c48d950.x86_64 - perl-threads-shared-0:1.56-413.module_2073+eebc5b71.x86_64 - perl-threads-shared-0:1.58-2.module_1675+7c48d950.x86_64 - perl-utils-0:5.26.2-413.module_2073+eebc5b71.noarch - perl-version-6:0.99.17-413.module_2073+eebc5b71.noarch - perl-version-6:0.99.24-1.module_2073+eebc5b71.x86_64 ... --- document: modulemd version: 2 data: name: perl-bootstrap stream: 5.24 version: 20180417065503 context: 6c81f848 arch: x86_64 summary: Perl bootstrap module for bootrapping Perl module description: > This is the Perl interpreter and a set of modules written in Perl language intended for bootstrapping the perl module. This module disables some optional tests to limit amount of components. This module is not intended for public use. It's an intermediate step for building perl module. license: module: - MIT content: - MIT xmd: mbs: mse: TRUE scmurl: https://src.fedoraproject.org/modules/perl-bootstrap.git?#47f4825a1d5e2a8fd7b76583744ea8f2202c850c commit: 47f4825a1d5e2a8fd7b76583744ea8f2202c850c buildrequires: platform: ref: f29 stream: f29 context: 00000000 version: 4 filtered_rpms: [] rpms: perl-Devel-Symdump: ref: 8c2d0279e473e311cfcf0521091d3f93c221937a perl-Test-Pod: ref: 576a8c16670036dc9212fd54eabd0ef7d9d164c1 perl-File-Which: ref: 1a2ca4a9b713f31c6f99f6dec3dafdd0a457a44f perl-Perl-Version: ref: 3efa7273f190e94ee96af9bbad3c137dc3b787c3 perl-Digest-MD5: ref: 884cdd515f0250589dd4cde8c32a9d77fc55871e perl-Test-Portability-Files: ref: cdddd635bbdd7685819558be423e4456b66a090d perl-Pod-Escapes: ref: 1ab928503d1824c54a6a32e6b5d527b389f34d05 perl-Text-ParseWords: ref: 1c120cf2934e246a59a5f37284ac8111c52fa806 perl-podlators: ref: 380d587d637c4b5fe4c1b961aa16cb698ed2a07b perl-Pod-Eventual: ref: 4c8406d6788f6552c47df76ae69601a9de6486ff perl-IPC-Cmd: ref: fc6bc3efe40775d3e63d811a65ed0cab6aa138e1 perl-Test-Output: ref: 8b0264e6c842946fe77b7c461275961680e62368 perl-SUPER: ref: 5e0a1ed539e5948eeea71c3ad3d8ce124b4d63c2 perl-Time-Local: ref: e74a3e804e77a0d704eebdede825b6d0d6cc617b perl-IPC-SysV: ref: 6102b15b4a3e30698673109ddda94a2325123e38 perl-Package-Generator: ref: f78e39fa9dc3fd1474475eabcb9378375142dd70 perl-MRO-Compat: ref: 13cfd3efff5d02609bf8fe0c36a9e7a9a37ca8b8 perl-IO-HTML: ref: 69a460858b8c1f47bb6320faa6f310dab6808184 perl-Compress-Raw-Bzip2: ref: b989d850d818cbaeba0c47b0d975e1afd6b34bb8 perl-Devel-Leak: ref: aac20d847c0b0c781e9c6d49a4458526b9f9aa8b perl-IO-String: ref: e441228a5c401a96fdfa989706c0b4da67902cfc perl: ref: 9acafa0017b87ed96f8857fd7099787f0d24ff56 perl-File-Slurp-Tiny: ref: 1f6426ab2ee83674668788199ec0a1ba676c1ec3 perl-Params-Util: ref: 4bfebd9e4cb2fe6a52e2ae69d5e5e74b36296f9f perl-File-Path: ref: 5848e296d61a3de73f17016f7f37a6395ae0f402 perl-Sub-Uplevel: ref: 7a179457e0f3068e923a4fe3db2dd74a68b72925 perl-Module-Load: ref: 3f98c8f286677f7b700f661545154e781798ef0c perl-CPAN-Meta-Requirements: ref: f693254160585068bd1db62ffa980963a2ef7011 perl-Test-CPAN-Meta: ref: 9aac31d337c0526dedcd5b36ba4d97e71a04cf8c perl-IO-Socket-IP: ref: 4e56568b5d09ad4aefccb354183614ae5b3f6235 perl-Test-Harness: ref: 2ddba30c66331628ef273a6df6b67e2b05d76022 perl-parent: ref: f50da57010454e2279d899a57fdbc65a48edc74c perl-ExtUtils-CBuilder: ref: 521e6f6f83dc9a5afbb517d85e637bfa69f59701 perl-perlfaq: ref: 63e299c953b8f4b558fe904fc7d31763f79760f1 perl-Sub-Install: ref: 799f7222e97cc90f9abb7e1f02a5847d71a83cb0 perl-IPC-System-Simple: ref: c6c28f1091285aa29100a31c705bcf916a13452b perl-Socket: ref: 14bd5dedb6ff8da7d7b0f5945aa61ffa620777d1 perl-Perl-OSType: ref: c2efc33ea89adb7c2da626cc3d436bbc69203e2b perl-ExtUtils-ParseXS: ref: 9398847c09b96f2765b1a03b4b84188e28711273 perl-Test-Deep: ref: efc3846cd014e4c4adb0637da854b2413112cc9e perl-IPC-Run: ref: d123ca7ec60ceb684a6acf68ea4a492562bb2937 perl-Import-Into: ref: 4964255b1b7b5d0b7c61f0f56db81963ce4b559e perl-ExtUtils-Install: ref: 507084f8349f691d4688fe9a49e92be1711874e4 perl-BSD-Resource: ref: b0968a4d109d201a1318c0012f4e8f858d2f78d2 perl-autodie: ref: 40735fb3b9a6b96b40934e72672bb1a04eb0999a perl-Locale-Maketext: ref: 57b31cf2d161ce97448d225af3f86c210d78ad6a perl-Module-Runtime: ref: b61338418e9c84469b3d76a17b70f38497d30dd7 perl-Data-OptList: ref: 9512df0280d65abfaa04d6437367705c3b19b54f perl-LWP-MediaTypes: ref: 31f031d664748d5049327f8928d998ba1003d606 perl-CPAN-Meta-YAML: ref: 3609aa7e2ae8ca137d9ff46de25d4b869fdb8c2b perl-Math-BigInt-FastCalc: ref: 785456ac9585a8b4f7628d3bd2a0dacd5b592d09 perl-File-Temp: ref: de8e0c3e7e630e6861a0c0979c5ab60227f7de8e perl-JSON-PP: ref: 1e3fe253e7edbdc506418a38d666ed19db8ce136 perl-Test-Simple: ref: e64b2e39f56e17d7b9046881d589c778aaf4ce8b perl-File-Find-Object: ref: 352249b989b0d30b7872918228edcb76cdc7836e perl-Capture-Tiny: ref: b62d26b13aced270b75df6b6fe3a2cc10f8e8987 perl-HTTP-Message: ref: 3fb93e190e2804faea83abcb45214b00fd090bc5 perl-Pod-Coverage-TrustPod: ref: f784cfffe48f00c3d1a8317581a940d2ae6268c1 perl-Module-Build: ref: 2c9e4f8f3788caeaa4707f7b562f1ad39a416680 perl-inc-latest: ref: 0a60ae8876d88d2eaac83b84d6d2fff8ced1b9a1 perl-Module-Load-Conditional: ref: bb49232617058d8af4f199db9972f04cd3eefe0d perl-Filter: ref: 998996cc8b57f55172167da01155d3a7b59c1e99 perl-Pod-Checker: ref: 6c8f684a9863678be5724c2e565ba1aa62761151 perl-Sort-Versions: ref: c4677aff1f40cf996fb73d0d1312c2583434fa6b perl-Thread-Queue: ref: e0fff689fc097ecf54bac2f09e5e7bd3c4d00ef6 perl-IO-Compress: ref: 1e67f30fcc790e2d133ecd756e1b68dc1e423999 perl-Math-BigInt: ref: 82d8ddba8d0d808a04d9d4cb579df53f65112027 perl-File-Find-Rule: ref: d948339f4b97b6ce271c9c288b144cf967411043 perl-Text-Template: ref: 9309a484a2e8e309272c8916cf63a12e385eaaef perl-Test-Exception: ref: b78e90750d6fb261ce29ad3a347b1e394c612331 perl-Unicode-Normalize: ref: 6875f415710668a788423fdd80ae712e0c3d3ab2 perl-HTML-Tagset: ref: b4bb7fb9dd897fed415210afbaa904bfb7fd4e45 perl-URI: ref: 28d53fda027d3a984ffa201d4494389c6b7796b0 perl-GSSAPI: ref: 248a8c09ceed073a724a44e11d65fc15fc792201 perl-TermReadKey: ref: 012af49cc9a63d1d481cb616a21b0f3545aefe23 perl-Text-Glob: ref: 346be0660f0fc621a960467b5fa1ee656b9cd87f perl-Pod-Simple: ref: a0eec0341f8cc19d74f6f21f9bf38781446a0ad1 perl-Algorithm-Diff: ref: f4b6c06396d4768c691a23b3b967fe6fac1e46ee perl-Class-XSAccessor: ref: c9edaedd473078571b2fd3de7743c69f0cc67f1a perl-Digest: ref: 6867766aaf85865d33675be774af4751b8ae9549 perl-Test-FailWarnings: ref: 6d8ce49b232ead21cf55098590e10eb897d24426 perl-Tie-IxHash: ref: 8e7169c7705dddb6290c1d8c116c5ca4eb1de7a4 perl-ExtUtils-MakeMaker: ref: 5d9438be138d0919320b5a6e2324df05fe123d6a perl-Devel-StackTrace: ref: 64a31414eda5c263e7bea908641ad4e44c46de31 perl-Compress-Raw-Zlib: ref: ed5582bb24c481aaa0de7a33ecbf85989e0ddd8c perl-Test-Version: ref: f5adf2bc958c6bb1c847fd9e355df70285cf38fb perl-ExtUtils-Manifest: ref: 2fd5140cb9441b0445de12b720c5459ed38e95b7 perl-Pod-Parser: ref: efe0977afc65bae502a4ee5bc47430b4e2b6702f perl-Exporter: ref: 14c101bc77bc5119c4f75065d6f4b6edea4b502a perl-MIME-Base64: ref: da62d3707ea9781efc91ba48d47ce49b2297a364 perl-version: ref: 098155010f833f432a85cb97754e1080750ec873 perl-experimental: ref: cad2845a55a98ca9565be2707c3ff48e984fd1da perl-Text-Levenshtein-Damerau-XS: ref: 920027ab00d12e5a2e6b12e2e8d7f0b23fd6f1c1 perl-CPAN: ref: 4159d449e5a66ddef70d1fe7f1d37279d4d99bc5 perl-Text-Balanced: ref: c6648ff72f7b1798642f719036a677102c7ee125 perl-PathTools: ref: e643e0b6864983a2606f5bcf3ae9a34caeda4059 perl-Compress-Bzip2: ref: 1ac091378670bfc36b3e866924ddc076cd800cf2 perl-Number-Compare: ref: a3e2f8c0ea3542cde8009225501e8c09cad2582d perl-Authen-SASL: ref: a21e64f1a36fd53125e5a79287c34b2f16fc9782 perl-JSON: ref: 7e6037e3c89511b23511c4292ce1129ef43dd09c perl-Fedora-VSP: ref: 63312d7720e816853bd595cbcdc9d9e3cce0880b perl-Test-NoWarnings: ref: ff0744a0c58a759894a7296f4f47aec3522105a5 perl-Locale-Codes: ref: bd6e31d21f18e85ffe4411b0ce7238d6a974063a perl-Digest-HMAC: ref: 74df7c0a82a218beba053d129a0d29fa74316724 perl-Module-CoreList: ref: 6b31db0c22a4824a2ae7c40114a8af17bcfd125b perl-Scalar-List-Utils: ref: 7eb2ea6397b7fbeeaeacbb176bbbc453723ded1a perl-Digest-SHA: ref: 2b4a62eaf739a7d2ce6649f3a326dbd562ed8b74 perl-CPAN-Meta-Check: ref: 4c4b5bd0d549adebf27a79f755db22dadb324d70 perl-Expect: ref: 9b537a758488cd3f11288f65eb76384f562bed93 perl-TimeDate: ref: f375f3f228c209a12ac22d1055ddeba07e01134b perl-Pod-Coverage: ref: ec582e4dc33ea441ec00496a2123333052834e59 perl-generators: ref: 87c9a690dd58beeaa573074d26fccccb089ab31b perl-Pod-Perldoc: ref: 842e567a333ccfd2b15be93f230d29414be0f581 perl-Sub-Exporter: ref: 92259c19826f0aed436f04d886cf4e1f208ff103 perl-Time-HiRes: ref: 17004a2568fc6de651cee58816cec8640a825d4c perl-HTTP-Tiny: ref: d396ccfe1aadc5746420b06e268e04316eb62c44 perl-Test-Taint: ref: c72c54ac4c5cde555381dd2b4037d0a34af36af4 perl-Text-Tabs+Wrap: ref: 90b3a77c499b10b5d34569f8b1b26327495049ea perl-B-Debug: ref: ec558193299b89d6babcf009bdcc18dc7fc48a4e perl-File-HomeDir: ref: 2982c5d9f538d8c640c3ca8fee7566d68e5ea68e perl-threads: ref: f0b3ca4a1602b11c483d97aea130e2dea8b8f96f perl-accessors: ref: 0e851a02363f4433b6fa5822553ba810f2127711 perl-Unicode-Collate: ref: c6bc5268528635406bf3237258e7c2969a2bdfc6 perl-YAML-Syck: ref: 5454878158f3a1eca83b59ebbff5f21b1284a3af perl-Encode-Locale: ref: b0a26b89329c19ad11b5bb5a3292b960f74563e0 perl-Try-Tiny: ref: e6ae51897ab12408471d9a6285d2cb6a472aff65 perl-Text-Diff: ref: 2ee347e962b8a0e83eeecf3324062308cc1d1a2c perl-threads-shared: ref: cd6fd55c5d0ce4aaf7394f4ee865d68c61e91cd1 perl-Math-BigRat: ref: 72d54e7b07b44e1b126a961e8ac44b346d9ee7de perl-HTML-Parser: ref: 91f7240000e51a6838eb39a25a63bd329cc4ed9d perl-Storable: ref: d76f7a7ba835789a1ca93e3c0db2fc17a9f11907 perl-Getopt-Long: ref: a7414b0c7a488b9af202fff1eb6a2fb2a3ca6327 perl-Digest-SHA1: ref: ac79089f89be4e77521118399bf9f27ea9acebf0 perl-bignum: ref: 74c0852bf10b97499c694d3d32f5e66a7a7d7cf3 perl-Net-SSLeay: ref: 62017fc4159c66debfa779e71c05bd206a411650 perl-Term-ANSIColor: ref: 3a74f9162f818ffaa4069d74c931caef0560514b perl-IO-Tty: ref: 5d0e7d74fd5f707edf41bb8d9dcbf4e40d8227d9 perl-Net-IDN-Encode: ref: 460f7f72751e3c81d09d566073944962ab4d6411 perl-Carp: ref: 84fbaf6f236f9a082ae6960bbbd160f6e75894c5 perl-libnet: ref: e6cc3a47e0776ada93c3801f06af81fb7b642d38 perl-Test-Pod-Coverage: ref: 010a282957d054909aeda5efa3a699fd3c7992f7 perl-local-lib: ref: 96f72250500b509a87fe9263b81f888812ba08cf perl-Test-TrailingSpace: ref: d6e33a6af0540130b87353ba17160e222252cb89 perl-Params-Check: ref: cf2ab4714451509691e4c06f968b0cc71891a8b8 perl-File-Find-Rule-Perl: ref: d9c5ed29fbca16a094c2e8c13f9a7d316b0309f4 perl-Mixin-Linewise: ref: 00c2d1043dcd5241042440ab1db81dc4442b0717 perl-Pod-Usage: ref: 9d38a4ee92dafbfdd5e8adf44810304de6bbc9e0 perl-Data-Dumper: ref: c8ea0bbaafa024bc09c7f29342f584885571eb07 perl-Data-Section: ref: 6ed48ef1733de62cd245237e25d93ea9a827d5e6 perl-Socket6: ref: 81332b86b363354a64ae9a952464963b2364e1a4 perl-File-Fetch: ref: b4bf1bd8af7755b16b40a3dd67cb743bef9b1652 perl-HTTP-Date: ref: 10316c369112a515f0e98539bfbef604709aad25 perl-Software-License: ref: da9a11a3ad14d5a4cbfe9b52d108b672a6939d69 perl-IO-Socket-SSL: ref: 0127aa728ad530065708aee31fa1bb31309c574a perl-Env: ref: 58ac31466f9c9824d25b13ad559622dcdd65e20a perl-Config-Perl-V: ref: 5a2c9f1ea41e4f07e76062c9598619fed2b4dcb6 perl-IO-Socket-INET6: ref: a94e5c6c12df30734570d0b2587ae0b19f1e6e6a perl-Archive-Tar: ref: 2bd7368d3debb90e1d87c3d44db91412fd39873c perl-Test-Warn: ref: 55255a6e3e3379784b9d3dc982d3ffbcefca0912 perl-Devel-Size: ref: 982a54ab4a98fba5339f850fa9cc30af93703d2f perl-Test-MockModule: ref: 89e06b4276d3db97152535beb7b18245643d78de perl-Term-Cap: ref: 28e345f7f785aa5b60572bfa5ba2627ef8dd3033 perl-Sys-Syslog: ref: 008e476eb1f3e015ad34f302a4cad874e4aad33a perl-Devel-PPPort: ref: bd144f784620e5cb43ef9aea61c11d1bb7fe0503 perl-CGI: ref: 813b1d1505d678db76a08eade6cde0592ab01c76 perl-CPAN-Meta: ref: 68ca8b0eed6d50eaef11c381b6d8e4754f6c2a7d perl-File-Find-Object-Rule: ref: da140b5d0f2f2555c56b2c0d98520b57b263b5fe perl-Archive-Zip: ref: 948b8e44e8dc5def0baa82a96c46da5bff385086 perl-DB_File: ref: d9d4b751bd8ea51672630f3beb1ecaf899de40ad perl-PerlIO-utf8_strict: ref: 58caa0d757a324f86b5c9d6a8e27abb230ffc5e7 perl-YAML: ref: 5b3a5ddc9c27dae306b39436c62ba1343a745b5d perl-Sub-Identify: ref: ab54ce7ae8646b1faf1ce345b82a042c21272ff6 perl-Filter-Simple: ref: ca5e4217e059a7371a125419071852760d031dba perl-Module-Metadata: ref: f583f7db4daab0a72bae86e49b549c15f5e2c905 perl-Net-LibIDN: ref: b4176cefa2675271f48e4c28314baa018abdf887 perl-PerlIO-via-QuotedPrint: ref: 31eb1e0e1c723aaf09d6846b9016e4db94428700 perl-constant: ref: f005b65dee6a48411e2dfeb5e057dfb8a3818135 perl-Encode: ref: 346cfe7ccbce4c3cc2a4739b628d8d0b7e1a4779 mbs_options: blocked_packages: - perl - perl-accessors - perl-Algorithm-Diff - perl-Archive-Tar - perl-Archive-Zip - perl-Authen-SASL - perl-autodie - perl-B-Debug - perl-bignum - perl-BSD-Resource - perl-Capture-Tiny - perl-Carp - perl-CGI - perl-Class-XSAccessor - perl-Compress-Bzip2 - perl-Compress-Raw-Bzip2 - perl-Compress-Raw-Zlib - perl-Config-Perl-V - perl-constant - perl-CPAN - perl-CPAN-Meta - perl-CPAN-Meta-Check - perl-CPAN-Meta-Requirements - perl-CPAN-Meta-YAML - perl-Data-Dumper - perl-Data-OptList - perl-Data-Section - perl-DB_File - perl-Devel-Leak - perl-Devel-PPPort - perl-Devel-Size - perl-Devel-StackTrace - perl-Devel-Symdump - perl-Digest - perl-Digest-HMAC - perl-Digest-MD5 - perl-Digest-SHA - perl-Digest-SHA1 - perl-Encode - perl-Encode-Locale - perl-Env - perl-Expect - perl-experimental - perl-Exporter - perl-ExtUtils-CBuilder - perl-ExtUtils-Install - perl-ExtUtils-MakeMaker - perl-ExtUtils-Manifest - perl-ExtUtils-ParseXS - perl-Fedora-VSP - perl-File-Fetch - perl-File-Find-Object - perl-File-Find-Object-Rule - perl-File-Find-Rule - perl-File-Find-Rule-Perl - perl-File-HomeDir - perl-File-Path - perl-File-Slurp-Tiny - perl-File-Temp - perl-File-Which - perl-Filter - perl-Filter-Simple - perl-generators - perl-Getopt-Long - perl-GSSAPI - perl-HTML-Parser - perl-HTML-Tagset - perl-HTTP-Date - perl-HTTP-Message - perl-HTTP-Tiny - perl-Import-Into - perl-inc-latest - perl-IO-Compress - perl-IO-HTML - perl-IO-Socket-INET6 - perl-IO-Socket-IP - perl-IO-Socket-SSL - perl-IO-String - perl-IO-Tty - perl-IPC-Cmd - perl-IPC-Run - perl-IPC-System-Simple - perl-IPC-SysV - perl-JSON - perl-JSON-PP - perl-libnet - perl-local-lib - perl-Locale-Codes - perl-Locale-Maketext - perl-LWP-MediaTypes - perl-Math-BigInt - perl-Math-BigInt-FastCalc - perl-Math-BigRat - perl-MIME-Base64 - perl-Mixin-Linewise - perl-Module-Build - perl-Module-CoreList - perl-Module-Load - perl-Module-Load-Conditional - perl-Module-Metadata - perl-Module-Runtime - perl-MRO-Compat - perl-Net-IDN-Encode - perl-Net-LibIDN - perl-Net-SSLeay - perl-Number-Compare - perl-Package-Generator - perl-Params-Check - perl-Params-Util - perl-parent - perl-PathTools - perl-Perl-OSType - perl-Perl-Version - perl-perlfaq - perl-PerlIO-utf8_strict - perl-PerlIO-via-QuotedPrint - perl-Pod-Checker - perl-Pod-Coverage - perl-Pod-Coverage-TrustPod - perl-Pod-Escapes - perl-Pod-Eventual - perl-Pod-Parser - perl-Pod-Perldoc - perl-Pod-Simple - perl-Pod-Usage - perl-podlators - perl-Scalar-List-Utils - perl-Socket - perl-Socket6 - perl-Software-License - perl-Sort-Versions - perl-Storable - perl-Sub-Exporter - perl-Sub-Identify - perl-Sub-Install - perl-Sub-Uplevel - perl-SUPER - perl-Sys-Syslog - perl-Term-ANSIColor - perl-Term-Cap - perl-TermReadKey - perl-Test-CPAN-Meta - perl-Test-Deep - perl-Test-Exception - perl-Test-FailWarnings - perl-Test-Harness - perl-Test-MockModule - perl-Test-NoWarnings - perl-Test-Output - perl-Test-Pod - perl-Test-Pod-Coverage - perl-Test-Portability-Files - perl-Test-Simple - perl-Test-Taint - perl-Test-TrailingSpace - perl-Test-Version - perl-Test-Warn - perl-Text-Balanced - perl-Text-Diff - perl-Text-Glob - perl-Text-Levenshtein-Damerau-XS - perl-Text-ParseWords - perl-Text-Tabs+Wrap - perl-Text-Template - perl-Thread-Queue - perl-threads - perl-threads-shared - perl-Tie-IxHash - perl-Time-HiRes - perl-Time-Local - perl-TimeDate - perl-Try-Tiny - perl-Unicode-Collate - perl-Unicode-Normalize - perl-URI - perl-version - perl-YAML - perl-YAML-Syck dependencies: - buildrequires: platform: [f29] requires: platform: [f29] references: community: https://fedoraproject.org/wiki/Modularity documentation: https://fedoraproject.org/wiki/Fedora_Packaging_Guidelines_for_Modules buildopts: rpms: macros: | %perl_bootstrap 1 %_with_perl_enables_groff 1 %_without_perl_enables_syslog_test 1 %_with_perl_enables_systemtap 1 %_without_perl_enables_tcsh 1 %_without_perl_Compress_Bzip2_enables_optional_test 1 %_without_perl_CPAN_Meta_Requirements_enables_optional_test 1 %_without_perl_IPC_System_Simple_enables_optional_test 1 %_without_perl_LWP_MediaTypes_enables_mailcap 1 %_without_perl_Module_Build_enables_optional_test 1 %_without_perl_Perl_OSType_enables_optional_test 1 %_without_perl_Pod_Perldoc_enables_tk_test 1 %_without_perl_Software_License_enables_optional_test 1 %_without_perl_Sys_Syslog_enables_optional_test 1 %_without_perl_Test_Harness_enables_optional_test 1 %_without_perl_URI_enables_Business_ISBN 1 components: rpms: perl: rationale: The Perl interpreter. repository: git://pkgs.fedoraproject.org/rpms/perl cache: http://pkgs.fedoraproject.org/repo/pkgs/perl ref: f26 buildorder: 1 perl-Algorithm-Diff: rationale: build dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-Algorithm-Diff cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-Algorithm-Diff ref: f26 buildorder: 4 perl-Archive-Tar: rationale: build dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-Archive-Tar cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-Archive-Tar ref: f26 buildorder: 4 perl-Archive-Zip: rationale: build dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-Archive-Zip cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-Archive-Zip ref: f26 buildorder: 8 perl-Authen-SASL: rationale: build dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-Authen-SASL cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-Authen-SASL ref: f26 buildorder: 6 perl-B-Debug: rationale: build dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-B-Debug cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-B-Debug ref: f26 buildorder: 4 perl-BSD-Resource: rationale: build dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-BSD-Resource cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-BSD-Resource ref: f26 buildorder: 7 perl-CGI: rationale: build dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-CGI cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-CGI ref: f26 buildorder: 6 perl-CPAN: rationale: build dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-CPAN cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-CPAN ref: f26 buildorder: 6 perl-CPAN-Meta: rationale: build dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-CPAN-Meta cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-CPAN-Meta ref: f26 buildorder: 4 perl-CPAN-Meta-Check: rationale: build dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-CPAN-Meta-Check cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-CPAN-Meta-Check ref: f26 buildorder: 10 perl-CPAN-Meta-Requirements: rationale: build dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-CPAN-Meta-Requirements cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-CPAN-Meta-Requirements ref: f26 buildorder: 4 perl-CPAN-Meta-YAML: rationale: build dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-CPAN-Meta-YAML cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-CPAN-Meta-YAML ref: f26 buildorder: 4 perl-Capture-Tiny: rationale: build dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-Capture-Tiny cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-Capture-Tiny ref: f26 buildorder: 4 perl-Carp: rationale: build dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-Carp cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-Carp ref: f26 buildorder: 4 perl-Class-XSAccessor: rationale: build dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-Class-XSAccessor cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-Class-XSAccessor ref: f26 buildorder: 4 perl-Compress-Bzip2: rationale: build dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-Compress-Bzip2 cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-Compress-Bzip2 ref: f26 buildorder: 4 perl-Compress-Raw-Bzip2: rationale: build dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-Compress-Raw-Bzip2 cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-Compress-Raw-Bzip2 ref: f26 buildorder: 4 perl-Compress-Raw-Zlib: rationale: build dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-Compress-Raw-Zlib cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-Compress-Raw-Zlib ref: f26 buildorder: 4 perl-Config-Perl-V: rationale: build dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-Config-Perl-V cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-Config-Perl-V ref: f26 buildorder: 6 perl-DB_File: rationale: build dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-DB_File cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-DB_File ref: f26 buildorder: 4 perl-Data-Dumper: rationale: build dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-Data-Dumper cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-Data-Dumper ref: f26 buildorder: 4 perl-Data-OptList: rationale: build dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-Data-OptList cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-Data-OptList ref: f26 buildorder: 5 perl-Data-Section: rationale: build dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-Data-Section cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-Data-Section ref: f26 buildorder: 7 perl-Devel-Leak: rationale: build dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-Devel-Leak cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-Devel-Leak ref: f26 buildorder: 4 perl-Devel-PPPort: rationale: build dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-Devel-PPPort cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-Devel-PPPort ref: f26 buildorder: 4 perl-Devel-Size: rationale: build dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-Devel-Size cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-Devel-Size ref: f26 buildorder: 7 perl-Devel-StackTrace: rationale: build dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-Devel-StackTrace cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-Devel-StackTrace ref: f26 buildorder: 4 perl-Devel-Symdump: rationale: build dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-Devel-Symdump cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-Devel-Symdump ref: f26 buildorder: 4 perl-Digest: rationale: build dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-Digest cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-Digest ref: f26 buildorder: 4 perl-Digest-HMAC: rationale: build dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-Digest-HMAC cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-Digest-HMAC ref: f26 buildorder: 5 perl-Digest-MD5: rationale: build dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-Digest-MD5 cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-Digest-MD5 ref: f26 buildorder: 4 perl-Digest-SHA: rationale: build dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-Digest-SHA cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-Digest-SHA ref: f26 buildorder: 4 perl-Digest-SHA1: rationale: build dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-Digest-SHA1 cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-Digest-SHA1 ref: f26 buildorder: 4 perl-Encode: rationale: build dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-Encode cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-Encode ref: f26 buildorder: 4 perl-Encode-Locale: rationale: build dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-Encode-Locale cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-Encode-Locale ref: f26 buildorder: 4 perl-Env: rationale: build dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-Env cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-Env ref: f26 buildorder: 4 perl-Expect: rationale: build dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-Expect cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-Expect ref: f26 buildorder: 5 perl-Exporter: rationale: build dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-Exporter cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-Exporter ref: f26 buildorder: 4 perl-ExtUtils-CBuilder: rationale: build dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-ExtUtils-CBuilder cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-ExtUtils-CBuilder ref: f26 buildorder: 4 perl-ExtUtils-Install: rationale: build dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-ExtUtils-Install cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-ExtUtils-Install ref: f26 buildorder: 4 perl-ExtUtils-MakeMaker: rationale: build dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-ExtUtils-MakeMaker cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-ExtUtils-MakeMaker ref: f26 buildorder: 4 perl-ExtUtils-Manifest: rationale: build dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-ExtUtils-Manifest cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-ExtUtils-Manifest ref: f26 buildorder: 4 perl-ExtUtils-ParseXS: rationale: build dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-ExtUtils-ParseXS cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-ExtUtils-ParseXS ref: f26 buildorder: 4 perl-Fedora-VSP: rationale: RPM dependency generator. repository: git://pkgs.fedoraproject.org/rpms/perl-Fedora-VSP cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-Fedora-VSP ref: f26 buildorder: 2 perl-File-Fetch: rationale: build dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-File-Fetch cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-File-Fetch ref: f26 buildorder: 5 perl-File-Find-Object: rationale: build dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-File-Find-Object cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-File-Find-Object ref: f26 buildorder: 5 perl-File-Find-Object-Rule: rationale: build dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-File-Find-Object-Rule cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-File-Find-Object-Rule ref: f26 buildorder: 6 perl-File-Find-Rule: rationale: build dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-File-Find-Rule cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-File-Find-Rule ref: f26 buildorder: 5 perl-File-Find-Rule-Perl: rationale: build dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-File-Find-Rule-Perl cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-File-Find-Rule-Perl ref: f26 buildorder: 6 perl-File-HomeDir: rationale: build dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-File-HomeDir cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-File-HomeDir ref: f26 buildorder: 5 perl-File-Path: rationale: build dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-File-Path cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-File-Path ref: f26 buildorder: 4 perl-File-Slurp-Tiny: rationale: build dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-File-Slurp-Tiny cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-File-Slurp-Tiny ref: f26 buildorder: 4 perl-File-Temp: rationale: build dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-File-Temp cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-File-Temp ref: f26 buildorder: 4 perl-File-Which: rationale: build dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-File-Which cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-File-Which ref: f26 buildorder: 4 perl-Filter: rationale: build dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-Filter cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-Filter ref: f26 buildorder: 4 perl-Filter-Simple: rationale: build dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-Filter-Simple cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-Filter-Simple ref: f26 buildorder: 4 perl-GSSAPI: rationale: build dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-GSSAPI cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-GSSAPI ref: f26 buildorder: 4 perl-Getopt-Long: rationale: build dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-Getopt-Long cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-Getopt-Long ref: f26 buildorder: 4 perl-HTML-Parser: rationale: build dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-HTML-Parser cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-HTML-Parser ref: f26 buildorder: 5 perl-HTML-Tagset: rationale: build dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-HTML-Tagset cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-HTML-Tagset ref: f26 buildorder: 4 perl-HTTP-Date: rationale: build dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-HTTP-Date cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-HTTP-Date ref: f26 buildorder: 4 perl-HTTP-Message: rationale: build dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-HTTP-Message cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-HTTP-Message ref: f26 buildorder: 5 perl-HTTP-Tiny: rationale: build dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-HTTP-Tiny cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-HTTP-Tiny ref: f26 buildorder: 4 perl-IO-Compress: rationale: build dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-IO-Compress cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-IO-Compress ref: f26 buildorder: 5 perl-IO-HTML: rationale: build dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-IO-HTML cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-IO-HTML ref: f26 buildorder: 4 perl-IO-Socket-INET6: rationale: build dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-IO-Socket-INET6 cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-IO-Socket-INET6 ref: f26 buildorder: 8 perl-IO-Socket-IP: rationale: build dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-IO-Socket-IP cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-IO-Socket-IP ref: f26 buildorder: 4 perl-IO-Socket-SSL: rationale: build dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-IO-Socket-SSL cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-IO-Socket-SSL ref: f26 buildorder: 9 perl-IO-String: rationale: build dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-IO-String cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-IO-String ref: f26 buildorder: 4 perl-IO-Tty: rationale: build dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-IO-Tty cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-IO-Tty ref: f26 buildorder: 4 perl-IPC-Cmd: rationale: build dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-IPC-Cmd cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-IPC-Cmd ref: f26 buildorder: 6 perl-IPC-Run: rationale: build dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-IPC-Run cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-IPC-Run ref: f26 buildorder: 5 perl-IPC-SysV: rationale: build dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-IPC-SysV cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-IPC-SysV ref: f26 buildorder: 4 perl-IPC-System-Simple: rationale: build dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-IPC-System-Simple cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-IPC-System-Simple ref: f26 buildorder: 4 perl-Import-Into: rationale: build dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-Import-Into cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-Import-Into ref: f26 buildorder: 8 perl-JSON: rationale: build dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-JSON cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-JSON ref: f26 buildorder: 7 perl-JSON-PP: rationale: build dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-JSON-PP cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-JSON-PP ref: f26 buildorder: 4 perl-LWP-MediaTypes: rationale: build dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-LWP-MediaTypes cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-LWP-MediaTypes ref: f26 buildorder: 4 perl-Locale-Codes: rationale: build dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-Locale-Codes cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-Locale-Codes ref: f26 buildorder: 4 perl-Locale-Maketext: rationale: build dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-Locale-Maketext cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-Locale-Maketext ref: f26 buildorder: 4 perl-MIME-Base64: rationale: build dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-MIME-Base64 cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-MIME-Base64 ref: f26 buildorder: 4 perl-MRO-Compat: rationale: build dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-MRO-Compat cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-MRO-Compat ref: f26 buildorder: 4 perl-Math-BigInt: rationale: build dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-Math-BigInt cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-Math-BigInt ref: f26 buildorder: 4 perl-Math-BigInt-FastCalc: rationale: build dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-Math-BigInt-FastCalc cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-Math-BigInt-FastCalc ref: f26 buildorder: 5 perl-Math-BigRat: rationale: build dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-Math-BigRat cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-Math-BigRat ref: f26 buildorder: 5 perl-Mixin-Linewise: rationale: build dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-Mixin-Linewise cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-Mixin-Linewise ref: f26 buildorder: 7 perl-Module-Build: rationale: build dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-Module-Build cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-Module-Build ref: f26 buildorder: 5 perl-Module-CoreList: rationale: build dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-Module-CoreList cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-Module-CoreList ref: f26 buildorder: 4 perl-Module-Load: rationale: build dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-Module-Load cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-Module-Load ref: f26 buildorder: 4 perl-Module-Load-Conditional: rationale: build dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-Module-Load-Conditional cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-Module-Load-Conditional ref: f26 buildorder: 4 perl-Module-Metadata: rationale: build dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-Module-Metadata cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-Module-Metadata ref: f26 buildorder: 4 perl-Module-Runtime: rationale: build dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-Module-Runtime cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-Module-Runtime ref: f26 buildorder: 7 perl-Net-IDN-Encode: rationale: build dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-Net-IDN-Encode cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-Net-IDN-Encode ref: f26 buildorder: 7 perl-Net-LibIDN: rationale: build dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-Net-LibIDN cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-Net-LibIDN ref: f26 buildorder: 4 perl-Net-SSLeay: rationale: build dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-Net-SSLeay cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-Net-SSLeay ref: f26 buildorder: 6 perl-Number-Compare: rationale: build dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-Number-Compare cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-Number-Compare ref: f26 buildorder: 4 perl-Package-Generator: rationale: build dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-Package-Generator cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-Package-Generator ref: f26 buildorder: 5 perl-Params-Check: rationale: build dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-Params-Check cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-Params-Check ref: f26 buildorder: 4 perl-Params-Util: rationale: build dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-Params-Util cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-Params-Util ref: f26 buildorder: 4 perl-PathTools: rationale: build dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-PathTools cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-PathTools ref: f26 buildorder: 4 perl-Perl-OSType: rationale: build dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-Perl-OSType cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-Perl-OSType ref: f26 buildorder: 4 perl-Perl-Version: rationale: build dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-Perl-Version cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-Perl-Version ref: f26 buildorder: 7 perl-PerlIO-utf8_strict: rationale: build dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-PerlIO-utf8_strict cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-PerlIO-utf8_strict ref: f26 buildorder: 6 perl-PerlIO-via-QuotedPrint: rationale: build dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-PerlIO-via-QuotedPrint cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-PerlIO-via-QuotedPrint ref: f26 buildorder: 4 perl-Pod-Checker: rationale: build dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-Pod-Checker cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-Pod-Checker ref: f26 buildorder: 4 perl-Pod-Coverage: rationale: build dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-Pod-Coverage cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-Pod-Coverage ref: f26 buildorder: 5 perl-Pod-Coverage-TrustPod: rationale: build dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-Pod-Coverage-TrustPod cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-Pod-Coverage-TrustPod ref: f26 buildorder: 9 perl-Pod-Escapes: rationale: build dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-Pod-Escapes cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-Pod-Escapes ref: f26 buildorder: 4 perl-Pod-Eventual: rationale: build dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-Pod-Eventual cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-Pod-Eventual ref: f26 buildorder: 8 perl-Pod-Parser: rationale: build dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-Pod-Parser cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-Pod-Parser ref: f26 buildorder: 4 perl-Pod-Perldoc: rationale: build dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-Pod-Perldoc cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-Pod-Perldoc ref: f26 buildorder: 4 perl-Pod-Simple: rationale: build dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-Pod-Simple cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-Pod-Simple ref: f26 buildorder: 4 perl-Pod-Usage: rationale: build dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-Pod-Usage cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-Pod-Usage ref: f26 buildorder: 4 perl-SUPER: rationale: build dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-SUPER cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-SUPER ref: f26 buildorder: 6 perl-Scalar-List-Utils: rationale: build dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-Scalar-List-Utils cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-Scalar-List-Utils ref: f26 buildorder: 4 perl-Socket: rationale: build dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-Socket cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-Socket ref: f26 buildorder: 4 perl-Socket6: rationale: build dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-Socket6 cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-Socket6 ref: f26 buildorder: 4 perl-Software-License: rationale: build dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-Software-License cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-Software-License ref: f26 buildorder: 12 perl-Sort-Versions: rationale: build dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-Sort-Versions cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-Sort-Versions ref: f26 buildorder: 4 perl-Storable: rationale: build dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-Storable cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-Storable ref: f26 buildorder: 4 perl-Sub-Exporter: rationale: build dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-Sub-Exporter cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-Sub-Exporter ref: f26 buildorder: 6 perl-Sub-Identify: rationale: build dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-Sub-Identify cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-Sub-Identify ref: f26 buildorder: 5 perl-Sub-Install: rationale: build dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-Sub-Install cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-Sub-Install ref: f26 buildorder: 4 perl-Sub-Uplevel: rationale: build dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-Sub-Uplevel cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-Sub-Uplevel ref: f26 buildorder: 4 perl-Sys-Syslog: rationale: build dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-Sys-Syslog cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-Sys-Syslog ref: f26 buildorder: 4 perl-Term-ANSIColor: rationale: build dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-Term-ANSIColor cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-Term-ANSIColor ref: f26 buildorder: 5 perl-Term-Cap: rationale: build dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-Term-Cap cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-Term-Cap ref: f26 buildorder: 4 perl-TermReadKey: rationale: build dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-TermReadKey cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-TermReadKey ref: f26 buildorder: 4 perl-Test-CPAN-Meta: rationale: build dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-Test-CPAN-Meta cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-Test-CPAN-Meta ref: f26 buildorder: 7 perl-Test-Deep: rationale: build dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-Test-Deep cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-Test-Deep ref: f26 buildorder: 4 perl-Test-Exception: rationale: build dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-Test-Exception cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-Test-Exception ref: f26 buildorder: 5 perl-Test-FailWarnings: rationale: build dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-Test-FailWarnings cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-Test-FailWarnings ref: f26 buildorder: 5 perl-Test-Harness: rationale: build dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-Test-Harness cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-Test-Harness ref: f26 buildorder: 4 perl-Test-MockModule: rationale: build dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-Test-MockModule cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-Test-MockModule ref: f26 buildorder: 7 perl-Test-NoWarnings: rationale: build dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-Test-NoWarnings cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-Test-NoWarnings ref: f26 buildorder: 5 perl-Test-Output: rationale: build dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-Test-Output cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-Test-Output ref: f26 buildorder: 7 perl-Test-Pod: rationale: build dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-Test-Pod cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-Test-Pod ref: f26 buildorder: 4 perl-Test-Pod-Coverage: rationale: build dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-Test-Pod-Coverage cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-Test-Pod-Coverage ref: f26 buildorder: 6 perl-Test-Portability-Files: rationale: build dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-Test-Portability-Files cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-Test-Portability-Files ref: f26 buildorder: 4 perl-Test-Simple: rationale: build dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-Test-Simple cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-Test-Simple ref: f26 buildorder: 4 perl-Test-Taint: rationale: build dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-Test-Taint cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-Test-Taint ref: f26 buildorder: 7 perl-Test-TrailingSpace: rationale: build dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-Test-TrailingSpace cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-Test-TrailingSpace ref: f26 buildorder: 7 perl-Test-Version: rationale: build dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-Test-Version cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-Test-Version ref: f26 buildorder: 7 perl-Test-Warn: rationale: build dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-Test-Warn cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-Test-Warn ref: f26 buildorder: 5 perl-Text-Balanced: rationale: build dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-Text-Balanced cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-Text-Balanced ref: f26 buildorder: 4 perl-Text-Diff: rationale: build dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-Text-Diff cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-Text-Diff ref: f26 buildorder: 5 perl-Text-Glob: rationale: build dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-Text-Glob cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-Text-Glob ref: f26 buildorder: 4 perl-Text-Levenshtein-Damerau-XS: rationale: build dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-Text-Levenshtein-Damerau-XS cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-Text-Levenshtein-Damerau-XS ref: f26 buildorder: 4 perl-Text-ParseWords: rationale: build dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-Text-ParseWords cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-Text-ParseWords ref: f26 buildorder: 4 perl-Text-Tabs+Wrap: rationale: build dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-Text-Tabs+Wrap cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-Text-Tabs+Wrap ref: f26 buildorder: 4 perl-Text-Template: rationale: build dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-Text-Template cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-Text-Template ref: f26 buildorder: 4 perl-Thread-Queue: rationale: build dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-Thread-Queue cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-Thread-Queue ref: f26 buildorder: 4 perl-Tie-IxHash: rationale: build dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-Tie-IxHash cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-Tie-IxHash ref: f26 buildorder: 4 perl-Time-HiRes: rationale: build dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-Time-HiRes cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-Time-HiRes ref: f26 buildorder: 4 perl-Time-Local: rationale: build dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-Time-Local cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-Time-Local ref: f26 buildorder: 4 perl-TimeDate: rationale: build dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-TimeDate cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-TimeDate ref: f26 buildorder: 4 perl-Try-Tiny: rationale: build dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-Try-Tiny cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-Try-Tiny ref: f26 buildorder: 11 perl-URI: rationale: build dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-URI cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-URI ref: f26 buildorder: 4 perl-Unicode-Collate: rationale: build dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-Unicode-Collate cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-Unicode-Collate ref: f26 buildorder: 4 perl-Unicode-Normalize: rationale: build dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-Unicode-Normalize cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-Unicode-Normalize ref: f26 buildorder: 4 perl-YAML: rationale: build dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-YAML cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-YAML ref: f26 buildorder: 4 perl-YAML-Syck: rationale: build dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-YAML-Syck cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-YAML-Syck ref: f26 buildorder: 8 perl-accessors: rationale: build dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-accessors cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-accessors ref: f26 buildorder: 6 perl-autodie: rationale: build dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-autodie cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-autodie ref: f26 buildorder: 4 perl-bignum: rationale: build dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-bignum cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-bignum ref: f26 buildorder: 5 perl-constant: rationale: build dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-constant cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-constant ref: f26 buildorder: 4 perl-experimental: rationale: build dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-experimental cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-experimental ref: f26 buildorder: 4 perl-generators: rationale: RPM dependency generator. repository: git://pkgs.fedoraproject.org/rpms/perl-generators cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-generators ref: f26 buildorder: 3 perl-inc-latest: rationale: build dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-inc-latest cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-inc-latest ref: f26 buildorder: 4 perl-libnet: rationale: build dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-libnet cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-libnet ref: f26 buildorder: 4 perl-local-lib: rationale: build dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-local-lib cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-local-lib ref: f26 buildorder: 6 perl-parent: rationale: build dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-parent cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-parent ref: f26 buildorder: 4 perl-perlfaq: rationale: build dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-perlfaq cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-perlfaq ref: f26 buildorder: 4 perl-podlators: rationale: build dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-podlators cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-podlators ref: f26 buildorder: 4 perl-threads: rationale: build dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-threads cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-threads ref: f26 buildorder: 4 perl-threads-shared: rationale: build dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-threads-shared cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-threads-shared ref: f26 buildorder: 4 perl-version: rationale: build dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-version cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-version ref: f26 buildorder: 4 artifacts: rpms: - perl-4:5.24.4-397.module_1677+5adff7e0.x86_64 - perl-Algorithm-Diff-0:1.1903-6.module_1677+5adff7e0.noarch - perl-Archive-Tar-0:2.04-397.module_1677+5adff7e0.noarch - perl-Archive-Tar-0:2.26-1.module_1677+5adff7e0.noarch - perl-Archive-Zip-0:1.59-3.module_1677+5adff7e0.noarch - perl-Attribute-Handlers-0:0.99-397.module_1677+5adff7e0.noarch - perl-Authen-SASL-0:2.16-9.module_1677+5adff7e0.noarch - perl-B-Debug-0:1.23-397.module_1677+5adff7e0.noarch - perl-B-Debug-0:1.24-2.module_1677+5adff7e0.noarch - perl-BSD-Resource-0:1.291.100-1.module_1677+5adff7e0.x86_64 - perl-CGI-0:4.36-1.module_1677+5adff7e0.noarch - perl-CPAN-0:2.11-397.module_1677+5adff7e0.noarch - perl-CPAN-0:2.16-1.module_1677+5adff7e0.noarch - perl-CPAN-Meta-0:2.150005-397.module_1677+5adff7e0.noarch - perl-CPAN-Meta-0:2.150010-2.module_1677+5adff7e0.noarch - perl-CPAN-Meta-Check-0:0.014-2.module_1677+5adff7e0.noarch - perl-CPAN-Meta-Requirements-0:2.132-397.module_1677+5adff7e0.noarch - perl-CPAN-Meta-Requirements-0:2.140-7.module_1677+5adff7e0.noarch - perl-CPAN-Meta-YAML-0:0.018-367.module_1677+5adff7e0.noarch - perl-CPAN-Meta-YAML-0:0.018-397.module_1677+5adff7e0.noarch - perl-Capture-Tiny-0:0.46-1.module_1677+5adff7e0.noarch - perl-Carp-0:1.40-366.module_1677+5adff7e0.noarch - perl-Carp-0:1.40-397.module_1677+5adff7e0.noarch - perl-Class-XSAccessor-0:1.19-10.module_1677+5adff7e0.x86_64 - perl-Compress-Bzip2-0:2.26-1.module_1677+5adff7e0.x86_64 - perl-Compress-Raw-Bzip2-0:2.069-397.module_1677+5adff7e0.x86_64 - perl-Compress-Raw-Bzip2-0:2.074-1.module_1677+5adff7e0.x86_64 - perl-Compress-Raw-Zlib-0:2.069-397.module_1677+5adff7e0.x86_64 - perl-Compress-Raw-Zlib-0:2.074-1.module_1677+5adff7e0.x86_64 - perl-Config-Perl-V-0:0.25-397.module_1677+5adff7e0.noarch - perl-Config-Perl-V-0:0.27-2.module_1677+5adff7e0.noarch - perl-DB_File-0:1.835-397.module_1677+5adff7e0.x86_64 - perl-DB_File-0:1.841-1.module_1677+5adff7e0.x86_64 - perl-Data-Dumper-0:2.160-397.module_1677+5adff7e0.x86_64 - perl-Data-Dumper-0:2.161-4.module_1677+5adff7e0.x86_64 - perl-Data-OptList-0:0.110-3.module_1677+5adff7e0.noarch - perl-Data-Section-0:0.200006-8.module_1677+5adff7e0.noarch - perl-Devel-Leak-0:0.03-32.module_1677+5adff7e0.x86_64 - perl-Devel-PPPort-0:3.32-397.module_1677+5adff7e0.x86_64 - perl-Devel-PPPort-0:3.36-1.module_1677+5adff7e0.x86_64 - perl-Devel-Peek-0:1.23-397.module_1677+5adff7e0.x86_64 - perl-Devel-SelfStubber-0:1.05-397.module_1677+5adff7e0.noarch - perl-Devel-Size-0:0.81-1.module_1677+5adff7e0.x86_64 - perl-Devel-StackTrace-1:2.03-1.module_1677+5adff7e0.noarch - perl-Devel-Symdump-1:2.18-1.module_1677+5adff7e0.noarch - perl-Digest-0:1.17-367.module_1677+5adff7e0.noarch - perl-Digest-0:1.17-397.module_1677+5adff7e0.noarch - perl-Digest-HMAC-0:1.03-14.module_1677+5adff7e0.noarch - perl-Digest-MD5-0:2.54-397.module_1677+5adff7e0.x86_64 - perl-Digest-MD5-0:2.55-3.module_1677+5adff7e0.x86_64 - perl-Digest-SHA-1:5.95-397.module_1677+5adff7e0.x86_64 - perl-Digest-SHA-1:6.01-1.module_1677+5adff7e0.x86_64 - perl-Digest-SHA1-0:2.13-19.module_1677+5adff7e0.x86_64 - perl-Encode-4:2.80-397.module_1677+5adff7e0.x86_64 - perl-Encode-4:2.88-6.module_1677+5adff7e0.x86_64 - perl-Encode-Locale-0:1.05-6.module_1677+5adff7e0.noarch - perl-Encode-devel-4:2.80-397.module_1677+5adff7e0.noarch - perl-Encode-devel-4:2.88-6.module_1677+5adff7e0.x86_64 - perl-Env-0:1.04-366.module_1677+5adff7e0.noarch - perl-Env-0:1.04-397.module_1677+5adff7e0.noarch - perl-Errno-0:1.25-397.module_1677+5adff7e0.x86_64 - perl-Expect-0:1.35-1.module_1677+5adff7e0.noarch - perl-Exporter-0:5.72-367.module_1677+5adff7e0.noarch - perl-Exporter-0:5.72-397.module_1677+5adff7e0.noarch - perl-ExtUtils-CBuilder-1:0.280225-366.module_1677+5adff7e0.noarch - perl-ExtUtils-CBuilder-1:0.280225-397.module_1677+5adff7e0.noarch - perl-ExtUtils-Command-0:7.10-397.module_1677+5adff7e0.noarch - perl-ExtUtils-Command-0:7.24-3.module_1677+5adff7e0.noarch - perl-ExtUtils-Embed-0:1.33-397.module_1677+5adff7e0.noarch - perl-ExtUtils-Install-0:2.04-367.module_1677+5adff7e0.noarch - perl-ExtUtils-Install-0:2.04-397.module_1677+5adff7e0.noarch - perl-ExtUtils-MM-Utils-0:7.11-397.module_1677+5adff7e0.noarch - perl-ExtUtils-MM-Utils-0:7.24-3.module_1677+5adff7e0.noarch - perl-ExtUtils-MakeMaker-0:7.10-397.module_1677+5adff7e0.noarch - perl-ExtUtils-MakeMaker-0:7.24-3.module_1677+5adff7e0.noarch - perl-ExtUtils-Manifest-0:1.70-366.module_1677+5adff7e0.noarch - perl-ExtUtils-Manifest-0:1.70-397.module_1677+5adff7e0.noarch - perl-ExtUtils-Miniperl-0:1.05-397.module_1677+5adff7e0.noarch - perl-ExtUtils-ParseXS-1:3.31-368.module_1677+5adff7e0.noarch - perl-ExtUtils-ParseXS-1:3.31-397.module_1677+5adff7e0.noarch - perl-Fedora-VSP-0:0.001-5.module_1677+5adff7e0.noarch - perl-File-Fetch-0:0.48-397.module_1677+5adff7e0.noarch - perl-File-Fetch-0:0.56-1.module_1677+5adff7e0.noarch - perl-File-Find-Object-0:0.3.2-2.module_1677+5adff7e0.noarch - perl-File-Find-Object-Rule-0:0.0306-2.module_1677+5adff7e0.noarch - perl-File-Find-Rule-0:0.34-5.module_1677+5adff7e0.noarch - perl-File-Find-Rule-Perl-0:1.15-7.module_1677+5adff7e0.noarch - perl-File-HomeDir-0:1.00-13.module_1677+5adff7e0.noarch - perl-File-Path-0:2.12-367.module_1677+5adff7e0.noarch - perl-File-Path-0:2.12-397.module_1677+5adff7e0.noarch - perl-File-Slurp-Tiny-0:0.004-4.module_1677+5adff7e0.noarch - perl-File-Temp-0:0.230.400-2.module_1677+5adff7e0.noarch - perl-File-Temp-0:0.230.400-397.module_1677+5adff7e0.noarch - perl-File-Which-0:1.21-3.module_1677+5adff7e0.noarch - perl-Filter-2:1.55-397.module_1677+5adff7e0.x86_64 - perl-Filter-2:1.58-1.module_1677+5adff7e0.x86_64 - perl-Filter-Simple-0:0.92-366.module_1677+5adff7e0.noarch - perl-Filter-Simple-0:0.92-397.module_1677+5adff7e0.noarch - perl-GSSAPI-0:0.28-18.module_1677+5adff7e0.x86_64 - perl-Getopt-Long-0:2.48-397.module_1677+5adff7e0.noarch - perl-Getopt-Long-0:2.49.1-2.module_1677+5adff7e0.noarch - perl-HTML-Parser-0:3.72-5.module_1677+5adff7e0.x86_64 - perl-HTML-Parser-tests-0:3.72-5.module_1677+5adff7e0.x86_64 - perl-HTML-Tagset-0:3.20-28.module_1677+5adff7e0.noarch - perl-HTTP-Date-0:6.02-15.module_1677+5adff7e0.noarch - perl-HTTP-Message-0:6.11-4.module_1677+5adff7e0.noarch - perl-HTTP-Tiny-0:0.056-397.module_1677+5adff7e0.noarch - perl-HTTP-Tiny-0:0.070-2.module_1677+5adff7e0.noarch - perl-IO-0:1.36-397.module_1677+5adff7e0.x86_64 - perl-IO-Compress-0:2.069-397.module_1677+5adff7e0.noarch - perl-IO-Compress-0:2.074-1.module_1677+5adff7e0.noarch - perl-IO-HTML-0:1.001-7.module_1677+5adff7e0.noarch - perl-IO-Socket-INET6-0:2.72-9.module_1677+5adff7e0.noarch - perl-IO-Socket-IP-0:0.37-397.module_1677+5adff7e0.noarch - perl-IO-Socket-IP-0:0.39-1.module_1677+5adff7e0.noarch - perl-IO-Socket-SSL-0:2.049-1.module_1677+5adff7e0.noarch - perl-IO-String-0:1.08-28.module_1677+5adff7e0.noarch - perl-IO-Tty-0:1.12-7.module_1677+5adff7e0.x86_64 - perl-IO-Zlib-1:1.10-397.module_1677+5adff7e0.noarch - perl-IPC-Cmd-1:0.92-397.module_1677+5adff7e0.noarch - perl-IPC-Cmd-1:0.98-1.module_1677+5adff7e0.noarch - perl-IPC-Run-0:0.96-1.module_1677+5adff7e0.noarch - perl-IPC-SysV-0:2.06-397.module_1677+5adff7e0.x86_64 - perl-IPC-SysV-0:2.07-4.module_1677+5adff7e0.x86_64 - perl-IPC-System-Simple-0:1.25-12.module_1677+5adff7e0.noarch - perl-Import-Into-0:1.002005-4.module_1677+5adff7e0.noarch - perl-JSON-0:2.90-8.module_1677+5adff7e0.noarch - perl-JSON-PP-0:2.27300-397.module_1677+5adff7e0.noarch - perl-JSON-PP-0:2.94000-1.module_1677+5adff7e0.noarch - perl-JSON-tests-0:2.90-8.module_1677+5adff7e0.noarch - perl-LWP-MediaTypes-0:6.02-11.module_1677+5adff7e0.noarch - perl-Locale-Codes-0:3.25-397.module_1677+5adff7e0.noarch - perl-Locale-Codes-0:3.42-2.module_1677+5adff7e0.noarch - perl-Locale-Maketext-0:1.26-397.module_1677+5adff7e0.noarch - perl-Locale-Maketext-0:1.28-2.module_1677+5adff7e0.noarch - perl-Locale-Maketext-Simple-1:0.21-397.module_1677+5adff7e0.noarch - perl-MIME-Base64-0:3.15-366.module_1677+5adff7e0.x86_64 - perl-MIME-Base64-0:3.15-397.module_1677+5adff7e0.x86_64 - perl-MRO-Compat-0:0.13-1.module_1677+5adff7e0.noarch - perl-Math-BigInt-0:1.9997.15-397.module_1677+5adff7e0.noarch - perl-Math-BigInt-0:1.9998.11-1.module_1677+5adff7e0.noarch - perl-Math-BigInt-FastCalc-0:0.400-397.module_1677+5adff7e0.x86_64 - perl-Math-BigInt-FastCalc-0:0.500.600-2.module_1677+5adff7e0.x86_64 - perl-Math-BigRat-0:0.2608.02-397.module_1677+5adff7e0.noarch - perl-Math-BigRat-0:0.2613-1.module_1677+5adff7e0.noarch - perl-Math-Complex-0:1.59-397.module_1677+5adff7e0.noarch - perl-Memoize-0:1.03-397.module_1677+5adff7e0.noarch - perl-Mixin-Linewise-0:0.108-6.module_1677+5adff7e0.noarch - perl-Module-Build-2:0.42.24-1.module_1677+5adff7e0.noarch - perl-Module-CoreList-1:5.20180414-1.module_1677+5adff7e0.noarch - perl-Module-CoreList-1:5.20180414-397.module_1677+5adff7e0.noarch - perl-Module-CoreList-tools-1:5.20180414-1.module_1677+5adff7e0.noarch - perl-Module-CoreList-tools-1:5.20180414-397.module_1677+5adff7e0.noarch - perl-Module-Load-1:0.32-366.module_1677+5adff7e0.noarch - perl-Module-Load-1:0.32-397.module_1677+5adff7e0.noarch - perl-Module-Load-Conditional-0:0.64-397.module_1677+5adff7e0.noarch - perl-Module-Load-Conditional-0:0.68-2.module_1677+5adff7e0.noarch - perl-Module-Loaded-1:0.08-397.module_1677+5adff7e0.noarch - perl-Module-Metadata-0:1.000031-397.module_1677+5adff7e0.noarch - perl-Module-Metadata-0:1.000033-2.module_1677+5adff7e0.noarch - perl-Module-Runtime-0:0.015-1.module_1677+5adff7e0.noarch - perl-Net-IDN-Encode-0:2.400-2.module_1677+5adff7e0.x86_64 - perl-Net-LibIDN-0:0.12-25.module_1677+5adff7e0.x86_64 - perl-Net-Ping-0:2.43-397.module_1677+5adff7e0.noarch - perl-Net-SSLeay-0:1.81-1.module_1677+5adff7e0.x86_64 - perl-Number-Compare-0:0.03-16.module_1677+5adff7e0.noarch - perl-Package-Generator-0:1.106-8.module_1677+5adff7e0.noarch - perl-Params-Check-1:0.38-366.module_1677+5adff7e0.noarch - perl-Params-Check-1:0.38-397.module_1677+5adff7e0.noarch - perl-Params-Util-0:1.07-17.module_1677+5adff7e0.x86_64 - perl-Parse-CPAN-Meta-1:1.4417-397.module_1677+5adff7e0.noarch - perl-PathTools-0:3.63-367.module_1677+5adff7e0.x86_64 - perl-PathTools-0:3.63-397.module_1677+5adff7e0.x86_64 - perl-Perl-OSType-0:1.009-397.module_1677+5adff7e0.noarch - perl-Perl-OSType-0:1.010-4.module_1677+5adff7e0.noarch - perl-Perl-Version-0:1.013-6.module_1677+5adff7e0.noarch - perl-PerlIO-utf8_strict-0:0.007-1.module_1677+5adff7e0.x86_64 - perl-PerlIO-via-QuotedPrint-0:0.08-366.module_1677+5adff7e0.noarch - perl-PerlIO-via-QuotedPrint-0:0.08-397.module_1677+5adff7e0.noarch - perl-Pod-Checker-4:1.60-397.module_1677+5adff7e0.noarch - perl-Pod-Checker-4:1.73-2.module_1677+5adff7e0.noarch - perl-Pod-Coverage-0:0.23-11.module_1677+5adff7e0.noarch - perl-Pod-Coverage-TrustPod-0:0.100003-6.module_1677+5adff7e0.noarch - perl-Pod-Escapes-1:1.07-366.module_1677+5adff7e0.noarch - perl-Pod-Escapes-1:1.07-397.module_1677+5adff7e0.noarch - perl-Pod-Eventual-0:0.094001-6.module_1677+5adff7e0.noarch - perl-Pod-Html-0:1.22.01-397.module_1677+5adff7e0.noarch - perl-Pod-Parser-0:1.63-367.module_1677+5adff7e0.noarch - perl-Pod-Parser-0:1.63-397.module_1677+5adff7e0.noarch - perl-Pod-Perldoc-0:3.25-397.module_1677+5adff7e0.noarch - perl-Pod-Perldoc-0:3.28-2.module_1677+5adff7e0.noarch - perl-Pod-Simple-1:3.32-397.module_1677+5adff7e0.noarch - perl-Pod-Simple-1:3.35-2.module_1677+5adff7e0.noarch - perl-Pod-Usage-4:1.68-397.module_1677+5adff7e0.noarch - perl-Pod-Usage-4:1.69-2.module_1677+5adff7e0.noarch - perl-SUPER-0:1.20141117-7.module_1677+5adff7e0.noarch - perl-Scalar-List-Utils-3:1.42-397.module_1677+5adff7e0.x86_64 - perl-Scalar-List-Utils-3:1.48-1.module_1677+5adff7e0.x86_64 - perl-SelfLoader-0:1.23-397.module_1677+5adff7e0.noarch - perl-Socket-4:2.020-397.module_1677+5adff7e0.x86_64 - perl-Socket-4:2.027-1.module_1677+5adff7e0.x86_64 - perl-Socket6-0:0.28-2.module_1677+5adff7e0.x86_64 - perl-Software-License-0:0.103012-4.module_1677+5adff7e0.noarch - perl-Sort-Versions-0:1.62-5.module_1677+5adff7e0.noarch - perl-Storable-1:2.56-368.module_1677+5adff7e0.x86_64 - perl-Storable-1:2.56-397.module_1677+5adff7e0.x86_64 - perl-Sub-Exporter-0:0.987-11.module_1677+5adff7e0.noarch - perl-Sub-Identify-0:0.14-1.module_1677+5adff7e0.x86_64 - perl-Sub-Install-0:0.928-10.module_1677+5adff7e0.noarch - perl-Sub-Uplevel-1:0.2800-1.module_1677+5adff7e0.noarch - perl-Sys-Syslog-0:0.33-397.module_1677+5adff7e0.x86_64 - perl-Sys-Syslog-0:0.35-2.module_1677+5adff7e0.x86_64 - perl-Term-ANSIColor-0:4.04-397.module_1677+5adff7e0.noarch - perl-Term-ANSIColor-0:4.06-2.module_1677+5adff7e0.noarch - perl-Term-Cap-0:1.17-366.module_1677+5adff7e0.noarch - perl-Term-Cap-0:1.17-397.module_1677+5adff7e0.noarch - perl-TermReadKey-0:2.37-2.module_1677+5adff7e0.x86_64 - perl-Test-0:1.28-397.module_1677+5adff7e0.noarch - perl-Test-CPAN-Meta-0:0.25-8.module_1677+5adff7e0.noarch - perl-Test-Deep-0:1.127-1.module_1677+5adff7e0.noarch - perl-Test-Exception-0:0.43-4.module_1677+5adff7e0.noarch - perl-Test-FailWarnings-0:0.008-9.module_1677+5adff7e0.noarch - perl-Test-Harness-0:3.36-397.module_1677+5adff7e0.noarch - perl-Test-Harness-0:3.42-1.module_1677+5adff7e0.noarch - perl-Test-MockModule-0:0.11-4.module_1677+5adff7e0.noarch - perl-Test-NoWarnings-0:1.04-11.module_1677+5adff7e0.noarch - perl-Test-Output-0:1.03-8.module_1677+5adff7e0.noarch - perl-Test-Pod-0:1.51-5.module_1677+5adff7e0.noarch - perl-Test-Pod-Coverage-0:1.10-7.module_1677+5adff7e0.noarch - perl-Test-Portability-Files-0:0.07-2.module_1677+5adff7e0.noarch - perl-Test-Simple-0:1.001014-397.module_1677+5adff7e0.noarch - perl-Test-Simple-1:1.302086-1.module_1677+5adff7e0.noarch - perl-Test-Taint-0:1.06-15.module_1677+5adff7e0.x86_64 - perl-Test-TrailingSpace-0:0.0301-2.module_1677+5adff7e0.noarch - perl-Test-Version-0:2.05-2.module_1677+5adff7e0.noarch - perl-Test-Warn-0:0.32-2.module_1677+5adff7e0.noarch - perl-Text-Balanced-0:2.03-366.module_1677+5adff7e0.noarch - perl-Text-Balanced-0:2.03-397.module_1677+5adff7e0.noarch - perl-Text-Diff-0:1.44-3.module_1677+5adff7e0.noarch - perl-Text-Glob-0:0.11-1.module_1677+5adff7e0.noarch - perl-Text-Levenshtein-Damerau-XS-0:3.2-1.module_1677+5adff7e0.x86_64 - perl-Text-ParseWords-0:3.30-366.module_1677+5adff7e0.noarch - perl-Text-ParseWords-0:3.30-397.module_1677+5adff7e0.noarch - perl-Text-Tabs+Wrap-0:2013.0523-366.module_1677+5adff7e0.noarch - perl-Text-Tabs+Wrap-0:2013.0523-397.module_1677+5adff7e0.noarch - perl-Text-Template-0:1.47-1.module_1677+5adff7e0.noarch - perl-Thread-Queue-0:3.09-397.module_1677+5adff7e0.noarch - perl-Thread-Queue-0:3.12-1.module_1677+5adff7e0.noarch - perl-Tie-IxHash-0:1.23-8.module_1677+5adff7e0.noarch - perl-Time-HiRes-0:1.9741-397.module_1677+5adff7e0.x86_64 - perl-Time-HiRes-0:1.9753-1.module_1677+5adff7e0.x86_64 - perl-Time-Local-0:1.2300-397.module_1677+5adff7e0.noarch - perl-Time-Local-1:1.250-2.module_1677+5adff7e0.noarch - perl-Time-Piece-0:1.31-397.module_1677+5adff7e0.x86_64 - perl-TimeDate-1:2.30-10.module_1677+5adff7e0.noarch - perl-Try-Tiny-0:0.28-2.module_1677+5adff7e0.noarch - perl-URI-0:1.71-6.module_1677+5adff7e0.noarch - perl-Unicode-Collate-0:1.14-397.module_1677+5adff7e0.x86_64 - perl-Unicode-Collate-0:1.20-1.module_1677+5adff7e0.x86_64 - perl-Unicode-Normalize-0:1.25-366.module_1677+5adff7e0.x86_64 - perl-Unicode-Normalize-0:1.25-397.module_1677+5adff7e0.x86_64 - perl-YAML-0:1.23-1.module_1677+5adff7e0.noarch - perl-YAML-Syck-0:1.30-1.module_1677+5adff7e0.x86_64 - perl-accessors-0:1.01-21.module_1677+5adff7e0.noarch - perl-autodie-0:2.29-367.module_1677+5adff7e0.noarch - perl-autodie-0:2.29-397.module_1677+5adff7e0.noarch - perl-bignum-0:0.42-397.module_1677+5adff7e0.noarch - perl-bignum-0:0.49-1.module_1677+5adff7e0.noarch - perl-constant-0:1.33-368.module_1677+5adff7e0.noarch - perl-constant-0:1.33-397.module_1677+5adff7e0.noarch - perl-core-0:5.24.4-397.module_1677+5adff7e0.x86_64 - perl-devel-4:5.24.4-397.module_1677+5adff7e0.x86_64 - perl-encoding-4:2.17-397.module_1677+5adff7e0.x86_64 - perl-encoding-4:2.19-6.module_1677+5adff7e0.x86_64 - perl-experimental-0:0.016-397.module_1677+5adff7e0.noarch - perl-experimental-0:0.019-1.module_1677+5adff7e0.noarch - perl-generators-0:1.10-2.module_1677+5adff7e0.noarch - perl-homedir-0:2.000023-1.module_1677+5adff7e0.noarch - perl-inc-latest-2:0.500-6.module_1677+5adff7e0.noarch - perl-libnet-0:3.08-397.module_1677+5adff7e0.noarch - perl-libnet-0:3.11-1.module_1677+5adff7e0.noarch - perl-libnetcfg-4:5.24.4-397.module_1677+5adff7e0.noarch - perl-libs-4:5.24.4-397.module_1677+5adff7e0.x86_64 - perl-local-lib-0:2.000023-1.module_1677+5adff7e0.noarch - perl-macros-4:5.24.4-397.module_1677+5adff7e0.x86_64 - perl-open-0:1.10-397.module_1677+5adff7e0.noarch - perl-parent-1:0.234-397.module_1677+5adff7e0.noarch - perl-parent-1:0.236-2.module_1677+5adff7e0.noarch - perl-perlfaq-0:5.021010-397.module_1677+5adff7e0.noarch - perl-perlfaq-0:5.021011-3.module_1677+5adff7e0.noarch - perl-podlators-0:4.07-397.module_1677+5adff7e0.noarch - perl-podlators-0:4.09-3.module_1677+5adff7e0.noarch - perl-tests-4:5.24.4-397.module_1677+5adff7e0.x86_64 - perl-threads-1:2.07-397.module_1677+5adff7e0.x86_64 - perl-threads-1:2.21-1.module_1677+5adff7e0.x86_64 - perl-threads-shared-0:1.51-397.module_1677+5adff7e0.x86_64 - perl-threads-shared-0:1.58-1.module_1677+5adff7e0.x86_64 - perl-utils-0:5.24.4-397.module_1677+5adff7e0.noarch - perl-version-5:0.99.16-397.module_1677+5adff7e0.noarch - perl-version-5:0.99.18-1.module_1677+5adff7e0.x86_64 ... --- document: modulemd version: 2 data: name: perl stream: 5.26 version: 20180417112647 context: ccbeb30a arch: x86_64 summary: Practical Extraction and Report Language description: > Perl is a high-level programming language with roots in C, sed, awk and shell scripting. Perl is good at handling processes and files, and is especially good at handling text. Perl's hallmarks are practicality and efficiency. While it is used to do a lot of different things, Perl's most common applications are system administration utilities and web programming. license: module: - MIT content: - MIT xmd: mbs: mse: TRUE scmurl: https://src.fedoraproject.org/modules/perl.git?#b7ea70e535667def6fb4258d744d47a0f0972661 commit: b7ea70e535667def6fb4258d744d47a0f0972661 buildrequires: perl-bootstrap: ref: 22773d9e44948febd267fc7b94e169b1c7e81f73 stream: 5.26 context: 6c81f848 version: 20180417064707 filtered_rpms: [] platform: ref: f29 stream: f29 context: 00000000 version: 4 filtered_rpms: [] rpms: perl-Text-Diff: ref: 435597b4b8f23cdb4b5d08a83526f3a0ba180ba4 perl-Text-Balanced: ref: 8c14f0f727543b80dc9cacba0422bcc1653d0290 perl-File-Fetch: ref: 7e786fd7e77fd794553f84ff29dc777cd9f73ca2 perl: ref: feb15b2a5274ffede0261170972b96d61acc9b38 perl-Math-BigRat: ref: 8d926e35aeb4d768c2a9e9c9f2d24e36202b8e2d perl-Math-BigInt-FastCalc: ref: fd294a4d494055cd4f3f7e22f0f0c361162dedfa perl-Locale-Maketext: ref: 6dd172c644c44c07b1613b0870a119ee5e6d4116 perl-Algorithm-Diff: ref: b572ed3bbdd7421c4ec31da90602f12f7a8c951c perl-PathTools: ref: a0ed8e15339741624d99094a261ecef2f2bef816 perl-IPC-System-Simple: ref: 5b4319c5aabf7945208163c339c112b68b40d36a perl-CPAN-Meta-Requirements: ref: f25cbf2508f08dcb618b5e097cda6023aea94101 perl-Compress-Bzip2: ref: 4ca6f6001d529639ad9af34f6a4829371ed7c88c perl-IO-Compress: ref: bb10d2103bf534e10a4a1d1bc987a4314cb5de48 perl-threads-shared: ref: 236010203776860d682ee2e6d37529e8e4aaa90a perl-autodie: ref: 08926569224919ffa066397ca80c5b1818a89e90 perl-constant: ref: bce81fc9c982eeee92490116718ab9ed652eb0e7 perl-bignum: ref: e1753ef99cc972644a0a217e676467b8fd5d5788 perl-Params-Check: ref: 94989a67e37e22221a55b1d39dfb9f804122f928 perl-Archive-Zip: ref: 6270e0a0fe7c56198441d0e8757500f56a4a54a2 perl-Math-BigInt: ref: 76c86fadeda569a2ebd6439f12e7f69f74c8df67 perl-podlators: ref: 49c1364c8485ff979a2ccded759739a47e164836 perl-ExtUtils-Manifest: ref: f1169d7bb27bfb1b2db567be1f0ff112a9069246 perl-Compress-Raw-Zlib: ref: c9d37e07af93fe0a5e4886536b27f016260074ca perl-local-lib: ref: 0716ed7be631222c11ec33672373662daa6b00bf perl-libnet: ref: 8799d71bc96c9db7a72658edcd27f9f21b260f71 perl-B-Debug: ref: 5a7c0b7619476154ff3129fe449afabb1b450279 perl-Config-Perl-V: ref: 8d5189f0c6816a5ff74a20ba7426d3964aa626aa perl-threads: ref: 96ef6a4161926a852227a37db2a82769df38ebc5 perl-Term-Cap: ref: 1d444a86d772b87c5b0484e3639f7bac52de8afe perl-Unicode-Normalize: ref: c7a4b3f134e101eb452b949eeda6497d6ea9e520 perl-Storable: ref: b34d556aadded8e2f5c62894dbbcd0fae9d3ab87 perl-IPC-SysV: ref: 4cf56fbde1b8a369fb6114d0f2dc7866dd835b71 perl-IPC-Cmd: ref: 9600d4d856fa56cd63d78d51b1ab699556bbaa20 perl-Time-HiRes: ref: 400def5c2f8c642b692a22c7a6f45da6f4cbd868 perl-Digest-MD5: ref: 8fad912c493bc960566e5ce7118e0cdce3b9a769 perl-Getopt-Long: ref: 3fcd385e78c21d29488f8e020e2b9df21c54900f perl-Module-Metadata: ref: 1578659d3194251b91e39887baf3ad56689fad90 perl-version: ref: 72cca25da1658f759319b46edc9d5abf7b35c3f2 perl-Devel-Size: ref: 960a461ee17d9a34e9817a771410dd2801be2f17 perl-Unicode-Collate: ref: 3a0555a1c080f2bba8e052c32ce35d4c1fca429a perl-Env: ref: 201efc08b7115ab13b1402f76ed05e5c8ed686d4 perl-ExtUtils-MakeMaker: ref: c88d4cf08d3e3ddc8c113a430d287a830c1133e6 perl-File-HomeDir: ref: 253a5f4a3d03187c799904441650124e8ec832ea perl-experimental: ref: dd6b54aaedc470ecd8ed9aa2bc5e6b86334c90ff perl-Data-Dumper: ref: 8e85cc7e6166838184b034d875759a39df4d10d3 perl-ExtUtils-ParseXS: ref: c84346769c6a5009890661786a061af1e06d32dd perl-Text-Tabs+Wrap: ref: 84d9073a2276ee2310cfc7e633c08e271c2f2319 perl-Pod-Perldoc: ref: c582b2f1fb814afe692c9ad44e3ac656505b5183 perl-Devel-PPPort: ref: 17c87af74208a53d3202030ad52862fd376123fc perl-CPAN-Meta-YAML: ref: 04a0e2e11487241ed251223755f1abe43bbe392a perl-Pod-Usage: ref: 98983d9f8b961510acff3a1190c7ea62d447699f perl-Fedora-VSP: ref: 90425acf3b0601d4feb86e0339f0c0efdd0435ae perl-CPAN-Meta: ref: f8259dccb36b9a47dc6bad88847c3fcd3563a196 perl-File-Path: ref: ac6856f118e7aa9a3a709c6202ab06494ecdd9b3 perl-generators: ref: 3517fe526a3f0bb16c097eecd05bfe9dfb94c42e perl-Digest: ref: b3f866352aea430935df7f2f0afaaf3cced7d214 perl-Perl-OSType: ref: 7191911473475122ff950ed36748133d8b2f968b perl-Pod-Simple: ref: 05a654f26321267554e75398eb19f704b4b97e17 perl-Sub-Install: ref: f3365c2a0b610eb21f6c1c786958c0e8ba08a47c perl-PerlIO-via-QuotedPrint: ref: 7d17de12fac09e63e1c14ed17229c6d23e923830 perl-HTTP-Tiny: ref: ccd7e054fc273dbfab16202a35f8fd73219b27c7 perl-Text-Template: ref: c3ff74620de07ec5a20b398981cfe60bc23b7533 perl-Pod-Parser: ref: 13b1e60337a84241ed263e3a62af46005bec3b8c perl-Pod-Escapes: ref: b86907d1d42dbd25c327e34b09b061f0a3f96d8a perl-Package-Generator: ref: 8a4118f2e4299109b3a7e6e0dea5ee7424e632bf perl-Sys-Syslog: ref: b83dcfb81b92c0617bee60d8ac89d1d228b88d8e perl-Archive-Tar: ref: 1713c34fd47329b8bd3c237822a2a7de75266654 perl-Time-Local: ref: 12fcdce59f0b8fd7daeb1b4088a3c7966cc6a302 perl-perlfaq: ref: ab3baf6a6ad945423be4696bb7ac0481ce8e9076 perl-JSON-PP: ref: 02d427bafed752ddfd755e1cfcd71c4daaa7b336 perl-Term-ANSIColor: ref: 7e942843d7f43f5535e55f7709943e210743f4fe perl-MRO-Compat: ref: 7b9d4772b76353d755f44acc9a686e9566a1a4b7 perl-Locale-Codes: ref: d7b98d549b08417aaef3c02cd0314e0cda13dddb perl-Test-Harness: ref: 65288c532917fea41328a20520e0755f6eb18463 perl-Sub-Exporter: ref: 34cd68b9ccfbae47690795a40a14a236ff0b2319 perl-Socket: ref: 20b784e3737e5842c973bd31f1735b67e77b050f perl-Module-CoreList: ref: 6e295ecf1e1dd6a348563ff1563a5f4c53001e71 perl-Carp: ref: b853f44fd4ed76815057dbec21b16f8069731630 perl-Filter-Simple: ref: 08e79709ade8905bc3212d2c7dbb1d168d578dba perl-Pod-Checker: ref: dd7b179ffb95412b1f28d3b825d87132f391821e perl-Compress-Raw-Bzip2: ref: 2a51171531415b788d4bc6cdd05a823fb4b831b5 perl-DB_File: ref: cb750cc628fdf540662b6694fce548ebd4aceff7 perl-Filter: ref: 78296ad909c75c445e4c43526e3ae57f25de7c34 perl-inc-latest: ref: b94b9e6f144d6ce856e827a2cb9c16c42cce56b5 perl-Params-Util: ref: a69abfa9df18bb76b6ccb98caa103795abc5d083 perl-Module-Load-Conditional: ref: 532fb21fdf6ff39b29abaccbdc4a1f87941521f2 perl-ExtUtils-CBuilder: ref: 4e5e482495a977c28396e2d1149def8dcb12e15f perl-Data-Section: ref: ce79e1d99123d4220543d1eb2d2806673277cad4 perl-Scalar-List-Utils: ref: c0ea69a001e7bb2a50a9c122dcc5ce792125f6e4 perl-Text-ParseWords: ref: 809c9bd7181b286d5e14e80a73f6ea50ac3b62b3 perl-Encode: ref: 5417f768a229062a55dde8f25b5b9aac039f96e1 perl-Module-Build: ref: a9f6bbfbfc8303db7b57cbea35e53de61a46a165 perl-Thread-Queue: ref: 8c85fbf927199c852e95b3fed93ff28c67b3adaa perl-Exporter: ref: 68f93042fb090750ccc7022bd957fa12ff184ecb perl-Software-License: ref: dbee7688f08ab815650fd845122a8ee8cfb0294c perl-Digest-SHA: ref: e2e8e4441dcace400b4340f2269b218a949234a2 perl-File-Temp: ref: 75a5d0eb68e5d261762dbb20412efa17dfeb6ab3 perl-URI: ref: 8696c54987665ac968cb66d98b69e49a37a89b52 perl-Data-OptList: ref: 55696a188230a0b16e32bc0cc6183cc0683753e3 perl-ExtUtils-Install: ref: 5eb9021663b033a695802e5d960795c1b338f1d1 perl-MIME-Base64: ref: c099afc6b1d7eec124f46bea88b86a2edd0f7b56 perl-Test-Simple: ref: 96c4c3b6c0172748a9a9c95fb2c1fefc9f73ee04 perl-File-Which: ref: 0c9cbe3a1d01d42035314f8d5527e6f505142cab perl-CPAN: ref: c91f221d2bbde2992152786a94b3da8899d7a628 perl-Text-Glob: ref: b19ed6fe9d0ff70870939d2bfe33e2bd059b732a perl-Module-Load: ref: 4f363f0c7d356591f33a22a930f4501167b01053 perl-IO-Socket-IP: ref: 1a65c1170f6582ad9ece8fe9c76c540e18cd3264 perl-parent: ref: c3649d1868f869883423867076131c1604fd4467 dependencies: - buildrequires: platform: [f29] requires: platform: [f29] references: community: https://docs.pagure.org/modularity/ documentation: https://github.com/modularity-modules/perl tracker: https://github.com/modularity-modules/perl/issues profiles: default: description: Interpreter and all Perl modules bundled within upstream Perl. rpms: - perl minimal: description: Only the interpreter as a standalone executable. rpms: - perl-interpreter api: rpms: - perl - perl-Archive-Tar - perl-Attribute-Handlers - perl-B-Debug - perl-CPAN - perl-CPAN-Meta - perl-CPAN-Meta-Requirements - perl-CPAN-Meta-YAML - perl-Carp - perl-Compress-Raw-Bzip2 - perl-Compress-Raw-Zlib - perl-Config-Perl-V - perl-DB_File - perl-Data-Dumper - perl-Devel-PPPort - perl-Devel-Peek - perl-Devel-SelfStubber - perl-Digest - perl-Digest-MD5 - perl-Digest-SHA - perl-Encode - perl-Encode-devel - perl-Env - perl-Errno - perl-Exporter - perl-ExtUtils-CBuilder - perl-ExtUtils-Command - perl-ExtUtils-Embed - perl-ExtUtils-Install - perl-ExtUtils-MM-Utils - perl-ExtUtils-MakeMaker - perl-ExtUtils-Manifest - perl-ExtUtils-Miniperl - perl-ExtUtils-ParseXS - perl-File-Fetch - perl-File-Path - perl-File-Temp - perl-Filter - perl-Filter-Simple - perl-Getopt-Long - perl-HTTP-Tiny - perl-IO - perl-IO-Compress - perl-IO-Socket-IP - perl-IO-Zlib - perl-IPC-Cmd - perl-IPC-SysV - perl-JSON-PP - perl-Locale-Codes - perl-Locale-Maketext - perl-Locale-Maketext-Simple - perl-MIME-Base64 - perl-Math-BigInt - perl-Math-BigInt-FastCalc - perl-Math-BigRat - perl-Math-Complex - perl-Memoize - perl-Module-CoreList - perl-Module-CoreList-tools - perl-Module-Load - perl-Module-Load-Conditional - perl-Module-Loaded - perl-Module-Metadata - perl-Net-Ping - perl-Params-Check - perl-PathTools - perl-Perl-OSType - perl-PerlIO-via-QuotedPrint - perl-Pod-Checker - perl-Pod-Escapes - perl-Pod-Html - perl-Pod-Parser - perl-Pod-Perldoc - perl-Pod-Simple - perl-Pod-Usage - perl-Scalar-List-Utils - perl-SelfLoader - perl-Socket - perl-Storable - perl-Sys-Syslog - perl-Term-ANSIColor - perl-Term-Cap - perl-Test - perl-Test-Harness - perl-Test-Simple - perl-Text-Balanced - perl-Text-ParseWords - perl-Text-Tabs+Wrap - perl-Thread-Queue - perl-Time-HiRes - perl-Time-Local - perl-Time-Piece - perl-Unicode-Collate - perl-Unicode-Normalize - perl-autodie - perl-bignum - perl-constant - perl-devel - perl-encoding - perl-experimental - perl-generators - perl-interpreter - perl-libnet - perl-libnetcfg - perl-libs - perl-macros - perl-open - perl-parent - perl-perlfaq - perl-podlators - perl-tests - perl-threads - perl-threads-shared - perl-utils - perl-version buildopts: rpms: macros: | %_with_perl_enables_groff 1 %_without_perl_enables_syslog_test 1 %_with_perl_enables_systemtap 1 %_without_perl_enables_tcsh 1 %_without_perl_Compress_Bzip2_enables_optional_test 1 %_without_perl_CPAN_Meta_Requirements_enables_optional_test 1 %_without_perl_IPC_System_Simple_enables_optional_test 1 %_without_perl_LWP_MediaTypes_enables_mailcap 1 %_without_perl_Module_Build_enables_optional_test 1 %_without_perl_Perl_OSType_enables_optional_test 1 %_without_perl_Pod_Perldoc_enables_tk_test 1 %_without_perl_Software_License_enables_optional_test 1 %_without_perl_Sys_Syslog_enables_optional_test 1 %_without_perl_Test_Harness_enables_optional_test 1 %_without_perl_Test_Simple_enables_optional_test 1 %_without_perl_URI_enables_Business_ISBN 1 components: rpms: perl: rationale: The Perl interpreter. repository: git://pkgs.fedoraproject.org/rpms/perl cache: http://pkgs.fedoraproject.org/repo/pkgs/perl ref: f28 perl-Algorithm-Diff: rationale: A run-time dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-Algorithm-Diff cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-Algorithm-Diff ref: f28 perl-Archive-Tar: rationale: Core Perl API. repository: git://pkgs.fedoraproject.org/rpms/perl-Archive-Tar cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-Archive-Tar ref: f28 perl-Archive-Zip: rationale: A run-time dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-Archive-Zip cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-Archive-Zip ref: f28 perl-B-Debug: rationale: Core Perl API. repository: git://pkgs.fedoraproject.org/rpms/perl-B-Debug cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-B-Debug ref: f28 perl-CPAN: rationale: Core Perl API. repository: git://pkgs.fedoraproject.org/rpms/perl-CPAN cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-CPAN ref: f28 perl-CPAN-Meta: rationale: Core Perl API. repository: git://pkgs.fedoraproject.org/rpms/perl-CPAN-Meta cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-CPAN-Meta ref: f28 perl-CPAN-Meta-Requirements: rationale: Core Perl API. repository: git://pkgs.fedoraproject.org/rpms/perl-CPAN-Meta-Requirements cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-CPAN-Meta-Requirements ref: f28 perl-CPAN-Meta-YAML: rationale: Core Perl API. repository: git://pkgs.fedoraproject.org/rpms/perl-CPAN-Meta-YAML cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-CPAN-Meta-YAML ref: f28 perl-Carp: rationale: Core Perl API. repository: git://pkgs.fedoraproject.org/rpms/perl-Carp cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-Carp ref: f28 perl-Compress-Bzip2: rationale: A run-time dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-Compress-Bzip2 cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-Compress-Bzip2 ref: f28 perl-Compress-Raw-Bzip2: rationale: Core Perl API. repository: git://pkgs.fedoraproject.org/rpms/perl-Compress-Raw-Bzip2 cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-Compress-Raw-Bzip2 ref: f28 perl-Compress-Raw-Zlib: rationale: Core Perl API. repository: git://pkgs.fedoraproject.org/rpms/perl-Compress-Raw-Zlib cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-Compress-Raw-Zlib ref: f28 perl-Config-Perl-V: rationale: Core Perl API. repository: git://pkgs.fedoraproject.org/rpms/perl-Config-Perl-V cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-Config-Perl-V ref: f28 perl-DB_File: rationale: Core Perl API. repository: git://pkgs.fedoraproject.org/rpms/perl-DB_File cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-DB_File ref: f28 perl-Data-Dumper: rationale: Core Perl API. repository: git://pkgs.fedoraproject.org/rpms/perl-Data-Dumper cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-Data-Dumper ref: f28 perl-Data-OptList: rationale: A run-time dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-Data-OptList cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-Data-OptList ref: f28 perl-Data-Section: rationale: A run-time dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-Data-Section cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-Data-Section ref: f28 perl-Devel-PPPort: rationale: Core Perl API. repository: git://pkgs.fedoraproject.org/rpms/perl-Devel-PPPort cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-Devel-PPPort ref: f28 perl-Devel-Size: rationale: A run-time dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-Devel-Size cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-Devel-Size ref: f28 perl-Digest: rationale: Core Perl API. repository: git://pkgs.fedoraproject.org/rpms/perl-Digest cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-Digest ref: f28 perl-Digest-MD5: rationale: Core Perl API. repository: git://pkgs.fedoraproject.org/rpms/perl-Digest-MD5 cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-Digest-MD5 ref: f28 perl-Digest-SHA: rationale: Core Perl API. repository: git://pkgs.fedoraproject.org/rpms/perl-Digest-SHA cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-Digest-SHA ref: f28 perl-Encode: rationale: Core Perl API. repository: git://pkgs.fedoraproject.org/rpms/perl-Encode cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-Encode ref: f28 perl-Env: rationale: Core Perl API. repository: git://pkgs.fedoraproject.org/rpms/perl-Env cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-Env ref: f28 perl-Exporter: rationale: Core Perl API. repository: git://pkgs.fedoraproject.org/rpms/perl-Exporter cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-Exporter ref: f28 perl-ExtUtils-CBuilder: rationale: Core Perl API. repository: git://pkgs.fedoraproject.org/rpms/perl-ExtUtils-CBuilder cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-ExtUtils-CBuilder ref: f28 perl-ExtUtils-Install: rationale: Core Perl API. repository: git://pkgs.fedoraproject.org/rpms/perl-ExtUtils-Install cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-ExtUtils-Install ref: f28 perl-ExtUtils-MakeMaker: rationale: Core Perl API. repository: git://pkgs.fedoraproject.org/rpms/perl-ExtUtils-MakeMaker cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-ExtUtils-MakeMaker ref: f28 perl-ExtUtils-Manifest: rationale: Core Perl API. repository: git://pkgs.fedoraproject.org/rpms/perl-ExtUtils-Manifest cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-ExtUtils-Manifest ref: f28 perl-ExtUtils-ParseXS: rationale: Core Perl API. repository: git://pkgs.fedoraproject.org/rpms/perl-ExtUtils-ParseXS cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-ExtUtils-ParseXS ref: f28 perl-Fedora-VSP: rationale: A run-time dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-Fedora-VSP cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-Fedora-VSP ref: f28 perl-File-Fetch: rationale: Core Perl API. repository: git://pkgs.fedoraproject.org/rpms/perl-File-Fetch cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-File-Fetch ref: f28 perl-File-HomeDir: rationale: A run-time dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-File-HomeDir cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-File-HomeDir ref: f28 perl-File-Path: rationale: Core Perl API. repository: git://pkgs.fedoraproject.org/rpms/perl-File-Path cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-File-Path ref: f28 perl-File-Temp: rationale: Core Perl API. repository: git://pkgs.fedoraproject.org/rpms/perl-File-Temp cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-File-Temp ref: f28 perl-File-Which: rationale: A run-time dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-File-Which cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-File-Which ref: f28 perl-Filter: rationale: Core Perl API. repository: git://pkgs.fedoraproject.org/rpms/perl-Filter cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-Filter ref: f28 perl-Filter-Simple: rationale: Core Perl API. repository: git://pkgs.fedoraproject.org/rpms/perl-Filter-Simple cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-Filter-Simple ref: f28 perl-Getopt-Long: rationale: Core Perl API. repository: git://pkgs.fedoraproject.org/rpms/perl-Getopt-Long cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-Getopt-Long ref: f28 perl-HTTP-Tiny: rationale: Core Perl API. repository: git://pkgs.fedoraproject.org/rpms/perl-HTTP-Tiny cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-HTTP-Tiny ref: f28 perl-IO-Compress: rationale: Core Perl API. repository: git://pkgs.fedoraproject.org/rpms/perl-IO-Compress cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-IO-Compress ref: f28 perl-IO-Socket-IP: rationale: Core Perl API. repository: git://pkgs.fedoraproject.org/rpms/perl-IO-Socket-IP cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-IO-Socket-IP ref: f28 perl-IPC-Cmd: rationale: Core Perl API. repository: git://pkgs.fedoraproject.org/rpms/perl-IPC-Cmd cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-IPC-Cmd ref: f28 perl-IPC-SysV: rationale: Core Perl API. repository: git://pkgs.fedoraproject.org/rpms/perl-IPC-SysV cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-IPC-SysV ref: f28 perl-IPC-System-Simple: rationale: A run-time dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-IPC-System-Simple cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-IPC-System-Simple ref: f28 perl-JSON-PP: rationale: Core Perl API. repository: git://pkgs.fedoraproject.org/rpms/perl-JSON-PP cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-JSON-PP ref: f28 perl-Locale-Codes: rationale: Core Perl API. repository: git://pkgs.fedoraproject.org/rpms/perl-Locale-Codes cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-Locale-Codes ref: f28 perl-Locale-Maketext: rationale: Core Perl API. repository: git://pkgs.fedoraproject.org/rpms/perl-Locale-Maketext cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-Locale-Maketext ref: f28 perl-MIME-Base64: rationale: Core Perl API. repository: git://pkgs.fedoraproject.org/rpms/perl-MIME-Base64 cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-MIME-Base64 ref: f28 perl-MRO-Compat: rationale: A run-time dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-MRO-Compat cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-MRO-Compat ref: f28 perl-Math-BigInt: rationale: Core Perl API. repository: git://pkgs.fedoraproject.org/rpms/perl-Math-BigInt cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-Math-BigInt ref: f28 perl-Math-BigInt-FastCalc: rationale: Core Perl API. repository: git://pkgs.fedoraproject.org/rpms/perl-Math-BigInt-FastCalc cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-Math-BigInt-FastCalc ref: f28 perl-Math-BigRat: rationale: Core Perl API. repository: git://pkgs.fedoraproject.org/rpms/perl-Math-BigRat cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-Math-BigRat ref: f28 perl-Module-Build: rationale: A run-time dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-Module-Build cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-Module-Build ref: f28 perl-Module-CoreList: rationale: Core Perl API. repository: git://pkgs.fedoraproject.org/rpms/perl-Module-CoreList cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-Module-CoreList ref: f28 perl-Module-Load: rationale: Core Perl API. repository: git://pkgs.fedoraproject.org/rpms/perl-Module-Load cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-Module-Load ref: f28 perl-Module-Load-Conditional: rationale: Core Perl API. repository: git://pkgs.fedoraproject.org/rpms/perl-Module-Load-Conditional cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-Module-Load-Conditional ref: f28 perl-Module-Metadata: rationale: Core Perl API. repository: git://pkgs.fedoraproject.org/rpms/perl-Module-Metadata cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-Module-Metadata ref: f28 perl-Package-Generator: rationale: A run-time dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-Package-Generator cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-Package-Generator ref: f28 perl-Params-Check: rationale: Core Perl API. repository: git://pkgs.fedoraproject.org/rpms/perl-Params-Check cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-Params-Check ref: f28 perl-Params-Util: rationale: A run-time dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-Params-Util cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-Params-Util ref: f28 perl-PathTools: rationale: Core Perl API. repository: git://pkgs.fedoraproject.org/rpms/perl-PathTools cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-PathTools ref: f28 perl-Perl-OSType: rationale: Core Perl API. repository: git://pkgs.fedoraproject.org/rpms/perl-Perl-OSType cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-Perl-OSType ref: f28 perl-PerlIO-via-QuotedPrint: rationale: Core Perl API. repository: git://pkgs.fedoraproject.org/rpms/perl-PerlIO-via-QuotedPrint cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-PerlIO-via-QuotedPrint ref: f28 perl-Pod-Checker: rationale: Core Perl API. repository: git://pkgs.fedoraproject.org/rpms/perl-Pod-Checker cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-Pod-Checker ref: f28 perl-Pod-Escapes: rationale: Core Perl API. repository: git://pkgs.fedoraproject.org/rpms/perl-Pod-Escapes cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-Pod-Escapes ref: f28 perl-Pod-Parser: rationale: Core Perl API. repository: git://pkgs.fedoraproject.org/rpms/perl-Pod-Parser cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-Pod-Parser ref: f28 perl-Pod-Perldoc: rationale: Core Perl API. repository: git://pkgs.fedoraproject.org/rpms/perl-Pod-Perldoc cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-Pod-Perldoc ref: f28 perl-Pod-Simple: rationale: Core Perl API. repository: git://pkgs.fedoraproject.org/rpms/perl-Pod-Simple cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-Pod-Simple ref: f28 perl-Pod-Usage: rationale: Core Perl API. repository: git://pkgs.fedoraproject.org/rpms/perl-Pod-Usage cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-Pod-Usage ref: f28 perl-Scalar-List-Utils: rationale: Core Perl API. repository: git://pkgs.fedoraproject.org/rpms/perl-Scalar-List-Utils cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-Scalar-List-Utils ref: f28 perl-Socket: rationale: Core Perl API. repository: git://pkgs.fedoraproject.org/rpms/perl-Socket cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-Socket ref: f28 perl-Software-License: rationale: A run-time dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-Software-License cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-Software-License ref: f28 perl-Storable: rationale: Core Perl API. repository: git://pkgs.fedoraproject.org/rpms/perl-Storable cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-Storable ref: f28 perl-Sub-Exporter: rationale: A run-time dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-Sub-Exporter cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-Sub-Exporter ref: f28 perl-Sub-Install: rationale: A run-time dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-Sub-Install cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-Sub-Install ref: f28 perl-Sys-Syslog: rationale: Core Perl API. repository: git://pkgs.fedoraproject.org/rpms/perl-Sys-Syslog cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-Sys-Syslog ref: f28 perl-Term-ANSIColor: rationale: Core Perl API. repository: git://pkgs.fedoraproject.org/rpms/perl-Term-ANSIColor cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-Term-ANSIColor ref: f28 perl-Term-Cap: rationale: Core Perl API. repository: git://pkgs.fedoraproject.org/rpms/perl-Term-Cap cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-Term-Cap ref: f28 perl-Test-Harness: rationale: Core Perl API. repository: git://pkgs.fedoraproject.org/rpms/perl-Test-Harness cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-Test-Harness ref: f28 perl-Test-Simple: rationale: Core Perl API. repository: git://pkgs.fedoraproject.org/rpms/perl-Test-Simple cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-Test-Simple ref: f28 perl-Text-Balanced: rationale: Core Perl API. repository: git://pkgs.fedoraproject.org/rpms/perl-Text-Balanced cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-Text-Balanced ref: f28 perl-Text-Diff: rationale: A run-time dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-Text-Diff cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-Text-Diff ref: f28 perl-Text-Glob: rationale: A run-time dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-Text-Glob cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-Text-Glob ref: f28 perl-Text-ParseWords: rationale: Core Perl API. repository: git://pkgs.fedoraproject.org/rpms/perl-Text-ParseWords cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-Text-ParseWords ref: f28 perl-Text-Tabs+Wrap: rationale: Core Perl API. repository: git://pkgs.fedoraproject.org/rpms/perl-Text-Tabs+Wrap cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-Text-Tabs+Wrap ref: f28 perl-Text-Template: rationale: A run-time dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-Text-Template cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-Text-Template ref: f28 perl-Thread-Queue: rationale: Core Perl API. repository: git://pkgs.fedoraproject.org/rpms/perl-Thread-Queue cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-Thread-Queue ref: f28 perl-Time-HiRes: rationale: Core Perl API. repository: git://pkgs.fedoraproject.org/rpms/perl-Time-HiRes cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-Time-HiRes ref: f28 perl-Time-Local: rationale: Core Perl API. repository: git://pkgs.fedoraproject.org/rpms/perl-Time-Local cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-Time-Local ref: f28 perl-URI: rationale: A run-time dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-URI cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-URI ref: f28 perl-Unicode-Collate: rationale: Core Perl API. repository: git://pkgs.fedoraproject.org/rpms/perl-Unicode-Collate cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-Unicode-Collate ref: f28 perl-Unicode-Normalize: rationale: Core Perl API. repository: git://pkgs.fedoraproject.org/rpms/perl-Unicode-Normalize cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-Unicode-Normalize ref: f28 perl-autodie: rationale: Core Perl API. repository: git://pkgs.fedoraproject.org/rpms/perl-autodie cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-autodie ref: f28 perl-bignum: rationale: Core Perl API. repository: git://pkgs.fedoraproject.org/rpms/perl-bignum cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-bignum ref: f28 perl-constant: rationale: Core Perl API. repository: git://pkgs.fedoraproject.org/rpms/perl-constant cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-constant ref: f28 perl-experimental: rationale: Core Perl API. repository: git://pkgs.fedoraproject.org/rpms/perl-experimental cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-experimental ref: f28 perl-generators: rationale: RPM dependency generator. repository: git://pkgs.fedoraproject.org/rpms/perl-generators cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-generators ref: f28 perl-inc-latest: rationale: A run-time dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-inc-latest cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-inc-latest ref: f28 perl-libnet: rationale: Core Perl API. repository: git://pkgs.fedoraproject.org/rpms/perl-libnet cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-libnet ref: f28 perl-local-lib: rationale: A run-time dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-local-lib cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-local-lib ref: f28 perl-parent: rationale: Core Perl API. repository: git://pkgs.fedoraproject.org/rpms/perl-parent cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-parent ref: f28 perl-perlfaq: rationale: Core Perl API. repository: git://pkgs.fedoraproject.org/rpms/perl-perlfaq cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-perlfaq ref: f28 perl-podlators: rationale: Core Perl API. repository: git://pkgs.fedoraproject.org/rpms/perl-podlators cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-podlators ref: f28 perl-threads: rationale: Core Perl API. repository: git://pkgs.fedoraproject.org/rpms/perl-threads cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-threads ref: f28 perl-threads-shared: rationale: Core Perl API. repository: git://pkgs.fedoraproject.org/rpms/perl-threads-shared cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-threads-shared ref: f28 perl-version: rationale: Core Perl API. repository: git://pkgs.fedoraproject.org/rpms/perl-version cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-version ref: f28 artifacts: rpms: - perl-4:5.26.2-410.module_1681+b405d8e2.x86_64 - perl-Algorithm-Diff-0:1.1903-9.module_1681+b405d8e2.noarch - perl-Archive-Tar-0:2.26-6.module_1681+b405d8e2.noarch - perl-Archive-Zip-0:1.60-2.module_1681+b405d8e2.noarch - perl-Attribute-Handlers-0:0.99-410.module_1681+b405d8e2.noarch - perl-B-Debug-0:1.26-2.module_1681+b405d8e2.noarch - perl-CPAN-0:2.18-397.module_1681+b405d8e2.noarch - perl-CPAN-Meta-0:2.150010-396.module_1681+b405d8e2.noarch - perl-CPAN-Meta-Requirements-0:2.140-396.module_1681+b405d8e2.noarch - perl-CPAN-Meta-YAML-0:0.018-397.module_1681+b405d8e2.noarch - perl-Carp-0:1.42-395.module_1681+b405d8e2.noarch - perl-Compress-Bzip2-0:2.26-6.module_1681+b405d8e2.x86_64 - perl-Compress-Raw-Bzip2-0:2.081-1.module_1681+b405d8e2.x86_64 - perl-Compress-Raw-Zlib-0:2.081-1.module_1681+b405d8e2.x86_64 - perl-Config-Perl-V-0:0.29-2.module_1681+b405d8e2.noarch - perl-DB_File-0:1.841-1.module_1681+b405d8e2.x86_64 - perl-Data-Dumper-0:2.167-399.module_1681+b405d8e2.x86_64 - perl-Data-OptList-0:0.110-6.module_1681+b405d8e2.noarch - perl-Data-Section-0:0.200007-3.module_1681+b405d8e2.noarch - perl-Devel-PPPort-0:3.36-5.module_1681+b405d8e2.x86_64 - perl-Devel-Peek-0:1.26-410.module_1681+b405d8e2.x86_64 - perl-Devel-SelfStubber-0:1.06-410.module_1681+b405d8e2.noarch - perl-Devel-Size-0:0.81-2.module_1681+b405d8e2.x86_64 - perl-Digest-0:1.17-395.module_1681+b405d8e2.noarch - perl-Digest-MD5-0:2.55-396.module_1681+b405d8e2.x86_64 - perl-Digest-SHA-1:6.01-2.module_1681+b405d8e2.x86_64 - perl-Encode-4:2.97-3.module_1681+b405d8e2.x86_64 - perl-Encode-devel-4:2.97-3.module_1681+b405d8e2.x86_64 - perl-Env-0:1.04-395.module_1681+b405d8e2.noarch - perl-Errno-0:1.28-410.module_1681+b405d8e2.x86_64 - perl-Exporter-0:5.72-396.module_1681+b405d8e2.noarch - perl-ExtUtils-CBuilder-1:0.280230-2.module_1681+b405d8e2.noarch - perl-ExtUtils-Command-1:7.34-1.module_1681+b405d8e2.noarch - perl-ExtUtils-Embed-0:1.34-410.module_1681+b405d8e2.noarch - perl-ExtUtils-Install-0:2.14-4.module_1681+b405d8e2.noarch - perl-ExtUtils-MM-Utils-1:7.34-1.module_1681+b405d8e2.noarch - perl-ExtUtils-MakeMaker-1:7.34-1.module_1681+b405d8e2.noarch - perl-ExtUtils-Manifest-0:1.70-395.module_1681+b405d8e2.noarch - perl-ExtUtils-Miniperl-0:1.06-410.module_1681+b405d8e2.noarch - perl-ExtUtils-ParseXS-1:3.35-2.module_1681+b405d8e2.noarch - perl-Fedora-VSP-0:0.001-9.module_1681+b405d8e2.noarch - perl-File-Fetch-0:0.56-2.module_1681+b405d8e2.noarch - perl-File-HomeDir-0:1.002-4.module_1681+b405d8e2.noarch - perl-File-Path-0:2.15-2.module_1681+b405d8e2.noarch - perl-File-Temp-0:0.230.400-396.module_1681+b405d8e2.noarch - perl-File-Which-0:1.22-2.module_1681+b405d8e2.noarch - perl-Filter-2:1.58-2.module_1681+b405d8e2.x86_64 - perl-Filter-Simple-0:0.94-2.module_1681+b405d8e2.noarch - perl-Getopt-Long-1:2.50-4.module_1681+b405d8e2.noarch - perl-HTTP-Tiny-0:0.070-395.module_1681+b405d8e2.noarch - perl-IO-0:1.38-410.module_1681+b405d8e2.x86_64 - perl-IO-Compress-0:2.081-1.module_1681+b405d8e2.noarch - perl-IO-Socket-IP-0:0.39-5.module_1681+b405d8e2.noarch - perl-IO-Zlib-1:1.10-410.module_1681+b405d8e2.noarch - perl-IPC-Cmd-2:1.00-1.module_1681+b405d8e2.noarch - perl-IPC-SysV-0:2.07-397.module_1681+b405d8e2.x86_64 - perl-IPC-System-Simple-0:1.25-17.module_1681+b405d8e2.noarch - perl-JSON-PP-1:2.97.001-2.module_1681+b405d8e2.noarch - perl-Locale-Codes-0:3.56-1.module_1681+b405d8e2.noarch - perl-Locale-Maketext-0:1.28-396.module_1681+b405d8e2.noarch - perl-Locale-Maketext-Simple-1:0.21-410.module_1681+b405d8e2.noarch - perl-MIME-Base64-0:3.15-396.module_1681+b405d8e2.x86_64 - perl-MRO-Compat-0:0.13-4.module_1681+b405d8e2.noarch - perl-Math-BigInt-1:1.9998.11-5.module_1681+b405d8e2.noarch - perl-Math-BigInt-FastCalc-0:0.500.600-6.module_1681+b405d8e2.x86_64 - perl-Math-BigRat-0:0.2613-3.module_1681+b405d8e2.noarch - perl-Math-Complex-0:1.59-410.module_1681+b405d8e2.noarch - perl-Memoize-0:1.03-410.module_1681+b405d8e2.noarch - perl-Module-Build-2:0.42.24-5.module_1681+b405d8e2.noarch - perl-Module-CoreList-1:5.20180414-1.module_1681+b405d8e2.noarch - perl-Module-CoreList-tools-1:5.20180414-1.module_1681+b405d8e2.noarch - perl-Module-Load-1:0.32-395.module_1681+b405d8e2.noarch - perl-Module-Load-Conditional-0:0.68-395.module_1681+b405d8e2.noarch - perl-Module-Loaded-1:0.08-410.module_1681+b405d8e2.noarch - perl-Module-Metadata-0:1.000033-395.module_1681+b405d8e2.noarch - perl-Net-Ping-0:2.55-410.module_1681+b405d8e2.noarch - perl-Package-Generator-0:1.106-11.module_1681+b405d8e2.noarch - perl-Params-Check-1:0.38-395.module_1681+b405d8e2.noarch - perl-Params-Util-0:1.07-22.module_1681+b405d8e2.x86_64 - perl-PathTools-0:3.74-1.module_1681+b405d8e2.x86_64 - perl-Perl-OSType-0:1.010-396.module_1681+b405d8e2.noarch - perl-PerlIO-via-QuotedPrint-0:0.08-395.module_1681+b405d8e2.noarch - perl-Pod-Checker-4:1.73-395.module_1681+b405d8e2.noarch - perl-Pod-Escapes-1:1.07-395.module_1681+b405d8e2.noarch - perl-Pod-Html-0:1.22.02-410.module_1681+b405d8e2.noarch - perl-Pod-Parser-0:1.63-396.module_1681+b405d8e2.noarch - perl-Pod-Perldoc-0:3.28-396.module_1681+b405d8e2.noarch - perl-Pod-Simple-1:3.35-395.module_1681+b405d8e2.noarch - perl-Pod-Usage-4:1.69-395.module_1681+b405d8e2.noarch - perl-Scalar-List-Utils-3:1.49-2.module_1681+b405d8e2.x86_64 - perl-SelfLoader-0:1.23-410.module_1681+b405d8e2.noarch - perl-Socket-4:2.027-2.module_1681+b405d8e2.x86_64 - perl-Software-License-0:0.103013-2.module_1681+b405d8e2.noarch - perl-Storable-1:2.62-396.module_1681+b405d8e2.x86_64 - perl-Sub-Exporter-0:0.987-15.module_1681+b405d8e2.noarch - perl-Sub-Install-0:0.928-14.module_1681+b405d8e2.noarch - perl-Sys-Syslog-0:0.35-397.module_1681+b405d8e2.x86_64 - perl-Term-ANSIColor-0:4.06-396.module_1681+b405d8e2.noarch - perl-Term-Cap-0:1.17-395.module_1681+b405d8e2.noarch - perl-Test-0:1.30-410.module_1681+b405d8e2.noarch - perl-Test-Harness-1:3.42-1.module_1681+b405d8e2.noarch - perl-Test-Simple-1:1.302135-1.module_1681+b405d8e2.noarch - perl-Text-Balanced-0:2.03-395.module_1681+b405d8e2.noarch - perl-Text-Diff-0:1.45-2.module_1681+b405d8e2.noarch - perl-Text-Glob-0:0.11-4.module_1681+b405d8e2.noarch - perl-Text-ParseWords-0:3.30-395.module_1681+b405d8e2.noarch - perl-Text-Tabs+Wrap-0:2013.0523-395.module_1681+b405d8e2.noarch - perl-Text-Template-0:1.51-1.module_1681+b405d8e2.noarch - perl-Thread-Queue-0:3.12-395.module_1681+b405d8e2.noarch - perl-Time-HiRes-0:1.9758-1.module_1681+b405d8e2.x86_64 - perl-Time-Local-1:1.250-395.module_1681+b405d8e2.noarch - perl-Time-Piece-0:1.31-410.module_1681+b405d8e2.x86_64 - perl-URI-0:1.73-2.module_1681+b405d8e2.noarch - perl-Unicode-Collate-0:1.25-2.module_1681+b405d8e2.x86_64 - perl-Unicode-Normalize-0:1.25-396.module_1681+b405d8e2.x86_64 - perl-autodie-0:2.29-396.module_1681+b405d8e2.noarch - perl-bignum-0:0.49-2.module_1681+b405d8e2.noarch - perl-constant-0:1.33-396.module_1681+b405d8e2.noarch - perl-devel-4:5.26.2-410.module_1681+b405d8e2.x86_64 - perl-encoding-4:2.22-3.module_1681+b405d8e2.x86_64 - perl-experimental-0:0.019-2.module_1681+b405d8e2.noarch - perl-generators-0:1.10-7.module_1681+b405d8e2.noarch - perl-homedir-0:2.000024-2.module_1681+b405d8e2.noarch - perl-inc-latest-2:0.500-9.module_1681+b405d8e2.noarch - perl-interpreter-4:5.26.2-410.module_1681+b405d8e2.x86_64 - perl-libnet-0:3.11-3.module_1681+b405d8e2.noarch - perl-libnetcfg-4:5.26.2-410.module_1681+b405d8e2.noarch - perl-libs-4:5.26.2-410.module_1681+b405d8e2.x86_64 - perl-local-lib-0:2.000024-2.module_1681+b405d8e2.noarch - perl-macros-4:5.26.2-410.module_1681+b405d8e2.x86_64 - perl-open-0:1.11-410.module_1681+b405d8e2.noarch - perl-parent-1:0.236-395.module_1681+b405d8e2.noarch - perl-perlfaq-0:5.021011-395.module_1681+b405d8e2.noarch - perl-podlators-0:4.10-2.module_1681+b405d8e2.noarch - perl-tests-4:5.26.2-410.module_1681+b405d8e2.x86_64 - perl-threads-1:2.21-2.module_1681+b405d8e2.x86_64 - perl-threads-shared-0:1.58-2.module_1681+b405d8e2.x86_64 - perl-utils-0:5.26.2-410.module_1681+b405d8e2.noarch - perl-version-6:0.99.23-1.module_1681+b405d8e2.x86_64 ... --- document: modulemd version: 2 data: name: perl stream: 5.24 version: 20180418132302 context: 5d9ae238 arch: x86_64 summary: Practical Extraction and Report Language description: > Perl is a high-level programming language with roots in C, sed, awk and shell scripting. Perl is good at handling processes and files, and is especially good at handling text. Perl's hallmarks are practicality and efficiency. While it is used to do a lot of different things, Perl's most common applications are system administration utilities and web programming. license: module: - MIT content: - MIT xmd: mbs: mse: TRUE scmurl: https://src.fedoraproject.org/modules/perl.git?#99bb79ac98274ef3fe3f2784057d624e50c0cfcc commit: 99bb79ac98274ef3fe3f2784057d624e50c0cfcc buildrequires: perl-bootstrap: ref: 47f4825a1d5e2a8fd7b76583744ea8f2202c850c stream: 5.24 context: 6c81f848 version: 20180417065503 filtered_rpms: [] platform: ref: f29 stream: f29 context: 00000000 version: 4 filtered_rpms: [] rpms: perl-Text-Diff: ref: 2ee347e962b8a0e83eeecf3324062308cc1d1a2c perl-Text-Balanced: ref: c6648ff72f7b1798642f719036a677102c7ee125 perl-File-Fetch: ref: b4bf1bd8af7755b16b40a3dd67cb743bef9b1652 perl: ref: 9acafa0017b87ed96f8857fd7099787f0d24ff56 perl-Math-BigRat: ref: f45e094a3064ff01662d5e1409e87d88112a1991 perl-Math-BigInt-FastCalc: ref: 785456ac9585a8b4f7628d3bd2a0dacd5b592d09 perl-Locale-Maketext: ref: 57b31cf2d161ce97448d225af3f86c210d78ad6a perl-Algorithm-Diff: ref: f4b6c06396d4768c691a23b3b967fe6fac1e46ee perl-PathTools: ref: e643e0b6864983a2606f5bcf3ae9a34caeda4059 perl-IPC-System-Simple: ref: b899b97739ac1cebcae25357764cd3cf703e4f57 perl-CPAN-Meta-Requirements: ref: f693254160585068bd1db62ffa980963a2ef7011 perl-Compress-Bzip2: ref: 1ac091378670bfc36b3e866924ddc076cd800cf2 perl-IO-Compress: ref: 1e67f30fcc790e2d133ecd756e1b68dc1e423999 perl-threads-shared: ref: cd6fd55c5d0ce4aaf7394f4ee865d68c61e91cd1 perl-autodie: ref: 40735fb3b9a6b96b40934e72672bb1a04eb0999a perl-constant: ref: f005b65dee6a48411e2dfeb5e057dfb8a3818135 perl-bignum: ref: 74c0852bf10b97499c694d3d32f5e66a7a7d7cf3 perl-Params-Check: ref: cf2ab4714451509691e4c06f968b0cc71891a8b8 perl-Archive-Zip: ref: 948b8e44e8dc5def0baa82a96c46da5bff385086 perl-Math-BigInt: ref: 82d8ddba8d0d808a04d9d4cb579df53f65112027 perl-podlators: ref: 380d587d637c4b5fe4c1b961aa16cb698ed2a07b perl-ExtUtils-Manifest: ref: 2fd5140cb9441b0445de12b720c5459ed38e95b7 perl-Compress-Raw-Zlib: ref: ed5582bb24c481aaa0de7a33ecbf85989e0ddd8c perl-local-lib: ref: 96f72250500b509a87fe9263b81f888812ba08cf perl-libnet: ref: e6cc3a47e0776ada93c3801f06af81fb7b642d38 perl-B-Debug: ref: ec558193299b89d6babcf009bdcc18dc7fc48a4e perl-Config-Perl-V: ref: 5a2c9f1ea41e4f07e76062c9598619fed2b4dcb6 perl-threads: ref: f0b3ca4a1602b11c483d97aea130e2dea8b8f96f perl-Term-Cap: ref: 28e345f7f785aa5b60572bfa5ba2627ef8dd3033 perl-Unicode-Normalize: ref: 6875f415710668a788423fdd80ae712e0c3d3ab2 perl-Storable: ref: d76f7a7ba835789a1ca93e3c0db2fc17a9f11907 perl-IPC-SysV: ref: 6102b15b4a3e30698673109ddda94a2325123e38 perl-IPC-Cmd: ref: fc6bc3efe40775d3e63d811a65ed0cab6aa138e1 perl-Time-HiRes: ref: 17004a2568fc6de651cee58816cec8640a825d4c perl-Digest-MD5: ref: 884cdd515f0250589dd4cde8c32a9d77fc55871e perl-Getopt-Long: ref: a7414b0c7a488b9af202fff1eb6a2fb2a3ca6327 perl-Module-Metadata: ref: f583f7db4daab0a72bae86e49b549c15f5e2c905 perl-version: ref: 098155010f833f432a85cb97754e1080750ec873 perl-Devel-Size: ref: 982a54ab4a98fba5339f850fa9cc30af93703d2f perl-Unicode-Collate: ref: c6bc5268528635406bf3237258e7c2969a2bdfc6 perl-Env: ref: 58ac31466f9c9824d25b13ad559622dcdd65e20a perl-ExtUtils-MakeMaker: ref: 5d9438be138d0919320b5a6e2324df05fe123d6a perl-File-HomeDir: ref: 2982c5d9f538d8c640c3ca8fee7566d68e5ea68e perl-experimental: ref: cad2845a55a98ca9565be2707c3ff48e984fd1da perl-Data-Dumper: ref: c8ea0bbaafa024bc09c7f29342f584885571eb07 perl-ExtUtils-ParseXS: ref: 9398847c09b96f2765b1a03b4b84188e28711273 perl-Text-Tabs+Wrap: ref: 90b3a77c499b10b5d34569f8b1b26327495049ea perl-Pod-Perldoc: ref: 842e567a333ccfd2b15be93f230d29414be0f581 perl-Devel-PPPort: ref: bd144f784620e5cb43ef9aea61c11d1bb7fe0503 perl-CPAN-Meta-YAML: ref: 3609aa7e2ae8ca137d9ff46de25d4b869fdb8c2b perl-Pod-Usage: ref: 9d38a4ee92dafbfdd5e8adf44810304de6bbc9e0 perl-Fedora-VSP: ref: 63312d7720e816853bd595cbcdc9d9e3cce0880b perl-CPAN-Meta: ref: 68ca8b0eed6d50eaef11c381b6d8e4754f6c2a7d perl-File-Path: ref: 5848e296d61a3de73f17016f7f37a6395ae0f402 perl-generators: ref: 87c9a690dd58beeaa573074d26fccccb089ab31b perl-Digest: ref: 6867766aaf85865d33675be774af4751b8ae9549 perl-Perl-OSType: ref: c2efc33ea89adb7c2da626cc3d436bbc69203e2b perl-Pod-Simple: ref: a0eec0341f8cc19d74f6f21f9bf38781446a0ad1 perl-Sub-Install: ref: 799f7222e97cc90f9abb7e1f02a5847d71a83cb0 perl-PerlIO-via-QuotedPrint: ref: 31eb1e0e1c723aaf09d6846b9016e4db94428700 perl-HTTP-Tiny: ref: d396ccfe1aadc5746420b06e268e04316eb62c44 perl-Text-Template: ref: 9309a484a2e8e309272c8916cf63a12e385eaaef perl-Pod-Parser: ref: efe0977afc65bae502a4ee5bc47430b4e2b6702f perl-Pod-Escapes: ref: 1ab928503d1824c54a6a32e6b5d527b389f34d05 perl-Package-Generator: ref: f78e39fa9dc3fd1474475eabcb9378375142dd70 perl-Sys-Syslog: ref: 008e476eb1f3e015ad34f302a4cad874e4aad33a perl-Archive-Tar: ref: 2bd7368d3debb90e1d87c3d44db91412fd39873c perl-Time-Local: ref: e74a3e804e77a0d704eebdede825b6d0d6cc617b perl-perlfaq: ref: 63e299c953b8f4b558fe904fc7d31763f79760f1 perl-JSON-PP: ref: 1e3fe253e7edbdc506418a38d666ed19db8ce136 perl-Term-ANSIColor: ref: 3a74f9162f818ffaa4069d74c931caef0560514b perl-MRO-Compat: ref: 13cfd3efff5d02609bf8fe0c36a9e7a9a37ca8b8 perl-Locale-Codes: ref: bd6e31d21f18e85ffe4411b0ce7238d6a974063a perl-Test-Harness: ref: 2ddba30c66331628ef273a6df6b67e2b05d76022 perl-Sub-Exporter: ref: 92259c19826f0aed436f04d886cf4e1f208ff103 perl-Socket: ref: 14bd5dedb6ff8da7d7b0f5945aa61ffa620777d1 perl-Module-CoreList: ref: 6b31db0c22a4824a2ae7c40114a8af17bcfd125b perl-Carp: ref: 84fbaf6f236f9a082ae6960bbbd160f6e75894c5 perl-Filter-Simple: ref: ca5e4217e059a7371a125419071852760d031dba perl-Pod-Checker: ref: 6c8f684a9863678be5724c2e565ba1aa62761151 perl-Compress-Raw-Bzip2: ref: b989d850d818cbaeba0c47b0d975e1afd6b34bb8 perl-DB_File: ref: d9d4b751bd8ea51672630f3beb1ecaf899de40ad perl-Filter: ref: 998996cc8b57f55172167da01155d3a7b59c1e99 perl-inc-latest: ref: 0a60ae8876d88d2eaac83b84d6d2fff8ced1b9a1 perl-Params-Util: ref: 4bfebd9e4cb2fe6a52e2ae69d5e5e74b36296f9f perl-Module-Load-Conditional: ref: bb49232617058d8af4f199db9972f04cd3eefe0d perl-ExtUtils-CBuilder: ref: 521e6f6f83dc9a5afbb517d85e637bfa69f59701 perl-Data-Section: ref: 6ed48ef1733de62cd245237e25d93ea9a827d5e6 perl-Scalar-List-Utils: ref: 7eb2ea6397b7fbeeaeacbb176bbbc453723ded1a perl-Text-ParseWords: ref: 1c120cf2934e246a59a5f37284ac8111c52fa806 perl-Encode: ref: 346cfe7ccbce4c3cc2a4739b628d8d0b7e1a4779 perl-Module-Build: ref: 2c9e4f8f3788caeaa4707f7b562f1ad39a416680 perl-Thread-Queue: ref: e0fff689fc097ecf54bac2f09e5e7bd3c4d00ef6 perl-Exporter: ref: 14c101bc77bc5119c4f75065d6f4b6edea4b502a perl-Software-License: ref: da9a11a3ad14d5a4cbfe9b52d108b672a6939d69 perl-Digest-SHA: ref: 2b4a62eaf739a7d2ce6649f3a326dbd562ed8b74 perl-File-Temp: ref: de8e0c3e7e630e6861a0c0979c5ab60227f7de8e perl-URI: ref: 28d53fda027d3a984ffa201d4494389c6b7796b0 perl-Data-OptList: ref: 9512df0280d65abfaa04d6437367705c3b19b54f perl-ExtUtils-Install: ref: 507084f8349f691d4688fe9a49e92be1711874e4 perl-MIME-Base64: ref: da62d3707ea9781efc91ba48d47ce49b2297a364 perl-Test-Simple: ref: e64b2e39f56e17d7b9046881d589c778aaf4ce8b perl-File-Which: ref: 1a2ca4a9b713f31c6f99f6dec3dafdd0a457a44f perl-CPAN: ref: 4159d449e5a66ddef70d1fe7f1d37279d4d99bc5 perl-Text-Glob: ref: 346be0660f0fc621a960467b5fa1ee656b9cd87f perl-Module-Load: ref: 3f98c8f286677f7b700f661545154e781798ef0c perl-IO-Socket-IP: ref: 4e56568b5d09ad4aefccb354183614ae5b3f6235 perl-parent: ref: f50da57010454e2279d899a57fdbc65a48edc74c dependencies: - buildrequires: platform: [f29] requires: platform: [f29] references: community: https://docs.pagure.org/modularity/ documentation: https://github.com/modularity-modules/perl tracker: https://github.com/modularity-modules/perl/issues profiles: default: rpms: - perl-core minimal: rpms: - perl api: rpms: - perl - perl-Algorithm-Diff - perl-Archive-Tar - perl-Archive-Zip - perl-Attribute-Handlers - perl-B-Debug - perl-CPAN - perl-CPAN-Meta - perl-CPAN-Meta-Requirements - perl-CPAN-Meta-YAML - perl-Carp - perl-Compress-Bzip2 - perl-Compress-Raw-Bzip2 - perl-Compress-Raw-Zlib - perl-Config-Perl-V - perl-DB_File - perl-Data-Dumper - perl-Data-OptList - perl-Data-Section - perl-Devel-PPPort - perl-Devel-Peek - perl-Devel-SelfStubber - perl-Devel-Size - perl-Digest - perl-Digest-MD5 - perl-Digest-SHA - perl-Encode - perl-Encode-devel - perl-Env - perl-Errno - perl-Exporter - perl-ExtUtils-CBuilder - perl-ExtUtils-Command - perl-ExtUtils-Embed - perl-ExtUtils-Install - perl-ExtUtils-MM-Utils - perl-ExtUtils-MakeMaker - perl-ExtUtils-Manifest - perl-ExtUtils-Miniperl - perl-ExtUtils-ParseXS - perl-Fedora-VSP - perl-File-Fetch - perl-File-HomeDir - perl-File-Path - perl-File-Temp - perl-File-Which - perl-Filter - perl-Filter-Simple - perl-Getopt-Long - perl-HTTP-Tiny - perl-IO - perl-IO-Compress - perl-IO-Socket-IP - perl-IO-Zlib - perl-IPC-Cmd - perl-IPC-SysV - perl-IPC-System-Simple - perl-JSON-PP - perl-Locale-Codes - perl-Locale-Maketext - perl-Locale-Maketext-Simple - perl-MIME-Base64 - perl-MRO-Compat - perl-Math-BigInt - perl-Math-BigInt-FastCalc - perl-Math-BigRat - perl-Math-Complex - perl-Memoize - perl-Module-Build - perl-Module-CoreList - perl-Module-CoreList-tools - perl-Module-Load - perl-Module-Load-Conditional - perl-Module-Loaded - perl-Module-Metadata - perl-Net-Ping - perl-Package-Generator - perl-Params-Check - perl-Params-Util - perl-PathTools - perl-Perl-OSType - perl-PerlIO-via-QuotedPrint - perl-Pod-Checker - perl-Pod-Escapes - perl-Pod-Html - perl-Pod-Parser - perl-Pod-Perldoc - perl-Pod-Simple - perl-Pod-Usage - perl-Scalar-List-Utils - perl-SelfLoader - perl-Socket - perl-Software-License - perl-Storable - perl-Sub-Exporter - perl-Sub-Install - perl-Sys-Syslog - perl-Term-ANSIColor - perl-Term-Cap - perl-Test - perl-Test-Harness - perl-Test-Simple - perl-Text-Balanced - perl-Text-Diff - perl-Text-Glob - perl-Text-ParseWords - perl-Text-Tabs+Wrap - perl-Text-Template - perl-Thread-Queue - perl-Time-HiRes - perl-Time-Local - perl-Time-Piece - perl-URI - perl-Unicode-Collate - perl-Unicode-Normalize - perl-autodie - perl-bignum - perl-constant - perl-devel - perl-encoding - perl-experimental - perl-generators - perl-homedir - perl-inc-latest - perl-interpreter - perl-libnet - perl-libnetcfg - perl-libs - perl-local-lib - perl-macros - perl-open - perl-parent - perl-perlfaq - perl-podlators - perl-tests - perl-threads - perl-threads-shared - perl-utils - perl-version buildopts: rpms: macros: | %_with_perl_enables_groff 1 %_without_perl_enables_syslog_test 1 %_with_perl_enables_systemtap 1 %_without_perl_enables_tcsh 1 %_without_perl_Compress_Bzip2_enables_optional_test 1 %_without_perl_CPAN_Meta_Requirements_enables_optional_test 1 %_without_perl_IPC_System_Simple_enables_optional_test 1 %_without_perl_LWP_MediaTypes_enables_mailcap 1 %_without_perl_Module_Build_enables_optional_test 1 %_without_perl_Perl_OSType_enables_optional_test 1 %_without_perl_Pod_Perldoc_enables_tk_test 1 %_without_perl_Software_License_enables_optional_test 1 %_without_perl_Sys_Syslog_enables_optional_test 1 %_without_perl_Test_Harness_enables_optional_test 1 %_without_perl_URI_enables_Business_ISBN 1 components: rpms: perl: rationale: The Perl interpreter. repository: git://pkgs.fedoraproject.org/rpms/perl cache: http://pkgs.fedoraproject.org/repo/pkgs/perl ref: f26 perl-Algorithm-Diff: rationale: A run-time dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-Algorithm-Diff cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-Algorithm-Diff ref: f26 perl-Archive-Tar: rationale: Core Perl API. repository: git://pkgs.fedoraproject.org/rpms/perl-Archive-Tar cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-Archive-Tar ref: f26 perl-Archive-Zip: rationale: A run-time dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-Archive-Zip cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-Archive-Zip ref: f26 perl-B-Debug: rationale: Core Perl API. repository: git://pkgs.fedoraproject.org/rpms/perl-B-Debug cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-B-Debug ref: f26 perl-CPAN: rationale: Core Perl API. repository: git://pkgs.fedoraproject.org/rpms/perl-CPAN cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-CPAN ref: f26 perl-CPAN-Meta: rationale: Core Perl API. repository: git://pkgs.fedoraproject.org/rpms/perl-CPAN-Meta cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-CPAN-Meta ref: f26 perl-CPAN-Meta-Requirements: rationale: Core Perl API. repository: git://pkgs.fedoraproject.org/rpms/perl-CPAN-Meta-Requirements cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-CPAN-Meta-Requirements ref: f26 perl-CPAN-Meta-YAML: rationale: Core Perl API. repository: git://pkgs.fedoraproject.org/rpms/perl-CPAN-Meta-YAML cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-CPAN-Meta-YAML ref: f26 perl-Carp: rationale: Core Perl API. repository: git://pkgs.fedoraproject.org/rpms/perl-Carp cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-Carp ref: f26 perl-Compress-Bzip2: rationale: A run-time dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-Compress-Bzip2 cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-Compress-Bzip2 ref: f26 perl-Compress-Raw-Bzip2: rationale: Core Perl API. repository: git://pkgs.fedoraproject.org/rpms/perl-Compress-Raw-Bzip2 cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-Compress-Raw-Bzip2 ref: f26 perl-Compress-Raw-Zlib: rationale: Core Perl API. repository: git://pkgs.fedoraproject.org/rpms/perl-Compress-Raw-Zlib cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-Compress-Raw-Zlib ref: f26 perl-Config-Perl-V: rationale: Core Perl API. repository: git://pkgs.fedoraproject.org/rpms/perl-Config-Perl-V cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-Config-Perl-V ref: f26 perl-DB_File: rationale: Core Perl API. repository: git://pkgs.fedoraproject.org/rpms/perl-DB_File cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-DB_File ref: f26 perl-Data-Dumper: rationale: Core Perl API. repository: git://pkgs.fedoraproject.org/rpms/perl-Data-Dumper cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-Data-Dumper ref: f26 perl-Data-OptList: rationale: A run-time dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-Data-OptList cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-Data-OptList ref: f26 perl-Data-Section: rationale: A run-time dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-Data-Section cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-Data-Section ref: f26 perl-Devel-PPPort: rationale: Core Perl API. repository: git://pkgs.fedoraproject.org/rpms/perl-Devel-PPPort cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-Devel-PPPort ref: f26 perl-Devel-Size: rationale: A run-time dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-Devel-Size cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-Devel-Size ref: f26 perl-Digest: rationale: Core Perl API. repository: git://pkgs.fedoraproject.org/rpms/perl-Digest cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-Digest ref: f26 perl-Digest-MD5: rationale: Core Perl API. repository: git://pkgs.fedoraproject.org/rpms/perl-Digest-MD5 cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-Digest-MD5 ref: f26 perl-Digest-SHA: rationale: Core Perl API. repository: git://pkgs.fedoraproject.org/rpms/perl-Digest-SHA cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-Digest-SHA ref: f26 perl-Encode: rationale: Core Perl API. repository: git://pkgs.fedoraproject.org/rpms/perl-Encode cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-Encode ref: f26 perl-Env: rationale: Core Perl API. repository: git://pkgs.fedoraproject.org/rpms/perl-Env cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-Env ref: f26 perl-Exporter: rationale: Core Perl API. repository: git://pkgs.fedoraproject.org/rpms/perl-Exporter cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-Exporter ref: f26 perl-ExtUtils-CBuilder: rationale: Core Perl API. repository: git://pkgs.fedoraproject.org/rpms/perl-ExtUtils-CBuilder cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-ExtUtils-CBuilder ref: f26 perl-ExtUtils-Install: rationale: Core Perl API. repository: git://pkgs.fedoraproject.org/rpms/perl-ExtUtils-Install cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-ExtUtils-Install ref: f26 perl-ExtUtils-MakeMaker: rationale: Core Perl API. repository: git://pkgs.fedoraproject.org/rpms/perl-ExtUtils-MakeMaker cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-ExtUtils-MakeMaker ref: f26 perl-ExtUtils-Manifest: rationale: Core Perl API. repository: git://pkgs.fedoraproject.org/rpms/perl-ExtUtils-Manifest cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-ExtUtils-Manifest ref: f26 perl-ExtUtils-ParseXS: rationale: Core Perl API. repository: git://pkgs.fedoraproject.org/rpms/perl-ExtUtils-ParseXS cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-ExtUtils-ParseXS ref: f26 perl-Fedora-VSP: rationale: RPM dependency generator. repository: git://pkgs.fedoraproject.org/rpms/perl-Fedora-VSP cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-Fedora-VSP ref: f26 perl-File-Fetch: rationale: Core Perl API. repository: git://pkgs.fedoraproject.org/rpms/perl-File-Fetch cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-File-Fetch ref: f26 perl-File-HomeDir: rationale: A run-time dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-File-HomeDir cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-File-HomeDir ref: f26 perl-File-Path: rationale: Core Perl API. repository: git://pkgs.fedoraproject.org/rpms/perl-File-Path cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-File-Path ref: f26 perl-File-Temp: rationale: Core Perl API. repository: git://pkgs.fedoraproject.org/rpms/perl-File-Temp cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-File-Temp ref: f26 perl-File-Which: rationale: A run-time dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-File-Which cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-File-Which ref: f26 perl-Filter: rationale: Core Perl API. repository: git://pkgs.fedoraproject.org/rpms/perl-Filter cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-Filter ref: f26 perl-Filter-Simple: rationale: Core Perl API. repository: git://pkgs.fedoraproject.org/rpms/perl-Filter-Simple cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-Filter-Simple ref: f26 perl-Getopt-Long: rationale: Core Perl API. repository: git://pkgs.fedoraproject.org/rpms/perl-Getopt-Long cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-Getopt-Long ref: f26 perl-HTTP-Tiny: rationale: Core Perl API. repository: git://pkgs.fedoraproject.org/rpms/perl-HTTP-Tiny cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-HTTP-Tiny ref: f26 perl-IO-Compress: rationale: Core Perl API. repository: git://pkgs.fedoraproject.org/rpms/perl-IO-Compress cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-IO-Compress ref: f26 perl-IO-Socket-IP: rationale: Core Perl API. repository: git://pkgs.fedoraproject.org/rpms/perl-IO-Socket-IP cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-IO-Socket-IP ref: f26 perl-IPC-Cmd: rationale: Core Perl API. repository: git://pkgs.fedoraproject.org/rpms/perl-IPC-Cmd cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-IPC-Cmd ref: f26 perl-IPC-SysV: rationale: Core Perl API. repository: git://pkgs.fedoraproject.org/rpms/perl-IPC-SysV cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-IPC-SysV ref: f26 perl-IPC-System-Simple: rationale: A run-time dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-IPC-System-Simple cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-IPC-System-Simple ref: f26 perl-JSON-PP: rationale: Core Perl API. repository: git://pkgs.fedoraproject.org/rpms/perl-JSON-PP cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-JSON-PP ref: f26 perl-Locale-Codes: rationale: Core Perl API. repository: git://pkgs.fedoraproject.org/rpms/perl-Locale-Codes cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-Locale-Codes ref: f26 perl-Locale-Maketext: rationale: Core Perl API. repository: git://pkgs.fedoraproject.org/rpms/perl-Locale-Maketext cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-Locale-Maketext ref: f26 perl-MIME-Base64: rationale: Core Perl API. repository: git://pkgs.fedoraproject.org/rpms/perl-MIME-Base64 cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-MIME-Base64 ref: f26 perl-MRO-Compat: rationale: A run-time dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-MRO-Compat cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-MRO-Compat ref: f26 perl-Math-BigInt: rationale: Core Perl API. repository: git://pkgs.fedoraproject.org/rpms/perl-Math-BigInt cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-Math-BigInt ref: f26 perl-Math-BigInt-FastCalc: rationale: Core Perl API. repository: git://pkgs.fedoraproject.org/rpms/perl-Math-BigInt-FastCalc cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-Math-BigInt-FastCalc ref: f26 perl-Math-BigRat: rationale: Core Perl API. repository: git://pkgs.fedoraproject.org/rpms/perl-Math-BigRat cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-Math-BigRat ref: f26 perl-Module-Build: rationale: A run-time dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-Module-Build cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-Module-Build ref: f26 perl-Module-CoreList: rationale: Core Perl API. repository: git://pkgs.fedoraproject.org/rpms/perl-Module-CoreList cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-Module-CoreList ref: f26 perl-Module-Load: rationale: Core Perl API. repository: git://pkgs.fedoraproject.org/rpms/perl-Module-Load cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-Module-Load ref: f26 perl-Module-Load-Conditional: rationale: Core Perl API. repository: git://pkgs.fedoraproject.org/rpms/perl-Module-Load-Conditional cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-Module-Load-Conditional ref: f26 perl-Module-Metadata: rationale: Core Perl API. repository: git://pkgs.fedoraproject.org/rpms/perl-Module-Metadata cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-Module-Metadata ref: f26 perl-Package-Generator: rationale: A run-time dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-Package-Generator cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-Package-Generator ref: f26 perl-Params-Check: rationale: Core Perl API. repository: git://pkgs.fedoraproject.org/rpms/perl-Params-Check cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-Params-Check ref: f26 perl-Params-Util: rationale: A run-time dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-Params-Util cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-Params-Util ref: f26 perl-PathTools: rationale: Core Perl API. repository: git://pkgs.fedoraproject.org/rpms/perl-PathTools cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-PathTools ref: f26 perl-Perl-OSType: rationale: Core Perl API. repository: git://pkgs.fedoraproject.org/rpms/perl-Perl-OSType cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-Perl-OSType ref: f26 perl-PerlIO-via-QuotedPrint: rationale: Core Perl API. repository: git://pkgs.fedoraproject.org/rpms/perl-PerlIO-via-QuotedPrint cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-PerlIO-via-QuotedPrint ref: f26 perl-Pod-Checker: rationale: Core Perl API. repository: git://pkgs.fedoraproject.org/rpms/perl-Pod-Checker cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-Pod-Checker ref: f26 perl-Pod-Escapes: rationale: Core Perl API. repository: git://pkgs.fedoraproject.org/rpms/perl-Pod-Escapes cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-Pod-Escapes ref: f26 perl-Pod-Parser: rationale: Core Perl API. repository: git://pkgs.fedoraproject.org/rpms/perl-Pod-Parser cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-Pod-Parser ref: f26 perl-Pod-Perldoc: rationale: Core Perl API. repository: git://pkgs.fedoraproject.org/rpms/perl-Pod-Perldoc cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-Pod-Perldoc ref: f26 perl-Pod-Simple: rationale: Core Perl API. repository: git://pkgs.fedoraproject.org/rpms/perl-Pod-Simple cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-Pod-Simple ref: f26 perl-Pod-Usage: rationale: Core Perl API. repository: git://pkgs.fedoraproject.org/rpms/perl-Pod-Usage cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-Pod-Usage ref: f26 perl-Scalar-List-Utils: rationale: Core Perl API. repository: git://pkgs.fedoraproject.org/rpms/perl-Scalar-List-Utils cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-Scalar-List-Utils ref: f26 perl-Socket: rationale: Core Perl API. repository: git://pkgs.fedoraproject.org/rpms/perl-Socket cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-Socket ref: f26 perl-Software-License: rationale: A run-time dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-Software-License cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-Software-License ref: f26 perl-Storable: rationale: Core Perl API. repository: git://pkgs.fedoraproject.org/rpms/perl-Storable cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-Storable ref: f26 perl-Sub-Exporter: rationale: A run-time dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-Sub-Exporter cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-Sub-Exporter ref: f26 perl-Sub-Install: rationale: A run-time dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-Sub-Install cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-Sub-Install ref: f26 perl-Sys-Syslog: rationale: Core Perl API. repository: git://pkgs.fedoraproject.org/rpms/perl-Sys-Syslog cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-Sys-Syslog ref: f26 perl-Term-ANSIColor: rationale: Core Perl API. repository: git://pkgs.fedoraproject.org/rpms/perl-Term-ANSIColor cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-Term-ANSIColor ref: f26 perl-Term-Cap: rationale: Core Perl API. repository: git://pkgs.fedoraproject.org/rpms/perl-Term-Cap cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-Term-Cap ref: f26 perl-Test-Harness: rationale: Core Perl API. repository: git://pkgs.fedoraproject.org/rpms/perl-Test-Harness cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-Test-Harness ref: f26 perl-Test-Simple: rationale: Core Perl API. repository: git://pkgs.fedoraproject.org/rpms/perl-Test-Simple cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-Test-Simple ref: f26 perl-Text-Balanced: rationale: Core Perl API. repository: git://pkgs.fedoraproject.org/rpms/perl-Text-Balanced cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-Text-Balanced ref: f26 perl-Text-Diff: rationale: A run-time dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-Text-Diff cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-Text-Diff ref: f26 perl-Text-Glob: rationale: A run-time dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-Text-Glob cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-Text-Glob ref: f26 perl-Text-ParseWords: rationale: Core Perl API. repository: git://pkgs.fedoraproject.org/rpms/perl-Text-ParseWords cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-Text-ParseWords ref: f26 perl-Text-Tabs+Wrap: rationale: Core Perl API. repository: git://pkgs.fedoraproject.org/rpms/perl-Text-Tabs+Wrap cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-Text-Tabs+Wrap ref: f26 perl-Text-Template: rationale: A run-time dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-Text-Template cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-Text-Template ref: f26 perl-Thread-Queue: rationale: Core Perl API. repository: git://pkgs.fedoraproject.org/rpms/perl-Thread-Queue cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-Thread-Queue ref: f26 perl-Time-HiRes: rationale: Core Perl API. repository: git://pkgs.fedoraproject.org/rpms/perl-Time-HiRes cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-Time-HiRes ref: f26 perl-Time-Local: rationale: Core Perl API. repository: git://pkgs.fedoraproject.org/rpms/perl-Time-Local cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-Time-Local ref: f26 perl-URI: rationale: A run-time dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-URI cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-URI ref: f26 perl-Unicode-Collate: rationale: Core Perl API. repository: git://pkgs.fedoraproject.org/rpms/perl-Unicode-Collate cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-Unicode-Collate ref: f26 perl-Unicode-Normalize: rationale: Core Perl API. repository: git://pkgs.fedoraproject.org/rpms/perl-Unicode-Normalize cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-Unicode-Normalize ref: f26 perl-autodie: rationale: Core Perl API. repository: git://pkgs.fedoraproject.org/rpms/perl-autodie cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-autodie ref: f26 perl-bignum: rationale: Core Perl API. repository: git://pkgs.fedoraproject.org/rpms/perl-bignum cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-bignum ref: f26 perl-constant: rationale: Core Perl API. repository: git://pkgs.fedoraproject.org/rpms/perl-constant cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-constant ref: f26 perl-experimental: rationale: Core Perl API. repository: git://pkgs.fedoraproject.org/rpms/perl-experimental cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-experimental ref: f26 perl-generators: rationale: RPM dependency generator. repository: git://pkgs.fedoraproject.org/rpms/perl-generators cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-generators ref: f26 perl-inc-latest: rationale: A run-time dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-inc-latest cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-inc-latest ref: f26 perl-libnet: rationale: Core Perl API. repository: git://pkgs.fedoraproject.org/rpms/perl-libnet cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-libnet ref: f26 perl-local-lib: rationale: A run-time dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-local-lib cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-local-lib ref: f26 perl-parent: rationale: Core Perl API. repository: git://pkgs.fedoraproject.org/rpms/perl-parent cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-parent ref: f26 perl-perlfaq: rationale: Core Perl API. repository: git://pkgs.fedoraproject.org/rpms/perl-perlfaq cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-perlfaq ref: f26 perl-podlators: rationale: Core Perl API. repository: git://pkgs.fedoraproject.org/rpms/perl-podlators cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-podlators ref: f26 perl-threads: rationale: Core Perl API. repository: git://pkgs.fedoraproject.org/rpms/perl-threads cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-threads ref: f26 perl-threads-shared: rationale: Core Perl API. repository: git://pkgs.fedoraproject.org/rpms/perl-threads-shared cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-threads-shared ref: f26 perl-version: rationale: Core Perl API. repository: git://pkgs.fedoraproject.org/rpms/perl-version cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-version ref: f26 artifacts: rpms: - perl-4:5.24.4-397.module_1688+d7b5e208.x86_64 - perl-Algorithm-Diff-0:1.1903-6.module_1688+d7b5e208.noarch - perl-Archive-Tar-0:2.26-1.module_1688+d7b5e208.noarch - perl-Archive-Zip-0:1.59-3.module_1688+d7b5e208.noarch - perl-Attribute-Handlers-0:0.99-397.module_1688+d7b5e208.noarch - perl-B-Debug-0:1.24-2.module_1688+d7b5e208.noarch - perl-CPAN-0:2.16-1.module_1688+d7b5e208.noarch - perl-CPAN-Meta-0:2.150010-2.module_1688+d7b5e208.noarch - perl-CPAN-Meta-Requirements-0:2.140-7.module_1688+d7b5e208.noarch - perl-CPAN-Meta-YAML-0:0.018-367.module_1688+d7b5e208.noarch - perl-Carp-0:1.40-366.module_1688+d7b5e208.noarch - perl-Compress-Bzip2-0:2.26-1.module_1688+d7b5e208.x86_64 - perl-Compress-Raw-Bzip2-0:2.074-1.module_1688+d7b5e208.x86_64 - perl-Compress-Raw-Zlib-0:2.074-1.module_1688+d7b5e208.x86_64 - perl-Config-Perl-V-0:0.27-2.module_1688+d7b5e208.noarch - perl-DB_File-0:1.841-1.module_1688+d7b5e208.x86_64 - perl-Data-Dumper-0:2.161-4.module_1688+d7b5e208.x86_64 - perl-Data-OptList-0:0.110-3.module_1688+d7b5e208.noarch - perl-Data-Section-0:0.200006-8.module_1688+d7b5e208.noarch - perl-Devel-PPPort-0:3.36-1.module_1688+d7b5e208.x86_64 - perl-Devel-Peek-0:1.23-397.module_1688+d7b5e208.x86_64 - perl-Devel-SelfStubber-0:1.05-397.module_1688+d7b5e208.noarch - perl-Devel-Size-0:0.81-1.module_1688+d7b5e208.x86_64 - perl-Digest-0:1.17-367.module_1688+d7b5e208.noarch - perl-Digest-MD5-0:2.55-3.module_1688+d7b5e208.x86_64 - perl-Digest-SHA-1:6.01-1.module_1688+d7b5e208.x86_64 - perl-Encode-4:2.88-6.module_1688+d7b5e208.x86_64 - perl-Encode-devel-4:2.88-6.module_1688+d7b5e208.x86_64 - perl-Env-0:1.04-366.module_1688+d7b5e208.noarch - perl-Errno-0:1.25-397.module_1688+d7b5e208.x86_64 - perl-Exporter-0:5.72-367.module_1688+d7b5e208.noarch - perl-ExtUtils-CBuilder-1:0.280225-366.module_1688+d7b5e208.noarch - perl-ExtUtils-Command-0:7.24-3.module_1688+d7b5e208.noarch - perl-ExtUtils-Embed-0:1.33-397.module_1688+d7b5e208.noarch - perl-ExtUtils-Install-0:2.04-367.module_1688+d7b5e208.noarch - perl-ExtUtils-MM-Utils-0:7.24-3.module_1688+d7b5e208.noarch - perl-ExtUtils-MakeMaker-0:7.24-3.module_1688+d7b5e208.noarch - perl-ExtUtils-Manifest-0:1.70-366.module_1688+d7b5e208.noarch - perl-ExtUtils-Miniperl-0:1.05-397.module_1688+d7b5e208.noarch - perl-ExtUtils-ParseXS-1:3.31-368.module_1688+d7b5e208.noarch - perl-Fedora-VSP-0:0.001-5.module_1688+d7b5e208.noarch - perl-File-Fetch-0:0.56-1.module_1688+d7b5e208.noarch - perl-File-HomeDir-0:1.00-13.module_1688+d7b5e208.noarch - perl-File-Path-0:2.12-367.module_1688+d7b5e208.noarch - perl-File-Temp-0:0.230.400-2.module_1688+d7b5e208.noarch - perl-File-Which-0:1.21-3.module_1688+d7b5e208.noarch - perl-Filter-2:1.58-1.module_1688+d7b5e208.x86_64 - perl-Filter-Simple-0:0.92-366.module_1688+d7b5e208.noarch - perl-Getopt-Long-0:2.49.1-2.module_1688+d7b5e208.noarch - perl-HTTP-Tiny-0:0.070-2.module_1688+d7b5e208.noarch - perl-IO-0:1.36-397.module_1688+d7b5e208.x86_64 - perl-IO-Compress-0:2.074-1.module_1688+d7b5e208.noarch - perl-IO-Socket-IP-0:0.39-1.module_1688+d7b5e208.noarch - perl-IO-Zlib-1:1.10-397.module_1688+d7b5e208.noarch - perl-IPC-Cmd-1:0.98-1.module_1688+d7b5e208.noarch - perl-IPC-SysV-0:2.07-4.module_1688+d7b5e208.x86_64 - perl-IPC-System-Simple-0:1.25-13.module_1688+d7b5e208.noarch - perl-JSON-PP-0:2.94000-1.module_1688+d7b5e208.noarch - perl-Locale-Codes-0:3.42-2.module_1688+d7b5e208.noarch - perl-Locale-Maketext-0:1.28-2.module_1688+d7b5e208.noarch - perl-Locale-Maketext-Simple-1:0.21-397.module_1688+d7b5e208.noarch - perl-MIME-Base64-0:3.15-366.module_1688+d7b5e208.x86_64 - perl-MRO-Compat-0:0.13-1.module_1688+d7b5e208.noarch - perl-Math-BigInt-0:1.9998.11-1.module_1688+d7b5e208.noarch - perl-Math-BigInt-FastCalc-0:0.500.600-2.module_1688+d7b5e208.x86_64 - perl-Math-BigRat-0:0.2614-1.module_1688+d7b5e208.noarch - perl-Math-Complex-0:1.59-397.module_1688+d7b5e208.noarch - perl-Memoize-0:1.03-397.module_1688+d7b5e208.noarch - perl-Module-Build-2:0.42.24-1.module_1688+d7b5e208.noarch - perl-Module-CoreList-1:5.20180414-1.module_1688+d7b5e208.noarch - perl-Module-CoreList-tools-1:5.20180414-1.module_1688+d7b5e208.noarch - perl-Module-Load-1:0.32-366.module_1688+d7b5e208.noarch - perl-Module-Load-Conditional-0:0.68-2.module_1688+d7b5e208.noarch - perl-Module-Loaded-1:0.08-397.module_1688+d7b5e208.noarch - perl-Module-Metadata-0:1.000033-2.module_1688+d7b5e208.noarch - perl-Net-Ping-0:2.43-397.module_1688+d7b5e208.noarch - perl-Package-Generator-0:1.106-8.module_1688+d7b5e208.noarch - perl-Params-Check-1:0.38-366.module_1688+d7b5e208.noarch - perl-Params-Util-0:1.07-17.module_1688+d7b5e208.x86_64 - perl-PathTools-0:3.63-367.module_1688+d7b5e208.x86_64 - perl-Perl-OSType-0:1.010-4.module_1688+d7b5e208.noarch - perl-PerlIO-via-QuotedPrint-0:0.08-366.module_1688+d7b5e208.noarch - perl-Pod-Checker-4:1.73-2.module_1688+d7b5e208.noarch - perl-Pod-Escapes-1:1.07-366.module_1688+d7b5e208.noarch - perl-Pod-Html-0:1.22.01-397.module_1688+d7b5e208.noarch - perl-Pod-Parser-0:1.63-367.module_1688+d7b5e208.noarch - perl-Pod-Perldoc-0:3.28-2.module_1688+d7b5e208.noarch - perl-Pod-Simple-1:3.35-2.module_1688+d7b5e208.noarch - perl-Pod-Usage-4:1.69-2.module_1688+d7b5e208.noarch - perl-Scalar-List-Utils-3:1.48-1.module_1688+d7b5e208.x86_64 - perl-SelfLoader-0:1.23-397.module_1688+d7b5e208.noarch - perl-Socket-4:2.027-1.module_1688+d7b5e208.x86_64 - perl-Software-License-0:0.103012-4.module_1688+d7b5e208.noarch - perl-Storable-1:2.56-368.module_1688+d7b5e208.x86_64 - perl-Sub-Exporter-0:0.987-11.module_1688+d7b5e208.noarch - perl-Sub-Install-0:0.928-10.module_1688+d7b5e208.noarch - perl-Sys-Syslog-0:0.35-2.module_1688+d7b5e208.x86_64 - perl-Term-ANSIColor-0:4.06-2.module_1688+d7b5e208.noarch - perl-Term-Cap-0:1.17-366.module_1688+d7b5e208.noarch - perl-Test-0:1.28-397.module_1688+d7b5e208.noarch - perl-Test-Harness-0:3.42-1.module_1688+d7b5e208.noarch - perl-Test-Simple-1:1.302086-1.module_1688+d7b5e208.noarch - perl-Text-Balanced-0:2.03-366.module_1688+d7b5e208.noarch - perl-Text-Diff-0:1.44-3.module_1688+d7b5e208.noarch - perl-Text-Glob-0:0.11-1.module_1688+d7b5e208.noarch - perl-Text-ParseWords-0:3.30-366.module_1688+d7b5e208.noarch - perl-Text-Tabs+Wrap-0:2013.0523-366.module_1688+d7b5e208.noarch - perl-Text-Template-0:1.47-1.module_1688+d7b5e208.noarch - perl-Thread-Queue-0:3.12-1.module_1688+d7b5e208.noarch - perl-Time-HiRes-0:1.9753-1.module_1688+d7b5e208.x86_64 - perl-Time-Local-1:1.250-2.module_1688+d7b5e208.noarch - perl-Time-Piece-0:1.31-397.module_1688+d7b5e208.x86_64 - perl-URI-0:1.71-6.module_1688+d7b5e208.noarch - perl-Unicode-Collate-0:1.20-1.module_1688+d7b5e208.x86_64 - perl-Unicode-Normalize-0:1.25-366.module_1688+d7b5e208.x86_64 - perl-autodie-0:2.29-367.module_1688+d7b5e208.noarch - perl-bignum-0:0.49-1.module_1688+d7b5e208.noarch - perl-constant-0:1.33-368.module_1688+d7b5e208.noarch - perl-core-0:5.24.4-397.module_1688+d7b5e208.x86_64 - perl-devel-4:5.24.4-397.module_1688+d7b5e208.x86_64 - perl-encoding-4:2.19-6.module_1688+d7b5e208.x86_64 - perl-experimental-0:0.019-1.module_1688+d7b5e208.noarch - perl-generators-0:1.10-2.module_1688+d7b5e208.noarch - perl-homedir-0:2.000023-1.module_1688+d7b5e208.noarch - perl-inc-latest-2:0.500-6.module_1688+d7b5e208.noarch - perl-libnet-0:3.11-1.module_1688+d7b5e208.noarch - perl-libnetcfg-4:5.24.4-397.module_1688+d7b5e208.noarch - perl-libs-4:5.24.4-397.module_1688+d7b5e208.x86_64 - perl-local-lib-0:2.000023-1.module_1688+d7b5e208.noarch - perl-macros-4:5.24.4-397.module_1688+d7b5e208.x86_64 - perl-open-0:1.10-397.module_1688+d7b5e208.noarch - perl-parent-1:0.236-2.module_1688+d7b5e208.noarch - perl-perlfaq-0:5.021011-3.module_1688+d7b5e208.noarch - perl-podlators-0:4.09-3.module_1688+d7b5e208.noarch - perl-tests-4:5.24.4-397.module_1688+d7b5e208.x86_64 - perl-threads-1:2.21-1.module_1688+d7b5e208.x86_64 - perl-threads-shared-0:1.58-1.module_1688+d7b5e208.x86_64 - perl-utils-0:5.24.4-397.module_1688+d7b5e208.noarch - perl-version-5:0.99.18-1.module_1688+d7b5e208.x86_64 ... --- document: modulemd version: 2 data: name: nodejs stream: 8 version: 20180816123422 context: 6c81f848 arch: x86_64 summary: Javascript runtime description: >- Node.js is a platform built on Chrome''s JavaScript runtime for easily building fast, scalable network applications. Node.js uses an event-driven, non-blocking I/O model that makes it lightweight and efficient, perfect for data-intensive real-time applications that run across distributed devices. license: module: - MIT content: - MIT xmd: mbs: mse: TRUE scmurl: https://src.fedoraproject.org/modules/nodejs.git?#bc228d9478ac1b4387f55b6dc0b6dce38db7a7b9 commit: bc228d9478ac1b4387f55b6dc0b6dce38db7a7b9 buildrequires: platform: ref: f29 stream: f29 context: 00000000 version: 5 filtered_rpms: [] rpms: nodejs: ref: 0d185d83353950699b7016d89a66d3916e0168b0 dependencies: - buildrequires: platform: [f29] requires: platform: [f29] references: community: http://nodejs.org documentation: http://nodejs.org/en/docs tracker: https://github.com/nodejs/node/issues profiles: default: rpms: - nodejs - npm development: rpms: - nodejs - nodejs-devel - npm minimal: rpms: - nodejs api: rpms: - nodejs - nodejs-devel - npm components: rpms: nodejs: rationale: Javascript runtime and npm package manager. repository: git://pkgs.fedoraproject.org/rpms/nodejs cache: http://pkgs.fedoraproject.org/repo/pkgs/nodejs ref: 8 buildorder: 10 artifacts: rpms: - nodejs-1:8.11.4-1.module_2030+42747d40.x86_64 - nodejs-devel-1:8.11.4-1.module_2030+42747d40.x86_64 - nodejs-docs-1:8.11.4-1.module_2030+42747d40.noarch - npm-1:5.6.0-1.8.11.4.1.module_2030+42747d40.x86_64 ... --- document: modulemd version: 2 data: name: nodejs stream: 11 version: 20181102165620 context: 6c81f848 arch: x86_64 summary: Javascript runtime description: >- Node.js is a platform built on Chrome''s JavaScript runtime for easily building fast, scalable network applications. Node.js uses an event-driven, non-blocking I/O model that makes it lightweight and efficient, perfect for data-intensive real-time applications that run across distributed devices. license: module: - MIT content: - MIT xmd: mbs: mse: TRUE scmurl: https://src.fedoraproject.org/modules/nodejs.git?#e5473a364ae5974d031500e5c0188944c32a10f4 commit: e5473a364ae5974d031500e5c0188944c32a10f4 buildrequires: platform: ref: f29 stream: f29 context: 00000000 version: 5 filtered_rpms: [] rpms: nodejs: ref: 01611e2acd156d4004d04922e4f39c6b482902d6 nghttp2: ref: 54e2c4375502dc21ef4ac60ee571658a22f55c29 libuv: ref: fb955db1107c02298b4f7e453ae211b3c0673cda dependencies: - buildrequires: platform: [f29] requires: platform: [f29] references: community: http://nodejs.org documentation: http://nodejs.org/en/docs tracker: https://github.com/nodejs/node/issues profiles: default: rpms: - nodejs - npm development: rpms: - nodejs - nodejs-devel - npm minimal: rpms: - nodejs api: rpms: - nodejs - nodejs-devel - npm components: rpms: libuv: rationale: Platform abstraction layer for Node.js repository: git+https://src.fedoraproject.org/rpms/libuv cache: https://src.fedoraproject.org/repo/pkgs/libuv ref: 1 nghttp2: rationale: Needed for HTTP2 support repository: git+https://src.fedoraproject.org/rpms/nghttp2 cache: https://src.fedoraproject.org/repo/pkgs/nghttp2 ref: main nodejs: rationale: Javascript runtime and npm package manager. repository: git+https://src.fedoraproject.org/rpms/nodejs cache: https://src.fedoraproject.org/repo/pkgs/nodejs ref: 11 buildorder: 10 artifacts: rpms: - libnghttp2-0:1.34.0-1.module_2365+652bf990.x86_64 - libnghttp2-devel-0:1.34.0-1.module_2365+652bf990.x86_64 - libuv-1:1.23.2-1.module_2365+652bf990.x86_64 - libuv-devel-1:1.23.2-1.module_2365+652bf990.x86_64 - libuv-static-1:1.23.2-1.module_2365+652bf990.x86_64 - nghttp2-0:1.34.0-1.module_2365+652bf990.x86_64 - nodejs-1:11.1.0-1.module_2379+8d497405.x86_64 - nodejs-devel-1:11.1.0-1.module_2379+8d497405.x86_64 - nodejs-docs-1:11.1.0-1.module_2379+8d497405.noarch - npm-1:6.4.1-1.11.1.0.1.module_2379+8d497405.x86_64 ... --- document: modulemd version: 2 data: name: nodejs stream: 10 version: 20181101171344 context: 6c81f848 arch: x86_64 summary: Javascript runtime description: >- Node.js is a platform built on Chrome''s JavaScript runtime for easily building fast, scalable network applications. Node.js uses an event-driven, non-blocking I/O model that makes it lightweight and efficient, perfect for data-intensive real-time applications that run across distributed devices. license: module: - MIT content: - MIT xmd: mbs: mse: TRUE scmurl: https://src.fedoraproject.org/modules/nodejs.git?#0ca37a11ddd05a57398367c627cd978e5e28be01 commit: 0ca37a11ddd05a57398367c627cd978e5e28be01 buildrequires: platform: ref: f29 stream: f29 context: 00000000 version: 5 filtered_rpms: [] rpms: nodejs: ref: 10895e3e40a2ae7f390e0d5f370739320f99ff43 nghttp2: ref: 54e2c4375502dc21ef4ac60ee571658a22f55c29 libuv: ref: fb955db1107c02298b4f7e453ae211b3c0673cda dependencies: - buildrequires: platform: [f29] requires: platform: [f29] references: community: http://nodejs.org documentation: http://nodejs.org/en/docs tracker: https://github.com/nodejs/node/issues profiles: default: rpms: - nodejs - npm development: rpms: - nodejs - nodejs-devel - npm minimal: rpms: - nodejs api: rpms: - nodejs - nodejs-devel - npm components: rpms: libuv: rationale: Platform abstraction layer for Node.js repository: git+https://src.fedoraproject.org/rpms/libuv cache: https://src.fedoraproject.org/repo/pkgs/libuv ref: 1 nghttp2: rationale: Needed for HTTP2 support repository: git+https://src.fedoraproject.org/rpms/nghttp2 cache: https://src.fedoraproject.org/repo/pkgs/nghttp2 ref: main nodejs: rationale: Javascript runtime and npm package manager. repository: git+https://src.fedoraproject.org/rpms/nodejs cache: https://src.fedoraproject.org/repo/pkgs/nodejs ref: 10 buildorder: 10 artifacts: rpms: - libnghttp2-0:1.34.0-1.module_2302+4c6ccf2f.x86_64 - libnghttp2-devel-0:1.34.0-1.module_2302+4c6ccf2f.x86_64 - libuv-1:1.23.2-1.module_2302+4c6ccf2f.x86_64 - libuv-devel-1:1.23.2-1.module_2302+4c6ccf2f.x86_64 - libuv-static-1:1.23.2-1.module_2302+4c6ccf2f.x86_64 - nghttp2-0:1.34.0-1.module_2302+4c6ccf2f.x86_64 - nodejs-1:10.13.0-1.module_2362+1451e041.x86_64 - nodejs-devel-1:10.13.0-1.module_2362+1451e041.x86_64 - nodejs-docs-1:10.13.0-1.module_2362+1451e041.noarch - npm-1:6.4.1-1.10.13.0.1.module_2362+1451e041.x86_64 ... --- document: modulemd version: 2 data: name: ninja stream: main version: 20180816141421 context: 6c81f848 arch: x86_64 summary: Small build system with a focus on speed description: >- This module includes Ninja build system. Ninja is a small build system with a focus on speed. It differs from other build systems in two major respects: it is designed to have its input files generated by a higher-level build system, and it is designed to run builds as fast as possible. license: module: - MIT content: - MIT xmd: mbs: mse: TRUE scmurl: https://src.fedoraproject.org/modules/ninja.git?#6e64d7e4ddf96330ba0ecb2af6ff177342fb6554 commit: 6e64d7e4ddf96330ba0ecb2af6ff177342fb6554 buildrequires: platform: ref: f29 stream: f29 context: 00000000 version: 5 filtered_rpms: [] rpms: ninja-build: ref: e1503714b8eaa880edb8fa1643273c7363a7e42a dependencies: - buildrequires: platform: [f29] requires: platform: [f29] references: community: https://ninja-build.org/ documentation: https://ninja-build.org/manual.html tracker: https://github.com/ninja-build/ninja/issues profiles: default: rpms: - ninja-build api: rpms: - ninja-build components: rpms: ninja-build: rationale: Main component. repository: git://pkgs.fedoraproject.org/rpms/ninja-build cache: http://pkgs.fedoraproject.org/repo/pkgs/ninja-build ref: main artifacts: rpms: - ninja-build-0:1.8.2-4.module_1991+4e5efe2f.x86_64 ... --- document: modulemd version: 2 data: name: mysql stream: 5.7 version: 20180816141551 context: 6c81f848 arch: x86_64 summary: MySQL Module description: >- MySQL is a multi-user, multi-threaded SQL database server. MySQL is a client/server implementation consisting of a server daemon (mysqld) and many different client programs and libraries. The base package contains the standard MySQL client programs and generic MySQL files. license: module: - MIT content: - MIT xmd: mbs: mse: TRUE scmurl: https://src.fedoraproject.org/modules/mysql.git?#7708247d0b4d3a7502d8a3fd328f65be57f2efcf commit: 7708247d0b4d3a7502d8a3fd328f65be57f2efcf buildrequires: platform: ref: f29 stream: f29 context: 00000000 version: 5 filtered_rpms: [] rpms: community-mysql: ref: 58939b8918ec8d1d1d706190fab7e760817c0053 dependencies: - buildrequires: platform: [f29] requires: platform: [f29] references: community: https://docs.pagure.org/modularity/ documentation: https://github.com/container-images/mariadb/ tracker: https://github.com/modularity-modules/mysql profiles: client: rpms: - community-mysql default: rpms: - community-mysql - community-mysql-server server: rpms: - community-mysql-server api: rpms: - community-mysql - community-mysql-server buildopts: rpms: macros: | %runselftest 0 components: rpms: community-mysql: rationale: MySQL package. repository: git://pkgs.fedoraproject.org/rpms/community-mysql cache: http://pkgs.fedoraproject.org/repo/pkgs/community-mysql ref: 58939b89 buildorder: 10 artifacts: rpms: - community-mysql-0:5.7.22-1.module_1723+91eca47f.x86_64 - community-mysql-common-0:5.7.22-1.module_1723+91eca47f.x86_64 - community-mysql-devel-0:5.7.22-1.module_1723+91eca47f.x86_64 - community-mysql-embedded-0:5.7.22-1.module_1723+91eca47f.x86_64 - community-mysql-embedded-devel-0:5.7.22-1.module_1723+91eca47f.x86_64 - community-mysql-errmsg-0:5.7.22-1.module_1723+91eca47f.x86_64 - community-mysql-libs-0:5.7.22-1.module_1723+91eca47f.x86_64 - community-mysql-server-0:5.7.22-1.module_1723+91eca47f.x86_64 - community-mysql-test-0:5.7.22-1.module_1723+91eca47f.x86_64 ... --- document: modulemd version: 2 data: name: mongodb stream: 3.6 version: 20180601084133 context: 6c81f848 arch: x86_64 summary: MongoDB Module description: >- Mongo from humongous is a high-performance, open source, schema-free document-oriented database. MongoDB is written in C++ and offers the following features. Collection oriented storage, easy storage of object/JSON-style data. Dynamic queries. Full index support, including on inner objects and embedded arrays. Query profiling. Replication and fail-over support. Efficient storage of binary data including large objects (e.g. photos and videos). Auto-sharding for cloud-level scalability (currently in early alpha). Commercial Support Available. A key goal of MongoDB is to bridge the gap between key/value stores (which are fast and highly scalable) and traditional RDBMS systems (which are deep in functionality). license: module: - MIT content: - MIT xmd: mbs: mse: TRUE scmurl: https://src.fedoraproject.org/modules/mongodb.git?#a5dc17324f3dba53a00377cf0bbe7452c60c3759 commit: a5dc17324f3dba53a00377cf0bbe7452c60c3759 buildrequires: platform: ref: f29 stream: f29 context: 00000000 version: 4 filtered_rpms: [] rpms: mongodb: ref: 77494fb130cfc601d09294baf4d919f91b82fe28 python-pymongo: ref: 3d4e2bc45d006ee50ca24db56f41a3e23cdbf044 mongo-java-driver: ref: 2b02035c33706283bf7c67fa82b1d214916f8893 mongo-tools: ref: eed3205ebb63aa71b62b59ce5788bbb434c85ded dependencies: - buildrequires: platform: [f29] requires: platform: [f29] references: community: https://docs.pagure.org/modularity/ documentation: https://github.com/container-images/mongodb/ tracker: https://github.com/modularity-modules/mongodb profiles: client: rpms: - mongo-tools - mongodb default: rpms: - mongodb - mongodb-server server: rpms: - mongodb-server api: rpms: - mongo-tools - mongodb - mongodb-server filter: rpms: - mongo-tools-devel buildopts: rpms: macros: | %with_bundled 1 %_with_xmvn_javadoc 1 %_with_jp_minimal 1 components: rpms: mongo-java-driver: rationale: Java driver for MongoDB. repository: git://pkgs.fedoraproject.org/rpms/mongo-java-driver cache: http://pkgs.fedoraproject.org/repo/pkgs/mongo-java-driver ref: 3.6 buildorder: 2 arches: [aarch64, ppc64le, s390x, x86_64] mongo-tools: rationale: MongoDB tools. repository: git://pkgs.fedoraproject.org/rpms/mongo-tools cache: http://pkgs.fedoraproject.org/repo/pkgs/mongo-tools ref: 3.6 buildorder: 2 arches: [aarch64, ppc64le, s390x, x86_64] mongodb: rationale: MongoDB package. repository: git://pkgs.fedoraproject.org/rpms/mongodb cache: http://pkgs.fedoraproject.org/repo/pkgs/mongodb ref: 3.6 buildorder: 2 arches: [aarch64, ppc64le, s390x, x86_64] python-pymongo: rationale: Python MongoDB driver | MongoDB dependency for running testsuite. repository: git://pkgs.fedoraproject.org/rpms/python-pymongo cache: http://pkgs.fedoraproject.org/repo/pkgs/python-pymongo ref: f28 buildorder: 3 arches: [aarch64, ppc64le, s390x, x86_64] artifacts: rpms: - mongo-java-driver-0:3.6.3-1.module_1822+9f9b01c0.noarch - mongo-java-driver-bson-0:3.6.3-1.module_1822+9f9b01c0.noarch - mongo-java-driver-driver-0:3.6.3-1.module_1822+9f9b01c0.noarch - mongo-java-driver-driver-async-0:3.6.3-1.module_1822+9f9b01c0.noarch - mongo-java-driver-driver-core-0:3.6.3-1.module_1822+9f9b01c0.noarch - mongo-java-driver-javadoc-0:3.6.3-1.module_1822+9f9b01c0.noarch - mongo-tools-0:3.6.4-0.2.20180528gite657a1d.module_1806+7fc7744f.x86_64 - mongodb-0:3.6.4-2.module_1831+e8c1cdcd.x86_64 - mongodb-server-0:3.6.4-2.module_1831+e8c1cdcd.x86_64 - mongodb-test-0:3.6.4-2.module_1831+e8c1cdcd.x86_64 - python-pymongo-doc-0:3.6.1-1.module_1786+4c13601d.noarch - python2-bson-0:3.6.1-1.module_1786+4c13601d.x86_64 - python2-pymongo-0:3.6.1-1.module_1786+4c13601d.x86_64 - python2-pymongo-gridfs-0:3.6.1-1.module_1786+4c13601d.x86_64 - python3-bson-0:3.6.1-1.module_1786+4c13601d.x86_64 - python3-pymongo-0:3.6.1-1.module_1786+4c13601d.x86_64 - python3-pymongo-gridfs-0:3.6.1-1.module_1786+4c13601d.x86_64 ... --- document: modulemd version: 2 data: name: mongodb stream: 3.4 version: 20180601083501 context: 6c81f848 arch: x86_64 summary: MongoDB Module description: >- Mongo from humongous is a high-performance, open source, schema-free document-oriented database. MongoDB is written in C++ and offers the following features. Collection oriented storage, easy storage of object/JSON-style data. Dynamic queries. Full index support, including on inner objects and embedded arrays. Query profiling. Replication and fail-over support. Efficient storage of binary data including large objects (e.g. photos and videos). Auto-sharding for cloud-level scalability (currently in early alpha). Commercial Support Available. A key goal of MongoDB is to bridge the gap between key/value stores (which are fast and highly scalable) and traditional RDBMS systems (which are deep in functionality). license: module: - MIT content: - MIT xmd: mbs: mse: TRUE scmurl: https://src.fedoraproject.org/modules/mongodb.git?#d3bc3e2e8b412da82dbd2d4f3a5f209ac47872fa commit: d3bc3e2e8b412da82dbd2d4f3a5f209ac47872fa buildrequires: platform: ref: f29 stream: f29 context: 00000000 version: 4 filtered_rpms: [] rpms: mongodb: ref: f94545073372dfb2d06446221e6bfc8b0ed7aeaf python-pymongo: ref: 3d4e2bc45d006ee50ca24db56f41a3e23cdbf044 dependencies: - buildrequires: platform: [f29] requires: platform: [f29] references: community: https://docs.pagure.org/modularity/ documentation: https://github.com/container-images/mongodb/ tracker: https://github.com/modularity-modules/mongodb profiles: client: rpms: - mongodb default: rpms: - mongodb - mongodb-server server: rpms: - mongodb-server api: rpms: - mongodb - mongodb-server components: rpms: mongodb: rationale: MongoDB package. repository: git://pkgs.fedoraproject.org/rpms/mongodb cache: http://pkgs.fedoraproject.org/repo/pkgs/mongodb ref: 3.4 buildorder: 2 arches: [aarch64, ppc64le, s390x, x86_64] python-pymongo: rationale: Python MongoDB driver | MongoDB dependency for running testsuite. repository: git://pkgs.fedoraproject.org/rpms/python-pymongo cache: http://pkgs.fedoraproject.org/repo/pkgs/python-pymongo ref: f28 buildorder: 3 arches: [aarch64, ppc64le, s390x, x86_64] artifacts: rpms: - mongodb-0:3.4.11-3.module_1829+95924ba0.x86_64 - mongodb-server-0:3.4.11-3.module_1829+95924ba0.x86_64 - mongodb-test-0:3.4.11-3.module_1829+95924ba0.x86_64 - python-pymongo-doc-0:3.6.1-1.module_1829+95924ba0.noarch - python2-bson-0:3.6.1-1.module_1829+95924ba0.x86_64 - python2-pymongo-0:3.6.1-1.module_1829+95924ba0.x86_64 - python2-pymongo-gridfs-0:3.6.1-1.module_1829+95924ba0.x86_64 - python3-bson-0:3.6.1-1.module_1829+95924ba0.x86_64 - python3-pymongo-0:3.6.1-1.module_1829+95924ba0.x86_64 - python3-pymongo-gridfs-0:3.6.1-1.module_1829+95924ba0.x86_64 ... --- document: modulemd version: 2 data: name: meson stream: main version: 20180816151613 context: 06d0a27d arch: x86_64 summary: The Meson Build system description: >- Meson is an open source build system meant to be both extremely fast, and, even more importantly, as user friendly as possible. The main design point of Meson is that every moment a developer spends writing or debugging build definitions is a second wasted. So is every second spent waiting for the build system to actually start compiling code. license: module: - MIT content: - MIT xmd: mbs: mse: TRUE scmurl: https://src.fedoraproject.org/modules/meson.git?#9826d0b55a3e90793ffee9e34aa17dd740b282e4 commit: 9826d0b55a3e90793ffee9e34aa17dd740b282e4 buildrequires: platform: ref: f29 stream: f29 context: 00000000 version: 5 filtered_rpms: [] rpms: meson: ref: d715e30e897f9fca5716dcb7b0a8a07ca3496d17 dependencies: - buildrequires: platform: [f29] requires: ninja: [] platform: [f29] references: community: https://mesonbuild.com/ documentation: https://mesonbuild.com/ tracker: https://github.com/mesonbuild/meson/issues profiles: default: rpms: - meson api: rpms: - meson components: rpms: meson: rationale: Main component. repository: git://pkgs.fedoraproject.org/rpms/meson cache: http://pkgs.fedoraproject.org/repo/pkgs/meson ref: main artifacts: rpms: - meson-0:0.47.1-5.module_1993+7c0a4d1e.noarch ... --- document: modulemd version: 2 data: name: maven stream: 3.5 version: 20180629153919 context: 819b5873 arch: x86_64 summary: Java project management and project comprehension tool description: >- Maven is a software project management and comprehension tool. Based on the concept of a project object model (POM), Maven can manage a project's build, reporting and documentation from a central piece of information. license: module: - MIT content: - MIT xmd: mbs: mse: TRUE scmurl: https://src.fedoraproject.org/modules/maven.git?#224ccb2073e8c2dbb83b28c864873e277a71c468 commit: 224ccb2073e8c2dbb83b28c864873e277a71c468 buildrequires: javapackages-tools: ref: 1e429a4d686d3fdd1d93ce7e8ac7254148ea3471 stream: 201801 context: b43b0c8f version: 20180629150827 filtered_rpms: [] platform: ref: virtual stream: f28 context: 00000000 version: 4 filtered_rpms: [] rpms: plexus-classworlds: ref: 3e4086fae3de5ed724e85ecef28f6ea73a43cf93 jansi: ref: 4bdd2387b97de8352a0f7a976b7d8ccde8db0b24 aopalliance: ref: 4218fdf5b21e46bcf80aa3baa4248945b5a06e27 sisu: ref: 751afe29d8eda0029656309735ab884b58c1b37b maven-wagon: ref: 4652302afd7cc1a3d4eb48a1ae439bfc109daa90 maven-shared-utils: ref: fc1e8b47ffa930bf339234332d594dfb957c1fb2 glassfish-el: ref: 1ee218e03f1f7c4f9b282faa439f62aba1deae5f plexus-cipher: ref: 1a7a663ac4e50778d6e23a1b65235c12c7e422c4 guava20: ref: 1a98ae8658f477148660ae11626acc5d3efcf88c plexus-interpolation: ref: 18ba33c0fff9697a243b9c495200ba68d36c1071 plexus-utils: ref: 385b958ac294ee3b0851a885a2894b0de02a93b0 maven-resolver: ref: 66d2e2fea8fd8bcd9a297e5a550d2fcc87cc49e4 maven: ref: 666068fe9c979f42c7ca3d84583b0838985179b3 jsoup: ref: abe894a4ebec945ad4c2332084b687d1311ef15b httpcomponents-core: ref: 8be6b3645b3bad6f73fe1e21a7a9a25ae286a016 apache-commons-lang3: ref: aa5729029ca5b7859792bc50a0b3f12ac53c2faf plexus-sec-dispatcher: ref: a8ba97007fcb427a1d7eb066e8d61fa90062b17b apache-commons-codec: ref: b1a8636df2b288f5aa1b2b5bdff1a17b1174f175 slf4j: ref: d7cd96bc7a8e8d8d62c8bc62baa7df02cef56c63 plexus-containers: ref: 94ad5fd40f32db2b4ad5432ed568306f1e8b38ae cdi-api: ref: ff9f653d6435f240bb8a390ff9f99dfb578d42b8 apache-commons-io: ref: 817444e3e10e4d2422e6541f22c86eb281a3145c httpcomponents-client: ref: 4eb97a2f3fa38a0cc50ced7f913346788172d5c6 geronimo-annotation: ref: b32597766edae5bbdd797f04297642231756af8c google-guice: ref: 7e0365f95c46ad40ca084720b0a80afc40447d99 atinject: ref: 4762f5de60627d6d61131dd41a7d9b5027c4e300 apache-commons-logging: ref: 4d8596c64b6c0951b0e8f511d5c067f81b393e5d jansi-native: ref: 544b397797de885ca9b65442a4f956f817b76ddc hawtjni: ref: 93281e0174d79dfd549e57818292b1cbec5a7703 apache-commons-cli: ref: 624d058960641b73418257250e9c1441d9f7c3e6 jboss-interceptors-1.2-api: ref: ac58213ab9bf09451d82896b60eb822e788e777e dependencies: - requires: platform: [] profiles: default: rpms: - maven api: rpms: - maven filter: rpms: - aopalliance-javadoc - apache-commons-cli-javadoc - apache-commons-codec-javadoc - apache-commons-io-javadoc - apache-commons-lang3-javadoc - apache-commons-logging-javadoc - atinject-javadoc - atinject-tck - cdi-api-javadoc - geronimo-annotation-javadoc - glassfish-el - glassfish-el-javadoc - google-guice-javadoc - guava20-javadoc - guava20-testlib - guice-assistedinject - guice-bom - guice-extensions - guice-grapher - guice-jmx - guice-jndi - guice-multibindings - guice-parent - guice-servlet - guice-testlib - guice-throwingproviders - hawtjni - hawtjni-javadoc - httpcomponents-client-cache - httpcomponents-client-javadoc - httpcomponents-core-javadoc - jansi-javadoc - jansi-native-javadoc - jboss-interceptors-1.2-api-javadoc - jsoup-javadoc - jul-to-slf4j - log4j-over-slf4j - maven-hawtjni-plugin - maven-javadoc - maven-resolver - maven-resolver-javadoc - maven-resolver-test-util - maven-resolver-transport-classpath - maven-resolver-transport-file - maven-resolver-transport-http - maven-shared-utils-javadoc - maven-wagon - maven-wagon-ftp - maven-wagon-http-lightweight - maven-wagon-javadoc - maven-wagon-providers - plexus-cipher-javadoc - plexus-classworlds-javadoc - plexus-containers - plexus-containers-component-javadoc - plexus-containers-component-metadata - plexus-containers-container-default - plexus-containers-javadoc - plexus-interpolation-javadoc - plexus-sec-dispatcher-javadoc - plexus-utils-javadoc - sisu-javadoc - slf4j-ext - slf4j-javadoc - slf4j-jcl - slf4j-jdk14 - slf4j-log4j12 - slf4j-manual - slf4j-sources buildopts: rpms: macros: | %_with_xmvn_javadoc 1 %_without_asciidoc 1 %_without_avalon 1 %_without_bouncycastle 1 %_without_cython 1 %_without_dafsa 1 %_without_desktop 1 %_without_doxygen 1 %_without_dtd 1 %_without_eclipse 1 %_without_ehcache 1 %_without_emacs 1 %_without_equinox 1 %_without_fop 1 %_without_ftp 1 %_without_gradle 1 %_without_groovy 1 %_without_hadoop 1 %_without_hsqldb 1 %_without_itext 1 %_without_jackson 1 %_without_jmh 1 %_without_jna 1 %_without_jpa 1 %_without_junit5 1 %_without_logback 1 %_without_markdown 1 %_without_memcached 1 %_without_memoryfilesystem 1 %_without_obr 1 %_without_python 1 %_without_reporting 1 %_without_scm 1 %_without_snappy 1 %_without_spring 1 %_without_ssh 1 %_without_testlib 1 components: rpms: aopalliance: rationale: 'Runtime dependency of google-guice, maven. ' repository: git://pkgs.fedoraproject.org/rpms/aopalliance cache: http://pkgs.fedoraproject.org/repo/pkgs/aopalliance ref: javapackages buildorder: 10 apache-commons-cli: rationale: 'Runtime dependency of maven. ' repository: git://pkgs.fedoraproject.org/rpms/apache-commons-cli cache: http://pkgs.fedoraproject.org/repo/pkgs/apache-commons-cli ref: javapackages buildorder: 10 apache-commons-codec: rationale: 'Runtime dependency of httpcomponents-client, maven. ' repository: git://pkgs.fedoraproject.org/rpms/apache-commons-codec cache: http://pkgs.fedoraproject.org/repo/pkgs/apache-commons-codec ref: javapackages buildorder: 10 apache-commons-io: rationale: "Runtime dependency of maven, maven-shared-utils,\n maven-wagon.\n" repository: git://pkgs.fedoraproject.org/rpms/apache-commons-io cache: http://pkgs.fedoraproject.org/repo/pkgs/apache-commons-io ref: javapackages buildorder: 10 apache-commons-lang3: rationale: 'Runtime dependency of maven. ' repository: git://pkgs.fedoraproject.org/rpms/apache-commons-lang3 cache: http://pkgs.fedoraproject.org/repo/pkgs/apache-commons-lang3 ref: javapackages buildorder: 10 apache-commons-logging: rationale: 'Runtime dependency of httpcomponents-client, maven. ' repository: git://pkgs.fedoraproject.org/rpms/apache-commons-logging cache: http://pkgs.fedoraproject.org/repo/pkgs/apache-commons-logging ref: javapackages buildorder: 10 atinject: rationale: 'Runtime dependency of cdi-api, google-guice, maven. ' repository: git://pkgs.fedoraproject.org/rpms/atinject cache: http://pkgs.fedoraproject.org/repo/pkgs/atinject ref: javapackages buildorder: 10 cdi-api: rationale: 'Runtime dependency of maven, sisu. ' repository: git://pkgs.fedoraproject.org/rpms/cdi-api cache: http://pkgs.fedoraproject.org/repo/pkgs/cdi-api ref: javapackages buildorder: 20 geronimo-annotation: rationale: 'Runtime dependency of maven. ' repository: git://pkgs.fedoraproject.org/rpms/geronimo-annotation cache: http://pkgs.fedoraproject.org/repo/pkgs/geronimo-annotation ref: javapackages buildorder: 10 glassfish-el: rationale: 'Runtime dependency of cdi-api. ' repository: git://pkgs.fedoraproject.org/rpms/glassfish-el cache: http://pkgs.fedoraproject.org/repo/pkgs/glassfish-el ref: javapackages buildorder: 10 google-guice: rationale: 'Runtime dependency of maven. ' repository: git://pkgs.fedoraproject.org/rpms/google-guice cache: http://pkgs.fedoraproject.org/repo/pkgs/google-guice ref: javapackages buildorder: 20 guava20: rationale: 'Runtime dependency of google-guice, maven. ' repository: git://pkgs.fedoraproject.org/rpms/guava20 cache: http://pkgs.fedoraproject.org/repo/pkgs/guava20 ref: javapackages buildorder: 10 hawtjni: rationale: 'Runtime dependency of jansi, jansi-native, maven. ' repository: git://pkgs.fedoraproject.org/rpms/hawtjni cache: http://pkgs.fedoraproject.org/repo/pkgs/hawtjni ref: javapackages buildorder: 10 httpcomponents-client: rationale: 'Runtime dependency of maven, maven-wagon. ' repository: git://pkgs.fedoraproject.org/rpms/httpcomponents-client cache: http://pkgs.fedoraproject.org/repo/pkgs/httpcomponents-client ref: javapackages buildorder: 20 httpcomponents-core: rationale: "Runtime dependency of httpcomponents-client, maven,\n maven-wagon.\n" repository: git://pkgs.fedoraproject.org/rpms/httpcomponents-core cache: http://pkgs.fedoraproject.org/repo/pkgs/httpcomponents-core ref: javapackages buildorder: 10 jansi: rationale: 'Runtime dependency of maven. ' repository: git://pkgs.fedoraproject.org/rpms/jansi cache: http://pkgs.fedoraproject.org/repo/pkgs/jansi ref: javapackages buildorder: 30 jansi-native: rationale: 'Runtime dependency of jansi, maven. ' repository: git://pkgs.fedoraproject.org/rpms/jansi-native cache: http://pkgs.fedoraproject.org/repo/pkgs/jansi-native ref: javapackages buildorder: 20 jboss-interceptors-1.2-api: rationale: 'Runtime dependency of cdi-api. ' repository: git://pkgs.fedoraproject.org/rpms/jboss-interceptors-1.2-api cache: http://pkgs.fedoraproject.org/repo/pkgs/jboss-interceptors-1.2-api ref: javapackages buildorder: 10 jsoup: rationale: 'Runtime dependency of maven-wagon. ' repository: git://pkgs.fedoraproject.org/rpms/jsoup cache: http://pkgs.fedoraproject.org/repo/pkgs/jsoup ref: javapackages buildorder: 10 maven: rationale: 'Module API. ' repository: git://pkgs.fedoraproject.org/rpms/maven cache: http://pkgs.fedoraproject.org/repo/pkgs/maven ref: javapackages buildorder: 50 maven-resolver: rationale: 'Runtime dependency of maven. ' repository: git://pkgs.fedoraproject.org/rpms/maven-resolver cache: http://pkgs.fedoraproject.org/repo/pkgs/maven-resolver ref: javapackages buildorder: 40 maven-shared-utils: rationale: 'Runtime dependency of maven. ' repository: git://pkgs.fedoraproject.org/rpms/maven-shared-utils cache: http://pkgs.fedoraproject.org/repo/pkgs/maven-shared-utils ref: javapackages buildorder: 20 maven-wagon: rationale: 'Runtime dependency of maven, maven-resolver. ' repository: git://pkgs.fedoraproject.org/rpms/maven-wagon cache: http://pkgs.fedoraproject.org/repo/pkgs/maven-wagon ref: javapackages buildorder: 30 plexus-cipher: rationale: 'Runtime dependency of maven, plexus-sec-dispatcher. ' repository: git://pkgs.fedoraproject.org/rpms/plexus-cipher cache: http://pkgs.fedoraproject.org/repo/pkgs/plexus-cipher ref: javapackages buildorder: 10 plexus-classworlds: rationale: 'Runtime dependency of maven, sisu. ' repository: git://pkgs.fedoraproject.org/rpms/plexus-classworlds cache: http://pkgs.fedoraproject.org/repo/pkgs/plexus-classworlds ref: javapackages buildorder: 10 plexus-containers: rationale: 'Runtime dependency of maven, sisu. ' repository: git://pkgs.fedoraproject.org/rpms/plexus-containers cache: http://pkgs.fedoraproject.org/repo/pkgs/plexus-containers ref: javapackages buildorder: 10 plexus-interpolation: rationale: 'Runtime dependency of maven. ' repository: git://pkgs.fedoraproject.org/rpms/plexus-interpolation cache: http://pkgs.fedoraproject.org/repo/pkgs/plexus-interpolation ref: javapackages buildorder: 10 plexus-sec-dispatcher: rationale: 'Runtime dependency of maven. ' repository: git://pkgs.fedoraproject.org/rpms/plexus-sec-dispatcher cache: http://pkgs.fedoraproject.org/repo/pkgs/plexus-sec-dispatcher ref: javapackages buildorder: 20 plexus-utils: rationale: "Runtime dependency of maven, maven-wagon,\n plexus-sec-dispatcher, sisu.\n" repository: git://pkgs.fedoraproject.org/rpms/plexus-utils cache: http://pkgs.fedoraproject.org/repo/pkgs/plexus-utils ref: javapackages buildorder: 10 sisu: rationale: 'Runtime dependency of maven. ' repository: git://pkgs.fedoraproject.org/rpms/sisu cache: http://pkgs.fedoraproject.org/repo/pkgs/sisu ref: javapackages buildorder: 30 slf4j: rationale: 'Runtime dependency of maven, maven-wagon. ' repository: git://pkgs.fedoraproject.org/rpms/slf4j cache: http://pkgs.fedoraproject.org/repo/pkgs/slf4j ref: javapackages buildorder: 10 artifacts: rpms: - aopalliance-0:1.0-17.module_1885+a6f9b3e6.noarch - apache-commons-cli-0:1.4-4.module_1885+a6f9b3e6.noarch - apache-commons-codec-0:1.11-3.module_1885+a6f9b3e6.noarch - apache-commons-io-1:2.6-3.module_1885+a6f9b3e6.noarch - apache-commons-lang3-0:3.7-3.module_1885+a6f9b3e6.noarch - apache-commons-logging-0:1.2-13.module_1885+a6f9b3e6.noarch - atinject-0:1-28.20100611svn86.module_1885+a6f9b3e6.noarch - cdi-api-0:1.2-8.module_1885+a6f9b3e6.noarch - geronimo-annotation-0:1.0-23.module_1885+a6f9b3e6.noarch - glassfish-el-api-0:3.0.1-0.7.b08.module_1885+a6f9b3e6.noarch - google-guice-0:4.1-11.module_1885+a6f9b3e6.noarch - guava20-0:20.0-6.module_1885+a6f9b3e6.noarch - hawtjni-runtime-0:1.16-1.module_1885+a6f9b3e6.noarch - httpcomponents-client-0:4.5.5-4.module_1885+a6f9b3e6.noarch - httpcomponents-core-0:4.4.9-4.module_1885+a6f9b3e6.noarch - jansi-0:1.17.1-1.module_1885+a6f9b3e6.noarch - jansi-native-0:1.7-5.module_1885+a6f9b3e6.x86_64 - jboss-interceptors-1.2-api-0:1.0.0-8.module_1885+a6f9b3e6.noarch - jcl-over-slf4j-0:1.7.25-4.module_1885+a6f9b3e6.noarch - jsoup-0:1.11.3-1.module_1885+a6f9b3e6.noarch - maven-1:3.5.4-1.module_1885+a6f9b3e6.noarch - maven-lib-1:3.5.4-1.module_1885+a6f9b3e6.noarch - maven-resolver-api-1:1.1.1-2.module_1885+a6f9b3e6.noarch - maven-resolver-connector-basic-1:1.1.1-2.module_1885+a6f9b3e6.noarch - maven-resolver-impl-1:1.1.1-2.module_1885+a6f9b3e6.noarch - maven-resolver-spi-1:1.1.1-2.module_1885+a6f9b3e6.noarch - maven-resolver-transport-wagon-1:1.1.1-2.module_1885+a6f9b3e6.noarch - maven-resolver-util-1:1.1.1-2.module_1885+a6f9b3e6.noarch - maven-shared-utils-0:3.2.1-0.1.module_1885+a6f9b3e6.noarch - maven-wagon-file-0:3.1.0-1.module_1885+a6f9b3e6.noarch - maven-wagon-http-0:3.1.0-1.module_1885+a6f9b3e6.noarch - maven-wagon-http-shared-0:3.1.0-1.module_1885+a6f9b3e6.noarch - maven-wagon-provider-api-0:3.1.0-1.module_1885+a6f9b3e6.noarch - plexus-cipher-0:1.7-14.module_1885+a6f9b3e6.noarch - plexus-classworlds-0:2.5.2-9.module_1885+a6f9b3e6.noarch - plexus-containers-component-annotations-0:1.7.1-6.module_1885+a6f9b3e6.noarch - plexus-interpolation-0:1.22-9.module_1885+a6f9b3e6.noarch - plexus-sec-dispatcher-0:1.4-24.module_1885+a6f9b3e6.noarch - plexus-utils-0:3.1.0-1.module_1885+a6f9b3e6.noarch - sisu-inject-1:0.3.3-3.module_1885+a6f9b3e6.noarch - sisu-plexus-1:0.3.3-3.module_1885+a6f9b3e6.noarch - slf4j-0:1.7.25-4.module_1885+a6f9b3e6.noarch ... --- document: modulemd version: 2 data: name: mariadb stream: 10.4 version: 20181120140729 context: 6c81f848 arch: x86_64 summary: 'MariaDB: a very fast and robust SQL database server' description: >- MariaDB is a community developed branch of MySQL. MariaDB is a multi-user, multi-threaded SQL database server. It is a client/server implementation consisting of a server daemon (mysqld) and many different client programs and libraries. The base package contains the standard MariaDB/MySQL client programs and generic MySQL files. license: module: - MIT content: - MIT xmd: mbs: mse: TRUE scmurl: https://src.fedoraproject.org/modules/mariadb.git?#7c2437c97bdf86ef4aebfb6d9a73423c887eebb4 commit: 7c2437c97bdf86ef4aebfb6d9a73423c887eebb4 buildrequires: platform: ref: f29 stream: f29 context: 00000000 version: 5 filtered_rpms: [] rpms: mariadb: ref: 2413f21e35297865f57c0ca8c7a9a86bb40e1068 dependencies: - buildrequires: platform: [f29] requires: platform: [f29] api: rpms: - mariadb - mariadb-server - mariadb-server-utils buildopts: rpms: macros: | %runselftest 0 %ignore_testsuite_result 1 components: rpms: mariadb: rationale: The main component. repository: git+https://src.fedoraproject.org/rpms/mariadb cache: https://src.fedoraproject.org/repo/pkgs/mariadb ref: 10.4 artifacts: rpms: - mariadb-3:10.4.0-1.alpha.module_2503+13dbd621.x86_64 - mariadb-backup-3:10.4.0-1.alpha.module_2503+13dbd621.x86_64 - mariadb-bench-3:10.4.0-1.alpha.module_2503+13dbd621.x86_64 - mariadb-common-3:10.4.0-1.alpha.module_2503+13dbd621.x86_64 - mariadb-connect-engine-3:10.4.0-1.alpha.module_2503+13dbd621.x86_64 - mariadb-cracklib-password-check-3:10.4.0-1.alpha.module_2503+13dbd621.x86_64 - mariadb-devel-3:10.4.0-1.alpha.module_2503+13dbd621.x86_64 - mariadb-embedded-3:10.4.0-1.alpha.module_2503+13dbd621.x86_64 - mariadb-embedded-devel-3:10.4.0-1.alpha.module_2503+13dbd621.x86_64 - mariadb-errmsg-3:10.4.0-1.alpha.module_2503+13dbd621.x86_64 - mariadb-gssapi-server-3:10.4.0-1.alpha.module_2503+13dbd621.x86_64 - mariadb-oqgraph-engine-3:10.4.0-1.alpha.module_2503+13dbd621.x86_64 - mariadb-rocksdb-engine-3:10.4.0-1.alpha.module_2503+13dbd621.x86_64 - mariadb-server-3:10.4.0-1.alpha.module_2503+13dbd621.x86_64 - mariadb-server-galera-3:10.4.0-1.alpha.module_2503+13dbd621.x86_64 - mariadb-server-utils-3:10.4.0-1.alpha.module_2503+13dbd621.x86_64 - mariadb-sphinx-engine-3:10.4.0-1.alpha.module_2503+13dbd621.x86_64 - mariadb-test-3:10.4.0-1.alpha.module_2503+13dbd621.x86_64 - mariadb-tokudb-engine-3:10.4.0-1.alpha.module_2503+13dbd621.x86_64 ... --- document: modulemd version: 2 data: name: mariadb stream: 10.1 version: 20180418185803 context: 6c81f848 arch: x86_64 summary: MariaDB Module description: >- MariaDB is a community developed branch of MySQL. MariaDB is a multi-user, multi-threaded SQL database server. It is a client/server implementation consisting of a server daemon (mysqld) and many different client programs and libraries. The base package contains the standard MariaDB/MySQL client programs and generic MySQL files. license: module: - MIT content: - MIT xmd: mbs: mse: TRUE scmurl: https://src.fedoraproject.org/modules/mariadb.git?#f1a4b73cfe2b0231ea125e96a64f0daf879245ee commit: f1a4b73cfe2b0231ea125e96a64f0daf879245ee buildrequires: platform: ref: f29 stream: f29 context: 00000000 version: 4 filtered_rpms: [] rpms: mariadb: ref: 76a52e56ed214544537575d3535615be3a7afd2f dependencies: - buildrequires: platform: [f29] requires: platform: [f29] references: community: https://docs.pagure.org/modularity/ documentation: https://github.com/container-images/mariadb/ tracker: https://github.com/modularity-modules/mariadb profiles: client: rpms: - mariadb default: rpms: - mariadb - mariadb-server server: rpms: - mariadb-server api: rpms: - mariadb - mariadb-server filter: rpms: - mariadb-bench - mariadb-server-galera buildopts: rpms: macros: | %runselftest 0 components: rpms: mariadb: rationale: MariaDB package. repository: git://pkgs.fedoraproject.org/rpms/mariadb cache: http://pkgs.fedoraproject.org/repo/pkgs/mariadb ref: 76a52e56 artifacts: rpms: - mariadb-3:10.1.30-2.module_1690+8f54252c.x86_64 - mariadb-common-3:10.1.30-2.module_1690+8f54252c.x86_64 - mariadb-config-3:10.1.30-2.module_1690+8f54252c.x86_64 - mariadb-connect-engine-3:10.1.30-2.module_1690+8f54252c.x86_64 - mariadb-devel-3:10.1.30-2.module_1690+8f54252c.x86_64 - mariadb-embedded-3:10.1.30-2.module_1690+8f54252c.x86_64 - mariadb-embedded-devel-3:10.1.30-2.module_1690+8f54252c.x86_64 - mariadb-errmsg-3:10.1.30-2.module_1690+8f54252c.x86_64 - mariadb-libs-3:10.1.30-2.module_1690+8f54252c.x86_64 - mariadb-oqgraph-engine-3:10.1.30-2.module_1690+8f54252c.x86_64 - mariadb-server-3:10.1.30-2.module_1690+8f54252c.x86_64 - mariadb-server-utils-3:10.1.30-2.module_1690+8f54252c.x86_64 - mariadb-test-3:10.1.30-2.module_1690+8f54252c.x86_64 ... --- document: modulemd version: 2 data: name: lizardfs stream: devel version: 20180816140845 context: 6c81f848 arch: x86_64 summary: Distributed, fault tolerant file system description: >- LizardFS is an Open Source, easy to deploy and maintain, distributed, fault tolerant file system for POSIX compliant OSes. LizardFS is a fork of MooseFS. For more information please visit http://lizardfs.com license: module: - MIT content: - MIT xmd: mbs: mse: TRUE scmurl: https://src.fedoraproject.org/modules/lizardfs.git?#1e4d151b55a4c460cd15f0b6182499db374afd41 commit: 1e4d151b55a4c460cd15f0b6182499db374afd41 buildrequires: platform: ref: f29 stream: f29 context: 00000000 version: 5 filtered_rpms: [] rpms: lizardfs: ref: 0624af153ffd409f2f7b3c3f63fd2b5e5f571cd0 dependencies: - buildrequires: platform: [f29] requires: platform: [f29] components: rpms: lizardfs: rationale: Provides the core functionality. repository: git://pkgs.fedoraproject.org/rpms/lizardfs cache: http://pkgs.fedoraproject.org/repo/pkgs/lizardfs ref: devel artifacts: rpms: - lizardfs-adm-0:3.13.0-0.rc1r1.module_1987+e7db591a.x86_64 - lizardfs-cgi-0:3.13.0-0.rc1r1.module_1987+e7db591a.x86_64 - lizardfs-cgiserv-0:3.13.0-0.rc1r1.module_1987+e7db591a.x86_64 - lizardfs-chunkserver-0:3.13.0-0.rc1r1.module_1987+e7db591a.x86_64 - lizardfs-client-0:3.13.0-0.rc1r1.module_1987+e7db591a.x86_64 - lizardfs-server-0:3.13.0-0.rc1r1.module_1987+e7db591a.x86_64 - lizardfs-metalogger-0:3.13.0-0.rc1r1.module_1987+e7db591a.x86_64 - lizardfs-uraft-0:3.13.0-0.rc1r1.module_1987+e7db591a.x86_64 ... --- document: modulemd version: 2 data: name: libgit2 stream: 0.27 version: 20181028172505 context: 6c81f848 arch: x86_64 summary: Library implementation of Git description: >- The Git linkable library. license: module: - MIT content: - MIT xmd: mbs: mse: TRUE scmurl: https://src.fedoraproject.org/modules/libgit2.git?#faa63b8d2ed90d2cfa1f7d470284ef5d0944b92d commit: faa63b8d2ed90d2cfa1f7d470284ef5d0944b92d buildrequires: platform: ref: f29 stream: f29 context: 00000000 version: 5 filtered_rpms: [] rpms: libgit2: ref: 9d94f2edd815e593fd220257fdd89f57c7b9635e python-pygit2: ref: 2c97c77dce9d2c76bfda1bf5e21420f24b242bbf dependencies: - buildrequires: platform: [f29] requires: platform: [f29] references: community: https://libgit2.org/ api: rpms: - libgit2 - libgit2-devel components: rpms: libgit2: rationale: Main component. repository: git+https://src.fedoraproject.org/rpms/libgit2 cache: https://src.fedoraproject.org/repo/pkgs/libgit2 ref: 0.27 python-pygit2: rationale: Main component. repository: git+https://src.fedoraproject.org/rpms/python-pygit2 cache: https://src.fedoraproject.org/repo/pkgs/python-pygit2 ref: 0.27 buildorder: 10 artifacts: rpms: - libgit2-0:0.27.7-1.module_2334+e7fbee10.x86_64 - libgit2-devel-0:0.27.7-1.module_2334+e7fbee10.x86_64 - python-pygit2-doc-0:0.27.2-1.module_2222+9bfbc8d7.noarch - python2-pygit2-0:0.27.2-1.module_2222+9bfbc8d7.x86_64 - python3-pygit2-0:0.27.2-1.module_2222+9bfbc8d7.x86_64 ... --- document: modulemd version: 2 data: name: libgit2 stream: 0.26 version: 20181103165214 context: 6c81f848 arch: x86_64 summary: Library implementation of Git description: >- The Git linkable library. license: module: - MIT content: - MIT xmd: mbs: mse: TRUE scmurl: https://src.fedoraproject.org/modules/libgit2.git?#9cc4bafb41d2f2d799c4df1b94775e37f20b0913 commit: 9cc4bafb41d2f2d799c4df1b94775e37f20b0913 buildrequires: platform: ref: f29 stream: f29 context: 00000000 version: 5 filtered_rpms: [] rpms: libgit2: ref: 82f38e30120391b0be1b0d1ab660d6bc8f1dc86f python-pygit2: ref: 05ad050af7950a262d711e8c1c29a84e87087073 dependencies: - buildrequires: platform: [f29] requires: platform: [f29] references: community: https://libgit2.org/ api: rpms: - libgit2 - libgit2-devel components: rpms: libgit2: rationale: Main component. repository: git+https://src.fedoraproject.org/rpms/libgit2 cache: https://src.fedoraproject.org/repo/pkgs/libgit2 ref: 0.26 python-pygit2: rationale: Main component. repository: git+https://src.fedoraproject.org/rpms/python-pygit2 cache: https://src.fedoraproject.org/repo/pkgs/python-pygit2 ref: 0.26 buildorder: 10 artifacts: rpms: - libgit2-0:0.26.8-1.module_2403+7aeb62bd.x86_64 - libgit2-devel-0:0.26.8-1.module_2403+7aeb62bd.x86_64 - python-pygit2-doc-0:0.26.4-1.module_2241+da9f6017.noarch - python2-pygit2-0:0.26.4-1.module_2241+da9f6017.x86_64 - python3-pygit2-0:0.26.4-1.module_2241+da9f6017.x86_64 ... --- document: modulemd version: 2 data: name: kubernetes stream: openshift-3.10 version: 20180827171820 context: 6c81f848 arch: x86_64 summary: OpenShift Container Management description: >- OpenShift Origin is a distribution of Kubernetes optimized for application development and deployment. OpenShift Origin adds developer and operational centric tools on top of Kubernetes to enable rapid application development, easy deployment and scaling, and long-term lifecycle maintenance for small and large teams and applications. It provides a secure and multi-tenant configuration for Kubernetes allowing you to safely host many different applications and workloads. license: module: - MIT content: - MIT xmd: mbs: mse: TRUE scmurl: https://src.fedoraproject.org/modules/kubernetes.git?#d90e9f3651d44c399a06273f01228ddb6d87c4f3 commit: d90e9f3651d44c399a06273f01228ddb6d87c4f3 buildrequires: platform: ref: f29 stream: f29 context: 00000000 version: 5 filtered_rpms: [] rpms: origin: ref: cd304ee543d2d0863c3b162697cbc2b94745802f dependencies: - buildrequires: platform: [f29] requires: platform: [f29] references: community: https://github.com/kubernetes/kubernetes documentation: https://github.com/kubernetes/kubernetes tracker: https://github.com/kubernetes/kubernetes profiles: default: rpms: - origin - origin-clients - origin-cluster-capacity - origin-docker-excluder - origin-dockerregistry - origin-excluder - origin-federation-services - origin-server - origin-node - origin-pod - origin-sdn-ovs - origin-service-catalog - origin-template-service-broker - origin-tests - origin-web-console api: rpms: - origin buildopts: rpms: macros: | %_with_ignore_tests 1 components: rpms: origin: rationale: Primary module component. repository: git+https://src.fedoraproject.org/rpms/origin cache: https://src.fedoraproject.org/repo/pkgs/origin ref: openshift-3.10 artifacts: rpms: - origin-0:3.10.0-1.module_2135+dcc9a197.x86_64 - origin-clients-0:3.10.0-1.module_2135+dcc9a197.x86_64 - origin-cluster-capacity-0:3.10.0-1.module_2135+dcc9a197.x86_64 - origin-docker-excluder-0:3.10.0-1.module_2135+dcc9a197.noarch - origin-dockerregistry-0:3.10.0-1.module_2135+dcc9a197.x86_64 - origin-excluder-0:3.10.0-1.module_2135+dcc9a197.noarch - origin-federation-services-0:3.10.0-1.module_2135+dcc9a197.x86_64 - origin-server-0:3.10.0-1.module_2135+dcc9a197.x86_64 - origin-node-0:3.10.0-1.module_2135+dcc9a197.x86_64 - origin-pod-0:3.10.0-1.module_2135+dcc9a197.x86_64 - origin-sdn-ovs-0:3.10.0-1.module_2135+dcc9a197.x86_64 - origin-service-catalog-0:3.10.0-1.module_2135+dcc9a197.x86_64 - origin-template-service-broker-0:3.10.0-1.module_2135+dcc9a197.x86_64 - origin-tests-0:3.10.0-1.module_2135+dcc9a197.x86_64 - origin-web-console-0:3.10.0-1.module_2135+dcc9a197.x86_64 ... --- document: modulemd version: 2 data: name: kubernetes stream: 1.10 version: 20180827150115 context: 6c81f848 arch: x86_64 summary: Container cluster management description: >- Kubernetes is an open source system for managing containerized applications across multiple hosts; providing basic mechanisms for deployment, maintenance, and scaling of applications. Kubernetes builds upon a decade and a half of experience at Google running production workloads at scale using a system called Borg, combined with best-of-breed ideas and practices from the community. license: module: - MIT content: - MIT xmd: mbs: mse: TRUE scmurl: https://src.fedoraproject.org/modules/kubernetes.git?#98c4546e08fdd6b6adf3d9dc35d374becffc2116 commit: 98c4546e08fdd6b6adf3d9dc35d374becffc2116 buildrequires: platform: ref: f29 stream: f29 context: 00000000 version: 5 filtered_rpms: [] rpms: kubernetes: ref: 41689fd5bb5de3125b738270c51c81ccd4b26dd7 dependencies: - buildrequires: platform: [f29] requires: platform: [f29] references: community: https://github.com/kubernetes/kubernetes documentation: https://github.com/kubernetes/kubernetes tracker: https://github.com/kubernetes/kubernetes profiles: default: rpms: - kubernetes - kubernetes-client - kubernetes-kubeadm - kubernetes-server - kubernetes-node api: rpms: - kubernetes buildopts: rpms: macros: | %_with_ignore_tests 1 components: rpms: kubernetes: rationale: Primary module component. repository: git+https://src.fedoraproject.org/rpms/kubernetes cache: https://src.fedoraproject.org/repo/pkgs/kubernetes ref: 1.10 artifacts: rpms: - kubernetes-0:1.10.3-1.module_2132+faf1362b.x86_64 - kubernetes-client-0:1.10.3-1.module_2132+faf1362b.x86_64 - kubernetes-devel-0:1.10.3-1.module_2132+faf1362b.noarch - kubernetes-kubeadm-0:1.10.3-1.module_2132+faf1362b.x86_64 - kubernetes-server-0:1.10.3-1.module_2132+faf1362b.x86_64 - kubernetes-node-0:1.10.3-1.module_2132+faf1362b.x86_64 - kubernetes-unit-test-0:1.10.3-1.module_2132+faf1362b.x86_64 ... --- document: modulemd version: 2 data: name: hub stream: pre-release version: 20180816140655 context: 6c81f848 arch: x86_64 summary: A command-line wrapper for git with github shortcuts description: >- hub is a command line tool that wraps `git` in order to extend it with extra features and commands that make working with GitHub easier. $ hub clone rtomayko/tilt # expands to: $ git clone git://github.com/rtomayko/tilt.git license: module: - MIT content: - MIT xmd: mbs: mse: TRUE scmurl: https://src.fedoraproject.org/modules/hub.git?#44bb53f774b6561906da5d069b055fa2b02a38ef commit: 44bb53f774b6561906da5d069b055fa2b02a38ef buildrequires: platform: ref: f29 stream: f29 context: 00000000 version: 5 filtered_rpms: [] rpms: hub: ref: 65f4d09cbf742ef0bb58cf0a9b8c7d1c05295492 dependencies: - buildrequires: platform: [f29] requires: platform: [f29] references: community: https://hub.github.com documentation: https://hub.github.com tracker: https://github.com/github/hub/issues profiles: default: rpms: - hub api: rpms: - hub components: rpms: hub: rationale: A command-line wrapper for git with github shortcuts repository: git://pkgs.fedoraproject.org/rpms/hub cache: http://pkgs.fedoraproject.org/repo/pkgs/hub ref: pre-release artifacts: rpms: - hub-0:prerelease-8.module_1978+3584bea7.x86_64 ... --- document: modulemd version: 2 data: name: golang-ecosystem stream: 2018.0 version: 20180816154327 context: cbfb2833 arch: x86_64 summary: The ecosystem of packages for the Go programming language description: >- This module contains golang based tools used as dependencies for other packages, for instance, go-md2man, a manpage converter written in Go, along with rpm macros for building Go based tools. license: module: - MIT content: - MIT xmd: mbs: mse: TRUE scmurl: https://src.fedoraproject.org/modules/golang-ecosystem.git?#1654fad1d9abf46a7d4f7845ea9e847b762f08a5 commit: 1654fad1d9abf46a7d4f7845ea9e847b762f08a5 buildrequires: platform: ref: f29 stream: f29 context: 00000000 version: 5 filtered_rpms: [] golang: ref: 92882e9696b779110fd27aa11ddbc88f30eb82a2 stream: 1.10 context: 6c81f848 version: 20180816140129 filtered_rpms: [] rpms: go-srpm-macros: ref: 4f85e708533960d6edfcb6e4eef29be758b25087 go-compilers: ref: f40831872a58d2b2b28219d8ddf2931cb2f0bc2e golang-github-russross-blackfriday: ref: 5b8c2ba534b8019529df9d58b92027c6a976b40e golang-github-cpuguy83-go-md2man: ref: 5cdf8051cae5c0596f975d526ac476e6fb4ad5f0 dependencies: - buildrequires: platform: [f29] requires: platform: [f29] references: community: https://github.com/golang-github-cpuguy83-go-md2man documentation: https://github.com/golang-github-cpuguy83-go-md2man tracker: https://github.com/golang-github-cpuguy83-go-md2man profiles: default: rpms: - go-compilers - go-srpm-macros - golang-github-cpuguy83-go-md2man - golang-github-russross-blackfriday api: rpms: - go-compilers-golang-compiler - go-srpm-macros - golang-github-cpuguy83-go-md2man buildopts: rpms: macros: | %_with_ignore_tests 1 components: rpms: go-compilers: rationale: Build dependency for Go packages. repository: git://pkgs.fedoraproject.org/rpms/go-compilers cache: http://pkgs.fedoraproject.org/repo/pkgs/go-compilers ref: f28 go-srpm-macros: rationale: Build dependency for Go packages. repository: git://pkgs.fedoraproject.org/rpms/go-srpm-macros cache: http://pkgs.fedoraproject.org/repo/pkgs/go-srpm-macros ref: f28 buildorder: 1 golang-github-cpuguy83-go-md2man: rationale: Primary component of this module. repository: git://pkgs.fedoraproject.org/rpms/golang-github-cpuguy83-go-md2man cache: http://pkgs.fedoraproject.org/repo/pkgs/golang-github-cpuguy83-go-md2man ref: f28 buildorder: 3 golang-github-russross-blackfriday: rationale: Build dependency for go-md2man. repository: git://pkgs.fedoraproject.org/rpms/golang-github-russross-blackfriday cache: http://pkgs.fedoraproject.org/repo/pkgs/golang-github-russross-blackfriday ref: f28 buildorder: 2 artifacts: rpms: - go-compilers-golang-compiler-0:1-30.module_1812+d7358d9b.x86_64 - go-srpm-macros-0:2-17.module_1812+d7358d9b.noarch - golang-github-cpuguy83-go-md2man-0:1.0.7-6.20180307git1d903dc.module_2094+e5918054.x86_64 - golang-github-cpuguy83-go-md2man-devel-0:1.0.7-6.20180307git1d903dc.module_2094+e5918054.noarch - golang-github-russross-blackfriday-devel-0:2.0.0-2.20180628git55d61fa.module_2094+e5918054.noarch ... --- document: modulemd version: 2 data: name: golang-ecosystem stream: 2017.0 version: 20180816154241 context: cbfb2833 arch: x86_64 summary: The ecosystem of packages for the Go programming language description: >- This module contains golang based tools used as dependencies for other packages, for instance, go-md2man, a manpage converter written in Go, along with rpm macros for building Go based tools. license: module: - MIT content: - MIT xmd: mbs: mse: TRUE scmurl: https://src.fedoraproject.org/modules/golang-ecosystem.git?#384b17a75c5c9be71c913651126d6899e42e8d84 commit: 384b17a75c5c9be71c913651126d6899e42e8d84 buildrequires: platform: ref: f29 stream: f29 context: 00000000 version: 5 filtered_rpms: [] golang: ref: 92882e9696b779110fd27aa11ddbc88f30eb82a2 stream: 1.10 context: 6c81f848 version: 20180816140129 filtered_rpms: [] rpms: go-srpm-macros: ref: 4f85e708533960d6edfcb6e4eef29be758b25087 go-compilers: ref: f40831872a58d2b2b28219d8ddf2931cb2f0bc2e golang-github-russross-blackfriday: ref: 5b8c2ba534b8019529df9d58b92027c6a976b40e golang-github-cpuguy83-go-md2man: ref: 5cdf8051cae5c0596f975d526ac476e6fb4ad5f0 dependencies: - buildrequires: platform: [f29] requires: platform: [f29] references: community: https://github.com/golang-github-cpuguy83-go-md2man documentation: https://github.com/golang-github-cpuguy83-go-md2man tracker: https://github.com/golang-github-cpuguy83-go-md2man profiles: default: rpms: - go-compilers - go-srpm-macros - golang-github-cpuguy83-go-md2man - golang-github-russross-blackfriday api: rpms: - go-compilers-golang-compiler - go-srpm-macros - golang-github-cpuguy83-go-md2man buildopts: rpms: macros: | %_with_ignore_tests 1 components: rpms: go-compilers: rationale: Build dependency for Go packages. repository: git://pkgs.fedoraproject.org/rpms/go-compilers cache: http://pkgs.fedoraproject.org/repo/pkgs/go-compilers ref: f28 go-srpm-macros: rationale: Build dependency for Go packages. repository: git://pkgs.fedoraproject.org/rpms/go-srpm-macros cache: http://pkgs.fedoraproject.org/repo/pkgs/go-srpm-macros ref: f28 buildorder: 1 golang-github-cpuguy83-go-md2man: rationale: Primary component of this module. repository: git://pkgs.fedoraproject.org/rpms/golang-github-cpuguy83-go-md2man cache: http://pkgs.fedoraproject.org/repo/pkgs/golang-github-cpuguy83-go-md2man ref: f28 buildorder: 3 golang-github-russross-blackfriday: rationale: Build dependency for go-md2man. repository: git://pkgs.fedoraproject.org/rpms/golang-github-russross-blackfriday cache: http://pkgs.fedoraproject.org/repo/pkgs/golang-github-russross-blackfriday ref: f28 buildorder: 2 artifacts: rpms: - go-compilers-golang-compiler-0:1-30.module_1941+86fd1e0a.x86_64 - go-srpm-macros-0:2-17.module_1941+86fd1e0a.noarch - golang-github-cpuguy83-go-md2man-0:1.0.7-6.20180307git1d903dc.module_1941+86fd1e0a.x86_64 - golang-github-cpuguy83-go-md2man-devel-0:1.0.7-6.20180307git1d903dc.module_1941+86fd1e0a.noarch - golang-github-russross-blackfriday-devel-0:2.0.0-2.20180628git55d61fa.module_1941+86fd1e0a.noarch ... --- document: modulemd version: 2 data: name: golang stream: 1.10 version: 20180816140129 context: 6c81f848 arch: x86_64 summary: The Go Programming Language description: >- This module provides the Go compiler and associated tools and documentation. license: module: - MIT content: - MIT xmd: mbs: mse: TRUE scmurl: https://src.fedoraproject.org/modules/golang.git?#92882e9696b779110fd27aa11ddbc88f30eb82a2 commit: 92882e9696b779110fd27aa11ddbc88f30eb82a2 buildrequires: platform: ref: f29 stream: f29 context: 00000000 version: 5 filtered_rpms: [] rpms: golang: ref: c333e76e869a626eb5936d311dc4ba4c29a10e09 dependencies: - buildrequires: platform: [f29] requires: platform: [f29] references: community: https://groups.google.com/forum/#!forum/golang-nuts documentation: https://golang.org/doc tracker: https://github.com/golang/go/issues profiles: default: rpms: - golang api: rpms: - golang - golang-bin - golang-docs - golang-misc - golang-race - golang-shared - golang-src - golang-tests buildopts: rpms: macros: | %_with_ignore_tests 1 components: rpms: golang: rationale: Primary component of this module repository: git://pkgs.fedoraproject.org/rpms/golang cache: http://pkgs.fedoraproject.org/repo/pkgs/golang ref: f28 artifacts: rpms: - golang-0:1.10.3-1.module_2044+a37cc272.x86_64 - golang-bin-0:1.10.3-1.module_2044+a37cc272.x86_64 - golang-docs-0:1.10.3-1.module_2044+a37cc272.noarch - golang-misc-0:1.10.3-1.module_2044+a37cc272.noarch - golang-race-0:1.10.3-1.module_2044+a37cc272.x86_64 - golang-shared-0:1.10.3-1.module_2044+a37cc272.x86_64 - golang-src-0:1.10.3-1.module_2044+a37cc272.noarch - golang-tests-0:1.10.3-1.module_2044+a37cc272.noarch ... --- document: modulemd version: 2 data: name: gimp stream: 2.10 version: 20181110211937 context: 6c81f848 arch: x86_64 summary: GIMP description: >- A module containing GIMP, the GNU Image Manipulation Program. license: module: - MIT content: - MIT xmd: mbs: mse: TRUE scmurl: https://src.fedoraproject.org/modules/gimp.git?#7794674f68fc4a5ae9e5e0b9af243b14150cee32 commit: 7794674f68fc4a5ae9e5e0b9af243b14150cee32 buildrequires: platform: ref: f29 stream: f29 context: 00000000 version: 5 filtered_rpms: [] rpms: gimp: ref: b439295fba6836264c9aaf785304bacdc60a479d dependencies: - buildrequires: platform: [f29] requires: platform: [f29] references: community: https://www.gimp.org/ documentation: https://www.gimp.org/docs/ tracker: https://www.gimp.org/bugs/ profiles: default: rpms: - gimp devel: rpms: - gimp-devel - gimp-devel-tools api: rpms: - gimp - gimp-devel - gimp-devel-tools - gimp-libs components: rpms: gimp: rationale: The API of this module. repository: git+https://src.fedoraproject.org/rpms/gimp cache: https://src.fedoraproject.org/repo/pkgs/gimp ref: 2.10 artifacts: rpms: - gimp-2:2.10.8-3.module_2456+e107f95c.x86_64 - gimp-devel-2:2.10.8-3.module_2456+e107f95c.x86_64 - gimp-devel-tools-2:2.10.8-3.module_2456+e107f95c.x86_64 - gimp-libs-2:2.10.8-3.module_2456+e107f95c.x86_64 ... --- document: modulemd version: 2 data: name: ghc stream: 8.6 version: 20181116090643 context: 6c81f848 arch: x86_64 summary: Haskell GHC 8.6 description: >- This module provides the Glasgow Haskell Compiler version 8.6.2 license: module: - MIT content: - MIT xmd: mbs: mse: TRUE scmurl: https://src.fedoraproject.org/modules/ghc.git?#e2cbe9b9be07264073cd8149ae07a15d8eebba67 commit: e2cbe9b9be07264073cd8149ae07a15d8eebba67 buildrequires: platform: ref: f29 stream: f29 context: 00000000 version: 5 filtered_rpms: [] rpms: ghc: ref: 870f5eefe3a38c7775e45559a20118c7a7522438 dependencies: - buildrequires: platform: [f29] requires: platform: [f29] references: community: https://www.haskell.org/ documentation: https://wiki.haskell.org/GHC tracker: https://ghc.haskell.org/trac/ghc/ profiles: default: description: standard installation rpms: - ghc minimal: description: just compiler and base rpms: - ghc-base-devel small: description: compiler with main core libs rpms: - ghc-libraries components: rpms: ghc: rationale: compiler repository: git+https://src.fedoraproject.org/rpms/ghc cache: https://src.fedoraproject.org/repo/pkgs/ghc ref: 8.6 buildorder: 1 artifacts: rpms: - ghc-0:8.6.2-73.module_2477+cf689485.x86_64 - ghc-Cabal-0:2.4.0.1-73.module_2477+cf689485.x86_64 - ghc-Cabal-devel-0:2.4.0.1-73.module_2477+cf689485.x86_64 - ghc-array-0:0.5.3.0-73.module_2477+cf689485.x86_64 - ghc-array-devel-0:0.5.3.0-73.module_2477+cf689485.x86_64 - ghc-base-0:4.12.0.0-73.module_2477+cf689485.x86_64 - ghc-base-devel-0:4.12.0.0-73.module_2477+cf689485.x86_64 - ghc-binary-0:0.8.6.0-73.module_2477+cf689485.x86_64 - ghc-binary-devel-0:0.8.6.0-73.module_2477+cf689485.x86_64 - ghc-bytestring-0:0.10.8.2-73.module_2477+cf689485.x86_64 - ghc-bytestring-devel-0:0.10.8.2-73.module_2477+cf689485.x86_64 - ghc-compiler-0:8.6.2-73.module_2477+cf689485.x86_64 - ghc-containers-0:0.6.0.1-73.module_2477+cf689485.x86_64 - ghc-containers-devel-0:0.6.0.1-73.module_2477+cf689485.x86_64 - ghc-deepseq-0:1.4.4.0-73.module_2477+cf689485.x86_64 - ghc-deepseq-devel-0:1.4.4.0-73.module_2477+cf689485.x86_64 - ghc-directory-0:1.3.3.0-73.module_2477+cf689485.x86_64 - ghc-directory-devel-0:1.3.3.0-73.module_2477+cf689485.x86_64 - ghc-doc-cron-0:8.6.2-73.module_2477+cf689485.noarch - ghc-filepath-0:1.4.2.1-73.module_2477+cf689485.x86_64 - ghc-filepath-devel-0:1.4.2.1-73.module_2477+cf689485.x86_64 - ghc-ghc-0:8.6.2-73.module_2477+cf689485.x86_64 - ghc-ghc-boot-0:8.6.2-73.module_2477+cf689485.x86_64 - ghc-ghc-boot-devel-0:8.6.2-73.module_2477+cf689485.x86_64 - ghc-ghc-boot-th-0:8.6.2-73.module_2477+cf689485.x86_64 - ghc-ghc-boot-th-devel-0:8.6.2-73.module_2477+cf689485.x86_64 - ghc-ghc-compact-0:0.1.0.0-73.module_2477+cf689485.x86_64 - ghc-ghc-compact-devel-0:0.1.0.0-73.module_2477+cf689485.x86_64 - ghc-ghc-devel-0:8.6.2-73.module_2477+cf689485.x86_64 - ghc-ghc-heap-0:8.6.2-73.module_2477+cf689485.x86_64 - ghc-ghc-heap-devel-0:8.6.2-73.module_2477+cf689485.x86_64 - ghc-ghci-0:8.6.2-73.module_2477+cf689485.x86_64 - ghc-ghci-devel-0:8.6.2-73.module_2477+cf689485.x86_64 - ghc-haskeline-0:0.7.4.3-73.module_2477+cf689485.x86_64 - ghc-haskeline-devel-0:0.7.4.3-73.module_2477+cf689485.x86_64 - ghc-hpc-0:0.6.0.3-73.module_2477+cf689485.x86_64 - ghc-hpc-devel-0:0.6.0.3-73.module_2477+cf689485.x86_64 - ghc-libiserv-0:8.6.1-73.module_2477+cf689485.x86_64 - ghc-libiserv-devel-0:8.6.1-73.module_2477+cf689485.x86_64 - ghc-libraries-0:8.6.2-73.module_2477+cf689485.x86_64 - ghc-manual-0:8.6.2-73.module_2477+cf689485.noarch - ghc-mtl-0:2.2.2-73.module_2477+cf689485.x86_64 - ghc-mtl-devel-0:2.2.2-73.module_2477+cf689485.x86_64 - ghc-parsec-0:3.1.13.0-73.module_2477+cf689485.x86_64 - ghc-parsec-devel-0:3.1.13.0-73.module_2477+cf689485.x86_64 - ghc-pretty-0:1.1.3.6-73.module_2477+cf689485.x86_64 - ghc-pretty-devel-0:1.1.3.6-73.module_2477+cf689485.x86_64 - ghc-process-0:1.6.3.0-73.module_2477+cf689485.x86_64 - ghc-process-devel-0:1.6.3.0-73.module_2477+cf689485.x86_64 - ghc-stm-0:2.5.0.0-73.module_2477+cf689485.x86_64 - ghc-stm-devel-0:2.5.0.0-73.module_2477+cf689485.x86_64 - ghc-template-haskell-0:2.14.0.0-73.module_2477+cf689485.x86_64 - ghc-template-haskell-devel-0:2.14.0.0-73.module_2477+cf689485.x86_64 - ghc-terminfo-0:0.4.1.2-73.module_2477+cf689485.x86_64 - ghc-terminfo-devel-0:0.4.1.2-73.module_2477+cf689485.x86_64 - ghc-text-0:1.2.3.1-73.module_2477+cf689485.x86_64 - ghc-text-devel-0:1.2.3.1-73.module_2477+cf689485.x86_64 - ghc-time-0:1.8.0.2-73.module_2477+cf689485.x86_64 - ghc-time-devel-0:1.8.0.2-73.module_2477+cf689485.x86_64 - ghc-transformers-0:0.5.5.0-73.module_2477+cf689485.x86_64 - ghc-transformers-devel-0:0.5.5.0-73.module_2477+cf689485.x86_64 - ghc-unix-0:2.7.2.2-73.module_2477+cf689485.x86_64 - ghc-unix-devel-0:2.7.2.2-73.module_2477+cf689485.x86_64 - ghc-xhtml-0:3000.2.2.1-73.module_2477+cf689485.x86_64 - ghc-xhtml-devel-0:3000.2.2.1-73.module_2477+cf689485.x86_64 ... --- document: modulemd version: 2 data: name: ghc stream: 8.4 version: 20181021113958 context: 6c81f848 arch: x86_64 summary: Haskell GHC 8.4 description: >- This module provides the Glasgow Haskell Compiler version 8.4.4. license: module: - MIT content: - MIT xmd: mbs: mse: TRUE scmurl: https://src.fedoraproject.org/modules/ghc.git?#a22968612572bcdda2bfcccc809807627a02cadf commit: a22968612572bcdda2bfcccc809807627a02cadf buildrequires: platform: ref: f29 stream: f29 context: 00000000 version: 5 filtered_rpms: [] rpms: ghc: ref: 7cb427ad37f482776eb56cf82a447ce1a1cfe7fb dependencies: - buildrequires: platform: [f29] requires: platform: [f29] references: community: https://www.haskell.org/ documentation: https://wiki.haskell.org/GHC tracker: https://ghc.haskell.org/trac/ghc/ profiles: default: description: standard installation rpms: - ghc minimal: description: just compiler and base rpms: - ghc-base-devel small: description: compiler with main core libs rpms: - ghc-libraries components: rpms: ghc: rationale: compiler repository: git+https://src.fedoraproject.org/rpms/ghc cache: https://src.fedoraproject.org/repo/pkgs/ghc ref: 8.4 buildorder: 1 artifacts: rpms: - ghc-0:8.4.4-72.module_2317+a1d9fed8.x86_64 - ghc-Cabal-0:2.2.0.1-72.module_2317+a1d9fed8.x86_64 - ghc-Cabal-devel-0:2.2.0.1-72.module_2317+a1d9fed8.x86_64 - ghc-array-0:0.5.2.0-72.module_2317+a1d9fed8.x86_64 - ghc-array-devel-0:0.5.2.0-72.module_2317+a1d9fed8.x86_64 - ghc-base-0:4.11.1.0-72.module_2317+a1d9fed8.x86_64 - ghc-base-devel-0:4.11.1.0-72.module_2317+a1d9fed8.x86_64 - ghc-binary-0:0.8.5.1-72.module_2317+a1d9fed8.x86_64 - ghc-binary-devel-0:0.8.5.1-72.module_2317+a1d9fed8.x86_64 - ghc-bytestring-0:0.10.8.2-72.module_2317+a1d9fed8.x86_64 - ghc-bytestring-devel-0:0.10.8.2-72.module_2317+a1d9fed8.x86_64 - ghc-compiler-0:8.4.4-72.module_2317+a1d9fed8.x86_64 - ghc-containers-0:0.5.11.0-72.module_2317+a1d9fed8.x86_64 - ghc-containers-devel-0:0.5.11.0-72.module_2317+a1d9fed8.x86_64 - ghc-deepseq-0:1.4.3.0-72.module_2317+a1d9fed8.x86_64 - ghc-deepseq-devel-0:1.4.3.0-72.module_2317+a1d9fed8.x86_64 - ghc-directory-0:1.3.1.5-72.module_2317+a1d9fed8.x86_64 - ghc-directory-devel-0:1.3.1.5-72.module_2317+a1d9fed8.x86_64 - ghc-doc-cron-0:8.4.4-72.module_2317+a1d9fed8.noarch - ghc-filepath-0:1.4.2-72.module_2317+a1d9fed8.x86_64 - ghc-filepath-devel-0:1.4.2-72.module_2317+a1d9fed8.x86_64 - ghc-ghc-0:8.4.4-72.module_2317+a1d9fed8.x86_64 - ghc-ghc-boot-0:8.4.4-72.module_2317+a1d9fed8.x86_64 - ghc-ghc-boot-devel-0:8.4.4-72.module_2317+a1d9fed8.x86_64 - ghc-ghc-boot-th-0:8.4.4-72.module_2317+a1d9fed8.x86_64 - ghc-ghc-boot-th-devel-0:8.4.4-72.module_2317+a1d9fed8.x86_64 - ghc-ghc-compact-0:0.1.0.0-72.module_2317+a1d9fed8.x86_64 - ghc-ghc-compact-devel-0:0.1.0.0-72.module_2317+a1d9fed8.x86_64 - ghc-ghc-devel-0:8.4.4-72.module_2317+a1d9fed8.x86_64 - ghc-ghci-0:8.4.4-72.module_2317+a1d9fed8.x86_64 - ghc-ghci-devel-0:8.4.4-72.module_2317+a1d9fed8.x86_64 - ghc-haskeline-0:0.7.4.2-72.module_2317+a1d9fed8.x86_64 - ghc-haskeline-devel-0:0.7.4.2-72.module_2317+a1d9fed8.x86_64 - ghc-hpc-0:0.6.0.3-72.module_2317+a1d9fed8.x86_64 - ghc-hpc-devel-0:0.6.0.3-72.module_2317+a1d9fed8.x86_64 - ghc-libraries-0:8.4.4-72.module_2317+a1d9fed8.x86_64 - ghc-manual-0:8.4.4-72.module_2317+a1d9fed8.noarch - ghc-mtl-0:2.2.2-72.module_2317+a1d9fed8.x86_64 - ghc-mtl-devel-0:2.2.2-72.module_2317+a1d9fed8.x86_64 - ghc-parsec-0:3.1.13.0-72.module_2317+a1d9fed8.x86_64 - ghc-parsec-devel-0:3.1.13.0-72.module_2317+a1d9fed8.x86_64 - ghc-pretty-0:1.1.3.6-72.module_2317+a1d9fed8.x86_64 - ghc-pretty-devel-0:1.1.3.6-72.module_2317+a1d9fed8.x86_64 - ghc-process-0:1.6.3.0-72.module_2317+a1d9fed8.x86_64 - ghc-process-devel-0:1.6.3.0-72.module_2317+a1d9fed8.x86_64 - ghc-stm-0:2.4.5.1-72.module_2317+a1d9fed8.x86_64 - ghc-stm-devel-0:2.4.5.1-72.module_2317+a1d9fed8.x86_64 - ghc-template-haskell-0:2.13.0.0-72.module_2317+a1d9fed8.x86_64 - ghc-template-haskell-devel-0:2.13.0.0-72.module_2317+a1d9fed8.x86_64 - ghc-terminfo-0:0.4.1.1-72.module_2317+a1d9fed8.x86_64 - ghc-terminfo-devel-0:0.4.1.1-72.module_2317+a1d9fed8.x86_64 - ghc-text-0:1.2.3.1-72.module_2317+a1d9fed8.x86_64 - ghc-text-devel-0:1.2.3.1-72.module_2317+a1d9fed8.x86_64 - ghc-time-0:1.8.0.2-72.module_2317+a1d9fed8.x86_64 - ghc-time-devel-0:1.8.0.2-72.module_2317+a1d9fed8.x86_64 - ghc-transformers-0:0.5.5.0-72.module_2317+a1d9fed8.x86_64 - ghc-transformers-devel-0:0.5.5.0-72.module_2317+a1d9fed8.x86_64 - ghc-unix-0:2.7.2.2-72.module_2317+a1d9fed8.x86_64 - ghc-unix-devel-0:2.7.2.2-72.module_2317+a1d9fed8.x86_64 - ghc-xhtml-0:3000.2.2.1-72.module_2317+a1d9fed8.x86_64 - ghc-xhtml-devel-0:3000.2.2.1-72.module_2317+a1d9fed8.x86_64 ... --- document: modulemd version: 2 data: name: gcsf stream: main version: 20180804153258 context: b33445dc arch: x86_64 summary: FUSE file system based on Google Drive description: > GCSF is a virtual filesystem that allows users to mount their Google Drive account locally and interact with it as a regular disk partition. license: module: - MIT content: - MIT xmd: mbs: mse: TRUE scmurl: https://src.fedoraproject.org/modules/gcsf.git?#bb5cd4eaae70cda43091e1bf45043d38fa155064 commit: bb5cd4eaae70cda43091e1bf45043d38fa155064 buildrequires: platform: ref: f29 stream: f29 context: 00000000 version: 5 filtered_rpms: [] rpms: rust-gcsf: ref: 56af97ed27afeccc68bddffac38606da5b8f8ed7 dependencies: - buildrequires: platform: [f29] requires: platform: [] references: community: https://github.com/harababurel/gcsf documentation: https://github.com/harababurel/gcsf/blob/ad5d8bbd6d55254eb94a056292e9872662bb65c5/README.md tracker: https://github.com/harababurel/gcsf/issues profiles: default: rpms: - gcsf api: rpms: - gcsf components: rpms: rust-gcsf: rationale: Main component. repository: git://pkgs.fedoraproject.org/rpms/rust-gcsf cache: http://pkgs.fedoraproject.org/repo/pkgs/rust-gcsf ref: main artifacts: rpms: - gcsf-0:0.1.17-1.module_1970+c9821572.x86_64 - rust-gcsf-devel-0:0.1.17-1.module_1970+c9821572.noarch ... --- document: modulemd version: 2 data: name: flatpak-runtime stream: f29 version: 20180821220306 context: 6c81f848 arch: x86_64 summary: Flatpak Runtime description: >- This module defines two runtimes for Flatpaks, the 'runtime' profile that most Flatpaks in Fedora use, and a smaller 'runtime-base' profile that is intended to be more minimal and (slightly) more API stable. There are also corresponding sdk and sdk-base profiles that are used to build SDKs that applications can be built against with flatpak-builder. license: module: - MIT content: - MIT xmd: flatpak: runtimes: sdk: id: org.fedoraproject.Sdk sdk: org.fedoraproject.Platform sdk-base: id: org.fedoraproject.BaseSdk sdk: org.fedoraproject.BasePlatform runtime: id: org.fedoraproject.Platform sdk: org.fedoraproject.Sdk runtime-base: id: org.fedoraproject.BasePlatform sdk: org.fedoraproject.BaseSdk branch: f29 mbs: mse: TRUE scmurl: https://src.fedoraproject.org/modules/flatpak-runtime.git?#32b413f59feb051f360b242d065496f330f2ae9a commit: 32b413f59feb051f360b242d065496f330f2ae9a buildrequires: platform: ref: f29 stream: f29 context: 00000000 version: 5 filtered_rpms: [] rpms: flatpak-runtime-config: ref: eab96c8f9b8f4c96b8e1eddd0fb57bb64025da61 flatpak-rpm-macros: ref: e51f66a27ac1c1ef5ae64be5aef3bdcde2124b64 dependencies: - buildrequires: platform: [f29] requires: platform: [f29] profiles: buildroot: rpms: - flatpak-rpm-macros - flatpak-runtime-config runtime: rpms: - ModemManager-glib - SDL2 - SDL2_image - SDL2_mixer - SDL2_net - SDL2_ttf - abattis-cantarell-fonts - acl - adwaita-cursor-theme - adwaita-gtk2-theme - adwaita-icon-theme - alsa-lib - aspell - at-spi2-atk - at-spi2-core - atk - attr - audit-libs - avahi-glib - avahi-libs - basesystem - bash - brotli - bzip2 - bzip2-libs - ca-certificates - cairo - cairo-gobject - cdparanoia-libs - chkconfig - clutter - clutter-gst3 - clutter-gtk - cogl - colord-libs - compat-readline6 - coreutils - coreutils-common - cpio - cracklib - crypto-policies - cryptsetup-libs - cups-libs - curl - cyrus-sasl-lib - dbus - dbus-common - dbus-daemon - dbus-glib - dbus-libs - dbus-tools - dbus-x11 - dconf - dejavu-fonts-common - dejavu-sans-fonts - dejavu-sans-mono-fonts - dejavu-serif-fonts - desktop-file-utils - device-mapper - device-mapper-libs - elfutils - elfutils-default-yama-scope - elfutils-libelf - elfutils-libs - emacs-filesystem - enchant - eosrei-emojione-fonts - expat - fedora-gpg-keys - fedora-release - fedora-repos - fedora-repos-rawhide - file - file-libs - filesystem - findutils - flac-libs - flatpak-runtime-config - fontconfig - fontpackages-filesystem - freetype - fribidi - gawk - gcr - gdbm - gdbm-libs - gdk-pixbuf2 - gdk-pixbuf2-modules - geoclue2 - geoclue2-libs - gjs - glib-networking - glib2 - glibc - glibc-all-langpacks - glibc-common - glibc-minimal-langpack - gmp - gnome-themes-extra - gnu-free-fonts-common - gnu-free-mono-fonts - gnu-free-sans-fonts - gnu-free-serif-fonts - gnupg - gnupg2 - gnupg2-smime - gnutls - gobject-introspection - google-crosextra-caladea-fonts - google-crosextra-carlito-fonts - google-noto-emoji-color-fonts - gpgme - graphite2 - grep - gsettings-desktop-schemas - gsm - gssdp - gstreamer1 - gstreamer1-plugins-bad-free - gstreamer1-plugins-base - gtk-update-icon-cache - gtk2 - gtk2-engines - gtk3 - gupnp - gupnp-igd - gzip - harfbuzz - harfbuzz-icu - hicolor-icon-theme - hunspell - hunspell-en-US - hwdata - hyphen - ibus-libs - info - iptables-libs - iso-codes - jasper-libs - jbigkit-libs - json-c - json-glib - keyutils-libs - kmod-libs - krb5-libs - krb5-server - krb5-workstation - lcms2 - lcms2-utils - less - libICE - libSM - libX11 - libX11-common - libX11-xcb - libXScrnSaver - libXau - libXcomposite - libXcursor - libXdamage - libXdmcp - libXext - libXfixes - libXft - libXi - libXinerama - libXpm - libXrandr - libXrender - libXt - libXtst - libXv - libXxf86vm - libacl - libappstream-glib - libarchive - libargon2 - libassuan - libasyncns - libatomic - libattr - libblkid - libcanberra - libcanberra-gtk2 - libcanberra-gtk3 - libcap - libcap-ng - libcom_err - libcroco - libcurl - libdatrie - libdb - libdrm - libdvdnav - libdvdread - libedit - libepoxy - liberation-fonts-common - liberation-mono-fonts - liberation-sans-fonts - liberation-serif-fonts - libev - libevdev - libexif - libfdisk - libffi - libgcab1 - libgcc - libgcrypt - libgfortran - libglvnd - libglvnd-egl - libglvnd-gles - libglvnd-glx - libglvnd-opengl - libgomp - libgpg-error - libgudev - libgusb - libicu - libidn2 - libinput - libjpeg-turbo - libkadm5 - libksba - libmetalink - libmodman - libmount - libmpc - libmpcdec - libnghttp2 - libnice - libnotify - libnsl - libnsl2 - libogg - libpcap - libpciaccess - libpkgconf - libpng - libproxy - libpsl - libpwquality - libquadmath - librsvg2 - librsvg2-tools - libsamplerate - libseccomp - libsecret - libselinux - libsemanage - libsepol - libsigsegv - libsmartcols - libsndfile - libsoup - libsrtp - libss - libssh - libstdc++ - libstemmer - libtasn1 - libtdb - libthai - libtheora - libtiff - libtirpc - libtool-ltdl - libunistring - libusb - libusbx - libutempter - libuuid - libvdpau - libverto - libverto-libev - libvisual - libvorbis - libwacom - libwacom-data - libwayland-client - libwayland-cursor - libwayland-egl - libwayland-server - libwebp - libxcb - libxcrypt - libxkbcommon - libxkbcommon-x11 - libxml2 - libxshmfence - libxslt - llvm-libs - llvm6.0-libs - logrotate - lz4-libs - mesa-dri-drivers - mesa-filesystem - mesa-libEGL - mesa-libGL - mesa-libgbm - mesa-libglapi - mesa-libxatracker - mesa-vulkan-drivers - mlocate - mozjs52 - mpfr - mpg123-libs - mtdev - mythes - ncompress - ncurses - ncurses-base - ncurses-compat-libs - ncurses-libs - nettle - npth - nspr - nss - nss-softokn - nss-softokn-freebl - nss-sysinit - nss-tools - nss-util - ocl-icd - openal-soft - openldap - openssl - openssl-libs - opus - orc - p11-kit - p11-kit-trust - pam - pango - pcre - pcre-cpp - pcre2 - pcre2-utf16 - pcre2-utf32 - pinentry - pixman - pkgconf - pkgconf-m4 - pkgconf-pkg-config - popt - procps-ng - publicsuffix-list-dafsa - pulseaudio-libs - pulseaudio-libs-glib2 - pulseaudio-utils - python-pip-wheel - python-setuptools-wheel - python-unversioned-command - python2 - python2-libproxy - python2-libs - python2-libxml2 - python2-pip - python2-setuptools - python3 - python3-libs - python3-pip - python3-setuptools - qrencode-libs - readline - rest - rpcgen - sed - setup - shadow-utils - shared-mime-info - sound-theme-freedesktop - soundtouch - speex - speexdsp - spirv-tools-libs - sqlite-libs - systemd - systemd-libs - systemd-pam - tar - turbojpeg - tzdata - unzip - util-linux - vte-profile - vte291 - vulkan-loader - vulkan-validation-layers - webkit2gtk3 - webkit2gtk3-jsc - webrtc-audio-processing - which - woff2 - words - xcb-util - xcb-util-cursor - xcb-util-image - xcb-util-keysyms - xcb-util-renderutil - xcb-util-wm - xdg-user-dirs - xdg-utils - xkeyboard-config - xml-common - xz - xz-libs - xz-lzma-compat - yelp - yelp-libs - yelp-xsl - zenity - zip - zlib runtime-base: rpms: - ModemManager-glib - SDL2 - SDL2_image - SDL2_mixer - SDL2_net - SDL2_ttf - acl - adwaita-cursor-theme - adwaita-icon-theme - alsa-lib - aspell - at-spi2-atk - at-spi2-core - atk - attr - audit-libs - avahi-glib - avahi-libs - basesystem - bash - brotli - bzip2 - bzip2-libs - ca-certificates - cairo - cairo-gobject - cdparanoia-libs - chkconfig - colord-libs - compat-readline6 - coreutils - coreutils-common - cpio - cracklib - crypto-policies - cryptsetup-libs - cups-libs - curl - cyrus-sasl-lib - dbus - dbus-common - dbus-daemon - dbus-libs - dbus-tools - dbus-x11 - dconf - dejavu-fonts-common - dejavu-sans-fonts - dejavu-sans-mono-fonts - dejavu-serif-fonts - desktop-file-utils - device-mapper - device-mapper-libs - elfutils - elfutils-default-yama-scope - elfutils-libelf - elfutils-libs - emacs-filesystem - eosrei-emojione-fonts - expat - fedora-gpg-keys - fedora-release - fedora-repos - fedora-repos-rawhide - file - file-libs - filesystem - findutils - flac-libs - flatpak-runtime-config - fontconfig - fontpackages-filesystem - freetype - fribidi - gawk - gdbm - gdbm-libs - gdk-pixbuf2 - gdk-pixbuf2-modules - geoclue2 - geoclue2-libs - glib-networking - glib2 - glibc - glibc-all-langpacks - glibc-common - glibc-minimal-langpack - gmp - gnu-free-fonts-common - gnu-free-mono-fonts - gnu-free-sans-fonts - gnu-free-serif-fonts - gnupg - gnupg2 - gnupg2-smime - gnutls - gobject-introspection - google-crosextra-caladea-fonts - google-crosextra-carlito-fonts - gpgme - graphite2 - grep - gsettings-desktop-schemas - gsm - gssdp - gstreamer1 - gstreamer1-plugins-bad-free - gstreamer1-plugins-base - gtk-update-icon-cache - gtk3 - gupnp - gupnp-igd - gzip - harfbuzz - harfbuzz-icu - hicolor-icon-theme - hunspell - hunspell-en-US - hwdata - hyphen - ibus-libs - info - iptables-libs - iso-codes - jasper-libs - jbigkit-libs - json-c - json-glib - keyutils-libs - kmod-libs - krb5-libs - krb5-server - krb5-workstation - lcms2 - lcms2-utils - less - libICE - libSM - libX11 - libX11-common - libX11-xcb - libXScrnSaver - libXau - libXcomposite - libXcursor - libXdamage - libXdmcp - libXext - libXfixes - libXft - libXi - libXinerama - libXpm - libXrandr - libXrender - libXt - libXtst - libXv - libXxf86vm - libacl - libappstream-glib - libarchive - libargon2 - libassuan - libasyncns - libatomic - libattr - libblkid - libcap - libcap-ng - libcom_err - libcroco - libcurl - libdatrie - libdb - libdrm - libdvdnav - libdvdread - libedit - libepoxy - liberation-fonts-common - liberation-mono-fonts - liberation-sans-fonts - liberation-serif-fonts - libev - libexif - libfdisk - libffi - libgcab1 - libgcc - libgcrypt - libgfortran - libglvnd - libglvnd-egl - libglvnd-gles - libglvnd-glx - libglvnd-opengl - libgomp - libgpg-error - libgudev - libgusb - libicu - libidn2 - libjpeg-turbo - libkadm5 - libksba - libmetalink - libmodman - libmount - libmpc - libmpcdec - libnghttp2 - libnice - libnotify - libnsl - libnsl2 - libogg - libpcap - libpciaccess - libpkgconf - libpng - libproxy - libpsl - libpwquality - libquadmath - librsvg2 - librsvg2-tools - libsamplerate - libseccomp - libsecret - libselinux - libsemanage - libsepol - libsigsegv - libsmartcols - libsndfile - libsoup - libsrtp - libss - libssh - libstdc++ - libstemmer - libtasn1 - libthai - libtheora - libtiff - libtirpc - libtool-ltdl - libunistring - libusb - libusbx - libutempter - libuuid - libvdpau - libverto - libverto-libev - libvisual - libvorbis - libwayland-client - libwayland-cursor - libwayland-egl - libwayland-server - libwebp - libxcb - libxcrypt - libxkbcommon - libxkbcommon-x11 - libxml2 - libxshmfence - libxslt - llvm-libs - llvm6.0-libs - logrotate - lz4-libs - mesa-libEGL - mesa-libGL - mesa-libgbm - mesa-libglapi - mesa-libxatracker - mesa-vulkan-drivers - mlocate - mpfr - mpg123-libs - mythes - ncompress - ncurses - ncurses-base - ncurses-compat-libs - ncurses-libs - nettle - npth - nspr - nss - nss-softokn - nss-softokn-freebl - nss-sysinit - nss-tools - nss-util - ocl-icd - openal-soft - openldap - openssl - openssl-libs - opus - orc - p11-kit - p11-kit-trust - pam - pango - pcre - pcre-cpp - pcre2 - pcre2-utf16 - pcre2-utf32 - pinentry - pixman - pkgconf - pkgconf-m4 - pkgconf-pkg-config - popt - procps-ng - publicsuffix-list-dafsa - pulseaudio-libs - pulseaudio-libs-glib2 - pulseaudio-utils - python-unversioned-command - python2 - python2-libproxy - python2-libs - python2-libxml2 - python2-pip - python2-setuptools - python3 - python3-libs - python3-pip - python3-setuptools - qrencode-libs - readline - rest - rpcgen - sed - setup - shadow-utils - shared-mime-info - soundtouch - speex - speexdsp - spirv-tools-libs - sqlite-libs - systemd - systemd-libs - systemd-pam - tar - turbojpeg - tzdata - unzip - util-linux - vulkan-loader - vulkan-validation-layers - webrtc-audio-processing - which - words - xcb-util - xcb-util-cursor - xcb-util-image - xcb-util-keysyms - xcb-util-renderutil - xcb-util-wm - xdg-user-dirs - xdg-utils - xkeyboard-config - xml-common - xz - xz-libs - xz-lzma-compat - zenity - zip - zlib sdk: rpms: - ModemManager-glib - SDL2 - SDL2-devel - SDL2_image - SDL2_image-devel - SDL2_mixer - SDL2_mixer-devel - SDL2_net - SDL2_net-devel - SDL2_ttf - SDL2_ttf-devel - abattis-cantarell-fonts - acl - adwaita-cursor-theme - adwaita-gtk2-theme - adwaita-icon-theme - adwaita-icon-theme-devel - alsa-lib - alsa-lib-devel - annobin - aspell - aspell-devel - at-spi2-atk - at-spi2-atk-devel - at-spi2-core - at-spi2-core-devel - atk - atk-devel - attr - audit-libs - autoconf - autoconf-archive - autogen-libopts - automake - avahi-glib - avahi-libs - basesystem - bash - bash-completion - bc - binutils - bison - boost-regex - brotli - brotli-devel - byacc - bzip2 - bzip2-devel - bzip2-libs - ca-certificates - cairo - cairo-devel - cairo-gobject - cairo-gobject-devel - cairo-tools - ccache - cdparanoia-libs - check - check-devel - chkconfig - chrpath - clang - clang-analyzer - clang-devel - clang-libs - clang-tools-extra - clutter - clutter-devel - clutter-gst3 - clutter-gst3-devel - clutter-gtk - clutter-gtk-devel - cmake - cmake-data - cmake-filesystem - cmake-rpm-macros - cogl - cogl-devel - colord-libs - compat-readline6 - coreutils - coreutils-common - cpio - cpp - cracklib - cracklib-devel - crypto-policies - cryptsetup-libs - ctags - cups-devel - cups-libs - curl - cvs - cvsps - cyrus-sasl - cyrus-sasl-devel - cyrus-sasl-lib - dbus - dbus-common - dbus-daemon - dbus-devel - dbus-glib - dbus-glib-devel - dbus-libs - dbus-tools - dbus-x11 - dconf - dconf-devel - dejavu-fonts-common - dejavu-sans-fonts - dejavu-sans-mono-fonts - dejavu-serif-fonts - desktop-file-utils - device-mapper - device-mapper-libs - diffutils - docbook-dtds - docbook-style-dsssl - docbook-style-xsl - docbook-utils - dwz - e2fsprogs - e2fsprogs-devel - e2fsprogs-libs - efi-srpm-macros - elfutils - elfutils-default-yama-scope - elfutils-devel - elfutils-libelf - elfutils-libelf-devel - elfutils-libs - elinks - emacs-filesystem - enchant - enchant-devel - eosrei-emojione-fonts - expat - expat-devel - fedora-gpg-keys - fedora-release - fedora-repos - fedora-repos-rawhide - file - file-libs - filesystem - findutils - fipscheck - fipscheck-lib - flac - flac-devel - flac-libs - flatpak-runtime-config - flex - fontconfig - fontconfig-devel - fontpackages-filesystem - fpc-srpm-macros - freetype - freetype-devel - fribidi - fribidi-devel - fuse-libs - gawk - gc - gcc - gcc-c++ - gcr - gcr-devel - gdb - gdb-headless - gdbm - gdbm-devel - gdbm-libs - gdk-pixbuf2 - gdk-pixbuf2-devel - gdk-pixbuf2-modules - geoclue2 - geoclue2-devel - geoclue2-libs - gettext - gettext-common-devel - gettext-devel - gettext-libs - ghc-srpm-macros - giflib - giflib-devel - git - git-clang-format - git-core - git-core-doc - git-cvs - gjs - gjs-devel - glib-networking - glib2 - glib2-devel - glibc - glibc-all-langpacks - glibc-common - glibc-devel - glibc-headers - glibc-minimal-langpack - gmp - gmp-c++ - gmp-devel - gnat-srpm-macros - gnome-common - gnome-themes-extra - gnu-free-fonts-common - gnu-free-mono-fonts - gnu-free-sans-fonts - gnu-free-serif-fonts - gnupg - gnupg2 - gnupg2-smime - gnutls - gnutls-c++ - gnutls-dane - gnutls-devel - gnutls-utils - go-srpm-macros - gobject-introspection - gobject-introspection-devel - google-crosextra-caladea-fonts - google-crosextra-carlito-fonts - google-noto-emoji-color-fonts - gperf - gpgme - gpgme-devel - gpm-libs - graphite2 - graphite2-devel - grep - groff - groff-base - groff-perl - gsettings-desktop-schemas - gsettings-desktop-schemas-devel - gsm - gssdp - gstreamer1 - gstreamer1-devel - gstreamer1-plugins-bad-free - gstreamer1-plugins-bad-free-devel - gstreamer1-plugins-base - gstreamer1-plugins-base-devel - gtk-doc - gtk-update-icon-cache - gtk2 - gtk2-devel - gtk2-engines - gtk2-engines-devel - gtk3 - gtk3-devel - guile - gupnp - gupnp-igd - gvfs-client - gvfs-devel - gzip - harfbuzz - harfbuzz-devel - harfbuzz-icu - hicolor-icon-theme - hunspell - hunspell-devel - hunspell-en-US - hwdata - hyphen - hyphen-devel - ibus - ibus-devel - ibus-gtk2 - ibus-gtk3 - ibus-libs - ibus-setup - icu - info - intltool - iptables-libs - isl - iso-codes - iso-codes-devel - itstool - jasper-libs - jbigkit-libs - jq - jq-devel - json-c - json-c-devel - json-glib - json-glib-devel - jsoncpp - kernel-headers - keyutils-libs - keyutils-libs-devel - kmod-libs - krb5-devel - krb5-libs - krb5-server - krb5-workstation - lcms2 - lcms2-devel - lcms2-utils - less - libICE - libICE-devel - libSM - libSM-devel - libX11 - libX11-common - libX11-devel - libX11-xcb - libXScrnSaver - libXScrnSaver-devel - libXau - libXau-devel - libXaw - libXcomposite - libXcomposite-devel - libXcursor - libXcursor-devel - libXdamage - libXdamage-devel - libXdmcp - libXdmcp-devel - libXext - libXext-devel - libXfixes - libXfixes-devel - libXft - libXft-devel - libXi - libXi-devel - libXinerama - libXinerama-devel - libXmu - libXpm - libXpm-devel - libXrandr - libXrandr-devel - libXrender - libXrender-devel - libXt - libXt-devel - libXtst - libXtst-devel - libXv - libXv-devel - libXxf86misc - libXxf86vm - libXxf86vm-devel - libacl - libacl-devel - libappstream-glib - libappstream-glib-builder - libappstream-glib-builder-devel - libappstream-glib-devel - libarchive - libarchive-devel - libargon2 - libassuan - libassuan-devel - libasyncns - libatomic - libatomic_ops - libatomic_ops-devel - libattr - libattr-devel - libbabeltrace - libblkid - libblkid-devel - libcanberra - libcanberra-devel - libcanberra-gtk2 - libcanberra-gtk3 - libcap - libcap-devel - libcap-ng - libcom_err - libcom_err-devel - libcroco - libcroco-devel - libcurl - libcurl-devel - libdatrie - libdatrie-devel - libdb - libdb-cxx - libdb-cxx-devel - libdb-devel - libdb-utils - libdrm - libdrm-devel - libdvdnav - libdvdread - libedit - libedit-devel - libepoxy - libepoxy-devel - liberation-fonts-common - liberation-mono-fonts - liberation-sans-fonts - liberation-serif-fonts - libev - libevdev - libevent - libexif - libexif-devel - libfdisk - libfdisk-devel - libffi - libffi-devel - libgcab1 - libgcab1-devel - libgcc - libgcrypt - libgcrypt-devel - libgfortran - libglvnd - libglvnd-core-devel - libglvnd-devel - libglvnd-egl - libglvnd-gles - libglvnd-glx - libglvnd-opengl - libgomp - libgpg-error - libgpg-error-devel - libgudev - libgusb - libicu - libicu-devel - libidn - libidn-devel - libidn2 - libinput - libinput-devel - libipt - libjpeg-turbo - libjpeg-turbo-devel - libkadm5 - libksba - libmcpp - libmetalink - libmodman - libmount - libmount-devel - libmpc - libmpc-devel - libmpcdec - libnghttp2 - libnice - libnotify - libnotify-devel - libnsl - libnsl2 - libnsl2-devel - libogg - libogg-devel - libpcap - libpciaccess - libpciaccess-devel - libpipeline - libpkgconf - libpng - libpng-devel - libproxy - libproxy-devel - libpsl - libpwquality - libquadmath - librsvg2 - librsvg2-devel - librsvg2-tools - libsamplerate - libsamplerate-devel - libseccomp - libseccomp-devel - libsecret - libsecret-devel - libselinux - libselinux-devel - libsemanage - libsepol - libsepol-devel - libsigsegv - libsmartcols - libsmartcols-devel - libsndfile - libsndfile-devel - libsoup - libsoup-devel - libsrtp - libss - libss-devel - libssh - libstdc++ - libstdc++-devel - libstemmer - libtasn1 - libtasn1-devel - libtasn1-tools - libtdb - libthai - libthai-devel - libtheora - libtheora-devel - libtiff - libtiff-devel - libtirpc - libtirpc-devel - libtool - libtool-ltdl - libtool-ltdl-devel - libunistring - libusb - libusbx - libutempter - libuuid - libuuid-devel - libuv - libva - libva-devel - libva-utils - libvdpau - libvdpau-devel - libvdpau-trace - libverto - libverto-devel - libverto-libev - libvisual - libvorbis - libvorbis-devel - libvpx - libvpx-devel - libwacom - libwacom-data - libwayland-client - libwayland-cursor - libwayland-egl - libwayland-server - libwebp - libwebp-devel - libxcb - libxcb-devel - libxcrypt - libxcrypt-devel - libxkbcommon - libxkbcommon-devel - libxkbcommon-x11 - libxkbcommon-x11-devel - libxkbfile - libxml2 - libxml2-devel - libxshmfence - libxshmfence-devel - libxslt - libxslt-devel - libyaml - libyaml-devel - libzstd - llvm - llvm-devel - llvm-libs - llvm6.0-libs - logrotate - lua-libs - lz4-libs - m4 - make - mallard-rng - man-db - man2html-core - mcpp - mercurial - mesa-dri-drivers - mesa-filesystem - mesa-libEGL - mesa-libEGL-devel - mesa-libGL - mesa-libGL-devel - mesa-libGLES - mesa-libGLES-devel - mesa-libgbm - mesa-libgbm-devel - mesa-libglapi - mesa-libxatracker - mesa-libxatracker-devel - mesa-vulkan-devel - mesa-vulkan-drivers - meson - mlocate - mozjs52 - mozjs52-devel - mpfr - mpfr-devel - mpg123-devel - mpg123-libs - mtdev - mythes - mythes-devel - nasm - ncompress - ncurses - ncurses-base - ncurses-c++-libs - ncurses-compat-libs - ncurses-devel - ncurses-libs - nettle - nettle-devel - nim-srpm-macros - ninja-build - npth - nspr - nspr-devel - nss - nss-devel - nss-pkcs11-devel - nss-softokn - nss-softokn-devel - nss-softokn-freebl - nss-softokn-freebl-devel - nss-sysinit - nss-tools - nss-util - nss-util-devel - nss_db - nss_hesiod - nss_nis - numactl-libs - ocaml-srpm-macros - ocl-icd - ocl-icd-devel - oniguruma - openal-soft - openal-soft-devel - openblas-srpm-macros - opencl-headers - openjade - openjpeg2 - openldap - opensp - openssh - openssh-clients - openssl - openssl-devel - openssl-libs - opus - opus-devel - orc - orc-compiler - orc-devel - p11-kit - p11-kit-devel - p11-kit-trust - pam - pam-devel - pango - pango-devel - patch - pcre - pcre-cpp - pcre-devel - pcre-utf16 - pcre-utf32 - pcre2 - pcre2-devel - pcre2-utf16 - pcre2-utf32 - perf - perl-Algorithm-Diff - perl-Archive-Tar - perl-Archive-Zip - perl-CPAN - perl-CPAN-Meta - perl-CPAN-Meta-Requirements - perl-CPAN-Meta-YAML - perl-Carp - perl-Compress-Bzip2 - perl-Compress-Raw-Bzip2 - perl-Compress-Raw-Zlib - perl-DBD-SQLite - perl-DBI - perl-Data-Dumper - perl-Data-OptList - perl-Data-Section - perl-Devel-Size - perl-Digest - perl-Digest-MD5 - perl-Digest-SHA - perl-Encode - perl-Encode-devel - perl-Errno - perl-Error - perl-Exporter - perl-ExtUtils-CBuilder - perl-ExtUtils-Command - perl-ExtUtils-Install - perl-ExtUtils-MM-Utils - perl-ExtUtils-MakeMaker - perl-ExtUtils-Manifest - perl-ExtUtils-ParseXS - perl-File-HomeDir - perl-File-Path - perl-File-Temp - perl-File-Which - perl-Filter - perl-Getopt-Long - perl-Git - perl-HTTP-Tiny - perl-IO - perl-IO-Compress - perl-IO-Socket-IP - perl-IO-Zlib - perl-IPC-Cmd - perl-JSON-PP - perl-Locale-Maketext - perl-Locale-Maketext-Simple - perl-MIME-Base64 - perl-MRO-Compat - perl-Math-BigInt - perl-Math-Complex - perl-Module-Build - perl-Module-CoreList - perl-Module-CoreList-tools - perl-Module-Load - perl-Module-Load-Conditional - perl-Module-Metadata - perl-Net-Ping - perl-Package-Generator - perl-Params-Check - perl-Params-Util - perl-PathTools - perl-Perl-OSType - perl-Pod-Checker - perl-Pod-Escapes - perl-Pod-Html - perl-Pod-Parser - perl-Pod-Perldoc - perl-Pod-Simple - perl-Pod-Usage - perl-SGMLSpm - perl-Scalar-List-Utils - perl-Socket - perl-Software-License - perl-Storable - perl-Sub-Exporter - perl-Sub-Install - perl-Term-ANSIColor - perl-Term-Cap - perl-TermReadKey - perl-Test-Harness - perl-Text-Diff - perl-Text-Glob - perl-Text-ParseWords - perl-Text-Tabs+Wrap - perl-Text-Template - perl-Text-Unidecode - perl-Thread-Queue - perl-Time-HiRes - perl-Time-Local - perl-URI - perl-Unicode-EastAsianWidth - perl-Unicode-Normalize - perl-XML-Parser - perl-XML-XPath - perl-constant - perl-devel - perl-encoding - perl-inc-latest - perl-interpreter - perl-libintl-perl - perl-libnet - perl-libnetcfg - perl-libs - perl-local-lib - perl-macros - perl-open - perl-parent - perl-podlators - perl-srpm-macros - perl-threads - perl-threads-shared - perl-utils - perl-version - pinentry - pixman - pixman-devel - pkgconf - pkgconf-m4 - pkgconf-pkg-config - poppler - poppler-data - popt - popt-devel - procps-ng - publicsuffix-list-dafsa - pulseaudio-libs - pulseaudio-libs-devel - pulseaudio-libs-glib2 - pulseaudio-utils - pygobject3-devel - python-rpm-macros - python-srpm-macros - python-unversioned-command - python2 - python2-cairo - python2-devel - python2-gobject - python2-gobject-base - python2-libproxy - python2-libs - python2-libxml2 - python2-mako - python2-markupsafe - python2-pip - python2-rpm-macros - python2-setuptools - python2-xpyb - python3 - python3-cairo - python3-cairo-devel - python3-devel - python3-gobject - python3-gobject-base - python3-libs - python3-libxml2 - python3-mako - python3-markupsafe - python3-pip - python3-pyparsing - python3-rpm-generators - python3-rpm-macros - python3-setuptools - python3-six - python36 - qrencode-libs - qt5-srpm-macros - readline - readline-devel - redhat-rpm-config - rest - rhash - rpcgen - rpcsvc-proto-devel - rpm - rpm-libs - rpm-plugin-selinux - ruby - ruby-irb - ruby-libs - rubygem-io-console - rubygem-json - rubygem-openssl - rubygem-psych - rubygem-rake - rubygem-rdoc - rubygems - rubypick - rust-srpm-macros - sed - setup - sgml-common - shadow-utils - shared-mime-info - slang - slang-slsh - sound-theme-freedesktop - soundtouch - source-highlight - speex - speex-devel - speexdsp - speexdsp-devel - spirv-tools-libs - sqlite - sqlite-devel - sqlite-libs - strace - subunit - subunit-devel - systemd - systemd-devel - systemd-libs - systemd-pam - systemtap-sdt-devel - tar - tcl - tcl-devel - texinfo - texinfo-tex - texlive-amsfonts - texlive-base - texlive-bibtex - texlive-cm - texlive-collection-basic - texlive-dvipdfmx - texlive-dvips - texlive-enctex - texlive-epsf - texlive-etex - texlive-etex-pkg - texlive-glyphlist - texlive-graphics-def - texlive-gsftopk - texlive-hyph-utf8 - texlive-hyphen-base - texlive-ifluatex - texlive-ifxetex - texlive-knuth-lib - texlive-knuth-local - texlive-kpathsea - texlive-latex-fonts - texlive-lib - texlive-lua-alt-getopt - texlive-luatex - texlive-makeindex - texlive-metafont - texlive-mflogo - texlive-mfware - texlive-pdftex - texlive-plain - texlive-tetex - texlive-tex - texlive-tex-ini-files - texlive-texconfig - texlive-texlive-common-doc - texlive-texlive-docindex - texlive-texlive-en - texlive-texlive-msg-translations - texlive-texlive-scripts - texlive-texlive.infra - texlive-unicode-data - texlive-updmap-map - texlive-xdvi - tk - turbojpeg - turbojpeg-devel - tzdata - unbound-libs - unzip - util-linux - vala - vala-compat - vala-compat-tools - valgrind - valgrind-devel - valgrind-tools-devel - vim-filesystem - vim-minimal - vte-profile - vte291 - vte291-devel - vulkan-headers - vulkan-loader - vulkan-loader-devel - vulkan-validation-layers - vulkan-validation-layers-devel - wayland-devel - wayland-protocols-devel - webkit2gtk3 - webkit2gtk3-devel - webkit2gtk3-jsc - webkit2gtk3-jsc-devel - webrtc-audio-processing - which - woff2 - woff2-devel - words - xcb-proto - xcb-util - xcb-util-cursor - xcb-util-cursor-devel - xcb-util-devel - xcb-util-image - xcb-util-image-devel - xcb-util-keysyms - xcb-util-keysyms-devel - xcb-util-renderutil - xcb-util-renderutil-devel - xcb-util-wm - xcb-util-wm-devel - xdg-user-dirs - xdg-utils - xkeyboard-config - xkeyboard-config-devel - xml-common - xorg-x11-proto-devel - xorg-x11-server-utils - xorg-x11-util-macros - xorg-x11-xauth - xorg-x11-xinit - xorg-x11-xkb-utils - xorg-x11-xtrans-devel - xz - xz-devel - xz-libs - xz-lzma-compat - yasm - yelp - yelp-devel - yelp-libs - yelp-tools - yelp-xsl - yelp-xsl-devel - zenity - zip - zlib - zlib-devel - zziplib sdk-base: rpms: - ModemManager-glib - SDL2 - SDL2-devel - SDL2_image - SDL2_image-devel - SDL2_mixer - SDL2_mixer-devel - SDL2_net - SDL2_net-devel - SDL2_ttf - SDL2_ttf-devel - acl - adwaita-cursor-theme - adwaita-icon-theme - alsa-lib - alsa-lib-devel - annobin - aspell - aspell-devel - at-spi2-atk - at-spi2-atk-devel - at-spi2-core - at-spi2-core-devel - atk - atk-devel - attr - audit-libs - autoconf - autogen-libopts - automake - avahi-glib - avahi-libs - basesystem - bash - bash-completion - bc - binutils - bison - boost-regex - brotli - byacc - bzip2 - bzip2-devel - bzip2-libs - ca-certificates - cairo - cairo-devel - cairo-gobject - cairo-gobject-devel - cairo-tools - ccache - cdparanoia-libs - check - check-devel - chkconfig - chrpath - clang - clang-analyzer - clang-devel - clang-libs - clang-tools-extra - cmake - cmake-data - cmake-filesystem - cmake-rpm-macros - colord-libs - compat-readline6 - coreutils - coreutils-common - cpio - cpp - cracklib - cracklib-devel - crypto-policies - cryptsetup-libs - ctags - cups-devel - cups-libs - curl - cvs - cvsps - cyrus-sasl - cyrus-sasl-devel - cyrus-sasl-lib - dbus - dbus-common - dbus-daemon - dbus-devel - dbus-libs - dbus-tools - dbus-x11 - dconf - dconf-devel - dejavu-fonts-common - dejavu-sans-fonts - dejavu-sans-mono-fonts - dejavu-serif-fonts - desktop-file-utils - device-mapper - device-mapper-libs - diffutils - docbook-dtds - docbook-style-dsssl - docbook-style-xsl - docbook-utils - dwz - e2fsprogs - e2fsprogs-devel - e2fsprogs-libs - efi-srpm-macros - elfutils - elfutils-default-yama-scope - elfutils-devel - elfutils-libelf - elfutils-libelf-devel - elfutils-libs - elinks - emacs-filesystem - eosrei-emojione-fonts - expat - expat-devel - fedora-gpg-keys - fedora-release - fedora-repos - fedora-repos-rawhide - file - file-libs - filesystem - findutils - fipscheck - fipscheck-lib - flac - flac-devel - flac-libs - flatpak-runtime-config - flex - fontconfig - fontconfig-devel - fontpackages-filesystem - fpc-srpm-macros - freetype - freetype-devel - fribidi - fribidi-devel - fuse-libs - gawk - gc - gcc - gcc-c++ - gdb - gdb-headless - gdbm - gdbm-devel - gdbm-libs - gdk-pixbuf2 - gdk-pixbuf2-devel - gdk-pixbuf2-modules - geoclue2 - geoclue2-devel - geoclue2-libs - gettext - gettext-common-devel - gettext-devel - gettext-libs - ghc-srpm-macros - giflib - giflib-devel - git - git-clang-format - git-core - git-core-doc - git-cvs - glib-networking - glib2 - glib2-devel - glibc - glibc-all-langpacks - glibc-common - glibc-devel - glibc-headers - glibc-minimal-langpack - gmp - gmp-c++ - gmp-devel - gnat-srpm-macros - gnu-free-fonts-common - gnu-free-mono-fonts - gnu-free-sans-fonts - gnu-free-serif-fonts - gnupg - gnupg2 - gnupg2-smime - gnutls - gnutls-c++ - gnutls-dane - gnutls-devel - gnutls-utils - go-srpm-macros - gobject-introspection - gobject-introspection-devel - google-crosextra-caladea-fonts - google-crosextra-carlito-fonts - gperf - gpgme - gpgme-devel - gpm-libs - graphite2 - graphite2-devel - grep - groff - groff-base - groff-perl - gsettings-desktop-schemas - gsettings-desktop-schemas-devel - gsm - gssdp - gstreamer1 - gstreamer1-devel - gstreamer1-plugins-bad-free - gstreamer1-plugins-bad-free-devel - gstreamer1-plugins-base - gstreamer1-plugins-base-devel - gtk-doc - gtk-update-icon-cache - gtk2 - gtk3 - gtk3-devel - guile - gupnp - gupnp-igd - gzip - harfbuzz - harfbuzz-devel - harfbuzz-icu - hicolor-icon-theme - hunspell - hunspell-devel - hunspell-en-US - hwdata - hyphen - hyphen-devel - ibus - ibus-devel - ibus-gtk2 - ibus-gtk3 - ibus-libs - ibus-setup - icu - info - intltool - iptables-libs - isl - iso-codes - iso-codes-devel - itstool - jasper-libs - jbigkit-libs - jq - jq-devel - json-c - json-c-devel - json-glib - json-glib-devel - jsoncpp - kernel-headers - keyutils-libs - keyutils-libs-devel - kmod-libs - krb5-devel - krb5-libs - krb5-server - krb5-workstation - lcms2 - lcms2-devel - lcms2-utils - less - libICE - libICE-devel - libSM - libSM-devel - libX11 - libX11-common - libX11-devel - libX11-xcb - libXScrnSaver - libXScrnSaver-devel - libXau - libXau-devel - libXaw - libXcomposite - libXcomposite-devel - libXcursor - libXcursor-devel - libXdamage - libXdamage-devel - libXdmcp - libXdmcp-devel - libXext - libXext-devel - libXfixes - libXfixes-devel - libXft - libXft-devel - libXi - libXi-devel - libXinerama - libXinerama-devel - libXmu - libXpm - libXpm-devel - libXrandr - libXrandr-devel - libXrender - libXrender-devel - libXt - libXt-devel - libXtst - libXtst-devel - libXv - libXv-devel - libXxf86misc - libXxf86vm - libXxf86vm-devel - libacl - libacl-devel - libappstream-glib - libappstream-glib-builder - libappstream-glib-builder-devel - libappstream-glib-devel - libarchive - libarchive-devel - libargon2 - libassuan - libassuan-devel - libasyncns - libatomic - libatomic_ops - libatomic_ops-devel - libattr - libattr-devel - libbabeltrace - libblkid - libblkid-devel - libcap - libcap-devel - libcap-ng - libcom_err - libcom_err-devel - libcroco - libcroco-devel - libcurl - libcurl-devel - libdatrie - libdatrie-devel - libdb - libdb-cxx - libdb-cxx-devel - libdb-devel - libdb-utils - libdrm - libdrm-devel - libdvdnav - libdvdread - libedit - libedit-devel - libepoxy - libepoxy-devel - liberation-fonts-common - liberation-mono-fonts - liberation-sans-fonts - liberation-serif-fonts - libev - libevent - libexif - libexif-devel - libfdisk - libfdisk-devel - libffi - libffi-devel - libgcab1 - libgcab1-devel - libgcc - libgcrypt - libgcrypt-devel - libgfortran - libglvnd - libglvnd-core-devel - libglvnd-devel - libglvnd-egl - libglvnd-gles - libglvnd-glx - libglvnd-opengl - libgomp - libgpg-error - libgpg-error-devel - libgudev - libgusb - libicu - libicu-devel - libidn - libidn-devel - libidn2 - libipt - libjpeg-turbo - libjpeg-turbo-devel - libkadm5 - libksba - libmcpp - libmetalink - libmodman - libmount - libmount-devel - libmpc - libmpc-devel - libmpcdec - libnghttp2 - libnice - libnotify - libnsl - libnsl2 - libnsl2-devel - libogg - libogg-devel - libpcap - libpciaccess - libpciaccess-devel - libpipeline - libpkgconf - libpng - libpng-devel - libproxy - libproxy-devel - libpsl - libpwquality - libquadmath - librsvg2 - librsvg2-devel - librsvg2-tools - libsamplerate - libsamplerate-devel - libseccomp - libseccomp-devel - libsecret - libselinux - libselinux-devel - libsemanage - libsepol - libsepol-devel - libsigsegv - libsmartcols - libsmartcols-devel - libsndfile - libsndfile-devel - libsoup - libsoup-devel - libsrtp - libss - libss-devel - libssh - libstdc++ - libstdc++-devel - libstemmer - libtasn1 - libtasn1-devel - libtasn1-tools - libthai - libthai-devel - libtheora - libtheora-devel - libtiff - libtiff-devel - libtirpc - libtirpc-devel - libtool - libtool-ltdl - libtool-ltdl-devel - libunistring - libusb - libusbx - libutempter - libuuid - libuuid-devel - libuv - libva - libva-devel - libva-utils - libvdpau - libvdpau-devel - libvdpau-trace - libverto - libverto-devel - libverto-libev - libvisual - libvorbis - libvorbis-devel - libvpx - libvpx-devel - libwayland-client - libwayland-cursor - libwayland-egl - libwayland-server - libwebp - libwebp-devel - libxcb - libxcb-devel - libxcrypt - libxcrypt-devel - libxkbcommon - libxkbcommon-devel - libxkbcommon-x11 - libxkbcommon-x11-devel - libxkbfile - libxml2 - libxml2-devel - libxshmfence - libxshmfence-devel - libxslt - libxslt-devel - libyaml - libyaml-devel - libzstd - llvm - llvm-devel - llvm-libs - llvm6.0-libs - logrotate - lua-libs - lz4-libs - m4 - make - man-db - man2html-core - mcpp - mercurial - mesa-filesystem - mesa-libEGL - mesa-libEGL-devel - mesa-libGL - mesa-libGL-devel - mesa-libGLES - mesa-libGLES-devel - mesa-libgbm - mesa-libgbm-devel - mesa-libglapi - mesa-libxatracker - mesa-libxatracker-devel - mesa-vulkan-devel - mesa-vulkan-drivers - meson - mlocate - mpfr - mpfr-devel - mpg123-devel - mpg123-libs - mythes - mythes-devel - nasm - ncompress - ncurses - ncurses-base - ncurses-c++-libs - ncurses-compat-libs - ncurses-devel - ncurses-libs - nettle - nettle-devel - nim-srpm-macros - ninja-build - npth - nspr - nspr-devel - nss - nss-devel - nss-pkcs11-devel - nss-softokn - nss-softokn-devel - nss-softokn-freebl - nss-softokn-freebl-devel - nss-sysinit - nss-tools - nss-util - nss-util-devel - nss_db - nss_hesiod - nss_nis - numactl-libs - ocaml-srpm-macros - ocl-icd - ocl-icd-devel - oniguruma - openal-soft - openal-soft-devel - openblas-srpm-macros - opencl-headers - openjade - openjpeg2 - openldap - opensp - openssh - openssh-clients - openssl - openssl-devel - openssl-libs - opus - orc - orc-compiler - orc-devel - p11-kit - p11-kit-devel - p11-kit-trust - pam - pam-devel - pango - pango-devel - patch - pcre - pcre-cpp - pcre-devel - pcre-utf16 - pcre-utf32 - pcre2 - pcre2-devel - pcre2-utf16 - pcre2-utf32 - perf - perl-Algorithm-Diff - perl-Archive-Tar - perl-Archive-Zip - perl-CPAN - perl-CPAN-Meta - perl-CPAN-Meta-Requirements - perl-CPAN-Meta-YAML - perl-Carp - perl-Compress-Bzip2 - perl-Compress-Raw-Bzip2 - perl-Compress-Raw-Zlib - perl-DBD-SQLite - perl-DBI - perl-Data-Dumper - perl-Data-OptList - perl-Data-Section - perl-Devel-Size - perl-Digest - perl-Digest-MD5 - perl-Digest-SHA - perl-Encode - perl-Encode-devel - perl-Errno - perl-Error - perl-Exporter - perl-ExtUtils-CBuilder - perl-ExtUtils-Command - perl-ExtUtils-Install - perl-ExtUtils-MM-Utils - perl-ExtUtils-MakeMaker - perl-ExtUtils-Manifest - perl-ExtUtils-ParseXS - perl-File-HomeDir - perl-File-Path - perl-File-Temp - perl-File-Which - perl-Filter - perl-Getopt-Long - perl-Git - perl-HTTP-Tiny - perl-IO - perl-IO-Compress - perl-IO-Socket-IP - perl-IO-Zlib - perl-IPC-Cmd - perl-JSON-PP - perl-Locale-Maketext - perl-Locale-Maketext-Simple - perl-MIME-Base64 - perl-MRO-Compat - perl-Math-BigInt - perl-Math-Complex - perl-Module-Build - perl-Module-CoreList - perl-Module-CoreList-tools - perl-Module-Load - perl-Module-Load-Conditional - perl-Module-Metadata - perl-Net-Ping - perl-Package-Generator - perl-Params-Check - perl-Params-Util - perl-PathTools - perl-Perl-OSType - perl-Pod-Checker - perl-Pod-Escapes - perl-Pod-Html - perl-Pod-Parser - perl-Pod-Perldoc - perl-Pod-Simple - perl-Pod-Usage - perl-SGMLSpm - perl-Scalar-List-Utils - perl-Socket - perl-Software-License - perl-Storable - perl-Sub-Exporter - perl-Sub-Install - perl-Term-ANSIColor - perl-Term-Cap - perl-TermReadKey - perl-Test-Harness - perl-Text-Diff - perl-Text-Glob - perl-Text-ParseWords - perl-Text-Tabs+Wrap - perl-Text-Template - perl-Text-Unidecode - perl-Thread-Queue - perl-Time-HiRes - perl-Time-Local - perl-URI - perl-Unicode-EastAsianWidth - perl-Unicode-Normalize - perl-XML-Parser - perl-XML-XPath - perl-constant - perl-devel - perl-encoding - perl-inc-latest - perl-interpreter - perl-libintl-perl - perl-libnet - perl-libnetcfg - perl-libs - perl-local-lib - perl-macros - perl-open - perl-parent - perl-podlators - perl-srpm-macros - perl-threads - perl-threads-shared - perl-utils - perl-version - pinentry - pixman - pixman-devel - pkgconf - pkgconf-m4 - pkgconf-pkg-config - poppler - poppler-data - popt - popt-devel - procps-ng - publicsuffix-list-dafsa - pulseaudio-libs - pulseaudio-libs-devel - pulseaudio-libs-glib2 - pulseaudio-utils - python-rpm-macros - python-srpm-macros - python-unversioned-command - python2 - python2-devel - python2-libproxy - python2-libs - python2-libxml2 - python2-mako - python2-markupsafe - python2-pip - python2-rpm-macros - python2-setuptools - python3 - python3-cairo - python3-devel - python3-gobject - python3-gobject-base - python3-libs - python3-libxml2 - python3-mako - python3-markupsafe - python3-pip - python3-pyparsing - python3-rpm-generators - python3-rpm-macros - python3-setuptools - python3-six - python36 - qrencode-libs - qt5-srpm-macros - readline - readline-devel - redhat-rpm-config - rest - rhash - rpcgen - rpcsvc-proto-devel - rpm - rpm-libs - rpm-plugin-selinux - ruby - ruby-irb - ruby-libs - rubygem-io-console - rubygem-json - rubygem-openssl - rubygem-psych - rubygem-rake - rubygem-rdoc - rubygems - rubypick - rust-srpm-macros - sed - setup - sgml-common - shadow-utils - shared-mime-info - slang - slang-slsh - soundtouch - source-highlight - speex - speex-devel - speexdsp - speexdsp-devel - spirv-tools-libs - sqlite - sqlite-devel - sqlite-libs - strace - subunit - subunit-devel - systemd - systemd-libs - systemd-pam - systemtap-sdt-devel - tar - tcl - tcl-devel - texinfo - texinfo-tex - texlive-amsfonts - texlive-base - texlive-bibtex - texlive-cm - texlive-collection-basic - texlive-dvipdfmx - texlive-dvips - texlive-enctex - texlive-epsf - texlive-etex - texlive-etex-pkg - texlive-glyphlist - texlive-graphics-def - texlive-gsftopk - texlive-hyph-utf8 - texlive-hyphen-base - texlive-ifluatex - texlive-ifxetex - texlive-knuth-lib - texlive-knuth-local - texlive-kpathsea - texlive-latex-fonts - texlive-lib - texlive-lua-alt-getopt - texlive-luatex - texlive-makeindex - texlive-metafont - texlive-mflogo - texlive-mfware - texlive-pdftex - texlive-plain - texlive-tetex - texlive-tex - texlive-tex-ini-files - texlive-texconfig - texlive-texlive-common-doc - texlive-texlive-docindex - texlive-texlive-en - texlive-texlive-msg-translations - texlive-texlive-scripts - texlive-texlive.infra - texlive-unicode-data - texlive-updmap-map - texlive-xdvi - tk - turbojpeg - turbojpeg-devel - tzdata - unbound-libs - unzip - util-linux - vala - valgrind - valgrind-devel - valgrind-tools-devel - vim-filesystem - vim-minimal - vulkan-headers - vulkan-loader - vulkan-loader-devel - vulkan-validation-layers - vulkan-validation-layers-devel - wayland-devel - wayland-protocols-devel - webrtc-audio-processing - which - words - xcb-proto - xcb-util - xcb-util-cursor - xcb-util-cursor-devel - xcb-util-devel - xcb-util-image - xcb-util-image-devel - xcb-util-keysyms - xcb-util-keysyms-devel - xcb-util-renderutil - xcb-util-renderutil-devel - xcb-util-wm - xcb-util-wm-devel - xdg-user-dirs - xdg-utils - xkeyboard-config - xkeyboard-config-devel - xml-common - xorg-x11-proto-devel - xorg-x11-server-utils - xorg-x11-util-macros - xorg-x11-xauth - xorg-x11-xinit - xorg-x11-xkb-utils - xorg-x11-xtrans-devel - xz - xz-devel - xz-libs - xz-lzma-compat - yasm - zenity - zip - zlib - zlib-devel - zziplib api: rpms: - flatpak-rpm-macros - flatpak-runtime-config components: rpms: flatpak-rpm-macros: rationale: Set up build root for flatpak RPMS repository: git+https://src.fedoraproject.org/rpms/flatpak-rpm-macros cache: https://src.fedoraproject.org/repo/pkgs/flatpak-rpm-macros ref: main flatpak-runtime-config: rationale: Runtime configuration files repository: git+https://src.fedoraproject.org/rpms/flatpak-runtime-config cache: https://src.fedoraproject.org/repo/pkgs/flatpak-runtime-config ref: main artifacts: rpms: - flatpak-rpm-macros-0:27-6.module_2021+15e5e3e7.noarch - flatpak-runtime-config-0:27-7.module_2021+15e5e3e7.x86_64 ... --- document: modulemd version: 2 data: name: eog stream: main version: 20180821163756 context: 775baa8e arch: x86_64 summary: Eye of GNOME Application Module description: > The Eye of GNOME image viewer (eog) is the official image viewer for the GNOME desktop. It can view single image files in a variety of formats, as well as large image collections. license: module: - MIT content: - MIT xmd: mbs: mse: TRUE scmurl: https://src.fedoraproject.org/modules/eog.git?#375e2f73492aba2a9c8c892b5152d588e553c19c commit: 375e2f73492aba2a9c8c892b5152d588e553c19c buildrequires: platform: ref: f29 stream: f29 context: 00000000 version: 5 filtered_rpms: [] flatpak-runtime: ref: 2b45d61997c37c41f4cc127842f01d30024db74d stream: f29 context: 6c81f848 version: 20180820180704 filtered_rpms: [] rpms: eog: ref: 96166844a72788cd7e6fc278aeedc1e3da5ec816 libpeas: ref: 8e162f875ac7e00dd90f3d791d40484f91012415 gnome-desktop3: ref: 981addd1ddeee303df8518e479439cd9e4478c66 bubblewrap: ref: aaaaaae81d69644c0502125b338a4c86ff2e0a0e exempi: ref: ab39221162cac7c025060a14cac712c73b38b431 dependencies: - buildrequires: flatpak-runtime: [f29] requires: flatpak-runtime: [f29] profiles: default: rpms: - eog components: rpms: bubblewrap: rationale: Runtime dependency. repository: git+https://src.fedoraproject.org/rpms/bubblewrap cache: https://src.fedoraproject.org/repo/pkgs/bubblewrap ref: f29 eog: rationale: Application package repository: git+https://src.fedoraproject.org/rpms/eog cache: https://src.fedoraproject.org/repo/pkgs/eog ref: f29 buildorder: 1 exempi: rationale: Runtime dependency. repository: git+https://src.fedoraproject.org/rpms/exempi cache: https://src.fedoraproject.org/repo/pkgs/exempi ref: f29 gnome-desktop3: rationale: Runtime dependency. repository: git+https://src.fedoraproject.org/rpms/gnome-desktop3 cache: https://src.fedoraproject.org/repo/pkgs/gnome-desktop3 ref: f29 libpeas: rationale: Runtime dependency. repository: git+https://src.fedoraproject.org/rpms/libpeas cache: https://src.fedoraproject.org/repo/pkgs/libpeas ref: f29 artifacts: rpms: - bubblewrap-0:0.3.0-2.module_2123+73a9ef6f.x86_64 - eog-0:3.28.3-1.module_2123+73a9ef6f.x86_64 - eog-devel-0:3.28.3-1.module_2123+73a9ef6f.x86_64 - eog-tests-0:3.28.3-1.module_2123+73a9ef6f.x86_64 - exempi-0:2.4.5-3.module_2123+73a9ef6f.x86_64 - exempi-devel-0:2.4.5-3.module_2123+73a9ef6f.x86_64 - gnome-desktop3-0:3.29.90.1-1.module_2123+73a9ef6f.x86_64 - gnome-desktop3-devel-0:3.29.90.1-1.module_2123+73a9ef6f.x86_64 - gnome-desktop3-tests-0:3.29.90.1-1.module_2123+73a9ef6f.x86_64 - libpeas-0:1.22.0-9.module_2123+73a9ef6f.x86_64 - libpeas-devel-0:1.22.0-9.module_2123+73a9ef6f.x86_64 - libpeas-gtk-0:1.22.0-9.module_2123+73a9ef6f.x86_64 - libpeas-loader-python3-0:1.22.0-9.module_2123+73a9ef6f.x86_64 ... --- document: modulemd version: 2 data: name: dwm stream: latest version: 20180814184656 context: 6c81f848 arch: x86_64 summary: Dynamic window manager for X description: >- dwm is a dynamic window manager for X. It manages windows in tiled, monocle, and floating layouts. All of the layouts can be applied dynamically, optimizing the environment for the application in use and the task performed. license: module: - MIT content: - MIT xmd: mbs: mse: TRUE scmurl: https://src.fedoraproject.org/modules/dwm.git?#bde94bfe3c38c6c064c8dd484fe2e638768fae7b commit: bde94bfe3c38c6c064c8dd484fe2e638768fae7b buildrequires: platform: ref: f29 stream: f29 context: 00000000 version: 5 filtered_rpms: [] rpms: dwm: ref: b85c993bf46a22fcdfa017f2c16e135bc578c3be dependencies: - buildrequires: platform: [f29] requires: platform: [f29] references: community: https://suckless.org/ documentation: https://dwm.suckless.org/ profiles: default: description: The minimal, distribution-compiled dwm binary. rpms: - dwm user: description: Includes distrribution-compiled dwm as well as a helper script to apply user patches and configuration, dwm-user. rpms: - dwm - dwm-user components: rpms: dwm: rationale: The main component of this module. repository: git://pkgs.fedoraproject.org/rpms/dwm cache: http://pkgs.fedoraproject.org/repo/pkgs/dwm ref: latest artifacts: rpms: - dwm-0:6.1-1.20180602gitb69c870.module_2012+7328f38d.x86_64 - dwm-user-0:6.1-1.20180602gitb69c870.module_2012+7328f38d.x86_64 ... --- document: modulemd version: 2 data: name: dwm stream: 6.1 version: 20180813122714 context: 6c81f848 arch: x86_64 summary: Dynamic window manager for X description: >- dwm is a dynamic window manager for X. It manages windows in tiled, monocle, and floating layouts. All of the layouts can be applied dynamically, optimizing the environment for the application in use and the task performed. license: module: - MIT content: - MIT xmd: mbs: mse: TRUE scmurl: https://src.fedoraproject.org/modules/dwm.git?#8f0dc77f8e89fe04a44c3bb3a77dec21d3c4a9dd commit: 8f0dc77f8e89fe04a44c3bb3a77dec21d3c4a9dd buildrequires: platform: ref: f29 stream: f29 context: 00000000 version: 5 filtered_rpms: [] rpms: dwm: ref: 62a7aa6320bb31e6140ddae9eeeb7e98963d31a3 dependencies: - buildrequires: platform: [f29] requires: platform: [f29] references: community: https://suckless.org/ documentation: https://dwm.suckless.org/ profiles: default: description: The minimal, distribution-compiled dwm binary. rpms: - dwm user: description: Includes distrribution-compiled dwm as well as a helper script to apply user patches and configuration, dwm-user. rpms: - dwm - dwm-user api: rpms: - dwm - dwm-user components: rpms: dwm: rationale: The main component of this module. repository: git://pkgs.fedoraproject.org/rpms/dwm cache: http://pkgs.fedoraproject.org/repo/pkgs/dwm ref: 6.1 artifacts: rpms: - dwm-0:6.1-8.module_1995+c3e93812.x86_64 - dwm-user-0:6.1-8.module_1995+c3e93812.x86_64 ... --- document: modulemd version: 2 data: name: dwm stream: 6.0 version: 20180813144159 context: 6c81f848 arch: x86_64 summary: Dynamic window manager for X description: >- dwm is a dynamic window manager for X. It manages windows in tiled, monocle, and floating layouts. All of the layouts can be applied dynamically, optimizing the environment for the application in use and the task performed. license: module: - MIT content: - MIT xmd: mbs: mse: TRUE scmurl: https://src.fedoraproject.org/modules/dwm.git?#9b78dc232c321e9e8c93bd55f7e95dc113459a39 commit: 9b78dc232c321e9e8c93bd55f7e95dc113459a39 buildrequires: platform: ref: f29 stream: f29 context: 00000000 version: 5 filtered_rpms: [] rpms: dwm: ref: 43decc0e45e7fe8286356b3a51f64e05f13f3823 dependencies: - buildrequires: platform: [f29] requires: platform: [f29] references: community: https://suckless.org/ documentation: https://dwm.suckless.org/ profiles: default: description: The minimal, distribution-compiled dwm binary. rpms: - dwm user: description: Includes distrribution-compiled dwm as well as a helper script to apply user patches and configuration, dwm-user. rpms: - dwm - dwm-user api: rpms: - dwm - dwm-user components: rpms: dwm: rationale: The main component of this module. repository: git://pkgs.fedoraproject.org/rpms/dwm cache: http://pkgs.fedoraproject.org/repo/pkgs/dwm ref: 6.0 artifacts: rpms: - dwm-0:6.0-1.module_1997+c375c79c.x86_64 - dwm-user-0:6.0-1.module_1997+c375c79c.x86_64 ... --- document: modulemd version: 2 data: name: docker stream: 2017.0 version: 20180816194539 context: 3ff668f0 arch: x86_64 summary: Module for docker runtime and docker-distribution description: >- Docker is an open-source engine that automates the deployment of any application as a lightweight, portable, self-sufficient container that will run virtually anywhere. license: module: - MIT content: - MIT xmd: mbs: mse: TRUE scmurl: https://src.fedoraproject.org/modules/docker.git?#3dd5060deeb1517577c78b0259f94530fc2aae15 commit: 3dd5060deeb1517577c78b0259f94530fc2aae15 buildrequires: platform: ref: f29 stream: f29 context: 00000000 version: 5 filtered_rpms: [] golang: ref: 92882e9696b779110fd27aa11ddbc88f30eb82a2 stream: 1.10 context: 6c81f848 version: 20180816140129 filtered_rpms: [] golang-ecosystem: ref: 384b17a75c5c9be71c913651126d6899e42e8d84 stream: 2017.0 context: cbfb2833 version: 20180816154241 filtered_rpms: [] rpms: docker: ref: 7c17c91d74be490fe27a5a8c0a7e7ed4307a735d docker-distribution: ref: 215123409e61eecb1b5d6e4fb5b4b63196674b2e dependencies: - buildrequires: platform: [f29] requires: container-tools: [2017.0] platform: [f29] references: community: htts://github.com/projectatomic/docker documentation: https://github.com/projectatomic/docker tracker: https://github.com/projectatomic/docker profiles: default: rpms: - docker - docker-distribution api: rpms: - docker - docker-common - docker-distribution - docker-fish-completion - docker-logrotate - docker-lvm-plugin - docker-novolume-plugin - docker-rhel-push-plugin - docker-vim - docker-zsh-completion components: rpms: docker: rationale: Primary component of this module. repository: git://pkgs.fedoraproject.org/rpms/docker cache: http://pkgs.fedoraproject.org/repo/pkgs/docker ref: f28 docker-distribution: rationale: Primary component of this module. repository: git://pkgs.fedoraproject.org/rpms/docker-distribution cache: http://pkgs.fedoraproject.org/repo/pkgs/docker-distribution ref: f28 artifacts: rpms: - docker-2:1.13.1-61.git9cb56fd.module_2109+7c83ead1.x86_64 - docker-common-2:1.13.1-61.git9cb56fd.module_2109+7c83ead1.x86_64 - docker-devel-2:1.13.1-61.git9cb56fd.module_2109+7c83ead1.noarch - docker-distribution-0:2.6.2-7.git48294d9.module_1641+02d06da9.x86_64 - docker-fish-completion-2:1.13.1-61.git9cb56fd.module_2109+7c83ead1.x86_64 - docker-logrotate-2:1.13.1-61.git9cb56fd.module_2109+7c83ead1.x86_64 - docker-lvm-plugin-2:1.13.1-61.git9cb56fd.module_2109+7c83ead1.x86_64 - docker-novolume-plugin-2:1.13.1-61.git9cb56fd.module_2109+7c83ead1.x86_64 - docker-rhel-push-plugin-2:1.13.1-61.git9cb56fd.module_2109+7c83ead1.x86_64 - docker-unit-test-2:1.13.1-61.git9cb56fd.module_2109+7c83ead1.x86_64 - docker-vim-2:1.13.1-61.git9cb56fd.module_2109+7c83ead1.x86_64 - docker-zsh-completion-2:1.13.1-61.git9cb56fd.module_2109+7c83ead1.x86_64 ... --- document: modulemd version: 2 data: name: django stream: 1.6 version: 20180828135711 context: 6c81f848 arch: x86_64 summary: A high-level Python Web framework description: >- Django is a high-level Python Web framework that encourages rapid development and a clean, pragmatic design. It focuses on automating as much as possible and adhering to the DRY (Don't Repeat Yourself) principle. license: module: - MIT content: - MIT xmd: mbs: mse: TRUE scmurl: https://src.fedoraproject.org/modules/django.git?#da53d66d3db1aa5f6afd75887b00fa26849bcc0a commit: da53d66d3db1aa5f6afd75887b00fa26849bcc0a buildrequires: platform: ref: f29 stream: f29 context: 00000000 version: 5 filtered_rpms: [] rpms: python-django: ref: 9e50c9cc5cc0bd23e92ee58b2b2ffa14effad0a0 dependencies: - buildrequires: platform: [f29] requires: platform: [f29] references: community: https://www.djangoproject.com documentation: https://docs.djangoproject.com tracker: https://code.djangoproject.com/query profiles: default: rpms: - python2-django python2_development: rpms: - python2-django api: rpms: - python2-django components: rpms: python-django: rationale: The Django python web framework repository: git+https://src.fedoraproject.org/rpms/python-django cache: https://src.fedoraproject.org/repo/pkgs/python-django ref: 1.6 artifacts: rpms: - python-django-bash-completion-0:1.6.11.7-3.module_2144+ad479803.noarch - python2-django-0:1.6.11.7-3.module_2144+ad479803.noarch ... --- document: modulemd version: 2 data: name: cri-o stream: 2018.0 version: 20180529183952 context: 3ff668f0 arch: x86_64 summary: Kubernetes Container Runtime Interface for OCI-based containers description: >- CRI-O is the Kubernetes Container Runtime Interface for OCI-based containers. license: module: - Apache-2.0 content: - MIT xmd: mbs: mse: TRUE scmurl: https://src.fedoraproject.org/modules/cri-o.git?#8c90882569bc8a63408be7b634bc2c094533e3a3 commit: 8c90882569bc8a63408be7b634bc2c094533e3a3 buildrequires: platform: ref: f29 stream: f29 context: 00000000 version: 4 filtered_rpms: [] golang: ref: d6ad30745aef89e89b266908b713ea92fe73a834 stream: 1.10 context: 6c81f848 version: 20180529132243 filtered_rpms: [] golang-ecosystem: ref: 698fdf86122ea5f47cc89793a05ce841e0e0023b stream: 2017.0 context: 05251d78 version: 20180409165640 filtered_rpms: [] rpms: cri-o: ref: 4746e937b245100643f2efcbe90ef154a717c9e6 cri-tools: ref: a5b6369696fd69fcb7242837428dd2f836cbc2df dependencies: - buildrequires: platform: [f29] requires: container-tools: [2017.0] platform: [f29] references: community: https://docs.pagure.org/modularity/ documentation: https://github.com/modularity-modules/docker tracker: https://github.com/modularity-modules/cri-o profiles: default: rpms: - cri-o - cri-tools api: rpms: - conmon - cri-o - cri-tools components: rpms: cri-o: rationale: Primary component of this module. repository: git://pkgs.fedoraproject.org/rpms/cri-o cache: http://pkgs.fedoraproject.org/repo/pkgs/cri-o ref: f28 cri-tools: rationale: Primary component of this module. repository: git://pkgs.fedoraproject.org/rpms/cri-tools cache: http://pkgs.fedoraproject.org/repo/pkgs/cri-tools ref: f28 artifacts: rpms: - conmon-2:1.10.1-1.git728df92.module_1818+7c6ae394.x86_64 - cri-o-2:1.10.1-1.git728df92.module_1818+7c6ae394.x86_64 - cri-o-integration-tests-2:1.10.1-1.git728df92.module_1818+7c6ae394.x86_64 - cri-tools-0:1.0.0-5.gitf6ed14e.module_1818+7c6ae394.x86_64 ... --- document: modulemd version: 2 data: name: cri-o stream: 2017.0 version: 20180816135947 context: 3ff668f0 arch: x86_64 summary: Kubernetes Container Runtime Interface for OCI-based containers description: >- CRI-O is the Kubernetes Container Runtime Interface for OCI-based containers. license: module: - Apache-2.0 content: - MIT xmd: mbs: mse: TRUE scmurl: https://src.fedoraproject.org/modules/cri-o.git?#ea55eba4c063a7a5dc36991edbf010e2b8df3e49 commit: ea55eba4c063a7a5dc36991edbf010e2b8df3e49 buildrequires: platform: ref: f29 stream: f29 context: 00000000 version: 5 filtered_rpms: [] golang: ref: d6ad30745aef89e89b266908b713ea92fe73a834 stream: 1.10 context: 6c81f848 version: 20180529132243 filtered_rpms: [] golang-ecosystem: ref: 4188f37999c72f87bab2b59dab2bc14fa31bbee2 stream: 2017.0 context: cbfb2833 version: 20180724154421 filtered_rpms: [] rpms: cri-o: ref: 5650cabcd0105a7c42d1a396af36f674be82a812 dependencies: - buildrequires: platform: [f29] requires: container-tools: [2017.0] platform: [f29] references: community: https://docs.pagure.org/modularity/ documentation: https://github.com/modularity-modules/docker tracker: https://github.com/modularity-modules/cri-o profiles: default: rpms: - cri-o api: rpms: - conmon - cri-o components: rpms: cri-o: rationale: Primary component of this module. repository: git://pkgs.fedoraproject.org/rpms/cri-o cache: http://pkgs.fedoraproject.org/repo/pkgs/cri-o ref: f28 artifacts: rpms: - conmon-2:1.11.1-1.git1759204.module_2042+335cf4b5.x86_64 - cri-o-2:1.11.1-1.git1759204.module_2042+335cf4b5.x86_64 - cri-o-integration-tests-2:1.11.1-1.git1759204.module_2042+335cf4b5.x86_64 ... --- document: modulemd version: 2 data: name: cri-o stream: 1.11 version: 20180827233205 context: 6c81f848 arch: x86_64 summary: Kubernetes Container Runtime Interface for OCI-based containers description: >- CRI-O is the Kubernetes Container Runtime Interface for OCI-based containers. license: module: - Apache-2.0 content: - MIT xmd: mbs: mse: TRUE scmurl: https://src.fedoraproject.org/modules/cri-o.git?#17501669e29cfdcb41346f2fe31e2c4196a408e8 commit: 17501669e29cfdcb41346f2fe31e2c4196a408e8 buildrequires: platform: ref: f29 stream: f29 context: 00000000 version: 5 filtered_rpms: [] rpms: cri-o: ref: c759c453e3c9c3d33fa9bb740ab15d49a3ee987e cri-tools: ref: 4285d2f99d8a75678bf185da32ae19a44a3c4f08 dependencies: - buildrequires: platform: [f29] requires: platform: [f29] references: community: https://docs.pagure.org/modularity/ documentation: https://github.com/modularity-modules/docker tracker: https://github.com/modularity-modules/cri-o profiles: default: rpms: - cri-o - cri-tools api: rpms: - conmon - cri-o - cri-tools components: rpms: cri-o: rationale: Primary component of this module. repository: git+https://src.fedoraproject.org/rpms/cri-o cache: https://src.fedoraproject.org/repo/pkgs/cri-o ref: 1.11 cri-tools: rationale: Primary component of this module. repository: git+https://src.fedoraproject.org/rpms/cri-tools cache: https://src.fedoraproject.org/repo/pkgs/cri-tools ref: 1.11 artifacts: rpms: - conmon-2:1.11.2-2.git3eac3b2.module_2141+e7e01fef.x86_64 - cri-o-2:1.11.2-2.git3eac3b2.module_2141+e7e01fef.x86_64 - cri-tools-0:1.11.1-1.git404b126.module_2138+be1ea703.x86_64 ... --- document: modulemd version: 2 data: name: container-tools stream: 2018.0 version: 20180816194520 context: cb85db27 arch: x86_64 summary: Common tools and dependencies for container runtimes description: >- Contains SELinux policies, binaries and other dependencies for use with container runtimes license: module: - MIT content: - MIT xmd: mbs: mse: TRUE scmurl: https://src.fedoraproject.org/modules/container-tools.git?#31b761077ffd9f584efa534c16a3aed454aef977 commit: 31b761077ffd9f584efa534c16a3aed454aef977 buildrequires: platform: ref: f29 stream: f29 context: 00000000 version: 5 filtered_rpms: [] golang: ref: 92882e9696b779110fd27aa11ddbc88f30eb82a2 stream: 1.10 context: 6c81f848 version: 20180816140129 filtered_rpms: [] golang-ecosystem: ref: 1654fad1d9abf46a7d4f7845ea9e847b762f08a5 stream: 2018.0 context: cbfb2833 version: 20180816154327 filtered_rpms: [] rpms: atomic: ref: 6cec22f4c5825958a7a702586a1f8bb8aa15f854 python-docker-pycreds: ref: 5347f5fb0029c9664a0e5de07d733747568cd08d containernetworking-cni: ref: 5741bb6612f10603e0b40306e6eaaffb8067a22d skopeo: ref: 37201821cfb686ab9a5009fe8b066982978e2458 buildah: ref: 430c7a0285af77ab4a462568cb07f9f8f0c83cf2 python-docker: ref: 2807ee649da39b46336a79f4795d0ed2d8b496cf container-selinux: ref: 02a599cecb197d9c2261d1af30e4895e806f7bca container-storage-setup: ref: fa451e89ac98aa45131ca68d35f47197d863deb0 oci-register-machine: ref: 9c3980edbc2cdcede251b59b24faddf495c7d1b4 podman: ref: c92ca272fcee01526152095c12516e8091040524 oci-umount: ref: 14f111761a8e6691eb88589d58be4db35a9fa727 python-varlink: ref: a7229e7b3653cd920028a7dc50aa223e7fcd8778 oci-systemd-hook: ref: 7b9e5e15cba8f89cf729b6580e46fe3e3fb18c11 runc: ref: 9f4d6de82cac64f4604d12676e322c7d30661962 dependencies: - buildrequires: platform: [f29] requires: platform: [f29] references: community: https://github.com/projectatomic documentation: https://projectatomic.io tracker: https://github.com/projectatomic profiles: default: rpms: - atomic - buildah - container-selinux - container-storage-setup - containernetworking-cni - oci-register-machine - oci-systemd-hook - oci-umount - podman - python-docker - python-docker-pycreds - python-varlink - runc - skopeo api: rpms: - atomic - atomic-registries - buildah - container-selinux - container-storage-setup - containernetworking-cni - oci-register-machine - oci-systemd-hook - oci-umount - podman - python2-docker - python2-docker-pycreds - python3-docker - python3-docker-pycreds - python3-podman - python3-varlink - runc - skopeo - skopeo-containers buildopts: rpms: macros: | %_with_ignore_tests 1 components: rpms: atomic: rationale: Primary component of this module repository: git://pkgs.fedoraproject.org/rpms/atomic cache: http://pkgs.fedoraproject.org/repo/pkgs/atomic ref: f28 buildorder: 1 buildah: rationale: Primary component of this module repository: git://pkgs.fedoraproject.org/rpms/buildah cache: http://pkgs.fedoraproject.org/repo/pkgs/buildah ref: f28 container-selinux: rationale: Primary component of this module repository: git://pkgs.fedoraproject.org/rpms/container-selinux cache: http://pkgs.fedoraproject.org/repo/pkgs/container-selinux ref: f28 container-storage-setup: rationale: Primary component of this module repository: git://pkgs.fedoraproject.org/rpms/container-storage-setup cache: http://pkgs.fedoraproject.org/repo/pkgs/container-storage-setup ref: f28 containernetworking-cni: rationale: Primary component of this module repository: git://pkgs.fedoraproject.org/rpms/containernetworking-cni cache: http://pkgs.fedoraproject.org/repo/pkgs/containernetworking-cni ref: f28 oci-register-machine: rationale: Primary component of this module repository: git://pkgs.fedoraproject.org/rpms/oci-register-machine cache: http://pkgs.fedoraproject.org/repo/pkgs/oci-register-machine ref: f28 oci-systemd-hook: rationale: Primary component of this module repository: git://pkgs.fedoraproject.org/rpms/oci-systemd-hook cache: http://pkgs.fedoraproject.org/repo/pkgs/oci-systemd-hook ref: f28 oci-umount: rationale: Primary component of this module repository: git://pkgs.fedoraproject.org/rpms/oci-umount cache: http://pkgs.fedoraproject.org/repo/pkgs/oci-umount ref: f28 podman: rationale: Primary component of this module repository: git://pkgs.fedoraproject.org/rpms/podman cache: http://pkgs.fedoraproject.org/repo/pkgs/podman ref: f28 buildorder: 1 python-docker: rationale: Primary component of this module repository: git://pkgs.fedoraproject.org/rpms/python-docker cache: http://pkgs.fedoraproject.org/repo/pkgs/python-docker ref: f28 python-docker-pycreds: rationale: Primary component of this module repository: git://pkgs.fedoraproject.org/rpms/python-docker-pycreds cache: http://pkgs.fedoraproject.org/repo/pkgs/python-docker-pycreds ref: f28 python-varlink: rationale: Primary component of this module repository: git://pkgs.fedoraproject.org/rpms/python-varlink cache: http://pkgs.fedoraproject.org/repo/pkgs/python-varlink ref: f28 runc: rationale: Primary component of this module repository: git://pkgs.fedoraproject.org/rpms/runc cache: http://pkgs.fedoraproject.org/repo/pkgs/runc ref: f28 skopeo: rationale: Primary component of this module repository: git://pkgs.fedoraproject.org/rpms/skopeo cache: http://pkgs.fedoraproject.org/repo/pkgs/skopeo ref: f28 artifacts: rpms: - atomic-0:1.22.1-2.module_1816+29c6bc78.x86_64 - atomic-registries-0:1.22.1-2.module_1816+29c6bc78.x86_64 - buildah-0:1.3-1.git4888163.module_2106+3b446c4f.x86_64 - container-selinux-2:2.69-3.git452b90d.module_2106+3b446c4f.noarch - container-storage-setup-0:0.11.0-1.git42c9d9c.module_2106+3b446c4f.noarch - containernetworking-cni-0:0.7.1-1.module_2106+3b446c4f.x86_64 - containernetworking-cni-devel-0:0.7.1-1.module_2106+3b446c4f.noarch - containernetworking-cni-unit-test-devel-0:0.7.1-1.module_2106+3b446c4f.x86_64 - containers-common-0:0.1.31-14.dev.gitb0b750d.module_2106+3b446c4f.x86_64 - oci-register-machine-0:0-7.1.git66fa845.module_1816+29c6bc78.x86_64 - oci-systemd-hook-1:0.1.17-3.gitbd86a79.module_2106+3b446c4f.x86_64 - oci-umount-2:2.3.4-1.git87f9237.module_1816+29c6bc78.x86_64 - podman-0:0.8.2.1-1.gitf38eb4f.module_2106+3b446c4f.x86_64 - podman-docker-0:0.8.2.1-1.gitf38eb4f.module_2106+3b446c4f.noarch - python2-docker-0:3.2.1-1.module_1816+29c6bc78.noarch - python2-docker-pycreds-0:0.2.2-2.module_1816+29c6bc78.noarch - python2-docker-tests-0:3.2.1-1.module_1816+29c6bc78.noarch - python3-docker-0:3.2.1-1.module_1816+29c6bc78.noarch - python3-docker-pycreds-0:0.2.2-2.module_1816+29c6bc78.noarch - python3-podman-0:0.8.2.1-1.gitf38eb4f.module_2106+3b446c4f.noarch - python3-pypodman-0:0.8.2.1-1.gitf38eb4f.module_2106+3b446c4f.noarch - python3-varlink-0:27.1.1-1.module_2106+3b446c4f.noarch - runc-2:1.0.0-50.dev.git20aff4f.module_2106+3b446c4f.x86_64 - skopeo-0:0.1.31-14.dev.gitb0b750d.module_2106+3b446c4f.x86_64 ... --- document: modulemd version: 2 data: name: container-tools stream: 2017.0 version: 20180816194450 context: 80bd9113 arch: x86_64 summary: Common tools and dependencies for container runtimes description: >- Contains SELinux policies, binaries and other dependencies for use with container runtimes license: module: - MIT content: - MIT xmd: mbs: mse: TRUE scmurl: https://src.fedoraproject.org/modules/container-tools.git?#eef39c487fcfdffb12a4a18d3fccec8f0ea48d35 commit: eef39c487fcfdffb12a4a18d3fccec8f0ea48d35 buildrequires: platform: ref: f29 stream: f29 context: 00000000 version: 5 filtered_rpms: [] golang: ref: 92882e9696b779110fd27aa11ddbc88f30eb82a2 stream: 1.10 context: 6c81f848 version: 20180816140129 filtered_rpms: [] golang-ecosystem: ref: 384b17a75c5c9be71c913651126d6899e42e8d84 stream: 2017.0 context: cbfb2833 version: 20180816154241 filtered_rpms: [] rpms: atomic: ref: 6cec22f4c5825958a7a702586a1f8bb8aa15f854 python-docker-pycreds: ref: 5347f5fb0029c9664a0e5de07d733747568cd08d skopeo: ref: 37201821cfb686ab9a5009fe8b066982978e2458 python-docker: ref: 2807ee649da39b46336a79f4795d0ed2d8b496cf buildah: ref: 430c7a0285af77ab4a462568cb07f9f8f0c83cf2 container-selinux: ref: 02a599cecb197d9c2261d1af30e4895e806f7bca oci-register-machine: ref: 9c3980edbc2cdcede251b59b24faddf495c7d1b4 container-storage-setup: ref: fa451e89ac98aa45131ca68d35f47197d863deb0 oci-umount: ref: 14f111761a8e6691eb88589d58be4db35a9fa727 runc: ref: 9f4d6de82cac64f4604d12676e322c7d30661962 oci-systemd-hook: ref: 7b9e5e15cba8f89cf729b6580e46fe3e3fb18c11 dependencies: - buildrequires: platform: [f29] requires: platform: [f29] references: community: https://github.com/projectatomic documentation: https://projectatomic.io tracker: https://github.com/projectatomic profiles: default: rpms: - atomic - buildah - container-selinux - container-storage-setup - oci-register-machine - oci-systemd-hook - oci-umount - python-docker - python-docker-pycreds - runc - skopeo api: rpms: - atomic - atomic-registries - buildah - container-selinux - container-storage-setup - oci-register-machine - oci-systemd-hook - oci-umount - python2-docker - python2-docker-pycreds - python3-docker - python3-docker-pycreds - runc - skopeo - skopeo-containers buildopts: rpms: macros: | %_with_ignore_tests 1 components: rpms: atomic: rationale: Primary component of this module repository: git://pkgs.fedoraproject.org/rpms/atomic cache: http://pkgs.fedoraproject.org/repo/pkgs/atomic ref: f28 buildah: rationale: Primary component of this module repository: git://pkgs.fedoraproject.org/rpms/buildah cache: http://pkgs.fedoraproject.org/repo/pkgs/buildah ref: f28 container-selinux: rationale: Primary component of this module repository: git://pkgs.fedoraproject.org/rpms/container-selinux cache: http://pkgs.fedoraproject.org/repo/pkgs/container-selinux ref: f28 container-storage-setup: rationale: Primary component of this module repository: git://pkgs.fedoraproject.org/rpms/container-storage-setup cache: http://pkgs.fedoraproject.org/repo/pkgs/container-storage-setup ref: f28 oci-register-machine: rationale: Primary component of this module repository: git://pkgs.fedoraproject.org/rpms/oci-register-machine cache: http://pkgs.fedoraproject.org/repo/pkgs/oci-register-machine ref: f28 oci-systemd-hook: rationale: Primary component of this module repository: git://pkgs.fedoraproject.org/rpms/oci-systemd-hook cache: http://pkgs.fedoraproject.org/repo/pkgs/oci-systemd-hook ref: f28 oci-umount: rationale: Primary component of this module repository: git://pkgs.fedoraproject.org/rpms/oci-umount cache: http://pkgs.fedoraproject.org/repo/pkgs/oci-umount ref: f28 python-docker: rationale: Primary component of this module repository: git://pkgs.fedoraproject.org/rpms/python-docker cache: http://pkgs.fedoraproject.org/repo/pkgs/python-docker ref: f28 python-docker-pycreds: rationale: Primary component of this module repository: git://pkgs.fedoraproject.org/rpms/python-docker-pycreds cache: http://pkgs.fedoraproject.org/repo/pkgs/python-docker-pycreds ref: f28 runc: rationale: Primary component of this module repository: git://pkgs.fedoraproject.org/rpms/runc cache: http://pkgs.fedoraproject.org/repo/pkgs/runc ref: f28 skopeo: rationale: Primary component of this module repository: git://pkgs.fedoraproject.org/rpms/skopeo cache: http://pkgs.fedoraproject.org/repo/pkgs/skopeo ref: f28 artifacts: rpms: - atomic-0:1.22.1-2.module_1637+1872e86a.x86_64 - atomic-registries-0:1.22.1-2.module_1637+1872e86a.x86_64 - buildah-0:1.3-1.git4888163.module_2040+0e96cf1b.x86_64 - container-selinux-2:2.69-3.git452b90d.module_2040+0e96cf1b.noarch - container-storage-setup-0:0.11.0-1.git42c9d9c.module_2040+0e96cf1b.noarch - containers-common-0:0.1.31-14.dev.gitb0b750d.module_2040+0e96cf1b.x86_64 - oci-register-machine-0:0-7.1.git66fa845.module_1637+1872e86a.x86_64 - oci-systemd-hook-1:0.1.17-3.gitbd86a79.module_2040+0e96cf1b.x86_64 - oci-umount-2:2.3.4-1.git87f9237.module_1637+1872e86a.x86_64 - python2-docker-0:3.2.1-1.module_1637+1872e86a.noarch - python2-docker-pycreds-0:0.2.2-2.module_1637+1872e86a.noarch - python2-docker-tests-0:3.2.1-1.module_1637+1872e86a.noarch - python3-docker-0:3.2.1-1.module_1637+1872e86a.noarch - python3-docker-pycreds-0:0.2.2-2.module_1637+1872e86a.noarch - runc-2:1.0.0-50.dev.git20aff4f.module_2040+0e96cf1b.x86_64 - skopeo-0:0.1.31-14.dev.gitb0b750d.module_2040+0e96cf1b.x86_64 ... --- document: modulemd version: 2 data: name: byteman stream: byteman version: 20181123145910 context: 6c81f848 arch: x86_64 summary: Java agent-based bytecode injection tool description: >- Byteman is a tool which simplifies tracing and testing of Java programs. Byteman allows you to insert extra Java code into your application, either as it is loaded during JVM startup or even after it has already started running. The injected code is allowed to access any of your data and call any application methods, including where they are private. You can inject code almost anywhere you want and there is no need to prepare the original source code in advance nor do you have to recompile, repackage or redeploy your application. In fact you can remove injected code and reinstall different code while the application continues to execute. license: module: - MIT content: - MIT xmd: mbs: mse: TRUE scmurl: https://src.fedoraproject.org/modules/byteman.git?#9926dcebe7d85f398069a8e7c70e69e98acfe397 commit: 9926dcebe7d85f398069a8e7c70e69e98acfe397 buildrequires: platform: ref: f29 stream: f29 context: 00000000 version: 5 filtered_rpms: [] rpms: objectweb-asm: ref: c002125869ff1d50d8ef1346239f4854fc2abbea byteman: ref: 3fd932c9d0aee807c476c99ce97e88f24adf95c9 dependencies: - buildrequires: platform: [f29] requires: platform: [f29] profiles: default: rpms: - byteman api: rpms: - byteman filter: rpms: - byteman-javadoc - objectweb-asm-javadoc buildopts: rpms: macros: | %_with_osgi 1 components: rpms: byteman: rationale: 'Module API ' repository: git+https://src.fedoraproject.org/rpms/byteman cache: https://src.fedoraproject.org/repo/pkgs/byteman ref: byteman buildorder: 20 objectweb-asm: rationale: 'Build time dependency of byteman. ' repository: git+https://src.fedoraproject.org/rpms/objectweb-asm cache: https://src.fedoraproject.org/repo/pkgs/objectweb-asm ref: c002125869ff1d50d8ef1346239f4854fc2abbea buildorder: 10 artifacts: rpms: - byteman-0:4.0.5-1.module_2517+4757d934.noarch - byteman-bmunit-0:4.0.5-1.module_2517+4757d934.noarch - byteman-dtest-0:4.0.5-1.module_2517+4757d934.noarch - byteman-rulecheck-maven-plugin-0:4.0.5-1.module_2517+4757d934.noarch - objectweb-asm-0:7.0-2.module_2517+4757d934.noarch ... --- document: modulemd version: 2 data: name: bat stream: latest version: 20181106000712 context: 7fdbb362 arch: x86_64 summary: cat(1) clone with wings description: >- cat(1) clone with wings. license: module: - MIT content: - MIT xmd: mbs: mse: TRUE scmurl: https://src.fedoraproject.org/modules/bat.git?#be97fb37283e3c85d37af809711c5177b2ac4a92 commit: be97fb37283e3c85d37af809711c5177b2ac4a92 buildrequires: libgit2: ref: faa63b8d2ed90d2cfa1f7d470284ef5d0944b92d stream: 0.27 context: 6c81f848 version: 20181028172505 filtered_rpms: [] platform: ref: f29 stream: f29 context: 00000000 version: 5 filtered_rpms: [] rpms: rust-rand_core0.2: ref: 7e53c7b53cad8bd7c4461cfe9943f753dca387fd rust-arrayvec: ref: 24a1a39e20b3a7dd3ac99cd0e2497f6873d79eaf rust-miniz_oxide_c_api: ref: 39a7deaa6be3cb0807b7cf5ba3e8626fc779feb4 rust-libssh2-sys: ref: 158b33df4af491c9479fdf5174d45ec9ef32a5c9 rust-percent-encoding: ref: 5859607ca49616d1c592898862678df2bd3a65b5 rust-serde_derive: ref: 40e60857b9cd3c056c2aa748dbb7c95b9ccbbbe2 rust-syntect: ref: 07fce46297743b822427b6137dcccafef303cd97 rust-indexmap: ref: 3d839547100cbed3db4fdb0820453bbe8ddaaf92 rust-aho-corasick: ref: 2133a27af85565874a0d9c8d15e18037244ff38a rust-log: ref: 8e19b2e015c86d959a2a69f391f8e84585f2f0ed rust-linked-hash-map: ref: f0e7523a34b8ec7a8c9051e33f22577772da6b83 rust-void: ref: c0d2cf66ed917dce908190930a7337723a388645 rust-rustc-serialize: ref: b9b6a9aa8f91f45e8eb624abac6c08385993f890 rust-libgit2-sys: ref: 535c8dc9fca2c6ad7be5dd1f24cc435ce1594c16 rust-walkdir: ref: f5a5bffe5d7143111908c5df36a6c423f239f6c0 rust-libz-sys: ref: b32993219bd41e8b0ea1709787ac1f2b09f7b72a rust-termios: ref: 039c26309b26fa9b4155841f4f36a1f1a1aa0237 rust-version_check: ref: 11ca374687fe9a9db49be1ede98a4c92b492e1e1 rust-unicode-xid: ref: e67cc74e1354143c0fb5edf7af67c176ae7edcaa rust-ansi_colours: ref: bcb8ea791158cf2b761278c7d20033367516b7a8 rust-matches: ref: bd2957b904ae186bab6d88530f9aa2e4326f09bf rust-encoding-index-simpchinese: ref: b17271ab26bd642e3a43e2b0c26c01d704078adc rust-utf8-ranges: ref: 3c8bb35c329c1133e596dd94754dfc5fe2e42641 rust-lazycell: ref: 58ec062cb751ebe1abb8a20d348e2396e8f3fac4 rust-glob: ref: 1aa02b1bea883cbcb8a2e8f7787b859e80616f9e rust-onig_sys: ref: 46f3ece65fc060f602d25c030f10871df5e47c6d rust-regex-syntax: ref: 39c750b81b1bd8bbc97f9804008ea09382d5f68c rust-miniz_oxide: ref: 5faed7ffa5354f7357d158f082b8287d9cac8eac rust-rustc-demangle: ref: 90626dce0c46fb5345a2f56eaa343c7e974eebb9 rust-encoding-index-japanese: ref: f4f45e22062c13736ee017658a693572ca82641b rust-itoa: ref: a74464c89c102e86d26cbc500d853ae626a30100 rust-encoding: ref: b8a4144c325e09497de8d8a63068df1346478093 rust-rand: ref: a5ffd6a802c4d192024250b53744eb82d4129db8 rust-regex: ref: 2229a1ea0cbbaf676496339c1e81864cd4003fc6 rust-memchr: ref: d120e8a40f353875824c64b40552636a3909eaee rust-unicode-width: ref: 6599a5158eea49a44ee255445af3b1fc5bfc4661 rust-cfg-if: ref: 3ff094ad603593adc3a036e1610b239fb8480142 rust-thread_local: ref: 0679edb992d183e75f282660ee632fcdfea7ea15 rust-xml-rs: ref: a3f7e742107df7f74353bae841747f97970ee763 rust-rustc_version: ref: 0aed6639ef0f23bca9c76a95a9dabc7a4d40744f rust-owning_ref: ref: 62553b334cc987af96f9dce1412d5aacf9cb55c4 rust-crossbeam-deque0.4: ref: 6127953b009eeca38b9cc83ffa7eb1e255f49fe4 rust-bitflags: ref: aab0778768757e462b20bc4d77e70bae43c1d0ad rust-libc: ref: b4916eac7d00ad4d6865282f07dc71b46437bf1f rust-smallvec: ref: 7e30de0d469c3b4573945a98103e902ed4617dfd rust-adler32: ref: c05b9c9197befd89740602c32a9342c387360c28 rust-encoding-index-tradchinese: ref: 6bb6ce56aeeec5c9ddf9cdb983c0a7c0126fc1c2 rust-ansi_term: ref: aa0509304673d8e85ed10b2faff32a88da30fcc9 rust-build_const: ref: d0c58db506cb4f2226e59ddb4a6f070969301b64 rust-rand_core: ref: df6ff2cd8a67a3b277509f5aa4bf3ddfa755587e rust-crc: ref: 4fa0c9f411333ff766d7a05a1fd1976e84a70300 rust-humantime: ref: 054caed9ce3a930f1255fc78a7f34610f526334d rust-pkg-config: ref: 349c7189cb33d384e542ddf3ccf4b53c607b5dd1 rust-yaml-rust0.3: ref: 5ecf7d35b65788bd2a4ce03258c229476ddae35f rust-heapsize: ref: 5d1d4b2c2356f42760dd4cbb90b7cbe982f98d95 rust-same-file: ref: 470c5feeacc4d128a7b2c3796cc92e480cdddf5e rust-curl-sys: ref: c0c06fd15900831d63b83f932b5b4da585cbb54e rust-cpp_demangle: ref: 3f1ad60f2da422a7094ccc01786e822b5b1023a0 rust-bincode: ref: 181d34acb880ded81fed68747cad232b5d890d0f rust-memoffset: ref: 62c46ec2976e1dccf3d18e0e2ff01699492413f5 rust-plist: ref: 4646aa6a34eb52af2b848b19178a946f5f4b2993 rust-nodrop: ref: e34f4c89e485813dc026385cad714e0a289ec26e rust-tokio-io: ref: 4dfec6130f6888d699428cda1155426a39fb09c6 rust-parking_lot: ref: 4f81ecce318725c7bdd2cf655c13fa09cb378a01 rust-safemem: ref: 65e99ff2d15feeb99e56e610f5ea8b82236edddb rust-term_size: ref: 7c62e64aa170d34ec9ea65b7dfd286e19d9b7b0c rust-ryu: ref: 824f092151ea888af1fc590dbdf7bef11ce71389 rust-flate2: ref: 0497b92a48a4670c8d3e37e0c913a404739e72f3 rust-encoding-index-singlebyte: ref: bb07c386c242ecd30e7d539c826132564be2fb2f rust-byteorder: ref: 35aaadf1730f3e63acd50b840f429a5c5420fd3d rust-onig: ref: 296d200f7df756b2bca26841be5c6c8bad9d71f0 rust-content_inspector: ref: 5bb5128a0bdabff2eb48b67d0fbc6f5265edae40 rust-lazy_static: ref: abdefd9d971dc70073fdc6adddbcb0ff18340a0e rust-url: ref: 581a9cab097a63a2630897047a0b0e2399d7a37c rust-clicolors-control: ref: d3241cd07bc0b3157e673d2e9155c1561ba54db5 rust-serde: ref: 21cd19ce4eb8e00fc1b50e8166dfcf30a48d1578 rust-num_cpus: ref: 54a3646595ccb45c6a04c0e3fec41ad14402d631 rust-quick-error: ref: f612214953cdf2c776ce141f5299f6b222fb778b rust-wild: ref: 814ff214218f4883355bd91b94b5b7843c6fcf00 rust-atty: ref: ac26eb2fbd95334a8310a4fad799ca9044bc12c1 rust-miniz-sys: ref: aacfc7aa9875157f4688057a7211f27b3be531a3 rust-bytes: ref: 0cee9ee117a1566e41ffacd980af92696fb6bc84 rust-unicode-normalization: ref: 0cc487b77a64ea378020c530988f767c8f44eda8 rust-shell-words: ref: 39a34f44cab5468348a8970db410e41a0a341a50 rust-yaml-rust: ref: 4d1f7997ef2214790141c5e1a0498ef952790d43 rust-backtrace: ref: ec392d1c50365099965d064a27ef2dcc04322c01 rust-base64: ref: cf9ae0b254bff6efa2e66ab32342276c9f63d20d rust-futures0.1: ref: d52f4485f79a6aefc29e1d85b3276eb03236bda0 rust-git2: ref: 657cd2f21f917b15e5fc460754d6ad76942fe67c rust-stable_deref_trait: ref: 8f35830900bc71d1a85fc6a02215f1d154c997f6 rust-scopeguard: ref: 53c1fd50c528fa9ddf49d8c4b996e7acde05bc05 rust-rayon-core: ref: d0107623e5c040be5a17ef61447b79e701d1dc3b rust-ucd-util: ref: 27620e66367adf48808a04002e94b4fcadcc415c rust-idna: ref: 3aa0898114e5f370a55c1132f3c6710a4e5435ed rust-clap: ref: 6a5b0bbaa7fb2b920d62e93dced74907d26ddee8 rust-semver: ref: ecb153f342062549c1d129fd88fc51cfb82ca610 rust-rand0.4: ref: 07c8d720dfc54c5594cb99aececc6ab5d3753ed3 rust-serde_json: ref: da3aa74649a01ffe901136b2285998bf9e03a3f2 rust-either: ref: 5046abacfee588fd28ae7a73a8ab4166d669ef7c rust-unreachable: ref: 412ff0e1022e5d6d6c023b02e0d549d2ef449e57 rust-syn: ref: f38c9c3981efccbdc4dcb54fa74dc9c15cd5f069 rust-packaging: ref: 04e7ad287a632a68ccd10cfd35a636852108ad28 rust-parking_lot_core: ref: 34ffbd3102fc2ded0c331370665c2ec9b0f9b30e rust-openssl-sys: ref: 5d6f20fafd8647db13b8dfa950ec95e50ff78d03 rust-proc-macro2: ref: 7c38fd6963b75147e46fcd771fcc68ac416fdb58 rust-cc: ref: 44faccd5aa73354a6643769755cf98da94ffece2 rust-vec_map: ref: 18b851a496671350e388786f18d3ec18c610d603 rust-crossbeam-utils: ref: fa961b60d20ed68c7598a1634bd387f56dd43da8 rust-serde0.8: ref: b9fbff27c2e6aa4fabad076a8aa0779460f8e243 rust-no-panic: ref: d78ce0575bcca63209fd5b548a39836f6b4ee767 rust-backtrace-sys: ref: 63730f1800ad92312bd517bdadec0fac5fbed012 rust-textwrap: ref: cf2ce1a4cef3436fd130838c4dfa7a9cfbdea512 rust-semver-parser0.7: ref: 37048a01c68df96f31b0b867bb7730a37b5a8ebe rust-strsim: ref: 3a1928c8136b290a3fadab301fbc4bf1b7d56931 rust-bat: ref: 6c74e4abec4496c6a6407bf2ac7769500059f2c5 rust-directories: ref: f2d2247be4415970ae040bdb757c09baea92007c rust-unicode-bidi: ref: 6fbd8a5f1f8079144180413a73f709a8f9f7b234 rust-quote: ref: bcfb70145c5382f461795c19a9a1105317e5148e rust-console: ref: aa0e53a45853a9994a764db08647525602f2e684 rust-openssl-probe: ref: da76ad5fd53cc22468abc9fcfe1c1489a4a1aa16 rust-fnv: ref: f76a15cf2fc96595594e47651fab208c9fdeb0ab rust-encoding-index-korean: ref: 9ea13b52cc3a824c33149639b495dc80cd16f7b6 rust-crossbeam-epoch0.5: ref: d2bd3e0a22b054d723fc31144206bd4cc04b781a rust-rayon: ref: e9eb09faa3e501c814db53a0c3291a26d8f4b33c rust-iovec: ref: e432ee0eef42b32e6f6d42917b74ecc1cbec565a rust-lock_api: ref: 0e520bea0c4a3889369e730fd418a3e5195b3062 rust-error-chain: ref: 73336d5d0209cd5826348b4e5fc551656627b8e8 dependencies: - buildrequires: libgit2: [0.27] platform: [f29] requires: libgit2: [0.27] platform: [f29] profiles: default: rpms: - bat api: rpms: - bat filter: rpms: - python3-rust2rpm - rust-adler32+default-devel - rust-adler32-devel - rust-aho-corasick+default-devel - rust-aho-corasick-devel - rust-ansi_colours+default-devel - rust-ansi_colours-devel - rust-ansi_term+default-devel - rust-ansi_term-devel - rust-arrayvec+default-devel - rust-arrayvec+serde-1-devel - rust-arrayvec+serde-devel - rust-arrayvec+std-devel - rust-arrayvec-devel - rust-atty+default-devel - rust-atty-devel - rust-backtrace+backtrace-sys-devel - rust-backtrace+cpp_demangle-devel - rust-backtrace+default-devel - rust-backtrace+dladdr-devel - rust-backtrace+libbacktrace-devel - rust-backtrace+libunwind-devel - rust-backtrace+rustc-serialize-devel - rust-backtrace+serde-devel - rust-backtrace+serde_derive-devel - rust-backtrace+serialize-rustc-devel - rust-backtrace+serialize-serde-devel - rust-backtrace+unix-backtrace-devel - rust-backtrace-devel - rust-backtrace-sys+default-devel - rust-backtrace-sys-devel - rust-base64+default-devel - rust-base64-devel - rust-bincode+default-devel - rust-bincode+i128-devel - rust-bincode-devel - rust-bitflags+default-devel - rust-bitflags-devel - rust-build_const+default-devel - rust-build_const+std-devel - rust-build_const-devel - rust-byteorder+default-devel - rust-byteorder+i128-devel - rust-byteorder+std-devel - rust-byteorder-devel - rust-bytes+default-devel - rust-bytes+either-devel - rust-bytes+i128-devel - rust-bytes+serde-devel - rust-bytes-devel - rust-cc+default-devel - rust-cc+parallel-devel - rust-cc+rayon-devel - rust-cc-devel - rust-cfg-if+default-devel - rust-cfg-if-devel - rust-clap+ansi_term-devel - rust-clap+atty-devel - rust-clap+color-devel - rust-clap+debug-devel - rust-clap+default-devel - rust-clap+no_cargo-devel - rust-clap+strsim-devel - rust-clap+suggestions-devel - rust-clap+term_size-devel - rust-clap+unstable-devel - rust-clap+vec_map-devel - rust-clap+wrap_help-devel - rust-clap+yaml-devel - rust-clap+yaml-rust-devel - rust-clap-devel - rust-clicolors-control+default-devel - rust-clicolors-control+terminal_autoconfig-devel - rust-clicolors-control-devel - rust-console+default-devel - rust-console-devel - rust-content_inspector+default-devel - rust-content_inspector-devel - rust-cpp_demangle+alloc-devel - rust-cpp_demangle+default-devel - rust-cpp_demangle+logging-devel - rust-cpp_demangle+std-devel - rust-cpp_demangle-devel - rust-crc+default-devel - rust-crc+std-devel - rust-crc-devel - rust-crossbeam-deque0.4+default-devel - rust-crossbeam-deque0.4-devel - rust-crossbeam-epoch0.5+default-devel - rust-crossbeam-epoch0.5+lazy_static-devel - rust-crossbeam-epoch0.5+sanitize-devel - rust-crossbeam-epoch0.5+use_std-devel - rust-crossbeam-epoch0.5-devel - rust-crossbeam-utils+default-devel - rust-crossbeam-utils+use_std-devel - rust-crossbeam-utils-devel - rust-curl-sys+default-devel - rust-curl-sys+http2-devel - rust-curl-sys+openssl-sys-devel - rust-curl-sys+ssl-devel - rust-curl-sys-devel - rust-directories+default-devel - rust-directories-devel - rust-either+default-devel - rust-either+serde-devel - rust-either+use_std-devel - rust-either-devel - rust-encoding+default-devel - rust-encoding-devel - rust-encoding-index-japanese+default-devel - rust-encoding-index-japanese-devel - rust-encoding-index-korean+default-devel - rust-encoding-index-korean-devel - rust-encoding-index-simpchinese+default-devel - rust-encoding-index-simpchinese-devel - rust-encoding-index-singlebyte+default-devel - rust-encoding-index-singlebyte-devel - rust-encoding-index-tradchinese+default-devel - rust-encoding-index-tradchinese-devel - rust-error-chain+backtrace-devel - rust-error-chain+default-devel - rust-error-chain+example_generated-devel - rust-error-chain-devel - rust-flate2+default-devel - rust-flate2+futures-devel - rust-flate2+libz-sys-devel - rust-flate2+miniz-sys-devel - rust-flate2+miniz_oxide_c_api-devel - rust-flate2+rust_backend-devel - rust-flate2+tokio-devel - rust-flate2+tokio-io-devel - rust-flate2+zlib-devel - rust-flate2-devel - rust-fnv+default-devel - rust-fnv-devel - rust-futures0.1+default-devel - rust-futures0.1+use_std-devel - rust-futures0.1+with-deprecated-devel - rust-futures0.1-devel - rust-git2+curl-devel - rust-git2+default-devel - rust-git2+https-devel - rust-git2+openssl-probe-devel - rust-git2+openssl-sys-devel - rust-git2+ssh-devel - rust-git2+ssh_key_from_memory-devel - rust-git2+unstable-devel - rust-git2-devel - rust-glob+default-devel - rust-glob-devel - rust-heapsize+default-devel - rust-heapsize+unstable-devel - rust-heapsize-devel - rust-humantime+default-devel - rust-humantime-devel - rust-idna+default-devel - rust-idna-devel - rust-indexmap+default-devel - rust-indexmap+serde-1-devel - rust-indexmap+serde-devel - rust-indexmap-devel - rust-iovec+default-devel - rust-iovec-devel - rust-itoa+default-devel - rust-itoa+i128-devel - rust-itoa+std-devel - rust-itoa-devel - rust-lazy_static+default-devel - rust-lazy_static-devel - rust-lazycell+default-devel - rust-lazycell-devel - rust-libc+align-devel - rust-libc+default-devel - rust-libc+use_std-devel - rust-libc-devel - rust-libgit2-sys+curl-devel - rust-libgit2-sys+curl-sys-devel - rust-libgit2-sys+default-devel - rust-libgit2-sys+https-devel - rust-libgit2-sys+libssh2-sys-devel - rust-libgit2-sys+openssl-sys-devel - rust-libgit2-sys+ssh-devel - rust-libgit2-sys+ssh_key_from_memory-devel - rust-libgit2-sys-devel - rust-libssh2-sys+default-devel - rust-libssh2-sys-devel - rust-libz-sys+default-devel - rust-libz-sys-devel - rust-linked-hash-map+default-devel - rust-linked-hash-map+heapsize-devel - rust-linked-hash-map+heapsize_impl-devel - rust-linked-hash-map+serde-devel - rust-linked-hash-map+serde_impl-devel - rust-linked-hash-map-devel - rust-lock_api+default-devel - rust-lock_api+owning_ref-devel - rust-lock_api-devel - rust-log+default-devel - rust-log+max_level_debug-devel - rust-log+max_level_error-devel - rust-log+max_level_info-devel - rust-log+max_level_off-devel - rust-log+max_level_trace-devel - rust-log+max_level_warn-devel - rust-log+release_max_level_debug-devel - rust-log+release_max_level_error-devel - rust-log+release_max_level_info-devel - rust-log+release_max_level_off-devel - rust-log+release_max_level_trace-devel - rust-log+release_max_level_warn-devel - rust-log+serde-devel - rust-log+std-devel - rust-log-devel - rust-matches+default-devel - rust-matches-devel - rust-memchr+default-devel - rust-memchr+libc-devel - rust-memchr+use_std-devel - rust-memchr-devel - rust-memoffset+default-devel - rust-memoffset-devel - rust-miniz-sys+default-devel - rust-miniz-sys-devel - rust-miniz_oxide+default-devel - rust-miniz_oxide-devel - rust-miniz_oxide_c_api+default-devel - rust-miniz_oxide_c_api+no_c_export-devel - rust-miniz_oxide_c_api-devel - rust-no-panic+default-devel - rust-no-panic-devel - rust-nodrop+default-devel - rust-nodrop+std-devel - rust-nodrop+use_needs_drop-devel - rust-nodrop-devel - rust-num_cpus+default-devel - rust-num_cpus-devel - rust-onig+default-devel - rust-onig+posix-api-devel - rust-onig+print-debug-devel - rust-onig+std-pattern-devel - rust-onig-devel - rust-onig_sys+default-devel - rust-onig_sys+posix-api-devel - rust-onig_sys+print-debug-devel - rust-onig_sys-devel - rust-openssl-probe+default-devel - rust-openssl-probe-devel - rust-openssl-sys+default-devel - rust-openssl-sys-devel - rust-owning_ref+default-devel - rust-owning_ref-devel - rust-packaging - rust-parking_lot+default-devel - rust-parking_lot+owning_ref-devel - rust-parking_lot-devel - rust-parking_lot_core+default-devel - rust-parking_lot_core-devel - rust-percent-encoding+default-devel - rust-percent-encoding-devel - rust-pkg-config+default-devel - rust-pkg-config-devel - rust-plist+default-devel - rust-plist+serde-devel - rust-plist-devel - rust-proc-macro2+default-devel - rust-proc-macro2+proc-macro-devel - rust-proc-macro2-devel - rust-quick-error+default-devel - rust-quick-error-devel - rust-quote+default-devel - rust-quote+proc-macro-devel - rust-quote-devel - rust-rand+alloc-devel - rust-rand+default-devel - rust-rand+i128_support-devel - rust-rand+libc-devel - rust-rand+log-devel - rust-rand+serde-devel - rust-rand+serde1-devel - rust-rand+serde_derive-devel - rust-rand+std-devel - rust-rand-devel - rust-rand0.4+alloc-devel - rust-rand0.4+default-devel - rust-rand0.4+i128_support-devel - rust-rand0.4+libc-devel - rust-rand0.4+std-devel - rust-rand0.4-devel - rust-rand_core+alloc-devel - rust-rand_core+default-devel - rust-rand_core+serde-devel - rust-rand_core+serde1-devel - rust-rand_core+serde_derive-devel - rust-rand_core+std-devel - rust-rand_core-devel - rust-rand_core0.2+alloc-devel - rust-rand_core0.2+default-devel - rust-rand_core0.2+serde1-devel - rust-rand_core0.2+std-devel - rust-rand_core0.2-devel - rust-rayon+default-devel - rust-rayon-core+default-devel - rust-rayon-core-devel - rust-rayon-devel - rust-regex+default-devel - rust-regex+pattern-devel - rust-regex+unstable-devel - rust-regex+use_std-devel - rust-regex-devel - rust-regex-syntax+default-devel - rust-regex-syntax-devel - rust-rustc-demangle+default-devel - rust-rustc-demangle-devel - rust-rustc-serialize+default-devel - rust-rustc-serialize-devel - rust-rustc_version+default-devel - rust-rustc_version-devel - rust-ryu+default-devel - rust-ryu+no-panic-devel - rust-ryu+small-devel - rust-ryu-devel - rust-safemem+default-devel - rust-safemem+std-devel - rust-safemem-devel - rust-same-file+default-devel - rust-same-file-devel - rust-scopeguard+default-devel - rust-scopeguard+use_std-devel - rust-scopeguard-devel - rust-semver+default-devel - rust-semver+serde-devel - rust-semver-devel - rust-semver-parser0.7+default-devel - rust-semver-parser0.7-devel - rust-serde+alloc-devel - rust-serde+default-devel - rust-serde+derive-devel - rust-serde+rc-devel - rust-serde+serde_derive-devel - rust-serde+std-devel - rust-serde+unstable-devel - rust-serde-devel - rust-serde0.8+alloc-devel - rust-serde0.8+collections-devel - rust-serde0.8+default-devel - rust-serde0.8+std-devel - rust-serde0.8+unstable-devel - rust-serde0.8-devel - rust-serde_derive+default-devel - rust-serde_derive+deserialize_in_place-devel - rust-serde_derive-devel - rust-serde_json+arbitrary_precision-devel - rust-serde_json+default-devel - rust-serde_json+indexmap-devel - rust-serde_json+preserve_order-devel - rust-serde_json+raw_value-devel - rust-serde_json-devel - rust-shell-words+default-devel - rust-shell-words-devel - rust-smallvec+default-devel - rust-smallvec+serde-devel - rust-smallvec+std-devel - rust-smallvec-devel - rust-stable_deref_trait+default-devel - rust-stable_deref_trait+std-devel - rust-stable_deref_trait-devel - rust-strsim+default-devel - rust-strsim-devel - rust-syn+clone-impls-devel - rust-syn+default-devel - rust-syn+derive-devel - rust-syn+extra-traits-devel - rust-syn+fold-devel - rust-syn+full-devel - rust-syn+parsing-devel - rust-syn+printing-devel - rust-syn+proc-macro-devel - rust-syn+quote-devel - rust-syn+visit-devel - rust-syn+visit-mut-devel - rust-syn-devel - rust-syntect+assets-devel - rust-syntect+bincode-devel - rust-syntect+default-devel - rust-syntect+dump-create-devel - rust-syntect+dump-create-rs-devel - rust-syntect+dump-load-devel - rust-syntect+dump-load-rs-devel - rust-syntect+flate2-devel - rust-syntect+fnv-devel - rust-syntect+html-devel - rust-syntect+onig-devel - rust-syntect+parsing-devel - rust-syntect+regex-syntax-devel - rust-syntect+yaml-load-devel - rust-syntect+yaml-rust-devel - rust-syntect-devel - rust-term_size+debug-devel - rust-term_size+default-devel - rust-term_size+unstable-devel - rust-term_size-devel - rust-termios+default-devel - rust-termios-devel - rust-textwrap+default-devel - rust-textwrap+term_size-devel - rust-textwrap-devel - rust-thread_local+default-devel - rust-thread_local-devel - rust-tokio-io+default-devel - rust-tokio-io-devel - rust-ucd-util+default-devel - rust-ucd-util-devel - rust-unicode-bidi+default-devel - rust-unicode-bidi+serde-devel - rust-unicode-bidi+unstable-devel - rust-unicode-bidi+with_serde-devel - rust-unicode-bidi-devel - rust-unicode-normalization+default-devel - rust-unicode-normalization-devel - rust-unicode-width+default-devel - rust-unicode-width+no_std-devel - rust-unicode-width-devel - rust-unicode-xid+default-devel - rust-unicode-xid+no_std-devel - rust-unicode-xid-devel - rust-unreachable+default-devel - rust-unreachable-devel - rust-url+default-devel - rust-url+encoding-devel - rust-url+heap_size-devel - rust-url+heapsize-devel - rust-url+query_encoding-devel - rust-url+rustc-serialize-devel - rust-url+serde-devel - rust-url-devel - rust-utf8-ranges+default-devel - rust-utf8-ranges-devel - rust-vec_map+default-devel - rust-vec_map+eders-devel - rust-vec_map+serde-devel - rust-vec_map-devel - rust-version_check+default-devel - rust-version_check-devel - rust-void+default-devel - rust-void+std-devel - rust-void-devel - rust-walkdir+default-devel - rust-walkdir-devel - rust-wild+default-devel - rust-wild-devel - rust-xml-rs+default-devel - rust-xml-rs-devel - rust-yaml-rust+default-devel - rust-yaml-rust-devel - rust-yaml-rust0.3+default-devel - rust-yaml-rust0.3+linked-hash-map-devel - rust-yaml-rust0.3+preserve_order-devel - rust-yaml-rust0.3-devel components: rpms: rust-adler32: rationale: Dependency of rust-miniz_oxide. repository: git+https://src.fedoraproject.org/rpms/rust-adler32 cache: https://src.fedoraproject.org/repo/pkgs/rust-adler32 ref: main buildorder: 10 rust-aho-corasick: rationale: Dependency of rust-regex. repository: git+https://src.fedoraproject.org/rpms/rust-aho-corasick cache: https://src.fedoraproject.org/repo/pkgs/rust-aho-corasick ref: main buildorder: 30 rust-ansi_colours: rationale: Dependency of rust-bat. repository: git+https://src.fedoraproject.org/rpms/rust-ansi_colours cache: https://src.fedoraproject.org/repo/pkgs/rust-ansi_colours ref: main buildorder: 130 rust-ansi_term: rationale: Dependency of rust-bat, rust-clap. repository: git+https://src.fedoraproject.org/rpms/rust-ansi_term cache: https://src.fedoraproject.org/repo/pkgs/rust-ansi_term ref: main buildorder: 10 rust-arrayvec: rationale: Dependency of rust-crossbeam-epoch0.5. repository: git+https://src.fedoraproject.org/rpms/rust-arrayvec cache: https://src.fedoraproject.org/repo/pkgs/rust-arrayvec ref: main buildorder: 70 rust-atty: rationale: Dependency of rust-bat, rust-clap, rust-console. repository: git+https://src.fedoraproject.org/rpms/rust-atty cache: https://src.fedoraproject.org/repo/pkgs/rust-atty ref: main buildorder: 20 rust-backtrace: rationale: Dependency of rust-error-chain. repository: git+https://src.fedoraproject.org/rpms/rust-backtrace cache: https://src.fedoraproject.org/repo/pkgs/rust-backtrace ref: main buildorder: 140 rust-backtrace-sys: rationale: Dependency of rust-backtrace. repository: git+https://src.fedoraproject.org/rpms/rust-backtrace-sys cache: https://src.fedoraproject.org/repo/pkgs/rust-backtrace-sys ref: main buildorder: 130 rust-base64: rationale: Dependency of rust-plist. repository: git+https://src.fedoraproject.org/rpms/rust-base64 cache: https://src.fedoraproject.org/repo/pkgs/rust-base64 ref: main buildorder: 20 rust-bat: rationale: Main component. repository: git+https://src.fedoraproject.org/rpms/rust-bat cache: https://src.fedoraproject.org/repo/pkgs/rust-bat ref: main buildorder: 170 rust-bincode: rationale: Dependency of rust-syntect. repository: git+https://src.fedoraproject.org/rpms/rust-bincode cache: https://src.fedoraproject.org/repo/pkgs/rust-bincode ref: main buildorder: 70 rust-bitflags: rationale: Dependency of rust-clap, rust-git2, rust-onig, rust-syntect. repository: git+https://src.fedoraproject.org/rpms/rust-bitflags cache: https://src.fedoraproject.org/repo/pkgs/rust-bitflags ref: main buildorder: 10 rust-build_const: rationale: Dependency of rust-crc. repository: git+https://src.fedoraproject.org/rpms/rust-build_const cache: https://src.fedoraproject.org/repo/pkgs/rust-build_const ref: main buildorder: 10 rust-byteorder: rationale: Dependency of rust-base64, rust-bincode, rust-bytes, rust-plist. repository: git+https://src.fedoraproject.org/rpms/rust-byteorder cache: https://src.fedoraproject.org/repo/pkgs/rust-byteorder ref: main buildorder: 10 rust-bytes: rationale: Dependency of rust-tokio-io. repository: git+https://src.fedoraproject.org/rpms/rust-bytes cache: https://src.fedoraproject.org/repo/pkgs/rust-bytes ref: main buildorder: 80 rust-cc: rationale: Dependency of rust-ansi_colours, rust-backtrace-sys, rust-curl-sys, rust-libgit2-sys, rust-libssh2-sys, rust-libz-sys, rust-miniz-sys, rust-miniz_oxide_c_api, rust-onig_sys, rust-openssl-sys. repository: git+https://src.fedoraproject.org/rpms/rust-cc cache: https://src.fedoraproject.org/repo/pkgs/rust-cc ref: main buildorder: 120 rust-cfg-if: rationale: Dependency of rust-backtrace, rust-cpp_demangle, rust-crossbeam-epoch0.5, rust-log, rust-memchr. repository: git+https://src.fedoraproject.org/rpms/rust-cfg-if cache: https://src.fedoraproject.org/repo/pkgs/rust-cfg-if ref: main buildorder: 10 rust-clap: rationale: Dependency of rust-bat. repository: git+https://src.fedoraproject.org/rpms/rust-clap cache: https://src.fedoraproject.org/repo/pkgs/rust-clap ref: main buildorder: 90 rust-clicolors-control: rationale: Dependency of rust-console. repository: git+https://src.fedoraproject.org/rpms/rust-clicolors-control cache: https://src.fedoraproject.org/repo/pkgs/rust-clicolors-control ref: main buildorder: 30 rust-console: rationale: Dependency of rust-bat. repository: git+https://src.fedoraproject.org/rpms/rust-console cache: https://src.fedoraproject.org/repo/pkgs/rust-console ref: main buildorder: 120 rust-content_inspector: rationale: Dependency of rust-bat. repository: git+https://src.fedoraproject.org/rpms/rust-content_inspector cache: https://src.fedoraproject.org/repo/pkgs/rust-content_inspector ref: main buildorder: 30 rust-cpp_demangle: rationale: Dependency of rust-backtrace. repository: git+https://src.fedoraproject.org/rpms/rust-cpp_demangle cache: https://src.fedoraproject.org/repo/pkgs/rust-cpp_demangle ref: main buildorder: 20 rust-crc: rationale: Dependency of rust-miniz_oxide_c_api. repository: git+https://src.fedoraproject.org/rpms/rust-crc cache: https://src.fedoraproject.org/repo/pkgs/rust-crc ref: main buildorder: 20 rust-crossbeam-deque0.4: rationale: Dependency of rust-rayon, rust-rayon-core. repository: git+https://src.fedoraproject.org/rpms/rust-crossbeam-deque0.4 cache: https://src.fedoraproject.org/repo/pkgs/rust-crossbeam-deque0.4 ref: main buildorder: 90 rust-crossbeam-epoch0.5: rationale: Dependency of rust-crossbeam-deque0.4. repository: git+https://src.fedoraproject.org/rpms/rust-crossbeam-epoch0.5 cache: https://src.fedoraproject.org/repo/pkgs/rust-crossbeam-epoch0.5 ref: main buildorder: 80 rust-crossbeam-utils: rationale: Dependency of rust-crossbeam-deque0.4, rust-crossbeam-epoch0.5. repository: git+https://src.fedoraproject.org/rpms/rust-crossbeam-utils cache: https://src.fedoraproject.org/repo/pkgs/rust-crossbeam-utils ref: main buildorder: 10 rust-curl-sys: rationale: Dependency of rust-libgit2-sys. repository: git+https://src.fedoraproject.org/rpms/rust-curl-sys cache: https://src.fedoraproject.org/repo/pkgs/rust-curl-sys ref: main buildorder: 140 rust-directories: rationale: Dependency of rust-bat. repository: git+https://src.fedoraproject.org/rpms/rust-directories cache: https://src.fedoraproject.org/repo/pkgs/rust-directories ref: main buildorder: 20 rust-either: rationale: Dependency of rust-bytes, rust-rayon. repository: git+https://src.fedoraproject.org/rpms/rust-either cache: https://src.fedoraproject.org/repo/pkgs/rust-either ref: main buildorder: 70 rust-encoding: rationale: Dependency of rust-bat, rust-url. repository: git+https://src.fedoraproject.org/rpms/rust-encoding cache: https://src.fedoraproject.org/repo/pkgs/rust-encoding ref: main buildorder: 20 rust-encoding-index-japanese: rationale: Dependency of rust-encoding. repository: git+https://src.fedoraproject.org/rpms/rust-encoding-index-japanese cache: https://src.fedoraproject.org/repo/pkgs/rust-encoding-index-japanese ref: main buildorder: 10 rust-encoding-index-korean: rationale: Dependency of rust-encoding. repository: git+https://src.fedoraproject.org/rpms/rust-encoding-index-korean cache: https://src.fedoraproject.org/repo/pkgs/rust-encoding-index-korean ref: main buildorder: 10 rust-encoding-index-simpchinese: rationale: Dependency of rust-encoding. repository: git+https://src.fedoraproject.org/rpms/rust-encoding-index-simpchinese cache: https://src.fedoraproject.org/repo/pkgs/rust-encoding-index-simpchinese ref: main buildorder: 10 rust-encoding-index-singlebyte: rationale: Dependency of rust-encoding. repository: git+https://src.fedoraproject.org/rpms/rust-encoding-index-singlebyte cache: https://src.fedoraproject.org/repo/pkgs/rust-encoding-index-singlebyte ref: main buildorder: 10 rust-encoding-index-tradchinese: rationale: Dependency of rust-encoding. repository: git+https://src.fedoraproject.org/rpms/rust-encoding-index-tradchinese cache: https://src.fedoraproject.org/repo/pkgs/rust-encoding-index-tradchinese ref: main buildorder: 10 rust-error-chain: rationale: Dependency of rust-bat. repository: git+https://src.fedoraproject.org/rpms/rust-error-chain cache: https://src.fedoraproject.org/repo/pkgs/rust-error-chain ref: main buildorder: 150 rust-flate2: rationale: Dependency of rust-syntect. repository: git+https://src.fedoraproject.org/rpms/rust-flate2 cache: https://src.fedoraproject.org/repo/pkgs/rust-flate2 ref: main buildorder: 140 rust-fnv: rationale: Dependency of rust-syntect. repository: git+https://src.fedoraproject.org/rpms/rust-fnv cache: https://src.fedoraproject.org/repo/pkgs/rust-fnv ref: main buildorder: 10 rust-futures0.1: rationale: Dependency of rust-flate2, rust-tokio-io. repository: git+https://src.fedoraproject.org/rpms/rust-futures0.1 cache: https://src.fedoraproject.org/repo/pkgs/rust-futures0.1 ref: main buildorder: 10 rust-git2: rationale: Dependency of rust-bat. repository: git+https://src.fedoraproject.org/rpms/rust-git2 cache: https://src.fedoraproject.org/repo/pkgs/rust-git2 ref: main buildorder: 160 rust-glob: rationale: Dependency of rust-cpp_demangle. repository: git+https://src.fedoraproject.org/rpms/rust-glob cache: https://src.fedoraproject.org/repo/pkgs/rust-glob ref: main buildorder: 10 rust-heapsize: rationale: Dependency of rust-linked-hash-map, rust-url. repository: git+https://src.fedoraproject.org/rpms/rust-heapsize cache: https://src.fedoraproject.org/repo/pkgs/rust-heapsize ref: main buildorder: 10 rust-humantime: rationale: Dependency of rust-plist. repository: git+https://src.fedoraproject.org/rpms/rust-humantime cache: https://src.fedoraproject.org/repo/pkgs/rust-humantime ref: main buildorder: 20 rust-idna: rationale: Dependency of rust-url. repository: git+https://src.fedoraproject.org/rpms/rust-idna cache: https://src.fedoraproject.org/repo/pkgs/rust-idna ref: main buildorder: 80 rust-indexmap: rationale: Dependency of rust-serde_json. repository: git+https://src.fedoraproject.org/rpms/rust-indexmap cache: https://src.fedoraproject.org/repo/pkgs/rust-indexmap ref: main buildorder: 70 rust-iovec: rationale: Dependency of rust-bytes. repository: git+https://src.fedoraproject.org/rpms/rust-iovec cache: https://src.fedoraproject.org/repo/pkgs/rust-iovec ref: main buildorder: 20 rust-itoa: rationale: Dependency of rust-serde_json. repository: git+https://src.fedoraproject.org/rpms/rust-itoa cache: https://src.fedoraproject.org/repo/pkgs/rust-itoa ref: main buildorder: 10 rust-lazy_static: rationale: Dependency of rust-bat, rust-clicolors-control, rust-console, rust-crossbeam-epoch0.5, rust-onig, rust-rayon-core, rust-syntect, rust-thread_local. repository: git+https://src.fedoraproject.org/rpms/rust-lazy_static cache: https://src.fedoraproject.org/repo/pkgs/rust-lazy_static ref: main buildorder: 20 rust-lazycell: rationale: Dependency of rust-syntect. repository: git+https://src.fedoraproject.org/rpms/rust-lazycell cache: https://src.fedoraproject.org/repo/pkgs/rust-lazycell ref: main buildorder: 10 rust-libc: rationale: Dependency of rust-atty, rust-backtrace, rust-backtrace-sys, rust-clicolors-control, rust-console, rust-curl-sys, rust-directories, rust-flate2, rust-git2, rust-iovec, rust-libgit2-sys, rust-libssh2-sys, rust-libz-sys, rust-memchr, rust-miniz-sys, rust-miniz_oxide_c_api, rust-num_cpus, rust-onig, rust-onig_sys, rust-openssl-sys, rust-parking_lot_core, rust-rand, rust-rand0.4, rust-rayon-core, rust-term_size, rust-termios. repository: git+https://src.fedoraproject.org/rpms/rust-libc cache: https://src.fedoraproject.org/repo/pkgs/rust-libc ref: main buildorder: 10 rust-libgit2-sys: rationale: Dependency of rust-git2. repository: git+https://src.fedoraproject.org/rpms/rust-libgit2-sys cache: https://src.fedoraproject.org/repo/pkgs/rust-libgit2-sys ref: main buildorder: 150 rust-libssh2-sys: rationale: Dependency of rust-libgit2-sys. repository: git+https://src.fedoraproject.org/rpms/rust-libssh2-sys cache: https://src.fedoraproject.org/repo/pkgs/rust-libssh2-sys ref: main buildorder: 140 rust-libz-sys: rationale: Dependency of rust-curl-sys, rust-flate2, rust-libgit2-sys, rust-libssh2-sys. repository: git+https://src.fedoraproject.org/rpms/rust-libz-sys cache: https://src.fedoraproject.org/repo/pkgs/rust-libz-sys ref: main buildorder: 130 rust-linked-hash-map: rationale: Dependency of rust-yaml-rust, rust-yaml-rust0.3. repository: git+https://src.fedoraproject.org/rpms/rust-linked-hash-map cache: https://src.fedoraproject.org/repo/pkgs/rust-linked-hash-map ref: main buildorder: 70 rust-lock_api: rationale: Dependency of rust-parking_lot. repository: git+https://src.fedoraproject.org/rpms/rust-lock_api cache: https://src.fedoraproject.org/repo/pkgs/rust-lock_api ref: main buildorder: 30 rust-log: rationale: Dependency of rust-git2, rust-rand, rust-tokio-io. repository: git+https://src.fedoraproject.org/rpms/rust-log cache: https://src.fedoraproject.org/repo/pkgs/rust-log ref: main buildorder: 70 rust-matches: rationale: Dependency of rust-idna, rust-unicode-bidi, rust-url. repository: git+https://src.fedoraproject.org/rpms/rust-matches cache: https://src.fedoraproject.org/repo/pkgs/rust-matches ref: main buildorder: 10 rust-memchr: rationale: Dependency of rust-aho-corasick, rust-content_inspector, rust-regex. repository: git+https://src.fedoraproject.org/rpms/rust-memchr cache: https://src.fedoraproject.org/repo/pkgs/rust-memchr ref: main buildorder: 20 rust-memoffset: rationale: Dependency of rust-crossbeam-epoch0.5. repository: git+https://src.fedoraproject.org/rpms/rust-memoffset cache: https://src.fedoraproject.org/repo/pkgs/rust-memoffset ref: main buildorder: 10 rust-miniz-sys: rationale: Dependency of rust-flate2. repository: git+https://src.fedoraproject.org/rpms/rust-miniz-sys cache: https://src.fedoraproject.org/repo/pkgs/rust-miniz-sys ref: main buildorder: 130 rust-miniz_oxide: rationale: Dependency of rust-miniz_oxide_c_api. repository: git+https://src.fedoraproject.org/rpms/rust-miniz_oxide cache: https://src.fedoraproject.org/repo/pkgs/rust-miniz_oxide ref: main buildorder: 20 rust-miniz_oxide_c_api: rationale: Dependency of rust-flate2. repository: git+https://src.fedoraproject.org/rpms/rust-miniz_oxide_c_api cache: https://src.fedoraproject.org/repo/pkgs/rust-miniz_oxide_c_api ref: main buildorder: 130 rust-no-panic: rationale: Dependency of rust-ryu. repository: git+https://src.fedoraproject.org/rpms/rust-no-panic cache: https://src.fedoraproject.org/repo/pkgs/rust-no-panic ref: main buildorder: 50 rust-nodrop: rationale: Dependency of rust-arrayvec. repository: git+https://src.fedoraproject.org/rpms/rust-nodrop cache: https://src.fedoraproject.org/repo/pkgs/rust-nodrop ref: main buildorder: 10 rust-num_cpus: rationale: Dependency of rust-rayon-core. repository: git+https://src.fedoraproject.org/rpms/rust-num_cpus cache: https://src.fedoraproject.org/repo/pkgs/rust-num_cpus ref: main buildorder: 20 rust-onig: rationale: Dependency of rust-syntect. repository: git+https://src.fedoraproject.org/rpms/rust-onig cache: https://src.fedoraproject.org/repo/pkgs/rust-onig ref: main buildorder: 140 rust-onig_sys: rationale: Dependency of rust-onig. repository: git+https://src.fedoraproject.org/rpms/rust-onig_sys cache: https://src.fedoraproject.org/repo/pkgs/rust-onig_sys ref: main buildorder: 130 rust-openssl-probe: rationale: Dependency of rust-git2. repository: git+https://src.fedoraproject.org/rpms/rust-openssl-probe cache: https://src.fedoraproject.org/repo/pkgs/rust-openssl-probe ref: main buildorder: 10 rust-openssl-sys: rationale: Dependency of rust-curl-sys, rust-git2, rust-libgit2-sys, rust-libssh2-sys. repository: git+https://src.fedoraproject.org/rpms/rust-openssl-sys cache: https://src.fedoraproject.org/repo/pkgs/rust-openssl-sys ref: main buildorder: 130 rust-owning_ref: rationale: Dependency of rust-lock_api. repository: git+https://src.fedoraproject.org/rpms/rust-owning_ref cache: https://src.fedoraproject.org/repo/pkgs/rust-owning_ref ref: main buildorder: 20 rust-packaging: rationale: Something needs to orchestrate build of all stuff below. repository: git+https://src.fedoraproject.org/rpms/rust-packaging cache: https://src.fedoraproject.org/repo/pkgs/rust-packaging ref: main rust-parking_lot: rationale: Dependency of rust-console. repository: git+https://src.fedoraproject.org/rpms/rust-parking_lot cache: https://src.fedoraproject.org/repo/pkgs/rust-parking_lot ref: main buildorder: 110 rust-parking_lot_core: rationale: Dependency of rust-parking_lot. repository: git+https://src.fedoraproject.org/rpms/rust-parking_lot_core cache: https://src.fedoraproject.org/repo/pkgs/rust-parking_lot_core ref: main buildorder: 100 rust-percent-encoding: rationale: Dependency of rust-url. repository: git+https://src.fedoraproject.org/rpms/rust-percent-encoding cache: https://src.fedoraproject.org/repo/pkgs/rust-percent-encoding ref: main buildorder: 10 rust-pkg-config: rationale: Dependency of rust-curl-sys, rust-libgit2-sys, rust-libssh2-sys, rust-libz-sys, rust-onig_sys, rust-openssl-sys. repository: git+https://src.fedoraproject.org/rpms/rust-pkg-config cache: https://src.fedoraproject.org/repo/pkgs/rust-pkg-config ref: main buildorder: 10 rust-plist: rationale: Dependency of rust-syntect. repository: git+https://src.fedoraproject.org/rpms/rust-plist cache: https://src.fedoraproject.org/repo/pkgs/rust-plist ref: main buildorder: 70 rust-proc-macro2: rationale: Dependency of rust-no-panic, rust-quote, rust-serde_derive, rust-syn. repository: git+https://src.fedoraproject.org/rpms/rust-proc-macro2 cache: https://src.fedoraproject.org/repo/pkgs/rust-proc-macro2 ref: main buildorder: 20 rust-quick-error: rationale: Dependency of rust-humantime. repository: git+https://src.fedoraproject.org/rpms/rust-quick-error cache: https://src.fedoraproject.org/repo/pkgs/rust-quick-error ref: main buildorder: 10 rust-quote: rationale: Dependency of rust-no-panic, rust-serde_derive, rust-syn. repository: git+https://src.fedoraproject.org/rpms/rust-quote cache: https://src.fedoraproject.org/repo/pkgs/rust-quote ref: main buildorder: 30 rust-rand: rationale: Dependency of rust-parking_lot_core. repository: git+https://src.fedoraproject.org/rpms/rust-rand cache: https://src.fedoraproject.org/repo/pkgs/rust-rand ref: main buildorder: 90 rust-rand0.4: rationale: Dependency of rust-rustc-serialize. repository: git+https://src.fedoraproject.org/rpms/rust-rand0.4 cache: https://src.fedoraproject.org/repo/pkgs/rust-rand0.4 ref: main buildorder: 20 rust-rand_core: rationale: Dependency of rust-rand_core0.2. repository: git+https://src.fedoraproject.org/rpms/rust-rand_core cache: https://src.fedoraproject.org/repo/pkgs/rust-rand_core ref: main buildorder: 70 rust-rand_core0.2: rationale: Dependency of rust-rand. repository: git+https://src.fedoraproject.org/rpms/rust-rand_core0.2 cache: https://src.fedoraproject.org/repo/pkgs/rust-rand_core0.2 ref: main buildorder: 80 rust-rayon: rationale: Dependency of rust-cc. repository: git+https://src.fedoraproject.org/rpms/rust-rayon cache: https://src.fedoraproject.org/repo/pkgs/rust-rayon ref: main buildorder: 110 rust-rayon-core: rationale: Dependency of rust-rayon. repository: git+https://src.fedoraproject.org/rpms/rust-rayon-core cache: https://src.fedoraproject.org/repo/pkgs/rust-rayon-core ref: main buildorder: 100 rust-regex: rationale: Dependency of rust-console. repository: git+https://src.fedoraproject.org/rpms/rust-regex cache: https://src.fedoraproject.org/repo/pkgs/rust-regex ref: main buildorder: 40 rust-regex-syntax: rationale: Dependency of rust-regex, rust-syntect. repository: git+https://src.fedoraproject.org/rpms/rust-regex-syntax cache: https://src.fedoraproject.org/repo/pkgs/rust-regex-syntax ref: main buildorder: 20 rust-rustc-demangle: rationale: Dependency of rust-backtrace. repository: git+https://src.fedoraproject.org/rpms/rust-rustc-demangle cache: https://src.fedoraproject.org/repo/pkgs/rust-rustc-demangle ref: main buildorder: 10 rust-rustc-serialize: rationale: Dependency of rust-backtrace, rust-url. repository: git+https://src.fedoraproject.org/rpms/rust-rustc-serialize cache: https://src.fedoraproject.org/repo/pkgs/rust-rustc-serialize ref: main buildorder: 30 rust-rustc_version: rationale: Dependency of rust-parking_lot_core. repository: git+https://src.fedoraproject.org/rpms/rust-rustc_version cache: https://src.fedoraproject.org/repo/pkgs/rust-rustc_version ref: main buildorder: 80 rust-ryu: rationale: Dependency of rust-serde_json. repository: git+https://src.fedoraproject.org/rpms/rust-ryu cache: https://src.fedoraproject.org/repo/pkgs/rust-ryu ref: main buildorder: 60 rust-safemem: rationale: Dependency of rust-base64. repository: git+https://src.fedoraproject.org/rpms/rust-safemem cache: https://src.fedoraproject.org/repo/pkgs/rust-safemem ref: main buildorder: 10 rust-same-file: rationale: Dependency of rust-walkdir. repository: git+https://src.fedoraproject.org/rpms/rust-same-file cache: https://src.fedoraproject.org/repo/pkgs/rust-same-file ref: main buildorder: 10 rust-scopeguard: rationale: Dependency of rust-crossbeam-epoch0.5, rust-lock_api. repository: git+https://src.fedoraproject.org/rpms/rust-scopeguard cache: https://src.fedoraproject.org/repo/pkgs/rust-scopeguard ref: main buildorder: 10 rust-semver: rationale: Dependency of rust-rustc_version. repository: git+https://src.fedoraproject.org/rpms/rust-semver cache: https://src.fedoraproject.org/repo/pkgs/rust-semver ref: main buildorder: 70 rust-semver-parser0.7: rationale: Dependency of rust-semver. repository: git+https://src.fedoraproject.org/rpms/rust-semver-parser0.7 cache: https://src.fedoraproject.org/repo/pkgs/rust-semver-parser0.7 ref: main buildorder: 10 rust-serde: rationale: Dependency of rust-arrayvec, rust-backtrace, rust-bincode, rust-bytes, rust-either, rust-indexmap, rust-linked-hash-map, rust-log, rust-plist, rust-rand, rust-rand_core, rust-semver, rust-serde_json, rust-smallvec, rust-syntect, rust-unicode-bidi, rust-vec_map. repository: git+https://src.fedoraproject.org/rpms/rust-serde cache: https://src.fedoraproject.org/repo/pkgs/rust-serde ref: main buildorder: 60 rust-serde0.8: rationale: Dependency of rust-unicode-bidi, rust-url. repository: git+https://src.fedoraproject.org/rpms/rust-serde0.8 cache: https://src.fedoraproject.org/repo/pkgs/rust-serde0.8 ref: main buildorder: 10 rust-serde_derive: rationale: Dependency of rust-backtrace, rust-rand, rust-rand_core, rust-serde, rust-syntect. repository: git+https://src.fedoraproject.org/rpms/rust-serde_derive cache: https://src.fedoraproject.org/repo/pkgs/rust-serde_derive ref: main buildorder: 50 rust-serde_json: rationale: Dependency of rust-syntect. repository: git+https://src.fedoraproject.org/rpms/rust-serde_json cache: https://src.fedoraproject.org/repo/pkgs/rust-serde_json ref: main buildorder: 80 rust-shell-words: rationale: Dependency of rust-bat. repository: git+https://src.fedoraproject.org/rpms/rust-shell-words cache: https://src.fedoraproject.org/repo/pkgs/rust-shell-words ref: main buildorder: 10 rust-smallvec: rationale: Dependency of rust-parking_lot_core. repository: git+https://src.fedoraproject.org/rpms/rust-smallvec cache: https://src.fedoraproject.org/repo/pkgs/rust-smallvec ref: main buildorder: 70 rust-stable_deref_trait: rationale: Dependency of rust-owning_ref. repository: git+https://src.fedoraproject.org/rpms/rust-stable_deref_trait cache: https://src.fedoraproject.org/repo/pkgs/rust-stable_deref_trait ref: main buildorder: 10 rust-strsim: rationale: Dependency of rust-clap. repository: git+https://src.fedoraproject.org/rpms/rust-strsim cache: https://src.fedoraproject.org/repo/pkgs/rust-strsim ref: main buildorder: 10 rust-syn: rationale: Dependency of rust-no-panic, rust-serde_derive. repository: git+https://src.fedoraproject.org/rpms/rust-syn cache: https://src.fedoraproject.org/repo/pkgs/rust-syn ref: main buildorder: 40 rust-syntect: rationale: Dependency of rust-bat. repository: git+https://src.fedoraproject.org/rpms/rust-syntect cache: https://src.fedoraproject.org/repo/pkgs/rust-syntect ref: main buildorder: 150 rust-term_size: rationale: Dependency of rust-clap, rust-textwrap. repository: git+https://src.fedoraproject.org/rpms/rust-term_size cache: https://src.fedoraproject.org/repo/pkgs/rust-term_size ref: main buildorder: 20 rust-termios: rationale: Dependency of rust-console. repository: git+https://src.fedoraproject.org/rpms/rust-termios cache: https://src.fedoraproject.org/repo/pkgs/rust-termios ref: main buildorder: 20 rust-textwrap: rationale: Dependency of rust-clap. repository: git+https://src.fedoraproject.org/rpms/rust-textwrap cache: https://src.fedoraproject.org/repo/pkgs/rust-textwrap ref: main buildorder: 30 rust-thread_local: rationale: Dependency of rust-regex. repository: git+https://src.fedoraproject.org/rpms/rust-thread_local cache: https://src.fedoraproject.org/repo/pkgs/rust-thread_local ref: main buildorder: 30 rust-tokio-io: rationale: Dependency of rust-flate2. repository: git+https://src.fedoraproject.org/rpms/rust-tokio-io cache: https://src.fedoraproject.org/repo/pkgs/rust-tokio-io ref: main buildorder: 90 rust-ucd-util: rationale: Dependency of rust-regex-syntax. repository: git+https://src.fedoraproject.org/rpms/rust-ucd-util cache: https://src.fedoraproject.org/repo/pkgs/rust-ucd-util ref: main buildorder: 10 rust-unicode-bidi: rationale: Dependency of rust-idna. repository: git+https://src.fedoraproject.org/rpms/rust-unicode-bidi cache: https://src.fedoraproject.org/repo/pkgs/rust-unicode-bidi ref: main buildorder: 70 rust-unicode-normalization: rationale: Dependency of rust-idna. repository: git+https://src.fedoraproject.org/rpms/rust-unicode-normalization cache: https://src.fedoraproject.org/repo/pkgs/rust-unicode-normalization ref: main buildorder: 10 rust-unicode-width: rationale: Dependency of rust-clap, rust-console, rust-textwrap. repository: git+https://src.fedoraproject.org/rpms/rust-unicode-width cache: https://src.fedoraproject.org/repo/pkgs/rust-unicode-width ref: main buildorder: 10 rust-unicode-xid: rationale: Dependency of rust-proc-macro2, rust-syn. repository: git+https://src.fedoraproject.org/rpms/rust-unicode-xid cache: https://src.fedoraproject.org/repo/pkgs/rust-unicode-xid ref: main buildorder: 10 rust-unreachable: rationale: Dependency of rust-smallvec. repository: git+https://src.fedoraproject.org/rpms/rust-unreachable cache: https://src.fedoraproject.org/repo/pkgs/rust-unreachable ref: main buildorder: 20 rust-url: rationale: Dependency of rust-git2. repository: git+https://src.fedoraproject.org/rpms/rust-url cache: https://src.fedoraproject.org/repo/pkgs/rust-url ref: main buildorder: 90 rust-utf8-ranges: rationale: Dependency of rust-regex. repository: git+https://src.fedoraproject.org/rpms/rust-utf8-ranges cache: https://src.fedoraproject.org/repo/pkgs/rust-utf8-ranges ref: main buildorder: 10 rust-vec_map: rationale: Dependency of rust-clap. repository: git+https://src.fedoraproject.org/rpms/rust-vec_map cache: https://src.fedoraproject.org/repo/pkgs/rust-vec_map ref: main buildorder: 70 rust-version_check: rationale: Dependency of rust-lazy_static, rust-memchr. repository: git+https://src.fedoraproject.org/rpms/rust-version_check cache: https://src.fedoraproject.org/repo/pkgs/rust-version_check ref: main buildorder: 10 rust-void: rationale: Dependency of rust-unreachable. repository: git+https://src.fedoraproject.org/rpms/rust-void cache: https://src.fedoraproject.org/repo/pkgs/rust-void ref: main buildorder: 10 rust-walkdir: rationale: Dependency of rust-syntect. repository: git+https://src.fedoraproject.org/rpms/rust-walkdir cache: https://src.fedoraproject.org/repo/pkgs/rust-walkdir ref: main buildorder: 20 rust-wild: rationale: Dependency of rust-bat. repository: git+https://src.fedoraproject.org/rpms/rust-wild cache: https://src.fedoraproject.org/repo/pkgs/rust-wild ref: main buildorder: 10 rust-xml-rs: rationale: Dependency of rust-plist. repository: git+https://src.fedoraproject.org/rpms/rust-xml-rs cache: https://src.fedoraproject.org/repo/pkgs/rust-xml-rs ref: main buildorder: 10 rust-yaml-rust: rationale: Dependency of rust-syntect. repository: git+https://src.fedoraproject.org/rpms/rust-yaml-rust cache: https://src.fedoraproject.org/repo/pkgs/rust-yaml-rust ref: main buildorder: 80 rust-yaml-rust0.3: rationale: Dependency of rust-clap. repository: git+https://src.fedoraproject.org/rpms/rust-yaml-rust0.3 cache: https://src.fedoraproject.org/repo/pkgs/rust-yaml-rust0.3 ref: main buildorder: 80 artifacts: rpms: - bat-0:0.8.0-1.module_2418+43cef932.x86_64 ... --- document: modulemd version: 2 data: name: avocado stream: stable version: 20180816135414 context: 6c81f848 arch: x86_64 summary: Framework with tools and libraries for Automated Testing description: >- Avocado is a set of tools and libraries (what people call these days a framework) to perform automated testing. license: module: - MIT content: - MIT xmd: mbs: mse: TRUE scmurl: https://src.fedoraproject.org/modules/avocado.git?#10208a3095f9522485b933dbab830e3338af95e6 commit: 10208a3095f9522485b933dbab830e3338af95e6 buildrequires: platform: ref: f29 stream: f29 context: 00000000 version: 5 filtered_rpms: [] rpms: python-avocado: ref: 87dc683a36d0862340d3af99b78fa189a1aba424 dependencies: - buildrequires: platform: [f29] requires: platform: [f29] references: community: http://avocado-framework.github.io/ documentation: http://avocado-framework.readthedocs.io/ tracker: https://github.com/avocado-framework/avocado/issues profiles: default: rpms: - python2-avocado - python2-avocado-plugins-output-html - python2-avocado-plugins-varianter-yaml-to-mux minimal: rpms: - python2-avocado api: rpms: - python-avocado-examples - python2-avocado - python2-avocado-plugins-output-html - python2-avocado-plugins-resultsdb - python2-avocado-plugins-runner-docker - python2-avocado-plugins-runner-remote - python2-avocado-plugins-runner-vm - python2-avocado-plugins-varianter-yaml-to-mux components: rpms: python-avocado: rationale: Framework with tools and libraries for Automated Testing repository: git://pkgs.fedoraproject.org/rpms/python-avocado cache: http://pkgs.fedoraproject.org/repo/pkgs/python-avocado ref: main artifacts: rpms: - python-avocado-examples-0:52.1-7.module_1939+1f9e88da.noarch - python2-avocado-0:52.1-7.module_1939+1f9e88da.noarch - python2-avocado-plugins-output-html-0:52.1-7.module_1939+1f9e88da.noarch - python2-avocado-plugins-resultsdb-0:52.1-7.module_1939+1f9e88da.noarch - python2-avocado-plugins-runner-docker-0:52.1-7.module_1939+1f9e88da.noarch - python2-avocado-plugins-runner-remote-0:52.1-7.module_1939+1f9e88da.noarch - python2-avocado-plugins-runner-vm-0:52.1-7.module_1939+1f9e88da.noarch - python2-avocado-plugins-varianter-yaml-to-mux-0:52.1-7.module_1939+1f9e88da.noarch ... --- document: modulemd version: 2 data: name: avocado stream: latest version: 20181128175948 context: 6c81f848 arch: x86_64 summary: Framework with tools and libraries for Automated Testing description: >- Avocado is a set of tools and libraries (what people call these days a framework) to perform automated testing. license: module: - MIT content: - MIT xmd: mbs: mse: TRUE scmurl: https://src.fedoraproject.org/modules/avocado.git?#3bb704422c0fbba23b0bcb5712f930ecf828d859 commit: 3bb704422c0fbba23b0bcb5712f930ecf828d859 buildrequires: platform: ref: f29 stream: f29 context: 00000000 version: 5 filtered_rpms: [] rpms: python-avocado: ref: 04abfe7b49a5c7c78c77ac91d7f66f62cf27d320 dependencies: - buildrequires: platform: [f29] requires: platform: [f29] references: community: http://avocado-framework.github.io/ documentation: http://avocado-framework.readthedocs.io/ tracker: https://github.com/avocado-framework/avocado/issues profiles: default: description: Default profile installing the most commonly used avocado packages. rpms: - python2-avocado - python2-avocado-plugins-output-html - python2-avocado-plugins-varianter-yaml-to-mux minimal: description: Minimal profile installing only the main avocado package. rpms: - python2-avocado api: rpms: - python-avocado-bash - python-avocado-common - python-avocado-examples - python2-avocado - python2-avocado-plugins-glib - python2-avocado-plugins-golang - python2-avocado-plugins-loader-yaml - python2-avocado-plugins-output-html - python2-avocado-plugins-result-upload - python2-avocado-plugins-resultsdb - python2-avocado-plugins-runner-docker - python2-avocado-plugins-runner-remote - python2-avocado-plugins-runner-vm - python2-avocado-plugins-varianter-cit - python2-avocado-plugins-varianter-pict - python2-avocado-plugins-varianter-yaml-to-mux - python3-avocado - python3-avocado-plugins-glib - python3-avocado-plugins-golang - python3-avocado-plugins-loader-yaml - python3-avocado-plugins-output-html - python3-avocado-plugins-result-upload - python3-avocado-plugins-resultsdb - python3-avocado-plugins-runner-docker - python3-avocado-plugins-runner-remote - python3-avocado-plugins-runner-vm - python3-avocado-plugins-varianter-cit - python3-avocado-plugins-varianter-pict - python3-avocado-plugins-varianter-yaml-to-mux components: rpms: python-avocado: rationale: Framework with tools and libraries for Automated Testing repository: git+https://src.fedoraproject.org/rpms/python-avocado cache: https://src.fedoraproject.org/repo/pkgs/python-avocado ref: latest artifacts: rpms: - python-avocado-bash-0:66.0-1.module_2521+75c96e21.noarch - python-avocado-common-0:66.0-1.module_2521+75c96e21.noarch - python-avocado-examples-0:66.0-1.module_2521+75c96e21.noarch - python2-avocado-0:66.0-1.module_2521+75c96e21.noarch - python2-avocado-plugins-glib-0:66.0-1.module_2521+75c96e21.noarch - python2-avocado-plugins-golang-0:66.0-1.module_2521+75c96e21.noarch - python2-avocado-plugins-loader-yaml-0:66.0-1.module_2521+75c96e21.noarch - python2-avocado-plugins-output-html-0:66.0-1.module_2521+75c96e21.noarch - python2-avocado-plugins-result-upload-0:66.0-1.module_2521+75c96e21.noarch - python2-avocado-plugins-resultsdb-0:66.0-1.module_2521+75c96e21.noarch - python2-avocado-plugins-runner-docker-0:66.0-1.module_2521+75c96e21.noarch - python2-avocado-plugins-runner-remote-0:66.0-1.module_2521+75c96e21.noarch - python2-avocado-plugins-runner-vm-0:66.0-1.module_2521+75c96e21.noarch - python2-avocado-plugins-varianter-cit-0:66.0-1.module_2521+75c96e21.noarch - python2-avocado-plugins-varianter-pict-0:66.0-1.module_2521+75c96e21.noarch - python2-avocado-plugins-varianter-yaml-to-mux-0:66.0-1.module_2521+75c96e21.noarch - python3-avocado-0:66.0-1.module_2521+75c96e21.noarch - python3-avocado-plugins-glib-0:66.0-1.module_2521+75c96e21.noarch - python3-avocado-plugins-golang-0:66.0-1.module_2521+75c96e21.noarch - python3-avocado-plugins-loader-yaml-0:66.0-1.module_2521+75c96e21.noarch - python3-avocado-plugins-output-html-0:66.0-1.module_2521+75c96e21.noarch - python3-avocado-plugins-result-upload-0:66.0-1.module_2521+75c96e21.noarch - python3-avocado-plugins-resultsdb-0:66.0-1.module_2521+75c96e21.noarch - python3-avocado-plugins-runner-docker-0:66.0-1.module_2521+75c96e21.noarch - python3-avocado-plugins-runner-remote-0:66.0-1.module_2521+75c96e21.noarch - python3-avocado-plugins-runner-vm-0:66.0-1.module_2521+75c96e21.noarch - python3-avocado-plugins-varianter-cit-0:66.0-1.module_2521+75c96e21.noarch - python3-avocado-plugins-varianter-pict-0:66.0-1.module_2521+75c96e21.noarch - python3-avocado-plugins-varianter-yaml-to-mux-0:66.0-1.module_2521+75c96e21.noarch ... --- document: modulemd version: 2 data: name: ant stream: 1.10 version: 20181122140939 context: 819b5873 arch: x86_64 summary: Java build tool description: >- Apache Ant is a Java library and command-line tool whose mission is to drive processes described in build files as targets and extension points dependent upon each other. The main known usage of Ant is the build of Java applications. Ant supplies a number of built-in tasks allowing to compile, assemble, test and run Java applications. Ant can also be used effectively to build non Java applications, for instance C or C++ applications. More generally, Ant can be used to pilot any type of process which can be described in terms of targets and tasks. license: module: - MIT content: - MIT xmd: mbs: mse: TRUE scmurl: https://src.fedoraproject.org/modules/ant.git?#82545c3ff2e5a5c0c1d6a48752f07606d05aab51 commit: 82545c3ff2e5a5c0c1d6a48752f07606d05aab51 buildrequires: javapackages-tools: ref: 7dd42811cbaef813c5ef7b2ce23dac1a8f6c6d73 stream: 201801 context: b43b0c8f version: 20181120083500 filtered_rpms: [] platform: ref: virtual stream: f28 context: 00000000 version: 4 filtered_rpms: [] rpms: ant: ref: ec6653dbbf9587a49cb5b9fd4af3ea0d05d2591e regexp: ref: df33662fed3c4976d44d8c2a6e1f985dee267854 jsch: ref: d3c2ac09fd4fc2a4f38924c41d60442dc68c5130 xerces-j2: ref: d6f998798e3b56374e6b71d05778a7fde75f5c2f hamcrest: ref: 444686e0db0101adfa1034acc94b0be738ffbfb9 junit5: ref: 8119da9b8a7820079efe27c87db25551e2701e42 apiguardian: ref: 4817a2aa9dfa641a565fdf13bfed13dd93ca4f47 bcel: ref: 2d8e69b4eb09b7e8d564e3055d9e52d2e13903a6 antlr: ref: 23bd89d38736a655bba089b8f8dd558916a91e43 univocity-parsers: ref: a285d9bfb7cb049bfb66d9ecab9f4d2f99795966 javamail: ref: 05571ebac5fbe684e41b538eaf2509ab6da2f05c jzlib: ref: 4aabfebcf13f08db8c16c58516113d5ab106a473 apache-commons-logging: ref: 4d8596c64b6c0951b0e8f511d5c067f81b393e5d bsf: ref: 76107e4b8615d23e0c8e2626a0d6038248c2c6d5 apache-commons-net: ref: ee034784b96471c5c953b8ba616022f6d36472f8 xz-java: ref: 2bd7e796aa52aa1b88e48e5d0552789183c5a278 jakarta-oro: ref: 3c2a24ce2df92c56b8867a04d2dbc978f8ebaf0a xalan-j2: ref: 9f2b49ad37540ba25541ce57bcb4e1fe2d7cebc2 xml-commons-apis: ref: d7346b6b9f768fd30009559ce91a422c29a6db2f xml-commons-resolver: ref: a95c650fa714a6a9f14fb5ca3f70dee9f58e3403 junit: ref: fb35c5a8174b20e95ad6e0db972fd6307796acee opentest4j: ref: c797cfc85af6aa6562fe0a91002027966bfbfdf9 log4j12: ref: bd4e4c63f40fb4e5d74dd1fcd44cc1613b1e1beb jdepend: ref: 35590b9e5ef235ff06f7a18aeac3ceba90e924b8 dependencies: - buildrequires: javapackages-tools: [201801] platform: [f28] requires: platform: [] profiles: default: rpms: - ant api: rpms: - ant - ant-antlr - ant-apache-bcel - ant-apache-bsf - ant-apache-log4j - ant-apache-oro - ant-apache-regexp - ant-apache-resolver - ant-apache-xalan2 - ant-commons-logging - ant-commons-net - ant-javamail - ant-jdepend - ant-jmf - ant-jsch - ant-junit - ant-junit5 - ant-swing - ant-testutil - ant-xz filter: rpms: - ant-javadoc - ant-manual - antlr-C++ - antlr-javadoc - antlr-manual - apache-commons-logging-javadoc - apache-commons-net-javadoc - apiguardian - apiguardian-javadoc - bcel-javadoc - bsf-javadoc - hamcrest - hamcrest-demo - hamcrest-javadoc - jakarta-oro-javadoc - javamail-javadoc - jdepend-demo - jdepend-javadoc - jsch-javadoc - junit-javadoc - junit-manual - junit5-guide - junit5-javadoc - jzlib-demo - jzlib-javadoc - log4j12-javadoc - opentest4j-javadoc - regexp-javadoc - univocity-parsers-javadoc - xalan-j2-demo - xalan-j2-javadoc - xalan-j2-manual - xalan-j2-xsltc - xerces-j2-demo - xerces-j2-javadoc - xml-commons-apis-javadoc - xml-commons-apis-manual - xml-commons-resolver-javadoc - xz-java-javadoc components: rpms: ant: rationale: 'Module API. ' repository: git+https://src.fedoraproject.org/rpms/ant cache: https://src.fedoraproject.org/repo/pkgs/ant ref: ec6653d buildorder: 40 antlr: rationale: 'Runtime dependency of ant. ' repository: git+https://src.fedoraproject.org/rpms/antlr cache: https://src.fedoraproject.org/repo/pkgs/antlr ref: javapackages buildorder: 10 apache-commons-logging: rationale: 'Runtime dependency of ant, bsf. ' repository: git+https://src.fedoraproject.org/rpms/apache-commons-logging cache: https://src.fedoraproject.org/repo/pkgs/apache-commons-logging ref: javapackages buildorder: 10 apache-commons-net: rationale: 'Runtime dependency of ant. ' repository: git+https://src.fedoraproject.org/rpms/apache-commons-net cache: https://src.fedoraproject.org/repo/pkgs/apache-commons-net ref: javapackages buildorder: 10 apiguardian: rationale: 'Build dependency of junit5. ' repository: git+https://src.fedoraproject.org/rpms/apiguardian cache: https://src.fedoraproject.org/repo/pkgs/apiguardian ref: 4817a2a buildorder: 10 bcel: rationale: 'Runtime dependency of ant. ' repository: git+https://src.fedoraproject.org/rpms/bcel cache: https://src.fedoraproject.org/repo/pkgs/bcel ref: javapackages buildorder: 10 bsf: rationale: 'Runtime dependency of ant. ' repository: git+https://src.fedoraproject.org/rpms/bsf cache: https://src.fedoraproject.org/repo/pkgs/bsf ref: javapackages buildorder: 20 hamcrest: rationale: 'Runtime dependency of junit. ' repository: git+https://src.fedoraproject.org/rpms/hamcrest cache: https://src.fedoraproject.org/repo/pkgs/hamcrest ref: javapackages buildorder: 10 jakarta-oro: rationale: 'Runtime dependency of ant. ' repository: git+https://src.fedoraproject.org/rpms/jakarta-oro cache: https://src.fedoraproject.org/repo/pkgs/jakarta-oro ref: javapackages buildorder: 10 javamail: rationale: 'Runtime dependency of ant. ' repository: git+https://src.fedoraproject.org/rpms/javamail cache: https://src.fedoraproject.org/repo/pkgs/javamail ref: javapackages buildorder: 10 jdepend: rationale: 'Runtime dependency of ant. ' repository: git+https://src.fedoraproject.org/rpms/jdepend cache: https://src.fedoraproject.org/repo/pkgs/jdepend ref: javapackages buildorder: 10 jsch: rationale: 'Runtime dependency of ant. ' repository: git+https://src.fedoraproject.org/rpms/jsch cache: https://src.fedoraproject.org/repo/pkgs/jsch ref: javapackages buildorder: 20 junit: rationale: 'Runtime dependency of ant, junit5. ' repository: git+https://src.fedoraproject.org/rpms/junit cache: https://src.fedoraproject.org/repo/pkgs/junit ref: javapackages buildorder: 20 junit5: rationale: 'Runtime dependency of ant. ' repository: git+https://src.fedoraproject.org/rpms/junit5 cache: https://src.fedoraproject.org/repo/pkgs/junit5 ref: 8119da9 buildorder: 30 jzlib: rationale: 'Runtime dependency of jsch. ' repository: git+https://src.fedoraproject.org/rpms/jzlib cache: https://src.fedoraproject.org/repo/pkgs/jzlib ref: javapackages buildorder: 10 log4j12: rationale: 'Runtime dependency of ant. ' repository: git+https://src.fedoraproject.org/rpms/log4j12 cache: https://src.fedoraproject.org/repo/pkgs/log4j12 ref: javapackages buildorder: 10 opentest4j: rationale: 'Runtime dependency of junit5. ' repository: git+https://src.fedoraproject.org/rpms/opentest4j cache: https://src.fedoraproject.org/repo/pkgs/opentest4j ref: c797cfc buildorder: 10 regexp: rationale: 'Runtime dependency of ant. ' repository: git+https://src.fedoraproject.org/rpms/regexp cache: https://src.fedoraproject.org/repo/pkgs/regexp ref: javapackages buildorder: 10 univocity-parsers: rationale: 'Runtime dependency of junit5. ' repository: git+https://src.fedoraproject.org/rpms/univocity-parsers cache: https://src.fedoraproject.org/repo/pkgs/univocity-parsers ref: a285d9b buildorder: 10 xalan-j2: rationale: 'Runtime dependency of ant. ' repository: git+https://src.fedoraproject.org/rpms/xalan-j2 cache: https://src.fedoraproject.org/repo/pkgs/xalan-j2 ref: javapackages buildorder: 30 xerces-j2: rationale: 'Runtime dependency of xalan-j2. ' repository: git+https://src.fedoraproject.org/rpms/xerces-j2 cache: https://src.fedoraproject.org/repo/pkgs/xerces-j2 ref: javapackages buildorder: 20 xml-commons-apis: rationale: 'Runtime dependency of xalan-j2, xerces-j2. ' repository: git+https://src.fedoraproject.org/rpms/xml-commons-apis cache: https://src.fedoraproject.org/repo/pkgs/xml-commons-apis ref: javapackages buildorder: 10 xml-commons-resolver: rationale: 'Runtime dependency of ant, xerces-j2. ' repository: git+https://src.fedoraproject.org/rpms/xml-commons-resolver cache: https://src.fedoraproject.org/repo/pkgs/xml-commons-resolver ref: javapackages buildorder: 10 xz-java: rationale: 'Runtime dependency of ant. ' repository: git+https://src.fedoraproject.org/rpms/xz-java cache: https://src.fedoraproject.org/repo/pkgs/xz-java ref: javapackages buildorder: 10 artifacts: rpms: - ant-0:1.10.5-3.module_2512+68251d4e.noarch - ant-antlr-0:1.10.5-3.module_2512+68251d4e.noarch - ant-apache-bcel-0:1.10.5-3.module_2512+68251d4e.noarch - ant-apache-bsf-0:1.10.5-3.module_2512+68251d4e.noarch - ant-apache-log4j-0:1.10.5-3.module_2512+68251d4e.noarch - ant-apache-oro-0:1.10.5-3.module_2512+68251d4e.noarch - ant-apache-regexp-0:1.10.5-3.module_2512+68251d4e.noarch - ant-apache-resolver-0:1.10.5-3.module_2512+68251d4e.noarch - ant-apache-xalan2-0:1.10.5-3.module_2512+68251d4e.noarch - ant-commons-logging-0:1.10.5-3.module_2512+68251d4e.noarch - ant-commons-net-0:1.10.5-3.module_2512+68251d4e.noarch - ant-javamail-0:1.10.5-3.module_2512+68251d4e.noarch - ant-jdepend-0:1.10.5-3.module_2512+68251d4e.noarch - ant-jmf-0:1.10.5-3.module_2512+68251d4e.noarch - ant-jsch-0:1.10.5-3.module_2512+68251d4e.noarch - ant-junit-0:1.10.5-3.module_2512+68251d4e.noarch - ant-junit5-0:1.10.5-3.module_2512+68251d4e.noarch - ant-lib-0:1.10.5-3.module_2512+68251d4e.noarch - ant-swing-0:1.10.5-3.module_2512+68251d4e.noarch - ant-testutil-0:1.10.5-3.module_2512+68251d4e.noarch - ant-xz-0:1.10.5-3.module_2512+68251d4e.noarch - antlr-C++-doc-0:2.7.7-56.module_2512+68251d4e.noarch - antlr-tool-0:2.7.7-56.module_2512+68251d4e.noarch - apache-commons-logging-0:1.2-13.module_2512+68251d4e.noarch - apache-commons-net-0:3.6-3.module_2512+68251d4e.noarch - bcel-0:6.2-2.module_2512+68251d4e.noarch - bsf-0:2.4.0-30.module_2512+68251d4e.noarch - hamcrest-core-0:1.3-23.module_2512+68251d4e.noarch - jakarta-oro-0:2.0.8-23.module_2512+68251d4e.noarch - javamail-0:1.5.2-7.module_2512+68251d4e.noarch - jdepend-0:2.9.1-18.module_2512+68251d4e.noarch - jsch-0:0.1.54-7.module_2512+68251d4e.noarch - junit-1:4.12-9.module_2512+68251d4e.noarch - junit5-0:5.3.1-1.module_2512+68251d4e.noarch - jzlib-0:1.1.3-8.module_2512+68251d4e.noarch - log4j12-0:1.2.17-22.module_2512+68251d4e.noarch - opentest4j-0:1.0.0-3.module_2512+68251d4e.noarch - python2-antlr-0:2.7.7-56.module_2512+68251d4e.noarch - regexp-1:1.5-26.module_2512+68251d4e.noarch - univocity-parsers-0:2.5.5-4.module_2512+68251d4e.noarch - xalan-j2-0:2.7.1-38.module_2512+68251d4e.noarch - xerces-j2-0:2.11.0-34.module_2512+68251d4e.noarch - xml-commons-apis-0:1.4.01-25.module_2512+68251d4e.noarch - xml-commons-resolver-0:1.2-26.module_2512+68251d4e.noarch - xz-java-0:1.8-2.module_2512+68251d4e.noarch ... --- document: modulemd-defaults version: 1 data: module: stratis stream: 1 profiles: 1: [default] ... --- document: modulemd-defaults version: 1 data: module: reviewboard profiles: 2.5: [default] 3.0: [default] ... --- document: modulemd-defaults version: 1 data: module: nodejs profiles: 6: [default] 8: [default] 9: [default] ... --- document: modulemd-defaults version: 1 data: module: maven profiles: 3.5: [default] ... --- document: modulemd-defaults version: 1 data: module: gimp profiles: 2.10: [default] ... --- document: modulemd-defaults version: 1 data: module: dwm stream: 6.1 profiles: 6.0: [default] 6.1: [default] latest: [default] ... --- document: modulemd-defaults version: 1 data: module: django profiles: 1.6: [default] ... --- document: modulemd-defaults version: 1 data: module: bat stream: latest profiles: latest: [default] ... --- document: modulemd-defaults version: 1 data: module: ant profiles: 1.10: [default] ... fedora-modularity-libmodulemd-357799c/modulemd/tests/test_data/f29.yaml000066400000000000000000015715741502446517500261710ustar00rootroot00000000000000--- document: modulemd version: 2 data: name: testmodule stream: main version: 20180405123256 context: c2c572ec arch: x86_64 summary: A test module in all its beautiful beauty description: >- This module demonstrates how to write simple modulemd files And can be used for testing the build and release pipeline. license: module: - MIT content: - GPL-1.0-or-later OR Artistic-1.0-Perl - MIT xmd: mbs: scmurl: https://src.fedoraproject.org/modules/testmodule.git?#0d33e028e4561f82ea43f670ee6366675cd6a6fe commit: 0d33e028e4561f82ea43f670ee6366675cd6a6fe buildrequires: platform: ref: virtual stream: f29 filtered_rpms: [] version: 4 rpms: perl-List-Compare: ref: c6a689a6ce2683b15b32f83e6cb5d43ffd3816f5 tangerine: ref: 239ada495d941ceefd8f359e1d8a47877fbba4a9 perl-Tangerine: ref: 7e96446223f1ad84a26c7cf23d6591cd9f6326c6 requires: platform: ref: virtual stream: f29 filtered_rpms: [] version: 4 dependencies: - buildrequires: platform: [f29] requires: platform: [f29] references: community: https://docs.pagure.org/modularity/ documentation: https://fedoraproject.org/wiki/Fedora_Packaging_Guidelines_for_Modules profiles: default: rpms: - tangerine api: rpms: - perl-Tangerine - tangerine components: rpms: perl-List-Compare: rationale: A dependency of tangerine. repository: git://pkgs.fedoraproject.org/rpms/perl-List-Compare cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-List-Compare ref: main perl-Tangerine: rationale: Provides API for this module and is a dependency of tangerine. repository: git://pkgs.fedoraproject.org/rpms/perl-Tangerine cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-Tangerine ref: 7e96446 tangerine: rationale: Provides API for this module. repository: git://pkgs.fedoraproject.org/rpms/tangerine cache: http://pkgs.fedoraproject.org/repo/pkgs/tangerine ref: main buildorder: 10 artifacts: rpms: - perl-List-Compare-0:0.53-9.module_1588+5eed94c6.noarch - perl-Tangerine-0:0.22-2.module_1588+5eed94c6.noarch - tangerine-0:0.22-7.module_1588+5eed94c6.noarch ... --- document: modulemd version: 2 data: name: stratis stream: main version: 20180726133047 context: b33445dc arch: x86_64 summary: Stratis Storage description: >- Easy to use local storage management. license: module: - MIT content: - MIT xmd: mbs: mse: TRUE scmurl: https://src.fedoraproject.org/modules/stratis.git?#9b532650b3aa46f31e204f9e592f77092b39d84c commit: 9b532650b3aa46f31e204f9e592f77092b39d84c buildrequires: platform: ref: f29 stream: f29 context: 00000000 version: 5 filtered_rpms: [] rpms: stratisd: ref: fdbba2c34c470cc375c439c92a5d88093a6c5a5b dependencies: - buildrequires: platform: [f29] requires: platform: [] references: community: https://github.com/stratis-storage documentation: https://stratis-storage.github.io tracker: https://github.com/stratis-storage/stratisd/issues profiles: default: rpms: - stratis-cli - stratisd api: rpms: - stratisd components: rpms: stratisd: rationale: 'Daemon that manages a pool of block devices to create flexible filesystems. Main component. ' repository: git://pkgs.fedoraproject.org/rpms/stratisd cache: http://pkgs.fedoraproject.org/repo/pkgs/stratisd ref: main artifacts: rpms: - stratisd-0:0.5.4-3.module_1955+a3f37153.x86_64 ... --- document: modulemd version: 2 data: name: stratis stream: 1 version: 20180927214347 context: 7a127764 arch: x86_64 summary: Stratis Storage description: >- Easy to use local storage management. license: module: - MIT content: - MIT xmd: mbs: mse: TRUE scmurl: https://src.fedoraproject.org/modules/stratis.git?#e2f5584fe1ffda30d784ffd40e2d125f66622321 commit: e2f5584fe1ffda30d784ffd40e2d125f66622321 buildrequires: platform: ref: f30 stream: f30 context: 00000000 version: 5 filtered_rpms: [] rpms: stratisd: ref: 2a2c3a1257da7bbd78aaeebf91776fcf79782b6f dependencies: - buildrequires: platform: [f30] requires: platform: [f29] references: community: https://github.com/stratis-storage documentation: https://stratis-storage.github.io tracker: https://github.com/stratis-storage/stratisd/issues profiles: default: rpms: - stratis-cli - stratisd api: rpms: - stratisd components: rpms: stratisd: rationale: 'Daemon that manages a pool of block devices to create flexible filesystems. Main component. ' repository: git+https://src.fedoraproject.org/rpms/stratisd cache: https://src.fedoraproject.org/repo/pkgs/stratisd ref: 1 artifacts: rpms: - stratisd-0:1.0.0-1.module_2238+b7fada88.x86_64 ... --- document: modulemd version: 2 data: name: scala stream: 2.10 version: 20180702155503 context: 819b5873 arch: x86_64 summary: A hybrid functional/object-oriented language for the JVM description: >- Scala is a general purpose programming language designed to express common programming patterns in a concise, elegant, and type-safe way. It smoothly integrates features of object-oriented and functional languages. It is also fully interoperable with Java. license: module: - MIT content: - MIT xmd: mbs: mse: TRUE scmurl: https://src.fedoraproject.org/modules/scala.git?#90dc1eed8ec4fbf279c20f5f4ec59d01efc2890a commit: 90dc1eed8ec4fbf279c20f5f4ec59d01efc2890a buildrequires: javapackages-tools: ref: 1e429a4d686d3fdd1d93ce7e8ac7254148ea3471 stream: 201801 context: b43b0c8f version: 20180629150827 filtered_rpms: [] platform: ref: virtual stream: f28 context: 00000000 version: 4 filtered_rpms: [] rpms: jline: ref: 7b4b53826f84932425353b5ebebe2e607fa6964c scala: ref: da70d06a833057731e73c845aa338b1bd6d04ded jansi: ref: 4bdd2387b97de8352a0f7a976b7d8ccde8db0b24 jansi-native: ref: 544b397797de885ca9b65442a4f956f817b76ddc hawtjni: ref: 93281e0174d79dfd549e57818292b1cbec5a7703 dependencies: - requires: platform: [] profiles: default: rpms: - scala api: rpms: - scala - scala-apidoc - scala-swing filter: rpms: - ant-scala - hawtjni - hawtjni-javadoc - jansi-javadoc - jansi-native-javadoc - jline-javadoc - maven-hawtjni-plugin buildopts: rpms: macros: | %_with_xmvn_javadoc 1 %_without_asciidoc 1 %_without_avalon 1 %_without_bouncycastle 1 %_without_cython 1 %_without_dafsa 1 %_without_desktop 1 %_without_doxygen 1 %_without_dtd 1 %_without_eclipse 1 %_without_ehcache 1 %_without_emacs 1 %_without_equinox 1 %_without_fop 1 %_without_ftp 1 %_without_gradle 1 %_without_groovy 1 %_without_hadoop 1 %_without_hsqldb 1 %_without_itext 1 %_without_jackson 1 %_without_jmh 1 %_without_jna 1 %_without_jpa 1 %_without_junit5 1 %_without_logback 1 %_without_markdown 1 %_without_memcached 1 %_without_memoryfilesystem 1 %_without_obr 1 %_without_python 1 %_without_reporting 1 %_without_scm 1 %_without_snappy 1 %_without_spring 1 %_without_ssh 1 %_without_testlib 1 components: rpms: hawtjni: rationale: 'Runtime dependency of jansi, jansi-native. ' repository: git://pkgs.fedoraproject.org/rpms/hawtjni cache: http://pkgs.fedoraproject.org/repo/pkgs/hawtjni ref: javapackages buildorder: 10 jansi: rationale: 'Runtime dependency of jline, scala. ' repository: git://pkgs.fedoraproject.org/rpms/jansi cache: http://pkgs.fedoraproject.org/repo/pkgs/jansi ref: javapackages buildorder: 30 jansi-native: rationale: 'Runtime dependency of jansi. ' repository: git://pkgs.fedoraproject.org/rpms/jansi-native cache: http://pkgs.fedoraproject.org/repo/pkgs/jansi-native ref: javapackages buildorder: 20 jline: rationale: 'Runtime dependency of scala. ' repository: git://pkgs.fedoraproject.org/rpms/jline cache: http://pkgs.fedoraproject.org/repo/pkgs/jline ref: javapackages buildorder: 40 scala: rationale: 'Module API. ' repository: git://pkgs.fedoraproject.org/rpms/scala cache: http://pkgs.fedoraproject.org/repo/pkgs/scala ref: javapackages buildorder: 50 artifacts: rpms: - hawtjni-runtime-0:1.16-1.module_1889+fac7270b.noarch - jansi-0:1.17.1-1.module_1889+fac7270b.noarch - jansi-native-0:1.7-5.module_1889+fac7270b.x86_64 - jline-0:2.14.6-2.module_1889+fac7270b.noarch - scala-0:2.10.6-8.module_1889+fac7270b.noarch - scala-apidoc-0:2.10.6-8.module_1889+fac7270b.noarch - scala-swing-0:2.10.6-8.module_1889+fac7270b.noarch ... --- document: modulemd version: 2 data: name: ripgrep stream: main version: 20180804140932 context: b33445dc arch: x86_64 summary: Line oriented search tool using Rust's regex library description: > Line oriented search tool using Rust's regex library. Combines the raw performance of grep with the usability of the silver searcher. license: module: - MIT content: - MIT xmd: mbs: mse: TRUE scmurl: https://src.fedoraproject.org/modules/ripgrep.git?#44a146a6fc3cc5311c2dd585e66d34006e539d38 commit: 44a146a6fc3cc5311c2dd585e66d34006e539d38 buildrequires: platform: ref: f29 stream: f29 context: 00000000 version: 5 filtered_rpms: [] rpms: rust-ripgrep: ref: 844193e3738eeda66372e1016b7d1dbc2f5259ba dependencies: - buildrequires: platform: [f29] requires: platform: [] references: community: https://github.com/BurntSushi/ripgrep documentation: https://github.com/BurntSushi/ripgrep/blob/e86d3d95c2de788818c0673622043542b3e8f06d/FAQ.md tracker: https://github.com/BurntSushi/ripgrep/issues profiles: default: rpms: - ripgrep api: rpms: - ripgrep components: rpms: rust-ripgrep: rationale: Main component. repository: git://pkgs.fedoraproject.org/rpms/rust-ripgrep cache: http://pkgs.fedoraproject.org/repo/pkgs/rust-ripgrep ref: main artifacts: rpms: - ripgrep-0:0.9.0-1.module_1969+efa3f7be.x86_64 ... --- document: modulemd version: 2 data: name: reviewboard stream: 3.0 version: 20180828143238 context: 083bce86 arch: x86_64 summary: A web-based code review tool description: >- Review Board is a powerful web-based code review tool that offers developers an easy way to handle code reviews. It scales well from small projects to large companies and offers a variety of tools to take much of the stress and time out of the code review process. license: module: - MIT content: - MIT xmd: mbs: mse: TRUE scmurl: https://src.fedoraproject.org/modules/reviewboard.git?#e6f3a5daedd9ff9db8b612787cea963bd4bfe5e7 commit: e6f3a5daedd9ff9db8b612787cea963bd4bfe5e7 buildrequires: platform: ref: f29 stream: f29 context: 00000000 version: 5 filtered_rpms: [] django: ref: da53d66d3db1aa5f6afd75887b00fa26849bcc0a stream: 1.6 context: 6c81f848 version: 20180828135711 filtered_rpms: [] rpms: ReviewBoard: ref: 5df2608020e4d3bb2fd0474178a59e496e6d070f python-django-cors-headers: ref: 1c0762b2af97e2ddaef3e1847fdb06d950e61ff3 python-django-braces: ref: 172667f02de94fec7cc7c3d64e6c86c2c9e9f41c python-oauthlib: ref: 74c26e26899c3217d93f72ae7e0ccde0053dc5f0 python-django-multiselectfield: ref: 149bf58875fb7b55efe29e1735baf96d44eb99a9 python-django-haystack: ref: 20fe71a6fc50a83b24578fbaf86e94a4ca584d31 python-django-oauth-toolkit: ref: 2bbcf8bcefef32936d4e36e9468280bf99ea8532 python-django-evolution: ref: 512424e1fc4b99f6f74c01a4130a4d9402b56b4e python-asana: ref: e8395e75464604bbf4ebe55a0ee3074aafa8ca2a python-djblets: ref: 1bc612af932bc1462a44dadbbedf24eee386e76e python-django-pipeline: ref: 92809ad85daf2270bb6d192adc3106fb1089cc60 python-pymdown-extensions: ref: 78a87635b426ca7e8c6f608a38789e82b5611dc9 dependencies: - buildrequires: django: [1.6] platform: [f29] requires: django: [1.6] platform: [f29] references: community: https://www.reviewboard.org documentation: https://www.reviewboard.org/docs tracker: https://hellosplat.com/s/beanbag/tickets/ profiles: default: rpms: - ReviewBoard server: rpms: - ReviewBoard api: rpms: - ReviewBoard - python2-djblets components: rpms: ReviewBoard: rationale: The Review Board code review tool repository: git+https://src.fedoraproject.org/rpms/ReviewBoard cache: https://src.fedoraproject.org/repo/pkgs/ReviewBoard ref: 3.0 buildorder: 20 python-asana: rationale: Required by ReviewBoard to interact with Asana repository: git+https://src.fedoraproject.org/rpms/python-asana cache: https://src.fedoraproject.org/repo/pkgs/python-asana ref: 0.7 python-django-braces: rationale: Required by django-oauth-toolkit repository: git+https://src.fedoraproject.org/rpms/python-django-braces cache: https://src.fedoraproject.org/repo/pkgs/python-django-braces ref: 1 python-django-cors-headers: rationale: Required by ReviewBoard repository: git+https://src.fedoraproject.org/rpms/python-django-cors-headers cache: https://src.fedoraproject.org/repo/pkgs/python-django-cors-headers ref: 1.1 python-django-evolution: rationale: A database modification library used and maintained by the Review Board upstream repository: git+https://src.fedoraproject.org/rpms/python-django-evolution cache: https://src.fedoraproject.org/repo/pkgs/python-django-evolution ref: 0.7 python-django-haystack: rationale: An older version of the Haystack search library for Django, needed for compatibility. repository: git+https://src.fedoraproject.org/rpms/python-django-haystack cache: https://src.fedoraproject.org/repo/pkgs/python-django-haystack ref: 2.4 python-django-multiselectfield: rationale: An older version of a mult-select form field needed by Review Board. repository: git+https://src.fedoraproject.org/rpms/python-django-multiselectfield cache: https://src.fedoraproject.org/repo/pkgs/python-django-multiselectfield ref: 0.1 python-django-oauth-toolkit: rationale: Required by ReviewBoard for OAuth2 support repository: git+https://src.fedoraproject.org/rpms/python-django-oauth-toolkit cache: https://src.fedoraproject.org/repo/pkgs/python-django-oauth-toolkit ref: 0.9 buildorder: 10 python-django-pipeline: rationale: An older version of this asset-packaging library for Django that is compatible with Review Board. repository: git+https://src.fedoraproject.org/rpms/python-django-pipeline cache: https://src.fedoraproject.org/repo/pkgs/python-django-pipeline ref: 1.6 python-djblets: rationale: Review Board tool library repository: git+https://src.fedoraproject.org/rpms/python-djblets cache: https://src.fedoraproject.org/repo/pkgs/python-djblets ref: 1.0 buildorder: 10 python-oauthlib: rationale: Required by django-oauth-toolkit repository: git+https://src.fedoraproject.org/rpms/python-oauthlib cache: https://src.fedoraproject.org/repo/pkgs/python-oauthlib ref: 1.0 python-pymdown-extensions: rationale: Required by ReviewBoard for Markdown support repository: git+https://src.fedoraproject.org/rpms/python-pymdown-extensions cache: https://src.fedoraproject.org/repo/pkgs/python-pymdown-extensions ref: 3 artifacts: rpms: - ReviewBoard-0:3.0.8-1.module_2082+1fa91c5a.noarch - python-django-haystack-docs-0:2.4.1-12.module_1655+c1bb0ce4.noarch - python2-asana-0:0.7.0-3.module_2082+1fa91c5a.noarch - python2-django-braces-0:1.12.0-3.module_1655+c1bb0ce4.noarch - python2-django-cors-headers-0:1.1.0-1.module_1655+c1bb0ce4.noarch - python2-django-evolution-1:0.7.7-12.module_1655+c1bb0ce4.noarch - python2-django-haystack-0:2.4.1-12.module_1655+c1bb0ce4.noarch - python2-django-multiselectfield-0:0.1.3-10.module_1655+c1bb0ce4.noarch - python2-django-oauth-toolkit-0:0.9.0-3.module_1655+c1bb0ce4.noarch - python2-django-pipeline-0:1.6.14-2.module_2082+1fa91c5a.noarch - python2-djblets-0:1.0.6-1.module_1839+6b846779.noarch - python2-oauthlib-0:1.0.3-5.module_1655+c1bb0ce4.noarch - python2-pymdown-extensions-0:3.5-5.module_1655+c1bb0ce4.noarch - python3-django-cors-headers-0:1.1.0-1.module_1655+c1bb0ce4.noarch - python3-oauthlib-0:1.0.3-5.module_1655+c1bb0ce4.noarch ... --- document: modulemd version: 2 data: name: reviewboard stream: 2.5 version: 20180828143308 context: 083bce86 arch: x86_64 summary: A web-based code review tool description: >- Review Board is a powerful web-based code review tool that offers developers an easy way to handle code reviews. It scales well from small projects to large companies and offers a variety of tools to take much of the stress and time out of the code review process. license: module: - MIT content: - MIT xmd: mbs: mse: TRUE scmurl: https://src.fedoraproject.org/modules/reviewboard.git?#0fc31243aa85666e4e584aebda7a74e430cd0698 commit: 0fc31243aa85666e4e584aebda7a74e430cd0698 buildrequires: platform: ref: f29 stream: f29 context: 00000000 version: 5 filtered_rpms: [] django: ref: da53d66d3db1aa5f6afd75887b00fa26849bcc0a stream: 1.6 context: 6c81f848 version: 20180828135711 filtered_rpms: [] rpms: python-django-multiselectfield: ref: 149bf58875fb7b55efe29e1735baf96d44eb99a9 python-markdown: ref: 96c1b2f925c2ad3b7aae04ab7ebf25ae1d714ebf python-django-evolution: ref: 512424e1fc4b99f6f74c01a4130a4d9402b56b4e python-django-pipeline: ref: f019137be96cf86f49a81001fef47a0c7ab6aa35 ReviewBoard: ref: 5d28213f6a797e5ce28ad05ab23f80fe67353da8 python-djblets: ref: d5634779089456ff3d0ac7b78eec81e13ff4c733 python-django-haystack: ref: 20fe71a6fc50a83b24578fbaf86e94a4ca584d31 dependencies: - buildrequires: django: [1.6] platform: [f29] requires: django: [1.6] platform: [f29] references: community: https://www.reviewboard.org documentation: https://www.reviewboard.org/docs tracker: https://hellosplat.com/s/beanbag/tickets/ profiles: default: rpms: - ReviewBoard server: rpms: - ReviewBoard api: rpms: - ReviewBoard - python2-djblets components: rpms: ReviewBoard: rationale: The Review Board code review tool repository: git+https://src.fedoraproject.org/rpms/ReviewBoard cache: https://src.fedoraproject.org/repo/pkgs/ReviewBoard ref: 2.5 buildorder: 20 python-django-evolution: rationale: A database modification library used and maintained by the Review Board upstream repository: git+https://src.fedoraproject.org/rpms/python-django-evolution cache: https://src.fedoraproject.org/repo/pkgs/python-django-evolution ref: 0.7 python-django-haystack: rationale: An older version of the Haystack search library for Django, needed for compatibility. repository: git+https://src.fedoraproject.org/rpms/python-django-haystack cache: https://src.fedoraproject.org/repo/pkgs/python-django-haystack ref: 2.4 python-django-multiselectfield: rationale: An older version of a mult-select form field needed by Review Board. repository: git+https://src.fedoraproject.org/rpms/python-django-multiselectfield cache: https://src.fedoraproject.org/repo/pkgs/python-django-multiselectfield ref: 0.1 python-django-pipeline: rationale: An older version of this asset-packaging library for Django that is compatible with Review Board. repository: git+https://src.fedoraproject.org/rpms/python-django-pipeline cache: https://src.fedoraproject.org/repo/pkgs/python-django-pipeline ref: 1.3 python-djblets: rationale: Review Board tool library repository: git+https://src.fedoraproject.org/rpms/python-djblets cache: https://src.fedoraproject.org/repo/pkgs/python-djblets ref: 0.9 buildorder: 10 python-markdown: rationale: An older version of this Markdown implementation that is compatible with Review Board. repository: git+https://src.fedoraproject.org/rpms/python-markdown cache: https://src.fedoraproject.org/repo/pkgs/python-markdown ref: 2.4 artifacts: rpms: - ReviewBoard-0:2.5.17-17.module_1631+4353a891.noarch - python-django-haystack-docs-0:2.4.1-12.module_1631+4353a891.noarch - python2-django-evolution-1:0.7.7-12.module_1631+4353a891.noarch - python2-django-haystack-0:2.4.1-12.module_1631+4353a891.noarch - python2-django-multiselectfield-0:0.1.3-10.module_1631+4353a891.noarch - python2-django-pipeline-0:1.3.27-11.module_1631+4353a891.noarch - python2-djblets-0:0.9.9-13.module_1631+4353a891.noarch - python2-markdown-0:2.4.1-12.module_2085+40241970.noarch - python3-markdown-0:2.4.1-12.module_2085+40241970.noarch ... --- document: modulemd version: 2 data: name: postgresql stream: 9.6 version: 20180816142114 context: 6c81f848 arch: x86_64 summary: PostgreSQL module description: >- PostgreSQL is an advanced Object-Relational database management system (DBMS). The PostgreSQL server can be found in the postgresql-server sub-package. license: module: - MIT content: - MIT xmd: mbs: mse: TRUE scmurl: https://src.fedoraproject.org/modules/postgresql.git?#8765a18f16976cfe6122319e337c27e9ec40206a commit: 8765a18f16976cfe6122319e337c27e9ec40206a buildrequires: platform: ref: f29 stream: f29 context: 00000000 version: 5 filtered_rpms: [] rpms: postgresql: ref: 3f21ecc4af44639c7cb40244f5db7a48936e3452 dependencies: - buildrequires: platform: [f29] requires: platform: [f29] references: community: https://docs.pagure.org/modularity/ documentation: https://www.postgresql.org/docs/ tracker: https://github.com/modularity-modules/postgresql profiles: client: rpms: - postgresql default: rpms: - postgresql-server server: rpms: - postgresql-server api: rpms: - postgresql - postgresql-server buildopts: rpms: macros: | %runselftest 0 components: rpms: postgresql: rationale: main server component repository: git://pkgs.fedoraproject.org/rpms/postgresql cache: http://pkgs.fedoraproject.org/repo/pkgs/postgresql ref: 3f21ecc4 artifacts: rpms: - postgresql-0:9.6.8-1.module_1710+b535a823.x86_64 - postgresql-contrib-0:9.6.8-1.module_1710+b535a823.x86_64 - postgresql-devel-0:9.6.8-1.module_1710+b535a823.x86_64 - postgresql-docs-0:9.6.8-1.module_1710+b535a823.x86_64 - postgresql-libs-0:9.6.8-1.module_1710+b535a823.x86_64 - postgresql-plperl-0:9.6.8-1.module_1710+b535a823.x86_64 - postgresql-plpython-0:9.6.8-1.module_1710+b535a823.x86_64 - postgresql-plpython3-0:9.6.8-1.module_1710+b535a823.x86_64 - postgresql-pltcl-0:9.6.8-1.module_1710+b535a823.x86_64 - postgresql-server-0:9.6.8-1.module_1710+b535a823.x86_64 - postgresql-static-0:9.6.8-1.module_1710+b535a823.x86_64 - postgresql-test-0:9.6.8-1.module_1710+b535a823.x86_64 - postgresql-upgrade-0:9.6.8-1.module_1710+b535a823.x86_64 ... --- document: modulemd version: 2 data: name: pki stream: 10.6 version: 20180816141946 context: 6c81f848 arch: x86_64 summary: Dogtag PKI description: >- A module for Dogtag PKI. license: module: - MIT content: - MIT xmd: mbs: mse: TRUE scmurl: https://src.fedoraproject.org/modules/pki.git?#ae3c166e41f4a0c896667f2c4949c8b923421625 commit: ae3c166e41f4a0c896667f2c4949c8b923421625 buildrequires: platform: ref: f29 stream: f29 context: 00000000 version: 5 filtered_rpms: [] rpms: pki-core: ref: 55207954907bfc90c746358248d21d7f21f5362c jss: ref: cb35c90824e12860c131a565ca18fcaacfbce156 tomcatjss: ref: 7487d4dca363dd965ba35c8732fa86c65c69f1aa dogtag-pki: ref: 8c9a1c4bdb4ef13a3df0a173adfecc102a28c89b dependencies: - buildrequires: platform: [f29] requires: platform: [f29] references: community: http://www.dogtagpki.org documentation: http://www.dogtagpki.org tracker: https://pagure.io/dogtagpki/issues profiles: default: rpms: - dogtag-pki components: rpms: dogtag-pki: rationale: Dogtag PKI packages repository: git://pkgs.fedoraproject.org/rpms/dogtag-pki cache: http://pkgs.fedoraproject.org/repo/pkgs/dogtag-pki ref: 10.6 buildorder: 20 jss: rationale: JSS packages repository: git://pkgs.fedoraproject.org/rpms/jss cache: http://pkgs.fedoraproject.org/repo/pkgs/jss ref: 4.5 pki-core: rationale: PKI Core packages repository: git://pkgs.fedoraproject.org/rpms/pki-core cache: http://pkgs.fedoraproject.org/repo/pkgs/pki-core ref: 10.6 buildorder: 20 tomcatjss: rationale: TomcatJSS packages repository: git://pkgs.fedoraproject.org/rpms/tomcatjss cache: http://pkgs.fedoraproject.org/repo/pkgs/tomcatjss ref: 7.3 buildorder: 10 artifacts: rpms: - dogtag-pki-0:10.6.3-1.module_1909+cebfdf1a.x86_64 - dogtag-pki-console-theme-0:10.6.3-1.module_1909+cebfdf1a.noarch - dogtag-pki-server-theme-0:10.6.3-1.module_1909+cebfdf1a.noarch - jss-0:4.5.0-0.4.module_1913+819762cf.x86_64 - jss-javadoc-0:4.5.0-0.4.module_1913+819762cf.x86_64 - pki-base-0:10.6.3-1.module_1909+cebfdf1a.noarch - pki-base-java-0:10.6.3-1.module_1909+cebfdf1a.noarch - pki-ca-0:10.6.3-1.module_1909+cebfdf1a.noarch - pki-console-0:10.6.3-1.module_1909+cebfdf1a.noarch - pki-javadoc-0:10.6.3-1.module_1909+cebfdf1a.noarch - pki-kra-0:10.6.3-1.module_1909+cebfdf1a.noarch - pki-ocsp-0:10.6.3-1.module_1909+cebfdf1a.noarch - pki-server-0:10.6.3-1.module_1909+cebfdf1a.noarch - pki-symkey-0:10.6.3-1.module_1909+cebfdf1a.x86_64 - pki-tks-0:10.6.3-1.module_1909+cebfdf1a.noarch - pki-tools-0:10.6.3-1.module_1909+cebfdf1a.x86_64 - pki-tps-0:10.6.3-1.module_1909+cebfdf1a.x86_64 - python3-pki-0:10.6.3-1.module_1909+cebfdf1a.noarch - tomcatjss-0:7.3.2-1.module_1913+819762cf.noarch ... --- document: modulemd version: 2 data: name: perl-bootstrap stream: 5.26 version: 20180816141919 context: 6c81f848 arch: x86_64 summary: Perl bootstrap module for bootrapping Perl module description: > This is the Perl interpreter and a set of modules written in Perl language intended for bootstrapping the perl module. This module disables some optional tests to limit amount of components. This module is not intended for public use. It's an intermediate step for building perl module. license: module: - MIT content: - MIT xmd: mbs: mse: TRUE scmurl: https://src.fedoraproject.org/modules/perl-bootstrap.git?#ea11aea44aca54021cb782f1e243ff03722f86a5 commit: ea11aea44aca54021cb782f1e243ff03722f86a5 buildrequires: platform: ref: f29 stream: f29 context: 00000000 version: 5 filtered_rpms: [] rpms: perl-Devel-Symdump: ref: 777175a55451fddc85329a437c755efd410264da perl-Test-Pod: ref: b4f74114b955cfee96c10b0f04444ae6b4d2f4ce perl-File-Which: ref: 0c9cbe3a1d01d42035314f8d5527e6f505142cab perl-Test-Needs: ref: 2b9911794ccae86c53d0e4c6013fcb961e67f250 perl-Digest-MD5: ref: 8fad912c493bc960566e5ce7118e0cdce3b9a769 perl-Perl-Version: ref: 3d5649c15b5a2501e0e1ca057129ed3cb6166d65 perl-Pod-Escapes: ref: b86907d1d42dbd25c327e34b09b061f0a3f96d8a perl-Text-ParseWords: ref: 809c9bd7181b286d5e14e80a73f6ea50ac3b62b3 perl-IO-Socket-INET6: ref: f750541d79d2f642a06b52e6803f9c1cf81e70bf perl-podlators: ref: f3046951a9e1a70ccf2215f31e74c0accecd9770 perl-Pod-Eventual: ref: 9a1fa2670ce5ae1fa9730625bc5eb657ba0b1d5b perl-IPC-Cmd: ref: a22c9a02e64eaca7d7ebd7326ddc2baece702cd4 perl-Test-Output: ref: ccffd17b4ddd2bf2f739889e7b603f3071bccb97 perl-SUPER: ref: a5b2533172574285c2ea051300f06357982e2ea9 perl-MRO-Compat: ref: 7b9d4772b76353d755f44acc9a686e9566a1a4b7 perl-IPC-SysV: ref: 4cf56fbde1b8a369fb6114d0f2dc7866dd835b71 perl-Package-Generator: ref: 8a4118f2e4299109b3a7e6e0dea5ee7424e632bf perl-IO-HTML: ref: cf5155257c1a690461c0a0d54fa7af196b45898c perl-Time-Local: ref: ad2b9372902fb6279ca783752d56632d54e263b5 perl-Compress-Raw-Bzip2: ref: 2a51171531415b788d4bc6cdd05a823fb4b831b5 perl-IO-String: ref: b99e305978ee5a51efefa31c50ba2a0e502a71cc perl: ref: 8a371bbe29d1908077211d14e9e701b836c81540 perl-File-Slurp-Tiny: ref: fbf489950350c0fc8d7a3cb883820993e7df457b perl-Params-Util: ref: a69abfa9df18bb76b6ccb98caa103795abc5d083 perl-File-Path: ref: ac6856f118e7aa9a3a709c6202ab06494ecdd9b3 perl-Sub-Uplevel: ref: 865c6011e62e5b0b8a16ce433b0ce7618d62e9a2 perl-Module-Load: ref: 4f363f0c7d356591f33a22a930f4501167b01053 perl-CPAN-Meta-Requirements: ref: f25cbf2508f08dcb618b5e097cda6023aea94101 perl-Test-CPAN-Meta: ref: e495a7b866c6c955fdc577ae3408bdf2f7d4c7e6 perl-IO-Socket-IP: ref: 1a65c1170f6582ad9ece8fe9c76c540e18cd3264 perl-Test-Harness: ref: 65288c532917fea41328a20520e0755f6eb18463 perl-parent: ref: c3649d1868f869883423867076131c1604fd4467 perl-ExtUtils-CBuilder: ref: 4e5e482495a977c28396e2d1149def8dcb12e15f perl-perlfaq: ref: d5a90bd6871ae7a66cd64494b37727986b6eccbf perl-Sub-Install: ref: f3365c2a0b610eb21f6c1c786958c0e8ba08a47c perl-IPC-System-Simple: ref: 5b4319c5aabf7945208163c339c112b68b40d36a perl-Socket: ref: 20b784e3737e5842c973bd31f1735b67e77b050f perl-Perl-OSType: ref: 7191911473475122ff950ed36748133d8b2f968b perl-ExtUtils-ParseXS: ref: c84346769c6a5009890661786a061af1e06d32dd perl-Test-Deep: ref: 625b3e04a145219386254fde3ee2b5b3cc314567 perl-IPC-Run: ref: 1de5fa3ae2b8d01f5e7d8f41c55dd81989176b0b perl-Import-Into: ref: 6abf828544edc542b88bf9f8c27886e0c4db3ab7 perl-ExtUtils-Install: ref: 5eb9021663b033a695802e5d960795c1b338f1d1 perl-BSD-Resource: ref: 73ae1d113bdb6c8ada065344912685ca438cc987 perl-autodie: ref: 08926569224919ffa066397ca80c5b1818a89e90 perl-Locale-Maketext: ref: 6dd172c644c44c07b1613b0870a119ee5e6d4116 perl-Test-Warnings: ref: 1fb68d7818c1340f1b3d83e40bdf8556252d6e8a perl-Module-Runtime: ref: 47cdddc1405a658f52bd3e49321fccb776bbdfd0 perl-Data-OptList: ref: 55696a188230a0b16e32bc0cc6183cc0683753e3 perl-LWP-MediaTypes: ref: 5b66591ed99089c03052cd17d43fe48947e79fd1 perl-CPAN-Meta-YAML: ref: 04a0e2e11487241ed251223755f1abe43bbe392a perl-Math-BigInt-FastCalc: ref: fd294a4d494055cd4f3f7e22f0f0c361162dedfa perl-File-Temp: ref: ac22a248d28a1f81c99b73a7a6eaa5773f98c419 perl-JSON-PP: ref: 02d427bafed752ddfd755e1cfcd71c4daaa7b336 perl-Test-Simple: ref: 96c4c3b6c0172748a9a9c95fb2c1fefc9f73ee04 perl-File-Find-Object: ref: 0a1402388468fdd180b1b0875a6d9949cca924cc perl-Capture-Tiny: ref: 243ed7f00a6dea11dbdcb564f698573288e3e967 perl-HTTP-Message: ref: 363ac19afb23d8e519db09bad96ed8e19f93e45a perl-Pod-Coverage-TrustPod: ref: 7b67d6d5912228964a685e53a9076b568cbcfa2a perl-inc-latest: ref: b94b9e6f144d6ce856e827a2cb9c16c42cce56b5 perl-Module-Build: ref: a9f6bbfbfc8303db7b57cbea35e53de61a46a165 perl-Module-Load-Conditional: ref: 532fb21fdf6ff39b29abaccbdc4a1f87941521f2 perl-Filter: ref: 78296ad909c75c445e4c43526e3ae57f25de7c34 perl-Pod-Checker: ref: dd7b179ffb95412b1f28d3b825d87132f391821e perl-Sort-Versions: ref: fdc05a617f83b5f46838821619843d5fbf563ab2 perl-Thread-Queue: ref: 388cd4478b7d3e8ef552292fa77937aee27e9c0e perl-IO-Compress: ref: bb10d2103bf534e10a4a1d1bc987a4314cb5de48 perl-Math-BigInt: ref: 76c86fadeda569a2ebd6439f12e7f69f74c8df67 perl-File-Find-Rule: ref: 008055e020aa78373cb53e2925821fed986d32be perl-Text-Template: ref: c3ff74620de07ec5a20b398981cfe60bc23b7533 perl-Test-Exception: ref: 3fe9c62023b87199f3d296242d6656cdbcbada6d perl-Unicode-Normalize: ref: c7a4b3f134e101eb452b949eeda6497d6ea9e520 perl-HTML-Tagset: ref: 7cfcf4bcca6272bfa3d1bac71703acd696d78f1b perl-URI: ref: 8696c54987665ac968cb66d98b69e49a37a89b52 perl-Test-Version: ref: 1032b0ab580387f8781aec3d73408514cda3460c perl-Text-Glob: ref: b19ed6fe9d0ff70870939d2bfe33e2bd059b732a perl-Pod-Simple: ref: 05a654f26321267554e75398eb19f704b4b97e17 perl-Algorithm-Diff: ref: b572ed3bbdd7421c4ec31da90602f12f7a8c951c perl-Class-XSAccessor: ref: 4deb91539b2ec953c6535fb3baceda3b15a60b76 perl-Digest: ref: b3f866352aea430935df7f2f0afaaf3cced7d214 perl-Test-FailWarnings: ref: 1183728f2daf4a869e335bb0f79d63ff0adc7163 perl-Tie-IxHash: ref: 483692cdeeffae0e302d06287044cc6dd356230d perl-ExtUtils-MakeMaker: ref: c88d4cf08d3e3ddc8c113a430d287a830c1133e6 perl-Compress-Raw-Zlib: ref: c9d37e07af93fe0a5e4886536b27f016260074ca perl-Devel-StackTrace: ref: 953656c854cc43a45ef690a55978a62464019803 perl-ExtUtils-Manifest: ref: f1169d7bb27bfb1b2db567be1f0ff112a9069246 perl-Pod-Parser: ref: 13b1e60337a84241ed263e3a62af46005bec3b8c perl-Exporter: ref: 68f93042fb090750ccc7022bd957fa12ff184ecb perl-MIME-Base64: ref: c099afc6b1d7eec124f46bea88b86a2edd0f7b56 perl-version: ref: ef428f4f5c736e1c3af8343191aad3fd8f288692 perl-experimental: ref: f6265c90e007af2ae3882852d66e41c4f0294530 perl-CPAN: ref: c91f221d2bbde2992152786a94b3da8899d7a628 perl-Text-Balanced: ref: 8c14f0f727543b80dc9cacba0422bcc1653d0290 perl-PathTools: ref: a0ed8e15339741624d99094a261ecef2f2bef816 perl-Compress-Bzip2: ref: 4ca6f6001d529639ad9af34f6a4829371ed7c88c perl-Number-Compare: ref: 7dc6d151bfde123a33d29c4c1af0e4abafcccd00 perl-Fedora-VSP: ref: 90425acf3b0601d4feb86e0339f0c0efdd0435ae perl-Test-NoWarnings: ref: 68965e00ff2d48d2a31182cd6ca4032e6e246c98 perl-Locale-Codes: ref: e1436faa7dcf2c0cb70ead02bfbdca7fcbf7b531 perl-Module-CoreList: ref: 3a48c78df9faa9efb5b12f33d1d3c067f4321a8a perl-Scalar-List-Utils: ref: c0ea69a001e7bb2a50a9c122dcc5ce792125f6e4 perl-Digest-SHA: ref: a854293a4d31671e043e58f1efcd3848c05051c5 perl-CPAN-Meta-Check: ref: 08fa92e0015579217acb945950b5513883a7a3e5 perl-Expect: ref: 47e40dd9b1ecfb0a5910e6b041380568b23bb10b perl-TimeDate: ref: 323459d241244ac7f1de7e8a3eda452fdaf91c63 perl-Pod-Coverage: ref: 3155ccedc6d02a815b2a5201be75f6a3a9bd8157 perl-generators: ref: 3517fe526a3f0bb16c097eecd05bfe9dfb94c42e perl-Pod-Perldoc: ref: 97a96bfb531f584eaa7d70f309ca9f24699af42f perl-Sub-Exporter: ref: 34cd68b9ccfbae47690795a40a14a236ff0b2319 perl-Time-HiRes: ref: 400def5c2f8c642b692a22c7a6f45da6f4cbd868 perl-HTTP-Tiny: ref: 0353adf841dad88f6fb3d8770742b3989363c688 perl-Test-Taint: ref: f7e00eace8747a9a77b6594648e55692180f4c42 perl-Text-Tabs+Wrap: ref: 84d9073a2276ee2310cfc7e633c08e271c2f2319 perl-B-Debug: ref: 5a7c0b7619476154ff3129fe449afabb1b450279 perl-File-HomeDir: ref: 253a5f4a3d03187c799904441650124e8ec832ea perl-threads: ref: 96ef6a4161926a852227a37db2a82769df38ebc5 perl-Unicode-Collate: ref: 3a0555a1c080f2bba8e052c32ce35d4c1fca429a perl-Encode-Locale: ref: 4a07f2dc5f13dfe03aceffeae98a4ad6cf55f8f3 perl-Try-Tiny: ref: 844122c4abfa6248b2e8bbbf3124772c62f69525 perl-Text-Diff: ref: 435597b4b8f23cdb4b5d08a83526f3a0ba180ba4 perl-threads-shared: ref: 236010203776860d682ee2e6d37529e8e4aaa90a perl-Math-BigRat: ref: 12a221b50a7d62e76aea4bb924f502d287e86081 perl-HTML-Parser: ref: a4851da917c159c9ec3e2a0e262a33e7b20ec333 perl-Storable: ref: e470bb35a115fbcde8f94559e3bb9dcab0e39c97 perl-Getopt-Long: ref: 3fcd385e78c21d29488f8e020e2b9df21c54900f perl-bignum: ref: e1753ef99cc972644a0a217e676467b8fd5d5788 perl-Net-SSLeay: ref: bb304e2e37562e29cacfe38b2be1aee45553d603 perl-Term-ANSIColor: ref: 7e942843d7f43f5535e55f7709943e210743f4fe perl-IO-Tty: ref: cf1db7dbd0312e7e7f47e5514d8ab31c8bba0af0 perl-Net-IDN-Encode: ref: ab799c23d30edaa81d76e126fd771826fc7a6a3e perl-Carp: ref: 217d519372b989049db02455e4fd53e238bf8675 perl-libnet: ref: 8799d71bc96c9db7a72658edcd27f9f21b260f71 perl-Test-TrailingSpace: ref: 0c7fbdc7c25b65a32036d9e7f8af740d1d033bb8 perl-local-lib: ref: 0716ed7be631222c11ec33672373662daa6b00bf perl-Params-Check: ref: 94989a67e37e22221a55b1d39dfb9f804122f928 perl-File-Find-Rule-Perl: ref: dbda2b929804a36785ee66f4303df70d176ad1b1 perl-Mixin-Linewise: ref: 5d8ee6f3040dde6651a61ffc0882f2dfbf605fe3 perl-Test-Pod-Coverage: ref: f11cb72d99f17be5cb87770bbdd204c78ed750fa perl-Data-Dumper: ref: 8e85cc7e6166838184b034d875759a39df4d10d3 perl-Data-Section: ref: ce79e1d99123d4220543d1eb2d2806673277cad4 perl-Socket6: ref: 97074976ca50b6f7fd7b98a2110e24bb23cbba9b perl-File-Fetch: ref: 7e786fd7e77fd794553f84ff29dc777cd9f73ca2 perl-HTTP-Date: ref: cd8b6842046370b72d530dc9aa714525d41014b3 perl-Software-License: ref: dbee7688f08ab815650fd845122a8ee8cfb0294c perl-IO-Socket-SSL: ref: da2796e619b0650410425d31e1cf3659a3a8fcc5 perl-Archive-Tar: ref: 6baa268adbe88e2afac55a5947342b7d1c2500fa perl-Config-Perl-V: ref: ae30cc26220da556c9fa448172710e4522fa6735 perl-Pod-Usage: ref: 98983d9f8b961510acff3a1190c7ea62d447699f perl-Env: ref: 201efc08b7115ab13b1402f76ed05e5c8ed686d4 perl-Test-Warn: ref: 90bfb89225f8505aba28f74138269a7281b03172 perl-Devel-Size: ref: 59a39ceb2d9141d9fd9733280220395be02e83a6 perl-Test-MockModule: ref: 8b278927b93037a9b2a93a47f68cdcfd4c090ff2 perl-Term-Cap: ref: 1d444a86d772b87c5b0484e3639f7bac52de8afe perl-Sys-Syslog: ref: b83dcfb81b92c0617bee60d8ac89d1d228b88d8e perl-Devel-PPPort: ref: 17c87af74208a53d3202030ad52862fd376123fc perl-CGI: ref: 9e750f4b5aecfaf628c615831fdc30f3d396baaf perl-CPAN-Meta: ref: f8259dccb36b9a47dc6bad88847c3fcd3563a196 perl-File-Find-Object-Rule: ref: 69cfed894fcb5fb7fc1b4b7d5701195285279000 perl-Archive-Zip: ref: 09e89616f0acea510d1e85c69e12b961c28f4bb6 perl-DB_File: ref: 462f0f70ba43c2b21811e8517b5f7c0fe2aa0ca6 perl-PerlIO-utf8_strict: ref: 081963e3f8eb01e77546e781eceb5a68ca88fa34 perl-YAML: ref: bc07cedbcda09b33873e03730b5d869c6f87f217 perl-Sub-Identify: ref: b1765a68a41efd165cda6663fc9c26d2d2f44bbd perl-Filter-Simple: ref: 08e79709ade8905bc3212d2c7dbb1d168d578dba perl-Module-Metadata: ref: 1578659d3194251b91e39887baf3ad56689fad90 perl-Net-LibIDN: ref: b62c33bc0db667bcfa1486b0bd3eaf349b295e6c perl-PerlIO-via-QuotedPrint: ref: 7d17de12fac09e63e1c14ed17229c6d23e923830 perl-constant: ref: bce81fc9c982eeee92490116718ab9ed652eb0e7 perl-Encode: ref: 5417f768a229062a55dde8f25b5b9aac039f96e1 mbs_options: blocked_packages: - perl - perl-Algorithm-Diff - perl-Archive-Tar - perl-Archive-Zip - perl-autodie - perl-B-Debug - perl-bignum - perl-BSD-Resource - perl-Capture-Tiny - perl-Carp - perl-CGI - perl-Class-XSAccessor - perl-Compress-Bzip2 - perl-Compress-Raw-Bzip2 - perl-Compress-Raw-Zlib - perl-Config-Perl-V - perl-constant - perl-CPAN - perl-CPAN-Meta - perl-CPAN-Meta-Check - perl-CPAN-Meta-Requirements - perl-CPAN-Meta-YAML - perl-Data-Dumper - perl-Data-OptList - perl-Data-Section - perl-DB_File - perl-Devel-PPPort - perl-Devel-Size - perl-Devel-StackTrace - perl-Devel-Symdump - perl-Digest - perl-Digest-MD5 - perl-Digest-SHA - perl-Encode - perl-Encode-Locale - perl-Env - perl-Expect - perl-experimental - perl-Exporter - perl-ExtUtils-CBuilder - perl-ExtUtils-Install - perl-ExtUtils-MakeMaker - perl-ExtUtils-Manifest - perl-ExtUtils-ParseXS - perl-Fedora-VSP - perl-File-Fetch - perl-File-Find-Object - perl-File-Find-Object-Rule - perl-File-Find-Rule - perl-File-Find-Rule-Perl - perl-File-HomeDir - perl-File-Path - perl-File-Slurp-Tiny - perl-File-Temp - perl-File-Which - perl-Filter - perl-Filter-Simple - perl-generators - perl-Getopt-Long - perl-HTML-Parser - perl-HTML-Tagset - perl-HTTP-Date - perl-HTTP-Message - perl-HTTP-Tiny - perl-Import-Into - perl-inc-latest - perl-IO-Compress - perl-IO-HTML - perl-IO-Socket-INET6 - perl-IO-Socket-IP - perl-IO-Socket-SSL - perl-IO-String - perl-IO-Tty - perl-IPC-Cmd - perl-IPC-Run - perl-IPC-System-Simple - perl-IPC-SysV - perl-JSON-PP - perl-libnet - perl-local-lib - perl-Locale-Codes - perl-Locale-Maketext - perl-LWP-MediaTypes - perl-Math-BigInt - perl-Math-BigInt-FastCalc - perl-Math-BigRat - perl-MIME-Base64 - perl-Mixin-Linewise - perl-Module-Build - perl-Module-CoreList - perl-Module-Load - perl-Module-Load-Conditional - perl-Module-Metadata - perl-Module-Runtime - perl-MRO-Compat - perl-Net-IDN-Encode - perl-Net-LibIDN - perl-Net-SSLeay - perl-Number-Compare - perl-Package-Generator - perl-Params-Check - perl-Params-Util - perl-parent - perl-PathTools - perl-Perl-OSType - perl-Perl-Version - perl-perlfaq - perl-PerlIO-utf8_strict - perl-PerlIO-via-QuotedPrint - perl-Pod-Checker - perl-Pod-Coverage - perl-Pod-Coverage-TrustPod - perl-Pod-Escapes - perl-Pod-Eventual - perl-Pod-Parser - perl-Pod-Perldoc - perl-Pod-Simple - perl-Pod-Usage - perl-podlators - perl-Scalar-List-Utils - perl-Socket - perl-Socket6 - perl-Software-License - perl-Sort-Versions - perl-Storable - perl-Sub-Exporter - perl-Sub-Identify - perl-Sub-Install - perl-Sub-Uplevel - perl-SUPER - perl-Sys-Syslog - perl-Term-ANSIColor - perl-Term-Cap - perl-Test-CPAN-Meta - perl-Test-Deep - perl-Test-Exception - perl-Test-FailWarnings - perl-Test-Harness - perl-Test-MockModule - perl-Test-Needs - perl-Test-NoWarnings - perl-Test-Output - perl-Test-Pod - perl-Test-Pod-Coverage - perl-Test-Simple - perl-Test-Taint - perl-Test-TrailingSpace - perl-Test-Version - perl-Test-Warn - perl-Test-Warnings - perl-Text-Balanced - perl-Text-Diff - perl-Text-Glob - perl-Text-ParseWords - perl-Text-Tabs+Wrap - perl-Text-Template - perl-Thread-Queue - perl-threads - perl-threads-shared - perl-Tie-IxHash - perl-Time-HiRes - perl-Time-Local - perl-TimeDate - perl-Try-Tiny - perl-Unicode-Collate - perl-Unicode-Normalize - perl-URI - perl-version - perl-YAML dependencies: - buildrequires: platform: [f29] requires: platform: [f29] references: community: https://fedoraproject.org/wiki/Modularity documentation: https://fedoraproject.org/wiki/Fedora_Packaging_Guidelines_for_Modules buildopts: rpms: macros: | %perl_bootstrap 1 %_with_perl_enables_groff 1 %_without_perl_enables_syslog_test 1 %_with_perl_enables_systemtap 1 %_without_perl_enables_tcsh 1 %_without_perl_Compress_Bzip2_enables_optional_test 1 %_without_perl_CPAN_Meta_Requirements_enables_optional_test 1 %_without_perl_IPC_System_Simple_enables_optional_test 1 %_without_perl_LWP_MediaTypes_enables_mailcap 1 %_without_perl_Module_Build_enables_optional_test 1 %_without_perl_Perl_OSType_enables_optional_test 1 %_without_perl_Pod_Perldoc_enables_tk_test 1 %_without_perl_Software_License_enables_optional_test 1 %_without_perl_Sys_Syslog_enables_optional_test 1 %_without_perl_Test_Harness_enables_optional_test 1 %_without_perl_Test_Simple_enables_optional_test 1 %_without_perl_Test_Warnings_enables_optional_test 1 %_without_perl_URI_enables_Business_ISBN 1 components: rpms: perl: rationale: The Perl interpreter. repository: git://pkgs.fedoraproject.org/rpms/perl cache: http://pkgs.fedoraproject.org/repo/pkgs/perl ref: f28 perl-Algorithm-Diff: rationale: build dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-Algorithm-Diff cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-Algorithm-Diff ref: f28 buildorder: 3 perl-Archive-Tar: rationale: build dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-Archive-Tar cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-Archive-Tar ref: f28 buildorder: 3 perl-Archive-Zip: rationale: build dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-Archive-Zip cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-Archive-Zip ref: f28 buildorder: 7 perl-B-Debug: rationale: build dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-B-Debug cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-B-Debug ref: f28 buildorder: 3 perl-BSD-Resource: rationale: build dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-BSD-Resource cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-BSD-Resource ref: f28 buildorder: 6 perl-CGI: rationale: build dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-CGI cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-CGI ref: f28 buildorder: 12 perl-CPAN: rationale: build dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-CPAN cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-CPAN ref: f28 buildorder: 3 perl-CPAN-Meta: rationale: build dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-CPAN-Meta cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-CPAN-Meta ref: f28 buildorder: 3 perl-CPAN-Meta-Check: rationale: build dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-CPAN-Meta-Check cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-CPAN-Meta-Check ref: f28 buildorder: 9 perl-CPAN-Meta-Requirements: rationale: build dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-CPAN-Meta-Requirements cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-CPAN-Meta-Requirements ref: f28 buildorder: 3 perl-CPAN-Meta-YAML: rationale: build dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-CPAN-Meta-YAML cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-CPAN-Meta-YAML ref: f28 buildorder: 3 perl-Capture-Tiny: rationale: build dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-Capture-Tiny cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-Capture-Tiny ref: f28 buildorder: 3 perl-Carp: rationale: build dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-Carp cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-Carp ref: f28 buildorder: 3 perl-Class-XSAccessor: rationale: build dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-Class-XSAccessor cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-Class-XSAccessor ref: f28 buildorder: 3 perl-Compress-Bzip2: rationale: build dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-Compress-Bzip2 cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-Compress-Bzip2 ref: f28 buildorder: 3 perl-Compress-Raw-Bzip2: rationale: build dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-Compress-Raw-Bzip2 cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-Compress-Raw-Bzip2 ref: f28 buildorder: 3 perl-Compress-Raw-Zlib: rationale: build dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-Compress-Raw-Zlib cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-Compress-Raw-Zlib ref: f28 buildorder: 3 perl-Config-Perl-V: rationale: build dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-Config-Perl-V cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-Config-Perl-V ref: f28 buildorder: 3 perl-DB_File: rationale: build dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-DB_File cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-DB_File ref: f28 buildorder: 3 perl-Data-Dumper: rationale: build dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-Data-Dumper cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-Data-Dumper ref: f28 buildorder: 3 perl-Data-OptList: rationale: build dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-Data-OptList cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-Data-OptList ref: f28 buildorder: 4 perl-Data-Section: rationale: build dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-Data-Section cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-Data-Section ref: f28 buildorder: 6 perl-Devel-PPPort: rationale: build dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-Devel-PPPort cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-Devel-PPPort ref: f28 buildorder: 3 perl-Devel-Size: rationale: build dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-Devel-Size cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-Devel-Size ref: f28 buildorder: 6 perl-Devel-StackTrace: rationale: build dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-Devel-StackTrace cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-Devel-StackTrace ref: f28 buildorder: 3 perl-Devel-Symdump: rationale: build dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-Devel-Symdump cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-Devel-Symdump ref: f28 buildorder: 3 perl-Digest: rationale: build dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-Digest cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-Digest ref: f28 buildorder: 3 perl-Digest-MD5: rationale: build dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-Digest-MD5 cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-Digest-MD5 ref: f28 buildorder: 3 perl-Digest-SHA: rationale: build dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-Digest-SHA cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-Digest-SHA ref: f28 buildorder: 3 perl-Encode: rationale: build dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-Encode cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-Encode ref: f28 buildorder: 3 perl-Encode-Locale: rationale: build dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-Encode-Locale cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-Encode-Locale ref: f28 buildorder: 3 perl-Env: rationale: build dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-Env cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-Env ref: f28 buildorder: 3 perl-Expect: rationale: build dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-Expect cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-Expect ref: f28 buildorder: 4 perl-Exporter: rationale: build dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-Exporter cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-Exporter ref: f28 buildorder: 3 perl-ExtUtils-CBuilder: rationale: build dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-ExtUtils-CBuilder cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-ExtUtils-CBuilder ref: f28 buildorder: 3 perl-ExtUtils-Install: rationale: build dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-ExtUtils-Install cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-ExtUtils-Install ref: f28 buildorder: 3 perl-ExtUtils-MakeMaker: rationale: build dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-ExtUtils-MakeMaker cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-ExtUtils-MakeMaker ref: f28 buildorder: 3 perl-ExtUtils-Manifest: rationale: build dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-ExtUtils-Manifest cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-ExtUtils-Manifest ref: f28 buildorder: 3 perl-ExtUtils-ParseXS: rationale: build dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-ExtUtils-ParseXS cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-ExtUtils-ParseXS ref: f28 buildorder: 3 perl-Fedora-VSP: rationale: RPM dependency generator. repository: git://pkgs.fedoraproject.org/rpms/perl-Fedora-VSP cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-Fedora-VSP ref: f28 buildorder: 1 perl-File-Fetch: rationale: build dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-File-Fetch cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-File-Fetch ref: f28 buildorder: 3 perl-File-Find-Object: rationale: build dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-File-Find-Object cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-File-Find-Object ref: f28 buildorder: 4 perl-File-Find-Object-Rule: rationale: build dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-File-Find-Object-Rule cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-File-Find-Object-Rule ref: f28 buildorder: 5 perl-File-Find-Rule: rationale: build dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-File-Find-Rule cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-File-Find-Rule ref: f28 buildorder: 4 perl-File-Find-Rule-Perl: rationale: build dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-File-Find-Rule-Perl cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-File-Find-Rule-Perl ref: f28 buildorder: 5 perl-File-HomeDir: rationale: build dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-File-HomeDir cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-File-HomeDir ref: f28 buildorder: 4 perl-File-Path: rationale: build dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-File-Path cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-File-Path ref: f28 buildorder: 3 perl-File-Slurp-Tiny: rationale: build dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-File-Slurp-Tiny cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-File-Slurp-Tiny ref: f28 buildorder: 3 perl-File-Temp: rationale: build dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-File-Temp cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-File-Temp ref: f28 buildorder: 3 perl-File-Which: rationale: build dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-File-Which cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-File-Which ref: f28 buildorder: 3 perl-Filter: rationale: build dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-Filter cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-Filter ref: f28 buildorder: 3 perl-Filter-Simple: rationale: build dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-Filter-Simple cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-Filter-Simple ref: f28 buildorder: 3 perl-Getopt-Long: rationale: build dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-Getopt-Long cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-Getopt-Long ref: f28 buildorder: 3 perl-HTML-Parser: rationale: build dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-HTML-Parser cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-HTML-Parser ref: f28 buildorder: 5 perl-HTML-Tagset: rationale: build dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-HTML-Tagset cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-HTML-Tagset ref: f28 buildorder: 3 perl-HTTP-Date: rationale: build dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-HTTP-Date cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-HTTP-Date ref: f28 buildorder: 3 perl-HTTP-Message: rationale: build dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-HTTP-Message cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-HTTP-Message ref: f28 buildorder: 11 perl-HTTP-Tiny: rationale: build dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-HTTP-Tiny cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-HTTP-Tiny ref: f28 buildorder: 3 perl-IO-Compress: rationale: build dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-IO-Compress cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-IO-Compress ref: f28 buildorder: 4 perl-IO-HTML: rationale: build dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-IO-HTML cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-IO-HTML ref: f28 buildorder: 3 perl-IO-Socket-INET6: rationale: build dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-IO-Socket-INET6 cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-IO-Socket-INET6 ref: f28 buildorder: 7 perl-IO-Socket-IP: rationale: build dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-IO-Socket-IP cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-IO-Socket-IP ref: f28 buildorder: 3 perl-IO-Socket-SSL: rationale: build dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-IO-Socket-SSL cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-IO-Socket-SSL ref: f28 buildorder: 8 perl-IO-String: rationale: build dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-IO-String cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-IO-String ref: f28 buildorder: 3 perl-IO-Tty: rationale: build dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-IO-Tty cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-IO-Tty ref: f28 buildorder: 3 perl-IPC-Cmd: rationale: build dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-IPC-Cmd cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-IPC-Cmd ref: f28 buildorder: 3 perl-IPC-Run: rationale: build dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-IPC-Run cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-IPC-Run ref: f28 buildorder: 4 perl-IPC-SysV: rationale: build dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-IPC-SysV cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-IPC-SysV ref: f28 buildorder: 3 perl-IPC-System-Simple: rationale: build dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-IPC-System-Simple cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-IPC-System-Simple ref: f28 buildorder: 3 perl-Import-Into: rationale: build dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-Import-Into cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-Import-Into ref: f28 buildorder: 7 perl-JSON-PP: rationale: build dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-JSON-PP cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-JSON-PP ref: f28 buildorder: 3 perl-LWP-MediaTypes: rationale: build dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-LWP-MediaTypes cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-LWP-MediaTypes ref: f28 buildorder: 3 perl-Locale-Codes: rationale: build dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-Locale-Codes cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-Locale-Codes ref: f28 buildorder: 3 perl-Locale-Maketext: rationale: build dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-Locale-Maketext cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-Locale-Maketext ref: f28 buildorder: 3 perl-MIME-Base64: rationale: build dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-MIME-Base64 cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-MIME-Base64 ref: f28 buildorder: 3 perl-MRO-Compat: rationale: build dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-MRO-Compat cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-MRO-Compat ref: f28 buildorder: 3 perl-Math-BigInt: rationale: build dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-Math-BigInt cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-Math-BigInt ref: f28 buildorder: 3 perl-Math-BigInt-FastCalc: rationale: build dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-Math-BigInt-FastCalc cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-Math-BigInt-FastCalc ref: f28 buildorder: 4 perl-Math-BigRat: rationale: build dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-Math-BigRat cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-Math-BigRat ref: f28 buildorder: 3 perl-Mixin-Linewise: rationale: build dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-Mixin-Linewise cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-Mixin-Linewise ref: f28 buildorder: 6 perl-Module-Build: rationale: build dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-Module-Build cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-Module-Build ref: f28 buildorder: 4 perl-Module-CoreList: rationale: build dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-Module-CoreList cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-Module-CoreList ref: f28 buildorder: 3 perl-Module-Load: rationale: build dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-Module-Load cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-Module-Load ref: f28 buildorder: 3 perl-Module-Load-Conditional: rationale: build dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-Module-Load-Conditional cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-Module-Load-Conditional ref: f28 buildorder: 3 perl-Module-Metadata: rationale: build dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-Module-Metadata cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-Module-Metadata ref: f28 buildorder: 3 perl-Module-Runtime: rationale: build dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-Module-Runtime cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-Module-Runtime ref: f28 buildorder: 6 perl-Net-IDN-Encode: rationale: build dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-Net-IDN-Encode cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-Net-IDN-Encode ref: f28 buildorder: 5 perl-Net-LibIDN: rationale: build dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-Net-LibIDN cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-Net-LibIDN ref: f28 buildorder: 3 perl-Net-SSLeay: rationale: build dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-Net-SSLeay cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-Net-SSLeay ref: f28 buildorder: 5 perl-Number-Compare: rationale: build dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-Number-Compare cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-Number-Compare ref: f28 buildorder: 3 perl-Package-Generator: rationale: build dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-Package-Generator cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-Package-Generator ref: f28 buildorder: 4 perl-Params-Check: rationale: build dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-Params-Check cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-Params-Check ref: f28 buildorder: 3 perl-Params-Util: rationale: build dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-Params-Util cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-Params-Util ref: f28 buildorder: 3 perl-PathTools: rationale: build dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-PathTools cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-PathTools ref: f28 buildorder: 3 perl-Perl-OSType: rationale: build dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-Perl-OSType cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-Perl-OSType ref: f28 buildorder: 3 perl-Perl-Version: rationale: build dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-Perl-Version cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-Perl-Version ref: f28 buildorder: 6 perl-PerlIO-utf8_strict: rationale: build dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-PerlIO-utf8_strict cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-PerlIO-utf8_strict ref: f28 buildorder: 5 perl-PerlIO-via-QuotedPrint: rationale: build dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-PerlIO-via-QuotedPrint cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-PerlIO-via-QuotedPrint ref: f28 buildorder: 3 perl-Pod-Checker: rationale: build dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-Pod-Checker cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-Pod-Checker ref: f28 buildorder: 3 perl-Pod-Coverage: rationale: build dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-Pod-Coverage cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-Pod-Coverage ref: f28 buildorder: 4 perl-Pod-Coverage-TrustPod: rationale: build dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-Pod-Coverage-TrustPod cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-Pod-Coverage-TrustPod ref: f28 buildorder: 8 perl-Pod-Escapes: rationale: build dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-Pod-Escapes cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-Pod-Escapes ref: f28 buildorder: 3 perl-Pod-Eventual: rationale: build dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-Pod-Eventual cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-Pod-Eventual ref: f28 buildorder: 7 perl-Pod-Parser: rationale: build dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-Pod-Parser cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-Pod-Parser ref: f28 buildorder: 3 perl-Pod-Perldoc: rationale: build dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-Pod-Perldoc cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-Pod-Perldoc ref: f28 buildorder: 3 perl-Pod-Simple: rationale: build dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-Pod-Simple cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-Pod-Simple ref: f28 buildorder: 3 perl-Pod-Usage: rationale: build dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-Pod-Usage cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-Pod-Usage ref: f28 buildorder: 3 perl-SUPER: rationale: build dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-SUPER cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-SUPER ref: f28 buildorder: 5 perl-Scalar-List-Utils: rationale: build dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-Scalar-List-Utils cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-Scalar-List-Utils ref: f28 buildorder: 3 perl-Socket: rationale: build dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-Socket cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-Socket ref: f28 buildorder: 3 perl-Socket6: rationale: build dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-Socket6 cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-Socket6 ref: f28 buildorder: 3 perl-Software-License: rationale: build dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-Software-License cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-Software-License ref: f28 buildorder: 11 perl-Sort-Versions: rationale: build dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-Sort-Versions cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-Sort-Versions ref: f28 buildorder: 3 perl-Storable: rationale: build dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-Storable cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-Storable ref: f28 buildorder: 3 perl-Sub-Exporter: rationale: build dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-Sub-Exporter cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-Sub-Exporter ref: f28 buildorder: 5 perl-Sub-Identify: rationale: build dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-Sub-Identify cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-Sub-Identify ref: f28 buildorder: 4 perl-Sub-Install: rationale: build dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-Sub-Install cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-Sub-Install ref: f28 buildorder: 3 perl-Sub-Uplevel: rationale: build dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-Sub-Uplevel cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-Sub-Uplevel ref: f28 buildorder: 3 perl-Sys-Syslog: rationale: build dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-Sys-Syslog cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-Sys-Syslog ref: f28 buildorder: 3 perl-Term-ANSIColor: rationale: build dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-Term-ANSIColor cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-Term-ANSIColor ref: f28 buildorder: 3 perl-Term-Cap: rationale: build dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-Term-Cap cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-Term-Cap ref: f28 buildorder: 3 perl-Test-CPAN-Meta: rationale: build dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-Test-CPAN-Meta cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-Test-CPAN-Meta ref: f28 buildorder: 6 perl-Test-Deep: rationale: build dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-Test-Deep cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-Test-Deep ref: f28 buildorder: 3 perl-Test-Exception: rationale: build dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-Test-Exception cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-Test-Exception ref: f28 buildorder: 4 perl-Test-FailWarnings: rationale: build dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-Test-FailWarnings cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-Test-FailWarnings ref: f28 buildorder: 4 perl-Test-Harness: rationale: build dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-Test-Harness cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-Test-Harness ref: f28 buildorder: 3 perl-Test-MockModule: rationale: build dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-Test-MockModule cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-Test-MockModule ref: f28 buildorder: 6 perl-Test-Needs: rationale: build dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-Test-Needs cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-Test-Needs ref: f28 buildorder: 3 perl-Test-NoWarnings: rationale: build dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-Test-NoWarnings cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-Test-NoWarnings ref: f28 buildorder: 4 perl-Test-Output: rationale: build dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-Test-Output cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-Test-Output ref: f28 buildorder: 6 perl-Test-Pod: rationale: build dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-Test-Pod cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-Test-Pod ref: f28 buildorder: 3 perl-Test-Pod-Coverage: rationale: build dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-Test-Pod-Coverage cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-Test-Pod-Coverage ref: f28 buildorder: 5 perl-Test-Simple: rationale: build dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-Test-Simple cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-Test-Simple ref: f28 buildorder: 3 perl-Test-Taint: rationale: build dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-Test-Taint cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-Test-Taint ref: f28 buildorder: 6 perl-Test-TrailingSpace: rationale: build dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-Test-TrailingSpace cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-Test-TrailingSpace ref: f28 buildorder: 6 perl-Test-Version: rationale: build dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-Test-Version cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-Test-Version ref: f28 buildorder: 6 perl-Test-Warn: rationale: build dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-Test-Warn cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-Test-Warn ref: f28 buildorder: 4 perl-Test-Warnings: rationale: build dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-Test-Warnings cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-Test-Warnings ref: f28 buildorder: 3 perl-Text-Balanced: rationale: build dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-Text-Balanced cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-Text-Balanced ref: f28 buildorder: 3 perl-Text-Diff: rationale: build dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-Text-Diff cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-Text-Diff ref: f28 buildorder: 4 perl-Text-Glob: rationale: build dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-Text-Glob cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-Text-Glob ref: f28 buildorder: 3 perl-Text-ParseWords: rationale: build dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-Text-ParseWords cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-Text-ParseWords ref: f28 buildorder: 3 perl-Text-Tabs+Wrap: rationale: build dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-Text-Tabs+Wrap cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-Text-Tabs+Wrap ref: f28 buildorder: 3 perl-Text-Template: rationale: build dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-Text-Template cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-Text-Template ref: f28 buildorder: 4 perl-Thread-Queue: rationale: build dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-Thread-Queue cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-Thread-Queue ref: f28 buildorder: 3 perl-Tie-IxHash: rationale: build dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-Tie-IxHash cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-Tie-IxHash ref: f28 buildorder: 3 perl-Time-HiRes: rationale: build dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-Time-HiRes cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-Time-HiRes ref: f28 buildorder: 3 perl-Time-Local: rationale: build dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-Time-Local cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-Time-Local ref: f28 buildorder: 3 perl-TimeDate: rationale: build dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-TimeDate cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-TimeDate ref: f28 buildorder: 3 perl-Try-Tiny: rationale: build dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-Try-Tiny cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-Try-Tiny ref: f28 buildorder: 10 perl-URI: rationale: build dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-URI cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-URI ref: f28 buildorder: 4 perl-Unicode-Collate: rationale: build dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-Unicode-Collate cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-Unicode-Collate ref: f28 buildorder: 3 perl-Unicode-Normalize: rationale: build dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-Unicode-Normalize cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-Unicode-Normalize ref: f28 buildorder: 3 perl-YAML: rationale: build dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-YAML cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-YAML ref: f28 buildorder: 3 perl-autodie: rationale: build dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-autodie cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-autodie ref: f28 buildorder: 3 perl-bignum: rationale: build dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-bignum cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-bignum ref: f28 buildorder: 3 perl-constant: rationale: build dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-constant cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-constant ref: f28 buildorder: 3 perl-experimental: rationale: build dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-experimental cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-experimental ref: f28 buildorder: 3 perl-generators: rationale: RPM dependency generator. repository: git://pkgs.fedoraproject.org/rpms/perl-generators cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-generators ref: f28 buildorder: 2 perl-inc-latest: rationale: build dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-inc-latest cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-inc-latest ref: f28 buildorder: 3 perl-libnet: rationale: build dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-libnet cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-libnet ref: f28 buildorder: 3 perl-local-lib: rationale: build dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-local-lib cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-local-lib ref: f28 buildorder: 5 perl-parent: rationale: build dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-parent cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-parent ref: f28 buildorder: 3 perl-perlfaq: rationale: build dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-perlfaq cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-perlfaq ref: f28 buildorder: 3 perl-podlators: rationale: build dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-podlators cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-podlators ref: f28 buildorder: 3 perl-threads: rationale: build dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-threads cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-threads ref: f28 buildorder: 3 perl-threads-shared: rationale: build dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-threads-shared cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-threads-shared ref: f28 buildorder: 3 perl-version: rationale: build dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-version cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-version ref: f28 buildorder: 3 artifacts: rpms: - perl-4:5.26.2-413.module_2073+eebc5b71.x86_64 - perl-Algorithm-Diff-0:1.1903-9.module_1675+7c48d950.noarch - perl-Archive-Tar-0:2.24-413.module_2073+eebc5b71.noarch - perl-Archive-Tar-0:2.28-1.module_2073+eebc5b71.noarch - perl-Archive-Zip-0:1.60-3.module_2073+eebc5b71.noarch - perl-Attribute-Handlers-0:0.99-413.module_2073+eebc5b71.noarch - perl-B-Debug-0:1.24-413.module_2073+eebc5b71.noarch - perl-B-Debug-0:1.26-2.module_1675+7c48d950.noarch - perl-BSD-Resource-0:1.291.100-5.module_1675+7c48d950.x86_64 - perl-CGI-0:4.38-2.module_1675+7c48d950.noarch - perl-CPAN-0:2.18-397.module_1675+7c48d950.noarch - perl-CPAN-0:2.18-413.module_2073+eebc5b71.noarch - perl-CPAN-Meta-0:2.150010-396.module_1675+7c48d950.noarch - perl-CPAN-Meta-0:2.150010-413.module_2073+eebc5b71.noarch - perl-CPAN-Meta-Check-0:0.014-5.module_1675+7c48d950.noarch - perl-CPAN-Meta-Requirements-0:2.140-396.module_1675+7c48d950.noarch - perl-CPAN-Meta-Requirements-0:2.140-413.module_2073+eebc5b71.noarch - perl-CPAN-Meta-YAML-0:0.018-397.module_1675+7c48d950.noarch - perl-CPAN-Meta-YAML-0:0.018-413.module_2073+eebc5b71.noarch - perl-Capture-Tiny-0:0.46-4.module_1675+7c48d950.noarch - perl-Carp-0:1.42-396.module_2073+eebc5b71.noarch - perl-Carp-0:1.42-413.module_2073+eebc5b71.noarch - perl-Class-XSAccessor-0:1.19-14.module_1675+7c48d950.x86_64 - perl-Compress-Bzip2-0:2.26-6.module_1675+7c48d950.x86_64 - perl-Compress-Raw-Bzip2-0:2.074-413.module_2073+eebc5b71.x86_64 - perl-Compress-Raw-Bzip2-0:2.081-1.module_1675+7c48d950.x86_64 - perl-Compress-Raw-Zlib-0:2.074-413.module_2073+eebc5b71.x86_64 - perl-Compress-Raw-Zlib-0:2.081-1.module_1675+7c48d950.x86_64 - perl-Config-Perl-V-0:0.28-413.module_2073+eebc5b71.noarch - perl-Config-Perl-V-0:0.30-1.module_2073+eebc5b71.noarch - perl-DB_File-0:1.840-413.module_2073+eebc5b71.x86_64 - perl-DB_File-0:1.842-1.module_2073+eebc5b71.x86_64 - perl-Data-Dumper-0:2.167-399.module_1675+7c48d950.x86_64 - perl-Data-Dumper-0:2.167-413.module_2073+eebc5b71.x86_64 - perl-Data-OptList-0:0.110-6.module_1675+7c48d950.noarch - perl-Data-Section-0:0.200007-3.module_1675+7c48d950.noarch - perl-Devel-PPPort-0:3.35-413.module_2073+eebc5b71.x86_64 - perl-Devel-PPPort-0:3.36-5.module_1675+7c48d950.x86_64 - perl-Devel-Peek-0:1.26-413.module_2073+eebc5b71.x86_64 - perl-Devel-SelfStubber-0:1.06-413.module_2073+eebc5b71.noarch - perl-Devel-Size-0:0.82-1.module_2073+eebc5b71.x86_64 - perl-Devel-StackTrace-1:2.03-2.module_1675+7c48d950.noarch - perl-Devel-Symdump-1:2.18-5.module_1675+7c48d950.noarch - perl-Digest-0:1.17-395.module_1675+7c48d950.noarch - perl-Digest-0:1.17-413.module_2073+eebc5b71.noarch - perl-Digest-MD5-0:2.55-396.module_1675+7c48d950.x86_64 - perl-Digest-MD5-0:2.55-413.module_2073+eebc5b71.x86_64 - perl-Digest-SHA-1:5.96-413.module_2073+eebc5b71.x86_64 - perl-Digest-SHA-1:6.02-1.module_2073+eebc5b71.x86_64 - perl-Encode-4:2.88-413.module_2073+eebc5b71.x86_64 - perl-Encode-4:2.97-3.module_1675+7c48d950.x86_64 - perl-Encode-Locale-0:1.05-9.module_1675+7c48d950.noarch - perl-Encode-devel-4:2.88-413.module_2073+eebc5b71.noarch - perl-Encode-devel-4:2.97-3.module_1675+7c48d950.x86_64 - perl-Env-0:1.04-395.module_1675+7c48d950.noarch - perl-Env-0:1.04-413.module_2073+eebc5b71.noarch - perl-Errno-0:1.28-413.module_2073+eebc5b71.x86_64 - perl-Expect-0:1.35-4.module_1675+7c48d950.noarch - perl-Exporter-0:5.72-396.module_1675+7c48d950.noarch - perl-Exporter-0:5.72-413.module_2073+eebc5b71.noarch - perl-ExtUtils-CBuilder-1:0.280225-413.module_2073+eebc5b71.noarch - perl-ExtUtils-CBuilder-1:0.280230-2.module_1675+7c48d950.noarch - perl-ExtUtils-Command-1:7.24-413.module_2073+eebc5b71.noarch - perl-ExtUtils-Command-1:7.34-1.module_1675+7c48d950.noarch - perl-ExtUtils-Embed-0:1.34-413.module_2073+eebc5b71.noarch - perl-ExtUtils-Install-0:2.04-413.module_2073+eebc5b71.noarch - perl-ExtUtils-Install-0:2.14-4.module_1675+7c48d950.noarch - perl-ExtUtils-MM-Utils-1:7.24-413.module_2073+eebc5b71.noarch - perl-ExtUtils-MM-Utils-1:7.34-1.module_1675+7c48d950.noarch - perl-ExtUtils-MakeMaker-1:7.24-413.module_2073+eebc5b71.noarch - perl-ExtUtils-MakeMaker-1:7.34-1.module_1675+7c48d950.noarch - perl-ExtUtils-Manifest-0:1.70-395.module_1675+7c48d950.noarch - perl-ExtUtils-Manifest-0:1.70-413.module_2073+eebc5b71.noarch - perl-ExtUtils-Miniperl-0:1.06-413.module_2073+eebc5b71.noarch - perl-ExtUtils-ParseXS-1:3.34-413.module_2073+eebc5b71.noarch - perl-ExtUtils-ParseXS-1:3.35-2.module_1675+7c48d950.noarch - perl-Fedora-VSP-0:0.001-9.module_1675+7c48d950.noarch - perl-File-Fetch-0:0.52-413.module_2073+eebc5b71.noarch - perl-File-Fetch-0:0.56-2.module_1675+7c48d950.noarch - perl-File-Find-Object-0:0.3.2-5.module_1675+7c48d950.noarch - perl-File-Find-Object-Rule-0:0.0306-6.module_1675+7c48d950.noarch - perl-File-Find-Rule-0:0.34-8.module_1675+7c48d950.noarch - perl-File-Find-Rule-Perl-0:1.15-10.module_1675+7c48d950.noarch - perl-File-HomeDir-0:1.002-4.module_1675+7c48d950.noarch - perl-File-Path-0:2.12-413.module_2073+eebc5b71.noarch - perl-File-Path-0:2.15-2.module_1675+7c48d950.noarch - perl-File-Slurp-Tiny-0:0.004-7.module_1675+7c48d950.noarch - perl-File-Temp-0:0.230.400-413.module_2073+eebc5b71.noarch - perl-File-Temp-0:0.230.600-1.module_2073+eebc5b71.noarch - perl-File-Which-0:1.22-2.module_1675+7c48d950.noarch - perl-Filter-2:1.55-413.module_2073+eebc5b71.x86_64 - perl-Filter-2:1.58-2.module_1675+7c48d950.x86_64 - perl-Filter-Simple-0:0.93-413.module_2073+eebc5b71.noarch - perl-Filter-Simple-0:0.94-2.module_1675+7c48d950.noarch - perl-Getopt-Long-1:2.49-413.module_2073+eebc5b71.noarch - perl-Getopt-Long-1:2.50-4.module_1675+7c48d950.noarch - perl-HTML-Parser-0:3.72-11.module_1675+7c48d950.x86_64 - perl-HTML-Parser-tests-0:3.72-11.module_1675+7c48d950.x86_64 - perl-HTML-Tagset-0:3.20-33.module_1675+7c48d950.noarch - perl-HTTP-Date-0:6.02-18.module_1675+7c48d950.noarch - perl-HTTP-Message-0:6.18-1.module_2073+eebc5b71.noarch - perl-HTTP-Tiny-0:0.070-413.module_2073+eebc5b71.noarch - perl-HTTP-Tiny-0:0.076-1.module_2073+eebc5b71.noarch - perl-IO-0:1.38-413.module_2073+eebc5b71.x86_64 - perl-IO-Compress-0:2.074-413.module_2073+eebc5b71.noarch - perl-IO-Compress-0:2.081-1.module_1675+7c48d950.noarch - perl-IO-HTML-0:1.001-10.module_1675+7c48d950.noarch - perl-IO-Socket-INET6-0:2.72-12.module_1675+7c48d950.noarch - perl-IO-Socket-IP-0:0.38-413.module_2073+eebc5b71.noarch - perl-IO-Socket-IP-0:0.39-5.module_1675+7c48d950.noarch - perl-IO-Socket-SSL-0:2.056-1.module_1675+7c48d950.noarch - perl-IO-String-0:1.08-31.module_1675+7c48d950.noarch - perl-IO-Tty-0:1.12-11.module_1675+7c48d950.x86_64 - perl-IO-Zlib-1:1.10-413.module_2073+eebc5b71.noarch - perl-IPC-Cmd-2:0.96-413.module_2073+eebc5b71.noarch - perl-IPC-Cmd-2:1.02-1.module_2073+eebc5b71.noarch - perl-IPC-Run-0:0.99-1.module_1675+7c48d950.noarch - perl-IPC-SysV-0:2.07-397.module_1675+7c48d950.x86_64 - perl-IPC-SysV-0:2.07-413.module_2073+eebc5b71.x86_64 - perl-IPC-System-Simple-0:1.25-17.module_1675+7c48d950.noarch - perl-Import-Into-0:1.002005-7.module_1675+7c48d950.noarch - perl-JSON-PP-1:2.27.400-413.module_2073+eebc5b71.noarch - perl-JSON-PP-1:2.97.001-2.module_1675+7c48d950.noarch - perl-LWP-MediaTypes-0:6.02-14.module_1675+7c48d950.noarch - perl-Locale-Codes-0:3.25-413.module_2073+eebc5b71.noarch - perl-Locale-Codes-0:3.57-1.module_2073+eebc5b71.noarch - perl-Locale-Maketext-0:1.28-396.module_1675+7c48d950.noarch - perl-Locale-Maketext-0:1.28-413.module_2073+eebc5b71.noarch - perl-Locale-Maketext-Simple-1:0.21-413.module_2073+eebc5b71.noarch - perl-MIME-Base64-0:3.15-396.module_1675+7c48d950.x86_64 - perl-MIME-Base64-0:3.15-413.module_2073+eebc5b71.x86_64 - perl-MRO-Compat-0:0.13-4.module_1675+7c48d950.noarch - perl-Math-BigInt-1:1.9998.06-413.module_2073+eebc5b71.noarch - perl-Math-BigInt-1:1.9998.11-5.module_1675+7c48d950.noarch - perl-Math-BigInt-FastCalc-0:0.500.500-413.module_2073+eebc5b71.x86_64 - perl-Math-BigInt-FastCalc-0:0.500.600-6.module_1675+7c48d950.x86_64 - perl-Math-BigRat-0:0.2611-413.module_2073+eebc5b71.noarch - perl-Math-BigRat-0:0.2614-1.module_2073+eebc5b71.noarch - perl-Math-Complex-0:1.59-413.module_2073+eebc5b71.noarch - perl-Memoize-0:1.03-413.module_2073+eebc5b71.noarch - perl-Mixin-Linewise-0:0.108-9.module_1675+7c48d950.noarch - perl-Module-Build-2:0.42.24-5.module_1675+7c48d950.noarch - perl-Module-CoreList-1:5.20180414-413.module_2073+eebc5b71.noarch - perl-Module-CoreList-1:5.20180720-1.module_2073+eebc5b71.noarch - perl-Module-CoreList-tools-1:5.20180414-413.module_2073+eebc5b71.noarch - perl-Module-CoreList-tools-1:5.20180720-1.module_2073+eebc5b71.noarch - perl-Module-Load-1:0.32-395.module_1675+7c48d950.noarch - perl-Module-Load-1:0.32-413.module_2073+eebc5b71.noarch - perl-Module-Load-Conditional-0:0.68-395.module_1675+7c48d950.noarch - perl-Module-Load-Conditional-0:0.68-413.module_2073+eebc5b71.noarch - perl-Module-Loaded-1:0.08-413.module_2073+eebc5b71.noarch - perl-Module-Metadata-0:1.000033-395.module_1675+7c48d950.noarch - perl-Module-Metadata-0:1.000033-413.module_2073+eebc5b71.noarch - perl-Module-Runtime-0:0.016-2.module_1675+7c48d950.noarch - perl-Net-IDN-Encode-0:2.400-6.module_1675+7c48d950.x86_64 - perl-Net-LibIDN-0:0.12-29.module_1675+7c48d950.x86_64 - perl-Net-Ping-0:2.55-413.module_2073+eebc5b71.noarch - perl-Net-SSLeay-0:1.85-1.module_1675+7c48d950.x86_64 - perl-Number-Compare-0:0.03-19.module_1675+7c48d950.noarch - perl-Package-Generator-0:1.106-11.module_1675+7c48d950.noarch - perl-Params-Check-1:0.38-395.module_1675+7c48d950.noarch - perl-Params-Check-1:0.38-413.module_2073+eebc5b71.noarch - perl-Params-Util-0:1.07-22.module_1675+7c48d950.x86_64 - perl-PathTools-0:3.67-413.module_2073+eebc5b71.x86_64 - perl-PathTools-0:3.74-1.module_1675+7c48d950.x86_64 - perl-Perl-OSType-0:1.010-396.module_1675+7c48d950.noarch - perl-Perl-OSType-0:1.010-413.module_2073+eebc5b71.noarch - perl-Perl-Version-0:1.013-9.module_1675+7c48d950.noarch - perl-PerlIO-utf8_strict-0:0.007-5.module_1675+7c48d950.x86_64 - perl-PerlIO-via-QuotedPrint-0:0.08-395.module_1675+7c48d950.noarch - perl-PerlIO-via-QuotedPrint-0:0.08-413.module_2073+eebc5b71.noarch - perl-Pod-Checker-4:1.73-395.module_1675+7c48d950.noarch - perl-Pod-Checker-4:1.73-413.module_2073+eebc5b71.noarch - perl-Pod-Coverage-0:0.23-14.module_1675+7c48d950.noarch - perl-Pod-Coverage-TrustPod-0:0.100005-1.module_1675+7c48d950.noarch - perl-Pod-Escapes-1:1.07-395.module_1675+7c48d950.noarch - perl-Pod-Escapes-1:1.07-413.module_2073+eebc5b71.noarch - perl-Pod-Eventual-0:0.094001-9.module_1675+7c48d950.noarch - perl-Pod-Html-0:1.22.02-413.module_2073+eebc5b71.noarch - perl-Pod-Parser-0:1.63-396.module_1675+7c48d950.noarch - perl-Pod-Parser-0:1.63-413.module_2073+eebc5b71.noarch - perl-Pod-Perldoc-0:3.28-413.module_2073+eebc5b71.noarch - perl-Pod-Perldoc-0:3.28.01-1.module_2073+eebc5b71.noarch - perl-Pod-Simple-1:3.35-395.module_1675+7c48d950.noarch - perl-Pod-Simple-1:3.35-413.module_2073+eebc5b71.noarch - perl-Pod-Usage-4:1.69-395.module_1675+7c48d950.noarch - perl-Pod-Usage-4:1.69-413.module_2073+eebc5b71.noarch - perl-SUPER-0:1.20141117-10.module_1675+7c48d950.noarch - perl-Scalar-List-Utils-3:1.46-413.module_2073+eebc5b71.x86_64 - perl-Scalar-List-Utils-3:1.49-2.module_1675+7c48d950.x86_64 - perl-SelfLoader-0:1.23-413.module_2073+eebc5b71.noarch - perl-Socket-4:2.020-413.module_2073+eebc5b71.x86_64 - perl-Socket-4:2.027-2.module_1675+7c48d950.x86_64 - perl-Socket6-0:0.28-6.module_1675+7c48d950.x86_64 - perl-Software-License-0:0.103013-2.module_1675+7c48d950.noarch - perl-Sort-Versions-0:1.62-8.module_1675+7c48d950.noarch - perl-Storable-1:2.62-413.module_2073+eebc5b71.x86_64 - perl-Storable-1:3.11-2.module_2073+eebc5b71.x86_64 - perl-Sub-Exporter-0:0.987-15.module_1675+7c48d950.noarch - perl-Sub-Identify-0:0.14-6.module_1675+7c48d950.x86_64 - perl-Sub-Install-0:0.928-14.module_1675+7c48d950.noarch - perl-Sub-Uplevel-1:0.2800-4.module_1675+7c48d950.noarch - perl-Sys-Syslog-0:0.35-397.module_1675+7c48d950.x86_64 - perl-Sys-Syslog-0:0.35-413.module_2073+eebc5b71.x86_64 - perl-Term-ANSIColor-0:4.06-396.module_1675+7c48d950.noarch - perl-Term-ANSIColor-0:4.06-413.module_2073+eebc5b71.noarch - perl-Term-Cap-0:1.17-395.module_1675+7c48d950.noarch - perl-Term-Cap-0:1.17-413.module_2073+eebc5b71.noarch - perl-Test-0:1.30-413.module_2073+eebc5b71.noarch - perl-Test-CPAN-Meta-0:0.25-12.module_1675+7c48d950.noarch - perl-Test-Deep-0:1.127-4.module_1675+7c48d950.noarch - perl-Test-Exception-0:0.43-7.module_1675+7c48d950.noarch - perl-Test-FailWarnings-0:0.008-12.module_1675+7c48d950.noarch - perl-Test-Harness-1:3.38-413.module_2073+eebc5b71.noarch - perl-Test-Harness-1:3.42-1.module_1675+7c48d950.noarch - perl-Test-MockModule-0:0.13-3.module_1675+7c48d950.noarch - perl-Test-Needs-0:0.002005-5.module_1675+7c48d950.noarch - perl-Test-NoWarnings-0:1.04-15.module_1675+7c48d950.noarch - perl-Test-Output-0:1.03.1-4.module_1675+7c48d950.noarch - perl-Test-Pod-0:1.51-8.module_1675+7c48d950.noarch - perl-Test-Pod-Coverage-0:1.10-10.module_1675+7c48d950.noarch - perl-Test-Simple-1:1.302073-413.module_2073+eebc5b71.noarch - perl-Test-Simple-1:1.302135-1.module_1675+7c48d950.noarch - perl-Test-Taint-0:1.06-19.module_1675+7c48d950.x86_64 - perl-Test-TrailingSpace-0:0.0301-5.module_1675+7c48d950.noarch - perl-Test-Version-0:2.07-1.module_1675+7c48d950.noarch - perl-Test-Warn-0:0.32-5.module_1675+7c48d950.noarch - perl-Test-Warnings-0:0.026-7.module_1675+7c48d950.noarch - perl-Text-Balanced-0:2.03-395.module_1675+7c48d950.noarch - perl-Text-Balanced-0:2.03-413.module_2073+eebc5b71.noarch - perl-Text-Diff-0:1.45-2.module_1675+7c48d950.noarch - perl-Text-Glob-0:0.11-4.module_1675+7c48d950.noarch - perl-Text-ParseWords-0:3.30-395.module_1675+7c48d950.noarch - perl-Text-ParseWords-0:3.30-413.module_2073+eebc5b71.noarch - perl-Text-Tabs+Wrap-0:2013.0523-395.module_1675+7c48d950.noarch - perl-Text-Tabs+Wrap-0:2013.0523-413.module_2073+eebc5b71.noarch - perl-Text-Template-0:1.51-1.module_1675+7c48d950.noarch - perl-Thread-Queue-0:3.12-413.module_2073+eebc5b71.noarch - perl-Thread-Queue-0:3.13-1.module_2073+eebc5b71.noarch - perl-Tie-IxHash-0:1.23-13.module_1675+7c48d950.noarch - perl-Time-HiRes-0:1.9741-413.module_2073+eebc5b71.x86_64 - perl-Time-HiRes-0:1.9758-1.module_1675+7c48d950.x86_64 - perl-Time-Local-0:1.250-413.module_2073+eebc5b71.noarch - perl-Time-Local-1:1.280-1.module_2073+eebc5b71.noarch - perl-Time-Piece-0:1.31-413.module_2073+eebc5b71.x86_64 - perl-TimeDate-1:2.30-13.module_1675+7c48d950.noarch - perl-Try-Tiny-0:0.30-2.module_1675+7c48d950.noarch - perl-URI-0:1.73-2.module_1675+7c48d950.noarch - perl-Unicode-Collate-0:1.19-413.module_2073+eebc5b71.x86_64 - perl-Unicode-Collate-0:1.25-2.module_1675+7c48d950.x86_64 - perl-Unicode-Normalize-0:1.25-396.module_1675+7c48d950.x86_64 - perl-Unicode-Normalize-0:1.25-413.module_2073+eebc5b71.x86_64 - perl-YAML-0:1.24-2.module_1675+7c48d950.noarch - perl-autodie-0:2.29-396.module_1675+7c48d950.noarch - perl-autodie-0:2.29-413.module_2073+eebc5b71.noarch - perl-bignum-0:0.47-413.module_2073+eebc5b71.noarch - perl-bignum-0:0.49-2.module_1675+7c48d950.noarch - perl-constant-0:1.33-396.module_1675+7c48d950.noarch - perl-constant-0:1.33-413.module_2073+eebc5b71.noarch - perl-devel-4:5.26.2-413.module_2073+eebc5b71.x86_64 - perl-encoding-4:2.19-413.module_2073+eebc5b71.x86_64 - perl-encoding-4:2.22-3.module_1675+7c48d950.x86_64 - perl-experimental-0:0.016-413.module_2073+eebc5b71.noarch - perl-experimental-0:0.020-1.module_2073+eebc5b71.noarch - perl-generators-0:1.10-7.module_1675+7c48d950.noarch - perl-homedir-0:2.000024-2.module_1675+7c48d950.noarch - perl-inc-latest-2:0.500-9.module_1675+7c48d950.noarch - perl-interpreter-4:5.26.2-413.module_2073+eebc5b71.x86_64 - perl-libnet-0:3.10-413.module_2073+eebc5b71.noarch - perl-libnet-0:3.11-3.module_1675+7c48d950.noarch - perl-libnetcfg-4:5.26.2-413.module_2073+eebc5b71.noarch - perl-libs-4:5.26.2-413.module_2073+eebc5b71.x86_64 - perl-local-lib-0:2.000024-2.module_1675+7c48d950.noarch - perl-macros-4:5.26.2-413.module_2073+eebc5b71.x86_64 - perl-open-0:1.11-413.module_2073+eebc5b71.noarch - perl-parent-1:0.236-395.module_1675+7c48d950.noarch - perl-parent-1:0.236-413.module_2073+eebc5b71.noarch - perl-perlfaq-0:5.021011-413.module_2073+eebc5b71.noarch - perl-perlfaq-0:5.20180605-1.module_2073+eebc5b71.noarch - perl-podlators-0:4.09-413.module_2073+eebc5b71.noarch - perl-podlators-0:4.11-1.module_2073+eebc5b71.noarch - perl-tests-4:5.26.2-413.module_2073+eebc5b71.x86_64 - perl-threads-1:2.15-413.module_2073+eebc5b71.x86_64 - perl-threads-1:2.21-2.module_1675+7c48d950.x86_64 - perl-threads-shared-0:1.56-413.module_2073+eebc5b71.x86_64 - perl-threads-shared-0:1.58-2.module_1675+7c48d950.x86_64 - perl-utils-0:5.26.2-413.module_2073+eebc5b71.noarch - perl-version-6:0.99.17-413.module_2073+eebc5b71.noarch - perl-version-6:0.99.24-1.module_2073+eebc5b71.x86_64 ... --- document: modulemd version: 2 data: name: perl-bootstrap stream: 5.24 version: 20180417065503 context: 6c81f848 arch: x86_64 summary: Perl bootstrap module for bootrapping Perl module description: > This is the Perl interpreter and a set of modules written in Perl language intended for bootstrapping the perl module. This module disables some optional tests to limit amount of components. This module is not intended for public use. It's an intermediate step for building perl module. license: module: - MIT content: - MIT xmd: mbs: mse: TRUE scmurl: https://src.fedoraproject.org/modules/perl-bootstrap.git?#47f4825a1d5e2a8fd7b76583744ea8f2202c850c commit: 47f4825a1d5e2a8fd7b76583744ea8f2202c850c buildrequires: platform: ref: f29 stream: f29 context: 00000000 version: 4 filtered_rpms: [] rpms: perl-Devel-Symdump: ref: 8c2d0279e473e311cfcf0521091d3f93c221937a perl-Test-Pod: ref: 576a8c16670036dc9212fd54eabd0ef7d9d164c1 perl-File-Which: ref: 1a2ca4a9b713f31c6f99f6dec3dafdd0a457a44f perl-Perl-Version: ref: 3efa7273f190e94ee96af9bbad3c137dc3b787c3 perl-Digest-MD5: ref: 884cdd515f0250589dd4cde8c32a9d77fc55871e perl-Test-Portability-Files: ref: cdddd635bbdd7685819558be423e4456b66a090d perl-Pod-Escapes: ref: 1ab928503d1824c54a6a32e6b5d527b389f34d05 perl-Text-ParseWords: ref: 1c120cf2934e246a59a5f37284ac8111c52fa806 perl-podlators: ref: 380d587d637c4b5fe4c1b961aa16cb698ed2a07b perl-Pod-Eventual: ref: 4c8406d6788f6552c47df76ae69601a9de6486ff perl-IPC-Cmd: ref: fc6bc3efe40775d3e63d811a65ed0cab6aa138e1 perl-Test-Output: ref: 8b0264e6c842946fe77b7c461275961680e62368 perl-SUPER: ref: 5e0a1ed539e5948eeea71c3ad3d8ce124b4d63c2 perl-Time-Local: ref: e74a3e804e77a0d704eebdede825b6d0d6cc617b perl-IPC-SysV: ref: 6102b15b4a3e30698673109ddda94a2325123e38 perl-Package-Generator: ref: f78e39fa9dc3fd1474475eabcb9378375142dd70 perl-MRO-Compat: ref: 13cfd3efff5d02609bf8fe0c36a9e7a9a37ca8b8 perl-IO-HTML: ref: 69a460858b8c1f47bb6320faa6f310dab6808184 perl-Compress-Raw-Bzip2: ref: b989d850d818cbaeba0c47b0d975e1afd6b34bb8 perl-Devel-Leak: ref: aac20d847c0b0c781e9c6d49a4458526b9f9aa8b perl-IO-String: ref: e441228a5c401a96fdfa989706c0b4da67902cfc perl: ref: 9acafa0017b87ed96f8857fd7099787f0d24ff56 perl-File-Slurp-Tiny: ref: 1f6426ab2ee83674668788199ec0a1ba676c1ec3 perl-Params-Util: ref: 4bfebd9e4cb2fe6a52e2ae69d5e5e74b36296f9f perl-File-Path: ref: 5848e296d61a3de73f17016f7f37a6395ae0f402 perl-Sub-Uplevel: ref: 7a179457e0f3068e923a4fe3db2dd74a68b72925 perl-Module-Load: ref: 3f98c8f286677f7b700f661545154e781798ef0c perl-CPAN-Meta-Requirements: ref: f693254160585068bd1db62ffa980963a2ef7011 perl-Test-CPAN-Meta: ref: 9aac31d337c0526dedcd5b36ba4d97e71a04cf8c perl-IO-Socket-IP: ref: 4e56568b5d09ad4aefccb354183614ae5b3f6235 perl-Test-Harness: ref: 2ddba30c66331628ef273a6df6b67e2b05d76022 perl-parent: ref: f50da57010454e2279d899a57fdbc65a48edc74c perl-ExtUtils-CBuilder: ref: 521e6f6f83dc9a5afbb517d85e637bfa69f59701 perl-perlfaq: ref: 63e299c953b8f4b558fe904fc7d31763f79760f1 perl-Sub-Install: ref: 799f7222e97cc90f9abb7e1f02a5847d71a83cb0 perl-IPC-System-Simple: ref: c6c28f1091285aa29100a31c705bcf916a13452b perl-Socket: ref: 14bd5dedb6ff8da7d7b0f5945aa61ffa620777d1 perl-Perl-OSType: ref: c2efc33ea89adb7c2da626cc3d436bbc69203e2b perl-ExtUtils-ParseXS: ref: 9398847c09b96f2765b1a03b4b84188e28711273 perl-Test-Deep: ref: efc3846cd014e4c4adb0637da854b2413112cc9e perl-IPC-Run: ref: d123ca7ec60ceb684a6acf68ea4a492562bb2937 perl-Import-Into: ref: 4964255b1b7b5d0b7c61f0f56db81963ce4b559e perl-ExtUtils-Install: ref: 507084f8349f691d4688fe9a49e92be1711874e4 perl-BSD-Resource: ref: b0968a4d109d201a1318c0012f4e8f858d2f78d2 perl-autodie: ref: 40735fb3b9a6b96b40934e72672bb1a04eb0999a perl-Locale-Maketext: ref: 57b31cf2d161ce97448d225af3f86c210d78ad6a perl-Module-Runtime: ref: b61338418e9c84469b3d76a17b70f38497d30dd7 perl-Data-OptList: ref: 9512df0280d65abfaa04d6437367705c3b19b54f perl-LWP-MediaTypes: ref: 31f031d664748d5049327f8928d998ba1003d606 perl-CPAN-Meta-YAML: ref: 3609aa7e2ae8ca137d9ff46de25d4b869fdb8c2b perl-Math-BigInt-FastCalc: ref: 785456ac9585a8b4f7628d3bd2a0dacd5b592d09 perl-File-Temp: ref: de8e0c3e7e630e6861a0c0979c5ab60227f7de8e perl-JSON-PP: ref: 1e3fe253e7edbdc506418a38d666ed19db8ce136 perl-Test-Simple: ref: e64b2e39f56e17d7b9046881d589c778aaf4ce8b perl-File-Find-Object: ref: 352249b989b0d30b7872918228edcb76cdc7836e perl-Capture-Tiny: ref: b62d26b13aced270b75df6b6fe3a2cc10f8e8987 perl-HTTP-Message: ref: 3fb93e190e2804faea83abcb45214b00fd090bc5 perl-Pod-Coverage-TrustPod: ref: f784cfffe48f00c3d1a8317581a940d2ae6268c1 perl-Module-Build: ref: 2c9e4f8f3788caeaa4707f7b562f1ad39a416680 perl-inc-latest: ref: 0a60ae8876d88d2eaac83b84d6d2fff8ced1b9a1 perl-Module-Load-Conditional: ref: bb49232617058d8af4f199db9972f04cd3eefe0d perl-Filter: ref: 998996cc8b57f55172167da01155d3a7b59c1e99 perl-Pod-Checker: ref: 6c8f684a9863678be5724c2e565ba1aa62761151 perl-Sort-Versions: ref: c4677aff1f40cf996fb73d0d1312c2583434fa6b perl-Thread-Queue: ref: e0fff689fc097ecf54bac2f09e5e7bd3c4d00ef6 perl-IO-Compress: ref: 1e67f30fcc790e2d133ecd756e1b68dc1e423999 perl-Math-BigInt: ref: 82d8ddba8d0d808a04d9d4cb579df53f65112027 perl-File-Find-Rule: ref: d948339f4b97b6ce271c9c288b144cf967411043 perl-Text-Template: ref: 9309a484a2e8e309272c8916cf63a12e385eaaef perl-Test-Exception: ref: b78e90750d6fb261ce29ad3a347b1e394c612331 perl-Unicode-Normalize: ref: 6875f415710668a788423fdd80ae712e0c3d3ab2 perl-HTML-Tagset: ref: b4bb7fb9dd897fed415210afbaa904bfb7fd4e45 perl-URI: ref: 28d53fda027d3a984ffa201d4494389c6b7796b0 perl-GSSAPI: ref: 248a8c09ceed073a724a44e11d65fc15fc792201 perl-TermReadKey: ref: 012af49cc9a63d1d481cb616a21b0f3545aefe23 perl-Text-Glob: ref: 346be0660f0fc621a960467b5fa1ee656b9cd87f perl-Pod-Simple: ref: a0eec0341f8cc19d74f6f21f9bf38781446a0ad1 perl-Algorithm-Diff: ref: f4b6c06396d4768c691a23b3b967fe6fac1e46ee perl-Class-XSAccessor: ref: c9edaedd473078571b2fd3de7743c69f0cc67f1a perl-Digest: ref: 6867766aaf85865d33675be774af4751b8ae9549 perl-Test-FailWarnings: ref: 6d8ce49b232ead21cf55098590e10eb897d24426 perl-Tie-IxHash: ref: 8e7169c7705dddb6290c1d8c116c5ca4eb1de7a4 perl-ExtUtils-MakeMaker: ref: 5d9438be138d0919320b5a6e2324df05fe123d6a perl-Devel-StackTrace: ref: 64a31414eda5c263e7bea908641ad4e44c46de31 perl-Compress-Raw-Zlib: ref: ed5582bb24c481aaa0de7a33ecbf85989e0ddd8c perl-Test-Version: ref: f5adf2bc958c6bb1c847fd9e355df70285cf38fb perl-ExtUtils-Manifest: ref: 2fd5140cb9441b0445de12b720c5459ed38e95b7 perl-Pod-Parser: ref: efe0977afc65bae502a4ee5bc47430b4e2b6702f perl-Exporter: ref: 14c101bc77bc5119c4f75065d6f4b6edea4b502a perl-MIME-Base64: ref: da62d3707ea9781efc91ba48d47ce49b2297a364 perl-version: ref: 098155010f833f432a85cb97754e1080750ec873 perl-experimental: ref: cad2845a55a98ca9565be2707c3ff48e984fd1da perl-Text-Levenshtein-Damerau-XS: ref: 920027ab00d12e5a2e6b12e2e8d7f0b23fd6f1c1 perl-CPAN: ref: 4159d449e5a66ddef70d1fe7f1d37279d4d99bc5 perl-Text-Balanced: ref: c6648ff72f7b1798642f719036a677102c7ee125 perl-PathTools: ref: e643e0b6864983a2606f5bcf3ae9a34caeda4059 perl-Compress-Bzip2: ref: 1ac091378670bfc36b3e866924ddc076cd800cf2 perl-Number-Compare: ref: a3e2f8c0ea3542cde8009225501e8c09cad2582d perl-Authen-SASL: ref: a21e64f1a36fd53125e5a79287c34b2f16fc9782 perl-JSON: ref: 7e6037e3c89511b23511c4292ce1129ef43dd09c perl-Fedora-VSP: ref: 63312d7720e816853bd595cbcdc9d9e3cce0880b perl-Test-NoWarnings: ref: ff0744a0c58a759894a7296f4f47aec3522105a5 perl-Locale-Codes: ref: bd6e31d21f18e85ffe4411b0ce7238d6a974063a perl-Digest-HMAC: ref: 74df7c0a82a218beba053d129a0d29fa74316724 perl-Module-CoreList: ref: 6b31db0c22a4824a2ae7c40114a8af17bcfd125b perl-Scalar-List-Utils: ref: 7eb2ea6397b7fbeeaeacbb176bbbc453723ded1a perl-Digest-SHA: ref: 2b4a62eaf739a7d2ce6649f3a326dbd562ed8b74 perl-CPAN-Meta-Check: ref: 4c4b5bd0d549adebf27a79f755db22dadb324d70 perl-Expect: ref: 9b537a758488cd3f11288f65eb76384f562bed93 perl-TimeDate: ref: f375f3f228c209a12ac22d1055ddeba07e01134b perl-Pod-Coverage: ref: ec582e4dc33ea441ec00496a2123333052834e59 perl-generators: ref: 87c9a690dd58beeaa573074d26fccccb089ab31b perl-Pod-Perldoc: ref: 842e567a333ccfd2b15be93f230d29414be0f581 perl-Sub-Exporter: ref: 92259c19826f0aed436f04d886cf4e1f208ff103 perl-Time-HiRes: ref: 17004a2568fc6de651cee58816cec8640a825d4c perl-HTTP-Tiny: ref: d396ccfe1aadc5746420b06e268e04316eb62c44 perl-Test-Taint: ref: c72c54ac4c5cde555381dd2b4037d0a34af36af4 perl-Text-Tabs+Wrap: ref: 90b3a77c499b10b5d34569f8b1b26327495049ea perl-B-Debug: ref: ec558193299b89d6babcf009bdcc18dc7fc48a4e perl-File-HomeDir: ref: 2982c5d9f538d8c640c3ca8fee7566d68e5ea68e perl-threads: ref: f0b3ca4a1602b11c483d97aea130e2dea8b8f96f perl-accessors: ref: 0e851a02363f4433b6fa5822553ba810f2127711 perl-Unicode-Collate: ref: c6bc5268528635406bf3237258e7c2969a2bdfc6 perl-YAML-Syck: ref: 5454878158f3a1eca83b59ebbff5f21b1284a3af perl-Encode-Locale: ref: b0a26b89329c19ad11b5bb5a3292b960f74563e0 perl-Try-Tiny: ref: e6ae51897ab12408471d9a6285d2cb6a472aff65 perl-Text-Diff: ref: 2ee347e962b8a0e83eeecf3324062308cc1d1a2c perl-threads-shared: ref: cd6fd55c5d0ce4aaf7394f4ee865d68c61e91cd1 perl-Math-BigRat: ref: 72d54e7b07b44e1b126a961e8ac44b346d9ee7de perl-HTML-Parser: ref: 91f7240000e51a6838eb39a25a63bd329cc4ed9d perl-Storable: ref: d76f7a7ba835789a1ca93e3c0db2fc17a9f11907 perl-Getopt-Long: ref: a7414b0c7a488b9af202fff1eb6a2fb2a3ca6327 perl-Digest-SHA1: ref: ac79089f89be4e77521118399bf9f27ea9acebf0 perl-bignum: ref: 74c0852bf10b97499c694d3d32f5e66a7a7d7cf3 perl-Net-SSLeay: ref: 62017fc4159c66debfa779e71c05bd206a411650 perl-Term-ANSIColor: ref: 3a74f9162f818ffaa4069d74c931caef0560514b perl-IO-Tty: ref: 5d0e7d74fd5f707edf41bb8d9dcbf4e40d8227d9 perl-Net-IDN-Encode: ref: 460f7f72751e3c81d09d566073944962ab4d6411 perl-Carp: ref: 84fbaf6f236f9a082ae6960bbbd160f6e75894c5 perl-libnet: ref: e6cc3a47e0776ada93c3801f06af81fb7b642d38 perl-Test-Pod-Coverage: ref: 010a282957d054909aeda5efa3a699fd3c7992f7 perl-local-lib: ref: 96f72250500b509a87fe9263b81f888812ba08cf perl-Test-TrailingSpace: ref: d6e33a6af0540130b87353ba17160e222252cb89 perl-Params-Check: ref: cf2ab4714451509691e4c06f968b0cc71891a8b8 perl-File-Find-Rule-Perl: ref: d9c5ed29fbca16a094c2e8c13f9a7d316b0309f4 perl-Mixin-Linewise: ref: 00c2d1043dcd5241042440ab1db81dc4442b0717 perl-Pod-Usage: ref: 9d38a4ee92dafbfdd5e8adf44810304de6bbc9e0 perl-Data-Dumper: ref: c8ea0bbaafa024bc09c7f29342f584885571eb07 perl-Data-Section: ref: 6ed48ef1733de62cd245237e25d93ea9a827d5e6 perl-Socket6: ref: 81332b86b363354a64ae9a952464963b2364e1a4 perl-File-Fetch: ref: b4bf1bd8af7755b16b40a3dd67cb743bef9b1652 perl-HTTP-Date: ref: 10316c369112a515f0e98539bfbef604709aad25 perl-Software-License: ref: da9a11a3ad14d5a4cbfe9b52d108b672a6939d69 perl-IO-Socket-SSL: ref: 0127aa728ad530065708aee31fa1bb31309c574a perl-Env: ref: 58ac31466f9c9824d25b13ad559622dcdd65e20a perl-Config-Perl-V: ref: 5a2c9f1ea41e4f07e76062c9598619fed2b4dcb6 perl-IO-Socket-INET6: ref: a94e5c6c12df30734570d0b2587ae0b19f1e6e6a perl-Archive-Tar: ref: 2bd7368d3debb90e1d87c3d44db91412fd39873c perl-Test-Warn: ref: 55255a6e3e3379784b9d3dc982d3ffbcefca0912 perl-Devel-Size: ref: 982a54ab4a98fba5339f850fa9cc30af93703d2f perl-Test-MockModule: ref: 89e06b4276d3db97152535beb7b18245643d78de perl-Term-Cap: ref: 28e345f7f785aa5b60572bfa5ba2627ef8dd3033 perl-Sys-Syslog: ref: 008e476eb1f3e015ad34f302a4cad874e4aad33a perl-Devel-PPPort: ref: bd144f784620e5cb43ef9aea61c11d1bb7fe0503 perl-CGI: ref: 813b1d1505d678db76a08eade6cde0592ab01c76 perl-CPAN-Meta: ref: 68ca8b0eed6d50eaef11c381b6d8e4754f6c2a7d perl-File-Find-Object-Rule: ref: da140b5d0f2f2555c56b2c0d98520b57b263b5fe perl-Archive-Zip: ref: 948b8e44e8dc5def0baa82a96c46da5bff385086 perl-DB_File: ref: d9d4b751bd8ea51672630f3beb1ecaf899de40ad perl-PerlIO-utf8_strict: ref: 58caa0d757a324f86b5c9d6a8e27abb230ffc5e7 perl-YAML: ref: 5b3a5ddc9c27dae306b39436c62ba1343a745b5d perl-Sub-Identify: ref: ab54ce7ae8646b1faf1ce345b82a042c21272ff6 perl-Filter-Simple: ref: ca5e4217e059a7371a125419071852760d031dba perl-Module-Metadata: ref: f583f7db4daab0a72bae86e49b549c15f5e2c905 perl-Net-LibIDN: ref: b4176cefa2675271f48e4c28314baa018abdf887 perl-PerlIO-via-QuotedPrint: ref: 31eb1e0e1c723aaf09d6846b9016e4db94428700 perl-constant: ref: f005b65dee6a48411e2dfeb5e057dfb8a3818135 perl-Encode: ref: 346cfe7ccbce4c3cc2a4739b628d8d0b7e1a4779 mbs_options: blocked_packages: - perl - perl-accessors - perl-Algorithm-Diff - perl-Archive-Tar - perl-Archive-Zip - perl-Authen-SASL - perl-autodie - perl-B-Debug - perl-bignum - perl-BSD-Resource - perl-Capture-Tiny - perl-Carp - perl-CGI - perl-Class-XSAccessor - perl-Compress-Bzip2 - perl-Compress-Raw-Bzip2 - perl-Compress-Raw-Zlib - perl-Config-Perl-V - perl-constant - perl-CPAN - perl-CPAN-Meta - perl-CPAN-Meta-Check - perl-CPAN-Meta-Requirements - perl-CPAN-Meta-YAML - perl-Data-Dumper - perl-Data-OptList - perl-Data-Section - perl-DB_File - perl-Devel-Leak - perl-Devel-PPPort - perl-Devel-Size - perl-Devel-StackTrace - perl-Devel-Symdump - perl-Digest - perl-Digest-HMAC - perl-Digest-MD5 - perl-Digest-SHA - perl-Digest-SHA1 - perl-Encode - perl-Encode-Locale - perl-Env - perl-Expect - perl-experimental - perl-Exporter - perl-ExtUtils-CBuilder - perl-ExtUtils-Install - perl-ExtUtils-MakeMaker - perl-ExtUtils-Manifest - perl-ExtUtils-ParseXS - perl-Fedora-VSP - perl-File-Fetch - perl-File-Find-Object - perl-File-Find-Object-Rule - perl-File-Find-Rule - perl-File-Find-Rule-Perl - perl-File-HomeDir - perl-File-Path - perl-File-Slurp-Tiny - perl-File-Temp - perl-File-Which - perl-Filter - perl-Filter-Simple - perl-generators - perl-Getopt-Long - perl-GSSAPI - perl-HTML-Parser - perl-HTML-Tagset - perl-HTTP-Date - perl-HTTP-Message - perl-HTTP-Tiny - perl-Import-Into - perl-inc-latest - perl-IO-Compress - perl-IO-HTML - perl-IO-Socket-INET6 - perl-IO-Socket-IP - perl-IO-Socket-SSL - perl-IO-String - perl-IO-Tty - perl-IPC-Cmd - perl-IPC-Run - perl-IPC-System-Simple - perl-IPC-SysV - perl-JSON - perl-JSON-PP - perl-libnet - perl-local-lib - perl-Locale-Codes - perl-Locale-Maketext - perl-LWP-MediaTypes - perl-Math-BigInt - perl-Math-BigInt-FastCalc - perl-Math-BigRat - perl-MIME-Base64 - perl-Mixin-Linewise - perl-Module-Build - perl-Module-CoreList - perl-Module-Load - perl-Module-Load-Conditional - perl-Module-Metadata - perl-Module-Runtime - perl-MRO-Compat - perl-Net-IDN-Encode - perl-Net-LibIDN - perl-Net-SSLeay - perl-Number-Compare - perl-Package-Generator - perl-Params-Check - perl-Params-Util - perl-parent - perl-PathTools - perl-Perl-OSType - perl-Perl-Version - perl-perlfaq - perl-PerlIO-utf8_strict - perl-PerlIO-via-QuotedPrint - perl-Pod-Checker - perl-Pod-Coverage - perl-Pod-Coverage-TrustPod - perl-Pod-Escapes - perl-Pod-Eventual - perl-Pod-Parser - perl-Pod-Perldoc - perl-Pod-Simple - perl-Pod-Usage - perl-podlators - perl-Scalar-List-Utils - perl-Socket - perl-Socket6 - perl-Software-License - perl-Sort-Versions - perl-Storable - perl-Sub-Exporter - perl-Sub-Identify - perl-Sub-Install - perl-Sub-Uplevel - perl-SUPER - perl-Sys-Syslog - perl-Term-ANSIColor - perl-Term-Cap - perl-TermReadKey - perl-Test-CPAN-Meta - perl-Test-Deep - perl-Test-Exception - perl-Test-FailWarnings - perl-Test-Harness - perl-Test-MockModule - perl-Test-NoWarnings - perl-Test-Output - perl-Test-Pod - perl-Test-Pod-Coverage - perl-Test-Portability-Files - perl-Test-Simple - perl-Test-Taint - perl-Test-TrailingSpace - perl-Test-Version - perl-Test-Warn - perl-Text-Balanced - perl-Text-Diff - perl-Text-Glob - perl-Text-Levenshtein-Damerau-XS - perl-Text-ParseWords - perl-Text-Tabs+Wrap - perl-Text-Template - perl-Thread-Queue - perl-threads - perl-threads-shared - perl-Tie-IxHash - perl-Time-HiRes - perl-Time-Local - perl-TimeDate - perl-Try-Tiny - perl-Unicode-Collate - perl-Unicode-Normalize - perl-URI - perl-version - perl-YAML - perl-YAML-Syck dependencies: - buildrequires: platform: [f29] requires: platform: [f29] references: community: https://fedoraproject.org/wiki/Modularity documentation: https://fedoraproject.org/wiki/Fedora_Packaging_Guidelines_for_Modules buildopts: rpms: macros: | %perl_bootstrap 1 %_with_perl_enables_groff 1 %_without_perl_enables_syslog_test 1 %_with_perl_enables_systemtap 1 %_without_perl_enables_tcsh 1 %_without_perl_Compress_Bzip2_enables_optional_test 1 %_without_perl_CPAN_Meta_Requirements_enables_optional_test 1 %_without_perl_IPC_System_Simple_enables_optional_test 1 %_without_perl_LWP_MediaTypes_enables_mailcap 1 %_without_perl_Module_Build_enables_optional_test 1 %_without_perl_Perl_OSType_enables_optional_test 1 %_without_perl_Pod_Perldoc_enables_tk_test 1 %_without_perl_Software_License_enables_optional_test 1 %_without_perl_Sys_Syslog_enables_optional_test 1 %_without_perl_Test_Harness_enables_optional_test 1 %_without_perl_URI_enables_Business_ISBN 1 components: rpms: perl: rationale: The Perl interpreter. repository: git://pkgs.fedoraproject.org/rpms/perl cache: http://pkgs.fedoraproject.org/repo/pkgs/perl ref: f26 buildorder: 1 perl-Algorithm-Diff: rationale: build dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-Algorithm-Diff cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-Algorithm-Diff ref: f26 buildorder: 4 perl-Archive-Tar: rationale: build dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-Archive-Tar cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-Archive-Tar ref: f26 buildorder: 4 perl-Archive-Zip: rationale: build dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-Archive-Zip cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-Archive-Zip ref: f26 buildorder: 8 perl-Authen-SASL: rationale: build dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-Authen-SASL cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-Authen-SASL ref: f26 buildorder: 6 perl-B-Debug: rationale: build dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-B-Debug cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-B-Debug ref: f26 buildorder: 4 perl-BSD-Resource: rationale: build dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-BSD-Resource cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-BSD-Resource ref: f26 buildorder: 7 perl-CGI: rationale: build dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-CGI cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-CGI ref: f26 buildorder: 6 perl-CPAN: rationale: build dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-CPAN cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-CPAN ref: f26 buildorder: 6 perl-CPAN-Meta: rationale: build dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-CPAN-Meta cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-CPAN-Meta ref: f26 buildorder: 4 perl-CPAN-Meta-Check: rationale: build dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-CPAN-Meta-Check cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-CPAN-Meta-Check ref: f26 buildorder: 10 perl-CPAN-Meta-Requirements: rationale: build dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-CPAN-Meta-Requirements cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-CPAN-Meta-Requirements ref: f26 buildorder: 4 perl-CPAN-Meta-YAML: rationale: build dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-CPAN-Meta-YAML cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-CPAN-Meta-YAML ref: f26 buildorder: 4 perl-Capture-Tiny: rationale: build dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-Capture-Tiny cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-Capture-Tiny ref: f26 buildorder: 4 perl-Carp: rationale: build dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-Carp cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-Carp ref: f26 buildorder: 4 perl-Class-XSAccessor: rationale: build dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-Class-XSAccessor cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-Class-XSAccessor ref: f26 buildorder: 4 perl-Compress-Bzip2: rationale: build dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-Compress-Bzip2 cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-Compress-Bzip2 ref: f26 buildorder: 4 perl-Compress-Raw-Bzip2: rationale: build dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-Compress-Raw-Bzip2 cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-Compress-Raw-Bzip2 ref: f26 buildorder: 4 perl-Compress-Raw-Zlib: rationale: build dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-Compress-Raw-Zlib cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-Compress-Raw-Zlib ref: f26 buildorder: 4 perl-Config-Perl-V: rationale: build dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-Config-Perl-V cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-Config-Perl-V ref: f26 buildorder: 6 perl-DB_File: rationale: build dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-DB_File cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-DB_File ref: f26 buildorder: 4 perl-Data-Dumper: rationale: build dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-Data-Dumper cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-Data-Dumper ref: f26 buildorder: 4 perl-Data-OptList: rationale: build dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-Data-OptList cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-Data-OptList ref: f26 buildorder: 5 perl-Data-Section: rationale: build dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-Data-Section cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-Data-Section ref: f26 buildorder: 7 perl-Devel-Leak: rationale: build dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-Devel-Leak cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-Devel-Leak ref: f26 buildorder: 4 perl-Devel-PPPort: rationale: build dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-Devel-PPPort cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-Devel-PPPort ref: f26 buildorder: 4 perl-Devel-Size: rationale: build dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-Devel-Size cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-Devel-Size ref: f26 buildorder: 7 perl-Devel-StackTrace: rationale: build dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-Devel-StackTrace cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-Devel-StackTrace ref: f26 buildorder: 4 perl-Devel-Symdump: rationale: build dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-Devel-Symdump cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-Devel-Symdump ref: f26 buildorder: 4 perl-Digest: rationale: build dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-Digest cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-Digest ref: f26 buildorder: 4 perl-Digest-HMAC: rationale: build dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-Digest-HMAC cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-Digest-HMAC ref: f26 buildorder: 5 perl-Digest-MD5: rationale: build dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-Digest-MD5 cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-Digest-MD5 ref: f26 buildorder: 4 perl-Digest-SHA: rationale: build dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-Digest-SHA cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-Digest-SHA ref: f26 buildorder: 4 perl-Digest-SHA1: rationale: build dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-Digest-SHA1 cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-Digest-SHA1 ref: f26 buildorder: 4 perl-Encode: rationale: build dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-Encode cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-Encode ref: f26 buildorder: 4 perl-Encode-Locale: rationale: build dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-Encode-Locale cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-Encode-Locale ref: f26 buildorder: 4 perl-Env: rationale: build dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-Env cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-Env ref: f26 buildorder: 4 perl-Expect: rationale: build dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-Expect cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-Expect ref: f26 buildorder: 5 perl-Exporter: rationale: build dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-Exporter cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-Exporter ref: f26 buildorder: 4 perl-ExtUtils-CBuilder: rationale: build dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-ExtUtils-CBuilder cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-ExtUtils-CBuilder ref: f26 buildorder: 4 perl-ExtUtils-Install: rationale: build dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-ExtUtils-Install cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-ExtUtils-Install ref: f26 buildorder: 4 perl-ExtUtils-MakeMaker: rationale: build dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-ExtUtils-MakeMaker cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-ExtUtils-MakeMaker ref: f26 buildorder: 4 perl-ExtUtils-Manifest: rationale: build dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-ExtUtils-Manifest cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-ExtUtils-Manifest ref: f26 buildorder: 4 perl-ExtUtils-ParseXS: rationale: build dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-ExtUtils-ParseXS cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-ExtUtils-ParseXS ref: f26 buildorder: 4 perl-Fedora-VSP: rationale: RPM dependency generator. repository: git://pkgs.fedoraproject.org/rpms/perl-Fedora-VSP cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-Fedora-VSP ref: f26 buildorder: 2 perl-File-Fetch: rationale: build dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-File-Fetch cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-File-Fetch ref: f26 buildorder: 5 perl-File-Find-Object: rationale: build dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-File-Find-Object cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-File-Find-Object ref: f26 buildorder: 5 perl-File-Find-Object-Rule: rationale: build dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-File-Find-Object-Rule cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-File-Find-Object-Rule ref: f26 buildorder: 6 perl-File-Find-Rule: rationale: build dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-File-Find-Rule cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-File-Find-Rule ref: f26 buildorder: 5 perl-File-Find-Rule-Perl: rationale: build dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-File-Find-Rule-Perl cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-File-Find-Rule-Perl ref: f26 buildorder: 6 perl-File-HomeDir: rationale: build dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-File-HomeDir cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-File-HomeDir ref: f26 buildorder: 5 perl-File-Path: rationale: build dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-File-Path cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-File-Path ref: f26 buildorder: 4 perl-File-Slurp-Tiny: rationale: build dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-File-Slurp-Tiny cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-File-Slurp-Tiny ref: f26 buildorder: 4 perl-File-Temp: rationale: build dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-File-Temp cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-File-Temp ref: f26 buildorder: 4 perl-File-Which: rationale: build dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-File-Which cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-File-Which ref: f26 buildorder: 4 perl-Filter: rationale: build dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-Filter cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-Filter ref: f26 buildorder: 4 perl-Filter-Simple: rationale: build dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-Filter-Simple cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-Filter-Simple ref: f26 buildorder: 4 perl-GSSAPI: rationale: build dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-GSSAPI cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-GSSAPI ref: f26 buildorder: 4 perl-Getopt-Long: rationale: build dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-Getopt-Long cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-Getopt-Long ref: f26 buildorder: 4 perl-HTML-Parser: rationale: build dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-HTML-Parser cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-HTML-Parser ref: f26 buildorder: 5 perl-HTML-Tagset: rationale: build dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-HTML-Tagset cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-HTML-Tagset ref: f26 buildorder: 4 perl-HTTP-Date: rationale: build dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-HTTP-Date cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-HTTP-Date ref: f26 buildorder: 4 perl-HTTP-Message: rationale: build dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-HTTP-Message cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-HTTP-Message ref: f26 buildorder: 5 perl-HTTP-Tiny: rationale: build dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-HTTP-Tiny cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-HTTP-Tiny ref: f26 buildorder: 4 perl-IO-Compress: rationale: build dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-IO-Compress cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-IO-Compress ref: f26 buildorder: 5 perl-IO-HTML: rationale: build dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-IO-HTML cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-IO-HTML ref: f26 buildorder: 4 perl-IO-Socket-INET6: rationale: build dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-IO-Socket-INET6 cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-IO-Socket-INET6 ref: f26 buildorder: 8 perl-IO-Socket-IP: rationale: build dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-IO-Socket-IP cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-IO-Socket-IP ref: f26 buildorder: 4 perl-IO-Socket-SSL: rationale: build dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-IO-Socket-SSL cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-IO-Socket-SSL ref: f26 buildorder: 9 perl-IO-String: rationale: build dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-IO-String cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-IO-String ref: f26 buildorder: 4 perl-IO-Tty: rationale: build dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-IO-Tty cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-IO-Tty ref: f26 buildorder: 4 perl-IPC-Cmd: rationale: build dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-IPC-Cmd cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-IPC-Cmd ref: f26 buildorder: 6 perl-IPC-Run: rationale: build dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-IPC-Run cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-IPC-Run ref: f26 buildorder: 5 perl-IPC-SysV: rationale: build dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-IPC-SysV cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-IPC-SysV ref: f26 buildorder: 4 perl-IPC-System-Simple: rationale: build dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-IPC-System-Simple cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-IPC-System-Simple ref: f26 buildorder: 4 perl-Import-Into: rationale: build dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-Import-Into cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-Import-Into ref: f26 buildorder: 8 perl-JSON: rationale: build dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-JSON cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-JSON ref: f26 buildorder: 7 perl-JSON-PP: rationale: build dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-JSON-PP cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-JSON-PP ref: f26 buildorder: 4 perl-LWP-MediaTypes: rationale: build dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-LWP-MediaTypes cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-LWP-MediaTypes ref: f26 buildorder: 4 perl-Locale-Codes: rationale: build dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-Locale-Codes cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-Locale-Codes ref: f26 buildorder: 4 perl-Locale-Maketext: rationale: build dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-Locale-Maketext cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-Locale-Maketext ref: f26 buildorder: 4 perl-MIME-Base64: rationale: build dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-MIME-Base64 cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-MIME-Base64 ref: f26 buildorder: 4 perl-MRO-Compat: rationale: build dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-MRO-Compat cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-MRO-Compat ref: f26 buildorder: 4 perl-Math-BigInt: rationale: build dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-Math-BigInt cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-Math-BigInt ref: f26 buildorder: 4 perl-Math-BigInt-FastCalc: rationale: build dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-Math-BigInt-FastCalc cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-Math-BigInt-FastCalc ref: f26 buildorder: 5 perl-Math-BigRat: rationale: build dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-Math-BigRat cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-Math-BigRat ref: f26 buildorder: 5 perl-Mixin-Linewise: rationale: build dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-Mixin-Linewise cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-Mixin-Linewise ref: f26 buildorder: 7 perl-Module-Build: rationale: build dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-Module-Build cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-Module-Build ref: f26 buildorder: 5 perl-Module-CoreList: rationale: build dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-Module-CoreList cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-Module-CoreList ref: f26 buildorder: 4 perl-Module-Load: rationale: build dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-Module-Load cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-Module-Load ref: f26 buildorder: 4 perl-Module-Load-Conditional: rationale: build dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-Module-Load-Conditional cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-Module-Load-Conditional ref: f26 buildorder: 4 perl-Module-Metadata: rationale: build dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-Module-Metadata cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-Module-Metadata ref: f26 buildorder: 4 perl-Module-Runtime: rationale: build dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-Module-Runtime cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-Module-Runtime ref: f26 buildorder: 7 perl-Net-IDN-Encode: rationale: build dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-Net-IDN-Encode cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-Net-IDN-Encode ref: f26 buildorder: 7 perl-Net-LibIDN: rationale: build dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-Net-LibIDN cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-Net-LibIDN ref: f26 buildorder: 4 perl-Net-SSLeay: rationale: build dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-Net-SSLeay cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-Net-SSLeay ref: f26 buildorder: 6 perl-Number-Compare: rationale: build dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-Number-Compare cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-Number-Compare ref: f26 buildorder: 4 perl-Package-Generator: rationale: build dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-Package-Generator cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-Package-Generator ref: f26 buildorder: 5 perl-Params-Check: rationale: build dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-Params-Check cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-Params-Check ref: f26 buildorder: 4 perl-Params-Util: rationale: build dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-Params-Util cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-Params-Util ref: f26 buildorder: 4 perl-PathTools: rationale: build dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-PathTools cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-PathTools ref: f26 buildorder: 4 perl-Perl-OSType: rationale: build dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-Perl-OSType cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-Perl-OSType ref: f26 buildorder: 4 perl-Perl-Version: rationale: build dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-Perl-Version cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-Perl-Version ref: f26 buildorder: 7 perl-PerlIO-utf8_strict: rationale: build dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-PerlIO-utf8_strict cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-PerlIO-utf8_strict ref: f26 buildorder: 6 perl-PerlIO-via-QuotedPrint: rationale: build dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-PerlIO-via-QuotedPrint cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-PerlIO-via-QuotedPrint ref: f26 buildorder: 4 perl-Pod-Checker: rationale: build dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-Pod-Checker cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-Pod-Checker ref: f26 buildorder: 4 perl-Pod-Coverage: rationale: build dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-Pod-Coverage cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-Pod-Coverage ref: f26 buildorder: 5 perl-Pod-Coverage-TrustPod: rationale: build dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-Pod-Coverage-TrustPod cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-Pod-Coverage-TrustPod ref: f26 buildorder: 9 perl-Pod-Escapes: rationale: build dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-Pod-Escapes cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-Pod-Escapes ref: f26 buildorder: 4 perl-Pod-Eventual: rationale: build dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-Pod-Eventual cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-Pod-Eventual ref: f26 buildorder: 8 perl-Pod-Parser: rationale: build dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-Pod-Parser cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-Pod-Parser ref: f26 buildorder: 4 perl-Pod-Perldoc: rationale: build dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-Pod-Perldoc cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-Pod-Perldoc ref: f26 buildorder: 4 perl-Pod-Simple: rationale: build dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-Pod-Simple cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-Pod-Simple ref: f26 buildorder: 4 perl-Pod-Usage: rationale: build dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-Pod-Usage cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-Pod-Usage ref: f26 buildorder: 4 perl-SUPER: rationale: build dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-SUPER cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-SUPER ref: f26 buildorder: 6 perl-Scalar-List-Utils: rationale: build dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-Scalar-List-Utils cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-Scalar-List-Utils ref: f26 buildorder: 4 perl-Socket: rationale: build dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-Socket cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-Socket ref: f26 buildorder: 4 perl-Socket6: rationale: build dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-Socket6 cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-Socket6 ref: f26 buildorder: 4 perl-Software-License: rationale: build dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-Software-License cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-Software-License ref: f26 buildorder: 12 perl-Sort-Versions: rationale: build dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-Sort-Versions cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-Sort-Versions ref: f26 buildorder: 4 perl-Storable: rationale: build dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-Storable cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-Storable ref: f26 buildorder: 4 perl-Sub-Exporter: rationale: build dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-Sub-Exporter cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-Sub-Exporter ref: f26 buildorder: 6 perl-Sub-Identify: rationale: build dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-Sub-Identify cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-Sub-Identify ref: f26 buildorder: 5 perl-Sub-Install: rationale: build dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-Sub-Install cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-Sub-Install ref: f26 buildorder: 4 perl-Sub-Uplevel: rationale: build dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-Sub-Uplevel cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-Sub-Uplevel ref: f26 buildorder: 4 perl-Sys-Syslog: rationale: build dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-Sys-Syslog cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-Sys-Syslog ref: f26 buildorder: 4 perl-Term-ANSIColor: rationale: build dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-Term-ANSIColor cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-Term-ANSIColor ref: f26 buildorder: 5 perl-Term-Cap: rationale: build dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-Term-Cap cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-Term-Cap ref: f26 buildorder: 4 perl-TermReadKey: rationale: build dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-TermReadKey cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-TermReadKey ref: f26 buildorder: 4 perl-Test-CPAN-Meta: rationale: build dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-Test-CPAN-Meta cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-Test-CPAN-Meta ref: f26 buildorder: 7 perl-Test-Deep: rationale: build dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-Test-Deep cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-Test-Deep ref: f26 buildorder: 4 perl-Test-Exception: rationale: build dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-Test-Exception cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-Test-Exception ref: f26 buildorder: 5 perl-Test-FailWarnings: rationale: build dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-Test-FailWarnings cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-Test-FailWarnings ref: f26 buildorder: 5 perl-Test-Harness: rationale: build dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-Test-Harness cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-Test-Harness ref: f26 buildorder: 4 perl-Test-MockModule: rationale: build dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-Test-MockModule cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-Test-MockModule ref: f26 buildorder: 7 perl-Test-NoWarnings: rationale: build dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-Test-NoWarnings cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-Test-NoWarnings ref: f26 buildorder: 5 perl-Test-Output: rationale: build dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-Test-Output cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-Test-Output ref: f26 buildorder: 7 perl-Test-Pod: rationale: build dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-Test-Pod cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-Test-Pod ref: f26 buildorder: 4 perl-Test-Pod-Coverage: rationale: build dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-Test-Pod-Coverage cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-Test-Pod-Coverage ref: f26 buildorder: 6 perl-Test-Portability-Files: rationale: build dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-Test-Portability-Files cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-Test-Portability-Files ref: f26 buildorder: 4 perl-Test-Simple: rationale: build dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-Test-Simple cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-Test-Simple ref: f26 buildorder: 4 perl-Test-Taint: rationale: build dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-Test-Taint cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-Test-Taint ref: f26 buildorder: 7 perl-Test-TrailingSpace: rationale: build dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-Test-TrailingSpace cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-Test-TrailingSpace ref: f26 buildorder: 7 perl-Test-Version: rationale: build dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-Test-Version cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-Test-Version ref: f26 buildorder: 7 perl-Test-Warn: rationale: build dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-Test-Warn cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-Test-Warn ref: f26 buildorder: 5 perl-Text-Balanced: rationale: build dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-Text-Balanced cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-Text-Balanced ref: f26 buildorder: 4 perl-Text-Diff: rationale: build dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-Text-Diff cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-Text-Diff ref: f26 buildorder: 5 perl-Text-Glob: rationale: build dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-Text-Glob cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-Text-Glob ref: f26 buildorder: 4 perl-Text-Levenshtein-Damerau-XS: rationale: build dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-Text-Levenshtein-Damerau-XS cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-Text-Levenshtein-Damerau-XS ref: f26 buildorder: 4 perl-Text-ParseWords: rationale: build dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-Text-ParseWords cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-Text-ParseWords ref: f26 buildorder: 4 perl-Text-Tabs+Wrap: rationale: build dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-Text-Tabs+Wrap cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-Text-Tabs+Wrap ref: f26 buildorder: 4 perl-Text-Template: rationale: build dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-Text-Template cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-Text-Template ref: f26 buildorder: 4 perl-Thread-Queue: rationale: build dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-Thread-Queue cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-Thread-Queue ref: f26 buildorder: 4 perl-Tie-IxHash: rationale: build dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-Tie-IxHash cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-Tie-IxHash ref: f26 buildorder: 4 perl-Time-HiRes: rationale: build dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-Time-HiRes cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-Time-HiRes ref: f26 buildorder: 4 perl-Time-Local: rationale: build dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-Time-Local cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-Time-Local ref: f26 buildorder: 4 perl-TimeDate: rationale: build dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-TimeDate cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-TimeDate ref: f26 buildorder: 4 perl-Try-Tiny: rationale: build dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-Try-Tiny cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-Try-Tiny ref: f26 buildorder: 11 perl-URI: rationale: build dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-URI cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-URI ref: f26 buildorder: 4 perl-Unicode-Collate: rationale: build dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-Unicode-Collate cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-Unicode-Collate ref: f26 buildorder: 4 perl-Unicode-Normalize: rationale: build dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-Unicode-Normalize cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-Unicode-Normalize ref: f26 buildorder: 4 perl-YAML: rationale: build dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-YAML cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-YAML ref: f26 buildorder: 4 perl-YAML-Syck: rationale: build dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-YAML-Syck cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-YAML-Syck ref: f26 buildorder: 8 perl-accessors: rationale: build dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-accessors cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-accessors ref: f26 buildorder: 6 perl-autodie: rationale: build dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-autodie cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-autodie ref: f26 buildorder: 4 perl-bignum: rationale: build dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-bignum cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-bignum ref: f26 buildorder: 5 perl-constant: rationale: build dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-constant cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-constant ref: f26 buildorder: 4 perl-experimental: rationale: build dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-experimental cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-experimental ref: f26 buildorder: 4 perl-generators: rationale: RPM dependency generator. repository: git://pkgs.fedoraproject.org/rpms/perl-generators cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-generators ref: f26 buildorder: 3 perl-inc-latest: rationale: build dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-inc-latest cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-inc-latest ref: f26 buildorder: 4 perl-libnet: rationale: build dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-libnet cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-libnet ref: f26 buildorder: 4 perl-local-lib: rationale: build dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-local-lib cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-local-lib ref: f26 buildorder: 6 perl-parent: rationale: build dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-parent cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-parent ref: f26 buildorder: 4 perl-perlfaq: rationale: build dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-perlfaq cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-perlfaq ref: f26 buildorder: 4 perl-podlators: rationale: build dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-podlators cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-podlators ref: f26 buildorder: 4 perl-threads: rationale: build dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-threads cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-threads ref: f26 buildorder: 4 perl-threads-shared: rationale: build dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-threads-shared cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-threads-shared ref: f26 buildorder: 4 perl-version: rationale: build dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-version cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-version ref: f26 buildorder: 4 artifacts: rpms: - perl-4:5.24.4-397.module_1677+5adff7e0.x86_64 - perl-Algorithm-Diff-0:1.1903-6.module_1677+5adff7e0.noarch - perl-Archive-Tar-0:2.04-397.module_1677+5adff7e0.noarch - perl-Archive-Tar-0:2.26-1.module_1677+5adff7e0.noarch - perl-Archive-Zip-0:1.59-3.module_1677+5adff7e0.noarch - perl-Attribute-Handlers-0:0.99-397.module_1677+5adff7e0.noarch - perl-Authen-SASL-0:2.16-9.module_1677+5adff7e0.noarch - perl-B-Debug-0:1.23-397.module_1677+5adff7e0.noarch - perl-B-Debug-0:1.24-2.module_1677+5adff7e0.noarch - perl-BSD-Resource-0:1.291.100-1.module_1677+5adff7e0.x86_64 - perl-CGI-0:4.36-1.module_1677+5adff7e0.noarch - perl-CPAN-0:2.11-397.module_1677+5adff7e0.noarch - perl-CPAN-0:2.16-1.module_1677+5adff7e0.noarch - perl-CPAN-Meta-0:2.150005-397.module_1677+5adff7e0.noarch - perl-CPAN-Meta-0:2.150010-2.module_1677+5adff7e0.noarch - perl-CPAN-Meta-Check-0:0.014-2.module_1677+5adff7e0.noarch - perl-CPAN-Meta-Requirements-0:2.132-397.module_1677+5adff7e0.noarch - perl-CPAN-Meta-Requirements-0:2.140-7.module_1677+5adff7e0.noarch - perl-CPAN-Meta-YAML-0:0.018-367.module_1677+5adff7e0.noarch - perl-CPAN-Meta-YAML-0:0.018-397.module_1677+5adff7e0.noarch - perl-Capture-Tiny-0:0.46-1.module_1677+5adff7e0.noarch - perl-Carp-0:1.40-366.module_1677+5adff7e0.noarch - perl-Carp-0:1.40-397.module_1677+5adff7e0.noarch - perl-Class-XSAccessor-0:1.19-10.module_1677+5adff7e0.x86_64 - perl-Compress-Bzip2-0:2.26-1.module_1677+5adff7e0.x86_64 - perl-Compress-Raw-Bzip2-0:2.069-397.module_1677+5adff7e0.x86_64 - perl-Compress-Raw-Bzip2-0:2.074-1.module_1677+5adff7e0.x86_64 - perl-Compress-Raw-Zlib-0:2.069-397.module_1677+5adff7e0.x86_64 - perl-Compress-Raw-Zlib-0:2.074-1.module_1677+5adff7e0.x86_64 - perl-Config-Perl-V-0:0.25-397.module_1677+5adff7e0.noarch - perl-Config-Perl-V-0:0.27-2.module_1677+5adff7e0.noarch - perl-DB_File-0:1.835-397.module_1677+5adff7e0.x86_64 - perl-DB_File-0:1.841-1.module_1677+5adff7e0.x86_64 - perl-Data-Dumper-0:2.160-397.module_1677+5adff7e0.x86_64 - perl-Data-Dumper-0:2.161-4.module_1677+5adff7e0.x86_64 - perl-Data-OptList-0:0.110-3.module_1677+5adff7e0.noarch - perl-Data-Section-0:0.200006-8.module_1677+5adff7e0.noarch - perl-Devel-Leak-0:0.03-32.module_1677+5adff7e0.x86_64 - perl-Devel-PPPort-0:3.32-397.module_1677+5adff7e0.x86_64 - perl-Devel-PPPort-0:3.36-1.module_1677+5adff7e0.x86_64 - perl-Devel-Peek-0:1.23-397.module_1677+5adff7e0.x86_64 - perl-Devel-SelfStubber-0:1.05-397.module_1677+5adff7e0.noarch - perl-Devel-Size-0:0.81-1.module_1677+5adff7e0.x86_64 - perl-Devel-StackTrace-1:2.03-1.module_1677+5adff7e0.noarch - perl-Devel-Symdump-1:2.18-1.module_1677+5adff7e0.noarch - perl-Digest-0:1.17-367.module_1677+5adff7e0.noarch - perl-Digest-0:1.17-397.module_1677+5adff7e0.noarch - perl-Digest-HMAC-0:1.03-14.module_1677+5adff7e0.noarch - perl-Digest-MD5-0:2.54-397.module_1677+5adff7e0.x86_64 - perl-Digest-MD5-0:2.55-3.module_1677+5adff7e0.x86_64 - perl-Digest-SHA-1:5.95-397.module_1677+5adff7e0.x86_64 - perl-Digest-SHA-1:6.01-1.module_1677+5adff7e0.x86_64 - perl-Digest-SHA1-0:2.13-19.module_1677+5adff7e0.x86_64 - perl-Encode-4:2.80-397.module_1677+5adff7e0.x86_64 - perl-Encode-4:2.88-6.module_1677+5adff7e0.x86_64 - perl-Encode-Locale-0:1.05-6.module_1677+5adff7e0.noarch - perl-Encode-devel-4:2.80-397.module_1677+5adff7e0.noarch - perl-Encode-devel-4:2.88-6.module_1677+5adff7e0.x86_64 - perl-Env-0:1.04-366.module_1677+5adff7e0.noarch - perl-Env-0:1.04-397.module_1677+5adff7e0.noarch - perl-Errno-0:1.25-397.module_1677+5adff7e0.x86_64 - perl-Expect-0:1.35-1.module_1677+5adff7e0.noarch - perl-Exporter-0:5.72-367.module_1677+5adff7e0.noarch - perl-Exporter-0:5.72-397.module_1677+5adff7e0.noarch - perl-ExtUtils-CBuilder-1:0.280225-366.module_1677+5adff7e0.noarch - perl-ExtUtils-CBuilder-1:0.280225-397.module_1677+5adff7e0.noarch - perl-ExtUtils-Command-0:7.10-397.module_1677+5adff7e0.noarch - perl-ExtUtils-Command-0:7.24-3.module_1677+5adff7e0.noarch - perl-ExtUtils-Embed-0:1.33-397.module_1677+5adff7e0.noarch - perl-ExtUtils-Install-0:2.04-367.module_1677+5adff7e0.noarch - perl-ExtUtils-Install-0:2.04-397.module_1677+5adff7e0.noarch - perl-ExtUtils-MM-Utils-0:7.11-397.module_1677+5adff7e0.noarch - perl-ExtUtils-MM-Utils-0:7.24-3.module_1677+5adff7e0.noarch - perl-ExtUtils-MakeMaker-0:7.10-397.module_1677+5adff7e0.noarch - perl-ExtUtils-MakeMaker-0:7.24-3.module_1677+5adff7e0.noarch - perl-ExtUtils-Manifest-0:1.70-366.module_1677+5adff7e0.noarch - perl-ExtUtils-Manifest-0:1.70-397.module_1677+5adff7e0.noarch - perl-ExtUtils-Miniperl-0:1.05-397.module_1677+5adff7e0.noarch - perl-ExtUtils-ParseXS-1:3.31-368.module_1677+5adff7e0.noarch - perl-ExtUtils-ParseXS-1:3.31-397.module_1677+5adff7e0.noarch - perl-Fedora-VSP-0:0.001-5.module_1677+5adff7e0.noarch - perl-File-Fetch-0:0.48-397.module_1677+5adff7e0.noarch - perl-File-Fetch-0:0.56-1.module_1677+5adff7e0.noarch - perl-File-Find-Object-0:0.3.2-2.module_1677+5adff7e0.noarch - perl-File-Find-Object-Rule-0:0.0306-2.module_1677+5adff7e0.noarch - perl-File-Find-Rule-0:0.34-5.module_1677+5adff7e0.noarch - perl-File-Find-Rule-Perl-0:1.15-7.module_1677+5adff7e0.noarch - perl-File-HomeDir-0:1.00-13.module_1677+5adff7e0.noarch - perl-File-Path-0:2.12-367.module_1677+5adff7e0.noarch - perl-File-Path-0:2.12-397.module_1677+5adff7e0.noarch - perl-File-Slurp-Tiny-0:0.004-4.module_1677+5adff7e0.noarch - perl-File-Temp-0:0.230.400-2.module_1677+5adff7e0.noarch - perl-File-Temp-0:0.230.400-397.module_1677+5adff7e0.noarch - perl-File-Which-0:1.21-3.module_1677+5adff7e0.noarch - perl-Filter-2:1.55-397.module_1677+5adff7e0.x86_64 - perl-Filter-2:1.58-1.module_1677+5adff7e0.x86_64 - perl-Filter-Simple-0:0.92-366.module_1677+5adff7e0.noarch - perl-Filter-Simple-0:0.92-397.module_1677+5adff7e0.noarch - perl-GSSAPI-0:0.28-18.module_1677+5adff7e0.x86_64 - perl-Getopt-Long-0:2.48-397.module_1677+5adff7e0.noarch - perl-Getopt-Long-0:2.49.1-2.module_1677+5adff7e0.noarch - perl-HTML-Parser-0:3.72-5.module_1677+5adff7e0.x86_64 - perl-HTML-Parser-tests-0:3.72-5.module_1677+5adff7e0.x86_64 - perl-HTML-Tagset-0:3.20-28.module_1677+5adff7e0.noarch - perl-HTTP-Date-0:6.02-15.module_1677+5adff7e0.noarch - perl-HTTP-Message-0:6.11-4.module_1677+5adff7e0.noarch - perl-HTTP-Tiny-0:0.056-397.module_1677+5adff7e0.noarch - perl-HTTP-Tiny-0:0.070-2.module_1677+5adff7e0.noarch - perl-IO-0:1.36-397.module_1677+5adff7e0.x86_64 - perl-IO-Compress-0:2.069-397.module_1677+5adff7e0.noarch - perl-IO-Compress-0:2.074-1.module_1677+5adff7e0.noarch - perl-IO-HTML-0:1.001-7.module_1677+5adff7e0.noarch - perl-IO-Socket-INET6-0:2.72-9.module_1677+5adff7e0.noarch - perl-IO-Socket-IP-0:0.37-397.module_1677+5adff7e0.noarch - perl-IO-Socket-IP-0:0.39-1.module_1677+5adff7e0.noarch - perl-IO-Socket-SSL-0:2.049-1.module_1677+5adff7e0.noarch - perl-IO-String-0:1.08-28.module_1677+5adff7e0.noarch - perl-IO-Tty-0:1.12-7.module_1677+5adff7e0.x86_64 - perl-IO-Zlib-1:1.10-397.module_1677+5adff7e0.noarch - perl-IPC-Cmd-1:0.92-397.module_1677+5adff7e0.noarch - perl-IPC-Cmd-1:0.98-1.module_1677+5adff7e0.noarch - perl-IPC-Run-0:0.96-1.module_1677+5adff7e0.noarch - perl-IPC-SysV-0:2.06-397.module_1677+5adff7e0.x86_64 - perl-IPC-SysV-0:2.07-4.module_1677+5adff7e0.x86_64 - perl-IPC-System-Simple-0:1.25-12.module_1677+5adff7e0.noarch - perl-Import-Into-0:1.002005-4.module_1677+5adff7e0.noarch - perl-JSON-0:2.90-8.module_1677+5adff7e0.noarch - perl-JSON-PP-0:2.27300-397.module_1677+5adff7e0.noarch - perl-JSON-PP-0:2.94000-1.module_1677+5adff7e0.noarch - perl-JSON-tests-0:2.90-8.module_1677+5adff7e0.noarch - perl-LWP-MediaTypes-0:6.02-11.module_1677+5adff7e0.noarch - perl-Locale-Codes-0:3.25-397.module_1677+5adff7e0.noarch - perl-Locale-Codes-0:3.42-2.module_1677+5adff7e0.noarch - perl-Locale-Maketext-0:1.26-397.module_1677+5adff7e0.noarch - perl-Locale-Maketext-0:1.28-2.module_1677+5adff7e0.noarch - perl-Locale-Maketext-Simple-1:0.21-397.module_1677+5adff7e0.noarch - perl-MIME-Base64-0:3.15-366.module_1677+5adff7e0.x86_64 - perl-MIME-Base64-0:3.15-397.module_1677+5adff7e0.x86_64 - perl-MRO-Compat-0:0.13-1.module_1677+5adff7e0.noarch - perl-Math-BigInt-0:1.9997.15-397.module_1677+5adff7e0.noarch - perl-Math-BigInt-0:1.9998.11-1.module_1677+5adff7e0.noarch - perl-Math-BigInt-FastCalc-0:0.400-397.module_1677+5adff7e0.x86_64 - perl-Math-BigInt-FastCalc-0:0.500.600-2.module_1677+5adff7e0.x86_64 - perl-Math-BigRat-0:0.2608.02-397.module_1677+5adff7e0.noarch - perl-Math-BigRat-0:0.2613-1.module_1677+5adff7e0.noarch - perl-Math-Complex-0:1.59-397.module_1677+5adff7e0.noarch - perl-Memoize-0:1.03-397.module_1677+5adff7e0.noarch - perl-Mixin-Linewise-0:0.108-6.module_1677+5adff7e0.noarch - perl-Module-Build-2:0.42.24-1.module_1677+5adff7e0.noarch - perl-Module-CoreList-1:5.20180414-1.module_1677+5adff7e0.noarch - perl-Module-CoreList-1:5.20180414-397.module_1677+5adff7e0.noarch - perl-Module-CoreList-tools-1:5.20180414-1.module_1677+5adff7e0.noarch - perl-Module-CoreList-tools-1:5.20180414-397.module_1677+5adff7e0.noarch - perl-Module-Load-1:0.32-366.module_1677+5adff7e0.noarch - perl-Module-Load-1:0.32-397.module_1677+5adff7e0.noarch - perl-Module-Load-Conditional-0:0.64-397.module_1677+5adff7e0.noarch - perl-Module-Load-Conditional-0:0.68-2.module_1677+5adff7e0.noarch - perl-Module-Loaded-1:0.08-397.module_1677+5adff7e0.noarch - perl-Module-Metadata-0:1.000031-397.module_1677+5adff7e0.noarch - perl-Module-Metadata-0:1.000033-2.module_1677+5adff7e0.noarch - perl-Module-Runtime-0:0.015-1.module_1677+5adff7e0.noarch - perl-Net-IDN-Encode-0:2.400-2.module_1677+5adff7e0.x86_64 - perl-Net-LibIDN-0:0.12-25.module_1677+5adff7e0.x86_64 - perl-Net-Ping-0:2.43-397.module_1677+5adff7e0.noarch - perl-Net-SSLeay-0:1.81-1.module_1677+5adff7e0.x86_64 - perl-Number-Compare-0:0.03-16.module_1677+5adff7e0.noarch - perl-Package-Generator-0:1.106-8.module_1677+5adff7e0.noarch - perl-Params-Check-1:0.38-366.module_1677+5adff7e0.noarch - perl-Params-Check-1:0.38-397.module_1677+5adff7e0.noarch - perl-Params-Util-0:1.07-17.module_1677+5adff7e0.x86_64 - perl-Parse-CPAN-Meta-1:1.4417-397.module_1677+5adff7e0.noarch - perl-PathTools-0:3.63-367.module_1677+5adff7e0.x86_64 - perl-PathTools-0:3.63-397.module_1677+5adff7e0.x86_64 - perl-Perl-OSType-0:1.009-397.module_1677+5adff7e0.noarch - perl-Perl-OSType-0:1.010-4.module_1677+5adff7e0.noarch - perl-Perl-Version-0:1.013-6.module_1677+5adff7e0.noarch - perl-PerlIO-utf8_strict-0:0.007-1.module_1677+5adff7e0.x86_64 - perl-PerlIO-via-QuotedPrint-0:0.08-366.module_1677+5adff7e0.noarch - perl-PerlIO-via-QuotedPrint-0:0.08-397.module_1677+5adff7e0.noarch - perl-Pod-Checker-4:1.60-397.module_1677+5adff7e0.noarch - perl-Pod-Checker-4:1.73-2.module_1677+5adff7e0.noarch - perl-Pod-Coverage-0:0.23-11.module_1677+5adff7e0.noarch - perl-Pod-Coverage-TrustPod-0:0.100003-6.module_1677+5adff7e0.noarch - perl-Pod-Escapes-1:1.07-366.module_1677+5adff7e0.noarch - perl-Pod-Escapes-1:1.07-397.module_1677+5adff7e0.noarch - perl-Pod-Eventual-0:0.094001-6.module_1677+5adff7e0.noarch - perl-Pod-Html-0:1.22.01-397.module_1677+5adff7e0.noarch - perl-Pod-Parser-0:1.63-367.module_1677+5adff7e0.noarch - perl-Pod-Parser-0:1.63-397.module_1677+5adff7e0.noarch - perl-Pod-Perldoc-0:3.25-397.module_1677+5adff7e0.noarch - perl-Pod-Perldoc-0:3.28-2.module_1677+5adff7e0.noarch - perl-Pod-Simple-1:3.32-397.module_1677+5adff7e0.noarch - perl-Pod-Simple-1:3.35-2.module_1677+5adff7e0.noarch - perl-Pod-Usage-4:1.68-397.module_1677+5adff7e0.noarch - perl-Pod-Usage-4:1.69-2.module_1677+5adff7e0.noarch - perl-SUPER-0:1.20141117-7.module_1677+5adff7e0.noarch - perl-Scalar-List-Utils-3:1.42-397.module_1677+5adff7e0.x86_64 - perl-Scalar-List-Utils-3:1.48-1.module_1677+5adff7e0.x86_64 - perl-SelfLoader-0:1.23-397.module_1677+5adff7e0.noarch - perl-Socket-4:2.020-397.module_1677+5adff7e0.x86_64 - perl-Socket-4:2.027-1.module_1677+5adff7e0.x86_64 - perl-Socket6-0:0.28-2.module_1677+5adff7e0.x86_64 - perl-Software-License-0:0.103012-4.module_1677+5adff7e0.noarch - perl-Sort-Versions-0:1.62-5.module_1677+5adff7e0.noarch - perl-Storable-1:2.56-368.module_1677+5adff7e0.x86_64 - perl-Storable-1:2.56-397.module_1677+5adff7e0.x86_64 - perl-Sub-Exporter-0:0.987-11.module_1677+5adff7e0.noarch - perl-Sub-Identify-0:0.14-1.module_1677+5adff7e0.x86_64 - perl-Sub-Install-0:0.928-10.module_1677+5adff7e0.noarch - perl-Sub-Uplevel-1:0.2800-1.module_1677+5adff7e0.noarch - perl-Sys-Syslog-0:0.33-397.module_1677+5adff7e0.x86_64 - perl-Sys-Syslog-0:0.35-2.module_1677+5adff7e0.x86_64 - perl-Term-ANSIColor-0:4.04-397.module_1677+5adff7e0.noarch - perl-Term-ANSIColor-0:4.06-2.module_1677+5adff7e0.noarch - perl-Term-Cap-0:1.17-366.module_1677+5adff7e0.noarch - perl-Term-Cap-0:1.17-397.module_1677+5adff7e0.noarch - perl-TermReadKey-0:2.37-2.module_1677+5adff7e0.x86_64 - perl-Test-0:1.28-397.module_1677+5adff7e0.noarch - perl-Test-CPAN-Meta-0:0.25-8.module_1677+5adff7e0.noarch - perl-Test-Deep-0:1.127-1.module_1677+5adff7e0.noarch - perl-Test-Exception-0:0.43-4.module_1677+5adff7e0.noarch - perl-Test-FailWarnings-0:0.008-9.module_1677+5adff7e0.noarch - perl-Test-Harness-0:3.36-397.module_1677+5adff7e0.noarch - perl-Test-Harness-0:3.42-1.module_1677+5adff7e0.noarch - perl-Test-MockModule-0:0.11-4.module_1677+5adff7e0.noarch - perl-Test-NoWarnings-0:1.04-11.module_1677+5adff7e0.noarch - perl-Test-Output-0:1.03-8.module_1677+5adff7e0.noarch - perl-Test-Pod-0:1.51-5.module_1677+5adff7e0.noarch - perl-Test-Pod-Coverage-0:1.10-7.module_1677+5adff7e0.noarch - perl-Test-Portability-Files-0:0.07-2.module_1677+5adff7e0.noarch - perl-Test-Simple-0:1.001014-397.module_1677+5adff7e0.noarch - perl-Test-Simple-1:1.302086-1.module_1677+5adff7e0.noarch - perl-Test-Taint-0:1.06-15.module_1677+5adff7e0.x86_64 - perl-Test-TrailingSpace-0:0.0301-2.module_1677+5adff7e0.noarch - perl-Test-Version-0:2.05-2.module_1677+5adff7e0.noarch - perl-Test-Warn-0:0.32-2.module_1677+5adff7e0.noarch - perl-Text-Balanced-0:2.03-366.module_1677+5adff7e0.noarch - perl-Text-Balanced-0:2.03-397.module_1677+5adff7e0.noarch - perl-Text-Diff-0:1.44-3.module_1677+5adff7e0.noarch - perl-Text-Glob-0:0.11-1.module_1677+5adff7e0.noarch - perl-Text-Levenshtein-Damerau-XS-0:3.2-1.module_1677+5adff7e0.x86_64 - perl-Text-ParseWords-0:3.30-366.module_1677+5adff7e0.noarch - perl-Text-ParseWords-0:3.30-397.module_1677+5adff7e0.noarch - perl-Text-Tabs+Wrap-0:2013.0523-366.module_1677+5adff7e0.noarch - perl-Text-Tabs+Wrap-0:2013.0523-397.module_1677+5adff7e0.noarch - perl-Text-Template-0:1.47-1.module_1677+5adff7e0.noarch - perl-Thread-Queue-0:3.09-397.module_1677+5adff7e0.noarch - perl-Thread-Queue-0:3.12-1.module_1677+5adff7e0.noarch - perl-Tie-IxHash-0:1.23-8.module_1677+5adff7e0.noarch - perl-Time-HiRes-0:1.9741-397.module_1677+5adff7e0.x86_64 - perl-Time-HiRes-0:1.9753-1.module_1677+5adff7e0.x86_64 - perl-Time-Local-0:1.2300-397.module_1677+5adff7e0.noarch - perl-Time-Local-1:1.250-2.module_1677+5adff7e0.noarch - perl-Time-Piece-0:1.31-397.module_1677+5adff7e0.x86_64 - perl-TimeDate-1:2.30-10.module_1677+5adff7e0.noarch - perl-Try-Tiny-0:0.28-2.module_1677+5adff7e0.noarch - perl-URI-0:1.71-6.module_1677+5adff7e0.noarch - perl-Unicode-Collate-0:1.14-397.module_1677+5adff7e0.x86_64 - perl-Unicode-Collate-0:1.20-1.module_1677+5adff7e0.x86_64 - perl-Unicode-Normalize-0:1.25-366.module_1677+5adff7e0.x86_64 - perl-Unicode-Normalize-0:1.25-397.module_1677+5adff7e0.x86_64 - perl-YAML-0:1.23-1.module_1677+5adff7e0.noarch - perl-YAML-Syck-0:1.30-1.module_1677+5adff7e0.x86_64 - perl-accessors-0:1.01-21.module_1677+5adff7e0.noarch - perl-autodie-0:2.29-367.module_1677+5adff7e0.noarch - perl-autodie-0:2.29-397.module_1677+5adff7e0.noarch - perl-bignum-0:0.42-397.module_1677+5adff7e0.noarch - perl-bignum-0:0.49-1.module_1677+5adff7e0.noarch - perl-constant-0:1.33-368.module_1677+5adff7e0.noarch - perl-constant-0:1.33-397.module_1677+5adff7e0.noarch - perl-core-0:5.24.4-397.module_1677+5adff7e0.x86_64 - perl-devel-4:5.24.4-397.module_1677+5adff7e0.x86_64 - perl-encoding-4:2.17-397.module_1677+5adff7e0.x86_64 - perl-encoding-4:2.19-6.module_1677+5adff7e0.x86_64 - perl-experimental-0:0.016-397.module_1677+5adff7e0.noarch - perl-experimental-0:0.019-1.module_1677+5adff7e0.noarch - perl-generators-0:1.10-2.module_1677+5adff7e0.noarch - perl-homedir-0:2.000023-1.module_1677+5adff7e0.noarch - perl-inc-latest-2:0.500-6.module_1677+5adff7e0.noarch - perl-libnet-0:3.08-397.module_1677+5adff7e0.noarch - perl-libnet-0:3.11-1.module_1677+5adff7e0.noarch - perl-libnetcfg-4:5.24.4-397.module_1677+5adff7e0.noarch - perl-libs-4:5.24.4-397.module_1677+5adff7e0.x86_64 - perl-local-lib-0:2.000023-1.module_1677+5adff7e0.noarch - perl-macros-4:5.24.4-397.module_1677+5adff7e0.x86_64 - perl-open-0:1.10-397.module_1677+5adff7e0.noarch - perl-parent-1:0.234-397.module_1677+5adff7e0.noarch - perl-parent-1:0.236-2.module_1677+5adff7e0.noarch - perl-perlfaq-0:5.021010-397.module_1677+5adff7e0.noarch - perl-perlfaq-0:5.021011-3.module_1677+5adff7e0.noarch - perl-podlators-0:4.07-397.module_1677+5adff7e0.noarch - perl-podlators-0:4.09-3.module_1677+5adff7e0.noarch - perl-tests-4:5.24.4-397.module_1677+5adff7e0.x86_64 - perl-threads-1:2.07-397.module_1677+5adff7e0.x86_64 - perl-threads-1:2.21-1.module_1677+5adff7e0.x86_64 - perl-threads-shared-0:1.51-397.module_1677+5adff7e0.x86_64 - perl-threads-shared-0:1.58-1.module_1677+5adff7e0.x86_64 - perl-utils-0:5.24.4-397.module_1677+5adff7e0.noarch - perl-version-5:0.99.16-397.module_1677+5adff7e0.noarch - perl-version-5:0.99.18-1.module_1677+5adff7e0.x86_64 ... --- document: modulemd version: 2 data: name: perl stream: 5.26 version: 20180417112647 context: ccbeb30a arch: x86_64 summary: Practical Extraction and Report Language description: > Perl is a high-level programming language with roots in C, sed, awk and shell scripting. Perl is good at handling processes and files, and is especially good at handling text. Perl's hallmarks are practicality and efficiency. While it is used to do a lot of different things, Perl's most common applications are system administration utilities and web programming. license: module: - MIT content: - MIT xmd: mbs: mse: TRUE scmurl: https://src.fedoraproject.org/modules/perl.git?#b7ea70e535667def6fb4258d744d47a0f0972661 commit: b7ea70e535667def6fb4258d744d47a0f0972661 buildrequires: perl-bootstrap: ref: 22773d9e44948febd267fc7b94e169b1c7e81f73 stream: 5.26 context: 6c81f848 version: 20180417064707 filtered_rpms: [] platform: ref: f29 stream: f29 context: 00000000 version: 4 filtered_rpms: [] rpms: perl-Text-Diff: ref: 435597b4b8f23cdb4b5d08a83526f3a0ba180ba4 perl-Text-Balanced: ref: 8c14f0f727543b80dc9cacba0422bcc1653d0290 perl-File-Fetch: ref: 7e786fd7e77fd794553f84ff29dc777cd9f73ca2 perl: ref: feb15b2a5274ffede0261170972b96d61acc9b38 perl-Math-BigRat: ref: 8d926e35aeb4d768c2a9e9c9f2d24e36202b8e2d perl-Math-BigInt-FastCalc: ref: fd294a4d494055cd4f3f7e22f0f0c361162dedfa perl-Locale-Maketext: ref: 6dd172c644c44c07b1613b0870a119ee5e6d4116 perl-Algorithm-Diff: ref: b572ed3bbdd7421c4ec31da90602f12f7a8c951c perl-PathTools: ref: a0ed8e15339741624d99094a261ecef2f2bef816 perl-IPC-System-Simple: ref: 5b4319c5aabf7945208163c339c112b68b40d36a perl-CPAN-Meta-Requirements: ref: f25cbf2508f08dcb618b5e097cda6023aea94101 perl-Compress-Bzip2: ref: 4ca6f6001d529639ad9af34f6a4829371ed7c88c perl-IO-Compress: ref: bb10d2103bf534e10a4a1d1bc987a4314cb5de48 perl-threads-shared: ref: 236010203776860d682ee2e6d37529e8e4aaa90a perl-autodie: ref: 08926569224919ffa066397ca80c5b1818a89e90 perl-constant: ref: bce81fc9c982eeee92490116718ab9ed652eb0e7 perl-bignum: ref: e1753ef99cc972644a0a217e676467b8fd5d5788 perl-Params-Check: ref: 94989a67e37e22221a55b1d39dfb9f804122f928 perl-Archive-Zip: ref: 6270e0a0fe7c56198441d0e8757500f56a4a54a2 perl-Math-BigInt: ref: 76c86fadeda569a2ebd6439f12e7f69f74c8df67 perl-podlators: ref: 49c1364c8485ff979a2ccded759739a47e164836 perl-ExtUtils-Manifest: ref: f1169d7bb27bfb1b2db567be1f0ff112a9069246 perl-Compress-Raw-Zlib: ref: c9d37e07af93fe0a5e4886536b27f016260074ca perl-local-lib: ref: 0716ed7be631222c11ec33672373662daa6b00bf perl-libnet: ref: 8799d71bc96c9db7a72658edcd27f9f21b260f71 perl-B-Debug: ref: 5a7c0b7619476154ff3129fe449afabb1b450279 perl-Config-Perl-V: ref: 8d5189f0c6816a5ff74a20ba7426d3964aa626aa perl-threads: ref: 96ef6a4161926a852227a37db2a82769df38ebc5 perl-Term-Cap: ref: 1d444a86d772b87c5b0484e3639f7bac52de8afe perl-Unicode-Normalize: ref: c7a4b3f134e101eb452b949eeda6497d6ea9e520 perl-Storable: ref: b34d556aadded8e2f5c62894dbbcd0fae9d3ab87 perl-IPC-SysV: ref: 4cf56fbde1b8a369fb6114d0f2dc7866dd835b71 perl-IPC-Cmd: ref: 9600d4d856fa56cd63d78d51b1ab699556bbaa20 perl-Time-HiRes: ref: 400def5c2f8c642b692a22c7a6f45da6f4cbd868 perl-Digest-MD5: ref: 8fad912c493bc960566e5ce7118e0cdce3b9a769 perl-Getopt-Long: ref: 3fcd385e78c21d29488f8e020e2b9df21c54900f perl-Module-Metadata: ref: 1578659d3194251b91e39887baf3ad56689fad90 perl-version: ref: 72cca25da1658f759319b46edc9d5abf7b35c3f2 perl-Devel-Size: ref: 960a461ee17d9a34e9817a771410dd2801be2f17 perl-Unicode-Collate: ref: 3a0555a1c080f2bba8e052c32ce35d4c1fca429a perl-Env: ref: 201efc08b7115ab13b1402f76ed05e5c8ed686d4 perl-ExtUtils-MakeMaker: ref: c88d4cf08d3e3ddc8c113a430d287a830c1133e6 perl-File-HomeDir: ref: 253a5f4a3d03187c799904441650124e8ec832ea perl-experimental: ref: dd6b54aaedc470ecd8ed9aa2bc5e6b86334c90ff perl-Data-Dumper: ref: 8e85cc7e6166838184b034d875759a39df4d10d3 perl-ExtUtils-ParseXS: ref: c84346769c6a5009890661786a061af1e06d32dd perl-Text-Tabs+Wrap: ref: 84d9073a2276ee2310cfc7e633c08e271c2f2319 perl-Pod-Perldoc: ref: c582b2f1fb814afe692c9ad44e3ac656505b5183 perl-Devel-PPPort: ref: 17c87af74208a53d3202030ad52862fd376123fc perl-CPAN-Meta-YAML: ref: 04a0e2e11487241ed251223755f1abe43bbe392a perl-Pod-Usage: ref: 98983d9f8b961510acff3a1190c7ea62d447699f perl-Fedora-VSP: ref: 90425acf3b0601d4feb86e0339f0c0efdd0435ae perl-CPAN-Meta: ref: f8259dccb36b9a47dc6bad88847c3fcd3563a196 perl-File-Path: ref: ac6856f118e7aa9a3a709c6202ab06494ecdd9b3 perl-generators: ref: 3517fe526a3f0bb16c097eecd05bfe9dfb94c42e perl-Digest: ref: b3f866352aea430935df7f2f0afaaf3cced7d214 perl-Perl-OSType: ref: 7191911473475122ff950ed36748133d8b2f968b perl-Pod-Simple: ref: 05a654f26321267554e75398eb19f704b4b97e17 perl-Sub-Install: ref: f3365c2a0b610eb21f6c1c786958c0e8ba08a47c perl-PerlIO-via-QuotedPrint: ref: 7d17de12fac09e63e1c14ed17229c6d23e923830 perl-HTTP-Tiny: ref: ccd7e054fc273dbfab16202a35f8fd73219b27c7 perl-Text-Template: ref: c3ff74620de07ec5a20b398981cfe60bc23b7533 perl-Pod-Parser: ref: 13b1e60337a84241ed263e3a62af46005bec3b8c perl-Pod-Escapes: ref: b86907d1d42dbd25c327e34b09b061f0a3f96d8a perl-Package-Generator: ref: 8a4118f2e4299109b3a7e6e0dea5ee7424e632bf perl-Sys-Syslog: ref: b83dcfb81b92c0617bee60d8ac89d1d228b88d8e perl-Archive-Tar: ref: 1713c34fd47329b8bd3c237822a2a7de75266654 perl-Time-Local: ref: 12fcdce59f0b8fd7daeb1b4088a3c7966cc6a302 perl-perlfaq: ref: ab3baf6a6ad945423be4696bb7ac0481ce8e9076 perl-JSON-PP: ref: 02d427bafed752ddfd755e1cfcd71c4daaa7b336 perl-Term-ANSIColor: ref: 7e942843d7f43f5535e55f7709943e210743f4fe perl-MRO-Compat: ref: 7b9d4772b76353d755f44acc9a686e9566a1a4b7 perl-Locale-Codes: ref: d7b98d549b08417aaef3c02cd0314e0cda13dddb perl-Test-Harness: ref: 65288c532917fea41328a20520e0755f6eb18463 perl-Sub-Exporter: ref: 34cd68b9ccfbae47690795a40a14a236ff0b2319 perl-Socket: ref: 20b784e3737e5842c973bd31f1735b67e77b050f perl-Module-CoreList: ref: 6e295ecf1e1dd6a348563ff1563a5f4c53001e71 perl-Carp: ref: b853f44fd4ed76815057dbec21b16f8069731630 perl-Filter-Simple: ref: 08e79709ade8905bc3212d2c7dbb1d168d578dba perl-Pod-Checker: ref: dd7b179ffb95412b1f28d3b825d87132f391821e perl-Compress-Raw-Bzip2: ref: 2a51171531415b788d4bc6cdd05a823fb4b831b5 perl-DB_File: ref: cb750cc628fdf540662b6694fce548ebd4aceff7 perl-Filter: ref: 78296ad909c75c445e4c43526e3ae57f25de7c34 perl-inc-latest: ref: b94b9e6f144d6ce856e827a2cb9c16c42cce56b5 perl-Params-Util: ref: a69abfa9df18bb76b6ccb98caa103795abc5d083 perl-Module-Load-Conditional: ref: 532fb21fdf6ff39b29abaccbdc4a1f87941521f2 perl-ExtUtils-CBuilder: ref: 4e5e482495a977c28396e2d1149def8dcb12e15f perl-Data-Section: ref: ce79e1d99123d4220543d1eb2d2806673277cad4 perl-Scalar-List-Utils: ref: c0ea69a001e7bb2a50a9c122dcc5ce792125f6e4 perl-Text-ParseWords: ref: 809c9bd7181b286d5e14e80a73f6ea50ac3b62b3 perl-Encode: ref: 5417f768a229062a55dde8f25b5b9aac039f96e1 perl-Module-Build: ref: a9f6bbfbfc8303db7b57cbea35e53de61a46a165 perl-Thread-Queue: ref: 8c85fbf927199c852e95b3fed93ff28c67b3adaa perl-Exporter: ref: 68f93042fb090750ccc7022bd957fa12ff184ecb perl-Software-License: ref: dbee7688f08ab815650fd845122a8ee8cfb0294c perl-Digest-SHA: ref: e2e8e4441dcace400b4340f2269b218a949234a2 perl-File-Temp: ref: 75a5d0eb68e5d261762dbb20412efa17dfeb6ab3 perl-URI: ref: 8696c54987665ac968cb66d98b69e49a37a89b52 perl-Data-OptList: ref: 55696a188230a0b16e32bc0cc6183cc0683753e3 perl-ExtUtils-Install: ref: 5eb9021663b033a695802e5d960795c1b338f1d1 perl-MIME-Base64: ref: c099afc6b1d7eec124f46bea88b86a2edd0f7b56 perl-Test-Simple: ref: 96c4c3b6c0172748a9a9c95fb2c1fefc9f73ee04 perl-File-Which: ref: 0c9cbe3a1d01d42035314f8d5527e6f505142cab perl-CPAN: ref: c91f221d2bbde2992152786a94b3da8899d7a628 perl-Text-Glob: ref: b19ed6fe9d0ff70870939d2bfe33e2bd059b732a perl-Module-Load: ref: 4f363f0c7d356591f33a22a930f4501167b01053 perl-IO-Socket-IP: ref: 1a65c1170f6582ad9ece8fe9c76c540e18cd3264 perl-parent: ref: c3649d1868f869883423867076131c1604fd4467 dependencies: - buildrequires: platform: [f29] requires: platform: [f29] references: community: https://docs.pagure.org/modularity/ documentation: https://github.com/modularity-modules/perl tracker: https://github.com/modularity-modules/perl/issues profiles: default: description: Interpreter and all Perl modules bundled within upstream Perl. rpms: - perl minimal: description: Only the interpreter as a standalone executable. rpms: - perl-interpreter api: rpms: - perl - perl-Archive-Tar - perl-Attribute-Handlers - perl-B-Debug - perl-CPAN - perl-CPAN-Meta - perl-CPAN-Meta-Requirements - perl-CPAN-Meta-YAML - perl-Carp - perl-Compress-Raw-Bzip2 - perl-Compress-Raw-Zlib - perl-Config-Perl-V - perl-DB_File - perl-Data-Dumper - perl-Devel-PPPort - perl-Devel-Peek - perl-Devel-SelfStubber - perl-Digest - perl-Digest-MD5 - perl-Digest-SHA - perl-Encode - perl-Encode-devel - perl-Env - perl-Errno - perl-Exporter - perl-ExtUtils-CBuilder - perl-ExtUtils-Command - perl-ExtUtils-Embed - perl-ExtUtils-Install - perl-ExtUtils-MM-Utils - perl-ExtUtils-MakeMaker - perl-ExtUtils-Manifest - perl-ExtUtils-Miniperl - perl-ExtUtils-ParseXS - perl-File-Fetch - perl-File-Path - perl-File-Temp - perl-Filter - perl-Filter-Simple - perl-Getopt-Long - perl-HTTP-Tiny - perl-IO - perl-IO-Compress - perl-IO-Socket-IP - perl-IO-Zlib - perl-IPC-Cmd - perl-IPC-SysV - perl-JSON-PP - perl-Locale-Codes - perl-Locale-Maketext - perl-Locale-Maketext-Simple - perl-MIME-Base64 - perl-Math-BigInt - perl-Math-BigInt-FastCalc - perl-Math-BigRat - perl-Math-Complex - perl-Memoize - perl-Module-CoreList - perl-Module-CoreList-tools - perl-Module-Load - perl-Module-Load-Conditional - perl-Module-Loaded - perl-Module-Metadata - perl-Net-Ping - perl-Params-Check - perl-PathTools - perl-Perl-OSType - perl-PerlIO-via-QuotedPrint - perl-Pod-Checker - perl-Pod-Escapes - perl-Pod-Html - perl-Pod-Parser - perl-Pod-Perldoc - perl-Pod-Simple - perl-Pod-Usage - perl-Scalar-List-Utils - perl-SelfLoader - perl-Socket - perl-Storable - perl-Sys-Syslog - perl-Term-ANSIColor - perl-Term-Cap - perl-Test - perl-Test-Harness - perl-Test-Simple - perl-Text-Balanced - perl-Text-ParseWords - perl-Text-Tabs+Wrap - perl-Thread-Queue - perl-Time-HiRes - perl-Time-Local - perl-Time-Piece - perl-Unicode-Collate - perl-Unicode-Normalize - perl-autodie - perl-bignum - perl-constant - perl-devel - perl-encoding - perl-experimental - perl-generators - perl-interpreter - perl-libnet - perl-libnetcfg - perl-libs - perl-macros - perl-open - perl-parent - perl-perlfaq - perl-podlators - perl-tests - perl-threads - perl-threads-shared - perl-utils - perl-version buildopts: rpms: macros: | %_with_perl_enables_groff 1 %_without_perl_enables_syslog_test 1 %_with_perl_enables_systemtap 1 %_without_perl_enables_tcsh 1 %_without_perl_Compress_Bzip2_enables_optional_test 1 %_without_perl_CPAN_Meta_Requirements_enables_optional_test 1 %_without_perl_IPC_System_Simple_enables_optional_test 1 %_without_perl_LWP_MediaTypes_enables_mailcap 1 %_without_perl_Module_Build_enables_optional_test 1 %_without_perl_Perl_OSType_enables_optional_test 1 %_without_perl_Pod_Perldoc_enables_tk_test 1 %_without_perl_Software_License_enables_optional_test 1 %_without_perl_Sys_Syslog_enables_optional_test 1 %_without_perl_Test_Harness_enables_optional_test 1 %_without_perl_Test_Simple_enables_optional_test 1 %_without_perl_URI_enables_Business_ISBN 1 components: rpms: perl: rationale: The Perl interpreter. repository: git://pkgs.fedoraproject.org/rpms/perl cache: http://pkgs.fedoraproject.org/repo/pkgs/perl ref: f28 perl-Algorithm-Diff: rationale: A run-time dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-Algorithm-Diff cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-Algorithm-Diff ref: f28 perl-Archive-Tar: rationale: Core Perl API. repository: git://pkgs.fedoraproject.org/rpms/perl-Archive-Tar cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-Archive-Tar ref: f28 perl-Archive-Zip: rationale: A run-time dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-Archive-Zip cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-Archive-Zip ref: f28 perl-B-Debug: rationale: Core Perl API. repository: git://pkgs.fedoraproject.org/rpms/perl-B-Debug cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-B-Debug ref: f28 perl-CPAN: rationale: Core Perl API. repository: git://pkgs.fedoraproject.org/rpms/perl-CPAN cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-CPAN ref: f28 perl-CPAN-Meta: rationale: Core Perl API. repository: git://pkgs.fedoraproject.org/rpms/perl-CPAN-Meta cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-CPAN-Meta ref: f28 perl-CPAN-Meta-Requirements: rationale: Core Perl API. repository: git://pkgs.fedoraproject.org/rpms/perl-CPAN-Meta-Requirements cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-CPAN-Meta-Requirements ref: f28 perl-CPAN-Meta-YAML: rationale: Core Perl API. repository: git://pkgs.fedoraproject.org/rpms/perl-CPAN-Meta-YAML cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-CPAN-Meta-YAML ref: f28 perl-Carp: rationale: Core Perl API. repository: git://pkgs.fedoraproject.org/rpms/perl-Carp cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-Carp ref: f28 perl-Compress-Bzip2: rationale: A run-time dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-Compress-Bzip2 cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-Compress-Bzip2 ref: f28 perl-Compress-Raw-Bzip2: rationale: Core Perl API. repository: git://pkgs.fedoraproject.org/rpms/perl-Compress-Raw-Bzip2 cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-Compress-Raw-Bzip2 ref: f28 perl-Compress-Raw-Zlib: rationale: Core Perl API. repository: git://pkgs.fedoraproject.org/rpms/perl-Compress-Raw-Zlib cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-Compress-Raw-Zlib ref: f28 perl-Config-Perl-V: rationale: Core Perl API. repository: git://pkgs.fedoraproject.org/rpms/perl-Config-Perl-V cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-Config-Perl-V ref: f28 perl-DB_File: rationale: Core Perl API. repository: git://pkgs.fedoraproject.org/rpms/perl-DB_File cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-DB_File ref: f28 perl-Data-Dumper: rationale: Core Perl API. repository: git://pkgs.fedoraproject.org/rpms/perl-Data-Dumper cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-Data-Dumper ref: f28 perl-Data-OptList: rationale: A run-time dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-Data-OptList cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-Data-OptList ref: f28 perl-Data-Section: rationale: A run-time dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-Data-Section cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-Data-Section ref: f28 perl-Devel-PPPort: rationale: Core Perl API. repository: git://pkgs.fedoraproject.org/rpms/perl-Devel-PPPort cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-Devel-PPPort ref: f28 perl-Devel-Size: rationale: A run-time dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-Devel-Size cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-Devel-Size ref: f28 perl-Digest: rationale: Core Perl API. repository: git://pkgs.fedoraproject.org/rpms/perl-Digest cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-Digest ref: f28 perl-Digest-MD5: rationale: Core Perl API. repository: git://pkgs.fedoraproject.org/rpms/perl-Digest-MD5 cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-Digest-MD5 ref: f28 perl-Digest-SHA: rationale: Core Perl API. repository: git://pkgs.fedoraproject.org/rpms/perl-Digest-SHA cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-Digest-SHA ref: f28 perl-Encode: rationale: Core Perl API. repository: git://pkgs.fedoraproject.org/rpms/perl-Encode cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-Encode ref: f28 perl-Env: rationale: Core Perl API. repository: git://pkgs.fedoraproject.org/rpms/perl-Env cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-Env ref: f28 perl-Exporter: rationale: Core Perl API. repository: git://pkgs.fedoraproject.org/rpms/perl-Exporter cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-Exporter ref: f28 perl-ExtUtils-CBuilder: rationale: Core Perl API. repository: git://pkgs.fedoraproject.org/rpms/perl-ExtUtils-CBuilder cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-ExtUtils-CBuilder ref: f28 perl-ExtUtils-Install: rationale: Core Perl API. repository: git://pkgs.fedoraproject.org/rpms/perl-ExtUtils-Install cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-ExtUtils-Install ref: f28 perl-ExtUtils-MakeMaker: rationale: Core Perl API. repository: git://pkgs.fedoraproject.org/rpms/perl-ExtUtils-MakeMaker cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-ExtUtils-MakeMaker ref: f28 perl-ExtUtils-Manifest: rationale: Core Perl API. repository: git://pkgs.fedoraproject.org/rpms/perl-ExtUtils-Manifest cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-ExtUtils-Manifest ref: f28 perl-ExtUtils-ParseXS: rationale: Core Perl API. repository: git://pkgs.fedoraproject.org/rpms/perl-ExtUtils-ParseXS cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-ExtUtils-ParseXS ref: f28 perl-Fedora-VSP: rationale: A run-time dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-Fedora-VSP cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-Fedora-VSP ref: f28 perl-File-Fetch: rationale: Core Perl API. repository: git://pkgs.fedoraproject.org/rpms/perl-File-Fetch cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-File-Fetch ref: f28 perl-File-HomeDir: rationale: A run-time dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-File-HomeDir cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-File-HomeDir ref: f28 perl-File-Path: rationale: Core Perl API. repository: git://pkgs.fedoraproject.org/rpms/perl-File-Path cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-File-Path ref: f28 perl-File-Temp: rationale: Core Perl API. repository: git://pkgs.fedoraproject.org/rpms/perl-File-Temp cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-File-Temp ref: f28 perl-File-Which: rationale: A run-time dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-File-Which cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-File-Which ref: f28 perl-Filter: rationale: Core Perl API. repository: git://pkgs.fedoraproject.org/rpms/perl-Filter cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-Filter ref: f28 perl-Filter-Simple: rationale: Core Perl API. repository: git://pkgs.fedoraproject.org/rpms/perl-Filter-Simple cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-Filter-Simple ref: f28 perl-Getopt-Long: rationale: Core Perl API. repository: git://pkgs.fedoraproject.org/rpms/perl-Getopt-Long cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-Getopt-Long ref: f28 perl-HTTP-Tiny: rationale: Core Perl API. repository: git://pkgs.fedoraproject.org/rpms/perl-HTTP-Tiny cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-HTTP-Tiny ref: f28 perl-IO-Compress: rationale: Core Perl API. repository: git://pkgs.fedoraproject.org/rpms/perl-IO-Compress cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-IO-Compress ref: f28 perl-IO-Socket-IP: rationale: Core Perl API. repository: git://pkgs.fedoraproject.org/rpms/perl-IO-Socket-IP cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-IO-Socket-IP ref: f28 perl-IPC-Cmd: rationale: Core Perl API. repository: git://pkgs.fedoraproject.org/rpms/perl-IPC-Cmd cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-IPC-Cmd ref: f28 perl-IPC-SysV: rationale: Core Perl API. repository: git://pkgs.fedoraproject.org/rpms/perl-IPC-SysV cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-IPC-SysV ref: f28 perl-IPC-System-Simple: rationale: A run-time dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-IPC-System-Simple cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-IPC-System-Simple ref: f28 perl-JSON-PP: rationale: Core Perl API. repository: git://pkgs.fedoraproject.org/rpms/perl-JSON-PP cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-JSON-PP ref: f28 perl-Locale-Codes: rationale: Core Perl API. repository: git://pkgs.fedoraproject.org/rpms/perl-Locale-Codes cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-Locale-Codes ref: f28 perl-Locale-Maketext: rationale: Core Perl API. repository: git://pkgs.fedoraproject.org/rpms/perl-Locale-Maketext cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-Locale-Maketext ref: f28 perl-MIME-Base64: rationale: Core Perl API. repository: git://pkgs.fedoraproject.org/rpms/perl-MIME-Base64 cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-MIME-Base64 ref: f28 perl-MRO-Compat: rationale: A run-time dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-MRO-Compat cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-MRO-Compat ref: f28 perl-Math-BigInt: rationale: Core Perl API. repository: git://pkgs.fedoraproject.org/rpms/perl-Math-BigInt cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-Math-BigInt ref: f28 perl-Math-BigInt-FastCalc: rationale: Core Perl API. repository: git://pkgs.fedoraproject.org/rpms/perl-Math-BigInt-FastCalc cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-Math-BigInt-FastCalc ref: f28 perl-Math-BigRat: rationale: Core Perl API. repository: git://pkgs.fedoraproject.org/rpms/perl-Math-BigRat cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-Math-BigRat ref: f28 perl-Module-Build: rationale: A run-time dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-Module-Build cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-Module-Build ref: f28 perl-Module-CoreList: rationale: Core Perl API. repository: git://pkgs.fedoraproject.org/rpms/perl-Module-CoreList cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-Module-CoreList ref: f28 perl-Module-Load: rationale: Core Perl API. repository: git://pkgs.fedoraproject.org/rpms/perl-Module-Load cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-Module-Load ref: f28 perl-Module-Load-Conditional: rationale: Core Perl API. repository: git://pkgs.fedoraproject.org/rpms/perl-Module-Load-Conditional cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-Module-Load-Conditional ref: f28 perl-Module-Metadata: rationale: Core Perl API. repository: git://pkgs.fedoraproject.org/rpms/perl-Module-Metadata cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-Module-Metadata ref: f28 perl-Package-Generator: rationale: A run-time dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-Package-Generator cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-Package-Generator ref: f28 perl-Params-Check: rationale: Core Perl API. repository: git://pkgs.fedoraproject.org/rpms/perl-Params-Check cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-Params-Check ref: f28 perl-Params-Util: rationale: A run-time dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-Params-Util cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-Params-Util ref: f28 perl-PathTools: rationale: Core Perl API. repository: git://pkgs.fedoraproject.org/rpms/perl-PathTools cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-PathTools ref: f28 perl-Perl-OSType: rationale: Core Perl API. repository: git://pkgs.fedoraproject.org/rpms/perl-Perl-OSType cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-Perl-OSType ref: f28 perl-PerlIO-via-QuotedPrint: rationale: Core Perl API. repository: git://pkgs.fedoraproject.org/rpms/perl-PerlIO-via-QuotedPrint cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-PerlIO-via-QuotedPrint ref: f28 perl-Pod-Checker: rationale: Core Perl API. repository: git://pkgs.fedoraproject.org/rpms/perl-Pod-Checker cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-Pod-Checker ref: f28 perl-Pod-Escapes: rationale: Core Perl API. repository: git://pkgs.fedoraproject.org/rpms/perl-Pod-Escapes cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-Pod-Escapes ref: f28 perl-Pod-Parser: rationale: Core Perl API. repository: git://pkgs.fedoraproject.org/rpms/perl-Pod-Parser cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-Pod-Parser ref: f28 perl-Pod-Perldoc: rationale: Core Perl API. repository: git://pkgs.fedoraproject.org/rpms/perl-Pod-Perldoc cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-Pod-Perldoc ref: f28 perl-Pod-Simple: rationale: Core Perl API. repository: git://pkgs.fedoraproject.org/rpms/perl-Pod-Simple cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-Pod-Simple ref: f28 perl-Pod-Usage: rationale: Core Perl API. repository: git://pkgs.fedoraproject.org/rpms/perl-Pod-Usage cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-Pod-Usage ref: f28 perl-Scalar-List-Utils: rationale: Core Perl API. repository: git://pkgs.fedoraproject.org/rpms/perl-Scalar-List-Utils cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-Scalar-List-Utils ref: f28 perl-Socket: rationale: Core Perl API. repository: git://pkgs.fedoraproject.org/rpms/perl-Socket cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-Socket ref: f28 perl-Software-License: rationale: A run-time dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-Software-License cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-Software-License ref: f28 perl-Storable: rationale: Core Perl API. repository: git://pkgs.fedoraproject.org/rpms/perl-Storable cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-Storable ref: f28 perl-Sub-Exporter: rationale: A run-time dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-Sub-Exporter cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-Sub-Exporter ref: f28 perl-Sub-Install: rationale: A run-time dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-Sub-Install cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-Sub-Install ref: f28 perl-Sys-Syslog: rationale: Core Perl API. repository: git://pkgs.fedoraproject.org/rpms/perl-Sys-Syslog cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-Sys-Syslog ref: f28 perl-Term-ANSIColor: rationale: Core Perl API. repository: git://pkgs.fedoraproject.org/rpms/perl-Term-ANSIColor cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-Term-ANSIColor ref: f28 perl-Term-Cap: rationale: Core Perl API. repository: git://pkgs.fedoraproject.org/rpms/perl-Term-Cap cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-Term-Cap ref: f28 perl-Test-Harness: rationale: Core Perl API. repository: git://pkgs.fedoraproject.org/rpms/perl-Test-Harness cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-Test-Harness ref: f28 perl-Test-Simple: rationale: Core Perl API. repository: git://pkgs.fedoraproject.org/rpms/perl-Test-Simple cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-Test-Simple ref: f28 perl-Text-Balanced: rationale: Core Perl API. repository: git://pkgs.fedoraproject.org/rpms/perl-Text-Balanced cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-Text-Balanced ref: f28 perl-Text-Diff: rationale: A run-time dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-Text-Diff cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-Text-Diff ref: f28 perl-Text-Glob: rationale: A run-time dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-Text-Glob cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-Text-Glob ref: f28 perl-Text-ParseWords: rationale: Core Perl API. repository: git://pkgs.fedoraproject.org/rpms/perl-Text-ParseWords cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-Text-ParseWords ref: f28 perl-Text-Tabs+Wrap: rationale: Core Perl API. repository: git://pkgs.fedoraproject.org/rpms/perl-Text-Tabs+Wrap cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-Text-Tabs+Wrap ref: f28 perl-Text-Template: rationale: A run-time dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-Text-Template cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-Text-Template ref: f28 perl-Thread-Queue: rationale: Core Perl API. repository: git://pkgs.fedoraproject.org/rpms/perl-Thread-Queue cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-Thread-Queue ref: f28 perl-Time-HiRes: rationale: Core Perl API. repository: git://pkgs.fedoraproject.org/rpms/perl-Time-HiRes cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-Time-HiRes ref: f28 perl-Time-Local: rationale: Core Perl API. repository: git://pkgs.fedoraproject.org/rpms/perl-Time-Local cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-Time-Local ref: f28 perl-URI: rationale: A run-time dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-URI cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-URI ref: f28 perl-Unicode-Collate: rationale: Core Perl API. repository: git://pkgs.fedoraproject.org/rpms/perl-Unicode-Collate cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-Unicode-Collate ref: f28 perl-Unicode-Normalize: rationale: Core Perl API. repository: git://pkgs.fedoraproject.org/rpms/perl-Unicode-Normalize cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-Unicode-Normalize ref: f28 perl-autodie: rationale: Core Perl API. repository: git://pkgs.fedoraproject.org/rpms/perl-autodie cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-autodie ref: f28 perl-bignum: rationale: Core Perl API. repository: git://pkgs.fedoraproject.org/rpms/perl-bignum cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-bignum ref: f28 perl-constant: rationale: Core Perl API. repository: git://pkgs.fedoraproject.org/rpms/perl-constant cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-constant ref: f28 perl-experimental: rationale: Core Perl API. repository: git://pkgs.fedoraproject.org/rpms/perl-experimental cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-experimental ref: f28 perl-generators: rationale: RPM dependency generator. repository: git://pkgs.fedoraproject.org/rpms/perl-generators cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-generators ref: f28 perl-inc-latest: rationale: A run-time dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-inc-latest cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-inc-latest ref: f28 perl-libnet: rationale: Core Perl API. repository: git://pkgs.fedoraproject.org/rpms/perl-libnet cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-libnet ref: f28 perl-local-lib: rationale: A run-time dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-local-lib cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-local-lib ref: f28 perl-parent: rationale: Core Perl API. repository: git://pkgs.fedoraproject.org/rpms/perl-parent cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-parent ref: f28 perl-perlfaq: rationale: Core Perl API. repository: git://pkgs.fedoraproject.org/rpms/perl-perlfaq cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-perlfaq ref: f28 perl-podlators: rationale: Core Perl API. repository: git://pkgs.fedoraproject.org/rpms/perl-podlators cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-podlators ref: f28 perl-threads: rationale: Core Perl API. repository: git://pkgs.fedoraproject.org/rpms/perl-threads cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-threads ref: f28 perl-threads-shared: rationale: Core Perl API. repository: git://pkgs.fedoraproject.org/rpms/perl-threads-shared cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-threads-shared ref: f28 perl-version: rationale: Core Perl API. repository: git://pkgs.fedoraproject.org/rpms/perl-version cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-version ref: f28 artifacts: rpms: - perl-4:5.26.2-410.module_1681+b405d8e2.x86_64 - perl-Algorithm-Diff-0:1.1903-9.module_1681+b405d8e2.noarch - perl-Archive-Tar-0:2.26-6.module_1681+b405d8e2.noarch - perl-Archive-Zip-0:1.60-2.module_1681+b405d8e2.noarch - perl-Attribute-Handlers-0:0.99-410.module_1681+b405d8e2.noarch - perl-B-Debug-0:1.26-2.module_1681+b405d8e2.noarch - perl-CPAN-0:2.18-397.module_1681+b405d8e2.noarch - perl-CPAN-Meta-0:2.150010-396.module_1681+b405d8e2.noarch - perl-CPAN-Meta-Requirements-0:2.140-396.module_1681+b405d8e2.noarch - perl-CPAN-Meta-YAML-0:0.018-397.module_1681+b405d8e2.noarch - perl-Carp-0:1.42-395.module_1681+b405d8e2.noarch - perl-Compress-Bzip2-0:2.26-6.module_1681+b405d8e2.x86_64 - perl-Compress-Raw-Bzip2-0:2.081-1.module_1681+b405d8e2.x86_64 - perl-Compress-Raw-Zlib-0:2.081-1.module_1681+b405d8e2.x86_64 - perl-Config-Perl-V-0:0.29-2.module_1681+b405d8e2.noarch - perl-DB_File-0:1.841-1.module_1681+b405d8e2.x86_64 - perl-Data-Dumper-0:2.167-399.module_1681+b405d8e2.x86_64 - perl-Data-OptList-0:0.110-6.module_1681+b405d8e2.noarch - perl-Data-Section-0:0.200007-3.module_1681+b405d8e2.noarch - perl-Devel-PPPort-0:3.36-5.module_1681+b405d8e2.x86_64 - perl-Devel-Peek-0:1.26-410.module_1681+b405d8e2.x86_64 - perl-Devel-SelfStubber-0:1.06-410.module_1681+b405d8e2.noarch - perl-Devel-Size-0:0.81-2.module_1681+b405d8e2.x86_64 - perl-Digest-0:1.17-395.module_1681+b405d8e2.noarch - perl-Digest-MD5-0:2.55-396.module_1681+b405d8e2.x86_64 - perl-Digest-SHA-1:6.01-2.module_1681+b405d8e2.x86_64 - perl-Encode-4:2.97-3.module_1681+b405d8e2.x86_64 - perl-Encode-devel-4:2.97-3.module_1681+b405d8e2.x86_64 - perl-Env-0:1.04-395.module_1681+b405d8e2.noarch - perl-Errno-0:1.28-410.module_1681+b405d8e2.x86_64 - perl-Exporter-0:5.72-396.module_1681+b405d8e2.noarch - perl-ExtUtils-CBuilder-1:0.280230-2.module_1681+b405d8e2.noarch - perl-ExtUtils-Command-1:7.34-1.module_1681+b405d8e2.noarch - perl-ExtUtils-Embed-0:1.34-410.module_1681+b405d8e2.noarch - perl-ExtUtils-Install-0:2.14-4.module_1681+b405d8e2.noarch - perl-ExtUtils-MM-Utils-1:7.34-1.module_1681+b405d8e2.noarch - perl-ExtUtils-MakeMaker-1:7.34-1.module_1681+b405d8e2.noarch - perl-ExtUtils-Manifest-0:1.70-395.module_1681+b405d8e2.noarch - perl-ExtUtils-Miniperl-0:1.06-410.module_1681+b405d8e2.noarch - perl-ExtUtils-ParseXS-1:3.35-2.module_1681+b405d8e2.noarch - perl-Fedora-VSP-0:0.001-9.module_1681+b405d8e2.noarch - perl-File-Fetch-0:0.56-2.module_1681+b405d8e2.noarch - perl-File-HomeDir-0:1.002-4.module_1681+b405d8e2.noarch - perl-File-Path-0:2.15-2.module_1681+b405d8e2.noarch - perl-File-Temp-0:0.230.400-396.module_1681+b405d8e2.noarch - perl-File-Which-0:1.22-2.module_1681+b405d8e2.noarch - perl-Filter-2:1.58-2.module_1681+b405d8e2.x86_64 - perl-Filter-Simple-0:0.94-2.module_1681+b405d8e2.noarch - perl-Getopt-Long-1:2.50-4.module_1681+b405d8e2.noarch - perl-HTTP-Tiny-0:0.070-395.module_1681+b405d8e2.noarch - perl-IO-0:1.38-410.module_1681+b405d8e2.x86_64 - perl-IO-Compress-0:2.081-1.module_1681+b405d8e2.noarch - perl-IO-Socket-IP-0:0.39-5.module_1681+b405d8e2.noarch - perl-IO-Zlib-1:1.10-410.module_1681+b405d8e2.noarch - perl-IPC-Cmd-2:1.00-1.module_1681+b405d8e2.noarch - perl-IPC-SysV-0:2.07-397.module_1681+b405d8e2.x86_64 - perl-IPC-System-Simple-0:1.25-17.module_1681+b405d8e2.noarch - perl-JSON-PP-1:2.97.001-2.module_1681+b405d8e2.noarch - perl-Locale-Codes-0:3.56-1.module_1681+b405d8e2.noarch - perl-Locale-Maketext-0:1.28-396.module_1681+b405d8e2.noarch - perl-Locale-Maketext-Simple-1:0.21-410.module_1681+b405d8e2.noarch - perl-MIME-Base64-0:3.15-396.module_1681+b405d8e2.x86_64 - perl-MRO-Compat-0:0.13-4.module_1681+b405d8e2.noarch - perl-Math-BigInt-1:1.9998.11-5.module_1681+b405d8e2.noarch - perl-Math-BigInt-FastCalc-0:0.500.600-6.module_1681+b405d8e2.x86_64 - perl-Math-BigRat-0:0.2613-3.module_1681+b405d8e2.noarch - perl-Math-Complex-0:1.59-410.module_1681+b405d8e2.noarch - perl-Memoize-0:1.03-410.module_1681+b405d8e2.noarch - perl-Module-Build-2:0.42.24-5.module_1681+b405d8e2.noarch - perl-Module-CoreList-1:5.20180414-1.module_1681+b405d8e2.noarch - perl-Module-CoreList-tools-1:5.20180414-1.module_1681+b405d8e2.noarch - perl-Module-Load-1:0.32-395.module_1681+b405d8e2.noarch - perl-Module-Load-Conditional-0:0.68-395.module_1681+b405d8e2.noarch - perl-Module-Loaded-1:0.08-410.module_1681+b405d8e2.noarch - perl-Module-Metadata-0:1.000033-395.module_1681+b405d8e2.noarch - perl-Net-Ping-0:2.55-410.module_1681+b405d8e2.noarch - perl-Package-Generator-0:1.106-11.module_1681+b405d8e2.noarch - perl-Params-Check-1:0.38-395.module_1681+b405d8e2.noarch - perl-Params-Util-0:1.07-22.module_1681+b405d8e2.x86_64 - perl-PathTools-0:3.74-1.module_1681+b405d8e2.x86_64 - perl-Perl-OSType-0:1.010-396.module_1681+b405d8e2.noarch - perl-PerlIO-via-QuotedPrint-0:0.08-395.module_1681+b405d8e2.noarch - perl-Pod-Checker-4:1.73-395.module_1681+b405d8e2.noarch - perl-Pod-Escapes-1:1.07-395.module_1681+b405d8e2.noarch - perl-Pod-Html-0:1.22.02-410.module_1681+b405d8e2.noarch - perl-Pod-Parser-0:1.63-396.module_1681+b405d8e2.noarch - perl-Pod-Perldoc-0:3.28-396.module_1681+b405d8e2.noarch - perl-Pod-Simple-1:3.35-395.module_1681+b405d8e2.noarch - perl-Pod-Usage-4:1.69-395.module_1681+b405d8e2.noarch - perl-Scalar-List-Utils-3:1.49-2.module_1681+b405d8e2.x86_64 - perl-SelfLoader-0:1.23-410.module_1681+b405d8e2.noarch - perl-Socket-4:2.027-2.module_1681+b405d8e2.x86_64 - perl-Software-License-0:0.103013-2.module_1681+b405d8e2.noarch - perl-Storable-1:2.62-396.module_1681+b405d8e2.x86_64 - perl-Sub-Exporter-0:0.987-15.module_1681+b405d8e2.noarch - perl-Sub-Install-0:0.928-14.module_1681+b405d8e2.noarch - perl-Sys-Syslog-0:0.35-397.module_1681+b405d8e2.x86_64 - perl-Term-ANSIColor-0:4.06-396.module_1681+b405d8e2.noarch - perl-Term-Cap-0:1.17-395.module_1681+b405d8e2.noarch - perl-Test-0:1.30-410.module_1681+b405d8e2.noarch - perl-Test-Harness-1:3.42-1.module_1681+b405d8e2.noarch - perl-Test-Simple-1:1.302135-1.module_1681+b405d8e2.noarch - perl-Text-Balanced-0:2.03-395.module_1681+b405d8e2.noarch - perl-Text-Diff-0:1.45-2.module_1681+b405d8e2.noarch - perl-Text-Glob-0:0.11-4.module_1681+b405d8e2.noarch - perl-Text-ParseWords-0:3.30-395.module_1681+b405d8e2.noarch - perl-Text-Tabs+Wrap-0:2013.0523-395.module_1681+b405d8e2.noarch - perl-Text-Template-0:1.51-1.module_1681+b405d8e2.noarch - perl-Thread-Queue-0:3.12-395.module_1681+b405d8e2.noarch - perl-Time-HiRes-0:1.9758-1.module_1681+b405d8e2.x86_64 - perl-Time-Local-1:1.250-395.module_1681+b405d8e2.noarch - perl-Time-Piece-0:1.31-410.module_1681+b405d8e2.x86_64 - perl-URI-0:1.73-2.module_1681+b405d8e2.noarch - perl-Unicode-Collate-0:1.25-2.module_1681+b405d8e2.x86_64 - perl-Unicode-Normalize-0:1.25-396.module_1681+b405d8e2.x86_64 - perl-autodie-0:2.29-396.module_1681+b405d8e2.noarch - perl-bignum-0:0.49-2.module_1681+b405d8e2.noarch - perl-constant-0:1.33-396.module_1681+b405d8e2.noarch - perl-devel-4:5.26.2-410.module_1681+b405d8e2.x86_64 - perl-encoding-4:2.22-3.module_1681+b405d8e2.x86_64 - perl-experimental-0:0.019-2.module_1681+b405d8e2.noarch - perl-generators-0:1.10-7.module_1681+b405d8e2.noarch - perl-homedir-0:2.000024-2.module_1681+b405d8e2.noarch - perl-inc-latest-2:0.500-9.module_1681+b405d8e2.noarch - perl-interpreter-4:5.26.2-410.module_1681+b405d8e2.x86_64 - perl-libnet-0:3.11-3.module_1681+b405d8e2.noarch - perl-libnetcfg-4:5.26.2-410.module_1681+b405d8e2.noarch - perl-libs-4:5.26.2-410.module_1681+b405d8e2.x86_64 - perl-local-lib-0:2.000024-2.module_1681+b405d8e2.noarch - perl-macros-4:5.26.2-410.module_1681+b405d8e2.x86_64 - perl-open-0:1.11-410.module_1681+b405d8e2.noarch - perl-parent-1:0.236-395.module_1681+b405d8e2.noarch - perl-perlfaq-0:5.021011-395.module_1681+b405d8e2.noarch - perl-podlators-0:4.10-2.module_1681+b405d8e2.noarch - perl-tests-4:5.26.2-410.module_1681+b405d8e2.x86_64 - perl-threads-1:2.21-2.module_1681+b405d8e2.x86_64 - perl-threads-shared-0:1.58-2.module_1681+b405d8e2.x86_64 - perl-utils-0:5.26.2-410.module_1681+b405d8e2.noarch - perl-version-6:0.99.23-1.module_1681+b405d8e2.x86_64 ... --- document: modulemd version: 2 data: name: perl stream: 5.24 version: 20180418132302 context: 5d9ae238 arch: x86_64 summary: Practical Extraction and Report Language description: > Perl is a high-level programming language with roots in C, sed, awk and shell scripting. Perl is good at handling processes and files, and is especially good at handling text. Perl's hallmarks are practicality and efficiency. While it is used to do a lot of different things, Perl's most common applications are system administration utilities and web programming. license: module: - MIT content: - MIT xmd: mbs: mse: TRUE scmurl: https://src.fedoraproject.org/modules/perl.git?#99bb79ac98274ef3fe3f2784057d624e50c0cfcc commit: 99bb79ac98274ef3fe3f2784057d624e50c0cfcc buildrequires: perl-bootstrap: ref: 47f4825a1d5e2a8fd7b76583744ea8f2202c850c stream: 5.24 context: 6c81f848 version: 20180417065503 filtered_rpms: [] platform: ref: f29 stream: f29 context: 00000000 version: 4 filtered_rpms: [] rpms: perl-Text-Diff: ref: 2ee347e962b8a0e83eeecf3324062308cc1d1a2c perl-Text-Balanced: ref: c6648ff72f7b1798642f719036a677102c7ee125 perl-File-Fetch: ref: b4bf1bd8af7755b16b40a3dd67cb743bef9b1652 perl: ref: 9acafa0017b87ed96f8857fd7099787f0d24ff56 perl-Math-BigRat: ref: f45e094a3064ff01662d5e1409e87d88112a1991 perl-Math-BigInt-FastCalc: ref: 785456ac9585a8b4f7628d3bd2a0dacd5b592d09 perl-Locale-Maketext: ref: 57b31cf2d161ce97448d225af3f86c210d78ad6a perl-Algorithm-Diff: ref: f4b6c06396d4768c691a23b3b967fe6fac1e46ee perl-PathTools: ref: e643e0b6864983a2606f5bcf3ae9a34caeda4059 perl-IPC-System-Simple: ref: b899b97739ac1cebcae25357764cd3cf703e4f57 perl-CPAN-Meta-Requirements: ref: f693254160585068bd1db62ffa980963a2ef7011 perl-Compress-Bzip2: ref: 1ac091378670bfc36b3e866924ddc076cd800cf2 perl-IO-Compress: ref: 1e67f30fcc790e2d133ecd756e1b68dc1e423999 perl-threads-shared: ref: cd6fd55c5d0ce4aaf7394f4ee865d68c61e91cd1 perl-autodie: ref: 40735fb3b9a6b96b40934e72672bb1a04eb0999a perl-constant: ref: f005b65dee6a48411e2dfeb5e057dfb8a3818135 perl-bignum: ref: 74c0852bf10b97499c694d3d32f5e66a7a7d7cf3 perl-Params-Check: ref: cf2ab4714451509691e4c06f968b0cc71891a8b8 perl-Archive-Zip: ref: 948b8e44e8dc5def0baa82a96c46da5bff385086 perl-Math-BigInt: ref: 82d8ddba8d0d808a04d9d4cb579df53f65112027 perl-podlators: ref: 380d587d637c4b5fe4c1b961aa16cb698ed2a07b perl-ExtUtils-Manifest: ref: 2fd5140cb9441b0445de12b720c5459ed38e95b7 perl-Compress-Raw-Zlib: ref: ed5582bb24c481aaa0de7a33ecbf85989e0ddd8c perl-local-lib: ref: 96f72250500b509a87fe9263b81f888812ba08cf perl-libnet: ref: e6cc3a47e0776ada93c3801f06af81fb7b642d38 perl-B-Debug: ref: ec558193299b89d6babcf009bdcc18dc7fc48a4e perl-Config-Perl-V: ref: 5a2c9f1ea41e4f07e76062c9598619fed2b4dcb6 perl-threads: ref: f0b3ca4a1602b11c483d97aea130e2dea8b8f96f perl-Term-Cap: ref: 28e345f7f785aa5b60572bfa5ba2627ef8dd3033 perl-Unicode-Normalize: ref: 6875f415710668a788423fdd80ae712e0c3d3ab2 perl-Storable: ref: d76f7a7ba835789a1ca93e3c0db2fc17a9f11907 perl-IPC-SysV: ref: 6102b15b4a3e30698673109ddda94a2325123e38 perl-IPC-Cmd: ref: fc6bc3efe40775d3e63d811a65ed0cab6aa138e1 perl-Time-HiRes: ref: 17004a2568fc6de651cee58816cec8640a825d4c perl-Digest-MD5: ref: 884cdd515f0250589dd4cde8c32a9d77fc55871e perl-Getopt-Long: ref: a7414b0c7a488b9af202fff1eb6a2fb2a3ca6327 perl-Module-Metadata: ref: f583f7db4daab0a72bae86e49b549c15f5e2c905 perl-version: ref: 098155010f833f432a85cb97754e1080750ec873 perl-Devel-Size: ref: 982a54ab4a98fba5339f850fa9cc30af93703d2f perl-Unicode-Collate: ref: c6bc5268528635406bf3237258e7c2969a2bdfc6 perl-Env: ref: 58ac31466f9c9824d25b13ad559622dcdd65e20a perl-ExtUtils-MakeMaker: ref: 5d9438be138d0919320b5a6e2324df05fe123d6a perl-File-HomeDir: ref: 2982c5d9f538d8c640c3ca8fee7566d68e5ea68e perl-experimental: ref: cad2845a55a98ca9565be2707c3ff48e984fd1da perl-Data-Dumper: ref: c8ea0bbaafa024bc09c7f29342f584885571eb07 perl-ExtUtils-ParseXS: ref: 9398847c09b96f2765b1a03b4b84188e28711273 perl-Text-Tabs+Wrap: ref: 90b3a77c499b10b5d34569f8b1b26327495049ea perl-Pod-Perldoc: ref: 842e567a333ccfd2b15be93f230d29414be0f581 perl-Devel-PPPort: ref: bd144f784620e5cb43ef9aea61c11d1bb7fe0503 perl-CPAN-Meta-YAML: ref: 3609aa7e2ae8ca137d9ff46de25d4b869fdb8c2b perl-Pod-Usage: ref: 9d38a4ee92dafbfdd5e8adf44810304de6bbc9e0 perl-Fedora-VSP: ref: 63312d7720e816853bd595cbcdc9d9e3cce0880b perl-CPAN-Meta: ref: 68ca8b0eed6d50eaef11c381b6d8e4754f6c2a7d perl-File-Path: ref: 5848e296d61a3de73f17016f7f37a6395ae0f402 perl-generators: ref: 87c9a690dd58beeaa573074d26fccccb089ab31b perl-Digest: ref: 6867766aaf85865d33675be774af4751b8ae9549 perl-Perl-OSType: ref: c2efc33ea89adb7c2da626cc3d436bbc69203e2b perl-Pod-Simple: ref: a0eec0341f8cc19d74f6f21f9bf38781446a0ad1 perl-Sub-Install: ref: 799f7222e97cc90f9abb7e1f02a5847d71a83cb0 perl-PerlIO-via-QuotedPrint: ref: 31eb1e0e1c723aaf09d6846b9016e4db94428700 perl-HTTP-Tiny: ref: d396ccfe1aadc5746420b06e268e04316eb62c44 perl-Text-Template: ref: 9309a484a2e8e309272c8916cf63a12e385eaaef perl-Pod-Parser: ref: efe0977afc65bae502a4ee5bc47430b4e2b6702f perl-Pod-Escapes: ref: 1ab928503d1824c54a6a32e6b5d527b389f34d05 perl-Package-Generator: ref: f78e39fa9dc3fd1474475eabcb9378375142dd70 perl-Sys-Syslog: ref: 008e476eb1f3e015ad34f302a4cad874e4aad33a perl-Archive-Tar: ref: 2bd7368d3debb90e1d87c3d44db91412fd39873c perl-Time-Local: ref: e74a3e804e77a0d704eebdede825b6d0d6cc617b perl-perlfaq: ref: 63e299c953b8f4b558fe904fc7d31763f79760f1 perl-JSON-PP: ref: 1e3fe253e7edbdc506418a38d666ed19db8ce136 perl-Term-ANSIColor: ref: 3a74f9162f818ffaa4069d74c931caef0560514b perl-MRO-Compat: ref: 13cfd3efff5d02609bf8fe0c36a9e7a9a37ca8b8 perl-Locale-Codes: ref: bd6e31d21f18e85ffe4411b0ce7238d6a974063a perl-Test-Harness: ref: 2ddba30c66331628ef273a6df6b67e2b05d76022 perl-Sub-Exporter: ref: 92259c19826f0aed436f04d886cf4e1f208ff103 perl-Socket: ref: 14bd5dedb6ff8da7d7b0f5945aa61ffa620777d1 perl-Module-CoreList: ref: 6b31db0c22a4824a2ae7c40114a8af17bcfd125b perl-Carp: ref: 84fbaf6f236f9a082ae6960bbbd160f6e75894c5 perl-Filter-Simple: ref: ca5e4217e059a7371a125419071852760d031dba perl-Pod-Checker: ref: 6c8f684a9863678be5724c2e565ba1aa62761151 perl-Compress-Raw-Bzip2: ref: b989d850d818cbaeba0c47b0d975e1afd6b34bb8 perl-DB_File: ref: d9d4b751bd8ea51672630f3beb1ecaf899de40ad perl-Filter: ref: 998996cc8b57f55172167da01155d3a7b59c1e99 perl-inc-latest: ref: 0a60ae8876d88d2eaac83b84d6d2fff8ced1b9a1 perl-Params-Util: ref: 4bfebd9e4cb2fe6a52e2ae69d5e5e74b36296f9f perl-Module-Load-Conditional: ref: bb49232617058d8af4f199db9972f04cd3eefe0d perl-ExtUtils-CBuilder: ref: 521e6f6f83dc9a5afbb517d85e637bfa69f59701 perl-Data-Section: ref: 6ed48ef1733de62cd245237e25d93ea9a827d5e6 perl-Scalar-List-Utils: ref: 7eb2ea6397b7fbeeaeacbb176bbbc453723ded1a perl-Text-ParseWords: ref: 1c120cf2934e246a59a5f37284ac8111c52fa806 perl-Encode: ref: 346cfe7ccbce4c3cc2a4739b628d8d0b7e1a4779 perl-Module-Build: ref: 2c9e4f8f3788caeaa4707f7b562f1ad39a416680 perl-Thread-Queue: ref: e0fff689fc097ecf54bac2f09e5e7bd3c4d00ef6 perl-Exporter: ref: 14c101bc77bc5119c4f75065d6f4b6edea4b502a perl-Software-License: ref: da9a11a3ad14d5a4cbfe9b52d108b672a6939d69 perl-Digest-SHA: ref: 2b4a62eaf739a7d2ce6649f3a326dbd562ed8b74 perl-File-Temp: ref: de8e0c3e7e630e6861a0c0979c5ab60227f7de8e perl-URI: ref: 28d53fda027d3a984ffa201d4494389c6b7796b0 perl-Data-OptList: ref: 9512df0280d65abfaa04d6437367705c3b19b54f perl-ExtUtils-Install: ref: 507084f8349f691d4688fe9a49e92be1711874e4 perl-MIME-Base64: ref: da62d3707ea9781efc91ba48d47ce49b2297a364 perl-Test-Simple: ref: e64b2e39f56e17d7b9046881d589c778aaf4ce8b perl-File-Which: ref: 1a2ca4a9b713f31c6f99f6dec3dafdd0a457a44f perl-CPAN: ref: 4159d449e5a66ddef70d1fe7f1d37279d4d99bc5 perl-Text-Glob: ref: 346be0660f0fc621a960467b5fa1ee656b9cd87f perl-Module-Load: ref: 3f98c8f286677f7b700f661545154e781798ef0c perl-IO-Socket-IP: ref: 4e56568b5d09ad4aefccb354183614ae5b3f6235 perl-parent: ref: f50da57010454e2279d899a57fdbc65a48edc74c dependencies: - buildrequires: platform: [f29] requires: platform: [f29] references: community: https://docs.pagure.org/modularity/ documentation: https://github.com/modularity-modules/perl tracker: https://github.com/modularity-modules/perl/issues profiles: default: rpms: - perl-core minimal: rpms: - perl api: rpms: - perl - perl-Algorithm-Diff - perl-Archive-Tar - perl-Archive-Zip - perl-Attribute-Handlers - perl-B-Debug - perl-CPAN - perl-CPAN-Meta - perl-CPAN-Meta-Requirements - perl-CPAN-Meta-YAML - perl-Carp - perl-Compress-Bzip2 - perl-Compress-Raw-Bzip2 - perl-Compress-Raw-Zlib - perl-Config-Perl-V - perl-DB_File - perl-Data-Dumper - perl-Data-OptList - perl-Data-Section - perl-Devel-PPPort - perl-Devel-Peek - perl-Devel-SelfStubber - perl-Devel-Size - perl-Digest - perl-Digest-MD5 - perl-Digest-SHA - perl-Encode - perl-Encode-devel - perl-Env - perl-Errno - perl-Exporter - perl-ExtUtils-CBuilder - perl-ExtUtils-Command - perl-ExtUtils-Embed - perl-ExtUtils-Install - perl-ExtUtils-MM-Utils - perl-ExtUtils-MakeMaker - perl-ExtUtils-Manifest - perl-ExtUtils-Miniperl - perl-ExtUtils-ParseXS - perl-Fedora-VSP - perl-File-Fetch - perl-File-HomeDir - perl-File-Path - perl-File-Temp - perl-File-Which - perl-Filter - perl-Filter-Simple - perl-Getopt-Long - perl-HTTP-Tiny - perl-IO - perl-IO-Compress - perl-IO-Socket-IP - perl-IO-Zlib - perl-IPC-Cmd - perl-IPC-SysV - perl-IPC-System-Simple - perl-JSON-PP - perl-Locale-Codes - perl-Locale-Maketext - perl-Locale-Maketext-Simple - perl-MIME-Base64 - perl-MRO-Compat - perl-Math-BigInt - perl-Math-BigInt-FastCalc - perl-Math-BigRat - perl-Math-Complex - perl-Memoize - perl-Module-Build - perl-Module-CoreList - perl-Module-CoreList-tools - perl-Module-Load - perl-Module-Load-Conditional - perl-Module-Loaded - perl-Module-Metadata - perl-Net-Ping - perl-Package-Generator - perl-Params-Check - perl-Params-Util - perl-PathTools - perl-Perl-OSType - perl-PerlIO-via-QuotedPrint - perl-Pod-Checker - perl-Pod-Escapes - perl-Pod-Html - perl-Pod-Parser - perl-Pod-Perldoc - perl-Pod-Simple - perl-Pod-Usage - perl-Scalar-List-Utils - perl-SelfLoader - perl-Socket - perl-Software-License - perl-Storable - perl-Sub-Exporter - perl-Sub-Install - perl-Sys-Syslog - perl-Term-ANSIColor - perl-Term-Cap - perl-Test - perl-Test-Harness - perl-Test-Simple - perl-Text-Balanced - perl-Text-Diff - perl-Text-Glob - perl-Text-ParseWords - perl-Text-Tabs+Wrap - perl-Text-Template - perl-Thread-Queue - perl-Time-HiRes - perl-Time-Local - perl-Time-Piece - perl-URI - perl-Unicode-Collate - perl-Unicode-Normalize - perl-autodie - perl-bignum - perl-constant - perl-devel - perl-encoding - perl-experimental - perl-generators - perl-homedir - perl-inc-latest - perl-interpreter - perl-libnet - perl-libnetcfg - perl-libs - perl-local-lib - perl-macros - perl-open - perl-parent - perl-perlfaq - perl-podlators - perl-tests - perl-threads - perl-threads-shared - perl-utils - perl-version buildopts: rpms: macros: | %_with_perl_enables_groff 1 %_without_perl_enables_syslog_test 1 %_with_perl_enables_systemtap 1 %_without_perl_enables_tcsh 1 %_without_perl_Compress_Bzip2_enables_optional_test 1 %_without_perl_CPAN_Meta_Requirements_enables_optional_test 1 %_without_perl_IPC_System_Simple_enables_optional_test 1 %_without_perl_LWP_MediaTypes_enables_mailcap 1 %_without_perl_Module_Build_enables_optional_test 1 %_without_perl_Perl_OSType_enables_optional_test 1 %_without_perl_Pod_Perldoc_enables_tk_test 1 %_without_perl_Software_License_enables_optional_test 1 %_without_perl_Sys_Syslog_enables_optional_test 1 %_without_perl_Test_Harness_enables_optional_test 1 %_without_perl_URI_enables_Business_ISBN 1 components: rpms: perl: rationale: The Perl interpreter. repository: git://pkgs.fedoraproject.org/rpms/perl cache: http://pkgs.fedoraproject.org/repo/pkgs/perl ref: f26 perl-Algorithm-Diff: rationale: A run-time dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-Algorithm-Diff cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-Algorithm-Diff ref: f26 perl-Archive-Tar: rationale: Core Perl API. repository: git://pkgs.fedoraproject.org/rpms/perl-Archive-Tar cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-Archive-Tar ref: f26 perl-Archive-Zip: rationale: A run-time dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-Archive-Zip cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-Archive-Zip ref: f26 perl-B-Debug: rationale: Core Perl API. repository: git://pkgs.fedoraproject.org/rpms/perl-B-Debug cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-B-Debug ref: f26 perl-CPAN: rationale: Core Perl API. repository: git://pkgs.fedoraproject.org/rpms/perl-CPAN cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-CPAN ref: f26 perl-CPAN-Meta: rationale: Core Perl API. repository: git://pkgs.fedoraproject.org/rpms/perl-CPAN-Meta cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-CPAN-Meta ref: f26 perl-CPAN-Meta-Requirements: rationale: Core Perl API. repository: git://pkgs.fedoraproject.org/rpms/perl-CPAN-Meta-Requirements cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-CPAN-Meta-Requirements ref: f26 perl-CPAN-Meta-YAML: rationale: Core Perl API. repository: git://pkgs.fedoraproject.org/rpms/perl-CPAN-Meta-YAML cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-CPAN-Meta-YAML ref: f26 perl-Carp: rationale: Core Perl API. repository: git://pkgs.fedoraproject.org/rpms/perl-Carp cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-Carp ref: f26 perl-Compress-Bzip2: rationale: A run-time dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-Compress-Bzip2 cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-Compress-Bzip2 ref: f26 perl-Compress-Raw-Bzip2: rationale: Core Perl API. repository: git://pkgs.fedoraproject.org/rpms/perl-Compress-Raw-Bzip2 cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-Compress-Raw-Bzip2 ref: f26 perl-Compress-Raw-Zlib: rationale: Core Perl API. repository: git://pkgs.fedoraproject.org/rpms/perl-Compress-Raw-Zlib cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-Compress-Raw-Zlib ref: f26 perl-Config-Perl-V: rationale: Core Perl API. repository: git://pkgs.fedoraproject.org/rpms/perl-Config-Perl-V cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-Config-Perl-V ref: f26 perl-DB_File: rationale: Core Perl API. repository: git://pkgs.fedoraproject.org/rpms/perl-DB_File cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-DB_File ref: f26 perl-Data-Dumper: rationale: Core Perl API. repository: git://pkgs.fedoraproject.org/rpms/perl-Data-Dumper cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-Data-Dumper ref: f26 perl-Data-OptList: rationale: A run-time dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-Data-OptList cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-Data-OptList ref: f26 perl-Data-Section: rationale: A run-time dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-Data-Section cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-Data-Section ref: f26 perl-Devel-PPPort: rationale: Core Perl API. repository: git://pkgs.fedoraproject.org/rpms/perl-Devel-PPPort cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-Devel-PPPort ref: f26 perl-Devel-Size: rationale: A run-time dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-Devel-Size cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-Devel-Size ref: f26 perl-Digest: rationale: Core Perl API. repository: git://pkgs.fedoraproject.org/rpms/perl-Digest cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-Digest ref: f26 perl-Digest-MD5: rationale: Core Perl API. repository: git://pkgs.fedoraproject.org/rpms/perl-Digest-MD5 cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-Digest-MD5 ref: f26 perl-Digest-SHA: rationale: Core Perl API. repository: git://pkgs.fedoraproject.org/rpms/perl-Digest-SHA cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-Digest-SHA ref: f26 perl-Encode: rationale: Core Perl API. repository: git://pkgs.fedoraproject.org/rpms/perl-Encode cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-Encode ref: f26 perl-Env: rationale: Core Perl API. repository: git://pkgs.fedoraproject.org/rpms/perl-Env cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-Env ref: f26 perl-Exporter: rationale: Core Perl API. repository: git://pkgs.fedoraproject.org/rpms/perl-Exporter cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-Exporter ref: f26 perl-ExtUtils-CBuilder: rationale: Core Perl API. repository: git://pkgs.fedoraproject.org/rpms/perl-ExtUtils-CBuilder cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-ExtUtils-CBuilder ref: f26 perl-ExtUtils-Install: rationale: Core Perl API. repository: git://pkgs.fedoraproject.org/rpms/perl-ExtUtils-Install cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-ExtUtils-Install ref: f26 perl-ExtUtils-MakeMaker: rationale: Core Perl API. repository: git://pkgs.fedoraproject.org/rpms/perl-ExtUtils-MakeMaker cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-ExtUtils-MakeMaker ref: f26 perl-ExtUtils-Manifest: rationale: Core Perl API. repository: git://pkgs.fedoraproject.org/rpms/perl-ExtUtils-Manifest cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-ExtUtils-Manifest ref: f26 perl-ExtUtils-ParseXS: rationale: Core Perl API. repository: git://pkgs.fedoraproject.org/rpms/perl-ExtUtils-ParseXS cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-ExtUtils-ParseXS ref: f26 perl-Fedora-VSP: rationale: RPM dependency generator. repository: git://pkgs.fedoraproject.org/rpms/perl-Fedora-VSP cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-Fedora-VSP ref: f26 perl-File-Fetch: rationale: Core Perl API. repository: git://pkgs.fedoraproject.org/rpms/perl-File-Fetch cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-File-Fetch ref: f26 perl-File-HomeDir: rationale: A run-time dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-File-HomeDir cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-File-HomeDir ref: f26 perl-File-Path: rationale: Core Perl API. repository: git://pkgs.fedoraproject.org/rpms/perl-File-Path cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-File-Path ref: f26 perl-File-Temp: rationale: Core Perl API. repository: git://pkgs.fedoraproject.org/rpms/perl-File-Temp cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-File-Temp ref: f26 perl-File-Which: rationale: A run-time dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-File-Which cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-File-Which ref: f26 perl-Filter: rationale: Core Perl API. repository: git://pkgs.fedoraproject.org/rpms/perl-Filter cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-Filter ref: f26 perl-Filter-Simple: rationale: Core Perl API. repository: git://pkgs.fedoraproject.org/rpms/perl-Filter-Simple cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-Filter-Simple ref: f26 perl-Getopt-Long: rationale: Core Perl API. repository: git://pkgs.fedoraproject.org/rpms/perl-Getopt-Long cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-Getopt-Long ref: f26 perl-HTTP-Tiny: rationale: Core Perl API. repository: git://pkgs.fedoraproject.org/rpms/perl-HTTP-Tiny cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-HTTP-Tiny ref: f26 perl-IO-Compress: rationale: Core Perl API. repository: git://pkgs.fedoraproject.org/rpms/perl-IO-Compress cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-IO-Compress ref: f26 perl-IO-Socket-IP: rationale: Core Perl API. repository: git://pkgs.fedoraproject.org/rpms/perl-IO-Socket-IP cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-IO-Socket-IP ref: f26 perl-IPC-Cmd: rationale: Core Perl API. repository: git://pkgs.fedoraproject.org/rpms/perl-IPC-Cmd cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-IPC-Cmd ref: f26 perl-IPC-SysV: rationale: Core Perl API. repository: git://pkgs.fedoraproject.org/rpms/perl-IPC-SysV cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-IPC-SysV ref: f26 perl-IPC-System-Simple: rationale: A run-time dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-IPC-System-Simple cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-IPC-System-Simple ref: f26 perl-JSON-PP: rationale: Core Perl API. repository: git://pkgs.fedoraproject.org/rpms/perl-JSON-PP cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-JSON-PP ref: f26 perl-Locale-Codes: rationale: Core Perl API. repository: git://pkgs.fedoraproject.org/rpms/perl-Locale-Codes cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-Locale-Codes ref: f26 perl-Locale-Maketext: rationale: Core Perl API. repository: git://pkgs.fedoraproject.org/rpms/perl-Locale-Maketext cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-Locale-Maketext ref: f26 perl-MIME-Base64: rationale: Core Perl API. repository: git://pkgs.fedoraproject.org/rpms/perl-MIME-Base64 cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-MIME-Base64 ref: f26 perl-MRO-Compat: rationale: A run-time dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-MRO-Compat cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-MRO-Compat ref: f26 perl-Math-BigInt: rationale: Core Perl API. repository: git://pkgs.fedoraproject.org/rpms/perl-Math-BigInt cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-Math-BigInt ref: f26 perl-Math-BigInt-FastCalc: rationale: Core Perl API. repository: git://pkgs.fedoraproject.org/rpms/perl-Math-BigInt-FastCalc cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-Math-BigInt-FastCalc ref: f26 perl-Math-BigRat: rationale: Core Perl API. repository: git://pkgs.fedoraproject.org/rpms/perl-Math-BigRat cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-Math-BigRat ref: f26 perl-Module-Build: rationale: A run-time dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-Module-Build cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-Module-Build ref: f26 perl-Module-CoreList: rationale: Core Perl API. repository: git://pkgs.fedoraproject.org/rpms/perl-Module-CoreList cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-Module-CoreList ref: f26 perl-Module-Load: rationale: Core Perl API. repository: git://pkgs.fedoraproject.org/rpms/perl-Module-Load cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-Module-Load ref: f26 perl-Module-Load-Conditional: rationale: Core Perl API. repository: git://pkgs.fedoraproject.org/rpms/perl-Module-Load-Conditional cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-Module-Load-Conditional ref: f26 perl-Module-Metadata: rationale: Core Perl API. repository: git://pkgs.fedoraproject.org/rpms/perl-Module-Metadata cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-Module-Metadata ref: f26 perl-Package-Generator: rationale: A run-time dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-Package-Generator cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-Package-Generator ref: f26 perl-Params-Check: rationale: Core Perl API. repository: git://pkgs.fedoraproject.org/rpms/perl-Params-Check cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-Params-Check ref: f26 perl-Params-Util: rationale: A run-time dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-Params-Util cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-Params-Util ref: f26 perl-PathTools: rationale: Core Perl API. repository: git://pkgs.fedoraproject.org/rpms/perl-PathTools cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-PathTools ref: f26 perl-Perl-OSType: rationale: Core Perl API. repository: git://pkgs.fedoraproject.org/rpms/perl-Perl-OSType cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-Perl-OSType ref: f26 perl-PerlIO-via-QuotedPrint: rationale: Core Perl API. repository: git://pkgs.fedoraproject.org/rpms/perl-PerlIO-via-QuotedPrint cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-PerlIO-via-QuotedPrint ref: f26 perl-Pod-Checker: rationale: Core Perl API. repository: git://pkgs.fedoraproject.org/rpms/perl-Pod-Checker cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-Pod-Checker ref: f26 perl-Pod-Escapes: rationale: Core Perl API. repository: git://pkgs.fedoraproject.org/rpms/perl-Pod-Escapes cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-Pod-Escapes ref: f26 perl-Pod-Parser: rationale: Core Perl API. repository: git://pkgs.fedoraproject.org/rpms/perl-Pod-Parser cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-Pod-Parser ref: f26 perl-Pod-Perldoc: rationale: Core Perl API. repository: git://pkgs.fedoraproject.org/rpms/perl-Pod-Perldoc cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-Pod-Perldoc ref: f26 perl-Pod-Simple: rationale: Core Perl API. repository: git://pkgs.fedoraproject.org/rpms/perl-Pod-Simple cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-Pod-Simple ref: f26 perl-Pod-Usage: rationale: Core Perl API. repository: git://pkgs.fedoraproject.org/rpms/perl-Pod-Usage cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-Pod-Usage ref: f26 perl-Scalar-List-Utils: rationale: Core Perl API. repository: git://pkgs.fedoraproject.org/rpms/perl-Scalar-List-Utils cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-Scalar-List-Utils ref: f26 perl-Socket: rationale: Core Perl API. repository: git://pkgs.fedoraproject.org/rpms/perl-Socket cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-Socket ref: f26 perl-Software-License: rationale: A run-time dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-Software-License cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-Software-License ref: f26 perl-Storable: rationale: Core Perl API. repository: git://pkgs.fedoraproject.org/rpms/perl-Storable cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-Storable ref: f26 perl-Sub-Exporter: rationale: A run-time dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-Sub-Exporter cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-Sub-Exporter ref: f26 perl-Sub-Install: rationale: A run-time dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-Sub-Install cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-Sub-Install ref: f26 perl-Sys-Syslog: rationale: Core Perl API. repository: git://pkgs.fedoraproject.org/rpms/perl-Sys-Syslog cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-Sys-Syslog ref: f26 perl-Term-ANSIColor: rationale: Core Perl API. repository: git://pkgs.fedoraproject.org/rpms/perl-Term-ANSIColor cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-Term-ANSIColor ref: f26 perl-Term-Cap: rationale: Core Perl API. repository: git://pkgs.fedoraproject.org/rpms/perl-Term-Cap cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-Term-Cap ref: f26 perl-Test-Harness: rationale: Core Perl API. repository: git://pkgs.fedoraproject.org/rpms/perl-Test-Harness cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-Test-Harness ref: f26 perl-Test-Simple: rationale: Core Perl API. repository: git://pkgs.fedoraproject.org/rpms/perl-Test-Simple cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-Test-Simple ref: f26 perl-Text-Balanced: rationale: Core Perl API. repository: git://pkgs.fedoraproject.org/rpms/perl-Text-Balanced cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-Text-Balanced ref: f26 perl-Text-Diff: rationale: A run-time dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-Text-Diff cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-Text-Diff ref: f26 perl-Text-Glob: rationale: A run-time dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-Text-Glob cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-Text-Glob ref: f26 perl-Text-ParseWords: rationale: Core Perl API. repository: git://pkgs.fedoraproject.org/rpms/perl-Text-ParseWords cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-Text-ParseWords ref: f26 perl-Text-Tabs+Wrap: rationale: Core Perl API. repository: git://pkgs.fedoraproject.org/rpms/perl-Text-Tabs+Wrap cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-Text-Tabs+Wrap ref: f26 perl-Text-Template: rationale: A run-time dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-Text-Template cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-Text-Template ref: f26 perl-Thread-Queue: rationale: Core Perl API. repository: git://pkgs.fedoraproject.org/rpms/perl-Thread-Queue cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-Thread-Queue ref: f26 perl-Time-HiRes: rationale: Core Perl API. repository: git://pkgs.fedoraproject.org/rpms/perl-Time-HiRes cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-Time-HiRes ref: f26 perl-Time-Local: rationale: Core Perl API. repository: git://pkgs.fedoraproject.org/rpms/perl-Time-Local cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-Time-Local ref: f26 perl-URI: rationale: A run-time dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-URI cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-URI ref: f26 perl-Unicode-Collate: rationale: Core Perl API. repository: git://pkgs.fedoraproject.org/rpms/perl-Unicode-Collate cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-Unicode-Collate ref: f26 perl-Unicode-Normalize: rationale: Core Perl API. repository: git://pkgs.fedoraproject.org/rpms/perl-Unicode-Normalize cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-Unicode-Normalize ref: f26 perl-autodie: rationale: Core Perl API. repository: git://pkgs.fedoraproject.org/rpms/perl-autodie cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-autodie ref: f26 perl-bignum: rationale: Core Perl API. repository: git://pkgs.fedoraproject.org/rpms/perl-bignum cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-bignum ref: f26 perl-constant: rationale: Core Perl API. repository: git://pkgs.fedoraproject.org/rpms/perl-constant cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-constant ref: f26 perl-experimental: rationale: Core Perl API. repository: git://pkgs.fedoraproject.org/rpms/perl-experimental cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-experimental ref: f26 perl-generators: rationale: RPM dependency generator. repository: git://pkgs.fedoraproject.org/rpms/perl-generators cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-generators ref: f26 perl-inc-latest: rationale: A run-time dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-inc-latest cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-inc-latest ref: f26 perl-libnet: rationale: Core Perl API. repository: git://pkgs.fedoraproject.org/rpms/perl-libnet cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-libnet ref: f26 perl-local-lib: rationale: A run-time dependency. repository: git://pkgs.fedoraproject.org/rpms/perl-local-lib cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-local-lib ref: f26 perl-parent: rationale: Core Perl API. repository: git://pkgs.fedoraproject.org/rpms/perl-parent cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-parent ref: f26 perl-perlfaq: rationale: Core Perl API. repository: git://pkgs.fedoraproject.org/rpms/perl-perlfaq cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-perlfaq ref: f26 perl-podlators: rationale: Core Perl API. repository: git://pkgs.fedoraproject.org/rpms/perl-podlators cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-podlators ref: f26 perl-threads: rationale: Core Perl API. repository: git://pkgs.fedoraproject.org/rpms/perl-threads cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-threads ref: f26 perl-threads-shared: rationale: Core Perl API. repository: git://pkgs.fedoraproject.org/rpms/perl-threads-shared cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-threads-shared ref: f26 perl-version: rationale: Core Perl API. repository: git://pkgs.fedoraproject.org/rpms/perl-version cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-version ref: f26 artifacts: rpms: - perl-4:5.24.4-397.module_1688+d7b5e208.x86_64 - perl-Algorithm-Diff-0:1.1903-6.module_1688+d7b5e208.noarch - perl-Archive-Tar-0:2.26-1.module_1688+d7b5e208.noarch - perl-Archive-Zip-0:1.59-3.module_1688+d7b5e208.noarch - perl-Attribute-Handlers-0:0.99-397.module_1688+d7b5e208.noarch - perl-B-Debug-0:1.24-2.module_1688+d7b5e208.noarch - perl-CPAN-0:2.16-1.module_1688+d7b5e208.noarch - perl-CPAN-Meta-0:2.150010-2.module_1688+d7b5e208.noarch - perl-CPAN-Meta-Requirements-0:2.140-7.module_1688+d7b5e208.noarch - perl-CPAN-Meta-YAML-0:0.018-367.module_1688+d7b5e208.noarch - perl-Carp-0:1.40-366.module_1688+d7b5e208.noarch - perl-Compress-Bzip2-0:2.26-1.module_1688+d7b5e208.x86_64 - perl-Compress-Raw-Bzip2-0:2.074-1.module_1688+d7b5e208.x86_64 - perl-Compress-Raw-Zlib-0:2.074-1.module_1688+d7b5e208.x86_64 - perl-Config-Perl-V-0:0.27-2.module_1688+d7b5e208.noarch - perl-DB_File-0:1.841-1.module_1688+d7b5e208.x86_64 - perl-Data-Dumper-0:2.161-4.module_1688+d7b5e208.x86_64 - perl-Data-OptList-0:0.110-3.module_1688+d7b5e208.noarch - perl-Data-Section-0:0.200006-8.module_1688+d7b5e208.noarch - perl-Devel-PPPort-0:3.36-1.module_1688+d7b5e208.x86_64 - perl-Devel-Peek-0:1.23-397.module_1688+d7b5e208.x86_64 - perl-Devel-SelfStubber-0:1.05-397.module_1688+d7b5e208.noarch - perl-Devel-Size-0:0.81-1.module_1688+d7b5e208.x86_64 - perl-Digest-0:1.17-367.module_1688+d7b5e208.noarch - perl-Digest-MD5-0:2.55-3.module_1688+d7b5e208.x86_64 - perl-Digest-SHA-1:6.01-1.module_1688+d7b5e208.x86_64 - perl-Encode-4:2.88-6.module_1688+d7b5e208.x86_64 - perl-Encode-devel-4:2.88-6.module_1688+d7b5e208.x86_64 - perl-Env-0:1.04-366.module_1688+d7b5e208.noarch - perl-Errno-0:1.25-397.module_1688+d7b5e208.x86_64 - perl-Exporter-0:5.72-367.module_1688+d7b5e208.noarch - perl-ExtUtils-CBuilder-1:0.280225-366.module_1688+d7b5e208.noarch - perl-ExtUtils-Command-0:7.24-3.module_1688+d7b5e208.noarch - perl-ExtUtils-Embed-0:1.33-397.module_1688+d7b5e208.noarch - perl-ExtUtils-Install-0:2.04-367.module_1688+d7b5e208.noarch - perl-ExtUtils-MM-Utils-0:7.24-3.module_1688+d7b5e208.noarch - perl-ExtUtils-MakeMaker-0:7.24-3.module_1688+d7b5e208.noarch - perl-ExtUtils-Manifest-0:1.70-366.module_1688+d7b5e208.noarch - perl-ExtUtils-Miniperl-0:1.05-397.module_1688+d7b5e208.noarch - perl-ExtUtils-ParseXS-1:3.31-368.module_1688+d7b5e208.noarch - perl-Fedora-VSP-0:0.001-5.module_1688+d7b5e208.noarch - perl-File-Fetch-0:0.56-1.module_1688+d7b5e208.noarch - perl-File-HomeDir-0:1.00-13.module_1688+d7b5e208.noarch - perl-File-Path-0:2.12-367.module_1688+d7b5e208.noarch - perl-File-Temp-0:0.230.400-2.module_1688+d7b5e208.noarch - perl-File-Which-0:1.21-3.module_1688+d7b5e208.noarch - perl-Filter-2:1.58-1.module_1688+d7b5e208.x86_64 - perl-Filter-Simple-0:0.92-366.module_1688+d7b5e208.noarch - perl-Getopt-Long-0:2.49.1-2.module_1688+d7b5e208.noarch - perl-HTTP-Tiny-0:0.070-2.module_1688+d7b5e208.noarch - perl-IO-0:1.36-397.module_1688+d7b5e208.x86_64 - perl-IO-Compress-0:2.074-1.module_1688+d7b5e208.noarch - perl-IO-Socket-IP-0:0.39-1.module_1688+d7b5e208.noarch - perl-IO-Zlib-1:1.10-397.module_1688+d7b5e208.noarch - perl-IPC-Cmd-1:0.98-1.module_1688+d7b5e208.noarch - perl-IPC-SysV-0:2.07-4.module_1688+d7b5e208.x86_64 - perl-IPC-System-Simple-0:1.25-13.module_1688+d7b5e208.noarch - perl-JSON-PP-0:2.94000-1.module_1688+d7b5e208.noarch - perl-Locale-Codes-0:3.42-2.module_1688+d7b5e208.noarch - perl-Locale-Maketext-0:1.28-2.module_1688+d7b5e208.noarch - perl-Locale-Maketext-Simple-1:0.21-397.module_1688+d7b5e208.noarch - perl-MIME-Base64-0:3.15-366.module_1688+d7b5e208.x86_64 - perl-MRO-Compat-0:0.13-1.module_1688+d7b5e208.noarch - perl-Math-BigInt-0:1.9998.11-1.module_1688+d7b5e208.noarch - perl-Math-BigInt-FastCalc-0:0.500.600-2.module_1688+d7b5e208.x86_64 - perl-Math-BigRat-0:0.2614-1.module_1688+d7b5e208.noarch - perl-Math-Complex-0:1.59-397.module_1688+d7b5e208.noarch - perl-Memoize-0:1.03-397.module_1688+d7b5e208.noarch - perl-Module-Build-2:0.42.24-1.module_1688+d7b5e208.noarch - perl-Module-CoreList-1:5.20180414-1.module_1688+d7b5e208.noarch - perl-Module-CoreList-tools-1:5.20180414-1.module_1688+d7b5e208.noarch - perl-Module-Load-1:0.32-366.module_1688+d7b5e208.noarch - perl-Module-Load-Conditional-0:0.68-2.module_1688+d7b5e208.noarch - perl-Module-Loaded-1:0.08-397.module_1688+d7b5e208.noarch - perl-Module-Metadata-0:1.000033-2.module_1688+d7b5e208.noarch - perl-Net-Ping-0:2.43-397.module_1688+d7b5e208.noarch - perl-Package-Generator-0:1.106-8.module_1688+d7b5e208.noarch - perl-Params-Check-1:0.38-366.module_1688+d7b5e208.noarch - perl-Params-Util-0:1.07-17.module_1688+d7b5e208.x86_64 - perl-PathTools-0:3.63-367.module_1688+d7b5e208.x86_64 - perl-Perl-OSType-0:1.010-4.module_1688+d7b5e208.noarch - perl-PerlIO-via-QuotedPrint-0:0.08-366.module_1688+d7b5e208.noarch - perl-Pod-Checker-4:1.73-2.module_1688+d7b5e208.noarch - perl-Pod-Escapes-1:1.07-366.module_1688+d7b5e208.noarch - perl-Pod-Html-0:1.22.01-397.module_1688+d7b5e208.noarch - perl-Pod-Parser-0:1.63-367.module_1688+d7b5e208.noarch - perl-Pod-Perldoc-0:3.28-2.module_1688+d7b5e208.noarch - perl-Pod-Simple-1:3.35-2.module_1688+d7b5e208.noarch - perl-Pod-Usage-4:1.69-2.module_1688+d7b5e208.noarch - perl-Scalar-List-Utils-3:1.48-1.module_1688+d7b5e208.x86_64 - perl-SelfLoader-0:1.23-397.module_1688+d7b5e208.noarch - perl-Socket-4:2.027-1.module_1688+d7b5e208.x86_64 - perl-Software-License-0:0.103012-4.module_1688+d7b5e208.noarch - perl-Storable-1:2.56-368.module_1688+d7b5e208.x86_64 - perl-Sub-Exporter-0:0.987-11.module_1688+d7b5e208.noarch - perl-Sub-Install-0:0.928-10.module_1688+d7b5e208.noarch - perl-Sys-Syslog-0:0.35-2.module_1688+d7b5e208.x86_64 - perl-Term-ANSIColor-0:4.06-2.module_1688+d7b5e208.noarch - perl-Term-Cap-0:1.17-366.module_1688+d7b5e208.noarch - perl-Test-0:1.28-397.module_1688+d7b5e208.noarch - perl-Test-Harness-0:3.42-1.module_1688+d7b5e208.noarch - perl-Test-Simple-1:1.302086-1.module_1688+d7b5e208.noarch - perl-Text-Balanced-0:2.03-366.module_1688+d7b5e208.noarch - perl-Text-Diff-0:1.44-3.module_1688+d7b5e208.noarch - perl-Text-Glob-0:0.11-1.module_1688+d7b5e208.noarch - perl-Text-ParseWords-0:3.30-366.module_1688+d7b5e208.noarch - perl-Text-Tabs+Wrap-0:2013.0523-366.module_1688+d7b5e208.noarch - perl-Text-Template-0:1.47-1.module_1688+d7b5e208.noarch - perl-Thread-Queue-0:3.12-1.module_1688+d7b5e208.noarch - perl-Time-HiRes-0:1.9753-1.module_1688+d7b5e208.x86_64 - perl-Time-Local-1:1.250-2.module_1688+d7b5e208.noarch - perl-Time-Piece-0:1.31-397.module_1688+d7b5e208.x86_64 - perl-URI-0:1.71-6.module_1688+d7b5e208.noarch - perl-Unicode-Collate-0:1.20-1.module_1688+d7b5e208.x86_64 - perl-Unicode-Normalize-0:1.25-366.module_1688+d7b5e208.x86_64 - perl-autodie-0:2.29-367.module_1688+d7b5e208.noarch - perl-bignum-0:0.49-1.module_1688+d7b5e208.noarch - perl-constant-0:1.33-368.module_1688+d7b5e208.noarch - perl-core-0:5.24.4-397.module_1688+d7b5e208.x86_64 - perl-devel-4:5.24.4-397.module_1688+d7b5e208.x86_64 - perl-encoding-4:2.19-6.module_1688+d7b5e208.x86_64 - perl-experimental-0:0.019-1.module_1688+d7b5e208.noarch - perl-generators-0:1.10-2.module_1688+d7b5e208.noarch - perl-homedir-0:2.000023-1.module_1688+d7b5e208.noarch - perl-inc-latest-2:0.500-6.module_1688+d7b5e208.noarch - perl-libnet-0:3.11-1.module_1688+d7b5e208.noarch - perl-libnetcfg-4:5.24.4-397.module_1688+d7b5e208.noarch - perl-libs-4:5.24.4-397.module_1688+d7b5e208.x86_64 - perl-local-lib-0:2.000023-1.module_1688+d7b5e208.noarch - perl-macros-4:5.24.4-397.module_1688+d7b5e208.x86_64 - perl-open-0:1.10-397.module_1688+d7b5e208.noarch - perl-parent-1:0.236-2.module_1688+d7b5e208.noarch - perl-perlfaq-0:5.021011-3.module_1688+d7b5e208.noarch - perl-podlators-0:4.09-3.module_1688+d7b5e208.noarch - perl-tests-4:5.24.4-397.module_1688+d7b5e208.x86_64 - perl-threads-1:2.21-1.module_1688+d7b5e208.x86_64 - perl-threads-shared-0:1.58-1.module_1688+d7b5e208.x86_64 - perl-utils-0:5.24.4-397.module_1688+d7b5e208.noarch - perl-version-5:0.99.18-1.module_1688+d7b5e208.x86_64 ... --- document: modulemd version: 2 data: name: nodejs stream: 8 version: 20180816123422 context: 6c81f848 arch: x86_64 summary: Javascript runtime description: >- Node.js is a platform built on Chrome''s JavaScript runtime for easily building fast, scalable network applications. Node.js uses an event-driven, non-blocking I/O model that makes it lightweight and efficient, perfect for data-intensive real-time applications that run across distributed devices. license: module: - MIT content: - MIT xmd: mbs: mse: TRUE scmurl: https://src.fedoraproject.org/modules/nodejs.git?#bc228d9478ac1b4387f55b6dc0b6dce38db7a7b9 commit: bc228d9478ac1b4387f55b6dc0b6dce38db7a7b9 buildrequires: platform: ref: f29 stream: f29 context: 00000000 version: 5 filtered_rpms: [] rpms: nodejs: ref: 0d185d83353950699b7016d89a66d3916e0168b0 dependencies: - buildrequires: platform: [f29] requires: platform: [f29] references: community: http://nodejs.org documentation: http://nodejs.org/en/docs tracker: https://github.com/nodejs/node/issues profiles: default: rpms: - nodejs - npm development: rpms: - nodejs - nodejs-devel - npm minimal: rpms: - nodejs api: rpms: - nodejs - nodejs-devel - npm components: rpms: nodejs: rationale: Javascript runtime and npm package manager. repository: git://pkgs.fedoraproject.org/rpms/nodejs cache: http://pkgs.fedoraproject.org/repo/pkgs/nodejs ref: 8 buildorder: 10 artifacts: rpms: - nodejs-1:8.11.4-1.module_2030+42747d40.x86_64 - nodejs-devel-1:8.11.4-1.module_2030+42747d40.x86_64 - nodejs-docs-1:8.11.4-1.module_2030+42747d40.noarch - npm-1:5.6.0-1.8.11.4.1.module_2030+42747d40.x86_64 ... --- document: modulemd version: 2 data: name: nodejs stream: 10 version: 20180920144631 context: 6c81f848 arch: x86_64 summary: Javascript runtime description: >- Node.js is a platform built on Chrome''s JavaScript runtime for easily building fast, scalable network applications. Node.js uses an event-driven, non-blocking I/O model that makes it lightweight and efficient, perfect for data-intensive real-time applications that run across distributed devices. license: module: - MIT content: - MIT xmd: mbs: mse: TRUE scmurl: https://src.fedoraproject.org/modules/nodejs.git?#768aa610027667d9b67d05b9d1aa94de4a20f44b commit: 768aa610027667d9b67d05b9d1aa94de4a20f44b buildrequires: platform: ref: f29 stream: f29 context: 00000000 version: 5 filtered_rpms: [] rpms: nodejs: ref: 74ef5461c130a9b009f9f194b2b9865b2a459f3c nghttp2: ref: 67592912fdb33b88075882934e4ec1b551f97cd3 libuv: ref: b47ae1758ba157e78837eb4ac759a1ea3d5dd734 dependencies: - buildrequires: platform: [f29] requires: platform: [f29] references: community: http://nodejs.org documentation: http://nodejs.org/en/docs tracker: https://github.com/nodejs/node/issues profiles: default: rpms: - nodejs - npm development: rpms: - nodejs - nodejs-devel - npm minimal: rpms: - nodejs api: rpms: - nodejs - nodejs-devel - npm components: rpms: libuv: rationale: Platform abstraction layer for Node.js repository: git+https://src.fedoraproject.org/rpms/libuv cache: https://src.fedoraproject.org/repo/pkgs/libuv ref: 1 nghttp2: rationale: Needed for HTTP2 support repository: git+https://src.fedoraproject.org/rpms/nghttp2 cache: https://src.fedoraproject.org/repo/pkgs/nghttp2 ref: main nodejs: rationale: Javascript runtime and npm package manager. repository: git+https://src.fedoraproject.org/rpms/nodejs cache: https://src.fedoraproject.org/repo/pkgs/nodejs ref: 10 buildorder: 10 artifacts: rpms: - libnghttp2-0:1.33.0-1.module_2177+2526c218.x86_64 - libnghttp2-devel-0:1.33.0-1.module_2177+2526c218.x86_64 - libuv-1:1.23.0-1.module_2177+2526c218.x86_64 - libuv-devel-1:1.23.0-1.module_2177+2526c218.x86_64 - libuv-static-1:1.23.0-1.module_2177+2526c218.x86_64 - nghttp2-0:1.33.0-1.module_2177+2526c218.x86_64 - nodejs-1:10.11.0-1.module_2200+adbac02b.x86_64 - nodejs-devel-1:10.11.0-1.module_2200+adbac02b.x86_64 - nodejs-docs-1:10.11.0-1.module_2200+adbac02b.noarch - npm-1:6.4.1-1.10.11.0.1.module_2200+adbac02b.x86_64 ... --- document: modulemd version: 2 data: name: ninja stream: main version: 20180816141421 context: 6c81f848 arch: x86_64 summary: Small build system with a focus on speed description: >- This module includes Ninja build system. Ninja is a small build system with a focus on speed. It differs from other build systems in two major respects: it is designed to have its input files generated by a higher-level build system, and it is designed to run builds as fast as possible. license: module: - MIT content: - MIT xmd: mbs: mse: TRUE scmurl: https://src.fedoraproject.org/modules/ninja.git?#6e64d7e4ddf96330ba0ecb2af6ff177342fb6554 commit: 6e64d7e4ddf96330ba0ecb2af6ff177342fb6554 buildrequires: platform: ref: f29 stream: f29 context: 00000000 version: 5 filtered_rpms: [] rpms: ninja-build: ref: e1503714b8eaa880edb8fa1643273c7363a7e42a dependencies: - buildrequires: platform: [f29] requires: platform: [f29] references: community: https://ninja-build.org/ documentation: https://ninja-build.org/manual.html tracker: https://github.com/ninja-build/ninja/issues profiles: default: rpms: - ninja-build api: rpms: - ninja-build components: rpms: ninja-build: rationale: Main component. repository: git://pkgs.fedoraproject.org/rpms/ninja-build cache: http://pkgs.fedoraproject.org/repo/pkgs/ninja-build ref: main artifacts: rpms: - ninja-build-0:1.8.2-4.module_1991+4e5efe2f.x86_64 ... --- document: modulemd version: 2 data: name: mysql stream: 5.7 version: 20180816141551 context: 6c81f848 arch: x86_64 summary: MySQL Module description: >- MySQL is a multi-user, multi-threaded SQL database server. MySQL is a client/server implementation consisting of a server daemon (mysqld) and many different client programs and libraries. The base package contains the standard MySQL client programs and generic MySQL files. license: module: - MIT content: - MIT xmd: mbs: mse: TRUE scmurl: https://src.fedoraproject.org/modules/mysql.git?#7708247d0b4d3a7502d8a3fd328f65be57f2efcf commit: 7708247d0b4d3a7502d8a3fd328f65be57f2efcf buildrequires: platform: ref: f29 stream: f29 context: 00000000 version: 5 filtered_rpms: [] rpms: community-mysql: ref: 58939b8918ec8d1d1d706190fab7e760817c0053 dependencies: - buildrequires: platform: [f29] requires: platform: [f29] references: community: https://docs.pagure.org/modularity/ documentation: https://github.com/container-images/mariadb/ tracker: https://github.com/modularity-modules/mysql profiles: client: rpms: - community-mysql default: rpms: - community-mysql - community-mysql-server server: rpms: - community-mysql-server api: rpms: - community-mysql - community-mysql-server buildopts: rpms: macros: | %runselftest 0 components: rpms: community-mysql: rationale: MySQL package. repository: git://pkgs.fedoraproject.org/rpms/community-mysql cache: http://pkgs.fedoraproject.org/repo/pkgs/community-mysql ref: 58939b89 buildorder: 10 artifacts: rpms: - community-mysql-0:5.7.22-1.module_1723+91eca47f.x86_64 - community-mysql-common-0:5.7.22-1.module_1723+91eca47f.x86_64 - community-mysql-devel-0:5.7.22-1.module_1723+91eca47f.x86_64 - community-mysql-embedded-0:5.7.22-1.module_1723+91eca47f.x86_64 - community-mysql-embedded-devel-0:5.7.22-1.module_1723+91eca47f.x86_64 - community-mysql-errmsg-0:5.7.22-1.module_1723+91eca47f.x86_64 - community-mysql-libs-0:5.7.22-1.module_1723+91eca47f.x86_64 - community-mysql-server-0:5.7.22-1.module_1723+91eca47f.x86_64 - community-mysql-test-0:5.7.22-1.module_1723+91eca47f.x86_64 ... --- document: modulemd version: 2 data: name: mongodb stream: 3.6 version: 20180601084133 context: 6c81f848 arch: x86_64 summary: MongoDB Module description: >- Mongo from humongous is a high-performance, open source, schema-free document-oriented database. MongoDB is written in C++ and offers the following features. Collection oriented storage, easy storage of object/JSON-style data. Dynamic queries. Full index support, including on inner objects and embedded arrays. Query profiling. Replication and fail-over support. Efficient storage of binary data including large objects (e.g. photos and videos). Auto-sharding for cloud-level scalability (currently in early alpha). Commercial Support Available. A key goal of MongoDB is to bridge the gap between key/value stores (which are fast and highly scalable) and traditional RDBMS systems (which are deep in functionality). license: module: - MIT content: - MIT xmd: mbs: mse: TRUE scmurl: https://src.fedoraproject.org/modules/mongodb.git?#a5dc17324f3dba53a00377cf0bbe7452c60c3759 commit: a5dc17324f3dba53a00377cf0bbe7452c60c3759 buildrequires: platform: ref: f29 stream: f29 context: 00000000 version: 4 filtered_rpms: [] rpms: mongodb: ref: 77494fb130cfc601d09294baf4d919f91b82fe28 python-pymongo: ref: 3d4e2bc45d006ee50ca24db56f41a3e23cdbf044 mongo-java-driver: ref: 2b02035c33706283bf7c67fa82b1d214916f8893 mongo-tools: ref: eed3205ebb63aa71b62b59ce5788bbb434c85ded dependencies: - buildrequires: platform: [f29] requires: platform: [f29] references: community: https://docs.pagure.org/modularity/ documentation: https://github.com/container-images/mongodb/ tracker: https://github.com/modularity-modules/mongodb profiles: client: rpms: - mongo-tools - mongodb default: rpms: - mongodb - mongodb-server server: rpms: - mongodb-server api: rpms: - mongo-tools - mongodb - mongodb-server filter: rpms: - mongo-tools-devel buildopts: rpms: macros: | %with_bundled 1 %_with_xmvn_javadoc 1 %_with_jp_minimal 1 components: rpms: mongo-java-driver: rationale: Java driver for MongoDB. repository: git://pkgs.fedoraproject.org/rpms/mongo-java-driver cache: http://pkgs.fedoraproject.org/repo/pkgs/mongo-java-driver ref: 3.6 buildorder: 2 arches: [aarch64, ppc64le, s390x, x86_64] mongo-tools: rationale: MongoDB tools. repository: git://pkgs.fedoraproject.org/rpms/mongo-tools cache: http://pkgs.fedoraproject.org/repo/pkgs/mongo-tools ref: 3.6 buildorder: 2 arches: [aarch64, ppc64le, s390x, x86_64] mongodb: rationale: MongoDB package. repository: git://pkgs.fedoraproject.org/rpms/mongodb cache: http://pkgs.fedoraproject.org/repo/pkgs/mongodb ref: 3.6 buildorder: 2 arches: [aarch64, ppc64le, s390x, x86_64] python-pymongo: rationale: Python MongoDB driver | MongoDB dependency for running testsuite. repository: git://pkgs.fedoraproject.org/rpms/python-pymongo cache: http://pkgs.fedoraproject.org/repo/pkgs/python-pymongo ref: f28 buildorder: 3 arches: [aarch64, ppc64le, s390x, x86_64] artifacts: rpms: - mongo-java-driver-0:3.6.3-1.module_1822+9f9b01c0.noarch - mongo-java-driver-bson-0:3.6.3-1.module_1822+9f9b01c0.noarch - mongo-java-driver-driver-0:3.6.3-1.module_1822+9f9b01c0.noarch - mongo-java-driver-driver-async-0:3.6.3-1.module_1822+9f9b01c0.noarch - mongo-java-driver-driver-core-0:3.6.3-1.module_1822+9f9b01c0.noarch - mongo-java-driver-javadoc-0:3.6.3-1.module_1822+9f9b01c0.noarch - mongo-tools-0:3.6.4-0.2.20180528gite657a1d.module_1806+7fc7744f.x86_64 - mongodb-0:3.6.4-2.module_1831+e8c1cdcd.x86_64 - mongodb-server-0:3.6.4-2.module_1831+e8c1cdcd.x86_64 - mongodb-test-0:3.6.4-2.module_1831+e8c1cdcd.x86_64 - python-pymongo-doc-0:3.6.1-1.module_1786+4c13601d.noarch - python2-bson-0:3.6.1-1.module_1786+4c13601d.x86_64 - python2-pymongo-0:3.6.1-1.module_1786+4c13601d.x86_64 - python2-pymongo-gridfs-0:3.6.1-1.module_1786+4c13601d.x86_64 - python3-bson-0:3.6.1-1.module_1786+4c13601d.x86_64 - python3-pymongo-0:3.6.1-1.module_1786+4c13601d.x86_64 - python3-pymongo-gridfs-0:3.6.1-1.module_1786+4c13601d.x86_64 ... --- document: modulemd version: 2 data: name: mongodb stream: 3.4 version: 20180601083501 context: 6c81f848 arch: x86_64 summary: MongoDB Module description: >- Mongo from humongous is a high-performance, open source, schema-free document-oriented database. MongoDB is written in C++ and offers the following features. Collection oriented storage, easy storage of object/JSON-style data. Dynamic queries. Full index support, including on inner objects and embedded arrays. Query profiling. Replication and fail-over support. Efficient storage of binary data including large objects (e.g. photos and videos). Auto-sharding for cloud-level scalability (currently in early alpha). Commercial Support Available. A key goal of MongoDB is to bridge the gap between key/value stores (which are fast and highly scalable) and traditional RDBMS systems (which are deep in functionality). license: module: - MIT content: - MIT xmd: mbs: mse: TRUE scmurl: https://src.fedoraproject.org/modules/mongodb.git?#d3bc3e2e8b412da82dbd2d4f3a5f209ac47872fa commit: d3bc3e2e8b412da82dbd2d4f3a5f209ac47872fa buildrequires: platform: ref: f29 stream: f29 context: 00000000 version: 4 filtered_rpms: [] rpms: mongodb: ref: f94545073372dfb2d06446221e6bfc8b0ed7aeaf python-pymongo: ref: 3d4e2bc45d006ee50ca24db56f41a3e23cdbf044 dependencies: - buildrequires: platform: [f29] requires: platform: [f29] references: community: https://docs.pagure.org/modularity/ documentation: https://github.com/container-images/mongodb/ tracker: https://github.com/modularity-modules/mongodb profiles: client: rpms: - mongodb default: rpms: - mongodb - mongodb-server server: rpms: - mongodb-server api: rpms: - mongodb - mongodb-server components: rpms: mongodb: rationale: MongoDB package. repository: git://pkgs.fedoraproject.org/rpms/mongodb cache: http://pkgs.fedoraproject.org/repo/pkgs/mongodb ref: 3.4 buildorder: 2 arches: [aarch64, ppc64le, s390x, x86_64] python-pymongo: rationale: Python MongoDB driver | MongoDB dependency for running testsuite. repository: git://pkgs.fedoraproject.org/rpms/python-pymongo cache: http://pkgs.fedoraproject.org/repo/pkgs/python-pymongo ref: f28 buildorder: 3 arches: [aarch64, ppc64le, s390x, x86_64] artifacts: rpms: - mongodb-0:3.4.11-3.module_1829+95924ba0.x86_64 - mongodb-server-0:3.4.11-3.module_1829+95924ba0.x86_64 - mongodb-test-0:3.4.11-3.module_1829+95924ba0.x86_64 - python-pymongo-doc-0:3.6.1-1.module_1829+95924ba0.noarch - python2-bson-0:3.6.1-1.module_1829+95924ba0.x86_64 - python2-pymongo-0:3.6.1-1.module_1829+95924ba0.x86_64 - python2-pymongo-gridfs-0:3.6.1-1.module_1829+95924ba0.x86_64 - python3-bson-0:3.6.1-1.module_1829+95924ba0.x86_64 - python3-pymongo-0:3.6.1-1.module_1829+95924ba0.x86_64 - python3-pymongo-gridfs-0:3.6.1-1.module_1829+95924ba0.x86_64 ... --- document: modulemd version: 2 data: name: meson stream: main version: 20180816151613 context: 06d0a27d arch: x86_64 summary: The Meson Build system description: >- Meson is an open source build system meant to be both extremely fast, and, even more importantly, as user friendly as possible. The main design point of Meson is that every moment a developer spends writing or debugging build definitions is a second wasted. So is every second spent waiting for the build system to actually start compiling code. license: module: - MIT content: - MIT xmd: mbs: mse: TRUE scmurl: https://src.fedoraproject.org/modules/meson.git?#9826d0b55a3e90793ffee9e34aa17dd740b282e4 commit: 9826d0b55a3e90793ffee9e34aa17dd740b282e4 buildrequires: platform: ref: f29 stream: f29 context: 00000000 version: 5 filtered_rpms: [] rpms: meson: ref: d715e30e897f9fca5716dcb7b0a8a07ca3496d17 dependencies: - buildrequires: platform: [f29] requires: ninja: [] platform: [f29] references: community: https://mesonbuild.com/ documentation: https://mesonbuild.com/ tracker: https://github.com/mesonbuild/meson/issues profiles: default: rpms: - meson api: rpms: - meson components: rpms: meson: rationale: Main component. repository: git://pkgs.fedoraproject.org/rpms/meson cache: http://pkgs.fedoraproject.org/repo/pkgs/meson ref: main artifacts: rpms: - meson-0:0.47.1-5.module_1993+7c0a4d1e.noarch ... --- document: modulemd version: 2 data: name: maven stream: 3.5 version: 20180629153919 context: 819b5873 arch: x86_64 summary: Java project management and project comprehension tool description: >- Maven is a software project management and comprehension tool. Based on the concept of a project object model (POM), Maven can manage a project's build, reporting and documentation from a central piece of information. license: module: - MIT content: - MIT xmd: mbs: mse: TRUE scmurl: https://src.fedoraproject.org/modules/maven.git?#224ccb2073e8c2dbb83b28c864873e277a71c468 commit: 224ccb2073e8c2dbb83b28c864873e277a71c468 buildrequires: javapackages-tools: ref: 1e429a4d686d3fdd1d93ce7e8ac7254148ea3471 stream: 201801 context: b43b0c8f version: 20180629150827 filtered_rpms: [] platform: ref: virtual stream: f28 context: 00000000 version: 4 filtered_rpms: [] rpms: plexus-classworlds: ref: 3e4086fae3de5ed724e85ecef28f6ea73a43cf93 jansi: ref: 4bdd2387b97de8352a0f7a976b7d8ccde8db0b24 aopalliance: ref: 4218fdf5b21e46bcf80aa3baa4248945b5a06e27 sisu: ref: 751afe29d8eda0029656309735ab884b58c1b37b maven-wagon: ref: 4652302afd7cc1a3d4eb48a1ae439bfc109daa90 maven-shared-utils: ref: fc1e8b47ffa930bf339234332d594dfb957c1fb2 glassfish-el: ref: 1ee218e03f1f7c4f9b282faa439f62aba1deae5f plexus-cipher: ref: 1a7a663ac4e50778d6e23a1b65235c12c7e422c4 guava20: ref: 1a98ae8658f477148660ae11626acc5d3efcf88c plexus-interpolation: ref: 18ba33c0fff9697a243b9c495200ba68d36c1071 plexus-utils: ref: 385b958ac294ee3b0851a885a2894b0de02a93b0 maven-resolver: ref: 66d2e2fea8fd8bcd9a297e5a550d2fcc87cc49e4 maven: ref: 666068fe9c979f42c7ca3d84583b0838985179b3 jsoup: ref: abe894a4ebec945ad4c2332084b687d1311ef15b httpcomponents-core: ref: 8be6b3645b3bad6f73fe1e21a7a9a25ae286a016 apache-commons-lang3: ref: aa5729029ca5b7859792bc50a0b3f12ac53c2faf plexus-sec-dispatcher: ref: a8ba97007fcb427a1d7eb066e8d61fa90062b17b apache-commons-codec: ref: b1a8636df2b288f5aa1b2b5bdff1a17b1174f175 slf4j: ref: d7cd96bc7a8e8d8d62c8bc62baa7df02cef56c63 plexus-containers: ref: 94ad5fd40f32db2b4ad5432ed568306f1e8b38ae cdi-api: ref: ff9f653d6435f240bb8a390ff9f99dfb578d42b8 apache-commons-io: ref: 817444e3e10e4d2422e6541f22c86eb281a3145c httpcomponents-client: ref: 4eb97a2f3fa38a0cc50ced7f913346788172d5c6 geronimo-annotation: ref: b32597766edae5bbdd797f04297642231756af8c google-guice: ref: 7e0365f95c46ad40ca084720b0a80afc40447d99 atinject: ref: 4762f5de60627d6d61131dd41a7d9b5027c4e300 apache-commons-logging: ref: 4d8596c64b6c0951b0e8f511d5c067f81b393e5d jansi-native: ref: 544b397797de885ca9b65442a4f956f817b76ddc hawtjni: ref: 93281e0174d79dfd549e57818292b1cbec5a7703 apache-commons-cli: ref: 624d058960641b73418257250e9c1441d9f7c3e6 jboss-interceptors-1.2-api: ref: ac58213ab9bf09451d82896b60eb822e788e777e dependencies: - requires: platform: [] profiles: default: rpms: - maven api: rpms: - maven filter: rpms: - aopalliance-javadoc - apache-commons-cli-javadoc - apache-commons-codec-javadoc - apache-commons-io-javadoc - apache-commons-lang3-javadoc - apache-commons-logging-javadoc - atinject-javadoc - atinject-tck - cdi-api-javadoc - geronimo-annotation-javadoc - glassfish-el - glassfish-el-javadoc - google-guice-javadoc - guava20-javadoc - guava20-testlib - guice-assistedinject - guice-bom - guice-extensions - guice-grapher - guice-jmx - guice-jndi - guice-multibindings - guice-parent - guice-servlet - guice-testlib - guice-throwingproviders - hawtjni - hawtjni-javadoc - httpcomponents-client-cache - httpcomponents-client-javadoc - httpcomponents-core-javadoc - jansi-javadoc - jansi-native-javadoc - jboss-interceptors-1.2-api-javadoc - jsoup-javadoc - jul-to-slf4j - log4j-over-slf4j - maven-hawtjni-plugin - maven-javadoc - maven-resolver - maven-resolver-javadoc - maven-resolver-test-util - maven-resolver-transport-classpath - maven-resolver-transport-file - maven-resolver-transport-http - maven-shared-utils-javadoc - maven-wagon - maven-wagon-ftp - maven-wagon-http-lightweight - maven-wagon-javadoc - maven-wagon-providers - plexus-cipher-javadoc - plexus-classworlds-javadoc - plexus-containers - plexus-containers-component-javadoc - plexus-containers-component-metadata - plexus-containers-container-default - plexus-containers-javadoc - plexus-interpolation-javadoc - plexus-sec-dispatcher-javadoc - plexus-utils-javadoc - sisu-javadoc - slf4j-ext - slf4j-javadoc - slf4j-jcl - slf4j-jdk14 - slf4j-log4j12 - slf4j-manual - slf4j-sources buildopts: rpms: macros: | %_with_xmvn_javadoc 1 %_without_asciidoc 1 %_without_avalon 1 %_without_bouncycastle 1 %_without_cython 1 %_without_dafsa 1 %_without_desktop 1 %_without_doxygen 1 %_without_dtd 1 %_without_eclipse 1 %_without_ehcache 1 %_without_emacs 1 %_without_equinox 1 %_without_fop 1 %_without_ftp 1 %_without_gradle 1 %_without_groovy 1 %_without_hadoop 1 %_without_hsqldb 1 %_without_itext 1 %_without_jackson 1 %_without_jmh 1 %_without_jna 1 %_without_jpa 1 %_without_junit5 1 %_without_logback 1 %_without_markdown 1 %_without_memcached 1 %_without_memoryfilesystem 1 %_without_obr 1 %_without_python 1 %_without_reporting 1 %_without_scm 1 %_without_snappy 1 %_without_spring 1 %_without_ssh 1 %_without_testlib 1 components: rpms: aopalliance: rationale: 'Runtime dependency of google-guice, maven. ' repository: git://pkgs.fedoraproject.org/rpms/aopalliance cache: http://pkgs.fedoraproject.org/repo/pkgs/aopalliance ref: javapackages buildorder: 10 apache-commons-cli: rationale: 'Runtime dependency of maven. ' repository: git://pkgs.fedoraproject.org/rpms/apache-commons-cli cache: http://pkgs.fedoraproject.org/repo/pkgs/apache-commons-cli ref: javapackages buildorder: 10 apache-commons-codec: rationale: 'Runtime dependency of httpcomponents-client, maven. ' repository: git://pkgs.fedoraproject.org/rpms/apache-commons-codec cache: http://pkgs.fedoraproject.org/repo/pkgs/apache-commons-codec ref: javapackages buildorder: 10 apache-commons-io: rationale: "Runtime dependency of maven, maven-shared-utils,\n maven-wagon.\n" repository: git://pkgs.fedoraproject.org/rpms/apache-commons-io cache: http://pkgs.fedoraproject.org/repo/pkgs/apache-commons-io ref: javapackages buildorder: 10 apache-commons-lang3: rationale: 'Runtime dependency of maven. ' repository: git://pkgs.fedoraproject.org/rpms/apache-commons-lang3 cache: http://pkgs.fedoraproject.org/repo/pkgs/apache-commons-lang3 ref: javapackages buildorder: 10 apache-commons-logging: rationale: 'Runtime dependency of httpcomponents-client, maven. ' repository: git://pkgs.fedoraproject.org/rpms/apache-commons-logging cache: http://pkgs.fedoraproject.org/repo/pkgs/apache-commons-logging ref: javapackages buildorder: 10 atinject: rationale: 'Runtime dependency of cdi-api, google-guice, maven. ' repository: git://pkgs.fedoraproject.org/rpms/atinject cache: http://pkgs.fedoraproject.org/repo/pkgs/atinject ref: javapackages buildorder: 10 cdi-api: rationale: 'Runtime dependency of maven, sisu. ' repository: git://pkgs.fedoraproject.org/rpms/cdi-api cache: http://pkgs.fedoraproject.org/repo/pkgs/cdi-api ref: javapackages buildorder: 20 geronimo-annotation: rationale: 'Runtime dependency of maven. ' repository: git://pkgs.fedoraproject.org/rpms/geronimo-annotation cache: http://pkgs.fedoraproject.org/repo/pkgs/geronimo-annotation ref: javapackages buildorder: 10 glassfish-el: rationale: 'Runtime dependency of cdi-api. ' repository: git://pkgs.fedoraproject.org/rpms/glassfish-el cache: http://pkgs.fedoraproject.org/repo/pkgs/glassfish-el ref: javapackages buildorder: 10 google-guice: rationale: 'Runtime dependency of maven. ' repository: git://pkgs.fedoraproject.org/rpms/google-guice cache: http://pkgs.fedoraproject.org/repo/pkgs/google-guice ref: javapackages buildorder: 20 guava20: rationale: 'Runtime dependency of google-guice, maven. ' repository: git://pkgs.fedoraproject.org/rpms/guava20 cache: http://pkgs.fedoraproject.org/repo/pkgs/guava20 ref: javapackages buildorder: 10 hawtjni: rationale: 'Runtime dependency of jansi, jansi-native, maven. ' repository: git://pkgs.fedoraproject.org/rpms/hawtjni cache: http://pkgs.fedoraproject.org/repo/pkgs/hawtjni ref: javapackages buildorder: 10 httpcomponents-client: rationale: 'Runtime dependency of maven, maven-wagon. ' repository: git://pkgs.fedoraproject.org/rpms/httpcomponents-client cache: http://pkgs.fedoraproject.org/repo/pkgs/httpcomponents-client ref: javapackages buildorder: 20 httpcomponents-core: rationale: "Runtime dependency of httpcomponents-client, maven,\n maven-wagon.\n" repository: git://pkgs.fedoraproject.org/rpms/httpcomponents-core cache: http://pkgs.fedoraproject.org/repo/pkgs/httpcomponents-core ref: javapackages buildorder: 10 jansi: rationale: 'Runtime dependency of maven. ' repository: git://pkgs.fedoraproject.org/rpms/jansi cache: http://pkgs.fedoraproject.org/repo/pkgs/jansi ref: javapackages buildorder: 30 jansi-native: rationale: 'Runtime dependency of jansi, maven. ' repository: git://pkgs.fedoraproject.org/rpms/jansi-native cache: http://pkgs.fedoraproject.org/repo/pkgs/jansi-native ref: javapackages buildorder: 20 jboss-interceptors-1.2-api: rationale: 'Runtime dependency of cdi-api. ' repository: git://pkgs.fedoraproject.org/rpms/jboss-interceptors-1.2-api cache: http://pkgs.fedoraproject.org/repo/pkgs/jboss-interceptors-1.2-api ref: javapackages buildorder: 10 jsoup: rationale: 'Runtime dependency of maven-wagon. ' repository: git://pkgs.fedoraproject.org/rpms/jsoup cache: http://pkgs.fedoraproject.org/repo/pkgs/jsoup ref: javapackages buildorder: 10 maven: rationale: 'Module API. ' repository: git://pkgs.fedoraproject.org/rpms/maven cache: http://pkgs.fedoraproject.org/repo/pkgs/maven ref: javapackages buildorder: 50 maven-resolver: rationale: 'Runtime dependency of maven. ' repository: git://pkgs.fedoraproject.org/rpms/maven-resolver cache: http://pkgs.fedoraproject.org/repo/pkgs/maven-resolver ref: javapackages buildorder: 40 maven-shared-utils: rationale: 'Runtime dependency of maven. ' repository: git://pkgs.fedoraproject.org/rpms/maven-shared-utils cache: http://pkgs.fedoraproject.org/repo/pkgs/maven-shared-utils ref: javapackages buildorder: 20 maven-wagon: rationale: 'Runtime dependency of maven, maven-resolver. ' repository: git://pkgs.fedoraproject.org/rpms/maven-wagon cache: http://pkgs.fedoraproject.org/repo/pkgs/maven-wagon ref: javapackages buildorder: 30 plexus-cipher: rationale: 'Runtime dependency of maven, plexus-sec-dispatcher. ' repository: git://pkgs.fedoraproject.org/rpms/plexus-cipher cache: http://pkgs.fedoraproject.org/repo/pkgs/plexus-cipher ref: javapackages buildorder: 10 plexus-classworlds: rationale: 'Runtime dependency of maven, sisu. ' repository: git://pkgs.fedoraproject.org/rpms/plexus-classworlds cache: http://pkgs.fedoraproject.org/repo/pkgs/plexus-classworlds ref: javapackages buildorder: 10 plexus-containers: rationale: 'Runtime dependency of maven, sisu. ' repository: git://pkgs.fedoraproject.org/rpms/plexus-containers cache: http://pkgs.fedoraproject.org/repo/pkgs/plexus-containers ref: javapackages buildorder: 10 plexus-interpolation: rationale: 'Runtime dependency of maven. ' repository: git://pkgs.fedoraproject.org/rpms/plexus-interpolation cache: http://pkgs.fedoraproject.org/repo/pkgs/plexus-interpolation ref: javapackages buildorder: 10 plexus-sec-dispatcher: rationale: 'Runtime dependency of maven. ' repository: git://pkgs.fedoraproject.org/rpms/plexus-sec-dispatcher cache: http://pkgs.fedoraproject.org/repo/pkgs/plexus-sec-dispatcher ref: javapackages buildorder: 20 plexus-utils: rationale: "Runtime dependency of maven, maven-wagon,\n plexus-sec-dispatcher, sisu.\n" repository: git://pkgs.fedoraproject.org/rpms/plexus-utils cache: http://pkgs.fedoraproject.org/repo/pkgs/plexus-utils ref: javapackages buildorder: 10 sisu: rationale: 'Runtime dependency of maven. ' repository: git://pkgs.fedoraproject.org/rpms/sisu cache: http://pkgs.fedoraproject.org/repo/pkgs/sisu ref: javapackages buildorder: 30 slf4j: rationale: 'Runtime dependency of maven, maven-wagon. ' repository: git://pkgs.fedoraproject.org/rpms/slf4j cache: http://pkgs.fedoraproject.org/repo/pkgs/slf4j ref: javapackages buildorder: 10 artifacts: rpms: - aopalliance-0:1.0-17.module_1885+a6f9b3e6.noarch - apache-commons-cli-0:1.4-4.module_1885+a6f9b3e6.noarch - apache-commons-codec-0:1.11-3.module_1885+a6f9b3e6.noarch - apache-commons-io-1:2.6-3.module_1885+a6f9b3e6.noarch - apache-commons-lang3-0:3.7-3.module_1885+a6f9b3e6.noarch - apache-commons-logging-0:1.2-13.module_1885+a6f9b3e6.noarch - atinject-0:1-28.20100611svn86.module_1885+a6f9b3e6.noarch - cdi-api-0:1.2-8.module_1885+a6f9b3e6.noarch - geronimo-annotation-0:1.0-23.module_1885+a6f9b3e6.noarch - glassfish-el-api-0:3.0.1-0.7.b08.module_1885+a6f9b3e6.noarch - google-guice-0:4.1-11.module_1885+a6f9b3e6.noarch - guava20-0:20.0-6.module_1885+a6f9b3e6.noarch - hawtjni-runtime-0:1.16-1.module_1885+a6f9b3e6.noarch - httpcomponents-client-0:4.5.5-4.module_1885+a6f9b3e6.noarch - httpcomponents-core-0:4.4.9-4.module_1885+a6f9b3e6.noarch - jansi-0:1.17.1-1.module_1885+a6f9b3e6.noarch - jansi-native-0:1.7-5.module_1885+a6f9b3e6.x86_64 - jboss-interceptors-1.2-api-0:1.0.0-8.module_1885+a6f9b3e6.noarch - jcl-over-slf4j-0:1.7.25-4.module_1885+a6f9b3e6.noarch - jsoup-0:1.11.3-1.module_1885+a6f9b3e6.noarch - maven-1:3.5.4-1.module_1885+a6f9b3e6.noarch - maven-lib-1:3.5.4-1.module_1885+a6f9b3e6.noarch - maven-resolver-api-1:1.1.1-2.module_1885+a6f9b3e6.noarch - maven-resolver-connector-basic-1:1.1.1-2.module_1885+a6f9b3e6.noarch - maven-resolver-impl-1:1.1.1-2.module_1885+a6f9b3e6.noarch - maven-resolver-spi-1:1.1.1-2.module_1885+a6f9b3e6.noarch - maven-resolver-transport-wagon-1:1.1.1-2.module_1885+a6f9b3e6.noarch - maven-resolver-util-1:1.1.1-2.module_1885+a6f9b3e6.noarch - maven-shared-utils-0:3.2.1-0.1.module_1885+a6f9b3e6.noarch - maven-wagon-file-0:3.1.0-1.module_1885+a6f9b3e6.noarch - maven-wagon-http-0:3.1.0-1.module_1885+a6f9b3e6.noarch - maven-wagon-http-shared-0:3.1.0-1.module_1885+a6f9b3e6.noarch - maven-wagon-provider-api-0:3.1.0-1.module_1885+a6f9b3e6.noarch - plexus-cipher-0:1.7-14.module_1885+a6f9b3e6.noarch - plexus-classworlds-0:2.5.2-9.module_1885+a6f9b3e6.noarch - plexus-containers-component-annotations-0:1.7.1-6.module_1885+a6f9b3e6.noarch - plexus-interpolation-0:1.22-9.module_1885+a6f9b3e6.noarch - plexus-sec-dispatcher-0:1.4-24.module_1885+a6f9b3e6.noarch - plexus-utils-0:3.1.0-1.module_1885+a6f9b3e6.noarch - sisu-inject-1:0.3.3-3.module_1885+a6f9b3e6.noarch - sisu-plexus-1:0.3.3-3.module_1885+a6f9b3e6.noarch - slf4j-0:1.7.25-4.module_1885+a6f9b3e6.noarch ... --- document: modulemd version: 2 data: name: mariadb stream: 10.1 version: 20180418185803 context: 6c81f848 arch: x86_64 summary: MariaDB Module description: >- MariaDB is a community developed branch of MySQL. MariaDB is a multi-user, multi-threaded SQL database server. It is a client/server implementation consisting of a server daemon (mysqld) and many different client programs and libraries. The base package contains the standard MariaDB/MySQL client programs and generic MySQL files. license: module: - MIT content: - MIT xmd: mbs: mse: TRUE scmurl: https://src.fedoraproject.org/modules/mariadb.git?#f1a4b73cfe2b0231ea125e96a64f0daf879245ee commit: f1a4b73cfe2b0231ea125e96a64f0daf879245ee buildrequires: platform: ref: f29 stream: f29 context: 00000000 version: 4 filtered_rpms: [] rpms: mariadb: ref: 76a52e56ed214544537575d3535615be3a7afd2f dependencies: - buildrequires: platform: [f29] requires: platform: [f29] references: community: https://docs.pagure.org/modularity/ documentation: https://github.com/container-images/mariadb/ tracker: https://github.com/modularity-modules/mariadb profiles: client: rpms: - mariadb default: rpms: - mariadb - mariadb-server server: rpms: - mariadb-server api: rpms: - mariadb - mariadb-server filter: rpms: - mariadb-bench - mariadb-server-galera buildopts: rpms: macros: | %runselftest 0 components: rpms: mariadb: rationale: MariaDB package. repository: git://pkgs.fedoraproject.org/rpms/mariadb cache: http://pkgs.fedoraproject.org/repo/pkgs/mariadb ref: 76a52e56 artifacts: rpms: - mariadb-3:10.1.30-2.module_1690+8f54252c.x86_64 - mariadb-common-3:10.1.30-2.module_1690+8f54252c.x86_64 - mariadb-config-3:10.1.30-2.module_1690+8f54252c.x86_64 - mariadb-connect-engine-3:10.1.30-2.module_1690+8f54252c.x86_64 - mariadb-devel-3:10.1.30-2.module_1690+8f54252c.x86_64 - mariadb-embedded-3:10.1.30-2.module_1690+8f54252c.x86_64 - mariadb-embedded-devel-3:10.1.30-2.module_1690+8f54252c.x86_64 - mariadb-errmsg-3:10.1.30-2.module_1690+8f54252c.x86_64 - mariadb-libs-3:10.1.30-2.module_1690+8f54252c.x86_64 - mariadb-oqgraph-engine-3:10.1.30-2.module_1690+8f54252c.x86_64 - mariadb-server-3:10.1.30-2.module_1690+8f54252c.x86_64 - mariadb-server-utils-3:10.1.30-2.module_1690+8f54252c.x86_64 - mariadb-test-3:10.1.30-2.module_1690+8f54252c.x86_64 ... --- document: modulemd version: 2 data: name: lizardfs stream: devel version: 20180816140845 context: 6c81f848 arch: x86_64 summary: Distributed, fault tolerant file system description: >- LizardFS is an Open Source, easy to deploy and maintain, distributed, fault tolerant file system for POSIX compliant OSes. LizardFS is a fork of MooseFS. For more information please visit http://lizardfs.com license: module: - MIT content: - MIT xmd: mbs: mse: TRUE scmurl: https://src.fedoraproject.org/modules/lizardfs.git?#1e4d151b55a4c460cd15f0b6182499db374afd41 commit: 1e4d151b55a4c460cd15f0b6182499db374afd41 buildrequires: platform: ref: f29 stream: f29 context: 00000000 version: 5 filtered_rpms: [] rpms: lizardfs: ref: 0624af153ffd409f2f7b3c3f63fd2b5e5f571cd0 dependencies: - buildrequires: platform: [f29] requires: platform: [f29] components: rpms: lizardfs: rationale: Provides the core functionality. repository: git://pkgs.fedoraproject.org/rpms/lizardfs cache: http://pkgs.fedoraproject.org/repo/pkgs/lizardfs ref: devel artifacts: rpms: - lizardfs-adm-0:3.13.0-0.rc1r1.module_1987+e7db591a.x86_64 - lizardfs-cgi-0:3.13.0-0.rc1r1.module_1987+e7db591a.x86_64 - lizardfs-cgiserv-0:3.13.0-0.rc1r1.module_1987+e7db591a.x86_64 - lizardfs-chunkserver-0:3.13.0-0.rc1r1.module_1987+e7db591a.x86_64 - lizardfs-client-0:3.13.0-0.rc1r1.module_1987+e7db591a.x86_64 - lizardfs-server-0:3.13.0-0.rc1r1.module_1987+e7db591a.x86_64 - lizardfs-metalogger-0:3.13.0-0.rc1r1.module_1987+e7db591a.x86_64 - lizardfs-uraft-0:3.13.0-0.rc1r1.module_1987+e7db591a.x86_64 ... --- document: modulemd version: 2 data: name: libgit2 stream: 0.27 version: 20180926125215 context: 6c81f848 arch: x86_64 summary: Library implementation of Git description: >- The Git linkable library. license: module: - MIT content: - MIT xmd: mbs: mse: TRUE scmurl: https://src.fedoraproject.org/modules/libgit2.git?#26f667d35d80726e876c7aa53f5a823b1b99f591 commit: 26f667d35d80726e876c7aa53f5a823b1b99f591 buildrequires: platform: ref: f29 stream: f29 context: 00000000 version: 5 filtered_rpms: [] rpms: libgit2: ref: 31dd08f7296121e04d3bdf7ef1f28b5ec434999d python-pygit2: ref: 2c97c77dce9d2c76bfda1bf5e21420f24b242bbf dependencies: - buildrequires: platform: [f29] requires: platform: [f29] references: community: https://libgit2.org/ api: rpms: - libgit2 - libgit2-devel components: rpms: libgit2: rationale: Main component. repository: git+https://src.fedoraproject.org/rpms/libgit2 cache: https://src.fedoraproject.org/repo/pkgs/libgit2 ref: 0.27 python-pygit2: rationale: Main component. repository: git+https://src.fedoraproject.org/rpms/python-pygit2 cache: https://src.fedoraproject.org/repo/pkgs/python-pygit2 ref: 0.27 buildorder: 10 artifacts: rpms: - libgit2-0:0.27.4-1.module_2222+9bfbc8d7.x86_64 - libgit2-devel-0:0.27.4-1.module_2222+9bfbc8d7.x86_64 - python-pygit2-doc-0:0.27.2-1.module_2222+9bfbc8d7.noarch - python2-pygit2-0:0.27.2-1.module_2222+9bfbc8d7.x86_64 - python3-pygit2-0:0.27.2-1.module_2222+9bfbc8d7.x86_64 ... --- document: modulemd version: 2 data: name: libgit2 stream: 0.26 version: 20180928101841 context: 6c81f848 arch: x86_64 summary: Library implementation of Git description: >- The Git linkable library. license: module: - MIT content: - MIT xmd: mbs: mse: TRUE scmurl: https://src.fedoraproject.org/modules/libgit2.git?#f4047980866675cc57931906fd1e5ff0577d57a4 commit: f4047980866675cc57931906fd1e5ff0577d57a4 buildrequires: platform: ref: f29 stream: f29 context: 00000000 version: 5 filtered_rpms: [] rpms: libgit2: ref: fb4d3ef3432b26c0db70fbf6d5bb82854f25d352 python-pygit2: ref: 05ad050af7950a262d711e8c1c29a84e87087073 dependencies: - buildrequires: platform: [f29] requires: platform: [f29] references: community: https://libgit2.org/ api: rpms: - libgit2 - libgit2-devel components: rpms: libgit2: rationale: Main component. repository: git+https://src.fedoraproject.org/rpms/libgit2 cache: https://src.fedoraproject.org/repo/pkgs/libgit2 ref: 0.26 python-pygit2: rationale: Main component. repository: git+https://src.fedoraproject.org/rpms/python-pygit2 cache: https://src.fedoraproject.org/repo/pkgs/python-pygit2 ref: 0.26 buildorder: 10 artifacts: rpms: - libgit2-0:0.26.6-1.module_2241+da9f6017.x86_64 - libgit2-devel-0:0.26.6-1.module_2241+da9f6017.x86_64 - python-pygit2-doc-0:0.26.4-1.module_2241+da9f6017.noarch - python2-pygit2-0:0.26.4-1.module_2241+da9f6017.x86_64 - python3-pygit2-0:0.26.4-1.module_2241+da9f6017.x86_64 ... --- document: modulemd version: 2 data: name: kubernetes stream: openshift-3.10 version: 20180827171820 context: 6c81f848 arch: x86_64 summary: OpenShift Container Management description: >- OpenShift Origin is a distribution of Kubernetes optimized for application development and deployment. OpenShift Origin adds developer and operational centric tools on top of Kubernetes to enable rapid application development, easy deployment and scaling, and long-term lifecycle maintenance for small and large teams and applications. It provides a secure and multi-tenant configuration for Kubernetes allowing you to safely host many different applications and workloads. license: module: - MIT content: - MIT xmd: mbs: mse: TRUE scmurl: https://src.fedoraproject.org/modules/kubernetes.git?#d90e9f3651d44c399a06273f01228ddb6d87c4f3 commit: d90e9f3651d44c399a06273f01228ddb6d87c4f3 buildrequires: platform: ref: f29 stream: f29 context: 00000000 version: 5 filtered_rpms: [] rpms: origin: ref: cd304ee543d2d0863c3b162697cbc2b94745802f dependencies: - buildrequires: platform: [f29] requires: platform: [f29] references: community: https://github.com/kubernetes/kubernetes documentation: https://github.com/kubernetes/kubernetes tracker: https://github.com/kubernetes/kubernetes profiles: default: rpms: - origin - origin-clients - origin-cluster-capacity - origin-docker-excluder - origin-dockerregistry - origin-excluder - origin-federation-services - origin-server - origin-node - origin-pod - origin-sdn-ovs - origin-service-catalog - origin-template-service-broker - origin-tests - origin-web-console api: rpms: - origin buildopts: rpms: macros: | %_with_ignore_tests 1 components: rpms: origin: rationale: Primary module component. repository: git+https://src.fedoraproject.org/rpms/origin cache: https://src.fedoraproject.org/repo/pkgs/origin ref: openshift-3.10 artifacts: rpms: - origin-0:3.10.0-1.module_2135+dcc9a197.x86_64 - origin-clients-0:3.10.0-1.module_2135+dcc9a197.x86_64 - origin-cluster-capacity-0:3.10.0-1.module_2135+dcc9a197.x86_64 - origin-docker-excluder-0:3.10.0-1.module_2135+dcc9a197.noarch - origin-dockerregistry-0:3.10.0-1.module_2135+dcc9a197.x86_64 - origin-excluder-0:3.10.0-1.module_2135+dcc9a197.noarch - origin-federation-services-0:3.10.0-1.module_2135+dcc9a197.x86_64 - origin-server-0:3.10.0-1.module_2135+dcc9a197.x86_64 - origin-node-0:3.10.0-1.module_2135+dcc9a197.x86_64 - origin-pod-0:3.10.0-1.module_2135+dcc9a197.x86_64 - origin-sdn-ovs-0:3.10.0-1.module_2135+dcc9a197.x86_64 - origin-service-catalog-0:3.10.0-1.module_2135+dcc9a197.x86_64 - origin-template-service-broker-0:3.10.0-1.module_2135+dcc9a197.x86_64 - origin-tests-0:3.10.0-1.module_2135+dcc9a197.x86_64 - origin-web-console-0:3.10.0-1.module_2135+dcc9a197.x86_64 ... --- document: modulemd version: 2 data: name: kubernetes stream: 1.10 version: 20180827150115 context: 6c81f848 arch: x86_64 summary: Container cluster management description: >- Kubernetes is an open source system for managing containerized applications across multiple hosts; providing basic mechanisms for deployment, maintenance, and scaling of applications. Kubernetes builds upon a decade and a half of experience at Google running production workloads at scale using a system called Borg, combined with best-of-breed ideas and practices from the community. license: module: - MIT content: - MIT xmd: mbs: mse: TRUE scmurl: https://src.fedoraproject.org/modules/kubernetes.git?#98c4546e08fdd6b6adf3d9dc35d374becffc2116 commit: 98c4546e08fdd6b6adf3d9dc35d374becffc2116 buildrequires: platform: ref: f29 stream: f29 context: 00000000 version: 5 filtered_rpms: [] rpms: kubernetes: ref: 41689fd5bb5de3125b738270c51c81ccd4b26dd7 dependencies: - buildrequires: platform: [f29] requires: platform: [f29] references: community: https://github.com/kubernetes/kubernetes documentation: https://github.com/kubernetes/kubernetes tracker: https://github.com/kubernetes/kubernetes profiles: default: rpms: - kubernetes - kubernetes-client - kubernetes-kubeadm - kubernetes-server - kubernetes-node api: rpms: - kubernetes buildopts: rpms: macros: | %_with_ignore_tests 1 components: rpms: kubernetes: rationale: Primary module component. repository: git+https://src.fedoraproject.org/rpms/kubernetes cache: https://src.fedoraproject.org/repo/pkgs/kubernetes ref: 1.10 artifacts: rpms: - kubernetes-0:1.10.3-1.module_2132+faf1362b.x86_64 - kubernetes-client-0:1.10.3-1.module_2132+faf1362b.x86_64 - kubernetes-devel-0:1.10.3-1.module_2132+faf1362b.noarch - kubernetes-kubeadm-0:1.10.3-1.module_2132+faf1362b.x86_64 - kubernetes-server-0:1.10.3-1.module_2132+faf1362b.x86_64 - kubernetes-node-0:1.10.3-1.module_2132+faf1362b.x86_64 - kubernetes-unit-test-0:1.10.3-1.module_2132+faf1362b.x86_64 ... --- document: modulemd version: 2 data: name: hub stream: pre-release version: 20180816140655 context: 6c81f848 arch: x86_64 summary: A command-line wrapper for git with github shortcuts description: >- hub is a command line tool that wraps `git` in order to extend it with extra features and commands that make working with GitHub easier. $ hub clone rtomayko/tilt # expands to: $ git clone git://github.com/rtomayko/tilt.git license: module: - MIT content: - MIT xmd: mbs: mse: TRUE scmurl: https://src.fedoraproject.org/modules/hub.git?#44bb53f774b6561906da5d069b055fa2b02a38ef commit: 44bb53f774b6561906da5d069b055fa2b02a38ef buildrequires: platform: ref: f29 stream: f29 context: 00000000 version: 5 filtered_rpms: [] rpms: hub: ref: 65f4d09cbf742ef0bb58cf0a9b8c7d1c05295492 dependencies: - buildrequires: platform: [f29] requires: platform: [f29] references: community: https://hub.github.com documentation: https://hub.github.com tracker: https://github.com/github/hub/issues profiles: default: rpms: - hub api: rpms: - hub components: rpms: hub: rationale: A command-line wrapper for git with github shortcuts repository: git://pkgs.fedoraproject.org/rpms/hub cache: http://pkgs.fedoraproject.org/repo/pkgs/hub ref: pre-release artifacts: rpms: - hub-0:prerelease-8.module_1978+3584bea7.x86_64 ... --- document: modulemd version: 2 data: name: golang-ecosystem stream: 2018.0 version: 20180816154327 context: cbfb2833 arch: x86_64 summary: The ecosystem of packages for the Go programming language description: >- This module contains golang based tools used as dependencies for other packages, for instance, go-md2man, a manpage converter written in Go, along with rpm macros for building Go based tools. license: module: - MIT content: - MIT xmd: mbs: mse: TRUE scmurl: https://src.fedoraproject.org/modules/golang-ecosystem.git?#1654fad1d9abf46a7d4f7845ea9e847b762f08a5 commit: 1654fad1d9abf46a7d4f7845ea9e847b762f08a5 buildrequires: platform: ref: f29 stream: f29 context: 00000000 version: 5 filtered_rpms: [] golang: ref: 92882e9696b779110fd27aa11ddbc88f30eb82a2 stream: 1.10 context: 6c81f848 version: 20180816140129 filtered_rpms: [] rpms: go-srpm-macros: ref: 4f85e708533960d6edfcb6e4eef29be758b25087 go-compilers: ref: f40831872a58d2b2b28219d8ddf2931cb2f0bc2e golang-github-russross-blackfriday: ref: 5b8c2ba534b8019529df9d58b92027c6a976b40e golang-github-cpuguy83-go-md2man: ref: 5cdf8051cae5c0596f975d526ac476e6fb4ad5f0 dependencies: - buildrequires: platform: [f29] requires: platform: [f29] references: community: https://github.com/golang-github-cpuguy83-go-md2man documentation: https://github.com/golang-github-cpuguy83-go-md2man tracker: https://github.com/golang-github-cpuguy83-go-md2man profiles: default: rpms: - go-compilers - go-srpm-macros - golang-github-cpuguy83-go-md2man - golang-github-russross-blackfriday api: rpms: - go-compilers-golang-compiler - go-srpm-macros - golang-github-cpuguy83-go-md2man buildopts: rpms: macros: | %_with_ignore_tests 1 components: rpms: go-compilers: rationale: Build dependency for Go packages. repository: git://pkgs.fedoraproject.org/rpms/go-compilers cache: http://pkgs.fedoraproject.org/repo/pkgs/go-compilers ref: f28 go-srpm-macros: rationale: Build dependency for Go packages. repository: git://pkgs.fedoraproject.org/rpms/go-srpm-macros cache: http://pkgs.fedoraproject.org/repo/pkgs/go-srpm-macros ref: f28 buildorder: 1 golang-github-cpuguy83-go-md2man: rationale: Primary component of this module. repository: git://pkgs.fedoraproject.org/rpms/golang-github-cpuguy83-go-md2man cache: http://pkgs.fedoraproject.org/repo/pkgs/golang-github-cpuguy83-go-md2man ref: f28 buildorder: 3 golang-github-russross-blackfriday: rationale: Build dependency for go-md2man. repository: git://pkgs.fedoraproject.org/rpms/golang-github-russross-blackfriday cache: http://pkgs.fedoraproject.org/repo/pkgs/golang-github-russross-blackfriday ref: f28 buildorder: 2 artifacts: rpms: - go-compilers-golang-compiler-0:1-30.module_1812+d7358d9b.x86_64 - go-srpm-macros-0:2-17.module_1812+d7358d9b.noarch - golang-github-cpuguy83-go-md2man-0:1.0.7-6.20180307git1d903dc.module_2094+e5918054.x86_64 - golang-github-cpuguy83-go-md2man-devel-0:1.0.7-6.20180307git1d903dc.module_2094+e5918054.noarch - golang-github-russross-blackfriday-devel-0:2.0.0-2.20180628git55d61fa.module_2094+e5918054.noarch ... --- document: modulemd version: 2 data: name: golang-ecosystem stream: 2017.0 version: 20180816154241 context: cbfb2833 arch: x86_64 summary: The ecosystem of packages for the Go programming language description: >- This module contains golang based tools used as dependencies for other packages, for instance, go-md2man, a manpage converter written in Go, along with rpm macros for building Go based tools. license: module: - MIT content: - MIT xmd: mbs: mse: TRUE scmurl: https://src.fedoraproject.org/modules/golang-ecosystem.git?#384b17a75c5c9be71c913651126d6899e42e8d84 commit: 384b17a75c5c9be71c913651126d6899e42e8d84 buildrequires: platform: ref: f29 stream: f29 context: 00000000 version: 5 filtered_rpms: [] golang: ref: 92882e9696b779110fd27aa11ddbc88f30eb82a2 stream: 1.10 context: 6c81f848 version: 20180816140129 filtered_rpms: [] rpms: go-srpm-macros: ref: 4f85e708533960d6edfcb6e4eef29be758b25087 go-compilers: ref: f40831872a58d2b2b28219d8ddf2931cb2f0bc2e golang-github-russross-blackfriday: ref: 5b8c2ba534b8019529df9d58b92027c6a976b40e golang-github-cpuguy83-go-md2man: ref: 5cdf8051cae5c0596f975d526ac476e6fb4ad5f0 dependencies: - buildrequires: platform: [f29] requires: platform: [f29] references: community: https://github.com/golang-github-cpuguy83-go-md2man documentation: https://github.com/golang-github-cpuguy83-go-md2man tracker: https://github.com/golang-github-cpuguy83-go-md2man profiles: default: rpms: - go-compilers - go-srpm-macros - golang-github-cpuguy83-go-md2man - golang-github-russross-blackfriday api: rpms: - go-compilers-golang-compiler - go-srpm-macros - golang-github-cpuguy83-go-md2man buildopts: rpms: macros: | %_with_ignore_tests 1 components: rpms: go-compilers: rationale: Build dependency for Go packages. repository: git://pkgs.fedoraproject.org/rpms/go-compilers cache: http://pkgs.fedoraproject.org/repo/pkgs/go-compilers ref: f28 go-srpm-macros: rationale: Build dependency for Go packages. repository: git://pkgs.fedoraproject.org/rpms/go-srpm-macros cache: http://pkgs.fedoraproject.org/repo/pkgs/go-srpm-macros ref: f28 buildorder: 1 golang-github-cpuguy83-go-md2man: rationale: Primary component of this module. repository: git://pkgs.fedoraproject.org/rpms/golang-github-cpuguy83-go-md2man cache: http://pkgs.fedoraproject.org/repo/pkgs/golang-github-cpuguy83-go-md2man ref: f28 buildorder: 3 golang-github-russross-blackfriday: rationale: Build dependency for go-md2man. repository: git://pkgs.fedoraproject.org/rpms/golang-github-russross-blackfriday cache: http://pkgs.fedoraproject.org/repo/pkgs/golang-github-russross-blackfriday ref: f28 buildorder: 2 artifacts: rpms: - go-compilers-golang-compiler-0:1-30.module_1941+86fd1e0a.x86_64 - go-srpm-macros-0:2-17.module_1941+86fd1e0a.noarch - golang-github-cpuguy83-go-md2man-0:1.0.7-6.20180307git1d903dc.module_1941+86fd1e0a.x86_64 - golang-github-cpuguy83-go-md2man-devel-0:1.0.7-6.20180307git1d903dc.module_1941+86fd1e0a.noarch - golang-github-russross-blackfriday-devel-0:2.0.0-2.20180628git55d61fa.module_1941+86fd1e0a.noarch ... --- document: modulemd version: 2 data: name: golang stream: 1.10 version: 20180816140129 context: 6c81f848 arch: x86_64 summary: The Go Programming Language description: >- This module provides the Go compiler and associated tools and documentation. license: module: - MIT content: - MIT xmd: mbs: mse: TRUE scmurl: https://src.fedoraproject.org/modules/golang.git?#92882e9696b779110fd27aa11ddbc88f30eb82a2 commit: 92882e9696b779110fd27aa11ddbc88f30eb82a2 buildrequires: platform: ref: f29 stream: f29 context: 00000000 version: 5 filtered_rpms: [] rpms: golang: ref: c333e76e869a626eb5936d311dc4ba4c29a10e09 dependencies: - buildrequires: platform: [f29] requires: platform: [f29] references: community: https://groups.google.com/forum/#!forum/golang-nuts documentation: https://golang.org/doc tracker: https://github.com/golang/go/issues profiles: default: rpms: - golang api: rpms: - golang - golang-bin - golang-docs - golang-misc - golang-race - golang-shared - golang-src - golang-tests buildopts: rpms: macros: | %_with_ignore_tests 1 components: rpms: golang: rationale: Primary component of this module repository: git://pkgs.fedoraproject.org/rpms/golang cache: http://pkgs.fedoraproject.org/repo/pkgs/golang ref: f28 artifacts: rpms: - golang-0:1.10.3-1.module_2044+a37cc272.x86_64 - golang-bin-0:1.10.3-1.module_2044+a37cc272.x86_64 - golang-docs-0:1.10.3-1.module_2044+a37cc272.noarch - golang-misc-0:1.10.3-1.module_2044+a37cc272.noarch - golang-race-0:1.10.3-1.module_2044+a37cc272.x86_64 - golang-shared-0:1.10.3-1.module_2044+a37cc272.x86_64 - golang-src-0:1.10.3-1.module_2044+a37cc272.noarch - golang-tests-0:1.10.3-1.module_2044+a37cc272.noarch ... --- document: modulemd version: 2 data: name: gimp stream: 2.10 version: 20180824144949 context: 6c81f848 arch: x86_64 summary: GIMP description: >- A module containing GIMP, the GNU Image Manipulation Program. license: module: - MIT content: - MIT xmd: mbs: mse: TRUE scmurl: https://src.fedoraproject.org/modules/gimp.git?#413d972eaa41fbdfdff2a4fc6dfe909c0bee0f74 commit: 413d972eaa41fbdfdff2a4fc6dfe909c0bee0f74 buildrequires: platform: ref: f29 stream: f29 context: 00000000 version: 5 filtered_rpms: [] rpms: gimp: ref: 5806be946febc58b68ec28a3af16eab0e9207435 dependencies: - buildrequires: platform: [f29] requires: platform: [f29] references: community: https://www.gimp.org/ documentation: https://www.gimp.org/docs/ tracker: https://www.gimp.org/bugs/ profiles: default: rpms: - gimp devel: rpms: - gimp-devel - gimp-devel-tools api: rpms: - gimp - gimp-devel - gimp-devel-tools - gimp-libs components: rpms: gimp: rationale: The API of this module. repository: git+https://src.fedoraproject.org/rpms/gimp cache: https://src.fedoraproject.org/repo/pkgs/gimp ref: 2.10 artifacts: rpms: - gimp-2:2.10.6-2.module_2129+8576126a.x86_64 - gimp-devel-2:2.10.6-2.module_2129+8576126a.x86_64 - gimp-devel-tools-2:2.10.6-2.module_2129+8576126a.x86_64 - gimp-libs-2:2.10.6-2.module_2129+8576126a.x86_64 ... --- document: modulemd version: 2 data: name: gcsf stream: main version: 20180804153258 context: b33445dc arch: x86_64 summary: FUSE file system based on Google Drive description: > GCSF is a virtual filesystem that allows users to mount their Google Drive account locally and interact with it as a regular disk partition. license: module: - MIT content: - MIT xmd: mbs: mse: TRUE scmurl: https://src.fedoraproject.org/modules/gcsf.git?#bb5cd4eaae70cda43091e1bf45043d38fa155064 commit: bb5cd4eaae70cda43091e1bf45043d38fa155064 buildrequires: platform: ref: f29 stream: f29 context: 00000000 version: 5 filtered_rpms: [] rpms: rust-gcsf: ref: 56af97ed27afeccc68bddffac38606da5b8f8ed7 dependencies: - buildrequires: platform: [f29] requires: platform: [] references: community: https://github.com/harababurel/gcsf documentation: https://github.com/harababurel/gcsf/blob/ad5d8bbd6d55254eb94a056292e9872662bb65c5/README.md tracker: https://github.com/harababurel/gcsf/issues profiles: default: rpms: - gcsf api: rpms: - gcsf components: rpms: rust-gcsf: rationale: Main component. repository: git://pkgs.fedoraproject.org/rpms/rust-gcsf cache: http://pkgs.fedoraproject.org/repo/pkgs/rust-gcsf ref: main artifacts: rpms: - gcsf-0:0.1.17-1.module_1970+c9821572.x86_64 - rust-gcsf-devel-0:0.1.17-1.module_1970+c9821572.noarch ... --- document: modulemd version: 2 data: name: flatpak-runtime stream: f29 version: 20180821220306 context: 6c81f848 arch: x86_64 summary: Flatpak Runtime description: >- This module defines two runtimes for Flatpaks, the 'runtime' profile that most Flatpaks in Fedora use, and a smaller 'runtime-base' profile that is intended to be more minimal and (slightly) more API stable. There are also corresponding sdk and sdk-base profiles that are used to build SDKs that applications can be built against with flatpak-builder. license: module: - MIT content: - MIT xmd: flatpak: runtimes: sdk: id: org.fedoraproject.Sdk sdk: org.fedoraproject.Platform sdk-base: id: org.fedoraproject.BaseSdk sdk: org.fedoraproject.BasePlatform runtime: id: org.fedoraproject.Platform sdk: org.fedoraproject.Sdk runtime-base: id: org.fedoraproject.BasePlatform sdk: org.fedoraproject.BaseSdk branch: f29 mbs: mse: TRUE scmurl: https://src.fedoraproject.org/modules/flatpak-runtime.git?#32b413f59feb051f360b242d065496f330f2ae9a commit: 32b413f59feb051f360b242d065496f330f2ae9a buildrequires: platform: ref: f29 stream: f29 context: 00000000 version: 5 filtered_rpms: [] rpms: flatpak-runtime-config: ref: eab96c8f9b8f4c96b8e1eddd0fb57bb64025da61 flatpak-rpm-macros: ref: e51f66a27ac1c1ef5ae64be5aef3bdcde2124b64 dependencies: - buildrequires: platform: [f29] requires: platform: [f29] profiles: buildroot: rpms: - flatpak-rpm-macros - flatpak-runtime-config runtime: rpms: - ModemManager-glib - SDL2 - SDL2_image - SDL2_mixer - SDL2_net - SDL2_ttf - abattis-cantarell-fonts - acl - adwaita-cursor-theme - adwaita-gtk2-theme - adwaita-icon-theme - alsa-lib - aspell - at-spi2-atk - at-spi2-core - atk - attr - audit-libs - avahi-glib - avahi-libs - basesystem - bash - brotli - bzip2 - bzip2-libs - ca-certificates - cairo - cairo-gobject - cdparanoia-libs - chkconfig - clutter - clutter-gst3 - clutter-gtk - cogl - colord-libs - compat-readline6 - coreutils - coreutils-common - cpio - cracklib - crypto-policies - cryptsetup-libs - cups-libs - curl - cyrus-sasl-lib - dbus - dbus-common - dbus-daemon - dbus-glib - dbus-libs - dbus-tools - dbus-x11 - dconf - dejavu-fonts-common - dejavu-sans-fonts - dejavu-sans-mono-fonts - dejavu-serif-fonts - desktop-file-utils - device-mapper - device-mapper-libs - elfutils - elfutils-default-yama-scope - elfutils-libelf - elfutils-libs - emacs-filesystem - enchant - eosrei-emojione-fonts - expat - fedora-gpg-keys - fedora-release - fedora-repos - fedora-repos-rawhide - file - file-libs - filesystem - findutils - flac-libs - flatpak-runtime-config - fontconfig - fontpackages-filesystem - freetype - fribidi - gawk - gcr - gdbm - gdbm-libs - gdk-pixbuf2 - gdk-pixbuf2-modules - geoclue2 - geoclue2-libs - gjs - glib-networking - glib2 - glibc - glibc-all-langpacks - glibc-common - glibc-minimal-langpack - gmp - gnome-themes-extra - gnu-free-fonts-common - gnu-free-mono-fonts - gnu-free-sans-fonts - gnu-free-serif-fonts - gnupg - gnupg2 - gnupg2-smime - gnutls - gobject-introspection - google-crosextra-caladea-fonts - google-crosextra-carlito-fonts - google-noto-emoji-color-fonts - gpgme - graphite2 - grep - gsettings-desktop-schemas - gsm - gssdp - gstreamer1 - gstreamer1-plugins-bad-free - gstreamer1-plugins-base - gtk-update-icon-cache - gtk2 - gtk2-engines - gtk3 - gupnp - gupnp-igd - gzip - harfbuzz - harfbuzz-icu - hicolor-icon-theme - hunspell - hunspell-en-US - hwdata - hyphen - ibus-libs - info - iptables-libs - iso-codes - jasper-libs - jbigkit-libs - json-c - json-glib - keyutils-libs - kmod-libs - krb5-libs - krb5-server - krb5-workstation - lcms2 - lcms2-utils - less - libICE - libSM - libX11 - libX11-common - libX11-xcb - libXScrnSaver - libXau - libXcomposite - libXcursor - libXdamage - libXdmcp - libXext - libXfixes - libXft - libXi - libXinerama - libXpm - libXrandr - libXrender - libXt - libXtst - libXv - libXxf86vm - libacl - libappstream-glib - libarchive - libargon2 - libassuan - libasyncns - libatomic - libattr - libblkid - libcanberra - libcanberra-gtk2 - libcanberra-gtk3 - libcap - libcap-ng - libcom_err - libcroco - libcurl - libdatrie - libdb - libdrm - libdvdnav - libdvdread - libedit - libepoxy - liberation-fonts-common - liberation-mono-fonts - liberation-sans-fonts - liberation-serif-fonts - libev - libevdev - libexif - libfdisk - libffi - libgcab1 - libgcc - libgcrypt - libgfortran - libglvnd - libglvnd-egl - libglvnd-gles - libglvnd-glx - libglvnd-opengl - libgomp - libgpg-error - libgudev - libgusb - libicu - libidn2 - libinput - libjpeg-turbo - libkadm5 - libksba - libmetalink - libmodman - libmount - libmpc - libmpcdec - libnghttp2 - libnice - libnotify - libnsl - libnsl2 - libogg - libpcap - libpciaccess - libpkgconf - libpng - libproxy - libpsl - libpwquality - libquadmath - librsvg2 - librsvg2-tools - libsamplerate - libseccomp - libsecret - libselinux - libsemanage - libsepol - libsigsegv - libsmartcols - libsndfile - libsoup - libsrtp - libss - libssh - libstdc++ - libstemmer - libtasn1 - libtdb - libthai - libtheora - libtiff - libtirpc - libtool-ltdl - libunistring - libusb - libusbx - libutempter - libuuid - libvdpau - libverto - libverto-libev - libvisual - libvorbis - libwacom - libwacom-data - libwayland-client - libwayland-cursor - libwayland-egl - libwayland-server - libwebp - libxcb - libxcrypt - libxkbcommon - libxkbcommon-x11 - libxml2 - libxshmfence - libxslt - llvm-libs - llvm6.0-libs - logrotate - lz4-libs - mesa-dri-drivers - mesa-filesystem - mesa-libEGL - mesa-libGL - mesa-libgbm - mesa-libglapi - mesa-libxatracker - mesa-vulkan-drivers - mlocate - mozjs52 - mpfr - mpg123-libs - mtdev - mythes - ncompress - ncurses - ncurses-base - ncurses-compat-libs - ncurses-libs - nettle - npth - nspr - nss - nss-softokn - nss-softokn-freebl - nss-sysinit - nss-tools - nss-util - ocl-icd - openal-soft - openldap - openssl - openssl-libs - opus - orc - p11-kit - p11-kit-trust - pam - pango - pcre - pcre-cpp - pcre2 - pcre2-utf16 - pcre2-utf32 - pinentry - pixman - pkgconf - pkgconf-m4 - pkgconf-pkg-config - popt - procps-ng - publicsuffix-list-dafsa - pulseaudio-libs - pulseaudio-libs-glib2 - pulseaudio-utils - python-pip-wheel - python-setuptools-wheel - python-unversioned-command - python2 - python2-libproxy - python2-libs - python2-libxml2 - python2-pip - python2-setuptools - python3 - python3-libs - python3-pip - python3-setuptools - qrencode-libs - readline - rest - rpcgen - sed - setup - shadow-utils - shared-mime-info - sound-theme-freedesktop - soundtouch - speex - speexdsp - spirv-tools-libs - sqlite-libs - systemd - systemd-libs - systemd-pam - tar - turbojpeg - tzdata - unzip - util-linux - vte-profile - vte291 - vulkan-loader - vulkan-validation-layers - webkit2gtk3 - webkit2gtk3-jsc - webrtc-audio-processing - which - woff2 - words - xcb-util - xcb-util-cursor - xcb-util-image - xcb-util-keysyms - xcb-util-renderutil - xcb-util-wm - xdg-user-dirs - xdg-utils - xkeyboard-config - xml-common - xz - xz-libs - xz-lzma-compat - yelp - yelp-libs - yelp-xsl - zenity - zip - zlib runtime-base: rpms: - ModemManager-glib - SDL2 - SDL2_image - SDL2_mixer - SDL2_net - SDL2_ttf - acl - adwaita-cursor-theme - adwaita-icon-theme - alsa-lib - aspell - at-spi2-atk - at-spi2-core - atk - attr - audit-libs - avahi-glib - avahi-libs - basesystem - bash - brotli - bzip2 - bzip2-libs - ca-certificates - cairo - cairo-gobject - cdparanoia-libs - chkconfig - colord-libs - compat-readline6 - coreutils - coreutils-common - cpio - cracklib - crypto-policies - cryptsetup-libs - cups-libs - curl - cyrus-sasl-lib - dbus - dbus-common - dbus-daemon - dbus-libs - dbus-tools - dbus-x11 - dconf - dejavu-fonts-common - dejavu-sans-fonts - dejavu-sans-mono-fonts - dejavu-serif-fonts - desktop-file-utils - device-mapper - device-mapper-libs - elfutils - elfutils-default-yama-scope - elfutils-libelf - elfutils-libs - emacs-filesystem - eosrei-emojione-fonts - expat - fedora-gpg-keys - fedora-release - fedora-repos - fedora-repos-rawhide - file - file-libs - filesystem - findutils - flac-libs - flatpak-runtime-config - fontconfig - fontpackages-filesystem - freetype - fribidi - gawk - gdbm - gdbm-libs - gdk-pixbuf2 - gdk-pixbuf2-modules - geoclue2 - geoclue2-libs - glib-networking - glib2 - glibc - glibc-all-langpacks - glibc-common - glibc-minimal-langpack - gmp - gnu-free-fonts-common - gnu-free-mono-fonts - gnu-free-sans-fonts - gnu-free-serif-fonts - gnupg - gnupg2 - gnupg2-smime - gnutls - gobject-introspection - google-crosextra-caladea-fonts - google-crosextra-carlito-fonts - gpgme - graphite2 - grep - gsettings-desktop-schemas - gsm - gssdp - gstreamer1 - gstreamer1-plugins-bad-free - gstreamer1-plugins-base - gtk-update-icon-cache - gtk3 - gupnp - gupnp-igd - gzip - harfbuzz - harfbuzz-icu - hicolor-icon-theme - hunspell - hunspell-en-US - hwdata - hyphen - ibus-libs - info - iptables-libs - iso-codes - jasper-libs - jbigkit-libs - json-c - json-glib - keyutils-libs - kmod-libs - krb5-libs - krb5-server - krb5-workstation - lcms2 - lcms2-utils - less - libICE - libSM - libX11 - libX11-common - libX11-xcb - libXScrnSaver - libXau - libXcomposite - libXcursor - libXdamage - libXdmcp - libXext - libXfixes - libXft - libXi - libXinerama - libXpm - libXrandr - libXrender - libXt - libXtst - libXv - libXxf86vm - libacl - libappstream-glib - libarchive - libargon2 - libassuan - libasyncns - libatomic - libattr - libblkid - libcap - libcap-ng - libcom_err - libcroco - libcurl - libdatrie - libdb - libdrm - libdvdnav - libdvdread - libedit - libepoxy - liberation-fonts-common - liberation-mono-fonts - liberation-sans-fonts - liberation-serif-fonts - libev - libexif - libfdisk - libffi - libgcab1 - libgcc - libgcrypt - libgfortran - libglvnd - libglvnd-egl - libglvnd-gles - libglvnd-glx - libglvnd-opengl - libgomp - libgpg-error - libgudev - libgusb - libicu - libidn2 - libjpeg-turbo - libkadm5 - libksba - libmetalink - libmodman - libmount - libmpc - libmpcdec - libnghttp2 - libnice - libnotify - libnsl - libnsl2 - libogg - libpcap - libpciaccess - libpkgconf - libpng - libproxy - libpsl - libpwquality - libquadmath - librsvg2 - librsvg2-tools - libsamplerate - libseccomp - libsecret - libselinux - libsemanage - libsepol - libsigsegv - libsmartcols - libsndfile - libsoup - libsrtp - libss - libssh - libstdc++ - libstemmer - libtasn1 - libthai - libtheora - libtiff - libtirpc - libtool-ltdl - libunistring - libusb - libusbx - libutempter - libuuid - libvdpau - libverto - libverto-libev - libvisual - libvorbis - libwayland-client - libwayland-cursor - libwayland-egl - libwayland-server - libwebp - libxcb - libxcrypt - libxkbcommon - libxkbcommon-x11 - libxml2 - libxshmfence - libxslt - llvm-libs - llvm6.0-libs - logrotate - lz4-libs - mesa-libEGL - mesa-libGL - mesa-libgbm - mesa-libglapi - mesa-libxatracker - mesa-vulkan-drivers - mlocate - mpfr - mpg123-libs - mythes - ncompress - ncurses - ncurses-base - ncurses-compat-libs - ncurses-libs - nettle - npth - nspr - nss - nss-softokn - nss-softokn-freebl - nss-sysinit - nss-tools - nss-util - ocl-icd - openal-soft - openldap - openssl - openssl-libs - opus - orc - p11-kit - p11-kit-trust - pam - pango - pcre - pcre-cpp - pcre2 - pcre2-utf16 - pcre2-utf32 - pinentry - pixman - pkgconf - pkgconf-m4 - pkgconf-pkg-config - popt - procps-ng - publicsuffix-list-dafsa - pulseaudio-libs - pulseaudio-libs-glib2 - pulseaudio-utils - python-unversioned-command - python2 - python2-libproxy - python2-libs - python2-libxml2 - python2-pip - python2-setuptools - python3 - python3-libs - python3-pip - python3-setuptools - qrencode-libs - readline - rest - rpcgen - sed - setup - shadow-utils - shared-mime-info - soundtouch - speex - speexdsp - spirv-tools-libs - sqlite-libs - systemd - systemd-libs - systemd-pam - tar - turbojpeg - tzdata - unzip - util-linux - vulkan-loader - vulkan-validation-layers - webrtc-audio-processing - which - words - xcb-util - xcb-util-cursor - xcb-util-image - xcb-util-keysyms - xcb-util-renderutil - xcb-util-wm - xdg-user-dirs - xdg-utils - xkeyboard-config - xml-common - xz - xz-libs - xz-lzma-compat - zenity - zip - zlib sdk: rpms: - ModemManager-glib - SDL2 - SDL2-devel - SDL2_image - SDL2_image-devel - SDL2_mixer - SDL2_mixer-devel - SDL2_net - SDL2_net-devel - SDL2_ttf - SDL2_ttf-devel - abattis-cantarell-fonts - acl - adwaita-cursor-theme - adwaita-gtk2-theme - adwaita-icon-theme - adwaita-icon-theme-devel - alsa-lib - alsa-lib-devel - annobin - aspell - aspell-devel - at-spi2-atk - at-spi2-atk-devel - at-spi2-core - at-spi2-core-devel - atk - atk-devel - attr - audit-libs - autoconf - autoconf-archive - autogen-libopts - automake - avahi-glib - avahi-libs - basesystem - bash - bash-completion - bc - binutils - bison - boost-regex - brotli - brotli-devel - byacc - bzip2 - bzip2-devel - bzip2-libs - ca-certificates - cairo - cairo-devel - cairo-gobject - cairo-gobject-devel - cairo-tools - ccache - cdparanoia-libs - check - check-devel - chkconfig - chrpath - clang - clang-analyzer - clang-devel - clang-libs - clang-tools-extra - clutter - clutter-devel - clutter-gst3 - clutter-gst3-devel - clutter-gtk - clutter-gtk-devel - cmake - cmake-data - cmake-filesystem - cmake-rpm-macros - cogl - cogl-devel - colord-libs - compat-readline6 - coreutils - coreutils-common - cpio - cpp - cracklib - cracklib-devel - crypto-policies - cryptsetup-libs - ctags - cups-devel - cups-libs - curl - cvs - cvsps - cyrus-sasl - cyrus-sasl-devel - cyrus-sasl-lib - dbus - dbus-common - dbus-daemon - dbus-devel - dbus-glib - dbus-glib-devel - dbus-libs - dbus-tools - dbus-x11 - dconf - dconf-devel - dejavu-fonts-common - dejavu-sans-fonts - dejavu-sans-mono-fonts - dejavu-serif-fonts - desktop-file-utils - device-mapper - device-mapper-libs - diffutils - docbook-dtds - docbook-style-dsssl - docbook-style-xsl - docbook-utils - dwz - e2fsprogs - e2fsprogs-devel - e2fsprogs-libs - efi-srpm-macros - elfutils - elfutils-default-yama-scope - elfutils-devel - elfutils-libelf - elfutils-libelf-devel - elfutils-libs - elinks - emacs-filesystem - enchant - enchant-devel - eosrei-emojione-fonts - expat - expat-devel - fedora-gpg-keys - fedora-release - fedora-repos - fedora-repos-rawhide - file - file-libs - filesystem - findutils - fipscheck - fipscheck-lib - flac - flac-devel - flac-libs - flatpak-runtime-config - flex - fontconfig - fontconfig-devel - fontpackages-filesystem - fpc-srpm-macros - freetype - freetype-devel - fribidi - fribidi-devel - fuse-libs - gawk - gc - gcc - gcc-c++ - gcr - gcr-devel - gdb - gdb-headless - gdbm - gdbm-devel - gdbm-libs - gdk-pixbuf2 - gdk-pixbuf2-devel - gdk-pixbuf2-modules - geoclue2 - geoclue2-devel - geoclue2-libs - gettext - gettext-common-devel - gettext-devel - gettext-libs - ghc-srpm-macros - giflib - giflib-devel - git - git-clang-format - git-core - git-core-doc - git-cvs - gjs - gjs-devel - glib-networking - glib2 - glib2-devel - glibc - glibc-all-langpacks - glibc-common - glibc-devel - glibc-headers - glibc-minimal-langpack - gmp - gmp-c++ - gmp-devel - gnat-srpm-macros - gnome-common - gnome-themes-extra - gnu-free-fonts-common - gnu-free-mono-fonts - gnu-free-sans-fonts - gnu-free-serif-fonts - gnupg - gnupg2 - gnupg2-smime - gnutls - gnutls-c++ - gnutls-dane - gnutls-devel - gnutls-utils - go-srpm-macros - gobject-introspection - gobject-introspection-devel - google-crosextra-caladea-fonts - google-crosextra-carlito-fonts - google-noto-emoji-color-fonts - gperf - gpgme - gpgme-devel - gpm-libs - graphite2 - graphite2-devel - grep - groff - groff-base - groff-perl - gsettings-desktop-schemas - gsettings-desktop-schemas-devel - gsm - gssdp - gstreamer1 - gstreamer1-devel - gstreamer1-plugins-bad-free - gstreamer1-plugins-bad-free-devel - gstreamer1-plugins-base - gstreamer1-plugins-base-devel - gtk-doc - gtk-update-icon-cache - gtk2 - gtk2-devel - gtk2-engines - gtk2-engines-devel - gtk3 - gtk3-devel - guile - gupnp - gupnp-igd - gvfs-client - gvfs-devel - gzip - harfbuzz - harfbuzz-devel - harfbuzz-icu - hicolor-icon-theme - hunspell - hunspell-devel - hunspell-en-US - hwdata - hyphen - hyphen-devel - ibus - ibus-devel - ibus-gtk2 - ibus-gtk3 - ibus-libs - ibus-setup - icu - info - intltool - iptables-libs - isl - iso-codes - iso-codes-devel - itstool - jasper-libs - jbigkit-libs - jq - jq-devel - json-c - json-c-devel - json-glib - json-glib-devel - jsoncpp - kernel-headers - keyutils-libs - keyutils-libs-devel - kmod-libs - krb5-devel - krb5-libs - krb5-server - krb5-workstation - lcms2 - lcms2-devel - lcms2-utils - less - libICE - libICE-devel - libSM - libSM-devel - libX11 - libX11-common - libX11-devel - libX11-xcb - libXScrnSaver - libXScrnSaver-devel - libXau - libXau-devel - libXaw - libXcomposite - libXcomposite-devel - libXcursor - libXcursor-devel - libXdamage - libXdamage-devel - libXdmcp - libXdmcp-devel - libXext - libXext-devel - libXfixes - libXfixes-devel - libXft - libXft-devel - libXi - libXi-devel - libXinerama - libXinerama-devel - libXmu - libXpm - libXpm-devel - libXrandr - libXrandr-devel - libXrender - libXrender-devel - libXt - libXt-devel - libXtst - libXtst-devel - libXv - libXv-devel - libXxf86misc - libXxf86vm - libXxf86vm-devel - libacl - libacl-devel - libappstream-glib - libappstream-glib-builder - libappstream-glib-builder-devel - libappstream-glib-devel - libarchive - libarchive-devel - libargon2 - libassuan - libassuan-devel - libasyncns - libatomic - libatomic_ops - libatomic_ops-devel - libattr - libattr-devel - libbabeltrace - libblkid - libblkid-devel - libcanberra - libcanberra-devel - libcanberra-gtk2 - libcanberra-gtk3 - libcap - libcap-devel - libcap-ng - libcom_err - libcom_err-devel - libcroco - libcroco-devel - libcurl - libcurl-devel - libdatrie - libdatrie-devel - libdb - libdb-cxx - libdb-cxx-devel - libdb-devel - libdb-utils - libdrm - libdrm-devel - libdvdnav - libdvdread - libedit - libedit-devel - libepoxy - libepoxy-devel - liberation-fonts-common - liberation-mono-fonts - liberation-sans-fonts - liberation-serif-fonts - libev - libevdev - libevent - libexif - libexif-devel - libfdisk - libfdisk-devel - libffi - libffi-devel - libgcab1 - libgcab1-devel - libgcc - libgcrypt - libgcrypt-devel - libgfortran - libglvnd - libglvnd-core-devel - libglvnd-devel - libglvnd-egl - libglvnd-gles - libglvnd-glx - libglvnd-opengl - libgomp - libgpg-error - libgpg-error-devel - libgudev - libgusb - libicu - libicu-devel - libidn - libidn-devel - libidn2 - libinput - libinput-devel - libipt - libjpeg-turbo - libjpeg-turbo-devel - libkadm5 - libksba - libmcpp - libmetalink - libmodman - libmount - libmount-devel - libmpc - libmpc-devel - libmpcdec - libnghttp2 - libnice - libnotify - libnotify-devel - libnsl - libnsl2 - libnsl2-devel - libogg - libogg-devel - libpcap - libpciaccess - libpciaccess-devel - libpipeline - libpkgconf - libpng - libpng-devel - libproxy - libproxy-devel - libpsl - libpwquality - libquadmath - librsvg2 - librsvg2-devel - librsvg2-tools - libsamplerate - libsamplerate-devel - libseccomp - libseccomp-devel - libsecret - libsecret-devel - libselinux - libselinux-devel - libsemanage - libsepol - libsepol-devel - libsigsegv - libsmartcols - libsmartcols-devel - libsndfile - libsndfile-devel - libsoup - libsoup-devel - libsrtp - libss - libss-devel - libssh - libstdc++ - libstdc++-devel - libstemmer - libtasn1 - libtasn1-devel - libtasn1-tools - libtdb - libthai - libthai-devel - libtheora - libtheora-devel - libtiff - libtiff-devel - libtirpc - libtirpc-devel - libtool - libtool-ltdl - libtool-ltdl-devel - libunistring - libusb - libusbx - libutempter - libuuid - libuuid-devel - libuv - libva - libva-devel - libva-utils - libvdpau - libvdpau-devel - libvdpau-trace - libverto - libverto-devel - libverto-libev - libvisual - libvorbis - libvorbis-devel - libvpx - libvpx-devel - libwacom - libwacom-data - libwayland-client - libwayland-cursor - libwayland-egl - libwayland-server - libwebp - libwebp-devel - libxcb - libxcb-devel - libxcrypt - libxcrypt-devel - libxkbcommon - libxkbcommon-devel - libxkbcommon-x11 - libxkbcommon-x11-devel - libxkbfile - libxml2 - libxml2-devel - libxshmfence - libxshmfence-devel - libxslt - libxslt-devel - libyaml - libyaml-devel - libzstd - llvm - llvm-devel - llvm-libs - llvm6.0-libs - logrotate - lua-libs - lz4-libs - m4 - make - mallard-rng - man-db - man2html-core - mcpp - mercurial - mesa-dri-drivers - mesa-filesystem - mesa-libEGL - mesa-libEGL-devel - mesa-libGL - mesa-libGL-devel - mesa-libGLES - mesa-libGLES-devel - mesa-libgbm - mesa-libgbm-devel - mesa-libglapi - mesa-libxatracker - mesa-libxatracker-devel - mesa-vulkan-devel - mesa-vulkan-drivers - meson - mlocate - mozjs52 - mozjs52-devel - mpfr - mpfr-devel - mpg123-devel - mpg123-libs - mtdev - mythes - mythes-devel - nasm - ncompress - ncurses - ncurses-base - ncurses-c++-libs - ncurses-compat-libs - ncurses-devel - ncurses-libs - nettle - nettle-devel - nim-srpm-macros - ninja-build - npth - nspr - nspr-devel - nss - nss-devel - nss-pkcs11-devel - nss-softokn - nss-softokn-devel - nss-softokn-freebl - nss-softokn-freebl-devel - nss-sysinit - nss-tools - nss-util - nss-util-devel - nss_db - nss_hesiod - nss_nis - numactl-libs - ocaml-srpm-macros - ocl-icd - ocl-icd-devel - oniguruma - openal-soft - openal-soft-devel - openblas-srpm-macros - opencl-headers - openjade - openjpeg2 - openldap - opensp - openssh - openssh-clients - openssl - openssl-devel - openssl-libs - opus - opus-devel - orc - orc-compiler - orc-devel - p11-kit - p11-kit-devel - p11-kit-trust - pam - pam-devel - pango - pango-devel - patch - pcre - pcre-cpp - pcre-devel - pcre-utf16 - pcre-utf32 - pcre2 - pcre2-devel - pcre2-utf16 - pcre2-utf32 - perf - perl-Algorithm-Diff - perl-Archive-Tar - perl-Archive-Zip - perl-CPAN - perl-CPAN-Meta - perl-CPAN-Meta-Requirements - perl-CPAN-Meta-YAML - perl-Carp - perl-Compress-Bzip2 - perl-Compress-Raw-Bzip2 - perl-Compress-Raw-Zlib - perl-DBD-SQLite - perl-DBI - perl-Data-Dumper - perl-Data-OptList - perl-Data-Section - perl-Devel-Size - perl-Digest - perl-Digest-MD5 - perl-Digest-SHA - perl-Encode - perl-Encode-devel - perl-Errno - perl-Error - perl-Exporter - perl-ExtUtils-CBuilder - perl-ExtUtils-Command - perl-ExtUtils-Install - perl-ExtUtils-MM-Utils - perl-ExtUtils-MakeMaker - perl-ExtUtils-Manifest - perl-ExtUtils-ParseXS - perl-File-HomeDir - perl-File-Path - perl-File-Temp - perl-File-Which - perl-Filter - perl-Getopt-Long - perl-Git - perl-HTTP-Tiny - perl-IO - perl-IO-Compress - perl-IO-Socket-IP - perl-IO-Zlib - perl-IPC-Cmd - perl-JSON-PP - perl-Locale-Maketext - perl-Locale-Maketext-Simple - perl-MIME-Base64 - perl-MRO-Compat - perl-Math-BigInt - perl-Math-Complex - perl-Module-Build - perl-Module-CoreList - perl-Module-CoreList-tools - perl-Module-Load - perl-Module-Load-Conditional - perl-Module-Metadata - perl-Net-Ping - perl-Package-Generator - perl-Params-Check - perl-Params-Util - perl-PathTools - perl-Perl-OSType - perl-Pod-Checker - perl-Pod-Escapes - perl-Pod-Html - perl-Pod-Parser - perl-Pod-Perldoc - perl-Pod-Simple - perl-Pod-Usage - perl-SGMLSpm - perl-Scalar-List-Utils - perl-Socket - perl-Software-License - perl-Storable - perl-Sub-Exporter - perl-Sub-Install - perl-Term-ANSIColor - perl-Term-Cap - perl-TermReadKey - perl-Test-Harness - perl-Text-Diff - perl-Text-Glob - perl-Text-ParseWords - perl-Text-Tabs+Wrap - perl-Text-Template - perl-Text-Unidecode - perl-Thread-Queue - perl-Time-HiRes - perl-Time-Local - perl-URI - perl-Unicode-EastAsianWidth - perl-Unicode-Normalize - perl-XML-Parser - perl-XML-XPath - perl-constant - perl-devel - perl-encoding - perl-inc-latest - perl-interpreter - perl-libintl-perl - perl-libnet - perl-libnetcfg - perl-libs - perl-local-lib - perl-macros - perl-open - perl-parent - perl-podlators - perl-srpm-macros - perl-threads - perl-threads-shared - perl-utils - perl-version - pinentry - pixman - pixman-devel - pkgconf - pkgconf-m4 - pkgconf-pkg-config - poppler - poppler-data - popt - popt-devel - procps-ng - publicsuffix-list-dafsa - pulseaudio-libs - pulseaudio-libs-devel - pulseaudio-libs-glib2 - pulseaudio-utils - pygobject3-devel - python-rpm-macros - python-srpm-macros - python-unversioned-command - python2 - python2-cairo - python2-devel - python2-gobject - python2-gobject-base - python2-libproxy - python2-libs - python2-libxml2 - python2-mako - python2-markupsafe - python2-pip - python2-rpm-macros - python2-setuptools - python2-xpyb - python3 - python3-cairo - python3-cairo-devel - python3-devel - python3-gobject - python3-gobject-base - python3-libs - python3-libxml2 - python3-mako - python3-markupsafe - python3-pip - python3-pyparsing - python3-rpm-generators - python3-rpm-macros - python3-setuptools - python3-six - python36 - qrencode-libs - qt5-srpm-macros - readline - readline-devel - redhat-rpm-config - rest - rhash - rpcgen - rpcsvc-proto-devel - rpm - rpm-libs - rpm-plugin-selinux - ruby - ruby-irb - ruby-libs - rubygem-io-console - rubygem-json - rubygem-openssl - rubygem-psych - rubygem-rake - rubygem-rdoc - rubygems - rubypick - rust-srpm-macros - sed - setup - sgml-common - shadow-utils - shared-mime-info - slang - slang-slsh - sound-theme-freedesktop - soundtouch - source-highlight - speex - speex-devel - speexdsp - speexdsp-devel - spirv-tools-libs - sqlite - sqlite-devel - sqlite-libs - strace - subunit - subunit-devel - systemd - systemd-devel - systemd-libs - systemd-pam - systemtap-sdt-devel - tar - tcl - tcl-devel - texinfo - texinfo-tex - texlive-amsfonts - texlive-base - texlive-bibtex - texlive-cm - texlive-collection-basic - texlive-dvipdfmx - texlive-dvips - texlive-enctex - texlive-epsf - texlive-etex - texlive-etex-pkg - texlive-glyphlist - texlive-graphics-def - texlive-gsftopk - texlive-hyph-utf8 - texlive-hyphen-base - texlive-ifluatex - texlive-ifxetex - texlive-knuth-lib - texlive-knuth-local - texlive-kpathsea - texlive-latex-fonts - texlive-lib - texlive-lua-alt-getopt - texlive-luatex - texlive-makeindex - texlive-metafont - texlive-mflogo - texlive-mfware - texlive-pdftex - texlive-plain - texlive-tetex - texlive-tex - texlive-tex-ini-files - texlive-texconfig - texlive-texlive-common-doc - texlive-texlive-docindex - texlive-texlive-en - texlive-texlive-msg-translations - texlive-texlive-scripts - texlive-texlive.infra - texlive-unicode-data - texlive-updmap-map - texlive-xdvi - tk - turbojpeg - turbojpeg-devel - tzdata - unbound-libs - unzip - util-linux - vala - vala-compat - vala-compat-tools - valgrind - valgrind-devel - valgrind-tools-devel - vim-filesystem - vim-minimal - vte-profile - vte291 - vte291-devel - vulkan-headers - vulkan-loader - vulkan-loader-devel - vulkan-validation-layers - vulkan-validation-layers-devel - wayland-devel - wayland-protocols-devel - webkit2gtk3 - webkit2gtk3-devel - webkit2gtk3-jsc - webkit2gtk3-jsc-devel - webrtc-audio-processing - which - woff2 - woff2-devel - words - xcb-proto - xcb-util - xcb-util-cursor - xcb-util-cursor-devel - xcb-util-devel - xcb-util-image - xcb-util-image-devel - xcb-util-keysyms - xcb-util-keysyms-devel - xcb-util-renderutil - xcb-util-renderutil-devel - xcb-util-wm - xcb-util-wm-devel - xdg-user-dirs - xdg-utils - xkeyboard-config - xkeyboard-config-devel - xml-common - xorg-x11-proto-devel - xorg-x11-server-utils - xorg-x11-util-macros - xorg-x11-xauth - xorg-x11-xinit - xorg-x11-xkb-utils - xorg-x11-xtrans-devel - xz - xz-devel - xz-libs - xz-lzma-compat - yasm - yelp - yelp-devel - yelp-libs - yelp-tools - yelp-xsl - yelp-xsl-devel - zenity - zip - zlib - zlib-devel - zziplib sdk-base: rpms: - ModemManager-glib - SDL2 - SDL2-devel - SDL2_image - SDL2_image-devel - SDL2_mixer - SDL2_mixer-devel - SDL2_net - SDL2_net-devel - SDL2_ttf - SDL2_ttf-devel - acl - adwaita-cursor-theme - adwaita-icon-theme - alsa-lib - alsa-lib-devel - annobin - aspell - aspell-devel - at-spi2-atk - at-spi2-atk-devel - at-spi2-core - at-spi2-core-devel - atk - atk-devel - attr - audit-libs - autoconf - autogen-libopts - automake - avahi-glib - avahi-libs - basesystem - bash - bash-completion - bc - binutils - bison - boost-regex - brotli - byacc - bzip2 - bzip2-devel - bzip2-libs - ca-certificates - cairo - cairo-devel - cairo-gobject - cairo-gobject-devel - cairo-tools - ccache - cdparanoia-libs - check - check-devel - chkconfig - chrpath - clang - clang-analyzer - clang-devel - clang-libs - clang-tools-extra - cmake - cmake-data - cmake-filesystem - cmake-rpm-macros - colord-libs - compat-readline6 - coreutils - coreutils-common - cpio - cpp - cracklib - cracklib-devel - crypto-policies - cryptsetup-libs - ctags - cups-devel - cups-libs - curl - cvs - cvsps - cyrus-sasl - cyrus-sasl-devel - cyrus-sasl-lib - dbus - dbus-common - dbus-daemon - dbus-devel - dbus-libs - dbus-tools - dbus-x11 - dconf - dconf-devel - dejavu-fonts-common - dejavu-sans-fonts - dejavu-sans-mono-fonts - dejavu-serif-fonts - desktop-file-utils - device-mapper - device-mapper-libs - diffutils - docbook-dtds - docbook-style-dsssl - docbook-style-xsl - docbook-utils - dwz - e2fsprogs - e2fsprogs-devel - e2fsprogs-libs - efi-srpm-macros - elfutils - elfutils-default-yama-scope - elfutils-devel - elfutils-libelf - elfutils-libelf-devel - elfutils-libs - elinks - emacs-filesystem - eosrei-emojione-fonts - expat - expat-devel - fedora-gpg-keys - fedora-release - fedora-repos - fedora-repos-rawhide - file - file-libs - filesystem - findutils - fipscheck - fipscheck-lib - flac - flac-devel - flac-libs - flatpak-runtime-config - flex - fontconfig - fontconfig-devel - fontpackages-filesystem - fpc-srpm-macros - freetype - freetype-devel - fribidi - fribidi-devel - fuse-libs - gawk - gc - gcc - gcc-c++ - gdb - gdb-headless - gdbm - gdbm-devel - gdbm-libs - gdk-pixbuf2 - gdk-pixbuf2-devel - gdk-pixbuf2-modules - geoclue2 - geoclue2-devel - geoclue2-libs - gettext - gettext-common-devel - gettext-devel - gettext-libs - ghc-srpm-macros - giflib - giflib-devel - git - git-clang-format - git-core - git-core-doc - git-cvs - glib-networking - glib2 - glib2-devel - glibc - glibc-all-langpacks - glibc-common - glibc-devel - glibc-headers - glibc-minimal-langpack - gmp - gmp-c++ - gmp-devel - gnat-srpm-macros - gnu-free-fonts-common - gnu-free-mono-fonts - gnu-free-sans-fonts - gnu-free-serif-fonts - gnupg - gnupg2 - gnupg2-smime - gnutls - gnutls-c++ - gnutls-dane - gnutls-devel - gnutls-utils - go-srpm-macros - gobject-introspection - gobject-introspection-devel - google-crosextra-caladea-fonts - google-crosextra-carlito-fonts - gperf - gpgme - gpgme-devel - gpm-libs - graphite2 - graphite2-devel - grep - groff - groff-base - groff-perl - gsettings-desktop-schemas - gsettings-desktop-schemas-devel - gsm - gssdp - gstreamer1 - gstreamer1-devel - gstreamer1-plugins-bad-free - gstreamer1-plugins-bad-free-devel - gstreamer1-plugins-base - gstreamer1-plugins-base-devel - gtk-doc - gtk-update-icon-cache - gtk2 - gtk3 - gtk3-devel - guile - gupnp - gupnp-igd - gzip - harfbuzz - harfbuzz-devel - harfbuzz-icu - hicolor-icon-theme - hunspell - hunspell-devel - hunspell-en-US - hwdata - hyphen - hyphen-devel - ibus - ibus-devel - ibus-gtk2 - ibus-gtk3 - ibus-libs - ibus-setup - icu - info - intltool - iptables-libs - isl - iso-codes - iso-codes-devel - itstool - jasper-libs - jbigkit-libs - jq - jq-devel - json-c - json-c-devel - json-glib - json-glib-devel - jsoncpp - kernel-headers - keyutils-libs - keyutils-libs-devel - kmod-libs - krb5-devel - krb5-libs - krb5-server - krb5-workstation - lcms2 - lcms2-devel - lcms2-utils - less - libICE - libICE-devel - libSM - libSM-devel - libX11 - libX11-common - libX11-devel - libX11-xcb - libXScrnSaver - libXScrnSaver-devel - libXau - libXau-devel - libXaw - libXcomposite - libXcomposite-devel - libXcursor - libXcursor-devel - libXdamage - libXdamage-devel - libXdmcp - libXdmcp-devel - libXext - libXext-devel - libXfixes - libXfixes-devel - libXft - libXft-devel - libXi - libXi-devel - libXinerama - libXinerama-devel - libXmu - libXpm - libXpm-devel - libXrandr - libXrandr-devel - libXrender - libXrender-devel - libXt - libXt-devel - libXtst - libXtst-devel - libXv - libXv-devel - libXxf86misc - libXxf86vm - libXxf86vm-devel - libacl - libacl-devel - libappstream-glib - libappstream-glib-builder - libappstream-glib-builder-devel - libappstream-glib-devel - libarchive - libarchive-devel - libargon2 - libassuan - libassuan-devel - libasyncns - libatomic - libatomic_ops - libatomic_ops-devel - libattr - libattr-devel - libbabeltrace - libblkid - libblkid-devel - libcap - libcap-devel - libcap-ng - libcom_err - libcom_err-devel - libcroco - libcroco-devel - libcurl - libcurl-devel - libdatrie - libdatrie-devel - libdb - libdb-cxx - libdb-cxx-devel - libdb-devel - libdb-utils - libdrm - libdrm-devel - libdvdnav - libdvdread - libedit - libedit-devel - libepoxy - libepoxy-devel - liberation-fonts-common - liberation-mono-fonts - liberation-sans-fonts - liberation-serif-fonts - libev - libevent - libexif - libexif-devel - libfdisk - libfdisk-devel - libffi - libffi-devel - libgcab1 - libgcab1-devel - libgcc - libgcrypt - libgcrypt-devel - libgfortran - libglvnd - libglvnd-core-devel - libglvnd-devel - libglvnd-egl - libglvnd-gles - libglvnd-glx - libglvnd-opengl - libgomp - libgpg-error - libgpg-error-devel - libgudev - libgusb - libicu - libicu-devel - libidn - libidn-devel - libidn2 - libipt - libjpeg-turbo - libjpeg-turbo-devel - libkadm5 - libksba - libmcpp - libmetalink - libmodman - libmount - libmount-devel - libmpc - libmpc-devel - libmpcdec - libnghttp2 - libnice - libnotify - libnsl - libnsl2 - libnsl2-devel - libogg - libogg-devel - libpcap - libpciaccess - libpciaccess-devel - libpipeline - libpkgconf - libpng - libpng-devel - libproxy - libproxy-devel - libpsl - libpwquality - libquadmath - librsvg2 - librsvg2-devel - librsvg2-tools - libsamplerate - libsamplerate-devel - libseccomp - libseccomp-devel - libsecret - libselinux - libselinux-devel - libsemanage - libsepol - libsepol-devel - libsigsegv - libsmartcols - libsmartcols-devel - libsndfile - libsndfile-devel - libsoup - libsoup-devel - libsrtp - libss - libss-devel - libssh - libstdc++ - libstdc++-devel - libstemmer - libtasn1 - libtasn1-devel - libtasn1-tools - libthai - libthai-devel - libtheora - libtheora-devel - libtiff - libtiff-devel - libtirpc - libtirpc-devel - libtool - libtool-ltdl - libtool-ltdl-devel - libunistring - libusb - libusbx - libutempter - libuuid - libuuid-devel - libuv - libva - libva-devel - libva-utils - libvdpau - libvdpau-devel - libvdpau-trace - libverto - libverto-devel - libverto-libev - libvisual - libvorbis - libvorbis-devel - libvpx - libvpx-devel - libwayland-client - libwayland-cursor - libwayland-egl - libwayland-server - libwebp - libwebp-devel - libxcb - libxcb-devel - libxcrypt - libxcrypt-devel - libxkbcommon - libxkbcommon-devel - libxkbcommon-x11 - libxkbcommon-x11-devel - libxkbfile - libxml2 - libxml2-devel - libxshmfence - libxshmfence-devel - libxslt - libxslt-devel - libyaml - libyaml-devel - libzstd - llvm - llvm-devel - llvm-libs - llvm6.0-libs - logrotate - lua-libs - lz4-libs - m4 - make - man-db - man2html-core - mcpp - mercurial - mesa-filesystem - mesa-libEGL - mesa-libEGL-devel - mesa-libGL - mesa-libGL-devel - mesa-libGLES - mesa-libGLES-devel - mesa-libgbm - mesa-libgbm-devel - mesa-libglapi - mesa-libxatracker - mesa-libxatracker-devel - mesa-vulkan-devel - mesa-vulkan-drivers - meson - mlocate - mpfr - mpfr-devel - mpg123-devel - mpg123-libs - mythes - mythes-devel - nasm - ncompress - ncurses - ncurses-base - ncurses-c++-libs - ncurses-compat-libs - ncurses-devel - ncurses-libs - nettle - nettle-devel - nim-srpm-macros - ninja-build - npth - nspr - nspr-devel - nss - nss-devel - nss-pkcs11-devel - nss-softokn - nss-softokn-devel - nss-softokn-freebl - nss-softokn-freebl-devel - nss-sysinit - nss-tools - nss-util - nss-util-devel - nss_db - nss_hesiod - nss_nis - numactl-libs - ocaml-srpm-macros - ocl-icd - ocl-icd-devel - oniguruma - openal-soft - openal-soft-devel - openblas-srpm-macros - opencl-headers - openjade - openjpeg2 - openldap - opensp - openssh - openssh-clients - openssl - openssl-devel - openssl-libs - opus - orc - orc-compiler - orc-devel - p11-kit - p11-kit-devel - p11-kit-trust - pam - pam-devel - pango - pango-devel - patch - pcre - pcre-cpp - pcre-devel - pcre-utf16 - pcre-utf32 - pcre2 - pcre2-devel - pcre2-utf16 - pcre2-utf32 - perf - perl-Algorithm-Diff - perl-Archive-Tar - perl-Archive-Zip - perl-CPAN - perl-CPAN-Meta - perl-CPAN-Meta-Requirements - perl-CPAN-Meta-YAML - perl-Carp - perl-Compress-Bzip2 - perl-Compress-Raw-Bzip2 - perl-Compress-Raw-Zlib - perl-DBD-SQLite - perl-DBI - perl-Data-Dumper - perl-Data-OptList - perl-Data-Section - perl-Devel-Size - perl-Digest - perl-Digest-MD5 - perl-Digest-SHA - perl-Encode - perl-Encode-devel - perl-Errno - perl-Error - perl-Exporter - perl-ExtUtils-CBuilder - perl-ExtUtils-Command - perl-ExtUtils-Install - perl-ExtUtils-MM-Utils - perl-ExtUtils-MakeMaker - perl-ExtUtils-Manifest - perl-ExtUtils-ParseXS - perl-File-HomeDir - perl-File-Path - perl-File-Temp - perl-File-Which - perl-Filter - perl-Getopt-Long - perl-Git - perl-HTTP-Tiny - perl-IO - perl-IO-Compress - perl-IO-Socket-IP - perl-IO-Zlib - perl-IPC-Cmd - perl-JSON-PP - perl-Locale-Maketext - perl-Locale-Maketext-Simple - perl-MIME-Base64 - perl-MRO-Compat - perl-Math-BigInt - perl-Math-Complex - perl-Module-Build - perl-Module-CoreList - perl-Module-CoreList-tools - perl-Module-Load - perl-Module-Load-Conditional - perl-Module-Metadata - perl-Net-Ping - perl-Package-Generator - perl-Params-Check - perl-Params-Util - perl-PathTools - perl-Perl-OSType - perl-Pod-Checker - perl-Pod-Escapes - perl-Pod-Html - perl-Pod-Parser - perl-Pod-Perldoc - perl-Pod-Simple - perl-Pod-Usage - perl-SGMLSpm - perl-Scalar-List-Utils - perl-Socket - perl-Software-License - perl-Storable - perl-Sub-Exporter - perl-Sub-Install - perl-Term-ANSIColor - perl-Term-Cap - perl-TermReadKey - perl-Test-Harness - perl-Text-Diff - perl-Text-Glob - perl-Text-ParseWords - perl-Text-Tabs+Wrap - perl-Text-Template - perl-Text-Unidecode - perl-Thread-Queue - perl-Time-HiRes - perl-Time-Local - perl-URI - perl-Unicode-EastAsianWidth - perl-Unicode-Normalize - perl-XML-Parser - perl-XML-XPath - perl-constant - perl-devel - perl-encoding - perl-inc-latest - perl-interpreter - perl-libintl-perl - perl-libnet - perl-libnetcfg - perl-libs - perl-local-lib - perl-macros - perl-open - perl-parent - perl-podlators - perl-srpm-macros - perl-threads - perl-threads-shared - perl-utils - perl-version - pinentry - pixman - pixman-devel - pkgconf - pkgconf-m4 - pkgconf-pkg-config - poppler - poppler-data - popt - popt-devel - procps-ng - publicsuffix-list-dafsa - pulseaudio-libs - pulseaudio-libs-devel - pulseaudio-libs-glib2 - pulseaudio-utils - python-rpm-macros - python-srpm-macros - python-unversioned-command - python2 - python2-devel - python2-libproxy - python2-libs - python2-libxml2 - python2-mako - python2-markupsafe - python2-pip - python2-rpm-macros - python2-setuptools - python3 - python3-cairo - python3-devel - python3-gobject - python3-gobject-base - python3-libs - python3-libxml2 - python3-mako - python3-markupsafe - python3-pip - python3-pyparsing - python3-rpm-generators - python3-rpm-macros - python3-setuptools - python3-six - python36 - qrencode-libs - qt5-srpm-macros - readline - readline-devel - redhat-rpm-config - rest - rhash - rpcgen - rpcsvc-proto-devel - rpm - rpm-libs - rpm-plugin-selinux - ruby - ruby-irb - ruby-libs - rubygem-io-console - rubygem-json - rubygem-openssl - rubygem-psych - rubygem-rake - rubygem-rdoc - rubygems - rubypick - rust-srpm-macros - sed - setup - sgml-common - shadow-utils - shared-mime-info - slang - slang-slsh - soundtouch - source-highlight - speex - speex-devel - speexdsp - speexdsp-devel - spirv-tools-libs - sqlite - sqlite-devel - sqlite-libs - strace - subunit - subunit-devel - systemd - systemd-libs - systemd-pam - systemtap-sdt-devel - tar - tcl - tcl-devel - texinfo - texinfo-tex - texlive-amsfonts - texlive-base - texlive-bibtex - texlive-cm - texlive-collection-basic - texlive-dvipdfmx - texlive-dvips - texlive-enctex - texlive-epsf - texlive-etex - texlive-etex-pkg - texlive-glyphlist - texlive-graphics-def - texlive-gsftopk - texlive-hyph-utf8 - texlive-hyphen-base - texlive-ifluatex - texlive-ifxetex - texlive-knuth-lib - texlive-knuth-local - texlive-kpathsea - texlive-latex-fonts - texlive-lib - texlive-lua-alt-getopt - texlive-luatex - texlive-makeindex - texlive-metafont - texlive-mflogo - texlive-mfware - texlive-pdftex - texlive-plain - texlive-tetex - texlive-tex - texlive-tex-ini-files - texlive-texconfig - texlive-texlive-common-doc - texlive-texlive-docindex - texlive-texlive-en - texlive-texlive-msg-translations - texlive-texlive-scripts - texlive-texlive.infra - texlive-unicode-data - texlive-updmap-map - texlive-xdvi - tk - turbojpeg - turbojpeg-devel - tzdata - unbound-libs - unzip - util-linux - vala - valgrind - valgrind-devel - valgrind-tools-devel - vim-filesystem - vim-minimal - vulkan-headers - vulkan-loader - vulkan-loader-devel - vulkan-validation-layers - vulkan-validation-layers-devel - wayland-devel - wayland-protocols-devel - webrtc-audio-processing - which - words - xcb-proto - xcb-util - xcb-util-cursor - xcb-util-cursor-devel - xcb-util-devel - xcb-util-image - xcb-util-image-devel - xcb-util-keysyms - xcb-util-keysyms-devel - xcb-util-renderutil - xcb-util-renderutil-devel - xcb-util-wm - xcb-util-wm-devel - xdg-user-dirs - xdg-utils - xkeyboard-config - xkeyboard-config-devel - xml-common - xorg-x11-proto-devel - xorg-x11-server-utils - xorg-x11-util-macros - xorg-x11-xauth - xorg-x11-xinit - xorg-x11-xkb-utils - xorg-x11-xtrans-devel - xz - xz-devel - xz-libs - xz-lzma-compat - yasm - zenity - zip - zlib - zlib-devel - zziplib api: rpms: - flatpak-rpm-macros - flatpak-runtime-config components: rpms: flatpak-rpm-macros: rationale: Set up build root for flatpak RPMS repository: git+https://src.fedoraproject.org/rpms/flatpak-rpm-macros cache: https://src.fedoraproject.org/repo/pkgs/flatpak-rpm-macros ref: main flatpak-runtime-config: rationale: Runtime configuration files repository: git+https://src.fedoraproject.org/rpms/flatpak-runtime-config cache: https://src.fedoraproject.org/repo/pkgs/flatpak-runtime-config ref: main artifacts: rpms: - flatpak-rpm-macros-0:27-6.module_2021+15e5e3e7.noarch - flatpak-runtime-config-0:27-7.module_2021+15e5e3e7.x86_64 ... --- document: modulemd version: 2 data: name: eog stream: main version: 20180821163756 context: 775baa8e arch: x86_64 summary: Eye of GNOME Application Module description: > The Eye of GNOME image viewer (eog) is the official image viewer for the GNOME desktop. It can view single image files in a variety of formats, as well as large image collections. license: module: - MIT content: - MIT xmd: mbs: mse: TRUE scmurl: https://src.fedoraproject.org/modules/eog.git?#375e2f73492aba2a9c8c892b5152d588e553c19c commit: 375e2f73492aba2a9c8c892b5152d588e553c19c buildrequires: platform: ref: f29 stream: f29 context: 00000000 version: 5 filtered_rpms: [] flatpak-runtime: ref: 2b45d61997c37c41f4cc127842f01d30024db74d stream: f29 context: 6c81f848 version: 20180820180704 filtered_rpms: [] rpms: eog: ref: 96166844a72788cd7e6fc278aeedc1e3da5ec816 libpeas: ref: 8e162f875ac7e00dd90f3d791d40484f91012415 gnome-desktop3: ref: 981addd1ddeee303df8518e479439cd9e4478c66 bubblewrap: ref: aaaaaae81d69644c0502125b338a4c86ff2e0a0e exempi: ref: ab39221162cac7c025060a14cac712c73b38b431 dependencies: - buildrequires: flatpak-runtime: [f29] requires: flatpak-runtime: [f29] profiles: default: rpms: - eog components: rpms: bubblewrap: rationale: Runtime dependency. repository: git+https://src.fedoraproject.org/rpms/bubblewrap cache: https://src.fedoraproject.org/repo/pkgs/bubblewrap ref: f29 eog: rationale: Application package repository: git+https://src.fedoraproject.org/rpms/eog cache: https://src.fedoraproject.org/repo/pkgs/eog ref: f29 buildorder: 1 exempi: rationale: Runtime dependency. repository: git+https://src.fedoraproject.org/rpms/exempi cache: https://src.fedoraproject.org/repo/pkgs/exempi ref: f29 gnome-desktop3: rationale: Runtime dependency. repository: git+https://src.fedoraproject.org/rpms/gnome-desktop3 cache: https://src.fedoraproject.org/repo/pkgs/gnome-desktop3 ref: f29 libpeas: rationale: Runtime dependency. repository: git+https://src.fedoraproject.org/rpms/libpeas cache: https://src.fedoraproject.org/repo/pkgs/libpeas ref: f29 artifacts: rpms: - bubblewrap-0:0.3.0-2.module_2123+73a9ef6f.x86_64 - eog-0:3.28.3-1.module_2123+73a9ef6f.x86_64 - eog-devel-0:3.28.3-1.module_2123+73a9ef6f.x86_64 - eog-tests-0:3.28.3-1.module_2123+73a9ef6f.x86_64 - exempi-0:2.4.5-3.module_2123+73a9ef6f.x86_64 - exempi-devel-0:2.4.5-3.module_2123+73a9ef6f.x86_64 - gnome-desktop3-0:3.29.90.1-1.module_2123+73a9ef6f.x86_64 - gnome-desktop3-devel-0:3.29.90.1-1.module_2123+73a9ef6f.x86_64 - gnome-desktop3-tests-0:3.29.90.1-1.module_2123+73a9ef6f.x86_64 - libpeas-0:1.22.0-9.module_2123+73a9ef6f.x86_64 - libpeas-devel-0:1.22.0-9.module_2123+73a9ef6f.x86_64 - libpeas-gtk-0:1.22.0-9.module_2123+73a9ef6f.x86_64 - libpeas-loader-python3-0:1.22.0-9.module_2123+73a9ef6f.x86_64 ... --- document: modulemd version: 2 data: name: dwm stream: latest version: 20180814184656 context: 6c81f848 arch: x86_64 summary: Dynamic window manager for X description: >- dwm is a dynamic window manager for X. It manages windows in tiled, monocle, and floating layouts. All of the layouts can be applied dynamically, optimizing the environment for the application in use and the task performed. license: module: - MIT content: - MIT xmd: mbs: mse: TRUE scmurl: https://src.fedoraproject.org/modules/dwm.git?#bde94bfe3c38c6c064c8dd484fe2e638768fae7b commit: bde94bfe3c38c6c064c8dd484fe2e638768fae7b buildrequires: platform: ref: f29 stream: f29 context: 00000000 version: 5 filtered_rpms: [] rpms: dwm: ref: b85c993bf46a22fcdfa017f2c16e135bc578c3be dependencies: - buildrequires: platform: [f29] requires: platform: [f29] references: community: https://suckless.org/ documentation: https://dwm.suckless.org/ profiles: default: description: The minimal, distribution-compiled dwm binary. rpms: - dwm user: description: Includes distrribution-compiled dwm as well as a helper script to apply user patches and configuration, dwm-user. rpms: - dwm - dwm-user components: rpms: dwm: rationale: The main component of this module. repository: git://pkgs.fedoraproject.org/rpms/dwm cache: http://pkgs.fedoraproject.org/repo/pkgs/dwm ref: latest artifacts: rpms: - dwm-0:6.1-1.20180602gitb69c870.module_2012+7328f38d.x86_64 - dwm-user-0:6.1-1.20180602gitb69c870.module_2012+7328f38d.x86_64 ... --- document: modulemd version: 2 data: name: dwm stream: 6.1 version: 20180813122714 context: 6c81f848 arch: x86_64 summary: Dynamic window manager for X description: >- dwm is a dynamic window manager for X. It manages windows in tiled, monocle, and floating layouts. All of the layouts can be applied dynamically, optimizing the environment for the application in use and the task performed. license: module: - MIT content: - MIT xmd: mbs: mse: TRUE scmurl: https://src.fedoraproject.org/modules/dwm.git?#8f0dc77f8e89fe04a44c3bb3a77dec21d3c4a9dd commit: 8f0dc77f8e89fe04a44c3bb3a77dec21d3c4a9dd buildrequires: platform: ref: f29 stream: f29 context: 00000000 version: 5 filtered_rpms: [] rpms: dwm: ref: 62a7aa6320bb31e6140ddae9eeeb7e98963d31a3 dependencies: - buildrequires: platform: [f29] requires: platform: [f29] references: community: https://suckless.org/ documentation: https://dwm.suckless.org/ profiles: default: description: The minimal, distribution-compiled dwm binary. rpms: - dwm user: description: Includes distrribution-compiled dwm as well as a helper script to apply user patches and configuration, dwm-user. rpms: - dwm - dwm-user api: rpms: - dwm - dwm-user components: rpms: dwm: rationale: The main component of this module. repository: git://pkgs.fedoraproject.org/rpms/dwm cache: http://pkgs.fedoraproject.org/repo/pkgs/dwm ref: 6.1 artifacts: rpms: - dwm-0:6.1-8.module_1995+c3e93812.x86_64 - dwm-user-0:6.1-8.module_1995+c3e93812.x86_64 ... --- document: modulemd version: 2 data: name: dwm stream: 6.0 version: 20180813144159 context: 6c81f848 arch: x86_64 summary: Dynamic window manager for X description: >- dwm is a dynamic window manager for X. It manages windows in tiled, monocle, and floating layouts. All of the layouts can be applied dynamically, optimizing the environment for the application in use and the task performed. license: module: - MIT content: - MIT xmd: mbs: mse: TRUE scmurl: https://src.fedoraproject.org/modules/dwm.git?#9b78dc232c321e9e8c93bd55f7e95dc113459a39 commit: 9b78dc232c321e9e8c93bd55f7e95dc113459a39 buildrequires: platform: ref: f29 stream: f29 context: 00000000 version: 5 filtered_rpms: [] rpms: dwm: ref: 43decc0e45e7fe8286356b3a51f64e05f13f3823 dependencies: - buildrequires: platform: [f29] requires: platform: [f29] references: community: https://suckless.org/ documentation: https://dwm.suckless.org/ profiles: default: description: The minimal, distribution-compiled dwm binary. rpms: - dwm user: description: Includes distrribution-compiled dwm as well as a helper script to apply user patches and configuration, dwm-user. rpms: - dwm - dwm-user api: rpms: - dwm - dwm-user components: rpms: dwm: rationale: The main component of this module. repository: git://pkgs.fedoraproject.org/rpms/dwm cache: http://pkgs.fedoraproject.org/repo/pkgs/dwm ref: 6.0 artifacts: rpms: - dwm-0:6.0-1.module_1997+c375c79c.x86_64 - dwm-user-0:6.0-1.module_1997+c375c79c.x86_64 ... --- document: modulemd version: 2 data: name: docker stream: 2017.0 version: 20180816194539 context: 3ff668f0 arch: x86_64 summary: Module for docker runtime and docker-distribution description: >- Docker is an open-source engine that automates the deployment of any application as a lightweight, portable, self-sufficient container that will run virtually anywhere. license: module: - MIT content: - MIT xmd: mbs: mse: TRUE scmurl: https://src.fedoraproject.org/modules/docker.git?#3dd5060deeb1517577c78b0259f94530fc2aae15 commit: 3dd5060deeb1517577c78b0259f94530fc2aae15 buildrequires: platform: ref: f29 stream: f29 context: 00000000 version: 5 filtered_rpms: [] golang: ref: 92882e9696b779110fd27aa11ddbc88f30eb82a2 stream: 1.10 context: 6c81f848 version: 20180816140129 filtered_rpms: [] golang-ecosystem: ref: 384b17a75c5c9be71c913651126d6899e42e8d84 stream: 2017.0 context: cbfb2833 version: 20180816154241 filtered_rpms: [] rpms: docker: ref: 7c17c91d74be490fe27a5a8c0a7e7ed4307a735d docker-distribution: ref: 215123409e61eecb1b5d6e4fb5b4b63196674b2e dependencies: - buildrequires: platform: [f29] requires: container-tools: [2017.0] platform: [f29] references: community: htts://github.com/projectatomic/docker documentation: https://github.com/projectatomic/docker tracker: https://github.com/projectatomic/docker profiles: default: rpms: - docker - docker-distribution api: rpms: - docker - docker-common - docker-distribution - docker-fish-completion - docker-logrotate - docker-lvm-plugin - docker-novolume-plugin - docker-rhel-push-plugin - docker-vim - docker-zsh-completion components: rpms: docker: rationale: Primary component of this module. repository: git://pkgs.fedoraproject.org/rpms/docker cache: http://pkgs.fedoraproject.org/repo/pkgs/docker ref: f28 docker-distribution: rationale: Primary component of this module. repository: git://pkgs.fedoraproject.org/rpms/docker-distribution cache: http://pkgs.fedoraproject.org/repo/pkgs/docker-distribution ref: f28 artifacts: rpms: - docker-2:1.13.1-61.git9cb56fd.module_2109+7c83ead1.x86_64 - docker-common-2:1.13.1-61.git9cb56fd.module_2109+7c83ead1.x86_64 - docker-devel-2:1.13.1-61.git9cb56fd.module_2109+7c83ead1.noarch - docker-distribution-0:2.6.2-7.git48294d9.module_1641+02d06da9.x86_64 - docker-fish-completion-2:1.13.1-61.git9cb56fd.module_2109+7c83ead1.x86_64 - docker-logrotate-2:1.13.1-61.git9cb56fd.module_2109+7c83ead1.x86_64 - docker-lvm-plugin-2:1.13.1-61.git9cb56fd.module_2109+7c83ead1.x86_64 - docker-novolume-plugin-2:1.13.1-61.git9cb56fd.module_2109+7c83ead1.x86_64 - docker-rhel-push-plugin-2:1.13.1-61.git9cb56fd.module_2109+7c83ead1.x86_64 - docker-unit-test-2:1.13.1-61.git9cb56fd.module_2109+7c83ead1.x86_64 - docker-vim-2:1.13.1-61.git9cb56fd.module_2109+7c83ead1.x86_64 - docker-zsh-completion-2:1.13.1-61.git9cb56fd.module_2109+7c83ead1.x86_64 ... --- document: modulemd version: 2 data: name: django stream: 1.6 version: 20180828135711 context: 6c81f848 arch: x86_64 summary: A high-level Python Web framework description: >- Django is a high-level Python Web framework that encourages rapid development and a clean, pragmatic design. It focuses on automating as much as possible and adhering to the DRY (Don't Repeat Yourself) principle. license: module: - MIT content: - MIT xmd: mbs: mse: TRUE scmurl: https://src.fedoraproject.org/modules/django.git?#da53d66d3db1aa5f6afd75887b00fa26849bcc0a commit: da53d66d3db1aa5f6afd75887b00fa26849bcc0a buildrequires: platform: ref: f29 stream: f29 context: 00000000 version: 5 filtered_rpms: [] rpms: python-django: ref: 9e50c9cc5cc0bd23e92ee58b2b2ffa14effad0a0 dependencies: - buildrequires: platform: [f29] requires: platform: [f29] references: community: https://www.djangoproject.com documentation: https://docs.djangoproject.com tracker: https://code.djangoproject.com/query profiles: default: rpms: - python2-django python2_development: rpms: - python2-django api: rpms: - python2-django components: rpms: python-django: rationale: The Django python web framework repository: git+https://src.fedoraproject.org/rpms/python-django cache: https://src.fedoraproject.org/repo/pkgs/python-django ref: 1.6 artifacts: rpms: - python-django-bash-completion-0:1.6.11.7-3.module_2144+ad479803.noarch - python2-django-0:1.6.11.7-3.module_2144+ad479803.noarch ... --- document: modulemd version: 2 data: name: cri-o stream: 2018.0 version: 20180529183952 context: 3ff668f0 arch: x86_64 summary: Kubernetes Container Runtime Interface for OCI-based containers description: >- CRI-O is the Kubernetes Container Runtime Interface for OCI-based containers. license: module: - Apache-2.0 content: - MIT xmd: mbs: mse: TRUE scmurl: https://src.fedoraproject.org/modules/cri-o.git?#8c90882569bc8a63408be7b634bc2c094533e3a3 commit: 8c90882569bc8a63408be7b634bc2c094533e3a3 buildrequires: platform: ref: f29 stream: f29 context: 00000000 version: 4 filtered_rpms: [] golang: ref: d6ad30745aef89e89b266908b713ea92fe73a834 stream: 1.10 context: 6c81f848 version: 20180529132243 filtered_rpms: [] golang-ecosystem: ref: 698fdf86122ea5f47cc89793a05ce841e0e0023b stream: 2017.0 context: 05251d78 version: 20180409165640 filtered_rpms: [] rpms: cri-o: ref: 4746e937b245100643f2efcbe90ef154a717c9e6 cri-tools: ref: a5b6369696fd69fcb7242837428dd2f836cbc2df dependencies: - buildrequires: platform: [f29] requires: container-tools: [2017.0] platform: [f29] references: community: https://docs.pagure.org/modularity/ documentation: https://github.com/modularity-modules/docker tracker: https://github.com/modularity-modules/cri-o profiles: default: rpms: - cri-o - cri-tools api: rpms: - conmon - cri-o - cri-tools components: rpms: cri-o: rationale: Primary component of this module. repository: git://pkgs.fedoraproject.org/rpms/cri-o cache: http://pkgs.fedoraproject.org/repo/pkgs/cri-o ref: f28 cri-tools: rationale: Primary component of this module. repository: git://pkgs.fedoraproject.org/rpms/cri-tools cache: http://pkgs.fedoraproject.org/repo/pkgs/cri-tools ref: f28 artifacts: rpms: - conmon-2:1.10.1-1.git728df92.module_1818+7c6ae394.x86_64 - cri-o-2:1.10.1-1.git728df92.module_1818+7c6ae394.x86_64 - cri-o-integration-tests-2:1.10.1-1.git728df92.module_1818+7c6ae394.x86_64 - cri-tools-0:1.0.0-5.gitf6ed14e.module_1818+7c6ae394.x86_64 ... --- document: modulemd version: 2 data: name: cri-o stream: 2017.0 version: 20180816135947 context: 3ff668f0 arch: x86_64 summary: Kubernetes Container Runtime Interface for OCI-based containers description: >- CRI-O is the Kubernetes Container Runtime Interface for OCI-based containers. license: module: - Apache-2.0 content: - MIT xmd: mbs: mse: TRUE scmurl: https://src.fedoraproject.org/modules/cri-o.git?#ea55eba4c063a7a5dc36991edbf010e2b8df3e49 commit: ea55eba4c063a7a5dc36991edbf010e2b8df3e49 buildrequires: platform: ref: f29 stream: f29 context: 00000000 version: 5 filtered_rpms: [] golang: ref: d6ad30745aef89e89b266908b713ea92fe73a834 stream: 1.10 context: 6c81f848 version: 20180529132243 filtered_rpms: [] golang-ecosystem: ref: 4188f37999c72f87bab2b59dab2bc14fa31bbee2 stream: 2017.0 context: cbfb2833 version: 20180724154421 filtered_rpms: [] rpms: cri-o: ref: 5650cabcd0105a7c42d1a396af36f674be82a812 dependencies: - buildrequires: platform: [f29] requires: container-tools: [2017.0] platform: [f29] references: community: https://docs.pagure.org/modularity/ documentation: https://github.com/modularity-modules/docker tracker: https://github.com/modularity-modules/cri-o profiles: default: rpms: - cri-o api: rpms: - conmon - cri-o components: rpms: cri-o: rationale: Primary component of this module. repository: git://pkgs.fedoraproject.org/rpms/cri-o cache: http://pkgs.fedoraproject.org/repo/pkgs/cri-o ref: f28 artifacts: rpms: - conmon-2:1.11.1-1.git1759204.module_2042+335cf4b5.x86_64 - cri-o-2:1.11.1-1.git1759204.module_2042+335cf4b5.x86_64 - cri-o-integration-tests-2:1.11.1-1.git1759204.module_2042+335cf4b5.x86_64 ... --- document: modulemd version: 2 data: name: cri-o stream: 1.11 version: 20180827233205 context: 6c81f848 arch: x86_64 summary: Kubernetes Container Runtime Interface for OCI-based containers description: >- CRI-O is the Kubernetes Container Runtime Interface for OCI-based containers. license: module: - Apache-2.0 content: - MIT xmd: mbs: mse: TRUE scmurl: https://src.fedoraproject.org/modules/cri-o.git?#17501669e29cfdcb41346f2fe31e2c4196a408e8 commit: 17501669e29cfdcb41346f2fe31e2c4196a408e8 buildrequires: platform: ref: f29 stream: f29 context: 00000000 version: 5 filtered_rpms: [] rpms: cri-o: ref: c759c453e3c9c3d33fa9bb740ab15d49a3ee987e cri-tools: ref: 4285d2f99d8a75678bf185da32ae19a44a3c4f08 dependencies: - buildrequires: platform: [f29] requires: platform: [f29] references: community: https://docs.pagure.org/modularity/ documentation: https://github.com/modularity-modules/docker tracker: https://github.com/modularity-modules/cri-o profiles: default: rpms: - cri-o - cri-tools api: rpms: - conmon - cri-o - cri-tools components: rpms: cri-o: rationale: Primary component of this module. repository: git+https://src.fedoraproject.org/rpms/cri-o cache: https://src.fedoraproject.org/repo/pkgs/cri-o ref: 1.11 cri-tools: rationale: Primary component of this module. repository: git+https://src.fedoraproject.org/rpms/cri-tools cache: https://src.fedoraproject.org/repo/pkgs/cri-tools ref: 1.11 artifacts: rpms: - conmon-2:1.11.2-2.git3eac3b2.module_2141+e7e01fef.x86_64 - cri-o-2:1.11.2-2.git3eac3b2.module_2141+e7e01fef.x86_64 - cri-tools-0:1.11.1-1.git404b126.module_2138+be1ea703.x86_64 ... --- document: modulemd version: 2 data: name: container-tools stream: 2018.0 version: 20180816194520 context: cb85db27 arch: x86_64 summary: Common tools and dependencies for container runtimes description: >- Contains SELinux policies, binaries and other dependencies for use with container runtimes license: module: - MIT content: - MIT xmd: mbs: mse: TRUE scmurl: https://src.fedoraproject.org/modules/container-tools.git?#31b761077ffd9f584efa534c16a3aed454aef977 commit: 31b761077ffd9f584efa534c16a3aed454aef977 buildrequires: platform: ref: f29 stream: f29 context: 00000000 version: 5 filtered_rpms: [] golang: ref: 92882e9696b779110fd27aa11ddbc88f30eb82a2 stream: 1.10 context: 6c81f848 version: 20180816140129 filtered_rpms: [] golang-ecosystem: ref: 1654fad1d9abf46a7d4f7845ea9e847b762f08a5 stream: 2018.0 context: cbfb2833 version: 20180816154327 filtered_rpms: [] rpms: atomic: ref: 6cec22f4c5825958a7a702586a1f8bb8aa15f854 python-docker-pycreds: ref: 5347f5fb0029c9664a0e5de07d733747568cd08d containernetworking-cni: ref: 5741bb6612f10603e0b40306e6eaaffb8067a22d skopeo: ref: 37201821cfb686ab9a5009fe8b066982978e2458 buildah: ref: 430c7a0285af77ab4a462568cb07f9f8f0c83cf2 python-docker: ref: 2807ee649da39b46336a79f4795d0ed2d8b496cf container-selinux: ref: 02a599cecb197d9c2261d1af30e4895e806f7bca container-storage-setup: ref: fa451e89ac98aa45131ca68d35f47197d863deb0 oci-register-machine: ref: 9c3980edbc2cdcede251b59b24faddf495c7d1b4 podman: ref: c92ca272fcee01526152095c12516e8091040524 oci-umount: ref: 14f111761a8e6691eb88589d58be4db35a9fa727 python-varlink: ref: a7229e7b3653cd920028a7dc50aa223e7fcd8778 oci-systemd-hook: ref: 7b9e5e15cba8f89cf729b6580e46fe3e3fb18c11 runc: ref: 9f4d6de82cac64f4604d12676e322c7d30661962 dependencies: - buildrequires: platform: [f29] requires: platform: [f29] references: community: https://github.com/projectatomic documentation: https://projectatomic.io tracker: https://github.com/projectatomic profiles: default: rpms: - atomic - buildah - container-selinux - container-storage-setup - containernetworking-cni - oci-register-machine - oci-systemd-hook - oci-umount - podman - python-docker - python-docker-pycreds - python-varlink - runc - skopeo api: rpms: - atomic - atomic-registries - buildah - container-selinux - container-storage-setup - containernetworking-cni - oci-register-machine - oci-systemd-hook - oci-umount - podman - python2-docker - python2-docker-pycreds - python3-docker - python3-docker-pycreds - python3-podman - python3-varlink - runc - skopeo - skopeo-containers buildopts: rpms: macros: | %_with_ignore_tests 1 components: rpms: atomic: rationale: Primary component of this module repository: git://pkgs.fedoraproject.org/rpms/atomic cache: http://pkgs.fedoraproject.org/repo/pkgs/atomic ref: f28 buildorder: 1 buildah: rationale: Primary component of this module repository: git://pkgs.fedoraproject.org/rpms/buildah cache: http://pkgs.fedoraproject.org/repo/pkgs/buildah ref: f28 container-selinux: rationale: Primary component of this module repository: git://pkgs.fedoraproject.org/rpms/container-selinux cache: http://pkgs.fedoraproject.org/repo/pkgs/container-selinux ref: f28 container-storage-setup: rationale: Primary component of this module repository: git://pkgs.fedoraproject.org/rpms/container-storage-setup cache: http://pkgs.fedoraproject.org/repo/pkgs/container-storage-setup ref: f28 containernetworking-cni: rationale: Primary component of this module repository: git://pkgs.fedoraproject.org/rpms/containernetworking-cni cache: http://pkgs.fedoraproject.org/repo/pkgs/containernetworking-cni ref: f28 oci-register-machine: rationale: Primary component of this module repository: git://pkgs.fedoraproject.org/rpms/oci-register-machine cache: http://pkgs.fedoraproject.org/repo/pkgs/oci-register-machine ref: f28 oci-systemd-hook: rationale: Primary component of this module repository: git://pkgs.fedoraproject.org/rpms/oci-systemd-hook cache: http://pkgs.fedoraproject.org/repo/pkgs/oci-systemd-hook ref: f28 oci-umount: rationale: Primary component of this module repository: git://pkgs.fedoraproject.org/rpms/oci-umount cache: http://pkgs.fedoraproject.org/repo/pkgs/oci-umount ref: f28 podman: rationale: Primary component of this module repository: git://pkgs.fedoraproject.org/rpms/podman cache: http://pkgs.fedoraproject.org/repo/pkgs/podman ref: f28 buildorder: 1 python-docker: rationale: Primary component of this module repository: git://pkgs.fedoraproject.org/rpms/python-docker cache: http://pkgs.fedoraproject.org/repo/pkgs/python-docker ref: f28 python-docker-pycreds: rationale: Primary component of this module repository: git://pkgs.fedoraproject.org/rpms/python-docker-pycreds cache: http://pkgs.fedoraproject.org/repo/pkgs/python-docker-pycreds ref: f28 python-varlink: rationale: Primary component of this module repository: git://pkgs.fedoraproject.org/rpms/python-varlink cache: http://pkgs.fedoraproject.org/repo/pkgs/python-varlink ref: f28 runc: rationale: Primary component of this module repository: git://pkgs.fedoraproject.org/rpms/runc cache: http://pkgs.fedoraproject.org/repo/pkgs/runc ref: f28 skopeo: rationale: Primary component of this module repository: git://pkgs.fedoraproject.org/rpms/skopeo cache: http://pkgs.fedoraproject.org/repo/pkgs/skopeo ref: f28 artifacts: rpms: - atomic-0:1.22.1-2.module_1816+29c6bc78.x86_64 - atomic-registries-0:1.22.1-2.module_1816+29c6bc78.x86_64 - buildah-0:1.3-1.git4888163.module_2106+3b446c4f.x86_64 - container-selinux-2:2.69-3.git452b90d.module_2106+3b446c4f.noarch - container-storage-setup-0:0.11.0-1.git42c9d9c.module_2106+3b446c4f.noarch - containernetworking-cni-0:0.7.1-1.module_2106+3b446c4f.x86_64 - containernetworking-cni-devel-0:0.7.1-1.module_2106+3b446c4f.noarch - containernetworking-cni-unit-test-devel-0:0.7.1-1.module_2106+3b446c4f.x86_64 - containers-common-0:0.1.31-14.dev.gitb0b750d.module_2106+3b446c4f.x86_64 - oci-register-machine-0:0-7.1.git66fa845.module_1816+29c6bc78.x86_64 - oci-systemd-hook-1:0.1.17-3.gitbd86a79.module_2106+3b446c4f.x86_64 - oci-umount-2:2.3.4-1.git87f9237.module_1816+29c6bc78.x86_64 - podman-0:0.8.2.1-1.gitf38eb4f.module_2106+3b446c4f.x86_64 - podman-docker-0:0.8.2.1-1.gitf38eb4f.module_2106+3b446c4f.noarch - python2-docker-0:3.2.1-1.module_1816+29c6bc78.noarch - python2-docker-pycreds-0:0.2.2-2.module_1816+29c6bc78.noarch - python2-docker-tests-0:3.2.1-1.module_1816+29c6bc78.noarch - python3-docker-0:3.2.1-1.module_1816+29c6bc78.noarch - python3-docker-pycreds-0:0.2.2-2.module_1816+29c6bc78.noarch - python3-podman-0:0.8.2.1-1.gitf38eb4f.module_2106+3b446c4f.noarch - python3-pypodman-0:0.8.2.1-1.gitf38eb4f.module_2106+3b446c4f.noarch - python3-varlink-0:27.1.1-1.module_2106+3b446c4f.noarch - runc-2:1.0.0-50.dev.git20aff4f.module_2106+3b446c4f.x86_64 - skopeo-0:0.1.31-14.dev.gitb0b750d.module_2106+3b446c4f.x86_64 ... --- document: modulemd version: 2 data: name: container-tools stream: 2017.0 version: 20180816194450 context: 80bd9113 arch: x86_64 summary: Common tools and dependencies for container runtimes description: >- Contains SELinux policies, binaries and other dependencies for use with container runtimes license: module: - MIT content: - MIT xmd: mbs: mse: TRUE scmurl: https://src.fedoraproject.org/modules/container-tools.git?#eef39c487fcfdffb12a4a18d3fccec8f0ea48d35 commit: eef39c487fcfdffb12a4a18d3fccec8f0ea48d35 buildrequires: platform: ref: f29 stream: f29 context: 00000000 version: 5 filtered_rpms: [] golang: ref: 92882e9696b779110fd27aa11ddbc88f30eb82a2 stream: 1.10 context: 6c81f848 version: 20180816140129 filtered_rpms: [] golang-ecosystem: ref: 384b17a75c5c9be71c913651126d6899e42e8d84 stream: 2017.0 context: cbfb2833 version: 20180816154241 filtered_rpms: [] rpms: atomic: ref: 6cec22f4c5825958a7a702586a1f8bb8aa15f854 python-docker-pycreds: ref: 5347f5fb0029c9664a0e5de07d733747568cd08d skopeo: ref: 37201821cfb686ab9a5009fe8b066982978e2458 python-docker: ref: 2807ee649da39b46336a79f4795d0ed2d8b496cf buildah: ref: 430c7a0285af77ab4a462568cb07f9f8f0c83cf2 container-selinux: ref: 02a599cecb197d9c2261d1af30e4895e806f7bca oci-register-machine: ref: 9c3980edbc2cdcede251b59b24faddf495c7d1b4 container-storage-setup: ref: fa451e89ac98aa45131ca68d35f47197d863deb0 oci-umount: ref: 14f111761a8e6691eb88589d58be4db35a9fa727 runc: ref: 9f4d6de82cac64f4604d12676e322c7d30661962 oci-systemd-hook: ref: 7b9e5e15cba8f89cf729b6580e46fe3e3fb18c11 dependencies: - buildrequires: platform: [f29] requires: platform: [f29] references: community: https://github.com/projectatomic documentation: https://projectatomic.io tracker: https://github.com/projectatomic profiles: default: rpms: - atomic - buildah - container-selinux - container-storage-setup - oci-register-machine - oci-systemd-hook - oci-umount - python-docker - python-docker-pycreds - runc - skopeo api: rpms: - atomic - atomic-registries - buildah - container-selinux - container-storage-setup - oci-register-machine - oci-systemd-hook - oci-umount - python2-docker - python2-docker-pycreds - python3-docker - python3-docker-pycreds - runc - skopeo - skopeo-containers buildopts: rpms: macros: | %_with_ignore_tests 1 components: rpms: atomic: rationale: Primary component of this module repository: git://pkgs.fedoraproject.org/rpms/atomic cache: http://pkgs.fedoraproject.org/repo/pkgs/atomic ref: f28 buildah: rationale: Primary component of this module repository: git://pkgs.fedoraproject.org/rpms/buildah cache: http://pkgs.fedoraproject.org/repo/pkgs/buildah ref: f28 container-selinux: rationale: Primary component of this module repository: git://pkgs.fedoraproject.org/rpms/container-selinux cache: http://pkgs.fedoraproject.org/repo/pkgs/container-selinux ref: f28 container-storage-setup: rationale: Primary component of this module repository: git://pkgs.fedoraproject.org/rpms/container-storage-setup cache: http://pkgs.fedoraproject.org/repo/pkgs/container-storage-setup ref: f28 oci-register-machine: rationale: Primary component of this module repository: git://pkgs.fedoraproject.org/rpms/oci-register-machine cache: http://pkgs.fedoraproject.org/repo/pkgs/oci-register-machine ref: f28 oci-systemd-hook: rationale: Primary component of this module repository: git://pkgs.fedoraproject.org/rpms/oci-systemd-hook cache: http://pkgs.fedoraproject.org/repo/pkgs/oci-systemd-hook ref: f28 oci-umount: rationale: Primary component of this module repository: git://pkgs.fedoraproject.org/rpms/oci-umount cache: http://pkgs.fedoraproject.org/repo/pkgs/oci-umount ref: f28 python-docker: rationale: Primary component of this module repository: git://pkgs.fedoraproject.org/rpms/python-docker cache: http://pkgs.fedoraproject.org/repo/pkgs/python-docker ref: f28 python-docker-pycreds: rationale: Primary component of this module repository: git://pkgs.fedoraproject.org/rpms/python-docker-pycreds cache: http://pkgs.fedoraproject.org/repo/pkgs/python-docker-pycreds ref: f28 runc: rationale: Primary component of this module repository: git://pkgs.fedoraproject.org/rpms/runc cache: http://pkgs.fedoraproject.org/repo/pkgs/runc ref: f28 skopeo: rationale: Primary component of this module repository: git://pkgs.fedoraproject.org/rpms/skopeo cache: http://pkgs.fedoraproject.org/repo/pkgs/skopeo ref: f28 artifacts: rpms: - atomic-0:1.22.1-2.module_1637+1872e86a.x86_64 - atomic-registries-0:1.22.1-2.module_1637+1872e86a.x86_64 - buildah-0:1.3-1.git4888163.module_2040+0e96cf1b.x86_64 - container-selinux-2:2.69-3.git452b90d.module_2040+0e96cf1b.noarch - container-storage-setup-0:0.11.0-1.git42c9d9c.module_2040+0e96cf1b.noarch - containers-common-0:0.1.31-14.dev.gitb0b750d.module_2040+0e96cf1b.x86_64 - oci-register-machine-0:0-7.1.git66fa845.module_1637+1872e86a.x86_64 - oci-systemd-hook-1:0.1.17-3.gitbd86a79.module_2040+0e96cf1b.x86_64 - oci-umount-2:2.3.4-1.git87f9237.module_1637+1872e86a.x86_64 - python2-docker-0:3.2.1-1.module_1637+1872e86a.noarch - python2-docker-pycreds-0:0.2.2-2.module_1637+1872e86a.noarch - python2-docker-tests-0:3.2.1-1.module_1637+1872e86a.noarch - python3-docker-0:3.2.1-1.module_1637+1872e86a.noarch - python3-docker-pycreds-0:0.2.2-2.module_1637+1872e86a.noarch - runc-2:1.0.0-50.dev.git20aff4f.module_2040+0e96cf1b.x86_64 - skopeo-0:0.1.31-14.dev.gitb0b750d.module_2040+0e96cf1b.x86_64 ... --- document: modulemd version: 2 data: name: avocado stream: stable version: 20180816135414 context: 6c81f848 arch: x86_64 summary: Framework with tools and libraries for Automated Testing description: >- Avocado is a set of tools and libraries (what people call these days a framework) to perform automated testing. license: module: - MIT content: - MIT xmd: mbs: mse: TRUE scmurl: https://src.fedoraproject.org/modules/avocado.git?#10208a3095f9522485b933dbab830e3338af95e6 commit: 10208a3095f9522485b933dbab830e3338af95e6 buildrequires: platform: ref: f29 stream: f29 context: 00000000 version: 5 filtered_rpms: [] rpms: python-avocado: ref: 87dc683a36d0862340d3af99b78fa189a1aba424 dependencies: - buildrequires: platform: [f29] requires: platform: [f29] references: community: http://avocado-framework.github.io/ documentation: http://avocado-framework.readthedocs.io/ tracker: https://github.com/avocado-framework/avocado/issues profiles: default: rpms: - python2-avocado - python2-avocado-plugins-output-html - python2-avocado-plugins-varianter-yaml-to-mux minimal: rpms: - python2-avocado api: rpms: - python-avocado-examples - python2-avocado - python2-avocado-plugins-output-html - python2-avocado-plugins-resultsdb - python2-avocado-plugins-runner-docker - python2-avocado-plugins-runner-remote - python2-avocado-plugins-runner-vm - python2-avocado-plugins-varianter-yaml-to-mux components: rpms: python-avocado: rationale: Framework with tools and libraries for Automated Testing repository: git://pkgs.fedoraproject.org/rpms/python-avocado cache: http://pkgs.fedoraproject.org/repo/pkgs/python-avocado ref: main artifacts: rpms: - python-avocado-examples-0:52.1-7.module_1939+1f9e88da.noarch - python2-avocado-0:52.1-7.module_1939+1f9e88da.noarch - python2-avocado-plugins-output-html-0:52.1-7.module_1939+1f9e88da.noarch - python2-avocado-plugins-resultsdb-0:52.1-7.module_1939+1f9e88da.noarch - python2-avocado-plugins-runner-docker-0:52.1-7.module_1939+1f9e88da.noarch - python2-avocado-plugins-runner-remote-0:52.1-7.module_1939+1f9e88da.noarch - python2-avocado-plugins-runner-vm-0:52.1-7.module_1939+1f9e88da.noarch - python2-avocado-plugins-varianter-yaml-to-mux-0:52.1-7.module_1939+1f9e88da.noarch ... --- document: modulemd version: 2 data: name: avocado stream: latest version: 20180816135607 context: 6c81f848 arch: x86_64 summary: Framework with tools and libraries for Automated Testing description: >- Avocado is a set of tools and libraries (what people call these days a framework) to perform automated testing. license: module: - MIT content: - MIT xmd: mbs: mse: TRUE scmurl: https://src.fedoraproject.org/modules/avocado.git?#3649cb2aa51fb496395bb2846addd70b72945543 commit: 3649cb2aa51fb496395bb2846addd70b72945543 buildrequires: platform: ref: f29 stream: f29 context: 00000000 version: 5 filtered_rpms: [] rpms: python-avocado: ref: 1454277ea964bafcdf51803035e3369517d03774 dependencies: - buildrequires: platform: [f29] requires: platform: [f29] references: community: http://avocado-framework.github.io/ documentation: http://avocado-framework.readthedocs.io/ tracker: https://github.com/avocado-framework/avocado/issues profiles: default: description: Default profile installing the most commonly used avocado packages. rpms: - python2-avocado - python2-avocado-plugins-output-html - python2-avocado-plugins-varianter-yaml-to-mux minimal: description: Minimal profile installing only the main avocado package. rpms: - python2-avocado api: rpms: - python-avocado-bash - python-avocado-common - python-avocado-examples - python2-avocado - python2-avocado-plugins-glib - python2-avocado-plugins-golang - python2-avocado-plugins-loader-yaml - python2-avocado-plugins-output-html - python2-avocado-plugins-result-upload - python2-avocado-plugins-resultsdb - python2-avocado-plugins-runner-docker - python2-avocado-plugins-runner-remote - python2-avocado-plugins-runner-vm - python2-avocado-plugins-varianter-pict - python2-avocado-plugins-varianter-yaml-to-mux - python3-avocado - python3-avocado-plugins-glib - python3-avocado-plugins-golang - python3-avocado-plugins-loader-yaml - python3-avocado-plugins-output-html - python3-avocado-plugins-result-upload - python3-avocado-plugins-varianter-pict - python3-avocado-plugins-varianter-yaml-to-mux components: rpms: python-avocado: rationale: Framework with tools and libraries for Automated Testing repository: git://pkgs.fedoraproject.org/rpms/python-avocado cache: http://pkgs.fedoraproject.org/repo/pkgs/python-avocado ref: latest artifacts: rpms: - python-avocado-bash-0:63.0-2.module_1958+f0d1ec4b.noarch - python-avocado-common-0:63.0-2.module_1958+f0d1ec4b.noarch - python-avocado-examples-0:63.0-2.module_1958+f0d1ec4b.noarch - python2-avocado-0:63.0-2.module_1958+f0d1ec4b.noarch - python2-avocado-plugins-glib-0:63.0-2.module_1958+f0d1ec4b.noarch - python2-avocado-plugins-golang-0:63.0-2.module_1958+f0d1ec4b.noarch - python2-avocado-plugins-loader-yaml-0:63.0-2.module_1958+f0d1ec4b.noarch - python2-avocado-plugins-output-html-0:63.0-2.module_1958+f0d1ec4b.noarch - python2-avocado-plugins-result-upload-0:63.0-2.module_1958+f0d1ec4b.noarch - python2-avocado-plugins-resultsdb-0:63.0-2.module_1958+f0d1ec4b.noarch - python2-avocado-plugins-runner-docker-0:63.0-2.module_1958+f0d1ec4b.noarch - python2-avocado-plugins-runner-remote-0:63.0-2.module_1958+f0d1ec4b.noarch - python2-avocado-plugins-runner-vm-0:63.0-2.module_1958+f0d1ec4b.noarch - python2-avocado-plugins-varianter-pict-0:63.0-2.module_1958+f0d1ec4b.noarch - python2-avocado-plugins-varianter-yaml-to-mux-0:63.0-2.module_1958+f0d1ec4b.noarch - python3-avocado-0:63.0-2.module_1958+f0d1ec4b.noarch - python3-avocado-plugins-glib-0:63.0-2.module_1958+f0d1ec4b.noarch - python3-avocado-plugins-golang-0:63.0-2.module_1958+f0d1ec4b.noarch - python3-avocado-plugins-loader-yaml-0:63.0-2.module_1958+f0d1ec4b.noarch - python3-avocado-plugins-output-html-0:63.0-2.module_1958+f0d1ec4b.noarch - python3-avocado-plugins-result-upload-0:63.0-2.module_1958+f0d1ec4b.noarch - python3-avocado-plugins-varianter-pict-0:63.0-2.module_1958+f0d1ec4b.noarch - python3-avocado-plugins-varianter-yaml-to-mux-0:63.0-2.module_1958+f0d1ec4b.noarch ... --- document: modulemd version: 2 data: name: ant stream: 1.10 version: 20180629154141 context: 819b5873 arch: x86_64 summary: Java build tool description: >- Apache Ant is a Java library and command-line tool whose mission is to drive processes described in build files as targets and extension points dependent upon each other. The main known usage of Ant is the build of Java applications. Ant supplies a number of built-in tasks allowing to compile, assemble, test and run Java applications. Ant can also be used effectively to build non Java applications, for instance C or C++ applications. More generally, Ant can be used to pilot any type of process which can be described in terms of targets and tasks. license: module: - MIT content: - MIT xmd: mbs: mse: TRUE scmurl: https://src.fedoraproject.org/modules/ant.git?#efb686945a977ec8322eca2401e96e8da0f4e3f2 commit: efb686945a977ec8322eca2401e96e8da0f4e3f2 buildrequires: javapackages-tools: ref: 1e429a4d686d3fdd1d93ce7e8ac7254148ea3471 stream: 201801 context: b43b0c8f version: 20180629150827 filtered_rpms: [] platform: ref: virtual stream: f28 context: 00000000 version: 4 filtered_rpms: [] rpms: ant: ref: 1b60ebd3ac34e2c4648c4a5377c9e51fc44d658c dependencies: - requires: platform: [] profiles: default: rpms: - ant api: rpms: - ant filter: rpms: - ant-antlr - ant-apache-bcel - ant-apache-bsf - ant-apache-log4j - ant-apache-oro - ant-apache-regexp - ant-apache-resolver - ant-apache-xalan2 - ant-commons-logging - ant-commons-net - ant-javadoc - ant-javamail - ant-jdepend - ant-jmf - ant-jsch - ant-junit - ant-manual - ant-swing - ant-testutil - ant-xz buildopts: rpms: macros: | %_with_xmvn_javadoc 1 %_without_asciidoc 1 %_without_avalon 1 %_without_bouncycastle 1 %_without_cython 1 %_without_dafsa 1 %_without_desktop 1 %_without_doxygen 1 %_without_dtd 1 %_without_eclipse 1 %_without_ehcache 1 %_without_emacs 1 %_without_equinox 1 %_without_fop 1 %_without_ftp 1 %_without_gradle 1 %_without_groovy 1 %_without_hadoop 1 %_without_hsqldb 1 %_without_itext 1 %_without_jackson 1 %_without_jmh 1 %_without_jna 1 %_without_jpa 1 %_without_junit5 1 %_without_logback 1 %_without_markdown 1 %_without_memcached 1 %_without_memoryfilesystem 1 %_without_obr 1 %_without_python 1 %_without_reporting 1 %_without_scm 1 %_without_snappy 1 %_without_spring 1 %_without_ssh 1 %_without_testlib 1 components: rpms: ant: rationale: 'Module API. ' repository: git://pkgs.fedoraproject.org/rpms/ant cache: http://pkgs.fedoraproject.org/repo/pkgs/ant ref: javapackages buildorder: 10 artifacts: rpms: - ant-0:1.10.4-1.module_1886+ece9a977.noarch - ant-lib-0:1.10.4-1.module_1886+ece9a977.noarch ... --- document: modulemd-defaults version: 1 data: module: nodejs profiles: 6: [default] 8: [default] 9: [default] ... --- document: modulemd-defaults version: 1 data: module: reviewboard profiles: 2.5: [default] 3.0: [default] ... --- document: modulemd-defaults version: 1 data: module: ant profiles: 1.10: [default] ... --- document: modulemd-defaults version: 1 data: module: dwm stream: 6.1 profiles: 6.0: [default] 6.1: [default] latest: [default] ... --- document: modulemd-defaults version: 1 data: module: maven profiles: 3.5: [default] ... --- document: modulemd-defaults version: 1 data: module: django profiles: 1.6: [default] ... --- document: modulemd-defaults version: 1 data: module: stratis stream: 1 profiles: 1: [default] ... fedora-modularity-libmodulemd-357799c/modulemd/tests/test_data/fr.po000066400000000000000000001013711502446517500256330ustar00rootroot00000000000000# Jean-Baptiste Holcroft , 2018. #zanata # Thierry Carrere , 2018. #zanata # elmerys , 2018. #zanata # Jean-Baptiste Holcroft , 2019. #zanata msgid "" msgstr "" "Project-Id-Version: fedora-modularity-translations VERSION\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" "POT-Creation-Date: 2018-10-16 20:32+0000\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "PO-Revision-Date: 2019-01-28 09:27+0000\n" "Last-Translator: Jean-Baptiste Holcroft \n" "Language-Team: French\n" "Language: fr\n" "X-Generator: Zanata 4.6.2\n" "Plural-Forms: nplurals=2; plural=(n > 1)\n" #: ant;1.10;description:2 msgid "" "Apache Ant is a Java library and command-line tool whose mission is to drive " "processes described in build files as targets and extension points dependent " "upon each other. The main known usage of Ant is the build of Java " "applications. Ant supplies a number of built-in tasks allowing to compile, " "assemble, test and run Java applications. Ant can also be used effectively " "to build non Java applications, for instance C or C++ applications. More " "generally, Ant can be used to pilot any type of process which can be " "described in terms of targets and tasks." msgstr "" "Apache Ant est une librairie Java et un utilitaire de commande dont la " "mission est de piloter les processus décrit comme des cibles et des points " "d'extensions dépendant les uns des autres dans les fichiers de création. " "L'usage le plus courant de Ant est de construire des applications Java. Ant " "fournit de nombreuses fonctions pré-intégrées permettant de compiler, " "d'assembler, de tester et d'exécuter des applications Java. Ant peut aussi " "être utilisé pour créer des applications autre que Java par example en C ou " "C++. Plus généralement Ant peut être utilisé pour coordonner n'importe quel " "processus qui peut être décrit en terme de cibles et de taches." #: ant;1.10;summary:1 msgid "Java build tool" msgstr "Outil de création Java" #: avocado;latest;description:2 avocado;stable;description:2 msgid "" "Avocado is a set of tools and libraries (what people call these days a " "framework) to perform automated testing." msgstr "" "Avocado est un ensemble d'outils et de librairies (que l'on nomme aussi " "environnement de développement) pour effectuer des tests automatisés." #: avocado;latest;profile;default:3 msgid "Default profile installing the most commonly used avocado packages." msgstr "" "Le profil par défaut installe les paquets d'Avocado les plus courants." #: avocado;latest;profile;minimal:3 msgid "Minimal profile installing only the main avocado package." msgstr "" "Le profil minimal installe seulement les paquets principaux d'Avocado." #: avocado;latest;summary:1 avocado;stable;summary:1 msgid "Framework with tools and libraries for Automated Testing" msgstr "" "Environnement de développement incluant les outils et les librairies pour " "les tests automatiques." #: container-tools;2017.0;description:2 container-tools;2018.0;description:2 msgid "" "Contains SELinux policies, binaries and other dependencies for use with " "container runtimes" msgstr "" "Contient les politiques SELinux, les binaires et autres dépendances pour une " "utilisation avec les Runtimes containérisés." #: container-tools;2017.0;summary:1 container-tools;2018.0;summary:1 msgid "Common tools and dependencies for container runtimes" msgstr "Outils usuels et dépendences pour les Runtimes containérisés." #: cri-o;1.11;description:2 cri-o;2017.0;description:2 #: cri-o;2018.0;description:2 msgid "" "CRI-O is the Kubernetes Container Runtime Interface for OCI-based containers." "" msgstr "" "CRI-O est l'interface Kubernetes Container Runtime pour les conteneurs OCI." #: cri-o;1.11;summary:1 cri-o;2017.0;summary:1 cri-o;2018.0;summary:1 msgid "Kubernetes Container Runtime Interface for OCI-based containers" msgstr "Interface Kubernetes Container Runtime pour les conteneurs OCI" #: django;1.6;description:2 msgid "" "Django is a high-level Python Web framework that encourages rapid " "development and a clean, pragmatic design. It focuses on automating as much " "as possible and adhering to the DRY (Don't Repeat Yourself) principle." msgstr "" "Django est un framework Web Python de haut niveau qui encourage un " "développement rapide et une conception claire et pragmatique. Il se " "concentre sur l'automatisation autant que possible et sur le respect du " "principe DRY (Don't Repeat Yourself)." #: django;1.6;summary:1 msgid "A high-level Python Web framework" msgstr "Un cadriciel Web de haut niveau en Python" #: docker;2017.0;description:2 msgid "" "Docker is an open-source engine that automates the deployment of any " "application as a lightweight, portable, self-sufficient container that will " "run virtually anywhere." msgstr "" "Docker est un moteur open-source qui automatise le déploiement de n'importe " "quelle application en tant que conteneur léger, portable et autosuffisant " "qui fonctionne pratiquement partout." #: docker;2017.0;summary:1 msgid "Module for docker runtime and docker-distribution" msgstr "Module pour l'environnement d’exécution docker et docker-distribution" #: dwm;6.0;description:2 dwm;6.1;description:2 dwm;latest;description:2 msgid "" "dwm is a dynamic window manager for X. It manages windows in tiled, " "monocle, and floating layouts. All of the layouts can be applied " "dynamically, optimizing the environment for the application in use and the " "task performed." msgstr "" "dwm est un gestionnaire de fenêtres dynamique pour X. Il gère les fenêtres " "en mosaïque, en monocle et en disposition flottante. Toutes les mises en " "page peuvent être appliquées dynamiquement, optimisant ainsi l'environnement " "pour l'application utilisée et la tâche effectuée." #: dwm;6.0;profile;default:3 dwm;6.1;profile;default:3 #: dwm;latest;profile;default:3 msgid "The minimal, distribution-compiled dwm binary." msgstr "Le binaire dwm minimal, compilé pour la diffusion." #: dwm;6.0;profile;user:3 dwm;6.1;profile;user:3 dwm;latest;profile;user:3 msgid "" "Includes distribution-compiled dwm as well as a helper script to apply user " "patches and configuration, dwm-user." msgstr "" "Inclut dwm compilé pour la distribution ainsi qu'un script d'aide pour " "appliquer les correctifs utilisateur et la configuration, dwm-user." #: dwm;6.0;summary:1 dwm;6.1;summary:1 dwm;latest;summary:1 msgid "Dynamic window manager for X" msgstr "Gestionnaire dynamique de fenêtres pour X." #: eog;main;description:2 msgid "" "The Eye of GNOME image viewer (eog) is the official image viewer for the " "GNOME desktop. It can view single image files in a variety of formats, as " "well as large image collections.\n" msgstr "" "Le visionneur d'images \"Eye of GNOME\" (eog) est le logiciel officiel pour " "l'environnement de bureau GNOME. Il peut afficher aussi bien un simple " "fichier image dans une multitude de formats qu'une importante galerie " "d'images.\n" #: eog;main;summary:1 msgid "Eye of GNOME Application Module" msgstr "Module d'application \"Eye of GNOME\"." #: feedreader;main;description:2 msgid "" "FeedReader is a modern desktop application designed to complement existing " "web-based RSS accounts. It combines all the advantages of web based services " "like synchronization across all your devices with everything you expect from " "a modern desktop application." msgstr "" "FeedReader est une application de bureau moderne conçue pour compléter les " "comptes RSS en ligne existants. Il combine tous les avantages d'un service " "en ligne comme la synchronisation de tous vos périphériques avec tout ce que " "l'on peut attendre d'une application moderne de bureau." #: feedreader;main;summary:1 msgid "RSS desktop client" msgstr "Client RSS de bureau" #: flatpak-common;f29;description:2 msgid "" "This module is used to build packages relocated into /app for bundling into " "Flatpaks." msgstr "" "Ce module est utilisé pour construire des paquets transférés dans /app pour " "regroupement dans des paquets Flatpak." #: flatpak-common;f29;summary:1 msgid "Common builds to include in Flatpak containers" msgstr "Structures courantes, à inclure dans les conteneurs Flatpak." #: flatpak-runtime;f29;description:2 msgid "" "This module defines two runtimes for Flatpaks, the 'runtime' profile that " "most Flatpaks in Fedora use, and a smaller 'runtime-base' profile that is " "intended to be more minimal and (slightly) more API stable. There are also " "corresponding sdk and sdk-base profiles that are used to build SDKs that " "applications can be built against with flatpak-builder." msgstr "" "Ce module définit deux environnements d'exécution pour Flatpaks : le profil " "basique convenant à la plupart des utilisateurs de Fedora ainsi qu'un profil " "de développement plus petit pensé pour être plus minimal et plus stable avec " "les APIs.\n" " There are also corresponding sdk and sdk-base profiles that are used to " "build SDKs that applications can be built against with flatpak-builder." #: flatpak-runtime;f29;summary:1 msgid "Flatpak Runtime" msgstr "L'environnement d'exécution Flatpak" #: gcsf;main;description:2 msgid "" "GCSF is a virtual filesystem that allows users to mount their\n" "Google Drive account locally and interact with it as a\n" "regular disk partition.\n" msgstr "" "GCSF est un système de fichiers virtuels qui permet aux utilisateurs de " "monter leurs \n" "comptes Google Drive en local et interagir avec eux comme si c'était une " "partition\n" "normale.\n" #: gcsf;main;summary:1 msgid "FUSE file system based on Google Drive" msgstr "Système de fichiers FUSE basé sur Google Drive" #: ghc;8.4;description:2 msgid "This module provides the Glasgow Haskell Compiler version 8.4.3." msgstr "Ce module fournit la version 8.4.3 du compilateur Glasgow Haskell." #: ghc;8.4;profile;default:3 msgid "standard installation" msgstr "Installation standard" #: ghc;8.4;profile;minimal:3 msgid "just compiler and base" msgstr "juste le compilateur et la base" #: ghc;8.4;profile;small:3 msgid "compiler with main core libs" msgstr "Compilateur avec les bibliothéques du noyau prncipal" #: ghc;8.4;summary:1 msgid "Haskell GHC 8.4" msgstr "Haskell GHC 8.4" #: gimp;2.10;description:2 msgid "A module containing GIMP, the GNU Image Manipulation Program." msgstr "" "Un module qui contient GIMP, le logiciel de manipulation d'images de GNU." #: gimp;2.10;summary:1 msgid "GIMP" msgstr "GIMP" #: gnome-clocks;main;description:2 gnome-clocks;main;summary:1 msgid "Clock application designed for GNOME 3" msgstr "Application \"Horloge\" conçue pour GNOME 3" #: gnome-tetravex;main;description:2 msgid "" "A puzzle game where you have to match a grid of tiles together. The skill " "level ranges from the simple two by two up to the seriously mind-bending six " "by six grid." msgstr "" "Un jeu de puzzle où vous devez faire correspondre des grilles de tuiles. Le " "niveau de difficulté va du simple deux par deux jusqu'à l'infernal \"tord-" "méninges\" de la grille six par six." #: gnome-tetravex;main;summary:1 msgid "GNOME Tetravex game" msgstr "Jeu GNOME Tetravex " #: golang-ecosystem;2017.0;description:2 golang-ecosystem;2018.0;description:2 msgid "" "This module contains golang based tools used as dependencies for other " "packages, for instance, go-md2man, a manpage converter written in Go, along " "with rpm macros for building Go based tools." msgstr "" "Ce module contient des outils spécifiques à golang utilisés comme " "dépendances pour d'autres paquets. Par exemple \"go-md2man\", un " "convertisseur de page de \"man\" écrit en Go sera couplé avec des macros rpm " "pour construire des outils pour Go." #: golang-ecosystem;2017.0;summary:1 golang-ecosystem;2018.0;summary:1 msgid "The ecosystem of packages for the Go programming language" msgstr "L'écosystème de paquets pour le langage de programmation Go" #: golang;1.10;description:2 msgid "" "This module provides the Go compiler and associated tools and documentation." msgstr "" "Ce module fournit le compilateur Go, sa documentation et les outils associés." "" #: golang;1.10;summary:1 msgid "The Go Programming Language" msgstr "Le langage de programmation Go." #: hub;pre-release;description:2 msgid "" "hub is a command line tool that wraps `git` in order to extend it with extra " "features and commands that make working with GitHub easier.\n" "\n" " $ hub clone rtomayko/tilt\n" "\n" " # expands to:\n" " $ git clone git://github.com/rtomayko/tilt.git" msgstr "" "hub est un outil en ligne de commande qui enrobe `git`dans le but de " "l'enrichir avec des fonctionnalités additionnelles et des commandes " "facilitant le travail avec GitHub.\n" "\n" " $ hub clone rtomayko/tilt\n" "\n" " # s'étendra en :\n" " $ git clone git://github.com/rtomayko/tilt.git" #: hub;pre-release;summary:1 msgid "A command-line wrapper for git with github shortcuts" msgstr "" "Une surcouche à git en ligne de commande avec des raccourcis liés à Github" #: kubernetes;1.10;description:2 msgid "" "Kubernetes is an open source system for managing containerized applications " "across multiple hosts; providing basic mechanisms for deployment, " "maintenance, and scaling of applications. Kubernetes builds upon a decade " "and a half of experience at Google running production workloads at scale " "using a system called Borg, combined with best-of-breed ideas and practices " "from the community." msgstr "" "Kubernetes s'appuie sur une quinzaine d'années d'expérience chez Google dans " "l'exécution de volumes de travail en production à l'échelle utilisant un " "système appelé Borg, combiné avec les meilleures idées et pratiques de la " "communauté." #: kubernetes;1.10;summary:1 msgid "Container cluster management" msgstr "Gestion des grappes de conteneurs" #: kubernetes;openshift-3.10;description:2 msgid "" "OpenShift Origin is a distribution of Kubernetes optimized for application " "development and deployment. OpenShift Origin adds developer and operational " "centric tools on top of Kubernetes to enable rapid application development, " "easy deployment and scaling, and long-term lifecycle maintenance for small " "and large teams and applications. It provides a secure and multi-tenant " "configuration for Kubernetes allowing you to safely host many different " "applications and workloads." msgstr "" "OpenShift Origin est une distribution de Kubernetes optimisée pour le " "développement d’applications et le déploiement. OpenShift Origin apporte des " "outils focalisés pour les développeurs et les opérations s’appuyant sur " "Kubernetes pour permettre le développement d'applications rapides, faciles à " "déployer et à faire monter en charge, et une maintenance à long terme du " "cycle de vie pour les petites et grandes équipes et applications. Cet outil " "fourni une configuration sécurisé et multi-tenant pour Kubernetes vous " "permettant d'héberger de façon sécurisé différentes applications et charges " "de travail." #: kubernetes;openshift-3.10;summary:1 msgid "OpenShift Container Management" msgstr "Gestionnaire de conteneurs OpenShift" #: libgit2;0.26;description:2 libgit2;0.27;description:2 msgid "The Git linkable library." msgstr "La bibliothèque Git linkable" #: libgit2;0.26;summary:1 libgit2;0.27;summary:1 msgid "Library implementation of Git" msgstr "Implémentation de la bibliothèque de Git" #: lizardfs;devel;description:2 msgid "" "LizardFS is an Open Source, easy to deploy and maintain, distributed, fault " "tolerant file system for POSIX compliant OSes. LizardFS is a fork of MooseFS." " For more information please visit http://lizardfs.com" msgstr "" "LizardFS est un système de fichier Open-Source, facile à déployer et " "maintenir, distribué et tolérant aux pannes pour les systèmes " "d'exploitations compatibles POSIX. C'est un fork de MooseFS. Pour plus " "d'informations, veuillez visiter http://lizardfs.com" #: lizardfs;devel;summary:1 msgid "Distributed, fault tolerant file system" msgstr "Système de fichier distribué, tolérant aux pannes" #: mariadb;10.1;description:2 msgid "" "MariaDB is a community developed branch of MySQL. MariaDB is a multi-user, " "multi-threaded SQL database server. It is a client/server implementation " "consisting of a server daemon (mysqld) and many different client programs " "and libraries. The base package contains the standard MariaDB/MySQL client " "programs and generic MySQL files." msgstr "" "MariaDB est une branche de MySQL développée par la communauté. MariaDB est " "un serveur de base de données SQL multi-utilisateurs et multi-threads. C'est " "une implémentation client/serveur constituée d'un démon serveur (mysqld) et " "de nombreux programmes clientes et bibliothèques. Le paquet de base contient " "les programmes clients MariaDB/MySQL et les fichiers MySQL génériques." #: mariadb;10.1;summary:1 msgid "MariaDB Module" msgstr "Module MariaDB" #: maven;3.5;description:2 msgid "" "Maven is a software project management and comprehension tool. Based on the " "concept of a project object model (POM), Maven can manage a project's build, " "reporting and documentation from a central piece of information." msgstr "" "Maven est un outil de gestion et de conception projets logiciels. Basé sur " "le concept du modèle objet projet (POM), Maven peut gérer la compilation du " "projet, son reporting et sa documentation depuis un seul ensemble " "d'informations." #: maven;3.5;summary:1 msgid "Java project management and project comprehension tool" msgstr "Outil de conception de projets et de gestion de projets Java" #: meson;main;description:2 msgid "" "Meson is an open source build system meant to be both extremely fast, and, " "even more importantly, as user friendly as possible.\n" "The main design point of Meson is that every moment a developer spends " "writing or debugging build definitions is a second wasted. So is every " "second spent waiting for the build system to actually start compiling code." msgstr "" "Meson est un système de compilation open-source visant à être extrêmement " "rapide, et plus important encore, aussi facile à utiliser que possible.\n" "Le point central de conception de Meson est que chaque instant que le " "développeur passe à écrire ou déboguer les définitions de compilations est " "une seconde de perdue. Idem pour chaque seconde passé à attendre que le " "système de compilation démarre effectivement à compiler le code." #: meson;main;summary:1 msgid "The Meson Build system" msgstr "Le système de compilation Meson" #: mongodb;3.4;description:2 mongodb;3.6;description:2 msgid "" "Mongo from humongous is a high-performance, open source, schema-free " "document-oriented database. MongoDB is written in C++ and offers the " "following features. Collection oriented storage, easy storage of object/JSON-" "style data. Dynamic queries. Full index support, including on inner objects " "and embedded arrays. Query profiling. Replication and fail-over support. " "Efficient storage of binary data including large objects (e.g. photos and " "videos). Auto-sharding for cloud-level scalability (currently in early " "alpha). Commercial Support Available. A key goal of MongoDB is to bridge the " "gap between key/value stores (which are fast and highly scalable) and " "traditional RDBMS systems (which are deep in functionality)." msgstr "" "Mongo de humongous est une base de données de haute performance, open " "source, sans schémas, orientée documents. MongoDB est écrite en C+++ et " "offre les fonctionnalités suivantes. Stockage orienté collection, stockage " "facile des données de type objet/JSON. Requêtes dynamiques. Prise en charge " "complète de l'index, y compris sur les objets internes et les tableaux " "intégrés. Profilage des requêtes. Prise en charge de la réplication et du " "basculement. Stockage efficace des données binaires, y compris des objets de " "grande taille (par ex. photos et vidéos). Auto-sharding pour l'évolutivité " "au niveau du nuage (actuellement en pré-alpha). Support commercial " "disponible. L'un des principaux objectifs de MongoDB est de combler le fossé " "entre les stockages clés/de valeur (qui sont rapides et hautement " "évolutives) et les systèmes de SGBDR traditionnels (dont les fonctionnalités " "sont très développées)." #: mongodb;3.4;summary:1 mongodb;3.6;summary:1 msgid "MongoDB Module" msgstr "Module MongoDB" #: mysql;5.7;description:2 msgid "" "MySQL is a multi-user, multi-threaded SQL database server. MySQL is a client/" "server implementation consisting of a server daemon (mysqld) and many " "different client programs and libraries. The base package contains the " "standard MySQL client programs and generic MySQL files." msgstr "" "MySQL est un serveur de base de données SQL multi-utilisateurs et multi-" "threads. C'est une implémentation client/serveur constituée d'un démon " "serveur (mysqld) et de nombreux programmes clientes et bibliothèques. Le " "paquet de base contient les programmes clients MySQL et les fichiers MySQL " "génériques." #: mysql;5.7;summary:1 msgid "MySQL Module" msgstr "Module MySQL" #: ninja;main;description:2 msgid "" "This module includes Ninja build system. Ninja is a small build system with " "a focus on speed. It differs from other build systems in two major respects: " "it is designed to have its input files generated by a higher-level build " "system, and it is designed to run builds as fast as possible." msgstr "" "Ce module inclus le système de compilation Ninja. C'est un petit système de " "compilation axé sur la vitesse. Il se différencie des autres systèmes de " "compilation à deux égards majeurs : il est conçu pour avoir ses fichiers " "d'entrée générés par un système de compilation de plus haut niveau, et pour " "exécuter les compilations aussi vite que possible." #: ninja;main;summary:1 msgid "Small build system with a focus on speed" msgstr "Petit système de compilation axé sur la vitesse" #: nodejs;10;description:2 nodejs;8;description:2 msgid "" "Node.js is a platform built on Chrome''s JavaScript runtime for easily " "building fast, scalable network applications. Node.js uses an event-driven, " "non-blocking I/O model that makes it lightweight and efficient, perfect for " "data-intensive real-time applications that run across distributed devices." msgstr "" "Note.js est une plateforme construite à partir de l'interpréteur JavaScript " "de Chrome pour facilement construire des applications réseaux rapides et " "pouvant monter en charge. Node.js utilise un modèle évènementiel et d'I/O " "non bloquantes le faisant léger et efficient, parfait pour les applications " "temps réelles et gourmandes en données exécutée sur des périphériques " "distribués." #: nodejs;10;summary:1 nodejs;8;summary:1 msgid "Javascript runtime" msgstr "L'exécutable Javascript" #: perl-bootstrap;5.24;description:2 perl-bootstrap;5.26;description:2 msgid "" "This is the Perl interpreter and a set of modules written in Perl language " "intended for bootstrapping the perl module. This module disables some " "optional tests to limit amount of components. This module is not intended " "for public use. It's an intermediate step for building perl module.\n" msgstr "" "Il s'agit de l'interpréteur Perl et d'un ensemble de modules écrits en " "langage Perl destinés à amorcer le module Perl. Ce module désactive certains " "tests optionnels pour limiter le nombre de composants. Ce module n'est pas " "destiné à un usage public. C'est une étape intermédiaire pour construire un " "module Perl.\n" #: perl-bootstrap;5.24;summary:1 perl-bootstrap;5.26;summary:1 msgid "Perl bootstrap module for bootrapping Perl module" msgstr "Module d'amorçage Perl pour l'amorçage du module Perl" #: perl;5.24;description:2 perl;5.26;description:2 msgid "" "Perl is a high-level programming language with roots in C, sed, awk and " "shell scripting. Perl is good at handling processes and files, and is " "especially good at handling text. Perl's hallmarks are practicality and " "efficiency. While it is used to do a lot of different things, Perl's most " "common applications are system administration utilities and web programming." "\n" msgstr "" "Perl est un langage de programmation de haut niveau avec des racines en C, " "sed, awk et des scripts shell. Perl est bon dans la gestion des processus et " "des fichiers, et est particulièrement bon dans la gestion du texte. Les " "caractéristiques de Perl sont la praticité et l'efficacité. Bien qu'il soit " "utilisé pour faire beaucoup de choses différentes, les applications Perl les " "plus courantes sont les utilitaires d'administration système et la " "programmation Web.\n" #: perl;5.26;profile;default:3 msgid "Interpreter and all Perl modules bundled within upstream Perl." msgstr "" "Regroupement de l'interpréteur et de tous les modules inclus dans l'upstream " "de Perl" #: perl;5.26;profile;minimal:3 msgid "Only the interpreter as a standalone executable." msgstr "Seulement l'interpréteur en tant qu'exécutable autonome." #: perl;5.24;summary:1 perl;5.26;summary:1 msgid "Practical Extraction and Report Language" msgstr "Langage pratique d'extraction et de rapports" #: pki;10.6;description:2 msgid "A module for Dogtag PKI." msgstr "Un module pour Dogtag PKI." #: pki;10.6;summary:1 msgid "Dogtag PKI" msgstr "Dogtag PKI" #: postgresql;9.6;description:2 msgid "" "PostgreSQL is an advanced Object-Relational database management system " "(DBMS). The PostgreSQL server can be found in the postgresql-server sub-" "package." msgstr "" "PostgreSQL est un système avancé de gestion de base de données Object-" "Relational (SGBD). Le serveur PostgreSQL se trouve dans le sous-paquet " "postgresql-server." #: postgresql;9.6;summary:1 msgid "PostgreSQL module" msgstr "Module PostgreSQL" #: rawtherapee;devel;description:2 msgid "" "Rawtherapee is a RAW image processing software. It gives full control over " "many parameters to enhance the raw picture before finally exporting it to " "some common image format." msgstr "" "Rawtherapee est un logiciel de traitement d'images RAW. Il donne un contrôle " "total sur de nombreux paramètres pour améliorer l'image brute avant de " "l'exporter dans un format d'image commun." #: rawtherapee;devel;summary:1 msgid "Raw image processing software" msgstr "Logiciel de traitement d’images RAW" #: reviewboard;2.5;description:2 reviewboard;3.0;description:2 msgid "" "Review Board is a powerful web-based code review tool that offers developers " "an easy way to handle code reviews. It scales well from small projects to " "large companies and offers a variety of tools to take much of the stress and " "time out of the code review process." msgstr "" "Review Board est un puissant outil web qui offre aux développeurs un moyen " "facile de traiter les revues de code. Il s'adapte aussi bien aux petits " "projets qu'aux grandes entreprises et offre une variété d'outils pour " "réduire le stress et le temps du processus." #: reviewboard;2.5;summary:1 reviewboard;3.0;summary:1 msgid "A web-based code review tool" msgstr "Un outil web de revues de code" #: ripgrep;latest;description:2 ripgrep;main;description:2 msgid "" "Line oriented search tool using Rust's regex library. Combines\n" "the raw performance of grep with the usability of the silver searcher.\n" msgstr "" "Outil de recherche orienté ligne utilisant la bibliothèque regex de Rust. " "Combine la performance brute du grep avec la facilité d'utilisation du " "chercheur d'argent.\n" #: ripgrep;latest;summary:1 ripgrep;main;summary:1 msgid "Line oriented search tool using Rust's regex library" msgstr "" "Outil de recherche orienté ligne utilisant la bibliothèque regex de Rust" #: ruby;main;description:2 ruby;private-jaruga-main;description:2 msgid "" "Ruby is the interpreted scripting language for quick and easy object-" "oriented programming. It has many features to process text files and to do " "system management tasks (as in Perl). It is simple, straight-forward, and " "extensible." msgstr "" "Ruby est le langage de script interprété pour une programmation orientée " "objet rapide et facile. Il dispose de nombreuses fonctionnalités pour " "traiter les fichiers texte et pour effectuer des tâches de gestion du " "système (comme dans Perl). Il est simple, direct et extensible." #: ruby;main;summary:1 ruby;private-jaruga-main;summary:1 msgid "An interpreter of object-oriented scripting language" msgstr "Un interpréteur de langage de script orienté objet" #: scala;2.10;description:2 msgid "" "Scala is a general purpose programming language designed to express common " "programming patterns in a concise, elegant, and type-safe way. It smoothly " "integrates features of object-oriented and functional languages. It is also " "fully interoperable with Java." msgstr "" "Scala est un langage de programmation généraliste conçu pour exprimer les " "cas de programmation communs d'une façon concise, élégante et à typage sûre. " "Il intègre délicatement les fonctionnalités des langages orientés objets et " "fonctionnels. Il est également complètement interopérable avec Java." #: scala;2.10;summary:1 msgid "A hybrid functional/object-oriented language for the JVM" msgstr "Un langage hybride fonctionnel/orienté-objet pour la JVM" #: setools;4.2.0;description:2 msgid "" "SETools is a collection of graphical tools, command-line tools, and Python " "modules designed to facilitate SELinux policy analysis." msgstr "" "SETools est une collection d'outils graphiques, d'outils en ligne de " "commande et de modules Python conçus pour faciliter l'analyse des politiques " "SELinux." #: setools;4.2.0;profile;default:3 msgid "Standard installation" msgstr "Installation standard" #: setools;4.2.0;summary:1 msgid "Policy analysis tools for SELinux" msgstr "Outils d'analyse de politiques SELinux" #: skychart;devel;description:2 msgid "" "This program enables you to draw sky charts, making use of the data in 16 " "catalogs of stars and nebulae. In addition the position of planets, " "asteroids and comets are shown.\n" "The purpose of this program is to prepare different sky maps for a " "particular observation. A large number of parameters help you to choose " "specifically or automatically which catalogs to use, the colour and the " "dimension of stars and nebulae, the representation of planets, the display " "of labels and coordinate grids, the superposition of pictures, the condition " "of visibility and more. All these features make this celestial atlas more " "complete than a conventional planetarium." msgstr "" "Ce programme vous permet de dessiner des cartes du ciel, en utilisant les " "données de 16 catalogues d'étoiles et de nébuleuses. De plus, la position " "des planètes, des astéroïdes et des comètes est indiquée.\n" "Le but de ce programme est de préparer différentes cartes du ciel pour une " "observation particulière. Un grand nombre de paramètres vous aident à " "choisir spécifiquement ou automatiquement les catalogues à utiliser, la " "couleur et la dimension des étoiles et des nébuleuses, la représentation des " "planètes, l'affichage des étiquettes et des grilles de coordonnées, la " "superposition des images, la condition de visibilité et plus encore. Toutes " "ces caractéristiques rendent cet atlas céleste plus complet qu'un " "planétarium conventionnel." #: skychart;devel;profile;additional-dso:3 msgid "Core program, documentation and additional Deep Sky catalogs." msgstr "" "Programme de base, documentation et catalogues Deep Sky supplémentaires." #: skychart;devel;profile;additional-stars:3 msgid "Core program, documentation and additional star catalogs." msgstr "" "Programme de base, documentation et catalogues d'étoiles supplémentaires." #: skychart;devel;profile;default:3 msgid "Minimal installation with default catalogs and documentation." msgstr "Installation minimale avec catalogues et documentation par défaut." #: skychart;devel;profile;full:3 msgid "Core program, documentation and all available additional catalogs." msgstr "" "Programme de base, documentation et tous les catalogues supplémentaires " "disponibles." #: skychart;devel;summary:1 msgid "Planetarium software for the advanced amateur astronomer" msgstr "Logiciel de planétarium pour l'astronome amateur avancé" #: stratis;1;description:2 stratis;main;description:2 msgid "Easy to use local storage management." msgstr "Gestion du stockage local facile à utiliser." #: stratis;1;summary:1 stratis;main;summary:1 msgid "Stratis Storage" msgstr "Stockage Stratis" #: testmodule;main;description:2 msgid "" "This module demonstrates how to write simple modulemd files And can be used " "for testing the build and release pipeline." msgstr "" "Ce module démontre la facilité d'écriture de fichiers modulemd, et peut être " "utilisé pour tester la chaîne de construction et de sorties de nouvelles " "versions." #: testmodule;main;summary:1 msgid "A test module in all its beautiful beauty" msgstr "Un mode de test dans toute sa splendeur" fedora-modularity-libmodulemd-357799c/modulemd/tests/test_data/good-v2-extra-keys.yaml000066400000000000000000000173421502446517500311230ustar00rootroot00000000000000--- # Document type identifier document: modulemd # Module metadata format version version: 2 data: # An extra key that should be ignored unknown_key: foo # Another unknown key with contents unknown_map: stuff: [ a, b ] junk: [ b, c ] morestuff: yay: [ d, e ] unknown_sequence: - foo - bar name: foo stream: stream-name version: 20160927144203 context: c0ffee43 arch: x86_64 summary: An example module description: >- A module for the demonstration of the metadata format. Also, the obligatory lorem ipsum dolor sit amet goes right here. servicelevels: rawhide: eol: 2077-10-23 stable_api: eol: 2077-10-23 bug_fixes: eol: 2077-10-23 security_fixes: eol: 2077-10-23 license: module: - DUMMY content: - DUMMY unknown_key: foo unknown_map: stuff: [ a, b ] junk: [ b, c ] morestuff: yay: [ d, e ] unknown_sequence: - foo - bar xmd: some_key: some_data some_list: - a - b some_dict: a: alpha b: beta some_other_list: - c - d some_other_dict: another_key: more_data yet_another_key: - this - is - getting - silly empty_dict: {} empty_list: [] dependencies: - buildrequires: platform: [-f27, -f28, -epel7] requires: platform: [-f27, -f28, -epel7] - buildrequires: platform: [f27] buildtools: [v1, v2] compatible: [v3] requires: platform: [f27] compatible: [v3, v4] - buildrequires: platform: [f28] requires: platform: [f28] runtime: [a, b] - buildrequires: platform: [epel7] extras: [] moreextras: [foo, bar] requires: platform: [epel7] extras: [] moreextras: [foo, bar] unknown_key: foo unknown_map: stuff: [ a, b ] junk: [ b, c ] morestuff: yay: [ d, e ] unknown_sequence: - foo - bar references: community: http://www.example.com/ documentation: http://www.example.com/ tracker: http://www.example.com/ # An extra key that should be ignored unknown_key: foo profiles: default: rpms: - bar - bar-extras - baz unknown_key: foo unknown_map: stuff: [ a, b ] junk: [ b, c ] morestuff: yay: [ d, e ] unknown_sequence: - foo - bar container: rpms: - bar - bar-devel minimal: description: Minimal profile installing only the bar package. rpms: - bar buildroot: rpms: - bar-devel srpm-buildroot: rpms: - bar-extras unusual: rpms: [] moreunusual: {} api: rpms: - bar - bar-extras - bar-devel - baz - xxx unknown_key: foo unknown_map: stuff: [ a, b ] junk: [ b, c ] morestuff: yay: [ d, e ] unknown_sequence: - foo - bar filter: rpms: - baz-nonfoo unknown_key: foo unknown_map: stuff: [ a, b ] junk: [ b, c ] morestuff: yay: [ d, e ] unknown_sequence: - foo - bar demodularized: rpms: - bar-old unknown_key: foo unknown_map: stuff: [ a, b ] junk: [ b, c ] morestuff: yay: [ d, e ] unknown_sequence: - foo - bar buildopts: rpms: macros: | %demomacro 1 %demomacro2 %{demomacro}23 unknown_key: foo unknown_map: stuff: [ a, b ] junk: [ b, c ] morestuff: yay: [ d, e ] unknown_sequence: - foo - bar unknown_key: foo unknown_map: stuff: [ a, b ] junk: [ b, c ] morestuff: yay: [ d, e ] unknown_sequence: - foo - bar components: rpms: bar: rationale: We need this to demonstrate stuff. repository: https://pagure.io/bar.git cache: https://example.com/cache ref: 26ca0c0 baz: rationale: This one is here to demonstrate other stuff. xxx: rationale: xxx demonstrates arches and multilib. arches: [ i686, x86_64 ] multilib: [ x86_64 ] xyz: rationale: xyz is a bundled dependency of xxx. buildorder: 10 unknown_key: foo unknown_map: stuff: [ a, b ] junk: [ b, c ] morestuff: yay: [ d, e ] unknown_sequence: - foo - bar unknown_key: foo unknown_map: stuff: [ a, b ] junk: [ b, c ] morestuff: yay: [ d, e ] unknown_sequence: - foo - bar modules: includedmodule: rationale: Included in the stack, just because. repository: https://pagure.io/includedmodule.git ref: somecoolbranchname buildorder: 100 unknown_key: foo unknown_map: stuff: [ a, b ] junk: [ b, c ] morestuff: yay: [ d, e ] unknown_sequence: - foo - bar unknown_key: foo unknown_map: stuff: [ a, b ] junk: [ b, c ] morestuff: yay: [ d, e ] unknown_sequence: - foo - bar artifacts: rpms: - bar-0:1.23-1.module_deadbeef.x86_64 - bar-devel-0:1.23-1.module_deadbeef.x86_64 - bar-extras-0:1.23-1.module_deadbeef.x86_64 - baz-0:42-42.module_deadbeef.x86_64 - xxx-0:1-1.module_deadbeef.x86_64 - xxx-0:1-1.module_deadbeef.i686 - xyz-0:1-1.module_deadbeef.x86_64 unknown_key: foo unknown_map: stuff: [ a, b ] junk: [ b, c ] morestuff: yay: [ d, e ] unknown_sequence: - foo - bar ... --- document: modulemd-translations version: 1 unknown: foo data: module: nodejs stream: 8 modified: 1 unknown: blah ... --- document: modulemd-defaults version: 1 unknown: - a - b data: module: nodejs unknown: a: b c: d profiles: 6: [default] 8: [default] 9: [default] intents: server: stream: 8 unknown: [a, b] profiles: 6: [server] 8: [server] ... fedora-modularity-libmodulemd-357799c/modulemd/tests/test_data/good_and_bad.yaml000066400000000000000000000114671502446517500301360ustar00rootroot00000000000000--- document: modulemd version: 2 data: name: nodejs stream: 8 version: 20180816123422 context: 6c81f848 arch: x86_64 summary: Javascript runtime description: >- Node.js is a platform built on Chrome''s JavaScript runtime for easily building fast, scalable network applications. Node.js uses an event-driven, non-blocking I/O model that makes it lightweight and efficient, perfect for data-intensive real-time applications that run across distributed devices. license: module: - MIT content: - MIT xmd: mbs: mse: TRUE scmurl: https://src.fedoraproject.org/modules/nodejs.git?#bc228d9478ac1b4387f55b6dc0b6dce38db7a7b9 commit: bc228d9478ac1b4387f55b6dc0b6dce38db7a7b9 buildrequires: platform: ref: f29 stream: f29 context: 00000000 version: 5 filtered_rpms: [] rpms: nodejs: ref: 0d185d83353950699b7016d89a66d3916e0168b0 dependencies: - buildrequires: platform: [f29] requires: platform: [f29] references: community: http://nodejs.org documentation: http://nodejs.org/en/docs tracker: https://github.com/nodejs/node/issues profiles: default: rpms: - nodejs - npm development: rpms: - nodejs - nodejs-devel - npm minimal: rpms: - nodejs api: rpms: - nodejs - nodejs-devel - npm components: rpms: nodejs: rationale: Javascript runtime and npm package manager. repository: git://pkgs.fedoraproject.org/rpms/nodejs cache: http://pkgs.fedoraproject.org/repo/pkgs/nodejs ref: 8 buildorder: 10 artifacts: rpms: - nodejs-1:8.11.4-1.module_2030+42747d40.x86_64 - nodejs-devel-1:8.11.4-1.module_2030+42747d40.x86_64 - nodejs-docs-1:8.11.4-1.module_2030+42747d40.noarch - npm-1:5.6.0-1.8.11.4.1.module_2030+42747d40.x86_64 ... --- document: modulemd version: 2 data: name: nodejs stream: 11 version: 20181102165620 context: 6c81f848 arch: x86_64 summary: Javascript runtime description: >- Node.js is a platform built on Chrome''s JavaScript runtime for easily building fast, scalable network applications. Node.js uses an event-driven, non-blocking I/O model that makes it lightweight and efficient, perfect for data-intensive real-time applications that run across distributed devices. license: module: - MIT content: - MIT xmd: mbs: mse: TRUE scmurl: https://src.fedoraproject.org/modules/nodejs.git?#e5473a364ae5974d031500e5c0188944c32a10f4 commit: e5473a364ae5974d031500e5c0188944c32a10f4 buildrequires: platform: ref: f29 stream: f29 context: 00000000 version: 5 filtered_rpms: [] rpms: nodejs: ref: 01611e2acd156d4004d04922e4f39c6b482902d6 nghttp2: ref: 54e2c4375502dc21ef4ac60ee571658a22f55c29 libuv: ref: fb955db1107c02298b4f7e453ae211b3c0673cda dependencies: - buildrequires: platform: [f29] requires: platform: [f29] references: community: http://nodejs.org documentation: http://nodejs.org/en/docs tracker: https://github.com/nodejs/node/issues profiles: default: rpms: - nodejs - npm development: rpms: - nodejs - nodejs-devel - npm minimal: rpms: - nodejs api: rpms: - nodejs - nodejs-devel - npm components: rpms: libuv: rationale: Platform abstraction layer for Node.js repository: git+https://src.fedoraproject.org/rpms/libuv cache: https://src.fedoraproject.org/repo/pkgs/libuv ref: 1 nghttp2: rationale: Needed for HTTP2 support repository: git+https://src.fedoraproject.org/rpms/nghttp2 cache: https://src.fedoraproject.org/repo/pkgs/nghttp2 ref: main nodejs: rationale: Javascript runtime and npm package manager. repository: git+https://src.fedoraproject.org/rpms/nodejs cache: https://src.fedoraproject.org/repo/pkgs/nodejs ref: 11 buildorder: 10 artifacts: rpms: - libnghttp2-0:1.34.0-1.module_2365+652bf990.x86_64 - libnghttp2-devel-0:1.34.0-1.module_2365+652bf990.x86_64 - libuv-1:1.23.2-1.module_2365+652bf990.x86_64 - libuv-devel-1:1.23.2-1.module_2365+652bf990.x86_64 - libuv-static-1:1.23.2-1.module_2365+652bf990.x86_64 - nghttp2-0:1.34.0-1.module_2365+652bf990.x86_64 - nodejs-1:11.1.0-1.module_2379+8d497405.x86_64 - nodejs-devel-1:11.1.0-1.module_2379+8d497405.x86_64 - nodejs-docs-1:11.1.0-1.module_2379+8d497405.noarch - npm-1:6.4.1-1.11.1.0.1.module_2379+8d497405.x86_64 ... --- document: modulemd version: 3000 description: Invalid modulemd YAML ... fedora-modularity-libmodulemd-357799c/modulemd/tests/test_data/invalid_defaults.yaml000066400000000000000000000001251502446517500310600ustar00rootroot00000000000000document: modulemd-defaults version: 1 data: module: foo modified: 42invalid fedora-modularity-libmodulemd-357799c/modulemd/tests/test_data/invalid_obsoletes_v1.yaml000066400000000000000000000002441502446517500316600ustar00rootroot00000000000000--- document: modulemd-obsoletes version: 1 data: module: foo stream: '42' modified: 1970-01-01T00:00Z # message: a missing message breaks validity fedora-modularity-libmodulemd-357799c/modulemd/tests/test_data/long-valid.yaml000066400000000000000000000324221502446517500276040ustar00rootroot00000000000000--- document: modulemd-obsoletes version: 1 data: module: nodejs stream: 8 modified: 2020-03-19T00:00Z message: test ... --- document: modulemd-translations version: 1 data: module: nodejs stream: 8 modified: 1 ... --- document: modulemd-defaults version: 1 data: module: nodejs profiles: 6: [default] 8: [default] 9: [default] intents: server: stream: 8 profiles: 6: [server] 8: [server] ... --- document: modulemd-defaults version: 1 data: module: reviewboard stream: 2.5 profiles: 2.5: [default] ... --- document: modulemd-defaults version: 1 data: module: django profiles: 1.6: [default] ... --- document: modulemd version: 2 data: name: django stream: 1.6 version: 20180307130104 context: c2c572ec summary: A high-level Python Web framework description: >- Django is a high-level Python Web framework that encourages rapid development and a clean, pragmatic design. It focuses on automating as much as possible and adhering to the DRY (Don't Repeat Yourself) principle. license: module: - MIT xmd: mbs: scmurl: https://src.fedoraproject.org/modules/django.git?#90c50f8ad1cb5ca41d62632699c375dce6353adf commit: 90c50f8ad1cb5ca41d62632699c375dce6353adf buildrequires: platform: ref: virtual stream: f28 filtered_rpms: [] version: 4 rpms: python-django: ref: 1c3a01558a435b56f8ef4f8fc0e5c1cd35f006a5 requires: platform: ref: virtual stream: f28 filtered_rpms: [] version: 4 dependencies: - buildrequires: platform: [f28] requires: platform: [f28] references: community: https://www.djangoproject.com documentation: https://docs.djangoproject.com tracker: https://code.djangoproject.com/query profiles: default: rpms: - python2-django python2_development: rpms: - python2-django api: rpms: - python2-django components: rpms: python-django: rationale: The Django python web framework repository: git://pkgs.fedoraproject.org/rpms/python-django cache: http://pkgs.fedoraproject.org/repo/pkgs/python-django ref: 1.6 artifacts: rpms: - python-django-bash-completion-0:1.6.11.7-1.module_1560+089ce146.noarch - python2-django-0:1.6.11.7-1.module_1560+089ce146.noarch ... --- document: modulemd version: 2 data: name: nodejs stream: 6 version: 20180308155546 context: c2c572ec summary: Javascript runtime description: >- Node.js is a platform built on Chrome''s JavaScript runtime for easily building fast, scalable network applications. Node.js uses an event-driven, non-blocking I/O model that makes it lightweight and efficient, perfect for data-intensive real-time applications that run across distributed devices. license: module: - MIT xmd: mbs: scmurl: https://src.fedoraproject.org/modules/nodejs.git?#2d349c5055939081aefa37d71cd77051d235cb79 commit: 2d349c5055939081aefa37d71cd77051d235cb79 buildrequires: platform: ref: virtual stream: f28 filtered_rpms: [] version: 4 rpms: nodejs: ref: 374ae23edf3676653fec706a5c81c5cdf019ce11 requires: platform: ref: virtual stream: f28 filtered_rpms: [] version: 4 dependencies: - buildrequires: platform: [f28] requires: platform: [f28] references: community: http://nodejs.org documentation: http://nodejs.org/en/docs tracker: https://github.com/nodejs/node/issues profiles: default: rpms: - nodejs - npm development: rpms: - nodejs - nodejs-devel - npm minimal: rpms: - nodejs api: rpms: - nodejs - nodejs-devel - npm components: rpms: nodejs: rationale: Javascript runtime and npm package manager. repository: git://pkgs.fedoraproject.org/rpms/nodejs cache: http://pkgs.fedoraproject.org/repo/pkgs/nodejs ref: 6 buildorder: 10 artifacts: rpms: - nodejs-1:6.13.1-1.module_1575+55808bea.x86_64 - nodejs-devel-1:6.13.1-1.module_1575+55808bea.x86_64 - nodejs-docs-1:6.13.1-1.module_1575+55808bea.noarch - npm-1:3.10.10-1.6.13.1.1.module_1575+55808bea.x86_64 ... --- document: modulemd version: 2 data: name: nodejs stream: 8 version: 20180308143646 context: c2c572ec summary: Javascript runtime description: >- Node.js is a platform built on Chrome''s JavaScript runtime for easily building fast, scalable network applications. Node.js uses an event-driven, non-blocking I/O model that makes it lightweight and efficient, perfect for data-intensive real-time applications that run across distributed devices. license: module: - MIT xmd: mbs: scmurl: https://src.fedoraproject.org/modules/nodejs.git?#4dc5da13fa51c5a5cc9f02a81d71416bc6ce787e commit: 4dc5da13fa51c5a5cc9f02a81d71416bc6ce787e buildrequires: platform: ref: virtual stream: f28 filtered_rpms: [] version: 4 rpms: nodejs: ref: 64f8f82763943f764d25225c2d95ae065490b10a requires: platform: ref: virtual stream: f28 filtered_rpms: [] version: 4 mbs_options: blocked_pacakges: - blocked1 - blocked2 dependencies: - buildrequires: platform: [f28] requires: platform: [f28] references: community: http://nodejs.org documentation: http://nodejs.org/en/docs tracker: https://github.com/nodejs/node/issues profiles: default: rpms: - nodejs - npm development: rpms: - nodejs - nodejs-devel - npm minimal: rpms: - nodejs api: rpms: - nodejs - nodejs-devel - npm components: rpms: nodejs: rationale: Javascript runtime and npm package manager. repository: git://pkgs.fedoraproject.org/rpms/nodejs cache: http://pkgs.fedoraproject.org/repo/pkgs/nodejs ref: 8 buildorder: 10 artifacts: rpms: - nodejs-1:8.10.0-3.module_1572+d7ec111e.x86_64 - nodejs-devel-1:8.10.0-3.module_1572+d7ec111e.x86_64 - nodejs-docs-1:8.10.0-3.module_1572+d7ec111e.noarch - npm-1:5.6.0-1.8.10.0.3.module_1572+d7ec111e.x86_64 ... --- document: modulemd version: 2 data: name: nodejs stream: 9 version: 20180308142225 context: c2c572ec summary: Javascript runtime description: >- Node.js is a platform built on Chrome''s JavaScript runtime for easily building fast, scalable network applications. Node.js uses an event-driven, non-blocking I/O model that makes it lightweight and efficient, perfect for data-intensive real-time applications that run across distributed devices. license: module: - MIT xmd: mbs: scmurl: https://src.fedoraproject.org/modules/nodejs.git?#3f3665745cb84576f1faa66646cb8c37913ec461 commit: 3f3665745cb84576f1faa66646cb8c37913ec461 buildrequires: platform: ref: virtual stream: f28 filtered_rpms: [] version: 4 rpms: nodejs: ref: 65648a2672dc03641b9eaa4d25a8f19d94fd90c3 requires: platform: ref: virtual stream: f28 filtered_rpms: [] version: 4 dependencies: - buildrequires: platform: [f28] requires: platform: [f28] references: community: http://nodejs.org documentation: http://nodejs.org/en/docs tracker: https://github.com/nodejs/node/issues profiles: default: rpms: - nodejs - npm development: rpms: - nodejs - nodejs-devel - npm minimal: rpms: - nodejs api: rpms: - nodejs - nodejs-devel - npm components: rpms: nodejs: rationale: Javascript runtime and npm package manager. repository: git://pkgs.fedoraproject.org/rpms/nodejs cache: http://pkgs.fedoraproject.org/repo/pkgs/nodejs ref: 9 buildorder: 10 artifacts: rpms: - nodejs-1:9.8.0-1.module_1571+4f4bc63d.x86_64 - nodejs-devel-1:9.8.0-1.module_1571+4f4bc63d.x86_64 - nodejs-docs-1:9.8.0-1.module_1571+4f4bc63d.noarch - npm-1:5.6.0-1.9.8.0.1.module_1571+4f4bc63d.x86_64 ... --- document: modulemd version: 2 data: name: reviewboard stream: 2.5 version: 20180206144254 context: e0c83381 summary: A web-based code review tool description: >- Review Board is a powerful web-based code review tool that offers developers an easy way to handle code reviews. It scales well from small projects to large companies and offers a variety of tools to take much of the stress and time out of the code review process. license: module: - MIT xmd: mbs: scmurl: https://src.fedoraproject.org/modules/reviewboard.git?#1738e1ce6352c0d4da31ba137cab0b5dc5f30166 commit: 1738e1ce6352c0d4da31ba137cab0b5dc5f30166 buildrequires: platform: ref: virtual stream: f28 filtered_rpms: [] version: 3 django: ref: 14fb96b250feec2e2c883e06255de2c36faa7313 stream: 1.6 filtered_rpms: [] version: 20180117164842 rpms: python-django-multiselectfield: ref: 149bf58875fb7b55efe29e1735baf96d44eb99a9 ReviewBoard: ref: 5d28213f6a797e5ce28ad05ab23f80fe67353da8 python-django-evolution: ref: 512424e1fc4b99f6f74c01a4130a4d9402b56b4e python-django-pipeline: ref: f019137be96cf86f49a81001fef47a0c7ab6aa35 python-markdown: ref: 0af9dd03b4822c04be2742b39b5a4d48ef2d2222 python-django-haystack: ref: 20fe71a6fc50a83b24578fbaf86e94a4ca584d31 python-djblets: ref: d5634779089456ff3d0ac7b78eec81e13ff4c733 requires: platform: ref: virtual stream: f28 filtered_rpms: [] version: 3 django: ref: 14fb96b250feec2e2c883e06255de2c36faa7313 stream: 1.6 filtered_rpms: [] version: 20180117164842 dependencies: - buildrequires: django: [1.6] platform: [f28] requires: django: [1.6] platform: [f28] references: community: https://www.reviewboard.org documentation: https://www.reviewboard.org/docs tracker: https://hellosplat.com/s/beanbag/tickets/ profiles: default: rpms: - ReviewBoard server: rpms: - ReviewBoard api: rpms: - ReviewBoard - python2-djblets components: rpms: ReviewBoard: rationale: The Review Board code review tool repository: git://pkgs.fedoraproject.org/rpms/ReviewBoard cache: http://pkgs.fedoraproject.org/repo/pkgs/ReviewBoard ref: 2.5 buildorder: 20 python-django-evolution: rationale: A database modification library used and maintained by the Review Board upstream repository: git://pkgs.fedoraproject.org/rpms/python-django-evolution cache: http://pkgs.fedoraproject.org/repo/pkgs/python-django-evolution ref: 0.7 python-django-haystack: rationale: An older version of the Haystack search library for Django, needed for compatibility. repository: git://pkgs.fedoraproject.org/rpms/python-django-haystack cache: http://pkgs.fedoraproject.org/repo/pkgs/python-django-haystack ref: 2.4 python-django-multiselectfield: rationale: An older version of a mult-select form field needed by Review Board. repository: git://pkgs.fedoraproject.org/rpms/python-django-multiselectfield cache: http://pkgs.fedoraproject.org/repo/pkgs/python-django-multiselectfield ref: 0.1 python-django-pipeline: rationale: An older version of this asset-packaging library for Django that is compatible with Review Board. repository: git://pkgs.fedoraproject.org/rpms/python-django-pipeline cache: http://pkgs.fedoraproject.org/repo/pkgs/python-django-pipeline ref: 1.3 python-djblets: rationale: Review Board tool library repository: git://pkgs.fedoraproject.org/rpms/python-djblets cache: http://pkgs.fedoraproject.org/repo/pkgs/python-djblets ref: 0.9 buildorder: 10 python-markdown: rationale: An older version of this Markdown implementation that is compatible with Review Board. repository: git://pkgs.fedoraproject.org/rpms/python-markdown cache: http://pkgs.fedoraproject.org/repo/pkgs/python-markdown ref: 2.4 artifacts: rpms: - ReviewBoard-0:2.5.17-17.module_d032b812.noarch - python-django-haystack-docs-0:2.4.1-12.module_d032b812.noarch - python2-django-evolution-1:0.7.7-12.module_d032b812.noarch - python2-django-haystack-0:2.4.1-12.module_d032b812.noarch - python2-django-multiselectfield-0:0.1.3-10.module_d032b812.noarch - python2-django-pipeline-0:1.3.27-11.module_d032b812.noarch - python2-djblets-0:0.9.9-13.module_d032b812.noarch - python2-markdown-0:2.4.1-11.module_d032b812.noarch - python3-markdown-0:2.4.1-11.module_d032b812.noarch ... fedora-modularity-libmodulemd-357799c/modulemd/tests/test_data/merger/000077500000000000000000000000001502446517500261425ustar00rootroot00000000000000fedora-modularity-libmodulemd-357799c/modulemd/tests/test_data/merger/add_conflicting_profile.yaml000066400000000000000000000002041502446517500336510ustar00rootroot00000000000000document: modulemd-defaults version: 1 data: module: postgresql stream: '8.1' profiles: '8.1': [client, server] fedora-modularity-libmodulemd-357799c/modulemd/tests/test_data/merger/add_conflicting_stream.yaml000066400000000000000000000002161502446517500335070ustar00rootroot00000000000000--- document: modulemd-defaults version: 1 data: module: postgresql stream: '8.2' profiles: '8.2': [client, server, foo] add_conflicting_stream_and_profile_modified.yaml000066400000000000000000000003051502446517500376310ustar00rootroot00000000000000fedora-modularity-libmodulemd-357799c/modulemd/tests/test_data/merger--- document: modulemd-defaults version: 1 data: module: postgresql stream: '8.2' modified: 201909270000 profiles: '8.1': [client, server] '8.2': [client, server, foo] fedora-modularity-libmodulemd-357799c/modulemd/tests/test_data/merger/add_obsoletes.yaml000066400000000000000000000002411502446517500316320ustar00rootroot00000000000000--- document: modulemd-obsoletes version: 1 data: module: nodejs stream: devel modified: 2017-09-27T00:00Z message: test message reset: true fedora-modularity-libmodulemd-357799c/modulemd/tests/test_data/merger/add_only.yaml000066400000000000000000000001731502446517500306200ustar00rootroot00000000000000--- document: modulemd-defaults version: 1 data: module: httpd stream: 2.8 profiles: '2.10': [notreal] fedora-modularity-libmodulemd-357799c/modulemd/tests/test_data/merger/base.yaml000066400000000000000000000012361502446517500277420ustar00rootroot00000000000000--- # Intents optional: document: modulemd-defaults version: 1 data: module: httpd profiles: '2.2': [client, server] '2.8': [notreal] intents: workstation: stream: '2.4' profiles: '2.4': [client] '2.6': [client, server, bindings] --- document: modulemd-defaults version: 1 data: module: postgresql stream: '8.1' profiles: '8.1': [client, server, foo] '8.3': [client, server] --- document: modulemd-defaults version: 1 data: module: nodejs stream: '8.0' modified: 201909270000 profiles: '6.0': [default] '8.0': [super] fedora-modularity-libmodulemd-357799c/modulemd/tests/test_data/merger/base_obsoletes.yaml000066400000000000000000000003351502446517500320200ustar00rootroot00000000000000--- document: modulemd-obsoletes version: 1 data: module: nodejs stream: '8.0' context: 42 modified: 2019-09-27T00:00Z message: test message obsoleted_by: module: nodejs stream: 12 fedora-modularity-libmodulemd-357799c/modulemd/tests/test_data/merger/conflict_base.yaml000066400000000000000000000026431502446517500316260ustar00rootroot00000000000000--- document: modulemd version: 2 data: name: nodejs stream: 12 version: 202002251200 context: deadbeef arch: x86_64 summary: Javascript runtime description: >- Node.js is a platform built on Chrome''s JavaScript runtime for easily building fast, scalable network applications. Node.js uses an event-driven, non-blocking I/O model that makes it lightweight and efficient, perfect for data-intensive real-time applications that run across distributed devices. license: module: - MIT dependencies: - buildrequires: platform: [ ] requires: platform: [ ] references: community: http://nodejs.org documentation: http://nodejs.org/en/docs tracker: https://github.com/nodejs/node/issues profiles: default: rpms: - nodejs - npm development: rpms: - nodejs - nodejs-devel - npm minimal: rpms: - nodejs api: rpms: - nodejs - nodejs-devel - npm components: rpms: libuv: rationale: Platform abstraction layer for Node.js ref: 1 http-parser: rationale: Needed for parsing HTTP requests ref: main nghttp2: rationale: Needed for HTTP2 support ref: main nodejs: rationale: Javascript runtime and npm package manager. ref: 10 buildafter: - libuv - http-parser - nghttp2 ... fedora-modularity-libmodulemd-357799c/modulemd/tests/test_data/merger/conflict_obsoletes.yaml000066400000000000000000000003011502446517500327000ustar00rootroot00000000000000--- document: modulemd-obsoletes version: 1 data: module: nodejs stream: '8.0' context: 42 modified: 2019-09-27T00:00Z message: test message eol_date: 2020-09-27T00:00Z fedora-modularity-libmodulemd-357799c/modulemd/tests/test_data/merger/newer_obsoletes.yaml000066400000000000000000000003011502446517500322170ustar00rootroot00000000000000--- document: modulemd-obsoletes version: 1 data: module: nodejs stream: '8.0' context: 42 modified: 2020-02-27T00:00Z message: test message eol_date: 2020-05-23T14:25Z fedora-modularity-libmodulemd-357799c/modulemd/tests/test_data/merger/newer_obsoletes_resseted.yaml000066400000000000000000000002611502446517500341220ustar00rootroot00000000000000--- document: modulemd-obsoletes version: 1 data: module: nodejs stream: '8.0' context: 42 modified: 2020-02-27T00:00Z reset: true message: test message fedora-modularity-libmodulemd-357799c/modulemd/tests/test_data/merging-base.yaml000066400000000000000000000011651502446517500301100ustar00rootroot00000000000000--- # Intents optional: document: modulemd-defaults version: 1 data: module: httpd stream: '2.2' profiles: '2.2': [client, server] '2.8': [notreal] intents: workstation: stream: '2.4' profiles: '2.4': [client] '2.6': [client, server, bindings] --- document: modulemd-defaults version: 1 data: module: postgresql stream: '8.1' profiles: '8.1': [client, server, foo] --- document: modulemd-defaults version: 1 data: module: nodejs stream: '8.0' profiles: '6.0': [default] '8.0': [super] fedora-modularity-libmodulemd-357799c/modulemd/tests/test_data/mismatched-deps.yaml000066400000000000000000000001451502446517500306140ustar00rootroot00000000000000--- buildrequires: platform: [-f27, -f28, epel7] requires: platform: [-f27, -f28, -epel7] ...fedora-modularity-libmodulemd-357799c/modulemd/tests/test_data/nl.po000066400000000000000000001056701502446517500256430ustar00rootroot00000000000000# Geert Warrink , 2018. #zanata msgid "" msgstr "" "Project-Id-Version: fedora-modularity-translations VERSION\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" "POT-Creation-Date: 2018-10-16 18:39+0000\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "PO-Revision-Date: 2018-10-16 01:33+0000\n" "Last-Translator: Geert Warrink \n" "Language-Team: Dutch\n" "Language: nl\n" "X-Generator: Zanata 4.6.2\n" "Plural-Forms: nplurals=2; plural=(n != 1)\n" #: ant;1.10;description:2 msgid "" "Apache Ant is a Java library and command-line tool whose mission is to drive " "processes described in build files as targets and extension points dependent " "upon each other. The main known usage of Ant is the build of Java " "applications. Ant supplies a number of built-in tasks allowing to compile, " "assemble, test and run Java applications. Ant can also be used effectively " "to build non Java applications, for instance C or C++ applications. More " "generally, Ant can be used to pilot any type of process which can be " "described in terms of targets and tasks." msgstr "" "Apache Ant is een Java bibliotheek en commandoregelgereedschap met als doel " "het sturen van processen beschreven in bouwbestanden zoals doelen en " "uitbreidingen die van elkaar afhankelijk zijn. Het bekendste gebruik van Ant " "is het bouwen van Java toepassingen. Ant biedt een aantal ingebouwde taken " "waarme Java toepassingen gecompileerd, geassembleerd, getest en gedraaid " "kunnen worden. Ant kan ook effectief gebruikt worden voor het bouwen van " "niet Java toepassingen, bijvoorbeeld C of C++ toepassingen. Meer in het " "algemeen kan Ant gebruikt worden voor het besturen van elk type proces dat " "beschreven kan worden in termen van doelen en taken." #: ant;1.10;summary:1 msgid "Java build tool" msgstr "Java bouwgereedschap" #: avocado;latest;description:2 avocado;stable;description:2 msgid "" "Avocado is a set of tools and libraries (what people call these days a " "framework) to perform automated testing." msgstr "" "Avocado is een set gereedschappen en bibliotheken (wat men tegenwoordig een " "kader noemt) voor het uitvoeren van automatisch testen." #: avocado;latest;profile;default:3 msgid "Default profile installing the most commonly used avocado packages." msgstr "" "Standaard profiel voor het installeren van de meest gebruikte avocado " "pakketten." #: avocado;latest;profile;minimal:3 msgid "Minimal profile installing only the main avocado package." msgstr "" "Minimaal profiel voor het installeren van alleen het hoofd avocado pakket." #: avocado;latest;summary:1 avocado;stable;summary:1 msgid "Framework with tools and libraries for Automated Testing" msgstr "Kader met gereedschappen en bibliotheken voor automatisch testen" #: byteman;byteman;description:2 msgid "" "Byteman is a tool which simplifies tracing and testing of Java programs. " "Byteman allows you to insert extra Java code into your application, either " "as it is loaded during JVM startup or even after it has already started " "running. The injected code is allowed to access any of your data and call " "any application methods, including where they are private. You can inject " "code almost anywhere you want and there is no need to prepare the original " "source code in advance nor do you have to recompile, repackage or redeploy " "your application. In fact you can remove injected code and reinstall " "different code while the application continues to execute." msgstr "" "Byteman is een gereedschap dat het traceren en testen van Java programma's " "eenvoudiger maakt. Byteman staat je toe om extra Java code in je toepassing " "aan te brengen, of als het geladen wordt tijdens JVM opstarten of zelfs " "nadat het al opgestart is. De geïnjecteerde code wordt toegang toegestaan " "tot al je data en kan elke toepassingsmethode aanroepen, inclusief privé " "methoden. Je kunt bijna overal waar je wilt code injecteren en het is niet " "nodig om de originele broncode van te voren te prepareren, noch hoef je jouw " "toepassing opnieuw te compileren, inpakken of inzetten. Je kunt in feite " "geïnjecteerde code verwijderen en andere code herinstalleren terwijl de " "toepassing uitgevoerd blijft worden." #: byteman;byteman;summary:1 msgid "Java agent-based bytecode injection tool" msgstr "Java agent-gebaseerd bytecode injectie gereedschap" #: container-tools;2017.0;description:2 container-tools;2018.0;description:2 msgid "" "Contains SELinux policies, binaries and other dependencies for use with " "container runtimes" msgstr "" "Bevat SELinux beleid, binaries en andere afhankelijkheden voor het gebruik " "met container runtimes" #: container-tools;2017.0;summary:1 container-tools;2018.0;summary:1 msgid "Common tools and dependencies for container runtimes" msgstr "Algemene gereedschappen en afhankelijkheden voor container runtimes" #: cri-o;1.11;description:2 cri-o;2017.0;description:2 #: cri-o;2018.0;description:2 msgid "" "CRI-O is the Kubernetes Container Runtime Interface for OCI-based containers." "" msgstr "" "CRI-O is de Kubernetes Container Runtime Interface voor OCI-gebaseerde " "containers." #: cri-o;1.11;summary:1 cri-o;2017.0;summary:1 cri-o;2018.0;summary:1 msgid "Kubernetes Container Runtime Interface for OCI-based containers" msgstr "Kubernetes Container Runtime Interface voor OCI-gebaseerde containers" #: django;1.6;description:2 msgid "" "Django is a high-level Python Web framework that encourages rapid " "development and a clean, pragmatic design. It focuses on automating as much " "as possible and adhering to the DRY (Don't Repeat Yourself) principle." msgstr "" "Django is een hoog niveau Python Web kader dat snelle ontwikkeling en een " "schoon, pragmatisch design aanmoedigt. Het focuseert zoveel mogelijk op " "automatisering en houdt zich aan het DRY (Don't Repeat Yourself) principe." #: django;1.6;summary:1 msgid "A high-level Python Web framework" msgstr "Een hoog niveau Python Web kader" #: docker;2017.0;description:2 msgid "" "Docker is an open-source engine that automates the deployment of any " "application as a lightweight, portable, self-sufficient container that will " "run virtually anywhere." msgstr "" "Docker is een open bron machine voor het automatiseren van het inzetten van " "elke toepassing als een lichtgewicht, overdraagbare en zelfvoorzienende " "container die vrijwel overal zal draaien." #: docker;2017.0;summary:1 msgid "Module for docker runtime and docker-distribution" msgstr "Module voor docker runtime en docker-distributie" #: dwm;6.0;description:2 dwm;6.1;description:2 dwm;latest;description:2 msgid "" "dwm is a dynamic window manager for X. It manages windows in tiled, " "monocle, and floating layouts. All of the layouts can be applied " "dynamically, optimizing the environment for the application in use and the " "task performed." msgstr "" "dwm is een dynamische vensterbeheerder voor X. Het beheert vensters in " "getegelde, oogglas en zwevende lay-outs. Alle lay-outs kunnen dynamisch " "toegepast worden, wat de omgeving optimaliseert voor de gebruikte toepassing " "en de uit te voeren taak." #: dwm;6.0;profile;default:3 dwm;6.1;profile;default:3 #: dwm;latest;profile;default:3 msgid "The minimal, distribution-compiled dwm binary." msgstr "De minimale, distributie-gecompileerde dwm binary." #: dwm;6.0;summary:1 dwm;6.1;summary:1 dwm;latest;summary:1 msgid "Dynamic window manager for X" msgstr "Dynamsche vensterbeheerder voor X" #: dwm;6.0;profile;user:3 dwm;6.1;profile;user:3 dwm;latest;profile;user:3 msgid "" "Includes distribution-compiled dwm as well as a helper script to apply user " "patches and configuration, dwm-user." msgstr "" "Bevat zowel de distributie-gecompileerde dwm als een hulpscript om " "gebruikerspatches en configuratie toe te passen, dwm-user." #: eog;main;description:2 msgid "" "The Eye of GNOME image viewer (eog) is the official image viewer for the " "GNOME desktop. It can view single image files in a variety of formats, as " "well as large image collections.\n" msgstr "" "Het Eye of GNOME afbeeldingweergaveprogramma (eog) is het officiële\n" "afbeeldingweergaveprogramma voor het GNOME bureaublad. Het kan enkele " "afbeeldingsbestanden met een verscheidenheid aan formaten weergeven, maar " "ook grote afbeeldingsverzamelingen.\n" #: eog;main;summary:1 msgid "Eye of GNOME Application Module" msgstr "Eye of GNOME toepassingsmodule" #: flatpak-runtime;f28;description:2 msgid "" "This module defines two runtimes for Flatpaks, the 'runtime' profile that " "most Flatpaks in Fedora use, and a smaller 'runtime-base' profile that is " "intended to be more minimal and (slightly) more API stable. There are also " "corresponding sdk and sdk-base profiles that are used to build SDKs that " "applications can be built against with flatpak-builder." msgstr "" "Deze module definieert twee runtimes voor Flatpaks, het 'runtime' profiel " "dat de meeste Flatpaks in Fedora gebruiken, en een kleinere 'runtime-base' " "profiel dat bedoeld is om minimaler en (iets) meer API-stabiel te zijn. Er " "zijn ook overeenkomende sdk en sdk-base profielen die gebruikt worden voor " "het bouwen van SDK's die toepassingen kunnen bouwen met flatpak-builder." #: flatpak-runtime;f28;summary:1 msgid "Flatpak Runtime" msgstr "Flatpak runtime" #: gcsf;main;description:2 msgid "" "GCSF is a virtual filesystem that allows users to mount their\n" "Google Drive account locally and interact with it as a\n" "regular disk partition.\n" msgstr "" "GCSF is een virtueel bestandssysteem dat toestaat dat gebruikers hun\n" "Google Drive account lokaal kunnen aankoppelen en het kunnen behandelen\n" "als een normale schijfpartitie.\n" #: gcsf;main;summary:1 msgid "FUSE file system based on Google Drive" msgstr "FUSE bestandssysteem gebaseerd op Google Drive" #: ghc;8.4;description:2 msgid "This module provides the Glasgow Haskell Compiler version 8.4.3." msgstr "Deze module biedt de Glasgow Haskell compiler versie 8.4.3." #: ghc;8.4;profile;default:3 msgid "standard installation" msgstr "standaard installatie" #: ghc;8.4;profile;minimal:3 msgid "just compiler and base" msgstr "enkel compiler en basis" #: ghc;8.4;profile;small:3 msgid "compiler with main core libs" msgstr "compiler het hoofd kernbibliotheken " #: ghc;8.4;summary:1 msgid "Haskell GHC 8.4" msgstr "Haskell GHC 8.4" #: gimp;2.10;description:2 msgid "A module containing GIMP, the GNU Image Manipulation Program." msgstr "Een module die GIMP bevat, het GNU Image Manipulatie Programma." #: gimp;2.10;summary:1 msgid "GIMP" msgstr "GIMP" #: golang-ecosystem;2017.0;description:2 golang-ecosystem;2018.0;description:2 msgid "" "This module contains golang based tools used as dependencies for other " "packages, for instance, go-md2man, a manpage converter written in Go, along " "with rpm macros for building Go based tools." msgstr "" "Deze module bevat op golang gebaseerde gereedschappen die gebruikt worden " "als afhankelijkheden voor andere pakketten, bijvoorbeeld, go-md2man, een " "manpage converter geschreven in Go, samen met rpm macro's voor het bouwen " "van op Go gebaseerde gereedschappen." #: golang-ecosystem;2017.0;summary:1 golang-ecosystem;2018.0;summary:1 msgid "The ecosystem of packages for the Go programming language" msgstr "Het ecosysteem van pakketten voor de programmeertaal Go" #: golang;1.10;description:2 msgid "" "This module provides the Go compiler and associated tools and documentation." msgstr "" "Deze module biedt de Go compiler en geassocieerde gereedschappen en " "documentatie." #: golang;1.10;summary:1 msgid "The Go Programming Language" msgstr "De Go programmeertaal" #: httpd;2.4;description:2 msgid "Apache httpd is a powerful, efficient, and extensible HTTP server." msgstr "" "Apache httpd is een krachtige, efficiënte en uitbreidbare HTTP server." #: httpd;2.4;summary:1 msgid "Apache HTTP Server" msgstr "Apache HTTP server" #: hub;pre-release;description:2 msgid "" "hub is a command line tool that wraps `git` in order to extend it with extra " "features and commands that make working with GitHub easier.\n" "\n" " $ hub clone rtomayko/tilt\n" "\n" " # expands to:\n" " $ git clone git://github.com/rtomayko/tilt.git" msgstr "" "hub is a een commandoregel gereedschap dat `git` omhult om het uit te " "breiden met extra features en commando's die het werken met GitHub " "gemakkelijker maken.\n" "\n" " $ hub clone rtomayko/tilt\n" "\n" " # breidt uit naar:\n" " $ git clone git://github.com/rtomayko/tilt.git" #: hub;pre-release;summary:1 msgid "A command-line wrapper for git with github shortcuts" msgstr "Een commandoregel wrapper voor git met github snelkoppelingen" #: javapackages-tools;201801;description:2 msgid "" "Java Packages Tools is a collection of tools that make it easier to build " "RPM packages containing software running on Java platform." msgstr "" "Java Packages Tools is een verzameling gereedschapppen die het gemakkelijker " "maken om RPM pakketten te bouwen welke software bevat die op het Java " "platform draait." #: javapackages-tools;201801;summary:1 msgid "Tools and macros for Java packaging support" msgstr "Gereedschappen en macro's voor Java pakketondersteuning" #: jdk-10;main;description:2 msgid "" "JDK 10 is the open-source reference implementation of the Java SE 10 " "Platform as defined by JSR 383 in the Java Community Process." msgstr "" "JDK 10 is de open-bron referentie implementatie van het Java SE 10 Platform " "zoals gedefinieerd door JSR 383 in het Java Community Proces." #: jdk-10;main;summary:1 msgid "OpenJDK 10" msgstr "OpenJDK 10" #: jdk-11;main;description:2 msgid "" "JDK 11 is the open-source reference implementation of the Java SE 11 " "Platform as defined by JSR 384 in the Java Community Process." msgstr "" "JDK 11 is de open-bron referentie implementatie van het Java SE 11 Platform " "zoals gedefinieerd door JSR 384 in het Java Community Proces." #: jdk-11;main;summary:1 msgid "OpenJDK 11" msgstr "OpenJDK 11" #: kubernetes;1.10;description:2 msgid "" "Kubernetes is an open source system for managing containerized applications " "across multiple hosts; providing basic mechanisms for deployment, " "maintenance, and scaling of applications. Kubernetes builds upon a decade " "and a half of experience at Google running production workloads at scale " "using a system called Borg, combined with best-of-breed ideas and practices " "from the community." msgstr "" "Kubernetes is een open-bron systeem voor het beheren van toepassingen in " "containers over meerdere hosts; het biedt basis mechanismen voor het " "inzetten, onderhouden en schalen van toepassingen. Kubernetes bouwt voort op " "anderhalve decennium ervaring bij Google voor het uitvoeren van omvangrijke " "productietaken met gebruik van een systeem met de naam Borg, gecombineerd " "met best-of-breed ideeën en werkwijzen van de gemeenschap." #: kubernetes;1.10;summary:1 msgid "Container cluster management" msgstr "Container clusterbeheer" #: kubernetes;openshift-3.10;description:2 msgid "" "OpenShift Origin is a distribution of Kubernetes optimized for application " "development and deployment. OpenShift Origin adds developer and operational " "centric tools on top of Kubernetes to enable rapid application development, " "easy deployment and scaling, and long-term lifecycle maintenance for small " "and large teams and applications. It provides a secure and multi-tenant " "configuration for Kubernetes allowing you to safely host many different " "applications and workloads." msgstr "" "OpenShift Origin is een distributie van Kubernetes geoptimaliseerd voor het " "ontwikkelen en inzetten van toepassingen. OpenShift Origin voegt op " "ontwikkelaar en operatie gerichte gereedschappen toe boven op Kubernetes " "voor het mogelijk maken van snelle toepassingsontwikkeling, eenvoudig " "inzetten en schalen, en levenscyclus onderhoud op lange termijn voor kleine " "en grote teams en toepassingen. Het biedt een veilige en multi-tenant " "configuratie voor Kubernetes wat je toestaat om veilig heel veel " "verschillende toepassingen en werkbelastingen te hosten." #: kubernetes;openshift-3.10;summary:1 msgid "OpenShift Container Management" msgstr "OpenShift Container beheer" #: libgit2;0.26;description:2 libgit2;0.27;description:2 msgid "The Git linkable library." msgstr "De Git koppelbare bibliotheek." #: libgit2;0.26;summary:1 libgit2;0.27;summary:1 msgid "Library implementation of Git" msgstr "Bibliotheek implementatie van Git" #: lizardfs;devel;description:2 msgid "" "LizardFS is an Open Source, easy to deploy and maintain, distributed, fault " "tolerant file system for POSIX compliant OSes. LizardFS is a fork of MooseFS." " For more information please visit http://lizardfs.com" msgstr "" "LizardFS is een open-bron, gemakkelijk in te zetten en te onderhouden, " "gedistribueerd, fouttolerant bestandssysteem voor POSIX conforme " "besturingssystemen. LizardFS is een vertakking van MooseFS. Voor meer " "informatie bezoek je http://lizardfs.com" #: lizardfs;devel;summary:1 msgid "Distributed, fault tolerant file system" msgstr "Gedistribueerd, fouttolerant bestandssysteem" #: mariadb;10.1;description:2 msgid "" "MariaDB is a community developed branch of MySQL. MariaDB is a multi-user, " "multi-threaded SQL database server. It is a client/server implementation " "consisting of a server daemon (mysqld) and many different client programs " "and libraries. The base package contains the standard MariaDB/MySQL client " "programs and generic MySQL files." msgstr "" "MariaDB is een door de gemeenschap ontwikkelde tak van MySQL. MariaDB is een " "multi-user, multi-threaded SQL database server. Het is een cliënt/server " "implementatie die bestaat uit een server daemon (mysqld) en vele " "verschillende cliënt programma's en bibliotheken. Het basis pakket bevat de " "standaard MariaDB/MySQL cliënt programma's en algemene MySQL bestanden." #: mariadb;10.1;summary:1 msgid "MariaDB Module" msgstr "MariaDB module" #: maven;3.5;description:2 maven;main;description:2 msgid "" "Maven is a software project management and comprehension tool. Based on the " "concept of a project object model (POM), Maven can manage a project's build, " "reporting and documentation from a central piece of information." msgstr "" "Maven is een software projectbeheer en begrip programma. Gebaseerd op het " "concept van een project object model (POM), kan Maven de bouw van een " "project, rapportage en documentatie beheren vanuit een centraal stuk " "informatie." #: maven;3.5;summary:1 maven;main;summary:1 msgid "Java project management and project comprehension tool" msgstr "Java projectbeheer en projectbegrip gereedschap" #: memcached;f28;description:2 memcached;f29;description:2 #: memcached;main;description:2 msgid "" "Memcached is a high-performance, distributed memory object caching system, " "generic in nature, but intended for use in speeding up dynamic web " "applications by alleviating database load." msgstr "" "Memcached is een hoge performantie, gedistribueerd , geheugenobject caching " "systeem, generiek van aard, maar bedoeld voor het versnellen van dynamische " "webtoepassingen door het verlichten van database load." #: memcached;f28;summary:1 memcached;f29;summary:1 memcached;main;summary:1 msgid "High Performance, Distributed Memory Object Cache" msgstr "Hoge performantie, gedistribueerde gheheugenobject cache" #: meson;main;description:2 msgid "" "Meson is an open source build system meant to be both extremely fast, and, " "even more importantly, as user friendly as possible.\n" "The main design point of Meson is that every moment a developer spends " "writing or debugging build definitions is a second wasted. So is every " "second spent waiting for the build system to actually start compiling code." msgstr "" "Meson is een open-bron bouwsysteem bedoeld om zowel extreem snel te zijn, " "als, nog belangrijker, zo gebruiksvriendelijk mogelijk.\n" "Het hoofd ontwerppunt van Meson is dat elk moment dat een ontwikkelaar " "besteedt aan het schrijven of debuggen van bouwdefinities een verspilling is." " Dat geldt ook voor het wachten op het moment dat het bouwsysteem eigenlijk " "begint met het compileren van code." #: meson;main;summary:1 msgid "The Meson Build system" msgstr "Het Meson bouwsysteem" #: mongodb;3.4;description:2 mongodb;3.6;description:2 msgid "" "Mongo from humongous is a high-performance, open source, schema-free " "document-oriented database. MongoDB is written in C++ and offers the " "following features. Collection oriented storage, easy storage of object/JSON-" "style data. Dynamic queries. Full index support, including on inner objects " "and embedded arrays. Query profiling. Replication and fail-over support. " "Efficient storage of binary data including large objects (e.g. photos and " "videos). Auto-sharding for cloud-level scalability (currently in early " "alpha). Commercial Support Available. A key goal of MongoDB is to bridge the " "gap between key/value stores (which are fast and highly scalable) and " "traditional RDBMS systems (which are deep in functionality)." msgstr "" "Mongo van humongous is een hoge performance, open-bron, schema vrije " "document georiënteerde database. MongoDB is geschreven in C++ en biedt de " "volgende features. Collectie georiënteerde opslag, gemakkelijke opslag van " "object/JSON-stijl data. Dynamische zoekopdrachten. Volledige index " "ondersteuning, inclusief innerlijke objecten en embedded arrays. " "Zoekopdrachtprofilering. Replicatiie en fail-over ondersteuning. " "Doeltreffende opslag van binaire data inclusief grote objecten (bijv. foto's " "en videos). Auto-sharding voor schaalbaarheid op cloud-niveau (op dit moment " "in vroege alpha). Commerciële ondersteuning beschikbaar. Een belanrijk doel " "van MongoDB is het overbruggen van de kloof tussen sleutel/waarde opslag " "(welke snel en zeer schaalbaar zijn) en traditionele RDBMS systemen (die " "diep in functionaliteit zijn)." #: mongodb;3.4;summary:1 mongodb;3.6;summary:1 msgid "MongoDB Module" msgstr "MongoDB module" #: mysql;5.6;description:2 mysql;8.0;description:2 msgid "" "MySQL is a multi-user, multi-threaded SQL database server. MySQL is a client/" "server implementation consisting of a server daemon (mysqld) and many " "different client programs and libraries. The base package contains the " "standard MySQL client programs and generic MySQL files." msgstr "" "MySQL is een multi-user, multi-threaded SQL database server. MySQL is een " "cliënt/server implementatie bestaande uit een server daemon (mysqld) en vele " "verschillende cliëntprogramma's en bibliotheken. Het basis pakket bevat de " "standaard MySQL cliëntprogramma's en algemene MySQL bestanden." #: mysql;5.6;summary:1 mysql;8.0;summary:1 msgid "MySQL Module" msgstr "MySQL module" #: nginx;1.12;description:2 nginx;1.14;description:2 msgid "an initial version of the nginx webserver module" msgstr "een eerste versie van de nginx webserver module" #: nginx;1.12;summary:1 nginx;1.14;summary:1 msgid "nginx webserver" msgstr "nginx webserver" #: ninja;main;description:2 msgid "" "This module includes Ninja build system. Ninja is a small build system with " "a focus on speed. It differs from other build systems in two major respects: " "it is designed to have its input files generated by a higher-level build " "system, and it is designed to run builds as fast as possible." msgstr "" "Deze module bevat het Ninja bouwsysteem. Ninja is een klein bouwsysteem met " "een focus op snelheid. Het verschilt van andere bouwsystemen in twee " "belangrijke opzichten: het is ontworpen om zijn inputbestanden te laten " "genereren door hoge-niveau bouwsystemen, en het is ontworpen om het bouwen " "zo snel als mogelijk is te maken." #: ninja;main;summary:1 msgid "Small build system with a focus on speed" msgstr "Klein bouwsysteem met een focus op snelheid." #: nodejs;10;description:2 nodejs;6;description:2 nodejs;8;description:2 #: nodejs;9;description:2 msgid "" "Node.js is a platform built on Chrome''s JavaScript runtime for easily " "building fast, scalable network applications. Node.js uses an event-driven, " "non-blocking I/O model that makes it lightweight and efficient, perfect for " "data-intensive real-time applications that run across distributed devices." msgstr "" "Node.js is een platform gebouwd op Chrome''s JavaScript runtime voor het " "gemakkelijk bouwen van snelle, schaalbare netwerktoepassingen. Node.js " "gebruikt een gebeurtenisgestuurd, niet blokkerend I/O model dat ervoor zorgt " "dat het lichtgewicht en efficiënt is, ideaal voor data-intensieve real-time " "toepassingen die op geditribueerde apparaten draaien." #: nodejs;10;summary:1 nodejs;6;summary:1 nodejs;8;summary:1 nodejs;9;summary:1 msgid "Javascript runtime" msgstr "Javascript runtime" #: perl-bootstrap;5.24;description:2 perl-bootstrap;5.26;description:2 msgid "" "This is the Perl interpreter and a set of modules written in Perl language " "intended for bootstrapping the perl module. This module disables some " "optional tests to limit amount of components. This module is not intended " "for public use. It's an intermediate step for building perl module.\n" msgstr "" "Dit is de Perl interpreter en een set modules geschreven in de Perl taal " "bedoeld voor bootstrapping de perl module. Deze module zet sommige optionele " "testen uit om de hoeveelheid onderdelen te beperken. Deze module is niet " "bedoeld voor openbaar gebruik. Het is een tussenstap voor het van de perl " "module.\n" #: perl-bootstrap;5.24;summary:1 perl-bootstrap;5.26;summary:1 msgid "Perl bootstrap module for bootrapping Perl module" msgstr "Perl bootstrap module voor boottrapping Perl module" #: perl;5.24;description:2 msgid "" "Perl is a high-level programming language with roots in C, sed, awk and " "shell scripting. Perl is good at handling processes and files, and is " "especially good at handling text. Perl's hallmarks are practicality and " "efficiency. While it is used to do a lot of different things, Perl's most " "common applications are system administration utilities and web programming." "\n" msgstr "" "Perl is een hoog niveau programmeertaal met wortels in C, sed, awk en shell " "scripting. Perl is goed in het afhandelen van processen en bestanden, en het " "is bijzonder goed in afhandelen van tekst. Perl's kenmerken zijn " "uitvoerbaarheid en efficiëntie. Hoewel het voor veel verschillende dingen " "gebruikt wordt, zijn de meest voorkomende toepassingen van Perl " "systeembeheer hulpprogramma's en webprogammering.\n" #: perl;5.24;summary:1 msgid "Practical Extraction and Report Language" msgstr "Practical Extraction en Report Language" #: pki;10.6;description:2 pki;main;description:2 msgid "A module for Dogtag PKI." msgstr "Een module voor Dogtag PKI." #: pki;10.6;summary:1 pki;main;summary:1 msgid "Dogtag PKI" msgstr "Dogtag PKI" #: postgresql;9.6;description:2 msgid "" "PostgreSQL is an advanced Object-Relational database management system " "(DBMS). The PostgreSQL server can be found in the postgresql-server sub-" "package." msgstr "" "PostgreSQL is een geavanceerd Object-Relational database beheerssysteem " "(DBMS). De PostgreSQL server kan gevonden worden in het postgresql-server " "subpakket." #: postgresql;9.6;summary:1 msgid "PostgreSQL module" msgstr "PostgreSQL module" #: python2;main;summary:1 msgid "Python programming language, version 2" msgstr "Python programmeertaal, versie 2" #: python3-bootstrap;main;summary:1 msgid "Bootstrapping module for the Python programming language, version 3" msgstr "Bootstrapping module voor de Python programmeertaal, versie 3" #: python2;main;description:2 python3-bootstrap;main;description:2 #: python3;main;description:2 msgid "" "Python is an interpreted, interactive, object-oriented programming language " "often compared to Tcl, Perl, Scheme or Java. Python includes modules, " "classes, exceptions, very high level dynamic data types and dynamic typing. " "Python supports interfaces to many system calls and libraries, as well as to " "various windowing systems (X11, Motif, Tk, Mac and MFC).\n" "Programmers can write new built-in modules for Python in C or C++. Python " "can be used as an extension language for applications that need a " "programmable interface." msgstr "" "Python is een geïnterpreteerde, interactive, object-georiënteerde " "programmeertaal die vaak vergeleken wordt met Tcl, Perl, Scheme of Java. " "Python bevat modules, klassen, uitzonderingen, zeer hoog niveau dynamische " "datasoorten en dynamisch typen. Python ondersteunt interfaces naar vele " "systeemaanroepen en bibliotheken en ook naar verschillende venstersystemen " "(X11, Motif, Tk, Mac en MFC).\n" "Programmeurs kunnen voor Python ingebouwde modules schrijven in C of C++. " "Python kan gebruikt worden als een uitbreidingstaal voor toepassingen die " "een programmeerbare inteface nodig hebben." #: python3;main;summary:1 msgid "Python programming language, version 3" msgstr "Python programmeertaal, versie 3" #: rawtherapee;devel;description:2 msgid "" "Rawtherapee is a RAW image processing software. It gives full control over " "many parameters to enhance the raw picture before finally exporting it to " "some common image format." msgstr "" "Rawtherapee is een RAW beeldbewerkingssoftware. Het geeft volledige controle " "over veel parameters voor het verbeteren van de ruwe afbeelding voordat het " "uiteindelijk geëxporteerd wordt naar een veel voorkomend beeldformaat." #: rawtherapee;devel;summary:1 msgid "Raw image processing software" msgstr "Raw beeldbewerkingssoftware" #: reviewboard;2.5;description:2 reviewboard;3.0;description:2 msgid "" "Review Board is a powerful web-based code review tool that offers developers " "an easy way to handle code reviews. It scales well from small projects to " "large companies and offers a variety of tools to take much of the stress and " "time out of the code review process." msgstr "" "Review Board is een krachtig web-gebaseerd code review gereedschap dat " "ontwikkelaars een gemakkelijke manier aanbiedt voor het afhandelen van code " "reviews. Het schaalt goed van kleine projecten naar grote bedrijven en biedt " "een verscheidenheid aan gereedschappen om veel stress en tijd te besparen in " "het code review proces." #: reviewboard;2.5;summary:1 reviewboard;3.0;summary:1 msgid "A web-based code review tool" msgstr "Een web-gebaseerd code review gereedschap" #: ripgrep;latest;description:2 ripgrep;main;description:2 msgid "" "Line oriented search tool using Rust's regex library. Combines\n" "the raw performance of grep with the usability of the silver searcher.\n" msgstr "" "Regel-georiënteerd zoekgereedschap met gebruik van de regex bibliotheek van " "Rust.\n" "Combineert de ruwe performance van grep met de bruikbaarheid van de silver " "searcher.\n" #: ripgrep;latest;summary:1 ripgrep;main;summary:1 msgid "Line oriented search tool using Rust's regex library" msgstr "" "Regel-georiënteerd zoekgereedschap met gebruik van de regex bibliotheek van " "Rust." #: ruby;2.5;description:2 ruby;main;description:2 msgid "" "Ruby is the interpreted scripting language for quick and easy object-" "oriented programming. It has many features to process text files and to do " "system management tasks (as in Perl). It is simple, straight-forward, and " "extensible." msgstr "" "Ruby is de geïnterpreteerde scripttaal voor snel en gemakkelijk object-" "georiënteerd programmeren. Het heeft veel features voor het bewerken van " "tekstbestanden en voor het uitvoeren van systeembeheerstaken (zoals in Perl)." " Het is een eenvoudig, rechtdoorzee en uitbreidbaar." #: ruby;2.5;summary:1 ruby;main;summary:1 msgid "An interpreter of object-oriented scripting language" msgstr "Een interpreter voor object-georiënteerde scripttaal" #: scala;2.10;description:2 msgid "" "Scala is a general purpose programming language designed to express common " "programming patterns in a concise, elegant, and type-safe way. It smoothly " "integrates features of object-oriented and functional languages. It is also " "fully interoperable with Java." msgstr "" "Scala is een algemene programmeertaal ontworpen om gewone " "programmeerpatronen op een beknopte, elegante en typeveilige manier uit te " "drukken. Het integreert probleemloos features van object-georiënteerde en " "functionele talen. Het is ook volledig interoperabel met Java." #: scala;2.10;summary:1 msgid "A hybrid functional/object-oriented language for the JVM" msgstr "Een hybride functionele/object-georiënteerde taal voor de JVM" #: skychart;devel;description:2 msgid "" "This program enables you to draw sky charts, making use of the data in 16 " "catalogs of stars and nebulae. In addition the position of planets, " "asteroids and comets are shown.\n" "The purpose of this program is to prepare different sky maps for a " "particular observation. A large number of parameters help you to choose " "specifically or automatically which catalogs to use, the colour and the " "dimension of stars and nebulae, the representation of planets, the display " "of labels and coordinate grids, the superposition of pictures, the condition " "of visibility and more. All these features make this celestial atlas more " "complete than a conventional planetarium." msgstr "" #: skychart;devel;profile;additional-dso:3 msgid "Core program, documentation and additional Deep Sky catalogs." msgstr "" #: skychart;devel;profile;additional-stars:3 msgid "Core program, documentation and additional star catalogs." msgstr "" #: skychart;devel;profile;default:3 msgid "Minimal installation with default catalogs and documentation." msgstr "" #: skychart;devel;profile;full:3 msgid "Core program, documentation and all available additional catalogs." msgstr "" #: skychart;devel;summary:1 msgid "Planetarium software for the advanced amateur astronomer" msgstr "" #: squid;4.0;description:2 squid;4;description:2 msgid "an initial version of the squid caching proxy module" msgstr "een eerste versie van de squid caching proxy module" #: squid;4.0;summary:1 squid;4;summary:1 msgid "Squid - Optimising Web Delivery" msgstr "Squid - Het optimaliseren van weblevering" #: stratis;1;description:2 stratis;main;description:2 msgid "Easy to use local storage management." msgstr "Eenvoudig te gebruiken lokaal opslagbeheer." #: stratis;1;summary:1 stratis;main;summary:1 msgid "Stratis Storage" msgstr "Stratis Storage" #: testmodule2;main;description:2 msgid "" "This module demonstrates the modulemd format using a fairly uncommon fonts " "package set.\n" msgstr "" "Deze module demonstreert het modulemd formaat met gebruik van een tamelijk " "zeldzame set van lettertypepakketten.\n" #: testmodule2;main;summary:1 msgid "Another test module." msgstr "Nog een test module." #: testmodule;2.0;description:2 testmodule;main;description:2 msgid "" "This module demonstrates how to write simple modulemd files And can be used " "for testing the build and release pipeline." msgstr "" "Deze module demonstreert het schrijven van eenvoudige modulemd bestanden en " "kan gebruikt worden voor het testen van de bouw en vrijgave pijpleiding." #: testmodule;2.0;summary:1 testmodule;main;summary:1 msgid "A test module in all its beautiful beauty." msgstr "Een test module in al zijn prachtige schoonheid." #: varnish;5.0;description:2 varnish;6;description:2 msgid "Varnish Cache web application accelerator" msgstr "Varnish Cache webtoepassingsversneller" #: varnish;5.0;summary:1 varnish;6;summary:1 msgid "Varnish HTTP cache" msgstr "Varnish HTTP cache" fedora-modularity-libmodulemd-357799c/modulemd/tests/test_data/overriding-modified.yaml000066400000000000000000000016231502446517500314750ustar00rootroot00000000000000--- # Override the default stream and add new profile defaults document: modulemd-defaults version: 1 data: module: httpd modified: 201812061200 stream: '2.4' profiles: '2.2': [client, server] '2.4': [client, server] intents: workstation: stream: '2.4' profiles: '2.4': [client] '2.6': [client, server, bindings] '2.8': [client, server, bindings, new] --- # Reduce the number of profile defaults document: modulemd-defaults version: 1 data: module: postgresql modified: 201812061200 stream: '8.1' profiles: '8.1': [client, server, foo] --- # Override the default stream document: modulemd-defaults version: 1 data: module: nodejs modified: 201812061200 stream: '9.0' profiles: '6.0': [default] '8.0': [minimal] '9.0': [supermegaultra] fedora-modularity-libmodulemd-357799c/modulemd/tests/test_data/overriding-nodejs.yaml000066400000000000000000000003211502446517500311710ustar00rootroot00000000000000--- # Override the default stream document: modulemd-defaults version: 1 data: module: nodejs stream: '9.0' profiles: '6.0': [default] '8.0': [super] '9.0': [supermegaultra]fedora-modularity-libmodulemd-357799c/modulemd/tests/test_data/overriding.yaml000066400000000000000000000015021502446517500277130ustar00rootroot00000000000000--- # Override the default stream and add new profile defaults document: modulemd-defaults version: 1 data: module: httpd stream: '2.4' profiles: '2.2': [client, server] '2.4': [client, server] intents: workstation: stream: '2.8' profiles: '2.4': [client] '2.6': [client, server, bindings] '2.8': [client, server, bindings, new] --- # Reduce the number of profile defaults document: modulemd-defaults version: 1 data: module: postgresql stream: '8.1' profiles: '8.1': [client, server, foo] --- # Override the default stream document: modulemd-defaults version: 1 data: module: nodejs stream: '9.0' profiles: '6.0': [default] '8.0': [minimal] '9.0': [supermegaultra] fedora-modularity-libmodulemd-357799c/modulemd/tests/test_data/p.yaml000066400000000000000000000001721502446517500260040ustar00rootroot00000000000000--- default: description: An example profile for tests rpms: - bar - bar-extras - baz ... fedora-modularity-libmodulemd-357799c/modulemd/tests/test_data/rpm-map/000077500000000000000000000000001502446517500262325ustar00rootroot00000000000000fedora-modularity-libmodulemd-357799c/modulemd/tests/test_data/rpm-map/missing-version.yaml000066400000000000000000000001571502446517500322550ustar00rootroot00000000000000--- name: bar epoch: 0 release: 1.module_deadbeef arch: x86_64 nevra: bar-0:1.23-1.module_deadbeef.x86_64 ... fedora-modularity-libmodulemd-357799c/modulemd/tests/test_data/rpm-map/valid.yaml000066400000000000000000000001751502446517500302200ustar00rootroot00000000000000--- name: bar epoch: 0 version: 1.23 release: 1.module_deadbeef arch: x86_64 nevra: bar-0:1.23-1.module_deadbeef.x86_64 ... fedora-modularity-libmodulemd-357799c/modulemd/tests/test_data/rpm-map/wrong-nevra.yaml000066400000000000000000000001751502446517500313660ustar00rootroot00000000000000--- name: bar epoch: 0 version: 1.23 release: 1.module_deadbeef arch: x86_64 nevra: foo-0:1.23-1.module_deadbeef.x86_64 ... fedora-modularity-libmodulemd-357799c/modulemd/tests/test_data/search_streams/000077500000000000000000000000001502446517500276645ustar00rootroot00000000000000fedora-modularity-libmodulemd-357799c/modulemd/tests/test_data/search_streams/search_streams.yaml000066400000000000000000000322301502446517500335530ustar00rootroot00000000000000--- document: modulemd-translations version: 1 data: module: nodejs stream: 8 modified: 1 ... --- document: modulemd-defaults version: 1 data: module: nodejs profiles: 6: [default] 8: [default] 9: [default] intents: server: stream: 8 profiles: 6: [server] 8: [server] ... --- document: modulemd-defaults version: 1 data: module: reviewboard stream: 2.5 profiles: 2.5: [default] ... --- document: modulemd-defaults version: 1 data: module: django profiles: 1.6: [default] ... --- document: modulemd version: 2 data: name: django stream: 1.6 version: 20180307130104 context: c2c572ec summary: A high-level Python Web framework description: >- Django is a high-level Python Web framework that encourages rapid development and a clean, pragmatic design. It focuses on automating as much as possible and adhering to the DRY (Don't Repeat Yourself) principle. license: module: - MIT xmd: mbs: scmurl: https://src.fedoraproject.org/modules/django.git?#90c50f8ad1cb5ca41d62632699c375dce6353adf commit: 90c50f8ad1cb5ca41d62632699c375dce6353adf buildrequires: platform: ref: virtual stream: f28 filtered_rpms: [] version: 4 rpms: python-django: ref: 1c3a01558a435b56f8ef4f8fc0e5c1cd35f006a5 requires: platform: ref: virtual stream: f28 filtered_rpms: [] version: 4 dependencies: - buildrequires: platform: [f28] requires: platform: [f28] references: community: https://www.djangoproject.com documentation: https://docs.djangoproject.com tracker: https://code.djangoproject.com/query profiles: default: rpms: - python2-django python2_development: rpms: - python2-django api: rpms: - python2-django components: rpms: python-django: rationale: The Django python web framework repository: git://pkgs.fedoraproject.org/rpms/python-django cache: http://pkgs.fedoraproject.org/repo/pkgs/python-django ref: 1.6 artifacts: rpms: - python-django-bash-completion-0:1.6.11.7-1.module_1560+089ce146.noarch - python2-django-0:1.6.11.7-1.module_1560+089ce146.noarch ... --- document: modulemd version: 2 data: name: nodejs stream: 6 version: 1 context: c2c572ec summary: Javascript runtime arch: x86_64 description: >- Node.js is a platform built on Chrome''s JavaScript runtime for easily building fast, scalable network applications. Node.js uses an event-driven, non-blocking I/O model that makes it lightweight and efficient, perfect for data-intensive real-time applications that run across distributed devices. license: module: - MIT xmd: mbs: scmurl: https://src.fedoraproject.org/modules/nodejs.git?#2d349c5055939081aefa37d71cd77051d235cb79 commit: 2d349c5055939081aefa37d71cd77051d235cb79 buildrequires: platform: ref: virtual stream: f28 filtered_rpms: [] version: 4 rpms: nodejs: ref: 374ae23edf3676653fec706a5c81c5cdf019ce11 requires: platform: ref: virtual stream: f28 filtered_rpms: [] version: 4 dependencies: - buildrequires: platform: [f28] requires: platform: [f28] references: community: http://nodejs.org documentation: http://nodejs.org/en/docs tracker: https://github.com/nodejs/node/issues profiles: default: rpms: - nodejs - npm development: rpms: - nodejs - nodejs-devel - npm minimal: rpms: - nodejs api: rpms: - nodejs - nodejs-devel - npm components: rpms: nodejs: rationale: Javascript runtime and npm package manager. repository: git://pkgs.fedoraproject.org/rpms/nodejs cache: http://pkgs.fedoraproject.org/repo/pkgs/nodejs ref: 6 buildorder: 10 artifacts: rpms: - nodejs-1:6.13.1-1.module_1575+55808bea.x86_64 - nodejs-devel-1:6.13.1-1.module_1575+55808bea.x86_64 - nodejs-docs-1:6.13.1-1.module_1575+55808bea.noarch - npm-1:3.10.10-1.6.13.1.1.module_1575+55808bea.x86_64 ... --- document: modulemd version: 2 data: name: nodejs stream: 8 version: 1 context: c2c572ec summary: Javascript runtime arch: x86_64 description: >- Node.js is a platform built on Chrome''s JavaScript runtime for easily building fast, scalable network applications. Node.js uses an event-driven, non-blocking I/O model that makes it lightweight and efficient, perfect for data-intensive real-time applications that run across distributed devices. license: module: - MIT xmd: mbs: scmurl: https://src.fedoraproject.org/modules/nodejs.git?#4dc5da13fa51c5a5cc9f02a81d71416bc6ce787e commit: 4dc5da13fa51c5a5cc9f02a81d71416bc6ce787e buildrequires: platform: ref: virtual stream: f28 filtered_rpms: [] version: 4 rpms: nodejs: ref: 64f8f82763943f764d25225c2d95ae065490b10a requires: platform: ref: virtual stream: f28 filtered_rpms: [] version: 4 mbs_options: blocked_pacakges: - blocked1 - blocked2 dependencies: - buildrequires: platform: [f28] requires: platform: [f28] references: community: http://nodejs.org documentation: http://nodejs.org/en/docs tracker: https://github.com/nodejs/node/issues profiles: default: rpms: - nodejs - npm development: rpms: - nodejs - nodejs-devel - npm minimal: rpms: - nodejs api: rpms: - nodejs - nodejs-devel - npm components: rpms: nodejs: rationale: Javascript runtime and npm package manager. repository: git://pkgs.fedoraproject.org/rpms/nodejs cache: http://pkgs.fedoraproject.org/repo/pkgs/nodejs ref: 8 buildorder: 10 artifacts: rpms: - nodejs-1:8.10.0-3.module_1572+d7ec111e.x86_64 - nodejs-devel-1:8.10.0-3.module_1572+d7ec111e.x86_64 - nodejs-docs-1:8.10.0-3.module_1572+d7ec111e.noarch - npm-1:5.6.0-1.8.10.0.3.module_1572+d7ec111e.x86_64 ... --- document: modulemd version: 2 data: name: nodejs stream: 9 version: 1 context: c2c572ec summary: Javascript runtime arch: ppc64le description: >- Node.js is a platform built on Chrome''s JavaScript runtime for easily building fast, scalable network applications. Node.js uses an event-driven, non-blocking I/O model that makes it lightweight and efficient, perfect for data-intensive real-time applications that run across distributed devices. license: module: - MIT xmd: mbs: scmurl: https://src.fedoraproject.org/modules/nodejs.git?#3f3665745cb84576f1faa66646cb8c37913ec461 commit: 3f3665745cb84576f1faa66646cb8c37913ec461 buildrequires: platform: ref: virtual stream: f28 filtered_rpms: [] version: 4 rpms: nodejs: ref: 65648a2672dc03641b9eaa4d25a8f19d94fd90c3 requires: platform: ref: virtual stream: f28 filtered_rpms: [] version: 4 dependencies: - buildrequires: platform: [f28] requires: platform: [f28] references: community: http://nodejs.org documentation: http://nodejs.org/en/docs tracker: https://github.com/nodejs/node/issues profiles: default: rpms: - nodejs - npm development: rpms: - nodejs - nodejs-devel - npm minimal: rpms: - nodejs api: rpms: - nodejs - nodejs-devel - npm components: rpms: nodejs: rationale: Javascript runtime and npm package manager. repository: git://pkgs.fedoraproject.org/rpms/nodejs cache: http://pkgs.fedoraproject.org/repo/pkgs/nodejs ref: 9 buildorder: 10 artifacts: rpms: - nodejs-1:9.8.0-1.module_1571+4f4bc63d.x86_64 - nodejs-devel-1:9.8.0-1.module_1571+4f4bc63d.x86_64 - nodejs-docs-1:9.8.0-1.module_1571+4f4bc63d.noarch - npm-1:5.6.0-1.9.8.0.1.module_1571+4f4bc63d.x86_64 ... --- document: modulemd version: 2 data: name: reviewboard stream: 2.5 version: 20180206144254 context: e0c83381 summary: A web-based code review tool description: >- Review Board is a powerful web-based code review tool that offers developers an easy way to handle code reviews. It scales well from small projects to large companies and offers a variety of tools to take much of the stress and time out of the code review process. license: module: - MIT xmd: mbs: scmurl: https://src.fedoraproject.org/modules/reviewboard.git?#1738e1ce6352c0d4da31ba137cab0b5dc5f30166 commit: 1738e1ce6352c0d4da31ba137cab0b5dc5f30166 buildrequires: platform: ref: virtual stream: f28 filtered_rpms: [] version: 3 django: ref: 14fb96b250feec2e2c883e06255de2c36faa7313 stream: 1.6 filtered_rpms: [] version: 20180117164842 rpms: python-django-multiselectfield: ref: 149bf58875fb7b55efe29e1735baf96d44eb99a9 ReviewBoard: ref: 5d28213f6a797e5ce28ad05ab23f80fe67353da8 python-django-evolution: ref: 512424e1fc4b99f6f74c01a4130a4d9402b56b4e python-django-pipeline: ref: f019137be96cf86f49a81001fef47a0c7ab6aa35 python-markdown: ref: 0af9dd03b4822c04be2742b39b5a4d48ef2d2222 python-django-haystack: ref: 20fe71a6fc50a83b24578fbaf86e94a4ca584d31 python-djblets: ref: d5634779089456ff3d0ac7b78eec81e13ff4c733 requires: platform: ref: virtual stream: f28 filtered_rpms: [] version: 3 django: ref: 14fb96b250feec2e2c883e06255de2c36faa7313 stream: 1.6 filtered_rpms: [] version: 20180117164842 dependencies: - buildrequires: django: [1.6] platform: [f28] requires: django: [1.6] platform: [f28] references: community: https://www.reviewboard.org documentation: https://www.reviewboard.org/docs tracker: https://hellosplat.com/s/beanbag/tickets/ profiles: default: rpms: - ReviewBoard server: rpms: - ReviewBoard api: rpms: - ReviewBoard - python2-djblets components: rpms: ReviewBoard: rationale: The Review Board code review tool repository: git://pkgs.fedoraproject.org/rpms/ReviewBoard cache: http://pkgs.fedoraproject.org/repo/pkgs/ReviewBoard ref: 2.5 buildorder: 20 python-django-evolution: rationale: A database modification library used and maintained by the Review Board upstream repository: git://pkgs.fedoraproject.org/rpms/python-django-evolution cache: http://pkgs.fedoraproject.org/repo/pkgs/python-django-evolution ref: 0.7 python-django-haystack: rationale: An older version of the Haystack search library for Django, needed for compatibility. repository: git://pkgs.fedoraproject.org/rpms/python-django-haystack cache: http://pkgs.fedoraproject.org/repo/pkgs/python-django-haystack ref: 2.4 python-django-multiselectfield: rationale: An older version of a mult-select form field needed by Review Board. repository: git://pkgs.fedoraproject.org/rpms/python-django-multiselectfield cache: http://pkgs.fedoraproject.org/repo/pkgs/python-django-multiselectfield ref: 0.1 python-django-pipeline: rationale: An older version of this asset-packaging library for Django that is compatible with Review Board. repository: git://pkgs.fedoraproject.org/rpms/python-django-pipeline cache: http://pkgs.fedoraproject.org/repo/pkgs/python-django-pipeline ref: 1.3 python-djblets: rationale: Review Board tool library repository: git://pkgs.fedoraproject.org/rpms/python-djblets cache: http://pkgs.fedoraproject.org/repo/pkgs/python-djblets ref: 0.9 buildorder: 10 python-markdown: rationale: An older version of this Markdown implementation that is compatible with Review Board. repository: git://pkgs.fedoraproject.org/rpms/python-markdown cache: http://pkgs.fedoraproject.org/repo/pkgs/python-markdown ref: 2.4 artifacts: rpms: - ReviewBoard-0:2.5.17-17.module_d032b812.noarch - python-django-haystack-docs-0:2.4.1-12.module_d032b812.noarch - python2-django-evolution-1:0.7.7-12.module_d032b812.noarch - python2-django-haystack-0:2.4.1-12.module_d032b812.noarch - python2-django-multiselectfield-0:0.1.3-10.module_d032b812.noarch - python2-django-pipeline-0:1.3.27-11.module_d032b812.noarch - python2-djblets-0:0.9.9-13.module_d032b812.noarch - python2-markdown-0:2.4.1-11.module_d032b812.noarch - python3-markdown-0:2.4.1-11.module_d032b812.noarch ... fedora-modularity-libmodulemd-357799c/modulemd/tests/test_data/sl_with_eol.yaml000066400000000000000000000000421502446517500300510ustar00rootroot00000000000000--- sl_name: eol: 2018-07-11 ...fedora-modularity-libmodulemd-357799c/modulemd/tests/test_data/static_context.yaml000066400000000000000000000030271502446517500306020ustar00rootroot00000000000000--- document: modulemd version: 2 data: name: nodejs stream: 8 version: 20180816123422 context: RealCTX static_context: true arch: x86_64 summary: Javascript runtime description: >- Node.js is a platform built on Chrome''s JavaScript runtime for easily building fast, scalable network applications. Node.js uses an event-driven, non-blocking I/O model that makes it lightweight and efficient, perfect for data-intensive real-time applications that run across distributed devices. license: module: - MIT content: - DUMMY dependencies: - buildrequires: platform: [f29] requires: platform: [f29] references: community: http://nodejs.org documentation: http://nodejs.org/en/docs tracker: https://github.com/nodejs/node/issues profiles: default: rpms: - nodejs - npm development: rpms: - nodejs - nodejs-devel - npm minimal: rpms: - nodejs api: rpms: - nodejs - nodejs-devel - npm components: rpms: nodejs: rationale: Javascript runtime and npm package manager. repository: git://pkgs.fedoraproject.org/rpms/nodejs cache: http://pkgs.fedoraproject.org/repo/pkgs/nodejs ref: 8 buildorder: 10 artifacts: rpms: - nodejs-1:8.11.4-1.module_2030+42747d40.x86_64 - nodejs-devel-1:8.11.4-1.module_2030+42747d40.x86_64 - nodejs-docs-1:8.11.4-1.module_2030+42747d40.noarch - npm-1:5.6.0-1.8.11.4.1.module_2030+42747d40.x86_64 ... fedora-modularity-libmodulemd-357799c/modulemd/tests/test_data/stream_packager_mix.yaml000066400000000000000000000010731502446517500315530ustar00rootroot00000000000000--- document: modulemd version: 1 data: name: foo stream: a summary: Example 1 description: Description 1 license: module: - DUMMY ... --- document: modulemd-packager version: 2 data: summary: Example 2 description: Description 2 license: module: - DUMMY ... --- document: modulemd-packager version: 3 data: name: baz stream: c summary: Example 3 description: Description 3 ... --- document: modulemd version: 2 data: name: qux stream: d summary: Example 4 description: Description 4 license: module: - DUMMY ... fedora-modularity-libmodulemd-357799c/modulemd/tests/test_data/stream_unicode_v1.yaml000066400000000000000000000013351502446517500311560ustar00rootroot00000000000000document: modulemd version: 1 data: description: Fedora 28 traditional base ’ name: platform license: module: [MIT] profiles: buildroot: rpms: [bash, bzip2, coreutils, cpio, diffutils, fedora-release, findutils, gawk, gcc, gcc-c++, grep, gzip, info, make, patch, redhat-rpm-config, rpm-build, sed, shadow-utils, tar, unzip, util-linux, which, xz] srpm-buildroot: rpms: [bash, fedora-release, fedpkg-minimal, gnupg2, redhat-rpm-config, rpm-build, shadow-utils] stream: f28 summary: Fedora 28 traditional base version: 3 context: 00000000 xmd: mbs: buildrequires: {} commit: virtual requires: {} mse: true koji_tag: module-f28-build fedora-modularity-libmodulemd-357799c/modulemd/tests/test_data/stream_unicode_v2.yaml000066400000000000000000000013351502446517500311570ustar00rootroot00000000000000document: modulemd version: 2 data: description: Fedora 28 traditional base ’ name: platform license: module: [MIT] profiles: buildroot: rpms: [bash, bzip2, coreutils, cpio, diffutils, fedora-release, findutils, gawk, gcc, gcc-c++, grep, gzip, info, make, patch, redhat-rpm-config, rpm-build, sed, shadow-utils, tar, unzip, util-linux, which, xz] srpm-buildroot: rpms: [bash, fedora-release, fedpkg-minimal, gnupg2, redhat-rpm-config, rpm-build, shadow-utils] stream: f28 summary: Fedora 28 traditional base version: 3 context: 00000000 xmd: mbs: buildrequires: {} commit: virtual requires: {} mse: true koji_tag: module-f28-build fedora-modularity-libmodulemd-357799c/modulemd/tests/test_data/sv.po000066400000000000000000000763051502446517500256640ustar00rootroot00000000000000# Göran Uddeborg , 2018. #zanata # Göran Uddeborg , 2019. #zanata msgid "" msgstr "" "Project-Id-Version: fedora-modularity-translations VERSION\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" "POT-Creation-Date: 2018-10-16 20:32+0000\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "PO-Revision-Date: 2019-06-18 09:43+0000\n" "Last-Translator: Göran Uddeborg \n" "Language-Team: Swedish\n" "Language: sv\n" "X-Generator: Zanata 4.6.2\n" "Plural-Forms: nplurals=2; plural=(n != 1)\n" #: ant;1.10;description:2 msgid "" "Apache Ant is a Java library and command-line tool whose mission is to drive " "processes described in build files as targets and extension points dependent " "upon each other. The main known usage of Ant is the build of Java " "applications. Ant supplies a number of built-in tasks allowing to compile, " "assemble, test and run Java applications. Ant can also be used effectively " "to build non Java applications, for instance C or C++ applications. More " "generally, Ant can be used to pilot any type of process which can be " "described in terms of targets and tasks." msgstr "" "Apache Ant är ett Javabibliotek och kommandoradsverktyg vars uppgift det är " "att driva processer som beskrivs i byggfiler som mål utökningspunkter som " "beror på varandra. Ant tillhandahåller ett antal inbyggda uppgifter som gör " "att det går att kompilera, assemblera, testa och köra Javaprogram. Ant kan " "även användas effektivt för att bygga icke-Javaprogram, till exempel C- " "eller C++-program. Mer allmänt kan Ant användas för att styra alla sorters " "processer som kan beskrivas i termer av mål och uppgifter." #: ant;1.10;summary:1 msgid "Java build tool" msgstr "Javabyggverktyg" #: avocado;latest;description:2 avocado;stable;description:2 msgid "" "Avocado is a set of tools and libraries (what people call these days a " "framework) to perform automated testing." msgstr "" "Avocado är ett antal verktyg och bibliotek (vilket folk nuförtiden kallar " "ramverk) för att utföra automatiserad testning." #: avocado;latest;profile;default:3 msgid "Default profile installing the most commonly used avocado packages." msgstr "Standardprofil som installerar de mest använda avocadopaketen." #: avocado;latest;profile;minimal:3 msgid "Minimal profile installing only the main avocado package." msgstr "Minimal profil som installerar endast huvudpaketet för avocado." #: avocado;latest;summary:1 avocado;stable;summary:1 msgid "Framework with tools and libraries for Automated Testing" msgstr "Ramverk med verktyg och bibliotek för automatiserad testning." #: container-tools;2017.0;description:2 container-tools;2018.0;description:2 msgid "" "Contains SELinux policies, binaries and other dependencies for use with " "container runtimes" msgstr "" "Innehåller SELinux-policyer, binärer och andra beroenden att användas med " "körmiljöer för behållare" #: container-tools;2017.0;summary:1 container-tools;2018.0;summary:1 msgid "Common tools and dependencies for container runtimes" msgstr "Vanliga verktyg och beroenden för körmiljöer för behållare" #: cri-o;1.11;description:2 cri-o;2017.0;description:2 #: cri-o;2018.0;description:2 msgid "" "CRI-O is the Kubernetes Container Runtime Interface for OCI-based containers." "" msgstr "" "CRI-O är Kubernetes körtidsgränssnitt för behållare för OCI-baserade " "behållare." #: cri-o;1.11;summary:1 cri-o;2017.0;summary:1 cri-o;2018.0;summary:1 msgid "Kubernetes Container Runtime Interface for OCI-based containers" msgstr "Kubernetes körtidsgränssnitt för behållare för OCI-baserade behållare" #: django;1.6;description:2 msgid "" "Django is a high-level Python Web framework that encourages rapid " "development and a clean, pragmatic design. It focuses on automating as much " "as possible and adhering to the DRY (Don't Repeat Yourself) principle." msgstr "" "Django är ett högnivåwebbramverk i Python som uppmuntrar till snabb " "utveckling och en ren, pragmatisk design. Det fokuserar på att automatisera " "så mycket som möjligt och att följa principen DRY (Don't Repeat Yourself, " "upprepa dig inte)." #: django;1.6;summary:1 msgid "A high-level Python Web framework" msgstr "Ett högnivåwebbramverk i Python" #: docker;2017.0;description:2 msgid "" "Docker is an open-source engine that automates the deployment of any " "application as a lightweight, portable, self-sufficient container that will " "run virtually anywhere." msgstr "" "Docker är en motor i öppen källkod som automatiserar utplaceringen av " "godtyckligt program som en lättviktig, portabel, självständig behållare som " "kan köra praktiskt taget var som helst." #: docker;2017.0;summary:1 msgid "Module for docker runtime and docker-distribution" msgstr "Modul för körmiljö för docker och docker-distribution" #: dwm;6.0;description:2 dwm;6.1;description:2 dwm;latest;description:2 msgid "" "dwm is a dynamic window manager for X. It manages windows in tiled, " "monocle, and floating layouts. All of the layouts can be applied " "dynamically, optimizing the environment for the application in use and the " "task performed." msgstr "" "dwm är en dynamisk fönsterhanterare för X. Den hanterar fönster i " "plattläggnings-, monokel- eller flytande layout. Alla layouterna kan " "användas dynamiskt för att optimera miljön för det använda programmet och " "den utförda uppgiften." #: dwm;6.0;profile;default:3 dwm;6.1;profile;default:3 #: dwm;latest;profile;default:3 msgid "The minimal, distribution-compiled dwm binary." msgstr "Den minimala, distributionskompilerade binären av dwm." #: dwm;6.0;profile;user:3 dwm;6.1;profile;user:3 dwm;latest;profile;user:3 msgid "" "Includes distribution-compiled dwm as well as a helper script to apply user " "patches and configuration, dwm-user." msgstr "" "Inkluderar distributionskompilerad dwm såväl som ett hjälpskript för att " "tillämpa användarändringar och konfiguration, dwm-user." #: dwm;6.0;summary:1 dwm;6.1;summary:1 dwm;latest;summary:1 msgid "Dynamic window manager for X" msgstr "Dynamisk fönsterhanterare för X" #: eog;main;description:2 msgid "" "The Eye of GNOME image viewer (eog) is the official image viewer for the " "GNOME desktop. It can view single image files in a variety of formats, as " "well as large image collections.\n" msgstr "" "Bildvisaren Eye of GNOME (GNOMEs öga, eog) är den officiella bildvisaren för " "skrivbordet GNOME. Den kan visa enstaka bildfiler i ett antal olika format " "såväl so mstora bildsamlingar.\n" #: eog;main;summary:1 msgid "Eye of GNOME Application Module" msgstr "Programmodulen Eye of GNOME (GNOMEs öga)" #: feedreader;main;description:2 msgid "" "FeedReader is a modern desktop application designed to complement existing " "web-based RSS accounts. It combines all the advantages of web based services " "like synchronization across all your devices with everything you expect from " "a modern desktop application." msgstr "" "FeedReader är ett modernt skrivbordsprogram gjort för att komplettera " "befintliga webbaserade RSS-konton. Det kombinerar alla fördelarna hos " "webbaserade tjänster som synkronisering tvärs över alla dina enheter med " "allt du förväntar dig från ett modernt skrivbordsprogram." #: feedreader;main;summary:1 msgid "RSS desktop client" msgstr "RSS-skrivbordsklient" #: flatpak-common;f29;description:2 msgid "" "This module is used to build packages relocated into /app for bundling into " "Flatpaks." msgstr "" "Denna modul används för att bygga paket omlokaliserade in i /app för att " "packa ihop i Flatpak:ar." #: flatpak-common;f29;summary:1 msgid "Common builds to include in Flatpak containers" msgstr "Vanligga byggen att inkludera i Flatpak-behållare" #: flatpak-runtime;f29;description:2 msgid "" "This module defines two runtimes for Flatpaks, the 'runtime' profile that " "most Flatpaks in Fedora use, and a smaller 'runtime-base' profile that is " "intended to be more minimal and (slightly) more API stable. There are also " "corresponding sdk and sdk-base profiles that are used to build SDKs that " "applications can be built against with flatpak-builder." msgstr "" "Denna modul definierar två körmiljöer för Flatpak:er, profilen ”runtime” som " "de flesta Flatpak:er i Fedora använder, och en mindre profil ”runtime-base” " "som är avsedd att vara mer minimal och (något) mer API-stabil. Det finns " "även motsvarande sdk och sdk-baserade profiler som används för att bygga SDK:" "er som program kan byggas mot med flatpak-builder." #: flatpak-runtime;f29;summary:1 msgid "Flatpak Runtime" msgstr "Körmiljö för Flatpak" #: gcsf;main;description:2 msgid "" "GCSF is a virtual filesystem that allows users to mount their\n" "Google Drive account locally and interact with it as a\n" "regular disk partition.\n" msgstr "" "GCSF är ett virtuellt filsystem som låter användaren montera sitt\n" "Google Drive-konto lokalt och interagera med det som en\n" "normal diskpartition.\n" #: gcsf;main;summary:1 msgid "FUSE file system based on Google Drive" msgstr "FUSE-filsystm baserat på Google Drive" #: ghc;8.4;description:2 msgid "This module provides the Glasgow Haskell Compiler version 8.4.3." msgstr "" "Denna modul tillhandahåller Glasgow Haskell-kompilatorn version 8.4.3." #: ghc;8.4;profile;default:3 msgid "standard installation" msgstr "standardinstallation" #: ghc;8.4;profile;minimal:3 msgid "just compiler and base" msgstr "bara kompilator och bas" #: ghc;8.4;profile;small:3 msgid "compiler with main core libs" msgstr "kompilator med huvudsakliga kärnbibliotek" #: ghc;8.4;summary:1 msgid "Haskell GHC 8.4" msgstr "Haskell GHC 8.4" #: gimp;2.10;description:2 msgid "A module containing GIMP, the GNU Image Manipulation Program." msgstr "En modul som innehåller GIMP, GNU bildbehandlingsprogram." #: gimp;2.10;summary:1 msgid "GIMP" msgstr "GIMP" #: gnome-clocks;main;description:2 gnome-clocks;main;summary:1 msgid "Clock application designed for GNOME 3" msgstr "Klockprogram designad för GNOME 3" #: gnome-tetravex;main;description:2 msgid "" "A puzzle game where you have to match a grid of tiles together. The skill " "level ranges from the simple two by two up to the seriously mind-bending six " "by six grid." msgstr "" "Ett logikspel där man skall matcha ihop ett mönster av brickor. " "Svårighetsnivån går från enkelt med två gånger två upp till det verkligt " "komplexa rutmönstret sex gånger sex." #: gnome-tetravex;main;summary:1 msgid "GNOME Tetravex game" msgstr "GNOME Tetravex-spel" #: golang-ecosystem;2017.0;description:2 golang-ecosystem;2018.0;description:2 msgid "" "This module contains golang based tools used as dependencies for other " "packages, for instance, go-md2man, a manpage converter written in Go, along " "with rpm macros for building Go based tools." msgstr "" "Denna modul innehåller golang-baserade verktyg so manvänds som beroenden för " "andra paket, till exempel go-md2man, en manualsidekonverterar skriven i Go, " "tillsammans med rpm-makron för att bygga Go-baserade verktyg." #: golang-ecosystem;2017.0;summary:1 golang-ecosystem;2018.0;summary:1 msgid "The ecosystem of packages for the Go programming language" msgstr "Ekosystemet av paket för programmeringsspråket Go" #: golang;1.10;description:2 msgid "" "This module provides the Go compiler and associated tools and documentation." msgstr "" "Denna modul tillhandahåller Go-kompilatorn och tillhörande verktyg och " "dokumentation." #: golang;1.10;summary:1 msgid "The Go Programming Language" msgstr "Programmeringsspråket Go" #: hub;pre-release;description:2 msgid "" "hub is a command line tool that wraps `git` in order to extend it with extra " "features and commands that make working with GitHub easier.\n" "\n" " $ hub clone rtomayko/tilt\n" "\n" " # expands to:\n" " $ git clone git://github.com/rtomayko/tilt.git" msgstr "" "hub är ett kommandoradsverktyg som kaplsar in ”git” för att utöka det med " "extra funktioner och kommandon som gör det enklare att arbeta med GitHub.\n" "\n" " $ hub clone rtomayko/tilt\n" "\n" " # expanderas till:\n" " $ git clone git://github.com/rtomayko/tilt.git" #: hub;pre-release;summary:1 msgid "A command-line wrapper for git with github shortcuts" msgstr "Ett kommandoratsomslag kring git med github-genvägar" #: kubernetes;1.10;description:2 msgid "" "Kubernetes is an open source system for managing containerized applications " "across multiple hosts; providing basic mechanisms for deployment, " "maintenance, and scaling of applications. Kubernetes builds upon a decade " "and a half of experience at Google running production workloads at scale " "using a system called Borg, combined with best-of-breed ideas and practices " "from the community." msgstr "" "Kubernetes är ett system i öppen källkod för att hantera program i behållare " "över flera värdar; tillhandahåller grundläggande mekanismer för utplacering, " "underhåll och skalning av program. Kubernetes bygger på en och en halv " "dekad av erfarenhet hos Google i att köra produktionslaster i stor skala med " "ett system kallat Borg, kombinerat med de bästa idéerna och praktikerna " "från gemenskapen." #: kubernetes;1.10;summary:1 msgid "Container cluster management" msgstr "Hantering av behållarkluster" #: kubernetes;openshift-3.10;description:2 msgid "" "OpenShift Origin is a distribution of Kubernetes optimized for application " "development and deployment. OpenShift Origin adds developer and operational " "centric tools on top of Kubernetes to enable rapid application development, " "easy deployment and scaling, and long-term lifecycle maintenance for small " "and large teams and applications. It provides a secure and multi-tenant " "configuration for Kubernetes allowing you to safely host many different " "applications and workloads." msgstr "" "OpenShift Origin är en distribution av Kubernetes optimerad för " "programutveckling och -utplacering. OpenShift Origin lägger till utvecklar- " "och driftcentrerade verktyg ovanpå Kubernetes för att möjliggöra snabb " "programutveckling, enkel uptlacering och skalning, och långsiktig " "livscykelunderhåll för små och stora grupper och program. Det ger en säker " "konfiguration med flera hyresgäster för Kubernetes och låter dig säkert vara " "värd för många olika program och arbetslaster." #: kubernetes;openshift-3.10;summary:1 msgid "OpenShift Container Management" msgstr "OpenShift hantering av behållare" #: libgit2;0.26;description:2 libgit2;0.27;description:2 msgid "The Git linkable library." msgstr "Det länkbara Git-biblioteket." #: libgit2;0.26;summary:1 libgit2;0.27;summary:1 msgid "Library implementation of Git" msgstr "Biblioteksimplementation av Git" #: lizardfs;devel;description:2 msgid "" "LizardFS is an Open Source, easy to deploy and maintain, distributed, fault " "tolerant file system for POSIX compliant OSes. LizardFS is a fork of MooseFS." " For more information please visit http://lizardfs.com" msgstr "" "LizardFS är ett distribuerat och feltolerant filsystem i öppen källkod som " "är enkelt att placera ut och underhålla för OS som följer POSIX. LizardFS " "är en avgrening av MooseFS. För mer information besök http://lizardfs.com" #: lizardfs;devel;summary:1 msgid "Distributed, fault tolerant file system" msgstr "Distribuerat, feltolerant filsystem" #: mariadb;10.1;description:2 msgid "" "MariaDB is a community developed branch of MySQL. MariaDB is a multi-user, " "multi-threaded SQL database server. It is a client/server implementation " "consisting of a server daemon (mysqld) and many different client programs " "and libraries. The base package contains the standard MariaDB/MySQL client " "programs and generic MySQL files." msgstr "" "MariaDB är en gemenskapsutvecklad gren av MySQL. MariaDB är en multitrådad " "SQL-databasserver för flera användare. Den har en klient-/" "serverimplementation som består av en serverdemon (mysqld) och många olika " "klientprogram och bibliotek. Baspaketet innehåller standard MariaDB-/MySQL-" "klientprogram och allmänna MySQL-filer." #: mariadb;10.1;summary:1 msgid "MariaDB Module" msgstr "MariaDB-modul" #: maven;3.5;description:2 msgid "" "Maven is a software project management and comprehension tool. Based on the " "concept of a project object model (POM), Maven can manage a project's build, " "reporting and documentation from a central piece of information." msgstr "" "Maven är ett verktyg för hantering och sammanfattning av programvaruprojekt. " " Baserat på begreppet en projektobjektmodell (POM) kan Maven hantera ett " "projekts bygge, rapportering och dokumentation från ett centralt stycke " "information." #: maven;3.5;summary:1 msgid "Java project management and project comprehension tool" msgstr "Javaprojekthanterings- och -sammanfattningsverktyg" #: meson;main;description:2 msgid "" "Meson is an open source build system meant to be both extremely fast, and, " "even more importantly, as user friendly as possible.\n" "The main design point of Meson is that every moment a developer spends " "writing or debugging build definitions is a second wasted. So is every " "second spent waiting for the build system to actually start compiling code." msgstr "" "Meson är ett byggsystem i öppen källkod avsett att vara både extremt snabbt " "och, ännu viktigare, så användarvänligt som möjligt.\n" "Huvudpunkten i designen av Meson är att all tid en utvecklare använder för " "att skriva och felsöka byggdefinitioner är bortkastad tid. Samma sak gäller " "varje stund som används för att vänta på att byggsystemet faktiskt börjar " "kompilera kod." #: meson;main;summary:1 msgid "The Meson Build system" msgstr "Byggsystemet Meson" #: mongodb;3.4;description:2 mongodb;3.6;description:2 msgid "" "Mongo from humongous is a high-performance, open source, schema-free " "document-oriented database. MongoDB is written in C++ and offers the " "following features. Collection oriented storage, easy storage of object/JSON-" "style data. Dynamic queries. Full index support, including on inner objects " "and embedded arrays. Query profiling. Replication and fail-over support. " "Efficient storage of binary data including large objects (e.g. photos and " "videos). Auto-sharding for cloud-level scalability (currently in early " "alpha). Commercial Support Available. A key goal of MongoDB is to bridge the " "gap between key/value stores (which are fast and highly scalable) and " "traditional RDBMS systems (which are deep in functionality)." msgstr "" "Mongo från humongous (enorm) är en schemafri dokumentorienterad databas för " "hög prestanda i öppen källkod. MongoDB är skriven i C++ och erbjuder " "följande funktioner. Samlingsorienterad lagring, enkel lagring av objekt/" "data i JSON-stil. Dunamiska frågor. Fullständigt indexstöd, inklusive på " "inre objekt och inbäddade vektorer. Frågeprofilering. Stöd för replikering " " och reservomkoppling. Effektiv lagring av binära data inklusive stora " "objekt (t.ex. foton och videor). Automatisk uppdelning på skärvor för " "skalbarhet på molnnivå (för närvarande i tidig alfa). Kommersiellt support " "finns tillgängligt. Ett nyckelmål med MongoDB är att överbrygga gapet " "mellan nyckel/värde-lager (som är snabba och mycket skalbara) och " "traditionella RDBMS-system (som har djup funktionalitet)." #: mongodb;3.4;summary:1 mongodb;3.6;summary:1 msgid "MongoDB Module" msgstr "MongoDB-modul" #: mysql;5.7;description:2 msgid "" "MySQL is a multi-user, multi-threaded SQL database server. MySQL is a client/" "server implementation consisting of a server daemon (mysqld) and many " "different client programs and libraries. The base package contains the " "standard MySQL client programs and generic MySQL files." msgstr "" "MySQL är multitrådad SQL-databasserver för flera användare. MySQL är en " "klient/serverimplementation som består en serverdemon (mysqld) och många " "olika klientprogram och bibliotek. Baspaketet innehåller standard-MySQL-" "klientprogram och generella MySQL-filer." #: mysql;5.7;summary:1 msgid "MySQL Module" msgstr "MySQL-modul" #: ninja;main;description:2 msgid "" "This module includes Ninja build system. Ninja is a small build system with " "a focus on speed. It differs from other build systems in two major respects: " "it is designed to have its input files generated by a higher-level build " "system, and it is designed to run builds as fast as possible." msgstr "" "Denna modul innehåller byggsystemet Ninja. Ninja är ett litet byggsystem " "som fokuserar på hastighet. Det skiljer från andra byggsystem i två viktiga " "avseenden: det är gjort för att ha sina indatafiler genererade av ett " "byggsystem på högre nivå, och det är designat för att köra byggen så fort " "som möjligt." #: ninja;main;summary:1 msgid "Small build system with a focus on speed" msgstr "Litet byggsystem med fokus på hastighet" #: nodejs;10;description:2 nodejs;8;description:2 msgid "" "Node.js is a platform built on Chrome''s JavaScript runtime for easily " "building fast, scalable network applications. Node.js uses an event-driven, " "non-blocking I/O model that makes it lightweight and efficient, perfect for " "data-intensive real-time applications that run across distributed devices." msgstr "" "Node.js är en plattform byggd på Chromes JavaScript-körmiljö för att enkelt " "bygga snabba, skalbara nätverksprogram. Node.js använder en händelsedriven, " "icke blockerande I/O-modell som gör den lättviktig och effektiv, perfekt för " "dataintensiva realtidsprogram som kör över distribuerade enheter." #: nodejs;10;summary:1 nodejs;8;summary:1 msgid "Javascript runtime" msgstr "Javaskript-körmiljö" #: perl-bootstrap;5.24;description:2 perl-bootstrap;5.26;description:2 msgid "" "This is the Perl interpreter and a set of modules written in Perl language " "intended for bootstrapping the perl module. This module disables some " "optional tests to limit amount of components. This module is not intended " "for public use. It's an intermediate step for building perl module.\n" msgstr "" "Detta är en Perl-interpretator och uppsättning moduler skriva i språket Perl " "avsedda för uppstart av perl-modulen. Denna modul avaktiverar några valfria " "tester för att begränsa mängden komponenter. Denna modul är inte avsedd för " "allmän användning. Den är ett mellanliggande steg för att bygga Perl-" "moduler.\n" #: perl-bootstrap;5.24;summary:1 perl-bootstrap;5.26;summary:1 msgid "Perl bootstrap module for bootrapping Perl module" msgstr "Perl-uppstartsmodul för att starta Perl-moduler" #: perl;5.24;description:2 perl;5.26;description:2 msgid "" "Perl is a high-level programming language with roots in C, sed, awk and " "shell scripting. Perl is good at handling processes and files, and is " "especially good at handling text. Perl's hallmarks are practicality and " "efficiency. While it is used to do a lot of different things, Perl's most " "common applications are system administration utilities and web programming." "\n" msgstr "" "Perl är ett programmeringsspråk på hög nivå med rötter i C, sed, awk och " "skalskript. Perl är bra på att hantera processer och filer, och är särskilt " "bra på att hantera text. Perls kännetecken är att vara praktiskt och " "effektivt. Samtidigt som det används för att göra många olika saker är " "Perls vanligaste användningar systemadministrationsverktyg och " "webbprogrammering.\n" #: perl;5.26;profile;default:3 msgid "Interpreter and all Perl modules bundled within upstream Perl." msgstr "Tolk och alla Perlmoduler packade tillsammans med uppströms-Perl." #: perl;5.26;profile;minimal:3 msgid "Only the interpreter as a standalone executable." msgstr "Endast tolken är ett fristående program." #: perl;5.24;summary:1 perl;5.26;summary:1 msgid "Practical Extraction and Report Language" msgstr "Praktistk extraherings- och rapportspråk" #: pki;10.6;description:2 msgid "A module for Dogtag PKI." msgstr "En modul för Dogtag-PKI." #: pki;10.6;summary:1 msgid "Dogtag PKI" msgstr "Dogtag-PKI" #: postgresql;9.6;description:2 msgid "" "PostgreSQL is an advanced Object-Relational database management system " "(DBMS). The PostgreSQL server can be found in the postgresql-server sub-" "package." msgstr "" "PostgreSQL är en avancerad objekt-relations-databashanteringsystem (DBMS). " "PostgreSQL-servern finns i underpaketet postgresql-server." #: postgresql;9.6;summary:1 msgid "PostgreSQL module" msgstr "PostgreSQL-modul" #: rawtherapee;devel;description:2 msgid "" "Rawtherapee is a RAW image processing software. It gives full control over " "many parameters to enhance the raw picture before finally exporting it to " "some common image format." msgstr "" "Rawtherapee är ett program för bearbetning av råbilder. Det ger full " "kontroll över många parametrar för att förbättra den råa bilden före man " "slutligen exporterar den till något normalt bildformat." #: rawtherapee;devel;summary:1 msgid "Raw image processing software" msgstr "Program för bearbetning av råbilder" #: reviewboard;2.5;description:2 reviewboard;3.0;description:2 msgid "" "Review Board is a powerful web-based code review tool that offers developers " "an easy way to handle code reviews. It scales well from small projects to " "large companies and offers a variety of tools to take much of the stress and " "time out of the code review process." msgstr "" "Review Board är ett kraftfullt webbaserat kodgranskningsverktyg som erbjuder " "utvecklare ett enkelt sätt att hantera kodgranskningar. Det skalar bra från " "små projekt till stora företag och erbjuder en mångfald av verktyg för att " "ta bort mycket av stressen och tidsåtgången från kodgranskningsprocessen." #: reviewboard;2.5;summary:1 reviewboard;3.0;summary:1 msgid "A web-based code review tool" msgstr "Ett webbaserat kodgranskningsverktyg" #: ripgrep;latest;description:2 ripgrep;main;description:2 msgid "" "Line oriented search tool using Rust's regex library. Combines\n" "the raw performance of grep with the usability of the silver searcher.\n" msgstr "" "Radoirienterat sökverktyg som använder Rusts bibliotek för reguljäruttryck.\n" "Kombinerar den råa prestandan hos grep med användbarheten hos The Silver " "Searcher.\n" #: ripgrep;latest;summary:1 ripgrep;main;summary:1 msgid "Line oriented search tool using Rust's regex library" msgstr "" "Radorienterat sökerverktyg som använder Rusts bibliotek för reguljäruttryck." #: ruby;main;description:2 ruby;private-jaruga-main;description:2 msgid "" "Ruby is the interpreted scripting language for quick and easy object-" "oriented programming. It has many features to process text files and to do " "system management tasks (as in Perl). It is simple, straight-forward, and " "extensible." msgstr "" "Ruby är ett interpreterat skriptspråk för snabb och enkel objektorienterad " "programmering. Det ha många funktioner för att bearbeta textfiler och för " "att utföra systemadministrationsuppgifter (som i Perl). Det är enkelt, " "rättframt och utbyggbart." #: ruby;main;summary:1 ruby;private-jaruga-main;summary:1 msgid "An interpreter of object-oriented scripting language" msgstr "En interpretator för ett objektorienterat skriptspråk" #: scala;2.10;description:2 msgid "" "Scala is a general purpose programming language designed to express common " "programming patterns in a concise, elegant, and type-safe way. It smoothly " "integrates features of object-oriented and functional languages. It is also " "fully interoperable with Java." msgstr "" "Scala är ett generellt programmeringsspråk gjort för att uttrycka vanliga " "programmeringsmönster i ett koncist, elegant och typsäkert sätt. Det " "integrerar smidigt funktioner hos objektorienterade och funktionella språk. " "Det är också fullt interoperabelt med Java." #: scala;2.10;summary:1 msgid "A hybrid functional/object-oriented language for the JVM" msgstr "Ett funktonellt/objektorienterat hybridspråk för JVM" #: setools;4.2.0;description:2 msgid "" "SETools is a collection of graphical tools, command-line tools, and Python " "modules designed to facilitate SELinux policy analysis." msgstr "" "SETools är en samling med grafiska verktyg, kommandoradsverktyg och " "Pythonmoduler gjorda för att möjliggöra analys av SELinux-policyer." #: setools;4.2.0;profile;default:3 msgid "Standard installation" msgstr "Standardinstallation" #: setools;4.2.0;summary:1 msgid "Policy analysis tools for SELinux" msgstr "Policyanalysverktyg för SELinux" #: skychart;devel;description:2 msgid "" "This program enables you to draw sky charts, making use of the data in 16 " "catalogs of stars and nebulae. In addition the position of planets, " "asteroids and comets are shown.\n" "The purpose of this program is to prepare different sky maps for a " "particular observation. A large number of parameters help you to choose " "specifically or automatically which catalogs to use, the colour and the " "dimension of stars and nebulae, the representation of planets, the display " "of labels and coordinate grids, the superposition of pictures, the condition " "of visibility and more. All these features make this celestial atlas more " "complete than a conventional planetarium." msgstr "" "Detta program gör att du kan rita stjärnkartor, med användning av data i 16 " "kataloger över stjärnor och nebulosor. Dessutom visas läget för planeter, " "asteroider och kometer.\n" "Syftet med detta program är att förbereda olika stjärnkartor för en specifik " "observation. Ett stort antal parametrar hjälper dig att välja specifikt " "eller automatiskt vilka kataloger som skall användas, färgen och dimensionen " "på stjärnor, nebulosor, representationen av planeter, hur etiketter och " "koordinatrutor visas, överlagringen av bilder, villkoret för synlighet med " "mera. Alla dessa funktioner gör denna himmelsatlas komplettare än ett " "konventionellt planetarium." #: skychart;devel;profile;additional-dso:3 msgid "Core program, documentation and additional Deep Sky catalogs." msgstr "Grundprogram, dokumentation och ytterligare Deep Sky-kataloger." #: skychart;devel;profile;additional-stars:3 msgid "Core program, documentation and additional star catalogs." msgstr "Grundprogram, dokumentation och ytterligare stjärnkataloger." #: skychart;devel;profile;default:3 msgid "Minimal installation with default catalogs and documentation." msgstr "Minimal installation med standardkataloger och dokumentation." #: skychart;devel;profile;full:3 msgid "Core program, documentation and all available additional catalogs." msgstr "Grundprogram, dokumentation och alla ytterligare kataloger." #: skychart;devel;summary:1 msgid "Planetarium software for the advanced amateur astronomer" msgstr "Planetariumprogram för den avancerade amatörastronomen" #: stratis;1;description:2 stratis;main;description:2 msgid "Easy to use local storage management." msgstr "Lättanvänd lokal lagringshantering." #: stratis;1;summary:1 stratis;main;summary:1 msgid "Stratis Storage" msgstr "Stratis-lagring" #: testmodule;main;description:2 msgid "" "This module demonstrates how to write simple modulemd files And can be used " "for testing the build and release pipeline." msgstr "" "Denna modul demonstrerar hur man skriver enkla modulemd-filer och kan " "användas för att testa bygg- och utgåve-pipeliner." #: testmodule;main;summary:1 msgid "A test module in all its beautiful beauty" msgstr "En testmodul i all sin bedårande skönhet" fedora-modularity-libmodulemd-357799c/modulemd/tests/test_data/te.yaml000066400000000000000000000001571502446517500261600ustar00rootroot00000000000000--- summary: An example module description: An example module. profiles: profile_a: An example profile ... fedora-modularity-libmodulemd-357799c/modulemd/tests/test_data/upgrades/000077500000000000000000000000001502446517500264735ustar00rootroot00000000000000fedora-modularity-libmodulemd-357799c/modulemd/tests/test_data/upgrades/packager_v3_to_index.yaml000066400000000000000000000072171502446517500334440ustar00rootroot00000000000000--- document: modulemd-defaults version: 1 data: module: foo profiles: latest: [minimal] ... --- document: modulemd version: 2 data: name: foo stream: "latest" context: CTX1 summary: An example module description: >- A module for the demonstration of the metadata format. Also, the obligatory lorem ipsum dolor sit amet goes right here. license: module: - MIT xmd: some_key: some_data dependencies: - buildrequires: appframework: [v1] platform: [f32] requires: appframework: [v1] platform: [f32] references: community: http://www.example.com/ documentation: http://www.example.com/ tracker: http://www.example.com/ profiles: buildroot: rpms: - bar-devel container: rpms: - bar - bar-devel minimal: description: Minimal profile installing only the bar package. rpms: - bar srpm-buildroot: rpms: - bar-extras api: rpms: - bar - bar-devel - bar-extras - baz - xxx filter: rpms: - baz-nonfoo demodularized: rpms: - bar-old buildopts: rpms: macros: > %demomacro 1 %demomacro2 %{demomacro}23 whitelist: - fooscl-1-bar - fooscl-1-baz - xxx - xyz arches: [i686, x86_64] components: rpms: bar: rationale: We need this to demonstrate stuff. name: bar-real repository: https://pagure.io/bar.git cache: https://example.com/cache ref: 26ca0c0 baz: rationale: Demonstrate updating the buildroot contents. buildroot: true srpm-buildroot: true xxx: rationale: xxx demonstrates arches and multilib. buildorder: 10 arches: [i686, x86_64] multilib: [x86_64] modules: includedmodule: rationale: Included in the stack, just because. repository: https://pagure.io/includedmodule.git ref: somecoolbranchname buildorder: 100 ... --- document: modulemd version: 2 data: name: foo stream: "latest" context: CTX2 summary: An example module description: >- A module for the demonstration of the metadata format. Also, the obligatory lorem ipsum dolor sit amet goes right here. license: module: - MIT xmd: some_key: some_data dependencies: - buildrequires: platform: [f33] requires: platform: [f33] references: community: http://www.example.com/ documentation: http://www.example.com/ tracker: http://www.example.com/ profiles: buildroot: rpms: - bar-devel container: rpms: - bar - bar-devel minimal: description: Minimal profile installing only the bar package. rpms: - bar srpm-buildroot: rpms: - bar-extras api: rpms: - bar - bar-devel - bar-extras - baz - xxx filter: rpms: - baz-nonfoo demodularized: rpms: - bar-old components: rpms: bar: rationale: We need this to demonstrate stuff. name: bar-real repository: https://pagure.io/bar.git cache: https://example.com/cache ref: 26ca0c0 baz: rationale: Demonstrate updating the buildroot contents. buildroot: true srpm-buildroot: true xxx: rationale: xxx demonstrates arches and multilib. buildorder: 10 arches: [i686, x86_64] multilib: [x86_64] modules: includedmodule: rationale: Included in the stack, just because. repository: https://pagure.io/includedmodule.git ref: somecoolbranchname buildorder: 100 ... packager_v3_to_stream_v2.yaml000066400000000000000000000040671502446517500341600ustar00rootroot00000000000000fedora-modularity-libmodulemd-357799c/modulemd/tests/test_data/upgrades--- document: modulemd-defaults version: 1 data: module: foo profiles: latest: [minimal] ... --- document: modulemd version: 2 data: name: foo stream: "latest" summary: An example module description: >- A module for the demonstration of the metadata format. Also, the obligatory lorem ipsum dolor sit amet goes right here. license: module: - MIT xmd: some_key: some_data dependencies: - buildrequires: appframework: [v1] platform: [f32] requires: appframework: [v1] platform: [f32] - buildrequires: platform: [f33] requires: platform: [f33] references: community: http://www.example.com/ documentation: http://www.example.com/ tracker: http://www.example.com/ profiles: buildroot: rpms: - bar-devel container: rpms: - bar - bar-devel minimal: description: Minimal profile installing only the bar package. rpms: - bar srpm-buildroot: rpms: - bar-extras api: rpms: - bar - bar-devel - bar-extras - baz - xxx filter: rpms: - baz-nonfoo demodularized: rpms: - bar-old buildopts: rpms: macros: > %demomacro 1 %demomacro2 %{demomacro}23 whitelist: - fooscl-1-bar - fooscl-1-baz - xxx - xyz arches: [i686, x86_64] components: rpms: bar: rationale: We need this to demonstrate stuff. name: bar-real repository: https://pagure.io/bar.git cache: https://example.com/cache ref: 26ca0c0 baz: rationale: Demonstrate updating the buildroot contents. buildroot: true srpm-buildroot: true xxx: rationale: xxx demonstrates arches and multilib. buildorder: 10 arches: [i686, x86_64] multilib: [x86_64] modules: includedmodule: rationale: Included in the stack, just because. repository: https://pagure.io/includedmodule.git ref: somecoolbranchname buildorder: 100 ... fedora-modularity-libmodulemd-357799c/modulemd/tests/test_data/valid_defaults_with_garbage.yaml000066400000000000000000000001321502446517500332320ustar00rootroot00000000000000document: modulemd-defaults version: 1 data: module: foo modified: 42 ... garbage valid_defaults_with_unexpected_document.yaml000066400000000000000000000001321502446517500356250ustar00rootroot00000000000000fedora-modularity-libmodulemd-357799c/modulemd/tests/test_datadocument: modulemd-defaults version: 1 data: module: foo modified: 42 ... garbage fedora-modularity-libmodulemd-357799c/modulemd/version.xml.in000066400000000000000000000000121502446517500243540ustar00rootroot00000000000000@VERSION@ fedora-modularity-libmodulemd-357799c/setup_dev_container.sh000077500000000000000000000016571502446517500243510ustar00rootroot00000000000000#!/usr/bin/env bash SOURCE_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )" SCRIPT_DIR="$SOURCE_DIR/.ci" pushd $SCRIPT_DIR source $SCRIPT_DIR/ci-common.inc set -e set -x HOME=${HOME-/} release=${1:-$($SCRIPT_DIR/get_rawhide_version.py)} image=fedora/fedora:$release-$(uname -m) mmd_setup_container \ os=fedora \ release=$release \ repository=quay.io \ image=$image \ deps_image=libmodulemd-dev-$release # Create a home directory to log into homedir=$SCRIPT_DIR/.home_fedora if [ ! -d $homedir ]; then cp -a /etc/skel $homedir fi eval $MMD_OCI run \ --rm \ --tty \ --interactive \ --name libmodulemd-dev-$release \ --hostname libmodulemd-dev-$release \ --userns keep-id \ --volume=$homedir:$HOME:Z \ --volume=$SOURCE_DIR:/builddir:Z \ --workdir=/builddir \ --env HOME=$HOME \ fedora-modularity/libmodulemd-dev-$release \ /usr/bin/bash set +x fedora-modularity-libmodulemd-357799c/spec.v1.yaml000077700000000000000000000000001502446517500307112yaml_specs/modulemd_stream_v1.yamlustar00rootroot00000000000000fedora-modularity-libmodulemd-357799c/spec.v2.yaml000077700000000000000000000000001502446517500307132yaml_specs/modulemd_stream_v2.yamlustar00rootroot00000000000000fedora-modularity-libmodulemd-357799c/spec.yaml000077700000000000000000000000001502446517500303652yaml_specs/modulemd_stream_v2.yamlustar00rootroot00000000000000fedora-modularity-libmodulemd-357799c/spec_tmpl.sh000077500000000000000000000004151502446517500222660ustar00rootroot00000000000000#!/usr/bin/env bash function main { local template version release local "${@}" datetime=$(date +%Y%m%d%H%M%S) release=${release:-0.$datetime%\{?dist\}} sed -e "s/@VERSION@/$version/" \ -e "s/@RELEASE@/$release/" $template } main "${@}" fedora-modularity-libmodulemd-357799c/xml_specs/000077500000000000000000000000001502446517500217365ustar00rootroot00000000000000fedora-modularity-libmodulemd-357799c/xml_specs/README.md000066400000000000000000000077221502446517500232250ustar00rootroot00000000000000This a proposal for an XML format of modular data as found in YUM repositories. Reasons ======= Remove YAML from YUM repositories. All other data in the repository is in XML. This will remove a YAML parser from a list of dependencies of a package manager. It makes a minimal installation smaller and hopefully safer. DNF5 package manager is departing from glib library and libmodulemd, a reference implementation of the YAML format, is built on glib and exposes glib in its API. The fulfill DNF5's goal, a replacement for libmodulemd is required as glib cannot be removed without breaking libmodulemd's interface. An incompatible implementation gives a perfect opportunity for new format. Remove unnecessary features from the format. YAML format implemented features which were never adopted (intents, checksums, service levels, disjunctive dependencies). Remove for-build stanzas irrelevant for YUM repository (filters, components, buildopts, xmd). Optimize the format for package managers. YAML format was created as an input/output format for both packager managers and module builders. However, with the advent of modulemd-packager-v3 format, the input/output format symmetry has gone. Next, querying a repository for a list of module names, list of streams, latest module version meant processing all data as the YAML format was a linear list of module builds. XML will optimize the format by placing module builds of the same stream or module name together. Proper nesting will naturally deduplicate identifiers that were defined and parsed in YAML again and again. Well define the format. YAML specification was based on examples and many details were left open for implementations. As a result, DNF made assumptions or incomplete or no implementation. XML format will specify an alphabet and a maximal length for various data types (e.g. stream names). It will prevent from occurring duplicate or contradicting subdocuments (e.g. multiple default streams). It will clarify corner cases previously undocumented (e.g. end of life time pointy). XML language provides well-established tools for a formal specification (e.g. XML Schema). Plan ==== Create an XML format in discussion with package manager developers (DNF, Satellite, libmodulemd) and wide community (e.g. Fedora and Red Hat Enterprise Linux distribution developers). Have a set of examples, tests, formal specification. Create a convertor from YAML modulemd-v2 format to the XML format. That will help validate the new format on real existing YAML data. Plug that convertor into a compose process (i.e. enhance createrepo_c to convert YAML modular data to XML and have them both in the repository). Create a parser library and merging library. While libmodulemd could be extended, the required glib remove mandates a new library. Plug the parser into a package manager (i.e. enhance DNF5 and Satellite to support and prefer the XML format). (Once all that works and it demonstrates its benefits over the YAML format, we can start deprecating the YAML format on the repository side (i.e. change MBS to produce XML format directly and Bodhi, rpminspect and other tools to handle XML modules natively).) Status ====== There are two variant of the specification: "complete" and "reduced". Complete implements all features of modulemd-v2 YAML format, while reduced is stripped down of the unwanted features. Now there are both published for your reference, but the reduced variant is where to go and what to develop. See the corresponding subdirectories. Each of the subdirectories contain overview.xml demonstrating a quick glimpse on format, example.xml demonstrating all the feature on real data, schema.xsd with a formal specification, tests with positive and negative tests, and doc documenting decisions made in the design. As large development in the XML parsing library is expected, the XML specification will be moved to a dedicated git repository. That's not to disturb libmodulemd history and release cycle and to clearly separate build-time dependencies. fedora-modularity-libmodulemd-357799c/xml_specs/complete/000077500000000000000000000000001502446517500235465ustar00rootroot00000000000000fedora-modularity-libmodulemd-357799c/xml_specs/complete/Makefile000066400000000000000000000000501502446517500252010ustar00rootroot00000000000000.PHONY: check check: $(MAKE) -C tests fedora-modularity-libmodulemd-357799c/xml_specs/complete/doc/000077500000000000000000000000001502446517500243135ustar00rootroot00000000000000fedora-modularity-libmodulemd-357799c/xml_specs/complete/doc/intents000066400000000000000000000013031502446517500257170ustar00rootroot00000000000000Alphabet (e.g. a white space) for intent identifiers? Ask Anaconda: What is the grammar, meaning, who does define them? Anaconda: We get "system purpose" data from a subscription manager, user selects one, we push the selection back into the manager. Ask DNF where they get intents from. We install packages and modules with DNF. DNF: We do not implement it, we don't want to detect intents. Anaconda: Anaconda/subscription manager allows setting a system purpose as an arbitrary string. Currently the value is also a display string. Without localization. Some values are in /etc/rhsm/syspurpose/valid_fields.json. DECISION ======== - Allow an arbitrary string. An empty string equals to undefined value. fedora-modularity-libmodulemd-357799c/xml_specs/complete/doc/newlines000066400000000000000000000005431502446517500260640ustar00rootroot00000000000000Are stream summaries and obsolete messages multiline? Pros: Compatible with YAML. Cons: Single-line summary is akin to an RPM summary. DNF: They can be single-line. DNF: They can be empty. DNF: A details specification for obsoletes should have mcurlej. DECISION ======== A build summary and license are single-line. Other free-form texts are multi-line. fedora-modularity-libmodulemd-357799c/xml_specs/complete/doc/obsoletes000066400000000000000000000043271502446517500262430ustar00rootroot00000000000000Index Obsoleted contexts --------------------------------------------------------A B--------------- 1 1 0 0 1 0 1 1 0 1 1 1 1 1 Should context-less obsolete be independend from context obsolete? If independent, which does take precedence? Global-obsolete after a context-obsolete: Should it overlay replacement? Yes. Global-reset after a context-obsolete: Should it unobsolete the context? Context-reset after global-obsolete: Should it unobsolete the context? Models: (1) Global set and reset apply per context: Global-obsolete after a context-obsolete: Does it overlay replacement? Yes. Global-reset after a context-obsolete: Does it unobsolete the context? Yes. Context-reset after global-obsolete: Does it unobsolete the context? Yes. (2) Global set applies per context, global reset takes precedence: Global-obsolete after a context-obsolete: Does it overlay replacement? Yes. Global-reset after a context-obsolete: Does it unobsolete the context? Yes. Context-reset after global-obsolete: Does it unobsolete the context? No. (3) Independent, global set takes precedence: Global-obsolete after a context-obsolete: Does it overlay replacement? Yes. Global-reset after a context-obsolete: Does it unobsolete the context? No. Context-reset after global-obsolete: Does it unobsolete the context? No. (4) YAML implementation: Any reset resets everything. Context-obsolete overlays a global-obsolete. Global-obsolete overlays everything. Context-reset resets only that context, previous global-obsolete remains valid for other contexts. DECISION ======== The rules will follow YAML implementation. An obsoleteness is a per-context property. A set always sets the property, a reset always unsets the property. Always per context. A contextless obsolete (set or reset) is only a shortcut for naming all contexts. fedora-modularity-libmodulemd-357799c/xml_specs/complete/doc/translations000066400000000000000000000010741502446517500267610ustar00rootroot00000000000000RFC 1766 was obsoleted by RFC 5646 which allows 3-letter codes and many other subtags. XML formats (xml:lang etc.) use this hyphen-delimeted format. Glibc uses ISO 639 language (2- and 3-letter) codes, optionally followed by an ISO 3166 (2-letter) country code, followed by modifiers (like "sr@Latn"; compare to RFC 5646 "sr-Latn"). DECISION ======== Because RFC 5646 format is more difficult to parse, because YAML libmodulemd already uses glibc format, and because comps group also use glibc format (despite written in XML), XML module format will use glibc format. fedora-modularity-libmodulemd-357799c/xml_specs/complete/example.xml000066400000000000000000000405421502446517500257300ustar00rootroot00000000000000 default default default common f37 MIT Apache-2.0 CC0-1.0 GPL-1.0-or-later (GPL-1.0-or-later OR Artistic-1.0-Perl) AND Artistic-2.0 AND Unicode-DFS-2016 (GPL-1.0-or-later OR Artistic-1.0-Perl) AND BSD-3-Clause (GPL-1.0-or-later OR Artistic-1.0-Perl) AND CC0-1.0 AND LicenseRef-Fedora-Public-Domain (GPL-1.0-or-later OR Artistic-1.0-Perl) AND FSFAP (GPL-1.0-or-later OR Artistic-1.0-Perl) AND (GPL-2.0-or-later OR Artistic-1.0-Perl) and MIT (GPL-1.0-or-later OR Artistic-1.0-Perl) AND LicenseRef-Fedora-Public-Domain (GPL-1.0-or-later OR Artistic-1.0-Perl) AND Martin-Birgmeier AND Spencer-86 AND MIT AND Unicode-DFS-2016 AND LicenseRef-Fedora-Public-Domain (GPL-1.0-or-later OR Artistic-1.0-Perl) AND MIT (GPL-1.0-or-later OR Artistic-1.0-Perl) AND RSA-MD (GPL-1.0-or-later OR Artistic-1.0-Perl) AND Unicode-DFS-2015 (GPL-1.0-or-later OR Artistic-1.0-Perl) AND Unicode-DFS-2016 AND LicenseRef-Fedora-Public-Domain (GPL-1.0-or-later OR Artistic-1.0-Perl) AND Unicode-DFS-2016 (GPL-1.0-or-later OR Artistic-1.0-Perl) AND Zlib GPL-1.0-or-later OR Artistic-1.0-Perl GPL-2.0-or-later OR Artistic-1.0-Perl GPL-3.0-or-later MIT TTWL perl perl-interpreter perl perl-Archive-Tar perl-Attribute-Handlers perl-AutoLoader perl-AutoSplit perl-B perl-Benchmark perl-CPAN perl-CPAN-Meta perl-CPAN-Meta-Requirements perl-CPAN-Meta-YAML perl-Carp perl-Class-Struct perl-Compress-Raw-Bzip2 perl-Compress-Raw-Zlib perl-Config-Extensions perl-Config-Perl-V perl-DBM_Filter perl-DB_File perl-Data-Dumper perl-Devel-PPPort perl-Devel-Peek perl-Devel-SelfStubber perl-Digest perl-Digest-MD5 perl-Digest-SHA perl-Digest-SHA1 perl-DirHandle perl-Dumpvalue perl-DynaLoader perl-Encode perl-Encode-devel perl-English perl-Env perl-Errno perl-Exporter perl-ExtUtils-CBuilder perl-ExtUtils-Command perl-ExtUtils-Constant perl-ExtUtils-Embed perl-ExtUtils-Install perl-ExtUtils-MM-Utils perl-ExtUtils-MakeMaker perl-ExtUtils-Manifest perl-ExtUtils-Miniperl perl-ExtUtils-ParseXS perl-Fcntl perl-File-Basename perl-File-Compare perl-File-Copy perl-File-DosGlob perl-File-Fetch perl-File-Find perl-File-Path perl-File-Temp perl-File-stat perl-FileCache perl-FileHandle perl-Filter perl-Filter-Simple perl-FindBin perl-GDBM_File perl-Getopt-Long perl-Getopt-Std perl-HTTP-Tiny perl-Hash-Util perl-Hash-Util-FieldHash perl-I18N-Collate perl-I18N-LangTags perl-I18N-Langinfo perl-IO perl-IO-Compress perl-IO-Socket-IP perl-IO-Zlib perl-IPC-Cmd perl-IPC-Open3 perl-IPC-SysV perl-JSON-PP perl-Locale-Maketext perl-Locale-Maketext-Simple perl-MIME-Base64 perl-Math-BigInt perl-Math-BigInt-FastCalc perl-Math-BigRat perl-Math-Complex perl-Memoize perl-Module-CoreList perl-Module-CoreList-tools perl-Module-Load perl-Module-Load-Conditional perl-Module-Loaded perl-Module-Metadata perl-Module-Signature perl-NDBM_File perl-NEXT perl-Net perl-Net-Ping perl-ODBM_File perl-Opcode perl-POSIX perl-Params-Check perl-PathTools perl-Perl-OSType perl-PerlIO-via-QuotedPrint perl-Pod-Checker perl-Pod-Escapes perl-Pod-Functions perl-Pod-Html perl-Pod-Perldoc perl-Pod-Simple perl-Pod-Usage perl-Safe perl-Scalar-List-Utils perl-Search-Dict perl-SelectSaver perl-SelfLoader perl-Socket perl-Storable perl-Symbol perl-Sys-Hostname perl-Sys-Syslog perl-Term-ANSIColor perl-Term-Cap perl-Term-Complete perl-Term-ReadLine perl-Test perl-Test-Harness perl-Test-Simple perl-Text-Abbrev perl-Text-Balanced perl-Text-ParseWords perl-Text-Tabs+Wrap perl-Thread perl-Thread-Queue perl-Thread-Semaphore perl-Tie perl-Tie-File perl-Tie-Memoize perl-Tie-RefHash perl-Time perl-Time-HiRes perl-Time-Local perl-Time-Piece perl-Unicode-Collate perl-Unicode-Normalize perl-Unicode-UCD perl-User-pwent perl-autodie perl-autouse perl-base perl-bignum perl-blib perl-constant perl-debugger perl-deprecate perl-devel perl-diagnostics perl-doc perl-encoding perl-encoding-warnings perl-experimental perl-fields perl-filetest perl-generators perl-if perl-interpreter perl-less perl-lib perl-libnet perl-libnetcfg perl-libs perl-locale perl-macros perl-meta-notation perl-mro perl-open perl-overload perl-overloading perl-parent perl-perlfaq perl-ph perl-podlators perl-sigtrap perl-sort perl-subs perl-threads perl-threads-shared perl-utils perl-vars perl-version perl-vmsish common fedora-modularity-libmodulemd-357799c/xml_specs/complete/overview.xml000066400000000000000000000071411502446517500261410ustar00rootroot00000000000000 fedora-modularity-libmodulemd-357799c/xml_specs/complete/schema.xsd000066400000000000000000001273141502446517500255360ustar00rootroot00000000000000 XML serialization for modular metadata <https://docs.fedoraproject.org/en-US/modularity/> stored in YUM repositories and interpreted by RPM package managers. A user-visible, non-empty string used as a name for a module, a stream, or a profile. An empty value means unsetting that relation (e.g. unsetting a default stream). A user-visible, non-empty string used as a name for a module, a stream, and an architecture. A string without line-feed, carriage-return, and tab characters. Intended for short, user visible texts. Empty value is possible. A possibly long, multi-line text. End of lines are encoded as line-feeds (U+000A). Empty value is possible. A non-empty license expression. An exact syntax and semantics depends on the targetted distribution. E.g. Fedora and derived distributions follow <https://docs.fedoraproject.org/en-US/legal/license-field/>. An RPM package name. A non-empty string accepted by rpm tool as a package name. A value with ".." substring is forbiden. An RPM version string. A non-empty string accepted by rpm tool as a package version or a package release. A value with ".." substring is forbiden. An RPM and module architecture string. A non-empty string accepted by rpm as an architecture. An SHA-256 digest. An SHA-512 digest. A context identifier of a module. A context distinguishes flavours of stream. The flavours usually differ by module dependencies. It can be used for building the same piece of software against different versions of a library or a programming language. Or simply for different releases of a distribution. An empty value means no context, not specific to a context. A context identifier of a module. A context distinguishes flavours of stream. The flavours usually differ by module dependencies. It can be used for building the same piece of software against different versions of a library or a programming language. Or simply for different releases of a distribution. A timestamp expressed as a number of seconds since the beginning of Unix epoch. An identifier of an intent. An empty string denotes other intents. An identifier of a locale according to GNU libc. I.e. a 2-letter (or 3-letter if 2-letter code is not available) ISO 639 language code, optionally followed by an underscore and a 2-letter ISO 3166 country code, optionally followed by a commercial at and a modifier (variant) code. E.g. "sr", "sr_RS", "sr@latin", or "sr_RS@latin". (A codeset character set is not used here because it's implicit from the XML character set.) See setlocale(3) manual and gettexts info pages. To ensure a canonical form, here the language code must be lower-cased, the country code upper-cased and the modifier code lower-cased. A dependency on another module. A stream of the module which also must be enabled by the package manager. If this element exists multiple times, any of these streams satisfy. It this element does not exist, any stream satisfies. A stream of the module which must not be enabled by the package manager. If this element exists multiple times, none of these streams must be enabled. It this element is empty, no stream of the module must be enabled. If a stream is defined to conflict and to be required at the same time, the stream will conflict. A name of the module this build depends on. A module build must satisfy all dependencies listed here. A module build must satisfy at least one dependencies-and set of dependencies. When this particular support level ends for for this stream. The support includes that date, it becomes void the next day. An identifier for this service level. A time after which the support level does not exist. Licenses pertaining this stream. A license of the modular metadata. Multiple elements imply a logical AND. A license of the RPM packages. Multiple elements imply a logical AND. Links to (usually upstream) places pertaining the packaged software. A home page. A documentation. A feature and bug tracking system. A profile of the stream is a group of packages which can be installed by passing the profile name to a package manager. An identifier of the profile. It must be unique in the build. It's scope is a stream of the build. An explanation of the profile. An RPM package which belongs to this stream. A name of the RPM package. An epoch number of the RPM package. If the package seems having no epoch, it's implicit 0. A version of the RPM package. A release of the RPM package. An architecture of the RPM package. Source packages have a distinct value. An optional SHA-256 digest of a content of the RPM package file. An optional SHA-512 digest of a content of the RPM package file. A set of RPM packages which were built together as a functional unit and metadata about them. A binary package name which is intended for a use and its interface (name, file names, API, etc.) is guaranteed to remain stable and compatible for the whole life of this stream. A binary package name which used to be part of this stream (in the older versions) but not anymore and a package manager should stop hiding the same named nonmodular packages. That is make the same-name nonmodular packages available again. A version of a build of stream. A package manager uses a build with the highest version in a particular context and architecture with satisfied dependencies to obtain user-visible data, like a stream description or profiles. The only exception are RPM packages (nevra elements) which are gathered over all versions of the given stream, context, and architecture. To speed up processing, producers are advised to sort builds by version in numerical, descending order. A context of a build of a a stream. A context distinguishes flavours of stream. The flavours usually differ by modular dependencies. It can be used for building the same piece of software against different versions of a library or a programming language. Or simply for different releases of a distribution. If "static" attribute is true, the context value identifies an upgrade path (sorted by a version) which a package manager follows to upgrade from one module build to another. If "static" attribute is false, the upgrade path is build from module builds whose dependencies are the same. If this attribute is true, the context value identifies an upgrade path (sorted by a version) which a package manager follows to upgrade from one module build to another. If this attribute is false, the upgrade path is build from module builds whose dependencies are the same regardless of the context. An architecture of the module build. A short, one-line, description of the stream. A long, multi-line description of the stream. A set of default profiles for this particular intent. When merging default-profile intents, the latest tree replaces all previous definitions atomically. Each occurrence sets this profile as a default one. Multiple occurrences creates a list of default profiles. No occurrence empties the list of the default profiles. An identifier of the intent. A missing or empty attribute means a global default applying to other unspecified intents. Specify a list of profiles to be installed by a package manager when a stream is requested to be installed without specifying a particular profile. The default profiles can differ by a variant of a distribution, called intent here. When merging default-profiles from multiple indices, all default-profiles apply cumulatively in the ascending order of this attribute. A module stream identification. An end of life of a stream. If this element exists, it defines a new stream which replaces the obsoleted one. A package manager should offer a user to upgrade to that new stream. If the attribute exists, it's the furthest time when the stream/context is supported. After that time the stream/context becomes obsolete and a package manager should warn about it. If the attribute doesn't exist, it means it's obsolete right now. A user visible explanation. It can carry a reason or instructions for the upgrade. Define an end of life of a stream or an end of life of a specific context of the stream. It optionally can point to a replacement. If this element exists, it defines an end of life of the (context of the) stream. Otherwise, the (context of the) stream will be unobsoleted. I.e.: If this is a context-nonspecific reset, it cancels obsoleteness for all contexts. If this is a context-specific reset, it only cancels obsoleteness of the specific context. When merging context-nonspecific obsoletes from multiple indices, the latest obsolete definition according to this attribute overrides older definitions, including resets, including context-specific definitions. When merging context-specific obsoletes, the same rule applies to obsoletes of that context. Later context-specific obsolete overrides former context-specific definitions, and overrides context-nonspecific definition for that context. I.e., having a context-specific obsolete not older than a nonspecific one retains the nonspecific one and in addition overrides the specified context. Contrary, having a context-nonspecific obsolete newer makes the previous context-specific obsolete void. If there are both context-nonspecific and context-specific obsoletes with the same modified timestamp, first the nonspecific one is applied and then the specific one is applied. If this attribute exists and is nonempty, the obsolete pertains only module builds of that static context of this stream. It cannot apply to builds with a nonstatic context. Otherwise, the obsolete pertains all contexts of this stream. A translatation of a module stream. A translation for a /index/module/stream/build/@summary. If missing, unsets. A translation for a /index/module/stream/build/@description. If missing, unsets. A translation of a profile description. An identifier of the profile. It must be unique in the stream. A translation for /index/module/stream/build/profile/@description. If missing, unsets. A translation of an obsolete message. If this attribute is nonempty, this translation pertains obsoletes of only that context. Otherwise, it pertains obsoletes nonspecific to a context. A translation for /index/module/stream/obsolete/@message. If missing, unsets. The translated strings into a particular language. It's a sequence of translations for a build, profiles, and obsoletes. Each of them is optional, but at at least one must be specified. A translation of a build applies to all builds of that stream. Hence the sequence can contain at most one build translation. A translation of a profile applies to the named profile. Hence the sequence can contain multiple profile translations. A translation without naming a context applies to the context-nonspecific obsolete. A translation naming a context applies to the context-specific obsolete. Hence the sequence can contain multiple obsolete translatations. A locale identifier according to GNU libc. Without a codeset part. Translated user-visible messages and descriptions pertaining a stream. When merging translations from multiple indices, translations accumulate and newer, according to this attribute, translated builds, profiles, and obsoletes replace older ones, independently. A stream is a version, a release, a variant of a software. It is identified by an in-module unique, short, identifier-like name. A module-stream pair is globally unique. Streams of a single module are mutually exclusive for an installation. A default stream for this particular intent. When merging default-streams, the latest tree replaces all previous definitions atomically. An identifier of the intent. An empty or missing attribute means a global default applying to other unspecified intents. The value must be unique. An identifier of the default stream. An empty or missing attribute means unsetting the, possibly previously defined, default stream. A stream of the module a package manager prefers when a user request to install a module without specifying a particular stream. The default stream can vary according to a variant of a distribution the user has installed. The variant is called an intent here. When merging default-streams from multiple indices, all default-streams apply cumulatively in the ascending order of this attribute. A module is a collection of RPM packages constituting a particular software. It is identified by a unique, short, identifier-like name. A root element for all modular metadata. To speed up processing, producers are advised to sort streams by names in lexicographical, ascending order. A major version of this index format. Future incompatible versions of the format will have a distinct version number. Implementations which do not support this version are advised to reject documents of this version. A minor revision of this index format version. Future compatible revisions of the format will have a distinct revsion number, but retain unchanged major version number. Implementations which do not support this revision, but support the major version are advised to process the document. Consuming implementations are not advised to validate the input documents against this XML schema because this schema only fits to this revision and performs a strict validation. To speed up processing, producers are advised to sort modules by names in lexicographical, ascending order. fedora-modularity-libmodulemd-357799c/xml_specs/complete/tests/000077500000000000000000000000001502446517500247105ustar00rootroot00000000000000fedora-modularity-libmodulemd-357799c/xml_specs/complete/tests/Makefile000066400000000000000000000014051502446517500263500ustar00rootroot00000000000000SCHEMA = ../schema.xsd GOOD = $(wildcard good/*.xml) BAD = $(wildcard bad/*.xml) GOOD_OUT = $(patsubst %.xml,%.out,$(GOOD)) BAD_OUT = $(patsubst %.xml,%.out,$(BAD)) .PHONY: bad check example good check: bad good example example: $(SCHEMA) ../example.xml xmllint --noout --schema "$(SCHEMA)" ../example.xml good: $(GOOD_OUT) bad: $(BAD_OUT) good/%.out: $(SCHEMA) good/%.xml xmllint --noout --schema "$(SCHEMA)" good/$*.xml .ONESHELL: bad/%.out: $(SCHEMA) bad/%.xml @xmllint --noout --schema "$(SCHEMA)" bad/$*.xml 2>/dev/null RETVAL=$$? if [ "$$RETVAL" == 3 ]; then echo "bad/$*.xml fails to validate as expected" exit 0 fi if [ "$$RETVAL" == 0 ]; then echo "bad/$*.xml unexpectedly validated" else echo "bad/$*.xml failed to be processed" fi exit 1 fedora-modularity-libmodulemd-357799c/xml_specs/complete/tests/bad/000077500000000000000000000000001502446517500254365ustar00rootroot00000000000000fedora-modularity-libmodulemd-357799c/xml_specs/complete/tests/bad/duplicate_build_profile_name.xml000066400000000000000000000007221502446517500340320ustar00rootroot00000000000000 MIT duplicate_build_profile_package.xml000066400000000000000000000010321502446517500344210ustar00rootroot00000000000000fedora-modularity-libmodulemd-357799c/xml_specs/complete/tests/bad MIT a a fedora-modularity-libmodulemd-357799c/xml_specs/complete/tests/bad/duplicate_context_obsoletes.xml000066400000000000000000000005641502446517500337620ustar00rootroot00000000000000 duplicate_contextless_obsoletes.xml000066400000000000000000000005471502446517500345730ustar00rootroot00000000000000fedora-modularity-libmodulemd-357799c/xml_specs/complete/tests/bad fedora-modularity-libmodulemd-357799c/xml_specs/complete/tests/bad/duplicate_default_profile.xml000066400000000000000000000006151502446517500333600ustar00rootroot00000000000000 a a fedora-modularity-libmodulemd-357799c/xml_specs/complete/tests/bad/duplicate_default_stream.xml000066400000000000000000000004171502446517500332130ustar00rootroot00000000000000 duplicate_default_stream_intent.xml000066400000000000000000000004651502446517500345200ustar00rootroot00000000000000fedora-modularity-libmodulemd-357799c/xml_specs/complete/tests/bad fedora-modularity-libmodulemd-357799c/xml_specs/complete/tests/bad/duplicate_module_name.xml000066400000000000000000000002241502446517500324750ustar00rootroot00000000000000 duplicate_module_stream_build_license_content.xml000066400000000000000000000007011502446517500374040ustar00rootroot00000000000000fedora-modularity-libmodulemd-357799c/xml_specs/complete/tests/bad MIT MIT MIT duplicate_module_stream_build_license_module.xml000066400000000000000000000006241502446517500372230ustar00rootroot00000000000000fedora-modularity-libmodulemd-357799c/xml_specs/complete/tests/bad MIT MIT duplicate_module_stream_servicelevel.xml000066400000000000000000000007351502446517500355500ustar00rootroot00000000000000fedora-modularity-libmodulemd-357799c/xml_specs/complete/tests/bad MIT fedora-modularity-libmodulemd-357799c/xml_specs/complete/tests/bad/duplicate_profile_intent.xml000066400000000000000000000005061502446517500332340ustar00rootroot00000000000000 fedora-modularity-libmodulemd-357799c/xml_specs/complete/tests/bad/duplicate_profile_nointent.xml000066400000000000000000000004741502446517500335750ustar00rootroot00000000000000 fedora-modularity-libmodulemd-357799c/xml_specs/complete/tests/bad/duplicate_stream_name.xml000066400000000000000000000003031502446517500325010ustar00rootroot00000000000000 duplicate_translation_context_obsoletes.xml000066400000000000000000000006451502446517500363210ustar00rootroot00000000000000fedora-modularity-libmodulemd-357799c/xml_specs/complete/tests/bad duplicate_translation_locale_name.xml000066400000000000000000000004721502446517500350130ustar00rootroot00000000000000fedora-modularity-libmodulemd-357799c/xml_specs/complete/tests/bad duplicate_translation_locale_obsolete_context.xml000066400000000000000000000006071502446517500374530ustar00rootroot00000000000000fedora-modularity-libmodulemd-357799c/xml_specs/complete/tests/bad duplicate_translation_locale_obsolete_nocontext.xml000066400000000000000000000005731502446517500400120ustar00rootroot00000000000000fedora-modularity-libmodulemd-357799c/xml_specs/complete/tests/bad duplicate_translation_locale_profile.xml000066400000000000000000000005771502446517500355410ustar00rootroot00000000000000fedora-modularity-libmodulemd-357799c/xml_specs/complete/tests/bad fedora-modularity-libmodulemd-357799c/xml_specs/complete/tests/bad/empty_translation_locale.xml000066400000000000000000000004261502446517500332550ustar00rootroot00000000000000 invalid_build_context_max_length.xml000066400000000000000000000005651502446517500346660ustar00rootroot00000000000000fedora-modularity-libmodulemd-357799c/xml_specs/complete/tests/bad MIT fedora-modularity-libmodulemd-357799c/xml_specs/complete/tests/bad/invalid_build_nevra_sha256.xml000066400000000000000000000010111502446517500332410ustar00rootroot00000000000000 MIT fedora-modularity-libmodulemd-357799c/xml_specs/complete/tests/bad/invalid_build_nevra_sha512.xml000066400000000000000000000010111502446517500332340ustar00rootroot00000000000000 MIT fedora-modularity-libmodulemd-357799c/xml_specs/complete/tests/bad/invalid_module_architecture.xml000066400000000000000000000006021502446517500337130ustar00rootroot00000000000000 MIT fedora-modularity-libmodulemd-357799c/xml_specs/complete/tests/bad/invalid_module_name_colon.xml000066400000000000000000000001711502446517500333440ustar00rootroot00000000000000 fedora-modularity-libmodulemd-357799c/xml_specs/complete/tests/bad/invalid_module_name_empty.xml000066400000000000000000000001661502446517500333740ustar00rootroot00000000000000 fedora-modularity-libmodulemd-357799c/xml_specs/complete/tests/bad/invalid_module_name_maxlength.xml000066400000000000000000000005661502446517500342310ustar00rootroot00000000000000 fedora-modularity-libmodulemd-357799c/xml_specs/complete/tests/bad/invalid_module_name_nonascii.xml000066400000000000000000000002051502446517500340330ustar00rootroot00000000000000 fedora-modularity-libmodulemd-357799c/xml_specs/complete/tests/bad/invalid_module_name_space.xml000066400000000000000000000001711502446517500333250ustar00rootroot00000000000000 invalid_module_stream_license_newline.xml000066400000000000000000000006171502446517500356760ustar00rootroot00000000000000fedora-modularity-libmodulemd-357799c/xml_specs/complete/tests/bad MIT MIT invalid_module_stream_servicelevel_name_empty.xml000066400000000000000000000006331502446517500374370ustar00rootroot00000000000000fedora-modularity-libmodulemd-357799c/xml_specs/complete/tests/bad MIT invalid_module_stream_summary_newline.xml000066400000000000000000000006151502446517500357470ustar00rootroot00000000000000fedora-modularity-libmodulemd-357799c/xml_specs/complete/tests/bad MIT invalid_module_stream_translation_summary_newline.xml000066400000000000000000000005561502446517500403710ustar00rootroot00000000000000fedora-modularity-libmodulemd-357799c/xml_specs/complete/tests/bad invalid_package_name_maxlength.xml000066400000000000000000000012661502446517500342560ustar00rootroot00000000000000fedora-modularity-libmodulemd-357799c/xml_specs/complete/tests/bad MIT invalid_package_version_maxlength.xml000066400000000000000000000012661502446517500350230ustar00rootroot00000000000000fedora-modularity-libmodulemd-357799c/xml_specs/complete/tests/bad MIT invalid_profile_intent_maxlength.xml000066400000000000000000000010341502446517500346750ustar00rootroot00000000000000fedora-modularity-libmodulemd-357799c/xml_specs/complete/tests/bad invalid_translation_locale_name_empty.xml000066400000000000000000000005121502446517500357000ustar00rootroot00000000000000fedora-modularity-libmodulemd-357799c/xml_specs/complete/tests/bad invalid_translation_locale_name_hyphen.xml000066400000000000000000000005171502446517500360420ustar00rootroot00000000000000fedora-modularity-libmodulemd-357799c/xml_specs/complete/tests/bad missing_module_stream_build_license_module.xml000066400000000000000000000006101502446517500367150ustar00rootroot00000000000000fedora-modularity-libmodulemd-357799c/xml_specs/complete/tests/bad MIT missing_module_stream_servicelevel_end.xml000066400000000000000000000006341502446517500360730ustar00rootroot00000000000000fedora-modularity-libmodulemd-357799c/xml_specs/complete/tests/bad MIT fedora-modularity-libmodulemd-357799c/xml_specs/complete/tests/good/000077500000000000000000000000001502446517500256405ustar00rootroot00000000000000fedora-modularity-libmodulemd-357799c/xml_specs/complete/tests/good/default_stream_intent.xml000066400000000000000000000004071502446517500327430ustar00rootroot00000000000000 fedora-modularity-libmodulemd-357799c/xml_specs/complete/tests/good/default_stream_intentless.xml000066400000000000000000000006001502446517500336250ustar00rootroot00000000000000 fedora-modularity-libmodulemd-357799c/xml_specs/complete/tests/good/default_stream_reset.xml000066400000000000000000000007341502446517500325670ustar00rootroot00000000000000 fedora-modularity-libmodulemd-357799c/xml_specs/complete/tests/good/default_stream_with_intent.xml000066400000000000000000000007661502446517500340060ustar00rootroot00000000000000 fedora-modularity-libmodulemd-357799c/xml_specs/complete/tests/good/empty_texts.xml000066400000000000000000000025351502446517500307540ustar00rootroot00000000000000 MIT MIT fedora-modularity-libmodulemd-357799c/xml_specs/complete/tests/good/module_stream_build_license.xml000066400000000000000000000021551502446517500341060ustar00rootroot00000000000000 MIT MIT GPL-3.0-or-later MIT GPL-3.0-or-later MIT MIT GPL-3.0-or-later module_stream_servicelevel_name.xml000066400000000000000000000007421502446517500347160ustar00rootroot00000000000000fedora-modularity-libmodulemd-357799c/xml_specs/complete/tests/good MIT module_without_static_attribute.xml000066400000000000000000000005771502446517500350160ustar00rootroot00000000000000fedora-modularity-libmodulemd-357799c/xml_specs/complete/tests/good MIT multiline_module_stream_description.xml000066400000000000000000000011161502446517500356270ustar00rootroot00000000000000fedora-modularity-libmodulemd-357799c/xml_specs/complete/tests/good MIT fedora-modularity-libmodulemd-357799c/xml_specs/complete/tests/good/multiline_obsolete_message.xml000066400000000000000000000007141502446517500337660ustar00rootroot00000000000000 multiline_profile_description.xml000066400000000000000000000013061502446517500344300ustar00rootroot00000000000000fedora-modularity-libmodulemd-357799c/xml_specs/complete/tests/good MIT a multiple_build_nevra_checksums.xml000066400000000000000000000020141502446517500345520ustar00rootroot00000000000000fedora-modularity-libmodulemd-357799c/xml_specs/complete/tests/good MIT fedora-modularity-libmodulemd-357799c/xml_specs/complete/tests/good/multiple_context_obsoletes.xml000066400000000000000000000011731502446517500340420ustar00rootroot00000000000000 fedora-modularity-libmodulemd-357799c/xml_specs/complete/tests/good/package_in_multiple_profiles.xml000066400000000000000000000011301502446517500342540ustar00rootroot00000000000000 MIT a a profile_intent_default_nointent.xml000066400000000000000000000006651502446517500347550ustar00rootroot00000000000000fedora-modularity-libmodulemd-357799c/xml_specs/complete/tests/good same_modified_contextless_and_context_obsoletes.xml000066400000000000000000000011431502446517500401670ustar00rootroot00000000000000fedora-modularity-libmodulemd-357799c/xml_specs/complete/tests/good translation_locale_obsolete_default_nocontext.xml000066400000000000000000000010461502446517500376620ustar00rootroot00000000000000fedora-modularity-libmodulemd-357799c/xml_specs/complete/tests/good fedora-modularity-libmodulemd-357799c/xml_specs/complete/tests/good/translation_locale_subsets.xml000066400000000000000000000051231502446517500340100ustar00rootroot00000000000000 fedora-modularity-libmodulemd-357799c/xml_specs/complete/tests/good/translation_locale_values.xml000066400000000000000000000011541502446517500336170ustar00rootroot00000000000000 fedora-modularity-libmodulemd-357799c/xml_specs/reduced/000077500000000000000000000000001502446517500233515ustar00rootroot00000000000000fedora-modularity-libmodulemd-357799c/xml_specs/reduced/Makefile000066400000000000000000000000501502446517500250040ustar00rootroot00000000000000.PHONY: check check: $(MAKE) -C tests fedora-modularity-libmodulemd-357799c/xml_specs/reduced/doc/000077500000000000000000000000001502446517500241165ustar00rootroot00000000000000fedora-modularity-libmodulemd-357799c/xml_specs/reduced/doc/dependencies000066400000000000000000000012721502446517500264710ustar00rootroot00000000000000YAML format allows multiple sets of dependencies. MBS splits them in stream expansion phase and output modules have probably only a single set of dependencies. Though specification does not prevent from having multiple sets in the output modulemd document which is put to a repository. These multiple sets have a logical OR releation and make modular dependencies algebraically complete. DNF: We do not implement the OR level. And we do not want to implement it. DECISION ======== Remove OR-level of dependencies. Keep only and AND-level. For the sake of simplicity, "dependencies-and" end "dependencies-or" elements will be removed and "dependency" elements moved to "dependencies-or" level. fedora-modularity-libmodulemd-357799c/xml_specs/reduced/doc/intents000066400000000000000000000020121502446517500255200ustar00rootroot00000000000000Alphabet (e.g. a white space) for intent identifiers? Ask Anaconda: What is the grammar, meaning, who does define them? Anaconda: We get "system purpose" data from a subscription manager, user selects one, we push the selection back into the manager. Ask DNF where they get intents from. We install packages and modules with DNF. DNF: We do not implement it, we don't want to detect intents. Anaconda: Anaconda/subscription manager allows setting a system purpose as an arbitrary string. Currently the value is also a display string. Without localization. Some values are in /etc/rhsm/syspurpose/valid_fields.json. Intents were deprecated . Nobody used them and DNF did not implement them. There is no distribution-agnostic way of delivering intents to DNF. DECISION ======== - Allow an arbitrary string. An empty string equals to undefined value. - Removed without a replacement. fedora-modularity-libmodulemd-357799c/xml_specs/reduced/doc/newlines000066400000000000000000000005431502446517500256670ustar00rootroot00000000000000Are stream summaries and obsolete messages multiline? Pros: Compatible with YAML. Cons: Single-line summary is akin to an RPM summary. DNF: They can be single-line. DNF: They can be empty. DNF: A details specification for obsoletes should have mcurlej. DECISION ======== A build summary and license are single-line. Other free-form texts are multi-line. fedora-modularity-libmodulemd-357799c/xml_specs/reduced/doc/obsoletes000066400000000000000000000043271502446517500260460ustar00rootroot00000000000000Index Obsoleted contexts --------------------------------------------------------A B--------------- 1 1 0 0 1 0 1 1 0 1 1 1 1 1 Should context-less obsolete be independend from context obsolete? If independent, which does take precedence? Global-obsolete after a context-obsolete: Should it overlay replacement? Yes. Global-reset after a context-obsolete: Should it unobsolete the context? Context-reset after global-obsolete: Should it unobsolete the context? Models: (1) Global set and reset apply per context: Global-obsolete after a context-obsolete: Does it overlay replacement? Yes. Global-reset after a context-obsolete: Does it unobsolete the context? Yes. Context-reset after global-obsolete: Does it unobsolete the context? Yes. (2) Global set applies per context, global reset takes precedence: Global-obsolete after a context-obsolete: Does it overlay replacement? Yes. Global-reset after a context-obsolete: Does it unobsolete the context? Yes. Context-reset after global-obsolete: Does it unobsolete the context? No. (3) Independent, global set takes precedence: Global-obsolete after a context-obsolete: Does it overlay replacement? Yes. Global-reset after a context-obsolete: Does it unobsolete the context? No. Context-reset after global-obsolete: Does it unobsolete the context? No. (4) YAML implementation: Any reset resets everything. Context-obsolete overlays a global-obsolete. Global-obsolete overlays everything. Context-reset resets only that context, previous global-obsolete remains valid for other contexts. DECISION ======== The rules will follow YAML implementation. An obsoleteness is a per-context property. A set always sets the property, a reset always unsets the property. Always per context. A contextless obsolete (set or reset) is only a shortcut for naming all contexts. fedora-modularity-libmodulemd-357799c/xml_specs/reduced/doc/servicelevels000066400000000000000000000012301502446517500267100ustar00rootroot00000000000000Service levels are defined in Fedora in Product Definition Center which only uses it to lock a dist-git branch and a build in tag in Koji. An exact enumeration of semantics of service level names was never defined. Service levels in Red Hat Enterprise Linux are definined on Application Stream Life Cycle page of Customar Portal. There is only one type of service level and that is end of life. YAML has the service levels as an automatic field filled by MBS. MBS never populated this field. A newer feature called modularity obsoletes effectively replaces the end-of-life service level. DECISION ======== Remove service levels in favor of stream obsoletes. fedora-modularity-libmodulemd-357799c/xml_specs/reduced/doc/translations000066400000000000000000000010741502446517500265640ustar00rootroot00000000000000RFC 1766 was obsoleted by RFC 5646 which allows 3-letter codes and many other subtags. XML formats (xml:lang etc.) use this hyphen-delimeted format. Glibc uses ISO 639 language (2- and 3-letter) codes, optionally followed by an ISO 3166 (2-letter) country code, followed by modifiers (like "sr@Latn"; compare to RFC 5646 "sr-Latn"). DECISION ======== Because RFC 5646 format is more difficult to parse, because YAML libmodulemd already uses glibc format, and because comps group also use glibc format (despite written in XML), XML module format will use glibc format. fedora-modularity-libmodulemd-357799c/xml_specs/reduced/example.xml000066400000000000000000000365251502446517500255410ustar00rootroot00000000000000 default default default common f37 MIT Apache-2.0 CC0-1.0 GPL-1.0-or-later (GPL-1.0-or-later OR Artistic-1.0-Perl) AND Artistic-2.0 AND Unicode-DFS-2016 (GPL-1.0-or-later OR Artistic-1.0-Perl) AND BSD-3-Clause (GPL-1.0-or-later OR Artistic-1.0-Perl) AND CC0-1.0 AND LicenseRef-Fedora-Public-Domain (GPL-1.0-or-later OR Artistic-1.0-Perl) AND FSFAP (GPL-1.0-or-later OR Artistic-1.0-Perl) AND (GPL-2.0-or-later OR Artistic-1.0-Perl) and MIT (GPL-1.0-or-later OR Artistic-1.0-Perl) AND LicenseRef-Fedora-Public-Domain (GPL-1.0-or-later OR Artistic-1.0-Perl) AND Martin-Birgmeier AND Spencer-86 AND MIT AND Unicode-DFS-2016 AND LicenseRef-Fedora-Public-Domain (GPL-1.0-or-later OR Artistic-1.0-Perl) AND MIT (GPL-1.0-or-later OR Artistic-1.0-Perl) AND RSA-MD (GPL-1.0-or-later OR Artistic-1.0-Perl) AND Unicode-DFS-2015 (GPL-1.0-or-later OR Artistic-1.0-Perl) AND Unicode-DFS-2016 AND LicenseRef-Fedora-Public-Domain (GPL-1.0-or-later OR Artistic-1.0-Perl) AND Unicode-DFS-2016 (GPL-1.0-or-later OR Artistic-1.0-Perl) AND Zlib GPL-1.0-or-later OR Artistic-1.0-Perl GPL-2.0-or-later OR Artistic-1.0-Perl GPL-3.0-or-later MIT TTWL perl perl-interpreter perl perl-Archive-Tar perl-Attribute-Handlers perl-AutoLoader perl-AutoSplit perl-B perl-Benchmark perl-CPAN perl-CPAN-Meta perl-CPAN-Meta-Requirements perl-CPAN-Meta-YAML perl-Carp perl-Class-Struct perl-Compress-Raw-Bzip2 perl-Compress-Raw-Zlib perl-Config-Extensions perl-Config-Perl-V perl-DBM_Filter perl-DB_File perl-Data-Dumper perl-Devel-PPPort perl-Devel-Peek perl-Devel-SelfStubber perl-Digest perl-Digest-MD5 perl-Digest-SHA perl-Digest-SHA1 perl-DirHandle perl-Dumpvalue perl-DynaLoader perl-Encode perl-Encode-devel perl-English perl-Env perl-Errno perl-Exporter perl-ExtUtils-CBuilder perl-ExtUtils-Command perl-ExtUtils-Constant perl-ExtUtils-Embed perl-ExtUtils-Install perl-ExtUtils-MM-Utils perl-ExtUtils-MakeMaker perl-ExtUtils-Manifest perl-ExtUtils-Miniperl perl-ExtUtils-ParseXS perl-Fcntl perl-File-Basename perl-File-Compare perl-File-Copy perl-File-DosGlob perl-File-Fetch perl-File-Find perl-File-Path perl-File-Temp perl-File-stat perl-FileCache perl-FileHandle perl-Filter perl-Filter-Simple perl-FindBin perl-GDBM_File perl-Getopt-Long perl-Getopt-Std perl-HTTP-Tiny perl-Hash-Util perl-Hash-Util-FieldHash perl-I18N-Collate perl-I18N-LangTags perl-I18N-Langinfo perl-IO perl-IO-Compress perl-IO-Socket-IP perl-IO-Zlib perl-IPC-Cmd perl-IPC-Open3 perl-IPC-SysV perl-JSON-PP perl-Locale-Maketext perl-Locale-Maketext-Simple perl-MIME-Base64 perl-Math-BigInt perl-Math-BigInt-FastCalc perl-Math-BigRat perl-Math-Complex perl-Memoize perl-Module-CoreList perl-Module-CoreList-tools perl-Module-Load perl-Module-Load-Conditional perl-Module-Loaded perl-Module-Metadata perl-Module-Signature perl-NDBM_File perl-NEXT perl-Net perl-Net-Ping perl-ODBM_File perl-Opcode perl-POSIX perl-Params-Check perl-PathTools perl-Perl-OSType perl-PerlIO-via-QuotedPrint perl-Pod-Checker perl-Pod-Escapes perl-Pod-Functions perl-Pod-Html perl-Pod-Perldoc perl-Pod-Simple perl-Pod-Usage perl-Safe perl-Scalar-List-Utils perl-Search-Dict perl-SelectSaver perl-SelfLoader perl-Socket perl-Storable perl-Symbol perl-Sys-Hostname perl-Sys-Syslog perl-Term-ANSIColor perl-Term-Cap perl-Term-Complete perl-Term-ReadLine perl-Test perl-Test-Harness perl-Test-Simple perl-Text-Abbrev perl-Text-Balanced perl-Text-ParseWords perl-Text-Tabs+Wrap perl-Thread perl-Thread-Queue perl-Thread-Semaphore perl-Tie perl-Tie-File perl-Tie-Memoize perl-Tie-RefHash perl-Time perl-Time-HiRes perl-Time-Local perl-Time-Piece perl-Unicode-Collate perl-Unicode-Normalize perl-Unicode-UCD perl-User-pwent perl-autodie perl-autouse perl-base perl-bignum perl-blib perl-constant perl-debugger perl-deprecate perl-devel perl-diagnostics perl-doc perl-encoding perl-encoding-warnings perl-experimental perl-fields perl-filetest perl-generators perl-if perl-interpreter perl-less perl-lib perl-libnet perl-libnetcfg perl-libs perl-locale perl-macros perl-meta-notation perl-mro perl-open perl-overload perl-overloading perl-parent perl-perlfaq perl-ph perl-podlators perl-sigtrap perl-sort perl-subs perl-threads perl-threads-shared perl-utils perl-vars perl-version perl-vmsish common fedora-modularity-libmodulemd-357799c/xml_specs/reduced/overview.xml000066400000000000000000000054621502446517500257500ustar00rootroot00000000000000 fedora-modularity-libmodulemd-357799c/xml_specs/reduced/schema.xsd000066400000000000000000001132641502446517500253400ustar00rootroot00000000000000 XML serialization for modular metadata <https://docs.fedoraproject.org/en-US/modularity/> stored in YUM repositories and interpreted by RPM package managers. A user-visible, non-empty string used as a name for a module, a stream, or a profile. An empty value means unsetting that relation (e.g. unsetting a default stream). A user-visible, non-empty string used as a name for a module, a stream, and an architecture. A string without line-feed, carriage-return, and tab characters. Intended for short, user visible texts. Empty value is possible. A possibly long, multi-line text. End of lines are encoded as line-feeds (U+000A). Empty value is possible. A non-empty license expression. An exact syntax and semantics depends on the targetted distribution. E.g. Fedora and derived distributions follow <https://docs.fedoraproject.org/en-US/legal/license-field/>. An RPM package name. A non-empty string accepted by rpm tool as a package name. A value with ".." substring is forbiden. An RPM version string. A non-empty string accepted by rpm tool as a package version or a package release. A value with ".." substring is forbiden. An RPM and module architecture string. A non-empty string accepted by rpm as an architecture. A context identifier of a module. A context distinguishes flavours of stream. The flavours usually differ by module dependencies. It can be used for building the same piece of software against different versions of a library or a programming language. Or simply for different releases of a distribution. An empty value means no context, not specific to a context. A context identifier of a module. A context distinguishes flavours of stream. The flavours usually differ by module dependencies. It can be used for building the same piece of software against different versions of a library or a programming language. Or simply for different releases of a distribution. A timestamp expressed as a number of seconds since the beginning of Unix epoch. An identifier of a locale according to GNU libc. I.e. a 2-letter (or 3-letter if 2-letter code is not available) ISO 639 language code, optionally followed by an underscore and a 2-letter ISO 3166 country code, optionally followed by a commercial at and a modifier (variant) code. E.g. "sr", "sr_RS", "sr@latin", or "sr_RS@latin". (A codeset character set is not used here because it's implicit from the XML character set.) See setlocale(3) manual and gettexts info pages. To ensure a canonical form, here the language code must be lower-cased, the country code upper-cased and the modifier code lower-cased. A dependency on another module. A stream of the module which also must be enabled by the package manager. If this element exists multiple times, any of these streams satisfy. It this element does not exist, any stream satisfies. A stream of the module which must not be enabled by the package manager. If this element exists multiple times, none of these streams must be enabled. It this element is empty, no stream of the module must be enabled. If a stream is defined to conflict and to be required at the same time, the stream will conflict. A name of the module this build depends on. Licenses pertaining this stream. A license of the modular metadata. Multiple elements imply a logical AND. A license of the RPM packages. Multiple elements imply a logical AND. Links to (usually upstream) places pertaining the packaged software. A home page. A documentation. A feature and bug tracking system. A profile of the stream is a group of packages which can be installed by passing the profile name to a package manager. An identifier of the profile. It must be unique in the build. It's scope is a stream of the build. An explanation of the profile. An RPM package which belongs to this stream. A name of the RPM package. An epoch number of the RPM package. If the package seems having no epoch, it's implicit 0. A version of the RPM package. A release of the RPM package. An architecture of the RPM package. Source packages have a distinct value. A set of RPM packages which were built together as a functional unit and metadata about them. A binary package name which is intended for a use and its interface (name, file names, API, etc.) is guaranteed to remain stable and compatible for the whole life of this stream. A binary package name which used to be part of this stream (in the older versions) but not anymore and a package manager should stop hiding the same named nonmodular packages. That is make the same-name nonmodular packages available again. A version of a build of stream. A package manager uses a build with the highest version in a particular context and architecture with satisfied dependencies to obtain user-visible data, like a stream description or profiles. The only exception are RPM packages (nevra elements) which are gathered over all versions of the given stream, context, and architecture. To speed up processing, producers are advised to sort builds by version in numerical, descending order. A context of a build of a a stream. A context distinguishes flavours of stream. The flavours usually differ by modular dependencies. It can be used for building the same piece of software against different versions of a library or a programming language. Or simply for different releases of a distribution. If "static" attribute is true, the context value identifies an upgrade path (sorted by a version) which a package manager follows to upgrade from one module build to another. If "static" attribute is false, the upgrade path is build from module builds whose dependencies are the same. If this attribute is true, the context value identifies an upgrade path (sorted by a version) which a package manager follows to upgrade from one module build to another. If this attribute is false, the upgrade path is build from module builds whose dependencies are the same regardless of the context. An architecture of the module build. A short, one-line, description of the stream. A long, multi-line description of the stream. Specify a list of profiles to be installed by a package manager when a stream is requested to be installed without specifying a particular profile. Each occurrence sets this profile as a default one. Multiple occurrences creates a list of default profiles. No occurrence empties the list of the default profiles. When merging default-profiles from multiple indices, the latest tree replaces all previous definitions. A module stream identification. An end of life of a stream. If this element exists, it defines a new stream which replaces the obsoleted one. A package manager should offer a user to upgrade to that new stream. If the attribute exists, it's the furthest time when the stream/context is supported. After that time the stream/context becomes obsolete and a package manager should warn about it. If the attribute doesn't exist, it means it's obsolete right now. A user visible explanation. It can carry a reason or instructions for the upgrade. Define an end of life of a stream or an end of life of a specific context of the stream. It optionally can point to a replacement. If this element exists, it defines an end of life of the (context of the) stream. Otherwise, the (context of the) stream will be unobsoleted. I.e.: If this is a context-nonspecific reset, it cancels obsoleteness for all contexts. If this is a context-specific reset, it only cancels obsoleteness of the specific context. When merging context-nonspecific obsoletes from multiple indices, the latest obsolete definition according to this attribute overrides older definitions, including resets, including context-specific definitions. When merging context-specific obsoletes, the same rule applies to obsoletes of that context. Later context-specific obsolete overrides former context-specific definitions, and overrides context-nonspecific definition for that context. I.e., having a context-specific obsolete not older than a nonspecific one retains the nonspecific one and in addition overrides the specified context. Contrary, having a context-nonspecific obsolete newer makes the previous context-specific obsolete void. If there are both context-nonspecific and context-specific obsoletes with the same modified timestamp, first the nonspecific one is applied and then the specific one is applied. If this attribute exists and is nonempty, the obsolete pertains only module builds of that static context of this stream. It cannot apply to builds with a nonstatic context. Otherwise, the obsolete pertains all contexts of this stream. A translatation of a module stream. A translation for a /index/module/stream/build/@summary. If missing, unsets. A translation for a /index/module/stream/build/@description. If missing, unsets. A translation of a profile description. An identifier of the profile. It must be unique in the stream. A translation for /index/module/stream/build/profile/@description. If missing, unsets. A translation of an obsolete message. If this attribute is nonempty, this translation pertains obsoletes of only that context. Otherwise, it pertains obsoletes nonspecific to a context. A translation for /index/module/stream/obsolete/@message. If missing, unsets. The translated strings into a particular language. It's a sequence of translations for a build, profiles, and obsoletes. Each of them is optional, but at at least one must be specified. A translation of a build applies to all builds of that stream. Hence the sequence can contain at most one build translation. A translation of a profile applies to the named profile. Hence the sequence can contain multiple profile translations. A translation without naming a context applies to the context-nonspecific obsolete. A translation naming a context applies to the context-specific obsolete. Hence the sequence can contain multiple obsolete translatations. A locale identifier according to GNU libc. Without a codeset part. Translated user-visible messages and descriptions pertaining a stream. When merging translations from multiple indices, translations accumulate and newer, according to this attribute, translated builds, profiles, and obsoletes replace older ones, independently. A stream is a version, a release, a variant of a software. It is identified by an in-module unique, short, identifier-like name. A module-stream pair is globally unique. Streams of a single module are mutually exclusive for an installation. A stream of the module a package manager prefers when a user request to install a module without specifying a particular stream. When merging default-streams from multiple indices, the latest one replaces all previous definitions. An identifier of the default stream. An empty or missing attribute means unsetting the, possibly previously defined, default stream. A module is a collection of RPM packages constituting a particular software. It is identified by a unique, short, identifier-like name. A root element for all modular metadata. To speed up processing, producers are advised to sort streams by names in lexicographical, ascending order. A major version of this index format. Future incompatible versions of the format will have a distinct version number. Implementations which do not support this version are advised to reject documents of this version. A minor revision of this index format version. Future compatible revisions of the format will have a distinct revsion number, but retain unchanged major version number. Implementations which do not support this revision, but support the major version are advised to process the document. Consuming implementations are not advised to validate the input documents against this XML schema because this schema only fits to this revision and performs a strict validation. To speed up processing, producers are advised to sort modules by names in lexicographical, ascending order. fedora-modularity-libmodulemd-357799c/xml_specs/reduced/tests/000077500000000000000000000000001502446517500245135ustar00rootroot00000000000000fedora-modularity-libmodulemd-357799c/xml_specs/reduced/tests/Makefile000066400000000000000000000014051502446517500261530ustar00rootroot00000000000000SCHEMA = ../schema.xsd GOOD = $(wildcard good/*.xml) BAD = $(wildcard bad/*.xml) GOOD_OUT = $(patsubst %.xml,%.out,$(GOOD)) BAD_OUT = $(patsubst %.xml,%.out,$(BAD)) .PHONY: bad check example good check: bad good example example: $(SCHEMA) ../example.xml xmllint --noout --schema "$(SCHEMA)" ../example.xml good: $(GOOD_OUT) bad: $(BAD_OUT) good/%.out: $(SCHEMA) good/%.xml xmllint --noout --schema "$(SCHEMA)" good/$*.xml .ONESHELL: bad/%.out: $(SCHEMA) bad/%.xml @xmllint --noout --schema "$(SCHEMA)" bad/$*.xml 2>/dev/null RETVAL=$$? if [ "$$RETVAL" == 3 ]; then echo "bad/$*.xml fails to validate as expected" exit 0 fi if [ "$$RETVAL" == 0 ]; then echo "bad/$*.xml unexpectedly validated" else echo "bad/$*.xml failed to be processed" fi exit 1 fedora-modularity-libmodulemd-357799c/xml_specs/reduced/tests/bad/000077500000000000000000000000001502446517500252415ustar00rootroot00000000000000fedora-modularity-libmodulemd-357799c/xml_specs/reduced/tests/bad/duplicate_build_profile_name.xml000066400000000000000000000007221502446517500336350ustar00rootroot00000000000000 MIT duplicate_build_profile_package.xml000066400000000000000000000010321502446517500342240ustar00rootroot00000000000000fedora-modularity-libmodulemd-357799c/xml_specs/reduced/tests/bad MIT a a fedora-modularity-libmodulemd-357799c/xml_specs/reduced/tests/bad/duplicate_context_obsoletes.xml000066400000000000000000000005641502446517500335650ustar00rootroot00000000000000 duplicate_contextless_obsoletes.xml000066400000000000000000000005471502446517500343760ustar00rootroot00000000000000fedora-modularity-libmodulemd-357799c/xml_specs/reduced/tests/bad fedora-modularity-libmodulemd-357799c/xml_specs/reduced/tests/bad/duplicate_default_profile.xml000066400000000000000000000005121502446517500331570ustar00rootroot00000000000000 a a fedora-modularity-libmodulemd-357799c/xml_specs/reduced/tests/bad/duplicate_module_name.xml000066400000000000000000000002241502446517500323000ustar00rootroot00000000000000 duplicate_module_stream_build_license_content.xml000066400000000000000000000007011502446517500372070ustar00rootroot00000000000000fedora-modularity-libmodulemd-357799c/xml_specs/reduced/tests/bad MIT MIT MIT duplicate_module_stream_build_license_module.xml000066400000000000000000000006241502446517500370260ustar00rootroot00000000000000fedora-modularity-libmodulemd-357799c/xml_specs/reduced/tests/bad MIT MIT fedora-modularity-libmodulemd-357799c/xml_specs/reduced/tests/bad/duplicate_stream_name.xml000066400000000000000000000003031502446517500323040ustar00rootroot00000000000000 duplicate_translation_context_obsoletes.xml000066400000000000000000000006451502446517500361240ustar00rootroot00000000000000fedora-modularity-libmodulemd-357799c/xml_specs/reduced/tests/bad duplicate_translation_locale_name.xml000066400000000000000000000004721502446517500346160ustar00rootroot00000000000000fedora-modularity-libmodulemd-357799c/xml_specs/reduced/tests/bad duplicate_translation_locale_obsolete_context.xml000066400000000000000000000006071502446517500372560ustar00rootroot00000000000000fedora-modularity-libmodulemd-357799c/xml_specs/reduced/tests/bad duplicate_translation_locale_obsolete_nocontext.xml000066400000000000000000000005731502446517500376150ustar00rootroot00000000000000fedora-modularity-libmodulemd-357799c/xml_specs/reduced/tests/bad duplicate_translation_locale_profile.xml000066400000000000000000000005771502446517500353440ustar00rootroot00000000000000fedora-modularity-libmodulemd-357799c/xml_specs/reduced/tests/bad fedora-modularity-libmodulemd-357799c/xml_specs/reduced/tests/bad/empty_translation_locale.xml000066400000000000000000000004261502446517500330600ustar00rootroot00000000000000 invalid_build_context_max_length.xml000066400000000000000000000005651502446517500344710ustar00rootroot00000000000000fedora-modularity-libmodulemd-357799c/xml_specs/reduced/tests/bad MIT fedora-modularity-libmodulemd-357799c/xml_specs/reduced/tests/bad/invalid_default_profile_empty.xml000066400000000000000000000004361502446517500340560ustar00rootroot00000000000000 invalid_default_profile_maxlenth.xml000066400000000000000000000010361502446517500344560ustar00rootroot00000000000000fedora-modularity-libmodulemd-357799c/xml_specs/reduced/tests/bad aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa fedora-modularity-libmodulemd-357799c/xml_specs/reduced/tests/bad/invalid_module_architecture.xml000066400000000000000000000006021502446517500335160ustar00rootroot00000000000000 MIT fedora-modularity-libmodulemd-357799c/xml_specs/reduced/tests/bad/invalid_module_name_colon.xml000066400000000000000000000001711502446517500331470ustar00rootroot00000000000000 fedora-modularity-libmodulemd-357799c/xml_specs/reduced/tests/bad/invalid_module_name_empty.xml000066400000000000000000000001661502446517500331770ustar00rootroot00000000000000 fedora-modularity-libmodulemd-357799c/xml_specs/reduced/tests/bad/invalid_module_name_maxlength.xml000066400000000000000000000005661502446517500340340ustar00rootroot00000000000000 fedora-modularity-libmodulemd-357799c/xml_specs/reduced/tests/bad/invalid_module_name_nonascii.xml000066400000000000000000000002051502446517500336360ustar00rootroot00000000000000 fedora-modularity-libmodulemd-357799c/xml_specs/reduced/tests/bad/invalid_module_name_space.xml000066400000000000000000000001711502446517500331300ustar00rootroot00000000000000 invalid_module_stream_license_newline.xml000066400000000000000000000006171502446517500355010ustar00rootroot00000000000000fedora-modularity-libmodulemd-357799c/xml_specs/reduced/tests/bad MIT MIT invalid_module_stream_summary_newline.xml000066400000000000000000000006151502446517500355520ustar00rootroot00000000000000fedora-modularity-libmodulemd-357799c/xml_specs/reduced/tests/bad MIT invalid_module_stream_translation_summary_newline.xml000066400000000000000000000005561502446517500401740ustar00rootroot00000000000000fedora-modularity-libmodulemd-357799c/xml_specs/reduced/tests/bad fedora-modularity-libmodulemd-357799c/xml_specs/reduced/tests/bad/invalid_package_name_maxlength.xml000066400000000000000000000012661502446517500341400ustar00rootroot00000000000000 MIT invalid_package_version_maxlength.xml000066400000000000000000000012661502446517500346260ustar00rootroot00000000000000fedora-modularity-libmodulemd-357799c/xml_specs/reduced/tests/bad MIT invalid_translation_locale_name_empty.xml000066400000000000000000000005121502446517500355030ustar00rootroot00000000000000fedora-modularity-libmodulemd-357799c/xml_specs/reduced/tests/bad invalid_translation_locale_name_hyphen.xml000066400000000000000000000005171502446517500356450ustar00rootroot00000000000000fedora-modularity-libmodulemd-357799c/xml_specs/reduced/tests/bad missing_module_stream_build_license_module.xml000066400000000000000000000006101502446517500365200ustar00rootroot00000000000000fedora-modularity-libmodulemd-357799c/xml_specs/reduced/tests/bad MIT fedora-modularity-libmodulemd-357799c/xml_specs/reduced/tests/bad/multiple_default_streams.xml000066400000000000000000000003611502446517500330600ustar00rootroot00000000000000 fedora-modularity-libmodulemd-357799c/xml_specs/reduced/tests/good/000077500000000000000000000000001502446517500254435ustar00rootroot00000000000000fedora-modularity-libmodulemd-357799c/xml_specs/reduced/tests/good/default_profile_reset.xml000066400000000000000000000003421502446517500325320ustar00rootroot00000000000000 fedora-modularity-libmodulemd-357799c/xml_specs/reduced/tests/good/default_profile_set_multiple.xml000066400000000000000000000005161502446517500341210ustar00rootroot00000000000000 foo bar fedora-modularity-libmodulemd-357799c/xml_specs/reduced/tests/good/default_profile_set_single.xml000066400000000000000000000004471502446517500335520ustar00rootroot00000000000000 foo fedora-modularity-libmodulemd-357799c/xml_specs/reduced/tests/good/default_stream_more.xml000066400000000000000000000004321502446517500322050ustar00rootroot00000000000000 fedora-modularity-libmodulemd-357799c/xml_specs/reduced/tests/good/default_stream_reset.xml000066400000000000000000000004101502446517500323610ustar00rootroot00000000000000 fedora-modularity-libmodulemd-357799c/xml_specs/reduced/tests/good/default_stream_set.xml000066400000000000000000000002761502446517500320440ustar00rootroot00000000000000 fedora-modularity-libmodulemd-357799c/xml_specs/reduced/tests/good/empty_texts.xml000066400000000000000000000025351502446517500305570ustar00rootroot00000000000000 MIT MIT fedora-modularity-libmodulemd-357799c/xml_specs/reduced/tests/good/module_stream_build_license.xml000066400000000000000000000021551502446517500337110ustar00rootroot00000000000000 MIT MIT GPL-3.0-or-later MIT GPL-3.0-or-later MIT MIT GPL-3.0-or-later module_without_static_attribute.xml000066400000000000000000000005771502446517500346210ustar00rootroot00000000000000fedora-modularity-libmodulemd-357799c/xml_specs/reduced/tests/good MIT multiline_module_stream_description.xml000066400000000000000000000011161502446517500354320ustar00rootroot00000000000000fedora-modularity-libmodulemd-357799c/xml_specs/reduced/tests/good MIT fedora-modularity-libmodulemd-357799c/xml_specs/reduced/tests/good/multiline_obsolete_message.xml000066400000000000000000000007141502446517500335710ustar00rootroot00000000000000 fedora-modularity-libmodulemd-357799c/xml_specs/reduced/tests/good/multiline_profile_description.xml000066400000000000000000000013061502446517500343120ustar00rootroot00000000000000 MIT a fedora-modularity-libmodulemd-357799c/xml_specs/reduced/tests/good/multiple_context_obsoletes.xml000066400000000000000000000011731502446517500336450ustar00rootroot00000000000000 fedora-modularity-libmodulemd-357799c/xml_specs/reduced/tests/good/package_in_multiple_profiles.xml000066400000000000000000000011301502446517500340570ustar00rootroot00000000000000 MIT a a same_modified_contextless_and_context_obsoletes.xml000066400000000000000000000011431502446517500377720ustar00rootroot00000000000000fedora-modularity-libmodulemd-357799c/xml_specs/reduced/tests/good translation_locale_obsolete_default_nocontext.xml000066400000000000000000000010461502446517500374650ustar00rootroot00000000000000fedora-modularity-libmodulemd-357799c/xml_specs/reduced/tests/good fedora-modularity-libmodulemd-357799c/xml_specs/reduced/tests/good/translation_locale_subsets.xml000066400000000000000000000051231502446517500336130ustar00rootroot00000000000000 fedora-modularity-libmodulemd-357799c/xml_specs/reduced/tests/good/translation_locale_values.xml000066400000000000000000000011541502446517500334220ustar00rootroot00000000000000 fedora-modularity-libmodulemd-357799c/yaml_specs/000077500000000000000000000000001502446517500221005ustar00rootroot00000000000000fedora-modularity-libmodulemd-357799c/yaml_specs/modulemd_defaults_v1.yaml000066400000000000000000000036261502446517500270760ustar00rootroot00000000000000# Document type identifier # `document: modulemd-defaults` describes the default stream and profiles for # a module. document: modulemd-defaults # Module metadata format version version: 1 data: # Module name that the defaults are for, required. module: foo # A 64-bit unsigned integer. Use YYYYMMDDHHMM to easily identify the last # modification time. Use UTC for consistency. # When merging, entries with a newer 'modified' value will override any # earlier values. (optional) modified: 201812071200 # Module stream that is the default for the module, optional. stream: "x.y" # Module profiles indexed by the stream name, optional # This is a dictionary of stream names to a list of default profiles to be # installed. profiles: 'x.y': [] bar: [baz, snafu] # System intents dictionary, optional, deprecated. # Indexed by the intent name. # Overrides stream/profiles for intent. intents: desktop: # Module stream that is the default for the module, required. # Overrides the above values for systems with this intent. stream: "y.z" # Module profiles indexed by the stream name, required # Overrides the above values for systems with this intent. # From the above, foo:x.y has "other" as the value and foo:bar has # no default profile. profiles: 'y.z': [blah] 'x.y': [other] server: # Module stream that is the default for the module, required. # Overrides the above values for systems with this intent. stream: "x.y" # Module profiles indexed by the stream name, required # Overrides the above values for systems with this intent. # From the above foo:x.y and foo:bar have no default profile. profiles: 'x.y': [] fedora-modularity-libmodulemd-357799c/yaml_specs/modulemd_obsoletes_v1.yaml000066400000000000000000000030761502446517500272650ustar00rootroot00000000000000# Document type identifier # `document: modulemd-obsoletes` describes information about a stream obsoleting another one or a stream being EOLed document: modulemd-obsoletes version: 1 data: # A string representing UTC date in ISO 8601 format: YYYY-MM-DDTHH:MMZ # When merging, entries with a newer 'modified' value will override any earlier values. # MANDATORY modified: 2018-05-23T14:25Z # A boolean option to cancel/reset all previously specified obsoletes # Example: repo 'fedora' has Obsoletes:nodejs:12; we want to bring nodejs:12 back in 'updates' # If used, following options will be ignored: eol_date, obsoleted_by # OPTIONAL reset: false # A string representing a Name of a module that is obsoleted # MANDATORY module: nodejs # A string representing a Stream of a module that is obsoleted # MANDATORY stream: "11" # A string representing a Context of a module that is obsoleted # If not specified, all contexts get obsoleted. # NOTE: consider specifying a list of contexts # OPTIONAL context: aabbccddee # A string representing UTC date in ISO 8601 format: YYYY-MM-DDTHH:MMZ # It is strongly recommended to keep HH:MM to 00:00. # If not specified, the module is EOLed immediately. # OPTIONAL eol_date: 2020-03-19T00:00Z # A string describing the change, reason, etc. # MANDATORY message: "Module stream nodejs:11 is no longer supported. It is recommended to switch to nodejs:12" # If a stream is not EOLed but Obsoleted, provide details about the obsoleting stream: # OPTIONAL obsoleted_by: module: nodejs stream: "12" fedora-modularity-libmodulemd-357799c/yaml_specs/modulemd_packager_v2.yaml000066400000000000000000000503701502446517500270430ustar00rootroot00000000000000############################################################################## # Glossary: # # # # build system: The process by which a module is built and packaged. In many # # cases, this will be the Module Build Service tool, but this term is used # # as a catch-all to describe any mechanism for producing a yum repository # # containing modular content from input module metadata files. # # # # # # == Attribute Types == # # # # MANDATORY: Attributes of this type must be filled in by the packager of # # this module. They must also be preserved and provided in the output # # metadata produced by the build system for inclusion into a repository. # # # # OPTIONAL: Attributes of this type may be provided by the packager of this # # module, when appropriate. If they are provided, they must also be # # preserved and provided in the output metadata produced by the build # # system for inclusion into a repository. # # # # AUTOMATIC: Attributes of this type must be present in the repository # # metadata, but they may be left unspecified by the packager. In this case, # # the build system is responsible for generating an appropriate value for # # the attribute and including it in the repository metadata. If the packager # # specifies this attribute explicitly, it must be preserved and provided in # # the output metadata for inclusion into a repository. # # # # The definitions above describe the expected behavior of the build system # # operating in its default configuration. It is permissible for the build # # system to override user-provided entries through non-default operating # # modes. If such changes are made, all items indicated as being required for # # the output repository must still be present. # ############################################################################## # Document type identifier # `document: modulemd-packager` describes the contents of a packager's input # for a module stream. document: modulemd-packager # Module metadata format version version: 2 data: # summary: # A short summary describing the module # # Type: MANDATORY # # Mandatory for module metadata in a yum/dnf repository. summary: An example module # description: # A verbose description of the module # # Type: MANDATORY # # Mandatory for module metadata in a yum/dnf repository. description: >- A module for the demonstration of the metadata format. Also, the obligatory lorem ipsum dolor sit amet goes right here. # license: # Module and content licenses in the Fedora license identifier # format # # Type: MANDATORY license: # module: # Module license # This list covers licenses used for the module metadata and # possibly other files involved in the creation of this specific # module. # # Type: MANDATORY module: - MIT # dependencies: # Module dependencies, if any # A list of dictionaries describing build and runtime dependencies # of this module. Each list item describes a combination of dependencies # this module can be built or run against. # Dependency keys are module names, dependency values are lists of # required streams. The lists can be both inclusive (listing compatible # streams) or exclusive (accepting every stream except for those listed). # An empty list implies all active existing streams are supported. # Requiring multiple streams at build time will result in multiple # builds. Requiring multiple streams at runtime implies the module # is compatible with all of them. If the same module streams are listed # in both the build time and the runtime block, the build tools translate # the runtime block so that it matches the stream the module was built # against. Multiple builds result in multiple output modulemd files. # See below for an example. # The example below illustrates how to build the same module in four # different ways, with varying build time and runtime dependencies. # # Type: OPTIONAL dependencies: # Build on all available platforms except for f27, f28 and epel7 # After build, the runtime dependency will match the one used for # the build. - buildrequires: platform: [-f27, -f28, -epel7] requires: platform: [-f27, -f28, -epel7] # For platform:f27 perform two builds, one with buildtools:v1, another # with buildtools:v2 in the buildroot. Both will also utilize # compatible:v3. At runtime, buildtools isn't required and either # compatible:v3 or compatible:v4 can be installed. - buildrequires: platform: [f27] buildtools: [v1, v2] compatible: [v3] requires: platform: [f27] compatible: [v3, v4] # For platform:f28 builds, require either runtime:a or runtime:b at # runtime. Only one build is performed. - buildrequires: platform: [f28] requires: platform: [f28] runtime: [a, b] # For platform:epel7, build against against all available extras # streams and moreextras:foo and moreextras:bar. The number of builds # in this case will be 2 * . # At runtime, both extras and moreextras will match whatever stream was # used for build. - buildrequires: platform: [epel7] extras: [] moreextras: [foo, bar] requires: platform: [epel7] extras: [] moreextras: [foo, bar] # references: # References to external resources, typically upstream # # Type: OPTIONAL references: # community: # Upstream community website, if it exists # # Type: OPTIONAL community: http://www.example.com/ # documentation: # Upstream documentation, if it exists # # Type: OPTIONAL documentation: http://www.example.com/ # tracker: # Upstream bug tracker, if it exists # # Type: OPTIONAL tracker: http://www.example.com/ # profiles: # Profiles define the end user's use cases for the module. They consist of # package lists of components to be installed by default if the module is # enabled. The keys are the profile names and contain package lists by # component type. There are several profiles defined below. Suggested # behavior for package managers is to just enable repository for selected # module. Then users are able to install packages on their own. If they # select a specific profile, the package manager should install all # packages of that profile. # Defaults to no profile definitions. # # Type: OPTIONAL profiles: # An example profile that defines a set of packages which are meant to # be installed inside a container image artifact. # # Type: OPTIONAL container: rpms: - bar - bar-devel # An example profile that delivers a minimal set of packages to # provide this module's basic functionality. This is meant to be used # on target systems where size of the distribution is a real concern. # # Type: Optional minimal: # A verbose description of the module, optional description: Minimal profile installing only the bar package. rpms: - bar # buildroot: # This is a special reserved profile name. # # This provides a listing of packages that will be automatically # installed into the buildroot of all component builds that are started # after a component builds with its `buildroot: True` option set. # # The primary purpose of this is for building RPMs that change # the build environment, such as those that provide new RPM # macro definitions that can be used by subsequent builds. # # Specifically, it is used to flesh out the build group in koji. # # Type: OPTIONAL buildroot: rpms: - bar-devel # srpm-buildroot: # This is a special reserved profile name. # # This provides a listing of packages that will be automatically # installed into the buildroot of all component builds that are started # after a component builds with its `srpm-buildroot: True` option set. # # The primary purpose of this is for building RPMs that change # the build environment, such as those that provide new RPM # macro definitions that can be used by subsequent builds. # # Very similar to the buildroot profile above, this is used by the # build system to specify any additional packages which should be # installed during the buildSRPMfromSCM step in koji. # # Type: OPTIONAL srpm-buildroot: rpms: - bar-extras # api: # Module API # Defaults to no API. # # Type: OPTIONAL api: # rpms: # The module's public RPM-level API. # A list of binary RPM names that are considered to be the # main and stable feature of the module; binary RPMs not listed # here are considered "unsupported" or "implementation details". # In the example here we don't list the xyz package as it's only # included as a dependency of xxx. However, we list a subpackage # of bar, bar-extras. # Defaults to an empty list. # # Type: OPTIONAL rpms: - bar - bar-extras - bar-devel - baz - xxx # filter: # Module component filters # Defaults to no filters. # # Type: OPTIONAL filter: # rpms: # RPM names not to be included in the module. # By default, all built binary RPMs are included. In the example # we exclude a subpackage of bar, bar-nonfoo from our module. # Defaults to an empty list. # # Type: OPTIONAL rpms: - baz-nonfoo # demodularized: # Artifacts which became non-modular # Defaults to no demodularization. # Type: OPTIONAL demodularized: # rpms: # A list of binary RPM package names which where removed from # a module. This list explains to a package mananger that the packages # are not part of the module anymore and up-to-now same-named masked # non-modular packages should become available again. This enables # moving a package from a module to a set of non-modular packages. The # exact implementation of the demodularization (e.g. whether it # applies to all modules or only to this stream) is defined by the # package manager. # Defaults to an empty list. # # Type: OPTIONAL rpms: - bar-old # components: # Functional components of the module # # Type: OPTIONAL components: # rpms: # RPM content of the module # Keys are the VCS/SRPM names, values dictionaries holding # additional information. # # Type: OPTIONAL rpms: bar: # name: # The real name of the package, if it differs from the key in # this dictionary. Used when bootstrapping to build a # bootstrapping ref before building the package for real. # # Type: OPTIONAL name: bar-real # rationale: # Why is this component present. # A simple, free-form string. # # Type: MANDATORY rationale: We need this to demonstrate stuff. # repository: # Use this repository if it's different from the build # system configuration. # # Type: AUTOMATIC repository: https://pagure.io/bar.git # cache: # Use this lookaside cache if it's different from the # build system configuration. # # Type: AUTOMATIC cache: https://example.com/cache # ref: # Use this specific commit hash, branch name or tag for # the build. If ref is a branch name, the branch HEAD # will be used. If no ref is given, the master branch # is assumed. # # Type: AUTOMATIC ref: 26ca0c0 # buildafter: # Use the "buildafter" value to specify that this component # must be be ordered later than some other entries in this map. # The values of this array come from the keys of this map and # not the real component name to enable bootstrapping. # Use of both buildafter and buildorder in the same document is # prohibited, as they will conflict. # # In this example, 'baz' makes some changes to the default # buildroot that 'bar' must use. # # Note: The use of buildafter is not currently supported by the # Fedora module build system. # # Type: AUTOMATIC # buildafter: # - baz # buildonly: # Use the "buildonly" value to indicate that all artifacts # produced by this component are intended only for building # this component and should be automatically added to the # data.filter.rpms list after the build is complete. # Defaults to "false" if not specified. # # Type: AUTOMATIC buildonly: false # baz builds RPM macros for the other components to use baz: rationale: Demonstrate updating the buildroot contents. # buildroot: # If buildroot is set to True, the packages listed in this # module's 'buildroot' profile will be installed into the # buildroot of any component built in buildorder/buildafter # batches begun after this one, without requiring that those # packages are listed among BuildRequires. # # The primary purpose of this is for building RPMs that change # the build environment, such as those that provide new RPM # macro definitions that can be used by subsequent builds. # # Defaults to "false" if not specified. # # Type: OPTIONAL buildroot: true # srpm-buildroot: # If srpm-buildroot is set to True, the packages listed in this # module's 'srpm-buildroot' profile will be installed into the # buildroot of any component built in buildorder/buildafter # batches begun after this one, without requiring that those # packages are listed among BuildRequires. # # The primary purpose of this is for building RPMs that change # the build environment, such as those that provide new RPM # macro definitions that can be used by subsequent builds. # # Defaults to "false" if not specified. # # Type: OPTIONAL srpm-buildroot: true xxx: rationale: xxx demonstrates arches and multilib. # arches: # xxx is only available on the listed architectures. # Includes specific hardware architectures, not families. # See the data.arch field for details. # Instructs the build system to only build the # component on this specific set of architectures. # If data.buildopts.arches is also specified, # this must be a subset of those architectures. # Defaults to all available arches. # # Type: AUTOMATIC arches: [i686, x86_64] # multilib: # A list of architectures with multilib # installs, i.e. both i686 and x86_64 # versions will be installed on x86_64. # Includes specific hardware architectures, not families. # See the data.arch field for details. # Defaults to no multilib. # # Type: AUTOMATIC multilib: [x86_64] # This package requires a particular version of 'bar' to be # present in order to build correctly, so we inform the build # system not to build this until 'bar' has completed # successfully. # buildafter: # - bar # buildorder: # Build order group # When building, components are sorted by build order tag # and built in batches grouped by their buildorder value. # Built batches are then re-tagged into the buildroot. # Multiple components can have the same buildorder index # to map them into build groups. # Defaults to zero. # Integer, from an interval [-(2^63), +2^63-1]. # In this example, bar and baz are built first in no particular # order, then tagged into the buildroot, then, finally, xxx is # built. # Use of both buildafter and buildorder in the same document is # prohibited, as they will conflict. # # Type: OPTIONAL buildorder: 10 # modules: # Module content of this module # Included modules are built in the shared buildroot, together with # other included content. Keys are module names, values additional # component information. Note this only includes components and their # properties from the referenced module and doesn't inherit any # additional module metadata such as the module's dependencies or # component buildopts. The included components are built in their # defined buildorder as sub-build groups. # # Type: OPTIONAL modules: includedmodule: # rationale: # Why is this module included? # # Type: MANDATORY rationale: Included in the stack, just because. # repository: # Link to VCS repository that contains the modulemd file # if it differs from the buildsystem default configuration. # # Type: AUTOMATIC repository: https://pagure.io/includedmodule.git # ref: # See the rpms ref. # # Type: AUTOMATIC ref: somecoolbranchname # buildorder: # See the rpms buildorder. # # Type: AUTOMATIC buildorder: 100 fedora-modularity-libmodulemd-357799c/yaml_specs/modulemd_packager_v3.yaml000066400000000000000000000546701502446517500270530ustar00rootroot00000000000000############################################################################## # Glossary: # # # # build system: The process by which a module is built and packaged. In many # # cases, this will be the Module Build Service tool, but this term is used # # as a catch-all to describe any mechanism for producing a yum repository # # containing modular content from input module metadata files. # # # # # # == Attribute Types == # # # # MANDATORY: Attributes of this type must be filled in by the packager of # # this module. They must also be preserved and provided in the output # # metadata produced by the build system for inclusion into a repository. # # # # OPTIONAL: Attributes of this type may be provided by the packager of this # # module, when appropriate. If they are provided, they must also be # # preserved and provided in the output metadata produced by the build # # system for inclusion into a repository. # # # # AUTOMATIC: Attributes of this type must be present in the repository # # metadata, but they may be left unspecified by the packager. In this case, # # the build system is responsible for generating an appropriate value for # # the attribute and including it in the repository metadata. If the packager # # specifies this attribute explicitly, it must be preserved and provided in # # the output metadata for inclusion into a repository. # # # # The definitions above describe the expected behavior of the build system # # operating in its default configuration. It is permissible for the build # # system to override user-provided entries through non-default operating # # modes. If such changes are made, all items indicated as being required for # # the output repository must still be present. # ############################################################################## # Document type identifier # `document: modulemd-packager` describes the contents of a packager's input # for a module stream. document: modulemd-packager # Module metadata format version version: 3 data: # name: # The name of the module # Filled in by the build system, using the VCS repository name as the name # of the module. # # Type: AUTOMATIC # # Mandatory for module metadata in a yum/dnf repository. name: foo # stream: # Module update stream # Filled in by the buildsystem, using the VCS branch name as the name of # the stream. # # Type: AUTOMATIC # # Mandatory for module metadata in a yum/dnf repository. stream: latest # summary: # A short summary describing the module # # Type: MANDATORY # # Mandatory for module metadata in a yum/dnf repository. summary: An example module # description: # A verbose description of the module # # Type: MANDATORY # # Mandatory for module metadata in a yum/dnf repository. description: >- A module for the demonstration of the metadata format. Also, the obligatory lorem ipsum dolor sit amet goes right here. # license: # Module license # This list covers licenses used for the module metadata and # possibly other files involved in the creation of this specific # module. If unspecified, the default license for documents of this # type and version is MIT (https://opensource.org/licenses/MIT) # # Type: OPTIONAL license: - MIT # xmd: # Extensible metadata block # A dictionary of user-defined keys and values. # Defaults to an empty dictionary. # # Type: OPTIONAL xmd: some_key: some_data # configurations: # A list of build and dependency configurations # # Each entry in the list represents a build of this module stream against # one platform (usually a distribution release name/number) and optionally # a set of dependencies. # # Type: MANDATORY configurations: # context: # A string of up to ten [a-zA-Z0-9] characters representing a # a build and runtime configuration for this stream. This string is # arbitrary but must be unique in this module stream. # Type: MANDATORY - context: CTX1 # platform: # Defines the distribution and release to build on and run against. # Type: MANDATORY platform: f32 # buildrequires: # A dictionary of the build-time dependencies on other module streams. # Each configuration may depend on a single stream of a dependency. # The dictionary key is the name of the module and the dictionary value # is a single-element list containing the name of the stream. # # Type: Optional buildrequires: appframework: [v1] # requires: # A dictionary of the run-time dependencies on other module streams. # Each configuration may depend on a single stream of a dependency. # The dictionary key is the name of the module and the dictionary value # is a single-element list containing the name of the stream. # # Type: Optional requires: appframework: [v1] # buildopts: # Component build options # Additional per component type module-wide build options. # # IMPORTANT: Due to limitations in the modulemd-stream v2 format, the # buildopts from the first configuration in the list will apply to # ALL configurations when building for modulemd-stream v2. They will # apply separately when building for module-stream v3. # # Type: OPTIONAL buildopts: # rpms: # RPM-specific build options # # Type: OPTIONAL rpms: # macros: # Additional macros that should be defined in the # RPM buildroot, appended to the default set. Care should be # taken so that the newlines are preserved. Literal style # block is recommended, with or without the trailing newline. # # Type: OPTIONAL macros: | %demomacro 1 %demomacro2 %{demomacro}23 # whitelist: # Explicit list of package build names this module will produce. # By default the build system only allows components listed under # data.components.rpms to be built as part of this module. # In case the expected RPM build names do not match the component # names, the list can be defined here. # This list overrides rather then just extends the default. # List of package build names without versions. # # Type: OPTIONAL whitelist: - fooscl-1-bar - fooscl-1-baz - xxx - xyz # arches: # Instructs the build system to only build the # module on this specific set of architectures. # Includes specific hardware architectures, not families. # See the data.arch field in the modulemd-stream spec for details. # Defaults to all available arches. # # Type: OPTIONAL arches: [i686, x86_64] # Alternate example with no dependencies - context: CTX2 platform: f33 # references: # References to external resources, typically upstream # # Type: OPTIONAL references: # community: # Upstream community website, if it exists # # Type: OPTIONAL community: http://www.example.com/ # documentation: # Upstream documentation, if it exists # # Type: OPTIONAL documentation: http://www.example.com/ # tracker: # Upstream bug tracker, if it exists # # Type: OPTIONAL tracker: http://www.example.com/ # profiles: # Profiles define the end user's use cases for the module. They consist of # package lists of components to be installed by default if the module is # enabled. The keys are the profile names and contain package lists by # component type. There are several profiles defined below. Suggested # behavior for package managers is to just enable repository for selected # module. Then users are able to install packages on their own. If they # select a specific profile, the package manager should install all # packages of that profile. # Defaults to no profile definitions. # # Type: OPTIONAL profiles: # An example profile that defines a set of packages which are meant to # be installed inside a container image artifact. # # Type: OPTIONAL container: rpms: - bar - bar-devel # An example profile that delivers a minimal set of packages to # provide this module's basic functionality. This is meant to be used # on target systems where size of the distribution is a real concern. # # Type: Optional minimal: # A verbose description of the module, optional description: Minimal profile installing only the bar package. rpms: - bar # default (boolean): # Whether this profile should be installed if none is explicitly # specified. # # Defaults to "false" if not specified. # # Type: OPTIONAL default: true # buildroot: # This is a special reserved profile name. # # This provides a listing of packages that will be automatically # installed into the buildroot of all component builds that are started # after a component builds with its `buildroot: True` option set. # # The primary purpose of this is for building RPMs that change # the build environment, such as those that provide new RPM # macro definitions that can be used by subsequent builds. # # Specifically, it is used to flesh out the build group in koji. # # Type: OPTIONAL buildroot: rpms: - bar-devel # srpm-buildroot: # This is a special reserved profile name. # # This provides a listing of packages that will be automatically # installed into the buildroot of all component builds that are started # after a component builds with its `srpm-buildroot: True` option set. # # The primary purpose of this is for building RPMs that change # the build environment, such as those that provide new RPM # macro definitions that can be used by subsequent builds. # # Very similar to the buildroot profile above, this is used by the # build system to specify any additional packages which should be # installed during the buildSRPMfromSCM step in koji. # # Type: OPTIONAL srpm-buildroot: rpms: - bar-extras # api: # Module API # Defaults to no API. # # Type: OPTIONAL api: # rpms: # The module's public RPM-level API. # A list of binary RPM names that are considered to be the # main and stable feature of the module; binary RPMs not listed # here are considered "unsupported" or "implementation details". # In the example here we don't list the xyz package as it's only # included as a dependency of xxx. However, we list a subpackage # of bar, bar-extras. # Defaults to an empty list. # # Type: OPTIONAL rpms: - bar - bar-extras - bar-devel - baz - xxx # filter: # Module component filters # Defaults to no filters. # # Type: OPTIONAL filter: # rpms: # RPM names not to be included in the module. # By default, all built binary RPMs are included. In the example # we exclude a subpackage of bar, bar-nonfoo from our module. # Defaults to an empty list. # # Type: OPTIONAL rpms: - baz-nonfoo # demodularized: # Artifacts which became non-modular # Defaults to no demodularization. # Type: OPTIONAL demodularized: # rpms: # A list of binary RPM package names which where removed from # a module. This list explains to a package mananger that the packages # are not part of the module anymore and up-to-now same-named masked # non-modular packages should become available again. This enables # moving a package from a module to a set of non-modular packages. The # exact implementation of the demodularization (e.g. whether it # applies to all modules or only to this stream) is defined by the # package manager. # Defaults to an empty list. # # Type: OPTIONAL rpms: - bar-old # components: # Functional components of the module # # Type: OPTIONAL components: # rpms: # RPM content of the module # Keys are the VCS/SRPM names, values dictionaries holding # additional information. # # Type: OPTIONAL rpms: bar: # name: # The real name of the package, if it differs from the key in # this dictionary. Used when bootstrapping to build a # bootstrapping ref before building the package for real. # # Type: OPTIONAL name: bar-real # rationale: # Why is this component present. # A simple, free-form string. # # Type: MANDATORY rationale: We need this to demonstrate stuff. # repository: # Use this repository if it's different from the build # system configuration. # # Type: AUTOMATIC repository: https://pagure.io/bar.git # cache: # Use this lookaside cache if it's different from the # build system configuration. # # Type: AUTOMATIC cache: https://example.com/cache # ref: # Use this specific commit hash, branch name or tag for # the build. If ref is a branch name, the branch HEAD # will be used. If no ref is given, the build system is # permitted to make reasonable assumptions about the correct # default value. Otherwise, the fall-back is the default branch # for the git repository (commonly 'main'). # # Type: AUTOMATIC ref: 26ca0c0 # buildafter: # Use the "buildafter" value to specify that this component # must be be ordered later than some other entries in this map. # The values of this array come from the keys of this map and # not the real component name to enable bootstrapping. # Use of both buildafter and buildorder in the same document is # prohibited, as they will conflict. # # In this example, 'baz' makes some changes to the default # buildroot that 'bar' must use. # # Note: The use of buildafter is not currently supported by the # Fedora module build system. # # Type: AUTOMATIC # buildafter: # - baz # buildonly: # Use the "buildonly" value to indicate that all artifacts # produced by this component are intended only for building # this component and should be automatically added to the # data.filter.rpms list after the build is complete. # Defaults to "false" if not specified. # # Type: AUTOMATIC buildonly: false # baz builds RPM macros for the other components to use baz: rationale: Demonstrate updating the buildroot contents. # buildroot: # If buildroot is set to True, the packages listed in this # module's 'buildroot' profile will be installed into the # buildroot of any component built in buildorder/buildafter # batches begun after this one, without requiring that those # packages are listed among BuildRequires. # # The primary purpose of this is for building RPMs that change # the build environment, such as those that provide new RPM # macro definitions that can be used by subsequent builds. # # Defaults to "false" if not specified. # # Type: OPTIONAL buildroot: true # srpm-buildroot: # If srpm-buildroot is set to True, the packages listed in this # module's 'srpm-buildroot' profile will be installed into the # buildroot of any component built in buildorder/buildafter # batches begun after this one, without requiring that those # packages are listed among BuildRequires. # # The primary purpose of this is for building RPMs that change # the build environment, such as those that provide new RPM # macro definitions that can be used by subsequent builds. # # Defaults to "false" if not specified. # # Type: OPTIONAL srpm-buildroot: true xxx: rationale: xxx demonstrates arches and multilib. # arches: # xxx is only available on the listed architectures. # Includes specific hardware architectures, not families. # See the data.arch field for details. # Instructs the build system to only build the # component on this specific set of architectures. # If data.buildopts.arches is also specified, # this must be a subset of those architectures. # Defaults to all available arches. # # Type: AUTOMATIC arches: [i686, x86_64] # multilib: # A list of architectures with multilib # installs, i.e. both i686 and x86_64 # versions will be installed on x86_64. # Includes specific hardware architectures, not families. # See the data.arch field for details. # Defaults to no multilib. # # Type: AUTOMATIC multilib: [x86_64] # This package requires a particular version of 'bar' to be # present in order to build correctly, so we inform the build # system not to build this until 'bar' has completed # successfully. # buildafter: # - bar # buildorder: # Build order group # When building, components are sorted by build order tag # and built in batches grouped by their buildorder value. # Built batches are then re-tagged into the buildroot. # Multiple components can have the same buildorder index # to map them into build groups. # Defaults to zero. # Integer, from an interval [-(2^63), +2^63-1]. # In this example, bar and baz are built first in no particular # order, then tagged into the buildroot, then, finally, xxx is # built. # Use of both buildafter and buildorder in the same document is # prohibited, as they will conflict. # # Type: OPTIONAL buildorder: 10 # modules: # Module content of this module # Included modules are built in the shared buildroot, together with # other included content. Keys are module names, values additional # component information. Note this only includes components and their # properties from the referenced module and doesn't inherit any # additional module metadata such as the module's dependencies or # component buildopts. The included components are built in their # defined buildorder as sub-build groups. # # Type: OPTIONAL modules: includedmodule: # rationale: # Why is this module included? # # Type: MANDATORY rationale: Included in the stack, just because. # repository: # Link to VCS repository that contains the modulemd file # if it differs from the buildsystem default configuration. # # Type: AUTOMATIC repository: https://pagure.io/includedmodule.git # ref: # See the rpms ref. # # Type: AUTOMATIC ref: somecoolbranchname # buildorder: # See the rpms buildorder. # # Type: AUTOMATIC buildorder: 100 fedora-modularity-libmodulemd-357799c/yaml_specs/modulemd_stream_v1.yaml000066400000000000000000000320271502446517500265570ustar00rootroot00000000000000# Document type identifier # `document: modulemd` describes the contents of a module stream document: modulemd # Module metadata format version version: 1 data: # Module name, optional # Typically filled in by the buildsystem, using the VCS repository # name as the name of the module. name: foo # Module update stream, optional # Typically filled in by the buildsystem, using the VCS branch name # as the name of the stream. stream: "stream-name" # Module version, a 64-bit unsigned integer, optional, # Typically filled in by the buildsystem, using the VCS commit # timestamp. Module version defines upgrade path for the particular # update stream. version: 20160927144203 # Module context flag, optional # The context flag serves to distinguish module builds with the # same name, stream and version and plays an important role in # future automatic module stream name expansion. # Filled in by the buildsystem. A short hash of the module's name, # stream, version and its expanded runtime dependencies. context: c0ffee43 # Module artifact architecture, optional # Contains a string describing the module's artifacts' main hardware # architecture compatibility, distinguishing the module artifact, # e.g. a repository, from others with the same name, stream, version and # context. This is not a generic hardware family (i.e. basearch). # Examples: i386, i486, armv7hl, x86_64 # Filled in by the buildsystem during the compose stage. arch: x86_64 # A short summary describing the module, required summary: An example module # A verbose description of the module, required description: >- A module for the demonstration of the metadata format. Also, the obligatory lorem ipsum dolor sit amet goes right here. # The end of life, aka Best Before, optional. # A UTC date in the ISO 8601 format signifying the day when this # module goes EOL, i.e. starting the day below, this module won't # receive any more updates. Typically defined in an external data # source and filled in by the buildsystem. # Note: This property is obsolete. Use "servicelevels" instead. eol: 2077-10-23 # Service levels, optional # This is a dictionary of important dates (and possibly supplementary data # in the future) that describes the end point of certain functionality, # such as the date when the module will transition to "security fixes only" # or go completely end-of-life. # Filled in by the buildsystem. Service level names might have special # meaning to other systems. Defined externally. servicelevels: rawhide: eol: 2077-10-23 stable_api: eol: 2077-10-23 bug_fixes: eol: 2077-10-23 security_fixes: eol: 2077-10-23 # Module and content licenses in the Fedora license identifier # format, required license: # Module license, required # This list covers licenses used for the module metadata and # possibly other files involved in the creation of this specific # module. module: - MIT # Content license, optional # A list of licenses used by the packages in the module. # This should be populated by build tools, not the module author. content: - Apache-2.0 - GPL-1.0-or-later OR Artistic-1.0-Perl # Extensible metadata block # A dictionary of user-defined keys and values. # Optional. Defaults to an empty dictionary. xmd: some_key: some_data # Module dependencies, if any. Optional. # TODO: Provides, conflicts, obsoletes, recommends, etc. # Do we even need those? # TODO: Stream name globbing or regular expression support dependencies: # Build dependencies of this module, optional # Keys are module names, values are the stream names # These modules define the buildroot for this module buildrequires: platform: and-its-stream-name extra-build-env: and-its-stream-name-too # Run-time dependencies of this module, optional # Keys are module names, values are their stream names requires: platform: and-its-stream-name # References to external resources, typically upstream, optional references: # Upstream community website, if it exists, optional community: http://www.example.com/ # Upstream documentation, if it exists, optional documentation: http://www.example.com/ # Upstream bug tracker, if it exists, optional tracker: http://www.example.com/ # Profiles define the end user's use cases for the module. They consist of # package lists of components to be installed by default if the module is # enabled. The keys are the profile names and contain package lists by # component type. There are several profiles defined below. Suggested # behavior for package managers is to just enable repository for selected # module. Then users are able to install packages on their own. If they # select a specific profile, the package manager should install all # packages of that profile. # Optional, defaults to no profile definitions. profiles: # The default profile, used unless any other profile was selected. # Optional, defaults to empty lists. default: rpms: - bar - bar-extras - baz # Defines a set of packages which are meant to be installed inside # container image artifact. # Optional. container: rpms: - bar - bar-devel # This profile provides minimal set of packages providing functionality # of this module. This is meant to be used on target systems where size # of the distribution is a real concern. # Optional. minimal: # A verbose description of the module, optional description: Minimal profile installing only the bar package. rpms: - bar # A set of packages which should be installed into the buildroot of a # module which depends on this module. Specifically, it is used to # flesh out the build group in koji. # Optional. buildroot: rpms: - bar-devel # Very similar to the buildroot profile above, this is used by the # build system to specify any additional packages which should be # installed during the buildSRPMfromSCM step in koji. # Optional. srpm-buildroot: rpms: - bar-extras # Module API # Optional, defaults to no API. api: # The module's public RPM-level API. # A list of binary RPM names that are considered to be the # main and stable feature of the module; binary RPMs not listed # here are considered "unsupported" or "implementation details". # In the example here we don't list the xyz package as it's only # included as a dependency of xxx. However, we list a subpackage # of bar, bar-extras. # Optional, defaults to an empty list. rpms: - bar - bar-extras - bar-devel - baz - xxx # Module component filters # Optional, defaults to no filters. filter: # RPM names not to be included in the module. # By default, all built binary RPMs are included. In the example # we exclude a subpackage of bar, bar-nonfoo from our module. # Optional, defaults to an empty list. rpms: - baz-nonfoo # Component build options # Additional per component type module-wide build options. # Optional buildopts: # RPM-specific build options # Optional rpms: # Additional macros that should be defined in the # RPM buildroot, appended to the default set. Care should be # taken so that the newlines are preserved. Literal style # block is recommended, with or without the trailing newline. # Optional macros: | %demomacro 1 %demomacro2 %{demomacro}23 # Functional components of the module, optional components: # RPM content of the module, optional # Keys are the VCS/SRPM names, values dictionaries holding # additional information. rpms: bar: # Why is this component present. # A simple, free-form string. # Required. rationale: We need this to demonstrate stuff. # Use this repository if it's different from the build # system configuration. # Optional. repository: https://pagure.io/bar.git # Use this lookaside cache if it's different from the # build system configuration. # Optional. cache: https://example.com/cache # Use this specific commit hash, branch name or tag for # the build. If ref is a branch name, the branch HEAD # will be used. If no ref is given, the master branch # is assumed. # Optional. ref: 26ca0c0 # baz has no extra options baz: rationale: This one is here to demonstrate other stuff. xxx: rationale: xxx demonstrates arches and multilib. # xxx is only available on the listed architectures. # Includes specific hardware architectures, not families. # See the data.arch field for details. # Instructs the build system to only build the # component on this specific set of architectures. # Optional, defaults to all available arches. arches: [ i686, x86_64 ] # A list of architectures with multilib # installs, i.e. both i686 and x86_64 # versions will be installed on x86_64. # Includes specific hardware architectures, not families. # See the data.arch field for details. # Optional, defaults to no multilib. multilib: [ x86_64 ] xyz: rationale: xyz is a bundled dependency of xxx. # Build order group # When building, components are sorted by build order tag # and built in batches grouped by their buildorder value. # Built batches are then re-tagged into the buildroot. # Multiple components can have the same buildorder index # to map them into build groups. # Optional, defaults to zero. # Integer, from an interval [-(2^63), +2^63-1]. # In this example, bar, baz and xxx are built first in # no particular order, then tagged into the buildroot, # then, finally, xyz is built. buildorder: 10 # Module content of this module # Included modules are built in the shared buildroot, together with # other included content. Keys are module names, values additional # component information. Note this only includes components and their # properties from the referenced module and doesn't inherit any # additional module metadata such as the module's dependencies or # component buildopts. The included components are built in their # defined buildorder as sub-build groups. # Optional modules: includedmodule: # Why is this module included? # Required rationale: Included in the stack, just because. # Link to VCS repository that contains the modulemd file # if it differs from the buildsystem default configuration. # Optional. repository: https://pagure.io/includedmodule.git # See the rpms ref. ref: somecoolbranchname # See the rpms buildorder. buildorder: 100 # Artifacts shipped with this module # This section lists binary artifacts shipped with the module, allowing # software management tools to handle module bundles. This section is # populated by the module build system. # Optional artifacts: # RPM artifacts shipped with this module # A set of NEVRAs associated with this module. An epoch number in the # NEVRA string is mandatory. # Optional rpms: - bar-0:1.23-1.module_deadbeef.x86_64 - bar-devel-0:1.23-1.module_deadbeef.x86_64 - bar-extras-0:1.23-1.module_deadbeef.x86_64 - baz-0:42-42.module_deadbeef.x86_64 - xxx-0:1-1.module_deadbeef.x86_64 - xxx-0:1-1.module_deadbeef.i686 - xyz-0:1-1.module_deadbeef.x86_64 fedora-modularity-libmodulemd-357799c/yaml_specs/modulemd_stream_v2.yaml000066400000000000000000000673651502446517500265750ustar00rootroot00000000000000############################################################################## # Glossary: # # # # build system: The process by which a module is built and packaged. In many # # cases, this will be the Module Build Service tool, but this term is used # # as a catch-all to describe any mechanism for producing a yum repository # # containing modular content from input module metadata files. # # # # # # == Attribute Types == # # # # MANDATORY: Attributes of this type must be filled in by the packager of # # this module. They must also be preserved and provided in the output # # metadata produced by the build system for inclusion into a repository. # # # # OPTIONAL: Attributes of this type may be provided by the packager of this # # module, when appropriate. If they are provided, they must also be # # preserved and provided in the output metadata produced by the build # # system for inclusion into a repository. # # # # AUTOMATIC: Attributes of this type must be present in the repository # # metadata, but they may be left unspecified by the packager. In this case, # # the build system is responsible for generating an appropriate value for # # the attribute and including it in the repository metadata. If the packager # # specifies this attribute explicitly, it must be preserved and provided in # # the output metadata for inclusion into a repository. # # # # The definitions above describe the expected behavior of the build system # # operating in its default configuration. It is permissible for the build # # system to override user-provided entries through non-default operating # # modes. If such changes are made, all items indicated as being required for # # the output repository must still be present. # ############################################################################## # Document type identifier # `document: modulemd` describes the contents of a module stream document: modulemd # Module metadata format version version: 2 data: # name: # The name of the module # Filled in by the build system, using the VCS repository name as the name # of the module. # # Type: AUTOMATIC # # Mandatory for module metadata in a yum/dnf repository. name: foo # stream: # Module update stream # Filled in by the buildsystem, using the VCS branch name as the name of # the stream. # # Type: AUTOMATIC # # Mandatory for module metadata in a yum/dnf repository. stream: "latest" # version: # Module version, 64-bit unsigned integer # If this value is unset (or set to zero), it will be filled in by the # buildsystem, using the VCS commit timestamp. Module version defines the # upgrade path for the particular update stream. # # Type: AUTOMATIC # # Mandatory for module metadata in a yum/dnf repository. version: 20160927144203 # context: # Module context flag # The context flag serves to distinguish module builds with the # same name, stream and version and plays an important role in # automatic module stream name expansion. # # If 'static_context' is unset or equal to FALSE: # Filled in by the buildsystem. A short hash of the module's name, # stream, version and its expanded runtime dependencies. The exact # mechanism for generating the hash is unspecified. # # Type: AUTOMATIC # # Mandatory for module metadata in a yum/dnf repository. # # If 'static_context' is set to True: # The context flag is a string of up to thirteen [a-zA-Z0-9_] characters # representing a build and runtime configuration for this stream. This # string is arbitrary but must be unique in this module stream. # # Type: MANDATORY static_context: false context: c0ffee43 # arch: # Module artifact architecture # Contains a string describing the module's artifacts' main hardware # architecture compatibility, distinguishing the module artifact, # e.g. a repository, from others with the same name, stream, version and # context. This is not a generic hardware family (i.e. basearch). # Examples: i386, i486, armv7hl, x86_64 # Filled in by the buildsystem during the compose stage. # # Type: AUTOMATIC # # Mandatory for module metadata in a yum/dnf repository. arch: x86_64 # summary: # A short summary describing the module # # Type: MANDATORY # # Mandatory for module metadata in a yum/dnf repository. summary: An example module # description: # A verbose description of the module # # Type: MANDATORY # # Mandatory for module metadata in a yum/dnf repository. description: >- A module for the demonstration of the metadata format. Also, the obligatory lorem ipsum dolor sit amet goes right here. # servicelevels: # Service levels # This is a dictionary of important dates (and possibly supplementary data # in the future) that describes the end point of certain functionality, # such as the date when the module will transition to "security fixes only" # or go completely end-of-life. # Filled in by the buildsystem. Service level names might have special # meaning to other systems. Defined externally. # # Type: AUTOMATIC servicelevels: rawhide: # EOL dates are the ISO 8601 format. eol: 2077-10-23 stable_api: eol: 2077-10-23 bug_fixes: eol: 2077-10-23 security_fixes: eol: 2077-10-23 # license: # Module and content licenses in the Fedora license identifier # format # # Type: MANDATORY license: # module: # Module license # This list covers licenses used for the module metadata and # possibly other files involved in the creation of this specific # module. # # Type: MANDATORY module: - MIT # content: # Content license # A list of licenses used by the packages in the module. # This should be populated by build tools, not the module author. # # Type: AUTOMATIC # # Mandatory for module metadata in a yum/dnf repository if the # module contains any artifacts. content: - Apache-2.0 - GPL-1.0-or-later OR Artistic-1.0-Perl # xmd: # Extensible metadata block # A dictionary of user-defined keys and values. # Defaults to an empty dictionary. # # Type: OPTIONAL xmd: some_key: some_data # dependencies: # Module dependencies, if any # A list of dictionaries describing build and runtime dependencies # of this module. Each list item describes a combination of dependencies # this module can be built or run against. # Dependency keys are module names, dependency values are lists of # required streams. The lists can be both inclusive (listing compatible # streams) or exclusive (accepting every stream except for those listed). # An empty list implies all active existing streams are supported. # Requiring multiple streams at build time will result in multiple # builds. Requiring multiple streams at runtime implies the module # is compatible with all of them. If the same module streams are listed # in both the build time and the runtime block, the build tools translate # the runtime block so that it matches the stream the module was built # against. Multiple builds result in multiple output modulemd files. # See below for an example. # The example below illustrates how to build the same module in four # different ways, with varying build time and runtime dependencies. # # Type: OPTIONAL dependencies: # Build on all available platforms except for f27, f28 and epel7 # After build, the runtime dependency will match the one used for # the build. - buildrequires: platform: [-f27, -f28, -epel7] requires: platform: [-f27, -f28, -epel7] # For platform:f27 perform two builds, one with buildtools:v1, another # with buildtools:v2 in the buildroot. Both will also utilize # compatible:v3. At runtime, buildtools isn't required and either # compatible:v3 or compatible:v4 can be installed. - buildrequires: platform: [f27] buildtools: [v1, v2] compatible: [v3] requires: platform: [f27] compatible: [v3, v4] # For platform:f28 builds, require either runtime:a or runtime:b at # runtime. Only one build is performed. - buildrequires: platform: [f28] requires: platform: [f28] runtime: [a, b] # For platform:epel7, build against against all available extras # streams and moreextras:foo and moreextras:bar. The number of builds # in this case will be 2 * . # At runtime, both extras and moreextras will match whatever stream was # used for build. - buildrequires: platform: [epel7] extras: [] moreextras: [foo, bar] requires: platform: [epel7] extras: [] moreextras: [foo, bar] # references: # References to external resources, typically upstream # # Type: OPTIONAL references: # community: # Upstream community website, if it exists # # Type: OPTIONAL community: http://www.example.com/ # documentation: # Upstream documentation, if it exists # # Type: OPTIONAL documentation: http://www.example.com/ # tracker: # Upstream bug tracker, if it exists # # Type: OPTIONAL tracker: http://www.example.com/ # profiles: # Profiles define the end user's use cases for the module. They consist of # package lists of components to be installed by default if the module is # enabled. The keys are the profile names and contain package lists by # component type. There are several profiles defined below. Suggested # behavior for package managers is to just enable repository for selected # module. Then users are able to install packages on their own. If they # select a specific profile, the package manager should install all # packages of that profile. # Defaults to no profile definitions. # # Type: OPTIONAL profiles: # An example profile that defines a set of packages which are meant to # be installed inside a container image artifact. # # Type: OPTIONAL container: rpms: - bar - bar-devel # An example profile that delivers a minimal set of packages to # provide this module's basic functionality. This is meant to be used # on target systems where size of the distribution is a real concern. # # Type: Optional minimal: # A verbose description of the module, optional description: Minimal profile installing only the bar package. rpms: - bar # buildroot: # This is a special reserved profile name. # # This provides a listing of packages that will be automatically # installed into the buildroot of all component builds that are started # after a component builds with its `buildroot: True` option set. # # The primary purpose of this is for building RPMs that change # the build environment, such as those that provide new RPM # macro definitions that can be used by subsequent builds. # # Specifically, it is used to flesh out the build group in koji. # # Type: OPTIONAL buildroot: rpms: - bar-devel # srpm-buildroot: # This is a special reserved profile name. # # This provides a listing of packages that will be automatically # installed into the buildroot of all component builds that are started # after a component builds with its `srpm-buildroot: True` option set. # # The primary purpose of this is for building RPMs that change # the build environment, such as those that provide new RPM # macro definitions that can be used by subsequent builds. # # Very similar to the buildroot profile above, this is used by the # build system to specify any additional packages which should be # installed during the buildSRPMfromSCM step in koji. # # Type: OPTIONAL srpm-buildroot: rpms: - bar-extras # api: # Module API # Defaults to no API. # # Type: OPTIONAL api: # rpms: # The module's public RPM-level API. # A list of binary RPM names that are considered to be the # main and stable feature of the module; binary RPMs not listed # here are considered "unsupported" or "implementation details". # In the example here we don't list the xyz package as it's only # included as a dependency of xxx. However, we list a subpackage # of bar, bar-extras. # Defaults to an empty list. # # Type: OPTIONAL rpms: - bar - bar-extras - bar-devel - baz - xxx # filter: # Module component filters # Defaults to no filters. # # Type: OPTIONAL filter: # rpms: # RPM names not to be included in the module. # By default, all built binary RPMs are included. In the example # we exclude a subpackage of bar, bar-nonfoo from our module. # Defaults to an empty list. # # Type: OPTIONAL rpms: - baz-nonfoo # demodularized: # Artifacts which became non-modular # Defaults to no demodularization. # Type: OPTIONAL demodularized: # rpms: # A list of binary RPM package names which where removed from # a module. This list explains to a package mananger that the packages # are not part of the module anymore and up-to-now same-named masked # non-modular packages should become available again. This enables # moving a package from a module to a set of non-modular packages. The # exact implementation of the demodularization (e.g. whether it # applies to all modules or only to this stream) is defined by the # package manager. # Defaults to an empty list. # # Type: OPTIONAL rpms: - bar-old # buildopts: # Component build options # Additional per component type module-wide build options. # # Type: OPTIONAL buildopts: # rpms: # RPM-specific build options # # Type: OPTIONAL rpms: # macros: # Additional macros that should be defined in the # RPM buildroot, appended to the default set. Care should be # taken so that the newlines are preserved. Literal style # block is recommended, with or without the trailing newline. # # Type: OPTIONAL macros: | %demomacro 1 %demomacro2 %{demomacro}23 # whitelist: # Explicit list of package build names this module will produce. # By default the build system only allows components listed under # data.components.rpms to be built as part of this module. # In case the expected RPM build names do not match the component # names, the list can be defined here. # This list overrides rather then just extends the default. # List of package build names without versions. # # Type: OPTIONAL whitelist: - fooscl-1-bar - fooscl-1-baz - xxx - xyz # arches: # Instructs the build system to only build the # module on this specific set of architectures. # Includes specific hardware architectures, not families. # See the data.arch field for details. # Defaults to all available arches. # # Type: OPTIONAL arches: [i686, x86_64] # components: # Functional components of the module # # Type: OPTIONAL components: # rpms: # RPM content of the module # Keys are the VCS/SRPM names, values dictionaries holding # additional information. # # Type: OPTIONAL rpms: bar: # name: # The real name of the package, if it differs from the key in # this dictionary. Used when bootstrapping to build a # bootstrapping ref before building the package for real. # # Type: OPTIONAL name: bar-real # rationale: # Why is this component present. # A simple, free-form string. # # Type: MANDATORY rationale: We need this to demonstrate stuff. # repository: # Use this repository if it's different from the build # system configuration. # # Type: AUTOMATIC repository: https://pagure.io/bar.git # cache: # Use this lookaside cache if it's different from the # build system configuration. # # Type: AUTOMATIC cache: https://example.com/cache # ref: # Use this specific commit hash, branch name or tag for # the build. If ref is a branch name, the branch HEAD # will be used. If no ref is given, the master branch # is assumed. # # Type: AUTOMATIC ref: 26ca0c0 # buildafter: # Use the "buildafter" value to specify that this component # must be be ordered later than some other entries in this map. # The values of this array come from the keys of this map and # not the real component name to enable bootstrapping. # Use of both buildafter and buildorder in the same document is # prohibited, as they will conflict. # # Note: The use of buildafter is not currently supported by the # Fedora module build system. # # Type: AUTOMATIC # # buildafter: # - baz # buildonly: # Use the "buildonly" value to indicate that all artifacts # produced by this component are intended only for building # this component and should be automatically added to the # data.filter.rpms list after the build is complete. # Defaults to "false" if not specified. # # Type: AUTOMATIC buildonly: false # baz builds RPM macros for the other components to use baz: rationale: Demonstrate updating the buildroot contents. # buildroot: # If buildroot is set to True, the packages listed in this # module's 'buildroot' profile will be installed into the # buildroot of any component built in buildorder/buildafter # batches begun after this one, without requiring that those # packages are listed among BuildRequires. # # The primary purpose of this is for building RPMs that change # the build environment, such as those that provide new RPM # macro definitions that can be used by subsequent builds. # # Defaults to "false" if not specified. # # Type: OPTIONAL buildroot: true # srpm-buildroot: # If srpm-buildroot is set to True, the packages listed in this # module's 'srpm-buildroot' profile will be installed into the # buildroot of any component built in buildorder/buildafter # batches begun after this one, without requiring that those # packages are listed among BuildRequires. # # The primary purpose of this is for building RPMs that change # the build environment, such as those that provide new RPM # macro definitions that can be used by subsequent builds. # # Defaults to "false" if not specified. # # Type: OPTIONAL srpm-buildroot: true # See component xyz for a complete description of buildorder # # build this component before any others so that the macros it # creates are available to all of them. buildorder: -1 xxx: rationale: xxx demonstrates arches and multilib. # arches: # xxx is only available on the listed architectures. # Includes specific hardware architectures, not families. # See the data.arch field for details. # Instructs the build system to only build the # component on this specific set of architectures. # If data.buildopts.arches is also specified, # this must be a subset of those architectures. # Defaults to all available arches. # # Type: AUTOMATIC arches: [i686, x86_64] # multilib: # A list of architectures with multilib # installs, i.e. both i686 and x86_64 # versions will be installed on x86_64. # Includes specific hardware architectures, not families. # See the data.arch field for details. # Defaults to no multilib. # # Type: AUTOMATIC multilib: [x86_64] xyz: rationale: xyz is a bundled dependency of xxx. # buildorder: # Build order group # When building, components are sorted by build order tag # and built in batches grouped by their buildorder value. # Built batches are then re-tagged into the buildroot. # Multiple components can have the same buildorder index # to map them into build groups. # Defaults to zero. # Integer, from an interval [-(2^63), +2^63-1]. # In this example, bar, baz and xxx are built first in # no particular order, then tagged into the buildroot, # then, finally, xyz is built. # Use of both buildafter and buildorder in the same document is # prohibited, as they will conflict. # # Type: OPTIONAL buildorder: 10 # modules: # Module content of this module # Included modules are built in the shared buildroot, together with # other included content. Keys are module names, values additional # component information. Note this only includes components and their # properties from the referenced module and doesn't inherit any # additional module metadata such as the module's dependencies or # component buildopts. The included components are built in their # defined buildorder as sub-build groups. # # Type: OPTIONAL modules: includedmodule: # rationale: # Why is this module included? # # Type: MANDATORY rationale: Included in the stack, just because. # repository: # Link to VCS repository that contains the modulemd file # if it differs from the buildsystem default configuration. # # Type: AUTOMATIC repository: https://pagure.io/includedmodule.git # ref: # See the rpms ref. # # Type: AUTOMATIC ref: somecoolbranchname # buildorder: # See the rpms buildorder. # # Type: AUTOMATIC buildorder: 100 # artifacts: # Artifacts shipped with this module # This section lists binary artifacts shipped with the module, allowing # software management tools to handle module bundles. This section is # populated by the module build system. # # Type: AUTOMATIC artifacts: # rpms: # RPM artifacts shipped with this module # A set of NEVRAs associated with this module. An epoch number in the # NEVRA string is mandatory. # # Type: AUTOMATIC rpms: - bar-0:1.23-1.module_deadbeef.x86_64 - bar-devel-0:1.23-1.module_deadbeef.x86_64 - bar-extras-0:1.23-1.module_deadbeef.x86_64 - baz-0:42-42.module_deadbeef.x86_64 - xxx-0:1-1.module_deadbeef.x86_64 - xxx-0:1-1.module_deadbeef.i686 - xyz-0:1-1.module_deadbeef.x86_64 # rpm-map: # The rpm-map exists to link checksums from repomd to specific # artifacts produced by this module. Any item in this list must match # an entry in the data.artifacts.rpms section. # # Type: AUTOMATIC rpm-map: # The digest-type of this checksum. # # Type: MANDATORY sha256: # The checksum of the artifact being sought. # # Type: MANDATORY ee47083ed80146eb2c84e9a94d0836393912185dcda62b9d93ee0c2ea5dc795b: # name: # The RPM name. # # Type: Mandatory name: bar # epoch: # The RPM epoch. # A 32-bit unsigned integer. # # Type: OPTIONAL epoch: 0 # version: # The RPM version. # # Type: MANDATORY version: 1.23 # release: # The RPM release. # # Type: MANDATORY release: 1.module_deadbeef # arch: # The RPM architecture. # # Type: MANDATORY arch: x86_64 # nevra: # The complete RPM NEVRA. # # Type: MANDATORY nevra: bar-0:1.23-1.module_deadbeef.x86_64 fedora-modularity-libmodulemd-357799c/yaml_specs/modulemd_translations_v1.yaml000066400000000000000000000030131502446517500277760ustar00rootroot00000000000000# Document type identifier # `document: modulemd-translations` describes the translation of module strings # into other languages. document: modulemd-translations # Module metadata format version version: 1 data: # Module name these translations apply to (required) module: foo # Module stream these translations apply to (required) stream: "latest" # A 64-bit unsigned integer. Use YYYYMMDDHHMM to easily identify the last # modification time. Use UTC for consistency. # When merging, entries with a newer 'modified' value will override any # earlier values. (required) modified: 201805231425 # Translations (section is required, may contain zero entries) translations: en_GB: # The translation of the summary. (required) summary: An example module # The translation of the description. (required) description: An example module. # Translation for profile descriptions (optional) profiles: profile_a: An example profile es_ES: summary: Un módulo de ejemplo description: Un módulo de ejemplo. # Translation for profile descriptions (optional) profiles: profile_a: Un perfil de ejemplo ja: summary: モジュールの例 description: モジュールの例です。 # Translations for profile descriptions (optional) profiles: profile_a: プロファイルの例