Rev 3623: Refactor TreeTransform to extract _generate_inventory_delta (abentley) in file:///home/pqm/archives/thelove/bzr/%2Btrunk/

Canonical.com Patch Queue Manager pqm at pqm.ubuntu.com
Wed Aug 13 04:40:06 BST 2008


At file:///home/pqm/archives/thelove/bzr/%2Btrunk/

------------------------------------------------------------
revno: 3623
revision-id: pqm at pqm.ubuntu.com-20080813033958-o4nve9kwgoa1nlir
parent: pqm at pqm.ubuntu.com-20080813025404-kmul7igvg0d7w4va
parent: aaron at aaronbentley.com-20080812141923-khi07xuwwi6gnm86
committer: Canonical.com Patch Queue Manager <pqm at pqm.ubuntu.com>
branch nick: +trunk
timestamp: Wed 2008-08-13 04:39:58 +0100
message:
  Refactor TreeTransform to extract _generate_inventory_delta (abentley)
modified:
  bzrlib/tests/test_transform.py test_transaction.py-20060105172520-b3ffb3946550e6c4
  bzrlib/transform.py            transform.py-20060105172343-dd99e54394d91687
    ------------------------------------------------------------
    revno: 3619.2.11
    revision-id: aaron at aaronbentley.com-20080812141923-khi07xuwwi6gnm86
    parent: aaron at aaronbentley.com-20080812140341-nytxmmhztdg5zxfh
    committer: Aaron Bentley <aaron at aaronbentley.com>
    branch nick: separate-delta
    timestamp: Tue 2008-08-12 10:19:23 -0400
    message:
      Tweak new_paths logic
    modified:
      bzrlib/transform.py            transform.py-20060105172343-dd99e54394d91687
    ------------------------------------------------------------
    revno: 3619.2.10
    revision-id: aaron at aaronbentley.com-20080812140341-nytxmmhztdg5zxfh
    parent: aaron at aaronbentley.com-20080812130646-d74yxibi8fm4n40g
    committer: Aaron Bentley <aaron at aaronbentley.com>
    branch nick: separate-delta
    timestamp: Tue 2008-08-12 10:03:41 -0400
    message:
      Compensate for stale entries in TT._needs_rename
    modified:
      bzrlib/tests/test_transform.py test_transaction.py-20060105172520-b3ffb3946550e6c4
      bzrlib/transform.py            transform.py-20060105172343-dd99e54394d91687
    ------------------------------------------------------------
    revno: 3619.2.9
    revision-id: aaron at aaronbentley.com-20080812130646-d74yxibi8fm4n40g
    parent: aaron at aaronbentley.com-20080812130323-drs3nke90pq02t5g
    committer: Aaron Bentley <aaron at aaronbentley.com>
    branch nick: separate-delta
    timestamp: Tue 2008-08-12 09:06:46 -0400
    message:
      Update docs
    modified:
      bzrlib/transform.py            transform.py-20060105172343-dd99e54394d91687
    ------------------------------------------------------------
    revno: 3619.2.8
    revision-id: aaron at aaronbentley.com-20080812130323-drs3nke90pq02t5g
    parent: abentley at stumpy-20080812073116-qrnxjlrjyozq270v
    committer: Aaron Bentley <aaron at aaronbentley.com>
    branch nick: separate-delta
    timestamp: Tue 2008-08-12 09:03:23 -0400
    message:
      Reorganize execute-bit handling
    modified:
      bzrlib/transform.py            transform.py-20060105172343-dd99e54394d91687
    ------------------------------------------------------------
    revno: 3619.2.7
    revision-id: abentley at stumpy-20080812073116-qrnxjlrjyozq270v
    parent: aaron at aaronbentley.com-20080812062153-dxnnuq4s8di98xob
    committer: Aaron Bentley <abentley at stumpy>
    branch nick: separate-delta
    timestamp: Tue 2008-08-12 03:31:16 -0400
    message:
      Fix progress handling
    modified:
      bzrlib/transform.py            transform.py-20060105172343-dd99e54394d91687
    ------------------------------------------------------------
    revno: 3619.2.6
    revision-id: aaron at aaronbentley.com-20080812062153-dxnnuq4s8di98xob
    parent: aaron at aaronbentley.com-20080812061438-bc1hxhxz0fd829qw
    committer: Aaron Bentley <aaron at aaronbentley.com>
    branch nick: separate-delta
    timestamp: Tue 2008-08-12 02:21:53 -0400
    message:
      More tweaking
    modified:
      bzrlib/transform.py            transform.py-20060105172343-dd99e54394d91687
    ------------------------------------------------------------
    revno: 3619.2.5
    revision-id: aaron at aaronbentley.com-20080812061438-bc1hxhxz0fd829qw
    parent: aaron at aaronbentley.com-20080812055617-p3womlx16jei3sgf
    committer: Aaron Bentley <aaron at aaronbentley.com>
    branch nick: separate-delta
    timestamp: Tue 2008-08-12 02:14:38 -0400
    message:
      Reduce set tests
    modified:
      bzrlib/transform.py            transform.py-20060105172343-dd99e54394d91687
    ------------------------------------------------------------
    revno: 3619.2.4
    revision-id: aaron at aaronbentley.com-20080812055617-p3womlx16jei3sgf
    parent: aaron at aaronbentley.com-20080812044904-gjotd2kgh2i3675n
    committer: Aaron Bentley <aaron at aaronbentley.com>
    branch nick: separate-delta
    timestamp: Tue 2008-08-12 01:56:17 -0400
    message:
      Further restructuring
    modified:
      bzrlib/transform.py            transform.py-20060105172343-dd99e54394d91687
    ------------------------------------------------------------
    revno: 3619.2.3
    revision-id: aaron at aaronbentley.com-20080812044904-gjotd2kgh2i3675n
    parent: aaron at aaronbentley.com-20080812041312-ydtwxp53d1jjwvky
    committer: Aaron Bentley <aaron at aaronbentley.com>
    branch nick: separate-delta
    timestamp: Tue 2008-08-12 00:49:04 -0400
    message:
      Remove unused code
    modified:
      bzrlib/transform.py            transform.py-20060105172343-dd99e54394d91687
    ------------------------------------------------------------
    revno: 3619.2.2
    revision-id: aaron at aaronbentley.com-20080812041312-ydtwxp53d1jjwvky
    parent: aaron at aaronbentley.com-20080812033329-9t2sw9fve78ri7hy
    committer: Aaron Bentley <aaron at aaronbentley.com>
    branch nick: separate-delta
    timestamp: Tue 2008-08-12 00:13:12 -0400
    message:
      Further cleanup
    modified:
      bzrlib/transform.py            transform.py-20060105172343-dd99e54394d91687
    ------------------------------------------------------------
    revno: 3619.2.1
    revision-id: aaron at aaronbentley.com-20080812033329-9t2sw9fve78ri7hy
    parent: pqm at pqm.ubuntu.com-20080811083307-tbibm26paa3r4hg8
    committer: Aaron Bentley <aaron at aaronbentley.com>
    branch nick: separate-delta
    timestamp: Mon 2008-08-11 23:33:29 -0400
    message:
      Refactor inventory delta generation out of apply_insersions/removals
    modified:
      bzrlib/transform.py            transform.py-20060105172343-dd99e54394d91687
