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