#!/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.

# helmrepo.sh
# creates or updates a helm repo for publishing on the guide website
# Reference: https://github.com/helm/charts/blob/master/test/repo-sync.sh

set -eu -o pipefail

echo "# helmrepo.sh, using helm: $(helm version -c) #"

# 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}

# directory to compare against, doesn't need to be present
OLD_REPO_DIR="${OLD_REPO_DIR:-cord-charts-repo}"
NEW_REPO_DIR="${NEW_REPO_DIR:-chart_repo}"

GERRIT_BRANCH="${GERRIT_BRANCH:-$(git symbolic-ref --short HEAD)}"
PUBLISH_URL="${PUBLISH_URL:-charts.opencord.org}"

# create and clean NEW_REPO_DIR
mkdir -p "${NEW_REPO_DIR}"
rm -f "${NEW_REPO_DIR}"/*

# if OLD_REPO_DIR doesn't exist, generate packages and index in NEW_REPO_DIR
if [ ! -d "${OLD_REPO_DIR}" ]
then
  echo "Creating new helm repo: ${NEW_REPO_DIR}"

  while IFS= read -r -d '' chart
  do
    chartdir=$(dirname "${chart#./}")
    helm package --dependency-update --destination "${NEW_REPO_DIR}" "${chartdir}"

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

  helm repo index "${NEW_REPO_DIR}" --url https://"${PUBLISH_URL}"
  echo "# helmrepo.sh Success! Generated new repo index in ${NEW_REPO_DIR}"

else
  # OLD_REPO_DIR exists, check for new charts and update only with changes
  echo "Found existing helm repo: ${OLD_REPO_DIR}, attempting update"

  # Loop and create chart packages, only if changed
  while IFS= read -r -d '' chart
  do
    chartdir=$(dirname "${chart#./}")

    # See if chart version changed from previous HEAD commit
    chart_yaml_diff=$(git diff -p HEAD^ "${chartdir}/Chart.yaml")

    if [ -n "$chart_yaml_diff" ]
    then
      # assumes that helmlint.sh and chart_version_check.sh have been run
      # pre-merge, which ensures that all charts are valid and have their
      # version updated in Chart.yaml
      new_version_string=$(echo "$chart_yaml_diff" | grep -E '\+version:\s*\d+\.\d+\.\d+$')
      echo "New version of chart ${chartdir}, creating package: ${new_version_string//+version:/}"
      helm package --dependency-update --destination "${NEW_REPO_DIR}" "${chartdir}"
    else
      echo "Chart unchanged, not packaging: '${chartdir}'"
    fi

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

  # Check for collisions between old/new packages
  while IFS= read -r -d '' package_path
  do
    package=$(basename "${package_path}")

    if [ -f "${OLD_REPO_DIR}/${package}" ]
    then
      echo "# helmrepo.sh Failure! Package: ${package} with same version already exists in ${OLD_REPO_DIR}"
      exit 1
    fi
  done < <(find "${NEW_REPO_DIR}" -name '*.tgz' -print0)

  # Create updated index.yaml (new version created in NEW_REPO_DIR)
  helm repo index --url "https://${PUBLISH_URL}" --merge "${OLD_REPO_DIR}/index.yaml" "${NEW_REPO_DIR}"

  # move over packages and index.yaml
  mv "${NEW_REPO_DIR}"/*.tgz "${OLD_REPO_DIR}/"
  mv "${NEW_REPO_DIR}/index.yaml" "${OLD_REPO_DIR}/index.yaml"

  echo "# helmrepo.sh Success! Updated existing repo index in ${OLD_REPO_DIR}"
fi

exit 0
