Rev 4649: Merge bzr.dev into cleanup in file:///home/vila/src/bzr/experimental/conflict-manager/
Vincent Ladeuil
v.ladeuil+lp at free.fr
Thu Nov 11 17:41:34 GMT 2010
At file:///home/vila/src/bzr/experimental/conflict-manager/
------------------------------------------------------------
revno: 4649 [merge]
revision-id: v.ladeuil+lp at free.fr-20101111174133-xk0ltd3s22avmz20
parent: v.ladeuil+lp at free.fr-20101110111525-eca2z6culiussdeh
parent: pqm at pqm.ubuntu.com-20101111084519-bmk1zmblp7kex41a
committer: Vincent Ladeuil <v.ladeuil+lp at free.fr>
branch nick: cleanup
timestamp: Thu 2010-11-11 18:41:33 +0100
message:
Merge bzr.dev into cleanup
added:
bzrlib/tests/blackbox/test_resolve.py test_resolve.py-20101103145514-ygpa369r69hhxsmi-1
modified:
bzrlib/conflicts.py conflicts.py-20051001061850-78ef952ba63d2b42
bzrlib/tests/blackbox/__init__.py __init__.py-20051128053524-eba30d8255e08dc3
bzrlib/tests/blackbox/test_conflicts.py test_conflicts.py-20060228151432-9723ebb925b999cf
bzrlib/tests/test_conflicts.py test_conflicts.py-20051006031059-e2dad9bbeaa5891f
doc/en/release-notes/bzr-2.3.txt NEWS-20050323055033-4e00b5db738777ff
doc/en/whats-new/whats-new-in-2.3.txt whatsnewin2.3.txt-20100818072501-x2h25r7jbnknvy30-1
-------------- next part --------------
=== modified file 'bzrlib/conflicts.py'
--- a/bzrlib/conflicts.py 2010-11-07 13:38:56 +0000
+++ b/bzrlib/conflicts.py 2010-11-07 16:09:43 +0000
@@ -159,7 +159,9 @@
# conflict.auto(tree) --vila 091242
pass
else:
- resolve(tree, file_list, action=action)
+ before, after = resolve(tree, file_list, action=action)
+ trace.note('%d conflict(s) resolved, %d remaining'
+ % (before - after, after))
def resolve(tree, paths=None, ignore_misses=False, recursive=False,
@@ -178,8 +180,10 @@
:param action: How the conflict should be resolved,
"""
tree.lock_tree_write()
+ nb_conflicts_after = None
try:
tree_conflicts = tree.conflicts()
+ nb_conflicts_before = len(tree_conflicts)
if paths is None:
new_conflicts = ConflictList()
to_process = tree_conflicts
@@ -193,11 +197,15 @@
except NotImplementedError:
new_conflicts.append(conflict)
try:
+ nb_conflicts_after = len(new_conflicts)
tree.set_conflicts(new_conflicts)
except errors.UnsupportedOperation:
pass
finally:
tree.unlock()
+ if nb_conflicts_after is None:
+ nb_conflicts_after = nb_conflicts_before
+ return nb_conflicts_before, nb_conflicts_after
def restore(filename):
=== modified file 'bzrlib/tests/blackbox/__init__.py'
--- a/bzrlib/tests/blackbox/__init__.py 2010-10-15 11:30:54 +0000
+++ b/bzrlib/tests/blackbox/__init__.py 2010-11-07 16:09:43 +0000
@@ -99,6 +99,7 @@
'test_remove',
'test_re_sign',
'test_remove_tree',
+ 'test_resolve',
'test_revert',
'test_revno',
'test_revision_history',
=== modified file 'bzrlib/tests/blackbox/test_conflicts.py'
--- a/bzrlib/tests/blackbox/test_conflicts.py 2010-11-07 13:38:56 +0000
+++ b/bzrlib/tests/blackbox/test_conflicts.py 2010-11-07 16:32:51 +0000
@@ -21,158 +21,61 @@
)
from bzrlib.tests import script
-
-# FIXME: These don't really look at the output of the conflict commands, just
-# the number of lines - there should be more examination.
-
-class TestConflictsBase(tests.TestCaseWithTransport):
+def make_tree_with_conflicts(test, this_path='this', other_path='other'):
+ this_tree = test.make_branch_and_tree(this_path)
+ test.build_tree_contents([
+ ('%s/myfile' % (this_path,), 'this content\n'),
+ ('%s/my_other_file' % (this_path,), 'this content\n'),
+ ('%s/mydir/' % (this_path,),),
+ ])
+ this_tree.add('myfile')
+ this_tree.add('my_other_file')
+ this_tree.add('mydir')
+ this_tree.commit(message="new")
+ other_tree = this_tree.bzrdir.sprout(other_path).open_workingtree()
+ test.build_tree_contents([
+ ('%s/myfile' % (other_path,), 'contentsb\n'),
+ ('%s/my_other_file' % (other_path,), 'contentsb\n'),
+ ])
+ other_tree.rename_one('mydir', 'mydir2')
+ other_tree.commit(message="change")
+ test.build_tree_contents([
+ ('%s/myfile' % (this_path,), 'contentsa2\n'),
+ ('%s/my_other_file' % (this_path,), 'contentsa2\n'),
+ ])
+ this_tree.rename_one('mydir', 'mydir3')
+ this_tree.commit(message='change')
+ this_tree.merge_from_branch(other_tree.branch)
+ return this_tree, other_tree
+
+
+class TestConflicts(script.TestCaseWithTransportAndScript):
def setUp(self):
- super(TestConflictsBase, self).setUp()
- self.make_tree_with_conflicts()
-
- def make_tree_with_conflicts(self):
- a_tree = self.make_branch_and_tree('a')
- self.build_tree_contents([
- ('a/myfile', 'contentsa\n'),
- ('a/my_other_file', 'contentsa\n'),
- ('a/mydir/',),
- ])
- a_tree.add('myfile')
- a_tree.add('my_other_file')
- a_tree.add('mydir')
- a_tree.commit(message="new")
- b_tree = a_tree.bzrdir.sprout('b').open_workingtree()
- self.build_tree_contents([
- ('b/myfile', 'contentsb\n'),
- ('b/my_other_file', 'contentsb\n'),
- ])
- b_tree.rename_one('mydir', 'mydir2')
- b_tree.commit(message="change")
- self.build_tree_contents([
- ('a/myfile', 'contentsa2\n'),
- ('a/my_other_file', 'contentsa2\n'),
- ])
- a_tree.rename_one('mydir', 'mydir3')
- a_tree.commit(message='change')
- a_tree.merge_from_branch(b_tree.branch)
-
- def run_bzr(self, cmd, working_dir='a', **kwargs):
- return super(TestConflictsBase, self).run_bzr(
- cmd, working_dir=working_dir, **kwargs)
-
-
-class TestConflicts(TestConflictsBase):
+ super(TestConflicts, self).setUp()
+ make_tree_with_conflicts(self, 'branch', 'other')
def test_conflicts(self):
- out, err = self.run_bzr('conflicts')
- self.assertEqual(3, len(out.splitlines()))
+ self.run_script("""\
+$ cd branch
+$ bzr conflicts
+Text conflict in my_other_file
+Path conflict: mydir3 / mydir2
+Text conflict in myfile
+""")
def test_conflicts_text(self):
- out, err = self.run_bzr('conflicts --text')
- self.assertEqual(['my_other_file', 'myfile'], out.splitlines())
+ self.run_script("""\
+$ cd branch
+$ bzr conflicts --text
+my_other_file
+myfile
+""")
def test_conflicts_directory(self):
- """Test --directory option"""
- out, err = self.run_bzr('conflicts --directory a', working_dir='.')
- self.assertEqual(3, len(out.splitlines()))
- self.assertEqual('', err)
-
-
-class TestResolve(TestConflictsBase):
-
- def test_resolve(self):
- self.run_bzr('resolve myfile')
- out, err = self.run_bzr('conflicts')
- self.assertEqual(2, len(out.splitlines()))
- self.run_bzr('resolve my_other_file')
- self.run_bzr('resolve mydir2')
- out, err = self.run_bzr('conflicts')
- self.assertEqual(0, len(out.splitlines()))
-
- def test_resolve_all(self):
- self.run_bzr('resolve --all')
- out, err = self.run_bzr('conflicts')
- self.assertEqual(0, len(out.splitlines()))
-
- def test_resolve_in_subdir(self):
- """resolve when run from subdirectory should handle relative paths"""
- self.build_tree(["a/subdir/"])
- self.run_bzr("resolve ../myfile", working_dir='a/subdir')
- self.run_bzr("resolve ../a/myfile", working_dir='b')
- wt = workingtree.WorkingTree.open_containing('b')[0]
- conflicts = wt.conflicts()
- self.assertEqual(True, conflicts.is_empty(),
- "tree still contains conflicts: %r" % conflicts)
-
- def test_resolve_via_directory(self):
- """resolve when run from subdirectory should handle relative paths"""
- self.build_tree(["a/subdir/"])
- self.run_bzr("resolve -d a/subdir ../myfile")
-
- def test_auto_resolve(self):
- """Text conflicts can be resolved automatically"""
- tree = self.make_branch_and_tree('tree')
- self.build_tree_contents([('tree/file',
- '<<<<<<<\na\n=======\n>>>>>>>\n')])
- tree.add('file', 'file_id')
- self.assertEqual(tree.kind('file_id'), 'file')
- file_conflict = conflicts.TextConflict('file', file_id='file_id')
- tree.set_conflicts(conflicts.ConflictList([file_conflict]))
- note = self.run_bzr('resolve', retcode=1, working_dir='tree')[1]
- self.assertContainsRe(note, '0 conflict\\(s\\) auto-resolved.')
- self.assertContainsRe(note,
- 'Remaining conflicts:\nText conflict in file')
- self.build_tree_contents([('tree/file', 'a\n')])
- note = self.run_bzr('resolve', working_dir='tree')[1]
- self.assertContainsRe(note, 'All conflicts resolved.')
-
- def test_resolve_all_directory(self):
- """Test --directory option"""
- out, err = self.run_bzr('resolve --all -d a', working_dir='.')
- self.assertEqual('', err)
- out, err = self.run_bzr('conflicts')
- self.assertEqual(0, len(out.splitlines()))
-
-class TestResolveSilentlyIgnore(script.TestCaseWithTransportAndScript):
-
- def test_bug_646961(self):
self.run_script("""\
- $ bzr init base
- Created a standalone tree (format: 2a)
- $ cd base
- $ echo >file1
- $ bzr add
- adding file1
- $ bzr ci -m "stuff"
- 2>Committing to: .../base/
- 2>added file1
- 2>Committed revision 1.
- $ cd ..
- $ bzr branch base branch
- 2>Branched 1 revision(s).
- $ cd base
- $ echo "1" >> file1
- $ bzr ci -m "branch 1"
- 2>Committing to: .../base/
- 2>modified file1
- 2>Committed revision 2.
- $ cd ../branch
- $ echo "2" >> file1
- $ bzr ci -m "branch 2"
- 2>Committing to: .../branch/
- 2>modified file1
- 2>Committed revision 2.
- $ cd ../base
- $ bzr merge ../branch
- 2> M file1
- 2>Text conflict in file1
- 2>1 conflicts encountered.
- # The following succeeds silently without resolving the conflict
- $ bzr resolve file1 --take-other
- # The following wil fail when --take-other is implemented
- # for text conflicts
- $ bzr conflicts
- Text conflict in file1
- """)
-
+$ bzr conflicts -d branch
+Text conflict in my_other_file
+Path conflict: mydir3 / mydir2
+Text conflict in myfile
+""")
=== added file 'bzrlib/tests/blackbox/test_resolve.py'
--- a/bzrlib/tests/blackbox/test_resolve.py 1970-01-01 00:00:00 +0000
+++ b/bzrlib/tests/blackbox/test_resolve.py 2010-11-07 16:09:43 +0000
@@ -0,0 +1,138 @@
+# Copyright (C) 2010 Canonical Ltd
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+
+from bzrlib import (
+ conflicts,
+ tests,
+ )
+from bzrlib.tests import script
+from bzrlib.tests.blackbox import test_conflicts
+
+
+class TestResolve(script.TestCaseWithTransportAndScript):
+
+ def setUp(self):
+ super(TestResolve, self).setUp()
+ test_conflicts.make_tree_with_conflicts(self, 'branch', 'other')
+
+ def test_resolve_one_by_one(self):
+ self.run_script("""\
+$ cd branch
+$ bzr conflicts
+Text conflict in my_other_file
+Path conflict: mydir3 / mydir2
+Text conflict in myfile
+$ bzr resolve myfile
+2>1 conflict(s) resolved, 2 remaining
+$ bzr resolve my_other_file
+2>1 conflict(s) resolved, 1 remaining
+$ bzr resolve mydir2
+2>1 conflict(s) resolved, 0 remaining
+""")
+
+ def test_resolve_all(self):
+ self.run_script("""\
+$ cd branch
+$ bzr resolve --all
+2>3 conflict(s) resolved, 0 remaining
+$ bzr conflicts
+""")
+
+ def test_resolve_from_subdir(self):
+ self.run_script("""\
+$ mkdir branch/subdir
+$ cd branch/subdir
+$ bzr resolve ../myfile
+2>1 conflict(s) resolved, 2 remaining
+""")
+
+ def test_resolve_via_directory_option(self):
+ self.run_script("""\
+$ bzr resolve -d branch myfile
+2>1 conflict(s) resolved, 2 remaining
+""")
+
+ def test_resolve_all_via_directory_option(self):
+ self.run_script("""\
+$ bzr resolve -d branch --all
+2>3 conflict(s) resolved, 0 remaining
+$ bzr conflicts -d branch
+""")
+
+
+class TestResolveAuto(tests.TestCaseWithTransport):
+
+ def test_auto_resolve(self):
+ """Text conflicts can be resolved automatically"""
+ tree = self.make_branch_and_tree('tree')
+ self.build_tree_contents([('tree/file',
+ '<<<<<<<\na\n=======\n>>>>>>>\n')])
+ tree.add('file', 'file_id')
+ self.assertEqual(tree.kind('file_id'), 'file')
+ file_conflict = conflicts.TextConflict('file', file_id='file_id')
+ tree.set_conflicts(conflicts.ConflictList([file_conflict]))
+ note = self.run_bzr('resolve', retcode=1, working_dir='tree')[1]
+ self.assertContainsRe(note, '0 conflict\\(s\\) auto-resolved.')
+ self.assertContainsRe(note,
+ 'Remaining conflicts:\nText conflict in file')
+ self.build_tree_contents([('tree/file', 'a\n')])
+ note = self.run_bzr('resolve', working_dir='tree')[1]
+ self.assertContainsRe(note, 'All conflicts resolved.')
+
+
+class TestResolveSilentlyIgnore(script.TestCaseWithTransportAndScript):
+
+ def test_bug_646961(self):
+ self.run_script("""\
+ $ bzr init base
+ Created a standalone tree (format: 2a)
+ $ cd base
+ $ echo >file1
+ $ bzr add
+ adding file1
+ $ bzr ci -m "stuff"
+ 2>Committing to: .../base/
+ 2>added file1
+ 2>Committed revision 1.
+ $ cd ..
+ $ bzr branch base branch
+ 2>Branched 1 revision(s).
+ $ cd base
+ $ echo "1" >> file1
+ $ bzr ci -m "branch 1"
+ 2>Committing to: .../base/
+ 2>modified file1
+ 2>Committed revision 2.
+ $ cd ../branch
+ $ echo "2" >> file1
+ $ bzr ci -m "branch 2"
+ 2>Committing to: .../branch/
+ 2>modified file1
+ 2>Committed revision 2.
+ $ cd ../base
+ $ bzr merge ../branch
+ 2> M file1
+ 2>Text conflict in file1
+ 2>1 conflicts encountered.
+ # The following succeeds silently without resolving the conflict
+ $ bzr resolve file1 --take-other
+ 2>0 conflict(s) resolved, 1 remaining
+ # The following wil fail when --take-other is implemented
+ # for text conflicts
+ $ bzr conflicts
+ Text conflict in file1
+ """)
+
=== modified file 'bzrlib/tests/test_conflicts.py'
--- a/bzrlib/tests/test_conflicts.py 2010-11-10 11:15:25 +0000
+++ b/bzrlib/tests/test_conflicts.py 2010-11-10 11:15:50 +0000
@@ -624,12 +624,14 @@
self.run_script("""
$ bzr rm -q dir --force
$ bzr resolve dir
+2>2 conflict(s) resolved, 0 remaining
$ bzr commit -q --strict -m 'No more conflicts nor unknown files'
""")
def test_take_other(self):
self.run_script("""
$ bzr resolve dir
+2>2 conflict(s) resolved, 0 remaining
$ bzr commit -q --strict -m 'No more conflicts nor unknown files'
""")
@@ -663,6 +665,7 @@
def test_keep_them_all(self):
self.run_script("""
$ bzr resolve dir
+2>2 conflict(s) resolved, 0 remaining
$ bzr commit -q --strict -m 'No more conflicts nor unknown files'
""")
@@ -671,6 +674,7 @@
$ bzr mv -q dir/file2 file2
$ bzr rm -q dir --force
$ bzr resolve dir
+2>2 conflict(s) resolved, 0 remaining
$ bzr commit -q --strict -m 'No more conflicts nor unknown files'
""")
@@ -678,6 +682,7 @@
self.run_script("""
$ bzr rm -q dir --force
$ bzr resolve dir
+2>2 conflict(s) resolved, 0 remaining
$ bzr commit -q --strict -m 'No more conflicts nor unknown files'
""")
@@ -724,6 +729,7 @@
def test_keep_them_all(self):
self.run_script("""
$ bzr resolve dir
+2>2 conflict(s) resolved, 0 remaining
$ bzr commit -q --strict -m 'No more conflicts nor unknown files'
""")
@@ -732,6 +738,7 @@
$ bzr mv -q dir/file2 file2
$ bzr rm -q dir --force
$ bzr resolve dir
+2>2 conflict(s) resolved, 0 remaining
$ bzr commit -q --strict -m 'No more conflicts nor unknown files'
""")
@@ -739,12 +746,14 @@
self.run_script("""
$ bzr rm -q dir --force
$ bzr resolve dir
+2>2 conflict(s) resolved, 0 remaining
$ bzr commit -q --strict -m 'No more conflicts nor unknown files'
""")
def test_resolve_taking_this(self):
self.run_script("""
$ bzr resolve --take-this dir
+2>2 conflict(s) resolved, 0 remaining
$ bzr commit -q --strict -m 'No more conflicts nor unknown files'
""")
@@ -753,6 +762,7 @@
$ bzr resolve --take-other dir
2>deleted dir/file2
2>deleted dir
+2>2 conflict(s) resolved, 0 remaining
$ bzr commit -q --strict -m 'No more conflicts nor unknown files'
""")
@@ -882,6 +892,7 @@
# aside ? -- vila 090916
$ bzr add -q foo
$ bzr resolve foo.new
+2>1 conflict(s) resolved, 0 remaining
$ bzr commit -q --strict -m 'No more conflicts nor unknown files'
""")
@@ -890,6 +901,7 @@
$ bzr rm -q foo --force
$ bzr mv -q foo.new foo
$ bzr resolve foo
+2>1 conflict(s) resolved, 0 remaining
$ bzr commit -q --strict -m 'No more conflicts nor unknown files'
""")
=== modified file 'doc/en/release-notes/bzr-2.3.txt'
--- a/doc/en/release-notes/bzr-2.3.txt 2010-11-10 02:01:33 +0000
+++ b/doc/en/release-notes/bzr-2.3.txt 2010-11-10 11:15:50 +0000
@@ -31,6 +31,10 @@
options matching a given regular expression is now controlled via the
``--all`` option. (Vincent Ladeuil, bug #670251)
+* ``bzr resolve`` now reports the number of conflicts resolved and the
+ number of remaining conflicts. This provides a better feedback about the
+ whole resolution process. (Vincent Ladeuil)
+
Bug Fixes
*********
=== modified file 'doc/en/whats-new/whats-new-in-2.3.txt'
--- a/doc/en/whats-new/whats-new-in-2.3.txt 2010-11-06 15:37:17 +0000
+++ b/doc/en/whats-new/whats-new-in-2.3.txt 2010-11-07 16:09:43 +0000
@@ -111,6 +111,9 @@
default behaviour is specified (if needed) by setting the variable to
``conflict``. (Vincent Ladeuil, #323111)
+* ``bzr resolve`` now provides more feedback about the conflicts just
+ resolved and the remaining ones. (Vincent Ladeuil)
+
Documentation
*************
More information about the bazaar-commits
mailing list