#!/bin/sh # build one package to test if modifications are ok (before opening a pull # request in https://github.com/archlinux32/packages) # package is built directly on a i486/i686/pentium4 host without any chroots # shellcheck source=../lib/load-configuration . "${0%/*}/../lib/load-configuration" # TODO: remove hard-coded package suffixes # shellcheck disable=SC2016 usage() { >&2 echo '' >&2 echo 'test-build-package : build package for testing' >&2 echo '' >&2 echo 'possible options:' >&2 echo ' -h|--help: Show this help and exit.' >&2 echo ' -a|--arch "i486" | "i686" | "pentium4"' >&2 echo ' Build locally for this architecture.' >&2 echo ' -b|--bootstrap' >&2 echo ' Publishes signed package to the bootstrap directory.' >&2 echo ' -H|--host @: host and user for bootstrapping' >&2 echo ' -D|--dir : bootstrapping directory' >&2 echo ' $arch and $repo are attached to this path.' >&2 echo ' -p|--port : the SSH port for bootstrapping.' >&2 echo ' -n|--nocheck:' >&2 echo ' Normally execute all checks and do all tests.' >&2 echo ' This switches off check() and all integrity checks.' >&2 echo ' -t|--tmpdir :' >&2 echo ' Specify tmpdir instead of using a random one, usually with -N' >&2 echo ' -N|--nobuild:' >&2 echo ' Assume packages have already been built, just upload them.' >&2 echo ' -s|--signkey:' >&2 echo ' Use explicit sign key instead of the one from the configuration.' [ -z "$1" ] && exit 1 || exit "$1" } eval set -- "$( getopt -o a:bhnNp:H:D:t:s: \ --long arch \ --long bootstrap \ --long nocheck \ --long nobuild \ --long port \ --long dir \ --long host \ --long tmpdir \ --long signkey \ --long help \ -n "$(basename "$0")" -- "$@" || \ echo usage )" arch=$(uname -m) bootstrap=false nocheck=false nobuild=false bootstrap_port=22 bootstrap_host='' bootstrap_dir='' tmp_dir=$(mktemp -d "${work_dir}/tmp.XXXXXX") signkey="${package_key}" while true do case "$1" in -a|--arch) shift arch="$1" ;; -b|--bootstrap) bootstrap=true ;; -H|--host) shift bootstrap_host="$1" ;; -D|--dir) shift bootstrap_dir="$1" ;; -n|--nocheck) nocheck=true ;; -N|--nobuild) nobuild=true ;; -p|--port) shift bootstrap_port="$1" ;; -t|--tmpdir) shift tmp_dir="$1" ;; -s|--signkey) shift signkey="$1" ;; -h|--help) usage 0 ;; --) shift break ;; *) >&2 echo 'Whoops, forgot to implement option "'"$1"'" internally.' exit 42 ;; esac shift done if [ $# -ne 2 ]; then >&2 echo 'Too few or too many arguments. Expecting exactly a repository and a package name of the package to test.' usage fi if [ "$arch" != "any" ] && [ "$arch" != "i486" ] && [ "$arch" != "i686" ] && [ "$arch" != "pentium4" ]; then >&2 echo "Illegal architecture '$arch', epxecting one of 'any', 'i486', 'i686' or 'pentium4'." usage fi if ${bootstrap}; then if [ -z "${bootstrap_host}" ]; then >&2 echo -- '-b option requires a bootstrapping host to be set with -H' usage fi if [ -z "${bootstrap_dir}" ]; then >&2 echo -- '-b option requires a bootstrapping directory to be set with -d' usage fi fi if ! ${nobuild}; then # Update git repositories (official packages, community packages and the repository of package customizations). for repo_name in ${repo_names}; do eval repo_path='"${repo_paths__'"${repo_name}"'}"' git -C "${repo_path}" pull done repository=$1 package=$2 case $repository in core) repo_path='../work/repos/packages' ;; extra) repo_path='../work/repos/packages' ;; community) repo_path='../work/repos/community' ;; *) >&2 echo 'Repository is either "core", "extra" or "community"' usage esac git_revision=$(git -C "${repo_path}" rev-parse HEAD) mod_git_revision=$(git -C "${repo_paths__archlinux32}" stash create) if [ -z "${mod_git_revision}" ]; then mod_git_revision=$(git -C "${repo_paths__archlinux32}" rev-parse HEAD) fi build_command="staging-${arch}-build" parameters='' if ${nocheck}; then parameters='-- -- --nocheck' fi git_repo=$(find_repository_with_commit "${git_revision}") find_pkgbuilds "${package}" "${repository}" "${git_repo}" "${git_revision}" "${mod_git_revision}" extract_source_directory "${git_repo}" "${git_revision}" "${mod_git_revision}" "${tmp_dir}" rm -f \ ./*"-${arch}.pkg.tar.xz" ./*"-${arch}.pkg.tar.xz.sig" \ ./*"-${arch}.pkg.tar.zst" ./*"-${arch}.pkg.tar.zst.sig" cd "${tmp_dir}" || exit 1 makepkg_parameters='' if ${nocheck}; then makepkg_parameters='--skippgpcheck' fi makepkg ${makepkg_parameters} --verifysource # shellcheck disable=SC2086 "${build_command}" ${parameters} else cd "${tmp_dir}" || exit 1 fi if ${bootstrap}; then rm -f \ ./*"-${arch}.pkg.tar.xz.sig" \ ./*"-${arch}.pkg.tar.zst.sig" find . -maxdepth 1 -type f -name "*${arch}.pkg.tar.zst" \ -execdir gpg --local-user="${signkey}" --detach-sign '{}' \; case "$repository" in core|extra) staging_repo="staging" ;; community) staging_repo="community-staging" ;; *) staging_repo="staging" ;; esac scp -P "${bootstrap_port}" -rC "${tmp_dir}/"*"-${arch}.pkg.tar.zst" "${tmp_dir}/"*"-${arch}.pkg.tar.zst.sig" "${bootstrap_host}:${bootstrap_dir}/${staging_repo}/." ssh -p "${bootstrap_port}" "${bootstrap_host}" bash -l -c "'cd ${bootstrap_dir}/${staging_repo} && repo-add -n bootstrap-${staging_repo}.db.tar.gz *-${arch}.pkg.tar.zst'" fi # do not delete build reports, why might actually to want to have a look for things # like checksums, logfiles, etc. #recursively_umount_and_rm "${tmp_dir}"