Skip to content

Update Submodules

Update Submodules #1

# NOTE: Prettier version is now pinned to v3.7.0 (not updated by this workflow)
name: Update Submodules
permissions: {}
on:
schedule:
# Run weekly on Tuesday at 00:00 UTC
- cron: "0 0 * * 2"
workflow_dispatch:
inputs:
test262_sha:
description: "Test262 commit SHA (optional - will fetch latest if not provided)"
required: false
type: string
typescript_sha:
description: "TypeScript commit SHA (optional - will fetch latest if not provided)"
required: false
type: string
estree_conformance_sha:
description: "estree-conformance commit SHA (includes test262, TypeScript, and acorn-jsx fixtures - optional - will fetch latest if not provided)"
required: false
type: string
workflow_call:
inputs:
test262_sha:
description: "Test262 commit SHA (optional - will fetch latest if not provided)"
required: false
type: string
typescript_sha:
description: "TypeScript commit SHA (optional - will fetch latest if not provided)"
required: false
type: string
estree_conformance_sha:
description: "estree-conformance commit SHA (includes test262, TypeScript, and acorn-jsx fixtures - optional - will fetch latest if not provided)"
required: false
type: string
concurrency:
group: ${{ github.workflow }}-${{ github.ref_name }}
cancel-in-progress: true
jobs:
update:
name: Update submodule SHAs
runs-on: ubuntu-latest
permissions:
contents: write
pull-requests: write
steps:
- uses: taiki-e/checkout-action@b13d20b7cda4e2f325ef19895128f7ff735c0b3d # v1.3.1
- uses: oxc-project/setup-node@8958a8e040102244b619c4a94fccb657a44b1c21 # v1.0.6
- uses: oxc-project/setup-rust@c8224157c0bf235aabc633e8cd50d344f087a7de # v1.0.12
with:
cache-key: conformance
tools: just,cargo-shear@1.3.0
components: rustfmt
- name: Get latest SHAs for all submodules
id: get-shas
env:
INPUT_TEST262_SHA: ${{ inputs.test262_sha }}
INPUT_TYPESCRIPT_SHA: ${{ inputs.typescript_sha }}
INPUT_ESTREE_CONFORMANCE_SHA: ${{ inputs.estree_conformance_sha }}
run: |
# Function to fetch latest SHA for a repo
fetch_sha() {
local name=$1
local repo=$2
local branch=${3:-HEAD}
echo "Fetching latest SHA for $repo (branch: $branch)..."
# Use GitHub API to get latest commit SHA (much faster than cloning)
# Use GITHUB_TOKEN to avoid rate limiting
response=$(curl -s -H "Authorization: token ${{ github.token }}" "https://api.github.com/repos/$repo/commits/$branch")
sha=$(echo "$response" | jq -r .sha)
# Validate SHA is not null or empty
if [ "$sha" = "null" ] || [ -z "$sha" ]; then
echo "Error: Failed to fetch SHA for $repo (got: '$sha')"
echo "API Response: $response"
echo "This may be due to GitHub API rate limiting, repository access issues, or branch not found"
# Check for specific error messages
error_message=$(echo "$response" | jq -r .message 2>/dev/null)
if [ "$error_message" != "null" ] && [ -n "$error_message" ]; then
echo "GitHub API Error: $error_message"
fi
exit 1
fi
# Output the SHA
echo "${name}_LATEST=$sha" >> $GITHUB_OUTPUT
echo "$name latest SHA: $sha"
}
# Use provided SHAs from workflow_call inputs if available, otherwise fetch from GitHub
if [ -n "$INPUT_TEST262_SHA" ]; then
echo "TEST262_LATEST=$INPUT_TEST262_SHA" >> $GITHUB_OUTPUT
echo "TEST262 SHA (from input): $INPUT_TEST262_SHA"
else
fetch_sha "TEST262" "tc39/test262"
fi
if [ -n "$INPUT_TYPESCRIPT_SHA" ]; then
echo "TYPESCRIPT_LATEST=$INPUT_TYPESCRIPT_SHA" >> $GITHUB_OUTPUT
echo "TYPESCRIPT SHA (from input): $INPUT_TYPESCRIPT_SHA"
else
fetch_sha "TYPESCRIPT" "microsoft/TypeScript"
fi
if [ -n "$INPUT_ESTREE_CONFORMANCE_SHA" ]; then
echo "ESTREE_CONFORMANCE_LATEST=$INPUT_ESTREE_CONFORMANCE_SHA" >> $GITHUB_OUTPUT
echo "ESTREE_CONFORMANCE SHA (from input): $INPUT_ESTREE_CONFORMANCE_SHA"
else
fetch_sha "ESTREE_CONFORMANCE" "oxc-project/estree-conformance"
fi
# Always fetch BABEL and NODE_COMPAT_TABLE (not provided via inputs)
fetch_sha "BABEL" "babel/babel"
fetch_sha "NODE_COMPAT_TABLE" "compat-table/node-compat-table" "gh-pages"
- name: Get current SHAs from clone-parallel.sh
id: current-shas
run: |
# Extract current SHAs from the script
TEST262_CURRENT=$(grep '^TEST262_SHA=' .github/scripts/clone-parallel.sh | cut -d'"' -f2)
BABEL_CURRENT=$(grep '^BABEL_SHA=' .github/scripts/clone-parallel.sh | cut -d'"' -f2)
TYPESCRIPT_CURRENT=$(grep '^TYPESCRIPT_SHA=' .github/scripts/clone-parallel.sh | cut -d'"' -f2)
# PRETTIER_CURRENT=$(grep '^PRETTIER_SHA=' .github/scripts/clone-parallel.sh | cut -d'"' -f2)
ESTREE_CONFORMANCE_CURRENT=$(grep '^ESTREE_CONFORMANCE_SHA=' .github/scripts/clone-parallel.sh | cut -d'"' -f2)
NODE_COMPAT_TABLE_CURRENT=$(grep '^NODE_COMPAT_TABLE_SHA=' .github/scripts/clone-parallel.sh | cut -d'"' -f2)
echo "TEST262_CURRENT=$TEST262_CURRENT" >> $GITHUB_OUTPUT
echo "BABEL_CURRENT=$BABEL_CURRENT" >> $GITHUB_OUTPUT
echo "TYPESCRIPT_CURRENT=$TYPESCRIPT_CURRENT" >> $GITHUB_OUTPUT
# echo "PRETTIER_CURRENT=$PRETTIER_CURRENT" >> $GITHUB_OUTPUT
echo "ESTREE_CONFORMANCE_CURRENT=$ESTREE_CONFORMANCE_CURRENT" >> $GITHUB_OUTPUT
echo "NODE_COMPAT_TABLE_CURRENT=$NODE_COMPAT_TABLE_CURRENT" >> $GITHUB_OUTPUT
echo "Current SHAs:"
echo " TEST262: $TEST262_CURRENT"
echo " BABEL: $BABEL_CURRENT"
echo " TYPESCRIPT: $TYPESCRIPT_CURRENT"
# echo " PRETTIER: $PRETTIER_CURRENT"
echo " ESTREE_CONFORMANCE: $ESTREE_CONFORMANCE_CURRENT"
echo " NODE_COMPAT_TABLE: $NODE_COMPAT_TABLE_CURRENT"
- name: Check if updates are needed
id: check-updates
env:
TEST262_LATEST: ${{ steps.get-shas.outputs.TEST262_LATEST }}
TEST262_CURRENT: ${{ steps.current-shas.outputs.TEST262_CURRENT }}
BABEL_LATEST: ${{ steps.get-shas.outputs.BABEL_LATEST }}
BABEL_CURRENT: ${{ steps.current-shas.outputs.BABEL_CURRENT }}
TYPESCRIPT_LATEST: ${{ steps.get-shas.outputs.TYPESCRIPT_LATEST }}
TYPESCRIPT_CURRENT: ${{ steps.current-shas.outputs.TYPESCRIPT_CURRENT }}
# PRETTIER_LATEST: ${{ steps.get-shas.outputs.PRETTIER_LATEST }}
# PRETTIER_CURRENT: ${{ steps.current-shas.outputs.PRETTIER_CURRENT }}
ESTREE_CONFORMANCE_LATEST: ${{ steps.get-shas.outputs.ESTREE_CONFORMANCE_LATEST }}
ESTREE_CONFORMANCE_CURRENT: ${{ steps.current-shas.outputs.ESTREE_CONFORMANCE_CURRENT }}
NODE_COMPAT_TABLE_LATEST: ${{ steps.get-shas.outputs.NODE_COMPAT_TABLE_LATEST }}
NODE_COMPAT_TABLE_CURRENT: ${{ steps.current-shas.outputs.NODE_COMPAT_TABLE_CURRENT }}
run: |
updates_needed=false
update_summary=""
# Check each submodule
if [ "$TEST262_LATEST" != "$TEST262_CURRENT" ]; then
updates_needed=true
update_summary="${update_summary}- test262: \`${TEST262_CURRENT:0:7}\` → \`${TEST262_LATEST:0:7}\`\n"
echo "TEST262 needs update: $TEST262_CURRENT -> $TEST262_LATEST"
fi
if [ "$BABEL_LATEST" != "$BABEL_CURRENT" ]; then
updates_needed=true
update_summary="${update_summary}- babel: \`${BABEL_CURRENT:0:7}\` → \`${BABEL_LATEST:0:7}\`\n"
echo "BABEL needs update: $BABEL_CURRENT -> $BABEL_LATEST"
fi
if [ "$TYPESCRIPT_LATEST" != "$TYPESCRIPT_CURRENT" ]; then
updates_needed=true
update_summary="${update_summary}- TypeScript: \`${TYPESCRIPT_CURRENT:0:7}\` → \`${TYPESCRIPT_LATEST:0:7}\`\n"
echo "TYPESCRIPT needs update: $TYPESCRIPT_CURRENT -> $TYPESCRIPT_LATEST"
fi
# if [ "$PRETTIER_LATEST" != "$PRETTIER_CURRENT" ]; then
# updates_needed=true
# update_summary="${update_summary}- prettier: \`${PRETTIER_CURRENT:0:7}\` → \`${PRETTIER_LATEST:0:7}\`\n"
# echo "PRETTIER needs update: $PRETTIER_CURRENT -> $PRETTIER_LATEST"
# fi
if [ "$ESTREE_CONFORMANCE_LATEST" != "$ESTREE_CONFORMANCE_CURRENT" ]; then
updates_needed=true
update_summary="${update_summary}- estree-conformance: \`${ESTREE_CONFORMANCE_CURRENT:0:7}\` → \`${ESTREE_CONFORMANCE_LATEST:0:7}\`\n"
echo "ESTREE_CONFORMANCE needs update: $ESTREE_CONFORMANCE_CURRENT -> $ESTREE_CONFORMANCE_LATEST"
fi
if [ "$NODE_COMPAT_TABLE_LATEST" != "$NODE_COMPAT_TABLE_CURRENT" ]; then
updates_needed=true
update_summary="${update_summary}- node-compat-table: \`${NODE_COMPAT_TABLE_CURRENT:0:7}\` → \`${NODE_COMPAT_TABLE_LATEST:0:7}\`\n"
echo "NODE_COMPAT_TABLE needs update: $NODE_COMPAT_TABLE_CURRENT -> $NODE_COMPAT_TABLE_LATEST"
fi
if [ "$updates_needed" = true ]; then
echo "updates_needed=true" >> $GITHUB_OUTPUT
echo "update_summary<<EOF" >> $GITHUB_OUTPUT
echo -e "$update_summary" >> $GITHUB_OUTPUT
echo "EOF" >> $GITHUB_OUTPUT
echo "Updates needed!"
else
echo "updates_needed=false" >> $GITHUB_OUTPUT
echo "No updates needed, all SHAs are current"
fi
- name: Update clone-parallel.sh with new SHAs
if: steps.check-updates.outputs.updates_needed == 'true'
env:
TEST262_LATEST: ${{ steps.get-shas.outputs.TEST262_LATEST }}
BABEL_LATEST: ${{ steps.get-shas.outputs.BABEL_LATEST }}
TYPESCRIPT_LATEST: ${{ steps.get-shas.outputs.TYPESCRIPT_LATEST }}
# PRETTIER_LATEST: ${{ steps.get-shas.outputs.PRETTIER_LATEST }}
ESTREE_CONFORMANCE_LATEST: ${{ steps.get-shas.outputs.ESTREE_CONFORMANCE_LATEST }}
NODE_COMPAT_TABLE_LATEST: ${{ steps.get-shas.outputs.NODE_COMPAT_TABLE_LATEST }}
TEST262_CURRENT: ${{ steps.current-shas.outputs.TEST262_CURRENT }}
BABEL_CURRENT: ${{ steps.current-shas.outputs.BABEL_CURRENT }}
TYPESCRIPT_CURRENT: ${{ steps.current-shas.outputs.TYPESCRIPT_CURRENT }}
# PRETTIER_CURRENT: ${{ steps.current-shas.outputs.PRETTIER_CURRENT }}
ESTREE_CONFORMANCE_CURRENT: ${{ steps.current-shas.outputs.ESTREE_CONFORMANCE_CURRENT }}
NODE_COMPAT_TABLE_CURRENT: ${{ steps.current-shas.outputs.NODE_COMPAT_TABLE_CURRENT }}
run: |
script_path=".github/scripts/clone-parallel.sh"
# Update each SHA if it changed
if [ "$TEST262_LATEST" != "$TEST262_CURRENT" ]; then
sed -i "s/TEST262_SHA=\"$TEST262_CURRENT\"/TEST262_SHA=\"$TEST262_LATEST\"/g" "$script_path"
echo "Updated TEST262_SHA"
fi
if [ "$BABEL_LATEST" != "$BABEL_CURRENT" ]; then
sed -i "s/BABEL_SHA=\"$BABEL_CURRENT\"/BABEL_SHA=\"$BABEL_LATEST\"/g" "$script_path"
echo "Updated BABEL_SHA"
fi
if [ "$TYPESCRIPT_LATEST" != "$TYPESCRIPT_CURRENT" ]; then
sed -i "s/TYPESCRIPT_SHA=\"$TYPESCRIPT_CURRENT\"/TYPESCRIPT_SHA=\"$TYPESCRIPT_LATEST\"/g" "$script_path"
echo "Updated TYPESCRIPT_SHA"
fi
# if [ "$PRETTIER_LATEST" != "$PRETTIER_CURRENT" ]; then
# sed -i "s/PRETTIER_SHA=\"$PRETTIER_CURRENT\"/PRETTIER_SHA=\"$PRETTIER_LATEST\"/g" "$script_path"
# echo "Updated PRETTIER_SHA"
# fi
if [ "$ESTREE_CONFORMANCE_LATEST" != "$ESTREE_CONFORMANCE_CURRENT" ]; then
sed -i "s/ESTREE_CONFORMANCE_SHA=\"$ESTREE_CONFORMANCE_CURRENT\"/ESTREE_CONFORMANCE_SHA=\"$ESTREE_CONFORMANCE_LATEST\"/g" "$script_path"
echo "Updated ESTREE_CONFORMANCE_SHA"
fi
if [ "$NODE_COMPAT_TABLE_LATEST" != "$NODE_COMPAT_TABLE_CURRENT" ]; then
sed -i "s/NODE_COMPAT_TABLE_SHA=\"$NODE_COMPAT_TABLE_CURRENT\"/NODE_COMPAT_TABLE_SHA=\"$NODE_COMPAT_TABLE_LATEST\"/g" "$script_path"
echo "Updated NODE_COMPAT_TABLE_SHA"
fi
echo "Updated clone-parallel.sh with new SHAs"
- name: Run format
if: steps.check-updates.outputs.updates_needed == 'true'
run: just fmt
- name: Run coverage tests
if: steps.check-updates.outputs.updates_needed == 'true'
env:
UPDATE_SNAPSHOT: 1
run: just coverage
- name: Create Pull Request
if: steps.check-updates.outputs.updates_needed == 'true'
uses: peter-evans/create-pull-request@98357b18bf14b5342f975ff684046ec3b2a07725 # v8.0.0
with:
token: ${{ secrets.OXC_BOT_PAT }}
commit-message: "chore(submodules): update submodule SHAs to latest commits"
branch: update-submodules
branch-suffix: timestamp
base: main
title: "chore(submodules): update submodule SHAs to latest commits"
assignees: Boshen
body: |
Updates submodule dependencies to their latest commits.
## Changes
${{ steps.check-updates.outputs.update_summary }}
This PR is automatically generated by the [update_submodules workflow](https://github.com/oxc-project/oxc/blob/main/.github/workflows/update_submodules.yml).