effeff

Über diese Website

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?

Das Skript:

#!/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