Merge lp:~jelmer/brz/do-merge-conflicts into lp:brz/3.1
- do-merge-conflicts
- Merge into 3.1
Proposed by
Jelmer Vernooij
Status: | Merged |
---|---|
Approved by: | Jelmer Vernooij |
Approved revision: | no longer in the source branch. |
Merge reported by: | The Breezy Bot |
Merged at revision: | not available |
Proposed branch: | lp:~jelmer/brz/do-merge-conflicts |
Merge into: | lp:brz/3.1 |
Diff against target: |
429 lines (+57/-51) 11 files modified
breezy/builtins.py (+2/-2) breezy/bzr/workingtree.py (+3/-3) breezy/git/workingtree.py (+3/-3) breezy/merge.py (+1/-1) breezy/plugins/quilt/tests/test_merge.py (+2/-2) breezy/tests/per_workingtree/test_commit.py (+3/-3) breezy/tests/per_workingtree/test_merge_from_branch.py (+9/-9) breezy/tests/per_workingtree/test_unversion.py (+3/-3) breezy/tests/test_merge.py (+18/-18) breezy/tests/test_merge_core.py (+9/-7) doc/en/release-notes/brz-3.1.txt (+4/-0) |
To merge this branch: | bzr merge lp:~jelmer/brz/do-merge-conflicts |
Related bugs: |
Reviewer | Review Type | Date Requested | Status |
---|---|---|---|
Jelmer Vernooij | Approve | ||
Review via email: mp+399623@code.launchpad.net |
Commit message
Return list of conflicts from merge operations.
Description of the change
Return list of conflicts from merge operations.
To post a comment you must log in.
Revision history for this message
Jelmer Vernooij (jelmer) : | # |
review:
Approve
Revision history for this message
The Breezy Bot (the-breezy-bot) wrote : | # |
Revision history for this message
The Breezy Bot (the-breezy-bot) wrote : | # |
Running landing tests failed
https:/
Preview Diff
[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
1 | === modified file 'breezy/builtins.py' |
2 | --- breezy/builtins.py 2020-08-09 18:44:40 +0000 |
3 | +++ breezy/builtins.py 2021-03-14 22:04:47 +0000 |
4 | @@ -4593,7 +4593,7 @@ |
5 | |
6 | def _do_merge(self, merger, change_reporter, allow_pending, verified): |
7 | merger.change_reporter = change_reporter |
8 | - conflict_count = merger.do_merge() |
9 | + conflict_count = len(merger.do_merge()) |
10 | if allow_pending: |
11 | merger.set_pending() |
12 | if verified == 'failed': |
13 | @@ -4851,7 +4851,7 @@ |
14 | conflicts = merger.do_merge() |
15 | finally: |
16 | tree.set_parent_ids(parents) |
17 | - if conflicts > 0: |
18 | + if len(conflicts) > 0: |
19 | return 1 |
20 | else: |
21 | return 0 |
22 | |
23 | === modified file 'breezy/bzr/workingtree.py' |
24 | --- breezy/bzr/workingtree.py 2020-09-02 15:11:17 +0000 |
25 | +++ breezy/bzr/workingtree.py 2021-03-14 22:04:47 +0000 |
26 | @@ -1937,7 +1937,7 @@ |
27 | # local work is unreferenced and will appear to have been lost. |
28 | # |
29 | with self.lock_tree_write(): |
30 | - nb_conflicts = 0 |
31 | + nb_conflicts = [] |
32 | try: |
33 | last_rev = self.get_parent_ids()[0] |
34 | except IndexError: |
35 | @@ -1958,7 +1958,7 @@ |
36 | show_base=show_base) |
37 | if nb_conflicts: |
38 | self.add_parent_tree((old_tip, other_tree)) |
39 | - return nb_conflicts |
40 | + return len(nb_conflicts) |
41 | |
42 | if last_rev != _mod_revision.ensure_null(revision): |
43 | # the working tree is up to date with the branch |
44 | @@ -2000,7 +2000,7 @@ |
45 | (old_tip, self.branch.repository.revision_tree(old_tip))) |
46 | self.set_parent_trees(parent_trees) |
47 | last_rev = parent_trees[0][0] |
48 | - return nb_conflicts |
49 | + return len(nb_conflicts) |
50 | |
51 | |
52 | class WorkingTreeFormatMetaDir(bzrdir.BzrFormat, WorkingTreeFormat): |
53 | |
54 | === modified file 'breezy/git/workingtree.py' |
55 | --- breezy/git/workingtree.py 2020-09-02 17:42:20 +0000 |
56 | +++ breezy/git/workingtree.py 2021-03-14 22:04:47 +0000 |
57 | @@ -1521,7 +1521,7 @@ |
58 | # |
59 | with self.lock_tree_write(): |
60 | from .. import merge |
61 | - nb_conflicts = 0 |
62 | + nb_conflicts = [] |
63 | try: |
64 | last_rev = self.get_parent_ids()[0] |
65 | except IndexError: |
66 | @@ -1542,7 +1542,7 @@ |
67 | show_base=show_base) |
68 | if nb_conflicts: |
69 | self.add_parent_tree((old_tip, other_tree)) |
70 | - return nb_conflicts |
71 | + return len(nb_conflicts) |
72 | |
73 | if last_rev != _mod_revision.ensure_null(revision): |
74 | to_tree = self.branch.repository.revision_tree(revision) |
75 | @@ -1575,7 +1575,7 @@ |
76 | (old_tip, self.branch.repository.revision_tree(old_tip))) |
77 | self.set_parent_trees(parent_trees) |
78 | last_rev = parent_trees[0][0] |
79 | - return nb_conflicts |
80 | + return len(nb_conflicts) |
81 | |
82 | |
83 | class GitWorkingTreeFormat(workingtree.WorkingTreeFormat): |
84 | |
85 | === modified file 'breezy/merge.py' |
86 | --- breezy/merge.py 2020-08-22 16:32:47 +0000 |
87 | +++ breezy/merge.py 2021-03-14 22:04:47 +0000 |
88 | @@ -670,7 +670,7 @@ |
89 | trace.note(gettext("%d conflicts encountered.") |
90 | % len(merge.cooked_conflicts)) |
91 | |
92 | - return len(merge.cooked_conflicts) |
93 | + return merge.cooked_conflicts |
94 | |
95 | |
96 | class _InventoryNoneEntry(object): |
97 | |
98 | === modified file 'breezy/plugins/quilt/tests/test_merge.py' |
99 | --- breezy/plugins/quilt/tests/test_merge.py 2019-06-16 13:10:54 +0000 |
100 | +++ breezy/plugins/quilt/tests/test_merge.py 2021-03-14 22:04:47 +0000 |
101 | @@ -151,7 +151,7 @@ |
102 | """, "a/debian/patches/patch1") |
103 | # "a" should be unapplied again |
104 | self.assertPathDoesNotExist("a/a") |
105 | - self.assertEquals(1, conflicts) |
106 | + self.assertEquals(1, len(conflicts)) |
107 | |
108 | def test_auto_apply_patches_after_checkout(self): |
109 | self.enable_hooks() |
110 | @@ -288,7 +288,7 @@ |
111 | c |
112 | >>>>>>> MERGE-SOURCE |
113 | """, "a/a") |
114 | - self.assertEquals(2, conflicts) |
115 | + self.assertEquals(2, len(conflicts)) |
116 | |
117 | |
118 | |
119 | |
120 | === modified file 'breezy/tests/per_workingtree/test_commit.py' |
121 | --- breezy/tests/per_workingtree/test_commit.py 2020-08-15 22:46:49 +0000 |
122 | +++ breezy/tests/per_workingtree/test_commit.py 2021-03-14 22:04:47 +0000 |
123 | @@ -101,11 +101,11 @@ |
124 | |
125 | # Merging from A should introduce conflicts because 'n' was modified |
126 | # (in A) and removed (in B), so 'a' needs to be restored. |
127 | - num_conflicts = tree_b.merge_from_branch(tree_a.branch) |
128 | + conflicts = tree_b.merge_from_branch(tree_a.branch) |
129 | if tree_b.has_versioned_directories(): |
130 | - self.assertEqual(3, num_conflicts) |
131 | + self.assertEqual(3, len(conflicts)) |
132 | else: |
133 | - self.assertEqual(2, num_conflicts) |
134 | + self.assertEqual(2, len(conflicts)) |
135 | |
136 | self.assertThat( |
137 | tree_b, HasPathRelations( |
138 | |
139 | === modified file 'breezy/tests/per_workingtree/test_merge_from_branch.py' |
140 | --- breezy/tests/per_workingtree/test_merge_from_branch.py 2020-08-15 22:46:49 +0000 |
141 | +++ breezy/tests/per_workingtree/test_merge_from_branch.py 2021-03-14 22:04:47 +0000 |
142 | @@ -224,9 +224,9 @@ |
143 | outer.commit('delete file3') |
144 | nb_conflicts = outer.merge_from_branch(inner, to_revision=revs[2]) |
145 | if outer.supports_rename_tracking(): |
146 | - self.assertEqual(4, nb_conflicts) |
147 | + self.assertEqual(4, len(nb_conflicts)) |
148 | else: |
149 | - self.assertEqual(1, nb_conflicts) |
150 | + self.assertEqual(1, len(nb_conflicts)) |
151 | self.assertTreeLayout(['dir-outer', |
152 | 'dir-outer/dir', |
153 | 'dir-outer/dir/file1', |
154 | @@ -245,9 +245,9 @@ |
155 | # file4 could not be added to its original root, so it gets added to |
156 | # the new root with a conflict. |
157 | if outer.supports_rename_tracking(): |
158 | - self.assertEqual(1, nb_conflicts) |
159 | + self.assertEqual(1, len(nb_conflicts)) |
160 | else: |
161 | - self.assertEqual(0, nb_conflicts) |
162 | + self.assertEqual(0, len(nb_conflicts)) |
163 | self.assertTreeLayout(['dir-outer', |
164 | 'dir-outer/dir', |
165 | 'dir-outer/dir/file1', |
166 | @@ -261,9 +261,9 @@ |
167 | # 1 conflict, because file4 can't be put into the old root |
168 | nb_conflicts = outer.merge_from_branch(inner, to_revision=revs[3]) |
169 | if outer.supports_rename_tracking(): |
170 | - self.assertEqual(1, nb_conflicts) |
171 | + self.assertEqual(1, len(nb_conflicts)) |
172 | else: |
173 | - self.assertEqual(0, nb_conflicts) |
174 | + self.assertEqual(0, len(nb_conflicts)) |
175 | try: |
176 | outer.set_conflicts([]) |
177 | except errors.UnsupportedOperation: |
178 | @@ -275,7 +275,7 @@ |
179 | # And now file4 gets renamed into an existing dir |
180 | nb_conflicts = outer.merge_from_branch(inner, to_revision=revs[4]) |
181 | if outer.supports_rename_tracking(): |
182 | - self.assertEqual(1, nb_conflicts) |
183 | + self.assertEqual(1, len(nb_conflicts)) |
184 | self.assertTreeLayout(['dir-outer', |
185 | 'dir-outer/dir', |
186 | 'dir-outer/dir/file1', |
187 | @@ -285,9 +285,9 @@ |
188 | outer) |
189 | else: |
190 | if outer.has_versioned_directories(): |
191 | - self.assertEqual(2, nb_conflicts) |
192 | + self.assertEqual(2, len(nb_conflicts)) |
193 | else: |
194 | - self.assertEqual(1, nb_conflicts) |
195 | + self.assertEqual(1, len(nb_conflicts)) |
196 | self.assertTreeLayout(['dir', |
197 | 'dir-outer', |
198 | 'dir-outer/dir', |
199 | |
200 | === modified file 'breezy/tests/per_workingtree/test_unversion.py' |
201 | --- breezy/tests/per_workingtree/test_unversion.py 2020-08-15 17:47:31 +0000 |
202 | +++ breezy/tests/per_workingtree/test_unversion.py 2021-03-14 22:04:47 +0000 |
203 | @@ -175,11 +175,11 @@ |
204 | # Merging from A should introduce conflicts because 'n' was modified |
205 | # and removed, so 'a' needs to be restored. We also have a conflict |
206 | # because 'a' is still an existing directory |
207 | - num_conflicts = tree_b.merge_from_branch(tree_a.branch) |
208 | + conflicts = tree_b.merge_from_branch(tree_a.branch) |
209 | if tree_b.has_versioned_directories(): |
210 | - self.assertEqual(4, num_conflicts) |
211 | + self.assertEqual(4, len(conflicts)) |
212 | else: |
213 | - self.assertEqual(1, num_conflicts) |
214 | + self.assertEqual(1, len(conflicts)) |
215 | |
216 | self.assertThat( |
217 | tree_b, |
218 | |
219 | === modified file 'breezy/tests/test_merge.py' |
220 | --- breezy/tests/test_merge.py 2020-08-22 16:32:47 +0000 |
221 | +++ breezy/tests/test_merge.py 2021-03-14 22:04:47 +0000 |
222 | @@ -435,8 +435,8 @@ |
223 | first_rev) |
224 | merger.merge_type = _mod_merge.Merge3Merger |
225 | merger.interesting_files = 'a' |
226 | - conflict_count = merger.do_merge() |
227 | - self.assertEqual(0, conflict_count) |
228 | + conflicts = merger.do_merge() |
229 | + self.assertEqual([], conflicts) |
230 | |
231 | self.assertPathDoesNotExist("a") |
232 | tree.revert() |
233 | @@ -516,8 +516,8 @@ |
234 | _mod_revision.NULL_REVISION, |
235 | first_rev) |
236 | merger.merge_type = _mod_merge.Merge3Merger |
237 | - conflict_count = merger.do_merge() |
238 | - self.assertEqual(0, conflict_count) |
239 | + conflicts = merger.do_merge() |
240 | + self.assertEqual([], conflicts) |
241 | self.assertEqual({''}, set(tree.all_versioned_paths())) |
242 | tree.set_parent_ids([]) |
243 | |
244 | @@ -2191,7 +2191,7 @@ |
245 | [('modify', ('a', b'a\nb\nc\nd\ne\nf\n'))], |
246 | revision_id=b'D-id') |
247 | wt, conflicts = self.do_merge(builder, b'E-id') |
248 | - self.assertEqual(0, conflicts) |
249 | + self.assertEqual([], conflicts) |
250 | # The merge should have simply update the contents of 'a' |
251 | self.assertEqual(b'a\nb\nc\nd\ne\nf\n', wt.get_file_text('a')) |
252 | |
253 | @@ -2221,7 +2221,7 @@ |
254 | [('rename', ('bar', 'baz'))], revision_id=b'F-id') |
255 | builder.build_snapshot([b'B-id', b'C-id'], [], revision_id=b'D-id') |
256 | wt, conflicts = self.do_merge(builder, b'F-id') |
257 | - self.assertEqual(0, conflicts) |
258 | + self.assertEqual([], conflicts) |
259 | # The merge should simply recognize that the final rename takes |
260 | # precedence |
261 | self.assertEqual('baz', wt.id2path(b'foo-id')) |
262 | @@ -2252,7 +2252,7 @@ |
263 | [('unversion', 'bar')], revision_id=b'F-id') |
264 | builder.build_snapshot([b'B-id', b'C-id'], [], revision_id=b'D-id') |
265 | wt, conflicts = self.do_merge(builder, b'F-id') |
266 | - self.assertEqual(0, conflicts) |
267 | + self.assertEqual([], conflicts) |
268 | self.assertRaises(errors.NoSuchId, wt.id2path, b'foo-id') |
269 | |
270 | def test_executable_changes(self): |
271 | @@ -2287,7 +2287,7 @@ |
272 | wt.revert() |
273 | self.assertFalse(wt.is_executable('foo')) |
274 | conflicts = wt.merge_from_branch(wt.branch, to_revision=b'F-id') |
275 | - self.assertEqual(0, conflicts) |
276 | + self.assertEqual(0, len(conflicts)) |
277 | self.assertTrue(wt.is_executable('foo')) |
278 | |
279 | def test_create_symlink(self): |
280 | @@ -2323,7 +2323,7 @@ |
281 | wt.revert() |
282 | self.assertFalse(wt.is_versioned('foo')) |
283 | conflicts = wt.merge_from_branch(wt.branch, to_revision=b'F-id') |
284 | - self.assertEqual(0, conflicts) |
285 | + self.assertEqual(0, len(conflicts)) |
286 | self.assertEqual(b'foo-id', wt.path2id('foo')) |
287 | self.assertEqual('bar', wt.get_symlink_target('foo')) |
288 | |
289 | @@ -2353,7 +2353,7 @@ |
290 | builder.build_snapshot([b'B-id', b'C-id'], [], |
291 | revision_id=b'D-id') |
292 | wt, conflicts = self.do_merge(builder, b'E-id') |
293 | - self.assertEqual(1, conflicts) |
294 | + self.assertEqual(1, len(conflicts)) |
295 | self.assertEqualDiff(b'<<<<<<< TREE\n' |
296 | b'B content\n' |
297 | b'=======\n' |
298 | @@ -2403,7 +2403,7 @@ |
299 | wt.merge_from_branch(wt.branch, b'C-id') |
300 | wt.commit('D merges B & C', rev_id=b'D-id') |
301 | conflicts = wt.merge_from_branch(wt.branch, to_revision=b'F-id') |
302 | - self.assertEqual(0, conflicts) |
303 | + self.assertEqual(0, len(conflicts)) |
304 | self.assertEqual('bing', wt.get_symlink_target('foo')) |
305 | |
306 | def test_renamed_symlink(self): |
307 | @@ -2460,7 +2460,7 @@ |
308 | False), |
309 | ], entries) |
310 | conflicts = wt.merge_from_branch(wt.branch, to_revision=b'F-id') |
311 | - self.assertEqual(0, conflicts) |
312 | + self.assertEqual(0, len(conflicts)) |
313 | self.assertEqual('blah', wt.id2path(b'foo-id')) |
314 | |
315 | def test_symlink_no_content_change(self): |
316 | @@ -2510,7 +2510,7 @@ |
317 | self.assertEqual([], list(merge_obj._entries_lca())) |
318 | # Now do a real merge, just to test the rest of the stack |
319 | conflicts = wt.merge_from_branch(wt.branch, to_revision=b'E-id') |
320 | - self.assertEqual(0, conflicts) |
321 | + self.assertEqual(0, len(conflicts)) |
322 | self.assertEqual('bing', wt.get_symlink_target('foo')) |
323 | |
324 | def test_symlink_this_changed_kind(self): |
325 | @@ -2653,7 +2653,7 @@ |
326 | [('rename', ('bar', 'foo'))], revision_id=b'F-id') # Rename back to BASE |
327 | builder.build_snapshot([b'B-id', b'C-id'], [], revision_id=b'D-id') |
328 | wt, conflicts = self.do_merge(builder, b'F-id') |
329 | - self.assertEqual(0, conflicts) |
330 | + self.assertEqual([], conflicts) |
331 | self.assertEqual('foo', wt.id2path(b'foo-id')) |
332 | |
333 | def test_other_reverted_content_to_base(self): |
334 | @@ -2674,7 +2674,7 @@ |
335 | revision_id=b'F-id') # Revert back to BASE |
336 | builder.build_snapshot([b'B-id', b'C-id'], [], revision_id=b'D-id') |
337 | wt, conflicts = self.do_merge(builder, b'F-id') |
338 | - self.assertEqual(0, conflicts) |
339 | + self.assertEqual([], conflicts) |
340 | # TODO: We need to use the per-file graph to properly select a BASE |
341 | # before this will work. Or at least use the LCA trees to find |
342 | # the appropriate content base. (which is B, not A). |
343 | @@ -2698,7 +2698,7 @@ |
344 | revision_id=b'F-id') # Override B content |
345 | builder.build_snapshot([b'B-id', b'C-id'], [], revision_id=b'D-id') |
346 | wt, conflicts = self.do_merge(builder, b'F-id') |
347 | - self.assertEqual(0, conflicts) |
348 | + self.assertEqual([], conflicts) |
349 | self.assertEqual(b'F content\n', wt.get_file_text('foo')) |
350 | |
351 | def test_all_wt(self): |
352 | @@ -3303,7 +3303,7 @@ |
353 | dest_wt = self.setup_simple_branch('dest', ['dir/', 'dir/file.txt']) |
354 | self.setup_simple_branch('src', ['README']) |
355 | conflicts = self.do_merge_into('src', 'dest/dir') |
356 | - self.assertEqual(1, conflicts) |
357 | + self.assertEqual(1, len(conflicts)) |
358 | dest_wt.lock_read() |
359 | self.addCleanup(dest_wt.unlock) |
360 | # The r1-lib1 revision should be merged into this one |
361 | @@ -3331,7 +3331,7 @@ |
362 | # This is an edge case that shouldn't happen to users very often. So |
363 | # we don't care really about the exact presentation of the conflict, |
364 | # just that there is one. |
365 | - self.assertEqual(1, conflicts) |
366 | + self.assertEqual(1, len(conflicts)) |
367 | |
368 | def test_only_subdir(self): |
369 | """When the location points to just part of a tree, merge just that |
370 | |
371 | === modified file 'breezy/tests/test_merge_core.py' |
372 | --- breezy/tests/test_merge_core.py 2020-08-09 18:10:01 +0000 |
373 | +++ breezy/tests/test_merge_core.py 2021-03-14 22:04:47 +0000 |
374 | @@ -503,13 +503,13 @@ |
375 | self.build_tree_contents([('b/file', b'this contents contents\n')]) |
376 | wtb = d_b.open_workingtree() |
377 | wtb.commit('this revision', allow_pointless=False) |
378 | - self.assertEqual(1, wtb.merge_from_branch(wta.branch)) |
379 | + self.assertEqual(1, len(wtb.merge_from_branch(wta.branch))) |
380 | self.assertPathExists('b/file.THIS') |
381 | self.assertPathExists('b/file.BASE') |
382 | self.assertPathExists('b/file.OTHER') |
383 | wtb.revert() |
384 | - self.assertEqual(1, wtb.merge_from_branch(wta.branch, |
385 | - merge_type=WeaveMerger)) |
386 | + self.assertEqual(1, len(wtb.merge_from_branch(wta.branch, |
387 | + merge_type=WeaveMerger))) |
388 | self.assertPathExists('b/file') |
389 | self.assertPathExists('b/file.THIS') |
390 | self.assertPathExists('b/file.BASE') |
391 | @@ -544,9 +544,9 @@ |
392 | revision_id=b'E-id') |
393 | builder.finish_series() |
394 | tree = builder.get_branch().create_checkout('tree', lightweight=True) |
395 | - self.assertEqual(1, tree.merge_from_branch(tree.branch, |
396 | + self.assertEqual(1, len(tree.merge_from_branch(tree.branch, |
397 | to_revision=b'D-id', |
398 | - merge_type=WeaveMerger)) |
399 | + merge_type=WeaveMerger))) |
400 | self.assertPathExists('tree/foo.THIS') |
401 | self.assertPathExists('tree/foo.OTHER') |
402 | self.expectFailure('fail to create .BASE in some criss-cross merges', |
403 | @@ -640,8 +640,10 @@ |
404 | b_wt.rename_one('deux', 'un') |
405 | b_wt.rename_one('tmp', 'deux') |
406 | b_wt.commit('r1', rev_id=b'r1') |
407 | - self.assertEqual(0, a_wt.merge_from_branch(b_wt.branch, |
408 | - b_wt.branch.last_revision(), b_wt.branch.get_rev_id(1))) |
409 | + self.assertEqual( |
410 | + 0, len(a_wt.merge_from_branch( |
411 | + b_wt.branch, b_wt.branch.last_revision(), |
412 | + b_wt.branch.get_rev_id(1)))) |
413 | self.assertPathExists('a/un') |
414 | self.assertTrue('a/deux') |
415 | self.assertFalse(os.path.exists('a/tmp')) |
416 | |
417 | === modified file 'doc/en/release-notes/brz-3.1.txt' |
418 | --- doc/en/release-notes/brz-3.1.txt 2021-02-24 17:14:42 +0000 |
419 | +++ doc/en/release-notes/brz-3.1.txt 2021-03-14 22:04:47 +0000 |
420 | @@ -99,6 +99,10 @@ |
421 | * File ids are no longer returned in ``Tree.walkdirs``. |
422 | (Jelmer Vernooij) |
423 | |
424 | + * ``WorkingTree.merge_from_branch``, ``Merge.do_merge`` and |
425 | + ``merge_inner`` now return a list of conflicts rather than number of |
426 | + conflicts. (Jelmer Vernooij) |
427 | + |
428 | Internals |
429 | ********* |
430 |
Running landing tests failed /ci.breezy- vcs.org/ job/brz- 3.1/job/ brz-3.1- land/815/
https:/