mirror of
https://git.proxmox.com/git/libgit2
synced 2025-05-29 20:42:23 +00:00
Merge pull request #1883 from libgit2/ntk/fix/empty_first_commit_line
Remove leading newlines from commit message
This commit is contained in:
commit
5b09db15d1
@ -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 @@
|
|||||||
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[] = {
|
|||||||
{"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[] = {
|
|||||||
|
|
||||||
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)
|
|||||||
|
|
||||||
// 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) {
|
|||||||
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\
|
|||||||
\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";
|
||||||
\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\
|
||||||
|
\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));
|
||||||
|
Loading…
Reference in New Issue
Block a user