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