@@ -22,63 +22,154 @@ jobs:
2222 steps :
2323 - uses : actions/checkout@v4
2424
25- - name : Resolve wolfSSL ref from patch defines
26- id : resolve
25+ - name : Install prerequisites
2726 run : |
28- set -euo pipefail
27+ sudo apt-get update
28+ sudo apt-get install -y jq curl
2929
30- # Find WOLFSSL_PR*_PATCH_APPLIED defines in wolfssl source.
31- defines="$(./scripts/find-wolfssl-pr-patch-defines.sh)"
30+ - name : Find patch defines
31+ id : find_defines
32+ run : |
33+ set -euo pipefail
34+ defines=""
35+ if ! defines="$(./scripts/find-wolfssl-pr-patch-defines.sh)"; then
36+ echo "::warning::find-wolfssl-pr-patch-defines.sh failed; skipping patched CI."
37+ echo "should_run=false" >> "$GITHUB_OUTPUT"
38+ exit 0
39+ fi
3240 if [ -z "$defines" ]; then
3341 echo "::warning::No WOLFSSL_PR*_PATCH_APPLIED defines found; skipping patched CI."
3442 echo "should_run=false" >> "$GITHUB_OUTPUT"
3543 exit 0
3644 fi
3745 echo "Found patch defines:"
3846 printf "%s\n" "$defines"
47+ {
48+ echo "should_run=true"
49+ echo "defines<<EOF"
50+ printf "%s\n" "$defines"
51+ echo "EOF"
52+ } >> "$GITHUB_OUTPUT"
53+
54+ - name : Evaluate PR statuses
55+ id : eval_prs
56+ if : steps.find_defines.outputs.should_run == 'true'
57+ run : |
58+ set -euo pipefail
3959
40- # Find the highest PR number from the defines.
41- pr_number="$(printf "%s\n" "$defines" | sed -E 's/^WOLFSSL_PR([0-9]+)_PATCH_APPLIED$/\1/' | sort -n | tail -1)"
42- if [ -z "$pr_number" ]; then
43- echo "::warning::Failed to derive PR number from patch defines; skipping patched CI."
44- echo "should_run=false" >> "$GITHUB_OUTPUT"
45- exit 0
46- fi
47- echo "Highest PR number from defines: $pr_number"
60+ defines="${{ steps.find_defines.outputs.defines }}"
61+ merged_all=true
62+ open_count=0
63+ open_repo=""
64+ open_ref=""
65+ open_pr=""
66+ has_invalid=false
4867
49- # Check PR status via GitHub API.
50- pr_json="$(curl -fsSL "https://api.github.com/repos/wolfSSL/wolfssl/pulls/$pr_number" || true)"
51- if [ -z "$pr_json" ]; then
52- echo "::warning::Unable to fetch PR #$pr_number from GitHub API; skipping patched CI."
53- echo "should_run=false" >> "$GITHUB_OUTPUT"
54- exit 0
55- fi
56- echo "Fetched PR #$pr_number info from GitHub API."
68+ echo "Evaluating patch defines:"
69+ printf "%s\n" "$defines"
5770
58- state="$(printf "%s" "$pr_json" | jq -r '.state // empty')"
59- merged_at="$(printf "%s" "$pr_json" | jq -r '.merged_at // empty')"
60- head_repo="$(printf "%s" "$pr_json" | jq -r '.head.repo.full_name // empty')"
61- head_ref="$(printf "%s" "$pr_json" | jq -r '.head.ref // empty')"
71+ while read -r define; do
72+ define="$(printf "%s" "$define" | tr -d '\r' | xargs)"
73+ [ -z "$define" ] && continue
74+ pr_number="$(printf "%s" "$define" | sed -E 's/^WOLFSSL_PR([0-9]+)_PATCH_APPLIED$/\1/')"
75+ if [ -z "$pr_number" ] || [ "$pr_number" = "$define" ]; then
76+ echo "::warning::Failed to derive PR number from define $define; skipping patched CI."
77+ echo "should_run=false" >> "$GITHUB_OUTPUT"
78+ exit 0
79+ fi
80+
81+ fork_ref_status=""
82+ if ! fork_ref_status="$(./scripts/find-pr-fork-branch.sh "$pr_number" --repo wolfSSL/wolfssl)"; then
83+ echo "::warning::find-pr-fork-branch.sh failed for PR #$pr_number; skipping patched CI."
84+ echo "should_run=false" >> "$GITHUB_OUTPUT"
85+ exit 0
86+ fi
87+ echo "PR #$pr_number raw status: [$fork_ref_status]"
88+ if [ -z "$fork_ref_status" ]; then
89+ echo "::warning::Unable to resolve PR #$pr_number fork/branch; skipping patched CI."
90+ echo "should_run=false" >> "$GITHUB_OUTPUT"
91+ exit 0
92+ fi
93+
94+ fork_ref="$(printf "%s" "$fork_ref_status" | sed -E 's/ \\([^)]*\\)$//')"
95+ pr_status_raw="$(printf "%s" "$fork_ref_status" | sed -E 's/^.* \\(([^)]*)\\)$/\\1/')"
96+ pr_status="$(printf "%s" "$pr_status_raw" | tr -d '\r' | tr '[:upper:]' '[:lower:]' | xargs)"
97+ echo "PR #$pr_number parsed status: [$pr_status]"
98+
99+ head_repo="${fork_ref%/*}"
100+ head_ref="${fork_ref#*/}"
101+ if [ -z "$head_repo" ] || [ -z "$head_ref" ] || [ "$head_repo" = "$head_ref" ]; then
102+ echo "::warning::Malformed fork/branch from helper script; skipping patched CI."
103+ echo "should_run=false" >> "$GITHUB_OUTPUT"
104+ exit 0
105+ fi
106+
107+ case "$pr_status" in
108+ merged|closed)
109+ if [ "$pr_status" = "closed" ]; then
110+ echo "::warning::PR #$pr_number reports status 'closed'; treating as merged since a patch define exists."
111+ fi
112+ continue
113+ ;;
114+ open)
115+ merged_all=false
116+ open_count=$((open_count + 1))
117+ open_repo="$head_repo"
118+ open_ref="$head_ref"
119+ open_pr="$pr_number"
120+ ;;
121+ *)
122+ echo "::warning::Unknown PR status '$pr_status' for #$pr_number (raw: $fork_ref_status); skipping patched CI."
123+ merged_all=false
124+ has_invalid=true
125+ ;;
126+ esac
127+ done <<EOF
128+ $defines
129+ EOF
130+
131+ {
132+ echo "MERGED_ALL=$merged_all"
133+ echo "OPEN_COUNT=$open_count"
134+ echo "OPEN_REPO=$open_repo"
135+ echo "OPEN_REF=$open_ref"
136+ echo "OPEN_PR=$open_pr"
137+ echo "HAS_INVALID=$has_invalid"
138+ } >> "$GITHUB_ENV"
139+
140+ echo "should_run=true" >> "$GITHUB_OUTPUT"
62141
63- if [ -n "$merged_at" ]; then
64- echo "PR #$pr_number is merged; using wolfSSL master branch."
142+ - name : Resolve wolfSSL ref from patch defines
143+ id : resolve
144+ if : steps.find_defines.outputs.should_run == 'true' && steps.eval_prs.outputs.should_run == 'true'
145+ run : |
146+ set -euo pipefail
147+
148+ if [ "${MERGED_ALL}" = "true" ]; then
149+ echo "All PRs are merged; using wolfSSL master branch."
65150 echo "should_run=true" >> "$GITHUB_OUTPUT"
66151 echo "wolfssl_repo=wolfSSL/wolfssl" >> "$GITHUB_OUTPUT"
67152 echo "wolfssl_ref=master" >> "$GITHUB_OUTPUT"
68- echo "pr_number=$pr_number" >> "$GITHUB_OUTPUT"
153+ echo "pr_number=all" >> "$GITHUB_OUTPUT"
154+ exit 0
155+ fi
156+
157+ if [ "${HAS_INVALID}" = "true" ]; then
158+ echo "::warning::One or more PRs are not merged or open; skipping patched CI."
159+ echo "should_run=false" >> "$GITHUB_OUTPUT"
69160 exit 0
70161 fi
71162
72- if [ "$state" = "open" ] && [ -n "$head_repo" ] && [ -n "$head_ref" ]; then
163+ if [ "${OPEN_COUNT}" -eq 1 ]; then
73164 echo "should_run=true" >> "$GITHUB_OUTPUT"
74- echo "wolfssl_repo=$head_repo " >> "$GITHUB_OUTPUT"
75- echo "wolfssl_ref=$head_ref " >> "$GITHUB_OUTPUT"
76- echo "pr_number=$pr_number " >> "$GITHUB_OUTPUT"
77- echo "PR #$pr_number is open; using branch $head_ref from repo $head_repo ."
165+ echo "wolfssl_repo=${OPEN_REPO} " >> "$GITHUB_OUTPUT"
166+ echo "wolfssl_ref=${OPEN_REF} " >> "$GITHUB_OUTPUT"
167+ echo "pr_number=${OPEN_PR} " >> "$GITHUB_OUTPUT"
168+ echo "Exactly one PR is open (#${OPEN_PR}) ; using branch ${OPEN_REF} from repo ${OPEN_REPO} ."
78169 exit 0
79170 fi
80171
81- echo "::warning::PR #$pr_number is not merged or has no accessible branch ; skipping patched CI."
172+ echo "::warning::Multiple open PRs found ; skipping patched CI."
82173 echo "should_run=false" >> "$GITHUB_OUTPUT"
83174
84175 patched_jni_build :
@@ -126,10 +217,9 @@ jobs:
126217 run : |
127218 echo "LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$GITHUB_WORKSPACE/build-dir/lib" >> "$GITHUB_ENV"
128219
129- - name : Build and test JNI library with all patches
220+ - name : Build and test JNI library with all patches enabled
130221 run : |
131- make all-patched PREFIX=$GITHUB_WORKSPACE/build-dir
132- make check
222+ make build check PREFIX=$GITHUB_WORKSPACE/build-dir ENABLE_PATCHES=1
133223
134224 - name : Show logs on failure
135225 if : failure() || cancelled()
0 commit comments