t / t5324-split-commit-graph.shon commit commit-graph: expire commit-graph files (8d84097)
   1#!/bin/sh
   2
   3test_description='split commit graph'
   4. ./test-lib.sh
   5
   6GIT_TEST_COMMIT_GRAPH=0
   7
   8test_expect_success 'setup repo' '
   9        git init &&
  10        git config core.commitGraph true &&
  11        infodir=".git/objects/info" &&
  12        graphdir="$infodir/commit-graphs" &&
  13        test_oid_init
  14'
  15
  16graph_read_expect() {
  17        NUM_BASE=0
  18        if test ! -z $2
  19        then
  20                NUM_BASE=$2
  21        fi
  22        cat >expect <<- EOF
  23        header: 43475048 1 1 3 $NUM_BASE
  24        num_commits: $1
  25        chunks: oid_fanout oid_lookup commit_metadata
  26        EOF
  27        git commit-graph read >output &&
  28        test_cmp expect output
  29}
  30
  31test_expect_success 'create commits and write commit-graph' '
  32        for i in $(test_seq 3)
  33        do
  34                test_commit $i &&
  35                git branch commits/$i || return 1
  36        done &&
  37        git commit-graph write --reachable &&
  38        test_path_is_file $infodir/commit-graph &&
  39        graph_read_expect 3
  40'
  41
  42graph_git_two_modes() {
  43        git -c core.commitGraph=true $1 >output
  44        git -c core.commitGraph=false $1 >expect
  45        test_cmp expect output
  46}
  47
  48graph_git_behavior() {
  49        MSG=$1
  50        BRANCH=$2
  51        COMPARE=$3
  52        test_expect_success "check normal git operations: $MSG" '
  53                graph_git_two_modes "log --oneline $BRANCH" &&
  54                graph_git_two_modes "log --topo-order $BRANCH" &&
  55                graph_git_two_modes "log --graph $COMPARE..$BRANCH" &&
  56                graph_git_two_modes "branch -vv" &&
  57                graph_git_two_modes "merge-base -a $BRANCH $COMPARE"
  58        '
  59}
  60
  61graph_git_behavior 'graph exists' commits/3 commits/1
  62
  63verify_chain_files_exist() {
  64        for hash in $(cat $1/commit-graph-chain)
  65        do
  66                test_path_is_file $1/graph-$hash.graph || return 1
  67        done
  68}
  69
  70test_expect_success 'add more commits, and write a new base graph' '
  71        git reset --hard commits/1 &&
  72        for i in $(test_seq 4 5)
  73        do
  74                test_commit $i &&
  75                git branch commits/$i || return 1
  76        done &&
  77        git reset --hard commits/2 &&
  78        for i in $(test_seq 6 10)
  79        do
  80                test_commit $i &&
  81                git branch commits/$i || return 1
  82        done &&
  83        git reset --hard commits/2 &&
  84        git merge commits/4 &&
  85        git branch merge/1 &&
  86        git reset --hard commits/4 &&
  87        git merge commits/6 &&
  88        git branch merge/2 &&
  89        git commit-graph write --reachable &&
  90        graph_read_expect 12
  91'
  92
  93test_expect_success 'fork and fail to base a chain on a commit-graph file' '
  94        test_when_finished rm -rf fork &&
  95        git clone . fork &&
  96        (
  97                cd fork &&
  98                rm .git/objects/info/commit-graph &&
  99                echo "$(pwd)/../.git/objects" >.git/objects/info/alternates &&
 100                test_commit new-commit &&
 101                git commit-graph write --reachable --split &&
 102                test_path_is_file $graphdir/commit-graph-chain &&
 103                test_line_count = 1 $graphdir/commit-graph-chain &&
 104                verify_chain_files_exist $graphdir
 105        )
 106'
 107
 108test_expect_success 'add three more commits, write a tip graph' '
 109        git reset --hard commits/3 &&
 110        git merge merge/1 &&
 111        git merge commits/5 &&
 112        git merge merge/2 &&
 113        git branch merge/3 &&
 114        git commit-graph write --reachable --split &&
 115        test_path_is_missing $infodir/commit-graph &&
 116        test_path_is_file $graphdir/commit-graph-chain &&
 117        ls $graphdir/graph-*.graph >graph-files &&
 118        test_line_count = 2 graph-files &&
 119        verify_chain_files_exist $graphdir
 120'
 121
 122graph_git_behavior 'split commit-graph: merge 3 vs 2' merge/3 merge/2
 123
 124test_expect_success 'add one commit, write a tip graph' '
 125        test_commit 11 &&
 126        git branch commits/11 &&
 127        git commit-graph write --reachable --split &&
 128        test_path_is_missing $infodir/commit-graph &&
 129        test_path_is_file $graphdir/commit-graph-chain &&
 130        ls $graphdir/graph-*.graph >graph-files &&
 131        test_line_count = 3 graph-files &&
 132        verify_chain_files_exist $graphdir
 133'
 134
 135graph_git_behavior 'three-layer commit-graph: commit 11 vs 6' commits/11 commits/6
 136
 137test_expect_success 'add one commit, write a merged graph' '
 138        test_commit 12 &&
 139        git branch commits/12 &&
 140        git commit-graph write --reachable --split &&
 141        test_path_is_file $graphdir/commit-graph-chain &&
 142        test_line_count = 2 $graphdir/commit-graph-chain &&
 143        ls $graphdir/graph-*.graph >graph-files &&
 144        test_line_count = 2 graph-files &&
 145        verify_chain_files_exist $graphdir
 146'
 147
 148graph_git_behavior 'merged commit-graph: commit 12 vs 6' commits/12 commits/6
 149
 150test_expect_success 'create fork and chain across alternate' '
 151        git clone . fork &&
 152        (
 153                cd fork &&
 154                git config core.commitGraph true &&
 155                rm -rf $graphdir &&
 156                echo "$(pwd)/../.git/objects" >.git/objects/info/alternates &&
 157                test_commit 13 &&
 158                git branch commits/13 &&
 159                git commit-graph write --reachable --split &&
 160                test_path_is_file $graphdir/commit-graph-chain &&
 161                test_line_count = 3 $graphdir/commit-graph-chain &&
 162                ls $graphdir/graph-*.graph >graph-files &&
 163                test_line_count = 1 graph-files &&
 164                git -c core.commitGraph=true  rev-list HEAD >expect &&
 165                git -c core.commitGraph=false rev-list HEAD >actual &&
 166                test_cmp expect actual
 167        )
 168'
 169
 170graph_git_behavior 'alternate: commit 13 vs 6' commits/13 commits/6
 171
 172test_done