t / t1502-rev-parse-parseopt.shon commit fsck: avoid looking at NULL blob->object (47cc913)
   1#!/bin/sh
   2
   3test_description='test git rev-parse --parseopt'
   4. ./test-lib.sh
   5
   6test_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|aswitch help te=t contains? fl*g characters!`
  32|bswitch=hint    hint has trailing tab character
  33|cswitch         switch has trailing tab character
  34|short-hint=a    with a one symbol hint
  35|
  36|Extras
  37|extra1    line above used to cause a segfault but no longer does
  38EOF
  39'
  40
  41test_expect_success 'setup optionspec-no-switches' '
  42        sed -e "s/^|//" >optionspec_no_switches <<\EOF
  43|some-command [options] <args>...
  44|
  45|some-command does foo and bar!
  46|--
  47EOF
  48'
  49
  50test_expect_success 'setup optionspec-only-hidden-switches' '
  51        sed -e "s/^|//" >optionspec_only_hidden_switches <<\EOF
  52|some-command [options] <args>...
  53|
  54|some-command does foo and bar!
  55|--
  56|hidden1* A hidden switch
  57EOF
  58'
  59
  60test_expect_success 'test --parseopt help output' '
  61        sed -e "s/^|//" >expect <<\END_EXPECT &&
  62|cat <<\EOF
  63|usage: some-command [options] <args>...
  64|
  65|    some-command does foo and bar!
  66|
  67|    -h, --help            show the help
  68|    --foo                 some nifty option --foo
  69|    --bar ...             some cool option --bar with an argument
  70|    -b, --baz             a short and long option
  71|
  72|An option group Header
  73|    -C[...]               option C with an optional argument
  74|    -d, --data[=...]      short and long option with an optional argument
  75|
  76|Argument hints
  77|    -B <arg>              short option required argument
  78|    --bar2 <arg>          long option required argument
  79|    -e, --fuz <with-space>
  80|                          short and long option required argument
  81|    -s[<some>]            short option optional argument
  82|    --long[=<data>]       long option optional argument
  83|    -g, --fluf[=<path>]   short and long option optional argument
  84|    --longest <very-long-argument-hint>
  85|                          a very long argument hint
  86|    --pair <key=value>    with an equals sign in the hint
  87|    --aswitch             help te=t contains? fl*g characters!`
  88|    --bswitch <hint>      hint has trailing tab character
  89|    --cswitch             switch has trailing tab character
  90|    --short-hint <a>      with a one symbol hint
  91|
  92|Extras
  93|    --extra1              line above used to cause a segfault but no longer does
  94|
  95|EOF
  96END_EXPECT
  97        test_expect_code 129 git rev-parse --parseopt -- -h > output < optionspec &&
  98        test_i18ncmp expect output
  99'
 100
 101test_expect_success 'test --parseopt help output no switches' '
 102        sed -e "s/^|//" >expect <<\END_EXPECT &&
 103|cat <<\EOF
 104|usage: some-command [options] <args>...
 105|
 106|    some-command does foo and bar!
 107|
 108|EOF
 109END_EXPECT
 110        test_expect_code 129 git rev-parse --parseopt -- -h > output < optionspec_no_switches &&
 111        test_i18ncmp expect output
 112'
 113
 114test_expect_success 'test --parseopt help output hidden switches' '
 115        sed -e "s/^|//" >expect <<\END_EXPECT &&
 116|cat <<\EOF
 117|usage: some-command [options] <args>...
 118|
 119|    some-command does foo and bar!
 120|
 121|EOF
 122END_EXPECT
 123        test_expect_code 129 git rev-parse --parseopt -- -h > output < optionspec_only_hidden_switches &&
 124        test_i18ncmp expect output
 125'
 126
 127test_expect_success 'test --parseopt help-all output hidden switches' '
 128        sed -e "s/^|//" >expect <<\END_EXPECT &&
 129|cat <<\EOF
 130|usage: some-command [options] <args>...
 131|
 132|    some-command does foo and bar!
 133|
 134|    --hidden1             A hidden switch
 135|
 136|EOF
 137END_EXPECT
 138        test_expect_code 129 git rev-parse --parseopt -- --help-all > output < optionspec_only_hidden_switches &&
 139        test_i18ncmp expect output
 140'
 141
 142test_expect_success 'test --parseopt invalid switch help output' '
 143        sed -e "s/^|//" >expect <<\END_EXPECT &&
 144|error: unknown option `does-not-exist'\''
 145|usage: some-command [options] <args>...
 146|
 147|    some-command does foo and bar!
 148|
 149|    -h, --help            show the help
 150|    --foo                 some nifty option --foo
 151|    --bar ...             some cool option --bar with an argument
 152|    -b, --baz             a short and long option
 153|
 154|An option group Header
 155|    -C[...]               option C with an optional argument
 156|    -d, --data[=...]      short and long option with an optional argument
 157|
 158|Argument hints
 159|    -B <arg>              short option required argument
 160|    --bar2 <arg>          long option required argument
 161|    -e, --fuz <with-space>
 162|                          short and long option required argument
 163|    -s[<some>]            short option optional argument
 164|    --long[=<data>]       long option optional argument
 165|    -g, --fluf[=<path>]   short and long option optional argument
 166|    --longest <very-long-argument-hint>
 167|                          a very long argument hint
 168|    --pair <key=value>    with an equals sign in the hint
 169|    --aswitch             help te=t contains? fl*g characters!`
 170|    --bswitch <hint>      hint has trailing tab character
 171|    --cswitch             switch has trailing tab character
 172|    --short-hint <a>      with a one symbol hint
 173|
 174|Extras
 175|    --extra1              line above used to cause a segfault but no longer does
 176|
 177END_EXPECT
 178        test_expect_code 129 git rev-parse --parseopt -- --does-not-exist 1>/dev/null 2>output < optionspec &&
 179        test_i18ncmp expect output
 180'
 181
 182test_expect_success 'setup expect.1' "
 183        cat > expect <<EOF
 184set -- --foo --bar 'ham' -b --aswitch -- 'arg'
 185EOF
 186"
 187
 188test_expect_success 'test --parseopt' '
 189        git rev-parse --parseopt -- --foo --bar=ham --baz --aswitch arg < optionspec > output &&
 190        test_cmp expect output
 191'
 192
 193test_expect_success 'test --parseopt with mixed options and arguments' '
 194        git rev-parse --parseopt -- --foo arg --bar=ham --baz --aswitch < optionspec > output &&
 195        test_cmp expect output
 196'
 197
 198test_expect_success 'setup expect.2' "
 199        cat > expect <<EOF
 200set -- --foo -- 'arg' '--bar=ham'
 201EOF
 202"
 203
 204test_expect_success 'test --parseopt with --' '
 205        git rev-parse --parseopt -- --foo -- arg --bar=ham < optionspec > output &&
 206        test_cmp expect output
 207'
 208
 209test_expect_success 'test --parseopt --stop-at-non-option' '
 210        git rev-parse --parseopt --stop-at-non-option -- --foo arg --bar=ham < optionspec > output &&
 211        test_cmp expect output
 212'
 213
 214test_expect_success 'setup expect.3' "
 215        cat > expect <<EOF
 216set -- --foo -- '--' 'arg' '--bar=ham'
 217EOF
 218"
 219
 220test_expect_success 'test --parseopt --keep-dashdash' '
 221        git rev-parse --parseopt --keep-dashdash -- --foo -- arg --bar=ham < optionspec > output &&
 222        test_cmp expect output
 223'
 224
 225test_expect_success 'setup expect.4' "
 226        cat >expect <<EOF
 227set -- --foo -- '--' 'arg' '--spam=ham'
 228EOF
 229"
 230
 231test_expect_success 'test --parseopt --keep-dashdash --stop-at-non-option with --' '
 232        git rev-parse --parseopt --keep-dashdash --stop-at-non-option -- --foo -- arg --spam=ham <optionspec >output &&
 233        test_cmp expect output
 234'
 235
 236test_expect_success 'setup expect.5' "
 237        cat > expect <<EOF
 238set -- --foo -- 'arg' '--spam=ham'
 239EOF
 240"
 241
 242test_expect_success 'test --parseopt --keep-dashdash --stop-at-non-option without --' '
 243        git rev-parse --parseopt --keep-dashdash --stop-at-non-option -- --foo arg --spam=ham <optionspec >output &&
 244        test_cmp expect output
 245'
 246
 247test_expect_success 'setup expect.6' "
 248        cat > expect <<EOF
 249set -- --foo --bar='z' --baz -C'Z' --data='A' -- 'arg'
 250EOF
 251"
 252
 253test_expect_success 'test --parseopt --stuck-long' '
 254        git rev-parse --parseopt --stuck-long -- --foo --bar=z -b arg -CZ -dA <optionspec >output &&
 255        test_cmp expect output
 256'
 257
 258test_expect_success 'setup expect.7' "
 259        cat > expect <<EOF
 260set -- --data='' -C --baz -- 'arg'
 261EOF
 262"
 263
 264test_expect_success 'test --parseopt --stuck-long and empty optional argument' '
 265        git rev-parse --parseopt --stuck-long -- --data= arg -C -b <optionspec >output &&
 266        test_cmp expect output
 267'
 268
 269test_expect_success 'setup expect.8' "
 270        cat > expect <<EOF
 271set -- --data --baz -- 'arg'
 272EOF
 273"
 274
 275test_expect_success 'test --parseopt --stuck-long and long option with unset optional argument' '
 276        git rev-parse --parseopt --stuck-long -- --data arg -b <optionspec >output &&
 277        test_cmp expect output
 278'
 279
 280test_expect_success 'test --parseopt --stuck-long and short option with unset optional argument' '
 281        git rev-parse --parseopt --stuck-long -- -d arg -b <optionspec >output &&
 282        test_cmp expect output
 283'
 284
 285test_done