From 7001cbb57d4bc0ff4e1ff0ada477c4b43395dcf9 Mon Sep 17 00:00:00 2001 From: Gregor MacLennan Date: Tue, 1 Sep 2026 22:46:46 +0100 Subject: [PATCH 1/8] upgrade: rebase patch series onto v24.20.0 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Two conflicts, both routine: the fork README replaces the upstream remainder (resolved to ours; upstream churn was collaborator-list only), and the upstream-CI removal patch hit delete/modify on the 28 workflows v24.20.0 touched. v24.20.0 adds one workflow, test-linux-quic.yml, now deleted and owned by the removal patch so the materialized tree keeps carrying zero of them. Also skips the new tests that cannot be scored on a device: child-process spawners, the test-permission-drop-* family that gives up fs.write before the harness writes its verdict, the new debugger-probe --cond cases on iOS (Android has a glob), and the JSPI test against the polywasm polyfill. The ~250 new QUIC tests need no entries — the build does not pass --experimental-quic, so each one self-skips, which scores PASS. These are inferred from the test sources; the full device suite this PR triggers is what confirms them. --- expected-tree.txt | 2 +- ...S-dest-os-and-toolchain-configure.py.patch | 4 +- ...ile-platform-settings-in-common.gypi.patch | 18 +- ...mobile-targets-in-node.gyp-node.gypi.patch | 8 +- ...-host-target-settings-in-v8-gypfiles.patch | 2 +- ...e-upstream-only-workflows-and-config.patch | 381 ++++++++++-------- .../doc-build-mobile-notes-and-ignores.patch | 14 +- patches/files.map | 1 + ...bAssembly-polyfill-when-the-engine-h.patch | 6 +- ...bile-adjustment-in-crypto_context.cc.patch | 10 +- ...ard-POSIX-credential-APIs-on-Android.patch | 2 +- ...orm-guards-in-node.cc-node_internals.patch | 6 +- patches/test-mobile-test-harness.patch | 6 +- ...parallel-and-sequential-tests-for-mo.patch | 54 ++- upstream-base.txt | 2 +- 15 files changed, 303 insertions(+), 213 deletions(-) diff --git a/expected-tree.txt b/expected-tree.txt index 5d0f480764..6e7c5b1e35 100644 --- a/expected-tree.txt +++ b/expected-tree.txt @@ -14,4 +14,4 @@ # run prepare.sh (or regenerate-patches.py, which prints the hash) and # update the value below in the same commit. If you forget, CI fails and # prints the hash it got. -8dad26f6016a4ef21917fceb8d033696b0c9f2b7 +fb503ea45e0582c9ec6c9011905597f9633c5869 diff --git a/patches/build-Android-iOS-dest-os-and-toolchain-configure.py.patch b/patches/build-Android-iOS-dest-os-and-toolchain-configure.py.patch index c8735bf1d0..e5bbee1afb 100644 --- a/patches/build-Android-iOS-dest-os-and-toolchain-configure.py.patch +++ b/patches/build-Android-iOS-dest-os-and-toolchain-configure.py.patch @@ -137,7 +137,7 @@ index 5cea0393f4..dfec53e67e 100644 - os.system("./configure --dest-cpu=" + DEST_CPU + " --dest-os=android --openssl-no-asm --cross-compiling") + os.system("./configure --dest-cpu=" + DEST_CPU + " --dest-os=android --openssl-no-asm --with-intl=" + intl + extra_flags + " --cross-compiling --shared") diff --git a/configure.py b/configure.py -index a9910d038f..09a7e45d57 100755 +index 7fd64a9620..40642c1af4 100755 --- a/configure.py +++ b/configure.py @@ -1146,6 +1146,11 @@ parser.add_argument('-C', @@ -152,7 +152,7 @@ index a9910d038f..09a7e45d57 100755 parser.add_argument('--clang-cl', action='store', dest='clang_cl', -@@ -1626,6 +1631,9 @@ def configure_node_cctest_sources(o): +@@ -1655,6 +1660,9 @@ def configure_node_cctest_sources(o): SearchFiles('test/cctest', 'h') def configure_node(o): diff --git a/patches/build-mobile-platform-settings-in-common.gypi.patch b/patches/build-mobile-platform-settings-in-common.gypi.patch index 256aecff52..a3db68104d 100644 --- a/patches/build-mobile-platform-settings-in-common.gypi.patch +++ b/patches/build-mobile-platform-settings-in-common.gypi.patch @@ -23,10 +23,10 @@ Co-authored-by: João Matos 1 file changed, 118 insertions(+), 7 deletions(-) diff --git a/common.gypi b/common.gypi -index a2cd172f10..1d39345051 100644 +index 83e0691d4a..dc33231a0d 100644 --- a/common.gypi +++ b/common.gypi -@@ -111,7 +111,7 @@ +@@ -112,7 +112,7 @@ 'obj_dir%': '<(PRODUCT_DIR)/obj.target', 'v8_base': '<(PRODUCT_DIR)/obj.target/tools/v8_gypfiles/libv8_snapshot.a', }], @@ -35,7 +35,7 @@ index a2cd172f10..1d39345051 100644 'obj_dir%': '<(PRODUCT_DIR)/obj.target', 'v8_base': '<(PRODUCT_DIR)/libv8_snapshot.a', }], -@@ -222,6 +222,23 @@ +@@ -223,6 +223,23 @@ }], ], }], @@ -59,7 +59,7 @@ index a2cd172f10..1d39345051 100644 ['OS=="solaris"', { # pull in V8's postmortem metadata 'ldflags': [ '-Wl,-z,allextract' ] -@@ -230,7 +247,7 @@ +@@ -231,7 +248,7 @@ # increase performance, number from experimentation 'cflags': [ '-qINLINE=::150:100000' ] }], @@ -68,7 +68,7 @@ index a2cd172f10..1d39345051 100644 # -fno-omit-frame-pointer is necessary for the --perf_basic_prof # flag to work correctly. perf(1) gets confused about JS stack # frames otherwise, even with --call-graph dwarf. -@@ -449,7 +466,7 @@ +@@ -450,7 +467,7 @@ [ 'target_arch=="arm64"', { 'msvs_configuration_platform': 'arm64', }], @@ -77,7 +77,7 @@ index a2cd172f10..1d39345051 100644 'cflags+': [ '-fno-omit-frame-pointer', '-fsanitize=address', -@@ -477,7 +494,7 @@ +@@ -478,7 +495,7 @@ }], ], }], @@ -86,7 +86,7 @@ index a2cd172f10..1d39345051 100644 'cflags+': [ '-fno-omit-frame-pointer', '-fsanitize=undefined', -@@ -486,7 +503,7 @@ +@@ -487,7 +504,7 @@ 'cflags!': [ '-fno-omit-frame-pointer' ], 'ldflags': [ '-fsanitize=undefined' ], }], @@ -95,7 +95,7 @@ index a2cd172f10..1d39345051 100644 'xcode_settings': { 'OTHER_CFLAGS+': [ '-fno-omit-frame-pointer', -@@ -594,11 +611,13 @@ +@@ -595,11 +612,13 @@ }], ['_toolset=="host"', { 'conditions': [ @@ -111,7 +111,7 @@ index a2cd172f10..1d39345051 100644 'cflags': [ '-m64' ], 'ldflags': [ '-m64' ], }], -@@ -758,6 +777,98 @@ +@@ -759,6 +778,98 @@ }], ], }], diff --git a/patches/build-mobile-targets-in-node.gyp-node.gypi.patch b/patches/build-mobile-targets-in-node.gyp-node.gypi.patch index 9ee3965025..9f382a5963 100644 --- a/patches/build-mobile-targets-in-node.gyp-node.gypi.patch +++ b/patches/build-mobile-targets-in-node.gyp-node.gypi.patch @@ -21,7 +21,7 @@ Co-authored-by: Julia Samól 2 files changed, 30 insertions(+), 8 deletions(-) diff --git a/node.gyp b/node.gyp -index bd66c9b498..06589d8cc3 100644 +index c58f4812e2..d8b6eb51f5 100644 --- a/node.gyp +++ b/node.gyp @@ -68,6 +68,11 @@ @@ -36,7 +36,7 @@ index bd66c9b498..06589d8cc3 100644 '<@(node_builtin_shareable_builtins)', ], 'node_sources': [ -@@ -922,7 +927,8 @@ +@@ -923,7 +928,8 @@ '<@(node_quic_sources)', ], }], @@ -46,7 +46,7 @@ index bd66c9b498..06589d8cc3 100644 'target_arch=="x64" and ' 'node_target_type=="executable"', { 'defines': [ 'NODE_ENABLE_LARGE_CODE_PAGES=1' ], -@@ -1399,8 +1405,9 @@ +@@ -1405,8 +1411,9 @@ ['OS=="solaris"', { 'ldflags': [ '-I<(SHARED_INTERMEDIATE_DIR)' ] }], @@ -58,7 +58,7 @@ index bd66c9b498..06589d8cc3 100644 'type': 'none', }], [ 'node_shared=="true"', { -@@ -1566,7 +1573,8 @@ +@@ -1627,7 +1634,8 @@ [ 'node_shared_libuv=="false"', { 'dependencies': [ 'deps/uv/uv.gyp:libuv#host' ], }], diff --git a/patches/build-v8-mobile-host-target-settings-in-v8-gypfiles.patch b/patches/build-v8-mobile-host-target-settings-in-v8-gypfiles.patch index be6a934538..92c0c6032b 100644 --- a/patches/build-v8-mobile-host-target-settings-in-v8-gypfiles.patch +++ b/patches/build-v8-mobile-host-target-settings-in-v8-gypfiles.patch @@ -46,7 +46,7 @@ index e614c39a6b..711428f898 100644 'configurations': { 'Debug': { diff --git a/tools/v8_gypfiles/v8.gyp b/tools/v8_gypfiles/v8.gyp -index 95194aca28..217a787878 100644 +index f90a29d102..b814fee544 100644 --- a/tools/v8_gypfiles/v8.gyp +++ b/tools/v8_gypfiles/v8.gyp @@ -868,6 +868,15 @@ diff --git a/patches/ci-remove-upstream-only-workflows-and-config.patch b/patches/ci-remove-upstream-only-workflows-and-config.patch index 8e899b86b6..e9ef98a33e 100644 --- a/patches/ci-remove-upstream-only-workflows-and-config.patch +++ b/patches/ci-remove-upstream-only-workflows-and-config.patch @@ -24,27 +24,27 @@ is read only from the default branch and is left untouched. .github/SUPPORT.md | 27 -- .github/label-pr-config.yml | 224 ------------ .github/workflows/auto-start-ci.yml | 74 ---- - .github/workflows/build-tarball.yml | 102 ------ + .github/workflows/build-tarball.yml | 96 ------ .github/workflows/close-stalled.yml | 36 -- .github/workflows/codeql.yml | 42 --- .github/workflows/comment-labeled.yml | 57 ---- .../commit-lint-problem-matcher.json | 13 - .github/workflows/commit-lint.yml | 35 -- .github/workflows/commit-queue.yml | 99 ------ - .../workflows/coverage-linux-without-intl.yml | 86 ----- - .github/workflows/coverage-linux.yml | 86 ----- - .github/workflows/coverage-windows.yml | 100 ------ + .../workflows/coverage-linux-without-intl.yml | 84 ----- + .github/workflows/coverage-linux.yml | 84 ----- + .github/workflows/coverage-windows.yml | 98 ------ .github/workflows/create-release-proposal.yml | 81 ----- - .github/workflows/daily-wpt-fyi.yml | 179 ---------- - .github/workflows/daily.yml | 32 -- - .github/workflows/doc.yml | 43 --- + .github/workflows/daily-wpt-fyi.yml | 177 ---------- + .github/workflows/daily.yml | 30 -- + .github/workflows/doc.yml | 41 --- .../workflows/find-inactive-collaborators.yml | 50 --- .github/workflows/find-inactive-tsc.yml | 62 ---- .github/workflows/label-flaky-test-issue.yml | 53 --- .github/workflows/label-pr.yml | 18 - .github/workflows/license-builder.yml | 38 --- .github/workflows/lint-release-proposal.yml | 119 ------- - .github/workflows/linters.yml | 262 -------------- + .github/workflows/linters.yml | 250 -------------- .github/workflows/major-release.yml | 49 --- .github/workflows/notify-on-push.yml | 61 ---- .github/workflows/notify-on-review-wanted.yml | 45 --- @@ -52,16 +52,17 @@ is read only from the default branch and is left untouched. .../remark-lint-problem-matcher.json | 22 -- .github/workflows/scorecard.yml | 81 ----- .github/workflows/stale.yml | 51 --- - .github/workflows/stress-test.yml | 116 ------- - .github/workflows/test-internet.yml | 66 ---- - .github/workflows/test-linux.yml | 87 ----- - .github/workflows/test-macos.yml | 104 ------ + .github/workflows/stress-test.yml | 114 ------- + .github/workflows/test-internet.yml | 64 ---- + .github/workflows/test-linux-quic.yml | 69 ---- + .github/workflows/test-linux.yml | 85 ----- + .github/workflows/test-macos.yml | 102 ------ .github/workflows/timezone-update.yml | 74 ---- .github/workflows/tools.yml | 321 ------------------ .github/workflows/update-openssl.yml | 61 ---- .github/workflows/update-v8.yml | 57 ---- - .github/workflows/update-wpt.yml | 87 ----- - 41 files changed, 3247 deletions(-) + .github/workflows/update-wpt.yml | 95 ------ + 42 files changed, 3286 deletions(-) delete mode 100644 .github/ISSUE_TEMPLATE/config.yml delete mode 100644 .github/SUPPORT.md delete mode 100644 .github/label-pr-config.yml @@ -96,6 +97,7 @@ is read only from the default branch and is left untouched. delete mode 100644 .github/workflows/stale.yml delete mode 100644 .github/workflows/stress-test.yml delete mode 100644 .github/workflows/test-internet.yml + delete mode 100644 .github/workflows/test-linux-quic.yml delete mode 100644 .github/workflows/test-linux.yml delete mode 100644 .github/workflows/test-macos.yml delete mode 100644 .github/workflows/timezone-update.yml @@ -469,10 +471,10 @@ index 34488eeed6..0000000000 - GH_REPO: ${{ github.repository }} diff --git a/.github/workflows/build-tarball.yml b/.github/workflows/build-tarball.yml deleted file mode 100644 -index 9d2cca4782..0000000000 +index 0f17013755..0000000000 --- a/.github/workflows/build-tarball.yml +++ /dev/null -@@ -1,102 +0,0 @@ +@@ -1,96 +0,0 @@ -name: Build from tarball - -on: @@ -516,15 +518,13 @@ index 9d2cca4782..0000000000 - if: github.event.pull_request.draft == false - runs-on: ubuntu-slim - steps: -- - uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6.0.3 +- - uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0 - with: - persist-credentials: false - - name: Set up Python ${{ env.PYTHON_VERSION }} -- uses: actions/setup-python@a309ff8b426b58ec0e2a45f0f869d46889d02405 # v6.2.0 +- uses: actions/setup-python@5fda3b95a4ea91299a34e894583c3862153e4b97 # v7.0.0 - with: - python-version: ${{ env.PYTHON_VERSION }} -- - name: Environment Information -- run: npx envinfo - - name: Make tarball - run: | - export DISTTYPE=nightly @@ -534,9 +534,8 @@ index 9d2cca4782..0000000000 - - name: Upload tarball artifact - uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1 - with: -- name: tarballs - path: '*.tar.gz' -- compression-level: 0 +- archive: false - test-tarball-linux: - needs: build-tarball - runs-on: ubuntu-24.04-arm @@ -546,26 +545,23 @@ index 9d2cca4782..0000000000 - SCCACHE_GHA_ENABLED: ${{ github.base_ref == 'main' || github.ref_name == 'main' }} - SCCACHE_IDLE_TIMEOUT: '0' - steps: -- - uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6.0.3 +- - uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0 - with: - persist-credentials: false - sparse-checkout: .github/actions/install-clang - sparse-checkout-cone-mode: false - - name: Set up Python ${{ env.PYTHON_VERSION }} -- uses: actions/setup-python@a309ff8b426b58ec0e2a45f0f869d46889d02405 # v6.2.0 +- uses: actions/setup-python@5fda3b95a4ea91299a34e894583c3862153e4b97 # v7.0.0 - with: - python-version: ${{ env.PYTHON_VERSION }} - - name: Set up sccache - if: github.base_ref == 'main' || github.ref_name == 'main' -- uses: Mozilla-Actions/sccache-action@9e7fa8a12102821edf02ca5dbea1acd0f89a2696 # v0.0.10 +- uses: Mozilla-Actions/sccache-action@fc920bf0ec8de6ee65d409111f7ec508035751ba # v0.0.11 - with: - version: v0.16.0 -- - name: Environment Information -- run: npx envinfo - - name: Download tarball - uses: actions/download-artifact@3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c # v8.0.1 - with: -- name: tarballs - path: tarballs - - name: Extract tarball - run: | @@ -577,7 +573,7 @@ index 9d2cca4782..0000000000 - run: make -C "$TAR_DIR" test-ci -j1 V=1 TEST_CI_ARGS="-p dots --measure-flakiness 9" diff --git a/.github/workflows/close-stalled.yml b/.github/workflows/close-stalled.yml deleted file mode 100644 -index 56c0f2542b..0000000000 +index 3c7ab04339..0000000000 --- a/.github/workflows/close-stalled.yml +++ /dev/null @@ -1,36 +0,0 @@ @@ -603,7 +599,7 @@ index 56c0f2542b..0000000000 - if: github.repository == 'nodejs/node' - runs-on: ubuntu-slim - steps: -- - uses: actions/stale@eb5cf3af3ac0a1aa4c9c45633dd1ae542a27a899 # v10.3.0 +- - uses: actions/stale@4391f3da665fdf50b6810c1a66712fb9ba21aa93 # v11.0.0 - with: - repo-token: ${{ secrets.GITHUB_TOKEN }} - days-before-close: 30 @@ -619,7 +615,7 @@ index 56c0f2542b..0000000000 - days-before-stale: -1 diff --git a/.github/workflows/codeql.yml b/.github/workflows/codeql.yml deleted file mode 100644 -index c869c23cac..0000000000 +index 23084c68ac..0000000000 --- a/.github/workflows/codeql.yml +++ /dev/null @@ -1,42 +0,0 @@ @@ -649,20 +645,20 @@ index c869c23cac..0000000000 - - steps: - - name: Checkout repository -- uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6.0.3 +- uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0 - - # Initializes the CodeQL tools for scanning. - - name: Initialize CodeQL -- uses: github/codeql-action/init@8aad20d150bbac5944a9f9d289da16a4b0d87c1e # v4.36.2 +- uses: github/codeql-action/init@e4fba868fa4b1b91e1fdab776edc8cfbe6e9fb81 # v4.37.3 - with: - languages: ${{ matrix.language }} - config-file: ./.github/codeql-config.yml - - - name: Autobuild -- uses: github/codeql-action/autobuild@8aad20d150bbac5944a9f9d289da16a4b0d87c1e # v4.36.2 +- uses: github/codeql-action/autobuild@e4fba868fa4b1b91e1fdab776edc8cfbe6e9fb81 # v4.37.3 - - - name: Perform CodeQL Analysis -- uses: github/codeql-action/analyze@8aad20d150bbac5944a9f9d289da16a4b0d87c1e # v4.36.2 +- uses: github/codeql-action/analyze@e4fba868fa4b1b91e1fdab776edc8cfbe6e9fb81 # v4.37.3 - with: - category: /language:${{matrix.language}} diff --git a/.github/workflows/comment-labeled.yml b/.github/workflows/comment-labeled.yml @@ -749,7 +745,7 @@ index 72dd13b9e0..0000000000 -} diff --git a/.github/workflows/commit-lint.yml b/.github/workflows/commit-lint.yml deleted file mode 100644 -index 93ca3425be..0000000000 +index 896340ba3a..0000000000 --- a/.github/workflows/commit-lint.yml +++ /dev/null @@ -1,35 +0,0 @@ @@ -775,7 +771,7 @@ index 93ca3425be..0000000000 - run: | - echo "plusOne=$((${{ github.event.pull_request.commits }} + 1))" >> $GITHUB_OUTPUT - echo "minusOne=$((${{ github.event.pull_request.commits }} - 1))" >> $GITHUB_OUTPUT -- - uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6.0.3 +- - uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0 - with: - fetch-depth: ${{ steps.nb-of-commits.outputs.plusOne }} - persist-credentials: false @@ -790,7 +786,7 @@ index 93ca3425be..0000000000 - git rev-parse HEAD~${{ steps.nb-of-commits.outputs.minusOne }} | xargs npx -q core-validate-commit --no-validate-metadata --tap diff --git a/.github/workflows/commit-queue.yml b/.github/workflows/commit-queue.yml deleted file mode 100644 -index 8b5f37807b..0000000000 +index 7af7122687..0000000000 --- a/.github/workflows/commit-queue.yml +++ /dev/null @@ -1,99 +0,0 @@ @@ -855,7 +851,7 @@ index 8b5f37807b..0000000000 - if: needs.get_mergeable_prs.outputs.numbers != '' - runs-on: ubuntu-slim - steps: -- - uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6.0.3 +- - uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0 - with: - # A personal token is required because pushing with GITHUB_TOKEN will - # prevent commits from running CI after they land. It needs @@ -895,10 +891,10 @@ index 8b5f37807b..0000000000 - GITHUB_TOKEN: ${{ secrets.GH_USER_TOKEN }} diff --git a/.github/workflows/coverage-linux-without-intl.yml b/.github/workflows/coverage-linux-without-intl.yml deleted file mode 100644 -index 69fdc02c65..0000000000 +index a76d4d47e5..0000000000 --- a/.github/workflows/coverage-linux-without-intl.yml +++ /dev/null -@@ -1,86 +0,0 @@ +@@ -1,84 +0,0 @@ -name: Coverage Linux (without intl) - -on: @@ -950,20 +946,18 @@ index 69fdc02c65..0000000000 - if: github.event.pull_request.draft == false - runs-on: ubuntu-24.04 - steps: -- - uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6.0.3 +- - uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0 - with: - persist-credentials: false - - name: Set up Python ${{ env.PYTHON_VERSION }} -- uses: actions/setup-python@a309ff8b426b58ec0e2a45f0f869d46889d02405 # v6.2.0 +- uses: actions/setup-python@5fda3b95a4ea91299a34e894583c3862153e4b97 # v7.0.0 - with: - python-version: ${{ env.PYTHON_VERSION }} - - name: Set up sccache - if: github.base_ref == 'main' || github.ref_name == 'main' -- uses: Mozilla-Actions/sccache-action@9e7fa8a12102821edf02ca5dbea1acd0f89a2696 # v0.0.10 +- uses: Mozilla-Actions/sccache-action@fc920bf0ec8de6ee65d409111f7ec508035751ba # v0.0.11 - with: - version: v0.16.0 -- - name: Environment Information -- run: npx envinfo - - name: Install gcovr - run: pip install gcovr==7.2 - - name: Configure @@ -987,10 +981,10 @@ index 69fdc02c65..0000000000 - directory: ./coverage diff --git a/.github/workflows/coverage-linux.yml b/.github/workflows/coverage-linux.yml deleted file mode 100644 -index f4b7ed4296..0000000000 +index 65f52f5b36..0000000000 --- a/.github/workflows/coverage-linux.yml +++ /dev/null -@@ -1,86 +0,0 @@ +@@ -1,84 +0,0 @@ -name: Coverage Linux - -on: @@ -1042,20 +1036,18 @@ index f4b7ed4296..0000000000 - if: github.event.pull_request.draft == false - runs-on: ubuntu-24.04-arm - steps: -- - uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6.0.3 +- - uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0 - with: - persist-credentials: false - - name: Set up Python ${{ env.PYTHON_VERSION }} -- uses: actions/setup-python@a309ff8b426b58ec0e2a45f0f869d46889d02405 # v6.2.0 +- uses: actions/setup-python@5fda3b95a4ea91299a34e894583c3862153e4b97 # v7.0.0 - with: - python-version: ${{ env.PYTHON_VERSION }} - - name: Set up sccache - if: github.base_ref == 'main' || github.ref_name == 'main' -- uses: Mozilla-Actions/sccache-action@9e7fa8a12102821edf02ca5dbea1acd0f89a2696 # v0.0.10 +- uses: Mozilla-Actions/sccache-action@fc920bf0ec8de6ee65d409111f7ec508035751ba # v0.0.11 - with: - version: v0.16.0 -- - name: Environment Information -- run: npx envinfo - - name: Install gcovr - run: pip install gcovr==7.2 - - name: Configure @@ -1079,10 +1071,10 @@ index f4b7ed4296..0000000000 - directory: ./coverage diff --git a/.github/workflows/coverage-windows.yml b/.github/workflows/coverage-windows.yml deleted file mode 100644 -index 7d5afebad4..0000000000 +index cbb5a776cb..0000000000 --- a/.github/workflows/coverage-windows.yml +++ /dev/null -@@ -1,100 +0,0 @@ +@@ -1,98 +0,0 @@ -name: Coverage Windows - -on: @@ -1154,17 +1146,15 @@ index 7d5afebad4..0000000000 - if: github.event.pull_request.draft == false - runs-on: windows-2025 - steps: -- - uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6.0.3 +- - uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0 - with: - persist-credentials: false - - name: Set up Python ${{ env.PYTHON_VERSION }} -- uses: actions/setup-python@a309ff8b426b58ec0e2a45f0f869d46889d02405 # v6.2.0 +- uses: actions/setup-python@5fda3b95a4ea91299a34e894583c3862153e4b97 # v7.0.0 - with: - python-version: ${{ env.PYTHON_VERSION }} - - name: Install deps - run: choco install nasm -- - name: Environment Information -- run: npx envinfo - - name: Build - run: ./vcbuild.bat clang-cl - # TODO(bcoe): investigate tests that fail with coverage enabled @@ -1185,7 +1175,7 @@ index 7d5afebad4..0000000000 - directory: ./coverage diff --git a/.github/workflows/create-release-proposal.yml b/.github/workflows/create-release-proposal.yml deleted file mode 100644 -index ae4c4240a2..0000000000 +index 883bb48b0d..0000000000 --- a/.github/workflows/create-release-proposal.yml +++ /dev/null @@ -1,81 +0,0 @@ @@ -1224,7 +1214,7 @@ index ae4c4240a2..0000000000 - RELEASE_LINE: ${{ inputs.release-line }} - runs-on: ubuntu-slim - steps: -- - uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6.0.3 +- - uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0 - with: - ref: ${{ env.STAGING_BRANCH }} - persist-credentials: false @@ -1272,10 +1262,10 @@ index ae4c4240a2..0000000000 - BOT_TOKEN: ${{ secrets.GH_USER_TOKEN }} diff --git a/.github/workflows/daily-wpt-fyi.yml b/.github/workflows/daily-wpt-fyi.yml deleted file mode 100644 -index 2470ce6913..0000000000 +index 0895f1353e..0000000000 --- a/.github/workflows/daily-wpt-fyi.yml +++ /dev/null -@@ -1,179 +0,0 @@ +@@ -1,177 +0,0 @@ -# This workflow runs every night and tests various releases of Node.js -# (latest nightly, current, and two latest LTS release lines) against the -# `epochs/daily` branch of WPT. @@ -1317,11 +1307,9 @@ index 2470ce6913..0000000000 - runs-on: ubuntu-24.04-arm - steps: - - name: Set up Python ${{ env.PYTHON_VERSION }} -- uses: actions/setup-python@a309ff8b426b58ec0e2a45f0f869d46889d02405 # v6.2.0 +- uses: actions/setup-python@5fda3b95a4ea91299a34e894583c3862153e4b97 # v7.0.0 - with: - python-version: ${{ env.PYTHON_VERSION }} -- - name: Environment Information -- run: npx envinfo - - # install a version and checkout - - name: Get latest nightly @@ -1341,7 +1329,7 @@ index 2470ce6913..0000000000 - SHORT_SHA=$(node -p 'process.version.split(/-nightly\d{8}/)[1]') - echo "NIGHTLY_REF=$(gh api /repos/nodejs/node/commits/$SHORT_SHA --jq '.sha')" >> $GITHUB_ENV - - name: Checkout ${{ steps.setup-node.outputs.node-version }} -- uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6.0.3 +- uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0 - with: - persist-credentials: false - ref: ${{ env.NIGHTLY_REF || steps.setup-node.outputs.node-version }} @@ -1357,7 +1345,7 @@ index 2470ce6913..0000000000 - run: rm -rf wpt - working-directory: test/fixtures - - name: Checkout epochs/daily WPT -- uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6.0.3 +- uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0 - with: - repository: web-platform-tests/wpt - persist-credentials: false @@ -1388,7 +1376,7 @@ index 2470ce6913..0000000000 - # version-specific checkout above overwrites .github/actions/ - - name: Checkout undici WPT actions - if: ${{ env.WPT_REPORT != '' }} -- uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6.0.3 +- uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0 - with: - sparse-checkout: | - .github/actions/undici-wpt-current @@ -1457,10 +1445,10 @@ index 2470ce6913..0000000000 - done diff --git a/.github/workflows/daily.yml b/.github/workflows/daily.yml deleted file mode 100644 -index 23ffe66fb2..0000000000 +index 6c4b2ec9a4..0000000000 --- a/.github/workflows/daily.yml +++ /dev/null -@@ -1,32 +0,0 @@ +@@ -1,30 +0,0 @@ -name: Node.js daily job - -on: @@ -1479,15 +1467,13 @@ index 23ffe66fb2..0000000000 - if: github.repository == 'nodejs/node' || github.event_name == 'workflow_dispatch' - runs-on: ubuntu-24.04-arm - steps: -- - uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6.0.3 +- - uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0 - with: - persist-credentials: false - - name: Use Node.js ${{ env.NODE_VERSION }} - uses: actions/setup-node@48b55a011bda9f5d6aeb4c2d9c7362e8dae4041e # v6.4.0 - with: - node-version: ${{ env.NODE_VERSION }} -- - name: Environment Information -- run: npx envinfo - - name: Build lto - run: | - sudo apt-get update && sudo apt-get install ninja-build -y @@ -1495,10 +1481,10 @@ index 23ffe66fb2..0000000000 - ninja -C out/Release diff --git a/.github/workflows/doc.yml b/.github/workflows/doc.yml deleted file mode 100644 -index baf07c2b68..0000000000 +index 6e5dfe7326..0000000000 --- a/.github/workflows/doc.yml +++ /dev/null -@@ -1,43 +0,0 @@ +@@ -1,41 +0,0 @@ -name: Test and upload documentation to artifacts - -on: @@ -1525,15 +1511,13 @@ index baf07c2b68..0000000000 - if: github.event.pull_request.draft == false - runs-on: ubuntu-slim - steps: -- - uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6.0.3 +- - uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0 - with: - persist-credentials: false - - name: Use Node.js ${{ env.NODE_VERSION }} - uses: actions/setup-node@48b55a011bda9f5d6aeb4c2d9c7362e8dae4041e # v6.4.0 - with: - node-version: ${{ env.NODE_VERSION }} -- - name: Environment Information -- run: npx envinfo - - name: Build - run: NODE=$(command -v node) make doc-only - - uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1 @@ -1544,7 +1528,7 @@ index baf07c2b68..0000000000 - run: NODE=$(command -v node) make test-doc-ci TEST_CI_ARGS="-p actions --measure-flakiness 9" diff --git a/.github/workflows/find-inactive-collaborators.yml b/.github/workflows/find-inactive-collaborators.yml deleted file mode 100644 -index 35a0f4b1f5..0000000000 +index e6e0c7f54f..0000000000 --- a/.github/workflows/find-inactive-collaborators.yml +++ /dev/null @@ -1,50 +0,0 @@ @@ -1569,7 +1553,7 @@ index 35a0f4b1f5..0000000000 - runs-on: ubuntu-slim - - steps: -- - uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6.0.3 +- - uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0 - with: - fetch-depth: 0 - persist-credentials: false @@ -1600,7 +1584,7 @@ index 35a0f4b1f5..0000000000 - title: 'meta: move one or more collaborators to emeritus' diff --git a/.github/workflows/find-inactive-tsc.yml b/.github/workflows/find-inactive-tsc.yml deleted file mode 100644 -index 8deeaccf5d..0000000000 +index c1804b78d3..0000000000 --- a/.github/workflows/find-inactive-tsc.yml +++ /dev/null @@ -1,62 +0,0 @@ @@ -1626,13 +1610,13 @@ index 8deeaccf5d..0000000000 - - steps: - - name: Checkout the repo -- uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6.0.3 +- uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0 - with: - fetch-depth: 0 - persist-credentials: false - - - name: Clone nodejs/TSC repository -- uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6.0.3 +- uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0 - with: - fetch-depth: 0 - path: .tmp @@ -1751,7 +1735,7 @@ index 03aa1fa9a8..0000000000 - configuration-path: .github/label-pr-config.yml diff --git a/.github/workflows/license-builder.yml b/.github/workflows/license-builder.yml deleted file mode 100644 -index 36d303f9e1..0000000000 +index a95ee13c45..0000000000 --- a/.github/workflows/license-builder.yml +++ /dev/null @@ -1,38 +0,0 @@ @@ -1774,7 +1758,7 @@ index 36d303f9e1..0000000000 - if: github.repository == 'nodejs/node' - runs-on: ubuntu-slim - steps: -- - uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6.0.3 +- - uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0 - with: - persist-credentials: false - - run: ./tools/license-builder.sh # Run the license builder tool @@ -1795,7 +1779,7 @@ index 36d303f9e1..0000000000 - labels: meta diff --git a/.github/workflows/lint-release-proposal.yml b/.github/workflows/lint-release-proposal.yml deleted file mode 100644 -index 93c67df521..0000000000 +index e8ffab1784..0000000000 --- a/.github/workflows/lint-release-proposal.yml +++ /dev/null @@ -1,119 +0,0 @@ @@ -1824,7 +1808,7 @@ index 93c67df521..0000000000 - contents: read - pull-requests: read - steps: -- - uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6.0.3 +- - uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0 - with: - persist-credentials: false - fetch-depth: 2 @@ -1920,10 +1904,10 @@ index 93c67df521..0000000000 - GH_TOKEN: ${{ github.token }} diff --git a/.github/workflows/linters.yml b/.github/workflows/linters.yml deleted file mode 100644 -index fae3018e7a..0000000000 +index 9a9177e01c..0000000000 --- a/.github/workflows/linters.yml +++ /dev/null -@@ -1,262 +0,0 @@ +@@ -1,250 +0,0 @@ -name: Linters - -on: @@ -1951,37 +1935,33 @@ index fae3018e7a..0000000000 - if: github.event.pull_request.draft == false - runs-on: ubuntu-slim - steps: -- - uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6.0.3 +- - uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0 - with: - persist-credentials: false - - name: Use Node.js ${{ env.NODE_VERSION }} - uses: actions/setup-node@48b55a011bda9f5d6aeb4c2d9c7362e8dae4041e # v6.4.0 - with: - node-version: ${{ env.NODE_VERSION }} -- - name: Environment Information -- run: npx envinfo - - name: Lint addon docs - run: NODE=$(command -v node) make lint-addon-docs - lint-cpp: - if: github.event.pull_request.draft == false - runs-on: ubuntu-slim - steps: -- - uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6.0.3 +- - uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0 - with: - persist-credentials: false - - name: Set up Python ${{ env.PYTHON_VERSION }} -- uses: actions/setup-python@a309ff8b426b58ec0e2a45f0f869d46889d02405 # v6.2.0 +- uses: actions/setup-python@5fda3b95a4ea91299a34e894583c3862153e4b97 # v7.0.0 - with: - python-version: ${{ env.PYTHON_VERSION }} -- - name: Environment Information -- run: npx envinfo - - name: Lint C/C++ files - run: make lint-cpp - format-cpp: - if: ${{ github.event.pull_request && github.event.pull_request.draft == false && github.base_ref == github.event.repository.default_branch }} - runs-on: ubuntu-slim - steps: -- - uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6.0.3 +- - uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0 - with: - fetch-depth: 0 - persist-credentials: false @@ -1990,11 +1970,9 @@ index fae3018e7a..0000000000 - with: - node-version: ${{ env.NODE_VERSION }} - - name: Set up Python ${{ env.PYTHON_VERSION }} -- uses: actions/setup-python@a309ff8b426b58ec0e2a45f0f869d46889d02405 # v6.2.0 +- uses: actions/setup-python@5fda3b95a4ea91299a34e894583c3862153e4b97 # v7.0.0 - with: - python-version: ${{ env.PYTHON_VERSION }} -- - name: Environment Information -- run: npx envinfo - - name: Format C/C++ files - run: | - make format-cpp-build @@ -2019,15 +1997,13 @@ index fae3018e7a..0000000000 - if: github.event.pull_request.draft == false - runs-on: ubuntu-slim - steps: -- - uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6.0.3 +- - uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0 - with: - persist-credentials: false - - name: Use Node.js ${{ env.NODE_VERSION }} - uses: actions/setup-node@48b55a011bda9f5d6aeb4c2d9c7362e8dae4041e # v6.4.0 - with: - node-version: ${{ env.NODE_VERSION }} -- - name: Environment Information -- run: npx envinfo - - name: Lint JavaScript files - run: | - set +e @@ -2068,7 +2044,7 @@ index fae3018e7a..0000000000 - if: github.event.pull_request.draft == false - runs-on: ubuntu-slim - steps: -- - uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6.0.3 +- - uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0 - with: - persist-credentials: false - sparse-checkout: | @@ -2082,11 +2058,9 @@ index fae3018e7a..0000000000 - *.py - sparse-checkout-cone-mode: false - - name: Set up Python ${{ env.PYTHON_VERSION }} -- uses: actions/setup-python@a309ff8b426b58ec0e2a45f0f869d46889d02405 # v6.2.0 +- uses: actions/setup-python@5fda3b95a4ea91299a34e894583c3862153e4b97 # v7.0.0 - with: - python-version: ${{ env.PYTHON_VERSION }} -- - name: Environment Information -- run: npx envinfo - - name: Lint Python - run: | - make lint-py-build @@ -2095,7 +2069,7 @@ index fae3018e7a..0000000000 - if: github.event.pull_request.draft == false - runs-on: ubuntu-slim - steps: -- - uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6.0.3 +- - uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0 - with: - persist-credentials: false - sparse-checkout: | @@ -2105,11 +2079,9 @@ index fae3018e7a..0000000000 - *.yaml - sparse-checkout-cone-mode: false - - name: Use Python ${{ env.PYTHON_VERSION }} -- uses: actions/setup-python@a309ff8b426b58ec0e2a45f0f869d46889d02405 # v6.2.0 +- uses: actions/setup-python@5fda3b95a4ea91299a34e894583c3862153e4b97 # v7.0.0 - with: - python-version: ${{ env.PYTHON_VERSION }} -- - name: Environment Information -- run: npx envinfo - - name: Lint YAML - run: | - make lint-yaml-build || true @@ -2119,7 +2091,7 @@ index fae3018e7a..0000000000 - if: github.event.pull_request.draft == false - runs-on: ubuntu-slim - steps: -- - uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6.0.3 +- - uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0 - with: - persist-credentials: false - sparse-checkout: | @@ -2135,7 +2107,7 @@ index fae3018e7a..0000000000 - # cannot use ubuntu-24.04-arm here because the docker image is x86 only - runs-on: ubuntu-latest - steps: -- - uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6.0.3 +- - uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0 - with: - persist-credentials: false - - uses: mszostok/codeowners-validator@7f3f5e28c6d7b8dfae5731e54ce2272ca384592f @@ -2145,7 +2117,7 @@ index fae3018e7a..0000000000 - if: ${{ github.event.pull_request }} - runs-on: ubuntu-slim - steps: -- - uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6.0.3 +- - uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0 - with: - fetch-depth: 2 - persist-credentials: false @@ -2160,7 +2132,7 @@ index fae3018e7a..0000000000 - lint-readme: - runs-on: ubuntu-slim - steps: -- - uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6.0.3 +- - uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0 - with: - persist-credentials: false - sparse-checkout: | @@ -2428,7 +2400,7 @@ index cfb281310a..0000000000 -} diff --git a/.github/workflows/scorecard.yml b/.github/workflows/scorecard.yml deleted file mode 100644 -index a6a5b03022..0000000000 +index f84c91e1a3..0000000000 --- a/.github/workflows/scorecard.yml +++ /dev/null @@ -1,81 +0,0 @@ @@ -2470,17 +2442,17 @@ index a6a5b03022..0000000000 - - steps: - - name: Harden Runner -- uses: step-security/harden-runner@9af89fc71515a100421586dfdb3dc9c984fbf411 # v2.19.4 +- uses: step-security/harden-runner@bf7454d06d71f1098171f2acdf0cd4708d7b5920 # v2.20.0 - with: - egress-policy: audit # TODO: change to 'egress-policy: block' after couple of runs - - - name: Checkout code -- uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6.0.3 +- uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0 - with: - persist-credentials: false - - - name: Run analysis -- uses: ossf/scorecard-action@4eaacf0543bb3f2c246792bd56e8cdeffafb205a # v2.4.3 +- uses: ossf/scorecard-action@2d1146689b8cda280b9bc96326124645441f03bc # v2.4.4 - with: - results_file: results.sarif - results_format: sarif @@ -2510,12 +2482,12 @@ index a6a5b03022..0000000000 - - # Upload the results to GitHub's code scanning dashboard. - - name: Upload to code-scanning -- uses: github/codeql-action/upload-sarif@8aad20d150bbac5944a9f9d289da16a4b0d87c1e # v4.36.2 +- uses: github/codeql-action/upload-sarif@e4fba868fa4b1b91e1fdab776edc8cfbe6e9fb81 # v4.37.3 - with: - sarif_file: results.sarif diff --git a/.github/workflows/stale.yml b/.github/workflows/stale.yml deleted file mode 100644 -index d4be0ceaa3..0000000000 +index eb5921edb9..0000000000 --- a/.github/workflows/stale.yml +++ /dev/null @@ -1,51 +0,0 @@ @@ -2530,13 +2502,13 @@ index d4be0ceaa3..0000000000 -env: - CLOSE_MESSAGE: > - This {0} has been automatically closed after 30 days of inactivity -- following its stale status (no activity for a total of 240 days). +- following its stale status (no activity for a total of 120 days). - - If this is still relevant, feel free to reopen it or leave a comment - with additional details so we can continue the discussion. - - WARN_MESSAGE: > -- This {0} has been marked as stale due to 210 days of inactivity. +- This {0} has been marked as stale due to 90 days of inactivity. - - It will be automatically closed in 30 days if no further activity occurs. - If this is still relevant, please leave a comment or update it to keep it open. @@ -2554,10 +2526,10 @@ index d4be0ceaa3..0000000000 - if: github.repository == 'nodejs/node' - runs-on: ubuntu-slim - steps: -- - uses: actions/stale@eb5cf3af3ac0a1aa4c9c45633dd1ae542a27a899 # v10.3.0 +- - uses: actions/stale@4391f3da665fdf50b6810c1a66712fb9ba21aa93 # v11.0.0 - with: - repo-token: ${{ secrets.GITHUB_TOKEN }} -- days-before-stale: 210 +- days-before-stale: 90 - days-before-close: 30 - stale-issue-label: stale - exempt-issue-labels: never-stale, confirmed-bug @@ -2572,10 +2544,10 @@ index d4be0ceaa3..0000000000 - remove-stale-when-updated: true diff --git a/.github/workflows/stress-test.yml b/.github/workflows/stress-test.yml deleted file mode 100644 -index e3846cf4d3..0000000000 +index eca8c6aa5a..0000000000 --- a/.github/workflows/stress-test.yml +++ /dev/null -@@ -1,116 +0,0 @@ +@@ -1,114 +0,0 @@ -name: Stress Test (rebase tested branch on main for cache reuse) - -on: @@ -2632,7 +2604,7 @@ index e3846cf4d3..0000000000 - SCCACHE_GHA_ENABLED: 'true' - SCCACHE_IDLE_TIMEOUT: '0' - steps: -- - uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6.0.3 +- - uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0 - with: - persist-credentials: false - path: node @@ -2645,7 +2617,7 @@ index e3846cf4d3..0000000000 - if: runner.os == 'macOS' - run: sudo xcode-select -s /Applications/Xcode_${{ env.XCODE_VERSION }}.app - - name: Set up Python ${{ env.PYTHON_VERSION }} -- uses: actions/setup-python@a309ff8b426b58ec0e2a45f0f869d46889d02405 # v6.2.0 +- uses: actions/setup-python@5fda3b95a4ea91299a34e894583c3862153e4b97 # v7.0.0 - with: - python-version: ${{ env.PYTHON_VERSION }} - allow-prereleases: true @@ -2654,11 +2626,9 @@ index e3846cf4d3..0000000000 - rustup override set "$RUSTC_VERSION" - rustup --version - - name: Set up sccache -- uses: Mozilla-Actions/sccache-action@9e7fa8a12102821edf02ca5dbea1acd0f89a2696 # v0.0.10 +- uses: Mozilla-Actions/sccache-action@fc920bf0ec8de6ee65d409111f7ec508035751ba # v0.0.11 - with: - version: v0.16.0 -- - name: Environment Information -- run: npx envinfo@7.21.0 - # This is needed due to https://github.com/nodejs/build/issues/3878 - - name: Cleanup - if: runner.os == 'macOS' @@ -2694,10 +2664,10 @@ index e3846cf4d3..0000000000 - "$TEST_PATH" diff --git a/.github/workflows/test-internet.yml b/.github/workflows/test-internet.yml deleted file mode 100644 -index 7f8f4cc302..0000000000 +index bbc9fc9436..0000000000 --- a/.github/workflows/test-internet.yml +++ /dev/null -@@ -1,66 +0,0 @@ +@@ -1,64 +0,0 @@ -name: Test internet - -on: @@ -2746,30 +2716,103 @@ index 7f8f4cc302..0000000000 - if: (github.event_name == 'schedule' && github.repository == 'nodejs/node') || (github.event.pull_request && github.event.pull_request.draft == false) - runs-on: ubuntu-24.04-arm - steps: -- - uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6.0.3 +- - uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0 - with: - persist-credentials: false - - name: Set up Python ${{ env.PYTHON_VERSION }} -- uses: actions/setup-python@a309ff8b426b58ec0e2a45f0f869d46889d02405 # v6.2.0 +- uses: actions/setup-python@5fda3b95a4ea91299a34e894583c3862153e4b97 # v7.0.0 - with: - python-version: ${{ env.PYTHON_VERSION }} - - name: Set up sccache - if: github.base_ref == 'main' || github.ref_name == 'main' -- uses: Mozilla-Actions/sccache-action@9e7fa8a12102821edf02ca5dbea1acd0f89a2696 # v0.0.10 +- uses: Mozilla-Actions/sccache-action@fc920bf0ec8de6ee65d409111f7ec508035751ba # v0.0.11 - with: - version: v0.16.0 -- - name: Environment Information -- run: npx envinfo - - name: Build - run: make build-ci -j4 V=1 CONFIG_FLAGS="--error-on-warn" - - name: Test Internet - run: make test-internet -j4 V=1; +diff --git a/.github/workflows/test-linux-quic.yml b/.github/workflows/test-linux-quic.yml +deleted file mode 100644 +index 64c2e7d7ea..0000000000 +--- a/.github/workflows/test-linux-quic.yml ++++ /dev/null +@@ -1,69 +0,0 @@ +-name: Test Linux (with QUIC) +- +-on: +- workflow_dispatch: +- pull_request: +- paths: +- - .github/workflows/test-linux-quic.yml +- - configure.py +- - node.gyp +- - node.gypi +- - deps/ngtcp2/** +- - deps/nghttp3/** +- - deps/openssl/** +- - src/quic/** +- - src/node_bob* +- - lib/quic.js +- - lib/http3.js +- - lib/internal/quic/** +- - lib/stream/iter.js +- - lib/internal/streams/iter/** +- - test/cctest/test_quic_* +- - test/common/quic* +- - test/common/quic/** +- - test/parallel/*quic* +- - test/parallel/test-stream-iter-* +- types: [opened, synchronize, reopened, ready_for_review] +- +-concurrency: +- group: ${{ github.workflow }}-${{ github.head_ref || github.run_id }} +- cancel-in-progress: true +- +-env: +- PYTHON_VERSION: '3.14' +- FLAKY_TESTS: keep_retrying +- CC: ${{ (github.base_ref == 'main' || github.ref_name == 'main') && 'sccache' || '' }} clang +- CXX: ${{ (github.base_ref == 'main' || github.ref_name == 'main') && 'sccache' || '' }} clang++ +- SCCACHE_GHA_ENABLED: ${{ github.base_ref == 'main' || github.ref_name == 'main' }} +- SCCACHE_IDLE_TIMEOUT: '0' +- +-permissions: +- contents: read +- +-jobs: +- test-quic: +- if: github.event.pull_request.draft == false +- runs-on: ubuntu-24.04-arm +- steps: +- - uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0 +- with: +- persist-credentials: false +- path: node +- - name: Set up Python ${{ env.PYTHON_VERSION }} +- uses: actions/setup-python@5fda3b95a4ea91299a34e894583c3862153e4b97 # v7.0.0 +- with: +- python-version: ${{ env.PYTHON_VERSION }} +- - name: Set up sccache +- if: github.base_ref == 'main' || github.ref_name == 'main' +- uses: Mozilla-Actions/sccache-action@fc920bf0ec8de6ee65d409111f7ec508035751ba # v0.0.11 +- with: +- version: v0.16.0 +- - name: Build +- working-directory: node +- run: make build-ci -j4 V=1 CONFIG_FLAGS="--error-on-warn --experimental-quic" +- - name: Test +- working-directory: node +- run: make test-ci -j1 V=1 TEST_CI_ARGS="-p actions --measure-flakiness 9" +- - name: Ensure running tests did not cause any change in the tree +- working-directory: node +- run: git add -A && git diff --name-only --exit-code --staged diff --git a/.github/workflows/test-linux.yml b/.github/workflows/test-linux.yml deleted file mode 100644 -index 40ac519c7e..0000000000 +index 887db1dab8..0000000000 --- a/.github/workflows/test-linux.yml +++ /dev/null -@@ -1,87 +0,0 @@ +@@ -1,85 +0,0 @@ -name: Test Linux - -on: @@ -2826,21 +2869,19 @@ index 40ac519c7e..0000000000 - matrix: - os: [ubuntu-24.04, ubuntu-24.04-arm] - steps: -- - uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6.0.3 +- - uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0 - with: - persist-credentials: false - path: node - - name: Set up Python ${{ env.PYTHON_VERSION }} -- uses: actions/setup-python@a309ff8b426b58ec0e2a45f0f869d46889d02405 # v6.2.0 +- uses: actions/setup-python@5fda3b95a4ea91299a34e894583c3862153e4b97 # v7.0.0 - with: - python-version: ${{ env.PYTHON_VERSION }} - - name: Set up sccache - if: github.base_ref == 'main' || github.ref_name == 'main' -- uses: Mozilla-Actions/sccache-action@9e7fa8a12102821edf02ca5dbea1acd0f89a2696 # v0.0.10 +- uses: Mozilla-Actions/sccache-action@fc920bf0ec8de6ee65d409111f7ec508035751ba # v0.0.11 - with: - version: v0.16.0 -- - name: Environment Information -- run: npx envinfo - - name: Build - working-directory: node - run: make build-ci -j4 V=1 CONFIG_FLAGS="--error-on-warn" @@ -2859,10 +2900,10 @@ index 40ac519c7e..0000000000 - DIR: dir%20with $unusual"chars?'åß∂ƒ©∆¬…` diff --git a/.github/workflows/test-macos.yml b/.github/workflows/test-macos.yml deleted file mode 100644 -index 352282a9bb..0000000000 +index 7db72c8568..0000000000 --- a/.github/workflows/test-macos.yml +++ /dev/null -@@ -1,104 +0,0 @@ +@@ -1,102 +0,0 @@ -name: Test macOS - -on: @@ -2915,23 +2956,21 @@ index 352282a9bb..0000000000 - SCCACHE_GHA_ENABLED: ${{ github.base_ref == 'main' || github.ref_name == 'main' }} - SCCACHE_IDLE_TIMEOUT: '0' - steps: -- - uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6.0.3 +- - uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0 - with: - persist-credentials: false - path: node - - name: Set up Python ${{ env.PYTHON_VERSION }} -- uses: actions/setup-python@a309ff8b426b58ec0e2a45f0f869d46889d02405 # v6.2.0 +- uses: actions/setup-python@5fda3b95a4ea91299a34e894583c3862153e4b97 # v7.0.0 - with: - python-version: ${{ env.PYTHON_VERSION }} - - name: Set up Xcode ${{ env.XCODE_VERSION }} - run: sudo xcode-select -s /Applications/Xcode_${{ env.XCODE_VERSION }}.app - - name: Set up sccache - if: github.base_ref == 'main' || github.ref_name == 'main' -- uses: Mozilla-Actions/sccache-action@9e7fa8a12102821edf02ca5dbea1acd0f89a2696 # v0.0.10 +- uses: Mozilla-Actions/sccache-action@fc920bf0ec8de6ee65d409111f7ec508035751ba # v0.0.11 - with: - version: v0.16.0 -- - name: Environment Information -- run: npx envinfo - # The `npm ci` for this step fails a lot as part of the Test step. Run it - # now so that we don't have to wait 2 hours for the Build step to pass - # first before that failure happens. (And if there's something about @@ -2969,7 +3008,7 @@ index 352282a9bb..0000000000 - DIR: dir%20with $unusual"chars?'åß∂ƒ©∆¬…` diff --git a/.github/workflows/timezone-update.yml b/.github/workflows/timezone-update.yml deleted file mode 100644 -index 02299e66b3..0000000000 +index 94961f8ae6..0000000000 --- a/.github/workflows/timezone-update.yml +++ /dev/null @@ -1,74 +0,0 @@ @@ -2996,12 +3035,12 @@ index 02299e66b3..0000000000 - - steps: - - name: Checkout nodejs/node -- uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6.0.3 +- uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0 - with: - persist-credentials: false - - - name: Checkout unicode-org/icu-data -- uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6.0.3 +- uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0 - with: - path: icu-data - persist-credentials: false @@ -3049,7 +3088,7 @@ index 02299e66b3..0000000000 - update-pull-request-title-and-body: true diff --git a/.github/workflows/tools.yml b/.github/workflows/tools.yml deleted file mode 100644 -index aa99096658..0000000000 +index 900cf3ae00..0000000000 --- a/.github/workflows/tools.yml +++ /dev/null @@ -1,321 +0,0 @@ @@ -3341,7 +3380,7 @@ index aa99096658..0000000000 - tail -n1 temp-output | grep "NEW_VERSION=" >> "$GITHUB_ENV" || true - rm temp-output - steps: -- - uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6.0.3 +- - uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0 - if: github.event_name == 'schedule' || inputs.id == 'all' || inputs.id == matrix.id - with: - persist-credentials: false @@ -3349,7 +3388,7 @@ index aa99096658..0000000000 - if: | - (matrix.id == 'icu' || matrix.id == 'inspector_protocol') && - (github.event_name == 'schedule' || inputs.id == 'all' || inputs.id == matrix.id) -- uses: actions/setup-python@a309ff8b426b58ec0e2a45f0f869d46889d02405 # v6.2.0 +- uses: actions/setup-python@5fda3b95a4ea91299a34e894583c3862153e4b97 # v7.0.0 - with: - python-version: ${{ env.PYTHON_VERSION }} - - run: ${{ matrix.run }} @@ -3376,7 +3415,7 @@ index aa99096658..0000000000 - author: Node.js GitHub Bot diff --git a/.github/workflows/update-openssl.yml b/.github/workflows/update-openssl.yml deleted file mode 100644 -index d87f6b3a4b..0000000000 +index 49f0006526..0000000000 --- a/.github/workflows/update-openssl.yml +++ /dev/null @@ -1,61 +0,0 @@ @@ -3397,7 +3436,7 @@ index d87f6b3a4b..0000000000 - # Cannot use ubuntu-slim here because the update script requires Docker - runs-on: ubuntu-latest - steps: -- - uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6.0.3 +- - uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0 - with: - persist-credentials: false - - name: Check and download new OpenSSL version @@ -3443,7 +3482,7 @@ index d87f6b3a4b..0000000000 - path: deps/openssl diff --git a/.github/workflows/update-v8.yml b/.github/workflows/update-v8.yml deleted file mode 100644 -index e2794cc772..0000000000 +index e365cf7701..0000000000 --- a/.github/workflows/update-v8.yml +++ /dev/null @@ -1,57 +0,0 @@ @@ -3465,7 +3504,7 @@ index e2794cc772..0000000000 - if: github.repository == 'nodejs/node' - runs-on: ubuntu-slim - steps: -- - uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6.0.3 +- - uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0 - with: - persist-credentials: false - - name: Cache node modules and update-v8 @@ -3506,10 +3545,10 @@ index e2794cc772..0000000000 - labels: dependencies, v8 engine diff --git a/.github/workflows/update-wpt.yml b/.github/workflows/update-wpt.yml deleted file mode 100644 -index 05b1503f3c..0000000000 +index 4f752cc189..0000000000 --- a/.github/workflows/update-wpt.yml +++ /dev/null -@@ -1,87 +0,0 @@ +@@ -1,95 +0,0 @@ -name: WPT update - -on: @@ -3539,7 +3578,7 @@ index 05b1503f3c..0000000000 - subsystem: ${{ fromJSON(github.event.inputs.subsystems || '["url", "urlpattern", "WebCryptoAPI"]') }} - - steps: -- - uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6.0.3 +- - uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0 - with: - persist-credentials: false - @@ -3564,6 +3603,14 @@ index 05b1503f3c..0000000000 - - name: Update WPT for subsystem ${{ matrix.subsystem }} - run: | - git node wpt "$SUBSYSTEM" +- # TODO: Remove this workaround after @node-core/utils stops +- # regenerating test/fixtures/wpt/README.md for every subsystem +- # update. +- # git node wpt currently rewrites test/fixtures/wpt/README.md with a +- # generated summary for every subsystem update. versions.json is the +- # authoritative metadata, and keeping the README stable avoids +- # conflicts between concurrent WPT update PRs. +- git restore test/fixtures/wpt/README.md - env: - SUBSYSTEM: ${{ matrix.subsystem }} - diff --git a/patches/doc-build-mobile-notes-and-ignores.patch b/patches/doc-build-mobile-notes-and-ignores.patch index ca817ef224..c81cb3eff1 100644 --- a/patches/doc-build-mobile-notes-and-ignores.patch +++ b/patches/doc-build-mobile-notes-and-ignores.patch @@ -12,8 +12,8 @@ git operations in a built tree never sweep them up. Co-authored-by: Andre Staltz --- .gitignore | 5 + - README.md | 915 ++--------------------------------------------------- - 2 files changed, 32 insertions(+), 888 deletions(-) + README.md | 917 ++--------------------------------------------------- + 2 files changed, 32 insertions(+), 890 deletions(-) diff --git a/.gitignore b/.gitignore index 74eb99c815..ce1c201ce9 100644 @@ -39,10 +39,10 @@ index 74eb99c815..ce1c201ce9 100644 /deps/openssl/openssl.props /deps/openssl/openssl.targets diff --git a/README.md b/README.md -index dc175eadf5..1d3ab7e321 100644 +index a6cf7d6683..1d3ab7e321 100644 --- a/README.md +++ b/README.md -@@ -1,910 +1,49 @@ +@@ -1,912 +1,49 @@ -# Node.js +# Node.js for Mobile Apps @@ -390,8 +390,6 @@ index dc175eadf5..1d3ab7e321 100644 - **Dario Piotrowicz** <> (he/him) -* [deokjinkim](https://github.com/deokjinkim) - - **Deokjin Kim** <> (he/him) --* [edsadr](https://github.com/edsadr) - -- **Adrian Estrada** <> (he/him) -* [ErickWendel](https://github.com/ErickWendel) - - **Erick Wendel** <> (he/him) -* [Ethan-Arrowood](https://github.com/Ethan-Arrowood) - @@ -464,6 +462,8 @@ index dc175eadf5..1d3ab7e321 100644 - **Matteo Collina** <> (he/him) - [Support me](https://github.com/sponsors/mcollina) -* [meixg](https://github.com/meixg) - - **Xuguang Mei** <> (he/him) +-* [MikeMcC399](https://github.com/MikeMcC399) - +- **Mike McCready** <<66998419+MikeMcC399@users.noreply.github.com>> (he/him) -* [MoLow](https://github.com/MoLow) - - **Moshe Atlow** <> (he/him) -* [MrJithil](https://github.com/MrJithil) - @@ -584,6 +584,8 @@ index dc175eadf5..1d3ab7e321 100644 - **Xu Meng** <> (he/him) -* [dnlup](https://github.com/dnlup) - - **dnlup** <> +-* [edsadr](https://github.com/edsadr) - +- **Adrian Estrada** <> (he/him) -* [eljefedelrodeodeljefe](https://github.com/eljefedelrodeodeljefe) - - **Robert Jefe Lindstaedt** <> -* [estliberitas](https://github.com/estliberitas) - diff --git a/patches/files.map b/patches/files.map index d1ea87a89f..ba39cb8dd0 100644 --- a/patches/files.map +++ b/patches/files.map @@ -103,6 +103,7 @@ ci-remove-upstream-only-workflows-and-config.patch .github/workflows/scorecard.y ci-remove-upstream-only-workflows-and-config.patch .github/workflows/stale.yml ci-remove-upstream-only-workflows-and-config.patch .github/workflows/stress-test.yml ci-remove-upstream-only-workflows-and-config.patch .github/workflows/test-internet.yml +ci-remove-upstream-only-workflows-and-config.patch .github/workflows/test-linux-quic.yml ci-remove-upstream-only-workflows-and-config.patch .github/workflows/test-linux.yml ci-remove-upstream-only-workflows-and-config.patch .github/workflows/test-macos.yml ci-remove-upstream-only-workflows-and-config.patch .github/workflows/timezone-update.yml diff --git a/patches/lib-install-a-WebAssembly-polyfill-when-the-engine-h.patch b/patches/lib-install-a-WebAssembly-polyfill-when-the-engine-h.patch index fae0e117c9..5b2edbbe4f 100644 --- a/patches/lib-install-a-WebAssembly-polyfill-when-the-engine-h.patch +++ b/patches/lib-install-a-WebAssembly-polyfill-when-the-engine-h.patch @@ -15,7 +15,7 @@ jitless/frozen-intrinsics host gates in smoke-host. 2 files changed, 113 insertions(+) diff --git a/LICENSE b/LICENSE -index 2842efa128..58e2bea8b3 100644 +index 9cc3315dd3..b876545603 100644 --- a/LICENSE +++ b/LICENSE @@ -2944,3 +2944,26 @@ The externally maintained libraries used by Node.js are: @@ -46,7 +46,7 @@ index 2842efa128..58e2bea8b3 100644 + SOFTWARE. + """ diff --git a/lib/internal/process/pre_execution.js b/lib/internal/process/pre_execution.js -index 2716c2ae81..17c283aa7a 100644 +index a7ff17a646..45cc4326a6 100644 --- a/lib/internal/process/pre_execution.js +++ b/lib/internal/process/pre_execution.js @@ -9,6 +9,7 @@ const { @@ -65,7 +65,7 @@ index 2716c2ae81..17c283aa7a 100644 setupTraceCategoryState(); setupInspectorHooks(); setupNetworkInspection(); -@@ -363,6 +365,94 @@ function setupEventsource() { +@@ -364,6 +366,94 @@ function setupEventsource() { } } diff --git a/patches/src-crypto-mobile-adjustment-in-crypto_context.cc.patch b/patches/src-crypto-mobile-adjustment-in-crypto_context.cc.patch index 03aa640474..8e63ea4cfe 100644 --- a/patches/src-crypto-mobile-adjustment-in-crypto_context.cc.patch +++ b/patches/src-crypto-mobile-adjustment-in-crypto_context.cc.patch @@ -19,10 +19,10 @@ Co-authored-by: Julia Samól 1 file changed, 17 insertions(+) diff --git a/src/crypto/crypto_context.cc b/src/crypto/crypto_context.cc -index a26577b36a..33543d3d60 100644 +index 05fc2a00b3..b61f7d9eca 100644 --- a/src/crypto/crypto_context.cc +++ b/src/crypto/crypto_context.cc -@@ -312,6 +312,9 @@ bool isSelfIssued(X509* cert) { +@@ -335,6 +335,9 @@ bool isSelfIssued(X509* cert) { #ifdef __APPLE__ TrustStatus IsTrustDictionaryTrustedForPolicy(CFDictionaryRef trust_dict, bool is_self_issued) { @@ -32,7 +32,7 @@ index a26577b36a..33543d3d60 100644 // Trust settings may be scoped to a single application // skip as this is not supported if (CFDictionaryContainsKey(trust_dict, kSecTrustSettingsApplication)) { -@@ -403,6 +406,10 @@ TrustStatus IsTrustDictionaryTrustedForPolicy(CFDictionaryRef trust_dict, +@@ -426,6 +429,10 @@ TrustStatus IsTrustDictionaryTrustedForPolicy(CFDictionaryRef trust_dict, return (trust_settings_result == kSecTrustSettingsResultTrustAsRoot) ? TrustStatus::TRUSTED : TrustStatus::UNSPECIFIED; @@ -43,7 +43,7 @@ index a26577b36a..33543d3d60 100644 } TrustStatus IsTrustSettingsTrustedForPolicy(CFArrayRef trust_settings, -@@ -474,6 +481,8 @@ bool IsCertificateTrustedForPolicy(X509* cert, SecCertificateRef ref) { +@@ -497,6 +504,8 @@ bool IsCertificateTrustedForPolicy(X509* cert, SecCertificateRef ref) { bool trust_evaluated = false; bool is_self_issued = isSelfIssued(cert); @@ -52,7 +52,7 @@ index a26577b36a..33543d3d60 100644 // Evaluate user trust domain, then admin. User settings can override // admin (and both override the system domain, but we don't check that). for (const auto& trust_domain : -@@ -512,6 +521,14 @@ bool IsCertificateTrustedForPolicy(X509* cert, SecCertificateRef ref) { +@@ -535,6 +544,14 @@ bool IsCertificateTrustedForPolicy(X509* cert, SecCertificateRef ref) { CFRelease(trust_settings); } } diff --git a/patches/src-guard-POSIX-credential-APIs-on-Android.patch b/patches/src-guard-POSIX-credential-APIs-on-Android.patch index 552ec7f20e..605348c271 100644 --- a/patches/src-guard-POSIX-credential-APIs-on-Android.patch +++ b/patches/src-guard-POSIX-credential-APIs-on-Android.patch @@ -17,7 +17,7 @@ Co-authored-by: Andre Staltz 1 file changed, 48 insertions(+), 2 deletions(-) diff --git a/src/node_credentials.cc b/src/node_credentials.cc -index 0c7978a484..7e716c4da5 100644 +index d1f7c6e2a8..9c538b3015 100644 --- a/src/node_credentials.cc +++ b/src/node_credentials.cc @@ -45,7 +45,7 @@ bool linux_at_secure() { diff --git a/patches/src-mobile-platform-guards-in-node.cc-node_internals.patch b/patches/src-mobile-platform-guards-in-node.cc-node_internals.patch index a5c44a06b7..d2cf0ba922 100644 --- a/patches/src-mobile-platform-guards-in-node.cc-node_internals.patch +++ b/patches/src-mobile-platform-guards-in-node.cc-node_internals.patch @@ -15,10 +15,10 @@ Co-authored-by: Jaime Bernardo 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/src/node.cc b/src/node.cc -index 078497db7e..1184a00c8c 100644 +index f03a4447e5..9bc60cf2db 100644 --- a/src/node.cc +++ b/src/node.cc -@@ -693,6 +693,8 @@ void ResetStdio() { +@@ -698,6 +698,8 @@ void ResetStdio() { CHECK_NE(err, -1); } @@ -27,7 +27,7 @@ index 078497db7e..1184a00c8c 100644 if (s.isatty) { sigset_t sa; int err; -@@ -714,6 +716,7 @@ void ResetStdio() { +@@ -719,6 +721,7 @@ void ResetStdio() { // - if the process group is orphaned, e.g. because the user logged out, // tcsetattr fails with EIO } diff --git a/patches/test-mobile-test-harness.patch b/patches/test-mobile-test-harness.patch index ef7e0bfb0b..8f3a42165d 100644 --- a/patches/test-mobile-test-harness.patch +++ b/patches/test-mobile-test-harness.patch @@ -24,10 +24,10 @@ Co-authored-by: Andre Staltz diff --git a/test/common/index.js b/test/common/index.js old mode 100755 new mode 100644 -index 6cfebae8f4..b9a9213da1 +index 9d15b57bf6..70d5fefae0 --- a/test/common/index.js +++ b/test/common/index.js -@@ -159,6 +159,8 @@ const isFreeBSD = process.platform === 'freebsd'; +@@ -161,6 +161,8 @@ const isFreeBSD = process.platform === 'freebsd'; const isOpenBSD = process.platform === 'openbsd'; const isLinux = process.platform === 'linux'; const isMacOS = process.platform === 'darwin'; @@ -36,7 +36,7 @@ index 6cfebae8f4..b9a9213da1 const isASan = process.config.variables.asan === 1; const isRiscv64 = process.arch === 'riscv64'; const isDebug = process.features.debug; -@@ -945,8 +947,10 @@ const common = { +@@ -976,8 +978,10 @@ const common = { invalidArgTypeHelper, isAlive, isASan, diff --git a/patches/test-skip-adapt-parallel-and-sequential-tests-for-mo.patch b/patches/test-skip-adapt-parallel-and-sequential-tests-for-mo.patch index 5979292868..b58ca96aac 100644 --- a/patches/test-skip-adapt-parallel-and-sequential-tests-for-mo.patch +++ b/patches/test-skip-adapt-parallel-and-sequential-tests-for-mo.patch @@ -16,7 +16,7 @@ series itself. Co-authored-by: Jaime Bernardo Co-authored-by: Andre Staltz --- - test/parallel/parallel.status | 1398 +++++++++++++++++ + test/parallel/parallel.status | 1438 +++++++++++++++++ test/parallel/test-dgram-bind-fd.js | 2 +- test/parallel/test-dgram-membership.js | 10 +- .../parallel/test-dgram-socket-buffer-size.js | 2 +- @@ -51,13 +51,13 @@ Co-authored-by: Andre Staltz test/sequential/sequential.status | 129 ++ test/sequential/test-async-wrap-getasyncid.js | 15 +- test/sequential/test-fs-watch.js | 4 + - 35 files changed, 1708 insertions(+), 46 deletions(-) + 35 files changed, 1748 insertions(+), 46 deletions(-) diff --git a/test/parallel/parallel.status b/test/parallel/parallel.status -index cf7f8d42e8..d1f28be02e 100644 +index e4c82da4d6..7a71cae10c 100644 --- a/test/parallel/parallel.status +++ b/test/parallel/parallel.status -@@ -158,6 +158,1404 @@ test-tls-set-default-ca-certificates-append-fetch: SKIP +@@ -162,6 +162,1444 @@ test-tls-set-default-ca-certificates-append-fetch: SKIP test-tls-set-default-ca-certificates-reset-fetch: SKIP test-inspector-invalid-protocol: SKIP @@ -191,7 +191,11 @@ index cf7f8d42e8..d1f28be02e 100644 +test-openssl-ca-options: SKIP +test-os-homedir-no-envvar: SKIP +test-os-userinfo-handles-getter-errors: SKIP ++test-package-map-cli: SKIP +test-pending-deprecation: SKIP ++test-permission-audit-fs-does-not-deny: SKIP ++test-permission-drop-fs-granted-path: SKIP ++test-permission-drop-fs-specific-path: SKIP +test-permission-fs-write-trace-events: SKIP +test-pipe-head: SKIP +test-pipe-unref: SKIP @@ -211,6 +215,7 @@ index cf7f8d42e8..d1f28be02e 100644 +test-process-env: SKIP +test-process-exec-argv: SKIP +test-process-execpath: SKIP ++test-process-exit-after-fetch-throw: SKIP +test-process-exit-code: SKIP +test-process-external-stdio-close: SKIP +test-process-external-stdio-close-spawn: SKIP @@ -250,6 +255,7 @@ index cf7f8d42e8..d1f28be02e 100644 +test-repl-unsafe-array-iteration: SKIP +test-repl-unsupported-option: SKIP +test-require-invalid-main-no-exports: SKIP ++test-require-package-map: SKIP +test-require-symlink: SKIP +test-runner-cli: SKIP +test-runner-coverage: SKIP @@ -257,6 +263,7 @@ index cf7f8d42e8..d1f28be02e 100644 +test-runner-extraneous-async-activity: SKIP +test-runner-import-no-scheme: SKIP +test-runner-inspect: SKIP ++test-runner-log: SKIP +test-runner-misc: SKIP +test-runner-output: SKIP +test-runner-reporters: SKIP @@ -312,6 +319,7 @@ index cf7f8d42e8..d1f28be02e 100644 +test-throw-error-with-getter-throw-traced: SKIP +test-throw-undefined-or-null-traced: SKIP +test-tick-processor-arguments: SKIP ++test-timers-async-store-leak: SKIP +test-timers-immediate-promisified: SKIP +test-timers-interval-promisified: SKIP +test-timers-timeout-promisified: SKIP @@ -624,6 +632,15 @@ index cf7f8d42e8..d1f28be02e 100644 +test-permission-child-process-inherit-flags: SKIP +test-permission-child-process-inherit-flags-substring: SKIP +test-permission-config-file: SKIP ++test-permission-diagnostics-channel: SKIP ++test-permission-drop-addons: SKIP ++test-permission-drop-child-process: SKIP ++test-permission-drop-diagnostics-channel: SKIP ++test-permission-drop-errors: SKIP ++test-permission-drop-fs-all: SKIP ++test-permission-drop-fs-scope: SKIP ++test-permission-drop-fs-write: SKIP ++test-permission-drop-worker: SKIP +test-permission-fs-absolute-path: SKIP +test-permission-fs-read: SKIP +test-permission-fs-read-entrypoint: SKIP @@ -720,6 +737,11 @@ index cf7f8d42e8..d1f28be02e 100644 +test-debugger-low-level: SKIP +test-debugger-object-type-remote-object: SKIP +test-debugger-preserve-breaks: SKIP ++test-debugger-probe-cond: SKIP ++test-debugger-probe-cond-invalid: SKIP ++test-debugger-probe-cond-max-hit: SKIP ++test-debugger-probe-cond-shared: SKIP ++test-debugger-probe-cond-throws: SKIP +test-debugger-profile: SKIP +test-debugger-profile-command: SKIP +test-debugger-random-port: SKIP @@ -814,7 +836,11 @@ index cf7f8d42e8..d1f28be02e 100644 +test-openssl-ca-options: SKIP +test-os-homedir-no-envvar: SKIP +test-os-userinfo-handles-getter-errors: SKIP ++test-package-map-cli: SKIP +test-pending-deprecation: SKIP ++test-permission-audit-fs-does-not-deny: SKIP ++test-permission-drop-fs-granted-path: SKIP ++test-permission-drop-fs-specific-path: SKIP +test-pipe-head: SKIP +test-pipe-unref: SKIP +test-policy-crypto-default-encoding: SKIP @@ -833,6 +859,7 @@ index cf7f8d42e8..d1f28be02e 100644 +test-process-env: SKIP +test-process-exec-argv: SKIP +test-process-execpath: SKIP ++test-process-exit-after-fetch-throw: SKIP +test-process-exit-code: SKIP +test-process-external-stdio-close: SKIP +test-process-external-stdio-close-spawn: SKIP @@ -872,6 +899,7 @@ index cf7f8d42e8..d1f28be02e 100644 +test-repl-unsafe-array-iteration: SKIP +test-repl-unsupported-option: SKIP +test-require-invalid-main-no-exports: SKIP ++test-require-package-map: SKIP +test-require-symlink: SKIP +test-runner-cli: SKIP +test-runner-coverage: SKIP @@ -879,6 +907,7 @@ index cf7f8d42e8..d1f28be02e 100644 +test-runner-extraneous-async-activity: SKIP +test-runner-import-no-scheme: SKIP +test-runner-inspect: SKIP ++test-runner-log: SKIP +test-runner-misc: SKIP +test-runner-output: SKIP +test-runner-reporters: SKIP @@ -931,6 +960,7 @@ index cf7f8d42e8..d1f28be02e 100644 +test-throw-error-with-getter-throw-traced: SKIP +test-throw-undefined-or-null-traced: SKIP +test-tick-processor-arguments: SKIP ++test-timers-async-store-leak: SKIP +test-timers-immediate-promisified: SKIP +test-timers-interval-promisified: SKIP +test-timers-timeout-promisified: SKIP @@ -1043,6 +1073,7 @@ index cf7f8d42e8..d1f28be02e 100644 +# +test-fetch-disabled: SKIP +test-vm-codegen: SKIP ++test-wasm: SKIP +test-wasm-simple: SKIP +test-wasm-web-api: SKIP +test-worker-message-port-wasm-module: SKIP @@ -1157,6 +1188,15 @@ index cf7f8d42e8..d1f28be02e 100644 +# sandbox it is being denied by. See docs/TESTING.md, "How a test PASSes". +# +test-permission-allow-child-process-cli: SKIP ++test-permission-diagnostics-channel: SKIP ++test-permission-drop-addons: SKIP ++test-permission-drop-child-process: SKIP ++test-permission-drop-diagnostics-channel: SKIP ++test-permission-drop-errors: SKIP ++test-permission-drop-fs-all: SKIP ++test-permission-drop-fs-scope: SKIP ++test-permission-drop-fs-write: SKIP ++test-permission-drop-worker: SKIP +test-permission-fs-write: SKIP +test-permission-fs-windows-path: SKIP +# @@ -1476,7 +1516,7 @@ index daf7f8064b..76c2ce82dd 100644 assert.strictEqual(recvBufferSize, expectedBufferSize); assert.strictEqual(sendBufferSize, expectedBufferSize); diff --git a/test/parallel/test-dgram-membership.js b/test/parallel/test-dgram-membership.js -index ebfdaa9cb6..8414b251c8 100644 +index 052deb92d6..19e9b0e81e 100644 --- a/test/parallel/test-dgram-membership.js +++ b/test/parallel/test-dgram-membership.js @@ -108,7 +108,10 @@ const setup = dgram.createSocket.bind(dgram, { type: 'udp4', reuseAddr: true }); @@ -2108,10 +2148,10 @@ index e1595350cd..f5d84f7480 100644 + */ }); diff --git a/test/sequential/sequential.status b/test/sequential/sequential.status -index 627e61911d..7a4e74ce4a 100644 +index 01a021130c..059f682010 100644 --- a/test/sequential/sequential.status +++ b/test/sequential/sequential.status -@@ -43,6 +43,135 @@ test-perf-hooks: SKIP +@@ -39,6 +39,135 @@ test-perf-hooks: SKIP # https://github.com/nodejs/node/issues/39683 test-tls-psk-client: PASS, FLAKY diff --git a/upstream-base.txt b/upstream-base.txt index 8d882eb23f..ae6aab07a6 100644 --- a/upstream-base.txt +++ b/upstream-base.txt @@ -1,4 +1,4 @@ # The upstream nodejs/node release the patch series applies to. # First non-comment line is the tag (or SHA); update it as part of every # upstream bump (see README.md). -v24.19.0 +v24.20.0 From 9b56429fb6b262476fdeb25b1e1204c867aa71ba Mon Sep 17 00:00:00 2001 From: Gregor MacLennan Date: Tue, 1 Sep 2026 22:46:47 +0100 Subject: [PATCH 2/8] doc: record the two upgrade steps that are not in the loop Both bit during the v24.20.0 bump. prepare.sh clones --depth 1, so a patch touching a file upstream has modified since the old base fails with "sha1 information is lacking or useless" rather than a conflict: --3way has no pre-image blob to merge against. Fetching the old base tag into the tree supplies them and turns it back into an ordinary resolvable conflict. prepare.sh also refuses to run when out/ exists, so it cannot resume. After a conflict you apply the rest of the series yourself and redo the mobile-src overlay, which is easy to miss and leaves regenerate-patches.py reading every fork-only file as deleted. Adds a section on triaging the tests an upstream release adds, since the full device suite gates the merge on an upgrade PR and a minor release can add hundreds. Also notes that entries inferred this way do not belong in the blocks headed "measured on a full device sweep". --- AGENTS.md | 8 +++- docs/TESTING.md | 9 +++- docs/UPGRADING.md | 115 ++++++++++++++++++++++++++++++++++++++++++---- 3 files changed, 120 insertions(+), 12 deletions(-) diff --git a/AGENTS.md b/AGENTS.md index 6c87df23fb..48c266056c 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -73,7 +73,13 @@ Bump `upstream-base.txt`, run `prepare.sh`, resolve conflicts in `out/`, regenerate. Expect a handful of small conflicts. **A clean `git am` is not proof of correctness** — an upstream restructure can leave a platform guard (`#if TARGET_OS_OSX`) enclosing the wrong span, which only the compile -catches. → [docs/UPGRADING.md](./docs/UPGRADING.md) +catches. Two things bite every time: `prepare.sh`'s `--depth 1` clone has no +pre-image blobs, so a patch on an upstream-modified file dies with `sha1 +information is lacking or useless` until you `git -C out fetch --depth 1 +origin tag `; and `prepare.sh` can't resume, so after a conflict +you apply the rest of the series *and* redo the `mobile-src` overlay by hand. +New upstream tests need `.status` triage before the PR, not after — the full +device suite gates the merge. → [docs/UPGRADING.md](./docs/UPGRADING.md) ## Gotchas diff --git a/docs/TESTING.md b/docs/TESTING.md index 14b23fb1bc..a257c6a875 100644 --- a/docs/TESTING.md +++ b/docs/TESTING.md @@ -410,9 +410,16 @@ A test that runs with `--permission` but without `--allow-fs-write` cannot be scored when it calls `process.exit()`: the harness writes its verdict to a file from a `process.on('exit')` hook, and the permission model — correctly — denies that write, so no verdict lands and the run reports FAIL whatever the test did. -This is not fixable from inside the sandbox doing the denying. The 22 affected +This is not fixable from inside the sandbox doing the denying. The affected cases are skipped, with that reason recorded next to them in `parallel.status`. +The flags header is not the whole story: a test that starts with +`--allow-fs-write` and then calls `process.permission.drop('fs.write')` (or +`drop('fs')`) has the same problem from that point on, and the exit hook runs +after it. Read the `drop()` calls, not just the `// Flags:` line. Every +upstream release adds a few of these — → [UPGRADING.md](./UPGRADING.md#new-upstream-tests) +for the triage to run when the base moves. + ### The NAPI addon gate After the curated subset, each device workflow builds the **crc-native** N-API diff --git a/docs/UPGRADING.md b/docs/UPGRADING.md index 168565b8b3..2f8be8ea73 100644 --- a/docs/UPGRADING.md +++ b/docs/UPGRADING.md @@ -10,7 +10,7 @@ occasionally, one that only the compile catches (see the warning below). ## Re-base the series ```sh -$EDITOR upstream-base.txt # bump the tag, e.g. v24.19.0 +$EDITOR upstream-base.txt # bump the tag, e.g. v24.20.0 scripts/prepare.sh # clone new base + apply series ``` @@ -43,21 +43,118 @@ everything it needs to. Also: - check `.github/workflows/` in `out/` for **new upstream workflows** the - removal patch doesn't cover yet — delete-and-own them in the upstream-CI - removal patch (`ci-remove-upstream-only-workflows-and-config.patch`); a + removal patch doesn't cover yet — `git rm` them in `out/` *and* add each + path to `patches/files.map` against the upstream-CI removal patch + (`ci-remove-upstream-only-workflows-and-config.patch`), or + `regenerate-patches.py` rejects the deletion as owned by no patch. A `verify-patches` job asserts the materialized tree carries zero workflow files, so a missed one fails loudly. +- add `.status` entries for the tests upstream just added — see [new upstream + tests](#new-upstream-tests) below. -Then regenerate and commit: +### `sha1 information is lacking or useless` + +A patch that stops with + +``` +error: sha1 information is lacking or useless (README.md). +error: could not build fake ancestor +``` + +has not conflicted. `--3way` needs the *pre-image* blob the patch header +records, and `prepare.sh` clones `--depth 1`, so `out/` holds only the new +tag's blobs — for any file upstream touched since the old base, git has +nothing to merge against. Fetch the base you are moving off to supply them: + +```sh +git -C out fetch --depth 1 origin tag v24.19.0 +``` + +Retry the patch and it either applies or fails as an ordinary content +conflict you can resolve. Do this before editing anything by hand: with the +old blobs present, `git am --3way` absorbs most upstream drift on its own. + +### Finishing the series by hand + +`prepare.sh` refuses to run when `out/` exists, so it cannot be re-run to +resume. Once you have resolved the conflict, land it and apply the rest of +`patches/series` yourself with the same invocation the script uses: + +```sh +git -C out am --continue +git -C out am --3way --keep-cr --whitespace=nowarn patches/.patch +``` + +Then redo step 3, the `mobile-src/` overlay, which never ran. It is not +optional — without that commit `out/` is upstream plus patches, and +`regenerate-patches.py` reads every fork-only file as deleted: ```sh -git -C out add -A && git -C out commit -m "resolve v24.19.0 conflicts" # any shape +( cd mobile-src && git ls-files -z --cached --others --exclude-standard . ) > /tmp/manifest +( cd mobile-src && tar cf - --null -T /tmp/manifest ) | ( cd out && tar xf - ) +git -C out add -f --pathspec-from-file=/tmp/manifest --pathspec-file-nul +git -C out commit -m "mobile: fork-only files (mobile-src overlay)" +``` + +### Regenerate and commit + +```sh +git -C out add -A && git -C out commit -m "resolve v24.20.0 conflicts" # any shape scripts/regenerate-patches.py out # re-emits patches/ + syncs mobile-src/ # update expected-tree.txt to the hash the script prints -git add -A && git commit -m "upgrade: rebase patch series onto v24.19.0" +git add -A && git commit -m "upgrade: rebase patch series onto v24.20.0" +``` + +Reconstruction from a clean clone is what CI checks, so check it here too: +`rm -rf /tmp/verify && scripts/prepare.sh /tmp/verify` must print `OK` on the +hash you just committed. + +## New upstream tests + +Edit `test/*/*.status` in `out/`, before the regenerate step above. + +The full suite is a deny-list, so every test a release adds runs on device +the moment the base moves — and the suite gates the merge. Work out what +needs skipping *before* pushing rather than reading it off a red run: + +```sh +git -C out diff --name-status v24.19.0 v24.20.0 -- test/parallel test/sequential | grep '^A' ``` -Open the PR. CI re-runs the reconstruction against a fresh upstream clone, +A minor release can add hundreds. Most need nothing. Triage by cause: + +- **Spawns a child node process** — grep the new files for `child_process`, + `spawnSync`, `execFile`, `process.execPath`. Cannot pass on either + platform: on Android `process.execPath` is `app_process64`, so the child + SIGABRTs. Skip. +- **Runs under `--permission` with no `--allow-fs-write`** at exit — read the + `// Flags:` header, and watch for a test that starts with the permission + and calls `process.permission.drop('fs.write')` (or `'fs'`) partway + through. The verdict write is denied either way. Skip. +- **Self-skipping** — a test that ends at `common.skip()` scores PASS, so it + needs no entry. This is why v24.20.0's ~250 new QUIC tests are absent from + `parallel.status`: the mobile build doesn't pass `--experimental-quic`, so + `hasQuic` is false and each one skips itself. +- **Already covered by a glob** — check before adding. `test-cli-*`, + `test-eslint-*` and `test-child-process-*` are skipped wholesale on both + platforms; `test-debugger-probe-*` is a glob on Android but an itemized + list on iOS, so a new member of that family needs an iOS entry only. +- **Everything else** — leave it to run. The suite is the measurement. + +`// Flags:` headers *are* honoured on device (the proxy forwards the whole +argv `test.py` hands it), so a new flag-gated feature needs no special +handling. + +Put entries in the cause-named section that matches, on both platforms unless +the cause is platform-specific, in the block's existing sort order. Leave the +blocks headed *"measured on a full device sweep"* alone: those record what a +run actually observed, and an inferred entry filed there makes the heading a +lie. Say in the PR that the new entries are inferred and the suite is what +confirms them. + +## Open the PR + +CI re-runs the reconstruction against a fresh upstream clone, validates each patch individually, and — once merged — builds the full matrix. The version bump and release are a separate step (below), so an upgrade can land and be exercised before anyone decides to ship it. @@ -66,9 +163,7 @@ Because the PR moves `upstream-base.txt`, it also runs the **full device suite** on both platforms and cannot merge until that is green (the curated gate is an allow-list, so it cannot see tests upstream just added — they would otherwise surface on the nightly or at release). Expect the PR to take -substantially longer than a normal one, and expect new upstream tests to need -`.status` entries: anything that spawns a child node process cannot pass on -either platform. → [TESTING.md](./TESTING.md) +substantially longer than a normal one. → [TESTING.md](./TESTING.md) Merging the bump also moves this fork's `upstream-base` branch to the new tag, via the `upstream-base` job. That branch is load-bearing rather than From cba1b8821c1b037f9cc9b48196c487da3bae14db Mon Sep 17 00:00:00 2001 From: Gregor MacLennan Date: Wed, 2 Sep 2026 00:57:20 +0100 Subject: [PATCH 3/8] build,ios: link libncrypto_engine.a into the framework MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit v24.20.0 moves ncrypto::EnginePointer out of ncrypto.cc into a new deps/ncrypto/engine.cc, built as its own static_library target that ncrypto depends on. gyp picks that dependency up on Android, but the iOS framework links a hand-maintained list of archives, so libnode_base's references to EnginePointer::init, loadPrivateKey, setClientCertEngine and friends had nothing to resolve against and both iOS legs failed at Ld. The archive is already built — only the copy list and the pbxproj needed to learn about it. Same shape as the libnode_base split in v24.19.0, and common to both flavors: the target is gated on OpenSSL >= 3, not on any of the flags lite drops. --- expected-tree.txt | 2 +- .../tools/ios-framework/NodeMobile.xcodeproj/project.pbxproj | 4 ++++ mobile-src/tools/ios_framework_prepare.sh | 3 +++ 3 files changed, 8 insertions(+), 1 deletion(-) diff --git a/expected-tree.txt b/expected-tree.txt index 6e7c5b1e35..f0521224c5 100644 --- a/expected-tree.txt +++ b/expected-tree.txt @@ -14,4 +14,4 @@ # run prepare.sh (or regenerate-patches.py, which prints the hash) and # update the value below in the same commit. If you forget, CI fails and # prints the hash it got. -fb503ea45e0582c9ec6c9011905597f9633c5869 +821c5305e0945674cfc6167a9ab7895e5623739a diff --git a/mobile-src/tools/ios-framework/NodeMobile.xcodeproj/project.pbxproj b/mobile-src/tools/ios-framework/NodeMobile.xcodeproj/project.pbxproj index 333a453b73..ffffa6cc98 100644 --- a/mobile-src/tools/ios-framework/NodeMobile.xcodeproj/project.pbxproj +++ b/mobile-src/tools/ios-framework/NodeMobile.xcodeproj/project.pbxproj @@ -19,6 +19,7 @@ A36728F02E53580A004DF2FB /* libllhttp.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 33300EAC240437620019E302 /* libllhttp.a */; }; A36728F12E53580A004DF2FB /* libnbytes.a in Frameworks */ = {isa = PBXBuildFile; fileRef = A36728C02E530EF7004DF2FB /* libnbytes.a */; }; A36728F22E53580A004DF2FB /* libncrypto.a in Frameworks */ = {isa = PBXBuildFile; fileRef = A36728C12E530EF7004DF2FB /* libncrypto.a */; }; + B1CE0A012E53580A004DF2FB /* libncrypto_engine.a in Frameworks */ = {isa = PBXBuildFile; fileRef = B1CE0A022E530EF7004DF2FB /* libncrypto_engine.a */; }; A36728F32E53580A004DF2FB /* libnghttp2.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 334822141F6AFBD200CF403E /* libnghttp2.a */; }; A36728F42E53580A004DF2FB /* libnode.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 3376C91D1EC3922F0007AD59 /* libnode.a */; }; A36728F42E53580A004E02FB /* libnode_base.a in Frameworks */ = {isa = PBXBuildFile; fileRef = A36728F42E53580A004E12FB /* libnode_base.a */; }; @@ -77,6 +78,7 @@ A36728BF2E530EF7004DF2FB /* libabseil.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libabseil.a; path = bin/libabseil.a; sourceTree = ""; }; A36728C02E530EF7004DF2FB /* libnbytes.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libnbytes.a; path = bin/libnbytes.a; sourceTree = ""; }; A36728C12E530EF7004DF2FB /* libncrypto.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libncrypto.a; path = bin/libncrypto.a; sourceTree = ""; }; + B1CE0A022E530EF7004DF2FB /* libncrypto_engine.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libncrypto_engine.a; path = bin/libncrypto_engine.a; sourceTree = ""; }; A36728C32E530EF7004DF2FB /* libzlib_data_chunk_simd.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libzlib_data_chunk_simd.a; path = bin/libzlib_data_chunk_simd.a; sourceTree = ""; }; A36728C62E5355E5004DF2FB /* Security.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Security.framework; path = Platforms/MacOSX.platform/Developer/SDKs/MacOSX15.5.sdk/System/Library/Frameworks/Security.framework; sourceTree = DEVELOPER_DIR; }; A3F2E7582E716AA30001C23B /* libsqlite.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libsqlite.a; path = bin/libsqlite.a; sourceTree = ""; }; @@ -127,6 +129,7 @@ A36728FB2E53580A004DF2FB /* libv8_compiler.a in Frameworks */, D9A7619D1F7C63A8006AFE86 /* CoreFoundation.framework in Frameworks */, A36728F22E53580A004DF2FB /* libncrypto.a in Frameworks */, + B1CE0A012E53580A004DF2FB /* libncrypto_engine.a in Frameworks */, A36729032E53580A004DF2FB /* libzlib.a in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; @@ -161,6 +164,7 @@ A36728BD2E530EF7004DF2FB /* libhighway.a */, A36728C02E530EF7004DF2FB /* libnbytes.a */, A36728C12E530EF7004DF2FB /* libncrypto.a */, + B1CE0A022E530EF7004DF2FB /* libncrypto_engine.a */, A36728BA2E530EF7004DF2FB /* libsimdjson.a */, DEADBEEF000000000000D001 /* libicui18n.a */, DEADBEEF000000000000D003 /* libicuucx.a */, diff --git a/mobile-src/tools/ios_framework_prepare.sh b/mobile-src/tools/ios_framework_prepare.sh index 4e3e546ff7..ef081b370f 100755 --- a/mobile-src/tools/ios_framework_prepare.sh +++ b/mobile-src/tools/ios_framework_prepare.sh @@ -66,6 +66,9 @@ declare -a outputs_common=( "libmerve.a" "libnbytes.a" "libncrypto.a" + # v24.20.0 split EnginePointer out of ncrypto into its own target; libnode_base + # references it, so the framework link needs the archive too. + "libncrypto_engine.a" "libnghttp2.a" "libnode.a" # node's own objects; upstream v24.19.0 split them out of libnode into the From f1b3351fe4508c8b4e5128f4eac006e1a7b28336 Mon Sep 17 00:00:00 2001 From: Gregor MacLennan Date: Wed, 2 Sep 2026 00:58:14 +0100 Subject: [PATCH 4/8] doc: note that a split upstream target breaks the iOS link MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The iOS framework links a hand-maintained archive list, so a new gyp static_library is invisible to it until Ld fails on symbols nobody touched — an hour into the build, after every compile has passed. Twice in two releases now. --- docs/UPGRADING.md | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/docs/UPGRADING.md b/docs/UPGRADING.md index 2f8be8ea73..6f944618a5 100644 --- a/docs/UPGRADING.md +++ b/docs/UPGRADING.md @@ -51,6 +51,16 @@ Also: files, so a missed one fails loudly. - add `.status` entries for the tests upstream just added — see [new upstream tests](#new-upstream-tests) below. +- watch for upstream **splitting a build target**. gyp resolves the new + dependency on Android, but the iOS framework links a hand-maintained list of + archives — `outputs_common` in `mobile-src/tools/ios_framework_prepare.sh` + plus four entries in the `NodeMobile.xcodeproj` pbxproj — so a new + `static_library` shows up as undefined symbols at `Ld`, long after every + compile has passed. v24.19.0 split `libnode_base` out of `libnode`; + v24.20.0 split `libncrypto_engine` out of `libncrypto`. If an iOS leg + fails with `Undefined symbols` naming a class you did not touch, check + `deps/*/*.gyp` for a target that did not exist at the old base. Note the + pbxproj is `.gitignore`d inside the tree, so staging it needs `git add -f`. ### `sha1 information is lacking or useless` From c31844ec963e9489d7a2150f82d54c77d8e266e0 Mon Sep 17 00:00:00 2001 From: Gregor MacLennan Date: Wed, 2 Sep 2026 03:37:09 +0100 Subject: [PATCH 5/8] src: skip --experimental-wasm-jspi on iOS v24.20.0 appends --experimental-wasm-jspi to the V8 argument list unconditionally. iOS builds V8 with --v8-lite-mode, which turns off V8_ENABLE_WEBASSEMBLY and compiles out the whole --experimental-wasm-* family, so V8 leaves the flag unconsumed, node reports "bad option" and returns kInvalidCommandLineArgument before running a line of JS. Every iOS launch failed: the boot smoke got a FAIL verdict with no output, and the curated suite could not even complete test.py's `-p process.arch` probe, so it reported "No tests to run". Guarded on the platform rather than on V8_ENABLE_WEBASSEMBLY: node.gyp never includes v8_gypfiles/features.gypi, so that define reaches V8's targets and not node's own. Testing it here would read as false everywhere and drop the flag on Android too, where V8 is not in lite mode and WebAssembly works. Android is unaffected and its builds and both boot smokes passed on the run that caught this. --- expected-tree.txt | 2 +- ...orm-guards-in-node.cc-node_internals.patch | 30 +++++++++++++++++-- 2 files changed, 28 insertions(+), 4 deletions(-) diff --git a/expected-tree.txt b/expected-tree.txt index f0521224c5..f99c7fca79 100644 --- a/expected-tree.txt +++ b/expected-tree.txt @@ -14,4 +14,4 @@ # run prepare.sh (or regenerate-patches.py, which prints the hash) and # update the value below in the same commit. If you forget, CI fails and # prints the hash it got. -821c5305e0945674cfc6167a9ab7895e5623739a +5b78a8155a21da69eefee62935bddb4f2c996621 diff --git a/patches/src-mobile-platform-guards-in-node.cc-node_internals.patch b/patches/src-mobile-platform-guards-in-node.cc-node_internals.patch index d2cf0ba922..a1c786d936 100644 --- a/patches/src-mobile-platform-guards-in-node.cc-node_internals.patch +++ b/patches/src-mobile-platform-guards-in-node.cc-node_internals.patch @@ -8,14 +8,24 @@ for process-level facilities mobile OSes forbid or lack (tty tcsetattr teardown on iOS; NODE_IMPLEMENTS_POSIX_CREDENTIALS turned on for Android API >= 21, which upstream leaves off). +Also drops --experimental-wasm-jspi from the V8 argument list on iOS, +which upstream appends unconditionally as of v24.20.0. iOS builds V8 in +lite mode, so V8_ENABLE_WEBASSEMBLY is off and the whole +--experimental-wasm-* flag family does not exist; V8 leaves the flag +unconsumed and node turns that into "bad option" and exits before +running any JS. The guard is on the platform rather than on +V8_ENABLE_WEBASSEMBLY because node's own targets never receive that +define -- it is set only on V8's, and testing it here would silently +drop the flag on Android too, where WebAssembly is enabled. + Co-authored-by: Jaime Bernardo --- - src/node.cc | 3 +++ + src/node.cc | 9 +++++++++ src/node_internals.h | 2 +- - 2 files changed, 4 insertions(+), 1 deletion(-) + 2 files changed, 10 insertions(+), 1 deletion(-) diff --git a/src/node.cc b/src/node.cc -index f03a4447e5..9bc60cf2db 100644 +index f03a4447e5..967abd834d 100644 --- a/src/node.cc +++ b/src/node.cc @@ -698,6 +698,8 @@ void ResetStdio() { @@ -35,6 +45,20 @@ index f03a4447e5..9bc60cf2db 100644 } #endif // __POSIX__ } +@@ -787,7 +790,13 @@ static ExitCode ProcessGlobalArgsInternal(std::vector* args, + } + + // WebAssembly JS Promise Integration ++ // nodejs-mobile patch: iOS builds V8 in lite mode, which compiles out ++ // WebAssembly and every --experimental-wasm-* flag with it. V8 leaves the ++ // unrecognized flag in v8_args and node then fails with "bad option" before ++ // running any JS, so the flag must not be added there. ++#if !(defined(__APPLE__) && TARGET_OS_IPHONE) + v8_args.emplace_back("--experimental-wasm-jspi"); ++#endif // !(defined(__APPLE__) && TARGET_OS_IPHONE) + + #ifdef __POSIX__ + // Block SIGPROF signals when sleeping in epoll_wait/kevent/etc. Avoids the diff --git a/src/node_internals.h b/src/node_internals.h index 8e930a6fec..b279bf9999 100644 --- a/src/node_internals.h From 139cb7e9f83c9742bbb83f9c437ac02efd447b55 Mon Sep 17 00:00:00 2001 From: Gregor MacLennan Date: Wed, 2 Sep 2026 07:22:43 +0100 Subject: [PATCH 6/8] test: skip three more child-process tests on Android The full Android suite found what static triage missed. All three spawn a child node process, which cannot work on Android where process.execPath is app_process64 -- the child's stderr comes back as "Error changing dalvik-cache ownership: Permission denied". None of them names child_process. test-stream-iter-disabled and test-stream-iter-readable-interop-disabled call spawnPromisified destructured off require('../common'), and test-runner-entry-file spawns through node:test's run({ isolation: 'process' }). Android only: all three pass on the iOS simulator, where posix_spawn is permitted, and the iOS suite is green with them running. Skipping a test that currently passes would cost coverage for nothing. --- expected-tree.txt | 2 +- ...p-adapt-parallel-and-sequential-tests-for-mo.patch | 11 +++++++---- 2 files changed, 8 insertions(+), 5 deletions(-) diff --git a/expected-tree.txt b/expected-tree.txt index f99c7fca79..a555359064 100644 --- a/expected-tree.txt +++ b/expected-tree.txt @@ -14,4 +14,4 @@ # run prepare.sh (or regenerate-patches.py, which prints the hash) and # update the value below in the same commit. If you forget, CI fails and # prints the hash it got. -5b78a8155a21da69eefee62935bddb4f2c996621 +e421e4206e44d197e0396328a44bf623efaad9d2 diff --git a/patches/test-skip-adapt-parallel-and-sequential-tests-for-mo.patch b/patches/test-skip-adapt-parallel-and-sequential-tests-for-mo.patch index b58ca96aac..028925213e 100644 --- a/patches/test-skip-adapt-parallel-and-sequential-tests-for-mo.patch +++ b/patches/test-skip-adapt-parallel-and-sequential-tests-for-mo.patch @@ -16,7 +16,7 @@ series itself. Co-authored-by: Jaime Bernardo Co-authored-by: Andre Staltz --- - test/parallel/parallel.status | 1438 +++++++++++++++++ + test/parallel/parallel.status | 1441 +++++++++++++++++ test/parallel/test-dgram-bind-fd.js | 2 +- test/parallel/test-dgram-membership.js | 10 +- .../parallel/test-dgram-socket-buffer-size.js | 2 +- @@ -51,13 +51,13 @@ Co-authored-by: Andre Staltz test/sequential/sequential.status | 129 ++ test/sequential/test-async-wrap-getasyncid.js | 15 +- test/sequential/test-fs-watch.js | 4 + - 35 files changed, 1748 insertions(+), 46 deletions(-) + 35 files changed, 1751 insertions(+), 46 deletions(-) diff --git a/test/parallel/parallel.status b/test/parallel/parallel.status -index e4c82da4d6..7a71cae10c 100644 +index e4c82da4d6..3091abc240 100644 --- a/test/parallel/parallel.status +++ b/test/parallel/parallel.status -@@ -162,6 +162,1444 @@ test-tls-set-default-ca-certificates-append-fetch: SKIP +@@ -162,6 +162,1447 @@ test-tls-set-default-ca-certificates-append-fetch: SKIP test-tls-set-default-ca-certificates-reset-fetch: SKIP test-inspector-invalid-protocol: SKIP @@ -259,6 +259,7 @@ index e4c82da4d6..7a71cae10c 100644 +test-require-symlink: SKIP +test-runner-cli: SKIP +test-runner-coverage: SKIP ++test-runner-entry-file: SKIP +test-runner-exit-code: SKIP +test-runner-extraneous-async-activity: SKIP +test-runner-import-no-scheme: SKIP @@ -314,6 +315,8 @@ index e4c82da4d6..7a71cae10c 100644 +test-stdout-close-unref: SKIP +test-stdout-stderr-reading: SKIP +test-stdout-to-file: SKIP ++test-stream-iter-disabled: SKIP ++test-stream-iter-readable-interop-disabled: SKIP +test-stream-pipeline-process: SKIP +test-sync-io-option: SKIP +test-throw-error-with-getter-throw-traced: SKIP From 8233d82444a0ca1b65409a2b92ebd5b5ebaade8b Mon Sep 17 00:00:00 2001 From: Gregor MacLennan Date: Wed, 2 Sep 2026 07:22:44 +0100 Subject: [PATCH 7/8] doc: widen the child-process triage beyond grepping child_process The recipe as written missed all three tests the Android suite then caught, because none of them imports child_process: two spawn through spawnPromisified destructured off common, one through node:test's run({ isolation: 'process' }). Names the patterns that actually find them, and records that such tests fail on Android while still passing on the iOS simulator, so the skip belongs on one platform and not both. --- docs/UPGRADING.md | 19 +++++++++++++++---- 1 file changed, 15 insertions(+), 4 deletions(-) diff --git a/docs/UPGRADING.md b/docs/UPGRADING.md index 6f944618a5..960c56fb44 100644 --- a/docs/UPGRADING.md +++ b/docs/UPGRADING.md @@ -133,10 +133,16 @@ git -C out diff --name-status v24.19.0 v24.20.0 -- test/parallel test/sequential A minor release can add hundreds. Most need nothing. Triage by cause: -- **Spawns a child node process** — grep the new files for `child_process`, - `spawnSync`, `execFile`, `process.execPath`. Cannot pass on either - platform: on Android `process.execPath` is `app_process64`, so the child - SIGABRTs. Skip. +- **Spawns a child node process** — cannot pass on Android, where + `process.execPath` is `app_process64`, so the child SIGABRTs (its stderr + comes back as `Error changing dalvik-cache ownership`). Skip. Grepping for + `child_process` is **not** enough, and this is where triage actually goes + wrong: a test can spawn through `common.spawnPromisified` destructured off + `require('../common')`, which never names `child_process`, or through + `node:test`'s `run({ isolation: 'process' })`, which spawns inside the + runner. Grep for `process.execPath`, `spawnPromisified` and `isolation` + too, and read the test titles — `'…forwarded from child processes'` is the + giveaway that greps miss. - **Runs under `--permission` with no `--allow-fs-write`** at exit — read the `// Flags:` header, and watch for a test that starts with the permission and calls `process.permission.drop('fs.write')` (or `'fs'`) partway @@ -151,6 +157,11 @@ A minor release can add hundreds. Most need nothing. Triage by cause: list on iOS, so a new member of that family needs an iOS entry only. - **Everything else** — leave it to run. The suite is the measurement. +A child-process spawner usually still passes on the iOS *simulator*, where +`posix_spawn` is permitted, so expect these to fail the Android suite alone. +Skip them on Android and leave the iOS entry off unless a device sweep shows +otherwise — never skip a test that is currently passing. + `// Flags:` headers *are* honoured on device (the proxy forwards the whole argv `test.py` hands it), so a new flag-gated feature needs no special handling. From 8d112ba6760602fa0f6a9635ae613aacaaf0c1d6 Mon Sep 17 00:00:00 2001 From: Gregor MacLennan Date: Wed, 2 Sep 2026 08:20:49 +0100 Subject: [PATCH 8/8] test: skip the three child-process tests on iOS as well Skipping them on Android alone was wrong. test-stream-iter-disabled then failed an iOS shard on the very next run, having passed the one before: posix_spawn is permitted on the simulator, so a spawner there is flaky rather than working. Neither outcome is worth acting on, since none of these can run on a real device. Corrects the guidance added alongside the Android skips, which read a single green iOS run as evidence the tests were sound. --- docs/UPGRADING.md | 11 +++++++---- expected-tree.txt | 2 +- ...p-adapt-parallel-and-sequential-tests-for-mo.patch | 11 +++++++---- 3 files changed, 15 insertions(+), 9 deletions(-) diff --git a/docs/UPGRADING.md b/docs/UPGRADING.md index 960c56fb44..a92c539688 100644 --- a/docs/UPGRADING.md +++ b/docs/UPGRADING.md @@ -157,10 +157,13 @@ A minor release can add hundreds. Most need nothing. Triage by cause: list on iOS, so a new member of that family needs an iOS entry only. - **Everything else** — leave it to run. The suite is the measurement. -A child-process spawner usually still passes on the iOS *simulator*, where -`posix_spawn` is permitted, so expect these to fail the Android suite alone. -Skip them on Android and leave the iOS entry off unless a device sweep shows -otherwise — never skip a test that is currently passing. +A child-process spawner fails the Android suite outright, and on the iOS +*simulator* it is **flaky rather than passing**: `posix_spawn` is permitted +there, so it often works and sometimes does not — the same test failed the +Android suite, passed one iOS run, then failed the next. Skip these on both +platforms. A green iOS shard is not evidence the test is sound; it cannot +work on a real device either way, which is why `parallel.status` already +carries a block saying this class is "not coverage worth keeping". `// Flags:` headers *are* honoured on device (the proxy forwards the whole argv `test.py` hands it), so a new flag-gated feature needs no special diff --git a/expected-tree.txt b/expected-tree.txt index a555359064..63ea072c63 100644 --- a/expected-tree.txt +++ b/expected-tree.txt @@ -14,4 +14,4 @@ # run prepare.sh (or regenerate-patches.py, which prints the hash) and # update the value below in the same commit. If you forget, CI fails and # prints the hash it got. -e421e4206e44d197e0396328a44bf623efaad9d2 +fbc10b7d21282ad5b4654f335263bcd40026eb48 diff --git a/patches/test-skip-adapt-parallel-and-sequential-tests-for-mo.patch b/patches/test-skip-adapt-parallel-and-sequential-tests-for-mo.patch index 028925213e..44dc293e36 100644 --- a/patches/test-skip-adapt-parallel-and-sequential-tests-for-mo.patch +++ b/patches/test-skip-adapt-parallel-and-sequential-tests-for-mo.patch @@ -16,7 +16,7 @@ series itself. Co-authored-by: Jaime Bernardo Co-authored-by: Andre Staltz --- - test/parallel/parallel.status | 1441 +++++++++++++++++ + test/parallel/parallel.status | 1444 +++++++++++++++++ test/parallel/test-dgram-bind-fd.js | 2 +- test/parallel/test-dgram-membership.js | 10 +- .../parallel/test-dgram-socket-buffer-size.js | 2 +- @@ -51,13 +51,13 @@ Co-authored-by: Andre Staltz test/sequential/sequential.status | 129 ++ test/sequential/test-async-wrap-getasyncid.js | 15 +- test/sequential/test-fs-watch.js | 4 + - 35 files changed, 1751 insertions(+), 46 deletions(-) + 35 files changed, 1754 insertions(+), 46 deletions(-) diff --git a/test/parallel/parallel.status b/test/parallel/parallel.status -index e4c82da4d6..3091abc240 100644 +index e4c82da4d6..d951785ba4 100644 --- a/test/parallel/parallel.status +++ b/test/parallel/parallel.status -@@ -162,6 +162,1447 @@ test-tls-set-default-ca-certificates-append-fetch: SKIP +@@ -162,6 +162,1450 @@ test-tls-set-default-ca-certificates-append-fetch: SKIP test-tls-set-default-ca-certificates-reset-fetch: SKIP test-inspector-invalid-protocol: SKIP @@ -906,6 +906,7 @@ index e4c82da4d6..3091abc240 100644 +test-require-symlink: SKIP +test-runner-cli: SKIP +test-runner-coverage: SKIP ++test-runner-entry-file: SKIP +test-runner-exit-code: SKIP +test-runner-extraneous-async-activity: SKIP +test-runner-import-no-scheme: SKIP @@ -958,6 +959,8 @@ index e4c82da4d6..3091abc240 100644 +test-stdout-close-unref: SKIP +test-stdout-stderr-reading: SKIP +test-stdout-to-file: SKIP ++test-stream-iter-disabled: SKIP ++test-stream-iter-readable-interop-disabled: SKIP +test-stream-pipeline-process: SKIP +test-sync-io-option: SKIP +test-throw-error-with-getter-throw-traced: SKIP