completion: simplify __gitcomp_1
[git] / t / t9902-completion.sh
1 #!/bin/sh
2 #
3 # Copyright (c) 2012 Felipe Contreras
4 #
5
6 if test -n "$BASH" && test -z "$POSIXLY_CORRECT"; then
7         # we are in full-on bash mode
8         true
9 elif type bash >/dev/null 2>&1; then
10         # execute in full-on bash mode
11         unset POSIXLY_CORRECT
12         exec bash "$0" "$@"
13 else
14         echo '1..0 #SKIP skipping bash completion tests; bash not available'
15         exit 0
16 fi
17
18 test_description='test bash completion'
19
20 . ./test-lib.sh
21
22 complete ()
23 {
24         # do nothing
25         return 0
26 }
27
28 . "$GIT_BUILD_DIR/contrib/completion/git-completion.bash"
29
30 # We don't need this function to actually join words or do anything special.
31 # Also, it's cleaner to avoid touching bash's internal completion variables.
32 # So let's override it with a minimal version for testing purposes.
33 _get_comp_words_by_ref ()
34 {
35         while [ $# -gt 0 ]; do
36                 case "$1" in
37                 cur)
38                         cur=${_words[_cword]}
39                         ;;
40                 prev)
41                         prev=${_words[_cword-1]}
42                         ;;
43                 words)
44                         words=("${_words[@]}")
45                         ;;
46                 cword)
47                         cword=$_cword
48                         ;;
49                 esac
50                 shift
51         done
52 }
53
54 print_comp ()
55 {
56         local IFS=$'\n'
57         echo "${COMPREPLY[*]}" > out
58 }
59
60 run_completion ()
61 {
62         local -a COMPREPLY _words
63         local _cword
64         _words=( $1 )
65         (( _cword = ${#_words[@]} - 1 ))
66         _git && print_comp
67 }
68
69 test_completion ()
70 {
71         test $# -gt 1 && echo "$2" > expected
72         run_completion "$@" &&
73         test_cmp expected out
74 }
75
76 newline=$'\n'
77
78 test_expect_success '__gitcomp - trailing space - options' '
79         sed -e "s/Z$//" >expected <<-\EOF &&
80         --reuse-message=Z
81         --reedit-message=Z
82         --reset-author Z
83         EOF
84         (
85                 local -a COMPREPLY &&
86                 cur="--re" &&
87                 __gitcomp "--dry-run --reuse-message= --reedit-message=
88                                 --reset-author" &&
89                 IFS="$newline" &&
90                 echo "${COMPREPLY[*]}" > out
91         ) &&
92         test_cmp expected out
93 '
94
95 test_expect_success '__gitcomp - trailing space - config keys' '
96         sed -e "s/Z$//" >expected <<-\EOF &&
97         branch.Z
98         branch.autosetupmerge Z
99         branch.autosetuprebase Z
100         browser.Z
101         EOF
102         (
103                 local -a COMPREPLY &&
104                 cur="br" &&
105                 __gitcomp "branch. branch.autosetupmerge
106                                 branch.autosetuprebase browser." &&
107                 IFS="$newline" &&
108                 echo "${COMPREPLY[*]}" > out
109         ) &&
110         test_cmp expected out
111 '
112
113 test_expect_success '__gitcomp - option parameter' '
114         sed -e "s/Z$//" >expected <<-\EOF &&
115         recursive Z
116         resolve Z
117         EOF
118         (
119                 local -a COMPREPLY &&
120                 cur="--strategy=re" &&
121                 __gitcomp "octopus ours recursive resolve subtree
122                         " "" "re" &&
123                 IFS="$newline" &&
124                 echo "${COMPREPLY[*]}" > out
125         ) &&
126         test_cmp expected out
127 '
128
129 test_expect_success '__gitcomp - prefix' '
130         sed -e "s/Z$//" >expected <<-\EOF &&
131         branch.maint.merge Z
132         branch.maint.mergeoptions Z
133         EOF
134         (
135                 local -a COMPREPLY &&
136                 cur="branch.me" &&
137                 __gitcomp "remote merge mergeoptions rebase
138                         " "branch.maint." "me" &&
139                 IFS="$newline" &&
140                 echo "${COMPREPLY[*]}" > out
141         ) &&
142         test_cmp expected out
143 '
144
145 test_expect_success '__gitcomp - suffix' '
146         sed -e "s/Z$//" >expected <<-\EOF &&
147         branch.master.Z
148         branch.maint.Z
149         EOF
150         (
151                 local -a COMPREPLY &&
152                 cur="branch.me" &&
153                 __gitcomp "master maint next pu
154                         " "branch." "ma" "." &&
155                 IFS="$newline" &&
156                 echo "${COMPREPLY[*]}" > out
157         ) &&
158         test_cmp expected out
159 '
160
161 test_expect_success 'basic' '
162         run_completion "git \"\"" &&
163         # built-in
164         grep -q "^add \$" out &&
165         # script
166         grep -q "^filter-branch \$" out &&
167         # plumbing
168         ! grep -q "^ls-files \$" out &&
169
170         run_completion "git f" &&
171         ! grep -q -v "^f" out
172 '
173
174 test_expect_success 'double dash "git" itself' '
175         sed -e "s/Z$//" >expected <<-\EOF &&
176         --paginate Z
177         --no-pager Z
178         --git-dir=
179         --bare Z
180         --version Z
181         --exec-path Z
182         --html-path Z
183         --work-tree=
184         --namespace=
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_done