Files
Possible ff0b919d62 Update
2025-02-28 20:42:24 +01:00

275 lines
7.3 KiB
JavaScript

const { exec } = require("child_process");
const getNonNullValue = (value) => {
if (value != "") {
return value;
} else {
return undefined;
}
};
const commandConfigMap = {
init: {
requireArgument: false,
requirements: {
arguments: [],
message: "",
},
action() {
return [null, "git init"];
},
},
branch: {
requireArgument: true,
requirements: {
arguments: ["branch name"],
message: "branch=<branch name> \n eg. branch=pws",
},
action(value) {
return [null, `git branch ${value}`];
},
},
checkout: {
requireArgument: true,
requirements: {
arguments: ["branch name"],
message: "checkout=<branch name> \n eg. checkout=pws",
},
action(value) {
return [null, `git checkout ${value}`];
},
},
merge: {
requireArgument: true,
requirements: {
arguments: ["branch name"],
message: "merge=<branch name> \n eg. merge=pws",
},
action(value) {
return [null, `git merge ${value}`];
},
},
"add-remote": {
requireArgument: true,
requirements: {
arguments: ["remote name", "remote url"],
message:
'add-remote=<remote name> <remote url> \n eg. add-remote="remotename https://github.com/username/reponame.git"',
},
action(remoteName, remoteUrl) {
return [null, `git remote add ${remoteName} ${remoteUrl}`];
},
},
"rm-remote": {
requireArgument: true,
requirements: {
arguments: ["remote name"],
message: "rm-remote=<remote name> \n eg. rm-remote=pws",
},
action(remoteName) {
return [null, `git remote remove ${remoteName}`];
},
},
add: {
requireArgument: true,
requirements: {
arguments: ["file path"],
message: "add=<file path> \n eg. add=.",
},
action(filePath) {
return [null, `git add ${filePath}`];
},
},
commit: {
requireArgument: true,
requirements: {
arguments: ["commit message"],
message: 'commit=<commit message> \n eg. commit="commit message"',
},
action(commitMessage) {
return [null, `git commit -m "${commitMessage}"`];
},
},
pull: {
requireArgument: false,
requirements: {
arguments: ["remote name", "branch name"],
message: 'pull=<remote name> <branch name> \n eg. pull="origin main"',
},
action(remoteName = null, branchName = null) {
if (getNonNullValue(remoteName) && !getNonNullValue(branchName)) {
return [`${this.requirements.message} : branch name is missing`, null];
}
if (!getNonNullValue(remoteName) && getNonNullValue(branchName)) {
return [`${this.requirements.message} : remote name is missing`, null];
}
return [
null,
`git pull ${remoteName ? `${remoteName}` : ""} ${
branchName ? `${branchName}` : ""
}`,
];
},
},
push: {
requireArgument: false,
requirements: {
arguments: ["remote name", "branch name"],
message: 'push=<remote name> <branch name> \n eg. push="origin main"',
},
action(remoteName = null, branchName = null) {
if (getNonNullValue(remoteName) && !getNonNullValue(branchName)) {
return [`${this.requirements.message} : branch name is missing`, null];
}
if (!getNonNullValue(remoteName) && getNonNullValue(branchName)) {
return [`${this.requirements.message} : remote name is missing`, null];
}
return [
null,
`git push ${remoteName ? `${remoteName}` : ""} ${
branchName ? `${branchName}` : ""
}`,
];
},
},
};
// const allowedCommands = [
// "init",
// "branch",
// "checkout",
// "add-remote",
// "rm-remote",
// "add",
// "commit",
// "pull",
// "push",
// ];
const computeCommand = (commandConfig, values) => {
const arguments =
commandConfig?.requirements?.arguments?.length > 1
? values
: [values?.join(" ")];
const [error, command] = commandConfig?.action(...arguments);
if (error) {
return [error, null];
}
return [null, command];
};
const runCommands = (commands, i) => {
return new Promise((resolve, reject) => {
return commandProcess(commands, i, resolve, reject);
});
};
const commandProcess = (commands, i, resolve, reject) => {
if (i >= commands.length) {
return resolve([null, "All commands executed successfully"]);
}
const command = commands[i];
exec(command, (error, stdout, stderr) => {
console.log(`\n$Git >> ${command}`);
if (!error) {
console.log(`$Git >> ${command} command output: ${stdout}`);
commandProcess(commands, i + 1, resolve, reject);
} else {
console.error(`$Git >> Error executing Git command: ${stderr}`);
}
});
};
const argvs = process.argv.splice(2);
const startGitProcess = async () => {
return new Promise(async (resolve, reject) => {
let commands = [];
for (const commandEntry of argvs) {
const [key, value] = commandEntry.split("=");
const commandConfig = commandConfigMap[key];
const values = value?.trim()?.replace(/\s+/g, " ")?.split(" ");
// console.log("values >>", values);
if (!commandConfig) {
return reject(`Command ${key} is not recognised as internal command`);
}
if (commandConfig.requireArgument) {
if (!value) {
return reject(
`Argument is required: ${commandConfig.requirements.message}`
);
}
if (commandConfig.requirements.arguments.length > 1) {
if (values.length !== commandConfig.requirements.arguments.length) {
return reject(
`Invalid number of arguments: ${commandConfig.requirements.message}`
);
}
}
}
const [error, command] = computeCommand(commandConfig, values);
if (error) {
return reject(error);
}
commands = commands.concat(command);
}
// console.log("$Git >> commands:", commands);
if (!commands?.length) {
return reject("No command to execute");
}
const [error, message] = await runCommands(commands, 0);
if (error) {
return reject(error);
}
return resolve(message);
});
};
const main = async () => {
try {
const result = await startGitProcess();
console.log("\n$Git >>", result);
} catch (error) {
console.error("\n$Git >> Error:", error);
}
};
main();
// git checkout master && git pull origin master && yarn build && git add . && git commit -m "Build Master" && git push origin master && git checkout wireframe && git merge master && git push origin wireframe
// const operations = argvs.map((argv) => argv.split("=")[0]?.toLowerCase())
// const allowedCommands = Object.keys(commandConfigMap);
// const commandValidation = operations.map((command) => {
// if (!allowedCommands.includes(command.trim())) {
// return {
// command,
// isValid: false,
// };
// }
// return {
// command,
// isValid: true,
// };
// });
// const invalidCommands = commandValidation.filter((command) => !command.isValid);
// if (invalidCommands.length) {
// const errorMessage = invalidCommands
// .map((command) => `${command.command} is not recognised as internal command`)
// .join(", ");
// return [errorMessage, null];
// }
// "commit:script": "node git-script add=. commit="Update" push="origin pws" checkout=master merge=pws push="origin master" checkout=pws"