t / t3201-branch-contains.shon commit t3306: abstract away SHA-1-specific constants (b99bfc7)
   1#!/bin/sh
   2
   3test_description='branch --contains <commit>, --no-contains <commit> --merged, and --no-merged'
   4
   5. ./test-lib.sh
   6
   7test_expect_success setup '
   8
   9        >file &&
  10        git add file &&
  11        test_tick &&
  12        git commit -m initial &&
  13        git branch side &&
  14
  15        echo 1 >file &&
  16        test_tick &&
  17        git commit -a -m "second on master" &&
  18
  19        git checkout side &&
  20        echo 1 >file &&
  21        test_tick &&
  22        git commit -a -m "second on side" &&
  23
  24        git merge master
  25
  26'
  27
  28test_expect_success 'branch --contains=master' '
  29
  30        git branch --contains=master >actual &&
  31        {
  32                echo "  master" && echo "* side"
  33        } >expect &&
  34        test_cmp expect actual
  35
  36'
  37
  38test_expect_success 'branch --contains master' '
  39
  40        git branch --contains master >actual &&
  41        {
  42                echo "  master" && echo "* side"
  43        } >expect &&
  44        test_cmp expect actual
  45
  46'
  47
  48test_expect_success 'branch --no-contains=master' '
  49
  50        git branch --no-contains=master >actual &&
  51        test_must_be_empty actual
  52
  53'
  54
  55test_expect_success 'branch --no-contains master' '
  56
  57        git branch --no-contains master >actual &&
  58        test_must_be_empty actual
  59
  60'
  61
  62test_expect_success 'branch --contains=side' '
  63
  64        git branch --contains=side >actual &&
  65        {
  66                echo "* side"
  67        } >expect &&
  68        test_cmp expect actual
  69
  70'
  71
  72test_expect_success 'branch --no-contains=side' '
  73
  74        git branch --no-contains=side >actual &&
  75        {
  76                echo "  master"
  77        } >expect &&
  78        test_cmp expect actual
  79
  80'
  81
  82test_expect_success 'branch --contains with pattern implies --list' '
  83
  84        git branch --contains=master master >actual &&
  85        {
  86                echo "  master"
  87        } >expect &&
  88        test_cmp expect actual
  89
  90'
  91
  92test_expect_success 'branch --no-contains with pattern implies --list' '
  93
  94        git branch --no-contains=master master >actual &&
  95        test_must_be_empty actual
  96
  97'
  98
  99test_expect_success 'side: branch --merged' '
 100
 101        git branch --merged >actual &&
 102        {
 103                echo "  master" &&
 104                echo "* side"
 105        } >expect &&
 106        test_cmp expect actual
 107
 108'
 109
 110test_expect_success 'branch --merged with pattern implies --list' '
 111
 112        git branch --merged=side master >actual &&
 113        {
 114                echo "  master"
 115        } >expect &&
 116        test_cmp expect actual
 117
 118'
 119
 120test_expect_success 'side: branch --no-merged' '
 121
 122        git branch --no-merged >actual &&
 123        test_must_be_empty actual
 124
 125'
 126
 127test_expect_success 'master: branch --merged' '
 128
 129        git checkout master &&
 130        git branch --merged >actual &&
 131        {
 132                echo "* master"
 133        } >expect &&
 134        test_cmp expect actual
 135
 136'
 137
 138test_expect_success 'master: branch --no-merged' '
 139
 140        git branch --no-merged >actual &&
 141        {
 142                echo "  side"
 143        } >expect &&
 144        test_cmp expect actual
 145
 146'
 147
 148test_expect_success 'branch --no-merged with pattern implies --list' '
 149
 150        git branch --no-merged=master master >actual &&
 151        test_must_be_empty actual
 152
 153'
 154
 155test_expect_success 'implicit --list conflicts with modification options' '
 156
 157        test_must_fail git branch --contains=master -d &&
 158        test_must_fail git branch --contains=master -m foo &&
 159        test_must_fail git branch --no-contains=master -d &&
 160        test_must_fail git branch --no-contains=master -m foo
 161
 162'
 163
 164test_expect_success 'Assert that --contains only works on commits, not trees & blobs' '
 165        test_must_fail git branch --contains master^{tree} &&
 166        blob=$(git hash-object -w --stdin <<-\EOF
 167        Some blob
 168        EOF
 169        ) &&
 170        test_must_fail git branch --contains $blob &&
 171        test_must_fail git branch --no-contains $blob
 172'
 173
 174# We want to set up a case where the walk for the tracking info
 175# of one branch crosses the tip of another branch (and make sure
 176# that the latter walk does not mess up our flag to see if it was
 177# merged).
 178#
 179# Here "topic" tracks "master" with one extra commit, and "zzz" points to the
 180# same tip as master The name "zzz" must come alphabetically after "topic"
 181# as we process them in that order.
 182test_expect_success 'branch --merged with --verbose' '
 183        git branch --track topic master &&
 184        git branch zzz topic &&
 185        git checkout topic &&
 186        test_commit foo &&
 187        git branch --merged topic >actual &&
 188        cat >expect <<-\EOF &&
 189          master
 190        * topic
 191          zzz
 192        EOF
 193        test_cmp expect actual &&
 194        git branch --verbose --merged topic >actual &&
 195        cat >expect <<-EOF &&
 196          master $(git rev-parse --short master) second on master
 197        * topic  $(git rev-parse --short topic ) [ahead 1] foo
 198          zzz    $(git rev-parse --short zzz   ) second on master
 199        EOF
 200        test_i18ncmp expect actual
 201'
 202
 203test_expect_success 'branch --contains combined with --no-contains' '
 204        git branch --contains zzz --no-contains topic >actual &&
 205        cat >expect <<-\EOF &&
 206          master
 207          side
 208          zzz
 209        EOF
 210        test_cmp expect actual
 211
 212'
 213
 214test_done