Skip to content

Commit

Permalink
commit: More generous accepting of RFC-2822 footer lines.
Browse files Browse the repository at this point in the history
'git commit -s' will insert a blank line before the Signed-off-by
line at the end of the message, unless this last line is a
Signed-off-by line itself.  Common use has other trailing lines
at the ends of commit text, in the style of RFC2822 headers.

Be more generous in considering lines to be part of this footer.
If the last paragraph of the commit message reasonably resembles
RFC-2822 formatted lines, don't insert that blank line.

The new Signed-off-by line is still only suppressed when the
author's existing Signed-off-by is the last line of the message.

Signed-off-by: David Brown <davidb@quicinc.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
  • Loading branch information
David Brown authored and Junio C Hamano committed Oct 28, 2009
1 parent f7ad96c commit c1e01b0
Show file tree
Hide file tree
Showing 2 changed files with 83 additions and 1 deletion.
43 changes: 42 additions & 1 deletion builtin-commit.c
Original file line number Diff line number Diff line change
Expand Up @@ -414,6 +414,47 @@ static void determine_author_info(void)
author_date = date;
}

static int ends_rfc2822_footer(struct strbuf *sb)
{
int ch;
int hit = 0;
int i, j, k;
int len = sb->len;
int first = 1;
const char *buf = sb->buf;

for (i = len - 1; i > 0; i--) {
if (hit && buf[i] == '\n')
break;
hit = (buf[i] == '\n');
}

while (i < len - 1 && buf[i] == '\n')
i++;

for (; i < len; i = k) {
for (k = i; k < len && buf[k] != '\n'; k++)
; /* do nothing */
k++;

if ((buf[k] == ' ' || buf[k] == '\t') && !first)
continue;

first = 0;

for (j = 0; i + j < len; j++) {
ch = buf[i + j];
if (ch == ':')
break;
if (isalnum(ch) ||
(ch == '-'))
continue;
return 0;
}
}
return 1;
}

static int prepare_to_commit(const char *index_file, const char *prefix,
struct wt_status *s)
{
Expand Down Expand Up @@ -489,7 +530,7 @@ static int prepare_to_commit(const char *index_file, const char *prefix,
for (i = sb.len - 1; i > 0 && sb.buf[i - 1] != '\n'; i--)
; /* do nothing */
if (prefixcmp(sb.buf + i, sob.buf)) {
if (prefixcmp(sb.buf + i, sign_off_header))
if (!ends_rfc2822_footer(&sb))
strbuf_addch(&sb, '\n');
strbuf_addbuf(&sb, &sob);
}
Expand Down
41 changes: 41 additions & 0 deletions t/t7501-commit.sh
Original file line number Diff line number Diff line change
Expand Up @@ -247,6 +247,47 @@ $existing" &&
'

test_expect_success 'signoff gap' '
echo 3 >positive &&
git add positive &&
alt="Alt-RFC-822-Header: Value" &&
git commit -s -m "welcome
$alt" &&
git cat-file commit HEAD | sed -e "1,/^\$/d" > actual &&
(
echo welcome
echo
echo $alt
git var GIT_COMMITTER_IDENT |
sed -e "s/>.*/>/" -e "s/^/Signed-off-by: /"
) >expected &&
test_cmp expected actual
'

test_expect_success 'signoff gap 2' '
echo 4 >positive &&
git add positive &&
alt="fixed: 34" &&
git commit -s -m "welcome
We have now
$alt" &&
git cat-file commit HEAD | sed -e "1,/^\$/d" > actual &&
(
echo welcome
echo
echo We have now
echo $alt
echo
git var GIT_COMMITTER_IDENT |
sed -e "s/>.*/>/" -e "s/^/Signed-off-by: /"
) >expected &&
test_cmp expected actual
'

test_expect_success 'multiple -m' '
>negative &&
Expand Down

0 comments on commit c1e01b0

Please sign in to comment.