#!/usr/bin/env bash

# Licensed to the Apache Software Foundation (ASF) under one
# or more contributor license agreements.  See the NOTICE file
# distributed with this work for additional information
# regarding copyright ownership.  The ASF licenses this file
# to you 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.

find-here-test-reports() {
  output_directories_file=${1}
  set +e
  find . -type d -name "reports" > ${output_directories_file}
  find .  -type d -name "test-results" >> ${output_directories_file}
  (find . -type d -name "*Test" | grep "build/[^/]*Test$") >> ${output_directories_file}
  find . -name "*-progress*txt" >> ${output_directories_file}
  find . -name "*.hprof" >> ${output_directories_file}
  find . -type d -name "callstacks" >> ${output_directories_file}
  echo "Collecting the following artifacts..."
  cat ${output_directories_file}
  echo ""
}

## Parsing functions for the Concourse Semver resource.
## These functions expect one input in the form of the resource file, e.g., "1.9.0-SNAPSHOT.325"
get-geode-version() {
  local CONCOURSE_VERSION=$1
  # Prune all after '-', yielding e.g., "1.9.0"
  local GEODE_PRODUCT_VERSION=${CONCOURSE_VERSION%%-*}
  (>&2 echo "Geode product VERSION is ${GEODE_PRODUCT_VERSION}")
  echo ${GEODE_PRODUCT_VERSION}
}

get-geode-version-qualifier-slug() {
  local CONCOURSE_VERSION=$1
  # Prune all before '-', yielding e.g., "SNAPSHOT.325"
  local CONCOURSE_BUILD_SLUG=${CONCOURSE_VERSION##*-}
  # Prune all before '.', yielding e.g., "SNAPSHOT"
  local QUALIFIER_SLUG=${CONCOURSE_BUILD_SLUG%%.*}
  echo ${QUALIFIER_SLUG}
}

get-geode-build-id() {
  local CONCOURSE_VERSION=$1
  # Prune all before the last '.', yielding e.g., "325"
  local BUILD_ID=${CONCOURSE_VERSION##*.}
  echo ${BUILD_ID}
}

get-geode-build-id-padded() {
  local CONCOURSE_VERSION=$1
  local BUILD_ID=$(get-geode-build-id ${CONCOURSE_VERSION})
  # Prune all before the last '.', yielding e.g., "325", then zero-pad, e.g., "0325"
  local PADDED_BUILD_ID=$(printf "%04d" ${BUILD_ID})
  (>&2 echo "Build ID is ${PADDED_BUILD_ID}")
  echo ${PADDED_BUILD_ID}
}

get-full-version() {
  # Extract each component so that the BuildId can be zero-padded, then reassembled.
  local CONCOURSE_VERSION=$1
  local GEODE_PRODUCT_VERSION=$(get-geode-version ${CONCOURSE_VERSION})
  local QUALIFIER_SLUG=$(get-geode-version-qualifier-slug ${CONCOURSE_VERSION})
  local PADDED_BUILD_ID=$(get-geode-build-id-padded ${CONCOURSE_VERSION})
  local FULL_PRODUCT_VERSION="${GEODE_PRODUCT_VERSION}-${QUALIFIER_SLUG}.${PADDED_BUILD_ID}"
  (>&2 echo "Full product VERSION is ${FULL_PRODUCT_VERSION}")
  echo ${FULL_PRODUCT_VERSION}
}
