| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253 | #!/usr/bin/env bash
# This file needs to be run from the git root directory!
# Exit script on the first error
set -o errexit -o nounset
export RUSTFLAGS="--deny warnings"
# Jedes `hwN/taskN` Verzeichnis enthält entweder ein Cargo-Projekt (also eine
# Cargo.toml) oder eine einzige `.rs`-Datei für Nicht-Cargo-Projekte die direkt
# mit rustc kompiliert werden.
#
# Um den Travis-Cache effizient zu nutzen (es wird `/target` gecached) und
# generell die CI-Zeiten zu verringern, wechseln wir nie das Verzeichnis und
# kompilieren immer nur die Aufgaben des aktuellsten Aufgabenblatts.
current_hw=$(find . -type f | grep "hw./task./Cargo\.toml" | sort | tail -n1 | cut -d / -f -2)
if [ -z "$current_hw" ]; then
    echo ""
    echo "=== Keine Aufgaben gefunden. Beende."
    exit 0
fi
echo ""
echo "=== Aktuelles Aufgabenblatt ist in Ordner $current_hw"
while IFS= read -r -d '' taskdir; do
    echo ""
    echo "=== Teste Lösung von Aufgabe in $taskdir"
    manifest="$taskdir/Cargo.toml"
    if [ -e "$manifest" ]; then
        echo "=== Cargo-Manifest gefunden in '$manifest' -> Cargo-Modus"
        cargo test --manifest-path "$manifest"
    elif [ "$(find "$taskdir" -maxdepth 1 -type f -name '*.rs' | wc -l)" -ne 0 ]; then
        echo "=== Sourcedatei(en) gefunden -> rustc-Modus"
        for srcfile in $taskdir/*.rs; do
            echo "=== Kompiliere und teste '$srcfile'..."
            rustc "$srcfile"
            rustc --test -o rustctest "$srcfile"
            ./rustctest
        done
    else
        echo ""
        echo "!!! Falsch konfigurierter Aufgabenordner oder ungelöste Aufgabe"
        echo "!!! Bitte .rs-Dateien in '$taskdir' ablegen"
        echo "!!! Oder ein Cargo-Projekt mit 'cargo init' darin erzeugen"
        echo "!!! Alternativ den Ordner löschen"
        exit 1
    fi
done < <(find "$current_hw" -mindepth 1 -maxdepth 1 -type d -name 'task*' -print0)
 |