1 #include "clar_libgit2.h"
5 #include "../fetchhead/fetchhead_data.h"
6 #include "git2/clone.h"
8 #define LIVE_REPO_URL "https://github.com/libgit2/TestGitRepository"
10 static git_repository
*g_repo
;
11 static git_clone_options g_options
;
13 void test_online_fetchhead__initialize(void)
15 git_fetch_options dummy_fetch
= GIT_FETCH_OPTIONS_INIT
;
18 memset(&g_options
, 0, sizeof(git_clone_options
));
19 g_options
.version
= GIT_CLONE_OPTIONS_VERSION
;
20 g_options
.fetch_opts
= dummy_fetch
;
23 void test_online_fetchhead__cleanup(void)
26 git_repository_free(g_repo
);
30 cl_fixture_cleanup("./foo");
33 static void fetchhead_test_clone(void)
35 cl_git_pass(git_clone(&g_repo
, LIVE_REPO_URL
, "./foo", &g_options
));
38 static size_t count_references(void)
43 cl_git_pass(git_reference_list(&array
, g_repo
));
46 git_strarray_dispose(&array
);
51 static void fetchhead_test_fetch(const char *fetchspec
, const char *expected_fetchhead
)
54 git_fetch_options fetch_opts
= GIT_FETCH_OPTIONS_INIT
;
55 git_str fetchhead_buf
= GIT_STR_INIT
;
56 git_strarray array
, *active_refs
= NULL
;
58 cl_git_pass(git_remote_lookup(&remote
, g_repo
, "origin"));
59 fetch_opts
.download_tags
= GIT_REMOTE_DOWNLOAD_TAGS_AUTO
;
61 if(fetchspec
!= NULL
) {
63 array
.strings
= (char **) &fetchspec
;
67 cl_git_pass(git_remote_fetch(remote
, active_refs
, &fetch_opts
, NULL
));
68 git_remote_free(remote
);
70 cl_git_pass(git_futils_readbuffer(&fetchhead_buf
, "./foo/.git/FETCH_HEAD"));
72 cl_assert_equal_s(fetchhead_buf
.ptr
, expected_fetchhead
);
73 git_str_dispose(&fetchhead_buf
);
76 void test_online_fetchhead__wildcard_spec(void)
78 fetchhead_test_clone();
79 fetchhead_test_fetch(NULL
, FETCH_HEAD_WILDCARD_DATA2
);
80 cl_git_pass(git_tag_delete(g_repo
, "annotated_tag"));
81 cl_git_pass(git_tag_delete(g_repo
, "blob"));
82 cl_git_pass(git_tag_delete(g_repo
, "commit_tree"));
83 cl_git_pass(git_tag_delete(g_repo
, "nearly-dangling"));
84 fetchhead_test_fetch(NULL
, FETCH_HEAD_WILDCARD_DATA
);
87 void test_online_fetchhead__explicit_spec(void)
89 fetchhead_test_clone();
90 fetchhead_test_fetch("refs/heads/first-merge:refs/remotes/origin/first-merge", FETCH_HEAD_EXPLICIT_DATA
);
93 void test_online_fetchhead__no_merges(void)
97 fetchhead_test_clone();
99 cl_git_pass(git_repository_config(&config
, g_repo
));
100 cl_git_pass(git_config_delete_entry(config
, "branch.master.remote"));
101 cl_git_pass(git_config_delete_entry(config
, "branch.master.merge"));
102 git_config_free(config
);
104 fetchhead_test_fetch(NULL
, FETCH_HEAD_NO_MERGE_DATA2
);
105 cl_git_pass(git_tag_delete(g_repo
, "annotated_tag"));
106 cl_git_pass(git_tag_delete(g_repo
, "blob"));
107 cl_git_pass(git_tag_delete(g_repo
, "commit_tree"));
108 cl_git_pass(git_tag_delete(g_repo
, "nearly-dangling"));
109 fetchhead_test_fetch(NULL
, FETCH_HEAD_NO_MERGE_DATA
);
110 cl_git_pass(git_tag_delete(g_repo
, "commit_tree"));
111 fetchhead_test_fetch(NULL
, FETCH_HEAD_NO_MERGE_DATA3
);
114 void test_online_fetchhead__explicit_dst_refspec_creates_branch(void)
119 fetchhead_test_clone();
120 refs
= count_references();
121 fetchhead_test_fetch("refs/heads/first-merge:refs/heads/explicit-refspec", FETCH_HEAD_EXPLICIT_DATA
);
123 cl_git_pass(git_branch_lookup(&ref
, g_repo
, "explicit-refspec", GIT_BRANCH_ALL
));
124 cl_assert_equal_i(refs
+ 1, count_references());
126 git_reference_free(ref
);
129 void test_online_fetchhead__empty_dst_refspec_creates_no_branch(void)
134 fetchhead_test_clone();
135 refs
= count_references();
137 fetchhead_test_fetch("refs/heads/first-merge", FETCH_HEAD_EXPLICIT_DATA
);
138 cl_git_fail(git_branch_lookup(&ref
, g_repo
, "first-merge", GIT_BRANCH_ALL
));
140 cl_assert_equal_i(refs
, count_references());
143 void test_online_fetchhead__colon_only_dst_refspec_creates_no_branch(void)
147 fetchhead_test_clone();
148 refs
= count_references();
149 fetchhead_test_fetch("refs/heads/first-merge:", FETCH_HEAD_EXPLICIT_DATA
);
151 cl_assert_equal_i(refs
, count_references());
154 void test_online_fetchhead__creds_get_stripped(void)
156 git_str buf
= GIT_STR_INIT
;
159 cl_git_pass(git_repository_init(&g_repo
, "./foo", 0));
160 cl_git_pass(git_remote_create_anonymous(&remote
, g_repo
, "https://foo:bar@github.com/libgit2/TestGitRepository"));
161 cl_git_pass(git_remote_fetch(remote
, NULL
, NULL
, NULL
));
163 cl_git_pass(git_futils_readbuffer(&buf
, "./foo/.git/FETCH_HEAD"));
164 cl_assert_equal_s(buf
.ptr
,
165 "49322bb17d3acc9146f98c97d078513228bbf3c0\t\thttps://github.com/libgit2/TestGitRepository\n");
167 git_remote_free(remote
);
168 git_str_dispose(&buf
);