diff options
Diffstat (limited to 'db-import-any')
-rwxr-xr-x | db-import-any | 68 |
1 files changed, 68 insertions, 0 deletions
diff --git a/db-import-any b/db-import-any new file mode 100755 index 0000000..7827443 --- /dev/null +++ b/db-import-any @@ -0,0 +1,68 @@ +#!/bin/bash +# Releases 'any' packages from Arch arches to our arches + +set -eu -o pipefail +source "$(dirname "$(readlink -e "$0")")/config" +source "$(dirname "$(readlink -e "$0")")/db-import-any.conf" +source "$(librelib messages)" +setup_traps + +# usage: expac_file <file.db> <expac_args> +# +# Uses the ${WORKDIR} global +expac_file() { + local dbfile=$1 + local args=("${@:2}") + + local reponame=${dbfile##*/} + reponame=${reponame%%.*} + + mkdir -p -- "${WORKDIR}/expac/root" + cat >"${WORKDIR}/expac/pacman.conf" <<-EOT + [options] + RootDir = ${WORKDIR}/expac/root + DBPath = ${WORKDIR}/expac/root + + [${reponame}] + Server = file://$(realpath --no-symlinks -- "${dbfile%/*}") + EOT + + fakeroot pacman --config="${WORKDIR}/expac/pacman.conf" -Syy >/dev/null + # expac exits with non-zero on emtpy databases, so ignore errors + expac --config="${WORKDIR}/expac/pacman.conf" --sync "${args[@]}" || true +} + +db_list_any_pkgfiles() { + local dbfile="$1" + expac_file "$dbfile" '%a %f' | awk '$1 == "any" { print $2 }' +} + +main() { + WORKDIR=$(mktemp -dt "${0##*/}.XXXXXXXXXX") + readonly WORKDIR + trap "rm -rf -- ${WORKDIR@Q}" EXIT + + local repo arch + for repo in "${PKGREPOS[@]}"; do + msg "Processing %s..." "${repo}" + mkdir -p -- "${WORKDIR}/staging/${repo}" + # Look for arch=(any) packages that exist in + # ${BASEARCH} for this repo but is missing from one or + # more of ${ARCHES[@]}. + db_list_any_pkgfiles "${FTP_BASE}/${repo}/os/${BASEARCH}/${repo}.db" > "${WORKDIR}/base.txt" + for arch in "${ARCHES[@]}"; do + [[ $arch != "$BASEARCH" ]] || continue + db_list_any_pkgfiles "${FTP_BASE}/${repo}/os/${arch}/${repo}.db" > "${WORKDIR}/arch.txt" + comm -23 "${WORKDIR}/base.txt" "${WORKDIR}/arch.txt" + done \ + | sort -u \ + | xargs -d '\n' -r -n1 -- printf '%s/%s\n' "${FTP_BASE}/${repo}/os/${BASEARCH}" \ + | sed 's/.*/&\n&.sig/' \ + | xargs -d '\n' -r -- ln -srv -t "${WORKDIR}/staging/${repo}" -- + done + + msg "Running db-update..." + STAGING=${WORKDIR}/staging db-update +} + +main "$@" |