@matheusbsbs / matheus-bagliano / commits / 6a843348ab
Fork 0

tests: document cherry-pick behavior in face of conflicts

We are about to change the format of the conflict hunks that cherry-pick and revert write. Add tests checking the current behavior first. Signed-off-by: Jonathan Nieder <jrnieder@gmail.com> Signed-off-by: Junio C Hamano <gitster@pobox.com>

Jonathan Nieder committed Mar 20, 2010 at 19:28 UTC 6a843348ab08e7c701ac2343ffbe2d11ecb7ebab
1 file changed +198
t/t3507-cherry-pick-conflict.sh new
+198
@@ -0,0 +1,198 @@
1 +#!/bin/sh
2 +
3 +test_description='test cherry-pick and revert with conflicts
4 +
5 + -
6 + + picked: rewrites foo to c
7 + + base: rewrites foo to b
8 + + initial: writes foo as a, unrelated as unrelated
9 +
10 +'
11 +
12 +. ./test-lib.sh
13 +
14 +test_expect_success setup '
15 +
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
22 +
23 +'
24 +
25 +test_expect_success 'failed cherry-pick does not advance HEAD' '
26 +
27 + git checkout -f initial^0 &&
28 + git read-tree -u --reset HEAD &&
29 + git clean -d -f -f -q -x &&
30 +
31 + git update-index --refresh &&
32 + git diff-index --exit-code HEAD &&
33 +
34 + head=$(git rev-parse HEAD) &&
35 + test_must_fail git cherry-pick picked &&
36 + newhead=$(git rev-parse HEAD) &&
37 +
38 + test "$head" = "$newhead"
39 +'
40 +
41 +test_expect_success 'failed cherry-pick produces dirty index' '
42 +
43 + git checkout -f initial^0 &&
44 + git read-tree -u --reset HEAD &&
45 + git clean -d -f -f -q -x &&
46 +
47 + git update-index --refresh &&
48 + git diff-index --exit-code HEAD &&
49 +
50 + test_must_fail git cherry-pick picked &&
51 +
52 + test_must_fail git update-index --refresh -q &&
53 + test_must_fail git diff-index --exit-code HEAD
54 +'
55 +
56 +test_expect_success 'failed cherry-pick registers participants in index' '
57 +
58 + git read-tree -u --reset HEAD &&
59 + git clean -d -f -f -q -x &&
60 + {
61 + git checkout base -- foo &&
62 + git ls-files --stage foo &&
63 + git checkout initial -- foo &&
64 + git ls-files --stage foo &&
65 + git checkout picked -- foo &&
66 + git ls-files --stage foo
67 + } > stages &&
68 + sed "
69 + 1 s/ 0 / 1 /
70 + 2 s/ 0 / 2 /
71 + 3 s/ 0 / 3 /
72 + " < stages > expected &&
73 + git checkout -f initial^0 &&
74 +
75 + git update-index --refresh &&
76 + git diff-index --exit-code HEAD &&
77 +
78 + test_must_fail git cherry-pick picked &&
79 + git ls-files --stage --unmerged > actual &&
80 +
81 + test_cmp expected actual
82 +'
83 +
84 +test_expect_success 'failed cherry-pick describes conflict in work tree' '
85 +
86 + git checkout -f initial^0 &&
87 + git read-tree -u --reset HEAD &&
88 + git clean -d -f -f -q -x &&
89 + cat <<-EOF > expected &&
90 + <<<<<<< HEAD
91 + a
92 + =======
93 + c
94 + >>>>>>> objid picked
95 + EOF
96 +
97 + git update-index --refresh &&
98 + git diff-index --exit-code HEAD &&
99 +
100 + test_must_fail git cherry-pick picked &&
101 +
102 + sed "s/[a-f0-9]*\.\.\./objid/" foo > actual &&
103 + test_cmp expected actual
104 +'
105 +
106 +test_expect_success 'diff3 -m style' '
107 +
108 + git config merge.conflictstyle diff3 &&
109 + git checkout -f initial^0 &&
110 + git read-tree -u --reset HEAD &&
111 + git clean -d -f -f -q -x &&
112 + cat <<-EOF > expected &&
113 + <<<<<<< HEAD
114 + a
115 + |||||||
116 + b
117 + =======
118 + c
119 + >>>>>>> objid picked
120 + EOF
121 +
122 + git update-index --refresh &&
123 + git diff-index --exit-code HEAD &&
124 +
125 + test_must_fail git cherry-pick picked &&
126 +
127 + sed "s/[a-f0-9]*\.\.\./objid/" foo > actual &&
128 + test_cmp expected actual
129 +'
130 +
131 +test_expect_success 'revert also handles conflicts sanely' '
132 +
133 + git config --unset merge.conflictstyle &&
134 + git read-tree -u --reset HEAD &&
135 + git clean -d -f -f -q -x &&
136 + cat <<-EOF > expected &&
137 + <<<<<<< HEAD
138 + a
139 + =======
140 + b
141 + >>>>>>> objid picked
142 + EOF
143 + {
144 + git checkout picked -- foo &&
145 + git ls-files --stage foo &&
146 + git checkout initial -- foo &&
147 + git ls-files --stage foo &&
148 + git checkout base -- foo &&
149 + git ls-files --stage foo
150 + } > stages &&
151 + sed "
152 + 1 s/ 0 / 1 /
153 + 2 s/ 0 / 2 /
154 + 3 s/ 0 / 3 /
155 + " < stages > expected-stages &&
156 + git checkout -f initial^0 &&
157 +
158 + git update-index --refresh &&
159 + git diff-index --exit-code HEAD &&
160 +
161 + head=$(git rev-parse HEAD) &&
162 + test_must_fail git revert picked &&
163 + newhead=$(git rev-parse HEAD) &&
164 + git ls-files --stage --unmerged > actual-stages &&
165 +
166 + test "$head" = "$newhead" &&
167 + test_must_fail git update-index --refresh -q &&
168 + test_must_fail git diff-index --exit-code HEAD &&
169 + test_cmp expected-stages actual-stages &&
170 + sed "s/[a-f0-9]*\.\.\./objid/" foo > actual &&
171 + test_cmp expected actual
172 +'
173 +
174 +test_expect_success 'revert conflict, diff3 -m style' '
175 + git config merge.conflictstyle diff3 &&
176 + git checkout -f initial^0 &&
177 + git read-tree -u --reset HEAD &&
178 + git clean -d -f -f -q -x &&
179 + cat <<-EOF > expected &&
180 + <<<<<<< HEAD
181 + a
182 + |||||||
183 + c
184 + =======
185 + b
186 + >>>>>>> objid picked
187 + EOF
188 +
189 + git update-index --refresh &&
190 + git diff-index --exit-code HEAD &&
191 +
192 + test_must_fail git revert picked &&
193 +
194 + sed "s/[a-f0-9]*\.\.\./objid/" foo > actual &&
195 + test_cmp expected actual
196 +'
197 +
198 +test_done