diff options
-rw-r--r-- | include/git2/commit.h | 11 | ||||
-rw-r--r-- | src/commit.c | 23 | ||||
-rw-r--r-- | src/commit.h | 2 | ||||
-rw-r--r-- | tests-clar/commit/parse.c | 8 |
4 files changed, 37 insertions, 7 deletions
diff --git a/include/git2/commit.h b/include/git2/commit.h index 0eaf917bd..a08cf1c6c 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 ab475a8f8..91b60bbb2 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 22fc898a1..d452e2975 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 c191b3421..41e162440 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); } |