We previously held off with updating Octokit to v18 due to their more noticable issues with typings. This commit updates us to the latest version in order to take advantage of the new pagination API (which is also strongly-typed), and to not fall behind too much over time (Octokit seems to change quite often..) We work around the problem with the types for `getContent` by just using a type cast with a TODO (and link to the issue). Similarly we work around a problem where the Octokit types have an incorrect type for the name of the labels array in an API response. PR Close #42666
64 lines
2.4 KiB
TypeScript
64 lines
2.4 KiB
TypeScript
/**
|
|
* @license
|
|
* Copyright Google LLC All Rights Reserved.
|
|
*
|
|
* Use of this source code is governed by an MIT-style license that can be
|
|
* found in the LICENSE file at https://angular.io/license
|
|
*/
|
|
|
|
import {getConfig} from '../../utils/config';
|
|
import {error, info, red} from '../../utils/console';
|
|
import {GitClient} from '../../utils/git/git-client';
|
|
import {loadAndValidateConfig, TargetLabel} from '../merge/config';
|
|
import {getBranchesFromTargetLabel, getTargetLabelFromPullRequest, InvalidTargetLabelError} from '../merge/target-label';
|
|
|
|
export async function getTargetBranchesForPr(prNumber: number) {
|
|
/** The ng-dev configuration. */
|
|
const config = getConfig();
|
|
/** Repo owner and name for the github repository. */
|
|
const {owner, name: repo} = config.github;
|
|
/** The singleton instance of the GitClient. */
|
|
const git = GitClient.get();
|
|
/** The validated merge config. */
|
|
const {config: mergeConfig, errors} = await loadAndValidateConfig(config, git.github);
|
|
if (errors !== undefined) {
|
|
throw Error(`Invalid configuration found: ${errors}`);
|
|
}
|
|
/** The current state of the pull request from Github. */
|
|
const prData = (await git.github.pulls.get({owner, repo, pull_number: prNumber})).data;
|
|
/** The list of labels on the PR as strings. */
|
|
// Note: The `name` property of labels is always set but the Github OpenAPI spec is incorrect
|
|
// here.
|
|
// TODO(devversion): Remove the non-null cast once
|
|
// https://github.com/github/rest-api-description/issues/169 is fixed.
|
|
const labels = prData.labels.map(l => l.name!);
|
|
/** The branch targetted via the Github UI. */
|
|
const githubTargetBranch = prData.base.ref;
|
|
/** The active label which is being used for targetting the PR. */
|
|
let targetLabel: TargetLabel;
|
|
|
|
try {
|
|
targetLabel = getTargetLabelFromPullRequest(mergeConfig!, labels);
|
|
} catch (e) {
|
|
if (e instanceof InvalidTargetLabelError) {
|
|
error(red(e.failureMessage));
|
|
process.exitCode = 1;
|
|
return;
|
|
}
|
|
throw e;
|
|
}
|
|
/** The target branches based on the target label and branch targetted in the Github UI. */
|
|
return await getBranchesFromTargetLabel(targetLabel, githubTargetBranch);
|
|
}
|
|
|
|
|
|
export async function printTargetBranchesForPr(prNumber: number) {
|
|
const targets = await getTargetBranchesForPr(prNumber);
|
|
if (targets === undefined) {
|
|
return;
|
|
}
|
|
info.group(`PR #${prNumber} will merge into:`);
|
|
targets.forEach(target => info(`- ${target}`));
|
|
info.groupEnd();
|
|
}
|