~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to bzrlib/tests/test_conflicts.py

  • Committer: Canonical.com Patch Queue Manager
  • Date: 2010-03-02 08:49:07 UTC
  • mfrom: (5067.1.1 integration)
  • Revision ID: pqm@pqm.ubuntu.com-20100302084907-z4r0yoa4ldspjz82
(vila) Resolve --take-this or --take-other correctly rename kept file

Show diffs side-by-side

added added

removed removed

Lines of Context:
18
18
import os
19
19
 
20
20
from bzrlib import (
 
21
    branchbuilder,
21
22
    bzrdir,
22
23
    conflicts,
23
24
    errors,
24
25
    option,
25
26
    tests,
 
27
    workingtree,
26
28
    )
27
29
from bzrlib.tests import script
28
30
 
29
31
 
 
32
def load_tests(standard_tests, module, loader):
 
33
    result = loader.suiteClass()
 
34
 
 
35
    sp_tests, remaining_tests = tests.split_suite_by_condition(
 
36
        standard_tests, tests.condition_isinstance((
 
37
                TestResolveContentConflicts,
 
38
                )))
 
39
    tests.multiply_tests(sp_tests, content_conflict_scenarios(), result)
 
40
 
 
41
    # No parametrization for the remaining tests
 
42
    result.addTests(remaining_tests)
 
43
 
 
44
    return result
 
45
 
 
46
 
30
47
# TODO: Test commit with some added, and added-but-missing files
31
48
# RBC 20060124 is that not tested in test_commit.py ?
32
49
 
69
86
                                  ('hello.sploo.OTHER', 'yellowworld2'),
70
87
                                  ])
71
88
        tree.lock_read()
72
 
        self.assertEqual(6, len(list(tree.list_files())))
 
89
        self.assertLength(6, list(tree.list_files()))
73
90
        tree.unlock()
74
91
        tree_conflicts = tree.conflicts()
75
 
        self.assertEqual(2, len(tree_conflicts))
 
92
        self.assertLength(2, tree_conflicts)
76
93
        self.assertTrue('hello' in tree_conflicts[0].path)
77
94
        self.assertTrue('hello.sploo' in tree_conflicts[1].path)
78
95
        conflicts.restore('hello')
79
96
        conflicts.restore('hello.sploo')
80
 
        self.assertEqual(0, len(tree.conflicts()))
 
97
        self.assertLength(0, tree.conflicts())
81
98
        self.assertFileEqual('hello world2', 'hello')
82
99
        self.assertFalse(os.path.lexists('hello.sploo'))
83
100
        self.assertRaises(errors.NotConflicted, conflicts.restore, 'hello')
192
209
    pass
193
210
 
194
211
 
195
 
class TestResolveContentConflicts(TestResolveConflicts):
196
 
 
197
 
    # FIXME: We need to add the reverse case (delete in trunk, modify in
198
 
    # branch) but that could wait until the resolution mechanism is implemented.
199
 
 
200
 
    preamble = """
201
 
$ bzr init trunk
202
 
$ cd trunk
203
 
$ echo 'trunk content' >file
204
 
$ bzr add file
205
 
$ bzr commit -m 'Create trunk'
206
 
 
207
 
$ bzr branch . ../branch
208
 
$ cd ../branch
209
 
$ bzr rm file
210
 
$ bzr commit -m 'Delete file'
211
 
 
212
 
$ cd ../trunk
213
 
$ echo 'more content' >>file
214
 
$ bzr commit -m 'Modify file'
215
 
 
216
 
$ cd ../branch
217
 
$ bzr merge ../trunk
218
 
2>+N  file.OTHER
219
 
2>Contents conflict in file
220
 
2>1 conflicts encountered.
221
 
"""
222
 
 
223
 
    def test_take_this(self):
224
 
        self.run_script("""
225
 
$ bzr rm file.OTHER --force # a simple rm file.OTHER is valid too
226
 
$ bzr resolve file
227
 
$ bzr commit --strict -m 'No more conflicts nor unknown files'
228
 
""")
229
 
 
230
 
    def test_take_other(self):
231
 
        self.run_script("""
232
 
$ bzr mv file.OTHER file
233
 
$ bzr resolve file
234
 
$ bzr commit --strict -m 'No more conflicts nor unknown files'
235
 
""")
 
212
def content_conflict_scenarios():
 
213
    return [('file,None', dict(_this_actions='modify_file',
 
214
                               _check_this='file_has_more_content',
 
215
                               _other_actions='delete_file',
 
216
                               _check_other='file_doesnt_exist',
 
217
                               )),
 
218
            ('None,file', dict(_this_actions='delete_file',
 
219
                               _check_this='file_doesnt_exist',
 
220
                               _other_actions='modify_file',
 
221
                               _check_other='file_has_more_content',
 
222
                               )),
 
223
            ]
 
224
 
 
225
 
 
226
class TestResolveContentConflicts(tests.TestCaseWithTransport):
 
227
 
 
228
    # Set by load_tests
 
229
    this_actions = None
 
230
    other_actions = None
 
231
 
 
232
    def setUp(self):
 
233
        super(TestResolveContentConflicts, self).setUp()
 
234
        builder = self.make_branch_builder('trunk')
 
235
        builder.start_series()
 
236
        # Create an empty trunk
 
237
        builder.build_snapshot('start', None, [
 
238
                ('add', ('', 'root-id', 'directory', ''))])
 
