Commit | Line | Data |
---|---|---|
35d2fffd JH |
1 | #!/bin/sh |
2 | ||
3 | test_description='test aborting in-progress merges | |
4 | ||
5 | Set up repo with conflicting and non-conflicting branches: | |
6 | ||
7 | There are three files foo/bar/baz, and the following graph illustrates the | |
8 | content of these files in each commit: | |
9 | ||
10 | # foo/bar/baz --- foo/bar/bazz <-- master | |
11 | # \ | |
12 | # --- foo/barf/bazf <-- conflict_branch | |
13 | # \ | |
14 | # --- foo/bart/baz <-- clean_branch | |
15 | ||
16 | Next, test git merge --abort with the following variables: | |
17 | - before/after successful merge (should fail when not in merge context) | |
18 | - with/without conflicts | |
19 | - clean/dirty index before merge | |
20 | - clean/dirty worktree before merge | |
21 | - dirty index before merge matches contents on remote branch | |
22 | - changed/unchanged worktree after merge | |
23 | - changed/unchanged index after merge | |
24 | ' | |
25 | . ./test-lib.sh | |
26 | ||
27 | test_expect_success 'setup' ' | |
28 | # Create the above repo | |
29 | echo foo > foo && | |
30 | echo bar > bar && | |
31 | echo baz > baz && | |
32 | git add foo bar baz && | |
33 | git commit -m initial && | |
34 | echo bazz > baz && | |
35 | git commit -a -m "second" && | |
36 | git checkout -b conflict_branch HEAD^ && | |
37 | echo barf > bar && | |
38 | echo bazf > baz && | |
39 | git commit -a -m "conflict" && | |
40 | git checkout -b clean_branch HEAD^ && | |
41 | echo bart > bar && | |
42 | git commit -a -m "clean" && | |
43 | git checkout master | |
44 | ' | |
45 | ||
46 | pre_merge_head="$(git rev-parse HEAD)" | |
47 | ||
48 | test_expect_success 'fails without MERGE_HEAD (unstarted merge)' ' | |
c9ea118e JH |
49 | test_must_fail git merge --abort 2>output && |
50 | test_i18ngrep MERGE_HEAD output | |
bacec478 ÆAB |
51 | ' |
52 | ||
53 | test_expect_success 'fails without MERGE_HEAD (unstarted merge): .git/MERGE_HEAD sanity' ' | |
35d2fffd JH |
54 | test ! -f .git/MERGE_HEAD && |
55 | test "$pre_merge_head" = "$(git rev-parse HEAD)" | |
56 | ' | |
57 | ||
58 | test_expect_success 'fails without MERGE_HEAD (completed merge)' ' | |
59 | git merge clean_branch && | |
60 | test ! -f .git/MERGE_HEAD && | |
61 | # Merge successfully completed | |
62 | post_merge_head="$(git rev-parse HEAD)" && | |
c9ea118e JH |
63 | test_must_fail git merge --abort 2>output && |
64 | test_i18ngrep MERGE_HEAD output | |
bacec478 ÆAB |
65 | ' |
66 | ||
67 | test_expect_success 'fails without MERGE_HEAD (completed merge): .git/MERGE_HEAD sanity' ' | |
35d2fffd JH |
68 | test ! -f .git/MERGE_HEAD && |
69 | test "$post_merge_head" = "$(git rev-parse HEAD)" | |
70 | ' | |
71 | ||
72 | test_expect_success 'Forget previous merge' ' | |
73 | git reset --hard "$pre_merge_head" | |
74 | ' | |
75 | ||
76 | test_expect_success 'Abort after --no-commit' ' | |
77 | # Redo merge, but stop before creating merge commit | |
78 | git merge --no-commit clean_branch && | |
79 | test -f .git/MERGE_HEAD && | |
80 | # Abort non-conflicting merge | |
81 | git merge --abort && | |
82 | test ! -f .git/MERGE_HEAD && | |
83 | test "$pre_merge_head" = "$(git rev-parse HEAD)" && | |
84 | test -z "$(git diff)" && | |
85 | test -z "$(git diff --staged)" | |
86 | ' | |
87 | ||
88 | test_expect_success 'Abort after conflicts' ' | |
89 | # Create conflicting merge | |
90 | test_must_fail git merge conflict_branch && | |
91 | test -f .git/MERGE_HEAD && | |
92 | # Abort conflicting merge | |
93 | git merge --abort && | |
94 | test ! -f .git/MERGE_HEAD && | |
95 | test "$pre_merge_head" = "$(git rev-parse HEAD)" && | |
96 | test -z "$(git diff)" && | |
97 | test -z "$(git diff --staged)" | |
98 | ' | |
99 | ||
100 | test_expect_success 'Clean merge with dirty index fails' ' | |
101 | echo xyzzy >> foo && | |
102 | git add foo && | |
103 | git diff --staged > expect && | |
104 | test_must_fail git merge clean_branch && | |
105 | test ! -f .git/MERGE_HEAD && | |
106 | test "$pre_merge_head" = "$(git rev-parse HEAD)" && | |
107 | test -z "$(git diff)" && | |
108 | git diff --staged > actual && | |
109 | test_cmp expect actual | |
110 | ' | |
111 | ||
112 | test_expect_success 'Conflicting merge with dirty index fails' ' | |
113 | test_must_fail git merge conflict_branch && | |
114 | test ! -f .git/MERGE_HEAD && | |
115 | test "$pre_merge_head" = "$(git rev-parse HEAD)" && | |
116 | test -z "$(git diff)" && | |
117 | git diff --staged > actual && | |
118 | test_cmp expect actual | |
119 | ' | |
120 | ||
121 | test_expect_success 'Reset index (but preserve worktree changes)' ' | |
122 | git reset "$pre_merge_head" && | |
123 | git diff > actual && | |
124 | test_cmp expect actual | |
125 | ' | |
126 | ||
127 | test_expect_success 'Abort clean merge with non-conflicting dirty worktree' ' | |
128 | git merge --no-commit clean_branch && | |
129 | test -f .git/MERGE_HEAD && | |
130 | # Abort merge | |
131 | git merge --abort && | |
132 | test ! -f .git/MERGE_HEAD && | |
133 | test "$pre_merge_head" = "$(git rev-parse HEAD)" && | |
134 | test -z "$(git diff --staged)" && | |
135 | git diff > actual && | |
136 | test_cmp expect actual | |
137 | ' | |
138 | ||
139 | test_expect_success 'Abort conflicting merge with non-conflicting dirty worktree' ' | |
140 | test_must_fail git merge conflict_branch && | |
141 | test -f .git/MERGE_HEAD && | |
142 | # Abort merge | |
143 | git merge --abort && | |
144 | test ! -f .git/MERGE_HEAD && | |
145 | test "$pre_merge_head" = "$(git rev-parse HEAD)" && | |
146 | test -z "$(git diff --staged)" && | |
147 | git diff > actual && | |
148 | test_cmp expect actual | |
149 | ' | |
150 | ||
151 | test_expect_success 'Reset worktree changes' ' | |
152 | git reset --hard "$pre_merge_head" | |
153 | ' | |
154 | ||
155 | test_expect_success 'Fail clean merge with conflicting dirty worktree' ' | |
156 | echo xyzzy >> bar && | |
157 | git diff > expect && | |
158 | test_must_fail git merge --no-commit clean_branch && | |
159 | test ! -f .git/MERGE_HEAD && | |
160 | test "$pre_merge_head" = "$(git rev-parse HEAD)" && | |
161 | test -z "$(git diff --staged)" && | |
162 | git diff > actual && | |
163 | test_cmp expect actual | |
164 | ' | |
165 | ||
166 | test_expect_success 'Fail conflicting merge with conflicting dirty worktree' ' | |
167 | test_must_fail git merge conflict_branch && | |
168 | test ! -f .git/MERGE_HEAD && | |
169 | test "$pre_merge_head" = "$(git rev-parse HEAD)" && | |
170 | test -z "$(git diff --staged)" && | |
171 | git diff > actual && | |
172 | test_cmp expect actual | |
173 | ' | |
174 | ||
175 | test_expect_success 'Reset worktree changes' ' | |
176 | git reset --hard "$pre_merge_head" | |
177 | ' | |
178 | ||
179 | test_expect_success 'Fail clean merge with matching dirty worktree' ' | |
180 | echo bart > bar && | |
181 | git diff > expect && | |
182 | test_must_fail git merge --no-commit clean_branch && | |
183 | test ! -f .git/MERGE_HEAD && | |
184 | test "$pre_merge_head" = "$(git rev-parse HEAD)" && | |
185 | test -z "$(git diff --staged)" && | |
186 | git diff > actual && | |
187 | test_cmp expect actual | |
188 | ' | |
189 | ||
35d2fffd JH |
190 | test_expect_success 'Fail conflicting merge with matching dirty worktree' ' |
191 | echo barf > bar && | |
192 | git diff > expect && | |
193 | test_must_fail git merge conflict_branch && | |
194 | test ! -f .git/MERGE_HEAD && | |
195 | test "$pre_merge_head" = "$(git rev-parse HEAD)" && | |
196 | test -z "$(git diff --staged)" && | |
197 | git diff > actual && | |
198 | test_cmp expect actual | |
199 | ' | |
200 | ||
35d2fffd | 201 | test_done |