git-commit: populate the edit buffer with 2 blank lines before s-o-b
authorBrandon Casey <drafnel@gmail.com>
Fri, 22 Feb 2013 22:05:27 +0000 (14:05 -0800)
committerJunio C Hamano <gitster@pobox.com>
Sat, 23 Feb 2013 08:03:00 +0000 (00:03 -0800)
'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>
sequencer.c
t/t7502-commit.sh
index 53ee49a9b0b02a687e3b56e85d96794d9f1b31ce..a07d2d00b9f7090e1e5c4526b77fb49f34865206 100644 (file)
@@ -1127,10 +1127,33 @@ void append_signoff(struct strbuf *msgbuf, int ignore_footer, unsigned flag)
                const char *append_newlines = NULL;
                size_t len = msgbuf->len - ignore_footer;
 
-               if (len && msgbuf->buf[len - 1] != '\n')
+               if (!len) {
+                       /*
+                        * The buffer is completely empty.  Leave foom for
+                        * the title and body to be filled in by the user.
+                        */
                        append_newlines = "\n\n";
-               else if (len > 1 && msgbuf->buf[len - 2] != '\n')
+               } else if (msgbuf->buf[len - 1] != '\n') {
+                       /*
+                        * Incomplete line.  Complete the line and add a
+                        * blank one so that there is an empty line between
+                        * the message body and the sob.
+                        */
+                       append_newlines = "\n\n";
+               } else if (len == 1) {
+                       /*
+                        * Buffer contains a single newline.  Add another
+                        * so that we leave room for the title and body.
+                        */
+                       append_newlines = "\n";
+               } else if (msgbuf->buf[len - 2] != '\n') {
+                       /*
+                        * Buffer ends with a single newline.  Add another
+                        * so that there is an empty line between the message
+                        * body and the sob.
+                        */
                        append_newlines = "\n";
+               } /* else, the buffer already ends with two newlines. */
 
                if (append_newlines)
                        strbuf_splice(msgbuf, msgbuf->len - ignore_footer, 0,
index deb187eb7b4277a43f46e73c1d85012b728ce14a..c06a7526c127eff62a46a86490bea942eeead2c8 100755 (executable)
@@ -349,6 +349,18 @@ test_expect_success 'A single-liner subject with a token plus colon is not a foo
 
 '
 
+test_expect_success 'commit -s places sob on third line after two empty lines' '
+       git commit -s --allow-empty --allow-empty-message &&
+       cat <<-EOF >expect &&
+
+
+       Signed-off-by: $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL>
+
+       EOF
+       sed -e "/^#/d" -e "s/^:.*//" .git/COMMIT_EDITMSG >actual &&
+       test_cmp expect actual
+'
+
 write_script .git/FAKE_EDITOR <<\EOF
 mv "$1" "$1.orig"
 (