Rev 4807: Fix typo and tests for per-file merge hook in http://bazaar.launchpad.net/~vila/bzr/2.1-integration/
Vincent Ladeuil
v.ladeuil+lp at free.fr
Tue Feb 2 08:48:10 GMT 2010
At http://bazaar.launchpad.net/~vila/bzr/2.1-integration/
------------------------------------------------------------
revno: 4807 [merge]
revision-id: v.ladeuil+lp at free.fr-20100202084806-knoe10w8pwsx5l46
parent: pqm at pqm.ubuntu.com-20100130093410-xyutv8mobva3juuo
parent: v.ladeuil+lp at free.fr-20100202083612-eckp9epabk9arhwu
committer: Vincent Ladeuil <v.ladeuil+lp at free.fr>
branch nick: 2.1
timestamp: Tue 2010-02-02 09:48:06 +0100
message:
Fix typo and tests for per-file merge hook
modified:
NEWS NEWS-20050323055033-4e00b5db738777ff
bzrlib/merge.py merge.py-20050513021216-953b65a438527106
bzrlib/tests/__init__.py selftest.py-20050531073622-8d0e3c8845c97a64
bzrlib/tests/test_merge.py testmerge.py-20050905070950-c1b5aa49ff911024
bzrlib/tests/test_merge_core.py test_merge_core.py-20050824132511-eb99b23a0eec641b
-------------- next part --------------
=== modified file 'NEWS'
--- a/NEWS 2010-01-30 09:01:03 +0000
+++ b/NEWS 2010-02-02 08:36:12 +0000
@@ -26,6 +26,9 @@
increase memory pressure on processes using threads.
(Robert Collins, John Arbash Meinel, #514090)
+* The new ``merge_file_content`` should now be ok with tests to avoid
+ regressions.
+ (Vincent Ladeuil, #515597)
bzr 2.1.0rc2
############
=== modified file 'bzrlib/merge.py'
--- a/bzrlib/merge.py 2010-01-28 18:05:44 +0000
+++ b/bzrlib/merge.py 2010-02-01 17:29:44 +0000
@@ -99,9 +99,14 @@
This is a base class for concrete custom file merging logic. Concrete
classes should implement ``merge_text``.
+ See ``bzrlib.plugins.news_merge.news_merge`` for an example concrete class.
+
:ivar affected_files: The configured file paths to merge.
+
:cvar name_prefix: The prefix to use when looking up configuration
- details.
+ details. <name_prefix>_merge_files describes the files targeted by the
+ hook for example.
+
:cvar default_files: The default file paths to merge when no configuration
is present.
"""
@@ -118,6 +123,11 @@
raise ValueError("name_prefix must be set.")
def filename_matches_config(self, params):
+ """Check whether the file should call the merge hook.
+
+ <name_prefix>_merge_files configuration variable is a list of files
+ that should use the hook.
+ """
affected_files = self.affected_files
if affected_files is None:
config = self.merger.this_tree.branch.get_config()
@@ -150,7 +160,7 @@
# option.
not self.filename_matches_config(params)):
return 'not_applicable', None
- return self.merge_text(self, params)
+ return self.merge_text(params)
def merge_text(self, params):
"""Merge the byte contents of a single file.
=== modified file 'bzrlib/tests/__init__.py'
--- a/bzrlib/tests/__init__.py 2010-01-20 16:31:24 +0000
+++ b/bzrlib/tests/__init__.py 2010-02-02 08:36:12 +0000
@@ -921,7 +921,7 @@
self._lock_check_thorough = False
else:
self._lock_check_thorough = True
-
+
self.addCleanup(self._check_locks)
_mod_lock.Lock.hooks.install_named_hook('lock_acquired',
self._lock_acquired, None)
=== modified file 'bzrlib/tests/test_merge.py'
--- a/bzrlib/tests/test_merge.py 2010-01-28 18:05:44 +0000
+++ b/bzrlib/tests/test_merge.py 2010-02-02 08:36:12 +0000
@@ -2841,24 +2841,81 @@
class TestConfigurableFileMerger(tests.TestCaseWithTransport):
- def test_affected_files_cached(self):
- """Ensures that the config variable is cached"""
- class SimplePlan(_mod_merge.ConfigurableFileMerger):
+ def setUp(self):
+ super(TestConfigurableFileMerger, self).setUp()
+ self.calls = []
+
+ def get_merger_factory(self):
+ # Allows the inner methods to access the test attributes
+ test = self
+
+ class FooMerger(_mod_merge.ConfigurableFileMerger):
name_prefix = "foo"
- default_files = ["my default"]
+ default_files = ['bar']
+
def merge_text(self, params):
- return ('not applicable', None)
+ test.calls.append('merge_text')
+ return ('not_applicable', None)
+
def factory(merger):
- result = SimplePlan(merger)
+ result = FooMerger(merger)
+ # Make sure we start with a clean slate
self.assertEqual(None, result.affected_files)
+ # Track the original merger
self.merger = result
return result
+
+ return factory
+
+ def _install_hook(self, factory):
_mod_merge.Merger.hooks.install_named_hook('merge_file_content',
- factory, 'test factory')
+ factory, 'test factory')
+
+ def make_builder(self):
builder = test_merge_core.MergeBuilder(self.test_base_dir)
self.addCleanup(builder.cleanup)
- builder.add_file('NEWS', builder.tree_root, 'name1', 'text1', True)
- builder.change_contents('NEWS', other='text4', this='text3')
+ return builder
+
+ def make_text_conflict(self, file_name='bar'):
+ factory = self.get_merger_factory()
+ self._install_hook(factory)
+ builder = self.make_builder()
+ builder.add_file('bar-id', builder.tree_root, file_name, 'text1', True)
+ builder.change_contents('bar-id', other='text4', this='text3')
+ return builder
+
+ def make_kind_change(self):
+ factory = self.get_merger_factory()
+ self._install_hook(factory)
+ builder = self.make_builder()
+ builder.add_file('bar-id', builder.tree_root, 'bar', 'text1', True,
+ this=False)
+ builder.add_dir('bar-dir', builder.tree_root, 'bar-id',
+ base=False, other=False)
+ return builder
+
+ def test_affected_files_cached(self):
+ """Ensures that the config variable is cached"""
+ builder = self.make_text_conflict()
conflicts = builder.merge()
# The hook should set the variable
- self.assertEqual(["my default"], self.merger.affected_files)
+ self.assertEqual(['bar'], self.merger.affected_files)
+ self.assertEqual(1, len(conflicts))
+
+ def test_hook_called_for_text_conflicts(self):
+ builder = self.make_text_conflict()
+ conflicts = builder.merge()
+ # The hook should call the merge_text() method
+ self.assertEqual(['merge_text'], self.calls)
+
+ def test_hook_not_called_for_kind_change(self):
+ builder = self.make_kind_change()
+ conflicts = builder.merge()
+ # The hook should not call the merge_text() method
+ self.assertEqual([], self.calls)
+
+ def test_hook_not_called_for_other_files(self):
+ builder = self.make_text_conflict('foobar')
+ conflicts = builder.merge()
+ # The hook should not call the merge_text() method
+ self.assertEqual([], self.calls)
=== modified file 'bzrlib/tests/test_merge_core.py'
--- a/bzrlib/tests/test_merge_core.py 2010-01-15 03:58:20 +0000
+++ b/bzrlib/tests/test_merge_core.py 2010-02-02 08:36:12 +0000
@@ -114,10 +114,11 @@
tt.cancel_versioning(trans_id)
tt.set_executability(None, trans_id)
- def add_dir(self, file_id, parent, name):
- for tt in self.list_transforms():
- parent_id = tt.trans_id_file_id(parent)
- tt.new_directory(name, parent_id, file_id)
+ def add_dir(self, file_id, parent, name, this=True, base=True, other=True):
+ for option, tt in self.selected_transforms(this, base, other):
+ if option is True:
+ parent_id = tt.trans_id_file_id(parent)
+ tt.new_directory(name, parent_id, file_id)
def change_name(self, id, base=None, this=None, other=None):
for val, tt in ((base, self.base_tt), (this, self.this_tt),
More information about the bazaar-commits
mailing list