]> git.proxmox.com Git - libgit2.git/blob - tests/config/conditionals.c
564719dcbcf7e897e3bea278fad07f7eb629b500
[libgit2.git] / tests / config / conditionals.c
1 #include "clar_libgit2.h"
2 #include "futils.h"
3 #include "repository.h"
4
5 #ifdef GIT_WIN32
6 # define ROOT_PREFIX "C:"
7 #else
8 # define ROOT_PREFIX
9 #endif
10
11 static git_repository *_repo;
12
13 void test_config_conditionals__initialize(void)
14 {
15 _repo = cl_git_sandbox_init("empty_standard_repo");
16 }
17
18 void test_config_conditionals__cleanup(void)
19 {
20 cl_git_sandbox_cleanup();
21 }
22
23 static void assert_condition_includes(const char *keyword, const char *path, bool expected)
24 {
25 git_buf value = GIT_BUF_INIT;
26 git_str buf = GIT_STR_INIT;
27 git_config *cfg;
28
29 cl_git_pass(git_str_printf(&buf, "[includeIf \"%s:%s\"]\n", keyword, path));
30 cl_git_pass(git_str_puts(&buf, "path = other\n"));
31
32 cl_git_mkfile("empty_standard_repo/.git/config", buf.ptr);
33 cl_git_mkfile("empty_standard_repo/.git/other", "[foo]\nbar=baz\n");
34 _repo = cl_git_sandbox_reopen();
35
36 git_str_dispose(&buf);
37
38 cl_git_pass(git_repository_config(&cfg, _repo));
39
40 if (expected) {
41 cl_git_pass(git_config_get_string_buf(&value, cfg, "foo.bar"));
42 cl_assert_equal_s("baz", value.ptr);
43 } else {
44 cl_git_fail_with(GIT_ENOTFOUND,
45 git_config_get_string_buf(&value, cfg, "foo.bar"));
46 }
47
48 git_str_dispose(&buf);
49 git_buf_dispose(&value);
50 git_config_free(cfg);
51 }
52
53 static char *sandbox_path(git_str *buf, const char *suffix)
54 {
55 char *path = p_realpath(clar_sandbox_path(), NULL);
56 cl_assert(path);
57 cl_git_pass(git_str_attach(buf, path, 0));
58 cl_git_pass(git_str_joinpath(buf, buf->ptr, suffix));
59 return buf->ptr;
60 }
61
62 void test_config_conditionals__gitdir(void)
63 {
64 git_str path = GIT_STR_INIT;
65
66 assert_condition_includes("gitdir", ROOT_PREFIX "/", true);
67 assert_condition_includes("gitdir", "empty_stand", false);
68 assert_condition_includes("gitdir", "empty_stand/", false);
69 assert_condition_includes("gitdir", "empty_stand/.git", false);
70 assert_condition_includes("gitdir", "empty_stand/.git/", false);
71 assert_condition_includes("gitdir", "empty_stand*/", true);
72 assert_condition_includes("gitdir", "empty_stand*/.git", true);
73 assert_condition_includes("gitdir", "empty_stand*/.git/", false);
74 assert_condition_includes("gitdir", "empty_standard_repo", false);
75 assert_condition_includes("gitdir", "empty_standard_repo/", true);
76 assert_condition_includes("gitdir", "empty_standard_repo/.git", true);
77 assert_condition_includes("gitdir", "empty_standard_repo/.git/", false);
78
79 assert_condition_includes("gitdir", "./", false);
80
81 assert_condition_includes("gitdir", ROOT_PREFIX "/nonexistent", false);
82 assert_condition_includes("gitdir", ROOT_PREFIX "/empty_standard_repo", false);
83 assert_condition_includes("gitdir", "~/empty_standard_repo", false);
84
85 assert_condition_includes("gitdir", sandbox_path(&path, "/"), true);
86 assert_condition_includes("gitdir", sandbox_path(&path, "/*"), false);
87 assert_condition_includes("gitdir", sandbox_path(&path, "/**"), true);
88
89 assert_condition_includes("gitdir", sandbox_path(&path, "empty_standard_repo"), false);
90 assert_condition_includes("gitdir", sandbox_path(&path, "empty_standard_repo/"), true);
91 assert_condition_includes("gitdir", sandbox_path(&path, "empty_standard_repo/"), true);
92 assert_condition_includes("gitdir", sandbox_path(&path, "Empty_Standard_Repo"), false);
93 assert_condition_includes("gitdir", sandbox_path(&path, "Empty_Standard_Repo/"), false);
94
95 git_str_dispose(&path);
96 }
97
98 void test_config_conditionals__gitdir_i(void)
99 {
100 git_str path = GIT_STR_INIT;
101
102 assert_condition_includes("gitdir/i", sandbox_path(&path, "empty_standard_repo/"), true);
103 assert_condition_includes("gitdir/i", sandbox_path(&path, "EMPTY_STANDARD_REPO/"), true);
104
105 git_str_dispose(&path);
106 }
107
108 void test_config_conditionals__invalid_conditional_fails(void)
109 {
110 assert_condition_includes("foobar", ".git", false);
111 }
112
113 static void set_head(git_repository *repo, const char *name)
114 {
115 cl_git_pass(git_repository_create_head(git_repository_path(repo), name));
116 }
117
118 void test_config_conditionals__onbranch(void)
119 {
120 assert_condition_includes("onbranch", "master", true);
121 assert_condition_includes("onbranch", "m*", true);
122 assert_condition_includes("onbranch", "*", true);
123 assert_condition_includes("onbranch", "master/", false);
124 assert_condition_includes("onbranch", "foo", false);
125
126 set_head(_repo, "foo");
127 assert_condition_includes("onbranch", "master", false);
128 assert_condition_includes("onbranch", "foo", true);
129 assert_condition_includes("onbranch", "f*o", true);
130
131 set_head(_repo, "dir/ref");
132 assert_condition_includes("onbranch", "dir/ref", true);
133 assert_condition_includes("onbranch", "dir/", true);
134 assert_condition_includes("onbranch", "dir/*", true);
135 assert_condition_includes("onbranch", "dir/**", true);
136 assert_condition_includes("onbranch", "**", true);
137 assert_condition_includes("onbranch", "dir", false);
138 assert_condition_includes("onbranch", "dir*", false);
139
140 set_head(_repo, "dir/subdir/ref");
141 assert_condition_includes("onbranch", "dir/subdir/", true);
142 assert_condition_includes("onbranch", "dir/subdir/*", true);
143 assert_condition_includes("onbranch", "dir/subdir/ref", true);
144 assert_condition_includes("onbranch", "dir/", true);
145 assert_condition_includes("onbranch", "dir/**", true);
146 assert_condition_includes("onbranch", "**", true);
147 assert_condition_includes("onbranch", "dir", false);
148 assert_condition_includes("onbranch", "dir*", false);
149 assert_condition_includes("onbranch", "dir/*", false);
150 }
151
152 void test_config_conditionals__empty(void)
153 {
154 git_buf value = GIT_BUF_INIT;
155 git_str buf = GIT_STR_INIT;
156 git_config *cfg;
157
158 cl_git_pass(git_str_puts(&buf, "[includeIf]\n"));
159 cl_git_pass(git_str_puts(&buf, "path = other\n"));
160
161 cl_git_mkfile("empty_standard_repo/.git/config", buf.ptr);
162 cl_git_mkfile("empty_standard_repo/.git/other", "[foo]\nbar=baz\n");
163 _repo = cl_git_sandbox_reopen();
164
165 git_str_dispose(&buf);
166
167 cl_git_pass(git_repository_config(&cfg, _repo));
168
169 cl_git_fail_with(GIT_ENOTFOUND,
170 git_config_get_string_buf(&value, cfg, "foo.bar"));
171
172 git_str_dispose(&buf);
173 git_buf_dispose(&value);
174 git_config_free(cfg);
175 }