You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@yetus.apache.org by aw...@apache.org on 2018/11/11 22:19:20 UTC
[04/17] yetus git commit: YETUS-15. build environment
http://git-wip-us.apache.org/repos/asf/yetus/blob/6ebaa111/precommit/test-patch.sh
----------------------------------------------------------------------
diff --git a/precommit/test-patch.sh b/precommit/test-patch.sh
deleted file mode 100755
index a95db54..0000000
--- a/precommit/test-patch.sh
+++ /dev/null
@@ -1,3357 +0,0 @@
-#!/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.
-
-# Make sure that bash version meets the pre-requisite
-
-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
-
-this="${BASH_SOURCE-$0}"
-BINDIR=$(cd -P -- "$(dirname -- "${this}")" >/dev/null && pwd -P)
-BINNAME=${this##*/}
-BINNAME=${BINNAME%.sh}
-STARTINGDIR=$(pwd)
-USER_PARAMS=("$@")
-#shellcheck disable=SC2034
-QATESTMODE=false
-
-# global arrays
-declare -a CHANGED_FILES
-declare -a CHANGED_MODULES
-declare -a TP_HEADER
-declare -a TP_VOTE_TABLE
-declare -a TP_TEST_TABLE
-declare -a TP_FOOTER_TABLE
-declare -a MODULE
-declare -a MODULE_BACKUP_STATUS
-declare -a MODULE_BACKUP_STATUS_TIMER
-declare -a MODULE_BACKUP_STATUS_MSG
-declare -a MODULE_BACKUP_STATUS_LOG
-declare -a MODULE_BACKUP_COMPILE_LOG
-declare -a MODULE_STATUS
-declare -a MODULE_STATUS_TIMER
-declare -a MODULE_STATUS_MSG
-declare -a MODULE_STATUS_LOG
-declare -a MODULE_COMPILE_LOG
-declare -a USER_MODULE_LIST
-
-TP_HEADER_COUNTER=0
-TP_VOTE_COUNTER=0
-TP_TEST_COUNTER=0
-TP_FOOTER_COUNTER=0
-
-## @description Setup the default global variables
-## @audience public
-## @stability stable
-## @replaceable no
-function setup_defaults
-{
- declare version="in-progress"
-
- common_defaults
- GLOBALTIMER=$("${AWK}" 'BEGIN {srand(); print srand()}')
-
- if [[ -f "${BINDIR}/../VERSION" ]]; then
- version=$(cat "${BINDIR}/../VERSION")
- elif [[ -f "${BINDIR}/VERSION" ]]; then
- version=$(cat "${BINDIR}/VERSION")
- fi
- if [[ ${version} =~ SNAPSHOT$ ]]; then
- version="in-progress"
- fi
-
- PATCH_NAMING_RULE="https://yetus.apache.org/documentation/${version}/precommit-patchnames"
- INSTANCE=${RANDOM}
- RELOCATE_PATCH_DIR=false
-
- ALLOWSUMMARIES=true
-
- BUILD_NATIVE=${BUILD_NATIVE:-true}
-
- BUILD_URL_ARTIFACTS=artifact/patchprocess
- BUILD_URL_CONSOLE=console
- BUILDTOOLCWD=module
-
- # shellcheck disable=SC2034
- CHANGED_UNION_MODULES=""
-
- GIT_OFFLINE=false
- PROC_LIMIT=1000
- REEXECED=false
- RESETREPO=false
- BUILDMODE=patch
- # shellcheck disable=SC2034
- BUILDMODEMSG="The patch"
- ISSUE=""
- TIMER=$("${AWK}" 'BEGIN {srand(); print srand()}')
- JVM_REQUIRED=true
- yetus_add_entry JDK_TEST_LIST compile
- yetus_add_entry JDK_TEST_LIST unit
-}
-
-## @description Convert the given module name to a file fragment
-## @audience public
-## @stability stable
-## @replaceable no
-## @param module
-function module_file_fragment
-{
- local mod=$1
- if [[ ${mod} = \. ]]; then
- echo root
- else
- echo "$1" | tr '/' '_' | tr '\\' '_'
- fi
-}
-
-## @description Convert time in seconds to m + s
-## @audience public
-## @stability stable
-## @replaceable no
-## @param seconds
-function clock_display
-{
- local -r elapsed=$1
-
- if [[ ${elapsed} -lt 0 ]]; then
- echo "N/A"
- else
- printf "%3sm %02ss" $((elapsed/60)) $((elapsed%60))
- fi
-}
-
-## @description Activate the local timer
-## @audience public
-## @stability stable
-## @replaceable no
-function start_clock
-{
- yetus_debug "Start clock"
- TIMER=$(date +"%s")
-}
-
-## @description Print the elapsed time in seconds since the start of the local timer
-## @audience public
-## @stability stable
-## @replaceable no
-function stop_clock
-{
- local -r stoptime=$(date +"%s")
- local -r elapsed=$((stoptime-TIMER))
- yetus_debug "Stop clock"
-
- echo ${elapsed}
-}
-
-## @description Print the elapsed time in seconds since the start of the global timer
-## @audience private
-## @stability stable
-## @replaceable no
-function stop_global_clock
-{
- local -r stoptime=$(date +"%s")
- local -r elapsed=$((stoptime-GLOBALTIMER))
- yetus_debug "Stop global clock"
-
- echo ${elapsed}
-}
-
-## @description Add time to the local timer
-## @audience public
-## @stability stable
-## @replaceable no
-## @param seconds
-function offset_clock
-{
- declare off=$1
-
- yetus_debug "offset clock by ${off}"
-
- if [[ -n ${off} ]]; then
- ((TIMER=TIMER-off))
- else
- yetus_error "ASSERT: no offset passed to offset_clock: ${index}"
- generate_stack
- fi
-}
-
-## @description generate a stack trace when in debug mode
-## @audience public
-## @stability stable
-## @replaceable no
-## @return exits
-function generate_stack
-{
- declare frame
-
- if [[ "${YETUS_SHELL_SCRIPT_DEBUG}" = true ]]; then
- while caller "${frame}"; do
- ((frame++));
- done
- fi
- exit 1
-}
-
-## @description Add to the header of the display
-## @audience public
-## @stability stable
-## @replaceable no
-## @param string
-function add_header_line
-{
- # shellcheck disable=SC2034
- TP_HEADER[${TP_HEADER_COUNTER}]="$*"
- ((TP_HEADER_COUNTER=TP_HEADER_COUNTER+1 ))
-}
-
-## @description Add to the output table. If the first parameter is a number
-## @description that is the vote for that column and calculates the elapsed time
-## @description based upon the last start_clock(). The second parameter is the reporting
-## @description subsystem (or test) that is providing the vote. The second parameter
-## @description is always required. The third parameter is any extra verbage that goes
-## @description with that subsystem.
-## @description if the vote is H, then that designates that "subsystem" should be a
-## @description header in the vote table comment output. The other parameters are
-## @description ignored
-## @audience public
-## @stability stable
-## @replaceable no
-## @param +1/0/-1/H
-## @param subsystem
-## @param string
-function add_vote_table
-{
- declare value=$1
- declare subsystem=$2
- shift 2
-
- # apparently shellcheck doesn't know about declare -r
- #shellcheck disable=SC2155
- declare -r elapsed=$(stop_clock)
- declare filt
-
- yetus_debug "add_vote_table ${value} ${subsystem} ${elapsed} ${*}"
-
- if [[ "${value}" = H ]]; then
- TP_VOTE_TABLE[${TP_VOTE_COUNTER}]="|${value}| | | ${subsystem} |"
- ((TP_VOTE_COUNTER=TP_VOTE_COUNTER+1))
- return
- fi
-
- if [[ ${value} == "1" ]]; then
- value="+1"
- fi
-
- for filt in "${VOTE_FILTER[@]}"; do
- if [[ "${subsystem}" == "${filt}" && "${value}" == -1 ]]; then
- value=-0
- fi
- done
-
- # shellcheck disable=SC2034
- TP_VOTE_TABLE[${TP_VOTE_COUNTER}]="| ${value} | ${subsystem} | ${elapsed} | $* |"
- ((TP_VOTE_COUNTER=TP_VOTE_COUNTER+1))
-
- if [[ "${value}" = -1 ]]; then
- ((RESULT = RESULT + 1))
- fi
-}
-
-## @description Report the JVM version of the given directory
-## @stability stable
-## @audience private
-## @replaceable yes
-## @param directory
-## @return version
-function report_jvm_version
-{
- #shellcheck disable=SC2016
- "${1}/bin/java" -version 2>&1 | head -1 | ${AWK} '{print $NF}' | tr -d \"
-}
-
-## @description Verify if a given test is multijdk
-## @audience public
-## @stability stable
-## @replaceable yes
-## @param test
-## @return 0 = yes
-## @return 1 = no
-function verify_multijdk_test
-{
- local i=$1
-
- if [[ "${JDK_DIR_LIST}" == "${JAVA_HOME}" ]]; then
- yetus_debug "MultiJDK not configured."
- return 1
- fi
-
- if [[ ${JDK_TEST_LIST} =~ $i ]]; then
- yetus_debug "${i} is in ${JDK_TEST_LIST} and MultiJDK configured."
- return 0
- fi
- return 1
-}
-
-## @description Put the opening environment information at the bottom
-## @description of the footer table
-## @stability stable
-## @audience private
-## @replaceable yes
-function prepopulate_footer
-{
- # shellcheck disable=SC2155
- declare -r unamea=$(uname -a)
-
- add_footer_table "uname" "${unamea}"
- add_footer_table "Build tool" "${BUILDTOOL}"
-
- if [[ -n ${REEXECPERSONALITY} ]]; then
- add_footer_table "Personality" "${REEXECPERSONALITY}"
- elif [[ -n ${PERSONALITY} ]]; then
- add_footer_table "Personality" "${PERSONALITY}"
- fi
-
- gitrev=$(${GIT} rev-parse --verify --short HEAD)
-
- add_footer_table "git revision" "${PATCH_BRANCH} / ${gitrev}"
-}
-
-## @description Last minute entries on the footer table
-## @audience private
-## @stability stable
-## @replaceable no
-function finish_footer_table
-{
- declare counter
-
- if [[ -f "${PATCH_DIR}/threadcounter.txt" ]]; then
- counter=$(cat "${PATCH_DIR}/threadcounter.txt")
- add_footer_table "Max. process+thread count" "${counter} (vs. ulimit of ${PROC_LIMIT})"
- fi
-
- add_footer_table "modules" "C: ${CHANGED_MODULES[*]} U: ${CHANGED_UNION_MODULES}"
-}
-
-## @description Put the final elapsed time at the bottom of the table.
-## @audience private
-## @stability stable
-## @replaceable no
-function finish_vote_table
-{
-
- local -r elapsed=$(stop_global_clock)
- local calctime
-
- calctime=$(clock_display "${elapsed}")
-
- echo ""
- echo "Total Elapsed time: ${calctime}"
- echo ""
-
- # shellcheck disable=SC2034
- TP_VOTE_TABLE[${TP_VOTE_COUNTER}]="| | | ${elapsed} | |"
- ((TP_VOTE_COUNTER=TP_VOTE_COUNTER+1 ))
-}
-
-## @description Add to the footer of the display. @@BASE@@ will get replaced with the
-## @description correct location for the local filesystem in dev mode or the URL for
-## @description Jenkins mode.
-## @audience public
-## @stability stable
-## @replaceable no
-## @param subsystem
-## @param string
-function add_footer_table
-{
- local subsystem=$1
- shift 1
-
- # shellcheck disable=SC2034
- TP_FOOTER_TABLE[${TP_FOOTER_COUNTER}]="| ${subsystem} | $* |"
- ((TP_FOOTER_COUNTER=TP_FOOTER_COUNTER+1 ))
-}
-
-## @description Special table just for unit test failures
-## @audience public
-## @stability stable
-## @replaceable no
-## @param failurereason
-## @param testlist
-function add_test_table
-{
- local failure=$1
- shift 1
-
- # shellcheck disable=SC2034
- TP_TEST_TABLE[${TP_TEST_COUNTER}]="| ${failure} | $* |"
- ((TP_TEST_COUNTER=TP_TEST_COUNTER+1 ))
-}
-
-## @description Large display for the user console
-## @audience public
-## @stability stable
-## @replaceable no
-## @param string
-## @return large chunk of text
-function big_console_header
-{
- local text="$*"
- local spacing=$(( (75+${#text}) /2 ))
- printf "\n\n"
- echo "============================================================================"
- echo "============================================================================"
- printf "%*s\n" ${spacing} "${text}"
- echo "============================================================================"
- echo "============================================================================"
- printf "\n\n"
-}
-
-## @description Find the largest size of a column of an array
-## @audience private
-## @stability evolving
-## @replaceable no
-## @return size
-function findlargest
-{
- local column=$1
- shift
- local a=("$@")
- local sizeofa=${#a[@]}
- local i=0
- local string
- local maxlen=0
-
- until [[ ${i} -eq ${sizeofa} ]]; do
- # shellcheck disable=SC2086
- string=$( echo ${a[$i]} | cut -f$((column + 1)) -d\| )
- if [[ ${#string} -gt ${maxlen} ]]; then
- maxlen=${#string}
- fi
- i=$((i+1))
- done
- echo "${maxlen}"
-}
-
-## @description Write the contents of a file to all of the bug systems
-## @description (so content should avoid special formatting)
-## @param filename
-## @stability stable
-## @audience public
-function write_comment
-{
- local -r commentfile=${1}
- declare bug
-
- for bug in ${BUGCOMMENTS}; do
- if declare -f ${bug}_write_comment >/dev/null; then
- "${bug}_write_comment" "${commentfile}"
- fi
- done
-}
-
-## @description Verify that the patch directory is still in working order
-## @description since bad actors on some systems wipe it out. If not,
-## @description recreate it and then exit
-## @audience private
-## @stability evolving
-## @replaceable yes
-## @return may exit on failure
-function verify_patchdir_still_exists
-{
- local -r commentfile=/tmp/testpatch.$$.${RANDOM}
- local extra=""
-
- if [[ ! -d ${PATCH_DIR} ]]; then
- rm "${commentfile}" 2>/dev/null
-
- echo "(!) The patch artifact directory has been removed! " > "${commentfile}"
- echo "This is a fatal error for test-patch.sh. Aborting. " >> "${commentfile}"
- echo
- cat ${commentfile}
- echo
- if [[ ${JENKINS} == true ]]; then
- if [[ -n ${NODE_NAME} ]]; then
- extra=" (Jenkins node ${NODE_NAME})"
- fi
- echo "Jenkins${extra} information at ${BUILD_URL}${BUILD_URL_CONSOLE} may provide some hints. " >> "${commentfile}"
-
- write_comment ${commentfile}
- fi
-
- rm "${commentfile}"
- cleanup_and_exit "${RESULT}"
- fi
-}
-
-## @description generate a list of all files and line numbers in $GITDIFFLINES that
-## @description that were added/changed in the source repo. $GITDIFFCONTENT
-## @description is same file, but also includes the content of those lines
-## @audience private
-## @stability stable
-## @replaceable no
-function compute_gitdiff
-{
- local file
- local line
- local startline
- local counter
- local numlines
- local actual
- local content
- local outfile="${PATCH_DIR}/computegitdiff.${RANDOM}"
-
- pushd "${BASEDIR}" >/dev/null
- ${GIT} add --all --intent-to-add
- while read -r line; do
- if [[ ${line} =~ ^\+\+\+ ]]; then
- file="./"$(echo "${line}" | cut -f2- -d/)
- continue
- elif [[ ${line} =~ ^@@ ]]; then
- startline=$(echo "${line}" | cut -f3 -d' ' | cut -f1 -d, | tr -d + )
- numlines=$(echo "${line}" | cut -f3 -d' ' | cut -s -f2 -d, )
- # if this is empty, then just this line
- # if it is 0, then no lines were added and this part of the patch
- # is strictly a delete
- if [[ ${numlines} == 0 ]]; then
- continue
- elif [[ -z ${numlines} ]]; then
- numlines=1
- fi
- counter=0
- # it isn't obvious, but on MOST platforms under MOST use cases,
- # this is faster than using sed, and definitely faster than using
- # awk.
- # http://unix.stackexchange.com/questions/47407/cat-line-x-to-line-y-on-a-huge-file
- # has a good discussion w/benchmarks
- #
- # note that if tail is still sending data through the pipe, but head gets enough
- # to do what was requested, head will exit, leaving tail with a broken pipe.
- # we're going to send stderr to /dev/null and ignore the error since head's
- # output is really what we're looking for
- tail -n "+${startline}" "${file}" 2>/dev/null | head -n ${numlines} > "${outfile}"
- oldifs=${IFS}
- IFS=''
- while read -r content; do
- ((actual=counter+startline))
- echo "${file}:${actual}:" >> "${GITDIFFLINES}"
- printf "%s:%s:%s\n" "${file}" "${actual}" "${content}" >> "${GITDIFFCONTENT}"
- ((counter=counter+1))
- done < "${outfile}"
- rm "${outfile}"
- IFS=${oldifs}
- fi
- done < <("${GIT}" diff --unified=0 --no-color)
-
- if [[ ! -f "${GITDIFFLINES}" ]]; then
- touch "${GITDIFFLINES}"
- fi
-
- if [[ ! -f "${GITDIFFCONTENT}" ]]; then
- touch "${GITDIFFCONTENT}"
- fi
-
- if [[ -s "${GITDIFFLINES}" ]]; then
- compute_unidiff
- else
- touch "${GITUNIDIFFLINES}"
- fi
-
- popd >/dev/null
-}
-
-## @description generate an index of unified diff lines vs. modified/added lines
-## @description ${GITDIFFLINES} must exist.
-## @audience private
-## @stability stable
-## @replaceable no
-function compute_unidiff
-{
- declare fn
- declare filen
- declare tmpfile="${PATCH_DIR}/tmp.$$.${RANDOM}"
-
- # now that we know what lines are where, we can deal
- # with github's pain-in-the-butt API. It requires
- # that the client provides the line number of the
- # unified diff on a per file basis.
-
- # First, build a per-file unified diff, pulling
- # out the 'extra' lines, grabbing the adds with
- # the line number in the diff file along the way,
- # finally rewriting the line so that it is in
- # './filename:diff line:content' format
-
- for fn in "${CHANGED_FILES[@]}"; do
- filen=${fn##./}
-
- if [[ -f "${filen}" ]]; then
- ${GIT} diff "${filen}" \
- | tail -n +6 \
- | ${GREP} -n '^+' \
- | ${GREP} -vE '^[0-9]*:\+\+\+' \
- | ${SED} -e 's,^\([0-9]*:\)\+,\1,g' \
- -e "s,^,./${filen}:,g" \
- >> "${tmpfile}"
- fi
- done
-
- # at this point, tmpfile should be in the same format
- # as gitdiffcontent, just with different line numbers.
- # let's do a merge (using gitdifflines because it's easier)
-
- # ./filename:real number:diff number
- # shellcheck disable=SC2016
- paste -d: "${GITDIFFLINES}" "${tmpfile}" \
- | ${AWK} -F: '{print $1":"$2":"$5":"$6}' \
- >> "${GITUNIDIFFLINES}"
-
- rm "${tmpfile}"
-}
-
-
-## @description Print the command to be executing to the screen. Then
-## @description run the command, sending stdout and stderr to the given filename
-## @description This will also ensure that any directories in ${BASEDIR} have
-## @description the exec bit set as a pre-exec step.
-## @audience public
-## @stability stable
-## @param filename
-## @param command
-## @param [..]
-## @replaceable no
-## @return $?
-function echo_and_redirect
-{
- declare logfile=$1
- shift
-
- verify_patchdir_still_exists
-
- find "${BASEDIR}" -type d -exec chmod +x {} \;
- # to the screen
- echo "cd $(pwd)"
- echo "${*} > ${logfile} 2>&1"
-
- if [[ ${BASH_VERSINFO[0]} -gt 3 ]]; then
-
- # use a coprocessor with the
- # lower proc limit so that yetus can
- # do stuff unimpacted by it
-
- e_a_r_helper "${logfile}" "${@}" >> "${COPROC_LOGFILE}" 2>&1
-
- # now that it's off as a separate process, we need to wait
- # for it to finish. wait will either return 0, exit code
- # of the coproc, or 127. all of which is
- # perfectly fine for us.
-
-
- # shellcheck disable=SC2154,SC2086
- wait ${yrr_coproc_PID}
-
- else
-
- # if bash < 4 (e.g., OS X), just run it
- # the ulimit was set earlier
-
- yetus_run_and_redirect "${logfile}" "${@}"
- fi
-
-}
-
-## @description is a given directory relative to BASEDIR?
-## @audience public
-## @stability stable
-## @replaceable yes
-## @param path
-## @return 1 - no, path
-## @return 0 - yes, path - BASEDIR
-function relative_dir
-{
- local p=${1#${BASEDIR}}
-
- if [[ ${#p} -eq ${#1} ]]; then
- echo "${p}"
- return 1
- fi
- p=${p#/}
- echo "${p}"
- return 0
-}
-
-## @description Print the usage information
-## @audience public
-## @stability stable
-## @replaceable no
-function yetus_usage
-{
- declare bugsys
- declare jdktlist
-
- importplugins
-
- # shellcheck disable=SC2116,SC2086
- bugsys=$(echo ${BUGSYSTEMS})
- bugsys=${bugsys// /,}
-
- # shellcheck disable=SC2116,SC2086
- jdktlist=$(echo ${JDK_TEST_LIST})
- jdktlist=${jdktlist// /,}
-
- if [[ "${BUILDMODE}" = patch ]]; then
- echo "${BINNAME} [OPTIONS] patch"
- echo ""
- echo "Where:"
- echo " patch is a file, URL, or bugsystem-compatible location of the patch file"
- else
- echo "${BINNAME} [OPTIONS]"
- fi
- echo ""
- echo "Options:"
- echo ""
- yetus_add_option "--archive-list=<list>" "Comma delimited list of pattern matching notations to copy to patch-dir"
- yetus_add_option "--basedir=<dir>" "The directory to apply the patch to (default current directory)"
- yetus_add_option "--branch=<ref>" "Forcibly set the branch"
- yetus_add_option "--branch-default=<ref>" "If the branch isn't forced and we don't detect one in the patch name, use this branch (default 'master')"
- yetus_add_option "--build-native=<bool>" "If true, then build native components (default 'true')"
- # shellcheck disable=SC2153
- yetus_add_option "--build-tool=<tool>" "Pick which build tool to focus around (one of ${BUILDTOOLS})"
- yetus_add_option "--bugcomments=<bug>" "Only write comments to the screen and this comma delimited list (default: ${bugsys})"
- yetus_add_option "--contrib-guide=<url>" "URL to point new users towards project conventions. (default: ${PATCH_NAMING_RULE} )"
- yetus_add_option "--debug" "If set, then output some extra stuff to stderr"
- yetus_add_option "--dirty-workspace" "Allow the local git workspace to have uncommitted changes"
- yetus_add_option "--empty-patch" "Create a summary of the current source tree"
- yetus_add_option "--java-home=<path>" "Set JAVA_HOME (In Docker mode, this should be local to the image)"
- yetus_add_option "--linecomments=<bug>" "Only write line comments to this comma delimited list (defaults to bugcomments)"
- yetus_add_option "--list-plugins" "List all installed plug-ins and then exit"
- yetus_add_option "--multijdkdirs=<paths>" "Comma delimited lists of JDK paths to use for multi-JDK tests"
- yetus_add_option "--multijdktests=<list>" "Comma delimited tests to use when multijdkdirs is used. (default: '${jdktlist}')"
- yetus_add_option "--modulelist=<list>" "Specify additional modules to test (comma delimited)"
- yetus_add_option "--offline" "Avoid connecting to the Internet"
- yetus_add_option "--patch-dir=<dir>" "The directory for working and output files (default '/tmp/test-patch-${PROJECT_NAME}/pid')"
- yetus_add_option "--personality=<file>" "The personality file to load"
- yetus_add_option "--proclimit=<num>" "Limit on the number of processes (default: ${PROC_LIMIT})"
- yetus_add_option "--project=<name>" "The short name for project currently using test-patch (default 'yetus')"
- yetus_add_option "--plugins=<list>" "Specify which plug-ins to add/delete (comma delimited; use 'all' for all found) e.g. --plugins=all,-ant,-scalac (all plugins except ant and scalac)"
- yetus_add_option "--resetrepo" "Forcibly clean the repo"
- yetus_add_option "--run-tests" "Run all relevant tests below the base directory"
- yetus_add_option "--skip-dirs=<list>" "Skip following directories for module finding"
- yetus_add_option "--skip-system-plugins" "Do not load plugins from ${BINDIR}/test-patch.d"
- yetus_add_option "--summarize=<bool>" "Allow tests to summarize results"
- yetus_add_option "--test-parallel=<bool>" "Run multiple tests in parallel (default false in developer mode, true in Jenkins mode)"
- yetus_add_option "--test-threads=<int>" "Number of tests to run in parallel (default defined in ${PROJECT_NAME} build)"
- yetus_add_option "--unit-test-filter-file=<file>" "The unit test filter file to load"
- yetus_add_option "--tests-filter=<list>" "Lists of tests to turn failures into warnings"
- yetus_add_option "--user-plugins=<dir>" "A directory of user provided plugins. see test-patch.d for examples (default empty)"
- yetus_add_option "--version" "Print release version information and exit"
-
- yetus_generic_columnprinter "${YETUS_OPTION_USAGE[@]}"
- yetus_reset_usage
-
- echo ""
- echo "Shell binary overrides:"
- yetus_add_option "--awk-cmd=<cmd>" "The 'awk' command to use (default 'awk')"
- yetus_add_option "--curl-cmd=<cmd>" "The 'curl' command to use (default 'curl')"
- yetus_add_option "--diff-cmd=<cmd>" "The GNU-compatible 'diff' command to use (default 'diff')"
- yetus_add_option "--file-cmd=<cmd>" "The 'file' command to use (default 'file')"
- yetus_add_option "--git-cmd=<cmd>" "The 'git' command to use (default 'git')"
- yetus_add_option "--grep-cmd=<cmd>" "The 'grep' command to use (default 'grep')"
- yetus_add_option "--patch-cmd=<cmd>" "The 'patch' command to use (default 'patch')"
- yetus_add_option "--sed-cmd=<cmd>" "The 'sed' command to use (default 'sed')"
-
- yetus_generic_columnprinter "${YETUS_OPTION_USAGE[@]}"
- yetus_reset_usage
-
- echo ""
- echo "Automation options:"
- yetus_add_option "--build-url=<url>" "Set the build location web page (Default: '${BUILD_URL}')"
- yetus_add_option "--build-url-console=<location>" "Location relative to --build-url of the console (Default: '${BUILD_URL_CONSOLE}')"
- yetus_add_option "--build-url-artifacts=<location>" "Location relative to --build-url of the --patch-dir (Default: '${BUILD_URL_ARTIFACTS}')"
- yetus_add_option "--console-report-file=<file>" "Save the final console-based report to a file in addition to the screen"
- yetus_add_option "--console-urls" "Use the build URL instead of path on the console report"
- yetus_add_option "--instance=<string>" "Parallel execution identifier string"
- yetus_add_option "--jenkins" "Enable Jenkins-specifc handling (auto: --robot)"
- yetus_add_option "--mv-patch-dir" "Move the patch-dir into the basedir during cleanup"
- yetus_add_option "--robot" "Assume this is an automated run"
- yetus_add_option "--sentinel" "A very aggressive robot (auto: --robot)"
-
- yetus_generic_columnprinter "${YETUS_OPTION_USAGE[@]}"
- yetus_reset_usage
-
-
- echo ""
- echo "Docker options:"
- docker_usage
- yetus_generic_columnprinter "${YETUS_OPTION_USAGE[@]}"
- yetus_reset_usage
-
- echo ""
- echo "Reaper options:"
- reaper_usage
- yetus_generic_columnprinter "${YETUS_OPTION_USAGE[@]}"
- yetus_reset_usage
-
- for plugin in ${BUILDTOOLS} ${TESTTYPES} ${BUGSYSTEMS} ${TESTFORMATS}; do
- if declare -f ${plugin}_usage >/dev/null 2>&1; then
- echo ""
- echo "'${plugin}' plugin usage options:"
- "${plugin}_usage"
- yetus_generic_columnprinter "${YETUS_OPTION_USAGE[@]}"
- yetus_reset_usage
- fi
- done
-}
-
-## @description Interpret the command line parameters
-## @audience private
-## @stability stable
-## @replaceable no
-## @param $@
-## @return May exit on failure
-function parse_args
-{
- declare i
- declare j
-
- common_args "$@"
-
- for i in "$@"; do
- case ${i} in
- --archive-list=*)
- yetus_comma_to_array ARCHIVE_LIST "${i#*=}"
- yetus_debug "Set to archive: ${ARCHIVE_LIST[*]}"
- ;;
- --bugcomments=*)
- BUGCOMMENTS=${i#*=}
- BUGCOMMENTS=${BUGCOMMENTS//,/ }
- ;;
- --build-native=*)
- BUILD_NATIVE=${i#*=}
- ;;
- --build-tool=*)
- BUILDTOOL=${i#*=}
- ;;
- --build-url=*)
- BUILD_URL=${i#*=}
- ;;
- --build-url-artifacts=*)
- # shellcheck disable=SC2034
- BUILD_URL_ARTIFACTS=${i#*=}
- ;;
- --build-url-console=*)
- # shellcheck disable=SC2034
- BUILD_URL_CONSOLE=${i#*=}
- ;;
- --console-report-file=*)
- CONSOLE_REPORT_FILE=${i#*=}
- ;;
- --console-urls)
- # shellcheck disable=SC2034
- CONSOLE_USE_BUILD_URL=true
- ;;
- --contrib-guide=*)
- PATCH_NAMING_RULE=${i#*=}
- ;;
- --dirty-workspace)
- DIRTY_WORKSPACE=true
- ;;
- --instance=*)
- INSTANCE=${i#*=}
- ;;
- --empty-patch)
- BUILDMODE=full
- # shellcheck disable=SC2034
- BUILDMODEMSG="The source tree"
- ;;
- --java-home=*)
- JAVA_HOME=${i#*=}
- ;;
- --jenkins)
- JENKINS=true
- ;;
- --linecomments=*)
- BUGLINECOMMENTS=${i#*=}
- BUGLINECOMMENTS=${BUGLINECOMMENTS//,/ }
- ;;
- --modulelist=*)
- yetus_comma_to_array USER_MODULE_LIST "${i#*=}"
- yetus_debug "Manually forcing modules ${USER_MODULE_LIST[*]}"
- ;;
- --multijdkdirs=*)
- JDK_DIR_LIST=${i#*=}
- JDK_DIR_LIST=${JDK_DIR_LIST//,/ }
- yetus_debug "Multi-JDK mode activated with ${JDK_DIR_LIST}"
- yetus_add_entry EXEC_MODES MultiJDK
- ;;
- --multijdktests=*)
- JDK_TEST_LIST=${i#*=}
- JDK_TEST_LIST=${JDK_TEST_LIST//,/ }
- yetus_debug "Multi-JDK test list: ${JDK_TEST_LIST}"
- ;;
- --mv-patch-dir)
- RELOCATE_PATCH_DIR=true;
- ;;
- --personality=*)
- PERSONALITY=${i#*=}
- ;;
- --proclimit=*)
- PROC_LIMIT=${i#*=}
- ;;
- --reexec)
- REEXECED=true
- ;;
- --resetrepo)
- RESETREPO=true
- ;;
- --robot)
- ROBOT=true
- ;;
- --run-tests)
- RUN_TESTS=true
- ;;
- --sentinel)
- # shellcheck disable=SC2034
- SENTINEL=true
- yetus_add_entry EXEC_MODES Sentinel
- ;;
- --skip-dirs=*)
- MODULE_SKIPDIRS=${i#*=}
- MODULE_SKIPDIRS=${MODULE_SKIPDIRS//,/ }
- yetus_debug "Setting skipdirs to ${MODULE_SKIPDIRS}"
- ;;
- --summarize=*)
- ALLOWSUMMARIES=${i#*=}
- ;;
- --test-parallel=*)
- # shellcheck disable=SC2034
- TEST_PARALLEL=${i#*=}
- ;;
- --test-threads=*)
- # shellcheck disable=SC2034
- TEST_THREADS=${i#*=}
- ;;
- --unit-test-filter-file=*)
- UNIT_TEST_FILTER_FILE=${i#*=}
- ;;
- --tests-filter=*)
- yetus_comma_to_array VOTE_FILTER "${i#*=}"
- ;;
- --tpglobaltimer=*)
- GLOBALTIMER=${i#*=}
- ;;
- --tpinstance=*)
- INSTANCE=${i#*=}
- EXECUTOR_NUMBER=${INSTANCE}
- ;;
- --tpperson=*)
- REEXECPERSONALITY=${i#*=}
- ;;
- --tpreexectimer=*)
- REEXECLAUNCHTIMER=${i#*=}
- ;;
- --*)
- ## PATCH_OR_ISSUE can't be a --. So this is probably
- ## a plugin thing.
- continue
- ;;
- *)
- PATCH_OR_ISSUE=${i}
- ;;
- esac
- done
-
- docker_parse_args "$@"
-
- reaper_parse_args "$@"
-
- if [[ -z "${PATCH_OR_ISSUE}"
- && "${BUILDMODE}" = patch ]]; then
- yetus_usage
- exit 1
- fi
-
- if [[ ${JENKINS} = true ]]; then
- ROBOT=true
- INSTANCE=${EXECUTOR_NUMBER}
- yetus_add_entry EXEC_MODES Jenkins
- fi
-
- if [[ ${ROBOT} = true ]]; then
- # shellcheck disable=SC2034
- TEST_PARALLEL=true
- RESETREPO=true
- RUN_TESTS=true
- ISSUE=${PATCH_OR_ISSUE}
- yetus_add_entry EXEC_MODES Robot
- fi
-
- if [[ -n $UNIT_TEST_FILTER_FILE ]]; then
- if [[ -f $UNIT_TEST_FILTER_FILE ]]; then
- UNIT_TEST_FILTER_FILE=$(yetus_abs "${UNIT_TEST_FILTER_FILE}")
- else
- yetus_error "ERROR: Unit test filter file (${UNIT_TEST_FILTER_FILE}) does not exist!"
- cleanup_and_exit 1
- fi
- fi
-
- if [[ -n ${REEXECLAUNCHTIMER} ]]; then
- TIMER=${REEXECLAUNCHTIMER};
- else
- start_clock
- fi
-
- if [[ "${DOCKERMODE}" = true || "${DOCKERSUPPORT}" = true ]]; then
- if [[ "${DOCKER_DESTRCUTIVE}" = true ]]; then
- yetus_add_entry EXEC_MODES DestructiveDocker
- else
- yetus_add_entry EXEC_MODES Docker
- fi
- add_vote_table 0 reexec "Docker mode activated."
- start_clock
- elif [[ "${REEXECED}" = true ]]; then
- yetus_add_entry EXEC_MODES Re-exec
- add_vote_table 0 reexec "Precommit patch detected."
- start_clock
- fi
-
- # we need absolute dir for ${BASEDIR}
- cd "${STARTINGDIR}" || cleanup_and_exit 1
- BASEDIR=$(yetus_abs "${BASEDIR}")
-
- if [[ -n ${USER_PATCH_DIR} ]]; then
- PATCH_DIR="${USER_PATCH_DIR}"
- fi
-
- # we need absolute dir for PATCH_DIR
- cd "${STARTINGDIR}" || cleanup_and_exit 1
- if [[ ! -d ${PATCH_DIR} ]]; then
- mkdir -p "${PATCH_DIR}"
- if [[ $? == 0 ]] ; then
- echo "${PATCH_DIR} has been created"
- else
- echo "Unable to create ${PATCH_DIR}"
- cleanup_and_exit 1
- fi
- fi
- PATCH_DIR=$(yetus_abs "${PATCH_DIR}")
- COPROC_LOGFILE="${PATCH_DIR}/coprocessors.txt"
-
- # we need absolute dir for ${CONSOLE_REPORT_FILE}
- if [[ -n "${CONSOLE_REPORT_FILE}" ]]; then
- if : > "${CONSOLE_REPORT_FILE}"; then
- CONSOLE_REPORT_FILE_ORIG="${CONSOLE_REPORT_FILE}"
- CONSOLE_REPORT_FILE=$(yetus_abs "${CONSOLE_REPORT_FILE_ORIG}")
- else
- yetus_error "ERROR: cannot write to ${CONSOLE_REPORT_FILE}. Disabling console report file."
- unset CONSOLE_REPORT_FILE
- fi
- fi
-
- if [[ ${RESETREPO} == "true" ]] ; then
- yetus_add_entry EXEC_MODES ResetRepo
- fi
-
- if [[ ${RUN_TESTS} == "true" ]] ; then
- yetus_add_entry EXEC_MODES UnitTests
- fi
-
- if [[ -n "${USER_PLUGIN_DIR}" ]]; then
- USER_PLUGIN_DIR=$(yetus_abs "${USER_PLUGIN_DIR}")
- fi
-
- GITDIFFLINES="${PATCH_DIR}/gitdifflines.txt"
- GITDIFFCONTENT="${PATCH_DIR}/gitdiffcontent.txt"
- GITUNIDIFFLINES="${PATCH_DIR}/gitdiffunilines.txt"
-
- if [[ "${REEXECED}" = true
- && -f "${PATCH_DIR}/precommit/personality/provided.sh" ]]; then
- REEXECPERSONALITY="${PERSONALITY}"
- PERSONALITY="${PATCH_DIR}/precommit/personality/provided.sh"
- fi
-}
-
-## @description Locate the build file for a given directory
-## @audience private
-## @stability stable
-## @replaceable no
-## @return directory containing the buildfile. Nothing returned if not found.
-## @param buildfile
-## @param directory
-function find_buildfile_dir
-{
- local buildfile=$1
- local dir=$2
-
- yetus_debug "Find ${buildfile} dir for: ${dir}"
-
- while builtin true; do
- if [[ -f "${dir}/${buildfile}" ]];then
- echo "${dir}"
- yetus_debug "Found: ${dir}"
- return 0
- elif [[ ${dir} == "." || ${dir} == "/" ]]; then
- yetus_debug "ERROR: ${buildfile} is not found."
- return 1
- else
- dir=$(faster_dirname "${dir}")
- fi
- done
-}
-
-## @description List of files that ${PATCH_DIR}/patch modifies
-## @audience private
-## @stability stable
-## @replaceable no
-## @return None; sets ${CHANGED_FILES[@]}
-function find_changed_files
-{
- declare line
- declare oldifs
-
- case "${BUILDMODE}" in
- full)
- echo "Building a list of all files in the source tree"
- oldifs=${IFS}
- IFS=$'\n'
- CHANGED_FILES=($(git ls-files))
- IFS=${oldifs}
- ;;
- patch)
- # get a list of all of the files that have been changed,
- # except for /dev/null (which would be present for new files).
- # Additionally, remove any a/ b/ patterns at the front of the patch filenames.
- # shellcheck disable=SC2016
- while read -r line; do
- CHANGED_FILES=("${CHANGED_FILES[@]}" "${line}")
- done < <(
- ${AWK} 'function p(s){sub("^[ab]/","",s); if(s!~"^/dev/null"){print s}}
- /^diff --git / { p($3); p($4) }
- /^(\+\+\+|---) / { p($2) }' "${PATCH_DIR}/patch" | sort -u)
- ;;
- esac
-}
-
-## @description Check for directories to skip during
-## @description changed module calcuation
-## @audience private
-## @stability stable
-## @replaceable no
-## @param directory
-## @return 0 for use
-## @return 1 for skip
-function module_skipdir
-{
- local dir=${1}
- local i
-
- yetus_debug "Checking skipdirs for ${dir}"
-
- if [[ -z ${MODULE_SKIPDIRS} ]]; then
- yetus_debug "Skipping skipdirs"
- return 0
- fi
-
- while builtin true; do
- for i in ${MODULE_SKIPDIRS}; do
- if [[ ${dir} = "${i}" ]];then
- yetus_debug "Found a skip: ${dir}"
- return 1
- fi
- done
- if [[ ${dir} == "." || ${dir} == "/" ]]; then
- return 0
- else
- dir=$(faster_dirname "${dir}")
- yetus_debug "Trying to skip: ${dir}"
- fi
- done
-}
-
-## @description Find the modules of the build that ${PATCH_DIR}/patch modifies
-## @audience private
-## @stability stable
-## @replaceable no
-## @param repostatus
-## @return None; sets ${CHANGED_MODULES[@]}
-function find_changed_modules
-{
- declare repostatus=$1
- declare i
- declare builddir
- declare module
- declare prev_builddir
- declare i=1
- declare dir
- declare dirt
- declare buildfile
- declare -a tmpmods
-
- buildfile=$("${BUILDTOOL}_buildfile")
-
- if [[ $? != 0 ]]; then
- yetus_error "ERROR: Unsupported build tool."
- bugsystem_finalreport 1
- cleanup_and_exit 1
- fi
-
- # Empty string indicates the build system wants to disable module detection
- if [[ -z ${buildfile} ]]; then
- tmpmods=(".")
- else
-
- # Now find all the modules that were changed
- for i in "${CHANGED_FILES[@]}"; do
-
- # TODO: optimize this
- if [[ "${BUILDMODE}" = full && ! "${i}" =~ ${buildfile} ]]; then
- continue
- fi
-
- dirt=$(dirname "${i}")
-
- module_skipdir "${dirt}"
- if [[ $? != 0 ]]; then
- continue
- fi
-
- builddir=$(find_buildfile_dir "${buildfile}" "${dirt}")
- if [[ -z ${builddir} ]]; then
- yetus_error "ERROR: ${buildfile} is not found. Make sure the target is a ${BUILDTOOL}-based project."
- bugsystem_finalreport 1
- cleanup_and_exit 1
- fi
- tmpmods=("${tmpmods[@]}" "${builddir}")
- done
- fi
-
- tmpmods=("${tmpmods[@]}" "${USER_MODULE_LIST[@]}")
-
- CHANGED_MODULES=($(printf "%s\n" "${tmpmods[@]}" | sort -u))
-
- yetus_debug "Locate the union of ${CHANGED_MODULES[*]}"
- count=${#CHANGED_MODULES[@]}
- if [[ ${count} -lt 2 ]]; then
- yetus_debug "Only one entry, so keeping it ${CHANGED_MODULES[0]}"
- # shellcheck disable=SC2034
- CHANGED_UNION_MODULES="${CHANGED_MODULES[0]}"
- else
- i=1
- while [[ ${i} -lt 100 ]]
- do
- tmpmods=()
- for j in "${CHANGED_MODULES[@]}"; do
- tmpmods=("${tmpmods[@]}" $(echo "${j}" | cut -f1-${i} -d/))
- done
- tmpmods=($(printf "%s\n" "${tmpmods[@]}" | sort -u))
-
- module=${tmpmods[0]}
- count=${#tmpmods[@]}
- if [[ ${count} -eq 1
- && -f ${module}/${buildfile} ]]; then
- prev_builddir=${module}
- elif [[ ${count} -gt 1 ]]; then
- builddir=${prev_builddir}
- break
- fi
- ((i=i+1))
- done
-
- if [[ -z ${builddir} ]]; then
- builddir="."
- fi
-
- yetus_debug "Finding union of ${builddir}"
- builddir=$(find_buildfile_dir "${buildfile}" "${builddir}" || true)
-
- #shellcheck disable=SC2034
- CHANGED_UNION_MODULES="${builddir}"
- fi
-
- # some build tools may want to change these and/or
- # make other changes based upon these results
- if declare -f ${BUILDTOOL}_reorder_modules >/dev/null; then
- "${BUILDTOOL}_reorder_modules" "${repostatus}"
- fi
-}
-
-## @description check if repo requires ssh creds to pull
-## @audience private
-## @stability stable
-## @replaceable no
-## @return 0 = no
-## @return 1 = yes
-function git_requires_creds
-{
- declare status
- declare -a remotes
-
- # shellcheck disable=SC2207
- remotes=( $("${GIT}" remote -v show -n) )
-
- for r in "${remotes[@]}"; do
- if [[ ${r} =~ /@/ ]] || [[ ${r} =~ git:// ]]; then
- return 1
- fi
- done
- return 0
-}
-
-## @description git checkout the appropriate branch to test. Additionally, this calls
-## @description 'determine_branch' based upon the context provided
-## @description in ${PATCH_DIR} and in git after checkout.
-## @audience private
-## @stability stable
-## @replaceable no
-## @return 0 on success. May exit on failure.
-function git_checkout
-{
- declare currentbranch
- declare exemptdir
- declare status
- declare pullmayfail=false
-
- big_console_header "Confirming git environment"
-
- cd "${BASEDIR}" || cleanup_and_exit 1
- if [[ ! -e .git ]]; then
- yetus_error "ERROR: ${BASEDIR} is not a git repo."
- cleanup_and_exit 1
- fi
-
- if git_requires_creds; then
- pullmayfail=true
- fi
-
- if [[ ${RESETREPO} == "true" ]] ; then
-
- if [[ -d .git/rebase-apply ]]; then
- yetus_error "ERROR: a previous rebase failed. Aborting it."
- ${GIT} rebase --abort
- fi
-
- if ! ${GIT} reset --hard; then
- yetus_error "ERROR: git reset is failing"
- cleanup_and_exit 1
- fi
-
- # if PATCH_DIR is in BASEDIR, then we don't want
- # git wiping it out.
- exemptdir=$(relative_dir "${PATCH_DIR}")
- if [[ $? == 1 ]]; then
- ${GIT} clean -xdf
- status=$?
-
- else
- # we do, however, want it emptied of all _files_.
- # we need to leave _directories_ in case we are in
- # re-exec mode (which places a directory full of stuff in it)
- yetus_debug "Exempting ${exemptdir} from clean"
- rm "${PATCH_DIR}/*" 2>/dev/null
- ${GIT} clean -xdf -e "${exemptdir}"
- status=$?
- fi
-
- if [[ ${status} != 0 ]]; then
- yetus_error "ERROR: git clean is failing"
- cleanup_and_exit 1
- fi
-
- if ! ${GIT} checkout --force "${PATCH_BRANCH_DEFAULT}"; then
- yetus_error "ERROR: git checkout --force ${PATCH_BRANCH_DEFAULT} is failing"
- cleanup_and_exit 1
- fi
-
- determine_branch
-
- # we need to explicitly fetch in case the
- # git ref hasn't been brought in tree yet
- if [[ ${OFFLINE} == false ]] && [[ ${GIT_OFFLINE} == false ]]; then
-
- if ! ${GIT} pull --rebase; then
- if [[ ${pullmayfail} == true ]]; then
- yetus_error "WARNING: Noted that pull failed, will treat git as offline from here on out"
- GIT_OFFLINE=true
- else
- yetus_error "ERROR: git pull is failing"
- cleanup_and_exit 1
- fi
- fi
- fi
-
- # forcibly checkout this branch or git ref
-
- if ! ${GIT} checkout --force "${PATCH_BRANCH}"; then
- yetus_error "ERROR: git checkout ${PATCH_BRANCH} is failing"
- cleanup_and_exit 1
- fi
-
- # if we've selected a feature branch that has new changes
- # since our last build, we'll need to reset to the latest FETCH_HEAD.
- if [[ ${OFFLINE} == false ]]; then
-
- # previous clause where GIT_OFFLINE would get set is also
- # protected by OFFLINE == false
-
- if [[ "${GIT_OFFLINE}" == false ]]; then
- if ! ${GIT} fetch; then
- yetus_error "ERROR: git fetch is failing"
- cleanup_and_exit 1
- fi
-
- if ! ${GIT} reset --hard FETCH_HEAD; then
- yetus_error "ERROR: git reset is failing"
- cleanup_and_exit 1
- fi
- fi
-
- if ! ${GIT} clean -df; then
- yetus_error "ERROR: git clean is failing"
- cleanup_and_exit 1
- fi
- fi
-
- else
-
- status=$(${GIT} status --porcelain)
- if [[ "${status}" != "" && -z ${DIRTY_WORKSPACE} ]] ; then
- yetus_error "ERROR: --dirty-workspace option not provided."
- yetus_error "ERROR: can't run in a workspace that contains the following modifications"
- yetus_error "${status}"
- cleanup_and_exit 1
- fi
-
- determine_branch
-
- currentbranch=$(${GIT} rev-parse --abbrev-ref HEAD)
- if [[ "${currentbranch}" != "${PATCH_BRANCH}" ]];then
- if [[ "${BUILDMODE}" = patch ]]; then
- echo "WARNING: Current git branch is ${currentbranch} but patch is built for ${PATCH_BRANCH}."
- echo "WARNING: Continuing anyway..."
- fi
- PATCH_BRANCH=${currentbranch}
- fi
- fi
-
- return 0
-}
-
-## @description Confirm the given branch is a git reference
-## @descriptoin or a valid gitXYZ commit hash
-## @audience private
-## @stability evolving
-## @replaceable no
-## @param branch
-## @return 0 on success, if gitXYZ was passed, PATCH_BRANCH=xyz
-## @return 1 on failure
-function verify_valid_branch
-{
- local check=$1
- local i
- local hash
-
- # shortcut some common
- # non-resolvable names
- if [[ -z ${check} ]]; then
- return 1
- fi
-
- if [[ ${check} =~ ^git ]]; then
- hash=$(echo "${check}" | cut -f2- -dt)
- if [[ -n ${hash} ]]; then
- ${GIT} cat-file -t "${hash}" >/dev/null 2>&1
- if [[ $? -eq 0 ]]; then
- PATCH_BRANCH=${hash}
- return 0
- fi
- return 1
- else
- return 1
- fi
- fi
-
- ${GIT} show-ref "${check}" >/dev/null 2>&1
- return $?
-}
-
-## @description Try to guess the branch being tested using a variety of heuristics
-## @audience private
-## @stability evolving
-## @replaceable no
-## @return 0 on success, with PATCH_BRANCH updated appropriately
-## @return 1 on failure, with PATCH_BRANCH updated to PATCH_BRANCH_DEFAULT
-function determine_branch
-{
- declare bugs
- declare retval=1
-
- # something has already set this, so move on
- if [[ -n ${PATCH_BRANCH} ]]; then
- return
- fi
-
- pushd "${BASEDIR}" > /dev/null
-
- yetus_debug "Determine branch"
-
- # something has already set this, so move on
- if [[ -n ${PATCH_BRANCH} ]]; then
- return
- fi
-
- # developer mode, existing checkout, whatever
- if [[ "${DIRTY_WORKSPACE}" == true ]];then
- PATCH_BRANCH=$(${GIT} rev-parse --abbrev-ref HEAD)
- echo "dirty workspace mode; applying against existing branch"
- return
- fi
-
- for bugs in ${BUGSYSTEMS}; do
- if declare -f ${bugs}_determine_branch >/dev/null;then
- "${bugs}_determine_branch"
- retval=$?
- if [[ ${retval} == 0 ]]; then
- break
- fi
- fi
- done
-
- if [[ ${retval} != 0 ]]; then
- PATCH_BRANCH="${PATCH_BRANCH_DEFAULT}"
- fi
- popd >/dev/null
-}
-
-## @description Try to guess the issue being tested using a variety of heuristics
-## @audience private
-## @stability evolving
-## @replaceable no
-## @return 0 on success, with ISSUE updated appropriately
-## @return 1 on failure, with ISSUE updated to "Unknown"
-function determine_issue
-{
- declare bugsys
-
- yetus_debug "Determine issue"
-
- for bugsys in ${BUGSYSTEMS}; do
- if declare -f ${bugsys}_determine_issue >/dev/null; then
- "${bugsys}_determine_issue" "${PATCH_OR_ISSUE}"
- if [[ $? == 0 ]]; then
- yetus_debug "${bugsys} says ${ISSUE}"
- return 0
- fi
- fi
- done
- return 1
-}
-
-## @description Use some heuristics to determine which long running
-## @description tests to run
-## @audience private
-## @stability stable
-## @replaceable no
-function determine_needed_tests
-{
- declare i
- declare plugin
-
- big_console_header "Determining needed tests"
- echo "(Depending upon input size and number of plug-ins, this may take a while)"
-
- for i in "${CHANGED_FILES[@]}"; do
- yetus_debug "Determining needed tests for ${i}"
- personality_file_tests "${i}"
-
- for plugin in ${TESTTYPES} ${BUILDTOOL}; do
- if declare -f ${plugin}_filefilter >/dev/null 2>&1; then
- "${plugin}_filefilter" "${i}"
- fi
- done
- done
-
- add_footer_table "Optional Tests" "${NEEDED_TESTS}"
-}
-
-## @description Given ${PATCH_DIR}/patch, apply the patch
-## @audience private
-## @stability evolving
-## @replaceable no
-## @return 0 on success
-## @return exit on failure
-function apply_patch_file
-{
- big_console_header "Applying patch to ${PATCH_BRANCH}"
-
- patchfile_apply_driver "${PATCH_DIR}/patch"
- if [[ $? != 0 ]] ; then
- echo "PATCH APPLICATION FAILED"
- ((RESULT = RESULT + 1))
- add_vote_table -1 patch "${PATCH_OR_ISSUE} does not apply to ${PATCH_BRANCH}. Rebase required? Wrong Branch? See ${PATCH_NAMING_RULE} for help."
- bugsystem_finalreport 1
- cleanup_and_exit 1
- fi
- return 0
-}
-
-## @description copy the test-patch binary bits to a new working dir,
-## @description setting USER_PLUGIN_DIR and PERSONALITY to the new
-## @description locations.
-## @description this is used for test-patch in docker and reexec mode
-## @audience private
-## @stability evolving
-## @replaceable no
-function copytpbits
-{
- declare dockerdir
- declare dockfile
- declare lines
-
- # we need to copy/consolidate all the bits that might have changed
- # that are considered part of test-patch. This *might* break
- # things that do off-path includes, but there isn't much we can
- # do about that, I don't think.
-
- # if we've already copied, then don't bother doing it again
- if [[ ${STARTINGDIR} == ${PATCH_DIR}/precommit ]]; then
- yetus_debug "Skipping copytpbits; already copied once"
- return
- fi
-
- pushd "${STARTINGDIR}" >/dev/null
- mkdir -p "${PATCH_DIR}/precommit/user-plugins"
- mkdir -p "${PATCH_DIR}/precommit/personality"
- mkdir -p "${PATCH_DIR}/precommit/test-patch-docker"
-
- # copy our entire universe, preserving links, etc.
- yetus_debug "copying '${BINDIR}' over to '${PATCH_DIR}/precommit'"
- # shellcheck disable=SC2164
- (cd "${BINDIR}"; tar cpf - . ) | (cd "${PATCH_DIR}/precommit"; tar xpf - )
-
- if [[ ! -f "${BINDIR}/VERSION"
- && -f "${BINDIR}/../VERSION" ]]; then
- cp -p "${BINDIR}/../VERSION" "${PATCH_DIR}/precommit/VERSION"
- fi
-
- if [[ -n "${USER_PLUGIN_DIR}"
- && -d "${USER_PLUGIN_DIR}" ]]; then
- yetus_debug "copying '${USER_PLUGIN_DIR}' over to ${PATCH_DIR}/precommit/user-plugins"
- cp -pr "${USER_PLUGIN_DIR}"/. \
- "${PATCH_DIR}/precommit/user-plugins"
- fi
- # Set to be relative to ${PATCH_DIR}/precommit
- USER_PLUGIN_DIR="${PATCH_DIR}/precommit/user-plugins"
-
- if [[ -n ${PERSONALITY}
- && -f ${PERSONALITY} ]]; then
- yetus_debug "copying '${PERSONALITY}' over to '${PATCH_DIR}/precommit/personality/provided.sh'"
- cp -pr "${PERSONALITY}" "${PATCH_DIR}/precommit/personality/provided.sh"
- fi
-
- if [[ -n ${UNIT_TEST_FILTER_FILE}
- && -f ${UNIT_TEST_FILTER_FILE} ]]; then
- yetus_debug "copying '${UNIT_TEST_FILTER_FILE}' over to '${PATCH_DIR}/precommit/unit_test_filter_file.txt'"
- cp -pr "${UNIT_TEST_FILTER_FILE}" "${PATCH_DIR}/precommit/unit_test_filter_file.txt"
- fi
-
- if [[ -n ${DOCKERFILE}
- && -f ${DOCKERFILE} ]]; then
- yetus_debug "copying '${DOCKERFILE}' over to '${PATCH_DIR}/precommit/test-patch-docker/Dockerfile'"
- dockerdir=$(dirname "${DOCKERFILE}")
- dockfile=$(basename "${DOCKERFILE}")
- pushd "${dockerdir}" >/dev/null
- gitfilerev=$("${GIT}" log -n 1 --pretty=format:%h -- "${dockfile}" 2>/dev/null)
- popd >/dev/null
- if [[ -z ${gitfilerev} ]]; then
- gitfilerev=$(date "+%F")
- gitfilerev="date${gitfilerev}"
- fi
- (
- echo "### YETUS_PRIVATE: dockerfile=${DOCKERFILE}"
- echo "### YETUS_PRIVATE: gitrev=${gitfilerev}"
- lines=$(${GREP} -n 'YETUS CUT HERE' "${DOCKERFILE}" | cut -f1 -d:)
- if [[ -z "${lines}" ]]; then
- cat "${DOCKERFILE}"
- else
- head -n "${lines}" "${DOCKERFILE}"
- fi
- # make sure we put some space between, just in case last
- # line isn't an empty line or whatever
- printf "\n\n"
- echo "### YETUS_PRIVATE: start test-patch-bootstrap"
- cat "${BINDIR}/test-patch-docker/Dockerfile-endstub"
-
- printf "\n\n"
- ) > "${PATCH_DIR}/precommit/test-patch-docker/Dockerfile"
- DOCKERFILE="${PATCH_DIR}/precommit/test-patch-docker/Dockerfile"
- fi
-
- popd >/dev/null
-}
-
-## @description change the working directory to execute the buildtool
-## @audience public
-## @stability evolving
-## @replaceable no
-## @param MODULE_ index
-function buildtool_cwd
-{
- declare modindex=$1
-
- BUILDTOOLCWD="${BUILDTOOLCWD//@@@BASEDIR@@@/${BASEDIR}}"
- BUILDTOOLCWD="${BUILDTOOLCWD//@@@MODULEDIR@@@/${BASEDIR}/${MODULE[${modindex}]}}"
-
- if [[ "${BUILDTOOLCWD}" =~ ^/ ]]; then
- yetus_debug "buildtool_cwd: ${BUILDTOOLCWD}"
- if [[ ! -e "${BUILDTOOLCWD}" ]]; then
- mkdir -p "${BUILDTOOLCWD}"
- fi
- pushd "${BUILDTOOLCWD}" >/dev/null
- return $?
- fi
-
- case "${BUILDTOOLCWD}" in
- basedir)
- pushd "${BASEDIR}" >/dev/null
- ;;
- module)
- pushd "${BASEDIR}/${MODULE[${modindex}]}" >/dev/null
- ;;
- *)
- pushd "$(pwd)"
- ;;
- esac
-}
-
-## @description If this patches actually patches test-patch.sh, then
-## @description run with the patched version for the test.
-## @audience private
-## @stability evolving
-## @replaceable no
-## @return none; otherwise relaunches
-function check_reexec
-{
- declare commentfile=${PATCH_DIR}/tp.${RANDOM}
- declare tpdir
- declare copy=false
- declare testdir
- declare plugin
-
- if [[ ${REEXECED} == true ]]; then
- big_console_header "Re-exec mode detected. Continuing."
- return
- fi
-
- # determine if the patch hits
- # any test-patch sensitive bits
- # if so, we need to copy the universe
- # after patching it (copy=true)
- for testdir in "${BINDIR}" \
- "${PERSONALITY}" \
- "${USER_PLUGIN_DIR}" \
- "${DOCKERFILE}"; do
- tpdir=$(relative_dir "${testdir}")
- if [[ $? == 0
- && "${CHANGED_FILES[*]}" =~ ${tpdir} ]]; then
- copy=true
- fi
- done
-
- if [[ ${copy} == true && "${BUILDMODE}" != full ]]; then
- big_console_header "precommit patch detected"
-
- if [[ ${RESETREPO} == false ]]; then
- ((RESULT = RESULT + 1))
- yetus_debug "can't destructively change the working directory. run with '--resetrepo' please. :("
- add_vote_table -1 precommit "Couldn't test precommit changes because we aren't configured to destructively change the working directory."
- else
-
- apply_patch_file
-
- if [[ ${ROBOT} == true ]]; then
- rm "${commentfile}" 2>/dev/null
- echo "(!) A patch to the testing environment has been detected. " > "${commentfile}"
- echo "Re-executing against the patched versions to perform further tests. " >> "${commentfile}"
- echo "The console is at ${BUILD_URL}${BUILD_URL_CONSOLE} in case of problems." >> "${commentfile}"
- write_comment "${commentfile}"
- rm "${commentfile}"
- fi
- fi
- fi
-
- if [[ ${DOCKERSUPPORT} == false
- && ${copy} == false ]]; then
- return
- fi
-
- if [[ ${DOCKERSUPPORT} == true
- && ${copy} == false ]]; then
- big_console_header "Re-execing under Docker"
- fi
-
- # copy our universe
- copytpbits
-
- if [[ ${DOCKERSUPPORT} == true ]]; then
- # if we are doing docker, then we re-exec, but underneath the
- # container
-
- determine_user
-
- # need to call this explicitly
- console_docker_support
-
- for plugin in ${PROJECT_NAME} ${BUILDTOOL} ${BUGSYSTEMS} ${TESTTYPES} ${TESTFORMATS}; do
- if declare -f "${plugin}_docker_support" >/dev/null; then
- "${plugin}_docker_support"
- fi
- done
-
- TESTPATCHMODE="${USER_PARAMS[*]}"
- if [[ -n "${BUILD_URL}" ]]; then
- TESTPATCHMODE="--build-url=${BUILD_URL} ${TESTPATCHMODE}"
- fi
-
- if [[ -f "${PERSONALITY}" ]]; then
- TESTPATCHMODE="--tpperson=${PERSONALITY} ${TESTPATCHMODE}"
- fi
-
- TESTPATCHMODE="--tpglobaltimer=${GLOBALTIMER} ${TESTPATCHMODE}"
- TESTPATCHMODE="--tpreexectimer=${TIMER} ${TESTPATCHMODE}"
- TESTPATCHMODE="--tpinstance=${INSTANCE} ${TESTPATCHMODE}"
- TESTPATCHMODE="--plugins=${ENABLED_PLUGINS// /,} ${TESTPATCHMODE}"
- TESTPATCHMODE=" ${TESTPATCHMODE}"
- export TESTPATCHMODE
-
- #shellcheck disable=SC2164
- cd "${BASEDIR}"
- #shellcheck disable=SC2093
- docker_handler
- else
-
- # if we aren't doing docker, then just call ourselves
- # but from the new path with the new flags
- #shellcheck disable=SC2164
- cd "${PATCH_DIR}/precommit/"
- exec "${PATCH_DIR}/precommit/test-patch.sh" \
- "${USER_PARAMS[@]}" \
- --reexec \
- --basedir="${BASEDIR}" \
- --branch="${PATCH_BRANCH}" \
- --patch-dir="${PATCH_DIR}" \
- --tpglobaltimer="${GLOBALTIMER}" \
- --tpreexectimer="${TIMER}" \
- --personality="${PERSONALITY}" \
- --tpinstance="${INSTANCE}" \
- --user-plugins="${USER_PLUGIN_DIR}"
- fi
-}
-
-## @description Save file names and directory to the patch dir
-## @audience public
-## @stability evolving
-## @replaceable no
-function archive
-{
- declare pmn
- declare fn
- declare line
- declare srcdir
- declare tmpfile="${PATCH_DIR}/tmp.$$.${RANDOM}"
-
- if [[ ${#ARCHIVE_LIST[@]} -eq 0 ]]; then
- return
- fi
-
- if ! verify_command "rsync" "${RSYNC}"; then
- yetus_error "WARNING: Cannot use the archive function"
- return
- fi
-
- yetus_debug "Starting archiving process"
- # get the list of files. these will be with
- # the full path
- # (this is pretty expensive)
-
- rm "${tmpfile}" 2>/dev/null
- for pmn in "${ARCHIVE_LIST[@]}"; do
- find "${BASEDIR}" -name "${pmn}" >> "${tmpfile}"
- done
-
- # read the list, stripping of both
- # the BASEDIR and any leading /.
- # with our filename fragment,
- # call faster_dirname with a prepended /
- while read -r line; do
- yetus_debug "Archiving: ${line}"
- srcdir=$(faster_dirname "/${line}")
- mkdir -p "${PATCH_DIR}/archiver${srcdir}"
- "${RSYNC}" -av "${BASEDIR}/${line}" "${PATCH_DIR}/archiver${srcdir}" >/dev/null 2>&1
- done < <("${SED}" -e "s,${BASEDIR},,g" \
- -e "s,^/,,g" "${tmpfile}")
- rm "${tmpfile}" 2>/dev/null
- yetus_debug "Ending archiving process"
-
-}
-
-## @description Reset the test results
-## @audience public
-## @stability evolving
-## @replaceable no
-function modules_reset
-{
- MODULE_STATUS=()
- MODULE_STATUS_TIMER=()
- MODULE_STATUS_MSG=()
- MODULE_STATUS_LOG=()
- MODULE_COMPILE_LOG=()
-}
-
-## @description Backup the MODULE globals prior to loop processing
-## @audience public
-## @stability evolving
-## @replaceable no
-function modules_backup
-{
- MODULE_BACKUP_STATUS=("${MODULE_STATUS[@]}")
- MODULE_BACKUP_STATUS_TIMER=("${MODULE_STATUS_TIMER[@]}")
- MODULE_BACKUP_STATUS_MSG=("${MODULE_STATUS_MSG[@]}")
- MODULE_BACKUP_STATUS_LOG=("${MODULE_STATUS_LOG[@]}")
- MODULE_BACKUP_COMPILE_LOG=("${MODULE_COMPILE_LOG[@]}")
-}
-
-## @description Restore the backup
-## @audience public
-## @stability evolving
-## @replaceable no
-function modules_restore
-{
- MODULE_STATUS=("${MODULE_BACKUP_STATUS[@]}")
- MODULE_STATUS_TIMER=("${MODULE_BACKUP_STATUS_TIMER[@]}")
- MODULE_STATUS_MSG=("${MODULE_BACKUP_STATUS_MSG[@]}")
- MODULE_STATUS_LOG=("${MODULE_BACKUP_STATUS_LOG[@]}")
- MODULE_COMPILE_LOG=("${MODULE_BACKUP_COMPILE_LOG[@]}")
-}
-
-## @description Utility to print standard module errors
-## @audience public
-## @stability evolving
-## @replaceable no
-## @param repostatus
-## @param testtype
-## @param summarymode
-function modules_messages
-{
- declare repostatus=$1
- declare testtype=$2
- declare summarymode=$3
- shift 3
- declare modindex=0
- declare repo
- declare goodtime=0
- declare failure=false
- declare oldtimer
- declare statusjdk
- declare multijdkmode=false
-
- if [[ "${BUILDMODE}" == full ]]; then
- repo="the source"
- elif [[ "${repostatus}" == branch ]]; then
- repo=${PATCH_BRANCH}
- else
- repo="the patch"
- fi
-
- if verify_multijdk_test "${testtype}"; then
- multijdkmode=true
- fi
-
- oldtimer=${TIMER}
-
- if [[ ${summarymode} == true
- && ${ALLOWSUMMARIES} == true ]]; then
-
- until [[ ${modindex} -eq ${#MODULE[@]} ]]; do
-
- if [[ ${multijdkmode} == true ]]; then
- statusjdk=${MODULE_STATUS_JDK[${modindex}]}
- fi
-
- if [[ "${MODULE_STATUS[${modindex}]}" == '+1' ]]; then
- ((goodtime=goodtime + ${MODULE_STATUS_TIMER[${modindex}]}))
- else
- failure=true
- start_clock
- echo ""
- echo "${MODULE_STATUS_MSG[${modindex}]}"
- echo ""
- offset_clock "${MODULE_STATUS_TIMER[${modindex}]}"
- add_vote_table "${MODULE_STATUS[${modindex}]}" "${testtype}" "${MODULE_STATUS_MSG[${modindex}]}"
- if [[ ${MODULE_STATUS[${modindex}]} == -1
- && -n "${MODULE_STATUS_LOG[${modindex}]}" ]]; then
- add_footer_table "${testtype}" "@@BASE@@/${MODULE_STATUS_LOG[${modindex}]}"
- fi
- fi
- ((modindex=modindex+1))
- done
-
- if [[ ${failure} == false ]]; then
- start_clock
- offset_clock "${goodtime}"
- add_vote_table +1 "${testtype}" "${repo} passed${statusjdk}"
- fi
- else
- until [[ ${modindex} -eq ${#MODULE[@]} ]]; do
- start_clock
- echo ""
- echo "${MODULE_STATUS_MSG[${modindex}]}"
- echo ""
- offset_clock "${MODULE_STATUS_TIMER[${modindex}]}"
- add_vote_table "${MODULE_STATUS[${modindex}]}" "${testtype}" "${MODULE_STATUS_MSG[${modindex}]}"
- if [[ ${MODULE_STATUS[${modindex}]} == -1
- && -n "${MODULE_STATUS_LOG[${modindex}]}" ]]; then
- add_footer_table "${testtype}" "@@BASE@@/${MODULE_STATUS_LOG[${modindex}]}"
- fi
- ((modindex=modindex+1))
- done
- fi
- TIMER=${oldtimer}
-}
-
-## @description Add or update a test result. Update requires
-## @description at least the first two parameters.
-## @description WARNING: If the message is updated,
-## @description then the JDK version is also calculated to match
-## @description the current JAVA_HOME.
-## @audience public
-## @stability evolving
-## @replaceable no
-## @param moduleindex
-## @param -1-0|0|+1
-## @param logvalue
-## @param message
-function module_status
-{
- declare index=$1
- declare value=$2
- shift 2
- declare log=$1
- shift
-
- declare jdk
-
- jdk=$(report_jvm_version "${JAVA_HOME}")
-
- if [[ -n ${index}
- && ${index} =~ ^[0-9]+$ ]]; then
- MODULE_STATUS[${index}]="${value}"
- if [[ -n ${log} ]]; then
- MODULE_STATUS_LOG[${index}]="${log}"
- fi
- if [[ -n $1 ]]; then
- MODULE_STATUS_JDK[${index}]=" with JDK v${jdk}"
- MODULE_STATUS_MSG[${index}]="${*}"
- fi
- else
- yetus_error "ASSERT: module_status given bad index: ${index}"
- yetus_error "ASSERT: module_stats $*"
- generate_stack
- exit 1
- fi
-}
-
-## @description run the tests for the queued modules
-## @audience public
-## @stability evolving
-## @replaceable no
-## @param repostatus
-## @param testtype
-## @param mvncmdline
-function modules_workers
-{
- declare repostatus=$1
- declare testtype=$2
- shift 2
- declare modindex=0
- declare fn
- declare savestart=${TIMER}
- declare savestop
- declare repo
- declare modulesuffix
- declare jdk=""
- declare jdkindex=0
- declare statusjdk
- declare result=0
- declare argv
- declare execvalue
-
- if [[ "${BUILDMODE}" = full ]]; then
- repo="the source"
- elif [[ ${repostatus} == branch ]]; then
- repo=${PATCH_BRANCH}
- else
- repo="the patch"
- fi
-
- modules_reset
-
- if verify_multijdk_test "${testtype}"; then
- jdk=$(report_jvm_version "${JAVA_HOME}")
- statusjdk=" with JDK v${jdk}"
- jdk="-jdk${jdk}"
- jdk=${jdk// /}
- yetus_debug "Starting MultiJDK mode${statusjdk} on ${testtype}"
- fi
-
- until [[ ${modindex} -eq ${#MODULE[@]} ]]; do
- start_clock
-
- fn=$(module_file_fragment "${MODULE[${modindex}]}")
- fn="${fn}${jdk}"
- modulesuffix=$(basename "${MODULE[${modindex}]}")
- buildtool_cwd "${modindex}"
-
- if [[ ${modulesuffix} = \. ]]; then
- modulesuffix="root"
- fi
-
- if [[ $? != 0 ]]; then
- echo "${BASEDIR}/${MODULE[${modindex}]} no longer exists. Skipping."
- ((modindex=modindex+1))
- continue
- fi
-
- argv=("${@//@@@MODULEFN@@@/${fn}}")
- argv=("${argv[@]//@@@MODULEDIR@@@/${BASEDIR}/${MODULE[${modindex}]}}")
-
- # shellcheck disable=2086,2046
- echo_and_redirect "${PATCH_DIR}/${repostatus}-${testtype}-${fn}.txt" \
- $("${BUILDTOOL}_executor" "${testtype}") \
- ${MODULEEXTRAPARAM[${modindex}]//@@@MODULEFN@@@/${fn}} \
- "${argv[@]}"
- execvalue=$?
-
- reaper_post_exec "${modulesuffix}" "${repostatus}-${testtype}-${fn}"
- ((execvalue = execvalue + $? ))
-
- if [[ ${execvalue} == 0 ]] ; then
- module_status \
- ${modindex} \
- +1 \
- "${repostatus}-${testtype}-${fn}.txt" \
- "${modulesuffix} in ${repo} passed${statusjdk}."
- else
- module_status \
- ${modindex} \
- -1 \
- "${repostatus}-${testtype}-${fn}.txt" \
- "${modulesuffix} in ${repo} failed${statusjdk}."
- ((result = result + 1))
- fi
-
- # compile is special
- if [[ ${testtype} = compile ]]; then
- MODULE_COMPILE_LOG[${modindex}]="${PATCH_DIR}/${repostatus}-${testtype}-${fn}.txt"
- yetus_debug "Compile log set to ${MODULE_COMPILE_LOG[${modindex}]}"
- fi
-
- savestop=$(stop_clock)
- MODULE_STATUS_TIMER[${modindex}]=${savestop}
- # shellcheck disable=SC2086
- echo "Elapsed: $(clock_display ${savestop})"
- popd >/dev/null
- ((modindex=modindex+1))
- done
-
- TIMER=${savestart}
-
- if [[ ${result} -gt 0 ]]; then
- return 1
- fi
- return 0
-}
-
-## @description Reset the queue for tests
-## @audience public
-## @stability evolving
-## @replaceable no
-function clear_personality_queue
-{
- yetus_debug "Personality: clear queue"
- MODCOUNT=0
- MODULE=()
-}
-
-## @description Build the queue for tests
-## @audience public
-## @stability evolving
-## @replaceable no
-## @param module
-## @param profiles/flags/etc
-function personality_enqueue_module
-{
- yetus_debug "Personality: enqueue $*"
- local module=$1
- shift
-
- MODULE[${MODCOUNT}]=${module}
- MODULEEXTRAPARAM[${MODCOUNT}]=${*}
- ((MODCOUNT=MODCOUNT+1))
-}
-
-## @description Remove a module
-## @audience public
-## @stability evolving
-## @replaceable no
-## @param modulenames
-function dequeue_personality_module
-{
- declare modname=$1
- declare oldmodule=("${MODULE[@]}")
- declare oldmodparams=("${MODULEESXTRAPARAM[@]}")
- declare modindex=0
-
- yetus_debug "Personality: dequeue $*"
-
- clear_personality_queue
-
- until [[ ${modindex} -eq ${#oldmodule[@]} ]]; do
- if [[ "${oldmodule[${modindex}]}" = "${modname}" ]]; then
- yetus_debug "Personality: removing ${modindex}, ${oldmodule[${modindex}]} = ${modname}"
- else
- personality_enqueue_module "${oldmodule[${modindex}]}" "${oldmodparams[${modindex}]}"
- fi
- ((modindex=modindex+1))
- done
-}
-
-## @description Utility to push many tests into the failure list
-## @audience private
-## @stability evolving
-## @replaceable no
-## @param testdesc
-## @param testlist
-function populate_test_table
-{
- local reason=$1
- shift
- local first=""
- local i
-
- for i in "$@"; do
- if [[ -z "${first}" ]]; then
- add_test_table "${reason}" "${i}"
- first="${reason}"
- else
- add_test_table " " "${i}"
- fi
- done
-}
-
-## @description Run and verify the output of the appropriate unit tests
-## @audience private
-## @stability evolving
-## @replaceable no
-## @return 0 on success
-## @return 1 on failure
-function check_unittests
-{
- declare i
- declare testsys
- declare test_logfile
- declare result=0
- declare -r savejavahome=${JAVA_HOME}
- declare multijdkmode
- declare jdk=""
- declare jdkindex=0
- declare jdklist
- declare statusjdk
- declare formatresult=0
- declare needlog
-
- if ! verify_needed_test unit; then
- return 0
- fi
-
- big_console_header "Running unit tests"
-
- if verify_multijdk_test unit; then
- multijdkmode=true
- jdklist=${JDK_DIR_LIST}
- else
- multijdkmode=false
- jdklist=${JAVA_HOME}
- fi
-
- for jdkindex in ${jdklist}; do
- if [[ ${multijdkmode} == true ]]; then
- JAVA_HOME=${jdkindex}
- jdk=$(report_jvm_version "${JAVA_HOME}")
- statusjdk="JDK v${jdk} "
- jdk="-jdk${jdk}"
- jdk=${jdk// /}
- fi
-
- personality_modules patch unit
- "${BUILDTOOL}_modules_worker" patch unit
-
- ((result=result+$?))
-
- i=0
- until [[ $i -eq ${#MODULE[@]} ]]; do
- module=${MODULE[${i}]}
- fn=$(module_file_fragment "${module}")
- fn="${fn}${jdk}"
- test_logfile="${PATCH_DIR}/patch-unit-${fn}.txt"
-
- buildtool_cwd "${i}"
-
- needlog=0
- for testsys in ${TESTFORMATS}; do
- if declare -f ${testsys}_process_tests >/dev/null; then
- yetus_debug "Calling ${testsys}_process_tests"
- "${testsys}_process_tests" "${module}" "${test_logfile}" "${fn}"
- formatresult=$?
- ((result=result+formatresult))
- if [[ "${formatresult}" != 0 ]]; then
- needlog=1
- fi
- fi
- done
-
- if [[ ${needlog} == 1 ]]; then
- module_status ${i} -1 "patch-unit-${fn}.txt"
- fi
-
- popd >/dev/null
-
- ((i=i+1))
- done
-
- for testsys in ${TESTFORMATS}; do
- if declare -f ${testsys}_finalize_results >/dev/null; then
- yetus_debug "Calling ${testsys}_finalize_results"
- "${testsys}_finalize_results" "${statusjdk}"
- fi
- done
-
- done
- JAVA_HOME=${savejavahome}
-
- modules_messages patch unit false
-
- if [[ ${JENKINS} == true ]]; then
- add_footer_table "${statusjdk} Test Results" "${BUILD_URL}testReport/"
- fi
-
- if [[ ${result} -gt 0 ]]; then
- return 1
- fi
- return 0
-}
-
-## @description Write comments onto bug systems that have code review support.
-## @description File should be in the form of "file:line:comment"
-## @audience public
-## @stability evolving
-## @replaceable no
-## @param filename
-function bugsystem_linecomments
-{
- declare title=$1
- declare fn=$2
- declare line
- declare bugs
- declare realline
- declare text
- declare idxline
- declare uniline
-
- if [[ ! -f "${GITUNIDIFFLINES}" ]]; then
- return
- fi
-
- while read -r line;do
- file=$(echo "${line}" | cut -f1 -d:)
- realline=$(echo "${line}" | cut -f2 -d:)
- text=$(echo "${line}" | cut -f3- -d:)
- idxline="${file}:${realline}:"
- uniline=$(${GREP} "${idxline}" "${GITUNIDIFFLINES}" | cut -f3 -d: )
-
- for bugs in ${BUGLINECOMMENTS}; do
- if declare -f ${bugs}_linecomments >/dev/null;then
- "${bugs}_linecomments" "${title}" "${file}" "${realline}" "${uniline}" "${text}"
- fi
- done
- done < "${fn}"
-}
-
-## @description Write the final output to the selected bug system
-## @audience private
-## @stability evolving
-## @replaceable no
-function bugsystem_finalreport
-{
- declare version
- declare bugs
-
- if [[ -f "${BINDIR}/../VERSION" ]]; then
- version=$(cat "${BINDIR}/../VERSION")
- elif [[ -f "${BINDIR}/VERSION" ]]; then
- version=$(cat "${BINDIR}/VERSION")
- fi
-
- if [[ "${ROBOT}" = true &&
- -n "${BUILD_URL}" &&
- -n "${BUILD_URL_CONSOLE}" ]]; then
- add_footer_table "Console output" "${BUILD_URL}${BUILD_URL_CONSOLE}"
- fi
- add_footer_table "Powered by" "Apache Yetus ${version} http://yetus.apache.org"
-
- for bugs in ${BUGCOMMENTS}; do
- if declare -f ${bugs}_finalreport >/dev/null;then
- "${bugs}_finalreport" "${@}"
- fi
- done
-}
-
-## @description Clean the filesystem as appropriate and then exit
-## @audience private
-## @stability evolving
-## @replaceable no
-## @param runresult
-function cleanup_and_exit
-{
- local result=$1
-
- if [[ ${ROBOT} == "true" && ${RELOCATE_PATCH_DIR} == "true" && \
- -e ${PATCH_DIR} && -d ${PATCH_DIR} ]] ; then
- # if PATCH_DIR is already inside BASEDIR, then
- # there is no need to move it since we assume that
- # Jenkins or whatever already knows where it is at
- # since it told us to put it there!
- relative_dir "${PATCH_DIR}" >/dev/null
- if [[ $? == 1 ]]; then
- yetus_debug "mv ${PATCH_DIR} ${BASEDIR}"
- mv "${PATCH_DIR}" "${BASEDIR}"
- fi
- fi
- big_console_header "Finished build."
-
- # shellcheck disable=SC2086
- exit ${result}
-}
-
-## @description Driver to execute _tests routines
-## @audience private
-## @stability evolving
-## @replaceable no
-function runtests
-{
- local plugin
-
- if [[ ${RUN_TESTS} == "true" ]] ; then
-
- verify_patchdir_still_exists
- check_unittests
- fi
-
- for plugin in ${TESTTYPES}; do
- verify_patchdir_still_exists
- if declare -f ${plugin}_tests >/dev/null 2>&1; then
- modules_reset
- yetus_debug "Running ${plugin}_tests"
- #shellcheck disable=SC2086
- ${plugin}_tests
- fi
- done
- archive
-}
-
-## @description Calculate the differences between the specified files
-## @description using just the column+ messages (third+ column in a
-## @descriptoin colon delimated flie) and output it to stdout.
-## @audience public
-## @stability evolving
-## @replaceable no
-## @param branchlog
-## @param patchlog
-## @return differences
-function column_calcdiffs
-{
- declare branch=$1
- declare patch=$2
- declare tmp=${PATCH_DIR}/pl.$$.${RANDOM}
- declare j
-
- # first, strip filenames:line:
- # this keeps column: in an attempt to increase
- # accuracy in case of multiple, repeated errors
- # since the column number shouldn't change
- # if the line of code hasn't been touched
- # shellcheck disable=SC2016
- cut -f3- -d: "${branch}" > "${tmp}.branch"
- # shellcheck disable=SC2016
- cut -f3- -d: "${patch}" > "${tmp}.patch"
-
- # compare the errors, generating a string of line
- # numbers. Sorry portability: GNU diff makes this too easy
- ${DIFF} --unchanged-line-format="" \
- --old-line-format="" \
- --new-line-format="%dn " \
- "${tmp}.branch" \
- "${tmp}.patch" > "${tmp}.lined"
-
- # now, pull out those lines of the raw output
- # shellcheck disable=SC2013
- for j in $(cat "${tmp}.lined"); do
- # shellcheck disable=SC2086
- head -${j} "${patch}" | tail -1
- done
-
- rm "${tmp}.branch" "${tmp}.patch" "${tmp}.lined" 2>/dev/null
-}
-
-## @description Calculate the differences between the specified files
-## @description using just the error messages (last column in a
-## @descriptoin colon delimated flie) and output it to stdout.
-## @audience public
-## @stability evolving
-## @replaceable no
-## @param branchlog
-## @param patchlog
-## @return differences
-function error_calcdiffs
-{
- declare branch=$1
- declare patch=$2
- declare tmp=${PATCH_DIR}/pl.$$.${RANDOM}
- declare j
-
- # first, pull out just the errors
- # shellcheck disable=SC2016
- ${AWK} -F: '{print $NF}' "${branch}" > "${tmp}.branch"
-
- # shellcheck disable=SC2016
- ${AWK} -F: '{print $NF}' "${patch}" > "${tmp}.patch"
-
- # compare the errors, generating a string of line
- # numbers. Sorry portability: GNU diff makes this too easy
- ${DIFF} --unchanged-line-format="" \
- --old-line-format="" \
- --new-line-format="%dn " \
- "${tmp}.branch" \
- "${tmp}.patch" > "${tmp}.lined"
-
- # now, pull out those lines of the raw output
- # shellcheck disable=SC2013
- for j in $(cat "${tmp}.lined"); do
- # shellcheck disable=SC2086
- head -${j} "${patch}" | tail -1
- done
-
- rm "${tmp}.branch" "${tmp}.patch" "${tmp}.lined" 2>/dev/null
-}
-
-## @description Wrapper to call specific version of calcdiffs if available
-## @description otherwise calls error_calcdiffs
-## @audience public
-## @stability evolving
-## @replaceable no
-## @param branchlog
-## @param patchlog
-## @param testtype
-## @return differences
-function calcdiffs
-{
- declare branchlog=$1
- declare patchlog=$2
- declare testtype=$3
-
- # ensure that both log files exist
- if [[ ! -f "${branchlog}" ]]; then
- touch "${branchlog}"
- fi
- if [[ ! -f "${patchlog}" ]]; then
- touch "${patchlog}"
- fi
-
- if declare -f ${PROJECT_NAME}_${testtype}_calcdiffs >/dev/null; then
- "${PROJECT_NAME}_${testtype}_calcdiffs" "${branchlog}" "${patchlog}"
- elif declare -f ${BUILDTOOL}_${testtype}_calcdiffs >/dev/null; then
- "${BUILDTOOL}_${testtype}_calcdiffs" "${branchlog}" "${patchlog}"
- elif declare -f ${testtype}_calcdiffs >/dev/null; then
- "${testtype}_calcdiffs" "${branchlog}" "${patchlog}"
- else
- error_calcdiffs "${branchlog}" "${patchlog}"
- fi
-}
-
-## @description generate a standarized calcdiff status message
-## @audience public
-## @stability evolving
-## @replaceable no
-## @param totalbranchissues
-## @param totalpatchissues
-## @param newpatchissues
-## @return errorstring
-function generic_calcdiff_status
-{
- declare -i numbranch=$1
- declare -i numpatch=$2
- declare -i addpatch=$3
- declare -i samepatch
- declare -i fixedpatch
-
- ((samepatch=numpatch-addpatch))
- ((fixedpatch=numbranch-numpatch+addpatch))
-
- if [[ "${BUILDMODE}" = full ]]; then
- printf "has %i issues." "${addpatch}"
- else
- printf "generated %i new + %i unchanged - %i fixed = %i total (was %i)" \
- "${addpatch}" \
- "${samepatch}" \
- "${fixedpatch}" \
- "${numpatch}" \
- "${numbranch}"
- fi
-}
-
-## @description Helper routine for plugins to ask projects, etc
-## @description to count problems in a log file
-## @description and output it to stdout.
-## @audience public
-## @stability evolving
-## @replaceable no
-## @return number of issues
-function generic_logfilter
-{
- declare testtype=$1
- declare input=$2
- declare output=$3
-
- if declare -f ${PROJECT_NAME}_${testtype}_logfilter >/dev/null; then
- "${PROJECT_NAME}_${testtype}_logfilter" "${input}" "${output}"
- elif declare -f ${BUILDTOOL}_${testtype}_logfilter >/dev/null; then
- "${BUILDTOOL}_${testtype}_logfilter" "${input}" "${output}"
- elif declare -f ${testtype}_logfilter >/dev/null; then
- "${testtype}_logfilter" "${input}" "${output}"
- else
- yetus_error "ERROR: ${testtype}: No function defined to filter problems."
- echo 0
- fi
-}
-
-## @description Helper routine for plugins to do a pre-patch prun
-## @audience public
-## @stability evolving
-## @replaceable no
-## @param testype
-## @param multijdk
-## @return 1 on failure
-## @return 0 on success
-function generic_pre_handler
-{
- declare testtype=$1
- declare multijdkmode=$2
- declare result=0
- declare -r savejavahome=${JAVA_HOME}
- declare multijdkmode
- declare jdkindex=0
- declare jdklist
-
- if ! verify_needed_test "${testtype}"; then
- return 0
- fi
-
- big_console_header "Pre-patch ${testtype} verification on ${PATCH_BRANCH}"
-
- if verify_multijdk_test "${testtype}"; then
- multijdkmode=true
- jdklist=${JDK_DIR_LIST}
- else
- multijdkmode=false
- jdklist=${JAVA_HOME}
- fi
-
- for jdkindex in ${jdklist}; do
- if [[ ${multijdkmode} == true ]]; then
- JAVA_HOME=${jdkindex}
- fi
-
- personality_modules branch "${testtype}"
- "${BUILDTOOL}_modules_worker" branch "${testtype}"
-
- ((result=result + $?))
- modules_messages branch "${testtype}" true
-
- done
- JAVA_HOME=${savejavahome}
-
- if [[ ${result} -gt 0 ]]; then
- return 1
- fi
- return 0
-}
-
-## @description Generic post-patch log handler
-## @audience public
-## @stability evolving
-## @replaceable no
-## @return 0 on success
-## @return 1 on failure
-## @param origlog
-## @param testtype
-## @param multijdkmode
-function generic_postlog_compare
-{
- declare origlog=$1
- declare testtype=$2
- declare multijdk=$3
- declare result=0
- declare i
- declare fn
- declare jdk
- declare statusjdk
- declare -i numbranch=0
- declare -i numpatch=0
- declare -i addpatch=0
- declare -i samepatch=0
- declare -i fixedpatch=0
- declare summarize=true
-
- if [[ ${multijdk} == true ]]; then
- jdk=$(report_jvm_version "${JAVA_HOME}")
- statusjdk=" with JDK v${jdk}"
- jdk="-jdk${jdk}"
- jdk=${jdk// /}
- fi
-
- i=0
- until [[ ${i} -eq ${#MODULE[@]} ]]; do
- if [[ ${MODULE_STATUS[${i}]} == -1 ]]; then
- ((result=result+1))
- ((i=i+1))
- continue
- fi
-
- fn=$(module_file_fragment "${MODULE[${i}]}")
- fn="${fn}${jdk}"
- module_suffix=$(basename "${MODULE[${i}]}")
- if [[ ${module_suffix} == \. ]]; then
- module_suffix=root
- fi
-
- yetus_debug "${testtype}: branch-${origlog}-${fn}.txt vs. patch-${origlog}-${fn}.txt"
-
- # if it was a new module, this won't exist.
- if [[ ! -f "${PATCH_DIR}/branch-${origlog}-${fn}.txt" ]]; then
- touch "${PATCH_DIR}/branch-${origlog}-${fn}.txt"
- fi
-
- if [[ ! -f "${PATCH_DIR}/patch-${origlog}-${fn}.txt" ]]; then
- touch "${PATCH_DIR}/patch-${origlog}-${fn}.txt"
- fi
-
- generic_logfilter "${testtype}" "${PATCH_DIR}/branch-${origlog}-${fn}.txt" "${PATCH_DIR}/branch-${origlog}-${testtype}-${fn}.txt"
- generic_logfilter "${testtype}" "${PATCH_DIR}/patch-${origlog}-${fn}.txt" "${PATCH_DIR}/patch-${origlog}-${testtype}-${fn}.txt"
-
- # shellcheck disable=SC2016
- numbranch=$(wc -l "${PATCH_DIR}/branch-${origlog}-${testtype}-${fn}.txt" | ${AWK} '{print $1}')
- # shellcheck disable=SC2016
- numpatch=$(wc -l "${PATCH_DIR}/patch-${origlog}-${testtype}-${fn}.txt" | ${AWK} '{print $1}')
-
- calcdiffs \
- "${PATCH_DIR}/branch-${origlog}-${testtype}-${fn}.txt" \
- "${PATCH_DIR}/patch-${origlog}-${testtype}-${fn}.txt" \
- "${testtype}" \
- > "${PATCH_DIR}/diff-${origlog}-${testtype}-${fn}.txt"
-
- # shellcheck disable=SC2016
- addpatch=$(wc -l "${PATCH_DIR}/diff-${origlog}-${testtype}-${fn}.txt" | ${AWK} '{print $1}')
-
- ((fixedpatch=numbranch-numpatch+addpatch))
-
- statstring=$(generic_calcdiff_status "${numbranch}" "${numpatch}" "${addpatch}" )
-
- if [[ ${addpatch} -gt 0 ]]; then
- ((result = result + 1))
- module_status "${i}" -1 "diff-${origlog}-${testtype}-${fn}.txt" "${fn}${statusjdk} ${statstring}"
- elif [[ ${fixedpatch} -gt 0 ]]; then
- module_status "${i}" +1 "${MODULE_STATUS_LOG[${i}]}" "${fn}${statusjdk} ${statstring}"
- summarize=false
- fi
- ((i=i+1))
- done
-
- modules_messages patch "${testtype}" "${summarize}"
- if [[ ${result} -gt 0 ]]; then
- return 1
- fi
- return 0
-}
-
-## @description Generic post-patch handler
-## @audience public
-## @stability evolving
-## @replaceable no
-## @return 0 on success
-## @return 1 on failure
-## @param origlog
-## @param testtype
-## @param multijdkmode
-## @param run commands
-function generic_post_handler
-{
- declare origlog=$1
- declare testtype=$2
- declare multijdkmode=$3
- declare need2run=$4
- declare i
- declare result=0
- declare fn
- declare -r savejavahome=${JAVA_HOME}
- declare jdk=""
- declare jdkindex=0
- declare statusjdk
- declare -i numbranch=0
- declare -i numpatch=0
-
- if ! verify_needed_test "${testtype}"; then
- yetus_debug "${testtype} not needed"
- return 0
- fi
-
- big_console_header "${testtype} verification: ${BUILDMODE}"
-
- for jdkindex in ${JDK_DIR_LIST}; do
- if [[ ${multijdkmode} == true ]]; then
- JAVA_HOME=${jdkindex}
- yetus_debug "Using ${JAVA_HOME} to run this set of tests"
- fi
-
- if [[ ${need2run} = true ]]; then
- personality_modules "${codebase}" "${testtype}"
- "${BUILDTOOL}_modules_worker" "${codebase}" "${testtype}"
-
- if [[ ${UNSUPPORTED_TEST} = true ]]; then
- return 0
- fi
- fi
-
- generic_postlog_compare "${origlog}" "${testtype}" "${multijdkmode}"
- ((result=result+$?))
- done
- JAVA_HOME=${savejavahome}
-
- if [[ ${result} -gt 0 ]]; then
- return 1
- fi
- return 0
-}
-
-## @description Execute the compile phase. This will callout
-## @description to _compile
-## @audience public
-## @stability evolving
-## @replaceable no
-## @param branch|patch
-## @return 0 on success
-## @return 1 on failure
-function compile_jvm
-{
- declare codebase=$1
- declare result=0
- declare -r savejavahome=${JAVA_HOME}
- declare multijdkmode
- declare jdkindex=0
- declare jdklist
-
- if verify_multijdk_test compile; then
- multijdkmode=true
- jdklist=${JDK_DIR_LIST}
- else
- multijdkmode=false
- jdklist=${JAVA_HOME}
- fi
-
- for jdkindex in ${jdklist}; do
- if [[ ${multijdkmode} == true ]]; then
- JAVA_HOME=${jdkindex}
- fi
-
- compile_nonjvm "${codebase}" "${multijdkmode}"
-
- done
- JAVA_HOME=${savejavahome}
-
- if [[ ${result} -gt 0 ]]; then
- return 1
- fi
- return 0
-}
-
-## @description Execute the compile phase. This will callout
-## @description to _compile
-## @audience public
-## @stability evolving
-## @replaceable no
-## @param branch|patch
-## @return 0 on success
-## @return 1 on failure
-function compile_nonjvm
-{
- declare codebase=$1
- declare result=0
- declare -r savejavahome=${JAVA_HOME}
- declare multijdkmode=${2:-false}
- declare jdkindex=0
-
- personality_modules "${codebase}" compile
- "${BUILDTOOL}_modules_worker" "${codebase}" compile
- modules_messages "${codebase}" compile true
-
- modules_backup
-
- for plugin in ${TESTTYPES}; do
- modules_restore
- verify_patchdir_still_exists
- if declare -f ${plugin}_compile >/dev/null 2>&1; then
- yetus_debug "Running ${plugin}_compile ${codebase} ${multijdkmode}"
- "${plugin}_compile" "${codebase}" "${multijdkmode}"
- ((result = result + $?))
- archive
- fi
- done
-
- if [[ ${result} -gt 0 ]]; then
- return 1
- fi
- return 0
-}
-
-## @description Execute the compile phase. This will callout
-## @description to _compile
-## @audience public
-## @stability evolving
-## @replaceable no
-## @param branch|patch
-## @return 0 on success
-## @return 1 on failure
-function compile
-{
- declare codebase=$1
-
- if ! verify_needed_test compile; then
- return 0
- fi
-
- if [[ ${codebase} = "branch" ]]; then
- big_console_header "${PATCH_BRANCH} compilation: pre-patch"
- else
- big_console_header "${PATCH_BRANCH} compilation: ${BUILDMODE}"
- fi
-
- yetus_debug "Is JVM Required? ${JVM_REQUIRED}"
- if [[ "${JVM_REQUIRED}" = true ]]; then
- compile_jvm "${codebase}"
- else
- compile_nonjvm "${codebase}"
- fi
-}
-
-## @description Execute the static analysis test cycle.
-## @description This will callout to _precompile, compile, _postcompile and _rebuild
-## @audience public
-## @stability evolving
-## @replaceable no
-## @param branch|patch
-## @return 0 on success
-## @return 1 on failure
-function compile_cycle
-{
- declare codebase=$1
- declare result=0
- declare plugin
-
- find_changed_modules "${codebase}"
-
- for plugin in ${PROJECT_NAME} ${BUILDTOOL} ${TESTTYPES} ${TESTFORMATS}; do
- if declare -f ${plugin}_precompile >/dev/null 2>&1; then
- yetus_debug "Running ${plugin}_precompile"
- #shellcheck disable=SC2086
- ${plugin}_precompile ${codebase}
- if [[ $? -gt 0 ]]; then
- ((result = result+1))
- fi
- archive
- fi
- done
-
- compile "${codebase}"
-
- for plugin in ${PROJECT_NAME} ${BUILDTOOL} ${TESTTYPES} ${TESTFORMATS}; do
- if declare -f ${plugin}_postcompile >/dev/null 2>&1; then
- yetus_debug "Running ${plugin}_postcompile"
- #shellcheck disable=SC2086
- ${plugin}_postcompile ${codebase}
- if [[ $? -gt 0 ]]; then
- ((result = result+1))
- fi
- archive
- fi
- done
-
- for plugin in ${PROJECT_NAME} ${BUILDTOOL} ${TESTTYPES} ${TESTFORMATS}; do
- if declare -f ${plugin}_rebuild >/dev/null 2>&1; then
- yetus_debug "Running ${plugin}_rebuild"
- #shellcheck disable=SC2086
- ${plugin}_rebuild ${codebase}
- if [[ $? -gt 0 ]]; then
- ((result = result+1))
- fi
- archive
- fi
- done
-
- if [[ ${result} -gt 0 ]]; then
- return 1
- fi
- return 0
-}
-
-## @description Execute the patch file test phase. Calls out to
-## @description to _patchfile
-## @audience public
-## @stability evolving
-## @replaceable no
-## @param branch|patch
-## @return 0 on success
-## @return 1 on failure
-function patchfiletests
-{
- declare plugin
- declare result=0
-
- for plugin in ${BUILDTOOL} ${TESTTYPES} ${TESTFORMATS}; do
- if declare -f ${plugin}_patchfile >/dev/null 2>&1; then
- yetus_debug "Running ${plugin}_patchfile"
- #shellcheck disable=SC2086
- ${plugin}_patchfile "${PATCH_DIR}/patch"
- if [[ $? -gt 0 ]]; then
- ((result = result+1))
- fi
- archive
- fi
- done
-
- if [[ ${result} -gt 0 ]]; then
- return 1
- fi
- return 0
-}
-
-
-## @description Wipe the repo clean to not invalidate tests
-## @audience public
-## @stability evolving
-## @replaceable no
-## @return 0 on success
-## @return 1 on failure
-function distclean
-{
- declare result=0
- declare plugin
-
- big_console_header "Cleaning the source tree"
-
- for plugin in ${TESTTYPES} ${TESTFORMATS}; do
- if declare -f ${plugin}_clean >/dev/null 2>&1; then
- yetus_debug "Running ${plugin}_distclean"
- #shellcheck disable=SC2086
- ${plugin}_clean
- if [[ $? -gt 0 ]]; then
- ((result = result+1))
- fi
<TRUNCATED>