index : devops | |
Archlinux32 devs' convenience-scripts | gitolite user |
summaryrefslogtreecommitdiff |
author | Erich Eckner <git@eckner.net> | 2025-03-29 23:08:08 +0100 |
---|---|---|
committer | Erich Eckner <git@eckner.net> | 2025-03-29 23:08:08 +0100 |
commit | 92f317e73efba9aa52da1bcaa0d94162fd79b0e7 (patch) | |
tree | 26044033b6edd94088678cdb68b43f0dd05223f4 | |
parent | 9c942d4c60fe6d7f7f5a87cad271de3c23a2366c (diff) |
-rwxr-xr-x | sync-any-packages | 90 |
diff --git a/sync-any-packages b/sync-any-packages new file mode 100755 index 0000000..9771322 --- /dev/null +++ b/sync-any-packages @@ -0,0 +1,90 @@ +#!/bin/bash + +set -e + +if [ $# -eq 2 ]; then + >&2 echo curl -Lo "$1" "$2" + curl -Lo "$1" "$2" + exit +fi + +if [ $# -ne 1 ] || [ ! -d "$1" ]; then + >&2 echo 'usage:' + >&2 printf '%s /path/to/mirror\n' "$0" + exit 1 +fi + +exec 9> /tmp/sync-any-packages.lock +if ! flock -n 9; then + >&2 echo 'cannot obtain lock' + exit +fi + +dir="$(readlink -e "$1")" + +for repo in core extra; do + mirrors=( + $( + sed -n ' + s/^Server = // + T + s/\$arch/x86_64/ + s/\$repo/'"${repo}"'/ + p + ' '/etc/pacman.d/mirrorlist' + ) + ) + + bsdtar -Oxf "/var/lib/pacman/sync/${repo}.db" \ + | sed -n ' + /^%\(FILENAME\|CSIZE\|PGPSIG\)%/ { + N + s/^.*\n// + p + } + ' \ + | sed ' + /-any\.pkg\.tar\.zst$/ !d + N + s/\n/ / + N + s/\n/ / + ' \ + | while read -r pkg size sig; do + [ -f "${dir}/pool-any/${pkg}" ] \ + && [ -f "${dir}/pool-any/${pkg}.sig" ] \ + && [ $(stat -c%s "${dir}/pool-any/${pkg}") -eq "${size}" ] \ + && continue + + printf '%s\n' "${sig}" \ + | base64 -d \ + > "${dir}/pool-any/${pkg}.sig" + printf '%s/pool-any/%s\n%s/%s\n' "${dir}" "${pkg}" "$(printf '%s\n' "${mirrors[@]}" | shuf -n1)" "${pkg}" + done \ + | parallel -N 2 -j 20 "$0" +done + +ls "${dir}/pool-any" \ +| grep -vxFf <( + for repo in core extra; do + bsdtar -Oxf "/var/lib/pacman/sync/${repo}.db" + done \ + | sed -n ' + /^%FILENAME%/ { + N + s/^.*\n// + p + s/$/.sig/ + p + } + ' +) \ +| while read -r pkg; do + rm -vf "${dir}/pool-any/${pkg}" "${dir}/pool-any/${pkg}.sig" +done + +cd "${dir}/pool-any" +repo-add build-support-any.db.tar.gz $( + ls "${dir}/pool-any" \ + | grep -v '\.sig$' +) |