t / t1502-rev-parse-parseopt.shon commit Merge branch 'ak/commit-only-allow-empty' into maint (9d2a248)
   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|short-hint=a    with a one symbol hint
  32|
  33|Extras
  34|extra1    line above used to cause a segfault but no longer does
  35EOF
  36'
  37
  38test_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
  71END_EXPECT
  72        test_expect_code 129 git rev-parse --parseopt -- -h > output < optionspec &&
  73        test_i18ncmp expect output
  74'
  75
  76test_expect_success 'setup expect.1' "
  77        cat > expect <<EOF
  78set -- --foo --bar 'ham' -b -- 'arg'
  79EOF
  80"
  81
  82test_expect_success 'test --parseopt' '
  83        git rev-parse --parseopt -- --foo --bar=ham --baz arg < optionspec > output &&
  84        test_cmp expect output
  85'
  86
  87test_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
  92test_expect_success 'setup expect.2' "
  93        cat > expect <<EOF
  94set -- --foo -- 'arg' '--bar=ham'
  95EOF
  96"
  97
  98test_expect_success 'test --parseopt with --' '
  99        git rev-parse --parseopt -- --foo -- arg --bar=ham < optionspec > output &&
 100        test_cmp expect output
 101'
 102
 103test_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
 108test_expect_success 'setup expect.3' "
 109        cat > expect <<EOF
 110set -- --foo -- '--' 'arg' '--bar=ham'
 111EOF
 112"
 113
 114test_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
 119test_expect_success 'setup expect.4' "
 120        cat >expect <<EOF
 121set -- --foo -- '--' 'arg' '--spam=ham'
 122EOF
 123"
 124
 125test_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
 130test_expect_success 'setup expect.5' "
 131        cat > expect <<EOF
 132set -- --foo -- 'arg' '--spam=ham'
 133EOF
 134"
 135
 136test_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
 141test_expect_success 'setup expect.6' "
 142        cat > expect <<EOF
 143set -- --foo --bar='z' --baz -C'Z' --data='A' -- 'arg'
 144EOF
 145"
 146
 147test_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
 152test_expect_success 'setup expect.7' "
 153        cat > expect <<EOF
 154set -- --data='' -C --baz -- 'arg'
 155EOF
 156"
 157
 158test_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
 163test_expect_success 'setup expect.8' "
 164        cat > expect <<EOF
 165set -- --data --baz -- 'arg'
 166EOF
 167"
 168
 169test_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
 174test_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
 179test_done