t / t6600-test-reach.shon commit Merge branch 'ms/remote-error-message-update' (00d5f66)
   1#!/bin/sh
   2
   3test_description='basic commit reachability tests'
   4
   5. ./test-lib.sh
   6
   7# Construct a grid-like commit graph with points (x,y)
   8# with 1 <= x <= 10, 1 <= y <= 10, where (x,y) has
   9# parents (x-1, y) and (x, y-1), keeping in mind that
  10# we drop a parent if a coordinate is nonpositive.
  11#
  12#             (10,10)
  13#            /       \
  14#         (10,9)    (9,10)
  15#        /     \   /      \
  16#    (10,8)    (9,9)      (8,10)
  17#   /     \    /   \      /    \
  18#         ( continued...)
  19#   \     /    \   /      \    /
  20#    (3,1)     (2,2)      (1,3)
  21#        \     /    \     /
  22#         (2,1)      (2,1)
  23#              \    /
  24#              (1,1)
  25#
  26# We use branch 'commit-x-y' to refer to (x,y).
  27# This grid allows interesting reachability and
  28# non-reachability queries: (x,y) can reach (x',y')
  29# if and only if x' <= x and y' <= y.
  30test_expect_success 'setup' '
  31        for i in $(test_seq 1 10)
  32        do
  33                test_commit "1-$i" &&
  34                git branch -f commit-1-$i &&
  35                git tag -a -m "1-$i" tag-1-$i commit-1-$i
  36        done &&
  37        for j in $(test_seq 1 9)
  38        do
  39                git reset --hard commit-$j-1 &&
  40                x=$(($j + 1)) &&
  41                test_commit "$x-1" &&
  42                git branch -f commit-$x-1 &&
  43                git tag -a -m "$x-1" tag-$x-1 commit-$x-1 &&
  44
  45                for i in $(test_seq 2 10)
  46                do
  47                        git merge commit-$j-$i -m "$x-$i" &&
  48                        git branch -f commit-$x-$i &&
  49                        git tag -a -m "$x-$i" tag-$x-$i commit-$x-$i
  50                done
  51        done &&
  52        git commit-graph write --reachable &&
  53        mv .git/objects/info/commit-graph commit-graph-full &&
  54        git show-ref -s commit-5-5 | git commit-graph write --stdin-commits &&
  55        mv .git/objects/info/commit-graph commit-graph-half &&
  56        git config core.commitGraph true
  57'
  58
  59test_three_modes () {
  60        test_when_finished rm -rf .git/objects/info/commit-graph &&
  61        test-tool reach $1 <input >actual &&
  62        test_cmp expect actual &&
  63        cp commit-graph-full .git/objects/info/commit-graph &&
  64        test-tool reach $1 <input >actual &&
  65        test_cmp expect actual &&
  66        cp commit-graph-half .git/objects/info/commit-graph &&
  67        test-tool reach $1 <input >actual &&
  68        test_cmp expect actual
  69}
  70
  71test_expect_success 'ref_newer:miss' '
  72        cat >input <<-\EOF &&
  73        A:commit-5-7
  74        B:commit-4-9
  75        EOF
  76        echo "ref_newer(A,B):0" >expect &&
  77        test_three_modes ref_newer
  78'
  79
  80test_expect_success 'ref_newer:hit' '
  81        cat >input <<-\EOF &&
  82        A:commit-5-7
  83        B:commit-2-3
  84        EOF
  85        echo "ref_newer(A,B):1" >expect &&
  86        test_three_modes ref_newer
  87'
  88
  89test_expect_success 'in_merge_bases:hit' '
  90        cat >input <<-\EOF &&
  91        A:commit-5-7
  92        B:commit-8-8
  93        EOF
  94        echo "in_merge_bases(A,B):1" >expect &&
  95        test_three_modes in_merge_bases
  96'
  97
  98test_expect_success 'in_merge_bases:miss' '
  99        cat >input <<-\EOF &&
 100        A:commit-6-8
 101        B:commit-5-9
 102        EOF
 103        echo "in_merge_bases(A,B):0" >expect &&
 104        test_three_modes in_merge_bases
 105'
 106
 107test_expect_success 'is_descendant_of:hit' '
 108        cat >input <<-\EOF &&
 109        A:commit-5-7
 110        X:commit-4-8
 111        X:commit-6-6
 112        X:commit-1-1
 113        EOF
 114        echo "is_descendant_of(A,X):1" >expect &&
 115        test_three_modes is_descendant_of
 116'
 117
 118test_expect_success 'is_descendant_of:miss' '
 119        cat >input <<-\EOF &&
 120        A:commit-6-8
 121        X:commit-5-9
 122        X:commit-4-10
 123        X:commit-7-6
 124        EOF
 125        echo "is_descendant_of(A,X):0" >expect &&
 126        test_three_modes is_descendant_of
 127'
 128
 129test_expect_success 'get_merge_bases_many' '
 130        cat >input <<-\EOF &&
 131        A:commit-5-7
 132        X:commit-4-8
 133        X:commit-6-6
 134        X:commit-8-3
 135        EOF
 136        {
 137                echo "get_merge_bases_many(A,X):" &&
 138                git rev-parse commit-5-6 \
 139                              commit-4-7 | sort
 140        } >expect &&
 141        test_three_modes get_merge_bases_many
 142'
 143
 144test_expect_success 'reduce_heads' '
 145        cat >input <<-\EOF &&
 146        X:commit-1-10
 147        X:commit-2-8
 148        X:commit-3-6
 149        X:commit-4-4
 150        X:commit-1-7
 151        X:commit-2-5
 152        X:commit-3-3
 153        X:commit-5-1
 154        EOF
 155        {
 156                echo "reduce_heads(X):" &&
 157                git rev-parse commit-5-1 \
 158                              commit-4-4 \
 159                              commit-3-6 \
 160                              commit-2-8 \
 161                              commit-1-10 | sort
 162        } >expect &&
 163        test_three_modes reduce_heads
 164'
 165
 166test_expect_success 'can_all_from_reach:hit' '
 167        cat >input <<-\EOF &&
 168        X:commit-2-10
 169        X:commit-3-9
 170        X:commit-4-8
 171        X:commit-5-7
 172        X:commit-6-6
 173        X:commit-7-5
 174        X:commit-8-4
 175        X:commit-9-3
 176        Y:commit-1-9
 177        Y:commit-2-8
 178        Y:commit-3-7
 179        Y:commit-4-6
 180        Y:commit-5-5
 181        Y:commit-6-4
 182        Y:commit-7-3
 183        Y:commit-8-1
 184        EOF
 185        echo "can_all_from_reach(X,Y):1" >expect &&
 186        test_three_modes can_all_from_reach
 187'
 188
 189test_expect_success 'can_all_from_reach:miss' '
 190        cat >input <<-\EOF &&
 191        X:commit-2-10
 192        X:commit-3-9
 193        X:commit-4-8
 194        X:commit-5-7
 195        X:commit-6-6
 196        X:commit-7-5
 197        X:commit-8-4
 198        X:commit-9-3
 199        Y:commit-1-9
 200        Y:commit-2-8
 201        Y:commit-3-7
 202        Y:commit-4-6
 203        Y:commit-5-5
 204        Y:commit-6-4
 205        Y:commit-8-5
 206        EOF
 207        echo "can_all_from_reach(X,Y):0" >expect &&
 208        test_three_modes can_all_from_reach
 209'
 210
 211test_expect_success 'can_all_from_reach_with_flag: tags case' '
 212        cat >input <<-\EOF &&
 213        X:tag-2-10
 214        X:tag-3-9
 215        X:tag-4-8
 216        X:commit-5-7
 217        X:commit-6-6
 218        X:commit-7-5
 219        X:commit-8-4
 220        X:commit-9-3
 221        Y:tag-1-9
 222        Y:tag-2-8
 223        Y:tag-3-7
 224        Y:commit-4-6
 225        Y:commit-5-5
 226        Y:commit-6-4
 227        Y:commit-7-3
 228        Y:commit-8-1
 229        EOF
 230        echo "can_all_from_reach_with_flag(X,_,_,0,0):1" >expect &&
 231        test_three_modes can_all_from_reach_with_flag
 232'
 233
 234test_expect_success 'commit_contains:hit' '
 235        cat >input <<-\EOF &&
 236        A:commit-7-7
 237        X:commit-2-10
 238        X:commit-3-9
 239        X:commit-4-8
 240        X:commit-5-7
 241        X:commit-6-6
 242        X:commit-7-5
 243        X:commit-8-4
 244        X:commit-9-3
 245        EOF
 246        echo "commit_contains(_,A,X,_):1" >expect &&
 247        test_three_modes commit_contains &&
 248        test_three_modes commit_contains --tag
 249'
 250
 251test_expect_success 'commit_contains:miss' '
 252        cat >input <<-\EOF &&
 253        A:commit-6-5
 254        X:commit-2-10
 255        X:commit-3-9
 256        X:commit-4-8
 257        X:commit-5-7
 258        X:commit-6-6
 259        X:commit-7-5
 260        X:commit-8-4
 261        X:commit-9-3
 262        EOF
 263        echo "commit_contains(_,A,X,_):0" >expect &&
 264        test_three_modes commit_contains &&
 265        test_three_modes commit_contains --tag
 266'
 267
 268test_done