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

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

    preamble "${template}"

    gen_basics
    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_basics() {
    local tst

    # Skip basic tests when explicitly building defconfigs or runtime tests
    case "${CI_COMMIT_REF_NAME}" in
        (*-defconfigs)      return;;
        (*-*_defconfig)     return;;
        (*-runtime-tests)   return;;
        (*-tests.*)         return;;
    esac

    for tst in DEVELOPERS flake8 package; do
        printf 'check-%s: { extends: .check-%s_base }\n' "${tst}" "${tst}"
    done
}

gen_defconfigs() {
    local -a defconfigs
    local template cfg ext

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

    if [ -n "${CI_COMMIT_TAG}" ]; then
        # For tags, create a pipeline.
        template=base
    fi
    if [ -n "${CI_PIPELINE_TRIGGERED}" ]; then
        # For pipeline created by using a trigger token.
        template=base
    fi
    case "${CI_COMMIT_REF_NAME}" in
        # For master, next, and maintenance branches, only check the defconfigs
        (master|next|????.??.x)
            template=check
            ext=_check
        ;;
        # For the branch or tag name named *-defconfigs, create a pipeline.
        (*-defconfigs)
            template=base
        ;;
        (*-*_defconfig)
            defconfigs=( "${CI_COMMIT_REF_NAME##*-}" )
            template=base
        ;;
    esac

    if [ -n "${template}" ]; then
        for cfg in "${defconfigs[@]}"; do
            printf '%s%s: { extends: .defconfig_%s }\n' \
                   "${cfg}" "${ext}" "${template}"
        done
    fi
}

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_base }\n' "${tests[@]}"
    fi
}

main "${@}"
