diff options
author | Richard Ipsum <richardipsum@fastmail.co.uk> | 2017-03-15 11:54:45 +0000 |
---|---|---|
committer | Richard Ipsum <richardipsum@fastmail.co.uk> | 2017-10-07 00:33:23 +0100 |
commit | 7096bf1ef6b5c7c5659ea9d8c66c85bda8ef20db (patch) | |
tree | fcdc597c361623f78e3913b07eb9910ec35c0362 | |
parent | a46e743d0153b9a565614776b9f3a71e0aebff25 (diff) | |
download | libgit2-7096bf1ef6b5c7c5659ea9d8c66c85bda8ef20db.tar.gz |
notes: Add git_note_commit_read
This also adds tests for this function.
-rw-r--r-- | include/git2/notes.h | 19 | ||||
-rw-r--r-- | src/notes.c | 22 | ||||
-rw-r--r-- | tests/notes/notes.c | 40 |
3 files changed, 81 insertions, 0 deletions
diff --git a/include/git2/notes.h b/include/git2/notes.h index 1af43a89b..c6b2d9594 100644 --- a/include/git2/notes.h +++ b/include/git2/notes.h @@ -94,6 +94,25 @@ GIT_EXTERN(int) git_note_read( const char *notes_ref, const git_oid *oid); + +/** + * Read the note for an object from a note commit + * + * The note must be freed manually by the user. + * + * @param out pointer to the read note; NULL in case of error + * @param repo repository where to look up the note + * @param notes_commit a pointer to the notes commit object + * @param oid OID of the git object to read the note from + * + * @return 0 or an error code + */ +GIT_EXTERN(int) git_note_commit_read( + git_note **out, + git_repository *repo, + git_commit *notes_commit, + const git_oid *oid); + /** * Get the note author * diff --git a/src/notes.c b/src/notes.c index 9bace25f4..35ba93d7c 100644 --- a/src/notes.c +++ b/src/notes.c @@ -463,6 +463,28 @@ int git_note_read(git_note **out, git_repository *repo, return error; } +int git_note_commit_read( + git_note **out, + git_repository *repo, + git_commit *notes_commit, + const git_oid *oid) +{ + int error; + git_tree *tree = NULL; + char target[GIT_OID_HEXSZ + 1]; + + git_oid_tostr(target, sizeof(target), oid); + + if ((error = git_commit_tree(&tree, notes_commit)) < 0) + goto cleanup; + + error = note_lookup(out, repo, notes_commit, tree, target); + +cleanup: + git_tree_free(tree); + return error; +} + int git_note_create( git_oid *out, git_repository *repo, diff --git a/tests/notes/notes.c b/tests/notes/notes.c index e6a6d4c62..ebc62fd41 100644 --- a/tests/notes/notes.c +++ b/tests/notes/notes.c @@ -375,6 +375,46 @@ static char *messages[] = { #define MESSAGES_COUNT (sizeof(messages)/sizeof(messages[0])) - 1 +/* Test that we can read a note */ +void test_notes_notes__can_read_a_note(void) +{ + git_oid note_oid, target_oid; + git_note *note; + + create_note(¬e_oid, "refs/notes/i-can-see-dead-notes", "4a202b346bb0fb0db7eff3cffeb3c70babbd2045", "I decorate 4a20\n"); + + cl_git_pass(git_oid_fromstr(&target_oid, "4a202b346bb0fb0db7eff3cffeb3c70babbd2045")); + + cl_git_pass(git_note_read(¬e, _repo, "refs/notes/i-can-see-dead-notes", &target_oid)); + + cl_assert_equal_s(git_note_message(note), "I decorate 4a20\n"); + + git_note_free(note); +} + +/* Test that we can read a note with from commit api */ +void test_notes_notes__can_read_a_note_from_a_commit(void) +{ + git_oid oid, notes_commit_oid; + git_commit *notes_commit; + git_note *note; + + cl_git_pass(git_oid_fromstr(&oid, "4a202b346bb0fb0db7eff3cffeb3c70babbd2045")); + + cl_git_pass(git_note_commit_create(¬es_commit_oid, NULL, _repo, NULL, _sig, _sig, &oid, "I decorate 4a20\n", 1)); + + git_commit_lookup(¬es_commit, _repo, ¬es_commit_oid); + + cl_assert(notes_commit); + + cl_git_pass(git_note_commit_read(¬e, _repo, notes_commit, &oid)); + + cl_assert_equal_s(git_note_message(note), "I decorate 4a20\n"); + + git_commit_free(notes_commit); + git_note_free(note); +} + /* * $ git ls-tree refs/notes/fanout * 040000 tree 4b22b35d44b5a4f589edf3dc89196399771796ea 84 |