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

# you must be this high to ride the ride
if [[ -z "${BASH_VERSINFO[0]}" ]] \
   || [[ "${BASH_VERSINFO[0]}" -lt 3 ]] \
   || [[ "${BASH_VERSINFO[0]}" -eq 3 && "${BASH_VERSINFO[1]}" -lt 2 ]]; then
  echo "bash v3.2+ is required. Sorry."
  exit 1
fi

set -o pipefail

## @description  Print a message to stderr
## @audience     public
## @stability    stable
## @replaceable  no
## @param        string
function yetus_error
{
  echo "$*" 1>&2
}

## @description  Given a filename or dir, return the absolute version of it
## @audience     public
## @stability    stable
## @param        directory
## @replaceable  no
## @return       0 success
## @return       1 failure
## @return       stdout abspath
function yetus_abs
{
  declare obj=$1
  declare dir
  declare fn
  declare dirret

  if [[ ! -e ${obj} ]]; then
    return 1
  elif [[ -d ${obj} ]]; then
    dir=${obj}
  else
    dir=$(dirname -- "${obj}")
    fn=$(basename -- "${obj}")
    fn="/${fn}"
  fi

  dir=$(cd -P -- "${dir}" >/dev/null 2>/dev/null && pwd -P)
  dirret=$?
  if [[ ${dirret} = 0 ]]; then
    echo "${dir}${fn}"
    return 0
  fi
  return 1
}

function version_ge()
{
  test "$(echo "$@" | tr " " "\n" | sort -rV | head -n 1)" == "$1";
}

WANTED="$1"
shift
ARGV=("$@")

HADOOP_YETUS_VERSION=${HADOOP_YETUS_VERSION:-0.14.0}
BIN=$(yetus_abs "${BASH_SOURCE-$0}")
BINDIR=$(dirname "${BIN}")

## HADOOP_YETUS_VERSION >= 0.9.0 the tarball named with apache-yetus prefix
if version_ge "${HADOOP_YETUS_VERSION}" "0.9.0"; then
  YETUS_PREFIX=apache-yetus
else
  YETUS_PREFIX=yetus
fi

###
###  if YETUS_HOME is set, then try to use it
###
if [[ -n "${YETUS_HOME}" && -x "${YETUS_HOME}/bin/${WANTED}" ]]; then
  exec "${YETUS_HOME}/bin/${WANTED}" "${ARGV[@]}"
fi

#
# this directory is ignored by git and maven
#
HADOOP_PATCHPROCESS=${HADOOP_PATCHPROCESS:-"${BINDIR}/../../patchprocess"}

if [[ ! -d "${HADOOP_PATCHPROCESS}" ]]; then
  mkdir -p "${HADOOP_PATCHPROCESS}"
fi

mytmpdir=$(yetus_abs "${HADOOP_PATCHPROCESS}")
ret=$?
if [[ ${ret} != 0 ]]; then
  yetus_error "yetus-dl: Unable to cwd to ${HADOOP_PATCHPROCESS}"
  exit 1
fi
HADOOP_PATCHPROCESS=${mytmpdir}

##
## if we've already DL'd it, then short cut
##
if [[ -x "${HADOOP_PATCHPROCESS}/${YETUS_PREFIX}-${HADOOP_YETUS_VERSION}/bin/${WANTED}" ]]; then
  exec "${HADOOP_PATCHPROCESS}/${YETUS_PREFIX}-${HADOOP_YETUS_VERSION}/bin/${WANTED}" "${ARGV[@]}"
fi

##
## need to DL, etc
##

BASEURL="https://archive.apache.org/dist/yetus/${HADOOP_YETUS_VERSION}/"
TARBALL="${YETUS_PREFIX}-${HADOOP_YETUS_VERSION}-bin.tar"

GPGBIN=$(command -v gpg)
CURLBIN=$(command -v curl)

