Rev 5964: Remerge pre-requisite in file:///home/vila/src/bzr/bugs/795456-eager-test/

Vincent Ladeuil v.ladeuil+lp at free.fr
Mon Jun 13 16:32:11 UTC 2011


At file:///home/vila/src/bzr/bugs/795456-eager-test/

------------------------------------------------------------
revno: 5964 [merge]
revision-id: v.ladeuil+lp at free.fr-20110613163211-bu4yyhqoim1l8nvy
parent: v.ladeuil+lp at free.fr-20110613143213-zwpns3a64qnhrpol
parent: aaron at aaronbentley.com-20110613153904-o63ne91voyl61q1x
committer: Vincent Ladeuil <v.ladeuil+lp at free.fr>
branch nick: 795456-eager-test
timestamp: Mon 2011-06-13 18:32:11 +0200
message:
  Remerge pre-requisite
modified:
  bzrlib/merge.py                merge.py-20050513021216-953b65a438527106
  bzrlib/tests/blackbox/test_tags.py test_tags.py-20070116132048-5h4qak2cm22jlb9e-1
  bzrlib/tests/blackbox/test_update.py test_update.py-20060212125639-c4dad1a5c56d5919
  bzrlib/tests/per_workingtree/test_merge_from_branch.py test_merge_from_bran-20060904034200-12jxyk2zlhpufxe1-1
  bzrlib/tests/test_reconfigure.py test_reconfigure.py-20070908040425-6ykgo7escxhyrg9p-2
  bzrlib/tests/test_shelf.py     test_prepare_shelf.p-20081005181341-n74qe6gu1e65ad4v-2
  bzrlib/tests/test_shelf_ui.py  test_shelf_ui.py-20081027155203-wtcuazg85wp9u4fv-1
  bzrlib/tests/test_transform.py test_transaction.py-20060105172520-b3ffb3946550e6c4
  bzrlib/transform.py            transform.py-20060105172343-dd99e54394d91687
  doc/en/release-notes/bzr-2.4.txt bzr2.4.txt-20110114053217-k7ym9jfz243fddjm-1
-------------- next part --------------
=== modified file 'bzrlib/merge.py'
--- a/bzrlib/merge.py	2011-06-09 19:25:53 +0000
+++ b/bzrlib/merge.py	2011-06-13 14:10:13 +0000
@@ -1319,8 +1319,7 @@
                                         other_parent, other_name))
         if not self.other_tree.has_id(file_id):
             # it doesn't matter whether the result was 'other' or
-            # 'conflict'-- if there's no 'other', or it's not versioned, we
-            # leave it alone.
+            # 'conflict'-- if it has no file id, we leave it alone.
             return
         parent_id = parents[self.winner_idx[parent_id_winner]]
         name = names[self.winner_idx[name_winner]]

=== modified file 'bzrlib/tests/blackbox/test_tags.py'
--- a/bzrlib/tests/blackbox/test_tags.py	2011-06-09 18:46:24 +0000
+++ b/bzrlib/tests/blackbox/test_tags.py	2011-06-10 15:06:41 +0000
@@ -124,8 +124,7 @@
 
     def make_fork(self, branch):
         fork = branch.create_clone_on_transport(self.get_transport('fork'))
-        fork.lock_write()
-        self.addCleanup(fork.unlock)
+        self.addCleanup(fork.lock_write().unlock)
         with transform.TransformPreview(fork.basis_tree()) as tt:
             tt.commit(fork, message='Commit in fork.', revision_id='fork-0')
         with transform.TransformPreview(fork.basis_tree()) as tt:

=== modified file 'bzrlib/tests/blackbox/test_update.py'
--- a/bzrlib/tests/blackbox/test_update.py	2011-06-09 18:46:24 +0000
+++ b/bzrlib/tests/blackbox/test_update.py	2011-06-10 08:11:44 +0000
@@ -143,8 +143,6 @@
         master.commit('first commit')
         # make a bound branch
         self.run_bzr('checkout master child')
