diff --git a/provision/init-phone.sh b/provision/init-phone.sh index fc3cd74..c7f972f 100755 --- a/provision/init-phone.sh +++ b/provision/init-phone.sh @@ -71,25 +71,53 @@ else # --force-confold: vorhandene Konfiguration behalten, statt mitten im Lauf # eine Rückfrage zu stellen, die niemand beantwortet. - pkg update -y 2>&1 | rauschfilter - if pkg upgrade -y -o Dpkg::Options::=--force-confold 2>&1 | rauschfilter; then + AUSGABE=$(mktemp) + pkg update -y >"$AUSGABE" 2>&1; rauschfilter <"$AUSGABE" + + upgrade_lauf() { + pkg upgrade -y -o Dpkg::Options::=--force-confold "$@" >"$AUSGABE" 2>&1 + local rc=$? + rauschfilter <"$AUSGABE" + return $rc + } + + if upgrade_lauf; then ok "Termux ist aktuell" else - warn "Das Upgrade brach ab. Versuche zu reparieren …" - # Die übliche Ursache ist ein einzelnes Paket, das sich nicht auspacken - # ließ. Danach steckt dpkg halb fertig fest und blockiert alles Weitere. - dpkg --configure -a 2>&1 | rauschfilter - apt-get -f install -y 2>&1 | rauschfilter - if pkg upgrade -y -o Dpkg::Options::=--force-confold 2>&1 | rauschfilter; then - ok "Nach der Reparatur durchgelaufen" - else - warn "Bleibt unvollständig." - hinweis "Speicherplatz prüfen: df -h \$PREFIX" - hinweis "Fehler ohne Rauschen ansehen:" - hinweis " pkg upgrade -y 2>&1 | grep -viE 'unable to delete' | tail -20" - hinweis "Weiter geht es trotzdem — aber hier ansetzen, falls später etwas klemmt." + # Dateikonflikt gezielt behandeln. Er entsteht, wenn ein Paket aufgeteilt + # wurde und beide Teile kurzzeitig dieselbe Datei mitbringen — bei Termux + # etwa libmagic, herausgelöst aus file. dpkg verweigert dann grundsätzlich. + # + # --force-overwrite wird bewusst NUR hier gesetzt, nachdem der Konflikt in + # der Ausgabe nachgewiesen ist. Pauschal mitzugeben hieße, jede künftige + # Dateikollision stillschweigend zu übergehen. + if grep -q 'which is also in package' "$AUSGABE"; then + warn "Dateikonflikt zwischen zwei Paketen — typisch bei einer Paketaufteilung." + grep 'trying to overwrite' "$AUSGABE" | head -3 | sed 's/^/ /' + hinweis "Wiederhole gezielt mit --force-overwrite." + if upgrade_lauf -o Dpkg::Options::=--force-overwrite; then + ok "Konflikt aufgelöst, Upgrade durchgelaufen" + rm -f "$AUSGABE" + AUSGABE="" + fi + fi + + if [ -n "$AUSGABE" ] && ! upgrade_lauf; then + warn "Upgrade weiterhin unvollständig — versuche dpkg zu entwirren." + # Nach einem Abbruch steckt dpkg halb fertig fest und blockiert alles. + dpkg --configure -a >>"$AUSGABE" 2>&1 + apt-get -f install -y >>"$AUSGABE" 2>&1 + if upgrade_lauf -o Dpkg::Options::=--force-overwrite; then + ok "Nach der Reparatur durchgelaufen" + else + warn "Bleibt unvollständig." + hinweis "Speicherplatz prüfen: df -h \$PREFIX (nicht / — das ist die Systempartition)" + hinweis "Fehler ohne Rauschen: pkg upgrade -y 2>&1 | grep -viE 'unable to delete' | tail -20" + hinweis "Weiter geht es trotzdem — aber hier ansetzen, falls später etwas klemmt." + fi fi fi + rm -f "$AUSGABE" 2>/dev/null || true fi # ── git ────────────────────────────────────────────────────────────────────── diff --git a/spike/00-bootstrap-termux.sh b/spike/00-bootstrap-termux.sh index 51239f7..0a1aba5 100755 --- a/spike/00-bootstrap-termux.sh +++ b/spike/00-bootstrap-termux.sh @@ -38,11 +38,24 @@ else ok "Termux ist aktuell" else warn "Upgrade brach ab — versuche zu reparieren." + # Dateikonflikt gezielt behandeln: entsteht, wenn ein Paket aufgeteilt + # wurde und beide Teile kurzzeitig dieselbe Datei mitbringen — bei Termux + # etwa libmagic, herausgelöst aus file. --force-overwrite wird bewusst nur + # dann gesetzt, wenn der Konflikt im Protokoll nachgewiesen ist; pauschal + # hieße es, jede künftige Dateikollision stillschweigend zu übergehen. + if grep -q 'which is also in package' "$LOG" 2>/dev/null; then + warn "Dateikonflikt zwischen zwei Paketen erkannt:" + grep 'trying to overwrite' "$LOG" | tail -3 | sed 's/^/ /' | tee -a "$LOG" + hint "Typisch bei einer Paketaufteilung. Wiederhole mit --force-overwrite." + try pkg upgrade -y -o Dpkg::Options::=--force-confold \ + -o Dpkg::Options::=--force-overwrite + fi # Meist scheitert ein einzelnes Paket beim Auspacken, danach steckt dpkg # halb fertig fest und blockiert jede weitere Installation. try dpkg --configure -a try apt-get -f install -y - if try pkg upgrade -y -o Dpkg::Options::=--force-confold; then + if try pkg upgrade -y -o Dpkg::Options::=--force-confold \ + -o Dpkg::Options::=--force-overwrite; then ok "Nach der Reparatur durchgelaufen" else warn "Bleibt unvollständig."