| #!/usr/bin/env bash | |
| # Copyright IBM Corp. 2014, 2026 | |
| # SPDX-License-Identifier: BUSL-1.1 | |
| set -euo pipefail | |
| # Check goimports | |
| echo "==> Checking the code complies with goimports requirements..." | |
| # We only require goimports to have been run on files that were changed | |
| # relative to the main branch, so that we can gradually create more consistency | |
| # rather than bulk-changing everything at once. | |
| declare -a target_files | |
| # "readarray" will return an "unbound variable" error if there isn't already | |
| # at least one element in the target array. "readarray" will overwrite this | |
| # item, though. | |
| target_files[0]="" | |
| base_branch="origin/main" | |
| # HACK: If we seem to be running inside a GitHub Actions pull request check | |
| # then we'll use the PR's target branch from this variable instead. | |
| if [[ -n "${GITHUB_BASE_REF:-}" ]]; then | |
| base_branch="origin/$GITHUB_BASE_REF" | |
| fi | |
| # FIXME: "readarray' is a Bash 4 feature, which means that currently this script | |
| # can't work on macOS which (at the time of writing this) ships with only Bash 3. | |
| # We can probably replace this with something more clunky using an overridden | |
| # "IFS" environment variable, but the primary place we want to run this right | |
| # now is in our "quick checks" workflow and that _does_ have a reasonably | |
| # modern version of Bash. | |
| readarray -t target_files < <(git diff --name-only ${base_branch} --diff-filter=MA | grep "\.go" | grep -v ".pb.go" | grep -v ".go-version") | |
| # NOTE: The above intentionally excludes .pb.go files because those are | |
| # generated by a tool (protoc-gen-go) which itself doesn't produce | |
| # style-compliant imports. | |
| if [[ "${#target_files[@]}" -eq 0 ]]; then | |
| echo "No files have changed relative to branch ${base_branch}, so there's nothing to check!" | |
| exit 0 | |
| fi | |
| declare -a incorrect_files | |
| # Array must have at least one item before we can append to it. Code below must | |
| # work around this extra empty-string element at the beginning of the array. | |
| incorrect_files[0]="" | |
| for filename in "${target_files[@]}"; do | |
| if [[ -z "$filename" ]]; then | |
| continue | |
| fi | |
| output=$(go tool golang.org/x/tools/cmd/goimports -l "${filename}") | |
| if [[ $? -ne 0 ]]; then | |
| echo >&2 goimports failed for "$filename" | |
| exit 1 | |
| fi | |
| if [[ -n "$output" ]]; then | |
| incorrect_files+=("$filename") | |
| fi | |
| done | |
| if [[ "${#incorrect_files[@]}" -gt 1 ]]; then | |
| echo >&2 'The following files have import statements that disagree with "goimports"': | |
| for filename in "${incorrect_files[@]}"; do | |
| if [[ -z "$filename" ]]; then | |
| continue | |
| fi | |
| echo >&2 ' - ' "${filename}" | |
| done | |
| echo >&2 'Use `go tool golang.org/x/tools/cmd/goimports -w -l` on each of these files to update these files.' | |
| exit 1 | |
| fi | |
| echo 'All of the changed files look good!' | |
| exit 0 |