29
from bzrlib.tests import script
32
def load_tests(standard_tests, module, loader):
33
result = loader.suiteClass()
35
sp_tests, remaining_tests = tests.split_suite_by_condition(
36
standard_tests, tests.condition_isinstance((
37
TestParametrizedResolveConflicts,
39
# Each test class defines its own scenarios. This is needed for
40
# TestResolvePathConflictBefore531967 that verifies that the same tests as
41
# TestResolvePathConflict still pass.
42
for test in tests.iter_suite_tests(sp_tests):
43
tests.apply_scenarios(test, test.scenarios(), result)
45
# No parametrization for the remaining tests
46
result.addTests(remaining_tests)
33
load_tests = scenarios.load_tests_apply_scenarios
51
36
# TODO: Test commit with some added, and added-but-missing files
64
def vary_by_conflicts():
65
for conflict in example_conflicts:
66
yield (conflict.__class__.__name__, {"conflict": conflict})
79
69
class TestConflicts(tests.TestCaseWithTransport):
81
def test_conflicts(self):
82
"""Conflicts are detected properly"""
83
# Use BzrDirFormat6 so we can fake conflicts
84
tree = self.make_branch_and_tree('.', format=bzrdir.BzrDirFormat6())
85
self.build_tree_contents([('hello', 'hello world4'),
86
('hello.THIS', 'hello world2'),
87
('hello.BASE', 'hello world1'),
88
('hello.OTHER', 'hello world3'),
89
('hello.sploo.BASE', 'yellowworld'),
90
('hello.sploo.OTHER', 'yellowworld2'),
93
self.assertLength(6, list(tree.list_files()))
95
tree_conflicts = tree.conflicts()
96
self.assertLength(2, tree_conflicts)
97
self.assertTrue('hello' in tree_conflicts[0].path)
98
self.assertTrue('hello.sploo' in tree_conflicts[1].path)
99
conflicts.restore('hello')
100
conflicts.restore('hello.sploo')
101
self.assertLength(0, tree.conflicts())
102
self.assertFileEqual('hello world2', 'hello')
103
self.assertFalse(os.path.lexists('hello.sploo'))
104
self.assertRaises(errors.NotConflicted, conflicts.restore, 'hello')
105
self.assertRaises(errors.NotConflicted,
106
conflicts.restore, 'hello.sploo')
108
71
def test_resolve_conflict_dir(self):
109
72
tree = self.make_branch_and_tree('.')
110
self.build_tree_contents([('hello', 'hello world4'),
111
('hello.THIS', 'hello world2'),
112
('hello.BASE', 'hello world1'),
73
self.build_tree_contents([('hello', b'hello world4'),
74
('hello.THIS', b'hello world2'),
75
('hello.BASE', b'hello world1'),
114
77
os.mkdir('hello.OTHER')
115
78
tree.add('hello', 'q')
161
124
self.assertEqual(conflicts.ConflictList([]), tree.conflicts())
164
class TestConflictStanzas(tests.TestCase):
127
class TestPerConflict(tests.TestCase):
129
scenarios = scenarios.multiply_scenarios(vary_by_conflicts())
131
def test_stringification(self):
132
text = unicode(self.conflict)
133
self.assertContainsString(text, self.conflict.path)
134
self.assertContainsString(text.lower(), "conflict")
135
self.assertContainsString(repr(self.conflict),
136
self.conflict.__class__.__name__)
166
138
def test_stanza_roundtrip(self):
167
# write and read our example stanza.
168
stanza_iter = example_conflicts.to_stanzas()
169
processed = conflicts.ConflictList.from_stanzas(stanza_iter)
170
for o, p in zip(processed, example_conflicts):
171
self.assertEqual(o, p)
173
self.assertIsInstance(o.path, unicode)
175
if o.file_id is not None:
176
self.assertIsInstance(o.file_id, str)
178
conflict_path = getattr(o, 'conflict_path', None)
179
if conflict_path is not None:
180
self.assertIsInstance(conflict_path, unicode)
182
conflict_file_id = getattr(o, 'conflict_file_id', None)
183
if conflict_file_id is not None:
184
self.assertIsInstance(conflict_file_id, str)
140
o = conflicts.Conflict.factory(**p.as_stanza().as_dict())
141
self.assertEqual(o, p)
143
self.assertIsInstance(o.path, unicode)
145
if o.file_id is not None:
146
self.assertIsInstance(o.file_id, str)
148
conflict_path = getattr(o, 'conflict_path', None)
149
if conflict_path is not None:
150
self.assertIsInstance(conflict_path, unicode)
152
conflict_file_id = getattr(o, 'conflict_file_id', None)
153
if conflict_file_id is not None:
154
self.assertIsInstance(conflict_file_id, str)
186
156
def test_stanzification(self):
187
for stanza in example_conflicts.to_stanzas():
188
if 'file_id' in stanza:
189
# In Stanza form, the file_id has to be unicode.
190
self.assertStartsWith(stanza['file_id'], u'\xeed')
191
self.assertStartsWith(stanza['path'], u'p\xe5th')
192
if 'conflict_path' in stanza:
193
self.assertStartsWith(stanza['conflict_path'], u'p\xe5th')
194
if 'conflict_file_id' in stanza:
195
self.assertStartsWith(stanza['conflict_file_id'], u'\xeed')
157
stanza = self.conflict.as_stanza()
158
if 'file_id' in stanza:
159
# In Stanza form, the file_id has to be unicode.
160
self.assertStartsWith(stanza['file_id'], u'\xeed')
161
self.assertStartsWith(stanza['path'], u'p\xe5th')
162
if 'conflict_path' in stanza:
163
self.assertStartsWith(stanza['conflict_path'], u'p\xe5th')
164
if 'conflict_file_id' in stanza:
165
self.assertStartsWith(stanza['conflict_file_id'], u'\xeed')
168
class TestConflictList(tests.TestCase):
170
def test_stanzas_roundtrip(self):
171
stanzas_iter = example_conflicts.to_stanzas()
172
processed = conflicts.ConflictList.from_stanzas(stanzas_iter)
173
self.assertEqual(example_conflicts, processed)
175
def test_stringification(self):
176
for text, o in zip(example_conflicts.to_strings(), example_conflicts):
177
self.assertEqual(text, unicode(o))
198
180
# FIXME: The shell-like tests should be converted to real whitebox tests... or
298
"""Return the scenario list for the conflict type defined by the class.
300
Each scenario is of the form:
301
(common, (left_name, left_dict), (right_name, right_dict))
305
* left_name and right_name are the scenario names that will be combined
307
* left_dict and right_dict are the attributes specific to each half of
308
the scenario. They should include at least 'actions' and 'check' and
309
will be available as '_this' and '_other' test instance attributes.
311
Daughters classes are free to add their specific attributes as they see
312
fit in any of the three dicts.
314
This is a class method so that load_tests can find it.
316
'_base_actions' in the common dict, 'actions' and 'check' in the left
317
and right dicts use names that map to methods in the test classes. Some
318
prefixes are added to these names to get the correspong methods (see
319
_get_actions() and _get_check()). The motivation here is to avoid
320
collisions in the class namespace.
322
# Only concrete classes return actual scenarios
274
"""The scenario list for the conflict type defined by the class.
276
Each scenario is of the form:
277
(common, (left_name, left_dict), (right_name, right_dict))
281
* left_name and right_name are the scenario names that will be combined
283
* left_dict and right_dict are the attributes specific to each half of
284
the scenario. They should include at least 'actions' and 'check' and
285
will be available as '_this' and '_other' test instance attributes.
287
Daughters classes are free to add their specific attributes as they see
288
fit in any of the three dicts.
290
This is a class method so that load_tests can find it.
292
'_base_actions' in the common dict, 'actions' and 'check' in the left
293
and right dicts use names that map to methods in the test classes. Some
294
prefixes are added to these names to get the correspong methods (see
295
_get_actions() and _get_check()). The motivation here is to avoid
296
collisions in the class namespace.
326
300
super(TestParametrizedResolveConflicts, self).setUp()
328
302
builder.start_series()
330
304
# Create an empty trunk
331
builder.build_snapshot('start', None, [
332
('add', ('', 'root-id', 'directory', ''))])
305
builder.build_snapshot(None, [
306
('add', ('', 'root-id', 'directory', ''))],
333
308
# Add a minimal base content
334
309
base_actions = self._get_actions(self._base_actions)()
335
builder.build_snapshot('base', ['start'], base_actions)
310
builder.build_snapshot(['start'], base_actions, revision_id='base')
336
311
# Modify the base content in branch
337
312
actions_other = self._get_actions(self._other['actions'])()
338
builder.build_snapshot('other', ['base'], actions_other)
313
builder.build_snapshot(['base'], actions_other, revision_id='other')
339
314
# Modify the base content in trunk
340
315
actions_this = self._get_actions(self._this['actions'])()
341
builder.build_snapshot('this', ['base'], actions_this)
316
builder.build_snapshot(['base'], actions_this, revision_id='this')
342
317
# builder.get_branch() tip is now 'this'
344
319
builder.finish_series()
366
class TestResolveTextConflicts(TestParametrizedResolveConflicts):
368
_conflict_type = conflicts.TextConflict
370
# Set by the scenarios
371
# path and file-id for the file involved in the conflict
375
scenarios = mirror_scenarios(
377
# File modified on both sides
378
(dict(_base_actions='create_file',
379
_path='file', _file_id='file-id'),
381
dict(actions='modify_file_A', check='file_has_content_A')),
383
dict(actions='modify_file_B', check='file_has_content_B')),),
384
# File modified on both sides in dir
385
(dict(_base_actions='create_file_in_dir',
386
_path='dir/file', _file_id='file-id'),
387
('filed_modified_A_in_dir',
388
dict(actions='modify_file_A_in_dir',
389
check='file_in_dir_has_content_A')),
391
dict(actions='modify_file_B_in_dir',
392
check='file_in_dir_has_content_B')),),
395
def do_create_file(self, path='file'):
396
return [('add', (path, 'file-id', 'file', 'trunk content\n'))]
398
def do_modify_file_A(self):
399
return [('modify', ('file', 'trunk content\nfeature A\n'))]
401
def do_modify_file_B(self):
402
return [('modify', ('file', 'trunk content\nfeature B\n'))]
404
def do_modify_file_A_in_dir(self):
405
return [('modify', ('dir/file', 'trunk content\nfeature A\n'))]
407
def do_modify_file_B_in_dir(self):
408
return [('modify', ('dir/file', 'trunk content\nfeature B\n'))]
410
def check_file_has_content_A(self, path='file'):
411
self.assertFileEqual('trunk content\nfeature A\n',
412
osutils.pathjoin('branch', path))
414
def check_file_has_content_B(self, path='file'):
415
self.assertFileEqual('trunk content\nfeature B\n',
416
osutils.pathjoin('branch', path))
418
def do_create_file_in_dir(self):
419
return [('add', ('dir', 'dir-id', 'directory', '')),
420
] + self.do_create_file('dir/file')
422
def check_file_in_dir_has_content_A(self):
423
self.check_file_has_content_A('dir/file')
425
def check_file_in_dir_has_content_B(self):
426
self.check_file_has_content_B('dir/file')
428
def _get_resolve_path_arg(self, wt, action):
431
def assertTextConflict(self, wt, c):
432
self.assertEqual(self._file_id, c.file_id)
433
self.assertEqual(self._path, c.path)
434
_assert_conflict = assertTextConflict
391
437
class TestResolveContentsConflict(TestParametrizedResolveConflicts):
393
_conflict_type = conflicts.ContentsConflict,
439
_conflict_type = conflicts.ContentsConflict
395
# Set by load_tests from scenarios()
441
# Set by the scenarios
396
442
# path and file-id for the file involved in the conflict
446
scenarios = mirror_scenarios(
403
448
# File modified/deleted
404
449
(dict(_base_actions='create_file',
405
450
_path='file', _file_id='file-id'),
407
452
dict(actions='modify_file', check='file_has_more_content')),
409
454
dict(actions='delete_file', check='file_doesnt_exist')),),
411
return mirror_scenarios(base_scenarios)
455
# File renamed-modified/deleted
456
(dict(_base_actions='create_file',
457
_path='new-file', _file_id='file-id'),
458
('file_renamed_and_modified',
459
dict(actions='modify_and_rename_file',
460
check='file_renamed_and_more_content')),
462
dict(actions='delete_file', check='file_doesnt_exist')),),
463
# File modified/deleted in dir
464
(dict(_base_actions='create_file_in_dir',
465
_path='dir/file', _file_id='file-id'),
466
('file_modified_in_dir',
467
dict(actions='modify_file_in_dir',
468
check='file_in_dir_has_more_content')),
469
('file_deleted_in_dir',
470
dict(actions='delete_file_in_dir',
471
check='file_in_dir_doesnt_exist')),),
413
474
def do_create_file(self):
414
475
return [('add', ('file', 'file-id', 'file', 'trunk content\n'))]
416
477
def do_modify_file(self):
417
return [('modify', ('file-id', 'trunk content\nmore content\n'))]
478
return [('modify', ('file', 'trunk content\nmore content\n'))]
480
def do_modify_and_rename_file(self):
481
return [('modify', ('new-file', 'trunk content\nmore content\n')),
482
('rename', ('file', 'new-file'))]
419
484
def check_file_has_more_content(self):
420
485
self.assertFileEqual('trunk content\nmore content\n', 'branch/file')
487
def check_file_renamed_and_more_content(self):
488
self.assertFileEqual('trunk content\nmore content\n', 'branch/new-file')
422
490
def do_delete_file(self):
423
return [('unversion', 'file-id')]
491
return [('unversion', 'file')]
493
def do_delete_file_in_dir(self):
494
return [('unversion', 'dir/file')]
425
496
def check_file_doesnt_exist(self):
426
self.failIfExists('branch/file')
497
self.assertPathDoesNotExist('branch/file')
499
def do_create_file_in_dir(self):
500
return [('add', ('dir', 'dir-id', 'directory', '')),
501
('add', ('dir/file', 'file-id', 'file', 'trunk content\n'))]
503
def do_modify_file_in_dir(self):
504
return [('modify', ('dir/file', 'trunk content\nmore content\n'))]
506
def check_file_in_dir_has_more_content(self):
507
self.assertFileEqual('trunk content\nmore content\n', 'branch/dir/file')
509
def check_file_in_dir_doesnt_exist(self):
510
self.assertPathDoesNotExist('branch/dir/file')
428
512
def _get_resolve_path_arg(self, wt, action):
429
513
return self._path
457
540
# PathConflicts deletion handling requires a special
458
541
# hard-coded value
459
542
path='<deleted>', file_id='file-id')),),
543
# File renamed/deleted in dir
544
(dict(_base_actions='create_file_in_dir'),
545
('file_renamed_in_dir',
546
dict(actions='rename_file_in_dir', check='file_in_dir_renamed',
547
path='dir/new-file', file_id='file-id')),
549
dict(actions='delete_file_in_dir', check='file_in_dir_doesnt_exist',
550
# PathConflicts deletion handling requires a special
552
path='<deleted>', file_id='file-id')),),
460
553
# File renamed/renamed differently
461
554
(dict(_base_actions='create_file'),
496
588
return [('rename', ('file', 'new-file'))]
498
590
def check_file_renamed(self):
499
self.failIfExists('branch/file')
500
self.failUnlessExists('branch/new-file')
591
self.assertPathDoesNotExist('branch/file')
592
self.assertPathExists('branch/new-file')
502
594
def do_rename_file2(self):
503
595
return [('rename', ('file', 'new-file2'))]
505
597
def check_file_renamed2(self):
506
self.failIfExists('branch/file')
507
self.failUnlessExists('branch/new-file2')
598
self.assertPathDoesNotExist('branch/file')
599
self.assertPathExists('branch/new-file2')
509
601
def do_rename_dir(self):
510
602
return [('rename', ('dir', 'new-dir'))]
512
604
def check_dir_renamed(self):
513
self.failIfExists('branch/dir')
514
self.failUnlessExists('branch/new-dir')
605
self.assertPathDoesNotExist('branch/dir')
606
self.assertPathExists('branch/new-dir')
516
608
def do_rename_dir2(self):
517
609
return [('rename', ('dir', 'new-dir2'))]
519
611
def check_dir_renamed2(self):
520
self.failIfExists('branch/dir')
521
self.failUnlessExists('branch/new-dir2')
612
self.assertPathDoesNotExist('branch/dir')
613
self.assertPathExists('branch/new-dir2')
523
615
def do_delete_file(self):
524
return [('unversion', 'file-id')]
616
return [('unversion', 'file')]
618
def do_delete_file_in_dir(self):
619
return [('unversion', 'dir/file')]
526
621
def check_file_doesnt_exist(self):
527
self.failIfExists('branch/file')
622
self.assertPathDoesNotExist('branch/file')
529
624
def do_delete_dir(self):
530
return [('unversion', 'dir-id')]
625
return [('unversion', 'dir')]
532
627
def check_dir_doesnt_exist(self):
533
self.failIfExists('branch/dir')
628
self.assertPathDoesNotExist('branch/dir')
630
def do_create_file_in_dir(self):
631
return [('add', ('dir', 'dir-id', 'directory', '')),
632
('add', ('dir/file', 'file-id', 'file', 'trunk content\n'))]
634
def do_rename_file_in_dir(self):
635
return [('rename', ('dir/file', 'dir/new-file'))]
637
def check_file_in_dir_renamed(self):
638
self.assertPathDoesNotExist('branch/dir/file')
639
self.assertPathExists('branch/dir/new-file')
641
def check_file_in_dir_doesnt_exist(self):
642
self.assertPathDoesNotExist('branch/dir/file')
535
644
def _get_resolve_path_arg(self, wt, action):
536
645
tpath = self._this['path']
584
689
('fileb_created',
585
690
dict(actions='create_file_b', check='file_content_b',
586
691
path='file', file_id='file-b-id')),),
588
return mirror_scenarios(base_scenarios)
692
# File created with different file-ids but deleted on one side
693
(dict(_base_actions='create_file_a'),
695
dict(actions='replace_file_a_by_b', check='file_content_b',
696
path='file', file_id='file-b-id')),
698
dict(actions='modify_file_a', check='file_new_content',
699
path='file', file_id='file-a-id')),),
590
702
def do_nothing(self):
602
714
def check_file_content_b(self):
603
715
self.assertFileEqual('file b content\n', 'branch/file')
717
def do_replace_file_a_by_b(self):
718
return [('unversion', 'file'),
719
('add', ('file', 'file-b-id', 'file', 'file b content\n'))]
721
def do_modify_file_a(self):
722
return [('modify', ('file', 'new content\n'))]
724
def check_file_new_content(self):
725
self.assertFileEqual('new content\n', 'branch/file')
605
727
def _get_resolve_path_arg(self, wt, action):
606
728
return self._this['path']
624
746
# FIXME: While this *creates* UnversionedParent conflicts, this really only
625
747
# tests MissingParent resolution :-/
631
$ bzr commit -m 'Create trunk'
754
$ brz commit -m 'Create trunk' -q
633
755
$ echo 'trunk content' >dir/file
635
$ bzr commit -m 'Add dir/file in trunk'
637
$ bzr branch . -r 1 ../branch
756
$ brz add -q dir/file
757
$ brz commit -q -m 'Add dir/file in trunk'
758
$ brz branch -q . -r 1 ../branch
640
$ bzr commit -m 'Remove dir in branch'
761
$ brz commit -q -m 'Remove dir in branch'
645
765
2>Conflict adding files to dir. Created directory.
650
770
def test_take_this(self):
651
771
self.run_script("""
654
$ bzr commit --strict -m 'No more conflicts nor unknown files'
772
$ brz rm -q dir --no-backup
774
2>2 conflicts resolved, 0 remaining
775
$ brz commit -q --strict -m 'No more conflicts nor unknown files'
657
778
def test_take_other(self):
658
779
self.run_script("""
660
$ bzr commit --strict -m 'No more conflicts nor unknown files'
781
2>2 conflicts resolved, 0 remaining
782
$ brz commit -q --strict -m 'No more conflicts nor unknown files'
664
786
class TestResolveMissingParent(TestResolveConflicts):
670
793
$ echo 'trunk content' >dir/file
672
$ bzr commit -m 'Create trunk'
795
$ brz commit -m 'Create trunk' -q
674
796
$ echo 'trunk content' >dir/file2
676
$ bzr commit -m 'Add dir/file2 in branch'
678
$ bzr branch . -r 1 ../branch
797
$ brz add -q dir/file2
798
$ brz commit -q -m 'Add dir/file2 in branch'
799
$ brz branch -q . -r 1 ../branch
680
$ bzr rm dir/file --force
682
$ bzr commit -m 'Remove dir/file'
801
$ brz rm -q dir/file --no-backup
803
$ brz commit -q -m 'Remove dir/file'
687
807
2>Conflict adding files to dir. Created directory.
692
812
def test_keep_them_all(self):
693
813
self.run_script("""
695
$ bzr commit --strict -m 'No more conflicts nor unknown files'
815
2>2 conflicts resolved, 0 remaining
816
$ brz commit -q --strict -m 'No more conflicts nor unknown files'
698
819
def test_adopt_child(self):
699
820
self.run_script("""
700
$ bzr mv dir/file2 file2
703
$ bzr commit --strict -m 'No more conflicts nor unknown files'
821
$ brz mv -q dir/file2 file2
822
$ brz rm -q dir --no-backup
824
2>2 conflicts resolved, 0 remaining
825
$ brz commit -q --strict -m 'No more conflicts nor unknown files'
706
828
def test_kill_them_all(self):
707
829
self.run_script("""
710
$ bzr commit --strict -m 'No more conflicts nor unknown files'
830
$ brz rm -q dir --no-backup
832
2>2 conflicts resolved, 0 remaining
833
$ brz commit -q --strict -m 'No more conflicts nor unknown files'
713
836
def test_resolve_taking_this(self):
714
837
self.run_script("""
715
$ bzr resolve --take-this dir
716
$ bzr commit --strict -m 'No more conflicts nor unknown files'
838
$ brz resolve --take-this dir
840
$ brz commit -q --strict -m 'No more conflicts nor unknown files'
719
843
def test_resolve_taking_other(self):
720
844
self.run_script("""
721
$ bzr resolve --take-other dir
722
$ bzr commit --strict -m 'No more conflicts nor unknown files'
845
$ brz resolve --take-other dir
847
$ brz commit -q --strict -m 'No more conflicts nor unknown files'
726
851
class TestResolveDeletingParent(TestResolveConflicts):
732
858
$ echo 'trunk content' >dir/file
734
$ bzr commit -m 'Create trunk'
736
$ bzr rm dir/file --force
738
$ bzr commit -m 'Remove dir/file'
740
$ bzr branch . -r 1 ../branch
860
$ brz commit -m 'Create trunk' -q
861
$ brz rm -q dir/file --no-backup
862
$ brz rm -q dir --no-backup
863
$ brz commit -q -m 'Remove dir/file'
864
$ brz branch -q . -r 1 ../branch
742
866
$ echo 'branch content' >dir/file2
744
$ bzr commit -m 'Add dir/file2 in branch'
867
$ brz add -q dir/file2
868
$ brz commit -q -m 'Add dir/file2 in branch'
748
871
2>Conflict: can't delete dir because it is not empty. Not deleting.
749
872
2>Conflict because dir is not versioned, but has versioned children. Versioned directory.
753
876
def test_keep_them_all(self):
754
877
self.run_script("""
756
$ bzr commit --strict -m 'No more conflicts nor unknown files'
879
2>2 conflicts resolved, 0 remaining
880
$ brz commit -q --strict -m 'No more conflicts nor unknown files'
759
883
def test_adopt_child(self):
760
884
self.run_script("""
761
$ bzr mv dir/file2 file2
764
$ bzr commit --strict -m 'No more conflicts nor unknown files'
885
$ brz mv -q dir/file2 file2
886
$ brz rm -q dir --no-backup
888
2>2 conflicts resolved, 0 remaining
889
$ brz commit -q --strict -m 'No more conflicts nor unknown files'
767
892
def test_kill_them_all(self):
768
893
self.run_script("""
771
$ bzr commit --strict -m 'No more conflicts nor unknown files'
894
$ brz rm -q dir --no-backup
896
2>2 conflicts resolved, 0 remaining
897
$ brz commit -q --strict -m 'No more conflicts nor unknown files'
774
900
def test_resolve_taking_this(self):
775
901
self.run_script("""
776
$ bzr resolve --take-this dir
777
$ bzr commit --strict -m 'No more conflicts nor unknown files'
902
$ brz resolve --take-this dir
903
2>2 conflicts resolved, 0 remaining
904
$ brz commit -q --strict -m 'No more conflicts nor unknown files'
780
907
def test_resolve_taking_other(self):
781
908
self.run_script("""
782
$ bzr resolve --take-other dir
783
$ bzr commit --strict -m 'No more conflicts nor unknown files'
909
$ brz resolve --take-other dir
912
2>2 conflicts resolved, 0 remaining
913
$ brz commit -q --strict -m 'No more conflicts nor unknown files'
787
917
class TestResolveParentLoop(TestParametrizedResolveConflicts):
789
_conflict_type = conflicts.ParentLoop,
919
_conflict_type = conflicts.ParentLoop
791
921
_this_args = None
792
922
_other_args = None
796
# Each side dict additionally defines:
797
# - dir_id: the directory being moved
798
# - target_id: The target directory
799
# - xfail: whether the test is expected to fail if the action is
800
# involved as 'other'
924
# Each side dict additionally defines:
925
# - dir_id: the directory being moved
926
# - target_id: The target directory
927
# - xfail: whether the test is expected to fail if the action is
928
# involved as 'other'
929
scenarios = mirror_scenarios(
802
931
# Dirs moved into each other
803
932
(dict(_base_actions='create_dir1_dir2'),
804
933
('dir1_into_dir2',
826
954
return [('rename', ('dir1', 'dir2/dir1'))]
828
956
def check_dir1_moved(self):
829
self.failIfExists('branch/dir1')
830
self.failUnlessExists('branch/dir2/dir1')
957
self.assertPathDoesNotExist('branch/dir1')
958
self.assertPathExists('branch/dir2/dir1')
832
960
def do_move_dir2_into_dir1(self):
833
961
return [('rename', ('dir2', 'dir1/dir2'))]
835
963
def check_dir2_moved(self):
836
self.failIfExists('branch/dir2')
837
self.failUnlessExists('branch/dir1/dir2')
964
self.assertPathDoesNotExist('branch/dir2')
965
self.assertPathExists('branch/dir1/dir2')
839
967
def do_create_dir1_4(self):
840
968
return [('add', ('dir1', 'dir1-id', 'directory', '')),
846
974
return [('rename', ('dir1', 'dir3/dir4/dir1'))]
848
976
def check_dir1_2_moved(self):
849
self.failIfExists('branch/dir1')
850
self.failUnlessExists('branch/dir3/dir4/dir1')
851
self.failUnlessExists('branch/dir3/dir4/dir1/dir2')
977
self.assertPathDoesNotExist('branch/dir1')
978
self.assertPathExists('branch/dir3/dir4/dir1')
979
self.assertPathExists('branch/dir3/dir4/dir1/dir2')
853
981
def do_move_dir3_into_dir2(self):
854
982
return [('rename', ('dir3', 'dir1/dir2/dir3'))]
856
984
def check_dir3_4_moved(self):
857
self.failIfExists('branch/dir3')
858
self.failUnlessExists('branch/dir1/dir2/dir3')
859
self.failUnlessExists('branch/dir1/dir2/dir3/dir4')
985
self.assertPathDoesNotExist('branch/dir3')
986
self.assertPathExists('branch/dir1/dir2/dir3')
987
self.assertPathExists('branch/dir1/dir2/dir3/dir4')
861
989
def _get_resolve_path_arg(self, wt, action):
862
990
# ParentLoop says: moving <conflict_path> into <path>. Cancelled move.
907
1035
def test_take_this(self):
908
1036
self.run_script("""
909
$ bzr rm foo.new --force
1037
$ brz rm -q foo.new --no-backup
910
1038
# FIXME: Isn't it weird that foo is now unkown even if foo.new has been put
911
1039
# aside ? -- vila 090916
913
$ bzr resolve foo.new
914
$ bzr commit --strict -m 'No more conflicts nor unknown files'
1041
$ brz resolve foo.new
1042
2>1 conflict resolved, 0 remaining
1043
$ brz commit -q --strict -m 'No more conflicts nor unknown files'
917
1046
def test_take_other(self):
918
1047
self.run_script("""
922
$ bzr commit --strict -m 'No more conflicts nor unknown files'
1048
$ brz rm -q foo --no-backup
1049
$ brz mv -q foo.new foo
1051
2>1 conflict resolved, 0 remaining
1052
$ brz commit -q --strict -m 'No more conflicts nor unknown files'
925
1055
def test_resolve_taking_this(self):
926
1056
self.run_script("""
927
$ bzr resolve --take-this foo.new
928
$ bzr commit --strict -m 'No more conflicts nor unknown files'
1057
$ brz resolve --take-this foo.new
1059
$ brz commit -q --strict -m 'No more conflicts nor unknown files'
931
1062
def test_resolve_taking_other(self):
932
1063
self.run_script("""
933
$ bzr resolve --take-other foo.new
934
$ bzr commit --strict -m 'No more conflicts nor unknown files'
1064
$ brz resolve --take-other foo.new
1066
$ brz commit -q --strict -m 'No more conflicts nor unknown files'
941
1073
# This is nearly like TestResolveNonDirectoryParent but with branch and
942
1074
# trunk switched. As such it should certainly produce the same
1076
self.assertRaises(errors.MalformedTransform,
1077
self.run_script, """
948
$ bzr commit -m 'Create trunk'
1083
$ brz commit -m 'Create trunk' -q
950
1085
$ echo "Boo!" >foo
951
$ bzr commit -m 'foo is now a file'
953
$ bzr branch . -r 1 ../branch
1086
$ brz commit -m 'foo is now a file' -q
1087
$ brz branch -q . -r 1 ../branch -q
955
1089
$ echo "Boing" >foo/bar
957
$ bzr commit -m 'Add foo/bar'
960
2>bzr: ERROR: Tree transform is malformed [('unversioned executability', 'new-1')]
1090
$ brz add -q foo/bar -q
1091
$ brz commit -m 'Add foo/bar' -q
1092
$ brz merge ../trunk
1093
2>brz: ERROR: Tree transform is malformed [('unversioned executability', 'new-1')]
1097
class TestNoFinalPath(script.TestCaseWithTransportAndScript):
1099
def test_bug_805809(self):
1102
Created a standalone tree (format: 2a)
1107
$ brz commit -m 'create file on trunk'
1108
2>Committing to: .../trunk/
1110
2>Committed revision 1.
1111
# Create a debian branch based on trunk
1113
$ brz branch trunk -r 1 debian
1114
2>Branched 1 revision.
1121
$ brz commit -m 'rename file to dir/file for debian'
1122
2>Committing to: .../debian/
1124
2>renamed file => dir/file
1125
2>Committed revision 2.
1126
# Create an experimental branch with a new root-id
1128
$ brz init experimental
1129
Created a standalone tree (format: 2a)
1131
# Work around merging into empty branch not being supported
1132
# (http://pad.lv/308562)
1133
$ echo something >not-empty
1136
$ brz commit -m 'Add some content in experimental'
1137
2>Committing to: .../experimental/
1139
2>Committed revision 1.
1140
# merge debian even without a common ancestor
1141
$ brz merge ../debian -r0..2
1144
2>All changes applied successfully.
1145
$ brz commit -m 'merging debian into experimental'
1146
2>Committing to: .../experimental/
1149
2>Committed revision 2.
1150
# Create an ubuntu branch with yet another root-id
1153
Created a standalone tree (format: 2a)
1155
# Work around merging into empty branch not being supported
1156
# (http://pad.lv/308562)
1157
$ echo something >not-empty-ubuntu
1159
adding not-empty-ubuntu
1160
$ brz commit -m 'Add some content in experimental'
1161
2>Committing to: .../ubuntu/
1162
2>added not-empty-ubuntu
1163
2>Committed revision 1.
1165
$ brz merge ../debian -r0..2
1168
2>All changes applied successfully.
1169
$ brz commit -m 'merging debian'
1170
2>Committing to: .../ubuntu/
1173
2>Committed revision 2.
1174
# Now try to merge experimental
1175
$ brz merge ../experimental
1177
2>Path conflict: dir / dir
1178
2>1 conflicts encountered.