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