1 #include "clar_libgit2.h"
5 #include "../fetchhead/fetchhead_data.h"
6 #include "git2/clone.h"
8 #define LIVE_REPO_URL "git://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 int count_references(void)
43 cl_git_pass(git_reference_list(&array
, g_repo
));
46 git_strarray_free(&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_buf fetchhead_buf
= GIT_BUF_INIT
;
57 git_strarray array
, *active_refs
= NULL
;
59 cl_git_pass(git_remote_lookup(&remote
, g_repo
, "origin"));
60 fetch_opts
.download_tags
= GIT_REMOTE_DOWNLOAD_TAGS_AUTO
;
62 if(fetchspec
!= NULL
) {
64 array
.strings
= (char **) &fetchspec
;
68 cl_git_pass(git_remote_fetch(remote
, active_refs
, &fetch_opts
, NULL
));
69 git_remote_free(remote
);
71 cl_git_pass(git_futils_readbuffer(&fetchhead_buf
, "./foo/.git/FETCH_HEAD"));
73 equals
= (strcmp(fetchhead_buf
.ptr
, expected_fetchhead
) == 0);
75 git_buf_dispose(&fetchhead_buf
);
80 void test_online_fetchhead__wildcard_spec(void)
82 fetchhead_test_clone();
83 fetchhead_test_fetch(NULL
, FETCH_HEAD_WILDCARD_DATA2
);
84 cl_git_pass(git_tag_delete(g_repo
, "annotated_tag"));
85 cl_git_pass(git_tag_delete(g_repo
, "blob"));
86 cl_git_pass(git_tag_delete(g_repo
, "commit_tree"));
87 cl_git_pass(git_tag_delete(g_repo
, "nearly-dangling"));
88 fetchhead_test_fetch(NULL
, FETCH_HEAD_WILDCARD_DATA
);
91 void test_online_fetchhead__explicit_spec(void)
93 fetchhead_test_clone();
94 fetchhead_test_fetch("refs/heads/first-merge:refs/remotes/origin/first-merge", FETCH_HEAD_EXPLICIT_DATA
);
97 void test_online_fetchhead__no_merges(void)
101 fetchhead_test_clone();
103 cl_git_pass(git_repository_config(&config
, g_repo
));
104 cl_git_pass(git_config_delete_entry(config
, "branch.master.remote"));
105 cl_git_pass(git_config_delete_entry(config
, "branch.master.merge"));
106 git_config_free(config
);
108 fetchhead_test_fetch(NULL
, FETCH_HEAD_NO_MERGE_DATA2
);
109 cl_git_pass(git_tag_delete(g_repo
, "annotated_tag"));
110 cl_git_pass(git_tag_delete(g_repo
, "blob"));
111 cl_git_pass(git_tag_delete(g_repo
, "commit_tree"));
112 cl_git_pass(git_tag_delete(g_repo
, "nearly-dangling"));
113 fetchhead_test_fetch(NULL
, FETCH_HEAD_NO_MERGE_DATA
);
114 cl_git_pass(git_tag_delete(g_repo
, "commit_tree"));
115 fetchhead_test_fetch(NULL
, FETCH_HEAD_NO_MERGE_DATA3
);
118 void test_online_fetchhead__explicit_dst_refspec_creates_branch(void)
123 fetchhead_test_clone();
124 refs
= count_references();
125 fetchhead_test_fetch("refs/heads/first-merge:refs/heads/explicit-refspec", FETCH_HEAD_EXPLICIT_DATA
);
127 cl_git_pass(git_branch_lookup(&ref
, g_repo
, "explicit-refspec", GIT_BRANCH_ALL
));
128 cl_assert_equal_i(refs
+ 1, count_references());
130 git_reference_free(ref
);
133 void test_online_fetchhead__empty_dst_refspec_creates_no_branch(void)
138 fetchhead_test_clone();
139 refs
= count_references();
141 fetchhead_test_fetch("refs/heads/first-merge", FETCH_HEAD_EXPLICIT_DATA
);
142 cl_git_fail(git_branch_lookup(&ref
, g_repo
, "first-merge", GIT_BRANCH_ALL
));
144 cl_assert_equal_i(refs
, count_references());
147 void test_online_fetchhead__colon_only_dst_refspec_creates_no_branch(void)
151 fetchhead_test_clone();
152 refs
= count_references();
153 fetchhead_test_fetch("refs/heads/first-merge:", FETCH_HEAD_EXPLICIT_DATA
);
155 cl_assert_equal_i(refs
, count_references());