=== modified file 'bzrlib/tests/test_transform.py'
--- a/bzrlib/tests/test_transform.py	2008-08-02 16:11:23 +0000
+++ b/bzrlib/tests/test_transform.py	2008-08-12 14:03:41 +0000
@@ -1299,6 +1299,13 @@
         self.assertEqual(wt.inventory.get_file_kind(wt.path2id("foo")),
                 "file")
 
+    def test_no_final_path(self):
+        transform, root = self.get_transform()
+        trans_id = transform.trans_id_file_id('foo')
+        transform.create_file('bar', trans_id)
+        transform.cancel_creation(trans_id)
+        transform.apply()
+
 
 class TransformGroup(object):
 

=== modified file 'bzrlib/transform.py'
--- a/bzrlib/transform.py	2008-08-01 16:10:59 +0000
+++ b/bzrlib/transform.py	2008-08-12 14:19:23 +0000
@@ -470,7 +470,12 @@
         """
         new_ids = set()
         if filesystem_only:
-            id_sets = (self._needs_rename, self._new_executability)
+            stale_ids = self._needs_rename.difference(self._new_name)
+            stale_ids.difference_update(self._new_parent)
+            stale_ids.difference_update(self._new_contents)
+            stale_ids.difference_update(self._new_id)
+            needs_rename = self._needs_rename.difference(stale_ids)
+            id_sets = (needs_rename, self._new_executability)
         else:
             id_sets = (self._new_name, self._new_parent, self._new_contents,
                        self._new_id, self._new_executability)
@@ -478,6 +483,20 @@
             new_ids.update(id_set)
         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()
+        for id_set in [self._new_name, self._new_parent, self._new_id,
+                       self._new_executability]:
+            new_ids.update(id_set)
+        changed_kind = set(self._removed_contents)
+        changed_kind.intersection_update(self._new_contents)
+        changed_kind.difference_update(new_ids)
+        changed_kind = (t for t in changed_kind if self.tree_kind(t) !=
+                        self.final_kind(t))
+        new_ids.update(changed_kind)
+        return sorted(FinalPaths(self).get_paths(new_ids))
+
     def tree_kind(self, trans_id):
         """Determine the file kind in the working tree.
 
