]> git.proxmox.com Git - libgit2.git/blob - tests/online/fetchhead.c
1b66c528e979dd647beee4c5fcc0e3e532095f7b
[libgit2.git] / tests / online / fetchhead.c
1 #include "clar_libgit2.h"
2
3 #include "futils.h"
4 #include "fetchhead.h"
5 #include "../fetchhead/fetchhead_data.h"
6 #include "git2/clone.h"
7
8 #define LIVE_REPO_URL "https://github.com/libgit2/TestGitRepository"
9
10 static git_repository *g_repo;
11 static git_clone_options g_options;
12
13 void test_online_fetchhead__initialize(void)
14 {
15 git_fetch_options dummy_fetch = GIT_FETCH_OPTIONS_INIT;
16 g_repo = NULL;
17
18 memset(&g_options, 0, sizeof(git_clone_options));
19 g_options.version = GIT_CLONE_OPTIONS_VERSION;
20 g_options.fetch_opts = dummy_fetch;
21 }
22
23 void test_online_fetchhead__cleanup(void)
24 {
25 if (g_repo) {
26 git_repository_free(g_repo);
27 g_repo = NULL;
28 }
29
30 cl_fixture_cleanup("./foo");
31 }
32
33 static void fetchhead_test_clone(void)
34 {
35 cl_git_pass(git_clone(&g_repo, LIVE_REPO_URL, "./foo", &g_options));
36 }
37
38 static size_t count_references(void)
39 {
40 git_strarray array;
41 size_t refs;
42
43 cl_git_pass(git_reference_list(&array, g_repo));
44 refs = array.count;
45
46 git_strarray_dispose(&array);
47
48 return refs;
49 }
50
51 static void fetchhead_test_fetch(const char *fetchspec, const char *expected_fetchhead)
52 {
53 git_remote *remote;
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;
57
58 cl_git_pass(git_remote_lookup(&remote, g_repo, "origin"));
59 fetch_opts.download_tags = GIT_REMOTE_DOWNLOAD_TAGS_AUTO;
60
61 if(fetchspec != NULL) {
62 array.count = 1;
63 array.strings = (char **) &fetchspec;
64 active_refs = &array;
65 }
66
67 cl_git_pass(git_remote_fetch(remote, active_refs, &fetch_opts, NULL));
68 git_remote_free(remote);
69
70 cl_git_pass(git_futils_readbuffer(&fetchhead_buf, "./foo/.git/FETCH_HEAD"));
71
72 cl_assert_equal_s(fetchhead_buf.ptr, expected_fetchhead);
73 git_str_dispose(&fetchhead_buf);
74 }
75
76 void test_online_fetchhead__wildcard_spec(void)
77 {
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);
85 }
86
87 void test_online_fetchhead__explicit_spec(void)
88 {
89 fetchhead_test_clone();
90 fetchhead_test_fetch("refs/heads/first-merge:refs/remotes/origin/first-merge", FETCH_HEAD_EXPLICIT_DATA);
91 }
92
93 void test_online_fetchhead__no_merges(void)
94 {
95 git_config *config;
96
97 fetchhead_test_clone();
98
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);
103
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);
112 }
113
114 void test_online_fetchhead__explicit_dst_refspec_creates_branch(void)
115 {
116 git_reference *ref;
117 size_t refs;
118
119 fetchhead_test_clone();
120 refs = count_references();
121 fetchhead_test_fetch("refs/heads/first-merge:refs/heads/explicit-refspec", FETCH_HEAD_EXPLICIT_DATA);
122
123 cl_git_pass(git_branch_lookup(&ref, g_repo, "explicit-refspec", GIT_BRANCH_ALL));
124 cl_assert_equal_i(refs + 1, count_references());
125
126 git_reference_free(ref);
127 }
128
129 void test_online_fetchhead__empty_dst_refspec_creates_no_branch(void)
130 {
131 git_reference *ref;
132 size_t refs;
133
134 fetchhead_test_clone();
135 refs = count_references();
136
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));
139
140 cl_assert_equal_i(refs, count_references());
141 }
142
143 void test_online_fetchhead__colon_only_dst_refspec_creates_no_branch(void)
144 {
145 size_t refs;
146
147 fetchhead_test_clone();
148 refs = count_references();
149 fetchhead_test_fetch("refs/heads/first-merge:", FETCH_HEAD_EXPLICIT_DATA);
150
151 cl_assert_equal_i(refs, count_references());
152 }
153
154 void test_online_fetchhead__creds_get_stripped(void)
155 {
156 git_str buf = GIT_STR_INIT;
157 git_remote *remote;
158
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));
162
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");
166
167 git_remote_free(remote);
168 git_str_dispose(&buf);
169 }