1#!/bin/sh 2 3test_description='ancestor culling and limiting by parent number' 4 5GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main 6export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME 7 8. ./test-lib.sh 9 10check_revlist () { 11 rev_list_args="$1" && 12 shift && 13 git rev-parse "$@" >expect && 14 git rev-list $rev_list_args --all >actual && 15 test_cmp expect actual 16} 17 18test_expect_success setup ' 19 20 touch file && 21 git add file && 22 23 test_commit one && 24 25 test_tick=$(($test_tick - 2400)) && 26 27 test_commit two && 28 test_commit three && 29 test_commit four && 30 31 git log --pretty=oneline --abbrev-commit 32' 33 34test_expect_success 'one is ancestor of others and should not be shown' ' 35 36 git rev-list one --not four >result && 37 test_must_be_empty result 38 39' 40 41test_expect_success 'setup roots, merges and octopuses' ' 42 43 git checkout --orphan newroot && 44 test_commit five && 45 git checkout -b sidebranch two && 46 test_commit six && 47 git checkout -b anotherbranch three && 48 test_commit seven && 49 git checkout -b yetanotherbranch four && 50 test_commit eight && 51 git checkout main && 52 test_tick && 53 git merge --allow-unrelated-histories -m normalmerge newroot && 54 git tag normalmerge && 55 test_tick && 56 git merge -m tripus sidebranch anotherbranch && 57 git tag tripus && 58 git checkout -b tetrabranch normalmerge && 59 test_tick && 60 git merge -m tetrapus sidebranch anotherbranch yetanotherbranch && 61 git tag tetrapus && 62 git checkout main 63' 64 65test_expect_success 'rev-list roots' ' 66 67 check_revlist "--max-parents=0" one five 68' 69 70test_expect_success 'rev-list no merges' ' 71 72 check_revlist "--max-parents=1" one eight seven six five four three two && 73 check_revlist "--no-merges" one eight seven six five four three two 74' 75 76test_expect_success 'rev-list no octopuses' ' 77 78 check_revlist "--max-parents=2" one normalmerge eight seven six five four three two 79' 80 81test_expect_success 'rev-list no roots' ' 82 83 check_revlist "--min-parents=1" tetrapus tripus normalmerge eight seven six four three two 84' 85 86test_expect_success 'rev-list merges' ' 87 88 check_revlist "--min-parents=2" tetrapus tripus normalmerge && 89 check_revlist "--merges" tetrapus tripus normalmerge 90' 91 92test_expect_success 'rev-list octopus' ' 93 94 check_revlist "--min-parents=3" tetrapus tripus 95' 96 97test_expect_success 'rev-list ordinary commits' ' 98 99 check_revlist "--min-parents=1 --max-parents=1" eight seven six four three two 100' 101 102test_expect_success 'rev-list --merges --no-merges yields empty set' ' 103 104 check_revlist "--min-parents=2 --no-merges" && 105 check_revlist "--merges --no-merges" && 106 check_revlist "--no-merges --merges" 107' 108 109test_expect_success 'rev-list override and infinities' ' 110 111 check_revlist "--min-parents=2 --max-parents=1 --max-parents=3" tripus normalmerge && 112 check_revlist "--min-parents=1 --min-parents=2 --max-parents=7" tetrapus tripus normalmerge && 113 check_revlist "--min-parents=2 --max-parents=8" tetrapus tripus normalmerge && 114 check_revlist "--min-parents=2 --max-parents=-1" tetrapus tripus normalmerge && 115 check_revlist "--min-parents=2 --no-max-parents" tetrapus tripus normalmerge && 116 check_revlist "--max-parents=0 --min-parents=1 --no-min-parents" one five 117' 118 119test_expect_success 'dodecapus' ' 120 121 roots= && 122 for i in 1 2 3 4 5 6 7 8 9 10 11 123 do 124 git checkout -b root$i five && 125 test_commit $i && 126 roots="$roots root$i" || 127 return 128 done && 129 git checkout main && 130 test_tick && 131 git merge -m dodecapus $roots && 132 git tag dodecapus && 133 134 check_revlist "--min-parents=4" dodecapus tetrapus && 135 check_revlist "--min-parents=8" dodecapus && 136 check_revlist "--min-parents=12" dodecapus && 137 check_revlist "--min-parents=13" && 138 check_revlist "--min-parents=4 --max-parents=11" tetrapus 139' 140 141test_expect_success 'ancestors with the same commit time' ' 142 143 test_tick_keep=$test_tick && 144 for i in 1 2 3 4 5 6 7 8; do 145 test_tick=$test_tick_keep 146 test_commit t$i 147 done && 148 git rev-list t1^! --not t$i >result && 149 test_must_be_empty result 150' 151 152test_done 153