@@ -870,12 +889,10 @@
         self._limbo_files[trans_id] = limbo_name
         return limbo_name
 
-    def _set_executability(self, path, entry, trans_id):
+    def _set_executability(self, path, trans_id):
         """Set the executability of versioned files """
-        new_executability = self._new_executability[trans_id]
-        if entry is not None:
-            entry.executable = new_executability
         if supports_executable():
+            new_executability = self._new_executability[trans_id]
             abspath = self._tree.abspath(path)
             current_mode = os.stat(abspath).st_mode
             if new_executability:
@@ -1203,24 +1220,24 @@
             conflicts = self.find_conflicts()
             if len(conflicts) != 0:
                 raise MalformedTransform(conflicts=conflicts)
-        if precomputed_delta is None:
-            new_inventory_delta = []
-            inventory_delta = new_inventory_delta
-        else:
-            new_inventory_delta = None
-            inventory_delta = precomputed_delta
         child_pb = bzrlib.ui.ui_factory.nested_progress_bar()
         try:
+            if precomputed_delta is None:
+                child_pb.update('Apply phase', 0, 2)
+                inventory_delta = self._generate_inventory_delta()
+                offset = 1
+            else:
+                inventory_delta = precomputed_delta
+                offset = 0
             if _mover is None:
                 mover = _FileMover()
             else:
                 mover = _mover
             try:
-                child_pb.update('Apply phase', 0, 2)
-                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, kind_changes)
+                child_pb.update('Apply phase', 0 + offset, 2 + offset)
+                self._apply_removals(mover)
+                child_pb.update('Apply phase', 1 + offset, 2 + offset)
+                modified_paths = self._apply_insertions(mover)
             except:
                 mover.rollback()
                 raise
@@ -1233,7 +1250,68 @@
         self.finalize()
         return _TransformResults(modified_paths, self.rename_count)
 
-    def _apply_removals(self, inventory_delta, mover):
+    def _generate_inventory_delta(self):
+        """Generate an inventory delta for the current transform."""
+        inventory_delta = []
+        child_pb = bzrlib.ui.ui_factory.nested_progress_bar()
+        new_paths = self._inventory_altered()
+        total_entries = len(new_paths) + len(self._removed_id)
+        try:
+            for num, trans_id in enumerate(self._removed_id):
+                if (num % 10) == 0:
+                    child_pb.update('removing file', num, total_entries)
+                if trans_id == self._new_root:
+                    file_id = self._tree.get_root_id()
+                else:
+                    file_id = self.tree_file_id(trans_id)
+                # File-id isn't really being deleted, just moved
+                if file_id in self._r_new_id:
+                    continue
+                path = self._tree_id_paths[trans_id]
+                inventory_delta.append((path, None, file_id, None))
+            new_path_file_ids = dict((t, self.final_file_id(t)) for p, t in
+                                     new_paths)
+            entries = self._tree.iter_entries_by_dir(
+                new_path_file_ids.values())
+            old_paths = dict((e.file_id, p) for p, e in entries)
+            final_kinds = {}
+            for num, (path, trans_id) in enumerate(new_paths):
+                if (num % 10) == 0:
+                    child_pb.update('adding file',
+                                    num + len(self._removed_id), total_entries)
+                file_id = new_path_file_ids[trans_id]
+                if file_id is None:
+                    continue
+                needs_entry = False
+                try:
+                    kind = self.final_kind(trans_id)
+                except NoSuchFile:
+                    kind = self._tree.stored_kind(file_id)
+                parent_trans_id = self.final_parent(trans_id)
+                parent_file_id = new_path_file_ids.get(parent_trans_id)
+                if parent_file_id is None:
+                    parent_file_id = self.final_file_id(parent_trans_id)
+                if trans_id in self._new_reference_revision:
+                    new_entry = inventory.TreeReference(
+                        file_id,
+                        self._new_name[trans_id],
+                        self.final_file_id(self._new_parent[trans_id]),
+                        None, self._new_reference_revision[trans_id])
+                else:
+                    new_entry = inventory.make_entry(kind,
+                        self.final_name(trans_id),
+                        parent_file_id, file_id)
+                old_path = old_paths.get(new_entry.file_id)
+                new_executability = self._new_executability.get(trans_id)
+                if new_executability is not None:
+                    new_entry.executable = new_executability
+                inventory_delta.append(
+                    (old_path, path, new_entry.file_id, new_entry))
+        finally:
+            child_pb.finished()
+        return inventory_delta
+
+    def _apply_removals(self, mover):
         """Perform tree operations that remove directory/inventory names.
 
         That is, delete files that are to be deleted, and put any files that
@@ -1252,12 +1330,6 @@
                 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 \
@@ -1269,21 +1341,11 @@
                             raise
                     else:
                         self.rename_count += 1
-                if (trans_id in self._removed_id
-                    and inventory_delta is not None):
-                    if trans_id == self._new_root:
-                        file_id = self._tree.get_root_id()
-                    else:
-                        file_id = self.tree_file_id(trans_id)
-                    # File-id isn't really being deleted, just moved
-                    if file_id in self._r_new_id:
-                        continue
-                    inventory_delta.append((path, None, file_id, None))
         finally:
             child_pb.finished()
         return kind_changes
 
-    def _apply_insertions(self, inventory_delta, mover, kind_changes):
+    def _apply_insertions(self, mover):
         """Perform tree operations that insert directory/inventory names.
 
         That is, create any files that need to be created, and restore from
