3 test_description
='Test git config-set API in different settings'
5 TEST_PASSES_SANITIZE_LEAK
=true
8 # 'check_config get_* section.key value' verifies that the entry for
9 # section.key is 'value'
11 if test "$1" = expect_code
13 expect_code
="$2" && shift && shift
17 op
=$1 key
=$2 && shift && shift &&
22 test_expect_code
$expect_code test-tool config
"$op" "$key" >actual
&&
23 test_cmp expect actual
26 test_expect_success
'setup default config' '
27 cat >.git/config <<-\EOF
66 test_expect_success
'get value for a simple key' '
67 check_config get_value case.penguin "very blue"
70 test_expect_success
'get value for a key with value as an empty string' '
71 check_config get_value case.my ""
74 test_expect_success
'get value for a key with value as NULL' '
75 check_config get_value case.foo "(NULL)"
78 test_expect_success
'upper case key' '
79 check_config get_value case.UPPERCASE "true" &&
80 check_config get_value case.uppercase "true"
83 test_expect_success
'mixed case key' '
84 check_config get_value case.MixedCase "true" &&
85 check_config get_value case.MIXEDCASE "true" &&
86 check_config get_value case.mixedcase "true"
89 test_expect_success
'key and value with mixed case' '
90 check_config get_value case.Movie "BadPhysics"
93 test_expect_success
'key with case sensitive subsection' '
94 check_config get_value "my.Foo bAr.hi" "mixed-case" &&
95 check_config get_value "my.FOO BAR.hi" "upper-case" &&
96 check_config get_value "my.foo bar.hi" "lower-case"
99 test_expect_success
'key with case insensitive section header' '
100 check_config get_value cores.baz "ball" &&
101 check_config get_value Cores.baz "ball" &&
102 check_config get_value CORES.baz "ball" &&
103 check_config get_value coreS.baz "ball"
106 test_expect_success
'key with case insensitive section header & variable' '
107 check_config get_value CORES.BAZ "ball" &&
108 check_config get_value cores.baz "ball" &&
109 check_config get_value cores.BaZ "ball" &&
110 check_config get_value cOreS.bAz "ball"
113 test_expect_success
'find value with misspelled key' '
114 check_config expect_code 1 get_value "my.fOo Bar.hi" "Value not found for \"my.fOo Bar.hi\""
117 test_expect_success
'find value with the highest priority' '
118 check_config get_value case.baz "hask"
121 test_expect_success
'return value for an existing key' '
122 test-tool config get lamb.chop >out 2>err &&
123 test_must_be_empty out &&
124 test_must_be_empty err
127 test_expect_success
'return value for value-less key' '
128 test-tool config get value.less >out 2>err &&
129 test_must_be_empty out &&
130 test_must_be_empty err
133 test_expect_success
'return value for a missing key' '
134 cat >expect <<-\EOF &&
135 Value not found for "missing.key"
137 test_expect_code 1 test-tool config get missing.key >actual 2>err &&
138 test_cmp actual expect &&
139 test_must_be_empty err
142 test_expect_success
'return value for a bad key: CONFIG_INVALID_KEY' '
143 cat >expect <<-\EOF &&
144 Key "fails.iskeychar.-" is invalid
146 test_expect_code 1 test-tool config get fails.iskeychar.- >actual 2>err &&
147 test_cmp actual expect &&
148 test_must_be_empty out
151 test_expect_success
'return value for a bad key: CONFIG_NO_SECTION_OR_NAME' '
152 cat >expect <<-\EOF &&
153 Key "keynosection" has no section
155 test_expect_code 1 test-tool config get keynosection >actual 2>err &&
156 test_cmp actual expect &&
157 test_must_be_empty out
160 test_expect_success
'find integer value for a key' '
161 check_config get_int lamb.chop 65
164 test_expect_success
'parse integer value during iteration' '
165 check_config git_config_int lamb.chop 65
168 test_expect_success
'find string value for a key' '
169 check_config get_string case.baz hask &&
170 check_config expect_code 1 get_string case.ba "Value not found for \"case.ba\""
173 test_expect_success
'check line error when NULL string is queried' '
174 test_expect_code 128 test-tool config get_string case.foo 2>result &&
175 test_grep "fatal: .*case\.foo.*\.git/config.*line 7" result
178 test_expect_success
'find integer if value is non parse-able' '
179 check_config expect_code 128 get_int lamb.head
182 test_expect_success
'non parse-able integer value during iteration' '
183 check_config expect_code 128 git_config_int lamb.head 2>result &&
184 grep "fatal: bad numeric config value .* in file \.git/config" result
187 test_expect_success
'find bool value for the entered key' '
188 check_config get_bool goat.head 1 &&
189 check_config get_bool goat.skin 0 &&
190 check_config get_bool goat.nose 1 &&
191 check_config get_bool goat.horns 1 &&
192 check_config get_bool goat.legs 1
195 test_expect_success
'find multiple values' '
196 check_config get_value_multi case.baz sam bat hask
199 test_NULL_in_multi
() {
203 test_expect_success
"$op: NULL value in config${file:+ in $file}" '
207 config=.git/config &&
208 test_when_finished "mv $config.old $config" &&
209 mv "$config" "$config".old
212 # Value-less in the middle of a list
213 cat >"$config" <<-\EOF &&
232 test-tool config "$op" a.key $file >actual &&
233 test_cmp expect actual &&
235 # Value-less at the end of a least
236 cat >"$config" <<-\EOF &&
255 test-tool config "$op" a.key $file >actual &&
256 test_cmp expect actual
260 test_NULL_in_multi
"get_value_multi"
261 test_NULL_in_multi
"configset_get_value" "my.config"
262 test_NULL_in_multi
"configset_get_value_multi" "my.config"
264 test_expect_success
'find value from a configset' '
265 cat >config2 <<-\EOF &&
274 test-tool config configset_get_value my.new config2 .git/config >actual &&
275 test_cmp expect actual
278 test_expect_success
'find value with highest priority from a configset' '
280 test-tool config configset_get_value case.baz config2 .git/config >actual &&
281 test_cmp expect actual
284 test_expect_success
'find value_list for a key from a configset' '
285 cat >expect <<-\EOF &&
292 test-tool config configset_get_value_multi case.baz config2 .git/config >actual &&
293 test_cmp expect actual
296 test_expect_success
'proper error on non-existent files' '
297 echo "Error (-1) reading configuration file non-existent-file." >expect &&
298 test_expect_code 2 test-tool config configset_get_value foo.bar non-existent-file 2>actual &&
299 test_cmp expect actual
302 test_expect_success
'proper error on directory "files"' '
303 echo "Error (-1) reading configuration file a-directory." >expect &&
305 test_expect_code 2 test-tool config configset_get_value foo.bar a-directory 2>output &&
306 grep "^warning:" output &&
307 grep "^Error" output >actual &&
308 test_cmp expect actual
311 test_expect_success POSIXPERM
,SANITY
'proper error on non-accessible files' '
312 chmod -r .git/config &&
313 test_when_finished "chmod +r .git/config" &&
314 echo "Error (-1) reading configuration file .git/config." >expect &&
315 test_expect_code 2 test-tool config configset_get_value foo.bar .git/config 2>output &&
316 grep "^warning:" output &&
317 grep "^Error" output >actual &&
318 test_cmp expect actual
321 test_expect_success
'proper error on error in default config files' '
322 cp .git/config .git/config.old &&
323 test_when_finished "mv .git/config.old .git/config" &&
324 echo "[" >>.git/config &&
325 echo "fatal: bad config line 36 in file .git/config" >expect &&
326 test_expect_code 128 test-tool config get_value foo.bar 2>actual &&
327 test_cmp expect actual
330 test_expect_success
'proper error on error in custom config files' '
331 echo "[" >>syntax-error &&
332 echo "fatal: bad config line 1 in file syntax-error" >expect &&
333 test_expect_code 128 test-tool config configset_get_value foo.bar syntax-error 2>actual &&
334 test_cmp expect actual
337 test_expect_success
'check line errors for malformed values' '
338 mv .git/config .git/config.old &&
339 test_when_finished "mv .git/config.old .git/config" &&
340 cat >.git/config <<-\EOF &&
344 test_expect_code 128 git br 2>result &&
345 test_grep "missing value for .alias\.br" result &&
346 test_grep "fatal: .*\.git/config" result &&
347 test_grep "fatal: .*line 2" result
350 test_expect_success
'error on modifying repo config without repo' '
351 nongit test_must_fail git config a.b c 2>err &&
352 test_grep "not in a git directory" err
355 cmdline_config
="'foo.bar=from-cmdline'"
356 test_expect_success
'iteration shows correct origins' '
357 printf "[ignore]\n\tthis = please\n[foo]bar = from-repo\n" >.git/config &&
358 printf "[foo]\n\tbar = from-home\n" >.gitconfig &&
359 if test_have_prereq MINGW
361 # Use Windows path (i.e. *not* $HOME)
362 HOME_GITCONFIG=$(pwd)/.gitconfig
364 # Do not get fooled by symbolic links, i.e. $HOME != $(pwd)
365 HOME_GITCONFIG=$HOME/.gitconfig
367 cat >expect <<-EOF &&
396 GIT_CONFIG_PARAMETERS=$cmdline_config test-tool config iterate >actual &&
397 test_cmp expect actual