#!/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
GERRIT_BRANCH=${GERRIT_BRANCH:-opencord/master}

# Create list of changed files compared to branch
changed_files=$(git diff --name-only "${GERRIT_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 $GERRIT_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 "$GERRIT_BRANCH" "${chartdir}/Chart.yaml")

  if [ -n "$chart_yaml_diff" ]
  then
    echo "Changes to Chart.yaml in '$chartdir'"
    old_version_string=$(echo "$chart_yaml_diff" | grep -E '\-version:\s*\d+\.\d+\.\d+$')
    new_version_string=$(echo "$chart_yaml_diff" | grep -E '\+version:\s*\d+\.\d+\.\d+$')

    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

