mirror of
https://github.com/DeusData/codebase-memory-mcp.git
synced 2026-10-21 05:59:35 +08:00
pr.yml and test-impact-artifact.yml run scripts/ci/test-impact-select.sh, -bundle.sh and -publish.sh as commands, but they were committed 100644 (core.fileMode is false in this clone, so the disk mode never reached the index), and the PR shadow job failed with "Permission denied" (exit 126). tests/test_script_exec_bit_contract.sh reports exactly this; it skipped the scripts locally while they were still untracked. Signed-off-by: Martin Vogel <martin.vogel.tech@gmail.com>
63 lines
2.8 KiB
Bash
Executable File
63 lines
2.8 KiB
Bash
Executable File
#!/usr/bin/env bash
|
|
# test-impact-bundle.sh — fetch the team artifact bundle of one main commit.
|
|
#
|
|
# The bundle (codebase-memory-mcp test-impact publish; src/mcp/test_impact_artifact.h)
|
|
# is published by .github/workflows/test-impact-artifact.yml as the Actions
|
|
# artifact `test-impact-<sha>`. A selection may pass --artifact-verified ONLY
|
|
# for a bundle this script fetched: it accepts nothing but a SUCCESSFUL run of
|
|
# that workflow, in THIS repository, on the main branch, whose head is exactly
|
|
# the requested commit — the provenance the receipt itself can never assert.
|
|
#
|
|
# Usage: scripts/ci/test-impact-bundle.sh --fetch SHA DIR
|
|
# Download the bundle of SHA into DIR (created). Needs GH_TOKEN with
|
|
# actions:read; $GH overrides the gh command, $GITHUB_REPOSITORY the
|
|
# repository (OWNER/NAME).
|
|
# Exit: 0 = fetched and verified · 3 = no admissible bundle for SHA ·
|
|
# 1 = the tooling broke · 2 = usage error.
|
|
set -euo pipefail
|
|
|
|
GH="${GH:-gh}"
|
|
REPO="${GITHUB_REPOSITORY:-DeusData/codebase-memory-mcp}"
|
|
WORKFLOW="test-impact-artifact.yml"
|
|
|
|
usage() { sed -n '2,19p' "$0" | sed 's/^# \{0,1\}//'; }
|
|
|
|
[ $# -eq 3 ] && [ "$1" = "--fetch" ] || { usage >&2; exit 2; }
|
|
SHA="$2"
|
|
DIR="$3"
|
|
case "$SHA" in
|
|
*[!0-9a-f]* | "") echo "test-impact-bundle: not a lowercase commit id: $SHA" >&2; exit 2 ;;
|
|
esac
|
|
[ ${#SHA} -eq 40 ] || [ ${#SHA} -eq 64 ] || { echo "test-impact-bundle: bad id length" >&2; exit 2; }
|
|
|
|
# The newest successful main-branch run of the producer for exactly this head.
|
|
run=$("$GH" api -X GET "repos/$REPO/actions/workflows/$WORKFLOW/runs" \
|
|
-f branch=main -f status=success -f head_sha="$SHA" -f per_page=20 \
|
|
--jq '[.workflow_runs[]
|
|
| select(.head_sha == "'"$SHA"'" and .head_branch == "main"
|
|
and .repository.full_name == "'"$REPO"'"
|
|
and .head_repository.full_name == "'"$REPO"'"
|
|
and (.event == "push" or .event == "schedule"
|
|
or .event == "workflow_dispatch"))]
|
|
| sort_by(.run_started_at) | last | .id // empty') || exit 1
|
|
if [ -z "$run" ]; then
|
|
echo "test-impact-bundle: no successful producer run for $SHA" >&2
|
|
exit 3
|
|
fi
|
|
mkdir -p "$DIR"
|
|
if ! "$GH" run download "$run" --repo "$REPO" --name "test-impact-$SHA" --dir "$DIR"; then
|
|
echo "test-impact-bundle: run $run has no artifact test-impact-$SHA" >&2
|
|
exit 3
|
|
fi
|
|
# The receipt must name the commit the run was for; the engine checks the rest.
|
|
if ! python3 - "$DIR/receipt.json" "$SHA" <<'PY'
|
|
import json, sys
|
|
receipt = json.load(open(sys.argv[1]))
|
|
sys.exit(0 if receipt.get("commit") == sys.argv[2] else 1)
|
|
PY
|
|
then
|
|
echo "test-impact-bundle: the receipt does not name $SHA" >&2
|
|
exit 3
|
|
fi
|
|
echo "test-impact-bundle: run $run, bundle of $SHA in $DIR"
|