#!/usr/bin/env bash

# Copyright 2018-present Open Networking Foundation
#
# 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.

# chart_version_check.sh
# checks that changes to a chart include a change to the chart version

set -u

echo "# chart_version_check.sh, using git: $(git --version) #"

# Collect success/failure, and list/types of failures
fail_version=0
failed_charts=""

# when not running under Jenkins, use current dir as workspace
WORKSPACE=${WORKSPACE:-.}

# branch to compare against, defaults to master
COMPARISON_BRANCH="${COMPARISON_BRANCH:-opencord/master}"
echo "# Comparing with branch: $COMPARISON_BRANCH"

# Create list of changed files compared to branch
changed_files=$(git diff --name-only "${COMPARISON_BRANCH}")

# Create list of untracked by git files
untracked_files=$(git ls-files -o --exclude-standard)

# Print lists of files that are changed/untracked
if [ -z "$changed_files" ] && [ -z "$untracked_files" ]
then
  echo "# chart_version_check.sh - No changes, Success! #"
  exit 0
else
  if [ -n "$changed_files" ]
  then
    echo "Changed files compared with $COMPARISON_BRANCH:"
    # Search and replace per SC2001 doesn't recognize ^ (beginning of line)
    # shellcheck disable=SC2001
    echo "${changed_files}" | sed 's/^/  /'
  fi
  if [ -n "$untracked_files" ]
  then
    echo "Untracked files:"
    # shellcheck disable=SC2001
    echo "${untracked_files}" | sed 's/^/  /'
  fi
fi

# combine lists
if [ -n "$changed_files" ]
then
  if [ -n "$untracked_files" ]
  then
    changed_files+=$'\n'
    changed_files+="${untracked_files}"
  fi
else
  changed_files="${untracked_files}"
fi

# For all the charts, fail on changes within a chart without a version change
# loop on result of 'find -name Chart.yaml'
while IFS= read -r -d '' chart
do
  chartdir=$(dirname "${chart#${WORKSPACE}/}")
  chart_changed_files=""
  version_updated=0

  # create a list of files that were changed in the chart
  for file in $changed_files; do
    if [[ $file =~ $chartdir ]]
    then
      chart_changed_files+=$'\n'
      chart_changed_files+="  ${file}"
    fi
  done

  # See if chart version changed using 'git diff', and is SemVer
  chart_yaml_diff=$(git diff -p "$COMPARISON_BRANCH" -- "${chartdir}/Chart.yaml")

  if [ -n "$chart_yaml_diff" ]
  then
    echo "Changes to Chart.yaml in '$chartdir'"
    old_version_string=$(echo "$chart_yaml_diff" | awk '/^\-version:/ { print $2 }')
    new_version_string=$(echo "$chart_yaml_diff" | awk '/^\+version:/ { print $2 }')

    if [ -n "$new_version_string" ]
    then
      version_updated=1
      echo " Old version string:${old_version_string//-version:/}"
      echo " New version string:${new_version_string//+version:/}"
    fi
  fi

  # if there are any changed files
  if [ -n "$chart_changed_files" ]
  then
    # and version updated, print changed files
    if [ $version_updated -eq 1 ]
    then
      echo " Files changed:${chart_changed_files}"
    else
      # otherwise fail this chart
      echo "Changes to chart but no version update in '$chartdir':${chart_changed_files}"
      fail_version=1
      failed_charts+=$'\n'
      failed_charts+="  $chartdir"
    fi
  fi

done < <(find "${WORKSPACE}" -name Chart.yaml -print0)

if [[ $fail_version != 0 ]]; then
  echo "# chart_version_check.sh Failure! #"
  echo "Charts that need to be fixed:$failed_charts"
  exit 1
fi

echo "# chart_version_check.sh Success! - all charts have updated versions #"

exit 0

