diff --git a/provision/init-phone.sh b/provision/init-phone.sh index 84d080b..44ce604 100755 --- a/provision/init-phone.sh +++ b/provision/init-phone.sh @@ -60,6 +60,37 @@ fi # ein Push von hier wäre weder gewollt noch möglich. git config --global credential.helper "" 2>/dev/null || true +# ── Rückfallebene: Archiv statt Klon ───────────────────────────────────────── +# Gitea, Forgejo und GitHub bieten den Baum zusätzlich als Tarball an. Der Weg +# dorthin geht nicht über upload-pack und funktioniert deshalb auch dann noch, +# wenn der Klon am Server scheitert. Das Ergebnis ist aber nur ein Abzug: kein +# .git, kein 'git pull'. Es ist eine Notlösung, keine Alternative. +archiv_holen() { + local basis zweig="${HPOS_ZWEIG:-main}" url tmp + basis="${REPO%.git}" + + command -v curl >/dev/null 2>&1 || pkg install -y curl >/dev/null 2>&1 + command -v tar >/dev/null 2>&1 || pkg install -y tar >/dev/null 2>&1 + + tmp=$(mktemp -d) + for url in "$basis/archive/$zweig.tar.gz" \ + "$basis/archive/refs/heads/$zweig.tar.gz"; do + hinweis "Versuche Archiv: $url" + if curl -sfL -o "$tmp/a.tar.gz" "$url" && tar tzf "$tmp/a.tar.gz" >/dev/null 2>&1; then + mkdir -p "$ZIEL" + # --strip-components=1: die Archive enthalten alles unter einem + # Wurzelverzeichnis, das wir nicht mit übernehmen wollen. + if tar xzf "$tmp/a.tar.gz" -C "$ZIEL" --strip-components=1; then + rm -rf "$tmp" + ok "Archiv entpackt nach $ZIEL" + return 0 + fi + fi + done + rm -rf "$tmp" + return 1 +} + # ── Holen oder aktualisieren ───────────────────────────────────────────────── kopf "Repo" if [ -d "$ZIEL/.git" ]; then @@ -79,9 +110,21 @@ else else fehl "git clone fehlgeschlagen." hinweis "Adresse war: $REPO" - hinweis "Ist das Repo öffentlich lesbar? Ohne das braucht es Zugangsdaten," - hinweis "und die gehören nicht aufs Telefon." - exit 1 + echo + # Ein scheiternder Klon bei erreichbarem Repo hat fast immer eine + # serverseitige Ursache: upload-pack stirbt beim Schnüren des Pakets, + # während die Objekte selbst heil sind. Erkennbar daran, dass sich ein + # Archiv weiterhin erzeugen lässt — und genau das ist die Rückfallebene. + if archiv_holen; then + warn "Über ein Archiv geholt, NICHT als Arbeitskopie." + hinweis "'git pull' funktioniert damit nicht. Sobald der Server wieder" + hinweis "Pakete ausliefert: rm -rf ~/hpos && bash /sdcard/hpos-init.sh" + else + fehl "Auch die Rückfallebene über das Archiv hat nicht geklappt." + hinweis "Ist das Repo öffentlich lesbar? Ohne das braucht es Zugangsdaten," + hinweis "und die gehören nicht aufs Telefon." + exit 1 + fi fi fi