#!/bin/bash WARNED='0' FAILED='0' FEATURES='-ipc-sandbox -network-sandbox -pid-sandbox' export FEATURES [ -d '/etc/portage/env' ] || mkdir -p /etc/portage/env/ printf 'FEATURES="%s test"' "${FEATURES}" >> /etc/portage/env/features-test pretend_build() { emerge --getbinpkg=y --buildpkg=n --jobs="$(nproc)" --load-average="$(nproc)" --verbose --pretend "${1}" } dep_build() { emerge --getbinpkg=y --buildpkg=n --jobs="$(nproc)" --load-average="$(nproc)" --verbose --onlydeps "${1}" } binpkg_build() { emerge --getbinpkg=y --buildpkg=n --jobs="$(nproc)" --load-average="$(nproc)" --verbose "${1}" } build() { FEATURES="${FEATURES} -getbinpkg" emerge --getbinpkg=n --buildpkg=n --jobs="$(nproc)" --load-average="$(nproc)" --verbose "${1}" } for i in $(git --no-pager diff --name-only "$(git rev-parse --verify origin/master 2> /dev/null)" HEAD); do if [ "${i%.ebuild}" != "${i}" ]; then test_ebuild="$(printf '%s' "${i%.ebuild}" | awk -F'/' '{print "="$1"/"$3}')" printf '%s features-test' "${test_ebuild}" >> /etc/portage/package.env printf '%s looks like an ebuild, testing visibility\n' "${i}" if pretend_build "${test_ebuild}" ; then printf '%s appears to be unmasked, building deps\n' "${i}" if dep_build "${test_ebuild}"; then printf '%s deps have built, build testing\n' "${i}" if binpkg_build "${test_ebuild}"; then printf '%s binpkg build SUCCESS\n' "${i}" else printf '%s binpkg build FAILED\n' "${i}" if build "${test_ebuild}"; then printf '%s build without binpkgs SUCCESS\n' "${i}" else printf '%s build without binpkgs also FAILED\n' "${i}" FAILED="1" fi fi else printf 'WARNING WARNING WARNING\n' printf '%s deps failed to build. This is a bad sign which we are ignoring for now\n' "${i}" printf 'WARNING WARNING WARNING\n' WARNED='1' fi else printf '%s appears to be masked, skipping build test\n' "${i}" fi fi done if [ "${WARNED}" = '1' ]; then printf 'WARNING WARNING WARNING\n' printf 'There were warnings during this build which may be fatal later. Please review the logs.\n' printf 'WARNING WARNING WARNING\n' else printf 'No warnings generated by this script.\n' fi if [ "${FAILED}" = '0' ]; then printf 'No failures seen by this script.\n' else printf 'FAILED FAILED FAILED\n' printf 'Something above failed, please review the output.\n' printf 'FAILED FAILED FAILED\n' fi exit "${FAILED}"