Merge lp:~jelmer/bzr/transform-hooks into lp:bzr/2.5

Proposed by Jelmer Vernooij
Status: Merged
Approved by: Jelmer Vernooij
Approved revision: no longer in the source branch.
Merged at revision: 6444
Proposed branch: lp:~jelmer/bzr/transform-hooks
Merge into: lp:bzr/2.5
Diff against target: 128 lines (+56/-2)
4 files modified
bzrlib/mutabletree.py (+9/-1)
bzrlib/tests/test_transform.py (+38/-0)
bzrlib/transform.py (+5/-1)
doc/en/release-notes/bzr-2.5.txt (+4/-0)
To merge this branch: bzr merge lp:~jelmer/bzr/transform-hooks
Reviewer Review Type Date Requested Status
Vincent Ladeuil Pending
Review via email: mp+89007@code.launchpad.net

This proposal supersedes a proposal from 2012-01-06.

Commit message

Add pre_transform and post_transform hooks.

Description of the change

Add pre_transform and post_transform hooks to MutableTree.

To post a comment you must log in.
Revision history for this message
Vincent Ladeuil (vila) wrote : Posted in a previous version of this proposal

Fine to land in trunk (aka s/2.5/2.6 and move... news entry :-p)

review: Approve
Revision history for this message
Jelmer Vernooij (jelmer) wrote :

sent to pqm by email

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
1=== modified file 'bzrlib/mutabletree.py'
2--- bzrlib/mutabletree.py 2012-01-06 14:09:04 +0000
3+++ bzrlib/mutabletree.py 2012-01-18 10:57:25 +0000
4@@ -520,10 +520,18 @@
5 "called with a bzrlib.mutabletree.PostCommitHookParams object. "
6 "The mutable tree the commit was performed on is available via "
7 "the mutable_tree attribute of that object.", (2, 0))
8+ self.add_hook('pre_transform',
9+ "Called before a tree transform on this tree. The hook is called "
10+ "with the tree that is being transformed and the transform.",
11+ (2, 5))
12 self.add_hook('post_build_tree',
13 "Called after a completely new tree is built. The hook is "
14 "called with the tree as its only argument.", (2, 5))
15-
16+ self.add_hook('post_transform',
17+ "Called after a tree transform has been performed on a tree. "
18+ "The hook is called with the tree that is being transformed and "
19+ "the transform.",
20+ (2, 5))
21
22 # install the default hooks into the MutableTree class.
23 MutableTree.hooks = MutableTreeHooks()
24
25=== modified file 'bzrlib/tests/test_transform.py'
26--- bzrlib/tests/test_transform.py 2011-11-17 13:45:49 +0000
27+++ bzrlib/tests/test_transform.py 2012-01-18 10:57:25 +0000
28@@ -60,6 +60,7 @@
29 pathjoin,
30 )
31 from bzrlib.merge import Merge3Merger, Merger
32+from bzrlib.mutabletree import MutableTree
33 from bzrlib.tests import (
34 features,
35 TestCaseInTempDir,
36@@ -3717,3 +3718,40 @@
37 remaining_conflicts.pop())
38 self.assertLength(1, warnings)
39 self.assertStartsWith(warnings[0], 'donttouchmypreciouuus')
40+
41+
42+class TestTransformHooks(tests.TestCaseWithTransport):
43+
44+ def setUp(self):
45+ super(TestTransformHooks, self).setUp()
46+ self.wt = self.make_branch_and_tree('.')
47+ os.chdir('..')
48+
49+ def get_transform(self):
50+ transform = TreeTransform(self.wt)
51+ self.addCleanup(transform.finalize)
52+ return transform, transform.root
53+
54+ def test_pre_commit_hooks(self):
55+ calls = []
56+ def record_pre_transform(tree, tt):
57+ calls.append((tree, tt))
58+ MutableTree.hooks.install_named_hook('pre_transform',
59+ record_pre_transform, "Pre transform")
60+ transform, root = self.get_transform()
61+ old_root_id = transform.tree_file_id(root)
62+ transform.apply()
63+ self.assertEqual(old_root_id, self.wt.get_root_id())
64+ self.assertEquals([(self.wt, transform)], calls)
65+
66+ def test_post_commit_hooks(self):
67+ calls = []
68+ def record_post_transform(tree, tt):
69+ calls.append((tree, tt))
70+ MutableTree.hooks.install_named_hook('post_transform',
71+ record_post_transform, "Post transform")
72+ transform, root = self.get_transform()
73+ old_root_id = transform.tree_file_id(root)
74+ transform.apply()
75+ self.assertEqual(old_root_id, self.wt.get_root_id())
76+ self.assertEquals([(self.wt, transform)], calls)
77
78=== modified file 'bzrlib/transform.py'
79--- bzrlib/transform.py 2012-01-17 14:45:27 +0000
80+++ bzrlib/transform.py 2012-01-18 10:57:25 +0000
81@@ -50,6 +50,7 @@
82 ExistingLimbo, ImmortalLimbo, NoFinalPath,
83 UnableCreateSymlink)
84 from bzrlib.filters import filtered_output_bytes, ContentFilterContext
85+from bzrlib.mutabletree import MutableTree
86 from bzrlib.osutils import (
87 delete_any,
88 file_kind,
89@@ -57,7 +58,6 @@
90 pathjoin,
91 sha_file,
92 splitpath,
93- supports_executable,
94 )
95 from bzrlib.progress import ProgressPhase
96 from bzrlib.symbol_versioning import (
97@@ -156,6 +156,8 @@
98 """
99 if self._tree is None:
100 return
101+ for hook in MutableTree.hooks['post_transform']:
102+ hook(self._tree, self)
103 self._tree.unlock()
104 self._tree = None
105
106@@ -1722,6 +1724,8 @@
107 calculating one.
108 :param _mover: Supply an alternate FileMover, for testing
109 """
110+ for hook in MutableTree.hooks['pre_transform']:
111+ hook(self._tree, self)
112 if not no_conflicts:
113 self._check_malformed()
114 child_pb = ui.ui_factory.nested_progress_bar()
115
116=== modified file 'doc/en/release-notes/bzr-2.5.txt'
117--- doc/en/release-notes/bzr-2.5.txt 2012-01-17 16:02:03 +0000
118+++ doc/en/release-notes/bzr-2.5.txt 2012-01-18 10:57:25 +0000
119@@ -52,6 +52,10 @@
120 .. Major internal changes, unlikely to be visible to users or plugin
121 developers, but interesting for bzr developers.
122
123+* ``MutableTree`` has two new hooks ``pre_transform`` and
124+ ``post_transform`` that are called for tree transform operations.
125+ (Jelmer Vernooij, #912084)
126+
127 Testing
128 *******
129

Subscribers

People subscribed via source and target branches