#!/usr/bin/env bash set -e SCRIPTDIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" source "${SCRIPTDIR}/.validate" # Leaves only actual changes, not the diff header filter_diff() { sed '1,4d' | grep -E '^[+-]' | grep -Ev '^(\+\+\+|\-\-\-)' } api_diff=$( validate_diff --diff-filter=ACMR -U0 -- \ 'api/' \ ':(exclude)api/README.md' \ ':(exclude)api/swagger.yaml' \ ':(exclude)api/docs/' \ | filter_diff \ || true ) client_diff=$(validate_diff --diff-filter=ACMR -U0 -- 'client/' | filter_diff || true) has_errors=0 echo "================================================" echo "go.mod:" cat go.mod echo "================================================" # reads stdin and returns 1 or 0 if the replace rule for the module is present # example input: # - github.com/moby/moby/api v1.52.0 # + github.com/moby/moby/api v1.52.1-0.20251217102041-b8093b76fb43 # - # -replace github.com/moby/moby/api => ../api # +github.com/moby/moby/api v1.52.1-0.20251217102041-b8093b76fb43 h1:CTVB9ByfoOULdpH0GiDWwHK3B1jxwjoWtHiEGia1nRc= # +github.com/moby/moby/api v1.52.1-0.20251217102041-b8093b76fb43/go.mod h1:8mb+ReTlisw4pS6BRzCMts5M49W5M7bKt1cJy/YbAqc= only_removes_replace_rule_for_module() { local module="$1" input=$(cat | sed '/^[-+]$/d') # strip empty lines if ! grep -qE "^-replace ${module} => " <<< "${input}"; then return 1 fi # Check if ALL lines contain the module string # The grep command checks if there's NO match for the module string, and # then we negate the results if grep -vqF "${module}" <<< "${input}"; then return 1 fi return 0 } echo >&2 "================================================" echo >&2 "api diff:" echo >&2 "${api_diff}" echo >&2 "================================================" # Check if changes to ./api require a replace rule in go.mod if [ -n "${TEST_FORCE_VALIDATE:-}" ] || [ -n "${api_diff}" ]; then echo "Detected changes in ./api directory, checking for replace rule..." if ! go list -mod=readonly -m -json github.com/moby/moby/api | jq -e '.Replace'; then echo >&2 "ERROR: Changes detected in ./api but go.mod is missing a replace rule for github.com/moby/moby/api" echo >&2 "Please run ./hack/vendor.sh replace" has_errors=1 else echo "✓ Found replace rule for github.com/moby/moby/api" fi fi echo >&2 "================================================" echo >&2 "client diff:" echo >&2 "${client_diff}" echo >&2 "================================================" # Check if changes to ./client require a replace rule in go.mod if [ -n "${TEST_FORCE_VALIDATE:-}" ] || [ -n "${client_diff}" ]; then echo "Detected changes in ./client directory, checking for replace rule..." if only_removes_replace_rule_for_module "github.com/moby/moby/api" <<< "${client_diff}"; then echo >&2 "✓ This seems to only remove the replace rule for github.com/moby/moby/api" elif ! go list -mod=readonly -m -json github.com/moby/moby/client | jq -e '.Replace'; then echo >&2 "ERROR: Changes detected in ./client but go.mod is missing a replace rule for github.com/moby/moby/client" echo >&2 "Please run ./hack/vendor.sh replace" has_errors=1 else echo "✓ Found replace rule for github.com/moby/moby/client" fi fi if [ $has_errors -eq 1 ]; then exit 1 fi echo "PASS: Module replace rules are correct"