diff --git a/.automation/clean-code-base-for-tests.sh b/.automation/clean-code-base-for-tests.sh index a2372ce9..f5d15c5a 100755 --- a/.automation/clean-code-base-for-tests.sh +++ b/.automation/clean-code-base-for-tests.sh @@ -18,7 +18,7 @@ export LOG_TRACE LOG_DEBUG LOG_VERBOSE LOG_NOTICE LOG_WARN LOG_ERROR # Source additonal scripts # ############################ # shellcheck source=/dev/null -source "${GITHUB_WORKSPACE}/lib/log.sh" # Source the function script(s) +source "${GITHUB_WORKSPACE}/lib/functions/log.sh" # Source the function script(s) ################################################################################ ############################ FUNCTIONS BELOW ################################### diff --git a/.automation/cleanup-docker.sh b/.automation/cleanup-docker.sh index 961902d7..7df2a706 100755 --- a/.automation/cleanup-docker.sh +++ b/.automation/cleanup-docker.sh @@ -29,7 +29,7 @@ export LOG_TRACE LOG_DEBUG LOG_VERBOSE LOG_NOTICE LOG_WARN LOG_ERROR # Source Function Files # ######################### # shellcheck source=/dev/null -source "${GITHUB_WORKSPACE}/lib/log.sh" # Source the function script(s) +source "${GITHUB_WORKSPACE}/lib/functions/log.sh" # Source the function script(s) ################################################################################ ############################ FUNCTIONS BELOW ################################### diff --git a/.automation/upload-docker.sh b/.automation/upload-docker.sh index 32055086..f1398d28 100755 --- a/.automation/upload-docker.sh +++ b/.automation/upload-docker.sh @@ -48,7 +48,7 @@ export LOG_TRACE LOG_DEBUG LOG_VERBOSE LOG_NOTICE LOG_WARN LOG_ERROR # Source Function Files # ######################### # shellcheck source=/dev/null -source "${GITHUB_WORKSPACE}/lib/log.sh" # Source the function script(s) +source "${GITHUB_WORKSPACE}/lib/functions/log.sh" # Source the function script(s) ################################################################################ ############################ FUNCTIONS BELOW ################################### diff --git a/.automation/validate-docker-labels.sh b/.automation/validate-docker-labels.sh index 2ed0d3a9..73672e44 100755 --- a/.automation/validate-docker-labels.sh +++ b/.automation/validate-docker-labels.sh @@ -21,7 +21,7 @@ export LOG_TRACE LOG_DEBUG LOG_VERBOSE LOG_NOTICE LOG_WARN LOG_ERROR # Source Function Files # ######################### # shellcheck source=/dev/null -source "${GITHUB_WORKSPACE}/lib/log.sh" # Source the function script(s) +source "${GITHUB_WORKSPACE}/lib/functions/log.sh" # Source the function script(s) ################################################################################ ############################ FUNCTIONS BELOW ################################### diff --git a/Dockerfile b/Dockerfile index dc79a68f..0b1ca9c3 100644 --- a/Dockerfile +++ b/Dockerfile @@ -345,7 +345,7 @@ RUN ACTIONS_RUNNER_DEBUG=true WRITE_LINTER_VERSIONS_FILE=true /action/lib/linter ##################################4 # Run validations of built image # ################################## -RUN /action/lib/validate-docker.sh +RUN /action/lib/functions/validateDocker.sh ###################### # Set the entrypoint # diff --git a/lib/buildFileList.sh b/lib/functions/buildFileList.sh similarity index 86% rename from lib/buildFileList.sh rename to lib/functions/buildFileList.sh index 6ee10653..4b74a49b 100755 --- a/lib/buildFileList.sh +++ b/lib/functions/buildFileList.sh @@ -617,114 +617,3 @@ function BuildFileList() { info "----------------------------------------------" info "Successfully gathered list of files..." } -################################################################################ -#### Function GetFileType ###################################################### -function GetFileType() { - # Need to run the file through the 'file' exec to help determine - # The type of file being parsed - - ################ - # Pull in Vars # - ################ - FILE="$1" - - ################## - # Check the file # - ################## - GET_FILE_TYPE_CMD=$(file "${FILE}" 2>&1) - - echo "${GET_FILE_TYPE_CMD}" -} -################################################################################ -#### Function CheckFileType #################################################### -function CheckFileType() { - # Need to run the file through the 'file' exec to help determine - # The type of file being parsed - - ################ - # Pull in Vars # - ################ - FILE="$1" - - ################# - # Get file type # - ################# - GET_FILE_TYPE_CMD="$(GetFileType "$FILE")" - - if [[ ${GET_FILE_TYPE_CMD} == *"Ruby script"* ]]; then - ####################### - # It is a Ruby script # - ####################### - warn "Found ruby script without extension:[.rb]" - info "Please update file with proper extensions." - ################################ - # Append the file to the array # - ################################ - FILE_ARRAY_RUBY+=("${FILE}") - else - ############################ - # Extension was not found! # - ############################ - warn "Failed to get filetype for:[${FILE}]!" - fi -} -################################################################################ -#### Function GetFileExtension ############################################### -function GetFileExtension() { - ################ - # Pull in Vars # - ################ - FILE="$1" - - ########################### - # Get the files extension # - ########################### - # Extract just the file extension - FILE_TYPE=${FILE##*.} - # To lowercase - FILE_TYPE=${FILE_TYPE,,} - - echo "$FILE_TYPE" -} -################################################################################ -#### Function IsValidShellScript ############################################### -function IsValidShellScript() { - ################ - # Pull in Vars # - ################ - FILE="$1" - - ################# - # Get file type # - ################# - FILE_EXTENSION="$(GetFileExtension "$FILE")" - GET_FILE_TYPE_CMD="$(GetFileType "$FILE")" - - trace "File:[${FILE}], File extension:[${FILE_EXTENSION}], File type: [${GET_FILE_TYPE_CMD}]" - - if [[ "${FILE_EXTENSION}" == "zsh" ]] || - [[ ${GET_FILE_TYPE_CMD} == *"zsh script"* ]]; then - warn "$FILE is a ZSH script. Skipping..." - return 1 - fi - - if [ "${FILE_EXTENSION}" == "sh" ] || - [ "${FILE_EXTENSION}" == "bash" ] || - [ "${FILE_EXTENSION}" == "dash" ] || - [ "${FILE_EXTENSION}" == "ksh" ]; then - debug "$FILE is a valid shell script (has a valid extension: ${FILE_EXTENSION})" - return 0 - fi - - if [[ "${GET_FILE_TYPE_CMD}" == *"POSIX shell script"* ]] || - [[ ${GET_FILE_TYPE_CMD} == *"Bourne-Again shell script"* ]] || - [[ ${GET_FILE_TYPE_CMD} == *"dash script"* ]] || - [[ ${GET_FILE_TYPE_CMD} == *"ksh script"* ]] || - [[ ${GET_FILE_TYPE_CMD} == *"/usr/bin/env sh script"* ]]; then - debug "$FILE is a valid shell script (has a valid file type: ${GET_FILE_TYPE_CMD})" - return 0 - fi - - trace "$FILE is NOT a supported shell script. Skipping" - return 1 -} diff --git a/lib/functions/detectFiles.sh b/lib/functions/detectFiles.sh new file mode 100755 index 00000000..3afdb517 --- /dev/null +++ b/lib/functions/detectFiles.sh @@ -0,0 +1,319 @@ +#!/usr/bin/env bash + +################################################################################ +################################################################################ +########### Super-Linter linting Functions @admiralawkbar ###################### +################################################################################ +################################################################################ +########################## FUNCTION CALLS BELOW ################################ +################################################################################ +################################################################################ +#### Function DetectOpenAPIFile ################################################ +DetectOpenAPIFile() { + ################ + # Pull in vars # + ################ + FILE="${1}" + debug "Checking if ${FILE} is an OpenAPI file..." + + ############################### + # Check the file for keywords # + ############################### + grep -E '"openapi":|"swagger":|^openapi:|^swagger:' "${FILE}" >/dev/null + + ####################### + # Load the error code # + ####################### + ERROR_CODE=$? + + ############################## + # Check the shell for errors # + ############################## + if [ ${ERROR_CODE} -eq 0 ]; then + ######################## + # Found string in file # + ######################## + return 0 + else + ################### + # No string match # + ################### + return 1 + fi +} +################################################################################ +#### Function DetectTektonFile ################################################# +DetectTektonFile() { + ################ + # Pull in vars # + ################ + FILE="${1}" + debug "Checking if ${FILE} is a Tekton file..." + + ############################### + # Check the file for keywords # + ############################### + grep -q -E 'apiVersion: tekton' "${FILE}" >/dev/null + + ####################### + # Load the error code # + ####################### + ERROR_CODE=$? + + ############################## + # Check the shell for errors # + ############################## + if [ ${ERROR_CODE} -eq 0 ]; then + ######################## + # Found string in file # + ######################## + return 0 + else + ################### + # No string match # + ################### + return 1 + fi +} +################################################################################ +#### Function DetectARMFile #################################################### +DetectARMFile() { + ################ + # Pull in vars # + ################ + FILE="${1}" # Name of the file/path we are validating + debug "Checking if ${FILE} is an ARM file..." + + ############################### + # Check the file for keywords # + ############################### + grep -E 'schema.management.azure.com' "${FILE}" >/dev/null + + ####################### + # Load the error code # + ####################### + ERROR_CODE=$? + + ############################## + # Check the shell for errors # + ############################## + if [ ${ERROR_CODE} -eq 0 ]; then + ######################## + # Found string in file # + ######################## + return 0 + else + ################### + # No string match # + ################### + return 1 + fi +} +################################################################################ +#### Function DetectCloudFormationFile ######################################### +DetectCloudFormationFile() { + ################ + # Pull in Vars # + ################ + FILE="${1}" # File that we need to validate + debug "Checking if ${FILE} is a Cloud Formation file..." + + # https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/template-formats.html + # AWSTemplateFormatVersion is optional + ####################################### + # Check if file has AWS Template info # + ####################################### + if grep -q 'AWSTemplateFormatVersion' "${FILE}" >/dev/null; then + # Found it + return 0 + fi + + ##################################### + # See if it contains AWS References # + ##################################### + if grep -q -E '(AWS|Alexa|Custom)::' "${FILE}" >/dev/null; then + # Found it + return 0 + fi + + ##################################################### + # No identifiers of a CLOUDFORMATION template found # + ##################################################### + return 1 +} +################################################################################ +#### Function DetectKubernetesFile ######################################### +DetectKubernetesFile() { + ################ + # Pull in Vars # + ################ + FILE="${1}" # File that we need to validate + debug "Checking if ${FILE} is a Kubernetes descriptor..." + + if grep -v 'kustomize.config.k8s.io' "${FILE}" | grep -v tekton | grep -q -E '(apiVersion):'; then + debug "${FILE} is a Kubernetes descriptor" + return 0 + fi + + debug "${FILE} is NOT a Kubernetes descriptor" + return 1 +} +################################################################################ +#### Function DetectAWSStatesFIle ############################################## +DetectAWSStatesFIle() { + ################ + # Pull in Vars # + ################ + FILE="${1}" # File that we need to validate + debug "Checking if ${FILE} is a AWS states descriptor..." + + # https://states-language.net/spec.html#example + ############################### + # check if file has resources # + ############################### + if grep -q '"Resource": *"arn"*' "${FILE}"; then + # Found it + return 0 + fi + + ################################################# + # No identifiers of a AWS States Language found # + ################################################# + return 1 +} +################################################################################ +#### Function CheckInArray ##################################################### +CheckInArray() { + ############### + # Pull in Var # + ############### + NEEDLE="$1" # Language we need to match + + ###################################### + # Check if Language was in the array # + ###################################### + for LANG in "${UNIQUE_LINTED_ARRAY[@]}"; do + if [[ "${LANG}" == "${NEEDLE}" ]]; then + ############ + # Found it # + ############ + return 0 + fi + done + + ################### + # Did not find it # + ################### + return 1 +} +################################################################################ +#### Function GetFileType ###################################################### +function GetFileType() { + # Need to run the file through the 'file' exec to help determine + # The type of file being parsed + + ################ + # Pull in Vars # + ################ + FILE="$1" + + ################## + # Check the file # + ################## + GET_FILE_TYPE_CMD=$(file "${FILE}" 2>&1) + + echo "${GET_FILE_TYPE_CMD}" +} +################################################################################ +#### Function CheckFileType #################################################### +function CheckFileType() { + # Need to run the file through the 'file' exec to help determine + # The type of file being parsed + + ################ + # Pull in Vars # + ################ + FILE="$1" + + ################# + # Get file type # + ################# + GET_FILE_TYPE_CMD="$(GetFileType "$FILE")" + + if [[ ${GET_FILE_TYPE_CMD} == *"Ruby script"* ]]; then + ####################### + # It is a Ruby script # + ####################### + warn "Found ruby script without extension:[.rb]" + info "Please update file with proper extensions." + ################################ + # Append the file to the array # + ################################ + FILE_ARRAY_RUBY+=("${FILE}") + else + ############################ + # Extension was not found! # + ############################ + warn "Failed to get filetype for:[${FILE}]!" + fi +} +################################################################################ +#### Function GetFileExtension ############################################### +function GetFileExtension() { + ################ + # Pull in Vars # + ################ + FILE="$1" + + ########################### + # Get the files extension # + ########################### + # Extract just the file extension + FILE_TYPE=${FILE##*.} + # To lowercase + FILE_TYPE=${FILE_TYPE,,} + + echo "$FILE_TYPE" +} +################################################################################ +#### Function IsValidShellScript ############################################### +function IsValidShellScript() { + ################ + # Pull in Vars # + ################ + FILE="$1" + + ################# + # Get file type # + ################# + FILE_EXTENSION="$(GetFileExtension "$FILE")" + GET_FILE_TYPE_CMD="$(GetFileType "$FILE")" + + trace "File:[${FILE}], File extension:[${FILE_EXTENSION}], File type: [${GET_FILE_TYPE_CMD}]" + + if [[ "${FILE_EXTENSION}" == "zsh" ]] || + [[ ${GET_FILE_TYPE_CMD} == *"zsh script"* ]]; then + warn "$FILE is a ZSH script. Skipping..." + return 1 + fi + + if [ "${FILE_EXTENSION}" == "sh" ] || + [ "${FILE_EXTENSION}" == "bash" ] || + [ "${FILE_EXTENSION}" == "dash" ] || + [ "${FILE_EXTENSION}" == "ksh" ]; then + debug "$FILE is a valid shell script (has a valid extension: ${FILE_EXTENSION})" + return 0 + fi + + if [[ "${GET_FILE_TYPE_CMD}" == *"POSIX shell script"* ]] || + [[ ${GET_FILE_TYPE_CMD} == *"Bourne-Again shell script"* ]] || + [[ ${GET_FILE_TYPE_CMD} == *"dash script"* ]] || + [[ ${GET_FILE_TYPE_CMD} == *"ksh script"* ]] || + [[ ${GET_FILE_TYPE_CMD} == *"/usr/bin/env sh script"* ]]; then + debug "$FILE is a valid shell script (has a valid file type: ${GET_FILE_TYPE_CMD})" + return 0 + fi + + trace "$FILE is NOT a supported shell script. Skipping" + return 1 +} diff --git a/lib/functions/linterRules.sh b/lib/functions/linterRules.sh new file mode 100755 index 00000000..20969e35 --- /dev/null +++ b/lib/functions/linterRules.sh @@ -0,0 +1,229 @@ +#!/usr/bin/env bash + +################################################################################ +################################################################################ +########### Super-Linter linting Functions @admiralawkbar ###################### +################################################################################ +################################################################################ +########################## FUNCTION CALLS BELOW ################################ +################################################################################ +################################################################################ +#### Function GetLinterRules ################################################### +GetLinterRules() { + # Need to validate the rules files exist + + ################ + # Pull in vars # + ################ + LANGUAGE_NAME="${1}" # Name of the language were looking for + debug "Getting linter rules for ${LANGUAGE_NAME}..." + + DEFAULT_RULES_LOCATION="${2}" + debug "Default rules location: ${DEFAULT_RULES_LOCATION}..." + + ####################################################### + # Need to create the variables for the real variables # + ####################################################### + LANGUAGE_FILE_NAME="${LANGUAGE_NAME}_FILE_NAME" + LANGUAGE_LINTER_RULES="${LANGUAGE_NAME}_LINTER_RULES" + debug "Variable names for language file name: ${LANGUAGE_FILE_NAME}, language linter rules: ${LANGUAGE_LINTER_RULES}" + + ##################################################### + # Check if the language rules variables are defined # + ##################################################### + if [ -z "${!LANGUAGE_FILE_NAME+x}" ]; then + debug "${LANGUAGE_FILE_NAME} is not set. Skipping loading rules for ${LANGUAGE_NAME}..." + return + fi + + debug "Initializing LANGUAGE_LINTER_RULES value to an empty string..." + eval "${LANGUAGE_LINTER_RULES}=" + + ########################## + # Get the file extension # + ########################## + FILE_EXTENSION=$(echo "${!LANGUAGE_FILE_NAME}" | rev | cut -d'.' -f1 | rev) + FILE_NAME=$(basename "${!LANGUAGE_FILE_NAME}" ".${FILE_EXTENSION}") + debug "${LANGUAGE_NAME} language rule file (${!LANGUAGE_FILE_NAME}) has ${FILE_NAME} name and ${FILE_EXTENSION} extension" + + ######################################## + # Set the secondary file name and path # + ######################################## + debug "Initializing SECONDARY_FILE_NAME and SECONDARY_LANGUAGE_FILE_PATH..." + SECONDARY_FILE_NAME='' + SECONDARY_LANGUAGE_FILE_PATH= + + ################################# + # Check for secondary file name # + ################################# + if [[ $FILE_EXTENSION == 'yml' ]]; then + # Need to see if yaml also exists + SECONDARY_FILE_NAME="$FILE_NAME.yaml" + elif [[ $FILE_EXTENSION == 'yaml' ]]; then + # need to see if yml also exists + SECONDARY_FILE_NAME="$FILE_NAME.yml" + fi + + ############################### + # Set Flag for set Rules File # + ############################### + SET_RULES=0 + + ##################################### + # Validate we have the linter rules # + ##################################### + LANGUAGE_FILE_PATH="${GITHUB_WORKSPACE}/${LINTER_RULES_PATH}/${!LANGUAGE_FILE_NAME}" + debug "Checking if the user-provided:[${!LANGUAGE_FILE_NAME}] and exists at:[${LANGUAGE_FILE_PATH}]" + if [ -f "${LANGUAGE_FILE_PATH}" ]; then + info "----------------------------------------------" + info "User provided file:[${LANGUAGE_FILE_PATH}] exists, setting rules file..." + + ######################################## + # Update the path to the file location # + ######################################## + eval "${LANGUAGE_LINTER_RULES}=${LANGUAGE_FILE_PATH}" + ###################### + # Set the rules flag # + ###################### + SET_RULES=1 + else + # Failed to find the primary rules file + debug " -> Codebase does NOT have file:[${LANGUAGE_FILE_PATH}]." + fi + + #################################################### + # Check if we have secondary file name to look for # + #################################################### + if [ -n "$SECONDARY_FILE_NAME" ] && [ "${SET_RULES}" -eq 0 ]; then + # Set the path + SECONDARY_LANGUAGE_FILE_PATH="${GITHUB_WORKSPACE}/${LINTER_RULES_PATH}/${SECONDARY_FILE_NAME}" + debug "${LANGUAGE_NAME} language rule file has a secondary rules file name to check (${SECONDARY_FILE_NAME}). Path:[${SECONDARY_LANGUAGE_FILE_PATH}]" + + if [ -f "${SECONDARY_LANGUAGE_FILE_PATH}" ]; then + info "----------------------------------------------" + info "User provided file:[${SECONDARY_LANGUAGE_FILE_PATH}] exists, setting rules file..." + + ######################################## + # Update the path to the file location # + ######################################## + eval "${LANGUAGE_LINTER_RULES}=${SECONDARY_LANGUAGE_FILE_PATH}" + ###################### + # Set the rules flag # + ###################### + SET_RULES=1 + fi + fi + + ############################################################## + # We didnt find rules from user, setting to default template # + ############################################################## + if [ "${SET_RULES}" -eq 0 ]; then + ######################################################## + # No user default provided, using the template default # + ######################################################## + eval "${LANGUAGE_LINTER_RULES}=${DEFAULT_RULES_LOCATION}/${!LANGUAGE_FILE_NAME}" + debug " -> Codebase does NOT have file:[${LANGUAGE_FILE_PATH}], nor the file:[${SECONDARY_LANGUAGE_FILE_PATH}], using Default rules at:[${!LANGUAGE_LINTER_RULES}]" + ###################### + # Set the rules flag # + ###################### + SET_RULES=1 + fi + + #################### + # Debug Print info # + #################### + debug " -> Language rules file variable (${LANGUAGE_LINTER_RULES}) value is:[${!LANGUAGE_LINTER_RULES}]" + + ############################ + # Validate the file exists # + ############################ + if [ -e "${!LANGUAGE_LINTER_RULES}" ]; then + # Found the rules file + debug " -> ${LANGUAGE_LINTER_RULES} rules file (${!LANGUAGE_LINTER_RULES}) exists." + else + # Here we expect a rules file, so fail if not available. + fatal " -> ${LANGUAGE_LINTER_RULES} rules file (${!LANGUAGE_LINTER_RULES}) doesn't exist. Terminating..." + fi + + ###################### + # Export the results # + ###################### + eval "export ${LANGUAGE_LINTER_RULES}" +} +################################################################################ +#### Function GetStandardRules ################################################# +GetStandardRules() { + ################ + # Pull In Vars # + ################ + LINTER="${1}" # Type: javascript | typescript + + ######################################################################### + # Need to get the ENV vars from the linter rules to run in command line # + ######################################################################### + # Copy orig IFS to var + ORIG_IFS="${IFS}" + # Set the IFS to newline + IFS=$'\n' + + ######################################### + # Get list of all environment variables # + ######################################### + # Only env vars that are marked as true + GET_ENV_ARRAY=() + if [[ ${LINTER} == "javascript" ]]; then + mapfile -t GET_ENV_ARRAY < <(yq .env "${JAVASCRIPT_STANDARD_LINTER_RULES}" | grep true) + elif [[ ${LINTER} == "typescript" ]]; then + mapfile -t GET_ENV_ARRAY < <(yq .env "${TYPESCRIPT_STANDARD_LINTER_RULES}" | grep true) + fi + + ####################### + # Load the error code # + ####################### + ERROR_CODE=$? + + ############################## + # Check the shell for errors # + ############################## + if [ ${ERROR_CODE} -ne 0 ]; then + # ERROR + error "Failed to gain list of ENV vars to load!" + fatal "[${GET_ENV_ARRAY[*]}]" + fi + + ########################## + # Set IFS back to normal # + ########################## + # Set IFS back to Orig + IFS="${ORIG_IFS}" + + ###################### + # Set the env string # + ###################### + ENV_STRING='' + + ############################# + # Pull out the envs to load # + ############################# + for ENV in "${GET_ENV_ARRAY[@]}"; do + ############################# + # remove spaces from return # + ############################# + ENV="$(echo -e "${ENV}" | tr -d '[:space:]')" + ################################ + # Get the env to add to string # + ################################ + ENV="$(echo "${ENV}" | cut -d'"' -f2)" + debug "ENV:[${ENV}]" + ENV_STRING+="--env ${ENV} " + done + + ######################################### + # Remove trailing and ending whitespace # + ######################################### + if [[ ${LINTER} == "javascript" ]]; then + JAVASCRIPT_STANDARD_LINTER_RULES="$(echo -e "${ENV_STRING}" | sed -e 's/^[[:space:]]*//' -e 's/[[:space:]]*$//')" + elif [[ ${LINTER} == "typescript" ]]; then + TYPESCRIPT_STANDARD_LINTER_RULES="$(echo -e "${ENV_STRING}" | sed -e 's/^[[:space:]]*//' -e 's/[[:space:]]*$//')" + fi +} diff --git a/lib/linterVersions.sh b/lib/functions/linterVersions.sh similarity index 62% rename from lib/linterVersions.sh rename to lib/functions/linterVersions.sh index 34708a99..d156d651 100755 --- a/lib/linterVersions.sh +++ b/lib/functions/linterVersions.sh @@ -1,5 +1,56 @@ #!/usr/bin/env bash +################################################################################ +################################################################################ +########### Super-Linter linting Functions @admiralawkbar ###################### +################################################################################ +################################################################################ +#### Function GetLinterVersions ################################################ +GetLinterVersions() { + ######################### + # Print version headers # + ######################### + debug "---------------------------------------------" + debug "Linter Version Info:" + + if ! [ -e "${VERSION_FILE}" ] && [ "${WRITE_LINTER_VERSIONS_FILE}" = "true" ]; then + debug "Building linter version file..." + if BuildLinterVersions "${VERSION_FILE}" "${LINTER_NAMES_ARRAY[@]}"; then + info "Linter version file built correctly." + exit + else + fatal "Error while building the versions file." + fi + fi + + ################################ + # Cat the linter versions file # + ################################ + CAT_CMD=$(cat "${VERSION_FILE}" 2>&1) + + ####################### + # Load the error code # + ####################### + ERROR_CODE=$? + + ############################## + # Check the shell for errors # + ############################## + if [ ${ERROR_CODE} -ne 0 ]; then + # Failure + fatal "Failed to view version file:[${VERSION_FILE}]" + else + # Success + debug "${CAT_CMD}" + fi + + ######################### + # Print version footers # + ######################### + debug "---------------------------------------------" +} +################################################################################ +#### Function BuildLinterVersions ############################################## BuildLinterVersions() { VERSION_FILE="${1}" && shift LINTER_ARRAY=("$@") @@ -62,7 +113,8 @@ BuildLinterVersions() { fi done } - +################################################################################ +#### Function WriteFile ######################################################## WriteFile() { ############## # Read Input # diff --git a/lib/log.sh b/lib/functions/log.sh old mode 100644 new mode 100755 similarity index 100% rename from lib/log.sh rename to lib/functions/log.sh diff --git a/lib/possum.sh b/lib/functions/possum.sh similarity index 100% rename from lib/possum.sh rename to lib/functions/possum.sh diff --git a/lib/functions/tapLibrary.sh b/lib/functions/tapLibrary.sh new file mode 100755 index 00000000..a04b6836 --- /dev/null +++ b/lib/functions/tapLibrary.sh @@ -0,0 +1,123 @@ +#!/usr/bin/env bash + +################################################################################ +################################################################################ +########### Super-Linter linting Functions @admiralawkbar ###################### +################################################################################ +################################################################################ +########################## FUNCTION CALLS BELOW ################################ +################################################################################ +################################################################################ +#### Function IsTap ############################################################ +function IsTAP() { + if [ "${OUTPUT_FORMAT}" == "tap" ]; then + return 0 + else + return 1 + fi +} +################################################################################ +#### Function TransformTAPDetails ############################################## +function TransformTAPDetails() { + DATA=${1} + if [ -n "${DATA}" ] && [ "${OUTPUT_DETAILS}" == "detailed" ]; then + ######################################################### + # Transform new lines to \\n, remove colours and colons # + ######################################################### + echo "${DATA}" | awk 'BEGIN{RS="\n";ORS="\\n"}1' | sed -r "s/\x1B\[([0-9]{1,3}(;[0-9]{1,2})?)?[mGK]//g" | tr ':' ' ' + fi +} +################################################################################ +#### Function HeaderTap ######################################################## +function HeaderTap() { + ################ + # Pull in Vars # + ################ + INDEX="${1}" # File being validated + OUTPUT_FILE="${2}" # Output location + + ################### + # Print the goods # + ################### + printf "TAP version 13\n1..%s\n" "${INDEX}" >"${OUTPUT_FILE}" +} +################################################################################ +#### Function OkTap ############################################################ +function OkTap() { + ################ + # Pull in Vars # + ################ + INDEX="${1}" # Location + FILE="${2}" # File being validated + TEMP_FILE="${3}" # Temp file location + + ################### + # Print the goods # + ################### + echo "ok ${INDEX} - ${FILE}" >>"${TEMP_FILE}" +} +################################################################################ +#### Function NotOkTap ######################################################### +function NotOkTap() { + ################ + # Pull in Vars # + ################ + INDEX="${1}" # Location + FILE="${2}" # File being validated + TEMP_FILE="${3}" # Temp file location + + ################### + # Print the goods # + ################### + echo "not ok ${INDEX} - ${FILE}" >>"${TEMP_FILE}" +} +################################################################################ +#### Function AddDetailedMessageIfEnabled ###################################### +function AddDetailedMessageIfEnabled() { + ################ + # Pull in Vars # + ################ + LINT_CMD="${1}" # Linter command + TEMP_FILE="${2}" # Temp file + + #################### + # Check the return # + #################### + DETAILED_MSG=$(TransformTAPDetails "${LINT_CMD}") + if [ -n "${DETAILED_MSG}" ]; then + printf " ---\n message: %s\n ...\n" "${DETAILED_MSG}" >>"${TEMP_FILE}" + fi +} +################################################################################ +#### Function Reports ########################################################## +Reports() { + info "----------------------------------------------" + info "----------------------------------------------" + info "Generated reports:" + info "----------------------------------------------" + info "----------------------------------------------" + + ################################### + # Prints output report if enabled # + ################################### + if [ -z "${FORMAT_REPORT}" ]; then + info "Reports generated in folder ${REPORT_OUTPUT_FOLDER}" + ############################################# + # Print info on reports that were generated # + ############################################# + if [ -d "${REPORT_OUTPUT_FOLDER}" ]; then + info "Contents of report folder:" + OUTPUT_CONTENTS_CMD=$(ls "${REPORT_OUTPUT_FOLDER}") + info "$OUTPUT_CONTENTS_CMD" + else + warn "Report output folder (${REPORT_OUTPUT_FOLDER}) does NOT exist." + fi + fi + + ################################ + # Prints for warnings if found # + ################################ + for TEST in "${WARNING_ARRAY_TEST[@]}"; do + warn "Expected file to compare with was not found for ${TEST}" + done +} diff --git a/lib/validate-docker.sh b/lib/functions/validateDocker.sh similarity index 98% rename from lib/validate-docker.sh rename to lib/functions/validateDocker.sh index 1ead01d0..d33b3267 100755 --- a/lib/validate-docker.sh +++ b/lib/functions/validateDocker.sh @@ -16,7 +16,7 @@ export LOG_TRACE LOG_DEBUG LOG_VERBOSE LOG_NOTICE LOG_WARN LOG_ERROR # Source Function Files # ######################### # shellcheck source=/dev/null -source /action/lib/log.sh +source /action/lib/functions/log.sh ################################################################################ ############################ FUNCTIONS BELOW ################################### diff --git a/lib/validation.sh b/lib/functions/validation.sh similarity index 100% rename from lib/validation.sh rename to lib/functions/validation.sh diff --git a/lib/worker.sh b/lib/functions/worker.sh similarity index 88% rename from lib/worker.sh rename to lib/functions/worker.sh index 367a7626..03e22930 100755 --- a/lib/worker.sh +++ b/lib/functions/worker.sh @@ -546,84 +546,3 @@ function LintAnsibleFiles() { debug "skipping ansible lint" fi } -################################################################################ -#### Function IsTap ############################################################ -function IsTAP() { - if [ "${OUTPUT_FORMAT}" == "tap" ]; then - return 0 - else - return 1 - fi -} -################################################################################ -#### Function TransformTAPDetails ############################################## -function TransformTAPDetails() { - DATA=${1} - if [ -n "${DATA}" ] && [ "${OUTPUT_DETAILS}" == "detailed" ]; then - ######################################################### - # Transform new lines to \\n, remove colours and colons # - ######################################################### - echo "${DATA}" | awk 'BEGIN{RS="\n";ORS="\\n"}1' | sed -r "s/\x1B\[([0-9]{1,3}(;[0-9]{1,2})?)?[mGK]//g" | tr ':' ' ' - fi -} -################################################################################ -#### Function HeaderTap ######################################################## -function HeaderTap() { - ################ - # Pull in Vars # - ################ - INDEX="${1}" # File being validated - OUTPUT_FILE="${2}" # Output location - - ################### - # Print the goods # - ################### - printf "TAP version 13\n1..%s\n" "${INDEX}" >"${OUTPUT_FILE}" -} -################################################################################ -#### Function OkTap ############################################################ -function OkTap() { - ################ - # Pull in Vars # - ################ - INDEX="${1}" # Location - FILE="${2}" # File being validated - TEMP_FILE="${3}" # Temp file location - - ################### - # Print the goods # - ################### - echo "ok ${INDEX} - ${FILE}" >>"${TEMP_FILE}" -} -################################################################################ -#### Function NotOkTap ######################################################### -function NotOkTap() { - ################ - # Pull in Vars # - ################ - INDEX="${1}" # Location - FILE="${2}" # File being validated - TEMP_FILE="${3}" # Temp file location - - ################### - # Print the goods # - ################### - echo "not ok ${INDEX} - ${FILE}" >>"${TEMP_FILE}" -} -################################################################################ -#### Function AddDetailedMessageIfEnabled ###################################### -function AddDetailedMessageIfEnabled() { - ################ - # Pull in Vars # - ################ - LINT_CMD="${1}" # Linter command - TEMP_FILE="${2}" # Temp file - - #################### - # Check the return # - #################### - DETAILED_MSG=$(TransformTAPDetails "${LINT_CMD}") - if [ -n "${DETAILED_MSG}" ]; then - printf " ---\n message: %s\n ...\n" "${DETAILED_MSG}" >>"${TEMP_FILE}" - fi -} diff --git a/lib/linter.sh b/lib/linter.sh index 8dcb4983..77bbd09b 100755 --- a/lib/linter.sh +++ b/lib/linter.sh @@ -44,13 +44,21 @@ export LOG_ERROR # Source Function Files # ######################### # shellcheck source=/dev/null -source /action/lib/log.sh # Source the function script(s) +source /action/lib/functions/log.sh # Source the function script(s) # shellcheck source=/dev/null -source /action/lib/buildFileList.sh # Source the function script(s) +source /action/lib/functions/buildFileList.sh # Source the function script(s) # shellcheck source=/dev/null -source /action/lib/validation.sh # Source the function script(s) +source /action/lib/functions/validation.sh # Source the function script(s) # shellcheck source=/dev/null -source /action/lib/worker.sh # Source the function script(s) +source /action/lib/functions/worker.sh # Source the function script(s) +# shellcheck source=/dev/null +source /action/lib/functions/tapLibrary.sh # Source the function script(s) +# shellcheck source=/dev/null +source /action/lib/functions/linterRules.sh # Source the function script(s) +# shellcheck source=/dev/null +source /action/lib/functions/detectFiles.sh # Source the function script(s) +# shellcheck source=/dev/null +source /action/lib/functions/linterVersions.sh # Source the function script(s) ########### # GLOBALS # @@ -59,7 +67,8 @@ source /action/lib/worker.sh # Source the function script(s) DEFAULT_RULES_LOCATION='/action/lib/.automation' # Default rules files location LINTER_RULES_PATH="${LINTER_RULES_PATH:-.github/linters}" # Linter Path Directory GITHUB_API_URL='https://api.github.com' # GitHub API root url -VERSION_FILE='/action/lib/linter-versions.txt' # File to store linter versions +VERSION_FILE='/action/lib/functions/linterVersions.txt' # File to store linter versions +export VERSION_FILE # Workaround SC2034 ############### # Rules files # @@ -297,7 +306,7 @@ Header() { ############################### # Give them the possum action # ############################### - /bin/bash /action/lib/possum.sh + /bin/bash /action/lib/functions/possum.sh ########## # Prints # @@ -314,447 +323,6 @@ Header() { info "---------------------------------------------" } ################################################################################ -#### Function GetLinterVersions ################################################ -GetLinterVersions() { - ######################### - # Print version headers # - ######################### - debug "---------------------------------------------" - debug "Linter Version Info:" - - if ! [ -e "${VERSION_FILE}" ] && [ "${WRITE_LINTER_VERSIONS_FILE}" = "true" ]; then - debug "Building linter version file..." - # shellcheck source=/dev/null - source /action/lib/linterVersions.sh # Source the function script(s) - if BuildLinterVersions "${VERSION_FILE}" "${LINTER_NAMES_ARRAY[@]}"; then - info "Linter version file built correctly." - exit - else - fatal "Error while building the versions file." - fi - fi - - ################################ - # Cat the linter versions file # - ################################ - CAT_CMD=$(cat "${VERSION_FILE}" 2>&1) - - ####################### - # Load the error code # - ####################### - ERROR_CODE=$? - - ############################## - # Check the shell for errors # - ############################## - if [ ${ERROR_CODE} -ne 0 ]; then - # Failure - fatal "Failed to view version file:[${VERSION_FILE}]" - else - # Success - debug "${CAT_CMD}" - fi - - ######################### - # Print version footers # - ######################### - debug "---------------------------------------------" -} -################################################################################ -#### Function GetLinterRules ################################################### -GetLinterRules() { - # Need to validate the rules files exist - - ################ - # Pull in vars # - ################ - LANGUAGE_NAME="${1}" # Name of the language were looking for - debug "Getting linter rules for ${LANGUAGE_NAME}..." - - DEFAULT_RULES_LOCATION="${2}" - debug "Default rules location: ${DEFAULT_RULES_LOCATION}..." - - ####################################################### - # Need to create the variables for the real variables # - ####################################################### - LANGUAGE_FILE_NAME="${LANGUAGE_NAME}_FILE_NAME" - LANGUAGE_LINTER_RULES="${LANGUAGE_NAME}_LINTER_RULES" - debug "Variable names for language file name: ${LANGUAGE_FILE_NAME}, language linter rules: ${LANGUAGE_LINTER_RULES}" - - ##################################################### - # Check if the language rules variables are defined # - ##################################################### - if [ -z "${!LANGUAGE_FILE_NAME+x}" ]; then - debug "${LANGUAGE_FILE_NAME} is not set. Skipping loading rules for ${LANGUAGE_NAME}..." - return - fi - - debug "Initializing LANGUAGE_LINTER_RULES value to an empty string..." - eval "${LANGUAGE_LINTER_RULES}=" - - ########################## - # Get the file extension # - ########################## - FILE_EXTENSION=$(echo "${!LANGUAGE_FILE_NAME}" | rev | cut -d'.' -f1 | rev) - FILE_NAME=$(basename "${!LANGUAGE_FILE_NAME}" ".${FILE_EXTENSION}") - debug "${LANGUAGE_NAME} language rule file (${!LANGUAGE_FILE_NAME}) has ${FILE_NAME} name and ${FILE_EXTENSION} extension" - - ######################################## - # Set the secondary file name and path # - ######################################## - debug "Initializing SECONDARY_FILE_NAME and SECONDARY_LANGUAGE_FILE_PATH..." - SECONDARY_FILE_NAME='' - SECONDARY_LANGUAGE_FILE_PATH= - - ################################# - # Check for secondary file name # - ################################# - if [[ $FILE_EXTENSION == 'yml' ]]; then - # Need to see if yaml also exists - SECONDARY_FILE_NAME="$FILE_NAME.yaml" - elif [[ $FILE_EXTENSION == 'yaml' ]]; then - # need to see if yml also exists - SECONDARY_FILE_NAME="$FILE_NAME.yml" - fi - - ############################### - # Set Flag for set Rules File # - ############################### - SET_RULES=0 - - ##################################### - # Validate we have the linter rules # - ##################################### - LANGUAGE_FILE_PATH="${GITHUB_WORKSPACE}/${LINTER_RULES_PATH}/${!LANGUAGE_FILE_NAME}" - debug "Checking if the user-provided:[${!LANGUAGE_FILE_NAME}] and exists at:[${LANGUAGE_FILE_PATH}]" - if [ -f "${LANGUAGE_FILE_PATH}" ]; then - info "----------------------------------------------" - info "User provided file:[${LANGUAGE_FILE_PATH}] exists, setting rules file..." - - ######################################## - # Update the path to the file location # - ######################################## - eval "${LANGUAGE_LINTER_RULES}=${LANGUAGE_FILE_PATH}" - ###################### - # Set the rules flag # - ###################### - SET_RULES=1 - else - # Failed to find the primary rules file - debug " -> Codebase does NOT have file:[${LANGUAGE_FILE_PATH}]." - fi - - #################################################### - # Check if we have secondary file name to look for # - #################################################### - if [ -n "$SECONDARY_FILE_NAME" ] && [ "${SET_RULES}" -eq 0 ]; then - # Set the path - SECONDARY_LANGUAGE_FILE_PATH="${GITHUB_WORKSPACE}/${LINTER_RULES_PATH}/${SECONDARY_FILE_NAME}" - debug "${LANGUAGE_NAME} language rule file has a secondary rules file name to check (${SECONDARY_FILE_NAME}). Path:[${SECONDARY_LANGUAGE_FILE_PATH}]" - - if [ -f "${SECONDARY_LANGUAGE_FILE_PATH}" ]; then - info "----------------------------------------------" - info "User provided file:[${SECONDARY_LANGUAGE_FILE_PATH}] exists, setting rules file..." - - ######################################## - # Update the path to the file location # - ######################################## - eval "${LANGUAGE_LINTER_RULES}=${SECONDARY_LANGUAGE_FILE_PATH}" - ###################### - # Set the rules flag # - ###################### - SET_RULES=1 - fi - fi - - ############################################################## - # We didnt find rules from user, setting to default template # - ############################################################## - if [ "${SET_RULES}" -eq 0 ]; then - ######################################################## - # No user default provided, using the template default # - ######################################################## - eval "${LANGUAGE_LINTER_RULES}=${DEFAULT_RULES_LOCATION}/${!LANGUAGE_FILE_NAME}" - debug " -> Codebase does NOT have file:[${LANGUAGE_FILE_PATH}], nor the file:[${SECONDARY_LANGUAGE_FILE_PATH}], using Default rules at:[${!LANGUAGE_LINTER_RULES}]" - ###################### - # Set the rules flag # - ###################### - SET_RULES=1 - fi - - #################### - # Debug Print info # - #################### - debug " -> Language rules file variable (${LANGUAGE_LINTER_RULES}) value is:[${!LANGUAGE_LINTER_RULES}]" - - ############################ - # Validate the file exists # - ############################ - if [ -e "${!LANGUAGE_LINTER_RULES}" ]; then - # Found the rules file - debug " -> ${LANGUAGE_LINTER_RULES} rules file (${!LANGUAGE_LINTER_RULES}) exists." - else - # Here we expect a rules file, so fail if not available. - fatal " -> ${LANGUAGE_LINTER_RULES} rules file (${!LANGUAGE_LINTER_RULES}) doesn't exist. Terminating..." - fi - - ###################### - # Export the results # - ###################### - eval "export ${LANGUAGE_LINTER_RULES}" -} -################################################################################ -#### Function GetStandardRules ################################################# -GetStandardRules() { - ################ - # Pull In Vars # - ################ - LINTER="${1}" # Type: javascript | typescript - - ######################################################################### - # Need to get the ENV vars from the linter rules to run in command line # - ######################################################################### - # Copy orig IFS to var - ORIG_IFS="${IFS}" - # Set the IFS to newline - IFS=$'\n' - - ######################################### - # Get list of all environment variables # - ######################################### - # Only env vars that are marked as true - GET_ENV_ARRAY=() - if [[ ${LINTER} == "javascript" ]]; then - mapfile -t GET_ENV_ARRAY < <(yq .env "${JAVASCRIPT_STANDARD_LINTER_RULES}" | grep true) - elif [[ ${LINTER} == "typescript" ]]; then - mapfile -t GET_ENV_ARRAY < <(yq .env "${TYPESCRIPT_STANDARD_LINTER_RULES}" | grep true) - fi - - ####################### - # Load the error code # - ####################### - ERROR_CODE=$? - - ############################## - # Check the shell for errors # - ############################## - if [ ${ERROR_CODE} -ne 0 ]; then - # ERROR - error "Failed to gain list of ENV vars to load!" - fatal "[${GET_ENV_ARRAY[*]}]" - fi - - ########################## - # Set IFS back to normal # - ########################## - # Set IFS back to Orig - IFS="${ORIG_IFS}" - - ###################### - # Set the env string # - ###################### - ENV_STRING='' - - ############################# - # Pull out the envs to load # - ############################# - for ENV in "${GET_ENV_ARRAY[@]}"; do - ############################# - # remove spaces from return # - ############################# - ENV="$(echo -e "${ENV}" | tr -d '[:space:]')" - ################################ - # Get the env to add to string # - ################################ - ENV="$(echo "${ENV}" | cut -d'"' -f2)" - debug "ENV:[${ENV}]" - ENV_STRING+="--env ${ENV} " - done - - ######################################### - # Remove trailing and ending whitespace # - ######################################### - if [[ ${LINTER} == "javascript" ]]; then - JAVASCRIPT_STANDARD_LINTER_RULES="$(echo -e "${ENV_STRING}" | sed -e 's/^[[:space:]]*//' -e 's/[[:space:]]*$//')" - elif [[ ${LINTER} == "typescript" ]]; then - TYPESCRIPT_STANDARD_LINTER_RULES="$(echo -e "${ENV_STRING}" | sed -e 's/^[[:space:]]*//' -e 's/[[:space:]]*$//')" - fi -} -################################################################################ -#### Function DetectOpenAPIFile ################################################ -DetectOpenAPIFile() { - ################ - # Pull in vars # - ################ - FILE="${1}" - debug "Checking if ${FILE} is an OpenAPI file..." - - ############################### - # Check the file for keywords # - ############################### - grep -E '"openapi":|"swagger":|^openapi:|^swagger:' "${FILE}" >/dev/null - - ####################### - # Load the error code # - ####################### - ERROR_CODE=$? - - ############################## - # Check the shell for errors # - ############################## - if [ ${ERROR_CODE} -eq 0 ]; then - ######################## - # Found string in file # - ######################## - return 0 - else - ################### - # No string match # - ################### - return 1 - fi -} -################################################################################ -#### Function DetectTektonFile ################################################# -DetectTektonFile() { - ################ - # Pull in vars # - ################ - FILE="${1}" - debug "Checking if ${FILE} is a Tekton file..." - - ############################### - # Check the file for keywords # - ############################### - grep -q -E 'apiVersion: tekton' "${FILE}" >/dev/null - - ####################### - # Load the error code # - ####################### - ERROR_CODE=$? - - ############################## - # Check the shell for errors # - ############################## - if [ ${ERROR_CODE} -eq 0 ]; then - ######################## - # Found string in file # - ######################## - return 0 - else - ################### - # No string match # - ################### - return 1 - fi -} -################################################################################ -#### Function DetectARMFile #################################################### -DetectARMFile() { - ################ - # Pull in vars # - ################ - FILE="${1}" # Name of the file/path we are validating - debug "Checking if ${FILE} is an ARM file..." - - ############################### - # Check the file for keywords # - ############################### - grep -E 'schema.management.azure.com' "${FILE}" >/dev/null - - ####################### - # Load the error code # - ####################### - ERROR_CODE=$? - - ############################## - # Check the shell for errors # - ############################## - if [ ${ERROR_CODE} -eq 0 ]; then - ######################## - # Found string in file # - ######################## - return 0 - else - ################### - # No string match # - ################### - return 1 - fi -} -################################################################################ -#### Function DetectCloudFormationFile ######################################### -DetectCloudFormationFile() { - ################ - # Pull in Vars # - ################ - FILE="${1}" # File that we need to validate - debug "Checking if ${FILE} is a Cloud Formation file..." - - # https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/template-formats.html - # AWSTemplateFormatVersion is optional - ####################################### - # Check if file has AWS Template info # - ####################################### - if grep -q 'AWSTemplateFormatVersion' "${FILE}" >/dev/null; then - # Found it - return 0 - fi - - ##################################### - # See if it contains AWS References # - ##################################### - if grep -q -E '(AWS|Alexa|Custom)::' "${FILE}" >/dev/null; then - # Found it - return 0 - fi - - ##################################################### - # No identifiers of a CLOUDFORMATION template found # - ##################################################### - return 1 -} -################################################################################ -#### Function DetectKubernetesFile ######################################### -DetectKubernetesFile() { - ################ - # Pull in Vars # - ################ - FILE="${1}" # File that we need to validate - debug "Checking if ${FILE} is a Kubernetes descriptor..." - - if grep -v 'kustomize.config.k8s.io' "${FILE}" | grep -v tekton | grep -q -E '(apiVersion):'; then - debug "${FILE} is a Kubernetes descriptor" - return 0 - fi - - debug "${FILE} is NOT a Kubernetes descriptor" - return 1 -} -################################################################################ -#### Function DetectAWSStatesFIle ############################################## -DetectAWSStatesFIle() { - ################ - # Pull in Vars # - ################ - FILE="${1}" # File that we need to validate - debug "Checking if ${FILE} is a AWS states descriptor..." - - # https://states-language.net/spec.html#example - ############################### - # check if file has resources # - ############################### - if grep -q '"Resource": *"arn"*' "${FILE}"; then - # Found it - return 0 - fi - - ################################################# - # No identifiers of a AWS States Language found # - ################################################# - return 1 -} -################################################################################ #### Function GetGitHubVars #################################################### GetGitHubVars() { ########## @@ -1007,39 +575,6 @@ CallStatusAPI() { fi } ################################################################################ -#### Function Reports ########################################################## -Reports() { - info "----------------------------------------------" - info "----------------------------------------------" - info "Generated reports:" - info "----------------------------------------------" - info "----------------------------------------------" - - ################################### - # Prints output report if enabled # - ################################### - if [ -z "${FORMAT_REPORT}" ]; then - info "Reports generated in folder ${REPORT_OUTPUT_FOLDER}" - ############################################# - # Print info on reports that were generated # - ############################################# - if [ -d "${REPORT_OUTPUT_FOLDER}" ]; then - info "Contents of report folder:" - OUTPUT_CONTENTS_CMD=$(ls "${REPORT_OUTPUT_FOLDER}") - info "$OUTPUT_CONTENTS_CMD" - else - warn "Report output folder (${REPORT_OUTPUT_FOLDER}) does NOT exist." - fi - fi - - ################################ - # Prints for warnings if found # - ################################ - for TEST in "${WARNING_ARRAY_TEST[@]}"; do - warn "Expected file to compare with was not found for ${TEST}" - done -} -################################################################################ #### Function Footer ########################################################### Footer() { info "----------------------------------------------" @@ -1052,6 +587,7 @@ Footer() { # Need to clean up the lanuage array of duplicates # #################################################### mapfile -t UNIQUE_LINTED_ARRAY < <(for LANG in "${LINTED_LANGUAGES_ARRAY[@]}"; do echo "${LANG}"; done | sort -u) + export UNIQUE_LINTED_ARRAY # Workaround SC2034 ############################## # Prints for errors if found # @@ -1118,31 +654,6 @@ Footer() { exit 0 } ################################################################################ -#### Function CheckInArray ##################################################### -CheckInArray() { - ############### - # Pull in Var # - ############### - NEEDLE="$1" # Language we need to match - - ###################################### - # Check if Language was in the array # - ###################################### - for LANG in "${UNIQUE_LINTED_ARRAY[@]}"; do - if [[ "${LANG}" == "${NEEDLE}" ]]; then - ############ - # Found it # - ############ - return 0 - fi - done - - ################### - # Did not find it # - ################### - return 1 -} -################################################################################ #### Function Cleanup ########################################################## cleanup() { local -ri EXIT_CODE=$?