]> git.proxmox.com Git - libgit2.git/commitdiff
commit: correctly detect the start of the commit message
authorCarlos Martín Nieto <cmn@dwim.me>
Mon, 15 Apr 2013 10:24:08 +0000 (12:24 +0200)
committerCarlos Martín Nieto <cmn@dwim.me>
Mon, 15 Apr 2013 10:24:08 +0000 (12:24 +0200)
The end of the header is signaled by to consecutive LFs and the commit
message starts immediately after. Jumping over LFs at the start of the
message is a bug and leads to creating different commits if
when rebuilding history.

This also fixes an empty commit message being returned as "\n".

src/commit.c
tests-clar/commit/parse.c

index e2d3d346b5f5a0b334d86e8e03273b8e85ac2e71..c7b83ed432bf468126cc4203ab1aa6ca56713893 100644 (file)
@@ -189,8 +189,8 @@ int git_commit__parse_buffer(git_commit *commit, const void *data, size_t len)
                buffer = eoln;
        }
 
-       /* skip blank lines */
-       while (buffer < buffer_end - 1 && *buffer == '\n')
+       /* buffer is now at the end of the header, double-check and move forward into the message */
+       if (buffer < buffer_end && *buffer == '\n')
                buffer++;
 
        /* parse commit message */
index 95c62858856f2849b9ae1a136f472ca84af8ddd5..b99d2799172331d38b4ecff4177254b4804482d3 100644 (file)
@@ -297,7 +297,7 @@ void test_commit_parse__entire_commit(void)
          );
 
                if (!i)
-                       cl_assert_equal_s("\n", git_commit_message(commit));
+                       cl_assert_equal_s("", git_commit_message(commit));
                else
                        cl_assert(git__prefixcmp(
                                git_commit_message(commit), "a simple commit which works") == 0);
@@ -366,3 +366,30 @@ void test_commit_parse__details0(void) {
        }
 }
 
+void test_commit_parse__leading_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\
+This commit has a few LF at the start of the commit message";
+       const char *message =
+"\n\
+\n\
+This commit has a few LF at the start of the commit message";
+
+       commit = (git_commit*)git__malloc(sizeof(git_commit));
+       memset(commit, 0x0, sizeof(git_commit));
+       commit->object.repo = g_repo;
+
+       cl_git_pass(git_commit__parse_buffer(commit, buffer, strlen(buffer)));
+
+       cl_assert_equal_s(message, git_commit_message(commit));
+
+       git_commit__free(commit);
+}