git-commit: populate the edit buffer with 2 blank lines before s-o-b

'commit -s' populates the edit buffer with a blank line before the Signed-off-by line, to allow the user to immediately start typing the log message. But commit 33f2f9ab removed this space, forcing the user to first push the Signed-off-by line down to open a place to type the log message. Fix this regression and let's ensure that the Signed-off-by line is preceded by two blank lines, instead of just one, to hint that something should be filled in, and that a blank line should separate it from the body and the Signed-off-by line. Add a test for this behavior. Reported-by: John Keeping <john@keeping.me.uk> Signed-off-by: Brandon Casey <drafnel@gmail.com> Signed-off-by: Junio C Hamano <gitster@pobox.com>

Brandon Casey committed Feb 22, 2013 at 14:05 UTC 8c613fd5efa1c3bbd48845ed91c533192e699c08
2 files changed +37 -2
sequencer.c
+25 -2
@@ -1127,10 +1127,33 @@ void append_signoff(struct strbuf *msgbuf, int ignore_footer, unsigned flag)
1127 const char *append_newlines = NULL;
1128 size_t len = msgbuf->len - ignore_footer;
1129
1130 - if (len && msgbuf->buf[len - 1] != '\n')
1130 + if (!len) {
1131 + /*
1132 + * The buffer is completely empty. Leave foom for
1133 + * the title and body to be filled in by the user.
1134 + */
1135 append_newlines = "\n\n";
1132 - else if (len > 1 && msgbuf->buf[len - 2] != '\n')
1136 + } else if (msgbuf->buf[len - 1] != '\n') {
1137 + /*
1138 + * Incomplete line. Complete the line and add a
1139 + * blank one so that there is an empty line between
1140 + * the message body and the sob.
1141 + */
1142 + append_newlines = "\n\n";
1143 + } else if (len == 1) {
1144 + /*
1145 + * Buffer contains a single newline. Add another
1146 + * so that we leave room for the title and body.
1147 + */
1148 + append_newlines = "\n";
1149 + } else if (msgbuf->buf[len - 2] != '\n') {
1150 + /*
1151 + * Buffer ends with a single newline. Add another
1152 + * so that there is an empty line between the message
1153 + * body and the sob.
1154 + */
1155 append_newlines = "\n";
1156 + } /* else, the buffer already ends with two newlines. */
1157
1158 if (append_newlines)
1159 strbuf_splice(msgbuf, msgbuf->len - ignore_footer, 0,
t/t7502-commit.sh
+12
@@ -349,6 +349,18 @@ test_expect_success 'A single-liner subject with a token plus colon is not a foo
349
350 '
351
352 +test_expect_success 'commit -s places sob on third line after two empty lines' '
353 + git commit -s --allow-empty --allow-empty-message &&
354 + cat <<-EOF >expect &&
355 +
356 +
357 + Signed-off-by: $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL>
358 +
359 + EOF
360 + sed -e "/^#/d" -e "s/^:.*//" .git/COMMIT_EDITMSG >actual &&
361 + test_cmp expect actual
362 +'
363 +
364 write_script .git/FAKE_EDITOR <<\EOF
365 mv "$1" "$1.orig"
366 (