#!/usr/bin/env bash usage() { echo "Usage: $0 dir" echo "dir - Project directory" exit 1 } readExclusions() { [ -e "${proj}/${exclusionsFile}" ] && { readarray -t exclusions < <(cat "${proj}/${exclusionsFile}") || echo "Unable to read ${proj}/${exclusionsFile}"; } } require() { hash "$@" || exit 127 } path() { dirname "$(readlink -f "$1")" } require cat rm find java dirname readlink nproc dir="$(path "$0")" declare -r rulesFile="${dir}/pmdrules.xml" declare -r cacheFile="pmd.cache" declare -r errFile="pmd.errors" declare -r auxCpFile="compile.cp" auxCp="" declare -r setupcp="setupclasspath" declare -r format="text" #shellcheck disable=SC2155 declare -i threads=$(nproc --all) declare -i minpriority=5 declare -r classpathFile="${dir}/pmd.cp" pmdCp=$(cat "$classpathFile") declare -r mainClass="net.sourceforge.pmd.PMD" declare -r exclusionsFile=".exclusions" declare -r fileslist="pmdfiles.txt" declare -a exclusions declare -i res=0 proj="$1" if [ "$#" -ne 1 ] || ! [ -d "$proj" ]; then usage fi readExclusions ( declare -i res=0 set -o noglob cd "$proj" || exit if [ -e "$fileslist" ]; then rm ./"$fileslist" fi if [ -e "$setupcp" ]; then ./"$setupcp" auxCp=$(cat "$auxCpFile") fi find . -type f -regex ".*[.]\(java\|jsp\|xml\|pom\)$" "${exclusions[@]}" | tr '\n' ',' >"$fileslist" if [ -s "$fileslist" ]; then java -cp "$pmdCp" \ "$mainClass" \ --file-list "$fileslist" --rulesets "$rulesFile" --format "$format" \ --minimum-priority "$minpriority" --no-ruleset-compatibility \ --fail-on-violation true --cache "$cacheFile" \ --report-file "$errFile" \ --aux-classpath "$auxCp":. \ --threads "$threads" || { exitCode="$?" echo "$0 exited with error code $exitCode" exit "$exitCode" } res=$? fi set +o noglob exit "$res" ) exit $?