]> git.proxmox.com Git - libgit2.git/blob - tests/libgit2/refs/peel.c
New upstream version 1.5.0+ds
[libgit2.git] / tests / libgit2 / refs / peel.c
1 #include "clar_libgit2.h"
2
3 static git_repository *g_repo;
4 static git_repository *g_peel_repo;
5
6 void test_refs_peel__initialize(void)
7 {
8 cl_git_pass(git_repository_open(&g_repo, cl_fixture("testrepo.git")));
9 cl_git_pass(git_repository_open(&g_peel_repo, cl_fixture("peeled.git")));
10 }
11
12 void test_refs_peel__cleanup(void)
13 {
14 git_repository_free(g_repo);
15 g_repo = NULL;
16 git_repository_free(g_peel_repo);
17 g_peel_repo = NULL;
18 }
19
20 static void assert_peel_generic(
21 git_repository *repo,
22 const char *ref_name,
23 git_object_t requested_type,
24 const char* expected_sha,
25 git_object_t expected_type)
26 {
27 git_oid expected_oid;
28 git_reference *ref;
29 git_object *peeled;
30
31 cl_git_pass(git_reference_lookup(&ref, repo, ref_name));
32
33 cl_git_pass(git_reference_peel(&peeled, ref, requested_type));
34
35 cl_git_pass(git_oid_fromstr(&expected_oid, expected_sha));
36 cl_assert_equal_oid(&expected_oid, git_object_id(peeled));
37
38 cl_assert_equal_i(expected_type, git_object_type(peeled));
39
40 git_object_free(peeled);
41 git_reference_free(ref);
42 }
43
44 static void assert_peel(
45 const char *ref_name,
46 git_object_t requested_type,
47 const char* expected_sha,
48 git_object_t expected_type)
49 {
50 assert_peel_generic(g_repo, ref_name, requested_type,
51 expected_sha, expected_type);
52 }
53
54 static void assert_peel_error(int error, const char *ref_name, git_object_t requested_type)
55 {
56 git_reference *ref;
57 git_object *peeled;
58
59 cl_git_pass(git_reference_lookup(&ref, g_repo, ref_name));
60
61 cl_assert_equal_i(error, git_reference_peel(&peeled, ref, requested_type));
62
63 git_reference_free(ref);
64 }
65
66 void test_refs_peel__can_peel_a_tag(void)
67 {
68 assert_peel("refs/tags/test", GIT_OBJECT_TAG,
69 "b25fa35b38051e4ae45d4222e795f9df2e43f1d1", GIT_OBJECT_TAG);
70 assert_peel("refs/tags/test", GIT_OBJECT_COMMIT,
71 "e90810b8df3e80c413d903f631643c716887138d", GIT_OBJECT_COMMIT);
72 assert_peel("refs/tags/test", GIT_OBJECT_TREE,
73 "53fc32d17276939fc79ed05badaef2db09990016", GIT_OBJECT_TREE);
74 assert_peel("refs/tags/point_to_blob", GIT_OBJECT_BLOB,
75 "1385f264afb75a56a5bec74243be9b367ba4ca08", GIT_OBJECT_BLOB);
76 }
77
78 void test_refs_peel__can_peel_a_branch(void)
79 {
80 assert_peel("refs/heads/master", GIT_OBJECT_COMMIT,
81 "a65fedf39aefe402d3bb6e24df4d4f5fe4547750", GIT_OBJECT_COMMIT);
82 assert_peel("refs/heads/master", GIT_OBJECT_TREE,
83 "944c0f6e4dfa41595e6eb3ceecdb14f50fe18162", GIT_OBJECT_TREE);
84 }
85
86 void test_refs_peel__can_peel_a_symbolic_reference(void)
87 {
88 assert_peel("HEAD", GIT_OBJECT_COMMIT,
89 "a65fedf39aefe402d3bb6e24df4d4f5fe4547750", GIT_OBJECT_COMMIT);
90 assert_peel("HEAD", GIT_OBJECT_TREE,
91 "944c0f6e4dfa41595e6eb3ceecdb14f50fe18162", GIT_OBJECT_TREE);
92 }
93
94 void test_refs_peel__cannot_peel_into_a_non_existing_target(void)
95 {
96 assert_peel_error(GIT_EINVALIDSPEC, "refs/tags/point_to_blob", GIT_OBJECT_TAG);
97 }
98
99 void test_refs_peel__can_peel_into_any_non_tag_object(void)
100 {
101 assert_peel("refs/heads/master", GIT_OBJECT_ANY,
102 "a65fedf39aefe402d3bb6e24df4d4f5fe4547750", GIT_OBJECT_COMMIT);
103 assert_peel("refs/tags/point_to_blob", GIT_OBJECT_ANY,
104 "1385f264afb75a56a5bec74243be9b367ba4ca08", GIT_OBJECT_BLOB);
105 assert_peel("refs/tags/test", GIT_OBJECT_ANY,
106 "e90810b8df3e80c413d903f631643c716887138d", GIT_OBJECT_COMMIT);
107 }
108
109 void test_refs_peel__can_peel_fully_peeled_packed_refs(void)
110 {
111 assert_peel_generic(g_peel_repo,
112 "refs/tags/tag-inside-tags", GIT_OBJECT_ANY,
113 "0df1a5865c8abfc09f1f2182e6a31be550e99f07",
114 GIT_OBJECT_COMMIT);
115 assert_peel_generic(g_peel_repo,
116 "refs/foo/tag-outside-tags", GIT_OBJECT_ANY,
117 "0df1a5865c8abfc09f1f2182e6a31be550e99f07",
118 GIT_OBJECT_COMMIT);
119 }
120
121 void test_refs_peel__can_peel_fully_peeled_tag_to_tag(void)
122 {
123 assert_peel_generic(g_peel_repo,
124 "refs/tags/tag-inside-tags", GIT_OBJECT_TAG,
125 "c2596aa0151888587ec5c0187f261e63412d9e11",
126 GIT_OBJECT_TAG);
127 assert_peel_generic(g_peel_repo,
128 "refs/foo/tag-outside-tags", GIT_OBJECT_TAG,
129 "c2596aa0151888587ec5c0187f261e63412d9e11",
130 GIT_OBJECT_TAG);
131 }