Files
moby/hack/validate/module-replace
T
Paweł Gronowski 9e5299c63e api: Generate Swagger compatibility output from OpenAPI
Add a Go converter in a separate tooling module and reintroduce
swagger.yaml as generated Swagger 2.0 output. Preserve schema property
order, examples, and generator extensions, and reject unsupported
constructs. Use the union of response media types for Swagger's
operation-wide produces lists.

Leave historical versioned specifications and generated Go models
unchanged.

Signed-off-by: Paweł Gronowski <pawel.gronowski@docker.com>
2026-10-29 11:34:26 +01:00

104 lines
3.3 KiB
Bash
Executable File

#!/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/*_test.go' \
':(exclude)api/**/*_test.go' \
':(exclude)api/Dockerfile' \
':(exclude)api/README.md' \
':(exclude)api/swagger.yaml' \
':(exclude)api/openapi.yaml' \
':(exclude)api/docs/' \
| filter_diff \
|| true
)
client_diff=$(
validate_diff --diff-filter=ACMR -U0 -- \
'client/' \
':(exclude)client/*_test.go' \
':(exclude)client/**/*_test.go' \
| filter_diff \
|| true
)
has_errors=0
echo "================================================"
echo "go.mod:"
cat go.mod
echo "================================================"
# reads stdin and returns 1 or 0 if it only contains changes related to the
# provided module
# 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_changes_module() {
local module="$1"
input=$(cat | sed '/^[-+]$/d') # strip empty lines
# 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_changes_module "github.com/moby/moby/api" <<< "${client_diff}"; then
echo >&2 "✓ This seems to only change the module github.com/moby/moby/api revision"
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"