]> git.ipfire.org Git - thirdparty/git.git/blob - t/t6001-rev-list-merge-order.sh
[PATCH] three --merge-order bug fixes
[thirdparty/git.git] / t / t6001-rev-list-merge-order.sh
1 #!/bin/sh
2 #
3 # Copyright (c) 2005 Jon Seymour
4 #
5
6 test_description='Test rev-list --merge-order
7 '
8 . ./test-lib.sh
9
10 function do_commit
11 {
12 git-commit-tree "$@" </dev/null
13 }
14
15 function 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
31 function 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
39 date >path0
40 git-update-cache --add path0
41 tree=$(git-write-tree)
42 root=$(do_commit $tree 2>/dev/null)
43 export GIT_COMMITTER_NAME=foobar # to guarantee that the commit is different
44 l0=$(do_commit $tree -p $root)
45 l1=$(do_commit $tree -p $l0)
46 l2=$(do_commit $tree -p $l1)
47 a0=$(do_commit $tree -p $l2)
48 a1=$(do_commit $tree -p $a0)
49 export GIT_COMMITTER_NAME=foobar2 # to guarantee that the commit is different
50 b1=$(do_commit $tree -p $a0)
51 c1=$(do_commit $tree -p $b1)
52 export GIT_COMMITTER_NAME=foobar3 # to guarantee that the commit is different
53 b2=$(do_commit $tree -p $b1)
54 b3=$(do_commit $tree -p $b2)
55 c2=$(do_commit $tree -p $c1 -p $b2)
56 c3=$(do_commit $tree -p $c2)
57 a2=$(do_commit $tree -p $a1)
58 a3=$(do_commit $tree -p $a2)
59 b4=$(do_commit $tree -p $b3 -p $a3)
60 a4=$(do_commit $tree -p $a3 -p $b4 -p $c3)
61 l3=$(do_commit $tree -p $a4)
62 l4=$(do_commit $tree -p $l3)
63 l5=$(do_commit $tree -p $l4)
64 echo $l5 > .git/HEAD
65
66 git-rev-list --merge-order --show-breaks HEAD | sed "$(sed_script)" > actual-merge-order
67 cat > 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
87 EOF
88
89 git-rev-list HEAD | check_adjacency | sed "$(sed_script)" > actual-default-order
90 normal_adjacency_count=$(git-rev-list HEAD | check_adjacency | grep -c "\^" | tr -d ' ')
91 merge_order_adjacency_count=$(git-rev-list --merge-order HEAD | check_adjacency | grep -c "\^" | tr -d ' ')
92
93 test_expect_success 'Testing that the rev-list has correct number of entries' '[ $(git-rev-list HEAD | wc -l) -eq 19 ]'
94 test_expect_success 'Testing that --merge-order produces the correct result' 'diff expected-merge-order actual-merge-order'
95 test_expect_success 'Testing that --merge-order produces as many or fewer discontinuities' '[ $merge_order_adjacency_count -le $normal_adjacency_count ]'
96
97 cat > expected-merge-order-1 <<EOF
98 c3
99 c2
100 c1
101 b3
102 b2
103 b1
104 a3
105 a2
106 a1
107 a0
108 l2
109 l1
110 l0
111 root
112 EOF
113
114 git-rev-list --merge-order $a3 $b3 $c3 | sed "$(sed_script)" > actual-merge-order-1
115 test_expect_success 'Testing multiple heads' 'diff expected-merge-order-1 actual-merge-order-1'
116
117 cat > expected-merge-order-2 <<EOF
118 c3
119 c2
120 c1
121 b3
122 b2
123 b1
124 a3
125 a2
126 EOF
127
128 git-rev-list --merge-order $a3 $b3 $c3 ^$a1 | sed "$(sed_script)" > actual-merge-order-2
129 test_expect_success 'Testing stop' 'diff expected-merge-order-2 actual-merge-order-2'
130
131 cat > expected-merge-order-3 <<EOF
132 c3
133 c2
134 c1
135 b3
136 b2
137 b1
138 a3
139 a2
140 a1
141 a0
142 l2
143 EOF
144
145 git-rev-list --merge-order $a3 $b3 $c3 ^$l1 | sed "$(sed_script)" > actual-merge-order-3
146 test_expect_success 'Testing stop in linear epoch' 'diff expected-merge-order-3 actual-merge-order-3'
147
148 cat > expected-merge-order-4 <<EOF
149 l5
150 l4
151 l3
152 a4
153 c3
154 c2
155 c1
156 b4
157 b3
158 b2
159 b1
160 a3
161 a2
162 a1
163 a0
164 l2
165 EOF
166
167 git-rev-list --merge-order $l5 ^$l1 | sed "$(sed_script)" > actual-merge-order-4
168 test_expect_success 'Testing start in linear epoch, stop after non-linear epoch' 'diff expected-merge-order-4 actual-merge-order-4'
169
170 git-rev-list --merge-order $l5 $l5 ^$l1 2>/dev/null | sed "$(sed_script)" > actual-merge-order-5
171 test_expect_success 'Testing duplicated start arguments' 'diff expected-merge-order-4 actual-merge-order-5'
172
173 test_expect_success 'Testing exclusion near merge' 'git-rev-list --merge-order $a4 ^$c3 2>/dev/null'
174
175 test_done