From f8d7917f56933934b746d61dc7c315efe4b07224 Mon Sep 17 00:00:00 2001 From: Sebastian Malton Date: Fri, 24 Feb 2023 10:42:23 -0500 Subject: [PATCH] Fix bugs related to picking PRs Signed-off-by: Sebastian Malton --- packages/release-tool/src/index.ts | 58 +++++++++++++++++------------- 1 file changed, 34 insertions(+), 24 deletions(-) diff --git a/packages/release-tool/src/index.ts b/packages/release-tool/src/index.ts index 6133e7c31c..e1fd93c8ea 100755 --- a/packages/release-tool/src/index.ts +++ b/packages/release-tool/src/index.ts @@ -13,14 +13,10 @@ import { promisify } from "util"; type SemVer = semver.SemVer; -const { - SemVer, - valid: semverValid, - rcompare: semverRcompare, - lte: semverLte, -} = semver; +const { SemVer } = semver; const exec = promisify(child_process.exec); const spawn = promisify(child_process.spawn); +const execFile = promisify(child_process.execFile); interface GithubPrData { author: { @@ -59,12 +55,11 @@ async function getAbsolutePathToRepoRoot(): Promise { } async function fetchAllGitTags(): Promise { - await spawn("git", ["fetch", "--tags", "--force"], { - stdio: "inherit", - }); + await execFile("git", ["fetch", "--tags", "--force"]); - return (await exec("git tag --list", { encoding: "utf-8" })) - .stdout + const { stdout } = await exec("git tag --list", { encoding: "utf-8" }); + + return stdout .split(/\r?\n/) .map(line => line.trim()); } @@ -75,16 +70,21 @@ async function bumpPackageVersions(): Promise { }); } +function isDefined(value: T | null | undefined): value is T { + return value != null; +} + function findClosestVersionTagLessThanVersion(tags: string[], version: SemVer): string { const lessThanTags = tags - .map((value) => semverValid(value)) - .filter((v): v is string => typeof v === "string") - .sort(semverRcompare) - .filter(version => semverLte(version, version)); + .map((value) => semver.parse(value)) + .filter(isDefined) + .filter(version => !version.prerelease.includes("cron")) + .sort(semver.rcompare) + .filter(version => semver.lte(version, version)); assert(lessThanTags.length > 0, `Cannot find version tag less than ${version.format()}`); - return lessThanTags[0]; + return lessThanTags[0].format(); } async function getCurrentVersionOfSubPackage(packageName: string): Promise { @@ -200,15 +200,21 @@ const cherrypickCommitWith = (rl: ReadLine) => async (commit: string) => { }; async function pickWhichCommitsToUse(prs: ExtendedGithubPrData[]): Promise { - console.log("Pick which commits to use..."); - const answers = await inquirer.prompt>>(prs.map(pr => ({ - message: `#${pr.number}: ${pr.title}`, + const answers = await inquirer.prompt<{ commits: number[] }>({ type: "checkbox", - default: true, - name: pr.number, - }))); + name: `commits`, + message: "Pick which commits to use...", + default: [], + choices: prs.map(pr => ({ + checked: true, + key: pr.number, + name: `#${pr.number}: ${pr.title} (https://github.com/lensapp/lens/pull/${pr.number})`, + value: pr.number, + })), + loop: false, + }); - return prs.filter(pr => answers[pr.number]); + return prs.filter(pr => answers.commits.includes(pr.number)); } function formatChangelog(previousReleasedVersion: string, prs: ExtendedGithubPrData[]): string { @@ -266,7 +272,11 @@ async function pickRelaventPrs(prs: ExtendedGithubPrData[], isMasterBranch: bool return prs; } - const selectedPrs = await pickWhichCommitsToUse(prs); + let selectedPrs: ExtendedGithubPrData[]; + + do { + selectedPrs = await pickWhichCommitsToUse(prs); + } while (selectedPrs.length === 0 && (console.warn("[WARNING]: must pick at least once commit"), true)); await cherrypickCommits(selectedPrs);