#!/usr/bin/env bash # Reconcile a package repo against its AUR counterpart. # # usage: sync-aur.sh [package-dir] # # This is the fix for the original bug. The old push.sh pushed to origin first # and to the AUR second, so a failed AUR push left origin already carrying the # new version; every later run then hit "same (old) version specified" and # bare-exit 0'd, and the AUR silently rotted forever. # # Here the AUR is reconciled from STATE, not from events: this runs on every # nightly pass regardless of whether a new upstream version was found, so a # push that failed last night is simply retried tonight. set -euo pipefail _here="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" # shellcheck source=common.sh source "${_here}/common.sh" pkgdir="${1:-.}" cd "$pkgdir" pkgname="$(pkgbuild_get pkgname)" # pkgname may be written as "${_pkgname}-appimage"; expand it properly. case "$pkgname" in *'$'*) pkgname="$(pkgbuild_expand PKGBUILD 'printf %s "$pkgname"')" ;; esac [ -n "$pkgname" ] || die "could not determine pkgname" aur_url="${AUR_SSH_BASE}/${pkgname}.git" # Read over HTTPS so determining sync state needs no SSH key; only the push # itself is authenticated. This keeps NO_GIT_PUSH dry runs working anywhere. aur_ro_url="${AUR_HTTPS_BASE}/${pkgname}.git" # `git remote add` fails if the remote already exists, which it does whenever # this runs twice in one working copy. git remote remove aur >/dev/null 2>&1 || true git remote add aur "$aur_url" git remote remove aur-ro >/dev/null 2>&1 || true git remote add aur-ro "$aur_ro_url" if git fetch --quiet aur-ro master 2>/dev/null; then # Compare the CONTENT of the whole tree rather than commit hashes: origin # accumulates commits the AUR never needs, and a re-derived commit has a # different hash but an identical tree. No pathspec, because we push the # whole tree -- restricting to PKGBUILD/.SRCINFO would report "in sync" # while .desktop/.png/LICENSE actually differ. if git diff --quiet FETCH_HEAD HEAD; then log "AUR already in sync (${pkgname})" exit 0 fi log "AUR differs from origin; pushing (${pkgname})" else log "no AUR repo for ${pkgname} yet; the first push will create it" fi if [ -n "${NO_GIT_PUSH:-}" ]; then log "NO_GIT_PUSH set: skipping push to ${aur_url}" exit 0 fi if git push aur HEAD:master; then log "pushed ${pkgname} to the AUR" exit 0 fi # A rejected push here usually means the AUR has commits origin does not, # i.e. someone pushed directly. Overwriting that silently would destroy it. if [ -n "${AUR_FORCE:-}" ]; then warn "AUR_FORCE set: force-pushing over the AUR history for ${pkgname}" git push --force aur HEAD:master exit 0 fi die "push to the AUR was rejected for ${pkgname}. The AUR history has probably diverged from origin (someone pushed there directly). Inspect it, then re-run with AUR_FORCE=1 to overwrite. This run leaves origin untouched and will be retried on the next pass."