Skip to content

Commit 025a3d2

Browse files
committed
refactor(ci): expand submodule update workflow to handle all 6 conformance test repos (#14990)
- Rename workflow: update_compat_table.yml → update_submodules.yml - Extract hardcoded SHAs in clone-parallel.sh into variables at the top - Expand workflow to automatically update all 6 submodules: - test262 (tc39/test262) - babel (babel/babel) - TypeScript (microsoft/TypeScript) - prettier (prettier/prettier) - acorn-test262 (oxc-project/acorn-test262) - node-compat-table (williamkapke/node-compat-table) - Workflow now fetches latest SHAs from all repos, compares with current, and updates clone-parallel.sh - Creates single PR with summary of all updated submodules 🤖 Generated with [Claude Code](https://claude.com/claude-code)
1 parent 384ea3c commit 025a3d2

File tree

3 files changed

+250
-123
lines changed

3 files changed

+250
-123
lines changed

.github/scripts/clone-parallel.sh

Lines changed: 16 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,20 @@
11
#!/bin/bash
22

33
# Clone submodules in parallel for faster setup
4-
# Usage: ./clone-parallel.sh [test262] [babel] [typescript] [prettier] [acorn-test262]
4+
# Usage: ./clone-parallel.sh [test262] [babel] [typescript] [prettier] [acorn-test262] [node-compat-table]
55
# Arguments: "true" or "false" for each submodule
66

77
set -euo pipefail
88

9-
# Default values
9+
# Submodule commit SHAs - updated automatically by .github/workflows/update_submodules.yml
10+
TEST262_SHA="baa48a416c9e9abd698a9010378eccf3d1f4ed1e"
11+
BABEL_SHA="41d96516130ff48f16eca9f387996c0272125f16"
12+
TYPESCRIPT_SHA="261630d650c0c961860187bebc86e25c3707c05d"
13+
PRETTIER_SHA="7584432401a47a26943dd7a9ca9a8e032ead7285"
14+
ACORN_TEST262_SHA="090bba4ab63458850b294f55b17f2ca0ee982062"
15+
NODE_COMPAT_TABLE_SHA="ed0d6ba55790519d9ad3f6f776ca2cd303cc1e0b"
16+
17+
# Default values for which submodules to clone
1018
TEST262=${1:-true}
1119
BABEL=${2:-true}
1220
TYPESCRIPT=${3:-true}
@@ -69,12 +77,12 @@ clone_repo() {
6977
echo "Cloning submodules in parallel..."
7078

7179
# Start all clone operations in parallel
72-
clone_repo "$TEST262" "tc39/test262" "tasks/coverage/test262" "baa48a416c9e9abd698a9010378eccf3d1f4ed1e" "test262"
73-
clone_repo "$BABEL" "babel/babel" "tasks/coverage/babel" "41d96516130ff48f16eca9f387996c0272125f16" "babel"
74-
clone_repo "$TYPESCRIPT" "microsoft/TypeScript" "tasks/coverage/typescript" "261630d650c0c961860187bebc86e25c3707c05d" "typescript"
75-
clone_repo "$PRETTIER" "prettier/prettier" "tasks/prettier_conformance/prettier" "7584432401a47a26943dd7a9ca9a8e032ead7285" "prettier"
76-
clone_repo "$ACORN_TEST262" "oxc-project/acorn-test262" "tasks/coverage/acorn-test262" "090bba4ab63458850b294f55b17f2ca0ee982062" "acorn-test262"
77-
clone_repo "$NODE_COMPAT_TABLE" "williamkapke/node-compat-table" "tasks/coverage/node-compat-table" "ed0d6ba55790519d9ad3f6f776ca2cd303cc1e0b" "node-compat-table"
80+
clone_repo "$TEST262" "tc39/test262" "tasks/coverage/test262" "$TEST262_SHA" "test262"
81+
clone_repo "$BABEL" "babel/babel" "tasks/coverage/babel" "$BABEL_SHA" "babel"
82+
clone_repo "$TYPESCRIPT" "microsoft/TypeScript" "tasks/coverage/typescript" "$TYPESCRIPT_SHA" "typescript"
83+
clone_repo "$PRETTIER" "prettier/prettier" "tasks/prettier_conformance/prettier" "$PRETTIER_SHA" "prettier"
84+
clone_repo "$ACORN_TEST262" "oxc-project/acorn-test262" "tasks/coverage/acorn-test262" "$ACORN_TEST262_SHA" "acorn-test262"
85+
clone_repo "$NODE_COMPAT_TABLE" "williamkapke/node-compat-table" "tasks/coverage/node-compat-table" "$NODE_COMPAT_TABLE_SHA" "node-compat-table"
7886

7987
# Wait for all background processes to complete
8088
echo "Waiting for all clone operations to complete..."

.github/workflows/update_compat_table.yml

Lines changed: 0 additions & 115 deletions
This file was deleted.
Lines changed: 234 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,234 @@
1+
name: Update Submodules
2+
3+
permissions: {}
4+
5+
on:
6+
schedule:
7+
# Run weekly on Monday at 00:00 UTC
8+
- cron: "0 0 * * 1"
9+
workflow_dispatch: # Allow manual trigger
10+
11+
concurrency:
12+
group: ${{ github.workflow }}-${{ github.ref_name }}
13+
cancel-in-progress: true
14+
15+
jobs:
16+
update:
17+
name: Update submodule SHAs
18+
runs-on: ubuntu-latest
19+
permissions:
20+
contents: write
21+
pull-requests: write
22+
steps:
23+
- uses: taiki-e/checkout-action@b13d20b7cda4e2f325ef19895128f7ff735c0b3d # v1.3.1
24+
25+
- uses: oxc-project/setup-node@fdbf0dfd334c4e6d56ceeb77d91c76339c2a0885 # v1.0.4
26+
- uses: oxc-project/setup-rust@1ff88fdaffd6ae35c0fb32ccc159340b37d0beac # v1.0.7
27+
with:
28+
cache-key: conformance
29+
tools: just,dprint,cargo-shear@1.3.0
30+
components: rustfmt
31+
32+
- name: Get latest SHAs for all submodules
33+
id: get-shas
34+
run: |
35+
# Define all submodules with their repo URLs
36+
declare -A REPOS=(
37+
["TEST262"]="tc39/test262"
38+
["BABEL"]="babel/babel"
39+
["TYPESCRIPT"]="microsoft/TypeScript"
40+
["PRETTIER"]="prettier/prettier"
41+
["ACORN_TEST262"]="oxc-project/acorn-test262"
42+
["NODE_COMPAT_TABLE"]="williamkapke/node-compat-table"
43+
)
44+
45+
# Fetch latest SHA for each repo using GitHub API
46+
for name in "${!REPOS[@]}"; do
47+
repo="${REPOS[$name]}"
48+
echo "Fetching latest SHA for $repo..."
49+
50+
# Use GitHub API to get latest commit SHA (much faster than cloning)
51+
sha=$(curl -s "https://api.github.com/repos/$repo/commits/HEAD" | jq -r .sha)
52+
if [ -z "$sha" ] || [ "$sha" = "null" ]; then
53+
echo "Error: Failed to fetch valid SHA for $repo"
54+
exit 1
55+
fi
56+
57+
# Output the SHA
58+
echo "${name}_LATEST=$sha" >> $GITHUB_OUTPUT
59+
echo "$name latest SHA: $sha"
60+
done
61+
62+
- name: Get current SHAs from clone-parallel.sh
63+
id: current-shas
64+
run: |
65+
# Extract current SHAs from the script
66+
TEST262_CURRENT=$(grep '^TEST262_SHA=' .github/scripts/clone-parallel.sh | cut -d'"' -f2)
67+
BABEL_CURRENT=$(grep '^BABEL_SHA=' .github/scripts/clone-parallel.sh | cut -d'"' -f2)
68+
TYPESCRIPT_CURRENT=$(grep '^TYPESCRIPT_SHA=' .github/scripts/clone-parallel.sh | cut -d'"' -f2)
69+
PRETTIER_CURRENT=$(grep '^PRETTIER_SHA=' .github/scripts/clone-parallel.sh | cut -d'"' -f2)
70+
ACORN_TEST262_CURRENT=$(grep '^ACORN_TEST262_SHA=' .github/scripts/clone-parallel.sh | cut -d'"' -f2)
71+
NODE_COMPAT_TABLE_CURRENT=$(grep '^NODE_COMPAT_TABLE_SHA=' .github/scripts/clone-parallel.sh | cut -d'"' -f2)
72+
73+
echo "TEST262_CURRENT=$TEST262_CURRENT" >> $GITHUB_OUTPUT
74+
echo "BABEL_CURRENT=$BABEL_CURRENT" >> $GITHUB_OUTPUT
75+
echo "TYPESCRIPT_CURRENT=$TYPESCRIPT_CURRENT" >> $GITHUB_OUTPUT
76+
echo "PRETTIER_CURRENT=$PRETTIER_CURRENT" >> $GITHUB_OUTPUT
77+
echo "ACORN_TEST262_CURRENT=$ACORN_TEST262_CURRENT" >> $GITHUB_OUTPUT
78+
echo "NODE_COMPAT_TABLE_CURRENT=$NODE_COMPAT_TABLE_CURRENT" >> $GITHUB_OUTPUT
79+
80+
echo "Current SHAs:"
81+
echo " TEST262: $TEST262_CURRENT"
82+
echo " BABEL: $BABEL_CURRENT"
83+
echo " TYPESCRIPT: $TYPESCRIPT_CURRENT"
84+
echo " PRETTIER: $PRETTIER_CURRENT"
85+
echo " ACORN_TEST262: $ACORN_TEST262_CURRENT"
86+
echo " NODE_COMPAT_TABLE: $NODE_COMPAT_TABLE_CURRENT"
87+
88+
- name: Check if updates are needed
89+
id: check-updates
90+
env:
91+
TEST262_LATEST: ${{ steps.get-shas.outputs.TEST262_LATEST }}
92+
TEST262_CURRENT: ${{ steps.current-shas.outputs.TEST262_CURRENT }}
93+
BABEL_LATEST: ${{ steps.get-shas.outputs.BABEL_LATEST }}
94+
BABEL_CURRENT: ${{ steps.current-shas.outputs.BABEL_CURRENT }}
95+
TYPESCRIPT_LATEST: ${{ steps.get-shas.outputs.TYPESCRIPT_LATEST }}
96+
TYPESCRIPT_CURRENT: ${{ steps.current-shas.outputs.TYPESCRIPT_CURRENT }}
97+
PRETTIER_LATEST: ${{ steps.get-shas.outputs.PRETTIER_LATEST }}
98+
PRETTIER_CURRENT: ${{ steps.current-shas.outputs.PRETTIER_CURRENT }}
99+
ACORN_TEST262_LATEST: ${{ steps.get-shas.outputs.ACORN_TEST262_LATEST }}
100+
ACORN_TEST262_CURRENT: ${{ steps.current-shas.outputs.ACORN_TEST262_CURRENT }}
101+
NODE_COMPAT_TABLE_LATEST: ${{ steps.get-shas.outputs.NODE_COMPAT_TABLE_LATEST }}
102+
NODE_COMPAT_TABLE_CURRENT: ${{ steps.current-shas.outputs.NODE_COMPAT_TABLE_CURRENT }}
103+
run: |
104+
updates_needed=false
105+
update_summary=""
106+
107+
# Check each submodule
108+
if [ "$TEST262_LATEST" != "$TEST262_CURRENT" ]; then
109+
updates_needed=true
110+
update_summary="${update_summary}- test262: \`${TEST262_CURRENT:0:7}\` → \`${TEST262_LATEST:0:7}\`\n"
111+
echo "TEST262 needs update: $TEST262_CURRENT -> $TEST262_LATEST"
112+
fi
113+
114+
if [ "$BABEL_LATEST" != "$BABEL_CURRENT" ]; then
115+
updates_needed=true
116+
update_summary="${update_summary}- babel: \`${BABEL_CURRENT:0:7}\` → \`${BABEL_LATEST:0:7}\`\n"
117+
echo "BABEL needs update: $BABEL_CURRENT -> $BABEL_LATEST"
118+
fi
119+
120+
if [ "$TYPESCRIPT_LATEST" != "$TYPESCRIPT_CURRENT" ]; then
121+
updates_needed=true
122+
update_summary="${update_summary}- TypeScript: \`${TYPESCRIPT_CURRENT:0:7}\` → \`${TYPESCRIPT_LATEST:0:7}\`\n"
123+
echo "TYPESCRIPT needs update: $TYPESCRIPT_CURRENT -> $TYPESCRIPT_LATEST"
124+
fi
125+
126+
if [ "$PRETTIER_LATEST" != "$PRETTIER_CURRENT" ]; then
127+
updates_needed=true
128+
update_summary="${update_summary}- prettier: \`${PRETTIER_CURRENT:0:7}\` → \`${PRETTIER_LATEST:0:7}\`\n"
129+
echo "PRETTIER needs update: $PRETTIER_CURRENT -> $PRETTIER_LATEST"
130+
fi
131+
132+
if [ "$ACORN_TEST262_LATEST" != "$ACORN_TEST262_CURRENT" ]; then
133+
updates_needed=true
134+
update_summary="${update_summary}- acorn-test262: \`${ACORN_TEST262_CURRENT:0:7}\` → \`${ACORN_TEST262_LATEST:0:7}\`\n"
135+
echo "ACORN_TEST262 needs update: $ACORN_TEST262_CURRENT -> $ACORN_TEST262_LATEST"
136+
fi
137+
138+
if [ "$NODE_COMPAT_TABLE_LATEST" != "$NODE_COMPAT_TABLE_CURRENT" ]; then
139+
updates_needed=true
140+
update_summary="${update_summary}- node-compat-table: \`${NODE_COMPAT_TABLE_CURRENT:0:7}\` → \`${NODE_COMPAT_TABLE_LATEST:0:7}\`\n"
141+
echo "NODE_COMPAT_TABLE needs update: $NODE_COMPAT_TABLE_CURRENT -> $NODE_COMPAT_TABLE_LATEST"
142+
fi
143+
144+
if [ "$updates_needed" = true ]; then
145+
echo "updates_needed=true" >> $GITHUB_OUTPUT
146+
echo "update_summary<<EOF" >> $GITHUB_OUTPUT
147+
echo -e "$update_summary" >> $GITHUB_OUTPUT
148+
echo "EOF" >> $GITHUB_OUTPUT
149+
echo "Updates needed!"
150+
else
151+
echo "updates_needed=false" >> $GITHUB_OUTPUT
152+
echo "No updates needed, all SHAs are current"
153+
fi
154+
155+
- name: Update clone-parallel.sh with new SHAs
156+
if: steps.check-updates.outputs.updates_needed == 'true'
157+
env:
158+
TEST262_LATEST: ${{ steps.get-shas.outputs.TEST262_LATEST }}
159+
BABEL_LATEST: ${{ steps.get-shas.outputs.BABEL_LATEST }}
160+
TYPESCRIPT_LATEST: ${{ steps.get-shas.outputs.TYPESCRIPT_LATEST }}
161+
PRETTIER_LATEST: ${{ steps.get-shas.outputs.PRETTIER_LATEST }}
162+
ACORN_TEST262_LATEST: ${{ steps.get-shas.outputs.ACORN_TEST262_LATEST }}
163+
NODE_COMPAT_TABLE_LATEST: ${{ steps.get-shas.outputs.NODE_COMPAT_TABLE_LATEST }}
164+
TEST262_CURRENT: ${{ steps.current-shas.outputs.TEST262_CURRENT }}
165+
BABEL_CURRENT: ${{ steps.current-shas.outputs.BABEL_CURRENT }}
166+
TYPESCRIPT_CURRENT: ${{ steps.current-shas.outputs.TYPESCRIPT_CURRENT }}
167+
PRETTIER_CURRENT: ${{ steps.current-shas.outputs.PRETTIER_CURRENT }}
168+
ACORN_TEST262_CURRENT: ${{ steps.current-shas.outputs.ACORN_TEST262_CURRENT }}
169+
NODE_COMPAT_TABLE_CURRENT: ${{ steps.current-shas.outputs.NODE_COMPAT_TABLE_CURRENT }}
170+
run: |
171+
script_path=".github/scripts/clone-parallel.sh"
172+
173+
# Update each SHA if it changed
174+
if [ "$TEST262_LATEST" != "$TEST262_CURRENT" ]; then
175+
sed -i "s/TEST262_SHA=\"$TEST262_CURRENT\"/TEST262_SHA=\"$TEST262_LATEST\"/g" "$script_path"
176+
echo "Updated TEST262_SHA"
177+
fi
178+
179+
if [ "$BABEL_LATEST" != "$BABEL_CURRENT" ]; then
180+
sed -i "s/BABEL_SHA=\"$BABEL_CURRENT\"/BABEL_SHA=\"$BABEL_LATEST\"/g" "$script_path"
181+
echo "Updated BABEL_SHA"
182+
fi
183+
184+
if [ "$TYPESCRIPT_LATEST" != "$TYPESCRIPT_CURRENT" ]; then
185+
sed -i "s/TYPESCRIPT_SHA=\"$TYPESCRIPT_CURRENT\"/TYPESCRIPT_SHA=\"$TYPESCRIPT_LATEST\"/g" "$script_path"
186+
echo "Updated TYPESCRIPT_SHA"
187+
fi
188+
189+
if [ "$PRETTIER_LATEST" != "$PRETTIER_CURRENT" ]; then
190+
sed -i "s/PRETTIER_SHA=\"$PRETTIER_CURRENT\"/PRETTIER_SHA=\"$PRETTIER_LATEST\"/g" "$script_path"
191+
echo "Updated PRETTIER_SHA"
192+
fi
193+
194+
if [ "$ACORN_TEST262_LATEST" != "$ACORN_TEST262_CURRENT" ]; then
195+
sed -i "s/ACORN_TEST262_SHA=\"$ACORN_TEST262_CURRENT\"/ACORN_TEST262_SHA=\"$ACORN_TEST262_LATEST\"/g" "$script_path"
196+
echo "Updated ACORN_TEST262_SHA"
197+
fi
198+
199+
if [ "$NODE_COMPAT_TABLE_LATEST" != "$NODE_COMPAT_TABLE_CURRENT" ]; then
200+
sed -i "s/NODE_COMPAT_TABLE_SHA=\"$NODE_COMPAT_TABLE_CURRENT\"/NODE_COMPAT_TABLE_SHA=\"$NODE_COMPAT_TABLE_LATEST\"/g" "$script_path"
201+
echo "Updated NODE_COMPAT_TABLE_SHA"
202+
fi
203+
204+
echo "Updated clone-parallel.sh with new SHAs"
205+
206+
- name: Run format
207+
if: steps.check-updates.outputs.updates_needed == 'true'
208+
run: just fmt
209+
210+
- name: Run coverage tests
211+
if: steps.check-updates.outputs.updates_needed == 'true'
212+
env:
213+
UPDATE_SNAPSHOT: 1
214+
run: just coverage
215+
216+
- name: Create Pull Request
217+
if: steps.check-updates.outputs.updates_needed == 'true'
218+
uses: peter-evans/create-pull-request@271a8d0340265f705b14b6d32b9829c1cb33d45e # v7.0.8
219+
with:
220+
token: ${{ secrets.OXC_BOT_PAT }}
221+
commit-message: "chore(submodules): update submodule SHAs to latest commits"
222+
branch: update-submodules
223+
branch-suffix: timestamp
224+
base: main
225+
title: "chore(submodules): update submodule SHAs to latest commits"
226+
assignees: Boshen
227+
body: |
228+
Updates submodule dependencies to their latest commits.
229+
230+
## Changes
231+
232+
${{ steps.check-updates.outputs.update_summary }}
233+
234+
This PR is automatically generated by the [update_submodules workflow](https://github.com/oxc-project/oxc/blob/main/.github/workflows/update_submodules.yml).

0 commit comments

Comments
 (0)