From dc5d553b5582e543f3151e43f9ae0df9831a4cc9 Mon Sep 17 00:00:00 2001 From: Christian Couder Date: Thu, 20 Aug 2015 23:59:15 +0200 Subject: [PATCH 1/3] trailer: ignore first line of message When looking for the start of the trailers in the message we are passed, we should ignore the first line of the message. The reason is that if we are passed a patch or commit message then the first line should be the patch title. If we are passed only trailers we can expect that they start with an empty line that can be ignored too. This way we can properly process commit messages that have only one line with something that looks like a trailer, for example like "area of code: change we made". Signed-off-by: Christian Couder Signed-off-by: Junio C Hamano --- t/t7513-interpret-trailers.sh | 15 ++++++++++++++- trailer.c | 3 ++- 2 files changed, 16 insertions(+), 2 deletions(-) diff --git a/t/t7513-interpret-trailers.sh b/t/t7513-interpret-trailers.sh index 1efb88051a..33cf4d1d21 100755 --- a/t/t7513-interpret-trailers.sh +++ b/t/t7513-interpret-trailers.sh @@ -93,12 +93,25 @@ test_expect_success 'with config option on the command line' ' Acked-by: Johan Reviewed-by: Peff EOF - echo "Acked-by: Johan" | + { echo; echo "Acked-by: Johan"; } | git -c "trailer.Acked-by.ifexists=addifdifferent" interpret-trailers \ --trailer "Reviewed-by: Peff" --trailer "Acked-by: Johan" >actual && test_cmp expected actual ' +test_expect_success 'with message that contains only a title' ' + cat >expected <<-\EOF && + area: change + + Reviewed-by: Peff + Acked-by: Johan + EOF + echo "area: change" | + git interpret-trailers --trailer "Reviewed-by: Peff" \ + --trailer "Acked-by: Johan" >actual && + test_cmp expected actual +' + test_expect_success 'with config setup' ' git config trailer.ack.key "Acked-by: " && cat >expected <<-\EOF && diff --git a/trailer.c b/trailer.c index a905f5c50c..f7d271397f 100644 --- a/trailer.c +++ b/trailer.c @@ -748,8 +748,9 @@ static int find_trailer_start(struct strbuf **lines, int count) /* * Get the start of the trailers by looking starting from the end * for a line with only spaces before lines with one separator. + * The start cannot be the first line. */ - for (start = count - 1; start >= 0; start--) { + for (start = count - 1; start >= 1; start--) { if (lines[start]->buf[0] == comment_line_char) continue; if (contains_only_spaces(lines[start]->buf)) { From 6262fe9ca3cd61d27ca5c5599ab46d166e5b23a2 Mon Sep 17 00:00:00 2001 From: Christian Couder Date: Wed, 26 Aug 2015 04:51:00 +0200 Subject: [PATCH 2/3] trailer: retitle a test and correct an in-comment message Signed-off-by: Christian Couder Signed-off-by: Junio C Hamano --- t/t7513-interpret-trailers.sh | 2 +- trailer.c | 3 ++- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/t/t7513-interpret-trailers.sh b/t/t7513-interpret-trailers.sh index 33cf4d1d21..8f1f55be25 100755 --- a/t/t7513-interpret-trailers.sh +++ b/t/t7513-interpret-trailers.sh @@ -99,7 +99,7 @@ test_expect_success 'with config option on the command line' ' test_cmp expected actual ' -test_expect_success 'with message that contains only a title' ' +test_expect_success 'with only a title in the message' ' cat >expected <<-\EOF && area: change diff --git a/trailer.c b/trailer.c index f7d271397f..a92ba53fa5 100644 --- a/trailer.c +++ b/trailer.c @@ -748,7 +748,8 @@ static int find_trailer_start(struct strbuf **lines, int count) /* * Get the start of the trailers by looking starting from the end * for a line with only spaces before lines with one separator. - * The start cannot be the first line. + * The first line must not be analyzed as the others as it + * should be either the message title or a blank line. */ for (start = count - 1; start >= 1; start--) { if (lines[start]->buf[0] == comment_line_char) From 5c99995df8ee3b02224f0e2e86a3d1e4bb2f7348 Mon Sep 17 00:00:00 2001 From: Christian Couder Date: Sun, 30 Aug 2015 21:14:40 +0200 Subject: [PATCH 3/3] trailer: support multiline title We currently ignore the first line passed to `git interpret-trailers`, when looking for the beginning of the trailers. Unfortunately this does not work well when a commit is created with a line break in the title, using for example the following command: git commit -m 'place of code: change we made' That's why instead of ignoring only the first line, it is better to ignore the first paragraph. Signed-off-by: Christian Couder Signed-off-by: Junio C Hamano --- t/t7513-interpret-trailers.sh | 14 ++++++++++++++ trailer.c | 15 +++++++++++---- 2 files changed, 25 insertions(+), 4 deletions(-) diff --git a/t/t7513-interpret-trailers.sh b/t/t7513-interpret-trailers.sh index 8f1f55be25..1abec57f6e 100755 --- a/t/t7513-interpret-trailers.sh +++ b/t/t7513-interpret-trailers.sh @@ -112,6 +112,20 @@ test_expect_success 'with only a title in the message' ' test_cmp expected actual ' +test_expect_success 'with multiline title in the message' ' + cat >expected <<-\EOF && + place of + code: change + + Reviewed-by: Peff + Acked-by: Johan + EOF + printf "%s\n" "place of" "code: change" | + git interpret-trailers --trailer "Reviewed-by: Peff" \ + --trailer "Acked-by: Johan" >actual && + test_cmp expected actual +' + test_expect_success 'with config setup' ' git config trailer.ack.key "Acked-by: " && cat >expected <<-\EOF && diff --git a/trailer.c b/trailer.c index a92ba53fa5..5ec5f9ddc1 100644 --- a/trailer.c +++ b/trailer.c @@ -743,15 +743,22 @@ static int find_patch_start(struct strbuf **lines, int count) */ static int find_trailer_start(struct strbuf **lines, int count) { - int start, only_spaces = 1; + int start, end_of_title, only_spaces = 1; + + /* The first paragraph is the title and cannot be trailers */ + for (start = 0; start < count; start++) { + if (lines[start]->buf[0] == comment_line_char) + continue; + if (contains_only_spaces(lines[start]->buf)) + break; + } + end_of_title = start; /* * Get the start of the trailers by looking starting from the end * for a line with only spaces before lines with one separator. - * The first line must not be analyzed as the others as it - * should be either the message title or a blank line. */ - for (start = count - 1; start >= 1; start--) { + for (start = count - 1; start >= end_of_title; start--) { if (lines[start]->buf[0] == comment_line_char) continue; if (contains_only_spaces(lines[start]->buf)) {