Merge branch 'jk/config-blob-sans-repo'
[git] / t / t1308-config-set.sh
1 #!/bin/sh
2
3 test_description='Test git config-set API in different settings'
4
5 . ./test-lib.sh
6
7 # 'check_config get_* section.key value' verifies that the entry for
8 # section.key is 'value'
9 check_config () {
10         if test "$1" = expect_code
11         then
12                 expect_code="$2" && shift && shift
13         else
14                 expect_code=0
15         fi &&
16         op=$1 key=$2 && shift && shift &&
17         if test $# != 0
18         then
19                 printf "%s\n" "$@"
20         fi >expect &&
21         test_expect_code $expect_code test-tool config "$op" "$key" >actual &&
22         test_cmp expect actual
23 }
24
25 test_expect_success 'setup default config' '
26         cat >.git/config <<-\EOF
27         [case]
28                 penguin = very blue
29                 Movie = BadPhysics
30                 UPPERCASE = true
31                 MixedCase = true
32                 my =
33                 foo
34                 baz = sam
35         [Cores]
36                 WhatEver = Second
37                 baz = bar
38         [cores]
39                 baz = bat
40         [CORES]
41                 baz = ball
42         [my "Foo bAr"]
43                 hi = mixed-case
44         [my "FOO BAR"]
45                 hi = upper-case
46         [my "foo bar"]
47                 hi = lower-case
48         [case]
49                 baz = bat
50                 baz = hask
51         [lamb]
52                 chop = 65
53                 head = none
54         [goat]
55                 legs = 4
56                 head = true
57                 skin = false
58                 nose = 1
59                 horns
60         EOF
61 '
62
63 test_expect_success 'get value for a simple key' '
64         check_config get_value case.penguin "very blue"
65 '
66
67 test_expect_success 'get value for a key with value as an empty string' '
68         check_config get_value case.my ""
69 '
70
71 test_expect_success 'get value for a key with value as NULL' '
72         check_config get_value case.foo "(NULL)"
73 '
74
75 test_expect_success 'upper case key' '
76         check_config get_value case.UPPERCASE "true" &&
77         check_config get_value case.uppercase "true"
78 '
79
80 test_expect_success 'mixed case key' '
81         check_config get_value case.MixedCase "true" &&
82         check_config get_value case.MIXEDCASE "true" &&
83         check_config get_value case.mixedcase "true"
84 '
85
86 test_expect_success 'key and value with mixed case' '
87         check_config get_value case.Movie "BadPhysics"
88 '
89
90 test_expect_success 'key with case sensitive subsection' '
91         check_config get_value "my.Foo bAr.hi" "mixed-case" &&
92         check_config get_value "my.FOO BAR.hi" "upper-case" &&
93         check_config get_value "my.foo bar.hi" "lower-case"
94 '
95
96 test_expect_success 'key with case insensitive section header' '
97         check_config get_value cores.baz "ball" &&
98         check_config get_value Cores.baz "ball" &&
99         check_config get_value CORES.baz "ball" &&
100         check_config get_value coreS.baz "ball"
101 '
102
103 test_expect_success 'key with case insensitive section header & variable' '
104         check_config get_value CORES.BAZ "ball" &&
105         check_config get_value cores.baz "ball" &&
106         check_config get_value cores.BaZ "ball" &&
107         check_config get_value cOreS.bAz "ball"
108 '
109
110 test_expect_success 'find value with misspelled key' '
111         check_config expect_code 1 get_value "my.fOo Bar.hi" "Value not found for \"my.fOo Bar.hi\""
112 '
113
114 test_expect_success 'find value with the highest priority' '
115         check_config get_value case.baz "hask"
116 '
117
118 test_expect_success 'find integer value for a key' '
119         check_config get_int lamb.chop 65
120 '
121
122 test_expect_success 'find string value for a key' '
123         check_config get_string case.baz hask &&
124         check_config expect_code 1 get_string case.ba "Value not found for \"case.ba\""
125 '
126
127 test_expect_success 'check line error when NULL string is queried' '
128         test_expect_code 128 test-tool config get_string case.foo 2>result &&
129         test_i18ngrep "fatal: .*case\.foo.*\.git/config.*line 7" result
130 '
131
132 test_expect_success 'find integer if value is non parse-able' '
133         check_config expect_code 128 get_int lamb.head
134 '
135
136 test_expect_success 'find bool value for the entered key' '
137         check_config get_bool goat.head 1 &&
138         check_config get_bool goat.skin 0 &&
139         check_config get_bool goat.nose 1 &&
140         check_config get_bool goat.horns 1 &&
141         check_config get_bool goat.legs 1
142 '
143
144 test_expect_success 'find multiple values' '
145         check_config get_value_multi case.baz sam bat hask
146 '
147
148 test_expect_success 'find value from a configset' '
149         cat >config2 <<-\EOF &&
150         [case]
151                 baz = lama
152         [my]
153                 new = silk
154         [case]
155                 baz = ball
156         EOF
157         echo silk >expect &&
158         test-tool config configset_get_value my.new config2 .git/config >actual &&
159         test_cmp expect actual
160 '
161
162 test_expect_success 'find value with highest priority from a configset' '
163         echo hask >expect &&
164         test-tool config configset_get_value case.baz config2 .git/config >actual &&
165         test_cmp expect actual
166 '
167
168 test_expect_success 'find value_list for a key from a configset' '
169         cat >except <<-\EOF &&
170         sam
171         bat
172         hask
173         lama
174         ball
175         EOF
176         test-tool config configset_get_value case.baz config2 .git/config >actual &&
177         test_cmp expect actual
178 '
179
180 test_expect_success 'proper error on non-existent files' '
181         echo "Error (-1) reading configuration file non-existent-file." >expect &&
182         test_expect_code 2 test-tool config configset_get_value foo.bar non-existent-file 2>actual &&
183         test_cmp expect actual
184 '
185
186 test_expect_success 'proper error on directory "files"' '
187         echo "Error (-1) reading configuration file a-directory." >expect &&
188         mkdir a-directory &&
189         test_expect_code 2 test-tool config configset_get_value foo.bar a-directory 2>output &&
190         grep "^warning:" output &&
191         grep "^Error" output >actual &&
192         test_cmp expect actual
193 '
194
195 test_expect_success POSIXPERM,SANITY 'proper error on non-accessible files' '
196         chmod -r .git/config &&
197         test_when_finished "chmod +r .git/config" &&
198         echo "Error (-1) reading configuration file .git/config." >expect &&
199         test_expect_code 2 test-tool config configset_get_value foo.bar .git/config 2>output &&
200         grep "^warning:" output &&
201         grep "^Error" output >actual &&
202         test_cmp expect actual
203 '
204
205 test_expect_success 'proper error on error in default config files' '
206         cp .git/config .git/config.old &&
207         test_when_finished "mv .git/config.old .git/config" &&
208         echo "[" >>.git/config &&
209         echo "fatal: bad config line 34 in file .git/config" >expect &&
210         test_expect_code 128 test-tool config get_value foo.bar 2>actual &&
211         test_i18ncmp expect actual
212 '
213
214 test_expect_success 'proper error on error in custom config files' '
215         echo "[" >>syntax-error &&
216         echo "fatal: bad config line 1 in file syntax-error" >expect &&
217         test_expect_code 128 test-tool config configset_get_value foo.bar syntax-error 2>actual &&
218         test_i18ncmp expect actual
219 '
220
221 test_expect_success 'check line errors for malformed values' '
222         mv .git/config .git/config.old &&
223         test_when_finished "mv .git/config.old .git/config" &&
224         cat >.git/config <<-\EOF &&
225         [alias]
226                 br
227         EOF
228         test_expect_code 128 git br 2>result &&
229         test_i18ngrep "missing value for .alias\.br" result &&
230         test_i18ngrep "fatal: .*\.git/config" result &&
231         test_i18ngrep "fatal: .*line 2" result
232 '
233
234 test_expect_success 'error on modifying repo config without repo' '
235         nongit test_must_fail git config a.b c 2>err &&
236         grep "not in a git directory" err
237 '
238
239 cmdline_config="'foo.bar=from-cmdline'"
240 test_expect_success 'iteration shows correct origins' '
241         echo "[foo]bar = from-repo" >.git/config &&
242         echo "[foo]bar = from-home" >.gitconfig &&
243         if test_have_prereq MINGW
244         then
245                 # Use Windows path (i.e. *not* $HOME)
246                 HOME_GITCONFIG=$(pwd)/.gitconfig
247         else
248                 # Do not get fooled by symbolic links, i.e. $HOME != $(pwd)
249                 HOME_GITCONFIG=$HOME/.gitconfig
250         fi &&
251         cat >expect <<-EOF &&
252         key=foo.bar
253         value=from-home
254         origin=file
255         name=$HOME_GITCONFIG
256         scope=global
257
258         key=foo.bar
259         value=from-repo
260         origin=file
261         name=.git/config
262         scope=repo
263
264         key=foo.bar
265         value=from-cmdline
266         origin=command line
267         name=
268         scope=cmdline
269         EOF
270         GIT_CONFIG_PARAMETERS=$cmdline_config test-tool config iterate >actual &&
271         test_cmp expect actual
272 '
273
274 test_done