From 963824662d8b95d8483d706eb9f781cf11da2533 Mon Sep 17 00:00:00 2001 From: Gerard Ribugent Date: Thu, 22 Jan 2026 14:29:50 +0100 Subject: [PATCH 1/3] Update shebang from wrapper to use the node version that action is running --- lib/setup-terraform.js | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/lib/setup-terraform.js b/lib/setup-terraform.js index 87e7575..f3269a6 100644 --- a/lib/setup-terraform.js +++ b/lib/setup-terraform.js @@ -81,8 +81,13 @@ async function installWrapper (pathToCLI) { try { source = path.resolve([__dirname, '..', 'wrapper', 'dist', 'index.js'].join(path.sep)); target = [pathToCLI, 'terraform'].join(path.sep); - core.debug(`Copying ${source} to ${target}.`); - await io.cp(source, target); + + core.debug(`Reading wrapper from ${source} and updating shebang.`); + const wrapperContent = (await fs.readFile(source, 'utf8')).split('\n'); + wrapperContent[0] = `#!${process.argv[0]}`; + + core.debug(`Writing updated wrapper to ${target}.`); + await fs.writeFile(target, wrapperContent.join('\n')); } catch (e) { core.error(`Unable to copy ${source} to ${target}.`); throw e; From 320df874428d7cfd660d1420e64668f095956077 Mon Sep 17 00:00:00 2001 From: Gerard Ribugent Date: Thu, 22 Jan 2026 14:57:46 +0100 Subject: [PATCH 2/3] Fix test cases when writting the wrapper --- test/setup-terraform.test.js | 42 ++++++++++++++++++++++++++++++------ 1 file changed, 36 insertions(+), 6 deletions(-) diff --git a/test/setup-terraform.test.js b/test/setup-terraform.test.js index 57cda0f..768d0ce 100644 --- a/test/setup-terraform.test.js +++ b/test/setup-terraform.test.js @@ -27,6 +27,9 @@ const setup = require('../lib/setup-terraform'); // core.error = jest // .fn(console.error); +const fsReadFileImplementation = fs.readFile; +const fsWriteFileImplementation = fs.writeFile; + describe('Setup Terraform', () => { const HOME = process.env.HOME; const APPDATA = process.env.APPDATA; @@ -553,8 +556,20 @@ describe('Setup Terraform', () => { const ioMv = jest.spyOn(io, 'mv') .mockImplementation(() => {}); - const ioCp = jest.spyOn(io, 'cp') - .mockImplementation(() => {}); + const fsReadFile = jest.spyOn(fs, 'readFile').mockImplementation((...args) => { + if (args[0] === wrapperPath) { + return Promise.resolve(''); + } else { + return fsReadFileImplementation(...args); + } + }); + const fsWriteFile = jest.spyOn(fs, 'writeFile').mockImplementation((...args) => { + if (args[0] === `file${path.sep}terraform`) { + return Promise.resolve(); + } else { + return fsWriteFileImplementation(...args); + } + }); core.getInput = jest .fn() @@ -586,7 +601,8 @@ describe('Setup Terraform', () => { await setup(); expect(ioMv).toHaveBeenCalledWith(`file${path.sep}terraform`, `file${path.sep}terraform-bin`); - expect(ioCp).toHaveBeenCalledWith(wrapperPath, `file${path.sep}terraform`); + expect(fsReadFile).toHaveBeenCalledWith(wrapperPath, 'utf8'); + expect(fsWriteFile).toHaveBeenCalledWith(`file${path.sep}terraform`, expect.any(String)); }); test('installs wrapper on windows', async () => { @@ -597,8 +613,21 @@ describe('Setup Terraform', () => { const ioMv = jest.spyOn(io, 'mv') .mockImplementation(() => {}); - const ioCp = jest.spyOn(io, 'cp') - .mockImplementation(() => {}); + const fsReadFileImplementation = fs.readFile; + const fsReadFile = jest.spyOn(fs, 'readFile').mockImplementation((...args) => { + if (args[0] === wrapperPath) { + return Promise.resolve(''); + } else { + return fsReadFileImplementation(...args); + } + }); + const fsWriteFile = jest.spyOn(fs, 'writeFile').mockImplementation((...args) => { + if (args[0] === `file${path.sep}terraform`) { + return Promise.resolve(); + } else { + return fsWriteFileImplementation(...args); + } + }); core.getInput = jest .fn() @@ -630,6 +659,7 @@ describe('Setup Terraform', () => { await setup(); expect(ioMv).toHaveBeenCalledWith(`file${path.sep}terraform.exe`, `file${path.sep}terraform-bin.exe`); - expect(ioCp).toHaveBeenCalledWith(wrapperPath, `file${path.sep}terraform`); + expect(fsReadFile).toHaveBeenCalledWith(wrapperPath, 'utf8'); + expect(fsWriteFile).toHaveBeenCalledWith(`file${path.sep}terraform`, expect.any(String)); }); }); From 315ab497cfd2af4c7564f26207a4cc1762bd7cdd Mon Sep 17 00:00:00 2001 From: Gerard Ribugent Date: Thu, 22 Jan 2026 15:05:34 +0100 Subject: [PATCH 3/3] Add permission bit when writting the wrapper --- lib/setup-terraform.js | 2 +- test/setup-terraform.test.js | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/lib/setup-terraform.js b/lib/setup-terraform.js index f3269a6..61f61aa 100644 --- a/lib/setup-terraform.js +++ b/lib/setup-terraform.js @@ -87,7 +87,7 @@ async function installWrapper (pathToCLI) { wrapperContent[0] = `#!${process.argv[0]}`; core.debug(`Writing updated wrapper to ${target}.`); - await fs.writeFile(target, wrapperContent.join('\n')); + await fs.writeFile(target, wrapperContent.join('\n'), { mode: 0o755 }); } catch (e) { core.error(`Unable to copy ${source} to ${target}.`); throw e; diff --git a/test/setup-terraform.test.js b/test/setup-terraform.test.js index 768d0ce..7a8eef0 100644 --- a/test/setup-terraform.test.js +++ b/test/setup-terraform.test.js @@ -602,7 +602,7 @@ describe('Setup Terraform', () => { expect(ioMv).toHaveBeenCalledWith(`file${path.sep}terraform`, `file${path.sep}terraform-bin`); expect(fsReadFile).toHaveBeenCalledWith(wrapperPath, 'utf8'); - expect(fsWriteFile).toHaveBeenCalledWith(`file${path.sep}terraform`, expect.any(String)); + expect(fsWriteFile).toHaveBeenCalledWith(`file${path.sep}terraform`, expect.any(String), { mode: 0o755 }); }); test('installs wrapper on windows', async () => { @@ -660,6 +660,6 @@ describe('Setup Terraform', () => { expect(ioMv).toHaveBeenCalledWith(`file${path.sep}terraform.exe`, `file${path.sep}terraform-bin.exe`); expect(fsReadFile).toHaveBeenCalledWith(wrapperPath, 'utf8'); - expect(fsWriteFile).toHaveBeenCalledWith(`file${path.sep}terraform`, expect.any(String)); + expect(fsWriteFile).toHaveBeenCalledWith(`file${path.sep}terraform`, expect.any(String), { mode: 0o755 }); }); });