Merge branch 'mp/t7060-diff-index-test'
[git] / t / t1502-rev-parse-parseopt.sh
1 #!/bin/sh
2
3 test_description='test git rev-parse --parseopt'
4 . ./test-lib.sh
5
6 test_expect_success 'setup optionspec' '
7         sed -e "s/^|//" >optionspec <<\EOF
8 |some-command [options] <args>...
9 |
10 |some-command does foo and bar!
11 |--
12 |h,help    show the help
13 |
14 |foo       some nifty option --foo
15 |bar=      some cool option --bar with an argument
16 |b,baz     a short and long option
17 |
18 | An option group Header
19 |C?        option C with an optional argument
20 |d,data?   short and long option with an optional argument
21 |
22 | Argument hints
23 |B=arg     short option required argument
24 |bar2=arg  long option required argument
25 |e,fuz=with-space  short and long option required argument
26 |s?some    short option optional argument
27 |long?data long option optional argument
28 |g,fluf?path     short and long option optional argument
29 |longest=very-long-argument-hint  a very long argument hint
30 |pair=key=value  with an equals sign in the hint
31 |short-hint=a    with a one symbol hint
32 |
33 |Extras
34 |extra1    line above used to cause a segfault but no longer does
35 EOF
36 '
37
38 test_expect_success 'test --parseopt help output' '
39         sed -e "s/^|//" >expect <<\END_EXPECT &&
40 |cat <<\EOF
41 |usage: some-command [options] <args>...
42 |
43 |    some-command does foo and bar!
44 |
45 |    -h, --help            show the help
46 |    --foo                 some nifty option --foo
47 |    --bar ...             some cool option --bar with an argument
48 |    -b, --baz             a short and long option
49 |
50 |An option group Header
51 |    -C[...]               option C with an optional argument
52 |    -d, --data[=...]      short and long option with an optional argument
53 |
54 |Argument hints
55 |    -B <arg>              short option required argument
56 |    --bar2 <arg>          long option required argument
57 |    -e, --fuz <with-space>
58 |                          short and long option required argument
59 |    -s[<some>]            short option optional argument
60 |    --long[=<data>]       long option optional argument
61 |    -g, --fluf[=<path>]   short and long option optional argument
62 |    --longest <very-long-argument-hint>
63 |                          a very long argument hint
64 |    --pair <key=value>    with an equals sign in the hint
65 |    --short-hint <a>      with a one symbol hint
66 |
67 |Extras
68 |    --extra1              line above used to cause a segfault but no longer does
69 |
70 |EOF
71 END_EXPECT
72         test_expect_code 129 git rev-parse --parseopt -- -h > output < optionspec &&
73         test_i18ncmp expect output
74 '
75
76 test_expect_success 'setup expect.1' "
77         cat > expect <<EOF
78 set -- --foo --bar 'ham' -b -- 'arg'
79 EOF
80 "
81
82 test_expect_success 'test --parseopt' '
83         git rev-parse --parseopt -- --foo --bar=ham --baz arg < optionspec > output &&
84         test_cmp expect output
85 '
86
87 test_expect_success 'test --parseopt with mixed options and arguments' '
88         git rev-parse --parseopt -- --foo arg --bar=ham --baz < optionspec > output &&
89         test_cmp expect output
90 '
91
92 test_expect_success 'setup expect.2' "
93         cat > expect <<EOF
94 set -- --foo -- 'arg' '--bar=ham'
95 EOF
96 "
97
98 test_expect_success 'test --parseopt with --' '
99         git rev-parse --parseopt -- --foo -- arg --bar=ham < optionspec > output &&
100         test_cmp expect output
101 '
102
103 test_expect_success 'test --parseopt --stop-at-non-option' '
104         git rev-parse --parseopt --stop-at-non-option -- --foo arg --bar=ham < optionspec > output &&
105         test_cmp expect output
106 '
107
108 test_expect_success 'setup expect.3' "
109         cat > expect <<EOF
110 set -- --foo -- '--' 'arg' '--bar=ham'
111 EOF
112 "
113
114 test_expect_success 'test --parseopt --keep-dashdash' '
115         git rev-parse --parseopt --keep-dashdash -- --foo -- arg --bar=ham < optionspec > output &&
116         test_cmp expect output
117 '
118
119 test_expect_success 'setup expect.4' "
120         cat >expect <<EOF
121 set -- --foo -- '--' 'arg' '--spam=ham'
122 EOF
123 "
124
125 test_expect_success 'test --parseopt --keep-dashdash --stop-at-non-option with --' '
126         git rev-parse --parseopt --keep-dashdash --stop-at-non-option -- --foo -- arg --spam=ham <optionspec >output &&
127         test_cmp expect output
128 '
129
130 test_expect_success 'setup expect.5' "
131         cat > expect <<EOF
132 set -- --foo -- 'arg' '--spam=ham'
133 EOF
134 "
135
136 test_expect_success 'test --parseopt --keep-dashdash --stop-at-non-option without --' '
137         git rev-parse --parseopt --keep-dashdash --stop-at-non-option -- --foo arg --spam=ham <optionspec >output &&
138         test_cmp expect output
139 '
140
141 test_expect_success 'setup expect.6' "
142         cat > expect <<EOF
143 set -- --foo --bar='z' --baz -C'Z' --data='A' -- 'arg'
144 EOF
145 "
146
147 test_expect_success 'test --parseopt --stuck-long' '
148         git rev-parse --parseopt --stuck-long -- --foo --bar=z -b arg -CZ -dA <optionspec >output &&
149         test_cmp expect output
150 '
151
152 test_expect_success 'setup expect.7' "
153         cat > expect <<EOF
154 set -- --data='' -C --baz -- 'arg'
155 EOF
156 "
157
158 test_expect_success 'test --parseopt --stuck-long and empty optional argument' '
159         git rev-parse --parseopt --stuck-long -- --data= arg -C -b <optionspec >output &&
160         test_cmp expect output
161 '
162
163 test_expect_success 'setup expect.8' "
164         cat > expect <<EOF
165 set -- --data --baz -- 'arg'
166 EOF
167 "
168
169 test_expect_success 'test --parseopt --stuck-long and long option with unset optional argument' '
170         git rev-parse --parseopt --stuck-long -- --data arg -b <optionspec >output &&
171         test_cmp expect output
172 '
173
174 test_expect_success 'test --parseopt --stuck-long and short option with unset optional argument' '
175         git rev-parse --parseopt --stuck-long -- -d arg -b <optionspec >output &&
176         test_cmp expect output
177 '
178
179 test_done