#!/bin/bash

# ============LICENSE_START=======================================================
#  Copyright (C) 2019 The Nordix Foundation. All rights reserved.
# ================================================================================
# 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-License-Identifier: Apache-2.0
# ============LICENSE_END=========================================================

set -o errexit
set -o nounset
set -o pipefail

# this function processes commit message to determine the impacted scenario
# using the input provided by the committer.
#
# installer type and scenario should be placed at the beginning of lines
# separately and the format of the entry in commit message is as below
#
# installer-type: <installer type>
# deploy-scenario: <scenario name>
#
# example is
#
# installer-type: kubespray
# deploy-scenario: k8-calico-nofeature
function override_installer_scenario() {
  echo "Info: Processing $GERRIT_PROJECT patchset $GERRIT_REFSPEC to determine the installer and the scenario"
  cd $WORKSPACE
  COMMIT_MESSAGE=$(git show -s --format=%B)

  if [[ "$COMMIT_MESSAGE" =~ "deploy-scenario:" && "$COMMIT_MESSAGE" =~ "installer-type:" ]]; then
    export INSTALLER_TYPE=$(echo "$COMMIT_MESSAGE" | grep '^installer-type:' | cut -d":" -f2 | sed 's/\s*//g')
    export DEPLOY_SCENARIO=$(echo "$COMMIT_MESSAGE" | grep '^deploy-scenario:' | cut -d":" -f2 | sed 's/\s*//g')
    write_change_metadata
  else
    echo "Info: Installer type or deploy scenario is not specified."
    echo "Info: Falling back to programmatically determining them."
  fi
}

# this function will process the changed files to determine the impacted scenario
# if it is no specified by the committer. only one scenario per change should be
# touched.
# TODO: this is not implented yet.
function determine_scenario() {
  # for infra/engine repo, we set INSTALLER_TYPE and DEPLOY_SCENARIO to their defaults
  echo "Info: Processing $GERRIT_PROJECT patchset $GERRIT_REFSPEC"
  if [[ "$GERRIT_PROJECT" == "infra/engine" ]]; then
    echo "Info: Setting INSTALLER_TYPE and DEPLOY_SCENARIO to defaults for project $GERRIT_PROJECT patchset $GERRIT_REFSPEC"
    export INSTALLER_TYPE=kubespray
    export DEPLOY_SCENARIO=k8-calico-nofeature
    write_change_metadata
  else
    cd $WORKSPACE
    COMMIT_MESSAGE=$(git show -s --format=%B)
    echo "Info: Not implemented!"
    exit 1
  fi
}

function write_change_metadata() {
  echo "Info: Writing change metadata to $WORKSPACE/change.properties"
  cat << EOF > $WORKSPACE/change.properties
PROJECT_GIT_URL=$GIT_BASE_HTTPS/$GERRIT_PROJECT
INSTALLER_TYPE=$INSTALLER_TYPE
DEPLOY_SCENARIO=$DEPLOY_SCENARIO
GERRIT_PATCHSET_REVISION=$GERRIT_PATCHSET_REVISION
GERRIT_REFSPEC=$GERRIT_REFSPEC
EOF

  echo "Info: Content of change.properties"
  echo "-------------------------------------------------------------------------"
  cat $WORKSPACE/change.properties
  echo "-------------------------------------------------------------------------"

  # need to exit here to ensure we don't go further while determining scenario
  exit 0
}

echo "Info: Determining the impacted scenario and used installer"

declare -a INSTALLER_TYPE
declare -a DEPLOY_SCENARIO

override_installer_scenario
determine_scenario

# vim: set ts=2 sw=2 expandtab:
