Auf dem Gerät schlug 'git clone' mit 'early EOF' und 'invalid index-pack output'
fehl. Die Eingrenzung zeigt: es liegt weder am Telefon noch am Skript.
· Derselbe Fehler tritt vom PC aus auf, mit jeder Variante — flach, Protokoll
v1, ohne Kompression, ein Thread, großer postBuffer.
· Die Refs liefert der Server anstandslos.
· Auf eine korrekt aufgebaute upload-pack-Anfrage antwortet er mit 'NAK' und
dann nichts mehr: 8 Bytes, keine Paketdaten, nicht einmal eine Meldung im
Fehlerkanal. Genau das sieht der Client als vorzeitiges Dateiende.
· Ein Archiv derselben Revision lässt sich dagegen fehlerfrei erzeugen.
Die Objekte sind also heil und vollständig; allein das Schnüren des Pakets
scheitert. Das ist serverseitig und von hier weder zu beheben noch zu umgehen.
Damit das Gerät nicht blockiert bleibt, holt init-phone.sh die Quellen im
Fehlerfall über den Archiv-Endpunkt. Der geht nicht über upload-pack und
funktioniert deshalb weiterhin. Das Ergebnis ist ausdrücklich ein Abzug, keine
Arbeitskopie: 'git pull' geht damit nicht, und das Skript sagt das auch so, statt
den Unterschied zu verwischen. Der Weg zurück zur Arbeitskopie steht daneben.
Gegen den echten Server getestet: Archiv gültig, 26 Dateien richtig entpackt.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
153 lines
6.2 KiB
Bash
Executable File
153 lines
6.2 KiB
Bash
Executable File
#!/data/data/com.termux/files/usr/bin/bash
|
|
# HPOS — Startpunkt auf dem Telefon.
|
|
#
|
|
# Dieses Skript ist absichtlich das EINZIGE, was per adb aufs Telefon kommt.
|
|
# Alles Weitere holt es sich per git. Der Grund: danach ist das Repo auf dem
|
|
# Telefon eine Arbeitskopie, keine Kopie. Aktualisieren heißt dann schlicht
|
|
#
|
|
# cd ~/hpos && git pull
|
|
#
|
|
# statt jedes Mal wieder den PC anzuwerfen und Dateien zu schieben.
|
|
#
|
|
# Aufruf in Termux:
|
|
# bash /sdcard/hpos-init.sh
|
|
# bash /sdcard/hpos-init.sh https://beispiel/anderes-repo.git
|
|
set -uo pipefail
|
|
|
|
REPO="${1:-${HPOS_REPO:-@@REPO_URL@@}}"
|
|
ZIEL="$HOME/hpos"
|
|
|
|
if [ -t 1 ]; then
|
|
C_OK=$'\033[32m'; C_WARN=$'\033[33m'; C_ERR=$'\033[31m'
|
|
C_HEAD=$'\033[1;36m'; C_DIM=$'\033[2m'; C_OFF=$'\033[0m'
|
|
else
|
|
C_OK=""; C_WARN=""; C_ERR=""; C_HEAD=""; C_DIM=""; C_OFF=""
|
|
fi
|
|
kopf() { printf '\n%s══ %s ══%s\n' "$C_HEAD" "$*" "$C_OFF"; }
|
|
ok() { printf '%s ✓%s %s\n' "$C_OK" "$C_OFF" "$*"; }
|
|
warn() { printf '%s !%s %s\n' "$C_WARN" "$C_OFF" "$*"; }
|
|
fehl() { printf '%s ✗%s %s\n' "$C_ERR" "$C_OFF" "$*"; }
|
|
hinweis() { printf '%s %s%s\n' "$C_DIM" "$*" "$C_OFF"; }
|
|
|
|
case "$REPO" in
|
|
@@*) fehl "Keine Repo-Adresse hinterlegt."
|
|
hinweis "Aufruf mit Adresse: bash /sdcard/hpos-init.sh <url>"
|
|
exit 1 ;;
|
|
esac
|
|
|
|
# Benutzernamen aus der Adresse entfernen. Lesen geht anonym; steht ein Name in
|
|
# der URL, fragt git trotzdem nach einem Passwort — auf einer Bildschirmtastatur
|
|
# eine unnötige Quälerei. Zum Schreiben braucht man ihn ohnehin nur auf dem PC.
|
|
REPO_ROH="$REPO"
|
|
REPO=$(printf '%s' "$REPO" | sed -E 's#^(https?://)[^/@]+@#\1#')
|
|
[ "$REPO" != "$REPO_ROH" ] && ANONYM=1 || ANONYM=0
|
|
|
|
kopf "HPOS — Ersteinrichtung auf dem Telefon"
|
|
hinweis "Repo: $REPO"
|
|
[ "$ANONYM" = 1 ] && hinweis "(Benutzername entfernt — gelesen wird anonym)"
|
|
|
|
# ── git ──────────────────────────────────────────────────────────────────────
|
|
kopf "git"
|
|
if command -v git >/dev/null 2>&1; then
|
|
ok "bereits vorhanden ($(git --version))"
|
|
else
|
|
pkg update -y >/dev/null 2>&1
|
|
if pkg install -y git; then ok "installiert"
|
|
else fehl "Installation von git fehlgeschlagen"; exit 1; fi
|
|
fi
|
|
|
|
# Das Telefon liest nur. Es soll nie versehentlich versuchen zurückzuschreiben —
|
|
# 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
|
|
ok "Arbeitskopie vorhanden — aktualisiere"
|
|
if git -C "$ZIEL" pull --ff-only; then
|
|
ok "aktuell"
|
|
else
|
|
warn "git pull fehlgeschlagen."
|
|
hinweis "Lokale Änderungen? Dann: cd ~/hpos && git stash && git pull"
|
|
exit 1
|
|
fi
|
|
else
|
|
# --depth reicht nicht: für 'git pull' später brauchen wir eine vollwertige
|
|
# Arbeitskopie, kein abgeschnittenes Archiv.
|
|
if git clone "$REPO" "$ZIEL"; then
|
|
ok "geklont nach $ZIEL"
|
|
else
|
|
fehl "git clone fehlgeschlagen."
|
|
hinweis "Adresse war: $REPO"
|
|
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
|
|
|
|
chmod +x "$ZIEL"/spike/*.sh "$ZIEL"/spike/inner/*.sh 2>/dev/null || true
|
|
|
|
# ── Weiter ───────────────────────────────────────────────────────────────────
|
|
kopf "Fertig"
|
|
cat <<TEXT
|
|
Das Repo liegt jetzt unter ~/hpos und ist eine Arbeitskopie.
|
|
Aktualisieren später:
|
|
|
|
cd ~/hpos && git pull
|
|
|
|
Nächster Schritt:
|
|
|
|
cd ~/hpos
|
|
bash spike/00-bootstrap-termux.sh
|
|
|
|
Danach die Beweise der Reihe nach — S1 zuerst, weil er der wackligste ist:
|
|
|
|
bash spike/01-s1-plasma-mobile.sh
|
|
bash spike/02-s2-mikrofon.sh
|
|
bash spike/03-s3-pipewire-kamera.sh
|
|
bash spike/04-s4-intent-handoff.sh
|
|
TEXT
|