Zurzeit versuche ich mit ein post-commit hook für git und der neocities cli nur geänderte Daten hochzuladen.
Ehrlich gesagt, ich überlasse extrem viel der KI und verstehe selber kaum den Inhalt der Skripte. Aber wie geht das alte Sprichwort: "Kontrolle ist besser, Vertrauen ist gut?"
"Sharing is caring" - Wer macht schon gerne die sogenannte Care-Arbeit? Wird das wirklich eine KI machen wollen / können?
#!/usr/bin/env bash
#
# .git/hooks/post-commit
#
# Deployed nach jedem Commit automatisch nur die geänderten Dateien
# zu Neocities: neue/geänderte Dateien werden gepusht, gelöschte
# Dateien werden auf Neocities ebenfalls gelöscht.
#
# Installation:
# cp post-commit .git/hooks/post-commit
# chmod +x .git/hooks/post-commit
set -uo pipefail
# Kein 'set -e' hier bewusst: ein einzelner Fehler soll nicht den
# ganzen Hook abbrechen, sondern nur diese eine Datei überspringen.
OUTPUT_PATH="htdocs" # lektor --output-path
LOG_FILE=".neocities-deploy.log"
MANIFEST=".neocities-manifest" # Checksummen des letzten Deploys
timestamp() { date "+%Y-%m-%d %H:%M:%S"; }
echo "[$(timestamp)] --- Deploy gestartet (Commit $(git rev-parse --short HEAD)) ---" | tee -a "$LOG_FILE"
# --- 1. Lektor bauen (Quellcode -> htdocs) ---
echo "[$(timestamp)] Baue mit Lektor..." | tee -a "$LOG_FILE"
if ! lektor build --output-path "$OUTPUT_PATH" >>"$LOG_FILE" 2>&1; then
echo "[$(timestamp)] FEHLER: lektor build fehlgeschlagen, Deploy abgebrochen." | tee -a "$LOG_FILE"
exit 1
fi
# --- 2. Neue Checksummen aller Output-Dateien erzeugen ---
# .lektor/ ist Lektors interner Build-Cache und gehört nicht auf die Site
new_manifest=$(mktemp "${TMPDIR:-/tmp}/neocities-manifest.XXXXXX")
find "$OUTPUT_PATH" -type f -not -path "*/.lektor/*" -exec shasum -a 256 {} \; | sort -k2 > "$new_manifest"
# --- 3. Mit letztem Deploy vergleichen (falls vorhanden) ---
push_count=0
delete_count=0
if [[ ! -f "$MANIFEST" ]]; then
echo "[$(timestamp)] Kein vorheriges Manifest – deploye alle Dateien." | tee -a "$LOG_FILE"
changed_files=$(awk '{ $1=""; sub(/^ /,""); print }' "$new_manifest")
deleted_files=""
else
# Dateien, deren Checksumme sich geändert hat ODER die neu sind (Pfad in new, Hash/Pfad-Kombi fehlt)
changed_files=$(comm -13 <(sort "$MANIFEST") <(sort "$new_manifest") \
| awk '{ $1=""; sub(/^ /,""); print }')
# Dateien, die im alten Manifest waren, aber im neuen fehlen -> gelöscht
deleted_files=$(comm -23 \
<(awk '{ $1=""; sub(/^ /,""); print }' "$MANIFEST" | sort) \
<(awk '{ $1=""; sub(/^ /,""); print }' "$new_manifest" | sort))
fi
# --- 4. Geänderte/neue Dateien hochladen ---
if [[ -n "$changed_files" ]]; then
while IFS= read -r f; do
[[ -z "$f" ]] && continue
# Remote-Pfad = lokaler Pfad ohne den htdocs/-Präfix
remote_path="${f#$OUTPUT_PATH/}"
remote_dir=$(dirname "$remote_path")
echo "[$(timestamp)] Upload: $f -> $remote_path"
if [[ "$remote_dir" == "." ]]; then
# Datei liegt im Root -> kein -d nötig
result=$(neocities upload "$f" 2>&1)
else
result=$(neocities upload -d "$remote_dir" "$f" 2>&1)
fi
echo "$result" >>"$LOG_FILE"
if echo "$result" | grep -q "SUCCESS"; then
echo " OK"; ((push_count++))
else
echo " FEHLER beim Upload von $f" | tee -a "$LOG_FILE"
fi
done <<< "$changed_files"
else
echo "[$(timestamp)] Keine geänderten Dateien." | tee -a "$LOG_FILE"
fi
# --- 5. Gelöschte Dateien auf Neocities entfernen (index.html geschützt) ---
if [[ -n "$deleted_files" ]]; then
while IFS= read -r f; do
[[ -z "$f" ]] && continue
remote_path="${f#$OUTPUT_PATH/}"
if [[ "$remote_path" == "index.html" ]]; then
echo "[$(timestamp)] Geschützt: index.html wird nicht gelöscht." | tee -a "$LOG_FILE"
continue
fi
echo "[$(timestamp)] Lösche auf Neocities: $remote_path"
if neocities delete "$remote_path" >>"$LOG_FILE" 2>&1; then
echo " OK"; ((delete_count++))
else
echo " FEHLER beim Löschen von $remote_path" | tee -a "$LOG_FILE"
fi
done <<< "$deleted_files"
fi
# --- 6. Manifest für nächsten Vergleich speichern ---
mv "$new_manifest" "$MANIFEST"
echo "[$(timestamp)] --- Deploy abgeschlossen: $push_count gepusht, $delete_count gelöscht ---" | tee -a "$LOG_FILE"
echo "Details siehe $LOG_FILE"
PS. Es funktioniert mit sogar mit awk version 20070501. Alternativ probiere es mit:
gawk --version
GNU Awk 5.4.1, API 4.1, PMA Avon 8-g1