if ! pushd "${HADOOP_PATCHPROCESS}" >/dev/null; then
  yetus_error "ERROR: yetus-dl: Cannot pushd to ${HADOOP_PATCHPROCESS}"
  exit 1
fi

if [[ -n "${CURLBIN}" ]]; then
  if ! "${CURLBIN}" -f -s -L -O "${BASEURL}/${TARBALL}.gz"; then
    yetus_error "ERROR: yetus-dl: unable to download ${BASEURL}/${TARBALL}.gz"
    exit 1
  fi
else
  yetus_error "ERROR: yetus-dl requires curl."
  exit 1
fi

if [[ -n "${GPGBIN}" && ! "${HADOOP_SKIP_YETUS_VERIFICATION}" = true ]]; then
  if ! mkdir -p .gpg; then
    yetus_error "ERROR: yetus-dl: Unable to create ${HADOOP_PATCHPROCESS}/.gpg"
    exit 1
  fi
  if ! chmod -R 700 .gpg; then
    yetus_error "ERROR: yetus-dl: Unable to chmod ${HADOOP_PATCHPROCESS}/.gpg"
    exit 1
  fi
  if ! "${CURLBIN}" -s -L -o KEYS_YETUS https://dist.apache.org/repos/dist/release/yetus/KEYS; then
    yetus_error "ERROR: yetus-dl: unable to fetch https://dist.apache.org/repos/dist/release/yetus/KEYS"
    exit 1
  fi
  if ! "${CURLBIN}" -s -L -O "${BASEURL}/${TARBALL}.gz.asc"; then
    yetus_error "ERROR: yetus-dl: unable to fetch ${BASEURL}/${TARBALL}.gz.asc"
    exit 1
  fi
  if ! "${GPGBIN}" --homedir "${HADOOP_PATCHPROCESS}/.gpg" --import "${HADOOP_PATCHPROCESS}/KEYS_YETUS" >/dev/null 2>&1; then
    yetus_error "ERROR: yetus-dl: gpg unable to import ${HADOOP_PATCHPROCESS}/KEYS_YETUS"
    exit 1
  fi
  if ! "${GPGBIN}" --homedir "${HADOOP_PATCHPROCESS}/.gpg" --verify "${TARBALL}.gz.asc" >/dev/null 2>&1; then
     yetus_error "ERROR: yetus-dl: gpg verify of tarball in ${HADOOP_PATCHPROCESS} failed"
     exit 1
   fi
fi

if [[ "$IS_WINDOWS" && "$IS_WINDOWS" == 1 ]]; then
  gunzip -c "${TARBALL}.gz" | tar xpf -

  # One of the entries in the Yetus tarball unzips a symlink qbt.sh.
  # The symlink creation fails on Windows, unless this CI is run as Admin or Developer mode is
  # enabled.
  # Thus, we create the qbt.sh symlink ourselves and move it to the target.
  YETUS_PRECOMMIT_DIR="${YETUS_PREFIX}-${HADOOP_YETUS_VERSION}/lib/precommit"
  ln -s "${YETUS_PRECOMMIT_DIR}/test-patch.sh" qbt.sh
  mv qbt.sh "${YETUS_PRECOMMIT_DIR}"
elif ! (gunzip -c "${TARBALL}.gz" | tar xpf -); then
  yetus_error "ERROR: ${TARBALL}.gz is corrupt. Investigate and then remove ${HADOOP_PATCHPROCESS} to try again."
  exit 1
fi

if [[ -x "${HADOOP_PATCHPROCESS}/${YETUS_PREFIX}-${HADOOP_YETUS_VERSION}/bin/${WANTED}" ]]; then
  popd >/dev/null
  exec "${HADOOP_PATCHPROCESS}/${YETUS_PREFIX}-${HADOOP_YETUS_VERSION}/bin/${WANTED}" "${ARGV[@]}"
fi

##
## give up
##
yetus_error "ERROR: ${WANTED} is not part of Apache Yetus ${HADOOP_YETUS_VERSION}"
exit 1
