]> git.proxmox.com Git - libgit2.git/blob - tests/repo/head.c
Merge pull request #2044 from libgit2/coverity
[libgit2.git] / tests / repo / head.c
1 #include "clar_libgit2.h"
2 #include "refs.h"
3 #include "repo_helpers.h"
4 #include "posix.h"
5
6 static git_repository *repo;
7
8 void test_repo_head__initialize(void)
9 {
10 repo = cl_git_sandbox_init("testrepo.git");
11 }
12
13 void test_repo_head__cleanup(void)
14 {
15 cl_git_sandbox_cleanup();
16 }
17
18 void test_repo_head__head_detached(void)
19 {
20 git_reference *ref;
21
22 cl_git_pass(git_repository_head_detached(repo));
23
24 cl_git_pass(git_repository_detach_head(repo));
25
26 cl_assert_equal_i(true, git_repository_head_detached(repo));
27
28 /* take the reop back to it's original state */
29 cl_git_pass(git_reference_symbolic_create(&ref, repo, "HEAD", "refs/heads/master", 1, NULL, NULL));
30 git_reference_free(ref);
31
32 cl_assert_equal_i(false, git_repository_head_detached(repo));
33 }
34
35 void test_repo_head__unborn_head(void)
36 {
37 git_reference *ref;
38
39 cl_git_pass(git_repository_head_detached(repo));
40
41 make_head_unborn(repo, NON_EXISTING_HEAD);
42
43 cl_assert(git_repository_head_unborn(repo) == 1);
44
45
46 /* take the repo back to it's original state */
47 cl_git_pass(git_reference_symbolic_create(&ref, repo, "HEAD", "refs/heads/master", 1, NULL, NULL));
48 cl_assert(git_repository_head_unborn(repo) == 0);
49
50 git_reference_free(ref);
51 }
52
53 void test_repo_head__set_head_Attaches_HEAD_to_un_unborn_branch_when_the_branch_doesnt_exist(void)
54 {
55 git_reference *head;
56
57 cl_git_pass(git_repository_set_head(repo, "refs/heads/doesnt/exist/yet"));
58
59 cl_assert_equal_i(false, git_repository_head_detached(repo));
60
61 cl_assert_equal_i(GIT_EUNBORNBRANCH, git_repository_head(&head, repo));
62 }
63
64 void test_repo_head__set_head_Returns_ENOTFOUND_when_the_reference_doesnt_exist(void)
65 {
66 cl_assert_equal_i(GIT_ENOTFOUND, git_repository_set_head(repo, "refs/tags/doesnt/exist/yet"));
67 }
68
69 void test_repo_head__set_head_Fails_when_the_reference_points_to_a_non_commitish(void)
70 {
71 cl_git_fail(git_repository_set_head(repo, "refs/tags/point_to_blob"));
72 }
73
74 void test_repo_head__set_head_Attaches_HEAD_when_the_reference_points_to_a_branch(void)
75 {
76 git_reference *head;
77
78 cl_git_pass(git_repository_set_head(repo, "refs/heads/br2"));
79
80 cl_assert_equal_i(false, git_repository_head_detached(repo));
81
82 cl_git_pass(git_repository_head(&head, repo));
83 cl_assert_equal_s("refs/heads/br2", git_reference_name(head));
84
85 git_reference_free(head);
86 }
87
88 static void assert_head_is_correctly_detached(void)
89 {
90 git_reference *head;
91 git_object *commit;
92
93 cl_assert_equal_i(true, git_repository_head_detached(repo));
94
95 cl_git_pass(git_repository_head(&head, repo));
96
97 cl_git_pass(git_object_lookup(&commit, repo, git_reference_target(head), GIT_OBJ_COMMIT));
98
99 git_object_free(commit);
100 git_reference_free(head);
101 }
102
103 void test_repo_head__set_head_Detaches_HEAD_when_the_reference_doesnt_point_to_a_branch(void)
104 {
105 cl_git_pass(git_repository_set_head(repo, "refs/tags/test"));
106
107 cl_assert_equal_i(true, git_repository_head_detached(repo));
108
109 assert_head_is_correctly_detached();
110 }
111
112 void test_repo_head__set_head_detached_Return_ENOTFOUND_when_the_object_doesnt_exist(void)
113 {
114 git_oid oid;
115
116 cl_git_pass(git_oid_fromstr(&oid, "deadbeefdeadbeefdeadbeefdeadbeefdeadbeef"));
117
118 cl_assert_equal_i(GIT_ENOTFOUND, git_repository_set_head_detached(repo, &oid));
119 }
120
121 void test_repo_head__set_head_detached_Fails_when_the_object_isnt_a_commitish(void)
122 {
123 git_object *blob;
124
125 cl_git_pass(git_revparse_single(&blob, repo, "point_to_blob"));
126
127 cl_git_fail(git_repository_set_head_detached(repo, git_object_id(blob)));
128
129 git_object_free(blob);
130 }
131
132 void test_repo_head__set_head_detached_Detaches_HEAD_and_make_it_point_to_the_peeled_commit(void)
133 {
134 git_object *tag;
135
136 cl_git_pass(git_revparse_single(&tag, repo, "tags/test"));
137 cl_assert_equal_i(GIT_OBJ_TAG, git_object_type(tag));
138
139 cl_git_pass(git_repository_set_head_detached(repo, git_object_id(tag)));
140
141 assert_head_is_correctly_detached();
142
143 git_object_free(tag);
144 }
145
146 void test_repo_head__detach_head_Detaches_HEAD_and_make_it_point_to_the_peeled_commit(void)
147 {
148 cl_assert_equal_i(false, git_repository_head_detached(repo));
149
150 cl_git_pass(git_repository_detach_head(repo));
151
152 assert_head_is_correctly_detached();
153 }
154
155 void test_repo_head__detach_head_Fails_if_HEAD_and_point_to_a_non_commitish(void)
156 {
157 git_reference *head;
158
159 cl_git_pass(git_reference_symbolic_create(&head, repo, GIT_HEAD_FILE, "refs/tags/point_to_blob", 1, NULL, NULL));
160
161 cl_git_fail(git_repository_detach_head(repo));
162
163 git_reference_free(head);
164 }
165
166 void test_repo_head__detaching_an_unborn_branch_returns_GIT_EUNBORNBRANCH(void)
167 {
168 make_head_unborn(repo, NON_EXISTING_HEAD);
169
170 cl_assert_equal_i(GIT_EUNBORNBRANCH, git_repository_detach_head(repo));
171 }
172
173 void test_repo_head__retrieving_an_unborn_branch_returns_GIT_EUNBORNBRANCH(void)
174 {
175 git_reference *head;
176
177 make_head_unborn(repo, NON_EXISTING_HEAD);
178
179 cl_assert_equal_i(GIT_EUNBORNBRANCH, git_repository_head(&head, repo));
180 }
181
182 void test_repo_head__retrieving_a_missing_head_returns_GIT_ENOTFOUND(void)
183 {
184 git_reference *head;
185
186 delete_head(repo);
187
188 cl_assert_equal_i(GIT_ENOTFOUND, git_repository_head(&head, repo));
189 }
190
191 void test_repo_head__can_tell_if_an_unborn_head_is_detached(void)
192 {
193 make_head_unborn(repo, NON_EXISTING_HEAD);
194
195 cl_assert_equal_i(false, git_repository_head_detached(repo));
196 }