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