#!/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.1} 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://downloads.apache.org/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