From ac550f582fa79bc559395a85957c6f0a6308a94d Mon Sep 17 00:00:00 2001 From: Yan Li Date: Fri, 10 Jul 2026 20:39:05 +0800 Subject: [PATCH 1/4] fix: parseYAMLBoolean for enable-stack/stack-no-global/stack-setup-ghc/disable-matcher MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit These four boolean flags used (inputs[key] || '') !== '' pattern which treats YAML 'false' string as true. Replace with parseYAMLBoolean which correctly handles YAML boolean semantics. Bug: enable-stack: false was treated as true → ghcup tries to install stack → GHCup-00130 on version resolution failure. Fixes https://github.com/agda/agda/issues/8619 --- dist/index.js | 8 ++++---- lib/opts.js | 8 ++++---- src/opts.ts | 20 ++++++++++++++++---- 3 files changed, 24 insertions(+), 12 deletions(-) diff --git a/dist/index.js b/dist/index.js index 3453c6e..fffc9e8 100644 --- a/dist/index.js +++ b/dist/index.js @@ -35575,10 +35575,10 @@ function parseURL(name, val) { } function getOpts({ ghc, cabal, stack }, os, inputs) { core.debug(`Inputs are: ${JSON.stringify(inputs)}`); - const stackNoGlobal = (inputs['stack-no-global'] || '') !== ''; - const stackSetupGhc = (inputs['stack-setup-ghc'] || '') !== ''; - const stackEnable = (inputs['enable-stack'] || '') !== ''; - const matcherDisable = (inputs['disable-matcher'] || '') !== ''; + const stackNoGlobal = parseYAMLBoolean('stack-no-global', inputs['stack-no-global'] || 'false'); + const stackSetupGhc = parseYAMLBoolean('stack-setup-ghc', inputs['stack-setup-ghc'] || 'false'); + const stackEnable = parseYAMLBoolean('enable-stack', inputs['enable-stack'] || 'false'); + const matcherDisable = parseYAMLBoolean('disable-matcher', inputs['disable-matcher'] || 'false'); const ghcupReleaseChannel = parseURL('ghcup-release-channel', inputs['ghcup-release-channel'] || ''); // Andreas, 2023-01-05, issue #29: // 'cabal-update' has a default value, so we should get a proper boolean always. diff --git a/lib/opts.js b/lib/opts.js index 98c5be9..1aa070f 100644 --- a/lib/opts.js +++ b/lib/opts.js @@ -147,10 +147,10 @@ function parseURL(name, val) { } function getOpts({ ghc, cabal, stack }, os, inputs) { core.debug(`Inputs are: ${JSON.stringify(inputs)}`); - const stackNoGlobal = (inputs['stack-no-global'] || '') !== ''; - const stackSetupGhc = (inputs['stack-setup-ghc'] || '') !== ''; - const stackEnable = (inputs['enable-stack'] || '') !== ''; - const matcherDisable = (inputs['disable-matcher'] || '') !== ''; + const stackNoGlobal = parseYAMLBoolean('stack-no-global', inputs['stack-no-global'] || 'false'); + const stackSetupGhc = parseYAMLBoolean('stack-setup-ghc', inputs['stack-setup-ghc'] || 'false'); + const stackEnable = parseYAMLBoolean('enable-stack', inputs['enable-stack'] || 'false'); + const matcherDisable = parseYAMLBoolean('disable-matcher', inputs['disable-matcher'] || 'false'); const ghcupReleaseChannel = parseURL('ghcup-release-channel', inputs['ghcup-release-channel'] || ''); // Andreas, 2023-01-05, issue #29: // 'cabal-update' has a default value, so we should get a proper boolean always. diff --git a/src/opts.ts b/src/opts.ts index 8a0776f..7d43683 100644 --- a/src/opts.ts +++ b/src/opts.ts @@ -154,10 +154,22 @@ export function getOpts( inputs: Record ): Options { core.debug(`Inputs are: ${JSON.stringify(inputs)}`); - const stackNoGlobal = (inputs['stack-no-global'] || '') !== ''; - const stackSetupGhc = (inputs['stack-setup-ghc'] || '') !== ''; - const stackEnable = (inputs['enable-stack'] || '') !== ''; - const matcherDisable = (inputs['disable-matcher'] || '') !== ''; + const stackNoGlobal = parseYAMLBoolean( + 'stack-no-global', + inputs['stack-no-global'] || 'false' + ); + const stackSetupGhc = parseYAMLBoolean( + 'stack-setup-ghc', + inputs['stack-setup-ghc'] || 'false' + ); + const stackEnable = parseYAMLBoolean( + 'enable-stack', + inputs['enable-stack'] || 'false' + ); + const matcherDisable = parseYAMLBoolean( + 'disable-matcher', + inputs['disable-matcher'] || 'false' + ); const ghcupReleaseChannel = parseURL( 'ghcup-release-channel', inputs['ghcup-release-channel'] || '' From 37dd924a07cfcada9d68a728d0cc2c7618be17f7 Mon Sep 17 00:00:00 2001 From: Yan Li Date: Fri, 10 Jul 2026 20:54:11 +0800 Subject: [PATCH 2/4] fix: bump bundled ghcup from 0.1.50.2 to 0.2.6.2 v0.1.50.2 is too old and cannot install stack 3.9.3 (GHCup-00130). v0.2.6.2 is the latest stable and confirmed working with stack 3.9.3. --- dist/index.js | 2 +- lib/versions.json | 2 +- src/versions.json | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/dist/index.js b/dist/index.js index fffc9e8..fd260c5 100644 --- a/dist/index.js +++ b/dist/index.js @@ -37753,7 +37753,7 @@ module.exports = /*#__PURE__*/JSON.parse('{"win32":{"ghc":[{"from":"9.4.3","to": /***/ ((module) => { "use strict"; -module.exports = /*#__PURE__*/JSON.parse('{"ghc":["9.14.1","9.12.4","9.12.2","9.12.1","9.10.3","9.10.2","9.10.1","9.8.4","9.8.2","9.8.1","9.6.7","9.6.6","9.6.5","9.6.4","9.6.3","9.6.2","9.6.1","9.4.8","9.4.7","9.4.6","9.4.5","9.4.4","9.4.3","9.4.2","9.4.1","9.2.8","9.2.7","9.2.6","9.2.5","9.2.4","9.2.3","9.2.2","9.2.1","9.0.2","9.0.1","8.10.7","8.10.6","8.10.5","8.10.4","8.10.3","8.10.2","8.10.1","8.8.4","8.8.3","8.8.2","8.8.1","8.6.5","8.6.4","8.6.3","8.6.2","8.6.1","8.4.4","8.4.3","8.4.2","8.4.1","8.2.2","8.0.2","7.10.3"],"cabal":["3.16.1.0","3.16.0.0","3.14.2.0","3.14.1.1","3.14.1.0","3.12.1.0","3.10.3.0","3.10.2.1","3.10.2.0","3.10.1.0","3.8.1.0","3.6.2.0","3.6.0.0","3.4.1.0","3.4.0.0","3.2.0.0","3.0.0.0","2.4.1.0"],"stack":["3.9.3","3.9.1","3.7.1","3.5.1","3.3.1","3.1.1","2.15.7","2.15.5","2.15.3","2.15.1","2.13.1","2.11.1","2.9.3","2.9.1","2.7.5","2.7.3","2.7.1","2.5.1","2.3.3","2.3.1","2.1.3","2.1.1","1.9.3","1.9.1","1.7.1","1.6.5","1.6.3","1.6.1","1.5.1","1.5.0","1.4.0","1.3.2","1.3.0","1.2.0"],"ghcup":["0.1.50.2"]}'); +module.exports = /*#__PURE__*/JSON.parse('{"ghc":["9.14.1","9.12.4","9.12.2","9.12.1","9.10.3","9.10.2","9.10.1","9.8.4","9.8.2","9.8.1","9.6.7","9.6.6","9.6.5","9.6.4","9.6.3","9.6.2","9.6.1","9.4.8","9.4.7","9.4.6","9.4.5","9.4.4","9.4.3","9.4.2","9.4.1","9.2.8","9.2.7","9.2.6","9.2.5","9.2.4","9.2.3","9.2.2","9.2.1","9.0.2","9.0.1","8.10.7","8.10.6","8.10.5","8.10.4","8.10.3","8.10.2","8.10.1","8.8.4","8.8.3","8.8.2","8.8.1","8.6.5","8.6.4","8.6.3","8.6.2","8.6.1","8.4.4","8.4.3","8.4.2","8.4.1","8.2.2","8.0.2","7.10.3"],"cabal":["3.16.1.0","3.16.0.0","3.14.2.0","3.14.1.1","3.14.1.0","3.12.1.0","3.10.3.0","3.10.2.1","3.10.2.0","3.10.1.0","3.8.1.0","3.6.2.0","3.6.0.0","3.4.1.0","3.4.0.0","3.2.0.0","3.0.0.0","2.4.1.0"],"stack":["3.9.3","3.9.1","3.7.1","3.5.1","3.3.1","3.1.1","2.15.7","2.15.5","2.15.3","2.15.1","2.13.1","2.11.1","2.9.3","2.9.1","2.7.5","2.7.3","2.7.1","2.5.1","2.3.3","2.3.1","2.1.3","2.1.1","1.9.3","1.9.1","1.7.1","1.6.5","1.6.3","1.6.1","1.5.1","1.5.0","1.4.0","1.3.2","1.3.0","1.2.0"],"ghcup":["0.2.6.2"]}'); /***/ }) diff --git a/lib/versions.json b/lib/versions.json index 5369d04..970010f 100644 --- a/lib/versions.json +++ b/lib/versions.json @@ -115,5 +115,5 @@ "1.3.0", "1.2.0" ], - "ghcup": ["0.1.50.2"] + "ghcup": ["0.2.6.2"] } diff --git a/src/versions.json b/src/versions.json index 66a32cc..49ba3fa 100644 --- a/src/versions.json +++ b/src/versions.json @@ -115,5 +115,5 @@ "1.3.0", "1.2.0" ], - "ghcup": ["0.1.50.2"] + "ghcup": ["0.2.6.2"] } From b1941231191842a3a5aa94be77d62674d3568528 Mon Sep 17 00:00:00 2001 From: Yan Li Date: Tue, 14 Jul 2026 22:44:09 +0800 Subject: [PATCH 3/4] feat: install Node.js 24 after GHC setup (via nvm) --- dist/index.js | 7 +++++++ lib/setup-haskell.js | 7 +++++++ src/setup-haskell.ts | 8 ++++++++ 3 files changed, 22 insertions(+) diff --git a/dist/index.js b/dist/index.js index fd260c5..5925d3a 100644 --- a/dist/index.js +++ b/dist/index.js @@ -35780,6 +35780,13 @@ async function run(inputs) { if (opts.cabal.update && !opts.stack.enable) await (0, exec_1.exec)('cabal update'); }); + await core.group('Installing Node.js 24', async () => { + await (0, exec_1.exec)('bash', [ + '-c', + 'curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.40.3/install.sh | bash' + ]); + await (0, exec_1.exec)('bash', ['-c', '. "$HOME/.nvm/nvm.sh" && nvm install 24']); + }); core.info(`##[add-matcher]${path.join(__dirname, '..', 'matcher.json')}`); } catch (_error) { diff --git a/lib/setup-haskell.js b/lib/setup-haskell.js index 100984a..708955c 100644 --- a/lib/setup-haskell.js +++ b/lib/setup-haskell.js @@ -138,6 +138,13 @@ async function run(inputs) { if (opts.cabal.update && !opts.stack.enable) await (0, exec_1.exec)('cabal update'); }); + await core.group('Installing Node.js 24', async () => { + await (0, exec_1.exec)('bash', [ + '-c', + 'curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.40.3/install.sh | bash' + ]); + await (0, exec_1.exec)('bash', ['-c', '. "$HOME/.nvm/nvm.sh" && nvm install 24']); + }); core.info(`##[add-matcher]${path.join(__dirname, '..', 'matcher.json')}`); } catch (_error) { diff --git a/src/setup-haskell.ts b/src/setup-haskell.ts index 4a68e03..6775a1d 100644 --- a/src/setup-haskell.ts +++ b/src/setup-haskell.ts @@ -129,6 +129,14 @@ export default async function run( if (opts.cabal.update && !opts.stack.enable) await exec('cabal update'); }); + await core.group('Installing Node.js 24', async () => { + await exec('bash', [ + '-c', + 'curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.40.3/install.sh | bash' + ]); + await exec('bash', ['-c', '. "$HOME/.nvm/nvm.sh" && nvm install 24']); + }); + core.info(`##[add-matcher]${path.join(__dirname, '..', 'matcher.json')}`); } catch (_error) { const error = ensureError(_error); From e89c03c7e76b62569dc29f1d93a970d3cb904523 Mon Sep 17 00:00:00 2001 From: Yan Li Date: Wed, 15 Jul 2026 04:27:44 +0800 Subject: [PATCH 4/4] revert: remove Node.js 24 nvm install (doesn't affect Actions runner runtime) --- dist/index.js | 7 ------- lib/setup-haskell.js | 7 ------- src/setup-haskell.ts | 8 -------- 3 files changed, 22 deletions(-) diff --git a/dist/index.js b/dist/index.js index 5925d3a..fd260c5 100644 --- a/dist/index.js +++ b/dist/index.js @@ -35780,13 +35780,6 @@ async function run(inputs) { if (opts.cabal.update && !opts.stack.enable) await (0, exec_1.exec)('cabal update'); }); - await core.group('Installing Node.js 24', async () => { - await (0, exec_1.exec)('bash', [ - '-c', - 'curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.40.3/install.sh | bash' - ]); - await (0, exec_1.exec)('bash', ['-c', '. "$HOME/.nvm/nvm.sh" && nvm install 24']); - }); core.info(`##[add-matcher]${path.join(__dirname, '..', 'matcher.json')}`); } catch (_error) { diff --git a/lib/setup-haskell.js b/lib/setup-haskell.js index 708955c..100984a 100644 --- a/lib/setup-haskell.js +++ b/lib/setup-haskell.js @@ -138,13 +138,6 @@ async function run(inputs) { if (opts.cabal.update && !opts.stack.enable) await (0, exec_1.exec)('cabal update'); }); - await core.group('Installing Node.js 24', async () => { - await (0, exec_1.exec)('bash', [ - '-c', - 'curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.40.3/install.sh | bash' - ]); - await (0, exec_1.exec)('bash', ['-c', '. "$HOME/.nvm/nvm.sh" && nvm install 24']); - }); core.info(`##[add-matcher]${path.join(__dirname, '..', 'matcher.json')}`); } catch (_error) { diff --git a/src/setup-haskell.ts b/src/setup-haskell.ts index 6775a1d..4a68e03 100644 --- a/src/setup-haskell.ts +++ b/src/setup-haskell.ts @@ -129,14 +129,6 @@ export default async function run( if (opts.cabal.update && !opts.stack.enable) await exec('cabal update'); }); - await core.group('Installing Node.js 24', async () => { - await exec('bash', [ - '-c', - 'curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.40.3/install.sh | bash' - ]); - await exec('bash', ['-c', '. "$HOME/.nvm/nvm.sh" && nvm install 24']); - }); - core.info(`##[add-matcher]${path.join(__dirname, '..', 'matcher.json')}`); } catch (_error) { const error = ensureError(_error);