diff --git a/hack/verify-generated-docs.sh b/hack/verify-generated-docs.sh new file mode 100755 index 000000000..4c52a1b22 --- /dev/null +++ b/hack/verify-generated-docs.sh @@ -0,0 +1,62 @@ +#!/usr/bin/env bash + +# Copyright 2018 The Kubernetes Authors. +# +# Licensed 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. + +set -o errexit +set -o nounset +set -o pipefail + +CRT_DIR=$(pwd) +VERIFY_TEMP=$(mktemp -d 2>/dev/null || mktemp -d -t k8s-community.XXXXXX) +WORKING_DIR=${VERIFY_TEMP}/src/testgendocs +GOPATH=${VERIFY_TEMP} +mkdir -p ${WORKING_DIR} + +function cleanup { + rm -rf "${VERIFY_TEMP}" +} +trap cleanup EXIT + +cp -r sigs.yaml sig-* wg-* Makefile generator vendor ${WORKING_DIR}/ + +cd ${WORKING_DIR} +make 1>/dev/null + +mismatches=0 +break=$(printf "=%.0s" $(seq 1 68)) + +for file in $(ls ${CRT_DIR}/sig-*/README.md ${CRT_DIR}/wg-*/README.md ${CRT_DIR}/sig-list.md ${CRT_DIR}/OWNERS_ALIASES); do + real=${file#$CRT_DIR/} + if ! diff -q ${file} ${WORKING_DIR}/${real} &>/dev/null; then + echo "${file} does not match ${WORKING_DIR}/${real}"; + mismatches=$((mismatches+1)) + fi; +done + +if [ ${mismatches} -gt "0" ]; then + echo "" + echo ${break} + noun="mismatch was" + if [ ${mismatches} -gt "0" ]; then + noun="mismatches were" + fi + echo "${mismatches} ${noun} detected." + echo "Do not manually edit sig-list.md or README.md files inside the sig folders." + echo "Instead make your changes to sigs.yaml and then run \`make\`."; + echo ${break} + exit 1; +fi + +exit 0 diff --git a/hack/verify.sh b/hack/verify.sh index 52d57a020..45c1fd7c4 100755 --- a/hack/verify.sh +++ b/hack/verify.sh @@ -1,44 +1,121 @@ -#!/bin/bash +#!/usr/bin/env bash -CRT_DIR=$(pwd) -VERIFY_TEMP=$(mktemp -d 2>/dev/null || mktemp -d -t k8s-community.XXXXXX) -WORKING_DIR=${VERIFY_TEMP}/src/testgendocs -GOPATH=${VERIFY_TEMP} -mkdir -p ${WORKING_DIR} +# Copyright 2018 The Kubernetes Authors. +# +# Licensed 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. -function cleanup { - rm -rf "${VERIFY_TEMP}" -} -trap cleanup EXIT +set -o errexit +set -o nounset +set -o pipefail -cp -r sigs.yaml sig-* wg-* Makefile generator ${WORKING_DIR}/ +KUBE_ROOT=$(dirname "${BASH_SOURCE}")/.. -cd ${WORKING_DIR} -make 1>/dev/null - -mismatches=0 -break=$(printf "=%.0s" $(seq 1 68)) - -for file in $(ls ${CRT_DIR}/sig-*/README.md ${CRT_DIR}/wg-*/README.md ${CRT_DIR}/sig-list.md ${CRT_DIR}/OWNERS_ALIASES); do - real=${file#$CRT_DIR/} - if ! diff -q ${file} ${WORKING_DIR}/${real} &>/dev/null; then - echo "${file} does not match ${WORKING_DIR}/${real}"; - mismatches=$((mismatches+1)) - fi; -done - -if [ ${mismatches} -gt "0" ]; then - echo "" - echo ${break} - noun="mismatch was" - if [ ${mismatches} -gt "0" ]; then - noun="mismatches were" - fi - echo "${mismatches} ${noun} detected." - echo "Do not manually edit sig-list.md or README.md files inside the sig folders." - echo "Instead make your changes to sigs.yaml and then run \`make\`."; - echo ${break} - exit 1; +# Some useful colors. +if [[ -z "${color_start-}" ]]; then + declare -r color_start="\033[" + declare -r color_red="${color_start}0;31m" + declare -r color_yellow="${color_start}0;33m" + declare -r color_green="${color_start}0;32m" + declare -r color_norm="${color_start}0m" fi -exit 0 +# Excluded check patterns are always skipped. +EXCLUDED_PATTERNS=( + "verify-all.sh" # this script calls the make rule and would cause a loop + "verify-*-dockerized.sh" # Don't run any scripts that intended to be run dockerized + ) + +EXCLUDED_CHECKS=$(ls ${EXCLUDED_PATTERNS[@]/#/${KUBE_ROOT}\/hack\/} 2>/dev/null || true) + +function is-excluded { + for e in ${EXCLUDED_CHECKS[@]}; do + if [[ $1 -ef "$e" ]]; then + return + fi + done + return 1 +} + +function run-cmd { + if ${SILENT}; then + "$@" &> /dev/null + else + "$@" + fi +} + +# Collect Failed tests in this Array , initialize it to nil +FAILED_TESTS=() + +function print-failed-tests { + echo -e "========================" + echo -e "${color_red}FAILED TESTS${color_norm}" + echo -e "========================" + for t in ${FAILED_TESTS[@]}; do + echo -e "${color_red}${t}${color_norm}" + done +} + +function run-checks { + local -r pattern=$1 + local -r runner=$2 + + local t + for t in $(ls ${pattern}) + do + local check_name="$(basename "${t}")" + if is-excluded "${t}" ; then + echo "Skipping ${check_name}" + continue + fi + echo -e "Verifying ${check_name}" + local start=$(date +%s) + run-cmd "${runner}" "${t}" && tr=$? || tr=$? + local elapsed=$(($(date +%s) - ${start})) + if [[ ${tr} -eq 0 ]]; then + echo -e "${color_green}SUCCESS${color_norm} ${check_name}\t${elapsed}s" + else + echo -e "${color_red}FAILED${color_norm} ${check_name}\t${elapsed}s" + ret=1 + FAILED_TESTS+=(${t}) + fi + done +} + +SILENT=false + +while getopts ":s" opt; do + case ${opt} in + s) + SILENT=true + ;; + \?) + echo "Invalid flag: -${OPTARG}" >&2 + exit 1 + ;; + esac +done + +if ${SILENT} ; then + echo "Running in silent mode, run without -s if you want to see script logs." +fi + +ret=0 +run-checks "${KUBE_ROOT}/hack/verify-*.sh" bash + +if [[ ${ret} -eq 1 ]]; then + print-failed-tests +fi +exit ${ret} + +# ex: ts=2 sw=2 et filetype=sh