@emacs-eask/cli
Version:
A set of command-line tools to build Emacs packages
108 lines (91 loc) • 3.03 kB
JavaScript
/**
* Copyright (C) 2022-2025 the Eask authors.
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 3, or (at your option)
* any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
;
const fs = require('fs');
const child_process = require("child_process");
exports.command = ['script [names..]'];
exports.desc = 'Run script named [names..]';
exports.builder = yargs => yargs
.positional(
'[names..]', {
description: 'specify scripts to run',
type: 'array',
});
exports.handler = async (argv) => {
await UTIL.e_call(argv, 'run/script', argv.names);
if (!fs.existsSync(EASK_HOMEDIR)) {
return;
}
let run = EASK_HOMEDIR + 'run';
if (!fs.existsSync(run)) {
return;
}
// this contain the full command!
let instruction = fs.readFileSync(run, 'utf8');
let commands = instruction.split('\n').filter(element => element);
let count = 0;
startCommand(commands, count);
};
/**
* Recursive to execute commands in order.
*
* @param { array } commands - An array of commands to execute.
* @param { integer } count - The current executing command's index.
*/
function startCommand(commands, count) {
if (commands.length <= count)
return;
let command = commands[count];
console.warn('[RUN]: ' + command);
let proc = spawn(command, { stdio: 'inherit', shell: true });
proc.on('close', function (code) {
if (code == 0) {
startCommand(commands, ++count); // start next command!
return;
}
process.exit(code);
});
}
/**
* Spawn process to avoid `MODULE_NOT_FOUND` not found error,
* see https://github.com/vercel/pkg/issues/1356.
*
* @param { String } command - Command string.
* @param { JSON } options - Process options.
* @return Process object.
*/
function spawn(command, options) {
if (IS_PKG && command.includes('eask ')) {
let cmds = command.split(' ');
cmds = replaceEaskExec(cmds);
return child_process.spawn(process.execPath, cmds, options);
}
return child_process.spawn(command, options);
}
/**
* Replace all possible eask/cli executable to snapshot executable.
* @param { Array } cmds - Command array.
* @return Return updated command array.
*/
function replaceEaskExec(cmds) {
for (let index = 0; index < cmds.length; ++index) {
if (cmds[index] == "eask") {
cmds[index] = process.argv[1]; // XXX: This is `/snapshot/cli/eask`
}
}
return cmds;
}