-        # get an object form of child
-        child = workingtree.WorkingTree.open('child')
         # check that out
         self.run_bzr('checkout --lightweight child checkout')
         # get an object form of the checkout to manipulate
@@ -159,6 +157,8 @@
         a_file = file('child/file_b', 'wt')
         a_file.write('Foo')
         a_file.close()
+        # get an object form of child
+        child = workingtree.WorkingTree.open('child')
         child.add(['file_b'])
         child_tip = child.commit('add file_b', local=True)
         # check checkout

=== modified file 'bzrlib/tests/per_workingtree/test_merge_from_branch.py'
--- a/bzrlib/tests/per_workingtree/test_merge_from_branch.py	2011-06-09 18:56:55 +0000
+++ b/bzrlib/tests/per_workingtree/test_merge_from_branch.py	2011-06-13 13:41:49 +0000
@@ -162,6 +162,8 @@
         outer.commit('added foo')
         inner = self.make_inner_branch()
         outer.merge_from_branch(inner, to_revision='1', from_revision='null:')
+        #retain original root id.
+        outer.set_root_id(outer.basis_tree().get_root_id())
         outer.commit('merge inner branch')
         outer.mkdir('dir-outer', 'dir-outer-id')
         outer.move(['dir', 'file3'], to_dir='dir-outer')
@@ -201,7 +203,7 @@
         outer.remove(['dir-outer/file3'], keep_files=False)
         outer.commit('delete file3')
         nb_conflicts = outer.merge_from_branch(inner, to_revision='3')
