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

main() {
    local template="${1}"

    preamble "${template}"

    gen_defconfigs
    gen_tests
}

preamble() {
    local template="${1}"

    cat - "${template}" <<-_EOF_
	# This file is generated; do not edit!
	# Builds appear on https://gitlab.com/buildroot.org/buildroot/pipelines

	image: ${CI_JOB_IMAGE}

_EOF_
}

gen_defconfigs() {
    local -a defconfigs
    local build_defconfigs cfg

    defconfigs=( $(cd configs; LC_ALL=C ls -1 *_defconfig) )

    build_defconfigs=false
    if [ -n "${CI_COMMIT_TAG}" ]; then
        # For tags, create a pipeline.
        build_defconfigs=true
    fi
    if [ -n "${CI_PIPELINE_TRIGGERED}" ]; then
        # For pipeline created by using a trigger token.
        build_defconfigs=true
    fi
    case "${CI_COMMIT_REF_NAME}" in
        # For the branch or tag name named *-defconfigs, create a pipeline.
        (*-defconfigs)
            build_defconfigs=true
        ;;
        (*-*_defconfig)
            defconfigs=( "${CI_COMMIT_REF_NAME##*-}" )
            build_defconfigs=true
        ;;
    esac

    for cfg in "${defconfigs[@]}"; do
        if ${build_defconfigs}; then
            printf '%s: { extends: .defconfig }\n' "${cfg}"
        else
            printf '%s_check: { extends: .defconfig_check }\n' "${cfg}"
        fi
    done
}

gen_tests() {
    local -a tests
    local run_tests tst

    tests=( $(./support/testing/run-tests -l 2>&1 \
              | sed -r -e '/^test_run \((.*)\).*/!d; s//\1/'\
              | LC_ALL=C sort)
          )

    run_tests=false
    if [ -n "${CI_COMMIT_TAG}" ]; then
        # For tags, create a pipeline.
        run_tests=true
    fi
    if [ -n "${CI_PIPELINE_TRIGGERED}" ]; then
        # For pipeline created by using a trigger token.
        run_tests=true
    fi
    case "${CI_COMMIT_REF_NAME}" in
        # For the branch or tag name named *-runtime-tests, create a pipeline.
        (*-runtime-tests)
            run_tests=true
        ;;
        (*-tests.*)
            tests=( "${CI_COMMIT_REF_NAME##*-}" )
            run_tests=true
        ;;
    esac

    if ${run_tests}; then
        printf '%s: { extends: .runtime_test }\n' "${tests[@]}"
    fi
}

main "${@}"
