]>
Commit | Line | Data |
---|---|---|
1 | #!/bin/sh | |
2 | ||
3 | test_description='read-tree -m -u checks working tree files' | |
4 | ||
5 | . ./test-lib.sh | |
6 | . "$TEST_DIRECTORY"/lib-read-tree.sh | |
7 | ||
8 | # two-tree test | |
9 | ||
10 | test_expect_success 'two-way setup' ' | |
11 | ||
12 | mkdir subdir && | |
13 | echo >file1 file one && | |
14 | echo >file2 file two && | |
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 && | |
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 && | |
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" | |
27 | ' | |
28 | ||
29 | test_expect_success 'two-way not clobbering' ' | |
30 | ||
31 | echo >file2 master creates untracked file2 && | |
32 | echo >subdir/file2 master creates untracked subdir/file2 && | |
33 | if err=$(read_tree_u_must_succeed -m -u master side 2>&1) | |
34 | then | |
35 | echo should have complained | |
36 | false | |
37 | else | |
38 | echo "happy to see $err" | |
39 | fi | |
40 | ' | |
41 | ||
42 | echo file2 >.gitignore | |
43 | ||
44 | test_expect_success 'two-way with incorrect --exclude-per-directory (1)' ' | |
45 | ||
46 | if err=$(read_tree_u_must_succeed -m --exclude-per-directory=.gitignore master side 2>&1) | |
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 | ||
57 | if err=$(read_tree_u_must_succeed -m -u --exclude-per-directory=foo --exclude-per-directory=.gitignore master side 2>&1) | |
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 | ||
68 | read_tree_u_must_succeed -m -u --exclude-per-directory=.gitignore master side | |
69 | ' | |
70 | ||
71 | rm -f .gitignore | |
72 | ||
73 | # three-tree test | |
74 | ||
75 | test_expect_success 'three-way not complaining on an untracked path in both' ' | |
76 | ||
77 | rm -f file2 subdir/file2 && | |
78 | git checkout side && | |
79 | echo >file3 file three && | |
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" && | |
83 | ||
84 | git checkout master && | |
85 | echo >file2 file two is untracked on the master side && | |
86 | echo >subdir/file2 file two is untracked on the master side && | |
87 | ||
88 | read_tree_u_must_succeed -m -u branch-point master side | |
89 | ' | |
90 | ||
91 | test_expect_success 'three-way not clobbering a working tree file' ' | |
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 && | |
98 | if err=$(read_tree_u_must_succeed -m -u branch-point master side 2>&1) | |
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 | ||
117 | read_tree_u_must_succeed -m -u --exclude-per-directory=.gitignore branch-point master side | |
118 | ' | |
119 | ||
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" && | |
141 | read_tree_u_must_succeed -m -u branch-point side-a side-b && | |
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" && | |
155 | read_tree_u_must_fail -m -u branch-point side-a side-b && | |
156 | ! grep "new line to be kept" file2 && | |
157 | grep "local changes" file2 | |
158 | ||
159 | ' | |
160 | ||
161 | test_expect_success 'funny symlink in work tree' ' | |
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 && | |
173 | test_ln_s_add ../b a/b && | |
174 | git commit -m "we add a/b" && | |
175 | ||
176 | read_tree_u_must_succeed -m -u sym-a sym-a sym-b | |
177 | ||
178 | ' | |
179 | ||
180 | test_expect_success SANITY 'funny symlink in work tree, un-unlink-able' ' | |
181 | ||
182 | test_when_finished "chmod u+w a 2>/dev/null; rm -fr a b" && | |
183 | ||
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 | ||
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 && | |
210 | read_tree_u_must_succeed -m -u branch-point side-b side-a && | |
211 | git ls-files -u >actual && | |
212 | ( | |
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" && | |
217 | echo "100644 $b 3 subdir/file2/another" | |
218 | ) >expect && | |
219 | test_cmp expect actual | |
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 | ||
239 | test_done |