#!/usr/bin/env bash
set -u
set -o pipefail

REPO_URL="https://github.com/MariaDB/server.git"
ROOT_DIR="${ROOT_DIR:-$PWD/mariadb-builds}"

BRANCHES=("11.8" "12.3" "13.0" "main")

MAKE_JOBS="${MAKE_JOBS:-24}"
MTR_PARALLEL="${MTR_PARALLEL:-24}"

mkdir -p "$ROOT_DIR"

SUMMARY="$ROOT_DIR/summary.txt"
: > "$SUMMARY"

log_run() {
    local logfile="$1"
    shift

    {
        echo "=== Command ==="
        printf '%q ' "$@"
        echo
        echo
        echo "=== Output ==="
        "$@"
    } >"$logfile" 2>&1
}

for branch in "${BRANCHES[@]}"; do
    echo "===== Processing branch: $branch ====="

    WORKDIR="$ROOT_DIR/mariadb-$branch"

    rm -rf "$WORKDIR"

    echo "Branch: $branch" >> "$SUMMARY"

    mkdir -p "$ROOT_DIR/logs"
    CLONE_LOG="$ROOT_DIR/logs/git-clone-$branch.log"

    echo "[clone] $branch"
    if ! log_run "$CLONE_LOG" \
        git clone --branch "$branch" --depth 1 "$REPO_URL" "$WORKDIR"; then
        echo "  git clone: FAILED" >> "$SUMMARY"
        echo "  clone log: $CLONE_LOG" >> "$SUMMARY"
        echo >> "$SUMMARY"
        tail -80 "$CLONE_LOG"
        continue
    fi

    LOGDIR="$WORKDIR/logs"
    mkdir -p "$LOGDIR"
    mv "$CLONE_LOG" "$LOGDIR/git-clone.log"

    cd "$WORKDIR" || exit 1

    echo "[submodules] $branch"
    if ! log_run "$LOGDIR/submodules.log" \
        git submodule update --init --recursive --depth 1; then
        echo "  submodules: FAILED" >> "$SUMMARY"
        echo "  logs: $LOGDIR" >> "$SUMMARY"
        echo >> "$SUMMARY"
        tail -80 "$LOGDIR/submodules.log"
        continue
    fi

    echo "[cmake] $branch"
    if ! log_run "$LOGDIR/cmake.log" \
        cmake . \
          -DCMAKE_BUILD_TYPE=RelWithDebInfo \
          -DCMAKE_C_COMPILER_LAUNCHER=ccache \
          -DCMAKE_C_COMPILER=gcc \
          -DCMAKE_CXX_COMPILER_LAUNCHER=ccache \
          -DCMAKE_CXX_COMPILER=g++ \
          -DPLUGIN_TOKUDB=NO \
          -DPLUGIN_MROONGA=NO \
          -DPLUGIN_SPIDER=YES \
          -DPLUGIN_OQGRAPH=NO \
          -DPLUGIN_PERFSCHEMA=YES \
          -DPLUGIN_SPHINX=NO; then
        echo "  cmake: FAILED" >> "$SUMMARY"
        echo "  make: SKIPPED" >> "$SUMMARY"
        echo "  mtr: SKIPPED" >> "$SUMMARY"
        echo "  logs: $LOGDIR" >> "$SUMMARY"
        echo >> "$SUMMARY"
        tail -80 "$LOGDIR/cmake.log"
        continue
    fi
    echo "  cmake: OK" >> "$SUMMARY"

    echo "[make] $branch"
    if ! log_run "$LOGDIR/make.log" \
        make -j "$MAKE_JOBS"; then
        echo "  make: FAILED" >> "$SUMMARY"
        echo "  mtr: SKIPPED" >> "$SUMMARY"
        echo "  logs: $LOGDIR" >> "$SUMMARY"
        echo >> "$SUMMARY"
        tail -80 "$LOGDIR/make.log"
        continue
    fi
    echo "  make: OK" >> "$SUMMARY"

    echo "[mtr] $branch"
    if ! (
        cd "$WORKDIR/mysql-test" &&
        {
            echo "=== Command ==="
            echo "MTR_FEEDBACK_PLUGIN=0 perl mysql-test-run.pl --verbose-restart --force --retry=3 --max-save-core=2 --max-save-datadir=10 --max-test-fail=20 --mem --parallel=$MTR_PARALLEL"
            echo
            echo "=== Output ==="
            MTR_FEEDBACK_PLUGIN=0 exec perl mysql-test-run.pl \
                --verbose-restart \
                --force \
                --retry=3 \
                --max-save-core=2 \
                --max-save-datadir=10 \
                --max-test-fail=20 \
                --mem \
                --parallel="$MTR_PARALLEL"
        } >"$LOGDIR/mtr.log" 2>&1
    ); then
        echo "  mtr: FAILED" >> "$SUMMARY"
        tail -80 "$LOGDIR/mtr.log"
    else
        echo "  mtr: OK" >> "$SUMMARY"
    fi

    echo "  logs: $LOGDIR" >> "$SUMMARY"
    echo >> "$SUMMARY"
done

echo
echo "===== SUMMARY ====="
cat "$SUMMARY"
