1#!/bin/sh
2
3test_description='git rebase + directory rename tests'
4
5. ./test-lib.sh
6. "$TEST_DIRECTORY"/lib-rebase.sh
7
8test_expect_success 'setup testcase where directory rename should be detected' '
9 test_create_repo dir-rename &&
10 (
11 cd dir-rename &&
12
13 mkdir x &&
14 test_seq 1 10 >x/a &&
15 test_seq 11 20 >x/b &&
16 test_seq 21 30 >x/c &&
17 test_write_lines a b c d e f g h i >l &&
18 git add x l &&
19 git commit -m "Initial" &&
20
21 git branch O &&
22 git branch A &&
23 git branch B &&
24
25 git checkout A &&
26 git mv x y &&
27 git mv l letters &&
28 git commit -m "Rename x to y, l to letters" &&
29
30 git checkout B &&
31 echo j >>l &&
32 test_seq 31 40 >x/d &&
33 git add l x/d &&
34 git commit -m "Modify l, add x/d"
35 )
36'
37
38test_expect_success 'rebase --interactive: directory rename detected' '
39 (
40 cd dir-rename &&
41
42 git checkout B^0 &&
43
44 set_fake_editor &&
45 FAKE_LINES="1" git rebase --interactive A &&
46
47 git ls-files -s >out &&
48 test_line_count = 5 out &&
49
50 test_path_is_file y/d &&
51 test_path_is_missing x/d
52 )
53'
54
55test_expect_failure 'rebase (am): directory rename detected' '
56 (
57 cd dir-rename &&
58
59 git checkout B^0 &&
60
61 git rebase A &&
62
63 git ls-files -s >out &&
64 test_line_count = 5 out &&
65
66 test_path_is_file y/d &&
67 test_path_is_missing x/d
68 )
69'
70
71test_expect_success 'rebase --merge: directory rename detected' '
72 (
73 cd dir-rename &&
74
75 git checkout B^0 &&
76
77 git rebase --merge A &&
78
79 git ls-files -s >out &&
80 test_line_count = 5 out &&
81
82 test_path_is_file y/d &&
83 test_path_is_missing x/d
84 )
85'
86
87test_expect_failure 'am: directory rename detected' '
88 (
89 cd dir-rename &&
90
91 git checkout A^0 &&
92
93 git format-patch -1 B &&
94
95 git am --3way 0001*.patch &&
96
97 git ls-files -s >out &&
98 test_line_count = 5 out &&
99
100 test_path_is_file y/d &&
101 test_path_is_missing x/d
102 )
103'
104
105test_expect_success 'setup testcase where directory rename should NOT be detected' '
106 test_create_repo no-dir-rename &&
107 (
108 cd no-dir-rename &&
109
110 mkdir x &&
111 test_seq 1 10 >x/a &&
112 test_seq 11 20 >x/b &&
113 test_seq 21 30 >x/c &&
114 echo original >project_info &&
115 git add x project_info &&
116 git commit -m "Initial" &&
117
118 git branch O &&
119 git branch A &&
120 git branch B &&
121
122 git checkout A &&
123 echo v2 >project_info &&
124 git add project_info &&
125 git commit -m "Modify project_info" &&
126
127 git checkout B &&
128 mkdir y &&
129 git mv x/c y/c &&
130 echo v1 >project_info &&
131 git add project_info &&
132 git commit -m "Rename x/c to y/c, modify project_info"
133 )
134'
135
136test_expect_success 'rebase --interactive: NO directory rename' '
137 test_when_finished "git -C no-dir-rename rebase --abort" &&
138 (
139 cd no-dir-rename &&
140
141 git checkout B^0 &&
142
143 set_fake_editor &&
144 test_must_fail env FAKE_LINES="1" git rebase --interactive A &&
145
146 git ls-files -s >out &&
147 test_line_count = 6 out &&
148
149 test_path_is_file x/a &&
150 test_path_is_file x/b &&
151 test_path_is_missing x/c
152 )
153'
154
155test_expect_success 'rebase (am): NO directory rename' '
156 test_when_finished "git -C no-dir-rename rebase --abort" &&
157 (
158 cd no-dir-rename &&
159
160 git checkout B^0 &&
161
162 set_fake_editor &&
163 test_must_fail git rebase A &&
164
165 git ls-files -s >out &&
166 test_line_count = 6 out &&
167
168 test_path_is_file x/a &&
169 test_path_is_file x/b &&
170 test_path_is_missing x/c
171 )
172'
173
174test_expect_success 'rebase --merge: NO directory rename' '
175 test_when_finished "git -C no-dir-rename rebase --abort" &&
176 (
177 cd no-dir-rename &&
178
179 git checkout B^0 &&
180
181 set_fake_editor &&
182 test_must_fail git rebase --merge A &&
183
184 git ls-files -s >out &&
185 test_line_count = 6 out &&
186
187 test_path_is_file x/a &&
188 test_path_is_file x/b &&
189 test_path_is_missing x/c
190 )
191'
192
193test_expect_success 'am: NO directory rename' '
194 test_when_finished "git -C no-dir-rename am --abort" &&
195 (
196 cd no-dir-rename &&
197
198 git checkout A^0 &&
199
200 git format-patch -1 B &&
201
202 test_must_fail git am --3way 0001*.patch &&
203
204 git ls-files -s >out &&
205 test_line_count = 6 out &&
206
207 test_path_is_file x/a &&
208 test_path_is_file x/b &&
209 test_path_is_missing x/c
210 )
211'
212
213test_done