From daad7e43faac0b4fadfa1e47c7c88046a1ee70a2 Mon Sep 17 00:00:00 2001 From: Roman Date: Tue, 21 Feb 2023 14:49:57 +0200 Subject: [PATCH] Fix not displaying output after cherry-pick fails Signed-off-by: Sebastian Malton --- package-lock.json | 1 + packages/release-tool/package.json | 1 + packages/release-tool/src/index.ts | 35 ++++++++++++++++++++++++++---- 3 files changed, 33 insertions(+), 4 deletions(-) diff --git a/package-lock.json b/package-lock.json index aa6b8599cd..f1889b6304 100644 --- a/package-lock.json +++ b/package-lock.json @@ -34468,6 +34468,7 @@ "version": "6.4.0-beta.13", "license": "MIT", "dependencies": { + "chalk": "^5.2.0", "inquirer": "^9.1.4", "semver": "^7.3.8" }, diff --git a/packages/release-tool/package.json b/packages/release-tool/package.json index 95bcc9c495..8cc0f00335 100644 --- a/packages/release-tool/package.json +++ b/packages/release-tool/package.json @@ -22,6 +22,7 @@ "rimraf": "^4.1.2" }, "dependencies": { + "chalk": "^5.2.0", "inquirer": "^9.1.4", "semver": "^7.3.8" } diff --git a/packages/release-tool/src/index.ts b/packages/release-tool/src/index.ts index b204bc9d68..7a4ce49a27 100755 --- a/packages/release-tool/src/index.ts +++ b/packages/release-tool/src/index.ts @@ -4,10 +4,10 @@ * Licensed under MIT License. See LICENSE in root directory for more information. */ import assert from "assert"; +import chalk from "chalk"; import child_process from "child_process"; import { readFile } from "fs/promises"; import inquirer from "inquirer"; -import { EOL } from "os"; import { createInterface, ReadLine } from "readline"; import semver from "semver"; import { promisify } from "util"; @@ -191,10 +191,38 @@ const isBugfixPr = (pr: ExtendedGithubPrData) => pr.labels.some(label => label.n const cherrypickCommitWith = (rl: ReadLine) => async (commit: string) => { try { - await spawn("git", ["cherry-pick", commit], { - stdio: "inherit", + const cherryPick = child_process.spawn("git", ["cherry-pick", commit]); + + cherryPick.stdout.pipe(process.stdout); + cherryPick.stderr.pipe(process.stderr); + + await new Promise((resolve, reject) => { + const cleaners: (() => void)[] = []; + const cleanup = () => cleaners.forEach(cleaner => cleaner()); + + const onExit = (code: number | null) => { + if (code) { + reject(new Error(`git cherry-pick failed with exit code ${code}`)); + cleanup(); + } + + resolve(); + cleanup(); + }; + + cherryPick.once("exit", onExit); + cleaners.push(() => cherryPick.off("exit", onExit)); + + const onError = (error: Error) => { + cleanup(); + reject(error); + }; + + cherryPick.once("error", onError); + cleaners.push(() => cherryPick.off("error", onError)); }); } catch { + console.error(chalk.bold("Please resolve conflicts in a seperate terminal and then press enter here...")); await new Promise(resolve => rl.once("line", () => resolve())); } }; @@ -258,7 +286,6 @@ function formatChangelog(previousReleasedVersion: string, prs: ExtendedGithubPrD } async function cherrypickCommits(prs: ExtendedGithubPrData[]): Promise { - console.log(`${EOL}If cherry-picking fails for any of these commits, please resolve them in a seperate terminal and then run "git cherry-pick --continue"${EOL}`); const rl = createInterface(process.stdin); const cherrypickCommit = cherrypickCommitWith(rl);