#!/usr/bin/env bash # Copyright IBM Corp. 2014, 2026 # SPDX-License-Identifier: BUSL-1.1 set -euo pipefail echo "==> Checking (tfdiags.Diagnostics).Append usage..." # Use the analyzer binary built from the current branch to check for findings in the currently checked-out code. # Output written to the specified location (output_file) is used and cleaned up by calling code. collect_findings() { local analyzer_bin="$1" local output_file="$2" local analyzer_output set +e analyzer_output="$("${analyzer_bin}" ./... 2>&1)" local analyzer_status=$? set -e if [[ ${analyzer_status} -ne 0 ]] && ! grep -q "ignored return value from tfdiags.Diagnostics.Append" <<<"${analyzer_output}"; then echo >&2 "==> defect-detector failed unexpectedly:" echo >&2 "${analyzer_output}" exit ${analyzer_status} fi grep -F "ignored return value from tfdiags.Diagnostics.Append" <<<"${analyzer_output}" | sort -u >"${output_file}" || true } # In pull request checks we compare findings in the base branch with findings # in the PR branch, and fail only for newly introduced findings. if [[ -n "${GITHUB_BASE_REF:-}" ]]; then base_branch="origin/${GITHUB_BASE_REF}" tmp_dir="$(mktemp -d)" base_output="${tmp_dir}/base-findings.txt" head_output="${tmp_dir}/head-findings.txt" analyzer_bin="${tmp_dir}/defectdetector" current_head="$(git rev-parse HEAD)" cleanup() { git checkout --detach "${current_head}" >/dev/null 2>&1 || true rm -rf "${tmp_dir}" } trap cleanup EXIT echo "==> Building analyzer binary from current branch..." go build -o "${analyzer_bin}" ./tools/defect-detector/main echo "==> Comparing findings against ${base_branch}..." git fetch --no-tags --depth=1 origin "${GITHUB_BASE_REF}" git checkout --detach "${base_branch}" collect_findings "${analyzer_bin}" "${base_output}" git checkout --detach "${current_head}" collect_findings "${analyzer_bin}" "${head_output}" # Compare findings between base and head branches, if there is new content present only in head # then the check is failed and details printed to output. if new_findings="$(comm -13 "${base_output}" "${head_output}")" && [[ -n "${new_findings}" ]]; then echo >&2 "==> Found newly introduced places where (tfdiags.Diagnostics).Append return value is ignored:" echo >&2 "${new_findings}" exit 1 fi echo "==> No newly introduced tfdiags.Diagnostics.Append findings relative to ${base_branch}." exit 0 fi # Script is not running in a pull request context. # Run the analyzer on the entire codebase. if ! go run ./tools/defect-detector/main ./...; then echo "==> Found places where (tfdiags.Diagnostics).Append return value is ignored. Please fix the above issues and try again." exit 1 fi