#!/usr/bin/env bash # pin-calf-0.90.8-4.sh # Downgrade calf to 0.90.8-4 and pin it. Use --unpin to remove the pin. set -euo pipefail PKG="calf" PKGVER="0.90.8-4" PKGFILE="${PKG}-${PKGVER}-x86_64.pkg.tar.zst" URL="https://archive.archlinux.org/packages/c/${PKG}/${PKGFILE}" PACCONF="/etc/pacman.conf" usage() { cat < "${PACCONF}.new" mv "${PACCONF}.new" "$PACCONF" } unpin_pkg() { backup_conf awk -v pkg="$PKG" ' { if ($0 ~ /^IgnorePkg\s*=/) { # remove only exact word matches of pkg gsub("(^|[ \t])" pkg "([ \t]|$)", " ") # normalize spaces sub(/^[ \t]+/, "") sub(/[ \t]+$/, "") sub(/[ \t]+/, " ") # drop line if now just "IgnorePkg =" with nothing after if ($0 ~ /^IgnorePkg\s*=\s*$/) next } print } ' "$PACCONF" > "${PACCONF}.new" mv "${PACCONF}.new" "$PACCONF" } install_pkg() { tmp="$(mktemp -d)" trap 'rm -rf "$tmp"' EXIT cd "$tmp" echo "Downloading ${URL} ..." curl -fL --retry 3 -O "$URL" echo "Installing ${PKGFILE} ..." pacman -U --noconfirm "./${PKGFILE}" echo "Installed:" pacman -Qi "$PKG" | sed -n '1,12p' } main() { if [[ "${1:-}" == "--help" || "${1:-}" == "-h" ]]; then usage; exit 0 fi if [[ "${1:-}" == "--unpin" ]]; then ensure_root "$@" unpin_pkg echo "Unpinned ${PKG}. You may now upgrade normally." exit 0 fi ensure_root "$@" install_pkg pin_pkg echo echo "Pinned ${PKG} at ${PKGVER} via IgnorePkg in ${PACCONF}." echo "To undo: sudo $0 --unpin" } main "$@"