#!/bin/bash # Package files cross from a PR build to publish.yml as one GitHub Actions # artifact. actions/upload-artifact rejects any path containing ':', and a # package with an epoch is named `name-1:ver-rel-arch.pkg.tar.zst` by # makepkg. So the files ride inside a tar with a plain name and keep their # own names untouched: pacman clients and bin/publish-artifact both rely on # the filename matching PKGINFO. # # Both functions run under the workflow's `bash -e`: nothing in them may # return non-zero except the final failure. # package_files : the *.pkg.tar.zst directly in , one per line. # Signatures and the scratch database next to them are not packages. package_files() { local f for f in "$1"/*.pkg.tar.zst; do [[ -e "$f" ]] && printf '%s\n' "$f" done return 0 } # pack_packages : every package in into . pack_packages() { local dir=$1 out=$2 files=() mapfile -t files < <(package_files "$dir") (( ${#files[@]} )) || { echo "pack_packages: no *.pkg.tar.zst in $dir" >&2; return 1; } tar -cf "$out" -C "$dir" -- "${files[@]##*/}" } # unpack_packages : the packages an unzipped artifact # carried, into . Packed artifacts hold packages.tar; artifacts from # builds before packing hold the bare files. The bare form can go once # those artifacts have expired (7-day retention). unpack_packages() { local src=$1 dest=$2 files=() mkdir -p "$dest" if [[ -f "$src/packages.tar" ]]; then tar -xf "$src/packages.tar" -C "$dest" return 0 fi mapfile -t files < <(package_files "$src") (( ${#files[@]} )) || { echo "unpack_packages: nothing to unpack in $src" >&2; return 1; } cp -- "${files[@]}" "$dest/" }