UNPKG

@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
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;