Merge lp:~jelmer/brz/do-merge-conflicts into lp:brz/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
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 :

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

Subscribers

People subscribed via source and target branches