#!/usr/bin/env bash
# -----------------------------------------------------------------------
# Copyright 2018-2024 Open Networking Foundation Contributors
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http:#www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
# -----------------------------------------------------------------------
# SPDX-FileCopyrightText: 2018-2024 Open Networking Foundation Contributors
# SPDX-License-Identifier: Apache-2.0
# -----------------------------------------------------------------------
# Intent:
# chart_version_check.sh
# checks that changes to a chart include a change to the chart version
# ---------------------------------------------------------------------------

set -u
# set -euo pipefail

##-------------------##
##---]  GLOBALS  [---##
##-------------------##
declare -i -g force_fail=0
declare -a -g error_stream=()

# declare -A -g ARGV=() # ARGV['debug']=1
# declare -i -g debug=1 # uncomment to enable

##--------------------##
##---]  INCLUDES  [---##
##--------------------##
{
    declare pgm
    pgm="$(realpath "${BASH_SOURCE[0]}")"
    declare libdir="${pgm%.sh}"

    # shellcheck source=chart_version_check/filter_files.sh
    # shellcheck disable=SC1091
    source "$libdir/filter_files.sh"
}

## -----------------------------------------------------------------------
## Intent: Display a program banner for logging
## -----------------------------------------------------------------------
# shellcheck disable=SC2120
function banner()
{
    local program="${0##*/}"

    cat <<BANNER

# -----------------------------------------------------------------------
# Running: ${program} $@
# -----------------------------------------------------------------------
# Now: $(date '+%Y-%m-%d %H:%M:%S')
# Git: $(git --version)
# -----------------------------------------------------------------------
#         WORKSPACE: $(realpath "${WORKSPACE}")
#  WORKSPACE_BRANCH: $(git rev-parse --abbrev-ref HEAD)
# COMPARISON_BRANCH: ${COMPARISON_BRANCH}
# -----------------------------------------------------------------------
BANNER

    return
}

