From f9efd778448d52512a9d5e5168d1799575d6813d Mon Sep 17 00:00:00 2001 From: Heidi Date: Sat, 30 May 2026 01:14:09 +0100 Subject: [PATCH] SEO chat gippity style --- webhook.cjs | 93 ++++++++++++++++++++++++++++++++++++++++++----------- 1 file changed, 75 insertions(+), 18 deletions(-) diff --git a/webhook.cjs b/webhook.cjs index d04d421..613eb5e 100644 --- a/webhook.cjs +++ b/webhook.cjs @@ -125,25 +125,69 @@ function executableExists(filePath) { } } -function cargoCommand() { - if (process.env.CARGO && executableExists(process.env.CARGO)) return process.env.CARGO - - const homeCargo = path.join(os.homedir(), '.cargo', 'bin', process.platform === 'win32' ? 'cargo.exe' : 'cargo') - if (executableExists(homeCargo)) return homeCargo - - for (const candidate of [ - '/usr/local/cargo/bin/cargo', - '/usr/local/bin/cargo', - '/usr/bin/cargo', - ]) { - if (executableExists(candidate)) return candidate - } - +function cargoExecutableName() { return process.platform === 'win32' ? 'cargo.exe' : 'cargo' } +function pathDirectories() { + const pathValue = process.env.PATH || process.env.Path || '' + return pathValue.split(path.delimiter).filter(Boolean) +} + +function cargoCandidates() { + const executableName = cargoExecutableName() + const candidates = [] + + if (process.env.CARGO) { + candidates.push(process.env.CARGO) + } + + if (process.env.CARGO_HOME) { + candidates.push(path.join(process.env.CARGO_HOME, 'bin', executableName)) + } + + candidates.push(path.join(os.homedir(), '.cargo', 'bin', executableName)) + + if (process.platform !== 'win32') { + try { + for (const homeEntry of fs.readdirSync('/home', { withFileTypes: true })) { + if (homeEntry.isDirectory()) { + candidates.push(path.join('/home', homeEntry.name, '.cargo', 'bin', executableName)) + } + } + } catch { + // Some hosts do not expose /home to this process; the fixed paths below still cover system installs. + } + + candidates.push( + '/root/.cargo/bin/cargo', + '/usr/local/cargo/bin/cargo', + '/usr/local/bin/cargo', + '/usr/bin/cargo', + ) + } + + for (const directory of pathDirectories()) { + candidates.push(path.join(directory, executableName)) + } + + return [...new Set(candidates)] +} + +function cargoCommand() { + for (const candidate of cargoCandidates()) { + if (executableExists(candidate)) return candidate + } + + return null +} + function commandFor(command) { - if (command === 'cargo') return cargoCommand() + if (command === 'cargo') { + const resolvedCommand = cargoCommand() + if (!resolvedCommand) throw new Error(commandNotFoundMessage(command)) + return resolvedCommand + } if (process.platform !== 'win32') return command if (command === 'npm') return 'npm.cmd' if (command === 'pm2') return 'pm2.cmd' @@ -155,7 +199,7 @@ function commandNotFoundMessage(command) { return [ 'cargo was not found by the deploy webhook', 'Install Rust on the host, or set CARGO to the absolute cargo binary path', - `Checked PATH plus ${path.join(os.homedir(), '.cargo', 'bin', process.platform === 'win32' ? 'cargo.exe' : 'cargo')}`, + `Checked ${cargoCandidates().join(', ')}`, ].join('. ') } @@ -164,7 +208,13 @@ function run(command, args, options = {}) { const label = [command, ...args].join(' ') console.log(`deploy step started: ${label}`) - const resolvedCommand = commandFor(command) + let resolvedCommand + try { + resolvedCommand = commandFor(command) + } catch (error) { + reject(error) + return + } const child = spawn(resolvedCommand, args, { cwd: __dirname, env: { ...process.env, ...options.env }, @@ -193,7 +243,14 @@ function run(command, args, options = {}) { function runCapture(command, args, options = {}) { return new Promise((resolve, reject) => { const label = [command, ...args].join(' ') - const child = spawn(commandFor(command), args, { + let resolvedCommand + try { + resolvedCommand = commandFor(command) + } catch (error) { + reject(error) + return + } + const child = spawn(resolvedCommand, args, { cwd: __dirname, env: { ...process.env, ...options.env }, shell: process.platform === 'win32',