239
        # Add a minimal base content
 
240
        builder.build_snapshot('base', ['start'], [
 
241
                ('add', ('file', 'file-id', 'file', 'trunk content\n'))])
 
242
        # Modify the base content in branch
 
243
        other_actions = self._get_actions(self._other_actions)
 
244
        builder.build_snapshot('other', ['base'], other_actions())
 
245
        # Modify the base content in trunk
 
246
        this_actions = self._get_actions(self._this_actions)
 
247
        builder.build_snapshot('this', ['base'], this_actions())
 
248
        builder.finish_series()
 
249
        self.builder = builder
 
250
 
 
251
    def _get_actions(self, name):
 
252
        return getattr(self, 'do_%s' % name)
 
253
 
 
254
    def _get_check(self, name):
 
255
        return getattr(self, 'check_%s' % name)
 
256
 
 
257
    def do_modify_file(self):
 
258
        return [('modify', ('file-id', 'trunk content\nmore content\n'))]
 
259
 
 
260
    def check_file_has_more_content(self):
 
261
        self.assertFileEqual('trunk content\nmore content\n', 'branch/file')
 
262
 
 
263
    def do_delete_file(self):
 
264
        return [('unversion', 'file-id')]
 
265
 
 
266
    def check_file_doesnt_exist(self):
 
267
        self.failIfExists('branch/file')
 
268
 
 
269
    def _merge_other_into_this(self):
 
270
        b = self.builder.get_branch()
 
271
        wt = b.bzrdir.sprout('branch').open_workingtree()
 
272
        wt.merge_from_branch(b, 'other')
 
273
        return wt
 
274
 
 
275
    def assertConflict(self, wt, ctype, **kwargs):
 
276
        confs = wt.conflicts()
 
277
        self.assertLength(1, confs)
 
278
        c = confs[0]
 
279
        self.assertIsInstance(c, ctype)
 
280
        sentinel = object() # An impossible value
 
281
        for k, v in kwargs.iteritems():
 
282
            self.assertEqual(v, getattr(c, k, sentinel))
 
283
 
 
284
    def check_resolved(self, wt, item, action):
 
285
        conflicts.resolve(wt, [item], action=action)
 
286
        # Check that we don't have any conflicts nor unknown left
 
287
        self.assertLength(0, wt.conflicts())
 
288
        self.assertLength(0, list(wt.unknowns()))
236
289
 
237
290
    def test_resolve_taking_this(self):
238
 
        self.run_script("""
239
 
$ bzr resolve --take-this file
240
 
$ bzr commit --strict -m 'No more conflicts nor unknown files'
241
 
""")
 
291
        wt = self._merge_other_into_this()
 
292
        self.assertConflict(wt, conflicts.ContentsConflict,
 
293
                            path='file', file_id='file-id',)
 
294
        self.check_resolved(wt, 'file', 'take_this')
 
295
        check_this = self._get_check(self._check_this)
 
296
        check_this()
242
297
 
243
298
    def test_resolve_taking_other(self):
244
 
        self.run_script("""
245
 
$ bzr resolve --take-other file
246
 
$ bzr commit --strict -m 'No more conflicts nor unknown files'
247
 
""")
 
299
        wt = self._merge_other_into_this()
 
300
        self.assertConflict(wt, conflicts.ContentsConflict,
 
301
                            path='file', file_id='file-id',)
 
302
        self.check_resolved(wt, 'file', 'take_other')
 
303
        check_other = self._get_check(self._check_other)
 
304
        check_other()
248
305
 
249
306
 
250
307
class TestResolveDuplicateEntry(TestResolveConflicts):
255
312
$ echo 'trunk content' >file
256
313
$ bzr add file
257
314
$ bzr commit -m 'Create trunk'
 
315
 
258
316
$ echo 'trunk content too' >file2
259
317
$ bzr add file2
260
318
$ bzr commit -m 'Add file2 in trunk'
314
372
$ mkdir dir
315
373
$ bzr add dir
316
374
$ bzr commit -m 'Create trunk'
 
375
 
317
376
$ echo 'trunk content' >dir/file
318
377
$ bzr add dir/file
319
378
$ bzr commit -m 'Add dir/file in trunk'
354
413
$ echo 'trunk content' >dir/file
355
414
$ bzr add
356
415
$ bzr commit -m 'Create trunk'
 
416
 
357
417
$ echo 'trunk content' >dir/file2
358
418
$ bzr add dir/file2
359
419
$ bzr commit -m 'Add dir/file2 in branch'
415
475
$ echo 'trunk content' >dir/file
416
476
$ bzr add
417
477
$ bzr commit -m 'Create trunk'
 
478
 
418
479
$ bzr rm dir/file --force
419
480
$ bzr rm dir --force
420
481
$ bzr commit -m 'Remove dir/file'
474
535
$ echo 'Boo!' >file
475
536
$ bzr add
476
537
$ bzr commit -m 'Create trunk'
 
538
 
477
539
$ bzr mv file file-in-trunk
478
540
$ bzr commit -m 'Renamed to file-in-trunk'
479
541
 
522
584
$ bzr mkdir dir1
523
585
$ bzr mkdir dir2
524
586
$ bzr commit -m 'Create trunk'
 
587
 
525
588
$ bzr mv dir2 dir1
526
589
$ bzr commit -m 'Moved dir2 into dir1'
527
590