constellation/bazel/ci/proto_targets_check.sh.in
2023-09-27 17:58:19 +02:00

93 lines
2.5 KiB
Bash

#!/usr/bin/env bash
###### script header ######
lib=$(realpath @@BASE_LIB@@) || exit 1
stat "${lib}" >> /dev/null || exit 1
if [[ -n ${DIFF+x} ]]; then
diff=$(realpath "${DIFF}") || exit 1
else
diff=$(command -v diff) || exit 1
fi
stat "${diff}" >> /dev/null || exit 1
# shellcheck source=../sh/lib.bash
if ! source "${lib}"; then
echo "Error: could not find import"
exit 1
fi
protoTargets=(@@PROTO_TARGETS@@)
cd "${BUILD_WORKSPACE_DIRECTORY}"
###### script body ######
exitCode=0
writeGoProtoFindingsStr=$(
grep \
-rw . \
-e "write_go_proto_srcs(" \
--include=*.bazel
)
readarray -t <<< "${writeGoProtoFindingsStr}"
writeGoProtoFindings=("${MAPFILE[@]}")
echo "Checking that all proto files have a 'write_go_proto_srcs' in the BUILD.bazel file of that package..."
protoFilesStr=$(find . -type f -name "*.proto")
readarray -t <<< "${protoFilesStr}"
protoFiles=("${MAPFILE[@]}")
protoFilePaths=()
for protoFile in "${protoFiles[@]}"; do
protoFilePaths+=("$(dirname "${protoFile}")")
done
writeGoProtoPaths=()
for writeGoProtoFinding in "${writeGoProtoFindings[@]}"; do
writeGoProtoPaths+=("${writeGoProtoFinding%/*}") # remove everything after the last slash
done
protoFilePathsSorted=$(printf '%s\n' "${protoFilePaths[@]}" | sort)
writeGoProtoPathsSorted=$(printf '%s\n' "${writeGoProtoPaths[@]}" | sort)
diff=$($diff <(echo "${protoFilePathsSorted}") <(echo "${writeGoProtoPathsSorted}") || true) # don't let diff fail
if [[ -n ${diff} ]]; then
echo "Mismatch between proto files and 'write_go_proto_srcs' calls:"
# shellcheck disable=SC2001
echo "${diff}" | sed -e 's/^/ /'
exitCode=1
fi
echo "Checking that all 'write_go_proto_srcs' calls and targets in bazel/ci/proto_targets.bzl match..."
writeGoProtoFindingsCleaned=()
for protoFinding in "${writeGoProtoFindings[@]}"; do
findingCleaned=$(
echo "${protoFinding}" |
sed \
-e 's$/BUILD.bazel$$' \
-e 's/write_go_proto_srcs(/write_generated_protos/g' \
-e 's$./$//$'
)
writeGoProtoFindingsCleaned+=("${findingCleaned}")
done
writeGoProtoFindingsSorted=$(printf '%s\n' "${writeGoProtoFindingsCleaned[@]}" | sort)
protoTargetsSorted=$(printf '%s\n' "${protoTargets[@]}" | sort)
diff=$(diff <(echo "${writeGoProtoFindingsSorted}") <(echo "${protoTargetsSorted}") || true) # don't let diff fail
if [[ -n ${diff} ]]; then
echo "Mismatch between 'write_go_proto_srcs' calls and targets listed in bazel/ci/proto_targets.bzl:"
# shellcheck disable=SC2001
echo "${diff}" | sed -e 's/^/ /'
exitCode=1
fi
exit "${exitCode}"