Update Submodules #1
Workflow file for this run
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| # 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). |