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