]>
Commit | Line | Data |
---|---|---|
4f4a6cb9 JH |
1 | #!/bin/sh |
2 | ||
3 | test_description='git apply --3way' | |
4 | ||
5 | . ./test-lib.sh | |
6 | ||
7 | create_file () { | |
8 | for i | |
9 | do | |
10 | echo "$i" | |
11 | done | |
12 | } | |
13 | ||
14 | sanitize_conflicted_diff () { | |
15 | sed -e ' | |
16 | /^index /d | |
17 | s/^\(+[<>][<>][<>][<>]*\) .*/\1/ | |
18 | ' | |
19 | } | |
20 | ||
21 | test_expect_success setup ' | |
22 | test_tick && | |
23 | create_file >one 1 2 3 4 5 6 7 && | |
24 | cat one >two && | |
25 | git add one two && | |
26 | git commit -m initial && | |
27 | ||
28 | git branch side && | |
29 | ||
30 | test_tick && | |
31 | create_file >one 1 two 3 4 5 six 7 && | |
32 | create_file >two 1 two 3 4 5 6 7 && | |
33 | git commit -a -m master && | |
34 | ||
35 | git checkout side && | |
36 | create_file >one 1 2 3 4 five 6 7 && | |
37 | create_file >two 1 2 3 4 five 6 7 && | |
38 | git commit -a -m side && | |
39 | ||
40 | git checkout master | |
41 | ' | |
42 | ||
43 | test_expect_success 'apply without --3way' ' | |
44 | git diff side^ side >P.diff && | |
45 | ||
46 | # should fail to apply | |
47 | git reset --hard && | |
48 | git checkout master^0 && | |
49 | test_must_fail git apply --index P.diff && | |
50 | # should leave things intact | |
51 | git diff-files --exit-code && | |
52 | git diff-index --exit-code --cached HEAD | |
53 | ' | |
54 | ||
55 | test_expect_success 'apply with --3way' ' | |
56 | # Merging side should be similar to applying this patch | |
57 | git diff ...side >P.diff && | |
58 | ||
59 | # The corresponding conflicted merge | |
60 | git reset --hard && | |
61 | git checkout master^0 && | |
62 | test_must_fail git merge --no-commit side && | |
63 | git ls-files -s >expect.ls && | |
64 | git diff HEAD | sanitize_conflicted_diff >expect.diff && | |
65 | ||
66 | # should fail to apply | |
67 | git reset --hard && | |
68 | git checkout master^0 && | |
69 | test_must_fail git apply --index --3way P.diff && | |
70 | git ls-files -s >actual.ls && | |
71 | git diff HEAD | sanitize_conflicted_diff >actual.diff && | |
72 | ||
73 | # The result should resemble the corresponding merge | |
74 | test_cmp expect.ls actual.ls && | |
75 | test_cmp expect.diff actual.diff | |
76 | ' | |
77 | ||
f2633ebd JH |
78 | test_expect_success 'apply with --3way with rerere enabled' ' |
79 | git config rerere.enabled true && | |
80 | ||
81 | # Merging side should be similar to applying this patch | |
82 | git diff ...side >P.diff && | |
83 | ||
84 | # The corresponding conflicted merge | |
85 | git reset --hard && | |
86 | git checkout master^0 && | |
87 | test_must_fail git merge --no-commit side && | |
88 | ||
89 | # Manually resolve and record the resolution | |
90 | create_file 1 two 3 4 five six 7 >one && | |
91 | git rerere && | |
92 | cat one >expect && | |
93 | ||
94 | # should fail to apply | |
95 | git reset --hard && | |
96 | git checkout master^0 && | |
97 | test_must_fail git apply --index --3way P.diff && | |
98 | ||
99 | # but rerere should have replayed the recorded resolution | |
100 | test_cmp expect one | |
101 | ' | |
102 | ||
fdac5089 JH |
103 | test_expect_success 'apply -3 with add/add conflict setup' ' |
104 | git reset --hard && | |
105 | ||
106 | git checkout -b adder && | |
107 | create_file 1 2 3 4 5 6 7 >three && | |
108 | create_file 1 2 3 4 5 6 7 >four && | |
109 | git add three four && | |
110 | git commit -m "add three and four" && | |
111 | ||
112 | git checkout -b another adder^ && | |
113 | create_file 1 2 3 4 5 6 7 >three && | |
114 | create_file 1 2 3 four 5 6 7 >four && | |
115 | git add three four && | |
116 | git commit -m "add three and four" && | |
117 | ||
118 | # Merging another should be similar to applying this patch | |
119 | git diff adder...another >P.diff && | |
120 | ||
121 | git checkout adder^0 && | |
122 | test_must_fail git merge --no-commit another && | |
123 | git ls-files -s >expect.ls && | |
124 | git diff HEAD | sanitize_conflicted_diff >expect.diff | |
125 | ' | |
126 | ||
127 | test_expect_success 'apply -3 with add/add conflict' ' | |
128 | # should fail to apply ... | |
129 | git reset --hard && | |
130 | git checkout adder^0 && | |
131 | test_must_fail git apply --index --3way P.diff && | |
132 | # ... and leave conflicts in the index and in the working tree | |
133 | git ls-files -s >actual.ls && | |
134 | git diff HEAD | sanitize_conflicted_diff >actual.diff && | |
135 | ||
136 | # The result should resemble the corresponding merge | |
137 | test_cmp expect.ls actual.ls && | |
138 | test_cmp expect.diff actual.diff | |
139 | ' | |
140 | ||
141 | test_expect_success 'apply -3 with add/add conflict (dirty working tree)' ' | |
142 | # should fail to apply ... | |
143 | git reset --hard && | |
144 | git checkout adder^0 && | |
145 | echo >>four && | |
146 | cat four >four.save && | |
147 | cat three >three.save && | |
148 | git ls-files -s >expect.ls && | |
149 | test_must_fail git apply --index --3way P.diff && | |
150 | # ... and should not touch anything | |
151 | git ls-files -s >actual.ls && | |
152 | test_cmp expect.ls actual.ls && | |
153 | test_cmp four.save four && | |
154 | test_cmp three.save three | |
155 | ' | |
156 | ||
4f4a6cb9 | 157 | test_done |