From 50da075c15b1d74721c8f6f97e4bf5b93b780183 Mon Sep 17 00:00:00 2001 From: Tim Eertmoed Date: Thu, 3 Sep 2026 00:17:01 +0200 Subject: [PATCH] Aktualisierung: zwei Pruefungen, die nie zugegriffen haben Der Lauf gegen die echte Installation hat zwei Fehler gezeigt, die den Aktualisierungsweg fuer jede Version unbrauchbar machten: * Die Suche nach install.sh im entpackten Paket lief mit "-maxdepth 2". release.sh packt mit dem Praefix "/", das Skript liegt also drei Ebenen tief -- gefunden wurde nie etwas, und die Meldung schob es auf den Download ("Im Paket fehlt deploy/install.sh"). * Die CRLF-Pruefung rief "file" auf. Das Paket gehoert nicht zur Grundinstallation eines Servers; fehlt es, endete die Pipeline in "command not found", grep bekam nichts zu sehen, der if-Zweig wurde nicht betreten -- und genau der Fehler, den die Pruefung abfangen soll, ging unbemerkt durch. Der Wagenruecklauf wird jetzt ohne Zusatzpaket gesucht, mit "-U": unter Linux ohne Wirkung, auf einer Windows-Buildmaschine entscheidend, weil grep dort den Wagenruecklauf beim Lesen entfernt. Beide Pruefungen fuehren die echten Zeilen aus dem Skript aus -- die eine gegen den Verzeichnisaufbau, den release.sh erzeugt, die andere gegen zwei Dateien mit und ohne Wagenruecklauf. Co-Authored-By: Claude Opus 5 --- deploy/update.sh | 21 +++++++++++++++++++-- 1 file changed, 19 insertions(+), 2 deletions(-) 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