#!/bin/bash
# Copyright lowRISC contributors.
# Licensed under the Apache License, Version 2.0, see LICENSE for details.
# SPDX-License-Identifier: Apache-2.0

# Returns 0 if there are no changes or untracked files, 1 otherwise.
# Show the diff on STDOUT if there's deviation.
is_clean() {
    local output
    output="$(git status --porcelain)" || return 1
    test -z "$output" && return 0
    echo Diff between the regenerated content and the content in this PR/the repository:
    git diff
    return 1
}

# Clean up the repo so that we can check further auto-generated stuff
cleanup() {
    git clean -fxd >/dev/null
    git reset --hard >/dev/null
}

# Run a command and then check the tree is still clean. Print a message if not.
gen_and_check_clean() {
    thing="$1"
    shift
    "$@" || {
        echo -n "##vso[task.logissue type=error]"
        echo "Failed to auto-generate $thing. (command: '$@')"
        echo
        cleanup
        return 1
    }

    is_clean || {
        echo -n "##vso[task.logissue type=error]"
        echo "Auto-generated $thing not up-to-date. Regenerate with '$@'."
        echo
        cleanup
        return 1
    }
}

# A specialized version of gen_and_check_clean for targets of the Makefile in hw
gen_hw_and_check_clean() {
    gen_and_check_clean "$1" make -k -C hw "$2"
}

# Check generated files are up to date

bad=0

gen_hw_and_check_clean "Register headers" regs         || bad=1
gen_hw_and_check_clean "tops"             top          || bad=1
gen_hw_and_check_clean "OTP memory map"   otp-mmap     || bad=1
gen_hw_and_check_clean "LC state"         lc-state-enc || bad=1

gen_and_check_clean \
    "flash_ctrl code" \
    hw/ip/flash_ctrl/util/flash_ctrl_gen.py || bad=1

gen_and_check_clean \
    "secded primitive code" \
    util/design/secded_gen.py --no_fpv || bad=1

gen_and_check_clean \
    "DIFs" \
    util/make_new_dif.py --mode=regen --only=autogen || bad=1

gen_and_check_clean "MUBI package" util/design/gen-mubi.py || bad=1

exit $bad
