UNPKG

backport

Version:

A CLI tool that automates the process of backporting commits

87 lines (85 loc) 3.1 kB
import { graphql } from '../../../../graphql/generated/index.js'; import { BackportError } from '../../../backport-error.js'; import { isMissingConfigFileException } from '../../../remote-config.js'; import { graphqlRequest } from '../client/graphql-client.js'; import { fetchCommitBySha } from './fetch-commit-by-sha.js'; import { fetchCommitsForRebaseAndMergeStrategy } from './fetch-commits-for-rebase-and-merge-strategy.js'; export async function fetchCommitsByPullNumber(options) { const { githubToken, githubApiBaseUrlV4 = 'https://api.github.com/graphql', pullNumber, repoName, repoOwner, } = options; const query = graphql(` query CommitByPullNumber( $repoOwner: String! $repoName: String! $pr: Int! ) { repository(owner: $repoOwner, name: $repoName) { pullRequest(number: $pr) { # used to determine if "Rebase and Merge" strategy was used commits(last: 1) { totalCount edges { node { commit { message } } } } mergeCommit { oid # used to determine if "Rebase and Merge" strategy was used committedDate history(first: 2) { edges { node { message committedDate } } } } } } } `); const variables = { repoOwner, repoName, pr: pullNumber }; const result = await graphqlRequest({ githubToken, githubApiBaseUrlV4 }, query, variables); if (result.error && !isMissingConfigFileException(result)) { throw new BackportError({ code: 'github-api-exception', message: result.error.message, }); } const { data } = result; const pullRequestNode = data?.repository?.pullRequest; if (!pullRequestNode) { throw new BackportError({ code: 'pr-not-found-exception', pullNumber, }); } const { mergeCommit } = pullRequestNode; if (mergeCommit === null) { throw new BackportError({ code: 'pr-not-merged-exception', pullNumber, }); } const lastCommitInPullRequest = pullRequestNode.commits.edges?.at(0)?.node?.commit; const firstCommitInBaseBranch = mergeCommit?.history.edges?.at(0)?.node; const isRebaseAndMergeStrategy = pullRequestNode.commits.totalCount > 0 && mergeCommit?.history.edges?.every((c) => c?.node?.committedDate === mergeCommit.committedDate) && lastCommitInPullRequest?.message === firstCommitInBaseBranch?.message; if (isRebaseAndMergeStrategy) { const commits = await fetchCommitsForRebaseAndMergeStrategy(options, pullRequestNode.commits.totalCount); if (commits) { return commits; } } const commit = await fetchCommitBySha({ ...options, sha: String(mergeCommit.oid), }); return [commit]; } //# sourceMappingURL=fetch-commit-by-pull-number.js.map