Commit 598f069b998c42c12439f3f353b6d075905becba

nulltoken 2013-10-02T12:42:41

commit: Introduce git_commit_message_raw()

diff --git a/include/git2/commit.h b/include/git2/commit.h
index 0eaf917..a08cf1c 100644
--- a/include/git2/commit.h
+++ b/include/git2/commit.h
@@ -100,12 +100,23 @@ GIT_EXTERN(const char *) git_commit_message_encoding(const git_commit *commit);
 /**
  * Get the full message of a commit.
  *
+ * The returned message will be slightly prettified by removing any
+ * potential leading newlines.
+ *
  * @param commit a previously loaded commit.
  * @return the message of a commit
  */
 GIT_EXTERN(const char *) git_commit_message(const git_commit *commit);
 
 /**
+ * Get the full raw message of a commit.
+ *
+ * @param commit a previously loaded commit.
+ * @return the raw message of a commit
+ */
+GIT_EXTERN(const char *) git_commit_message_raw(const git_commit *commit);
+
+/**
  * Get the commit time (i.e. committer time) of a commit.
  *
  * @param commit a previously loaded commit.
diff --git a/src/commit.c b/src/commit.c
index ab475a8..91b60bb 100644
--- a/src/commit.c
+++ b/src/commit.c
@@ -29,7 +29,7 @@ void git_commit__free(void *_commit)
 	git_signature_free(commit->committer);
 
 	git__free(commit->raw_header);
-	git__free(commit->message);
+	git__free(commit->raw_message);
 	git__free(commit->message_encoding);
 
 	git__free(commit);
@@ -240,13 +240,13 @@ int git_commit__parse(void *_commit, git_odb_object *odb_obj)
 	buffer_end = buffer + git_odb_object_size(odb_obj);
 
 	buffer += header_len;
-	while (buffer < buffer_end && *buffer == '\n')
+	if (*buffer == '\n')
 		++buffer;
 
 	/* extract commit message */
 	if (buffer <= buffer_end) {
-		commit->message = git__strndup(buffer, buffer_end - buffer);
-		GITERR_CHECK_ALLOC(commit->message);
+		commit->raw_message = git__strndup(buffer, buffer_end - buffer);
+		GITERR_CHECK_ALLOC(commit->raw_message);
 	}
 
 	return 0;
@@ -265,7 +265,7 @@ bad_buffer:
 
 GIT_COMMIT_GETTER(const git_signature *, author, commit->author)
 GIT_COMMIT_GETTER(const git_signature *, committer, commit->committer)
-GIT_COMMIT_GETTER(const char *, message, commit->message)
+GIT_COMMIT_GETTER(const char *, message_raw, commit->raw_message)
 GIT_COMMIT_GETTER(const char *, message_encoding, commit->message_encoding)
 GIT_COMMIT_GETTER(const char *, raw_header, commit->raw_header)
 GIT_COMMIT_GETTER(git_time_t, time, commit->committer->when.time)
@@ -273,6 +273,19 @@ GIT_COMMIT_GETTER(int, time_offset, commit->committer->when.offset)
 GIT_COMMIT_GETTER(unsigned int, parentcount, (unsigned int)git_array_size(commit->parent_ids))
 GIT_COMMIT_GETTER(const git_oid *, tree_id, &commit->tree_id);
 
+const char *git_commit_message(const git_commit *commit)
+{
+	const char *message = commit->raw_message;
+
+	assert(commit);
+
+	/* trim leading newlines from raw message */
+	while (*message && *message == '\n')
+		++message;
+
+	return message;
+}
+
 int git_commit_tree(git_tree **tree_out, const git_commit *commit)
 {
 	assert(commit);
diff --git a/src/commit.h b/src/commit.h
index 22fc898..d452e29 100644
--- a/src/commit.h
+++ b/src/commit.h
@@ -24,7 +24,7 @@ struct git_commit {
 	git_signature *committer;
 
 	char *message_encoding;
-	char *message;
+	char *raw_message;
 	char *raw_header;
 };
 
diff --git a/tests-clar/commit/parse.c b/tests-clar/commit/parse.c
index c191b34..41e1624 100644
--- a/tests-clar/commit/parse.c
+++ b/tests-clar/commit/parse.c
@@ -382,9 +382,13 @@ committer Vicent Marti <tanoku@gmail.com> 1273848544 +0200\n\
 This commit has a few LF at the start of the commit message";
 	const char *message =
 "This commit has a few LF at the start of the commit message";
-
+	const char *raw_message =
+"\n\
+\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));
+	cl_assert_equal_s(raw_message, git_commit_message_raw(commit));
 	git_commit__free(commit);
 }
 
@@ -400,8 +404,10 @@ committer Vicent Marti <tanoku@gmail.com> 1273848544 +0200\n\
 \n\
 \n";
 	const char *message = "";
+	const char *raw_message = "\n\n";
 
 	cl_git_pass(parse_commit(&commit, buffer));
 	cl_assert_equal_s(message, git_commit_message(commit));
+	cl_assert_equal_s(raw_message, git_commit_message_raw(commit));
 	git_commit__free(commit);
 }