@xniva/pivotal-github-cli
Version:
A cli tool for Pivotal Tracker users where branch and pull request can be created from story name with reference to it
200 lines (169 loc) • 4.87 kB
JavaScript
import { program } from "commander";
import inquirer from "inquirer";
import open from "open";
import runTerminalCommand from "../utils/run_terminal_command.js";
import Loader from "../utils/loader.js";
import config from "./config.js";
import { createPullRequest, addReviewers } from "../utils/github_requests.js";
import { addEmptyLine } from "./../utils/others.js";
const projectDir = process.env.PROJECT_DIRECTORY;
const prReviewers = process.env.GITHUB_REVIEWER;
const programVersion = config.version;
const programDescription = config.description;
const loader = new Loader();
const getCommitMessageInput = async (storyName) => {
const inputFields = [
{
type: "input",
name: "commitMessage",
message: "Commit Message: ",
default: storyName,
},
];
const { commitMessage } = await inquirer.prompt(inputFields);
const capitalizedCommitMessage =
commitMessage.charAt(0).toUpperCase() + commitMessage.substr(1);
return capitalizedCommitMessage;
};
const checkoutToProjectDir = () => {
process.chdir(projectDir);
loader.persist("Checked out to the project directory");
};
const getBranchName = () => {
const command = "git branch --show-current";
const output = runTerminalCommand(command);
return output.trim();
};
const getStoryId = (branchName) => {
const pattern = /(?<=#)\d+(?=-)/;
const match = branchName.match(pattern);
return match.length > 0 ? match[0] : null;
};
const getStoryName = (branchName) => {
const command = `git config branch.${branchName}.description`;
const output = runTerminalCommand(command);
return output.trim();
};
const getStoryData = (branchName) => {
const storyId = getStoryId(branchName);
const storyName = getStoryName(branchName);
return {
storyId,
storyName,
};
};
const addChanges = () => {
const command = "git add .";
runTerminalCommand(command);
};
const commitTheChanges = (commitMessage) => {
addChanges();
const command = `git commit -m "${commitMessage}" -q`;
runTerminalCommand(command);
loader.persist("Committed the changes");
};
const pushChangesToRemote = () => {
const command = "git push origin HEAD -q";
runTerminalCommand(command);
loader.persist("Pushed the branch to remote");
};
const checkForDraftPr = async () => {
const inputFields = [
{
type: "confirm",
name: "isDraft",
message: "Is Draft PR: ",
default: false,
},
];
const { isDraft } = await inquirer.prompt(inputFields);
return isDraft;
};
const checkForNull = (input) => {
return input === "N/A" ? null : input;
};
const getBackendPrNo = async () => {
const inputFields = [
{
type: "number",
name: "backendPrNo",
message: "Backend PR Number: ",
default: "N/A",
},
];
const { backendPrNo } = await inquirer.prompt(inputFields);
const out = checkForNull(backendPrNo);
return out;
};
const getDiscussionNo = async () => {
const inputFields = [
{
type: "number",
name: "disucssionNo",
message: "Discussion Number: ",
default: "N/A",
},
];
const { disucssionNo } = await inquirer.prompt(inputFields);
const out = checkForNull(disucssionNo);
return out;
};
const getDesignUrlNo = async () => {
const inputFields = [
{
type: "input",
name: "designUrl",
message: "Design Link: ",
default: "N/A",
},
];
const { designUrl } = await inquirer.prompt(inputFields);
const out = checkForNull(designUrl);
return out;
};
const openInBrowser = (url) => {
open(url);
};
const main = async () => {
let spinner;
try {
checkoutToProjectDir();
const branchName = getBranchName();
const storyData = getStoryData(branchName);
const { storyName } = storyData;
const commitMessage = await getCommitMessageInput(storyName);
const isDraft = await checkForDraftPr();
const backendPrNo = await getBackendPrNo();
const discussionNo = await getDiscussionNo();
const designUrl = await getDesignUrlNo();
addEmptyLine();
commitTheChanges(commitMessage);
pushChangesToRemote();
const { html_url: githubPrLink, number: pullNumber } =
await createPullRequest(
branchName,
commitMessage,
storyData,
isDraft,
backendPrNo,
discussionNo,
designUrl
);
loader.persist("Created the pull request");
const reviewers = prReviewers.split(",");
await addReviewers(isDraft, pullNumber, reviewers);
loader.persist("Added the reviewers");
openInBrowser(githubPrLink);
} catch (errorMessage) {
loader.fail(errorMessage);
}
addEmptyLine();
};
const initializeCommanderProgram = () => {
program
.version(programVersion)
.description(programDescription)
.action(main)
.parse(process.argv);
};
export default initializeCommanderProgram;