Rev 4681: Refactor the tests a bit. in http://bazaar.launchpad.net/~jameinel/bzr/2.0.1-faster-get-deltas-bug374730

John Arbash Meinel john at arbash-meinel.com
Thu Sep 24 23:01:15 BST 2009


At http://bazaar.launchpad.net/~jameinel/bzr/2.0.1-faster-get-deltas-bug374730

------------------------------------------------------------
revno: 4681
revision-id: john at arbash-meinel.com-20090924220102-r0wjsrf47i1y7cpw
parent: john at arbash-meinel.com-20090924214152-pv21z2k7a2uddy63
committer: John Arbash Meinel <john at arbash-meinel.com>
branch nick: 2.0.1-faster-get-deltas-bug374730
timestamp: Thu 2009-09-24 17:01:02 -0500
message:
  Refactor the tests a bit.
  
  The time is down a little (1m13s), but it seems to be missing one ancestry
  in bzr.dev's log of 'tools'.
-------------- next part --------------
=== modified file 'bzrlib/delta.py'
--- a/bzrlib/delta.py	2009-03-23 14:59:43 +0000
+++ b/bzrlib/delta.py	2009-09-24 22:01:02 +0000
@@ -219,15 +219,22 @@
 def _compare_trees(old_tree, new_tree, want_unchanged, specific_files,
                    include_root, extra_trees=None,
                    require_versioned=False, want_unversioned=False):
+
+    return _iter_changes_to_tree_delta(new_tree.iter_changes(old_tree, want_unchanged,
+            specific_files, extra_trees=extra_trees,
+            require_versioned=require_versioned,
+            want_unversioned=want_unversioned),
+            include_root=include_root)
+
+
+def _iter_changes_to_tree_delta(changes, include_root):
+
     """Worker function that implements Tree.changes_from."""
     delta = TreeDelta()
     # mutter('start compare_trees')
 
     for (file_id, path, content_change, versioned, parent_id, name, kind,
-         executable) in new_tree.iter_changes(old_tree, want_unchanged,
-            specific_files, extra_trees=extra_trees,
-            require_versioned=require_versioned,
-            want_unversioned=want_unversioned):
+         executable) in changes:
         if versioned == (False, False):
             delta.unversioned.append((path[1], None, kind[1]))
             continue

=== modified file 'bzrlib/repofmt/groupcompress_repo.py'
--- a/bzrlib/repofmt/groupcompress_repo.py	2009-09-24 21:32:40 +0000
+++ b/bzrlib/repofmt/groupcompress_repo.py	2009-09-24 22:01:02 +0000
@@ -1016,39 +1016,30 @@
         for revision in revisions:
             if not revision.parent_ids:
                 old_tree = self.revision_tree(_mod_revision.NULL_REVISION)
+                old_interesting_ids = ()
             else:
                 old_tree = trees[revision.parent_ids[0]]
+                if specific_fileids:
+                    (old_interesting_ids,
+                     _) = old_tree.inventory._expand_fileids_to_parents_and_children(
+                                specific_fileids)
             tree = trees[revision.revision_id]
             if specific_fileids is None:
                 yield tree.changes_from(old_tree)
                 continue
-            # Unfortunately, iter_changes the interface is passed
-            # specific_files, but internally RevisionTrees do all the work in
-            # specific files... :(
-            paths = set()
-            for file_id in specific_fileids:
-                try:
-                    path = old_tree.id2path(file_id)
-                except errors.NoSuchId:
-                    pass # not present in this tree
-                else:
-                    paths.add(path)
-                try:
-                    path = tree.id2path(file_id)
-                except errors.NoSuchId:
-                    pass # not present in this tree
-                else:
-                    paths.add(path)
-            if not paths:
-                # None of the requested paths are versioned, and
-                # tree.changes_from() implements specific_files=[] as meaning
-                # compare *all* changes... :(
-                # Taken from InterTree.compare()
-                # All files are unversioned, so just return an empty delta
-                # _compare_trees would think we want a complete delta
-                yield _mod_delta.TreeDelta()
-            else:
-                yield tree.changes_from(old_tree, specific_files=paths)
+
+            (all_interesting_ids,
+             _) = tree.inventory._expand_fileids_to_parents_and_children(
+                        specific_fileids)
+            all_interesting_ids.update(old_interesting_ids)
+            # We should probably also do the expansion on the other side...
+            delta = []
+            for one_delta in tree.iter_changes(old_tree):
+                file_id = one_delta[0]
+                if file_id in all_interesting_ids:
+                    delta.append(one_delta)
+            yield _mod_delta._iter_changes_to_tree_delta(delta,
+                        include_root=False) # default for changes_from()
 
 
     def _reconcile_pack(self, collection, packs, extension, revs, pb):

