git-apply: try threeway first when "--3way" is used
[git] / t / t4056-diff-order.sh
1 #!/bin/sh
2
3 test_description='diff order & rotate'
4
5 GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main
6 export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME
7
8 . ./test-lib.sh
9
10 create_files () {
11         echo "$1" >a.h &&
12         echo "$1" >b.c &&
13         echo "$1" >c/Makefile &&
14         echo "$1" >d.txt &&
15         git add a.h b.c c/Makefile d.txt &&
16         git commit -m"$1"
17 }
18
19 test_expect_success 'setup' '
20         mkdir c &&
21         create_files 1 &&
22         create_files 2 &&
23
24         cat >order_file_1 <<-\EOF &&
25         *Makefile
26         *.txt
27         *.h
28         EOF
29
30         cat >order_file_2 <<-\EOF &&
31         *Makefile
32         *.h
33         *.c
34         EOF
35
36         cat >expect_none <<-\EOF &&
37         a.h
38         b.c
39         c/Makefile
40         d.txt
41         EOF
42
43         cat >expect_1 <<-\EOF &&
44         c/Makefile
45         d.txt
46         a.h
47         b.c
48         EOF
49
50         cat >expect_2 <<-\EOF
51         c/Makefile
52         a.h
53         b.c
54         d.txt
55         EOF
56 '
57
58 test_expect_success "no order (=tree object order)" '
59         git diff --name-only HEAD^..HEAD >actual &&
60         test_cmp expect_none actual
61 '
62
63 test_expect_success 'missing orderfile' '
64         rm -f bogus_file &&
65         test_must_fail git diff -Obogus_file --name-only HEAD^..HEAD
66 '
67
68 test_expect_success POSIXPERM,SANITY 'unreadable orderfile' '
69         >unreadable_file &&
70         chmod -r unreadable_file &&
71         test_must_fail git diff -Ounreadable_file --name-only HEAD^..HEAD
72 '
73
74 test_expect_success "orderfile using option from subdir with --output" '
75         mkdir subdir &&
76         git -C subdir diff -O../order_file_1 --output ../actual --name-only HEAD^..HEAD &&
77         test_cmp expect_1 actual
78 '
79
80 for i in 1 2
81 do
82         test_expect_success "orderfile using option ($i)" '
83                 git diff -Oorder_file_$i --name-only HEAD^..HEAD >actual &&
84                 test_cmp expect_$i actual
85         '
86
87         test_expect_success PIPE "orderfile is fifo ($i)" '
88                 rm -f order_fifo &&
89                 mkfifo order_fifo &&
90                 {
91                         cat order_file_$i >order_fifo &
92                 } &&
93                 git diff -O order_fifo --name-only HEAD^..HEAD >actual &&
94                 wait &&
95                 test_cmp expect_$i actual
96         '
97
98         test_expect_success "orderfile using config ($i)" '
99                 git -c diff.orderfile=order_file_$i diff --name-only HEAD^..HEAD >actual &&
100                 test_cmp expect_$i actual
101         '
102
103         test_expect_success "cancelling configured orderfile ($i)" '
104                 git -c diff.orderfile=order_file_$i diff -O/dev/null --name-only HEAD^..HEAD >actual &&
105                 test_cmp expect_none actual
106         '
107 done
108
109 test_expect_success 'setup for testing combine-diff order' '
110         git checkout -b tmp HEAD~ &&
111         create_files 3 &&
112         git checkout main &&
113         git merge --no-commit -s ours tmp &&
114         create_files 5
115 '
116
117 test_expect_success "combine-diff: no order (=tree object order)" '
118         git diff --name-only HEAD HEAD^ HEAD^2 >actual &&
119         test_cmp expect_none actual
120 '
121
122 for i in 1 2
123 do
124         test_expect_success "combine-diff: orderfile using option ($i)" '
125                 git diff -Oorder_file_$i --name-only HEAD HEAD^ HEAD^2 >actual &&
126                 test_cmp expect_$i actual
127         '
128 done
129
130 ### rotate and skip
131
132 test_expect_success 'rotate and skip setup' '
133         >sample1.t &&
134         >sample2.t &&
135         >sample3.t &&
136         >sample4.t &&
137         git add sample[1234].t &&
138         git commit -m "added" sample[1234].t &&
139         echo modified >>sample1.t &&
140         echo modified >>sample2.t &&
141         echo modified >>sample4.t &&
142         git commit -m "updated" sample[1234].t
143 '
144
145 test_expect_success 'diff --rotate-to' '
146         git diff --rotate-to=sample2.t --name-only HEAD^ >actual &&
147         test_write_lines sample2.t sample4.t sample1.t >expect &&
148         test_cmp expect actual
149 '
150
151 test_expect_success 'diff --skip-to' '
152         git diff --skip-to=sample2.t --name-only HEAD^ >actual &&
153         test_write_lines sample2.t sample4.t >expect &&
154         test_cmp expect actual
155 '
156
157 test_expect_success 'diff --rotate/skip-to error condition' '
158         test_must_fail git diff --rotate-to=sample3.t HEAD^ &&
159         test_must_fail git diff --skip-to=sample3.t HEAD^
160 '
161
162 test_expect_success 'log --rotate-to' '
163         git log --rotate-to=sample3.t --raw HEAD~2.. >raw &&
164         # just distill the commit header and paths
165         sed -n -e "s/^commit.*/commit/p" \
166                -e "/^:/s/^.*    //p" raw >actual &&
167
168         cat >expect <<-\EOF &&
169         commit
170         sample4.t
171         sample1.t
172         sample2.t
173         commit
174         sample3.t
175         sample4.t
176         sample1.t
177         sample2.t
178         EOF
179
180         test_cmp expect actual
181 '
182
183 test_expect_success 'log --skip-to' '
184         git log --skip-to=sample3.t --raw HEAD~2.. >raw &&
185         # just distill the commit header and paths
186         sed -n -e "s/^commit.*/commit/p" \
187                -e "/^:/s/^.*    //p" raw >actual &&
188
189         cat >expect <<-\EOF &&
190         commit
191         sample4.t
192         commit
193         sample3.t
194         sample4.t
195         EOF
196
197         test_cmp expect actual
198 '
199
200 test_done