Merge branch 'cn/config-missing-path' into maint
[git.git] / t / t9902-completion.sh
1 #!/bin/sh
2 #
3 # Copyright (c) 2012 Felipe Contreras
4 #
5
6 test_description='test bash completion'
7
8 . ./lib-bash.sh
9
10 complete ()
11 {
12         # do nothing
13         return 0
14 }
15
16 . "$GIT_BUILD_DIR/contrib/completion/git-completion.bash"
17
18 # We don't need this function to actually join words or do anything special.
19 # Also, it's cleaner to avoid touching bash's internal completion variables.
20 # So let's override it with a minimal version for testing purposes.
21 _get_comp_words_by_ref ()
22 {
23         while [ $# -gt 0 ]; do
24                 case "$1" in
25                 cur)
26                         cur=${_words[_cword]}
27                         ;;
28                 prev)
29                         prev=${_words[_cword-1]}
30                         ;;
31                 words)
32                         words=("${_words[@]}")
33                         ;;
34                 cword)
35                         cword=$_cword
36                         ;;
37                 esac
38                 shift
39         done
40 }
41
42 print_comp ()
43 {
44         local IFS=$'\n'
45         echo "${COMPREPLY[*]}" > out
46 }
47
48 run_completion ()
49 {
50         local -a COMPREPLY _words
51         local _cword
52         _words=( $1 )
53         (( _cword = ${#_words[@]} - 1 ))
54         __git_wrap__git_main && print_comp
55 }
56
57 test_completion ()
58 {
59         test $# -gt 1 && echo "$2" > expected
60         run_completion "$@" &&
61         test_cmp expected out
62 }
63
64 # Like test_completion, but reads expectation from stdin,
65 # which is convenient when it is multiline. We also process "_" into
66 # spaces to make test vectors more readable.
67 test_completion_long ()
68 {
69         tr _ " " >expected &&
70         test_completion "$1"
71 }
72
73 newline=$'\n'
74
75 test_expect_success '__gitcomp - trailing space - options' '
76         sed -e "s/Z$//" >expected <<-\EOF &&
77         --reuse-message=Z
78         --reedit-message=Z
79         --reset-author Z
80         EOF
81         (
82                 local -a COMPREPLY &&
83                 cur="--re" &&
84                 __gitcomp "--dry-run --reuse-message= --reedit-message=
85                                 --reset-author" &&
86                 IFS="$newline" &&
87                 echo "${COMPREPLY[*]}" > out
88         ) &&
89         test_cmp expected out
90 '
91
92 test_expect_success '__gitcomp - trailing space - config keys' '
93         sed -e "s/Z$//" >expected <<-\EOF &&
94         branch.Z
95         branch.autosetupmerge Z
96         branch.autosetuprebase Z
97         browser.Z
98         EOF
99         (
100                 local -a COMPREPLY &&
101                 cur="br" &&
102                 __gitcomp "branch. branch.autosetupmerge
103                                 branch.autosetuprebase browser." &&
104                 IFS="$newline" &&
105                 echo "${COMPREPLY[*]}" > out
106         ) &&
107         test_cmp expected out
108 '
109
110 test_expect_success '__gitcomp - option parameter' '
111         sed -e "s/Z$//" >expected <<-\EOF &&
112         recursive Z
113         resolve Z
114         EOF
115         (
116                 local -a COMPREPLY &&
117                 cur="--strategy=re" &&
118                 __gitcomp "octopus ours recursive resolve subtree
119                         " "" "re" &&
120                 IFS="$newline" &&
121                 echo "${COMPREPLY[*]}" > out
122         ) &&
123         test_cmp expected out
124 '
125
126 test_expect_success '__gitcomp - prefix' '
127         sed -e "s/Z$//" >expected <<-\EOF &&
128         branch.maint.merge Z
129         branch.maint.mergeoptions Z
130         EOF
131         (
132                 local -a COMPREPLY &&
133                 cur="branch.me" &&
134                 __gitcomp "remote merge mergeoptions rebase
135                         " "branch.maint." "me" &&
136                 IFS="$newline" &&
137                 echo "${COMPREPLY[*]}" > out
138         ) &&
139         test_cmp expected out
140 '
141
142 test_expect_success '__gitcomp - suffix' '
143         sed -e "s/Z$//" >expected <<-\EOF &&
144         branch.master.Z
145         branch.maint.Z
146         EOF
147         (
148                 local -a COMPREPLY &&
149                 cur="branch.me" &&
150                 __gitcomp "master maint next pu
151                         " "branch." "ma" "." &&
152                 IFS="$newline" &&
153                 echo "${COMPREPLY[*]}" > out
154         ) &&
155         test_cmp expected out
156 '
157
158 test_expect_success 'basic' '
159         run_completion "git \"\"" &&
160         # built-in
161         grep -q "^add \$" out &&
162         # script
163         grep -q "^filter-branch \$" out &&
164         # plumbing
165         ! grep -q "^ls-files \$" out &&
166
167         run_completion "git f" &&
168         ! grep -q -v "^f" out
169 '
170
171 test_expect_success 'double dash "git" itself' '
172         sed -e "s/Z$//" >expected <<-\EOF &&
173         --paginate Z
174         --no-pager Z
175         --git-dir=
176         --bare Z
177         --version Z
178         --exec-path Z
179         --exec-path=
180         --html-path Z
181         --info-path Z
182         --work-tree=
183         --namespace=
184         --no-replace-objects Z
185         --help Z
186         EOF
187         test_completion "git --"
188 '
189
190 test_expect_success 'double dash "git checkout"' '
191         sed -e "s/Z$//" >expected <<-\EOF &&
192         --quiet Z
193         --ours Z
194         --theirs Z
195         --track Z
196         --no-track Z
197         --merge Z
198         --conflict=
199         --orphan Z
200         --patch Z
201         EOF
202         test_completion "git checkout --"
203 '
204
205 test_expect_success 'general options' '
206         test_completion "git --ver" "--version " &&
207         test_completion "git --hel" "--help " &&
208         sed -e "s/Z$//" >expected <<-\EOF &&
209         --exec-path Z
210         --exec-path=
211         EOF
212         test_completion "git --exe" &&
213         test_completion "git --htm" "--html-path " &&
214         test_completion "git --pag" "--paginate " &&
215         test_completion "git --no-p" "--no-pager " &&
216         test_completion "git --git" "--git-dir=" &&
217         test_completion "git --wor" "--work-tree=" &&
218         test_completion "git --nam" "--namespace=" &&
219         test_completion "git --bar" "--bare " &&
220         test_completion "git --inf" "--info-path " &&
221         test_completion "git --no-r" "--no-replace-objects "
222 '
223
224 test_expect_success 'general options plus command' '
225         test_completion "git --version check" "checkout " &&
226         test_completion "git --paginate check" "checkout " &&
227         test_completion "git --git-dir=foo check" "checkout " &&
228         test_completion "git --bare check" "checkout " &&
229         test_completion "git --help des" "describe " &&
230         test_completion "git --exec-path=foo check" "checkout " &&
231         test_completion "git --html-path check" "checkout " &&
232         test_completion "git --no-pager check" "checkout " &&
233         test_completion "git --work-tree=foo check" "checkout " &&
234         test_completion "git --namespace=foo check" "checkout " &&
235         test_completion "git --paginate check" "checkout " &&
236         test_completion "git --info-path check" "checkout " &&
237         test_completion "git --no-replace-objects check" "checkout "
238 '
239
240 test_expect_success 'setup for ref completion' '
241         echo content >file1 &&
242         echo more >file2 &&
243         git add . &&
244         git commit -m one &&
245         git branch mybranch &&
246         git tag mytag
247 '
248
249 test_expect_success 'checkout completes ref names' '
250         test_completion_long "git checkout m" <<-\EOF
251         master_
252         mybranch_
253         mytag_
254         EOF
255 '
256
257 test_expect_success 'show completes all refs' '
258         test_completion_long "git show m" <<-\EOF
259         master_
260         mybranch_
261         mytag_
262         EOF
263 '
264
265 test_expect_success '<ref>: completes paths' '
266         test_completion_long "git show mytag:f" <<-\EOF
267         file1_
268         file2_
269         EOF
270 '
271
272 test_expect_success 'complete tree filename with spaces' '
273         echo content >"name with spaces" &&
274         git add . &&
275         git commit -m spaces &&
276         test_completion_long "git show HEAD:nam" <<-\EOF
277         name with spaces_
278         EOF
279 '
280
281 test_expect_failure 'complete tree filename with metacharacters' '
282         echo content >"name with \${meta}" &&
283         git add . &&
284         git commit -m meta &&
285         test_completion_long "git show HEAD:nam" <<-\EOF
286         name with ${meta}_
287         name with spaces_
288         EOF
289 '
290
291 test_done