1 #include "clar_libgit2.h"
3 static git_repository
*_repo
;
4 static git_signature
*_sig
;
6 void test_notes_notes__initialize(void)
8 _repo
= cl_git_sandbox_init("testrepo.git");
9 cl_git_pass(git_signature_now(&_sig
, "alice", "alice@example.com"));
12 void test_notes_notes__cleanup(void)
14 git_signature_free(_sig
);
17 cl_git_sandbox_cleanup();
20 static void assert_note_equal(git_note
*note
, char *message
, git_oid
*note_oid
) {
23 cl_assert_equal_s(git_note_message(note
), message
);
24 cl_assert(!git_oid_cmp(git_note_id(note
), note_oid
));
26 cl_git_pass(git_blob_lookup(&blob
, _repo
, note_oid
));
27 cl_assert_equal_s(git_note_message(note
), (const char *)git_blob_rawcontent(blob
));
32 static void create_note(git_oid
*note_oid
, const char *canonical_namespace
, const char *target_sha
, const char *message
)
36 cl_git_pass(git_oid_fromstr(&oid
, target_sha
));
37 cl_git_pass(git_note_create(note_oid
, _repo
, _sig
, _sig
, canonical_namespace
, &oid
, message
, 0));
42 const char *annotated_object_sha
;
44 list_expectations
[] = {
45 { "1c73b1f51762155d357bcd1fd4f2c409ef80065b", "4a202b346bb0fb0db7eff3cffeb3c70babbd2045" },
46 { "1c73b1f51762155d357bcd1fd4f2c409ef80065b", "9fd738e8f7967c078dceed8190330fc8648ee56a" },
47 { "257b43746b6b46caa4aa788376c647cce0a33e2b", "a65fedf39aefe402d3bb6e24df4d4f5fe4547750" },
48 { "1ec1c8e03f461f4f5d3f3702172483662e7223f3", "c47800c7266a2be04c571c04d5a6614691ea99bd" },
52 #define EXPECTATIONS_COUNT (sizeof(list_expectations)/sizeof(list_expectations[0])) - 1
54 static int note_list_cb(
55 const git_oid
*blob_id
, const git_oid
*annotated_obj_id
, void *payload
)
57 git_oid expected_note_oid
, expected_target_oid
;
59 unsigned int *count
= (unsigned int *)payload
;
61 cl_assert(*count
< EXPECTATIONS_COUNT
);
63 cl_git_pass(git_oid_fromstr(&expected_note_oid
, list_expectations
[*count
].note_sha
));
64 cl_assert(git_oid_cmp(&expected_note_oid
, blob_id
) == 0);
66 cl_git_pass(git_oid_fromstr(&expected_target_oid
, list_expectations
[*count
].annotated_object_sha
));
67 cl_assert(git_oid_cmp(&expected_target_oid
, annotated_obj_id
) == 0);
75 * $ git notes --ref i-can-see-dead-notes add -m "I decorate a65f" a65fedf39aefe402d3bb6e24df4d4f5fe4547750
76 * $ git notes --ref i-can-see-dead-notes add -m "I decorate c478" c47800c7266a2be04c571c04d5a6614691ea99bd
77 * $ git notes --ref i-can-see-dead-notes add -m "I decorate 9fd7 and 4a20" 9fd738e8f7967c078dceed8190330fc8648ee56a
78 * $ git notes --ref i-can-see-dead-notes add -m "I decorate 9fd7 and 4a20" 4a202b346bb0fb0db7eff3cffeb3c70babbd2045
80 * $ git notes --ref i-can-see-dead-notes list
81 * 1c73b1f51762155d357bcd1fd4f2c409ef80065b 4a202b346bb0fb0db7eff3cffeb3c70babbd2045
82 * 1c73b1f51762155d357bcd1fd4f2c409ef80065b 9fd738e8f7967c078dceed8190330fc8648ee56a
83 * 257b43746b6b46caa4aa788376c647cce0a33e2b a65fedf39aefe402d3bb6e24df4d4f5fe4547750
84 * 1ec1c8e03f461f4f5d3f3702172483662e7223f3 c47800c7266a2be04c571c04d5a6614691ea99bd
86 * $ git ls-tree refs/notes/i-can-see-dead-notes
87 * 100644 blob 1c73b1f51762155d357bcd1fd4f2c409ef80065b 4a202b346bb0fb0db7eff3cffeb3c70babbd2045
88 * 100644 blob 1c73b1f51762155d357bcd1fd4f2c409ef80065b 9fd738e8f7967c078dceed8190330fc8648ee56a
89 * 100644 blob 257b43746b6b46caa4aa788376c647cce0a33e2b a65fedf39aefe402d3bb6e24df4d4f5fe4547750
90 * 100644 blob 1ec1c8e03f461f4f5d3f3702172483662e7223f3 c47800c7266a2be04c571c04d5a6614691ea99bd
92 void test_notes_notes__can_retrieve_a_list_of_notes_for_a_given_namespace(void)
94 git_oid note_oid1
, note_oid2
, note_oid3
, note_oid4
;
95 unsigned int retrieved_notes
= 0;
97 create_note(¬e_oid1
, "refs/notes/i-can-see-dead-notes", "a65fedf39aefe402d3bb6e24df4d4f5fe4547750", "I decorate a65f\n");
98 create_note(¬e_oid2
, "refs/notes/i-can-see-dead-notes", "c47800c7266a2be04c571c04d5a6614691ea99bd", "I decorate c478\n");
99 create_note(¬e_oid3
, "refs/notes/i-can-see-dead-notes", "9fd738e8f7967c078dceed8190330fc8648ee56a", "I decorate 9fd7 and 4a20\n");
100 create_note(¬e_oid4
, "refs/notes/i-can-see-dead-notes", "4a202b346bb0fb0db7eff3cffeb3c70babbd2045", "I decorate 9fd7 and 4a20\n");
102 cl_git_pass(git_note_foreach
103 (_repo
, "refs/notes/i-can-see-dead-notes", note_list_cb
, &retrieved_notes
));
105 cl_assert_equal_i(4, retrieved_notes
);
108 static int note_cancel_cb(
109 const git_oid
*blob_id
, const git_oid
*annotated_obj_id
, void *payload
)
111 unsigned int *count
= (unsigned int *)payload
;
114 GIT_UNUSED(annotated_obj_id
);
121 void test_notes_notes__can_cancel_foreach(void)
123 git_oid note_oid1
, note_oid2
, note_oid3
, note_oid4
;
124 unsigned int retrieved_notes
= 0;
126 create_note(¬e_oid1
, "refs/notes/i-can-see-dead-notes", "a65fedf39aefe402d3bb6e24df4d4f5fe4547750", "I decorate a65f\n");
127 create_note(¬e_oid2
, "refs/notes/i-can-see-dead-notes", "c47800c7266a2be04c571c04d5a6614691ea99bd", "I decorate c478\n");
128 create_note(¬e_oid3
, "refs/notes/i-can-see-dead-notes", "9fd738e8f7967c078dceed8190330fc8648ee56a", "I decorate 9fd7 and 4a20\n");
129 create_note(¬e_oid4
, "refs/notes/i-can-see-dead-notes", "4a202b346bb0fb0db7eff3cffeb3c70babbd2045", "I decorate 9fd7 and 4a20\n");
133 git_note_foreach(_repo
, "refs/notes/i-can-see-dead-notes",
134 note_cancel_cb
, &retrieved_notes
));
137 void test_notes_notes__retrieving_a_list_of_notes_for_an_unknown_namespace_returns_ENOTFOUND(void)
140 unsigned int retrieved_notes
= 0;
142 error
= git_note_foreach(_repo
, "refs/notes/i-am-not", note_list_cb
, &retrieved_notes
);
144 cl_assert_equal_i(GIT_ENOTFOUND
, error
);
146 cl_assert_equal_i(0, retrieved_notes
);
149 void test_notes_notes__inserting_a_note_without_passing_a_namespace_uses_the_default_namespace(void)
151 git_oid note_oid
, target_oid
;
152 git_note
*note
, *default_namespace_note
;
153 const char *default_ref
;
155 cl_git_pass(git_oid_fromstr(&target_oid
, "08b041783f40edfe12bb406c9c9a8a040177c125"));
156 cl_git_pass(git_note_default_ref(&default_ref
, _repo
));
158 create_note(¬e_oid
, NULL
, "08b041783f40edfe12bb406c9c9a8a040177c125", "hello world\n");
160 cl_git_pass(git_note_read(¬e
, _repo
, NULL
, &target_oid
));
161 cl_git_pass(git_note_read(&default_namespace_note
, _repo
, default_ref
, &target_oid
));
163 assert_note_equal(note
, "hello world\n", ¬e_oid
);
164 assert_note_equal(default_namespace_note
, "hello world\n", ¬e_oid
);
167 git_note_free(default_namespace_note
);
170 void test_notes_notes__can_insert_a_note_with_a_custom_namespace(void)
172 git_oid note_oid
, target_oid
;
175 cl_git_pass(git_oid_fromstr(&target_oid
, "08b041783f40edfe12bb406c9c9a8a040177c125"));
177 create_note(¬e_oid
, "refs/notes/some/namespace", "08b041783f40edfe12bb406c9c9a8a040177c125", "hello world on a custom namespace\n");
179 cl_git_pass(git_note_read(¬e
, _repo
, "refs/notes/some/namespace", &target_oid
));
181 assert_note_equal(note
, "hello world on a custom namespace\n", ¬e_oid
);
187 * $ git notes --ref fanout list 8496071c1b46c854b31185ea97743be6a8774479
188 * 08b041783f40edfe12bb406c9c9a8a040177c125
190 void test_notes_notes__creating_a_note_on_a_target_which_already_has_one_returns_EEXISTS(void)
193 git_oid note_oid
, target_oid
;
195 cl_git_pass(git_oid_fromstr(&target_oid
, "08b041783f40edfe12bb406c9c9a8a040177c125"));
197 create_note(¬e_oid
, NULL
, "08b041783f40edfe12bb406c9c9a8a040177c125", "hello world\n");
198 error
= git_note_create(¬e_oid
, _repo
, _sig
, _sig
, NULL
, &target_oid
, "hello world\n", 0);
200 cl_assert_equal_i(GIT_EEXISTS
, error
);
202 create_note(¬e_oid
, "refs/notes/some/namespace", "08b041783f40edfe12bb406c9c9a8a040177c125", "hello world\n");
203 error
= git_note_create(¬e_oid
, _repo
, _sig
, _sig
, "refs/notes/some/namespace", &target_oid
, "hello world\n", 0);
205 cl_assert_equal_i(GIT_EEXISTS
, error
);
209 void test_notes_notes__creating_a_note_on_a_target_can_overwrite_existing_note(void)
211 git_oid note_oid
, target_oid
;
212 git_note
*note
, *namespace_note
;
214 cl_git_pass(git_oid_fromstr(&target_oid
, "08b041783f40edfe12bb406c9c9a8a040177c125"));
216 create_note(¬e_oid
, NULL
, "08b041783f40edfe12bb406c9c9a8a040177c125", "hello old world\n");
217 cl_git_pass(git_note_create(¬e_oid
, _repo
, _sig
, _sig
, NULL
, &target_oid
, "hello new world\n", 1));
219 cl_git_pass(git_note_read(¬e
, _repo
, NULL
, &target_oid
));
220 assert_note_equal(note
, "hello new world\n", ¬e_oid
);
222 create_note(¬e_oid
, "refs/notes/some/namespace", "08b041783f40edfe12bb406c9c9a8a040177c125", "hello old world\n");
223 cl_git_pass(git_note_create(¬e_oid
, _repo
, _sig
, _sig
, "refs/notes/some/namespace", &target_oid
, "hello new ref world\n", 1));
225 cl_git_pass(git_note_read(&namespace_note
, _repo
, "refs/notes/some/namespace", &target_oid
));
226 assert_note_equal(namespace_note
, "hello new ref world\n", ¬e_oid
);
229 git_note_free(namespace_note
);
232 static char *messages
[] = {
233 "08c041783f40edfe12bb406c9c9a8a040177c125",
234 "96c45fbe09ab7445fc7c60fd8d17f32494399343",
235 "48cc7e38dcfc1ec87e70ec03e08c3e83d7a16aa1",
236 "24c3eaafb681c3df668f9df96f58e7b8c756eb04",
237 "96ca1b6ccc7858ae94684777f85ac0e7447f7040",
238 "7ac2db4378a08bb244a427c357e0082ee0d57ac6",
239 "e6cba23dbf4ef84fe35e884f017f4e24dc228572",
240 "c8cf3462c7d8feba716deeb2ebe6583bd54589e2",
241 "39c16b9834c2d665ac5f68ad91dc5b933bad8549",
242 "f3c582b1397df6a664224ebbaf9d4cc952706597",
243 "29cec67037fe8e89977474988219016ae7f342a6",
244 "36c4cd238bf8e82e27b740e0741b025f2e8c79ab",
245 "f1c45a47c02e01d5a9a326f1d9f7f756373387f8",
246 "4aca84406f5daee34ab513a60717c8d7b1763ead",
247 "84ce167da452552f63ed8407b55d5ece4901845f",
251 #define MESSAGES_COUNT (sizeof(messages)/sizeof(messages[0])) - 1
254 * $ git ls-tree refs/notes/fanout
255 * 040000 tree 4b22b35d44b5a4f589edf3dc89196399771796ea 84
257 * $ git ls-tree 4b22b35
258 * 040000 tree d71aab4f9b04b45ce09bcaa636a9be6231474759 96
260 * $ git ls-tree d71aab4
261 * 100644 blob 08b041783f40edfe12bb406c9c9a8a040177c125 071c1b46c854b31185ea97743be6a8774479
263 void test_notes_notes__can_insert_a_note_in_an_existing_fanout(void)
266 git_oid note_oid
, target_oid
;
269 cl_git_pass(git_oid_fromstr(&target_oid
, "08b041783f40edfe12bb406c9c9a8a040177c125"));
271 for (i
= 0; i
< MESSAGES_COUNT
; i
++) {
272 cl_git_pass(git_note_create(¬e_oid
, _repo
, _sig
, _sig
, "refs/notes/fanout", &target_oid
, messages
[i
], 0));
273 cl_git_pass(git_note_read(&_note
, _repo
, "refs/notes/fanout", &target_oid
));
274 git_note_free(_note
);
276 git_oid_cpy(&target_oid
, ¬e_oid
);
281 * $ git notes --ref fanout list 8496071c1b46c854b31185ea97743be6a8774479
282 * 08b041783f40edfe12bb406c9c9a8a040177c125
284 void test_notes_notes__can_read_a_note_in_an_existing_fanout(void)
286 git_oid note_oid
, target_oid
;
289 cl_git_pass(git_oid_fromstr(&target_oid
, "8496071c1b46c854b31185ea97743be6a8774479"));
290 cl_git_pass(git_note_read(¬e
, _repo
, "refs/notes/fanout", &target_oid
));
292 cl_git_pass(git_oid_fromstr(¬e_oid
, "08b041783f40edfe12bb406c9c9a8a040177c125"));
293 cl_assert(!git_oid_cmp(git_note_id(note
), ¬e_oid
));
298 void test_notes_notes__can_remove_a_note_in_an_existing_fanout(void)
303 cl_git_pass(git_oid_fromstr(&target_oid
, "8496071c1b46c854b31185ea97743be6a8774479"));
304 cl_git_pass(git_note_remove(_repo
, "refs/notes/fanout", _sig
, _sig
, &target_oid
));
306 cl_git_fail(git_note_read(¬e
, _repo
, "refs/notes/fanout", &target_oid
));
309 void test_notes_notes__removing_a_note_which_doesnt_exists_returns_ENOTFOUND(void)
314 cl_git_pass(git_oid_fromstr(&target_oid
, "8496071c1b46c854b31185ea97743be6a8774479"));
315 cl_git_pass(git_note_remove(_repo
, "refs/notes/fanout", _sig
, _sig
, &target_oid
));
317 error
= git_note_remove(_repo
, "refs/notes/fanout", _sig
, _sig
, &target_oid
);
319 cl_assert_equal_i(GIT_ENOTFOUND
, error
);
322 void test_notes_notes__can_iterate_default_namespace(void)
324 git_note_iterator
*iter
;
326 git_oid note_id
, annotated_id
;
327 git_oid note_created
[2];
328 const char* note_message
[] = {
334 create_note(¬e_created
[0], "refs/notes/commits",
335 "a65fedf39aefe402d3bb6e24df4d4f5fe4547750", note_message
[0]);
336 create_note(¬e_created
[1], "refs/notes/commits",
337 "c47800c7266a2be04c571c04d5a6614691ea99bd", note_message
[1]);
339 cl_git_pass(git_note_iterator_new(&iter
, _repo
, NULL
));
341 for (i
= 0; (err
= git_note_next(¬e_id
, &annotated_id
, iter
)) >= 0; ++i
) {
342 cl_git_pass(git_note_read(¬e
, _repo
, NULL
, &annotated_id
));
343 cl_assert_equal_s(git_note_message(note
), note_message
[i
]);
347 cl_assert_equal_i(GIT_ITEROVER
, err
);
348 cl_assert_equal_i(2, i
);
349 git_note_iterator_free(iter
);
352 void test_notes_notes__can_iterate_custom_namespace(void)
354 git_note_iterator
*iter
;
356 git_oid note_id
, annotated_id
;
357 git_oid note_created
[2];
358 const char* note_message
[] = {
364 create_note(¬e_created
[0], "refs/notes/beer",
365 "a65fedf39aefe402d3bb6e24df4d4f5fe4547750", note_message
[0]);
366 create_note(¬e_created
[1], "refs/notes/beer",
367 "c47800c7266a2be04c571c04d5a6614691ea99bd", note_message
[1]);
369 cl_git_pass(git_note_iterator_new(&iter
, _repo
, "refs/notes/beer"));
371 for (i
= 0; (err
= git_note_next(¬e_id
, &annotated_id
, iter
)) >= 0; ++i
) {
372 cl_git_pass(git_note_read(¬e
, _repo
, "refs/notes/beer", &annotated_id
));
373 cl_assert_equal_s(git_note_message(note
), note_message
[i
]);
377 cl_assert_equal_i(GIT_ITEROVER
, err
);
378 cl_assert_equal_i(2, i
);
379 git_note_iterator_free(iter
);
382 void test_notes_notes__empty_iterate(void)
384 git_note_iterator
*iter
;
386 cl_git_fail(git_note_iterator_new(&iter
, _repo
, "refs/notes/commits"));