ccd24bd22bf665b9c13e5872d2512ef52bb3bcf9
   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 'add three more commits, write a tip graph' '
  94        git reset --hard commits/3 &&
  95        git merge merge/1 &&
  96        git merge commits/5 &&
  97        git merge merge/2 &&
  98        git branch merge/3 &&
  99        git commit-graph write --reachable --split &&
 100        test_path_is_missing $infodir/commit-graph &&
 101        test_path_is_file $graphdir/commit-graph-chain &&
 102        ls $graphdir/graph-*.graph >graph-files &&
 103        test_line_count = 2 graph-files &&
 104        verify_chain_files_exist $graphdir
 105'
 106
 107graph_git_behavior 'split commit-graph: merge 3 vs 2' merge/3 merge/2
 108
 109test_expect_success 'add one commit, write a tip graph' '
 110        test_commit 11 &&
 111        git branch commits/11 &&
 112        git commit-graph write --reachable --split &&
 113        test_path_is_missing $infodir/commit-graph &&
 114        test_path_is_file $graphdir/commit-graph-chain &&
 115        ls $graphdir/graph-*.graph >graph-files &&
 116        test_line_count = 3 graph-files &&
 117        verify_chain_files_exist $graphdir
 118'
 119
 120graph_git_behavior 'three-layer commit-graph: commit 11 vs 6' commits/11 commits/6
 121
 122test_done