From c1bd130e638f3d4a97a91daa676c66bd16ea6982 Mon Sep 17 00:00:00 2001 From: mbwhite Date: Thu, 4 Jan 2024 14:13:30 +0000 Subject: [PATCH] feat: added support for git commit --signoff Signed-off-by: mbwhite --- README.md | 4 ++++ command.js | 5 +++++ defaults.js | 1 + lib/lifecycles/commit.js | 3 ++- test/core.spec.js | 39 +++++++++++++++++++++++++++++++++++++++ 5 files changed, 51 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 0eba2c674..fded61528 100644 --- a/README.md +++ b/README.md @@ -279,6 +279,10 @@ commit-and-tag-version --no-verify If you have your GPG key set up, add the `--sign` or `-s` flag to your `commit-and-tag-version` command. +### Signed-off-by trailer + +To add the "Signed-off-by" trailer to the commit message add the `--signedoff` flag to your `commit-and-tag-version` command. + ### Lifecycle Scripts `commit-and-tag-version` supports lifecycle scripts. These allow you to execute your diff --git a/command.js b/command.js index eef680f57..0b7dfcbe3 100755 --- a/command.js +++ b/command.js @@ -48,6 +48,11 @@ const yargs = require('yargs') type: 'boolean', default: defaults.sign, }) + .option('signedoff', { + describe: 'Should the git commit have a "Signed-off-by" trailer', + type: 'boolean', + default: defaults.signedoff, + }) .option('no-verify', { alias: 'n', describe: diff --git a/defaults.js b/defaults.js index b6eca902e..d60412307 100644 --- a/defaults.js +++ b/defaults.js @@ -4,6 +4,7 @@ const defaults = { infile: 'CHANGELOG.md', firstRelease: false, sign: false, + signedoff: false, noVerify: false, commitAll: false, silent: false, diff --git a/lib/lifecycles/commit.js b/lib/lifecycles/commit.js index 4f14407f9..824fa31ca 100644 --- a/lib/lifecycles/commit.js +++ b/lib/lifecycles/commit.js @@ -18,6 +18,7 @@ async function execCommit(args, newVersion) { let paths = []; const verify = args.verify === false || args.n ? ['--no-verify'] : []; const sign = args.sign ? ['-S'] : []; + const signedoff = args.signedoff ? ['--signoff'] : []; const toAdd = []; // only start with a pre-populated paths list when CHANGELOG processing is not skipped @@ -59,7 +60,7 @@ async function execCommit(args, newVersion) { await runExecFile( args, 'git', - ['commit'].concat(verify, sign, args.commitAll ? [] : toAdd, [ + ['commit'].concat(verify, sign, signedoff, args.commitAll ? [] : toAdd, [ '-m', `${formatCommitMessage(args.releaseCommitMessageFormat, newVersion)}`, ]), diff --git a/test/core.spec.js b/test/core.spec.js index 96f22d133..a727a9d41 100644 --- a/test/core.spec.js +++ b/test/core.spec.js @@ -1475,6 +1475,45 @@ describe('cli', function () { expect(gitArgs).toHaveLength(0); }); + + it('--signedoff adds signed-off-by to the commit message', async function () { + const gitArgs = [ + ['add', 'CHANGELOG.md', 'package.json', 'package-lock.json'], + [ + 'commit', + '--signoff', + 'CHANGELOG.md', + 'package.json', + 'package-lock.json', + '-m', + 'chore(release): 1.0.1', + ], + ['tag', '-a', 'v1.0.1', '-m', 'chore(release): 1.0.1'], + ['rev-parse', '--abbrev-ref', 'HEAD'], + ]; + + runExecFile.mockImplementation((_args, cmd, cmdArgs) => { + expect(cmd).toEqual('git'); + + const expected = gitArgs.shift(); + expect(cmdArgs).toEqual(expected); + + if (expected[0] === 'rev-parse') return Promise.resolve('master'); + + return Promise.resolve(''); + }); + + mock({ + bump: 'patch', + changelog: 'foo\n', + }); + + await exec('--signedoff', true); + expect(gitArgs).toHaveLength(0); + }); + + + it('--tag-force forces tag replacement', async function () { const gitArgs = [ ['add', 'CHANGELOG.md', 'package.json', 'package-lock.json'],