From 4c55189b47b478bb730a027ecf0ffcd1573fc97c Mon Sep 17 00:00:00 2001 From: Antoine du Hamel Date: Thu, 14 Oct 2021 15:39:04 +0200 Subject: [PATCH] feat(cli): prompt user when landing PR with several commits --- components/git/land.js | 5 +++++ lib/landing_session.js | 26 +++++++++++++++++++++++--- 2 files changed, 28 insertions(+), 3 deletions(-) diff --git a/components/git/land.js b/components/git/land.js index f80cf857..c80e4ea3 100644 --- a/components/git/land.js +++ b/components/git/land.js @@ -46,6 +46,11 @@ const landActions = { 'other commit messages', default: false, type: 'boolean' + }, + allowMultipleCommits: { + describe: 'Switch default answer if the pull request more than one commit', + default: false, + type: 'boolean' } }; diff --git a/lib/landing_session.js b/lib/landing_session.js index 88d4c7fe..940e1fe3 100644 --- a/lib/landing_session.js +++ b/lib/landing_session.js @@ -22,14 +22,17 @@ const LINT_RESULTS = { }; class LandingSession extends Session { - constructor(cli, req, dir, - { prid, backport, lint, autorebase, fixupAll, checkCI } = {}) { + constructor(cli, req, dir, { + prid, backport, lint, autorebase, fixupAll, + checkCI, allowMultipleCommits + } = {}) { super(cli, dir, prid); this.req = req; this.backport = backport; this.lint = lint; this.autorebase = autorebase; this.fixupAll = fixupAll; + this.allowMultipleCommits = allowMultipleCommits; this.expectedCommitShas = []; this.checkCI = !!checkCI; } @@ -40,6 +43,7 @@ class LandingSession extends Session { args.lint = this.lint; args.autorebase = this.autorebase; args.fixupAll = this.fixupAll; + args.allowMultipleCommits = this.allowMultipleCommits; return args; } @@ -349,7 +353,9 @@ class LandingSession extends Session { } async final() { - const { cli, owner, repo, upstream, branch, prid } = this; + const { + cli, owner, repo, upstream, branch, prid, allowMultipleCommits + } = this; // Check that git rebase/am has been completed. if (!this.readyToFinal()) { @@ -360,6 +366,20 @@ class LandingSession extends Session { }; const stray = this.getStrayCommits(); + if (stray.length > 1) { + const forceLand = await cli.prompt( + 'There are more than one commit in the PR. ' + + 'Do you still want to land it?', + { defaultAnswer: allowMultipleCommits }); + + if (!forceLand) { + cli.info( + 'Use --fixupAll option, squash the PR manually or land the PR from ' + + 'the command line.' + ); + process.exit(1); + } + } const strayVerbose = this.getStrayCommits(true); const validateCommand = path.join( __dirname,