Skip to content

Commit

Permalink
rebase: try not to munge commit log message
Browse files Browse the repository at this point in the history
This makes rebase/am keep the original commit log message
better, even when it does not conform to "single line paragraph
to say what it does, then explain and defend why it is a good
change in later paragraphs" convention.

This change is a two-edged sword.  While the earlier behaviour
would make such commit log messages more friendly to readers who
expect to get the birds-eye view with oneline summary formats,
users who primarily use git as a way to interact with foreign
SCM systems would not care much about the convenience of oneline
git log tools, but care more about preserving their own
convention.  This changes their commits less useful to readers
who read them with git tools while keeping them more consistent
with the foreign SCM systems they interact with.

Signed-off-by: Junio C Hamano <gitster@pobox.com>
  • Loading branch information
Junio C Hamano committed Jul 30, 2007
1 parent 2838844 commit d7f6bae
Show file tree
Hide file tree
Showing 2 changed files with 72 additions and 5 deletions.
29 changes: 24 additions & 5 deletions builtin-mailinfo.c
Original file line number Diff line number Diff line change
Expand Up @@ -237,8 +237,6 @@ static int eatspace(char *line)

static char *cleanup_subject(char *subject)
{
if (keep_subject)
return subject;
for (;;) {
char *p;
int len, remove;
Expand Down Expand Up @@ -425,6 +423,7 @@ static int read_one_header_line(char *line, int sz, FILE *in)
if (addlen >= sz - len)
addlen = sz - len - 1;
memcpy(line + len, continuation, addlen);
line[len] = '\n';
len += addlen;
}
}
Expand Down Expand Up @@ -846,6 +845,22 @@ static void handle_body(void)
return;
}

static void output_header_lines(FILE *fout, const char *hdr, char *data)
{
while (1) {
char *ep = strchr(data, '\n');
int len;
if (!ep)
len = strlen(data);
else
len = ep - data;
fprintf(fout, "%s: %.*s\n", hdr, len, data);
if (!ep)
break;
data = ep + 1;
}
}

static void handle_info(void)
{
char *sub;
Expand All @@ -863,9 +878,13 @@ static void handle_info(void)
continue;

if (!memcmp(header[i], "Subject", 7)) {
sub = cleanup_subject(hdr);
cleanup_space(sub);
fprintf(fout, "Subject: %s\n", sub);
if (keep_subject)
sub = hdr;
else {
sub = cleanup_subject(hdr);
cleanup_space(sub);
}
output_header_lines(fout, "Subject", sub);
} else if (!memcmp(header[i], "From", 4)) {
handle_from(hdr);
fprintf(fout, "Author: %s\n", name);
Expand Down
48 changes: 48 additions & 0 deletions t/t3405-rebase-malformed.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,48 @@
#!/bin/sh

test_description='rebase should not insist on git message convention'

. ./test-lib.sh

cat >F <<\EOF
This is an example of a commit log message
that does not conform to git commit convention.
It has two paragraphs, but its first paragraph is not friendly
to oneline summary format.
EOF

test_expect_success setup '
>file1 &&
>file2 &&
git add file1 file2 &&
test_tick &&
git commit -m "Initial commit" &&
git checkout -b side &&
cat F >file2 &&
git add file2 &&
test_tick &&
git commit -F F &&
git cat-file commit HEAD | sed -e "1,/^\$/d" >F0 &&
git checkout master &&
echo One >file1 &&
test_tick &&
git add file1 &&
git commit -m "Second commit"
'

test_expect_success rebase '
git rebase master side &&
git cat-file commit HEAD | sed -e "1,/^\$/d" >F1 &&
diff -u F0 F1 &&
diff -u F F0
'

test_done

0 comments on commit d7f6bae

Please sign in to comment.