]> git.ipfire.org Git - thirdparty/git.git/commitdiff
Merge branch 'bc/append-signed-off-by'
authorJunio C Hamano <gitster@pobox.com>
Mon, 1 Apr 2013 15:59:23 +0000 (08:59 -0700)
committerJunio C Hamano <gitster@pobox.com>
Mon, 1 Apr 2013 15:59:24 +0000 (08:59 -0700)
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

1  2 
builtin/commit.c
builtin/log.c
log-tree.c
revision.h
sequencer.c
t/t4014-format-patch.sh
t/t7502-commit.sh
t/test-lib-functions.sh

Simple merge
diff --cc builtin/log.c
index 8f0b2e84fef5d1b9c07ea8846c9fbc1318d8d51b,bb48344113cc3ab0e0a9fc4aba0408b43b4637a9..59de484bc29a38fb538e1146a91ddef708ebc3cc
@@@ -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 (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);
-       }
 +      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);
 +      }
 +
        for (i = 0; i < extra_hdr.nr; i++) {
                strbuf_addstr(&buf, extra_hdr.items[i].string);
                strbuf_addch(&buf, '\n');
diff --cc log-tree.c
Simple merge
diff --cc revision.h
index 5da09ee3efa976b503cba5d13e347aad0f6c764c,d20defabd5ea448f6a55fc6ad08e8a534177da3d..01bd2b7c07719c9628bba13e34b581dc1fdbc0af
@@@ -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 sequencer.c
Simple merge
index bb1fc47fe8aa6904555c153f90a6026c45bf3645,95af73f596b096fe8de94d4fd027a09d7401badb..b993dae64574cd2828fc636d3afc15b2c0c2e5a0
@@@ -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 </dev/null >actual &&
+       cat <<\EOF | sed "s/EOL$//" >expected &&
+ 4:Subject: [PATCH] EOL
+ 8:
+ 9:Signed-off-by: C O Mitter <committer@example.com>
+ 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 <committer@example.com>
+ 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 <committer@example.com>
+ 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 <committer@example.com>
+ 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 <committer@example.com>
+ 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 <committer@example.com>
+ 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 <someone@example.com>
+ 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 <committer@example.com>
+ 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 <committer@example.com>
+ 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 <committer@example.com>
+ 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 <committer@example.com>
+ 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 <committer@example.com>
+ 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 <committer@example.com>
+ EOF
+       cat >expected <<\EOF &&
+ 4:Subject: [PATCH] subject
+ 8:
+ 10:
+ 11:Signed-off-by: C O Mitter <committer@example.com>
+ 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 <committer@example.com>" |
+               append_signoff >actual &&
+       cat >expected <<\EOF &&
+ 4:Subject: [PATCH] subject
+ 8:
+ 9:Signed-off-by: C O Mitter <committer@example.com>
+ 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 <committer@example.com>
+ Signed-off-by: my@house
+ EOF
+       cat >expected <<\EOF &&
+ 4:Subject: [PATCH] subject
+ 8:
+ 10:
+ 11:Signed-off-by: C O Mitter <committer@example.com>
+ 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 <committer@example.com>
+ EOF
+       cat >expected <<\EOF &&
+ 4:Subject: [PATCH] subject
+ 8:
+ 10:
+ 13:Signed-off-by: C O Mitter <committer@example.com>
+ 14:
+ 15:Signed-off-by: C O Mitter <committer@example.com>
+ 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 <committer@example.com>
+ Bug: 1234
+ EOF
+       cat >expected <<\EOF &&
+ 4:Subject: [PATCH] subject
+ 8:
+ 10:
+ 14:Signed-off-by: C O Mitter <committer@example.com>
+ 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
Simple merge
Simple merge