diff --git a/deploy/update.sh b/deploy/update.sh index 2f4d496..08683cd 100644 --- a/deploy/update.sh +++ b/deploy/update.sh @@ -12,6 +12,20 @@ # ============================================================================= set -euo pipefail +# Ein Wagenruecklauf im Paket macht jedes Shell-Skript auf dem Ziel +# unbrauchbar ("bad interpreter"). Die Pruefung darf dabei nicht selbst +# von einem Zusatzpaket abhaengen: mit "file" -- das auf einem schlanken +# Server fehlt -- endete sie in "command not found", grep bekam nichts zu +# sehen, und das Skript machte weiter, als waere alles in Ordnung. +hat_crlf() { + local cr + cr="$(printf '\r')" + # -U (binaer lesen) ist unter Linux ohne Wirkung, auf einer Windows-Buildmaschine + # aber entscheidend: dort entfernt grep den Wagenruecklauf beim Lesen und + # findet deshalb nie einen. + LC_ALL=C grep -qU "$cr" "$1" +} + APP="${1:-}" TAG="${2:-latest}" @@ -55,12 +69,15 @@ curl -fsSL -o "$WORK/$ASSET" "$BASE/$OWNER/$REPO/releases/download/$TAG/$ASSET" echo "==> Entpacke ..." tar -xzf "$WORK/$ASSET" -C "$WORK" -SRC="$(find "$WORK" -maxdepth 2 -name install.sh -path '*/deploy/*' -printf '%h/..\n' | head -1)" +# Drei Ebenen, nicht zwei: release.sh packt mit dem Praefix "/", also +# liegt das Skript unter /deploy/install.sh. Mit "-maxdepth 2" fand die +# Suche nie etwas -- und die Fehlermeldung schob es auf den Download. +SRC="$(find "$WORK" -maxdepth 3 -name install.sh -path '*/deploy/*' -printf '%h/..\n' | head -1)" [[ -n "$SRC" ]] || { echo "Im Paket fehlt deploy/install.sh -- Download unbrauchbar." >&2; exit 1; } SRC="$(cd "$SRC" && pwd)" echo "==> Pruefe auf CRLF (Windows-Buildmaschinen) ..." -if file "$SRC/deploy/install.sh" | grep -q CRLF; then +if hat_crlf "$SRC/deploy/install.sh"; then echo "Das Paket enthaelt CRLF-Zeilenenden. Beim Paketieren fehlte" >&2 echo "'git -c core.autocrlf=false archive'." >&2 exit 1