@@ -1296,19 +1358,13 @@
         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))
+        new_paths = self.new_paths(filesystem_only=True)
         modified_paths = []
-        completed_new = []
         new_path_file_ids = dict((t, self.final_file_id(t)) for p, t in
                                  new_paths)
-        if inventory_delta is not None:
-            entries = self._tree.iter_entries_by_dir(
-                new_path_file_ids.values())
-            old_paths = dict((e.file_id, p) for p, e in entries)
         child_pb = bzrlib.ui.ui_factory.nested_progress_bar()
         try:
             for num, (path, trans_id) in enumerate(new_paths):
-                new_entry = None
                 if (num % 10) == 0:
                     child_pb.update('adding file', num, len(new_paths))
                 full_path = self._tree.abspath(path)
@@ -1321,50 +1377,15 @@
                             raise
                     else:
                         self.rename_count += 1
-                if inventory_delta is not None:
-                    if (trans_id in self._new_contents or
-                        self.path_changed(trans_id)):
-                        if trans_id in self._new_contents:
-                            modified_paths.append(full_path)
-                            completed_new.append(trans_id)
-                    file_id = new_path_file_ids[trans_id]
-                    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 kind_changes):
-                        try:
-                            kind = self.final_kind(trans_id)
-                        except NoSuchFile:
-                            kind = self._tree.stored_kind(file_id)
-                        parent_trans_id = self.final_parent(trans_id)
-                        parent_file_id = new_path_file_ids.get(parent_trans_id)
-                        if parent_file_id is None:
-                            parent_file_id = self.final_file_id(
-                                parent_trans_id)
-                        if trans_id in self._new_reference_revision:
-                            new_entry = inventory.TreeReference(
-                                file_id,
-                                self._new_name[trans_id],
-                                self.final_file_id(self._new_parent[trans_id]),
-                                None, self._new_reference_revision[trans_id])
-                        else:
-                            new_entry = inventory.make_entry(kind,
-                                self.final_name(trans_id),
-                                parent_file_id, file_id)
-                        old_path = old_paths.get(new_entry.file_id)
-                        inventory_delta.append(
-                            (old_path, path, new_entry.file_id, new_entry))
-
+                if (trans_id in self._new_contents or
+                    self.path_changed(trans_id)):
+                    if trans_id in self._new_contents:
+                        modified_paths.append(full_path)
                 if trans_id in self._new_executability:
-                    self._set_executability(path, new_entry, trans_id)
+                    self._set_executability(path, trans_id)
         finally:
             child_pb.finished()
-        if inventory_delta is None:
-            self._new_contents.clear()
-        else:
-            for trans_id in completed_new:
-                del self._new_contents[trans_id]
+        self._new_contents.clear()
         return modified_paths
 
 




More information about the bazaar-commits mailing list