]>
Commit | Line | Data |
---|---|---|
ed93b449 JH |
1 | #!/bin/sh |
2 | ||
3 | test_description='read-tree -m -u checks working tree files' | |
4 | ||
5 | . ./test-lib.sh | |
ea5070c9 | 6 | . "$TEST_DIRECTORY"/lib-read-tree.sh |
ed93b449 JH |
7 | |
8 | # two-tree test | |
9 | ||
10 | test_expect_success 'two-way setup' ' | |
11 | ||
f8a9d428 | 12 | mkdir subdir && |
ed93b449 JH |
13 | echo >file1 file one && |
14 | echo >file2 file two && | |
f8a9d428 JH |
15 | echo >subdir/file1 file one in subdirectory && |
16 | echo >subdir/file2 file two in subdirectory && | |
17 | git update-index --add file1 file2 subdir/file1 subdir/file2 && | |
ed93b449 JH |
18 | git commit -m initial && |
19 | ||
20 | git branch side && | |
21 | git tag -f branch-point && | |
22 | ||
23 | echo file2 is not tracked on the master anymore && | |
f8a9d428 JH |
24 | rm -f file2 subdir/file2 && |
25 | git update-index --remove file2 subdir/file2 && | |
26 | git commit -a -m "master removes file2 and subdir/file2" | |
ed93b449 JH |
27 | ' |
28 | ||
29 | test_expect_success 'two-way not clobbering' ' | |
30 | ||
31 | echo >file2 master creates untracked file2 && | |
f8a9d428 | 32 | echo >subdir/file2 master creates untracked subdir/file2 && |
77317c0c | 33 | if err=$(read_tree_u_must_succeed -m -u master side 2>&1) |
ed93b449 JH |
34 | then |
35 | echo should have complained | |
36 | false | |
37 | else | |
38 | echo "happy to see $err" | |
39 | fi | |
40 | ' | |
41 | ||
f8a9d428 JH |
42 | echo file2 >.gitignore |
43 | ||
44 | test_expect_success 'two-way with incorrect --exclude-per-directory (1)' ' | |
45 | ||
77317c0c | 46 | if err=$(read_tree_u_must_succeed -m --exclude-per-directory=.gitignore master side 2>&1) |
f8a9d428 JH |
47 | then |
48 | echo should have complained | |
49 | false | |
50 | else | |
51 | echo "happy to see $err" | |
52 | fi | |
53 | ' | |
54 | ||
55 | test_expect_success 'two-way with incorrect --exclude-per-directory (2)' ' | |
56 | ||
77317c0c | 57 | if err=$(read_tree_u_must_succeed -m -u --exclude-per-directory=foo --exclude-per-directory=.gitignore master side 2>&1) |
f8a9d428 JH |
58 | then |
59 | echo should have complained | |
60 | false | |
61 | else | |
62 | echo "happy to see $err" | |
63 | fi | |
64 | ' | |
65 | ||
66 | test_expect_success 'two-way clobbering a ignored file' ' | |
67 | ||
ea5070c9 | 68 | read_tree_u_must_succeed -m -u --exclude-per-directory=.gitignore master side |
f8a9d428 JH |
69 | ' |
70 | ||
71 | rm -f .gitignore | |
72 | ||
ed93b449 JH |
73 | # three-tree test |
74 | ||
f8a9d428 | 75 | test_expect_success 'three-way not complaining on an untracked path in both' ' |
ed93b449 | 76 | |
f8a9d428 | 77 | rm -f file2 subdir/file2 && |
ed93b449 JH |
78 | git checkout side && |
79 | echo >file3 file three && | |
f8a9d428 JH |
80 | echo >subdir/file3 file three && |
81 | git update-index --add file3 subdir/file3 && | |
82 | git commit -a -m "side adds file3 and removes file2" && | |
ed93b449 JH |
83 | |
84 | git checkout master && | |
85 | echo >file2 file two is untracked on the master side && | |
f8a9d428 | 86 | echo >subdir/file2 file two is untracked on the master side && |
ed93b449 | 87 | |
ea5070c9 | 88 | read_tree_u_must_succeed -m -u branch-point master side |
ed93b449 JH |
89 | ' |
90 | ||
3dff5379 | 91 | test_expect_success 'three-way not clobbering a working tree file' ' |
f8a9d428 JH |
92 | |
93 | git reset --hard && | |
94 | rm -f file2 subdir/file2 file3 subdir/file3 && | |
95 | git checkout master && | |
96 | echo >file3 file three created in master, untracked && | |
97 | echo >subdir/file3 file three created in master, untracked && | |
77317c0c | 98 | if err=$(read_tree_u_must_succeed -m -u branch-point master side 2>&1) |
f8a9d428 JH |
99 | then |
100 | echo should have complained | |
101 | false | |
102 | else | |
103 | echo "happy to see $err" | |
104 | fi | |
105 | ' | |
106 | ||
107 | echo >.gitignore file3 | |
108 | ||
109 | test_expect_success 'three-way not complaining on an untracked file' ' | |
110 | ||
111 | git reset --hard && | |
112 | rm -f file2 subdir/file2 file3 subdir/file3 && | |
113 | git checkout master && | |
114 | echo >file3 file three created in master, untracked && | |
115 | echo >subdir/file3 file three created in master, untracked && | |
116 | ||
ea5070c9 | 117 | read_tree_u_must_succeed -m -u --exclude-per-directory=.gitignore branch-point master side |
f8a9d428 JH |
118 | ' |
119 | ||
7f8ab8dc LT |
120 | test_expect_success '3-way not overwriting local changes (setup)' ' |
121 | ||
122 | git reset --hard && | |
123 | git checkout -b side-a branch-point && | |
124 | echo >>file1 "new line to be kept in the merge result" && | |
125 | git commit -a -m "side-a changes file1" && | |
126 | git checkout -b side-b branch-point && | |
127 | echo >>file2 "new line to be kept in the merge result" && | |
128 | git commit -a -m "side-b changes file2" && | |
129 | git checkout side-a | |
130 | ||
131 | ' | |
132 | ||
133 | test_expect_success '3-way not overwriting local changes (our side)' ' | |
134 | ||
135 | # At this point, file1 from side-a should be kept as side-b | |
136 | # did not touch it. | |
137 | ||
138 | git reset --hard && | |
139 | ||
140 | echo >>file1 "local changes" && | |
ea5070c9 | 141 | read_tree_u_must_succeed -m -u branch-point side-a side-b && |
7f8ab8dc LT |
142 | grep "new line to be kept" file1 && |
143 | grep "local changes" file1 | |
144 | ||
145 | ' | |
146 | ||
147 | test_expect_success '3-way not overwriting local changes (their side)' ' | |
148 | ||
149 | # At this point, file2 from side-b should be taken as side-a | |
150 | # did not touch it. | |
151 | ||
152 | git reset --hard && | |
153 | ||
154 | echo >>file2 "local changes" && | |
ea5070c9 | 155 | read_tree_u_must_fail -m -u branch-point side-a side-b && |
7f8ab8dc LT |
156 | ! grep "new line to be kept" file2 && |
157 | grep "local changes" file2 | |
158 | ||
159 | ' | |
160 | ||
889c6f0e | 161 | test_expect_success 'funny symlink in work tree' ' |
8a785dc9 JH |
162 | |
163 | git reset --hard && | |
164 | git checkout -b sym-b side-b && | |
165 | mkdir -p a && | |
166 | >a/b && | |
167 | git add a/b && | |
168 | git commit -m "side adds a/b" && | |
169 | ||
170 | rm -fr a && | |
171 | git checkout -b sym-a side-a && | |
172 | mkdir -p a && | |
889c6f0e | 173 | test_ln_s_add ../b a/b && |
8a785dc9 JH |
174 | git commit -m "we add a/b" && |
175 | ||
ea5070c9 | 176 | read_tree_u_must_succeed -m -u sym-a sym-a sym-b |
8a785dc9 JH |
177 | |
178 | ' | |
179 | ||
889c6f0e | 180 | test_expect_success SANITY 'funny symlink in work tree, un-unlink-able' ' |
8a785dc9 | 181 | |
03771425 JH |
182 | test_when_finished "chmod u+w a 2>/dev/null; rm -fr a b" && |
183 | ||
8a785dc9 JH |
184 | rm -fr a b && |
185 | git reset --hard && | |
186 | ||
187 | git checkout sym-a && | |
188 | chmod a-w a && | |
189 | test_must_fail git read-tree -m -u sym-a sym-a sym-b | |
190 | ||
191 | ' | |
192 | ||
29dc1331 JH |
193 | test_expect_success 'D/F setup' ' |
194 | ||
195 | git reset --hard && | |
196 | ||
197 | git checkout side-a && | |
198 | rm -f subdir/file2 && | |
199 | mkdir subdir/file2 && | |
200 | echo qfwfq >subdir/file2/another && | |
201 | git add subdir/file2/another && | |
202 | test_tick && | |
203 | git commit -m "side-a changes file2 to directory" | |
204 | ||
205 | ' | |
206 | ||
207 | test_expect_success 'D/F' ' | |
208 | ||
209 | git checkout side-b && | |
ea5070c9 | 210 | read_tree_u_must_succeed -m -u branch-point side-b side-a && |
29dc1331 JH |
211 | git ls-files -u >actual && |
212 | ( | |
f2deabfc ES |
213 | a=$(git rev-parse branch-point:subdir/file2) && |
214 | b=$(git rev-parse side-a:subdir/file2/another) && | |
215 | echo "100644 $a 1 subdir/file2" && | |
216 | echo "100644 $a 2 subdir/file2" && | |
29dc1331 JH |
217 | echo "100644 $b 3 subdir/file2/another" |
218 | ) >expect && | |
9c5b2fab | 219 | test_cmp expect actual |
29dc1331 JH |
220 | |
221 | ' | |
222 | ||
223 | test_expect_success 'D/F resolve' ' | |
224 | ||
225 | git reset --hard && | |
226 | git checkout side-b && | |
227 | git merge-resolve branch-point -- side-b side-a | |
228 | ||
229 | ' | |
230 | ||
231 | test_expect_success 'D/F recursive' ' | |
232 | ||
233 | git reset --hard && | |
234 | git checkout side-b && | |
235 | git merge-recursive branch-point -- side-b side-a | |
236 | ||
237 | ' | |
238 | ||
ed93b449 | 239 | test_done |