Commit f5f96a23 by Stjepan Rajko Committed by Edward Thomson

Fix git_commit_summary to convert newlines to spaces even after

whitespace.  Collapse spaces around newlines for the summary.
parent 3ce6cd4b
...@@ -431,22 +431,37 @@ const char *git_commit_summary(git_commit *commit) ...@@ -431,22 +431,37 @@ const char *git_commit_summary(git_commit *commit)
{ {
git_buf summary = GIT_BUF_INIT; git_buf summary = GIT_BUF_INIT;
const char *msg, *space; const char *msg, *space;
bool space_contains_newline = false;
assert(commit); assert(commit);
if (!commit->summary) { if (!commit->summary) {
for (msg = git_commit_message(commit), space = NULL; *msg; ++msg) { for (msg = git_commit_message(commit), space = NULL; *msg; ++msg) {
if (msg[0] == '\n' && (!msg[1] || msg[1] == '\n')) char next_character = msg[0];
/* stop processing at the end of the first paragraph */
if (next_character == '\n' && (!msg[1] || msg[1] == '\n'))
break; break;
else if (msg[0] == '\n') /* record the beginning of contiguous whitespace runs */
git_buf_putc(&summary, ' '); else if (git__isspace(next_character)) {
else if (git__isspace(msg[0])) if(space == NULL) {
space = space ? space : msg; space = msg;
else if (space) { space_contains_newline = false;
git_buf_put(&summary, space, (msg - space) + 1); }
space = NULL; space_contains_newline |= next_character == '\n';
} else }
git_buf_putc(&summary, *msg); /* the next character is non-space */
else {
/* process any recorded whitespace */
if (space) {
if(space_contains_newline)
git_buf_putc(&summary, ' '); /* if the space contains a newline, collapse to ' ' */
else
git_buf_put(&summary, space, (msg - space)); /* otherwise copy it */
space = NULL;
}
/* copy the next character */
git_buf_putc(&summary, next_character);
}
} }
commit->summary = git_buf_detach(&summary); commit->summary = git_buf_detach(&summary);
......
...@@ -70,12 +70,16 @@ void test_commit_commit__summary(void) ...@@ -70,12 +70,16 @@ void test_commit_commit__summary(void)
assert_commit_summary("Trimmed leading&trailing newlines", "\n\nTrimmed leading&trailing newlines\n\n"); assert_commit_summary("Trimmed leading&trailing newlines", "\n\nTrimmed leading&trailing newlines\n\n");
assert_commit_summary("First paragraph only", "\nFirst paragraph only\n\n(There are more!)"); assert_commit_summary("First paragraph only", "\nFirst paragraph only\n\n(There are more!)");
assert_commit_summary("First paragraph with unwrapped trailing\tlines", "\nFirst paragraph\nwith unwrapped\ntrailing\tlines\n\n(Yes, unwrapped!)"); assert_commit_summary("First paragraph with unwrapped trailing\tlines", "\nFirst paragraph\nwith unwrapped\ntrailing\tlines\n\n(Yes, unwrapped!)");
assert_commit_summary("\tLeading \ttabs", "\tLeading\n\ttabs\n\nis preserved"); assert_commit_summary("\tLeading tabs", "\tLeading\n\ttabs\n\nare preserved"); /* tabs around newlines are collapsed down to a single space */
assert_commit_summary(" Leading Spaces", " Leading\n Spaces\n\nare preserved"); assert_commit_summary(" Leading Spaces", " Leading\n Spaces\n\nare preserved"); /* spaces around newlines are collapsed down to a single space */
assert_commit_summary("Trailing tabs\tare removed", "Trailing tabs\tare removed\t\t"); assert_commit_summary("Trailing tabs\tare removed", "Trailing tabs\tare removed\t\t");
assert_commit_summary("Trailing spaces are removed", "Trailing spaces are removed "); assert_commit_summary("Trailing spaces are removed", "Trailing spaces are removed ");
assert_commit_summary("Trailing tabs", "Trailing tabs\t\n\nare removed"); assert_commit_summary("Trailing tabs", "Trailing tabs\t\n\nare removed");
assert_commit_summary("Trailing spaces", "Trailing spaces \n\nare removed"); assert_commit_summary("Trailing spaces", "Trailing spaces \n\nare removed");
assert_commit_summary("Newlines are replaced by spaces", "Newlines\nare\nreplaced by spaces\n");
assert_commit_summary(" Spaces after newlines are collapsed", "\n Spaces after newlines\n are\n collapsed\n "); /* newlines at the very beginning are ignored and not collapsed */
assert_commit_summary(" Spaces before newlines are collapsed", " \nSpaces before newlines \nare \ncollapsed \n");
assert_commit_summary(" Spaces around newlines are collapsed", " \n Spaces around newlines \n are \n collapsed \n ");
assert_commit_summary("", ""); assert_commit_summary("", "");
assert_commit_summary("", " "); assert_commit_summary("", " ");
assert_commit_summary("", "\n"); assert_commit_summary("", "\n");
......
...@@ -8,7 +8,7 @@ static const char *tree_oid = "1810dff58d8a660512d4832e740f692884338ccd"; ...@@ -8,7 +8,7 @@ static const char *tree_oid = "1810dff58d8a660512d4832e740f692884338ccd";
static const char *root_commit_message = "This is a root commit\n\ static const char *root_commit_message = "This is a root commit\n\
This is a root commit and should be the only one in this branch\n"; This is a root commit and should be the only one in this branch\n";
static const char *root_reflog_message = "commit (initial): This is a root commit \ static const char *root_reflog_message = "commit (initial): This is a root commit \
This is a root commit and should be the only one in this branch"; This is a root commit and should be the only one in this branch";
static char *head_old; static char *head_old;
static git_reference *head, *branch; static git_reference *head, *branch;
static git_commit *commit; static git_commit *commit;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment