Merge branch 'hn/refs-trace-backend'
[git] / t / t3401-rebase-and-am-rename.sh
1 #!/bin/sh
2
3 test_description='git rebase + directory rename tests'
4
5 . ./test-lib.sh
6 . "$TEST_DIRECTORY"/lib-rebase.sh
7
8 test_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
38 test_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 -c merge.directoryRenames=true 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
55 test_expect_failure 'rebase --apply: directory rename detected' '
56         (
57                 cd dir-rename &&
58
59                 git checkout B^0 &&
60
61                 git -c merge.directoryRenames=true rebase --apply 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
71 test_expect_success 'rebase --merge: directory rename detected' '
72         (
73                 cd dir-rename &&
74
75                 git checkout B^0 &&
76
77                 git -c merge.directoryRenames=true 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
87 test_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 -c merge.directoryRenames=true 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
105 test_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
136 test_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
155 test_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
174 test_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
193 test_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
213 test_done