#!/usr/bin/env bash # SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Commercial # SPDX-FileCopyrightText: 2025-2026 Christian Galo # # Fail on a function no program reaches, over every package outside status/. # deadcode exits 0 even when it reports, so this script reads its output. # # Run 1 includes the tests' entry points (-test): it must print nothing. # Run 2 leaves them out: what it reports is code only tests reach, and each # such function must be listed in scripts/deadcode-testonly.txt, one # . per line with a reason and an owner (an entry ending # in .* covers a package; # comments and blank lines are ignored). An entry # that no longer reports fails too, so the list cannot go stale. set -euo pipefail cd "$(dirname "$0")/.." module=$(go list -m) mapfile -t pkgs < <(go list -e ./... | grep -v '/status/' || true) status=0 found=$(go tool deadcode -test "${pkgs[@]}") if [[ -n $found ]]; then printf '%s\n' "$found" echo "deadcode: unreachable functions, even counting the tests" >&2 status=1 fi reported=$(go tool deadcode -f '{{range .Funcs}}{{$.Path}}.{{.Name}}{{"\n"}}{{end}}' "${pkgs[@]}" | sed "s|^${module}/||" | grep -v '^$' | sort -u || true) allowed=$(sed -e 's/#.*//' -e 's/[[:space:]]*$//' scripts/deadcode-testonly.txt | grep -v '^$' | sort -u || true) covers() { local entry=$1 fn=$2 if [[ $entry == *.'*' ]]; then [[ $fn == "${entry%'*'}"* ]] else [[ $fn == "$entry" ]] fi } while IFS= read -r fn; do [[ -z $fn ]] && continue listed=0 while IFS= read -r entry; do [[ -z $entry ]] && continue if covers "$entry" "$fn"; then listed=1 break fi done <<<"$allowed" if ((listed == 0)); then echo "deadcode: $fn is reached only by tests and scripts/deadcode-testonly.txt does not list it" >&2 status=1 fi done <<<"$reported" while IFS= read -r entry; do [[ -z $entry ]] && continue hit=0 while IFS= read -r fn; do [[ -z $fn ]] && continue if covers "$entry" "$fn"; then hit=1 break fi done <<<"$reported" if ((hit == 0)); then echo "deadcode: scripts/deadcode-testonly.txt lists $entry, which no longer reports" >&2 status=1 fi done <<<"$allowed" exit "$status"