Files
dingtalk-workspace-cli/scripts/policy/check-coverage-gate.sh
T
修雨 6c192c2bf4 Merge remote-tracking branch 'origin/main' into codex/fix-pr-592-merge-gates
# Conflicts:
#	internal/cli/schema_agent_metadata/index.json
#	internal/cli/schema_agent_metadata_audit.json
#	internal/cli/schema_catalog.json
2026-07-15 23:10:37 +08:00

109 lines
2.8 KiB
Bash
Executable File

#!/bin/sh
set -eu
ROOT="$(CDPATH= cd -- "$(dirname -- "$0")/../.." && pwd)"
BASE_REF=""
OVERALL_PROFILE="coverage.txt"
ADDITIONAL_PROFILE="${COVERAGE_ADDITIONAL_PROFILE:-}"
BASELINE_PROFILE="coverage-base.txt"
DIFF_PROFILE="coverage-policy.txt"
TARGET="${COVERAGE_TARGET:-80}"
OVERALL_TOLERANCE="${COVERAGE_OVERALL_TOLERANCE:-0.1}"
ENFORCE_OVERALL="${COVERAGE_ENFORCE_OVERALL:-false}"
CHANGED_ONLY="false"
SCOPE_BUILDABLE="false"
usage() {
printf '%s\n' "usage: $0 --base-ref <ref> [--changed-only] [--scope-buildable] [--overall-profile <file>] [--additional-profile <file>] [--baseline-profile <file>] [--diff-profile <file>]" >&2
}
while [ "$#" -gt 0 ]; do
case "$1" in
--base-ref)
[ "$#" -ge 2 ] || { usage; exit 2; }
BASE_REF="$2"
shift 2
;;
--overall-profile)
[ "$#" -ge 2 ] || { usage; exit 2; }
OVERALL_PROFILE="$2"
shift 2
;;
--additional-profile)
[ "$#" -ge 2 ] || { usage; exit 2; }
ADDITIONAL_PROFILE="$2"
shift 2
;;
--baseline-profile)
[ "$#" -ge 2 ] || { usage; exit 2; }
BASELINE_PROFILE="$2"
shift 2
;;
--diff-profile)
[ "$#" -ge 2 ] || { usage; exit 2; }
DIFF_PROFILE="$2"
shift 2
;;
--changed-only)
CHANGED_ONLY="true"
shift
;;
--scope-buildable)
SCOPE_BUILDABLE="true"
shift
;;
*)
printf 'error: unknown argument: %s\n' "$1" >&2
usage
exit 2
;;
esac
done
[ -n "$BASE_REF" ] || { usage; exit 2; }
cd "$ROOT"
. "$ROOT/scripts/policy/policy-runtime.sh"
policy_prepare_runtime "$ROOT"
git rev-parse --verify --quiet "${BASE_REF}^{commit}" >/dev/null || {
printf 'error: coverage base ref is not available locally: %s\n' "$BASE_REF" >&2
exit 2
}
TMP_ROOT="$(policy_runtime_mktemp_dir dws-coverage-gate)"
CHECKER="$TMP_ROOT/coverage-gate"
trap 'rm -rf "$TMP_ROOT"' EXIT HUP INT TERM
go build -o "$CHECKER" ./scripts/policy/coverage-gate
module="$(go list -m -f '{{.Path}}')"
set -- "$CHECKER" \
--diff-profile "$DIFF_PROFILE" \
--base-ref "$BASE_REF" \
--module "$module" \
--overall-tolerance "$OVERALL_TOLERANCE" \
--target "$TARGET" \
--enforce-overall-target="$ENFORCE_OVERALL"
if [ "$CHANGED_ONLY" = "true" ]; then
set -- "$@" --changed-only
else
baseline="$(go tool cover -func="$BASELINE_PROFILE" | awk '/^total:/ { gsub(/%/, "", $3); print $3 }')"
[ -n "$baseline" ] || {
printf 'error: cannot parse authoritative coverage from %s\n' "$BASELINE_PROFILE" >&2
exit 2
}
set -- "$@" \
--overall-profile "$OVERALL_PROFILE" \
--diff-profile "$OVERALL_PROFILE" \
--baseline-overall "$baseline"
if [ -n "$ADDITIONAL_PROFILE" ]; then
set -- "$@" \
--overall-profile "$ADDITIONAL_PROFILE" \
--diff-profile "$ADDITIONAL_PROFILE"
fi
fi
if [ "$SCOPE_BUILDABLE" = "true" ]; then
set -- "$@" --scope-buildable
fi
"$@"