Code

tests: factor out terminal handling from t7006
[git.git] / t / t3507-cherry-pick-conflict.sh
1 #!/bin/sh
3 test_description='test cherry-pick and revert with conflicts
5   -
6   + picked: rewrites foo to c
7   + base: rewrites foo to b
8   + initial: writes foo as a, unrelated as unrelated
10 '
12 . ./test-lib.sh
14 test_expect_success setup '
16         echo unrelated >unrelated &&
17         git add unrelated &&
18         test_commit initial foo a &&
19         test_commit base foo b &&
20         test_commit picked foo c &&
21         git config advice.detachedhead false
23 '
25 test_expect_success 'failed cherry-pick does not advance HEAD' '
27         git checkout -f initial^0 &&
28         git read-tree -u --reset HEAD &&
29         git clean -d -f -f -q -x &&
31         git update-index --refresh &&
32         git diff-index --exit-code HEAD &&
34         head=$(git rev-parse HEAD) &&
35         test_must_fail git cherry-pick picked &&
36         newhead=$(git rev-parse HEAD) &&
38         test "$head" = "$newhead"
39 '
41 test_expect_success 'advice from failed cherry-pick' "
42         git checkout -f initial^0 &&
43         git read-tree -u --reset HEAD &&
44         git clean -d -f -f -q -x &&
46         git update-index --refresh &&
47         git diff-index --exit-code HEAD &&
49         picked=\$(git rev-parse --short picked) &&
50         cat <<-EOF >expected &&
51         error: could not apply \$picked... picked
52         hint: after resolving the conflicts, mark the corrected paths
53         hint: with 'git add <paths>' or 'git rm <paths>'
54         hint: and commit the result with 'git commit -c \$picked'
55         EOF
56         test_must_fail git cherry-pick picked 2>actual &&
58         test_cmp expected actual
59 "
61 test_expect_success 'failed cherry-pick produces dirty index' '
63         git checkout -f initial^0 &&
64         git read-tree -u --reset HEAD &&
65         git clean -d -f -f -q -x &&
67         git update-index --refresh &&
68         git diff-index --exit-code HEAD &&
70         test_must_fail git cherry-pick picked &&
72         test_must_fail git update-index --refresh -q &&
73         test_must_fail git diff-index --exit-code HEAD
74 '
76 test_expect_success 'failed cherry-pick registers participants in index' '
78         git read-tree -u --reset HEAD &&
79         git clean -d -f -f -q -x &&
80         {
81                 git checkout base -- foo &&
82                 git ls-files --stage foo &&
83                 git checkout initial -- foo &&
84                 git ls-files --stage foo &&
85                 git checkout picked -- foo &&
86                 git ls-files --stage foo
87         } > stages &&
88         sed "
89                 1 s/ 0  / 1     /
90                 2 s/ 0  / 2     /
91                 3 s/ 0  / 3     /
92         " < stages > expected &&
93         git checkout -f initial^0 &&
95         git update-index --refresh &&
96         git diff-index --exit-code HEAD &&
98         test_must_fail git cherry-pick picked &&
99         git ls-files --stage --unmerged > actual &&
101         test_cmp expected actual
104 test_expect_success 'failed cherry-pick describes conflict in work tree' '
106         git checkout -f initial^0 &&
107         git read-tree -u --reset HEAD &&
108         git clean -d -f -f -q -x &&
109         cat <<-EOF > expected &&
110         <<<<<<< HEAD
111         a
112         =======
113         c
114         >>>>>>> objid picked
115         EOF
117         git update-index --refresh &&
118         git diff-index --exit-code HEAD &&
120         test_must_fail git cherry-pick picked &&
122         sed "s/[a-f0-9]*\.\.\./objid/" foo > actual &&
123         test_cmp expected actual
126 test_expect_success 'diff3 -m style' '
128         git config merge.conflictstyle diff3 &&
129         git checkout -f initial^0 &&
130         git read-tree -u --reset HEAD &&
131         git clean -d -f -f -q -x &&
132         cat <<-EOF > expected &&
133         <<<<<<< HEAD
134         a
135         ||||||| parent of objid picked
136         b
137         =======
138         c
139         >>>>>>> objid picked
140         EOF
142         git update-index --refresh &&
143         git diff-index --exit-code HEAD &&
145         test_must_fail git cherry-pick picked &&
147         sed "s/[a-f0-9]*\.\.\./objid/" foo > actual &&
148         test_cmp expected actual
151 test_expect_success 'revert also handles conflicts sanely' '
153         git config --unset merge.conflictstyle &&
154         git read-tree -u --reset HEAD &&
155         git clean -d -f -f -q -x &&
156         cat <<-EOF > expected &&
157         <<<<<<< HEAD
158         a
159         =======
160         b
161         >>>>>>> parent of objid picked
162         EOF
163         {
164                 git checkout picked -- foo &&
165                 git ls-files --stage foo &&
166                 git checkout initial -- foo &&
167                 git ls-files --stage foo &&
168                 git checkout base -- foo &&
169                 git ls-files --stage foo
170         } > stages &&
171         sed "
172                 1 s/ 0  / 1     /
173                 2 s/ 0  / 2     /
174                 3 s/ 0  / 3     /
175         " < stages > expected-stages &&
176         git checkout -f initial^0 &&
178         git update-index --refresh &&
179         git diff-index --exit-code HEAD &&
181         head=$(git rev-parse HEAD) &&
182         test_must_fail git revert picked &&
183         newhead=$(git rev-parse HEAD) &&
184         git ls-files --stage --unmerged > actual-stages &&
186         test "$head" = "$newhead" &&
187         test_must_fail git update-index --refresh -q &&
188         test_must_fail git diff-index --exit-code HEAD &&
189         test_cmp expected-stages actual-stages &&
190         sed "s/[a-f0-9]*\.\.\./objid/" foo > actual &&
191         test_cmp expected actual
194 test_expect_success 'revert conflict, diff3 -m style' '
195         git config merge.conflictstyle diff3 &&
196         git checkout -f initial^0 &&
197         git read-tree -u --reset HEAD &&
198         git clean -d -f -f -q -x &&
199         cat <<-EOF > expected &&
200         <<<<<<< HEAD
201         a
202         ||||||| objid picked
203         c
204         =======
205         b
206         >>>>>>> parent of objid picked
207         EOF
209         git update-index --refresh &&
210         git diff-index --exit-code HEAD &&
212         test_must_fail git revert picked &&
214         sed "s/[a-f0-9]*\.\.\./objid/" foo > actual &&
215         test_cmp expected actual
218 test_done