/brz/remove-bazaar

To get this branch, use:
bzr branch http://gegoxaren.bato24.eu/bzr/brz/remove-bazaar

« back to all changes in this revision

Viewing changes to breezy/tests/per_merger.py

  • Committer: Jelmer Vernooij
  • Date: 2018-02-18 21:42:57 UTC
  • mto: This revision was merged to the branch mainline in revision 6859.
  • Revision ID: jelmer@jelmer.uk-20180218214257-jpevutp1wa30tz3v
Update TODO to reference Breezy, not Bazaar.

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
 
# Copyright (C) 2009, 2010 Canonical Ltd
 
1
# Copyright (C) 2009, 2010, 2011 Canonical Ltd
2
2
#
3
3
# This program is free software; you can redistribute it and/or modify
4
4
# it under the terms of the GNU General Public License as published by
14
14
# along with this program; if not, write to the Free Software
15
15
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
16
16
 
17
 
"""Implementation tests for bzrlib.merge.Merger."""
 
17
"""Implementation tests for breezy.merge.Merger."""
18
18
 
19
19
import os
20
20
 
21
 
from bzrlib.conflicts import TextConflict
22
 
from bzrlib import (
 
21
from ..conflicts import TextConflict
 
22
from .. import (
23
23
    errors,
24
24
    merge as _mod_merge,
25
 
    option,
26
 
    progress,
27
25
    )
28
 
from bzrlib.tests import (
 
26
from . import (
29
27
    multiply_tests,
30
28
    TestCaseWithTransport,
31
29
    )
32
 
from bzrlib.tests.test_merge_core import MergeBuilder
33
 
from bzrlib.transform import TreeTransform
34
 
 
35
 
 
36
 
 
37
 
def load_tests(standard_tests, module, loader):
 
30
from .test_merge_core import MergeBuilder
 
31
from ..transform import TreeTransform
 
32
 
 
33
 
 
34
 
 
35
def load_tests(loader, standard_tests, pattern):
38
36
    """Multiply tests for tranport implementations."""
39
37
    result = loader.suiteClass()
40
38
    scenarios = [
41
39
        (name, {'merge_type': merger})
42
 
        for name, merger in option._merge_type_registry.items()]
 
40
        for name, merger in _mod_merge.merge_type_registry.items()]
43
41
    return multiply_tests(standard_tests, scenarios, result)
44
42
 
45
43
 
46
44
class TestMergeImplementation(TestCaseWithTransport):
47
45
 
48
46
    def do_merge(self, target_tree, source_tree, **kwargs):
49
 
        merger = _mod_merge.Merger.from_revision_ids(None,
 
47
        merger = _mod_merge.Merger.from_revision_ids(
50
48
            target_tree, source_tree.last_revision(),
51
49
            other_branch=source_tree.branch)
52
50
        merger.merge_type=self.merge_type
64
62
        ])
65
63
        this_tree.add(['file1', 'file2'])
66
64
        this_tree.commit('Added files')
67
 
        other_tree = this_tree.bzrdir.sprout('other').open_workingtree()
 
65
        other_tree = this_tree.controldir.sprout('other').open_workingtree()
68
66
        self.build_tree_contents([
69
67
            ('other/file1', 'a\nb\nc\n'),
70
68
            ('other/file2', 'a\nb\nc\n')
88
86
        ])
89
87
        this_tree.add('file1',)
90
88
        this_tree.commit('Added file')
91
 
        other_tree = this_tree.bzrdir.sprout('other').open_workingtree()
 
89
        other_tree = this_tree.controldir.sprout('other').open_workingtree()
92
90
        self.build_tree_contents([
93
91
            ('other/file1', 'line 1\nline 2 to 2.1\nline 3\nline 4\n'),
94
92
        ])
127
125
        # the modification should be considered a conflict
128
126
        builder = self.make_branch_builder('test')
129
127
        builder.start_series()
130
 
        builder.build_snapshot('BASE-id', None,
 
128
        builder.build_snapshot(None,
131
129
            [('add', ('', None, 'directory', None)),
132
130
             ('add', ('foo', 'foo-id', 'file', 'a\nb\nc\nd\ne\n')),
133
 
            ])
 
131
            ], revision_id='BASE-id')
134
132
        # Delete 'b\n'
135
 
        builder.build_snapshot('OTHER-id', ['BASE-id'],
136
 
            [('modify', ('foo-id', 'a\nc\nd\ne\n'))])
 
133
        builder.build_snapshot(['BASE-id'],
 
134
            [('modify', ('foo-id', 'a\nc\nd\ne\n'))],
 
135
            revision_id='OTHER-id')
137
136
        # Modify 'b\n', add 'X\n'
138
 
        builder.build_snapshot('THIS-id', ['BASE-id'],
139
 
            [('modify', ('foo-id', 'a\nb2\nc\nd\nX\ne\n'))])
 
137
        builder.build_snapshot(['BASE-id'],
 
138
            [('modify', ('foo-id', 'a\nb2\nc\nd\nX\ne\n'))],
 
139
            revision_id='THIS-id')
140
140
        builder.finish_series()
141
141
        branch = builder.get_branch()
142
 
        this_tree = branch.bzrdir.create_workingtree()
 
142
        this_tree = branch.controldir.create_workingtree()
143
143
        this_tree.lock_write()