-        self.assertEqual(1, nb_conflicts)
+        self.assertEqual(4, nb_conflicts)
         self.assertTreeLayout(['dir-outer',
                                'dir-outer/dir',
                                'dir-outer/dir/file1',
@@ -217,6 +219,9 @@
     def test_file4_added_in_root(self):
         outer, inner = self.make_outer_tree()
         nb_conflicts = outer.merge_from_branch(inner, to_revision='4')
+        # file4 could not be added to its original root, so it gets added to
+        # the new root with a conflict.
+        self.assertEqual(1, nb_conflicts)
         self.assertTreeLayout(['dir-outer',
                                'dir-outer/dir',
                                'dir-outer/dir/file1',
@@ -227,9 +232,19 @@
 
     def test_file4_added_then_renamed(self):
         outer, inner = self.make_outer_tree()
+        # 1 conflict, because file4 can't be put into the old root
+        self.assertEqual(1, outer.merge_from_branch(inner, to_revision='4'))
+        try:
+            outer.set_conflicts(conflicts.ConflictList())
+        except errors.UnsupportedOperation:
+            # WT2 doesn't have a separate list of conflicts to clear. It
+            # actually says there is a conflict, but happily forgets all about
+            # it.
+            pass
         outer.commit('added file4')
         # And now file4 gets renamed into an existing dir
         nb_conflicts = outer.merge_from_branch(inner, to_revision='5')
+        self.assertEqual(1, nb_conflicts)
         self.assertTreeLayout(['dir-outer',
                                'dir-outer/dir',
                                'dir-outer/dir/file1',

=== modified file 'bzrlib/tests/test_reconfigure.py'
--- a/bzrlib/tests/test_reconfigure.py	2011-06-09 18:46:24 +0000
+++ b/bzrlib/tests/test_reconfigure.py	2011-06-10 08:11:44 +0000
@@ -48,7 +48,7 @@
         tree = self.make_branch_and_tree('tree')
         tree.commit('unchanged')
         other_tree = tree.bzrdir.sprout('other').open_workingtree()
-        other_tree.commit('file added')
+        other_tree.commit('mergeable commit')
         tree.merge_from_branch(other_tree.branch)
         reconfiguration = reconfigure.Reconfigure.to_branch(tree.bzrdir)
         self.assertRaises(errors.UncommittedChanges, reconfiguration.apply)

=== modified file 'bzrlib/tests/test_shelf.py'
--- a/bzrlib/tests/test_shelf.py	2011-05-13 12:51:05 +0000
+++ b/bzrlib/tests/test_shelf.py	2011-06-10 08:58:30 +0000
@@ -568,19 +568,18 @@
         list(creator.iter_shelvable())
         creator.shelve_deletion('foo-id')
         creator.shelve_deletion('bar-id')
-        shelf_file = open('shelf', 'w+b')
-        self.addCleanup(shelf_file.close)
-        creator.write_shelf(shelf_file)
-        creator.transform()
-        creator.finalize()
+        with open('shelf', 'w+b') as shelf_file:
+            creator.write_shelf(shelf_file)
+            creator.transform()
+            creator.finalize()
         # validate the test setup
         self.assertTrue('foo-id' in tree)
         self.assertTrue('bar-id' in tree)
         self.assertFileEqual('baz', 'tree/foo/bar')
-        shelf_file.seek(0)
-        unshelver = shelf.Unshelver.from_tree_and_shelf(tree, shelf_file)
-        self.addCleanup(unshelver.finalize)
-        unshelver.make_merger().do_merge()
+        with open('shelf', 'r+b') as shelf_file:
+            unshelver = shelf.Unshelver.from_tree_and_shelf(tree, shelf_file)
+            self.addCleanup(unshelver.finalize)
+            unshelver.make_merger().do_merge()
         self.assertFalse('foo-id' in tree)
         self.assertFalse('bar-id' in tree)
 

=== modified file 'bzrlib/tests/test_shelf_ui.py'
--- a/bzrlib/tests/test_shelf_ui.py	2011-06-09 18:56:55 +0000
+++ b/bzrlib/tests/test_shelf_ui.py	2011-06-13 14:44:22 +0000
@@ -20,8 +20,6 @@
 import sys
 from textwrap import dedent
 
-from testtools.testcase import ExpectedException
-
 from bzrlib import (
     errors,
     shelf_ui,
@@ -312,11 +310,16 @@
         tree1.merge_from_branch(tree2.branch,
                                 from_revision=revision.NULL_REVISION)
         tree1.commit('Replaced root entry')
-        self.shelve_all(tree1, rev2)
         # This is essentially assertNotRaises(InconsistentDelta)
-        with ExpectedException(AssertionError, ''):
-            with ExpectedException(errors.InconsistentDelta, ''):
-                self.shelve_all(tree1, rev2)
+        # With testtools 0.99, it can be rewritten as:
+        # with ExpectedException(AssertionError,
+        #                        'InconsistentDelta not raised'):
+        #     with ExpectedException(errors.InconsistentDelta, ''):
+        #         self.shelve_all(tree1, rev2)
+        e = self.assertRaises(AssertionError, self.assertRaises,
+                              errors.InconsistentDelta, self.shelve_all, tree1,
+                              rev2)
+        self.assertContainsRe('InconsistentDelta not raised', str(e))
 
     def test_shelve_split(self):
         outer_tree = self.make_branch_and_tree('outer')

=== modified file 'bzrlib/tests/test_transform.py'
--- a/bzrlib/tests/test_transform.py	2011-06-09 18:54:33 +0000
+++ b/bzrlib/tests/test_transform.py	2011-06-13 15:39:04 +0000
@@ -285,13 +285,22 @@
         new_trans_id = transform.new_directory('', ROOT_PARENT, 'alt-root-id')
         self.assertRaises(ValueError, transform.fixup_new_roots)
 
+    def test_add_unversioned_root(self):
+        transform, root = self.get_transform()
+        new_trans_id = transform.new_directory('', ROOT_PARENT, None)
+        transform.fixup_new_roots()
+        self.assertNotIn(transform.root, transform._new_id)
+
     def test_apply_retains_root_directory(self):
         # Do not attempt to delete the physical root directory, because that
         # is impossible.
         transform, root = self.get_transform()
         with transform:
             transform.delete_contents(root)
-            transform.apply()
+            e = self.assertRaises(AssertionError, self.assertRaises,
+                                  errors.TransformRenameFailed,
+                                  transform.apply)
+        self.assertContainsRe('TransformRenameFailed not raised', str(e))
 
     def test_hardlink(self):
         self.requireFeature(HardlinkFeature)

=== modified file 'bzrlib/transform.py'
--- a/bzrlib/transform.py	2011-06-09 18:56:55 +0000
+++ b/bzrlib/transform.py	2011-06-13 14:10:13 +0000
@@ -393,23 +393,44 @@
         return sorted(FinalPaths(self).get_paths(new_ids))
 
     def _inventory_altered(self):
-        """Get the trans_ids and paths of files needing new inv entries."""
-        new_ids = set()
-        changed_id = set(t for t in self._new_id
-                         if self._new_id[t] != self.tree_file_id(t))
-        for id_set in [self._new_name, self._new_parent, changed_id,
+        """Determine which trans_ids need new Inventory entries.
+
+        An new entry is needed when anything that would be reflected by an
+        inventory entry changes, including file name, file_id, parent file_id,
+        file kind, and the execute bit.
+
+        Some care is taken to return entries with real changes, not cases
+        where the value is deleted and then restored to its original value,
+        but some actually unchanged values may be returned.
+
+        :returns: A list of (path, trans_id) for all items requiring an
+            inventory change. Ordered by path.
+        """
+        changed_ids = set()
+        # Find entries whose file_ids are new (or changed).
+        new_file_id = set(t for t in self._new_id
+                          if self._new_id[t] != self.tree_file_id(t))
+        for id_set in [self._new_name, self._new_parent, new_file_id,
                        self._new_executability]:
-            new_ids.update(id_set)
+            changed_ids.update(id_set)
+        # removing implies a kind change
         changed_kind = set(self._removed_contents)
+        # so does adding
         changed_kind.intersection_update(self._new_contents)
-        changed_kind.difference_update(new_ids)
+        # Ignore entries that are already known to have changed.
+        changed_kind.difference_update(changed_ids)
+        #  to keep only the truly changed ones
         changed_kind = (t for t in changed_kind
                         if self.tree_kind(t) != self.final_kind(t))
-        new_ids.update(changed_kind)
-        file_id_changed = set(t for t in changed_id if t in self._removed_id)
-        for parent_trans_id in file_id_changed:
-            new_ids.update(self.iter_tree_children(parent_trans_id))
-        return sorted(FinalPaths(self).get_paths(new_ids))
+        # all kind changes will alter the inventory
+        changed_ids.update(changed_kind)
+        # To find entries with changed parent_ids, find parents which existed,
+        # but changed file_id.
+        changed_file_id = set(t for t in new_file_id if t in self._removed_id)
+        # Now add all their children to the set.
+        for parent_trans_id in new_file_id:
+            changed_ids.update(self.iter_tree_children(parent_trans_id))
+        return sorted(FinalPaths(self).get_paths(changed_ids))
 
     def final_kind(self, trans_id):
         """Determine the final file kind, after any changes applied.

=== modified file 'doc/en/release-notes/bzr-2.4.txt'
--- a/doc/en/release-notes/bzr-2.4.txt	2011-06-13 14:32:13 +0000
+++ b/doc/en/release-notes/bzr-2.4.txt	2011-06-13 16:32:11 +0000
@@ -63,6 +63,8 @@
   ``UIFactory.get_password`` and ``UIFactory.get_boolean`` now require a
   unicode prompt to be passed in. (Jelmer Vernooij, #592083)
 
+* Support merging into the empty tree. (Aaron Bentley, #595328)
+
 Documentation
 *************
 



More information about the bazaar-commits mailing list