1 #include "clar_libgit2.h"
2 #include "refs.h"
3 #include "repo/repo_helpers.h"
4 
5 static git_repository *repo;
6 static git_reference *branch;
7 
test_refs_branches_ishead__initialize(void)8 void test_refs_branches_ishead__initialize(void)
9 {
10 	repo = cl_git_sandbox_init("testrepo.git");
11 	branch = NULL;
12 }
13 
test_refs_branches_ishead__cleanup(void)14 void test_refs_branches_ishead__cleanup(void)
15 {
16 	git_reference_free(branch);
17 	branch = NULL;
18 
19 	cl_git_sandbox_cleanup();
20 	repo = NULL;
21 }
22 
test_refs_branches_ishead__can_tell_if_a_branch_is_pointed_at_by_HEAD(void)23 void test_refs_branches_ishead__can_tell_if_a_branch_is_pointed_at_by_HEAD(void)
24 {
25 	cl_git_pass(git_reference_lookup(&branch, repo, "refs/heads/master"));
26 
27 	cl_assert_equal_i(true, git_branch_is_head(branch));
28 }
29 
test_refs_branches_ishead__can_properly_handle_unborn_HEAD(void)30 void test_refs_branches_ishead__can_properly_handle_unborn_HEAD(void)
31 {
32 	make_head_unborn(repo, NON_EXISTING_HEAD);
33 
34 	cl_git_pass(git_reference_lookup(&branch, repo, "refs/heads/master"));
35 
36 	cl_assert_equal_i(false, git_branch_is_head(branch));
37 }
38 
test_refs_branches_ishead__can_properly_handle_missing_HEAD(void)39 void test_refs_branches_ishead__can_properly_handle_missing_HEAD(void)
40 {
41 	delete_head(repo);
42 
43 	cl_git_pass(git_reference_lookup(&branch, repo, "refs/heads/master"));
44 
45 	cl_assert_equal_i(false, git_branch_is_head(branch));
46 }
47 
test_refs_branches_ishead__can_tell_if_a_branch_is_not_pointed_at_by_HEAD(void)48 void test_refs_branches_ishead__can_tell_if_a_branch_is_not_pointed_at_by_HEAD(void)
49 {
50 	cl_git_pass(git_reference_lookup(&branch, repo, "refs/heads/br2"));
51 
52 	cl_assert_equal_i(false, git_branch_is_head(branch));
53 }
54 
test_refs_branches_ishead__wont_be_fooled_by_a_non_branch(void)55 void test_refs_branches_ishead__wont_be_fooled_by_a_non_branch(void)
56 {
57 	cl_git_pass(git_reference_lookup(&branch, repo, "refs/tags/e90810b"));
58 
59 	cl_assert_equal_i(false, git_branch_is_head(branch));
60 }
61 
62 /*
63  * $ git init .
64  * Initialized empty Git repository in d:/temp/tempee/.git/
65  *
66  * $ touch a && git add a
67  * $ git commit -m" boom"
68  * [master (root-commit) b47b758]  boom
69  *  0 files changed
70  *  create mode 100644 a
71  *
72  * $ echo "ref: refs/heads/master" > .git/refs/heads/linked
73  * $ echo "ref: refs/heads/linked" > .git/refs/heads/super
74  * $ echo "ref: refs/heads/super" > .git/HEAD
75  *
76  * $ git branch
77  *   linked -> master
78  * * master
79  *   super -> master
80  */
test_refs_branches_ishead__only_direct_references_are_considered(void)81 void test_refs_branches_ishead__only_direct_references_are_considered(void)
82 {
83 	git_reference *linked, *super, *head;
84 
85 	cl_git_pass(git_reference_symbolic_create(&linked, repo, "refs/heads/linked", "refs/heads/master", 0, NULL));
86 	cl_git_pass(git_reference_symbolic_create(&super, repo, "refs/heads/super", "refs/heads/linked", 0, NULL));
87 	cl_git_pass(git_reference_symbolic_create(&head, repo, GIT_HEAD_FILE, "refs/heads/super", 1, NULL));
88 
89 	cl_assert_equal_i(false, git_branch_is_head(linked));
90 	cl_assert_equal_i(false, git_branch_is_head(super));
91 
92 	cl_git_pass(git_repository_head(&branch, repo));
93 	cl_assert_equal_s("refs/heads/master", git_reference_name(branch));
94 
95 	git_reference_free(linked);
96 	git_reference_free(super);
97 	git_reference_free(head);
98 }
99