144
144
        self.addCleanup(this_tree.unlock)
145
 
        other_tree = this_tree.bzrdir.sprout('other',
 
145
        other_tree = this_tree.controldir.sprout('other',
146
146
                                             'OTHER-id').open_workingtree()
147
147
        self.do_merge(this_tree, other_tree)
148
148
        if self.merge_type is _mod_merge.LCAMerger:
176
176
        transform.finalize()
177
177
        return (limbodir, deletiondir)
178
178
 
179
 
    def test_merge_with_existing_limbo(self):
180
 
        wt = self.make_branch_and_tree('this')
181
 
        (limbodir, deletiondir) =  self.get_limbodir_deletiondir(wt)
182
 
        os.mkdir(limbodir)
 
179
    def test_merge_with_existing_limbo_empty(self):
 
180
        """Empty limbo dir is just cleaned up - see bug 427773"""
 
181
        wt = self.make_branch_and_tree('this')
 
182
        (limbodir, deletiondir) =  self.get_limbodir_deletiondir(wt)
 
183
        os.mkdir(limbodir)
 
184
        self.do_merge(wt, wt)
 
185
 
 
186
    def test_merge_with_existing_limbo_non_empty(self):
 
187
        wt = self.make_branch_and_tree('this')
 
188
        (limbodir, deletiondir) =  self.get_limbodir_deletiondir(wt)
 
189
        os.mkdir(limbodir)
 
190
        os.mkdir(os.path.join(limbodir, 'something'))
183
191
        self.assertRaises(errors.ExistingLimbo, self.do_merge, wt, wt)
184
192
        self.assertRaises(errors.LockError, wt.unlock)
185
193
 
186
 
    def test_merge_with_pending_deletion(self):
187
 
        wt = self.make_branch_and_tree('this')
188
 
        (limbodir, deletiondir) =  self.get_limbodir_deletiondir(wt)
189
 
        os.mkdir(deletiondir)
 
194
    def test_merge_with_pending_deletion_empty(self):
 
195
        wt = self.make_branch_and_tree('this')
 
196
        (limbodir, deletiondir) =  self.get_limbodir_deletiondir(wt)
 
197
        os.mkdir(deletiondir)
 
198
        self.do_merge(wt, wt)
 
199
 
 
200
    def test_merge_with_pending_deletion_non_empty(self):
 
201
        """Also see bug 427773"""
 
202
        wt = self.make_branch_and_tree('this')
 
203
        (limbodir, deletiondir) =  self.get_limbodir_deletiondir(wt)
 
204
        os.mkdir(deletiondir)
 
205
        os.mkdir(os.path.join(deletiondir, 'something'))
190
206
        self.assertRaises(errors.ExistingPendingDeletion, self.do_merge, wt, wt)
191
207
        self.assertRaises(errors.LockError, wt.unlock)
192
208
 
195
211
    """Tests that the 'merge_file_content' hook is invoked."""
196
212
 
197
213
    def setUp(self):
198
 
        TestCaseWithTransport.setUp(self)
 
214
        super(TestHookMergeFileContent, self).setUp()
199
215
        self.hook_log = []
200
216
 
201
217
    def install_hook_inactive(self):
296
312
        conflicts = builder.merge(self.merge_type)
297
313
        self.assertEqual(conflicts, [])
298
314
        self.assertEqual(
299
 
            builder.this.get_file('1').read(), 'text-merged-by-hook')
 
315
            builder.this.get_file('name1').read(), 'text-merged-by-hook')
300
316
 
301
317
    def test_change_vs_deleted(self):
302
318
        """Hook is used for (changed, deleted)"""
308
324
        conflicts = builder.merge(self.merge_type)
309
325
        self.assertEqual(conflicts, [])
310
326
        self.assertEqual(
311
 
            builder.this.get_file('1').read(), 'text-merged-by-hook')
 
327
            builder.this.get_file('name1').read(), 'text-merged-by-hook')
312
328
 
313
329
    def test_result_can_be_delete(self):
314
330
        """A hook's result can be the deletion of a file."""
330
346
        # The hook still gets to set the file contents in this case, so that it
331
347
        # can insert custom conflict markers.
332
348
        self.assertEqual(
333
 
            builder.this.get_file('1').read(),
 
349
            builder.this.get_file('name1').read(),
334
350
            'text-with-conflict-markers-from-hook')
335
351
 
336
352
    def test_can_access_this_other_and_base_versions(self):
354
370
        conflicts = builder.merge(self.merge_type)
355
371
        self.assertEqual(conflicts, [])
356
372
        self.assertEqual(
357
 
            builder.this.get_file('1').read(), 'text-merged-by-hook')
 
373
            builder.this.get_file('name1').read(), 'text-merged-by-hook')
358
374
        self.assertEqual([('inactive',), ('success',)], self.hook_log)
359
375
 
360
376
    def test_chain_when_not_applicable(self):
368
384
        conflicts = builder.merge(self.merge_type)
369
385
        self.assertEqual(conflicts, [])
370
386
        self.assertEqual(
371
 
            builder.this.get_file('1').read(), 'text-merged-by-hook')
 
387
            builder.this.get_file('name1').read(), 'text-merged-by-hook')
372
388
        self.assertEqual([('no-op',), ('success',)], self.hook_log)
373
389
 
374
390
    def test_chain_stops_after_success(self):