#!/bin/bash
set -eu

TEST_POD=$(kubectl get pod -l app="test_pg" -nsre -o=jsonpath='{.items[*].metadata.name}')
LLVM_VERSIONS=(13 14 15 16 17 18 19)

setup_test_pod()
{
    local pod="$1"

    # Install packages
    kubectl exec "$pod" -- bash -c 'apt update ; DEBIAN_FRONTEND=noninteractive apt install --no-install-recommends -y tmux vim make g++ pkg-config coreutils git wget lsb-release wget software-properties-common gnupg bison flex libreadline-dev zlib1g-dev libzstd-dev'

    # Create PG user
    kubectl exec "$pod" -- bash -c '[ -d /var/lib/postgresql ] || useradd -s /bin/bash -d /var/lib/postgresql postgres'
    kubectl exec "$pod" -- bash -c 'mkdir -p /var/lib/postgresql; chown postgres:postgres /var/lib/postgresql'
    kubectl exec "$pod" -- bash -c 'mkdir -p /var/run/postgresql/; chown postgres:postgres /var/run/postgresql' &

    # Checkout PG
    kubectl exec "$pod" -- bash -c 'su postgres -c "cd; [ -d postgres_base ] || git clone --single-branch --branch master https://github.com/postgres/postgres.git postgres_base"'

    # Create patched version
    kubectl cp "v5-0001-Backport-of-LLVM-code-to-fix-ARM-relocation-bug.patch" "$pod":/var/lib/postgresql/
    kubectl exec "$pod" -- bash -c 'su postgres -c "cd; [ -d postgres_patched ] || (git clone postgres_base postgres_patched && cd postgres_patched && git apply ~/v5-0001-Backport-of-LLVM-code-to-fix-ARM-relocation-bug.patch)"'

    # Install LLVM packages
    kubectl exec "$pod" -- bash -c 'wget https://apt.llvm.org/llvm.sh && chmod +x llvm.sh'
    for version in ${LLVM_VERSIONS[@]}; do
        kubectl exec "$pod" -- bash -c "./llvm.sh $version"
    done

    wait

    # Compile PG against different llvm versions
    # Base version
    for version in ${LLVM_VERSIONS[@]}; do
        build_dir="~/postgres_build/build_${version}"
        kubectl exec "$pod" -- bash -c "su postgres -c \" mkdir -p $build_dir; cd $build_dir; [ -f GNUmakefile ] || CXX=clang++-${version} CLANG=clang-${version} LLVM_CONFIG=llvm-config-${version} CFLAGS=-O0 ~/postgres_base/configure --enable-cassert --enable-debug --prefix /var/lib/postgresql/.local --with-llvm > /dev/null \" "
        kubectl exec "$pod" -- bash -c "su postgres -c \" cd $build_dir; make -j19 &>> /dev/null \" "
    done

    # Patched version
    for version in ${LLVM_VERSIONS[@]}; do
        build_dir="~/postgres_build/build_patched_${version}"
        kubectl exec "$pod" -- bash -c "su postgres -c \" mkdir -p $build_dir; cd $build_dir; CXX=clang++-${version} CLANG=clang-${version} LLVM_CONFIG=llvm-config-${version} CFLAGS=-O0 ~/postgres_patched/configure --enable-cassert --enable-debug --prefix /var/lib/postgresql/.local --with-llvm > /dev/null \" "
        kubectl exec "$pod" -- bash -c "su postgres -c \" cd $build_dir; make -j19 &>> /dev/null \" "
    done
}

setup_test_pod "$TEST_POD"

wait
