t / t6600-test-reach.shon commit Merge branch 'jk/pack-objects-with-bitmap-fix' (b458300)
   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        done &&
  36        for j in $(test_seq 1 9)
  37        do
  38                git reset --hard commit-$j-1 &&
  39                x=$(($j + 1)) &&
  40                test_commit "$x-1" &&
  41                git branch -f commit-$x-1 &&
  42
  43                for i in $(test_seq 2 10)
  44                do
  45                        git merge commit-$j-$i -m "$x-$i" &&
  46                        git branch -f commit-$x-$i
  47                done
  48        done &&
  49        git commit-graph write --reachable &&
  50        mv .git/objects/info/commit-graph commit-graph-full &&
  51        git show-ref -s commit-5-5 | git commit-graph write --stdin-commits &&
  52        mv .git/objects/info/commit-graph commit-graph-half &&
  53        git config core.commitGraph true
  54'
  55
  56test_three_modes () {
  57        test_when_finished rm -rf .git/objects/info/commit-graph &&
  58        test-tool reach $1 <input >actual &&
  59        test_cmp expect actual &&
  60        cp commit-graph-full .git/objects/info/commit-graph &&
  61        test-tool reach $1 <input >actual &&
  62        test_cmp expect actual &&
  63        cp commit-graph-half .git/objects/info/commit-graph &&
  64        test-tool reach $1 <input >actual &&
  65        test_cmp expect actual
  66}
  67
  68test_expect_success 'ref_newer:miss' '
  69        cat >input <<-\EOF &&
  70        A:commit-5-7
  71        B:commit-4-9
  72        EOF
  73        echo "ref_newer(A,B):0" >expect &&
  74        test_three_modes ref_newer
  75'
  76
  77test_expect_success 'ref_newer:hit' '
  78        cat >input <<-\EOF &&
  79        A:commit-5-7
  80        B:commit-2-3
  81        EOF
  82        echo "ref_newer(A,B):1" >expect &&
  83        test_three_modes ref_newer
  84'
  85
  86test_expect_success 'in_merge_bases:hit' '
  87        cat >input <<-\EOF &&
  88        A:commit-5-7
  89        B:commit-8-8
  90        EOF
  91        echo "in_merge_bases(A,B):1" >expect &&
  92        test_three_modes in_merge_bases
  93'
  94
  95test_expect_success 'in_merge_bases:miss' '
  96        cat >input <<-\EOF &&
  97        A:commit-6-8
  98        B:commit-5-9
  99        EOF
 100        echo "in_merge_bases(A,B):0" >expect &&
 101        test_three_modes in_merge_bases
 102'
 103
 104test_expect_success 'is_descendant_of:hit' '
 105        cat >input <<-\EOF &&
 106        A:commit-5-7
 107        X:commit-4-8
 108        X:commit-6-6
 109        X:commit-1-1
 110        EOF
 111        echo "is_descendant_of(A,X):1" >expect &&
 112        test_three_modes is_descendant_of
 113'
 114
 115test_expect_success 'is_descendant_of:miss' '
 116        cat >input <<-\EOF &&
 117        A:commit-6-8
 118        X:commit-5-9
 119        X:commit-4-10
 120        X:commit-7-6
 121        EOF
 122        echo "is_descendant_of(A,X):0" >expect &&
 123        test_three_modes is_descendant_of
 124'
 125
 126test_expect_success 'get_merge_bases_many' '
 127        cat >input <<-\EOF &&
 128        A:commit-5-7
 129        X:commit-4-8
 130        X:commit-6-6
 131        X:commit-8-3
 132        EOF
 133        {
 134                echo "get_merge_bases_many(A,X):" &&
 135                git rev-parse commit-5-6 \
 136                              commit-4-7 | sort
 137        } >expect &&
 138        test_three_modes get_merge_bases_many
 139'
 140
 141test_expect_success 'reduce_heads' '
 142        cat >input <<-\EOF &&
 143        X:commit-1-10
 144        X:commit-2-8
 145        X:commit-3-6
 146        X:commit-4-4
 147        X:commit-1-7
 148        X:commit-2-5
 149        X:commit-3-3
 150        X:commit-5-1
 151        EOF
 152        {
 153                echo "reduce_heads(X):" &&
 154                git rev-parse commit-5-1 \
 155                              commit-4-4 \
 156                              commit-3-6 \
 157                              commit-2-8 \
 158                              commit-1-10 | sort
 159        } >expect &&
 160        test_three_modes reduce_heads
 161'
 162
 163test_expect_success 'can_all_from_reach:hit' '
 164        cat >input <<-\EOF &&
 165        X:commit-2-10
 166        X:commit-3-9
 167        X:commit-4-8
 168        X:commit-5-7
 169        X:commit-6-6
 170        X:commit-7-5
 171        X:commit-8-4
 172        X:commit-9-3
 173        Y:commit-1-9
 174        Y:commit-2-8
 175        Y:commit-3-7
 176        Y:commit-4-6
 177        Y:commit-5-5
 178        Y:commit-6-4
 179        Y:commit-7-3
 180        Y:commit-8-1
 181        EOF
 182        echo "can_all_from_reach(X,Y):1" >expect &&
 183        test_three_modes can_all_from_reach
 184'
 185
 186test_expect_success 'can_all_from_reach:miss' '
 187        cat >input <<-\EOF &&
 188        X:commit-2-10
 189        X:commit-3-9
 190        X:commit-4-8
 191        X:commit-5-7
 192        X:commit-6-6
 193        X:commit-7-5
 194        X:commit-8-4
 195        X:commit-9-3
 196        Y:commit-1-9
 197        Y:commit-2-8
 198        Y:commit-3-7
 199        Y:commit-4-6
 200        Y:commit-5-5
 201        Y:commit-6-4
 202        Y:commit-8-5
 203        EOF
 204        echo "can_all_from_reach(X,Y):0" >expect &&
 205        test_three_modes can_all_from_reach
 206'
 207
 208test_expect_success 'commit_contains:hit' '
 209        cat >input <<-\EOF &&
 210        A:commit-7-7
 211        X:commit-2-10
 212        X:commit-3-9
 213        X:commit-4-8
 214        X:commit-5-7
 215        X:commit-6-6
 216        X:commit-7-5
 217        X:commit-8-4
 218        X:commit-9-3
 219        EOF
 220        echo "commit_contains(_,A,X,_):1" >expect &&
 221        test_three_modes commit_contains &&
 222        test_three_modes commit_contains --tag
 223'
 224
 225test_expect_success 'commit_contains:miss' '
 226        cat >input <<-\EOF &&
 227        A:commit-6-5
 228        X:commit-2-10
 229        X:commit-3-9
 230        X:commit-4-8
 231        X:commit-5-7
 232        X:commit-6-6
 233        X:commit-7-5
 234        X:commit-8-4
 235        X:commit-9-3
 236        EOF
 237        echo "commit_contains(_,A,X,_):0" >expect &&
 238        test_three_modes commit_contains &&
 239        test_three_modes commit_contains --tag
 240'
 241
 242test_done