#!/bin/bash # report back on a build assignment # either on success via: # "$0 $package $revision $mod_revision $repository" and tar'ed packages (= a tar of # package(s) and signature(s)) on stdin # or on failure via: # "$0 $package $revision $mod_revision $repository ERROR" # exit codes: # 0: ok # 1: another instance was already running # 2: outdated package # 3: signature error # TODO: # use lock file for build list # remove old version(s) of newly compiled packages # check that received archive contains the expected packages . "${0%/*}/../conf/default.conf" # Create a lock file and a trap. exec 9> "${build_list_lock_file}" if ! flock -n 9; then >&2 echo 'come back (shortly) later - I cannot lock build list.' exit fi exit 1 fi function clean_up { rm -f "${build_list_lock_file}" } trap clean_up EXIT if [ "$5" == 'ERROR' ]; then # the build failed on the build slave mv "${work_dir}/package-states/$1.$2.$3.$4."{locked,broken} # unlock every loop this package would have broken and which is not # broken by another locked package ( # loops broken by another locked package ls "${work_dir}/package-states/"{*.*.*.*,$1.$2.$3.$4}.locked | \ sort | \ uniq -u | \ sed 's|\.locked$||' | \ xargs -n1 sed '1d' | \ sort -u | \ sed 'p' # loops broken by this package sed '1d' "${work_dir}/package-states/$1.$2.$3.$4" ) | \ sort | \ uniq -u | \ sed 's|$|.locked|' | \ xargs -rn1 rm -f exit 0 fi # the build was successful on the build slave if ! grep -q "^${1//./\\.} $2 $3 $4\$" "${work_dir}/build-list"; then >&2 echo 'Sorry, the sent package is outdated.' exit 2 fi function clean_up { popd > /dev/null rm -rf --one-file-system "${tmp_dir}" } tmp_dir="$(mktemp -d)" pushd "${tmp_dir}" > /dev/null trap clean_up EXIT # extract package(s) tar -x signature_errors="$( ls -1 *.pkg.tar.xz{,.sig} | \ sed 's|\.sig$||' | \ sort | \ uniq -c | \ grep -v '^\s*2\s' | \ awk '{print $2}' )" if [ -n "${signature_errors}" ]; then >&2 echo 'The following packages lack a signature or vice versa:' >&2 echo "${signature_errors}" exit 3 fi # move packages packages=(*.pkg.tar.xz) mkdir -p "${master_mirror_directory}/i486/$4-staging/" mv *.pkg.tar.xz{,.sig} "${master_mirror_directory}/i486/$4-staging/" pushd "${master_mirror_directory}/i486/$4-staging" > /dev/null repo-add -v -s -k "${repo_key}" "$4-staging.db.tar.gz" "${packages[@]}" popd > /dev/null # remove all loops which are broken by this package sed '1d' "${work_dir}/package-states/$1.$2.$3.$4.locked" | \ sort -u | \ sed 'p;s|$|.locked|' | \ xargs -rn1 rm -f # remove package from build list sed -i "/^${1//./\\.} $2 $3 $4\$/d" "${work_dir}/build-list" # remove package lock file rm "${work_dir}/package-states/$1.$2.$3.$4.locked"