Rev 3609: (James Westby) Make TreeTransform.apply() update the WT for kind in file:///home/pqm/archives/thelove/bzr/%2Btrunk/
Canonical.com Patch Queue Manager
pqm at pqm.ubuntu.com
Wed Aug 6 21:58:01 BST 2008
At file:///home/pqm/archives/thelove/bzr/%2Btrunk/
------------------------------------------------------------
revno: 3609
revision-id: pqm at pqm.ubuntu.com-20080806205754-tyo3u7h84tgr0h9k
parent: pqm at pqm.ubuntu.com-20080806085554-9e0l5crd6yv0kxy8
parent: jw+debian at jameswestby.net-20080802161123-70e89xwj0sccql1p
committer: Canonical.com Patch Queue Manager <pqm at pqm.ubuntu.com>
branch nick: +trunk
timestamp: Wed 2008-08-06 21:57:54 +0100
message:
(James Westby) Make TreeTransform.apply() update the WT for kind
changes.
modified:
bzrlib/tests/test_transform.py test_transaction.py-20060105172520-b3ffb3946550e6c4
bzrlib/transform.py transform.py-20060105172343-dd99e54394d91687
------------------------------------------------------------
revno: 3590.3.5
revision-id: jw+debian at jameswestby.net-20080802161123-70e89xwj0sccql1p
parent: jw+debian at jameswestby.net-20080801161059-xbtyoclmjhaf13qz
committer: James Westby <jw+debian at jameswestby.net>
branch nick: bzr.dev.transform
timestamp: Sat 2008-08-02 17:11:23 +0100
message:
Use HardlinkFeature for the hardlink test.
modified:
bzrlib/tests/test_transform.py test_transaction.py-20060105172520-b3ffb3946550e6c4
------------------------------------------------------------
revno: 3590.3.4
revision-id: jw+debian at jameswestby.net-20080801161059-xbtyoclmjhaf13qz
parent: jw+debian at jameswestby.net-20080731193813-z0u37e3l0j6u0xyj
committer: James Westby <jw+debian at jameswestby.net>
branch nick: bzr.dev.transform
timestamp: Fri 2008-08-01 17:10:59 +0100
message:
Add a test for creating hardlinks as well.
Also, don't keep state, but calculate all of the kind changes
at apply time.
modified:
bzrlib/tests/test_transform.py test_transaction.py-20060105172520-b3ffb3946550e6c4
bzrlib/transform.py transform.py-20060105172343-dd99e54394d91687
------------------------------------------------------------
revno: 3590.3.3
revision-id: jw+debian at jameswestby.net-20080731193813-z0u37e3l0j6u0xyj
parent: jw+debian at jameswestby.net-20080731172238-ba5br3gjk2mjkarb
committer: James Westby <jw+debian at jameswestby.net>
branch nick: bzr.dev.transform
timestamp: Thu 2008-07-31 20:38:13 +0100
message:
Make ->file changes work as well.
modified:
bzrlib/tests/test_transform.py test_transaction.py-20060105172520-b3ffb3946550e6c4
bzrlib/transform.py transform.py-20060105172343-dd99e54394d91687
------------------------------------------------------------
revno: 3590.3.2
revision-id: jw+debian at jameswestby.net-20080731172238-ba5br3gjk2mjkarb
parent: jw+debian at jameswestby.net-20080731164241-itsqths2azzc655b
committer: James Westby <jw+debian at jameswestby.net>
branch nick: bzr.dev.transform
timestamp: Thu 2008-07-31 18:22:38 +0100
message:
Handle ->symlink changes as well.
modified:
bzrlib/tests/test_transform.py test_transaction.py-20060105172520-b3ffb3946550e6c4
bzrlib/transform.py transform.py-20060105172343-dd99e54394d91687
------------------------------------------------------------
revno: 3590.3.1
revision-id: jw+debian at jameswestby.net-20080731164241-itsqths2azzc655b
parent: pqm at pqm.ubuntu.com-20080729170343-hy20k9g6euzsz04s
committer: James Westby <jw+debian at jameswestby.net>
branch nick: bzr.dev
timestamp: Thu 2008-07-31 17:42:41 +0100
message:
Make TreeTransform update the inventory with new kind information.
If an entry simply changes kind in a TreeTransform it wouldn't previously
be updated in the inventory, leading to a dirstate that didn't match what
was on disk.
This change makes TreeTransform keep track of kind changes and add an
inventory_delta entry to change the kind of the entry.
It is only implemented for ->directory changes currently.
modified:
bzrlib/tests/test_transform.py test_transaction.py-20060105172520-b3ffb3946550e6c4
bzrlib/transform.py transform.py-20060105172343-dd99e54394d91687
=== modified file 'bzrlib/tests/test_transform.py'
--- a/bzrlib/tests/test_transform.py 2008-07-22 20:37:43 +0000
+++ b/bzrlib/tests/test_transform.py 2008-08-02 16:11:23 +0000
@@ -1219,6 +1219,7 @@
wt = self.make_branch_and_tree('.')
self.build_tree(['foo'])
wt.add(['foo'])
+ wt.commit("one")
tt = TreeTransform(wt)
self.addCleanup(tt.finalize)
foo_trans_id = tt.trans_id_tree_path("foo")
@@ -1229,6 +1230,74 @@
tt.version_file("bar-1", bar_trans_id)
tt.apply()
self.failUnlessExists("foo/bar")
+ wt.lock_read()
+ try:
+ self.assertEqual(wt.inventory.get_file_kind(wt.path2id("foo")),
+ "directory")
+ finally:
+ wt.unlock()
+ wt.commit("two")
+ changes = wt.changes_from(wt.basis_tree())
+ self.assertFalse(changes.has_changed(), changes)
+
+ def test_file_to_symlink(self):
+ self.requireFeature(SymlinkFeature)
+ wt = self.make_branch_and_tree('.')
+ self.build_tree(['foo'])
+ wt.add(['foo'])
+ wt.commit("one")
+ tt = TreeTransform(wt)
+ self.addCleanup(tt.finalize)
+ foo_trans_id = tt.trans_id_tree_path("foo")
+ tt.delete_contents(foo_trans_id)
+ tt.create_symlink("bar", foo_trans_id)
+ tt.apply()
+ self.failUnlessExists("foo")
+ wt.lock_read()
+ self.addCleanup(wt.unlock)
+ self.assertEqual(wt.inventory.get_file_kind(wt.path2id("foo")),
+ "symlink")
+
+ def test_dir_to_file(self):
+ wt = self.make_branch_and_tree('.')
+ self.build_tree(['foo/', 'foo/bar'])
+ wt.add(['foo', 'foo/bar'])
+ wt.commit("one")
+ tt = TreeTransform(wt)
+ self.addCleanup(tt.finalize)
+ foo_trans_id = tt.trans_id_tree_path("foo")
+ bar_trans_id = tt.trans_id_tree_path("foo/bar")
+ tt.delete_contents(foo_trans_id)
+ tt.delete_versioned(bar_trans_id)
+ tt.create_file(["aa\n"], foo_trans_id)
+ tt.apply()
+ self.failUnlessExists("foo")
+ wt.lock_read()
+ self.addCleanup(wt.unlock)
+ self.assertEqual(wt.inventory.get_file_kind(wt.path2id("foo")),
+ "file")
+
+ def test_dir_to_hardlink(self):
+ self.requireFeature(HardlinkFeature)
+ wt = self.make_branch_and_tree('.')
+ self.build_tree(['foo/', 'foo/bar'])
+ wt.add(['foo', 'foo/bar'])
+ wt.commit("one")
+ tt = TreeTransform(wt)
+ self.addCleanup(tt.finalize)
+ foo_trans_id = tt.trans_id_tree_path("foo")
+ bar_trans_id = tt.trans_id_tree_path("foo/bar")
+ tt.delete_contents(foo_trans_id)
+ tt.delete_versioned(bar_trans_id)
+ self.build_tree(['baz'])
+ tt.create_hardlink("baz", foo_trans_id)
+ tt.apply()
+ self.failUnlessExists("foo")
+ self.failUnlessExists("baz")
+ wt.lock_read()
+ self.addCleanup(wt.unlock)
+ self.assertEqual(wt.inventory.get_file_kind(wt.path2id("foo")),
+ "file")
class TransformGroup(object):
=== modified file 'bzrlib/transform.py'
--- a/bzrlib/transform.py 2008-07-22 20:21:43 +0000
+++ b/bzrlib/transform.py 2008-08-01 16:10:59 +0000
@@ -1217,10 +1217,10 @@
mover = _mover
try:
child_pb.update('Apply phase', 0, 2)
- self._apply_removals(new_inventory_delta, mover)
+ kind_changes = self._apply_removals(new_inventory_delta, mover)
child_pb.update('Apply phase', 1, 2)
modified_paths = self._apply_insertions(new_inventory_delta,
- mover)
+ mover, kind_changes)
except:
mover.rollback()
raise
@@ -1244,6 +1244,7 @@
"""
tree_paths = list(self._tree_path_ids.iteritems())
tree_paths.sort(reverse=True)
+ kind_changes = set()
child_pb = bzrlib.ui.ui_factory.nested_progress_bar()
try:
for num, data in enumerate(tree_paths):
@@ -1251,6 +1252,12 @@
child_pb.update('removing file', num, len(tree_paths))
full_path = self._tree.abspath(path)
if trans_id in self._removed_contents:
+ try:
+ if (self.tree_kind(trans_id)
+ != self.final_kind(trans_id)):
+ kind_changes.add(trans_id)
+ except NoSuchFile:
+ pass
mover.pre_delete(full_path, os.path.join(self._deletiondir,
trans_id))
elif trans_id in self._new_name or trans_id in \
@@ -1274,8 +1281,9 @@
inventory_delta.append((path, None, file_id, None))
finally:
child_pb.finished()
+ return kind_changes
- def _apply_insertions(self, inventory_delta, mover):
+ def _apply_insertions(self, inventory_delta, mover, kind_changes):
"""Perform tree operations that insert directory/inventory names.
That is, create any files that need to be created, and restore from
@@ -1284,6 +1292,9 @@
If inventory_delta is None, no inventory delta is calculated, and
no list of modified paths is returned.
+
+ kind_changes is a set of trans ids where the entry has changed
+ kind, and so an inventory delta entry should be created for them.
"""
new_paths = self.new_paths(filesystem_only=(inventory_delta is None))
modified_paths = []
@@ -1320,7 +1331,8 @@
if file_id is not None and (trans_id in self._new_id or
trans_id in self._new_name or
trans_id in self._new_parent
- or trans_id in self._new_executability):
+ or trans_id in self._new_executability
+ or trans_id in kind_changes):
try:
kind = self.final_kind(trans_id)
except NoSuchFile:
More information about the bazaar-commits
mailing list