Added --signoff flag to `git-merge` command, added test coverage, updated documentation. Signed-off-by: lukaszgryglicki <lukaszgryglicki@xxxxx> --- Documentation/git-merge.txt | 8 ++++++ builtin/merge.c | 4 +++ t/t9904-git-merge-signoff.sh | 60 ++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 72 insertions(+) create mode 100755 t/t9904-git-merge-signoff.sh diff --git a/Documentation/git-merge.txt b/Documentation/git-merge.txt index 04fdd8cf086db..6b308ab6d0b52 100644 --- a/Documentation/git-merge.txt +++ b/Documentation/git-merge.txt @@ -64,6 +64,14 @@ OPTIONS ------- include::merge-options.txt[] +--signoff:: + Add Signed-off-by line by the committer at the end of the commit + log message. The meaning of a signoff depends on the project, + but it typically certifies that committer has + the rights to submit this work under the same license and + agrees to a Developer Certificate of Origin + (see http://developercertificate.org/ for more information). + -S[<keyid>]:: --gpg-sign[=<keyid>]:: GPG-sign the resulting merge commit. The `keyid` argument is diff --git a/builtin/merge.c b/builtin/merge.c index 900bafdb45d0b..cb09f4138136b 100644 --- a/builtin/merge.c +++ b/builtin/merge.c @@ -70,6 +70,7 @@ static int continue_current_merge; static int allow_unrelated_histories; static int show_progress = -1; static int default_to_upstream = 1; +static int signoff; static const char *sign_commit; static struct strategy all_strategy[] = { @@ -233,6 +234,7 @@ static struct option builtin_merge_options[] = { { OPTION_STRING, 'S', "gpg-sign", &sign_commit, N_("key-id"), N_("GPG sign commit"), PARSE_OPT_OPTARG, NULL, (intptr_t) "" }, OPT_BOOL(0, "overwrite-ignore", &overwrite_ignore, N_("update ignored files (default)")), + OPT_BOOL(0, "signoff", &signoff, N_("add Signed-off-by:")), OPT_END() }; @@ -775,6 +777,8 @@ static void prepare_to_commit(struct commit_list *remoteheads) strbuf_stripspace(&msg, 0 < option_edit); if (!msg.len) abort_commit(remoteheads, _("Empty commit message.")); + if (signoff) + append_signoff(&msg, ignore_non_trailer(msg.buf, msg.len), 0); strbuf_release(&merge_msg); strbuf_addbuf(&merge_msg, &msg); strbuf_release(&msg); diff --git a/t/t9904-git-merge-signoff.sh b/t/t9904-git-merge-signoff.sh new file mode 100755 index 0000000000000..eed15b9a85371 --- /dev/null +++ b/t/t9904-git-merge-signoff.sh @@ -0,0 +1,60 @@ +#!/bin/sh + +test_description='git merge --signoff + +This test runs git merge --signoff and make sure that it works. +' + +. ./test-lib.sh + +# A simple files to commit +cat >file1 <<EOF +1 +EOF + +cat >file2 <<EOF +2 +EOF + +cat >file3 <<EOF +3 +EOF + +# Expected commit message after merge --signoff +cat >expected-signed <<EOF +Merge branch 'master' into other-branch + +Signed-off-by: $(git var GIT_COMMITTER_IDENT | sed -e "s/>.*/>/") +EOF + +# Expected commit message after merge without --signoff (or with --no-signoff) +cat >expected-unsigned <<EOF +Merge branch 'master' into other-branch +EOF + + +# We configure an alias to do the merge --signoff so that +# on the next subtest we can show that --no-signoff overrides the alias +test_expect_success 'merge --signoff adds a sign-off line' ' + git commit --allow-empty -m "Initial empty commit" && + git checkout -b other-branch && + git add file1 && git commit -m other-branch && + git checkout master && + git add file2 && git commit -m master-branch && + git checkout other-branch && + git config alias.msob "merge --signoff --no-edit" && + git msob master && + git cat-file commit HEAD | sed -e "1,/^\$/d" > actual && + test_cmp expected-signed actual +' + +test_expect_success 'master --no-signoff does not add a sign-off line' ' + git checkout master && + git add file3 && git commit -m master-branch-2 && + git checkout other-branch && + git msob --no-signoff master && + git cat-file commit HEAD | sed -e "1,/^\$/d" > actual && + test_cmp expected-unsigned actual +' + +test_done -- https://github.com/git/git/pull/381