diff --git a/components/git/land.js b/components/git/land.js index f80cf85..dff93c2 100644 --- a/components/git/land.js +++ b/components/git/land.js @@ -46,6 +46,12 @@ const landActions = { 'other commit messages', default: false, type: 'boolean' + }, + oneCommitMax: { + describe: 'When run in conjunction with the --yes and --autorebase ' + + 'options, will abort the session if trying to land more than one commit', + default: false, + type: 'boolean' } }; diff --git a/lib/landing_session.js b/lib/landing_session.js index 88d4c7f..8d4ba03 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, oneCommitMax + } = {}) { super(cli, dir, prid); this.req = req; this.backport = backport; this.lint = lint; this.autorebase = autorebase; this.fixupAll = fixupAll; + this.oneCommitMax = oneCommitMax; 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.oneCommitMax = this.oneCommitMax; 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, oneCommitMax + } = 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 is more than one commit in the PR. ' + + 'Do you still want to land it?', + { defaultAnswer: !oneCommitMax }); + + 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,