diff --git a/scripts/update.sh b/scripts/update.sh index 1b98331..64ced70 100644 --- a/scripts/update.sh +++ b/scripts/update.sh @@ -137,21 +137,25 @@ fi schritt "Was sich aendert" -if [ -f CHANGELOG.md ]; then +# Der Changelog muss aus der ZIELfassung kommen: Der laufende Stand kennt +# die neuen Abschnitte ja noch gar nicht. +CHANGELOG="$(git show "$ZIEL:CHANGELOG.md" 2>/dev/null || true)" + +if [ -n "$CHANGELOG" ]; then # Alle Abschnitte zwischen dem laufenden und dem gewuenschten Stand. - ZIEL_NR="${ZIEL#v}" JETZT_NR="${JETZT#v}" - awk -v ziel="$ZIEL_NR" -v jetzt="$JETZT_NR" ' + printf '%s +' "$CHANGELOG" | awk -v jetzt="$JETZT_NR" ' /^## \[/ { nummer = $0 sub(/^## \[/, "", nummer); sub(/\].*/, "", nummer) - drucken = (nummer != "Unveröffentlicht" && nummer != jetzt) if (nummer == jetzt) exit + drucken = (nummer != "Unveröffentlicht") } drucken { print " " $0 } - ' CHANGELOG.md | head -60 + ' | head -60 else - warnung "Kein CHANGELOG.md gefunden." + warnung "Kein CHANGELOG.md in $ZIEL gefunden." fi printf '\n' @@ -256,7 +260,32 @@ else fi schritt "Umschalten auf $ZIEL" -git checkout --quiet "$ZIEL" + +# Eine unversionierte Datei kann im Weg stehen, wenn die Zielfassung sie +# fuehrt. Das passiert beim Update auf die Fassung, die dieses Skript +# eingefuehrt hat: Man hat es sich von Hand geholt, jetzt gehoert es dazu. +# Solche Dateien werden nicht weggeworfen, sondern beiseite geschoben. +if ! git checkout --quiet "$ZIEL" 2>/dev/null; then + IM_WEG="$(git checkout "$ZIEL" 2>&1 | sed -n '/would be overwritten/,/^Aborting/p' | grep -E '^\s' | tr -d ' ' | grep -v '^$' || true)" + + if [ -n "$IM_WEG" ]; then + ZEIT="$(date +%Y%m%d-%H%M%S)" + printf ' Diese unversionierten Dateien stehen im Weg: +' + for datei in $IM_WEG; do + [ -e "$datei" ] || continue + mv "$datei" "${datei}.vor-update-${ZEIT}" + printf ' %s -> %s.vor-update-%s +' "$datei" "$datei" "$ZEIT" + done + git checkout --quiet "$ZIEL" || abbruch "Das Umschalten auf $ZIEL ist fehlgeschlagen. + Deine Aenderungen liegen im Stash: git stash list" + else + abbruch "Das Umschalten auf $ZIEL ist fehlgeschlagen. +$([ -n "$SCHMUTZIG" ] && printf ' Deine Aenderungen liegen im Stash: git stash list')" + fi +fi + gut "$(git describe --tags --always)" schritt "Bauen und starten"