#!/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#${WORKSPACE}/}")
    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#${WORKSPACE}/}")

    # 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
