Merge commit 'cc95cfbf' into docs/sboz-stable-identities
This commit is contained in:
@@ -136,9 +136,10 @@ chmod +x "$work/fakebin/bash"
|
||||
# utilbin carries only the utilities the runner itself needs, and no nix, so
|
||||
# the fake bash is the only candidate and the nix fallback is absent. Linked
|
||||
# one by one rather than taking /usr/bin:/bin, which on NixOS hold only `env`
|
||||
# and `sh` -- the runner died on `dirname` there, exit 1 instead of 3.
|
||||
# and `sh` -- the runner died on `dirname` there, exit 1 instead of 3. `head`
|
||||
# and `env` are for 5b's 5.1 control, which runs past the version check.
|
||||
mkdir -p "$work/utilbin"
|
||||
for tool in dirname; do
|
||||
for tool in dirname head env; do
|
||||
ln -sf "$(command -v "$tool")" "$work/utilbin/$tool"
|
||||
done
|
||||
env PATH="$work/fakebin:$work/utilbin" HOME="$HOME" \
|
||||
@@ -154,7 +155,7 @@ for v in "5 0:3:a bash 5.0 with no nix is exit 3, not 5.x" \
|
||||
printf '#!/bin/sh\ncase "$*" in *BASH_VERSINFO*) echo %s; exit 0 ;; esac\nexit 0\n' \
|
||||
"${v%%:*}" > "$work/fakebin/bash"
|
||||
want="${v#*:}"; name="${want#*:}"; want="${want%%:*}"
|
||||
env PATH="$work/fakebin:/usr/bin:/bin" HOME="$HOME" \
|
||||
env PATH="$work/fakebin:$work/utilbin" HOME="$HOME" \
|
||||
"${BASH:-bash}" "$d/checkers.sh" any > "$work/out" 2>&1
|
||||
got=$?
|
||||
[ "$got" = "$want" ] && ok "$name" || bad "$name" "exit $got, wanted $want"
|
||||
|
||||
+9
-2
@@ -18,6 +18,7 @@ exit 2 the head moved during the wait, or is not --expect
|
||||
exit 3 timed out with checks still running, or mergeability still UNKNOWN,
|
||||
or still BLOCKED with every registered check green
|
||||
exit 4 usage or environment error
|
||||
exit 5 the PR is MERGED or CLOSED, so there is nothing left to wait for
|
||||
EOF
|
||||
exit 4
|
||||
}
|
||||
@@ -51,10 +52,10 @@ fetch() {
|
||||
return
|
||||
fi
|
||||
if command -v gh >/dev/null 2>&1 && gh --version 2>/dev/null | grep -q '^gh version'; then
|
||||
gh pr view "$PR" --json headRefOid,mergeable,mergeStateStatus,statusCheckRollup
|
||||
gh pr view "$PR" --json state,headRefOid,mergeable,mergeStateStatus,statusCheckRollup
|
||||
else
|
||||
nix shell nixpkgs#gh --command gh pr view "$PR" \
|
||||
--json headRefOid,mergeable,mergeStateStatus,statusCheckRollup
|
||||
--json state,headRefOid,mergeable,mergeStateStatus,statusCheckRollup
|
||||
fi
|
||||
}
|
||||
|
||||
@@ -80,6 +81,12 @@ while :; do
|
||||
echo "pr-watch: head moved $pinned -> $head during the wait" >&2
|
||||
exit 2
|
||||
fi
|
||||
# A PR no longer open ends the wait (improvise-1qaa), but only after the head
|
||||
# checks: a merge at a head never seen is PR #67 again (improvise-24lz).
|
||||
pr_state="$(printf '%s' "$json" | jqf '.state')"
|
||||
case "$pr_state" in
|
||||
MERGED|CLOSED) echo "pr-watch: PR $PR is $pr_state, nothing to wait for" >&2; exit 5 ;;
|
||||
esac
|
||||
|
||||
# total>0 AND nothing still running. "0 pending" alone reads identically for
|
||||
# "all finished" and "none registered yet", which is how this exited instantly
|
||||
|
||||
@@ -153,6 +153,42 @@ run_case "the needs-gap before the required check registers is not a failure" 0
|
||||
gap_state "$work/gap-never" last.json MERGEABLE BLOCKED "$not_yet"
|
||||
run_case "a required check that never registers is a timeout" 3 "$work/gap-never"
|
||||
|
||||
# improvise-9pfs. Here a failed REQUIRED check reports MERGEABLE/BLOCKED, not
|
||||
# UNSTABLE. The table above holds only green rollups, so this red was unpinned.
|
||||
gap_state "$work/blocked-red" last.json MERGEABLE BLOCKED \
|
||||
'map(if .name == "Test and lint (host)" then .conclusion = "FAILURE" else . end)'
|
||||
run_case "a failed required check under MERGEABLE/BLOCKED fails without waiting" 1 \
|
||||
"$work/blocked-red" --timeout 0
|
||||
|
||||
# improvise-1qaa/29w2. Each ended fixture is a shape GitHub returned live (#189,
|
||||
# #74, #46); the last is the one a waiting loop would sit on.
|
||||
# $1 dir, $2 file, $3 head, $4 state, $5 mergeable, $6 mergeStateStatus
|
||||
ended() {
|
||||
mkdir -p "$1"
|
||||
printf '{"headRefOid":"%s","state":"%s","mergeable":"%s","mergeStateStatus":"%s","statusCheckRollup":%s}\n' \
|
||||
"$3" "$4" "$5" "$6" "$green_rollup" > "$1/$2"
|
||||
}
|
||||
for shape in "MERGED UNKNOWN UNKNOWN" "CLOSED CONFLICTING DIRTY" "CLOSED MERGEABLE BLOCKED"; do
|
||||
set -- $shape
|
||||
d="$work/ended-$1-$3"
|
||||
ended "$d" last.json aaaaaaaaaaaa "$1" "$2" "$3"
|
||||
run_case "a $1 PR at $2/$3 ends the watch as no longer open" 5 "$d" --timeout 5
|
||||
polls="$(cat "$d/.poll" 2>/dev/null || echo 0)"
|
||||
[ "$polls" = 1 ] && ok "a $1 PR at $2/$3 is read once, not waited on" \
|
||||
|| bad "a $1 PR at $2/$3 is read once, not waited on (polls)" "$polls" 1
|
||||
done
|
||||
|
||||
# improvise-24lz. A merge at a head the watcher never saw is the PR #67 hazard,
|
||||
# so a moved head outranks a closed PR, with or without --expect.
|
||||
state "$work/moved-merged" 1.json '"MERGEABLE"' '"UNSTABLE"' \
|
||||
'[{"name":"build","status":"IN_PROGRESS","conclusion":""}]'
|
||||
ended "$work/moved-merged" last.json bbbbbbbbbbbb MERGED UNKNOWN UNKNOWN
|
||||
run_case "a head that moves and then merges is not reported as merged" 2 \
|
||||
"$work/moved-merged" --timeout 60
|
||||
ended "$work/merged-elsewhere" last.json bbbbbbbbbbbb MERGED UNKNOWN UNKNOWN
|
||||
run_case "a PR merged at a head other than --expect is a head mismatch" 2 \
|
||||
"$work/merged-elsewhere" --expect aaaa --timeout 5
|
||||
|
||||
# improvise-h3ni. The head must stay pinned across the UNKNOWN wait, or a
|
||||
# verdict about b is reported as a verdict about a.
|
||||
state "$work/unk-moved" 1.json '"UNKNOWN"' '"UNKNOWN"' "$green_rollup"
|
||||
|
||||
Reference in New Issue
Block a user