#!/bin/sh # copy the given package(s) into build-support # shellcheck disable=SC2119,SC2120 # shellcheck source=../lib/load-configuration . "${0%/*}/../lib/load-configuration" # 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.' [ -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}" verbose_flock -s ${wait_for_lock} 9 exec 8> "${package_database_lock_file}" verbose_flock ${wait_for_lock} 8 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\.xz$// 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 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 ' 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 sort -u "${tmp_dir}/repo-archs" | \ sponge "${tmp_dir}/repo-archs" while read -r repo_arch; do mkdir "${tmp_dir}/${repo_arch}" ${master_mirror_rsync_command} \ "${master_mirror_rsync_directory}/${repo_arch}/build-support/build-support.db."* \ "${master_mirror_rsync_directory}/${repo_arch}/build-support/build-support.files."* \ "${tmp_dir}/${repo_arch}/" 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}/" # shellcheck disable=SC2046 ${master_mirror_rsync_command} \ $(sed -n 's,^'"$(str_to_regex "${repo_arch}")"' ,./,;T;p' "${tmp_dir}/to-copy") \ "${tmp_dir}/transit/${repo_arch}/" repo-add "${tmp_dir}/${repo_arch}/build-support.db.tar.gz" \ "${tmp_dir}/transit/${repo_arch}/"*".pkg.tar.xz" done < \ "${tmp_dir}/repo-archs" fi if [ -s "${tmp_dir}/sftp-command" ]; then ${master_mirror_sftp_command} < \ "${tmp_dir}/sftp-command" fi while read -r repo_arch; do ${master_mirror_rsync_command} \ "${tmp_dir}/${repo_arch}/build-support.db."* \ "${tmp_dir}/${repo_arch}/build-support.files."* \ "${master_mirror_rsync_directory}/${repo_arch}/build-support/" done < \ "${tmp_dir}/repo-archs" if [ -s "${tmp_dir}/mysql-command" ]; then mysql_run_query < \ "${tmp_dir}/mysql-command" | \ sort -u | \ remove_old_package_versions fi if [ -w "$1" ]; then cat "${tmp_dir}/packages" > \ "$1" fi