summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRichard Ipsum <richardipsum@fastmail.co.uk>2017-03-15 11:54:45 +0000
committerRichard Ipsum <richardipsum@fastmail.co.uk>2017-10-07 00:33:23 +0100
commit7096bf1ef6b5c7c5659ea9d8c66c85bda8ef20db (patch)
treefcdc597c361623f78e3913b07eb9910ec35c0362
parenta46e743d0153b9a565614776b9f3a71e0aebff25 (diff)
downloadlibgit2-7096bf1ef6b5c7c5659ea9d8c66c85bda8ef20db.tar.gz
notes: Add git_note_commit_read
This also adds tests for this function.
-rw-r--r--include/git2/notes.h19
-rw-r--r--src/notes.c22
-rw-r--r--tests/notes/notes.c40
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(&note_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(&note, _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(&notes_commit_oid, NULL, _repo, NULL, _sig, _sig, &oid, "I decorate 4a20\n", 1));
+
+ git_commit_lookup(&notes_commit, _repo, &notes_commit_oid);
+
+ cl_assert(notes_commit);
+
+ cl_git_pass(git_note_commit_read(&note, _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