#!/bin/sh # copy the given package(s) into build-support # shellcheck disable=SC2119,SC2120 # shellcheck source=../lib/load-configuration . "${0%/*}/../lib/load-configuration" # TODO: allow to introduce a manually built package into build-support # TODO: remove hard-coded package suffixes # shellcheck disable=SC2016 usage() { >&2 echo '' >&2 echo 'copy-to-build-support [options] package-list:' >&2 echo ' copy the packages listed in package-list into [build-support]' >&2 echo '' >&2 echo 'possible options:' >&2 echo ' -h|--help:' >&2 echo ' Show this help and exit.' >&2 echo ' -w|--wait:' >&2 echo ' Wait for lock if necessary.' >&2 echo '' >&2 echo 'lines in package-list should contain:' >&2 echo '$repo_arch $package_file_name' [ -z "$1" ] && exit 1 || exit "$1" } eval set -- "$( getopt -o hw \ --long help \ --long wait \ -n "$(basename "$0")" -- "$@" || \ echo usage )" wait_for_lock='-n' while true do case "$1" in -h|--help) usage 0 ;; -w|--wait) wait_for_lock='' ;; --) shift break ;; *) >&2 echo 'Whoops, forgot to implement option "'"$1"'" internally.' exit 42 ;; esac shift done if [ "$#" -ne 1 ]; then >&2 echo 'No package-list was given.' usage fi if [ ! -r "$1" ]; then >&2 printf 'Package-list "%s" is not readable.\n' "$1" usage fi exec 9> "${sanity_check_lock_file}" # shellcheck disable=SC2086 verbose_flock -s ${wait_for_lock} 9 exec 8> "${package_database_lock_file}" # shellcheck disable=SC2086 verbose_flock ${wait_for_lock} 8 # shellcheck disable=SC2086 if intentions_left ${wait_for_lock}; then >&2 echo 'come back (shortly) later - There are still intentions in the queue.' exit 1 fi tmp_dir=$(mktemp -d "${work_dir}/tmp.copy-to-build-support.0.XXXXXXXXXX") trap 'rm -rf --one-file-system "${tmp_dir}"' EXIT export TMPDIR="${tmp_dir}" sed -n ' s/ \S\+/\0 \0/ T s/\.pkg\.tar\.zst$// T s/\(-[0-9]\+\)\(-[^- ]\+\)$/\1.0\2/ s/-\([^-: ]\+\)\(\(-[^- ]\+\)\{2\}\)$/-0:\1\2/ s/-\([^-: ]\+\):\([^-: ]\+\)-\([^-. ]\+\).\([^-. ]\+\)-\([^- ]\+\)$/ \1 \2 \3 \4 \5/ p ' "$1" | \ while read -r repo_arch package pkgname epoch pkgver pkgrel sub_pkgrel architecture; do # shellcheck disable=SC2016 id=$( { printf 'SELECT `binary_packages`.`id`' printf ' FROM `binary_packages`' mysql_join_binary_packages_architectures mysql_join_binary_packages_binary_packages_in_repositories mysql_join_binary_packages_in_repositories_repositories printf ' WHERE' printf ' `binary_packages`.`%s`=from_base64("%s") AND' \ 'epoch' "$(printf '%s' "${epoch}" | base64 -w0)" \ 'pkgver' "$(printf '%s' "${pkgver}" | base64 -w0)" \ 'pkgrel' "$(printf '%s' "${pkgrel}" | base64 -w0)" \ 'sub_pkgrel' "$(printf '%s' "${sub_pkgrel}" | base64 -w0)" \ 'pkgname' "$(printf '%s' "${pkgname}" | base64 -w0)" printf ' `architectures`.`name`=from_base64("%s")' \ "$(printf '%s' "${architecture}" | base64 -w0)" printf ' AND NOT EXISTS (' printf 'SELECT 1' printf ' FROM `binary_packages_in_repositories` AS `bs_bpir`' mysql_join_binary_packages_in_repositories_repositories 'bs_bpir' 'bs_r' printf ' WHERE `bs_bpir`.`package`=`binary_packages`.`id`' printf ' AND `bs_r`.`name`="build-support"' printf ') AND `repositories`.`is_on_master_mirror`' printf ' LIMIT 1;\n' } | \ mysql_run_query ) if [ -z "${id}" ]; then continue fi printf '%s\n' "${package}" >> \ "${tmp_dir}/packages" for suffix in '' '.sig'; do printf 'ln -s "../../pool/%s%s" "%s/build-support/%s%s"\n' \ "${package}" \ "${suffix}" \ "${repo_arch}" \ "${package}" \ "${suffix}" done >> \ "${tmp_dir}/sftp-command" printf '%s %s/pool/%s\n' \ "${repo_arch}" \ "${master_mirror_rsync_directory}" \ "${package}" | \ sed ' p s/$/.sig/ ' >> \ "${tmp_dir}/to-copy" printf '%s\n' \ "${repo_arch}" >> \ "${tmp_dir}/repo-archs" # shellcheck disable=SC2016 { printf 'INSERT IGNORE INTO `binary_packages_in_repositories`' printf ' (`repository`,`package`,`is_to_be_deleted`)' # shellcheck disable=SC2154 printf ' VALUES (%s,%s,0);\n' \ "$(eval echo '"${repository_ids__'"${repo_arch}"'_build_support}"')" \ "${id}" printf 'SELECT LAST_INSERT_ID();\n' } >> \ "${tmp_dir}/mysql-command" done if [ ! -s "${tmp_dir}/repo-archs" ]; then >&2 echo 'Nothing to do.' if [ -w "$1" ]; then printf '' > "$1" fi exit 0 fi sort -u "${tmp_dir}/repo-archs" | \ sponge "${tmp_dir}/repo-archs" while read -r repo_arch; do mkdir "${tmp_dir}/${repo_arch}" { printf 'failsafe_rsync' for suffix in 'db' 'files'; do printf ' "%s/%s/build-support/build-support.%s."*' \ "${master_mirror_rsync_directory}" \ "${repo_arch}" \ "${suffix}" done printf ' "%s/%s/"\n' \ "${tmp_dir}" \ "${repo_arch}" } \ | intent_something done < \ "${tmp_dir}/repo-archs" if [ -s "${tmp_dir}/to-copy" ]; then mkdir "${tmp_dir}/transit/" while read -r repo_arch; do mkdir "${tmp_dir}/transit/${repo_arch}/" { printf 'failsafe_rsync ' sed -n ' s,^'"$(str_to_regex "${repo_arch}")"' ,, T p ' "${tmp_dir}/to-copy" \ | tr '\n' ' ' printf ' "%s/transit/%s/"\n' \ "${tmp_dir}" \ "${repo_arch}" printf 'repo-add' printf ' "%s/%s/build-support.db.tar.gz"' \ "${tmp_dir}" \ "${repo_arch}" printf ' "%s/transit/%s/"*".pkg.tar.zst"\n' \ "${tmp_dir}" \ "${repo_arch}" } \ | intent_something done < \ "${tmp_dir}/repo-archs" fi if [ -s "${tmp_dir}/sftp-command" ]; then printf 'failsafe_sftp < "%s/sftp-command"\n' \ "${tmp_dir}" \ | intent_something fi while read -r repo_arch; do { printf 'recompress_gz "%s"' \ "${tmp_dir}" for suffix in '' '.old'; do printf ' "%s/%s/build-support."*".tar.gz%s"' \ "${tmp_dir}" \ "${repo_arch}" \ "${suffix}" done printf '\n' printf 'failsafe_rsync' for suffix in 'db' 'files'; do printf ' "%s/%s/build-support.%s."*' \ "${tmp_dir}" \ "${repo_arch}" \ "${suffix}" done printf ' "%s/%s/build-support/"\n' \ "${master_mirror_rsync_directory}" \ "${repo_arch}" } \ | intent_something done < \ "${tmp_dir}/repo-archs" if [ -s "${tmp_dir}/mysql-command" ]; then { printf 'mysql_run_query \\\n' printf '<"%s/mysql-command" \\\n' \ "${tmp_dir}" printf '| sort -u \\\n' printf '| remove_old_package_versions\n' } \ | intent_something fi printf 'rm -rf --one-file-system "%s"\n' \ "${tmp_dir}" \ | intent_something if [ -w "$1" ]; then cat "${tmp_dir}/packages" > \ "$1" fi execute_all_intentions