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
73
self.build_tree_contents([('hello', 'hello world4'),
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',
389
check='file_in_dir_has_content_A')),
391
dict(actions='modify_file_B',
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-id', 'trunk content\nfeature A\n'))]
401
def do_modify_file_B(self):
402
return [('modify', ('file-id', 'trunk content\nfeature B\n'))]
404
def check_file_has_content_A(self, path='file'):
405
self.assertFileEqual('trunk content\nfeature A\n',
406
osutils.pathjoin('branch', path))
408
def check_file_has_content_B(self, path='file'):
409
self.assertFileEqual('trunk content\nfeature B\n',
410
osutils.pathjoin('branch', path))
412
def do_create_file_in_dir(self):
413
return [('add', ('dir', 'dir-id', 'directory', '')),
414
] + self.do_create_file('dir/file')
416
def check_file_in_dir_has_content_A(self):
417
self.check_file_has_content_A('dir/file')
419
def check_file_in_dir_has_content_B(self):
420
self.check_file_has_content_B('dir/file')
422
def _get_resolve_path_arg(self, wt, action):
425
def assertTextConflict(self, wt, c):
426
self.assertEqual(self._file_id, c.file_id)
427
self.assertEqual(self._path, c.path)
428
_assert_conflict = assertTextConflict
391
431
class TestResolveContentsConflict(TestParametrizedResolveConflicts):
393
_conflict_type = conflicts.ContentsConflict,
433
_conflict_type = conflicts.ContentsConflict
395
# Set by load_tests from scenarios()
435
# Set by the scenarios
396
436
# path and file-id for the file involved in the conflict
440
scenarios = mirror_scenarios(
403
442
# File modified/deleted
404
443
(dict(_base_actions='create_file',
405
444
_path='file', _file_id='file-id'),
407
446
dict(actions='modify_file', check='file_has_more_content')),
409
448
dict(actions='delete_file', check='file_doesnt_exist')),),
411
return mirror_scenarios(base_scenarios)
449
# File renamed-modified/deleted
450
(dict(_base_actions='create_file',
451
_path='new-file', _file_id='file-id'),
452
('file_renamed_and_modified',
453
dict(actions='modify_and_rename_file',
454
check='file_renamed_and_more_content')),
456
dict(actions='delete_file', check='file_doesnt_exist')),),
457
# File modified/deleted in dir
458
(dict(_base_actions='create_file_in_dir',
459
_path='dir/file', _file_id='file-id'),
460
('file_modified_in_dir',
461
dict(actions='modify_file_in_dir',
462
check='file_in_dir_has_more_content')),
463
('file_deleted_in_dir',
464
dict(actions='delete_file',
465
check='file_in_dir_doesnt_exist')),),
413
468
def do_create_file(self):
414
469
return [('add', ('file', 'file-id', 'file', 'trunk content\n'))]
416
471
def do_modify_file(self):
417
472
return [('modify', ('file-id', 'trunk content\nmore content\n'))]
474
def do_modify_and_rename_file(self):
475
return [('modify', ('file-id', 'trunk content\nmore content\n')),
476
('rename', ('file', 'new-file'))]
419
478
def check_file_has_more_content(self):
420
479
self.assertFileEqual('trunk content\nmore content\n', 'branch/file')
481
def check_file_renamed_and_more_content(self):
482
self.assertFileEqual('trunk content\nmore content\n', 'branch/new-file')
422
484
def do_delete_file(self):
423
485
return [('unversion', 'file-id')]
425
487
def check_file_doesnt_exist(self):
426
self.failIfExists('branch/file')
488
self.assertPathDoesNotExist('branch/file')
490
def do_create_file_in_dir(self):
491
return [('add', ('dir', 'dir-id', 'directory', '')),
492
('add', ('dir/file', 'file-id', 'file', 'trunk content\n'))]
494
def do_modify_file_in_dir(self):
495
return [('modify', ('file-id', 'trunk content\nmore content\n'))]
497
def check_file_in_dir_has_more_content(self):
498
self.assertFileEqual('trunk content\nmore content\n', 'branch/dir/file')
500
def check_file_in_dir_doesnt_exist(self):
501
self.assertPathDoesNotExist('branch/dir/file')
428
503
def _get_resolve_path_arg(self, wt, action):
429
504
return self._path
457
531
# PathConflicts deletion handling requires a special
458
532
# hard-coded value
459
533
path='<deleted>', file_id='file-id')),),
534
# File renamed/deleted in dir
535
(dict(_base_actions='create_file_in_dir'),
536
('file_renamed_in_dir',
537
dict(actions='rename_file_in_dir', check='file_in_dir_renamed',
538
path='dir/new-file', file_id='file-id')),
540
dict(actions='delete_file', check='file_in_dir_doesnt_exist',
541
# PathConflicts deletion handling requires a special
543
path='<deleted>', file_id='file-id')),),
460
544
# File renamed/renamed differently
461
545
(dict(_base_actions='create_file'),
496
579
return [('rename', ('file', 'new-file'))]
498
581
def check_file_renamed(self):
499
self.failIfExists('branch/file')
500
self.failUnlessExists('branch/new-file')
582
self.assertPathDoesNotExist('branch/file')
583
self.assertPathExists('branch/new-file')
502
585
def do_rename_file2(self):
503
586
return [('rename', ('file', 'new-file2'))]
505
588
def check_file_renamed2(self):
506
self.failIfExists('branch/file')
507
self.failUnlessExists('branch/new-file2')
589
self.assertPathDoesNotExist('branch/file')
590
self.assertPathExists('branch/new-file2')
509
592
def do_rename_dir(self):
510
593
return [('rename', ('dir', 'new-dir'))]
512
595
def check_dir_renamed(self):
513
self.failIfExists('branch/dir')
514
self.failUnlessExists('branch/new-dir')
596
self.assertPathDoesNotExist('branch/dir')
597
self.assertPathExists('branch/new-dir')
516
599
def do_rename_dir2(self):
517
600
return [('rename', ('dir', 'new-dir2'))]
519
602
def check_dir_renamed2(self):
520
self.failIfExists('branch/dir')
521
self.failUnlessExists('branch/new-dir2')
603
self.assertPathDoesNotExist('branch/dir')
604
self.assertPathExists('branch/new-dir2')
523
606
def do_delete_file(self):
524
607
return [('unversion', 'file-id')]
526
609
def check_file_doesnt_exist(self):
527
self.failIfExists('branch/file')
610
self.assertPathDoesNotExist('branch/file')
529
612
def do_delete_dir(self):
530
613
return [('unversion', 'dir-id')]
532
615
def check_dir_doesnt_exist(self):
533
self.failIfExists('branch/dir')
616
self.assertPathDoesNotExist('branch/dir')
618
def do_create_file_in_dir(self):
619
return [('add', ('dir', 'dir-id', 'directory', '')),
620
('add', ('dir/file', 'file-id', 'file', 'trunk content\n'))]
622
def do_rename_file_in_dir(self):
623
return [('rename', ('dir/file', 'dir/new-file'))]
625
def check_file_in_dir_renamed(self):
626
self.assertPathDoesNotExist('branch/dir/file')
627
self.assertPathExists('branch/dir/new-file')
629
def check_file_in_dir_doesnt_exist(self):
630
self.assertPathDoesNotExist('branch/dir/file')
535
632
def _get_resolve_path_arg(self, wt, action):
536
633
tpath = self._this['path']
584
677
('fileb_created',
585
678
dict(actions='create_file_b', check='file_content_b',
586
679
path='file', file_id='file-b-id')),),
588
return mirror_scenarios(base_scenarios)
680
# File created with different file-ids but deleted on one side
681
(dict(_base_actions='create_file_a'),
683
dict(actions='replace_file_a_by_b', check='file_content_b',
684
path='file', file_id='file-b-id')),
686
dict(actions='modify_file_a', check='file_new_content',
687
path='file', file_id='file-a-id')),),
590
690
def do_nothing(self):
602
702
def check_file_content_b(self):
603
703
self.assertFileEqual('file b content\n', 'branch/file')
705
def do_replace_file_a_by_b(self):
706
return [('unversion', 'file-a-id'),
707
('add', ('file', 'file-b-id', 'file', 'file b content\n'))]
709
def do_modify_file_a(self):
710
return [('modify', ('file-a-id', 'new content\n'))]
712
def check_file_new_content(self):
713
self.assertFileEqual('new content\n', 'branch/file')
605
715
def _get_resolve_path_arg(self, wt, action):
606
716
return self._this['path']
624
734
# FIXME: While this *creates* UnversionedParent conflicts, this really only
625
735
# tests MissingParent resolution :-/
631
$ bzr commit -m 'Create trunk'
742
$ brz commit -m 'Create trunk' -q
633
743
$ echo 'trunk content' >dir/file
635
$ bzr commit -m 'Add dir/file in trunk'
637
$ bzr branch . -r 1 ../branch
744
$ brz add -q dir/file
745
$ brz commit -q -m 'Add dir/file in trunk'
746
$ brz branch -q . -r 1 ../branch
640
$ bzr commit -m 'Remove dir in branch'
749
$ brz commit -q -m 'Remove dir in branch'
645
753
2>Conflict adding files to dir. Created directory.
650
758
def test_take_this(self):
651
759
self.run_script("""
654
$ bzr commit --strict -m 'No more conflicts nor unknown files'
760
$ brz rm -q dir --no-backup
762
2>2 conflicts resolved, 0 remaining
763
$ brz commit -q --strict -m 'No more conflicts nor unknown files'
657
766
def test_take_other(self):
658
767
self.run_script("""
660
$ bzr commit --strict -m 'No more conflicts nor unknown files'
769
2>2 conflicts resolved, 0 remaining
770
$ brz commit -q --strict -m 'No more conflicts nor unknown files'
664
774
class TestResolveMissingParent(TestResolveConflicts):
670
781
$ echo 'trunk content' >dir/file
672
$ bzr commit -m 'Create trunk'
783
$ brz commit -m 'Create trunk' -q
674
784
$ echo 'trunk content' >dir/file2
676
$ bzr commit -m 'Add dir/file2 in branch'
678
$ bzr branch . -r 1 ../branch
785
$ brz add -q dir/file2
786
$ brz commit -q -m 'Add dir/file2 in branch'
787
$ brz branch -q . -r 1 ../branch
680
$ bzr rm dir/file --force
682
$ bzr commit -m 'Remove dir/file'
789
$ brz rm -q dir/file --no-backup
791
$ brz commit -q -m 'Remove dir/file'
687
795
2>Conflict adding files to dir. Created directory.
692
800
def test_keep_them_all(self):
693
801
self.run_script("""
695
$ bzr commit --strict -m 'No more conflicts nor unknown files'
803
2>2 conflicts resolved, 0 remaining
804
$ brz commit -q --strict -m 'No more conflicts nor unknown files'
698
807
def test_adopt_child(self):
699
808
self.run_script("""
700
$ bzr mv dir/file2 file2
703
$ bzr commit --strict -m 'No more conflicts nor unknown files'
809
$ brz mv -q dir/file2 file2
810
$ brz rm -q dir --no-backup
812
2>2 conflicts resolved, 0 remaining
813
$ brz commit -q --strict -m 'No more conflicts nor unknown files'
706
816
def test_kill_them_all(self):
707
817
self.run_script("""
710
$ bzr commit --strict -m 'No more conflicts nor unknown files'
818
$ brz rm -q dir --no-backup
820
2>2 conflicts resolved, 0 remaining
821
$ brz commit -q --strict -m 'No more conflicts nor unknown files'
713
824
def test_resolve_taking_this(self):
714
825
self.run_script("""
715
$ bzr resolve --take-this dir
716
$ bzr commit --strict -m 'No more conflicts nor unknown files'
826
$ brz resolve --take-this dir
828
$ brz commit -q --strict -m 'No more conflicts nor unknown files'
719
831
def test_resolve_taking_other(self):
720
832
self.run_script("""
721
$ bzr resolve --take-other dir
722
$ bzr commit --strict -m 'No more conflicts nor unknown files'
833
$ brz resolve --take-other dir
835
$ brz commit -q --strict -m 'No more conflicts nor unknown files'
726
839
class TestResolveDeletingParent(TestResolveConflicts):
732
846
$ 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
848
$ brz commit -m 'Create trunk' -q
849
$ brz rm -q dir/file --no-backup
850
$ brz rm -q dir --no-backup
851
$ brz commit -q -m 'Remove dir/file'
852
$ brz branch -q . -r 1 ../branch
742
854
$ echo 'branch content' >dir/file2
744
$ bzr commit -m 'Add dir/file2 in branch'
855
$ brz add -q dir/file2
856
$ brz commit -q -m 'Add dir/file2 in branch'
748
859
2>Conflict: can't delete dir because it is not empty. Not deleting.
749
860
2>Conflict because dir is not versioned, but has versioned children. Versioned directory.
753
864
def test_keep_them_all(self):
754
865
self.run_script("""
756
$ bzr commit --strict -m 'No more conflicts nor unknown files'
867
2>2 conflicts resolved, 0 remaining
868
$ brz commit -q --strict -m 'No more conflicts nor unknown files'
759
871
def test_adopt_child(self):
760
872
self.run_script("""
761
$ bzr mv dir/file2 file2
764
$ bzr commit --strict -m 'No more conflicts nor unknown files'
873
$ brz mv -q dir/file2 file2
874
$ brz rm -q dir --no-backup
876
2>2 conflicts resolved, 0 remaining
877
$ brz commit -q --strict -m 'No more conflicts nor unknown files'
767
880
def test_kill_them_all(self):
768
881
self.run_script("""
771
$ bzr commit --strict -m 'No more conflicts nor unknown files'
882
$ brz rm -q dir --no-backup
884
2>2 conflicts resolved, 0 remaining
885
$ brz commit -q --strict -m 'No more conflicts nor unknown files'
774
888
def test_resolve_taking_this(self):
775
889
self.run_script("""
776
$ bzr resolve --take-this dir
777
$ bzr commit --strict -m 'No more conflicts nor unknown files'
890
$ brz resolve --take-this dir
891
2>2 conflicts resolved, 0 remaining
892
$ brz commit -q --strict -m 'No more conflicts nor unknown files'
780
895
def test_resolve_taking_other(self):
781
896
self.run_script("""
782
$ bzr resolve --take-other dir
783
$ bzr commit --strict -m 'No more conflicts nor unknown files'
897
$ brz resolve --take-other dir
900
2>2 conflicts resolved, 0 remaining
901
$ brz commit -q --strict -m 'No more conflicts nor unknown files'
787
905
class TestResolveParentLoop(TestParametrizedResolveConflicts):
789
_conflict_type = conflicts.ParentLoop,
907
_conflict_type = conflicts.ParentLoop
791
909
_this_args = None
792
910
_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'
912
# Each side dict additionally defines:
913
# - dir_id: the directory being moved
914
# - target_id: The target directory
915
# - xfail: whether the test is expected to fail if the action is
916
# involved as 'other'
917
scenarios = mirror_scenarios(
802
919
# Dirs moved into each other
803
920
(dict(_base_actions='create_dir1_dir2'),
804
921
('dir1_into_dir2',
826
942
return [('rename', ('dir1', 'dir2/dir1'))]
828
944
def check_dir1_moved(self):
829
self.failIfExists('branch/dir1')
830
self.failUnlessExists('branch/dir2/dir1')
945
self.assertPathDoesNotExist('branch/dir1')
946
self.assertPathExists('branch/dir2/dir1')
832
948
def do_move_dir2_into_dir1(self):
833
949
return [('rename', ('dir2', 'dir1/dir2'))]
835
951
def check_dir2_moved(self):
836
self.failIfExists('branch/dir2')
837
self.failUnlessExists('branch/dir1/dir2')
952
self.assertPathDoesNotExist('branch/dir2')
953
self.assertPathExists('branch/dir1/dir2')
839
955
def do_create_dir1_4(self):
840
956
return [('add', ('dir1', 'dir1-id', 'directory', '')),
846
962
return [('rename', ('dir1', 'dir3/dir4/dir1'))]
848
964
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')
965
self.assertPathDoesNotExist('branch/dir1')
966
self.assertPathExists('branch/dir3/dir4/dir1')
967
self.assertPathExists('branch/dir3/dir4/dir1/dir2')
853
969
def do_move_dir3_into_dir2(self):
854
970
return [('rename', ('dir3', 'dir1/dir2/dir3'))]
856
972
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')
973
self.assertPathDoesNotExist('branch/dir3')
974
self.assertPathExists('branch/dir1/dir2/dir3')
975
self.assertPathExists('branch/dir1/dir2/dir3/dir4')
861
977
def _get_resolve_path_arg(self, wt, action):
862
978
# ParentLoop says: moving <conflict_path> into <path>. Cancelled move.
907
1023
def test_take_this(self):
908
1024
self.run_script("""
909
$ bzr rm foo.new --force
1025
$ brz rm -q foo.new --no-backup
910
1026
# FIXME: Isn't it weird that foo is now unkown even if foo.new has been put
911
1027
# aside ? -- vila 090916
913
$ bzr resolve foo.new
914
$ bzr commit --strict -m 'No more conflicts nor unknown files'
1029
$ brz resolve foo.new
1030
2>1 conflict resolved, 0 remaining
1031
$ brz commit -q --strict -m 'No more conflicts nor unknown files'
917
1034
def test_take_other(self):
918
1035
self.run_script("""
922
$ bzr commit --strict -m 'No more conflicts nor unknown files'
1036
$ brz rm -q foo --no-backup
1037
$ brz mv -q foo.new foo
1039
2>1 conflict resolved, 0 remaining
1040
$ brz commit -q --strict -m 'No more conflicts nor unknown files'
925
1043
def test_resolve_taking_this(self):
926
1044
self.run_script("""
927
$ bzr resolve --take-this foo.new
928
$ bzr commit --strict -m 'No more conflicts nor unknown files'
1045
$ brz resolve --take-this foo.new
1047
$ brz commit -q --strict -m 'No more conflicts nor unknown files'
931
1050
def test_resolve_taking_other(self):
932
1051
self.run_script("""
933
$ bzr resolve --take-other foo.new
934
$ bzr commit --strict -m 'No more conflicts nor unknown files'
1052
$ brz resolve --take-other foo.new
1054
$ brz commit -q --strict -m 'No more conflicts nor unknown files'
941
1061
# This is nearly like TestResolveNonDirectoryParent but with branch and
942
1062
# trunk switched. As such it should certainly produce the same
1064
self.assertRaises(errors.MalformedTransform,
1065
self.run_script, """
948
$ bzr commit -m 'Create trunk'
1071
$ brz commit -m 'Create trunk' -q
950
1073
$ echo "Boo!" >foo
951
$ bzr commit -m 'foo is now a file'
953
$ bzr branch . -r 1 ../branch
1074
$ brz commit -m 'foo is now a file' -q
1075
$ brz branch -q . -r 1 ../branch -q
955
1077
$ echo "Boing" >foo/bar
957
$ bzr commit -m 'Add foo/bar'
960
2>bzr: ERROR: Tree transform is malformed [('unversioned executability', 'new-1')]
1078
$ brz add -q foo/bar -q
1079
$ brz commit -m 'Add foo/bar' -q
1080
$ brz merge ../trunk
1081
2>brz: ERROR: Tree transform is malformed [('unversioned executability', 'new-1')]
1085
class TestNoFinalPath(script.TestCaseWithTransportAndScript):
1087
def test_bug_805809(self):
1090
Created a standalone tree (format: 2a)
1095
$ brz commit -m 'create file on trunk'
1096
2>Committing to: .../trunk/
1098
2>Committed revision 1.
1099
# Create a debian branch based on trunk
1101
$ brz branch trunk -r 1 debian
1102
2>Branched 1 revision.
1109
$ brz commit -m 'rename file to dir/file for debian'
1110
2>Committing to: .../debian/
1112
2>renamed file => dir/file
1113
2>Committed revision 2.
1114
# Create an experimental branch with a new root-id
1116
$ brz init experimental
1117
Created a standalone tree (format: 2a)
1119
# Work around merging into empty branch not being supported
1120
# (http://pad.lv/308562)
1121
$ echo something >not-empty
1124
$ brz commit -m 'Add some content in experimental'
1125
2>Committing to: .../experimental/
1127
2>Committed revision 1.
1128
# merge debian even without a common ancestor
1129
$ brz merge ../debian -r0..2
1132
2>All changes applied successfully.
1133
$ brz commit -m 'merging debian into experimental'
1134
2>Committing to: .../experimental/
1137
2>Committed revision 2.
1138
# Create an ubuntu branch with yet another root-id
1141
Created a standalone tree (format: 2a)
1143
# Work around merging into empty branch not being supported
1144
# (http://pad.lv/308562)
1145
$ echo something >not-empty-ubuntu
1147
adding not-empty-ubuntu
1148
$ brz commit -m 'Add some content in experimental'
1149
2>Committing to: .../ubuntu/
1150
2>added not-empty-ubuntu
1151
2>Committed revision 1.
1153
$ brz merge ../debian -r0..2
1156
2>All changes applied successfully.
1157
$ brz commit -m 'merging debian'
1158
2>Committing to: .../ubuntu/
1161
2>Committed revision 2.
1162
# Now try to merge experimental
1163
$ brz merge ../experimental
1165
2>Path conflict: dir / dir
1166
2>1 conflicts encountered.