1#!/bin/sh
2#
3# Copyright (c) 2005 Jon Seymour
4#
5
6test_description='Test rev-list --merge-order
7'
8. ./test-lib.sh
9
10function do_commit
11{
12 git-commit-tree "$@" </dev/null
13}
14
15function check_adjacency
16{
17 read previous
18 echo "= $previous"
19 while read next
20 do
21 if ! (git-cat-file commit $previous | grep "^parent $next" >/dev/null)
22 then
23 echo "^ $next"
24 else
25 echo "| $next"
26 fi
27 previous=$next
28 done
29}
30
31function sed_script
32{
33 for c in root a0 a1 a2 a3 a4 b1 b2 b3 b4 c1 c2 c3 l0 l1 l2 l3 l4 l5
34 do
35 echo -n "s/${!c}/$c/;"
36 done
37}
38
39date >path0
40git-update-cache --add path0
41tree=$(git-write-tree)
42root=$(do_commit $tree 2>/dev/null)
43export GIT_COMMITTER_NAME=foobar # to guarantee that the commit is different
44l0=$(do_commit $tree -p $root)
45l1=$(do_commit $tree -p $l0)
46l2=$(do_commit $tree -p $l1)
47a0=$(do_commit $tree -p $l2)
48a1=$(do_commit $tree -p $a0)
49export GIT_COMMITTER_NAME=foobar2 # to guarantee that the commit is different
50b1=$(do_commit $tree -p $a0)
51c1=$(do_commit $tree -p $b1)
52export GIT_COMMITTER_NAME=foobar3 # to guarantee that the commit is different
53b2=$(do_commit $tree -p $b1)
54b3=$(do_commit $tree -p $b2)
55c2=$(do_commit $tree -p $c1 -p $b2)
56c3=$(do_commit $tree -p $c2)
57a2=$(do_commit $tree -p $a1)
58a3=$(do_commit $tree -p $a2)
59b4=$(do_commit $tree -p $b3 -p $a3)
60a4=$(do_commit $tree -p $a3 -p $b4 -p $c3)
61l3=$(do_commit $tree -p $a4)
62l4=$(do_commit $tree -p $l3)
63l5=$(do_commit $tree -p $l4)
64echo $l5 > .git/HEAD
65
66git-rev-list --merge-order --show-breaks HEAD | sed "$(sed_script)" > actual-merge-order
67cat > expected-merge-order <<EOF
68= l5
69| l4
70| l3
71= a4
72| c3
73| c2
74| c1
75^ b4
76| b3
77| b2
78| b1
79^ a3
80| a2
81| a1
82= a0
83| l2
84| l1
85| l0
86= root
87EOF
88
89git-rev-list HEAD | check_adjacency | sed "$(sed_script)" > actual-default-order
90normal_adjacency_count=$(git-rev-list HEAD | check_adjacency | grep -c "\^" | tr -d ' ')
91merge_order_adjacency_count=$(git-rev-list --merge-order HEAD | check_adjacency | grep -c "\^" | tr -d ' ')
92
93test_expect_success 'Testing that the rev-list has correct number of entries' '[ $(git-rev-list HEAD | wc -l) -eq 19 ]'
94test_expect_success 'Testing that --merge-order produces the correct result' 'diff expected-merge-order actual-merge-order'
95test_expect_success 'Testing that --merge-order produces as many or fewer discontinuities' '[ $merge_order_adjacency_count -le $normal_adjacency_count ]'
96
97cat > expected-merge-order-1 <<EOF
98c3
99c2
100c1
101b3
102b2
103b1
104a3
105a2
106a1
107a0
108l2
109l1
110l0
111root
112EOF
113
114git-rev-list --merge-order $a3 $b3 $c3 | sed "$(sed_script)" > actual-merge-order-1
115test_expect_success 'Testing multiple heads' 'diff expected-merge-order-1 actual-merge-order-1'
116
117cat > expected-merge-order-2 <<EOF
118c3
119c2
120c1
121b3
122b2
123b1
124a3
125a2
126EOF
127
128git-rev-list --merge-order $a3 $b3 $c3 ^$a1 | sed "$(sed_script)" > actual-merge-order-2
129test_expect_success 'Testing stop' 'diff expected-merge-order-2 actual-merge-order-2'
130
131cat > expected-merge-order-3 <<EOF
132c3
133c2
134c1
135b3
136b2
137b1
138a3
139a2
140a1
141a0
142l2
143EOF
144
145git-rev-list --merge-order $a3 $b3 $c3 ^$l1 | sed "$(sed_script)" > actual-merge-order-3
146test_expect_success 'Testing stop in linear epoch' 'diff expected-merge-order-3 actual-merge-order-3'
147
148cat > expected-merge-order-4 <<EOF
149l5
150l4
151l3
152a4
153c3
154c2
155c1
156b4
157b3
158b2
159b1
160a3
161a2
162a1
163a0
164l2
165EOF
166
167git-rev-list --merge-order $l5 ^$l1 | sed "$(sed_script)" > actual-merge-order-4
168test_expect_success 'Testing start in linear epoch, stop after non-linear epoch' 'diff expected-merge-order-4 actual-merge-order-4'
169
170git-rev-list --merge-order $l5 $l5 ^$l1 2>/dev/null | sed "$(sed_script)" > actual-merge-order-5
171test_expect_success 'Testing duplicated start arguments' 'diff expected-merge-order-4 actual-merge-order-5'
172
173test_expect_success 'Testing exclusion near merge' 'git-rev-list --merge-order $a4 ^$c3 2>/dev/null'
174
175test_done