## -----------------------------------------------------------------------
## Intent: Augment a version string for display.  If the given string
##         is empty rewrite to make that detail painfully obvious.
## -----------------------------------------------------------------------
function version_for_display()
{
    local -n ref=$1; shift

    if [[ ${#ref} -eq 0 ]]; then
        ref='?????????????????' # higlight the problem for reporting
    fi
    return
}

## -----------------------------------------------------------------------
## Intent: Use git commands to retrieve chart version embedded within a file
## -----------------------------------------------------------------------
## Given:
##   ref     Indirect var for version string return.
##   path    Repository path to a Chart.yaml file
##   branch  git branch to retrieve
##
## Return:
##   ref     Extracted version string
## -----------------------------------------------------------------------
function get_version_by_git()
{
    local -n ref=$1   ; shift
    local path="$1"   ; shift
    local branch="$1" ; shift

    ref=''

    # -----------------------------------------------------------------------
    # cat "{branch}:{chart}" to stdout: (wanted => 'version : x.y.z')
    # -----------------------------------------------------------------------
    readarray -t buffer < <(\
                            git show "${branch}:${path}" \
                                | grep '^[[:blank:]]*version[[:blank:]]*:'\
        )

    # -----------------------------------------------------------------------
    # Extract version string
    # -----------------------------------------------------------------------
    if [[ ${#buffer[@]} -gt 1 ]]; then
        cat <<EOM

** -----------------------------------------------------------------------
**     IAM: ${BASH_SOURCE[0]} (LINENO: ${LINENO})
**   CHART: $path
** WARNING: Unable to identify chart version, multiple strings detected.
**        : Consider updating the lint tool to be aware of Chart.yaml
**        : record syntax so versions can be extracted for comparison.
** -----------------------------------------------------------------------
EOM
        ## c_v_c.sh needs to be aware of Chart.yaml record syntax
        ## so a version can be targeted.

        # shellcheck disable=SC1003 
        declare -p buffer \
            | tr '"' '\n' \
            | grep '\.' \
            | sed -e 's/^[[:blank:]]*//' \
            | awk -F'\\' '{print "    "$1}' \
            | sort -nr
        echo

        ref='' # Highly forgiving (display only)
    elif [[ ${#buffer[@]} -ne 1 ]]; then
        ref='' # Highly forgiving (display only)
    else
        local raw="${buffer[0]}"
        # Extract value, split on whitespace, colon, comment or quote
        readarray -t fields < <(awk -F '[[:blank:]:#"]+' '{print $2}' <<<"$raw")
        ref="${fields[0]}"
    fi

    return
}

## -----------------------------------------------------------------------
## Intent: Display a log summary entry then exit with status.
## -----------------------------------------------------------------------
function summary_status_with_exit()
{
    local exit_code=$1; shift
    local program="${0##*/}"
    local summary=''
    [[ $# -gt 0 ]] && { summary=" - $1"; shift; }

    ## -----------------------------------
    ## status override courtesy of error()
    ## -----------------------------------
    declare -i -g force_fail
    if [ $force_fail -eq 1 ]; then exit_code=$force_fail; fi

    ## --------------------------
    ## Set summary display string
    ## --------------------------
    case "$exit_code" in
        0) status='PASS' ;;
        *) status='FAIL' ;;
    esac

    [[ $# -gt 0 ]] && formatStream "$@"

    echo
    echo "[$status] ${program} ${summary}"

    exit "$exit_code"
}

## -----------------------------------------------------------------------
## Intent: Display an error and configure report summary_status as FAIL
## -----------------------------------------------------------------------
function error()
{
    declare -i -g force_fail=1
    declare -a -g error_stream

    # shellcheck disable=SC2124
    local error="[ERROR] $@"
    error_stream+=("$error")
    echo "$error"
    return
}

## -----------------------------------------------------------------------
## Intent: Given a list (header and data) format contents as a log entry
## -----------------------------------------------------------------------
##  Usage: displayList --banner "List of something" "${data_stream[@]}"
## -----------------------------------------------------------------------
function displayList()
{
    local indent=''
    while [ $# -gt 0 ]; do
        local arg="$1"
        case "$arg" in
            -*banner)  shift; echo "$1"     ;;
            -*indent)  shift; indent="$1"   ;;
            -*tab-2)   echo -n '  '         ;;
            -*tab-4)   echo -n '    '       ;;
            -*tab-6)   echo -n '      '     ;;
            -*tab-8)   echo -n '        '   ;;
            -*newline) echo;                ;;
            -*tab)     echo -n '    '       ;;
            *) break                        ;;
        esac
        shift
    done

    for line in "$@";
    do
        echo -e "  ${indent}$line"
    done
    return
}

## -----------------------------------------------------------------------
## Intent: Program init, provide defaults for globals, etc.
## -----------------------------------------------------------------------
function init()
{
    # when not running under Jenkins, use current dir as workspace
    #   o [TODO] - Perform a secondary username check to guard against a
    #     jenkins/bash env hiccup leaving WORKSPACE= temporarily undefined.
    WORKSPACE=${WORKSPACE:-.}
    COMPARISON_BRANCH="${COMPARISON_BRANCH:-opencord/master}"
    return
}

## -----------------------------------------------------------------------
## Intent: Remove quotes, whitespace & garbage from a string
## -----------------------------------------------------------------------
## ..seealso: https://www.regular-expressions.info/posixbrackets.html
## -----------------------------------------------------------------------
function filter_codes()
{
    declare -n val="$1"; shift             # indirect
    val="${val//[\"\'[:blank:][:cntrl:]]}" # [:punct:] contains hyphen
    return
}

## -----------------------------------------------------------------------
## Intent: Detect and report VERSION file changes
## -----------------------------------------------------------------------
## :param path: Path to a Chart.yaml file.
## :type  path: str
##
## :param branch: Comparsion baranch (?-remote-?)
## :type  branch: str
##
## :return: true if embedded version string was modified.
## :rtype:  int
## -----------------------------------------------------------------------
## ..note: What about change detection for: apiVersion, appVersion (?)
## -----------------------------------------------------------------------
function version_diff()
{
    local path="$1";         shift
    local branch="$1";       shift

    declare -n old_var="$1"; shift # indirect
    declare -n new_var="$1"; shift # indirect

    old_var=''
    new_var=''
    readarray -t delta < <(git diff -p "$branch" -- "$path")

    local modified=0
    if [ ${#delta[@]} -gt 0 ]; then # modified

        #----------------------------------------
        # diff --git a/voltha-adapter-openolt/Chart.yaml [...]
        # --- a/voltha-adapter-openolt/Chart.yaml
        # +++ b/voltha-adapter-openolt/Chart.yaml
        # @@ -14,7 +14,7 @@
        # ---
        # -version: "2.11.3"   (====> 2.11.3)
        # +version: "2.11.8"   (====> 2.11.8)
        #----------------------------------------
        local line
        for line in "${delta[@]}";
        do
            case "$line" in
                -version*:*)
                    modified=1
                    readarray -t tmp <<< "${line#*: }"
                    # shellcheck disable=SC2034
                    old_var="${tmp[0]}"
                    filter_codes 'old_var'
                    ;;
                +version*:*)
                    readarray -t tmp <<< "${line#*: }"
                    # shellcheck disable=SC2034
                    new_var="${tmp[0]}"
                    filter_codes 'new_var'
                    ;;
            esac
        done
    fi

    [ $modified -ne 0 ] # set $? for if/then/elif use: "if version_diff; then"
    return
}

## -----------------------------------------------------------------------
## Intent: Gather a list of Chart.yaml files from the workspace.
## -----------------------------------------------------------------------
function gather_charts()
{
    declare -n varname="$1"; shift
    readarray -t varname < <(find . -name 'Chart.yaml' -print)
    filter_files varname

    local idx
    for (( idx=0; idx<${#varname[@]}; idx++ ));
    do
        local val="${varname[idx]}"
        if [ ${#val} -lt 2 ]; then continue; fi

        # Normalize: remove './' to support path comparison
        if [[ "${val:0:2}" == './' ]]; then
            varname[idx]="${val:2:${#val}}"
            [[ -v debug ]] && echo "[$idx] ${varname[$idx]}"
        fi
    done

    [[ -v debug ]] && declare -p varname
    return
}

## -----------------------------------------------------------------------
## Intent: Given a chart file and complete list of modified files
##   display a list of files modified in the chart directory.
## -----------------------------------------------------------------------
## :param chart: path to a Chart.yaml file
## :type  chart: str
##
## :param varname: A list files modified in a git sandbox.
## :type  varname: list, indirect
## -----------------------------------------------------------------------
function report_modified()
{
    local chart="$1"; shift
    local dir="${chart%/*}"
    # shellcheck disable=SC2178
    declare -n varname="$1"; shift

    ## ---------------------------------------------
    ## Gather files contained in the chart directory
    ## ---------------------------------------------
    declare -a found=()
    for val in "${varname[@]}";
    do
        case "$val" in
            *'/Chart.yaml')            ;; # special case
            "${dir}"*) found+=("$val") ;;
        esac
    done

    ## --------------------------------------------
    ## Display results when modified files detected
    ## --------------------------------------------
    if [ ${#found[@]} -gt 0 ]; then
        declare -a stream=()
        stream+=('--tab-4')
        stream+=('--banner' "Files Changed: $dir")
        stream+=('--tab-6') # really --tab-8
        stream+=("${found[@]}")
        displayList "${stream[@]}"
    fi

    [ ${#found[@]} -gt 0 ] # set $? for if/else
    return
}

## -----------------------------------------------------------------------
## Intent: Gather a list of Chart.yaml files from the workspace.
## -----------------------------------------------------------------------
declare -a -g charts=()
declare -a -g changes_remote=()
declare -a -g untracked_files=()
function gather_state()
{
    local branch="$1"; shift

    gather_charts 'charts'
    [[ -v debug ]] && declare -p charts

    readarray -t changes_remote < <(git diff --name-only "$branch")
    filter_files changes_remote
    [[ -v debug ]] && declare -p changes_remote

    readarray -t untracked_files < <(git ls-files -o --exclude-standard)
    filter_files untracked_files
    [[ -v debug ]] && declare -p untracked_files

    return
}

# shellcheck disable=SC1073
##----------------##
##---]  MAIN  [---##
##----------------##
init
# shellcheck disable=SC2119
banner
gather_state "$COMPARISON_BRANCH"

chart=''
for chart in "${charts[@]}";
do
    [[ -v debug ]] && echo -e "\nCHART: $chart"

    ## ---------------------------
    ## Detect VERSION file changes
    ## ---------------------------
    declare -i chart_modified=0
    old=''
    new=''
    if version_diff "$chart" "$COMPARISON_BRANCH" 'old' 'new'; then
        version_for_display new
        suffix="($old => $new)" # display verion deltas in the right margin
        printf '[CHART] %-60s %s\n' "$chart" "$suffix"
        chart_modified=1
    else
        if [[ ${#old} -eq 0 ]]; then
            get_version_by_git old "$chart" "$COMPARISON_BRANCH"
        fi
        version_for_display old
        suffix="($old)"
        printf '[CHART] %s\n' "$chart"
        new="$old"
    fi

    ## -----------------------------------
    ## Report modified files for the chart
    ## -----------------------------------
    declare -a combo_list=()
    combo_list+=("${changes_remote[@]}")
    combo_list+=("${untracked_files[@]}")
    if report_modified "$chart" 'combo_list';
    then
        if [ $chart_modified -eq 0 ]; then
            version_for_display new
            suffix="($old)"
            error "Chart modified but version unchanged: ${chart} ${suffix}"
        fi
    fi

done

## ---------------------------
## Report summary: local edits
## ---------------------------
if [[ -x changes_remote ]] && [ ${#changes_remote} -gt 0 ]; then # local_edits
    displayList \
        '--newline'                 \
        '--banner' 'Changed Files:' \
        "${changes_remote[@]}"
fi

## -------------------------------
## Report summary: untracked files
## -------------------------------
if [ ${#untracked_files[@]} -gt 0 ]; then
    displayList \
        '--newline'                   \
        '--banner' 'Untracked Files:' \
        "${untracked_files[@]}"
fi

## ---------------------------------
## Report summary: problems detected
## ---------------------------------
declare -a -g error_stream
if [ ${#error_stream[@]} -gt 0 ]; then
    displayList \
        '--newline'                 \
        '--banner' 'Error Sumamry:' \
        "${error_stream[@]}"
fi

summary_status_with_exit $?

# -----------------------------------------------------------------------
# Running: chart_version_check.sh
# -----------------------------------------------------------------------
# Now: 2022-12-09 03:10:52
# Git: git version 2.34.1
# -----------------------------------------------------------------------
# COMPARISON_BRANCH: origin/master
#         WORKSPACE: .
# -----------------------------------------------------------------------
# [CHART] voltha-adapter-openolt/Chart.yaml                            (2.11.3 => 2.11.8)
# [CHART] voltha-tracing/Chart.yaml
# [CHART] voltha/Chart.yaml
#    Files Changed: voltha-tracing
#        voltha-tracing/values.yaml
# [ERROR] Chart modified but version unchanged: voltha-tracing
# [CHART] voltha/Chart.yaml
# -----------------------------------------------------------------------

# [SEE ALSO
# ---------------------------------------------------------------------------
# https://www.regular-expressions.info/posixbrackets.html (character classes)
# ---------------------------------------------------------------------------
