Send patches - preferably formatted by git format-patch - to patches at archlinux32 dot org.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorErich Eckner <git@eckner.net>2025-03-29 23:08:08 +0100
committerErich Eckner <git@eckner.net>2025-03-29 23:08:08 +0100
commit92f317e73efba9aa52da1bcaa0d94162fd79b0e7 (patch)
tree26044033b6edd94088678cdb68b43f0dd05223f4
parent9c942d4c60fe6d7f7f5a87cad271de3c23a2366c (diff)
sync-any-packages new
* first trial, maybe it even works
-rwxr-xr-xsync-any-packages90
1 files changed, 90 insertions, 0 deletions
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$'
+)