112372530SSteve Rowe#!/usr/bin/env bash 212372530SSteve Rowe# Licensed to the Apache Software Foundation (ASF) under one or more 312372530SSteve Rowe# contributor license agreements. See the NOTICE file distributed with 412372530SSteve Rowe# this work for additional information regarding copyright ownership. 512372530SSteve Rowe# The ASF licenses this file to You under the Apache License, Version 2.0 612372530SSteve Rowe# (the "License"); you may not use this file except in compliance with 712372530SSteve Rowe# the License. You may obtain a copy of the License at 812372530SSteve Rowe# 912372530SSteve Rowe# http://www.apache.org/licenses/LICENSE-2.0 1012372530SSteve Rowe# 1112372530SSteve Rowe# Unless required by applicable law or agreed to in writing, software 1212372530SSteve Rowe# distributed under the License is distributed on an "AS IS" BASIS, 1312372530SSteve Rowe# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1412372530SSteve Rowe# See the License for the specific language governing permissions and 1512372530SSteve Rowe# limitations under the License. 1612372530SSteve Rowe 1712372530SSteve Rowe# This is a Yetus precommit "personality" (aka customized configuration) for Lucene/Solr. 1812372530SSteve Rowe# 1912372530SSteve Rowe# See the Yetus precommit documentation at https://yetus.apache.org/documentation/0.7.0/ 2012372530SSteve Rowe# and especially https://yetus.apache.org/documentation/0.7.0/precommit-advanced/. 2112372530SSteve Rowe# See also the Yetus source code for other projects' personality examples at 2212372530SSteve Rowe# https://git-wip-us.apache.org/repos/asf?p=yetus.git;f=precommit/personality;a=tree;hb=HEAD 2312372530SSteve Rowe# 2412372530SSteve Rowe# To add a new validation method (aka "plugin"): 2512372530SSteve Rowe# 1) Add its name to the PLUGIN_LIST below 2612372530SSteve Rowe# 2) Invoke "add_test_type" with it below 2712372530SSteve Rowe# 3) Add a "<plugin>_filefilter" function to decide whether the plugin needs to be run based on changed files 2812372530SSteve Rowe# 4) Add a "<plugin>_rebuild" function to call out to ant to perform the validation method. 2912372530SSteve Rowe# See examples of the above-described function types ^^ below. 3012372530SSteve Rowe 31ac9559d7SSteve Rowe# Both compile+javac plugins are required, as well as unit+junit: in both cases, neither work individually 32ac9559d7SSteve RowePLUGIN_LIST="ant,jira,compile,javac,unit,junit,test4tests" 33cc1ad49eSSteve RowePLUGIN_LIST+=",testoutput,checkluceneversion,ratsources,checkforbiddenapis,checklicenses" 34cc1ad49eSSteve RowePLUGIN_LIST+=",validatesourcepatterns,validaterefguide" 3512372530SSteve Rowepersonality_plugins "${PLUGIN_LIST}" 3612372530SSteve Rowe 3712372530SSteve Roweadd_test_type "checkluceneversion" 3812372530SSteve Roweadd_test_type "ratsources" 3912372530SSteve Roweadd_test_type "checkforbiddenapis" 4012372530SSteve Roweadd_test_type "checklicenses" 4112372530SSteve Roweadd_test_type "validatesourcepatterns" 4212372530SSteve Roweadd_test_type "validaterefguide" 4312372530SSteve Rowe 4412372530SSteve Roweadd_test_format "testoutput" 4512372530SSteve Rowe 4612372530SSteve Rowe## @description Globals specific to this personality 4712372530SSteve Rowe## @audience private 4812372530SSteve Rowe## @stability evolving 4912372530SSteve Rowefunction personality_globals 5012372530SSteve Rowe{ 5112372530SSteve Rowe #shellcheck disable=SC2034 5212372530SSteve Rowe PATCH_BRANCH_DEFAULT=master 5312372530SSteve Rowe #shellcheck disable=SC2034 5412372530SSteve Rowe JIRA_ISSUE_RE='^(LUCENE|SOLR)-[0-9]+$' 5512372530SSteve Rowe #shellcheck disable=SC2034 5612372530SSteve Rowe JIRA_STATUS_RE='Patch Available' 5712372530SSteve Rowe #shellcheck disable=SC2034 5812372530SSteve Rowe GITHUB_REPO="apache/lucene-solr" 5912372530SSteve Rowe #shellcheck disable=SC2034 6012372530SSteve Rowe BUILDTOOL=ant 6112372530SSteve Rowe} 6212372530SSteve Rowe 6312372530SSteve Rowe## @description Queue up modules for this personality 6412372530SSteve Rowe## @audience private 6512372530SSteve Rowe## @stability evolving 6612372530SSteve Rowe## @param repostatus 6712372530SSteve Rowe## @param testtype 6812372530SSteve Rowefunction personality_modules 6912372530SSteve Rowe{ 7012372530SSteve Rowe local repostatus=$1 7112372530SSteve Rowe local testtype=$2 7212372530SSteve Rowe 7312372530SSteve Rowe local module 7412372530SSteve Rowe local extra 7512372530SSteve Rowe 7612372530SSteve Rowe local moduleType="submodules" 7712372530SSteve Rowe 7812372530SSteve Rowe yetus_debug "Personality (lucene-solr): ${repostatus} ${testtype}" 7912372530SSteve Rowe 8012372530SSteve Rowe clear_personality_queue 8112372530SSteve Rowe 8212372530SSteve Rowe case ${testtype} in 8312372530SSteve Rowe clean|distclean|validatesourcepatterns) 8412372530SSteve Rowe moduleType="top" 8512372530SSteve Rowe ;; 8612372530SSteve Rowe checkluceneversion) 8712372530SSteve Rowe moduleType="solr" 8812372530SSteve Rowe ;; 8912372530SSteve Rowe ratsources) 9012372530SSteve Rowe moduleType="submodules" 9112372530SSteve Rowe ;; 9212372530SSteve Rowe checkforbiddenapis) 9312372530SSteve Rowe moduleType="both" 9412372530SSteve Rowe ;; 9512372530SSteve Rowe checklicenses) 9612372530SSteve Rowe moduleType="mains" 9712372530SSteve Rowe ;; 9812372530SSteve Rowe validaterefguide) 9912372530SSteve Rowe moduleType="solr-ref-guide" 10012372530SSteve Rowe ;; 10112372530SSteve Rowe compile) 10212372530SSteve Rowe moduleType="submodules" 10312372530SSteve Rowe extra="compile-test" 10412372530SSteve Rowe ;; 10512372530SSteve Rowe junit|unit) 10612372530SSteve Rowe moduleType="submodules" 10712372530SSteve Rowe extra="test" 10812372530SSteve Rowe ;; 10912372530SSteve Rowe *) 11012372530SSteve Rowe ;; 11112372530SSteve Rowe esac 11212372530SSteve Rowe 11312372530SSteve Rowe case ${moduleType} in 11412372530SSteve Rowe submodules) 11512372530SSteve Rowe for module in "${CHANGED_MODULES[@]}"; do 116298063eeSSteve Rowe if [[ ! "${module}" =~ ^lucene/(licenses|site) ]]; then # blacklist lucene/ dirs that aren't modules 117298063eeSSteve Rowe if [[ "${module}" =~ ^(lucene/(analysis/[^/]+|[^/]+)) ]]; then 118298063eeSSteve Rowe local lucene_module=${BASH_REMATCH[0]} 119298063eeSSteve Rowe personality_enqueue_module "${lucene_module}" "${extra}" 120298063eeSSteve Rowe elif [[ "${module}" =~ ^solr/(core|solrj|test-framework|solr-ref-guide|contrib/[^.]+) ]]; then # whitelist solr/ modules 121298063eeSSteve Rowe local solr_module=${BASH_REMATCH[0]} 122298063eeSSteve Rowe # In solr-ref-guide module, do not execute "compile" or "unit" plugins 123298063eeSSteve Rowe if [[ ! "${solr_module}" == solr/solr-ref-guide || ! ${testtype} =~ ^(compile|unit)$ ]]; then 124298063eeSSteve Rowe personality_enqueue_module "${solr_module}" "${extra}" 125298063eeSSteve Rowe fi 12612372530SSteve Rowe fi 12712372530SSteve Rowe fi 12812372530SSteve Rowe done 12912372530SSteve Rowe ;; 13012372530SSteve Rowe lucene|solr) 131298063eeSSteve Rowe personality_enqueue_module "${moduleType}" "${extra}" 13212372530SSteve Rowe ;; 13312372530SSteve Rowe top) 134298063eeSSteve Rowe personality_enqueue_module . "${extra}" 13512372530SSteve Rowe ;; 13612372530SSteve Rowe mains) 137298063eeSSteve Rowe personality_enqueue_module "lucene" "${extra}" 138298063eeSSteve Rowe personality_enqueue_module "solr" "${extra}" 13912372530SSteve Rowe ;; 14012372530SSteve Rowe both) # solr, lucene, or both 14112372530SSteve Rowe # personality_enqueue_module KEEPS duplicates, so de-dupe first 14212372530SSteve Rowe local doSolr=0,doLucene=0 14312372530SSteve Rowe for module in "${CHANGED_MODULES[@]}"; do 144298063eeSSteve Rowe if [[ "${module}" =~ ^solr/ ]]; then doSolr=1; fi 145298063eeSSteve Rowe if [[ "${module}" =~ ^lucene/ ]]; then doLucene=1; fi 14612372530SSteve Rowe done 147298063eeSSteve Rowe if [[ ${doLucene} == 1 ]]; then 148298063eeSSteve Rowe if [[ ${doSolr} == 1 ]]; then 149298063eeSSteve Rowe personality_enqueue_module . "${extra}" 15012372530SSteve Rowe else 151298063eeSSteve Rowe personality_enqueue_module "lucene" "${extra}" 15212372530SSteve Rowe fi 153298063eeSSteve Rowe elif [[ ${doSolr} == 1 ]]; then 154298063eeSSteve Rowe personality_enqueue_module "solr" "${extra}" 15512372530SSteve Rowe fi 15612372530SSteve Rowe ;; 15712372530SSteve Rowe solr-ref-guide) 15812372530SSteve Rowe for module in "${CHANGED_MODULES[@]}"; do 159298063eeSSteve Rowe if [[ "${module}" =~ ^solr/solr-ref-guide ]]; then 160298063eeSSteve Rowe personality_enqueue_module "solr/solr-ref-guide" "${extra}" 16112372530SSteve Rowe fi 16212372530SSteve Rowe done 16312372530SSteve Rowe ;; 16412372530SSteve Rowe *) 16512372530SSteve Rowe ;; 16612372530SSteve Rowe esac 16712372530SSteve Rowe} 16812372530SSteve Rowe 16912372530SSteve Rowe## @description Add tests based upon personality needs 17012372530SSteve Rowe## @audience private 17112372530SSteve Rowe## @stability evolving 17212372530SSteve Rowe## @param filename 17312372530SSteve Rowefunction personality_file_tests 17412372530SSteve Rowe{ 17512372530SSteve Rowe declare filename=$1 17612372530SSteve Rowe 17712372530SSteve Rowe yetus_debug "Using Lucene/Solr-specific personality_file_tests" 17812372530SSteve Rowe 179298063eeSSteve Rowe if [[ ! ${filename} =~ solr-ref-guide ]]; then 18012372530SSteve Rowe if [[ ${filename} =~ build\.xml$ || ${filename} =~ /src/(java|resources|test|test-files|tools) ]]; then 18112372530SSteve Rowe yetus_debug "tests/unit: ${filename}" 18212372530SSteve Rowe add_test compile 18312372530SSteve Rowe add_test javac 18412372530SSteve Rowe add_test unit 18512372530SSteve Rowe fi 186298063eeSSteve Rowe fi 18712372530SSteve Rowe} 18812372530SSteve Rowe 18912372530SSteve Rowe## @description hook to reroute junit folder to search test results based on the module 19012372530SSteve Rowe## @audience private 19112372530SSteve Rowe## @stability evolving 19212372530SSteve Rowe## @param module 19312372530SSteve Rowe## @param buildlogfile 19412372530SSteve Rowefunction testoutput_process_tests 19512372530SSteve Rowe{ 19612372530SSteve Rowe # shellcheck disable=SC2034 19712372530SSteve Rowe declare module=$1 19812372530SSteve Rowe declare buildlogfile=$2 19912372530SSteve Rowe if [[ "${module}" =~ ^lucene/analysis/ ]]; then 20012372530SSteve Rowe JUNIT_TEST_OUTPUT_DIR="../../build/${module#*/}" 201*51a6bec4SSteve Rowe elif [[ "${module}" =~ ^lucene/ ]]; then 202*51a6bec4SSteve Rowe JUNIT_TEST_OUTPUT_DIR="../build/${module#*/}" 20312372530SSteve Rowe elif [[ "${module}" =~ ^solr/contrib/extraction ]]; then 20412372530SSteve Rowe JUNIT_TEST_OUTPUT_DIR="../../build/contrib/solr-cell" 20512372530SSteve Rowe elif [[ "${module}" =~ ^solr/contrib/(.*) ]]; then 20612372530SSteve Rowe JUNIT_TEST_OUTPUT_DIR="../../build/contrib/solr-${BASH_REMATCH[1]}" 207*51a6bec4SSteve Rowe elif [[ "${module}" =~ ^solr/(.*) ]]; then 208*51a6bec4SSteve Rowe JUNIT_TEST_OUTPUT_DIR="../build/solr-${BASH_REMATCH[1]}" 20912372530SSteve Rowe fi 21012372530SSteve Rowe yetus_debug "Rerouting build dir for junit to ${JUNIT_TEST_OUTPUT_DIR}" 21112372530SSteve Rowe} 21212372530SSteve Rowe 21312372530SSteve Rowe## @description checkluceneversion file filter 21412372530SSteve Rowe## @audience private 21512372530SSteve Rowe## @stability evolving 21612372530SSteve Rowe## @param filename 21712372530SSteve Rowefunction checkluceneversion_filefilter 21812372530SSteve Rowe{ 21912372530SSteve Rowe local filename=$1 22012372530SSteve Rowe if [[ ${filename} =~ ^solr/(example|server/solr/configsets) ]]; then 22112372530SSteve Rowe yetus_debug "tests/checkluceneversion: ${filename}" 22212372530SSteve Rowe add_test checkluceneversion 22312372530SSteve Rowe fi 22412372530SSteve Rowe} 22512372530SSteve Rowe 22612372530SSteve Rowe## @description checkluceneversion test 22712372530SSteve Rowe## @audience private 22812372530SSteve Rowe## @stability evolving 22912372530SSteve Rowe## @param repostatus 23012372530SSteve Rowefunction checkluceneversion_rebuild 23112372530SSteve Rowe{ 23212372530SSteve Rowe local repostatus=$1 23312372530SSteve Rowe lucene_ant_command ${repostatus} "checkluceneversion" "check-example-lucene-match-version" "Check configsets' lucene version" 23412372530SSteve Rowe} 23512372530SSteve Rowe 23612372530SSteve Rowe## @description ratsources file filter 23712372530SSteve Rowe## @audience private 23812372530SSteve Rowe## @stability evolving 23912372530SSteve Rowe## @param filename 24012372530SSteve Rowefunction ratsources_filefilter 24112372530SSteve Rowe{ 24212372530SSteve Rowe local filename=$1 24312372530SSteve Rowe if [[ ${filename} =~ /src/|\.xml$ ]] ; then 24412372530SSteve Rowe yetus_debug "tests/ratsources: ${filename}" 24512372530SSteve Rowe add_test ratsources 24612372530SSteve Rowe fi 24712372530SSteve Rowe} 24812372530SSteve Rowe 24912372530SSteve Rowe## @description ratsources test 25012372530SSteve Rowe## @audience private 25112372530SSteve Rowe## @stability evolving 25212372530SSteve Rowe## @param repostatus 25312372530SSteve Rowefunction ratsources_rebuild 25412372530SSteve Rowe{ 25512372530SSteve Rowe local repostatus=$1 25612372530SSteve Rowe lucene_ant_command ${repostatus} "ratsources" "rat-sources" "Release audit (RAT)" 25712372530SSteve Rowe} 25812372530SSteve Rowe 25912372530SSteve Rowe## @description checkforbiddenapis file filter 26012372530SSteve Rowe## @audience private 26112372530SSteve Rowe## @stability evolving 26212372530SSteve Rowe## @param filename 26312372530SSteve Rowefunction checkforbiddenapis_filefilter 26412372530SSteve Rowe{ 26512372530SSteve Rowe local filename=$1 26612372530SSteve Rowe if [[ ${filename} =~ \.java$ ]] ; then 26712372530SSteve Rowe yetus_debug "tests/checkforbiddenapis: ${filename}" 26812372530SSteve Rowe add_test checkforbiddenapis 26912372530SSteve Rowe fi 27012372530SSteve Rowe} 27112372530SSteve Rowe 27212372530SSteve Rowe## @description checkforbiddenapis test 27312372530SSteve Rowe## @audience private 27412372530SSteve Rowe## @stability evolving 27512372530SSteve Rowe## @param repostatus 27612372530SSteve Rowefunction checkforbiddenapis_rebuild 27712372530SSteve Rowe{ 27812372530SSteve Rowe local repostatus=$1 27912372530SSteve Rowe lucene_ant_command ${repostatus} "checkforbiddenapis" "check-forbidden-apis" "Check forbidden APIs" 28012372530SSteve Rowe} 28112372530SSteve Rowe 28212372530SSteve Rowe## @description checklicenses file filter 28312372530SSteve Rowe## @audience private 28412372530SSteve Rowe## @stability evolving 28512372530SSteve Rowe## @param filename 28612372530SSteve Rowefunction checklicenses_filefilter 28712372530SSteve Rowe{ 28812372530SSteve Rowe local filename=$1 28912372530SSteve Rowe if [[ ${filename} =~ (lucene|solr)/licenses/|lucene/ivy-versions.properties$ ]]; then 29012372530SSteve Rowe yetus_debug "tests/checklicenses: ${filename}" 29112372530SSteve Rowe add_test checklicenses 29212372530SSteve Rowe fi 29312372530SSteve Rowe} 29412372530SSteve Rowe 29512372530SSteve Rowe## @description checklicenses test 29612372530SSteve Rowe## @audience private 29712372530SSteve Rowe## @stability evolving 29812372530SSteve Rowe## @param repostatus 29912372530SSteve Rowefunction checklicenses_rebuild 30012372530SSteve Rowe{ 30112372530SSteve Rowe local repostatus=$1 30212372530SSteve Rowe lucene_ant_command ${repostatus} "checklicenses" "check-licenses" "Check licenses" 30312372530SSteve Rowe} 30412372530SSteve Rowe 30512372530SSteve Rowe## @description validaterefguide file filter 30612372530SSteve Rowe## @audience private 30712372530SSteve Rowe## @stability evolving 30812372530SSteve Rowe## @param filename 30912372530SSteve Rowefunction validaterefguide_filefilter 31012372530SSteve Rowe{ 31112372530SSteve Rowe local filename=$1 31212372530SSteve Rowe if [[ ${filename} =~ solr/solr-ref-guide ]]; then 31312372530SSteve Rowe yetus_debug "tests/validaterefguide: ${filename}" 31412372530SSteve Rowe add_test validaterefguide 31512372530SSteve Rowe fi 31612372530SSteve Rowe} 31712372530SSteve Rowe 31812372530SSteve Rowe## @description validaterefguide test 31912372530SSteve Rowe## @audience private 32012372530SSteve Rowe## @stability evolving 32112372530SSteve Rowe## @param repostatus 32212372530SSteve Rowefunction validaterefguide_rebuild 32312372530SSteve Rowe{ 32412372530SSteve Rowe local repostatus=$1 32512372530SSteve Rowe lucene_ant_command ${repostatus} "validaterefguide" "bare-bones-html-validation" "Validate ref guide" 32612372530SSteve Rowe} 32712372530SSteve Rowe 32812372530SSteve Rowe## @description validatesourcepatterns file filter 32912372530SSteve Rowe## @audience private 33012372530SSteve Rowe## @stability evolving 33112372530SSteve Rowe## @param filename 33212372530SSteve Rowefunction validatesourcepatterns_filefilter 33312372530SSteve Rowe{ 33412372530SSteve Rowe local filename=$1 33512372530SSteve Rowe if [[ ${filename} =~ \.(java|jflex|py|pl|g4|jj|html|js|css|xml|xsl|vm|sh|cmd|bat|policy|properties|mdtext|groovy|template|adoc|json)$ ]]; then 33612372530SSteve Rowe yetus_debug "tests/validatesourcepatterns: ${filename}" 33712372530SSteve Rowe add_test validatesourcepatterns 33812372530SSteve Rowe fi 33912372530SSteve Rowe} 34012372530SSteve Rowe 34112372530SSteve Rowe## @description validatesourcepatterns test 34212372530SSteve Rowe## @audience private 34312372530SSteve Rowe## @stability evolving 34412372530SSteve Rowe## @param repostatus 34512372530SSteve Rowefunction validatesourcepatterns_rebuild 34612372530SSteve Rowe{ 34712372530SSteve Rowe local repostatus=$1 34812372530SSteve Rowe lucene_ant_command ${repostatus} "validatesourcepatterns" "validate-source-patterns" "Validate source patterns" 34912372530SSteve Rowe} 35012372530SSteve Rowe 35112372530SSteve Rowefunction lucene_ant_command 35212372530SSteve Rowe{ 35312372530SSteve Rowe declare repostatus=$1 35412372530SSteve Rowe declare testname=$2 35512372530SSteve Rowe declare antcommand=$3 35612372530SSteve Rowe declare title=$4 35712372530SSteve Rowe 35812372530SSteve Rowe declare result=0 35912372530SSteve Rowe declare i=0 36012372530SSteve Rowe declare module 36112372530SSteve Rowe declare fn 36212372530SSteve Rowe declare result 36312372530SSteve Rowe 36412372530SSteve Rowe if [[ "${repostatus}" = branch ]]; then 36512372530SSteve Rowe return 0 36612372530SSteve Rowe fi 36712372530SSteve Rowe 36812372530SSteve Rowe if ! verify_needed_test ${testname}; then 36912372530SSteve Rowe echo "${BUILDMODEMSG} does not need ${testname} testing." 37012372530SSteve Rowe return 0 37112372530SSteve Rowe fi 37212372530SSteve Rowe 37312372530SSteve Rowe big_console_header "${title}" 374298063eeSSteve Rowe personality_modules ${repostatus} ${testname} 37512372530SSteve Rowe until [[ ${i} -eq ${#MODULE[@]} ]]; do 37612372530SSteve Rowe if [[ ${MODULE_STATUS[${i}]} == -1 ]]; then 37712372530SSteve Rowe ((result=result+1)) 37812372530SSteve Rowe ((i=i+1)) 37912372530SSteve Rowe continue 38012372530SSteve Rowe fi 38112372530SSteve Rowe ANT_ARGS=${antcommand} 38212372530SSteve Rowe 38312372530SSteve Rowe start_clock 384298063eeSSteve Rowe module=${MODULE[${i}]} 38512372530SSteve Rowe fn=$(module_file_fragment "${module}") 38612372530SSteve Rowe logfilename="${repostatus}-${antcommand}-${fn}.txt"; 38712372530SSteve Rowe logfile="${PATCH_DIR}/${logfilename}" 38812372530SSteve Rowe buildtool_cwd "${i}" 38912372530SSteve Rowe echo_and_redirect "${logfile}" $(ant_executor) 39012372530SSteve Rowe 39112372530SSteve Rowe if [[ $? == 0 ]] ; then 39212372530SSteve Rowe module_status ${i} +1 "${logfilename}" "${title}" "${antcommand} passed" 39312372530SSteve Rowe else 39412372530SSteve Rowe module_status ${i} -1 "${logfilename}" "${title}" "${antcommand} failed" 39512372530SSteve Rowe ((result=result+1)) 39612372530SSteve Rowe fi 39712372530SSteve Rowe ((i=i+1)) 39812372530SSteve Rowe savestop=$(stop_clock) 39912372530SSteve Rowe MODULE_STATUS_TIMER[${i}]=${savestop} 40012372530SSteve Rowe done 40112372530SSteve Rowe ANT_ARGS="" 40212372530SSteve Rowe if [[ ${result} -gt 0 ]]; then 40312372530SSteve Rowe modules_messages ${repostatus} "${title}" false 40412372530SSteve Rowe return 1 40512372530SSteve Rowe fi 40612372530SSteve Rowe modules_messages ${repostatus} "${title}" true 40712372530SSteve Rowe return 0 40812372530SSteve Rowe} 409