1-- Test enforcement of consistent resolutions for drop/modified conflicts.
2--
3-- Only invalid combinations are tested here (we verify a good error
4-- message); valid combinations are tested in
5-- resolve_conflicts_dropped_modified_1.
6--
7-- The left and right conflicts chosen by the user must be consistent;
8-- they must give different names for the two sides.
9--
10-- When one file is in the dropped state, only one resolution can be
11-- specified; that of the modified file.
12--
13-- Rename on both sides is valid, unless the user specifies the same
14-- new name for both; that is tested only once here.
15--
16-- The only inconsistent cases are between modified and recreated
17-- files. A recreated file is detected by having the same name as the
18-- modified file; if the modified file has also been renamed, the
19-- recreated file must have the same name as the renamed file. Thus we
20-- do not need to consider a renamed modified file as a separate case.
21--
22-- Orphaned file resolution cannot be keep or user; those error
23-- messages are tested in resolve_conflicts_dropped_modified_1.
24--
25-- We need to test all invalid combinations of left/right resolution:
26--
27--      left                    right
28-- state    resolution      state       resolution  file    case
29-----------------------------------------------------------
30-- dropped  -               dropped     -           (not a conflict)
31--          -               modified    keep        (valid)
32--          -               modified    rename      (valid)
33--          -               modified    user        (valid)
34--          -               modified    user_rename (valid)
35--          -               recreated   -           (not a conflict)
36--
37-- modified drop            dropped     -           (valid)
38--          keep            dropped     -           (valid)
39--          rename          dropped     -           (valid)
40--          user            dropped     -           (valid)
41--          user_rename     dropped     -           (valid)
42--
43-- modified -               modified    -           (file content conflict)
44--          drop            recreated   drop        (valid)
45--          drop            recreated   keep        (valid)
46--          drop            recreated   rename      (valid)
47--          drop            recreated   user        (valid)
48--          drop            recreated   user_rename (valid)
49--          keep            recreated   drop        (valid)
50--          keep            recreated   keep        file_2  1
51--          keep            recreated   rename      (valid)
52--          keep            recreated   user        file_2  2
53--          keep            recreated   user_rename (valid)
54--          rename          recreated   drop        (valid)
55--          rename          recreated   keep        (valid)
56--          rename          recreated   rename      (valid)
57--          rename          recreated   user        (valid)
58--          rename          recreated   user_rename (valid)
59--          user            recreated   drop        (valid)
60--          user            recreated   keep        file_4  3
61--          user            recreated   rename      (valid)
62--          user            recreated   user        file_4  4
63--          user            recreated   user_rename (valid)
64--          user_rename     recreated   drop        (valid)
65--          user_rename     recreated   keep        (valid)
66--          user_rename     recreated   rename      (valid)
67--          user_rename     recreated   user        (valid)
68--          user_rename     recreated   user_rename (valid)
69--
70-- recreated drop           dropped     -           (valid)
71--           keep           dropped     -           (valid)
72--           rename         dropped     -           (valid)
73--           user           dropped     -           (valid)
74--           user_rename    dropped     -           (valid)
75--           drop           modified    drop        (valid)
76--           drop           modified    keep        (valid)
77--           drop           modified    rename      (valid)
78--           drop           modified    user        (valid)
79--           drop           modified    user_rename (valid)
80--           keep           modified    drop        (valid)
81--           keep           modified    keep        file_3  5
82--           keep           modified    rename      (valid)
83--           keep           modified    user        file_3  6
84--           keep           modified    user_rename (valid)
85--           rename         modified    drop        (valid)
86--           rename         modified    keep        (valid)
87--           rename         modified    rename      (valid)
88--           rename         modified    user        (valid)
89--           rename         modified    user_rename (valid)
90--           user           modified    drop        (valid)
91--           user           modified    keep        file_3  7
92--           user           modified    rename      (valid)
93--           user           modified    user        file_3  8
94--           user           modified    user_rename (valid)
95--           user_rename    modified    drop        (valid)
96--           user_rename    modified    keep        (valid)
97--           user_rename    modified    rename      (valid)
98--           user_rename    modified    user        (valid)
99--           user_rename    modified    user_rename (valid)
100
101mtn_setup()
102
103-- Create the test files
104
105addfile("file_2", "file_2 base") -- modified left, recreated right
106addfile("file_3", "file_3 base") -- recreated left, modified right
107commit("testbranch", "base")
108base = base_revision()
109
110writefile("file_2", "file_2 left")
111check(mtn("drop", "file_3"), 0, false, false)
112commit("testbranch", "left 1a")
113
114addfile("file_3", "file_3 left recreated")
115commit("testbranch", "left 1b")
116left_1 = base_revision()
117
118revert_to(base)
119
120check(mtn("drop", "file_2"), 0, false, false)
121writefile("file_3", "file_3 right")
122commit("testbranch", "right 1a")
123
124addfile("file_2", "file_2 right recreated")
125commit("testbranch", "right 1b")
126right_1 = base_revision()
127
128-- Store and show inconsistency error messages
129check(mtn("conflicts", "store", left_1, right_1), 0, nil, true)
130check(samelines("stderr",
131{"mtn: 2 conflicts with supported resolutions.",
132 "mtn: stored in '_MTN/conflicts'"}))
133
134check(mtn("conflicts", "show_first"), 0, nil, true)
135check(samelines("stderr",
136{"mtn: conflict: file 'file_2'",
137 "mtn: modified on the left",
138 "mtn: dropped and recreated on the right",
139 "mtn: possible resolutions:",
140 "mtn: resolve_first_left drop",
141 "mtn: resolve_first_left rename",
142 "mtn: resolve_first_left user_rename \"new_content_name\" \"new_file_name\"",
143 "mtn: resolve_first_left keep",
144 "mtn: resolve_first_left user \"name\"",
145 "mtn: resolve_first_right drop",
146 "mtn: resolve_first_right rename",
147 "mtn: resolve_first_right user_rename \"new_content_name\" \"new_file_name\"",
148 "mtn: resolve_first_right keep",
149 "mtn: resolve_first_right user \"name\""}))
150
151-- case 1, 2; keep *
152check(mtn("conflicts", "resolve_first_left", "keep"), 0, nil, false)
153
154-- check that inconsistent resolutions for right are not displayed
155check(mtn("conflicts", "show_first"), 0, nil, true)
156check(samelines("stderr",
157{"mtn: conflict: file 'file_2'",
158 "mtn: modified on the left",
159 "mtn: dropped and recreated on the right",
160 "mtn: left_resolution: keep",
161 "mtn: possible resolutions:",
162 "mtn: resolve_first_right drop",
163 "mtn: resolve_first_right rename",
164 "mtn: resolve_first_right user_rename \"new_content_name\" \"new_file_name\""}))
165
166-- check for errors from inconsistent resolutions
167
168-- case 1: keep, keep
169check(mtn("conflicts", "resolve_first_right", "keep"), 1, nil, true)
170check(samelines("stderr",
171{"mtn: misuse: other resolution is keep; specify 'drop', 'rename', or 'user_rename'"}))
172
173-- case 2: keep, user
174check(mtn("conflicts", "resolve_first_right", "user", "_MTN/resolutions/file_2"), 1, nil, true)
175check(samelines("stderr",
176{"mtn: misuse: other resolution is keep; specify 'drop', 'rename', or 'user_rename'"}))
177
178-- case 1, 2, but specify right resolution first
179check(mtn("conflicts", "store", left_1, right_1), 0, nil, true)
180check(mtn("conflicts", "resolve_first_right", "keep"), 0, nil, false)
181check(mtn("conflicts", "show_first"), 0, nil, true)
182check(samelines("stderr",
183{"mtn: conflict: file 'file_2'",
184 "mtn: modified on the left",
185 "mtn: dropped and recreated on the right",
186 "mtn: right_resolution: keep",
187 "mtn: possible resolutions:",
188 "mtn: resolve_first_left drop",
189 "mtn: resolve_first_left rename",
190 "mtn: resolve_first_left user_rename \"new_content_name\" \"new_file_name\""}))
191check(mtn("conflicts", "resolve_first_left", "keep"), 1, nil, true)
192check(samelines("stderr",
193{"mtn: misuse: other resolution is keep; specify 'drop', 'rename', or 'user_rename'"}))
194
195-- No error if specify right again, but it actually sets file_3 right resolution. so we have to reset
196check(mtn("conflicts", "store", left_1, right_1), 0, nil, true)
197check(mtn("conflicts", "resolve_first_right", "user", "_MTN/resolutions/file_2"), 0, nil, false)
198check(mtn("conflicts", "show_first"), 0, nil, true)
199check(qgrep("right_resolution: content_user, content: '_MTN/resolutions/file_2'", "stderr"))
200
201check(mtn("conflicts", "resolve_first_left", "keep"), 1, nil, true)
202check(samelines("stderr",
203{"mtn: misuse: other resolution is content_user; specify 'drop', 'rename', or 'user_rename'"}))
204
205-- provide a valid resolution for file_2 so file_3 is first
206check(mtn("conflicts", "resolve_first_left", "drop"), 0, nil, nil)
207
208-- case 3, 4; user *
209check(mtn("conflicts", "resolve_first_left", "user", "_MTN/resolutions/file_3"), 0, nil, false)
210
211check(mtn("conflicts", "show_first"), 0, nil, true)
212check(samelines("stderr",
213{"mtn: conflict: file 'file_3'",
214 "mtn: dropped and recreated on the left",
215 "mtn: modified on the right",
216 "mtn: left_resolution: content_user, content: '_MTN/resolutions/file_3'",
217 "mtn: possible resolutions:",
218 "mtn: resolve_first_right drop",
219 "mtn: resolve_first_right rename",
220 "mtn: resolve_first_right user_rename \"new_content_name\" \"new_file_name\""}))
221
222-- case 3: user, keep
223check(mtn("conflicts", "resolve_first_right", "keep"), 1, nil, true)
224check(samelines("stderr",
225{"mtn: misuse: other resolution is content_user; specify 'drop', 'rename', or 'user_rename'"}))
226
227-- case 4: user, user
228check(mtn("conflicts", "resolve_first_right", "user", "_MTN/resolutions/file_3"), 1, nil, true)
229check(samelines("stderr",
230{"mtn: misuse: other resolution is content_user; specify 'drop', 'rename', or 'user_rename'"}))
231
232-- specify right first
233check(mtn("conflicts", "store", left_1, right_1), 0, nil, true)
234-- resolve file_2
235check(mtn("conflicts", "resolve_first_left", "keep"), 0, nil, nil)
236check(mtn("conflicts", "resolve_first_right", "drop"), 0, nil, nil)
237
238-- file_3
239check(mtn("conflicts", "resolve_first_right", "keep"), 0, nil, true)
240
241check(mtn("conflicts", "show_first"), 0, nil, true)
242check(samelines("stderr",
243{"mtn: conflict: file 'file_3'",
244 "mtn: dropped and recreated on the left",
245 "mtn: modified on the right",
246 "mtn: right_resolution: keep",
247 "mtn: possible resolutions:",
248 "mtn: resolve_first_left drop",
249 "mtn: resolve_first_left rename",
250 "mtn: resolve_first_left user_rename \"new_content_name\" \"new_file_name\""}))
251check(mtn("conflicts", "resolve_first_left", "user", "_MTN/resolutions/file_3"), 1, nil, true)
252check(samelines("stderr",
253{"mtn: misuse: other resolution is keep; specify 'drop', 'rename', or 'user_rename'"}))
254
255-- reset for case 4 reversed
256check(mtn("conflicts", "store", left_1, right_1), 0, nil, true)
257-- resolve file_2
258check(mtn("conflicts", "resolve_first_left", "keep"), 0, nil, nil)
259check(mtn("conflicts", "resolve_first_right", "drop"), 0, nil, nil)
260
261check(mtn("conflicts", "resolve_first_right", "user", "_MTN/resolutions/file_3"), 0, nil, nil)
262check(mtn("conflicts", "resolve_first_left", "user", "_MTN/resolutions/file_3"), 1, nil, true)
263check(samelines("stderr",
264{"mtn: misuse: other resolution is content_user; specify 'drop', 'rename', or 'user_rename'"}))
265
266-- Test error from user rename both sides to same new name. The error is at merge time.
267check(mtn("conflicts", "store", left_1, right_1), 0, nil, true)
268check(mtn("conflicts", "resolve_first_left", "rename", "file_2_renamed"), 0, nil, nil)
269check(mtn("conflicts", "resolve_first_right", "rename", "file_2_renamed"), 0, nil, nil)
270-- file_3
271check(mtn("conflicts", "resolve_first_left", "drop"), 0, nil, nil)
272check(mtn("conflicts", "resolve_first_right", "drop"), 0, nil, nil)
273check(mtn("explicit_merge", "--resolve-conflicts", left_1, right_1, "testbranch"), 1, nil, true)
274check(qgrep("'file_2_renamed' already exists", "stderr"))
275
276-- end of file
277