=== modified file 'bzrlib/tests/per_repository/test_get_deltas_for_revisions.py'
--- a/bzrlib/tests/per_repository/test_get_deltas_for_revisions.py	2009-09-24 21:41:52 +0000
+++ b/bzrlib/tests/per_repository/test_get_deltas_for_revisions.py	2009-09-24 22:01:02 +0000
@@ -60,14 +60,19 @@
         self.addCleanup(repo.unlock)
         return repo
 
+    def get_all_deltas(self, repo, *args, **kwargs):
+        revisions = [repo.get_revision(r) for r in
+                     ['rev1', 'rev2', 'rev3', 'rev4', 'rev5', 'rev6']]
+        return list(repo.get_deltas_for_revisions(revisions, *args, **kwargs))
+
     def test_all_changes(self):
         repo = self.make_repo_with_history()
-        revisions = [repo.get_revision(r) for r in
-                     ['rev1', 'rev2', 'rev3', 'rev4', 'rev5', 'rev6']]
-        deltas1 = list(repo.get_deltas_for_revisions(revisions))
-        # TODO: this is a bad test, as 'get_revision_delta()' is
+        # TODO: this isn't a great test, as 'get_revision_delta()' is
         #       implemented in terms of get_deltas_for_revisions()...
         #       but it is the test we had before
+        revisions = [repo.get_revision(r) for r in
+                     ['rev1', 'rev2', 'rev3', 'rev4', 'rev5', 'rev6']]
+        deltas1 = list(repo.get_deltas_for_revisions(revisions))
         deltas2 = [repo.get_revision_delta(r.revision_id) for r in revisions]
         self.assertEqual(deltas1, deltas2)
         for delta in deltas1:
@@ -78,29 +83,20 @@
 
     def test_filtered_file_changes(self):
         repo = self.make_repo_with_history()
-        revisions = [repo.get_revision(r) for r in
-                     ['rev1', 'rev2', 'rev3', 'rev4', 'rev5', 'rev6']]
-        deltas = list(repo.get_deltas_for_revisions(revisions,
-                      specific_fileids=['subfile-id']))
+        deltas = self.get_all_deltas(repo, specific_fileids=['subfile-id'])
         # Only modified in rev1 and rev5
         self.assertEqual([True, False, False, False, True, False],
                          [d.has_changed() for d in deltas])
 
     def test_filtered_dirs_include_children(self):
         repo = self.make_repo_with_history()
-        revisions = [repo.get_revision(r) for r in
-                     ['rev1', 'rev2', 'rev3', 'rev4', 'rev5', 'rev6']]
-        deltas = list(repo.get_deltas_for_revisions(revisions,
-                      specific_fileids=['dir-id']))
+        deltas = self.get_all_deltas(repo, specific_fileids=['dir-id'])
         # a child was modified in all but rev2
         self.assertEqual([True, False, True, True, True, True],
                          [d.has_changed() for d in deltas])
 
     def test_filtered_includes_parents(self):
         repo = self.make_repo_with_history()
-        revisions = [repo.get_revision(r) for r in
-                     ['rev1', 'rev2', 'rev3', 'rev4', 'rev5', 'rev6']]
-        deltas = list(repo.get_deltas_for_revisions(revisions,
-                      specific_fileids=['subsubfile-id']))
+        deltas = self.get_all_deltas(repo, specific_fileids=['subsubfile-id'])
         self.assertEqual([True, False, True, True, False, True],
                          [d.has_changed() for d in deltas])



More information about the bazaar-commits mailing list