Commit 5b09db15 by Vicent Martí

Merge pull request #1883 from libgit2/ntk/fix/empty_first_commit_line

Remove leading newlines from commit message
parents e6a1d9a2 d27a441d
...@@ -240,7 +240,7 @@ int git_commit__parse(void *_commit, git_odb_object *odb_obj) ...@@ -240,7 +240,7 @@ int git_commit__parse(void *_commit, git_odb_object *odb_obj)
buffer_end = buffer + git_odb_object_size(odb_obj); buffer_end = buffer + git_odb_object_size(odb_obj);
buffer += header_len; buffer += header_len;
if (*buffer == '\n') while (buffer < buffer_end && *buffer == '\n')
++buffer; ++buffer;
/* extract commit message */ /* extract commit message */
......
...@@ -7,77 +7,77 @@ ...@@ -7,77 +7,77 @@
static git_repository *g_repo; static git_repository *g_repo;
void test_commit_parse__initialize(void) void test_commit_parse__initialize(void)
{ {
g_repo = cl_git_sandbox_init("testrepo"); g_repo = cl_git_sandbox_init("testrepo");
} }
void test_commit_parse__cleanup(void) void test_commit_parse__cleanup(void)
{ {
cl_git_sandbox_cleanup(); cl_git_sandbox_cleanup();
} }
// Header parsing // Header parsing
typedef struct { typedef struct {
const char *line; const char *line;
const char *header; const char *header;
} parse_test_case; } parse_test_case;
static parse_test_case passing_header_cases[] = { static parse_test_case passing_header_cases[] = {
{ "parent 05452d6349abcd67aa396dfb28660d765d8b2a36\n", "parent " }, { "parent 05452d6349abcd67aa396dfb28660d765d8b2a36\n", "parent " },
{ "tree 05452d6349abcd67aa396dfb28660d765d8b2a36\n", "tree " }, { "tree 05452d6349abcd67aa396dfb28660d765d8b2a36\n", "tree " },
{ "random_heading 05452d6349abcd67aa396dfb28660d765d8b2a36\n", "random_heading " }, { "random_heading 05452d6349abcd67aa396dfb28660d765d8b2a36\n", "random_heading " },
{ "stuck_heading05452d6349abcd67aa396dfb28660d765d8b2a36\n", "stuck_heading" }, { "stuck_heading05452d6349abcd67aa396dfb28660d765d8b2a36\n", "stuck_heading" },
{ "tree 5F4BEFFC0759261D015AA63A3A85613FF2F235DE\n", "tree " }, { "tree 5F4BEFFC0759261D015AA63A3A85613FF2F235DE\n", "tree " },
{ "tree 1A669B8AB81B5EB7D9DB69562D34952A38A9B504\n", "tree " }, { "tree 1A669B8AB81B5EB7D9DB69562D34952A38A9B504\n", "tree " },
{ "tree 5B20DCC6110FCC75D31C6CEDEBD7F43ECA65B503\n", "tree " }, { "tree 5B20DCC6110FCC75D31C6CEDEBD7F43ECA65B503\n", "tree " },
{ "tree 173E7BF00EA5C33447E99E6C1255954A13026BE4\n", "tree " }, { "tree 173E7BF00EA5C33447E99E6C1255954A13026BE4\n", "tree " },
{ NULL, NULL } { NULL, NULL }
}; };
static parse_test_case failing_header_cases[] = { static parse_test_case failing_header_cases[] = {
{ "parent 05452d6349abcd67aa396dfb28660d765d8b2a36", "parent " }, { "parent 05452d6349abcd67aa396dfb28660d765d8b2a36", "parent " },
{ "05452d6349abcd67aa396dfb28660d765d8b2a36\n", "tree " }, { "05452d6349abcd67aa396dfb28660d765d8b2a36\n", "tree " },
{ "parent05452d6349abcd67aa396dfb28660d765d8b2a6a\n", "parent " }, { "parent05452d6349abcd67aa396dfb28660d765d8b2a6a\n", "parent " },
{ "parent 05452d6349abcd67aa396dfb280d765d8b2a6\n", "parent " }, { "parent 05452d6349abcd67aa396dfb280d765d8b2a6\n", "parent " },
{ "tree 05452d6349abcd67aa396dfb28660d765d8b2a36\n", "tree " }, { "tree 05452d6349abcd67aa396dfb28660d765d8b2a36\n", "tree " },
{ "parent 0545xd6349abcd67aa396dfb28660d765d8b2a36\n", "parent " }, { "parent 0545xd6349abcd67aa396dfb28660d765d8b2a36\n", "parent " },
{ "parent 0545xd6349abcd67aa396dfb28660d765d8b2a36FF\n", "parent " }, { "parent 0545xd6349abcd67aa396dfb28660d765d8b2a36FF\n", "parent " },
{ "", "tree " }, { "", "tree " },
{ "", "" }, { "", "" },
{ NULL, NULL } { NULL, NULL }
}; };
void test_commit_parse__header(void) void test_commit_parse__header(void)
{ {
git_oid oid; git_oid oid;
parse_test_case *testcase; parse_test_case *testcase;
for (testcase = passing_header_cases; testcase->line != NULL; testcase++) for (testcase = passing_header_cases; testcase->line != NULL; testcase++)
{ {
const char *line = testcase->line; const char *line = testcase->line;
const char *line_end = line + strlen(line); const char *line_end = line + strlen(line);
cl_git_pass(git_oid__parse(&oid, &line, line_end, testcase->header)); cl_git_pass(git_oid__parse(&oid, &line, line_end, testcase->header));
cl_assert(line == line_end); cl_assert(line == line_end);
} }
for (testcase = failing_header_cases; testcase->line != NULL; testcase++) for (testcase = failing_header_cases; testcase->line != NULL; testcase++)
{ {
const char *line = testcase->line; const char *line = testcase->line;
const char *line_end = line + strlen(line); const char *line_end = line + strlen(line);
cl_git_fail(git_oid__parse(&oid, &line, line_end, testcase->header)); cl_git_fail(git_oid__parse(&oid, &line, line_end, testcase->header));
} }
} }
// Signature parsing // Signature parsing
typedef struct { typedef struct {
const char *string; const char *string;
const char *header; const char *header;
const char *name; const char *name;
const char *email; const char *email;
git_time_t time; git_time_t time;
int offset; int offset;
} passing_signature_test_case; } passing_signature_test_case;
passing_signature_test_case passing_signature_cases[] = { passing_signature_test_case passing_signature_cases[] = {
...@@ -122,12 +122,12 @@ passing_signature_test_case passing_signature_cases[] = { ...@@ -122,12 +122,12 @@ passing_signature_test_case passing_signature_cases[] = {
{"author Vicent Marti <tanoku@gmail.com> 4294967296 \n", "author ", "Vicent Marti", "tanoku@gmail.com", 4294967296, 0}, {"author Vicent Marti <tanoku@gmail.com> 4294967296 \n", "author ", "Vicent Marti", "tanoku@gmail.com", 4294967296, 0},
{"author Vicent Marti <tanoku@gmail.com> 8589934592 \n", "author ", "Vicent Marti", "tanoku@gmail.com", 8589934592, 0}, {"author Vicent Marti <tanoku@gmail.com> 8589934592 \n", "author ", "Vicent Marti", "tanoku@gmail.com", 8589934592, 0},
{NULL,NULL,NULL,NULL,0,0} {NULL,NULL,NULL,NULL,0,0}
}; };
typedef struct { typedef struct {
const char *string; const char *string;
const char *header; const char *header;
} failing_signature_test_case; } failing_signature_test_case;
failing_signature_test_case failing_signature_cases[] = { failing_signature_test_case failing_signature_cases[] = {
...@@ -143,31 +143,31 @@ failing_signature_test_case failing_signature_cases[] = { ...@@ -143,31 +143,31 @@ failing_signature_test_case failing_signature_cases[] = {
void test_commit_parse__signature(void) void test_commit_parse__signature(void)
{ {
passing_signature_test_case *passcase; passing_signature_test_case *passcase;
failing_signature_test_case *failcase; failing_signature_test_case *failcase;
for (passcase = passing_signature_cases; passcase->string != NULL; passcase++) for (passcase = passing_signature_cases; passcase->string != NULL; passcase++)
{ {
const char *str = passcase->string; const char *str = passcase->string;
size_t len = strlen(passcase->string); size_t len = strlen(passcase->string);
struct git_signature person = {0}; struct git_signature person = {0};
cl_git_pass(git_signature__parse(&person, &str, str + len, passcase->header, '\n')); cl_git_pass(git_signature__parse(&person, &str, str + len, passcase->header, '\n'));
cl_assert_equal_s(passcase->name, person.name); cl_assert_equal_s(passcase->name, person.name);
cl_assert_equal_s(passcase->email, person.email); cl_assert_equal_s(passcase->email, person.email);
cl_assert_equal_i((int)passcase->time, (int)person.when.time); cl_assert_equal_i((int)passcase->time, (int)person.when.time);
cl_assert_equal_i(passcase->offset, person.when.offset); cl_assert_equal_i(passcase->offset, person.when.offset);
git__free(person.name); git__free(person.email); git__free(person.name); git__free(person.email);
} }
for (failcase = failing_signature_cases; failcase->string != NULL; failcase++) for (failcase = failing_signature_cases; failcase->string != NULL; failcase++)
{ {
const char *str = failcase->string; const char *str = failcase->string;
size_t len = strlen(failcase->string); size_t len = strlen(failcase->string);
git_signature person = {0}; git_signature person = {0};
cl_git_fail(git_signature__parse(&person, &str, str + len, failcase->header, '\n')); cl_git_fail(git_signature__parse(&person, &str, str + len, failcase->header, '\n'));
git__free(person.name); git__free(person.email); git__free(person.name); git__free(person.email);
} }
} }
...@@ -312,17 +312,17 @@ void test_commit_parse__entire_commit(void) ...@@ -312,17 +312,17 @@ void test_commit_parse__entire_commit(void)
// query the details on a parsed commit // query the details on a parsed commit
void test_commit_parse__details0(void) { void test_commit_parse__details0(void) {
static const char *commit_ids[] = { static const char *commit_ids[] = {
"a4a7dce85cf63874e984719f4fdd239f5145052f", /* 0 */ "a4a7dce85cf63874e984719f4fdd239f5145052f", /* 0 */
"9fd738e8f7967c078dceed8190330fc8648ee56a", /* 1 */ "9fd738e8f7967c078dceed8190330fc8648ee56a", /* 1 */
"4a202b346bb0fb0db7eff3cffeb3c70babbd2045", /* 2 */ "4a202b346bb0fb0db7eff3cffeb3c70babbd2045", /* 2 */
"c47800c7266a2be04c571c04d5a6614691ea99bd", /* 3 */ "c47800c7266a2be04c571c04d5a6614691ea99bd", /* 3 */
"8496071c1b46c854b31185ea97743be6a8774479", /* 4 */ "8496071c1b46c854b31185ea97743be6a8774479", /* 4 */
"5b5b025afb0b4c913b4c338a42934a3863bf3644", /* 5 */ "5b5b025afb0b4c913b4c338a42934a3863bf3644", /* 5 */
"a65fedf39aefe402d3bb6e24df4d4f5fe4547750", /* 6 */ "a65fedf39aefe402d3bb6e24df4d4f5fe4547750", /* 6 */
}; };
const size_t commit_count = sizeof(commit_ids) / sizeof(const char *); const size_t commit_count = sizeof(commit_ids) / sizeof(const char *);
unsigned int i; unsigned int i;
for (i = 0; i < commit_count; ++i) { for (i = 0; i < commit_count; ++i) {
git_oid id; git_oid id;
...@@ -349,7 +349,6 @@ void test_commit_parse__details0(void) { ...@@ -349,7 +349,6 @@ void test_commit_parse__details0(void) {
cl_assert_equal_s("Scott Chacon", committer->name); cl_assert_equal_s("Scott Chacon", committer->name);
cl_assert_equal_s("schacon@gmail.com", committer->email); cl_assert_equal_s("schacon@gmail.com", committer->email);
cl_assert(message != NULL); cl_assert(message != NULL);
cl_assert(strchr(message, '\n') != NULL);
cl_assert(commit_time > 0); cl_assert(commit_time > 0);
cl_assert(parents <= 2); cl_assert(parents <= 2);
for (p = 0;p < parents;p++) { for (p = 0;p < parents;p++) {
...@@ -382,9 +381,25 @@ committer Vicent Marti <tanoku@gmail.com> 1273848544 +0200\n\ ...@@ -382,9 +381,25 @@ committer Vicent Marti <tanoku@gmail.com> 1273848544 +0200\n\
\n\ \n\
This commit has a few LF at the start of the commit message"; This commit has a few LF at the start of the commit message";
const char *message = const char *message =
"\n\ "This commit has a few LF at the start of the commit message";
cl_git_pass(parse_commit(&commit, buffer));
cl_assert_equal_s(message, git_commit_message(commit));
git_commit__free(commit);
}
void test_commit_parse__only_lf(void)
{
git_commit *commit;
const char *buffer =
"tree 1810dff58d8a660512d4832e740f692884338ccd\n\
parent e90810b8df3e80c413d903f631643c716887138d\n\
author Vicent Marti <tanoku@gmail.com> 1273848544 +0200\n\
committer Vicent Marti <tanoku@gmail.com> 1273848544 +0200\n\
\n\ \n\
This commit has a few LF at the start of the commit message"; \n\
\n";
const char *message = "";
cl_git_pass(parse_commit(&commit, buffer)); cl_git_pass(parse_commit(&commit, buffer));
cl_assert_equal_s(message, git_commit_message(commit)); cl_assert_equal_s(message, git_commit_message(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