t / t6302-for-each-ref-filter.shon commit regex: use regexec_buf() (b7d36ff)
   1#!/bin/sh
   2
   3test_description='test for-each-refs usage of ref-filter APIs'
   4
   5. ./test-lib.sh
   6. "$TEST_DIRECTORY"/lib-gpg.sh
   7
   8if ! test_have_prereq GPG
   9then
  10        skip_all="skipping for-each-ref tests, GPG not available"
  11        test_done
  12fi
  13
  14test_expect_success 'setup some history and refs' '
  15        test_commit one &&
  16        test_commit two &&
  17        test_commit three &&
  18        git checkout -b side &&
  19        test_commit four &&
  20        git tag -s -m "A signed tag message" signed-tag &&
  21        git tag -s -m "Annonated doubly" double-tag signed-tag &&
  22        git checkout master &&
  23        git update-ref refs/odd/spot master
  24'
  25
  26test_expect_success 'filtering with --points-at' '
  27        cat >expect <<-\EOF &&
  28        refs/heads/master
  29        refs/odd/spot
  30        refs/tags/three
  31        EOF
  32        git for-each-ref --format="%(refname)" --points-at=master >actual &&
  33        test_cmp expect actual
  34'
  35
  36test_expect_success 'check signed tags with --points-at' '
  37        sed -e "s/Z$//" >expect <<-\EOF &&
  38        refs/heads/side Z
  39        refs/tags/four Z
  40        refs/tags/signed-tag four
  41        EOF
  42        git for-each-ref --format="%(refname) %(*subject)" --points-at=side >actual &&
  43        test_cmp expect actual
  44'
  45
  46test_expect_success 'filtering with --merged' '
  47        cat >expect <<-\EOF &&
  48        refs/heads/master
  49        refs/odd/spot
  50        refs/tags/one
  51        refs/tags/three
  52        refs/tags/two
  53        EOF
  54        git for-each-ref --format="%(refname)" --merged=master >actual &&
  55        test_cmp expect actual
  56'
  57
  58test_expect_success 'filtering with --no-merged' '
  59        cat >expect <<-\EOF &&
  60        refs/heads/side
  61        refs/tags/double-tag
  62        refs/tags/four
  63        refs/tags/signed-tag
  64        EOF
  65        git for-each-ref --format="%(refname)" --no-merged=master >actual &&
  66        test_cmp expect actual
  67'
  68
  69test_expect_success 'filtering with --contains' '
  70        cat >expect <<-\EOF &&
  71        refs/heads/master
  72        refs/heads/side
  73        refs/odd/spot
  74        refs/tags/double-tag
  75        refs/tags/four
  76        refs/tags/signed-tag
  77        refs/tags/three
  78        refs/tags/two
  79        EOF
  80        git for-each-ref --format="%(refname)" --contains=two >actual &&
  81        test_cmp expect actual
  82'
  83
  84test_expect_success '%(color) must fail' '
  85        test_must_fail git for-each-ref --format="%(color)%(refname)"
  86'
  87
  88test_expect_success 'left alignment is default' '
  89        cat >expect <<-\EOF &&
  90        refname is refs/heads/master  |refs/heads/master
  91        refname is refs/heads/side    |refs/heads/side
  92        refname is refs/odd/spot      |refs/odd/spot
  93        refname is refs/tags/double-tag|refs/tags/double-tag
  94        refname is refs/tags/four     |refs/tags/four
  95        refname is refs/tags/one      |refs/tags/one
  96        refname is refs/tags/signed-tag|refs/tags/signed-tag
  97        refname is refs/tags/three    |refs/tags/three
  98        refname is refs/tags/two      |refs/tags/two
  99        EOF
 100        git for-each-ref --format="%(align:30)refname is %(refname)%(end)|%(refname)" >actual &&
 101        test_cmp expect actual
 102'
 103
 104test_expect_success 'middle alignment' '
 105        cat >expect <<-\EOF &&
 106        | refname is refs/heads/master |refs/heads/master
 107        |  refname is refs/heads/side  |refs/heads/side
 108        |   refname is refs/odd/spot   |refs/odd/spot
 109        |refname is refs/tags/double-tag|refs/tags/double-tag
 110        |  refname is refs/tags/four   |refs/tags/four
 111        |   refname is refs/tags/one   |refs/tags/one
 112        |refname is refs/tags/signed-tag|refs/tags/signed-tag
 113        |  refname is refs/tags/three  |refs/tags/three
 114        |   refname is refs/tags/two   |refs/tags/two
 115        EOF
 116        git for-each-ref --format="|%(align:middle,30)refname is %(refname)%(end)|%(refname)" >actual &&
 117        test_cmp expect actual
 118'
 119
 120test_expect_success 'right alignment' '
 121        cat >expect <<-\EOF &&
 122        |  refname is refs/heads/master|refs/heads/master
 123        |    refname is refs/heads/side|refs/heads/side
 124        |      refname is refs/odd/spot|refs/odd/spot
 125        |refname is refs/tags/double-tag|refs/tags/double-tag
 126        |     refname is refs/tags/four|refs/tags/four
 127        |      refname is refs/tags/one|refs/tags/one
 128        |refname is refs/tags/signed-tag|refs/tags/signed-tag
 129        |    refname is refs/tags/three|refs/tags/three
 130        |      refname is refs/tags/two|refs/tags/two
 131        EOF
 132        git for-each-ref --format="|%(align:30,right)refname is %(refname)%(end)|%(refname)" >actual &&
 133        test_cmp expect actual
 134'
 135
 136cat >expect <<-\EOF
 137|       refname is refs/heads/master       |refs/heads/master
 138|        refname is refs/heads/side        |refs/heads/side
 139|         refname is refs/odd/spot         |refs/odd/spot
 140|     refname is refs/tags/double-tag      |refs/tags/double-tag
 141|        refname is refs/tags/four         |refs/tags/four
 142|         refname is refs/tags/one         |refs/tags/one
 143|     refname is refs/tags/signed-tag      |refs/tags/signed-tag
 144|        refname is refs/tags/three        |refs/tags/three
 145|         refname is refs/tags/two         |refs/tags/two
 146EOF
 147
 148test_align_permutations() {
 149        while read -r option
 150        do
 151                test_expect_success "align:$option" '
 152                        git for-each-ref --format="|%(align:$option)refname is %(refname)%(end)|%(refname)" >actual &&
 153                        test_cmp expect actual
 154                '
 155        done
 156}
 157
 158test_align_permutations <<-\EOF
 159        middle,42
 160        42,middle
 161        position=middle,42
 162        42,position=middle
 163        middle,width=42
 164        width=42,middle
 165        position=middle,width=42
 166        width=42,position=middle
 167EOF
 168
 169# Last one wins (silently) when multiple arguments of the same type are given
 170
 171test_align_permutations <<-\EOF
 172        32,width=42,middle
 173        width=30,42,middle
 174        width=42,position=right,middle
 175        42,right,position=middle
 176EOF
 177
 178# Individual atoms inside %(align:...) and %(end) must not be quoted.
 179
 180test_expect_success 'alignment with format quote' "
 181        cat >expect <<-\EOF &&
 182        |'      '\''master| A U Thor'\''      '|
 183        |'       '\''side| A U Thor'\''       '|
 184        |'     '\''odd/spot| A U Thor'\''     '|
 185        |'        '\''double-tag| '\''        '|
 186        |'       '\''four| A U Thor'\''       '|
 187        |'       '\''one| A U Thor'\''        '|
 188        |'        '\''signed-tag| '\''        '|
 189        |'      '\''three| A U Thor'\''       '|
 190        |'       '\''two| A U Thor'\''        '|
 191        EOF
 192        git for-each-ref --shell --format=\"|%(align:30,middle)'%(refname:short)| %(authorname)'%(end)|\" >actual &&
 193        test_cmp expect actual
 194"
 195
 196test_expect_success 'nested alignment with quote formatting' "
 197        cat >expect <<-\EOF &&
 198        |'         master               '|
 199        |'           side               '|
 200        |'       odd/spot               '|
 201        |'     double-tag               '|
 202        |'           four               '|
 203        |'            one               '|
 204        |'     signed-tag               '|
 205        |'          three               '|
 206        |'            two               '|
 207        EOF
 208        git for-each-ref --shell --format='|%(align:30,left)%(align:15,right)%(refname:short)%(end)%(end)|' >actual &&
 209        test_cmp expect actual
 210"
 211
 212test_expect_success 'check `%(contents:lines=1)`' '
 213        cat >expect <<-\EOF &&
 214        master |three
 215        side |four
 216        odd/spot |three
 217        double-tag |Annonated doubly
 218        four |four
 219        one |one
 220        signed-tag |A signed tag message
 221        three |three
 222        two |two
 223        EOF
 224        git for-each-ref --format="%(refname:short) |%(contents:lines=1)" >actual &&
 225        test_cmp expect actual
 226'
 227
 228test_expect_success 'check `%(contents:lines=0)`' '
 229        cat >expect <<-\EOF &&
 230        master |
 231        side |
 232        odd/spot |
 233        double-tag |
 234        four |
 235        one |
 236        signed-tag |
 237        three |
 238        two |
 239        EOF
 240        git for-each-ref --format="%(refname:short) |%(contents:lines=0)" >actual &&
 241        test_cmp expect actual
 242'
 243
 244test_expect_success 'check `%(contents:lines=99999)`' '
 245        cat >expect <<-\EOF &&
 246        master |three
 247        side |four
 248        odd/spot |three
 249        double-tag |Annonated doubly
 250        four |four
 251        one |one
 252        signed-tag |A signed tag message
 253        three |three
 254        two |two
 255        EOF
 256        git for-each-ref --format="%(refname:short) |%(contents:lines=99999)" >actual &&
 257        test_cmp expect actual
 258'
 259
 260test_expect_success '`%(contents:lines=-1)` should fail' '
 261        test_must_fail git for-each-ref --format="%(refname:short) |%(contents:lines=-1)"
 262'
 263
 264test_expect_success 'setup for version sort' '
 265        test_commit foo1.3 &&
 266        test_commit foo1.6 &&
 267        test_commit foo1.10
 268'
 269
 270test_expect_success 'version sort' '
 271        git for-each-ref --sort=version:refname --format="%(refname:short)" refs/tags/ | grep "foo" >actual &&
 272        cat >expect <<-\EOF &&
 273        foo1.3
 274        foo1.6
 275        foo1.10
 276        EOF
 277        test_cmp expect actual
 278'
 279
 280test_expect_success 'version sort (shortened)' '
 281        git for-each-ref --sort=v:refname --format="%(refname:short)" refs/tags/ | grep "foo" >actual &&
 282        cat >expect <<-\EOF &&
 283        foo1.3
 284        foo1.6
 285        foo1.10
 286        EOF
 287        test_cmp expect actual
 288'
 289
 290test_expect_success 'reverse version sort' '
 291        git for-each-ref --sort=-version:refname --format="%(refname:short)" refs/tags/ | grep "foo" >actual &&
 292        cat >expect <<-\EOF &&
 293        foo1.10
 294        foo1.6
 295        foo1.3
 296        EOF
 297        test_cmp expect actual
 298'
 299
 300test_done