From: Junio C Hamano Date: Mon, 1 Apr 2013 15:59:23 +0000 (-0700) Subject: Merge branch 'bc/append-signed-off-by' X-Git-Tag: v1.8.3-rc0~149 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=900c8ecb5c98c3cae256dcc030476392fdf2bbf2;p=thirdparty%2Fgit.git Merge branch 'bc/append-signed-off-by' Consolidate codepaths that inspect log-message-to-be and decide to add a new Signed-off-by line in various commands. * bc/append-signed-off-by: git-commit: populate the edit buffer with 2 blank lines before s-o-b Unify appending signoff in format-patch, commit and sequencer format-patch: update append_signoff prototype t4014: more tests about appending s-o-b lines sequencer.c: teach append_signoff to avoid adding a duplicate newline sequencer.c: teach append_signoff how to detect duplicate s-o-b sequencer.c: always separate "(cherry picked from" from commit body sequencer.c: require a conforming footer to be preceded by a blank line sequencer.c: recognize "(cherry picked from ..." as part of s-o-b footer t/t3511: add some tests of 'cherry-pick -s' functionality t/test-lib-functions.sh: allow to specify the tag name to test_commit commit, cherry-pick -s: remove broken support for multiline rfc2822 fields sequencer.c: rework search for start of footer to improve clarity --- 900c8ecb5c98c3cae256dcc030476392fdf2bbf2 diff --cc builtin/log.c index 8f0b2e84fe,bb48344113..59de484bc2 --- a/builtin/log.c +++ b/builtin/log.c @@@ -1185,24 -1153,6 +1184,14 @@@ int cmd_format_patch(int argc, const ch PARSE_OPT_KEEP_ARGV0 | PARSE_OPT_KEEP_UNKNOWN | PARSE_OPT_KEEP_DASHDASH); + if (0 < reroll_count) { + struct strbuf sprefix = STRBUF_INIT; + strbuf_addf(&sprefix, "%s v%d", + rev.subject_prefix, reroll_count); + rev.reroll_count = reroll_count; + rev.subject_prefix = strbuf_detach(&sprefix, NULL); + } + - if (do_signoff) { - const char *committer; - const char *endpos; - committer = git_committer_info(IDENT_STRICT); - endpos = strchr(committer, '>'); - if (!endpos) - die(_("bogus committer info %s"), committer); - add_signoff = xmemdupz(committer, endpos - committer + 1); - } - for (i = 0; i < extra_hdr.nr; i++) { strbuf_addstr(&buf, extra_hdr.items[i].string); strbuf_addch(&buf, '\n'); diff --cc revision.h index 5da09ee3ef,d20defabd5..01bd2b7c07 --- a/revision.h +++ b/revision.h @@@ -135,10 -135,9 +135,10 @@@ struct rev_info const char *mime_boundary; const char *patch_suffix; int numbered_files; + int reroll_count; char *message_id; struct string_list *ref_message_ids; - const char *add_signoff; + int add_signoff; const char *extra_headers; const char *log_reencode; const char *subject_prefix; diff --cc t/t4014-format-patch.sh index bb1fc47fe8,95af73f596..b993dae645 --- a/t/t4014-format-patch.sh +++ b/t/t4014-format-patch.sh @@@ -972,54 -955,274 +972,316 @@@ test_expect_success 'empty subject pref test_cmp expect actual ' -test_expect_success 'format patch ignores color.ui' ' - test_unconfig color.ui && - git format-patch --stdout -1 >expect && - test_config color.ui always && - git format-patch --stdout -1 >actual && - test_cmp expect actual -' - + append_signoff() + { + C=$(git commit-tree HEAD^^{tree} -p HEAD) && + git format-patch --stdout --signoff $C^..$C >append_signoff.patch && + sed -n -e "1,/^---$/p" append_signoff.patch | + egrep -n "^Subject|Sign|^$" + } + + test_expect_success 'signoff: commit with no body' ' + append_signoff actual && + cat <<\EOF | sed "s/EOL$//" >expected && + 4:Subject: [PATCH] EOL + 8: + 9:Signed-off-by: C O Mitter + EOF + test_cmp expected actual + ' + + test_expect_success 'signoff: commit with only subject' ' + echo subject | append_signoff >actual && + cat >expected <<\EOF && + 4:Subject: [PATCH] subject + 8: + 9:Signed-off-by: C O Mitter + EOF + test_cmp expected actual + ' + + test_expect_success 'signoff: commit with only subject that does not end with NL' ' + printf subject | append_signoff >actual && + cat >expected <<\EOF && + 4:Subject: [PATCH] subject + 8: + 9:Signed-off-by: C O Mitter + EOF + test_cmp expected actual + ' + + test_expect_success 'signoff: no existing signoffs' ' + append_signoff <<\EOF >actual && + subject + + body + EOF + cat >expected <<\EOF && + 4:Subject: [PATCH] subject + 8: + 10: + 11:Signed-off-by: C O Mitter + EOF + test_cmp expected actual + ' + + test_expect_success 'signoff: no existing signoffs and no trailing NL' ' + printf "subject\n\nbody" | append_signoff >actual && + cat >expected <<\EOF && + 4:Subject: [PATCH] subject + 8: + 10: + 11:Signed-off-by: C O Mitter + EOF + test_cmp expected actual + ' + + test_expect_success 'signoff: some random signoff' ' + append_signoff <<\EOF >actual && + subject + + body + + Signed-off-by: my@house + EOF + cat >expected <<\EOF && + 4:Subject: [PATCH] subject + 8: + 10: + 11:Signed-off-by: my@house + 12:Signed-off-by: C O Mitter + EOF + test_cmp expected actual + ' + + test_expect_success 'signoff: misc conforming footer elements' ' + append_signoff <<\EOF >actual && + subject + + body + + Signed-off-by: my@house + (cherry picked from commit da39a3ee5e6b4b0d3255bfef95601890afd80709) + Tested-by: Some One + Bug: 1234 + EOF + cat >expected <<\EOF && + 4:Subject: [PATCH] subject + 8: + 10: + 11:Signed-off-by: my@house + 15:Signed-off-by: C O Mitter + EOF + test_cmp expected actual + ' + + test_expect_success 'signoff: some random signoff-alike' ' + append_signoff <<\EOF >actual && + subject + + body + Fooled-by-me: my@house + EOF + cat >expected <<\EOF && + 4:Subject: [PATCH] subject + 8: + 11: + 12:Signed-off-by: C O Mitter + EOF + test_cmp expected actual + ' + + test_expect_success 'signoff: not really a signoff' ' + append_signoff <<\EOF >actual && + subject + + I want to mention about Signed-off-by: here. + EOF + cat >expected <<\EOF && + 4:Subject: [PATCH] subject + 8: + 9:I want to mention about Signed-off-by: here. + 10: + 11:Signed-off-by: C O Mitter + EOF + test_cmp expected actual + ' + + test_expect_success 'signoff: not really a signoff (2)' ' + append_signoff <<\EOF >actual && + subject + + My unfortunate + Signed-off-by: example happens to be wrapped here. + EOF + cat >expected <<\EOF && + 4:Subject: [PATCH] subject + 8: + 10:Signed-off-by: example happens to be wrapped here. + 11: + 12:Signed-off-by: C O Mitter + EOF + test_cmp expected actual + ' + + test_expect_success 'signoff: valid S-o-b paragraph in the middle' ' + append_signoff <<\EOF >actual && + subject + + Signed-off-by: my@house + Signed-off-by: your@house + + A lot of houses. + EOF + cat >expected <<\EOF && + 4:Subject: [PATCH] subject + 8: + 9:Signed-off-by: my@house + 10:Signed-off-by: your@house + 11: + 13: + 14:Signed-off-by: C O Mitter + EOF + test_cmp expected actual + ' + + test_expect_success 'signoff: the same signoff at the end' ' + append_signoff <<\EOF >actual && + subject + + body + + Signed-off-by: C O Mitter + EOF + cat >expected <<\EOF && + 4:Subject: [PATCH] subject + 8: + 10: + 11:Signed-off-by: C O Mitter + EOF + test_cmp expected actual + ' + + test_expect_success 'signoff: the same signoff at the end, no trailing NL' ' + printf "subject\n\nSigned-off-by: C O Mitter " | + append_signoff >actual && + cat >expected <<\EOF && + 4:Subject: [PATCH] subject + 8: + 9:Signed-off-by: C O Mitter + EOF + test_cmp expected actual + ' + + test_expect_success 'signoff: the same signoff NOT at the end' ' + append_signoff <<\EOF >actual && + subject + + body + + Signed-off-by: C O Mitter + Signed-off-by: my@house + EOF + cat >expected <<\EOF && + 4:Subject: [PATCH] subject + 8: + 10: + 11:Signed-off-by: C O Mitter + 12:Signed-off-by: my@house + EOF + test_cmp expected actual + ' + + test_expect_success 'signoff: detect garbage in non-conforming footer' ' + append_signoff <<\EOF >actual && + subject + + body + + Tested-by: my@house + Some Trash + Signed-off-by: C O Mitter + EOF + cat >expected <<\EOF && + 4:Subject: [PATCH] subject + 8: + 10: + 13:Signed-off-by: C O Mitter + 14: + 15:Signed-off-by: C O Mitter + EOF + test_cmp expected actual + ' + + test_expect_success 'signoff: footer begins with non-signoff without @ sign' ' + append_signoff <<\EOF >actual && + subject + + body + + Reviewed-id: Noone + Tested-by: my@house + Change-id: Ideadbeef + Signed-off-by: C O Mitter + Bug: 1234 + EOF + cat >expected <<\EOF && + 4:Subject: [PATCH] subject + 8: + 10: + 14:Signed-off-by: C O Mitter + EOF + test_cmp expected actual + ' + +test_expect_success 'format patch ignores color.ui' ' + test_unconfig color.ui && + git format-patch --stdout -1 >expect && + test_config color.ui always && + git format-patch --stdout -1 >actual && + test_cmp expect actual +' + +test_expect_success 'cover letter using branch description (1)' ' + git checkout rebuild-1 && + test_config branch.rebuild-1.description hello && + git format-patch --stdout --cover-letter master >actual && + grep hello actual >/dev/null +' + +test_expect_success 'cover letter using branch description (2)' ' + git checkout rebuild-1 && + test_config branch.rebuild-1.description hello && + git format-patch --stdout --cover-letter rebuild-1~2..rebuild-1 >actual && + grep hello actual >/dev/null +' + +test_expect_success 'cover letter using branch description (3)' ' + git checkout rebuild-1 && + test_config branch.rebuild-1.description hello && + git format-patch --stdout --cover-letter ^master rebuild-1 >actual && + grep hello actual >/dev/null +' + +test_expect_success 'cover letter using branch description (4)' ' + git checkout rebuild-1 && + test_config branch.rebuild-1.description hello && + git format-patch --stdout --cover-letter master.. >actual && + grep hello actual >/dev/null +' + +test_expect_success 'cover letter using branch description (5)' ' + git checkout rebuild-1 && + test_config branch.rebuild-1.description hello && + git format-patch --stdout --cover-letter -2 HEAD >actual && + grep hello actual >/dev/null +' + +test_expect_success 'cover letter using branch description (6)' ' + git checkout rebuild-1 && + test_config branch.rebuild-1.description hello && + git format-patch --stdout --cover-letter -2 >actual && + grep hello actual >/dev/null +' + test_done