78 lines
2.3 KiB
Bash
78 lines
2.3 KiB
Bash
|
|
#!/usr/bin/env sh
|
||
|
|
set -eu
|
||
|
|
|
||
|
|
# OpenAPI Breaking Change Detector (Minimal Script).
|
||
|
|
# 1. Compare the PR's openapi.provider.yaml with the version from the 'main' branch.
|
||
|
|
# 2. Detect basic breaking changes (deleted endpoints, changed methods, etc.)
|
||
|
|
# 3. Fail if breaking changes are found without explicit developer acknowledgement.
|
||
|
|
|
||
|
|
# Base branch to compare against
|
||
|
|
BASE_BRANCH="refs/remotes/origin/main"
|
||
|
|
|
||
|
|
die() {
|
||
|
|
echo "ERROR: $*" >&2
|
||
|
|
exit 1
|
||
|
|
}
|
||
|
|
|
||
|
|
# Create a temporary directory for main branch files
|
||
|
|
tmp_base=$(mktemp -d)
|
||
|
|
trap 'rm -rf "$tmp_base"' EXIT
|
||
|
|
|
||
|
|
check_breaking_changes() {
|
||
|
|
module_path="$1"
|
||
|
|
provider_file="spec/$module_path/openapi.provider.yaml"
|
||
|
|
base_file="$tmp_base/$module_path/openapi.provider.yaml"
|
||
|
|
|
||
|
|
[ -f "$provider_file" ] || return 0
|
||
|
|
|
||
|
|
# Try to extract the file from the base branch
|
||
|
|
mkdir -p "$(dirname "$base_file")"
|
||
|
|
if ! git show "$BASE_BRANCH:$provider_file" > "$base_file" 2>/dev/null; then
|
||
|
|
echo "New module or provider file detected: $provider_file. Skipping diff check."
|
||
|
|
return 0
|
||
|
|
fi
|
||
|
|
|
||
|
|
echo "Checking breaking changes for $provider_file against $BASE_BRANCH..."
|
||
|
|
|
||
|
|
# 1. Simple Endpoint/Method deletion check using grep/diff
|
||
|
|
# Extract paths and methods (simple grep for ' /path:' and ' get|post|put|delete:')
|
||
|
|
extract_endpoints() {
|
||
|
|
grep -E "^[[:space:]]{2}/|^[[:space:]]{4}(get|post|put|delete|patch):" "$1" | sed 's/[[:space:]]*//g'
|
||
|
|
}
|
||
|
|
|
||
|
|
old_endpoints=$(mktemp)
|
||
|
|
new_endpoints=$(mktemp)
|
||
|
|
extract_endpoints "$base_file" > "$old_endpoints"
|
||
|
|
extract_endpoints "$provider_file" > "$new_endpoints"
|
||
|
|
|
||
|
|
deleted_count=$(comm -23 "$old_endpoints" "$new_endpoints" | wc -l)
|
||
|
|
|
||
|
|
if [ "$deleted_count" -gt 0 ]; then
|
||
|
|
echo "CRITICAL: Detected deleted endpoints or methods in $provider_file:"
|
||
|
|
comm -23 "$old_endpoints" "$new_endpoints"
|
||
|
|
rm -f "$old_endpoints" "$new_endpoints"
|
||
|
|
return 1
|
||
|
|
fi
|
||
|
|
|
||
|
|
rm -f "$old_endpoints" "$new_endpoints"
|
||
|
|
echo "OK: No obvious breaking changes in $provider_file endpoints."
|
||
|
|
return 0
|
||
|
|
}
|
||
|
|
|
||
|
|
# Find modules
|
||
|
|
errors=0
|
||
|
|
for spec_dir in spec/*; do
|
||
|
|
if [ -d "$spec_dir" ]; then
|
||
|
|
module_name=$(basename "$spec_dir")
|
||
|
|
if ! check_breaking_changes "$module_name"; then
|
||
|
|
errors=$((errors + 1))
|
||
|
|
fi
|
||
|
|
fi
|
||
|
|
done
|
||
|
|
|
||
|
|
if [ "$errors" -gt 0 ]; then
|
||
|
|
die "Breaking change check failed. Please revert changes or mark them as compatible."
|
||
|
|
fi
|
||
|
|
|
||
|
|
echo "All OpenAPI Breaking Change checks passed."
|