backport
Version:
A CLI tool that automates the process of backporting commits
79 lines • 3.48 kB
JavaScript
/** Dispatches to the correct fetch* function based on options (pullNumber, sha, author, prQuery). */
import chalk from 'chalk';
import { BackportError } from './backport-error.js';
import { getFirstLine, getShortSha } from './github/commit-formatters.js';
import { fetchCommitsByPullNumber } from './github/v4/fetchCommits/fetch-commit-by-pull-number.js';
import { fetchCommitBySha } from './github/v4/fetchCommits/fetch-commit-by-sha.js';
import { fetchCommitsByAuthor } from './github/v4/fetchCommits/fetch-commits-by-author.js';
import { fetchPullRequestsBySearchQuery } from './github/v4/fetchCommits/fetch-pull-requests-by-search-query.js';
import { ora } from './ora.js';
import { promptForCommits } from './prompts.js';
function getOraPersistsOption(question, answer) {
return {
symbol: chalk.green('?'),
text: `${chalk.bold(question)} ${chalk.cyan(answer)}`,
};
}
export async function getCommits(options) {
const spinner = ora(options.interactive).start();
try {
if (options.sha) {
const shas = Array.isArray(options.sha) ? options.sha : [options.sha];
spinner.text = `Loading commit "${shas.map(getShortSha)}"`;
const commits = await Promise.all(shas.map((sha) => fetchCommitBySha({ ...options, sha })));
spinner.stopAndPersist(getOraPersistsOption('Select commit', commits
.map((commit) => getFirstLine(commit.sourceCommit.message))
.join(', ')));
return commits;
}
if (options.pullNumber) {
const pullNumbers = Array.isArray(options.pullNumber)
? options.pullNumber
: [options.pullNumber];
spinner.text = `Loading pull request ${pullNumbers
.map((pullNumber) => `#${pullNumber}`)
.join(', ')}`;
const nestedCommits = await Promise.all(pullNumbers.map((pullNumber) => fetchCommitsByPullNumber({ ...options, pullNumber })));
const commits = nestedCommits.flat();
// add styles to make it look like a prompt question
spinner.stopAndPersist(getOraPersistsOption('Select pull request', commits
.map((commit) => getFirstLine(commit.sourceCommit.message))
.join(', ')));
return commits;
}
if (!options.interactive && !options.ls) {
throw new BackportError({
code: 'config-error-exception',
message: 'When "--interactive" is disabled either `--sha` or `--pr` must be specified',
});
}
spinner.text = options.prQuery
? 'Loading pull requests...'
: `Loading commits from branch "${options.sourceBranch}"...`;
const commitChoices = options.prQuery === undefined
? await fetchCommitsByAuthor(options)
: await fetchPullRequestsBySearchQuery({
...options,
prQuery: options.prQuery,
});
spinner.stop();
if (options.ls) {
return commitChoices;
}
return promptForCommits({
commitChoices,
isMultipleChoice: options.multipleCommits,
showDetails: options.verbose,
});
}
catch (error) {
if (options.ls) {
spinner.stop();
}
else {
spinner.fail();
}
throw error;
}
}
//# sourceMappingURL=get-commits.js.map