/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/test_transform.py

  • Committer: Jelmer Vernooij
  • Date: 2018-06-29 20:24:31 UTC
  • mfrom: (6999 work)
  • mto: This revision was merged to the branch mainline in revision 7008.
  • Revision ID: jelmer@jelmer.uk-20180629202431-2td8kihrsthzuvau
merge trunk.

Show diffs side-by-side

added added

removed removed

Lines of Context:
61
61
from ..mutabletree import MutableTree
62
62
from ..sixish import (
63
63
    BytesIO,
 
64
    text_type,
64
65
    )
65
66
from . import (
66
67
    features,
101
102
        trans, root = self.get_transform()
102
103
        self.wt.lock_tree_write()
103
104
        self.addCleanup(self.wt.unlock)
104
 
        contents = ['just some content\n']
 
105
        contents = [b'just some content\n']
105
106
        sha1 = osutils.sha_strings(contents)
106
107
        # Roll back the clock
107
108
        trans._creation_mtime = time.time() - 20.0
145
146
        trans_id = transform.create_path('name', root)
146
147
        self.assertIs(transform.final_file_id(trans_id), None)
147
148
        self.assertIs(None, transform.final_kind(trans_id))
148
 
        transform.create_file('contents', trans_id)
 
149
        transform.create_file([b'contents'], trans_id)
149
150
        transform.set_executability(True, trans_id)
150
151
        transform.version_file('my_pretties', trans_id)
151
152
        self.assertRaises(DuplicateKey, transform.version_file,
158
159
        transform.create_directory(oz_id)
159
160
        transform.version_file('ozzie', oz_id)
160
161
        trans_id2 = transform.create_path('name2', root)
161
 
        transform.create_file('contents', trans_id2)
 
162
        transform.create_file([b'contents'], trans_id2)
162
163
        transform.set_executability(False, trans_id2)
163
164
        transform.version_file('my_pretties2', trans_id2)
164
165
        modified_paths = transform.apply().modified_paths
243
244
        # Roll back the clock, so that we know everything is being set to the
244
245
        # exact time
245
246
        transform._creation_mtime = creation_mtime = time.time() - 20.0
246
 
        transform.create_file('content-one',
 
247
        transform.create_file([b'content-one'],
247
248
                              transform.create_path('one', root))
248
249
        time.sleep(1) # *ugly*
249
 
        transform.create_file('content-two',
 
250
        transform.create_file([b'content-two'],
250
251
                              transform.create_path('two', root))
251
252
        transform.apply()
252
253
        fo, st1 = self.wt.get_file_with_stat('one', filtered=False)
354
355
    def test_hardlink(self):
355
356
        self.requireFeature(HardlinkFeature)
356
357
        transform, root = self.get_transform()
357
 
        transform.new_file('file1', root, 'contents')
 
358
        transform.new_file('file1', root, b'contents')
358
359
        transform.apply()
359
360
        target = self.make_branch_and_tree('target')
360
361
        target_transform = TreeTransform(target)
370
371
        transform, root = self.get_transform()
371
372
        self.wt.lock_tree_write()
372
373
        self.addCleanup(self.wt.unlock)
373
 
        trans_id = transform.new_file('name', root, 'contents',
 
374
        trans_id = transform.new_file('name', root, b'contents',
374
375
                                      'my_pretties', True)
375
376
        oz = transform.new_directory('oz', root, 'oz-id')
376
377
        dorothy = transform.new_directory('dorothy', oz, 'dorothy-id')
377
 
        toto = transform.new_file('toto', dorothy, 'toto-contents',
 
378
        toto = transform.new_file('toto', dorothy, b'toto-contents',
378
379
                                  'toto-id', False)
379
380
 
380
381
        self.assertEqual(len(transform.find_conflicts()), 0)
404
405
 
405
406
    def test_conflicts(self):
406
407
        transform, root = self.get_transform()
407
 
        trans_id = transform.new_file('name', root, 'contents',
 
408
        trans_id = transform.new_file('name', root, b'contents',
408
409
                                      'my_pretties')
409
410
        self.assertEqual(len(transform.find_conflicts()), 0)
410
 
        trans_id2 = transform.new_file('name', root, 'Crontents', 'toto')
 
411
        trans_id2 = transform.new_file('name', root, b'Crontents', 'toto')
411
412
        self.assertEqual(transform.find_conflicts(),
412
413
                         [('duplicate', trans_id, trans_id2, 'name')])
413
414
        self.assertRaises(MalformedTransform, transform.apply)
434
435
        transform.adjust_path('name2', root, trans_id2)
435
436
        self.assertEqual(transform.find_conflicts(),
436
437
                         [('versioning no contents', lion_id)])
437
 
        transform.create_file('Contents, okay?', lion_id)
 
438
        transform.create_file([b'Contents, okay?'], lion_id)
438
439
        transform.adjust_path('name2', trans_id2, trans_id2)
439
440
        self.assertEqual(transform.find_conflicts(),
440
441
                         [('parent loop', trans_id2),
448
449
        self.assertEqual(transform.find_conflicts(),
449
450
                         [('non-file executability', oz_id)])
450
451
        transform.set_executability(None, oz_id)
451
 
        tip_id = transform.new_file('tip', oz_id, 'ozma', 'tip-id')
 
452
        tip_id = transform.new_file('tip', oz_id, b'ozma', 'tip-id')
452
453
        transform.apply()
453
454
        self.assertEqual(self.wt.path2id('name'), 'my_pretties')
454
455
        self.assertEqual('contents', file(self.wt.abspath('name')).read())
455
456
        transform2, root = self.get_transform()
456
457
        oz_id = transform2.trans_id_tree_path('oz')
457
 
        newtip = transform2.new_file('tip', oz_id, 'other', 'tip-id')
 
458
        newtip = transform2.new_file('tip', oz_id, b'other', 'tip-id')
458
459
        result = transform2.find_conflicts()
459
460
        fp = FinalPaths(transform2)
460
461
        self.assertTrue('oz/tip' in transform2._tree_path_ids)
484
485
        tree.case_sensitive = True
485
486
        transform = TreeTransform(tree)
486
487
        self.addCleanup(transform.finalize)
487
 
        transform.new_file('file', transform.root, 'content')
488
 
        transform.new_file('FiLe', transform.root, 'content')
 
488
        transform.new_file('file', transform.root, b'content')
 
489
        transform.new_file('FiLe', transform.root, b'content')
489
490
        result = transform.find_conflicts()
490
491
        self.assertEqual([], result)
491
492
        transform.finalize()
494
495
        tree.case_sensitive = False
495
496
        transform = TreeTransform(tree)
496
497
        self.addCleanup(transform.finalize)
497
 
        transform.new_file('file', transform.root, 'content')
498
 
        transform.new_file('FiLe', transform.root, 'content')
 
498
        transform.new_file('file', transform.root, b'content')
 
499
        transform.new_file('FiLe', transform.root, b'content')
499
500
        result = transform.find_conflicts()
500
501
        self.assertEqual([('duplicate', 'new-1', 'new-2', 'file')], result)
501
502
 
508
509
        tree.case_sensitive = True
509
510
        transform = TreeTransform(tree)
510
511
        self.addCleanup(transform.finalize)
511
 
        transform.new_file('file', transform.root, 'content')
 
512
        transform.new_file('file', transform.root, b'content')
512
513
        result = transform.find_conflicts()
513
514
        self.assertEqual([], result)
514
515
        transform.finalize()
517
518
        tree.case_sensitive = False
518
519
        transform = TreeTransform(tree)
519
520
        self.addCleanup(transform.finalize)
520
 
        transform.new_file('file', transform.root, 'content')
 
521
        transform.new_file('file', transform.root, b'content')
521
522
        result = transform.find_conflicts()
522
523
        self.assertEqual([('duplicate', 'new-1', 'new-2', 'file')], result)
523
524
 
529
530
        tree.case_sensitive = False
530
531
        transform = TreeTransform(tree)
531
532
        self.addCleanup(transform.finalize)
532
 
        transform.new_file('file', transform.root, 'content')
533
 
        transform.new_file('FiLe', transform.root, 'content')
 
533
        transform.new_file('file', transform.root, b'content')
 
534
        transform.new_file('FiLe', transform.root, b'content')
534
535
        resolve_conflicts(transform)
535
536
        transform.apply()
536
537
        self.assertPathExists('tree/file')
544
545
        tree.case_sensitive = False
545
546
        transform = TreeTransform(tree)
546
547
        self.addCleanup(transform.finalize)
547
 
        transform.new_file('file', transform.root, 'content')
548
 
        transform.new_file('FiLe', transform.root, 'content')
 
548
        transform.new_file('file', transform.root, b'content')
 
549
        transform.new_file('FiLe', transform.root, b'content')
549
550
        resolve_conflicts(transform,
550
551
                          pass_func=lambda t, c: resolve_checkout(t, c, []))
551
552
        transform.apply()
557
558
        tree = self.make_branch_and_tree('tree')
558
559
        transform = TreeTransform(tree)
559
560
        self.addCleanup(transform.finalize)
560
 
        transform.new_file('file', transform.root, 'content')
561
 
        transform.new_file('FiLe', transform.root, 'content')
 
561
        transform.new_file('file', transform.root, b'content')
 
562
        transform.new_file('FiLe', transform.root, b'content')
562
563
        dir = transform.new_directory('dir', transform.root)
563
 
        transform.new_file('dirfile', dir, 'content')
564
 
        transform.new_file('dirFiLe', dir, 'content')
 
564
        transform.new_file('dirfile', dir, b'content')
 
565
        transform.new_file('dirFiLe', dir, b'content')
565
566
        resolve_conflicts(transform)
566
567
        transform.apply()
567
568
        self.assertPathExists('tree/file')
579
580
        transform = TreeTransform(tree)
580
581
        self.addCleanup(transform.finalize)
581
582
        dir = transform.new_directory('dir', transform.root)
582
 
        first = transform.new_file('file', dir, 'content')
583
 
        second = transform.new_file('FiLe', dir, 'content')
 
583
        first = transform.new_file('file', dir, b'content')
 
584
        second = transform.new_file('FiLe', dir, b'content')
584
585
        self.assertContainsRe(transform._limbo_name(first), 'new-1/file')
585
586
        self.assertNotContainsRe(transform._limbo_name(second), 'new-1/FiLe')
586
587
 
608
609
    def test_unversioning(self):
609
610
        create_tree, root = self.get_transform()
610
611
        parent_id = create_tree.new_directory('parent', root, b'parent-id')
611
 
        create_tree.new_file('child', parent_id, 'child', b'child-id')
 
612
        create_tree.new_file('child', parent_id, b'child', b'child-id')
612
613
        create_tree.apply()
613
614
        unversion = TreeTransform(self.wt)
614
615
        self.addCleanup(unversion.finalize)
624
625
        create_tree, root = self.get_transform()
625
626
        # prepare tree
626
627
        root = create_tree.root
627
 
        create_tree.new_file('name1', root, 'hello1', 'name1')
628
 
        create_tree.new_file('name2', root, 'hello2', 'name2')
 
628
        create_tree.new_file('name1', root, b'hello1', 'name1')
 
629
        create_tree.new_file('name2', root, b'hello2', 'name2')
629
630
        ddir = create_tree.new_directory('dying_directory', root, 'ddir')
630
 
        create_tree.new_file('dying_file', ddir, 'goodbye1', 'dfile')
631
 
        create_tree.new_file('moving_file', ddir, 'later1', 'mfile')
632
 
        create_tree.new_file('moving_file2', root, 'later2', 'mfile2')
 
631
        create_tree.new_file('dying_file', ddir, b'goodbye1', 'dfile')
 
632
        create_tree.new_file('moving_file', ddir, b'later1', 'mfile')
 
633
        create_tree.new_file('moving_file2', root, b'later2', 'mfile2')
633
634
        create_tree.apply()
634
635
 
635
636
        mangle_tree, root = self.get_transform()
653
654
        newdir = mangle_tree.new_directory('new_directory', root, 'newdir')
654
655
        mfile2 = mangle_tree.trans_id_tree_path('moving_file2')
655
656
        mangle_tree.adjust_path('mfile2', newdir, mfile2)
656
 
        mangle_tree.new_file('newfile', newdir, 'hello3', 'dfile')
 
657
        mangle_tree.new_file('newfile', newdir, b'hello3', 'dfile')
657
658
        self.assertEqual(mangle_tree.final_file_id(mfile2), 'mfile2')
658
659
        self.assertEqual(mangle_tree.final_parent(mfile2), newdir)
659
660
        self.assertEqual(mangle_tree.final_file_id(mfile2), 'mfile2')
674
675
    def test_both_rename(self):
675
676
        create_tree, root = self.get_transform()
676
677
        newdir = create_tree.new_directory('selftest', root, 'selftest-id')
677
 
        create_tree.new_file('blackbox.py', newdir, 'hello1', 'blackbox-id')
 
678
        create_tree.new_file('blackbox.py', newdir, b'hello1', 'blackbox-id')
678
679
        create_tree.apply()
679
680
        mangle_tree, root = self.get_transform()
680
681
        selftest = mangle_tree.trans_id_tree_path('selftest')
689
690
        breezy = create_tree.new_directory('breezy', root, 'breezy-id')
690
691
        tests = create_tree.new_directory('tests', breezy, 'tests-id')
691
692
        blackbox = create_tree.new_directory('blackbox', tests, 'blackbox-id')
692
 
        create_tree.new_file('test_too_much.py', blackbox, 'hello1',
 
693
        create_tree.new_file('test_too_much.py', blackbox, b'hello1',
693
694
                             'test_too_much-id')
694
695
        create_tree.apply()
695
696
        mangle_tree, root = self.get_transform()
704
705
    def test_both_rename3(self):
705
706
        create_tree, root = self.get_transform()
706
707
        tests = create_tree.new_directory('tests', root, 'tests-id')
707
 
        create_tree.new_file('test_too_much.py', tests, 'hello1',
 
708
        create_tree.new_file('test_too_much.py', tests, b'hello1',
708
709
                             'test_too_much-id')
709
710
        create_tree.apply()
710
711
        mangle_tree, root = self.get_transform()
719
720
        create_tree, root = self.get_transform()
720
721
        # prepare tree
721
722
        root = create_tree.root
722
 
        create_tree.new_file('name1', root, 'hello1', 'name1')
 
723
        create_tree.new_file('name1', root, b'hello1', 'name1')
723
724
        create_tree.apply()
724
725
        delete_contents, root = self.get_transform()
725
726
        file = delete_contents.trans_id_tree_path('name1')
735
736
        create_tree, root = self.get_transform()
736
737
        # prepare tree
737
738
        root = create_tree.root
738
 
        create_tree.new_file('name1', root, 'hello1', 'name1')
 
739
        create_tree.new_file('name1', root, b'hello1', 'name1')
739
740
        create_tree.apply()
740
741
        delete_contents = TreeTransform(self.wt)
741
742
        self.addCleanup(delete_contents.finalize)
745
746
        delete_contents.finalize()
746
747
        replace = TreeTransform(self.wt)
747
748
        self.addCleanup(replace.finalize)
748
 
        name2 = replace.new_file('name2', root, 'hello2', 'name1')
 
749
        name2 = replace.new_file('name2', root, b'hello2', 'name1')
749
750
        conflicts = replace.find_conflicts()
750
751
        name1 = replace.trans_id_tree_path('name1')
751
752
        self.assertEqual(conflicts, [('duplicate id', name1, name2)])
811
812
 
812
813
    def get_conflicted(self):
813
814
        create, root = self.get_transform()
814
 
        create.new_file('dorothy', root, 'dorothy', 'dorothy-id')
 
815
        create.new_file('dorothy', root, b'dorothy', 'dorothy-id')
815
816
        oz = create.new_directory('oz', root, 'oz-id')
816
817
        create.new_directory('emeraldcity', oz, 'emerald-id')
817
818
        create.apply()
818
819
        conflicts, root = self.get_transform()
819
820
        # set up duplicate entry, duplicate id
820
 
        new_dorothy = conflicts.new_file('dorothy', root, 'dorothy',
 
821
        new_dorothy = conflicts.new_file('dorothy', root, b'dorothy',
821
822
                                         'dorothy-id')
822
823
        old_dorothy = conflicts.trans_id_tree_path('dorothy')
823
824
        oz = conflicts.trans_id_tree_path('oz')
877
878
        raw_conflicts = resolve_conflicts(tt)
878
879
        cooked_conflicts = cook_conflicts(raw_conflicts, tt)
879
880
        tt.finalize()
880
 
        conflicts_s = [unicode(c) for c in cooked_conflicts]
 
881
        conflicts_s = [text_type(c) for c in cooked_conflicts]
881
882
        self.assertEqual(len(cooked_conflicts), len(conflicts_s))
882
883
        self.assertEqual(conflicts_s[0], 'Conflict adding file dorothy.  '
883
884
                                         'Moved existing file to '
900
901
 
901
902
    def prepare_wrong_parent_kind(self):
902
903
        tt, root = self.get_transform()
903
 
        tt.new_file('parent', root, 'contents', b'parent-id')
 
904
        tt.new_file('parent', root, b'contents', b'parent-id')
904
905
        tt.apply()
905
906
        tt, root = self.get_transform()
906
907
        parent_id = tt.trans_id_file_id('parent-id')
907
 
        tt.new_file('child,', parent_id, 'contents2', b'file-id')
 
908
        tt.new_file('child,', parent_id, b'contents2', b'file-id')
908
909
        return tt
909
910
 
910
911
    def test_find_conflicts_wrong_parent_kind(self):
926
927
    def test_resolve_conflicts_wrong_new_parent_kind(self):
927
928
        tt, root = self.get_transform()
928
929
        parent_id = tt.new_directory('parent', root, b'parent-id')
929
 
        tt.new_file('child,', parent_id, 'contents2', b'file-id')
 
930
        tt.new_file('child,', parent_id, b'contents2', b'file-id')
930
931
        tt.apply()
931
932
        tt, root = self.get_transform()
932
933
        parent_id = tt.trans_id_file_id('parent-id')
933
934
        tt.delete_contents(parent_id)
934
 
        tt.create_file('contents', parent_id)
 
935
        tt.create_file([b'contents'], parent_id)
935
936
        raw_conflicts = resolve_conflicts(tt)
936
937
        self.assertEqual({('non-directory parent', 'Created directory',
937
938
                         'new-3')}, raw_conflicts)
942
943
    def test_resolve_conflicts_wrong_parent_kind_unversioned(self):
943
944
        tt, root = self.get_transform()
944
945
        parent_id = tt.new_directory('parent', root)
945
 
        tt.new_file('child,', parent_id, 'contents2')
 
946
        tt.new_file('child,', parent_id, b'contents2')
946
947
        tt.apply()
947
948
        tt, root = self.get_transform()
948
949
        parent_id = tt.trans_id_tree_path('parent')
949
950
        tt.delete_contents(parent_id)
950
 
        tt.create_file('contents', parent_id)
 
951
        tt.create_file([b'contents'], parent_id)
951
952
        resolve_conflicts(tt)
952
953
        tt.apply()
953
954
        self.assertFalse(self.wt.is_versioned('parent'))
958
959
        tt = TreeTransform(wt)
959
960
        self.addCleanup(tt.finalize)
960
961
        parent = tt.trans_id_file_id('parent-id')
961
 
        tt.new_file('file', parent, 'Contents')
 
962
        tt.new_file('file', parent, b'Contents')
962
963
        raw_conflicts = resolve_conflicts(tt)
963
964
        # Since the directory doesn't exist it's seen as 'missing'.  So
964
965
        # 'resolve_conflicts' create a conflict asking for it to be created.
996
997
        create, root = self.get_transform()
997
998
        old = create.new_directory('old-parent', root, 'old-id')
998
999
        intermediate = create.new_directory('intermediate', old, 'im-id')
999
 
        myfile = create.new_file('myfile', intermediate, 'myfile-text',
 
1000
        myfile = create.new_file('myfile', intermediate, b'myfile-text',
1000
1001
                                 'myfile-id')
1001
1002
        create.apply()
1002
1003
        rename, root = self.get_transform()
1011
1012
        # see https://bugs.launchpad.net/bzr/+bug/491763
1012
1013
        create, root_id = self.get_transform()
1013
1014
        first_dir = create.new_directory('first-dir', root_id, 'first-id')
1014
 
        myfile = create.new_file('myfile', root_id, 'myfile-text',
 
1015
        myfile = create.new_file('myfile', root_id, b'myfile-text',
1015
1016
                                 'myfile-id')
1016
1017
        create.apply()
1017
1018
        if os.name == "posix" and sys.platform != "cygwin":
1057
1058
        wt = transform._tree
1058
1059
        wt.lock_read()
1059
1060
        self.addCleanup(wt.unlock)
1060
 
        transform.new_file('set_on_creation', root, 'Set on creation', 'soc',
 
1061
        transform.new_file('set_on_creation', root, b'Set on creation', 'soc',
1061
1062
                           True)
1062
1063
        sac = transform.new_file('set_after_creation', root,
1063
1064
                                 'Set after creation', 'sac')
1064
1065
        transform.set_executability(True, sac)
1065
 
        uws = transform.new_file('unset_without_set', root, 'Unset badly',
 
1066
        uws = transform.new_file('unset_without_set', root, b'Unset badly',
1066
1067
                                 'uws')
1067
1068
        self.assertRaises(KeyError, transform.set_executability, None, uws)
1068
1069
        transform.apply()
1074
1075
        if sys.platform == 'win32':
1075
1076
            raise TestSkipped('chmod has no effect on win32')
1076
1077
        transform, root = self.get_transform()
1077
 
        transform.new_file('file1', root, 'contents', 'file1-id', True)
 
1078
        transform.new_file('file1', root, b'contents', b'file1-id', True)
1078
1079
        transform.apply()
1079
1080
        self.wt.lock_write()
1080
1081
        self.addCleanup(self.wt.unlock)
1082
1083
        transform, root = self.get_transform()
1083
1084
        file1_id = transform.trans_id_tree_path('file1')
1084
1085
        transform.delete_contents(file1_id)
1085
 
        transform.create_file('contents2', file1_id)
 
1086
        transform.create_file([b'contents2'], file1_id)
1086
1087
        transform.apply()
1087
1088
        self.assertTrue(self.wt.is_executable('file1'))
1088
1089
 
1099
1100
 
1100
1101
        transform, root = self.get_transform()
1101
1102
 
1102
 
        bar1_id = transform.new_file('bar', root, 'bar contents 1\n',
1103
 
                                     file_id='bar-id-1', executable=False)
 
1103
        bar1_id = transform.new_file('bar', root, b'bar contents 1\n',
 
1104
                                     file_id=b'bar-id-1', executable=False)
1104
1105
        transform.apply()
1105
1106
 
1106
1107
        transform, root = self.get_transform()
1108
1109
        bar2_id = transform.trans_id_tree_path('bar2')
1109
1110
        try:
1110
1111
            os.stat = instrumented_stat
1111
 
            transform.create_file('bar2 contents\n', bar2_id, mode_id=bar1_id)
 
1112
            transform.create_file([b'bar2 contents\n'], bar2_id, mode_id=bar1_id)
1112
1113
        finally:
1113
1114
            os.stat = real_stat
1114
1115
            transform.finalize()
1119
1120
    def test_iter_changes(self):
1120
1121
        self.wt.set_root_id(b'eert_toor')
1121
1122
        transform, root = self.get_transform()
1122
 
        transform.new_file('old', root, 'blah', 'id-1', True)
 
1123
        transform.new_file('old', root, b'blah', b'id-1', True)
1123
1124
        transform.apply()
1124
1125
        transform, root = self.get_transform()
1125
1126
        try:
1140
1141
    def test_iter_changes_new(self):
1141
1142
        self.wt.set_root_id(b'eert_toor')
1142
1143
        transform, root = self.get_transform()
1143
 
        transform.new_file('old', root, 'blah')
 
1144
        transform.new_file('old', root, b'blah')
1144
1145
        transform.apply()
1145
1146
        transform, root = self.get_transform()
1146
1147
        try:
1155
1156
    def test_iter_changes_modifications(self):
1156
1157
        self.wt.set_root_id(b'eert_toor')
1157
1158
        transform, root = self.get_transform()
1158
 
        transform.new_file('old', root, 'blah', 'id-1')
1159
 
        transform.new_file('new', root, 'blah')
 
1159
        transform.new_file('old', root, b'blah', 'id-1')
 
1160
        transform.new_file('new', root, b'blah')
1160
1161
        transform.new_directory('subdir', root, 'subdir-id')
1161
1162
        transform.apply()
1162
1163
        transform, root = self.get_transform()
1173
1174
                (False, False))], list(transform.iter_changes()))
1174
1175
 
1175
1176
            #content change
1176
 
            transform.create_file('blah', old)
 
1177
            transform.create_file([b'blah'], old)
1177
1178
            self.assertEqual([('id-1', ('old', 'old'), True, (True, True),
1178
1179
                ('eert_toor', 'eert_toor'), ('old', 'old'), ('file', 'file'),
1179
1180
                (False, False))], list(transform.iter_changes()))
1232
1233
        # obviously can't bleed into file2's change output.  But for now, it
1233
1234
        # works.
1234
1235
        transform, root = self.get_transform()
1235
 
        transform.new_file('file1', root, 'blah', 'id-1')
1236
 
        transform.new_file('file2', root, 'blah', 'id-2')
 
1236
        transform.new_file('file1', root, b'blah', 'id-1')
 
1237
        transform.new_file('file2', root, b'blah', 'id-2')
1237
1238
        transform.apply()
1238
1239
        transform, root = self.get_transform()
1239
1240
        try:
1274
1275
        """Ensure that no-ops are not treated as modifications"""
1275
1276
        self.wt.set_root_id(b'eert_toor')
1276
1277
        transform, root = self.get_transform()
1277
 
        transform.new_file('old', root, 'blah', 'id-1')
1278
 
        transform.new_directory('subdir', root, 'subdir-id')
 
1278
        transform.new_file('old', root, b'blah', b'id-1')
 
1279
        transform.new_directory('subdir', root, b'subdir-id')
1279
1280
        transform.apply()
1280
1281
        transform, root = self.get_transform()
1281
1282
        try:
1294
1295
 
1295
1296
    def test_rename_count(self):
1296
1297
        transform, root = self.get_transform()
1297
 
        transform.new_file('name1', root, 'contents')
 
1298
        transform.new_file('name1', root, b'contents')
1298
1299
        self.assertEqual(transform.rename_count, 0)
1299
1300
        transform.apply()
1300
1301
        self.assertEqual(transform.rename_count, 1)
1317
1318
        """
1318
1319
        transform, root = self.get_transform()
1319
1320
        parent1 = transform.new_directory('parent1', root)
1320
 
        child1 = transform.new_file('child1', parent1, 'contents')
 
1321
        child1 = transform.new_file('child1', parent1, b'contents')
1321
1322
        parent2 = transform.new_directory('parent2', root)
1322
1323
        transform.adjust_path('child1', parent2, child1)
1323
1324
        transform.apply()
1336
1337
        """
1337
1338
        transform, root = self.get_transform()
1338
1339
        parent1 = transform.new_directory('parent1', root)
1339
 
        child1 = transform.new_file('child1', parent1, 'contents')
1340
 
        child2 = transform.new_file('child2', parent1, 'contents')
 
1340
        child1 = transform.new_file('child1', parent1, b'contents')
 
1341
        child2 = transform.new_file('child2', parent1, b'contents')
1341
1342
        try:
1342
1343
            transform.cancel_creation(parent1)
1343
1344
        except OSError:
1363
1364
        """Make sure adjust_path keeps track of limbo children properly"""
1364
1365
        transform, root = self.get_transform()
1365
1366
        parent1 = transform.new_directory('parent1', root)
1366
 
        child1 = transform.new_file('child1', parent1, 'contents')
 
1367
        child1 = transform.new_file('child1', parent1, b'contents')
1367
1368
        parent2 = transform.new_directory('parent2', root)
1368
1369
        transform.adjust_path('child1', parent2, child1)
1369
1370
        transform.cancel_creation(child1)
1465
1466
            tt = TreeTransform(wt)  # TreeTransform obtains write lock
1466
1467
            try:
1467
1468
                foo = tt.new_directory('foo', tt.root)
1468
 
                tt.new_file('bar', foo, 'foobar')
 
1469
                tt.new_file('bar', foo, b'foobar')
1469
1470
                baz = tt.new_directory('baz', tt.root)
1470
 
                tt.new_file('qux', baz, 'quux')
 
1471
                tt.new_file('qux', baz, b'quux')
1471
1472
                # Ask for a rename 'foo' -> 'baz'
1472
1473
                tt.adjust_path('baz', tt.root, foo)
1473
1474
                # Lie to tt that we've already resolved all conflicts.
1527
1528
        tt.delete_contents(foo_trans_id)
1528
1529
        tt.create_directory(foo_trans_id)
1529
1530
        bar_trans_id = tt.trans_id_tree_path("foo/bar")
1530
 
        tt.create_file(["aa\n"], bar_trans_id)
 
1531
        tt.create_file([b"aa\n"], bar_trans_id)
1531
1532
        tt.version_file("bar-1", bar_trans_id)
1532
1533
        tt.apply()
1533
1534
        self.assertPathExists("foo/bar")
1568
1569
        bar_trans_id = tt.trans_id_tree_path("foo/bar")
1569
1570
        tt.delete_contents(foo_trans_id)
1570
1571
        tt.delete_versioned(bar_trans_id)
1571
 
        tt.create_file(["aa\n"], foo_trans_id)
 
1572
        tt.create_file([b"aa\n"], foo_trans_id)
1572
1573
        tt.apply()
1573
1574
        self.assertPathExists("foo")
1574
1575
        wt.lock_read()
1599
1600
    def test_no_final_path(self):
1600
1601
        transform, root = self.get_transform()
1601
1602
        trans_id = transform.trans_id_file_id('foo')
1602
 
        transform.create_file('bar', trans_id)
 
1603
        transform.create_file([b'bar'], trans_id)
1603
1604
        transform.cancel_creation(trans_id)
1604
1605
        transform.apply()
1605
1606
 
1696
1697
    def test_text_merge(self):
1697
1698
        root_id = generate_ids.gen_root_id()
1698
1699
        base = TransformGroup("base", root_id)
1699
 
        base.tt.new_file('a', base.root, 'a\nb\nc\nd\be\n', 'a')
1700
 
        base.tt.new_file('b', base.root, 'b1', 'b')
1701
 
        base.tt.new_file('c', base.root, 'c', 'c')
1702
 
        base.tt.new_file('d', base.root, 'd', 'd')
1703
 
        base.tt.new_file('e', base.root, 'e', 'e')
1704
 
        base.tt.new_file('f', base.root, 'f', 'f')
1705
 
        base.tt.new_directory('g', base.root, 'g')
1706
 
        base.tt.new_directory('h', base.root, 'h')
 
1700
        base.tt.new_file('a', base.root, b'a\nb\nc\nd\be\n', b'a')
 
1701
        base.tt.new_file('b', base.root, b'b1', b'b')
 
1702
        base.tt.new_file('c', base.root, b'c', b'c')
 
1703
        base.tt.new_file('d', base.root, b'd', b'd')
 
1704
        base.tt.new_file('e', base.root, b'e', b'e')
 
1705
        base.tt.new_file('f', base.root, b'f', b'f')
 
1706
        base.tt.new_directory('g', base.root, b'g')
 
1707
        base.tt.new_directory('h', base.root, b'h')
1707
1708
        base.tt.apply()
1708
1709
        other = TransformGroup("other", root_id)
1709
 
        other.tt.new_file('a', other.root, 'y\nb\nc\nd\be\n', 'a')
1710
 
        other.tt.new_file('b', other.root, 'b2', 'b')
1711
 
        other.tt.new_file('c', other.root, 'c2', 'c')
1712
 
        other.tt.new_file('d', other.root, 'd', 'd')
1713
 
        other.tt.new_file('e', other.root, 'e2', 'e')
1714
 
        other.tt.new_file('f', other.root, 'f', 'f')
1715
 
        other.tt.new_file('g', other.root, 'g', 'g')
1716
 
        other.tt.new_file('h', other.root, 'h\ni\nj\nk\n', 'h')
1717
 
        other.tt.new_file('i', other.root, 'h\ni\nj\nk\n', 'i')
 
1710
        other.tt.new_file('a', other.root, b'y\nb\nc\nd\be\n', b'a')
 
1711
        other.tt.new_file('b', other.root, b'b2', b'b')
 
1712
        other.tt.new_file('c', other.root, b'c2', b'c')
 
1713
        other.tt.new_file('d', other.root, b'd', b'd')
 
1714
        other.tt.new_file('e', other.root, b'e2', b'e')
 
1715
        other.tt.new_file('f', other.root, b'f', b'f')
 
1716
        other.tt.new_file('g', other.root, b'g', b'g')
 
1717
        other.tt.new_file('h', other.root, b'h\ni\nj\nk\n', b'h')
 
1718
        other.tt.new_file('i', other.root, b'h\ni\nj\nk\n', b'i')
1718
1719
        other.tt.apply()
1719
1720
        this = TransformGroup("this", root_id)
1720
 
        this.tt.new_file('a', this.root, 'a\nb\nc\nd\bz\n', 'a')
1721
 
        this.tt.new_file('b', this.root, 'b', 'b')
1722
 
        this.tt.new_file('c', this.root, 'c', 'c')
1723
 
        this.tt.new_file('d', this.root, 'd2', 'd')
1724
 
        this.tt.new_file('e', this.root, 'e2', 'e')
1725
 
        this.tt.new_file('f', this.root, 'f', 'f')
1726
 
        this.tt.new_file('g', this.root, 'g', 'g')
1727
 
        this.tt.new_file('h', this.root, '1\n2\n3\n4\n', 'h')
1728
 
        this.tt.new_file('i', this.root, '1\n2\n3\n4\n', 'i')
 
1721
        this.tt.new_file('a', this.root, b'a\nb\nc\nd\bz\n', b'a')
 
1722
        this.tt.new_file('b', this.root, b'b', b'b')
 
1723
        this.tt.new_file('c', this.root, b'c', b'c')
 
1724
        this.tt.new_file('d', this.root, b'd2', b'd')
 
1725
        this.tt.new_file('e', this.root, b'e2', b'e')
 
1726
        this.tt.new_file('f', this.root, b'f', b'f')
 
1727
        this.tt.new_file('g', this.root, b'g', b'g')
 
1728
        this.tt.new_file('h', this.root, b'1\n2\n3\n4\n', b'h')
 
1729
        this.tt.new_file('i', this.root, b'1\n2\n3\n4\n', b'i')
1729
1730
        this.tt.apply()
1730
1731
        Merge3Merger(this.wt, this.wt, base.wt, other.wt)
1731
1732
 
1732
1733
        # textual merge
1733
 
        self.assertEqual(this.wt.get_file(this.wt.id2path(b'a')).read(), 'y\nb\nc\nd\bz\n')
 
1734
        self.assertEqual(this.wt.get_file(this.wt.id2path(b'a')).read(), b'y\nb\nc\nd\bz\n')
1734
1735
        # three-way text conflict
1735
1736
        self.assertEqual(this.wt.get_file(this.wt.id2path(b'b')).read(),
1736
1737
                         conflict_text('b', 'b2'))
1737
1738
        # OTHER wins
1738
 
        self.assertEqual(this.wt.get_file(this.wt.id2path(b'c')).read(), 'c2')
 
1739
        self.assertEqual(this.wt.get_file(this.wt.id2path(b'c')).read(), b'c2')
1739
1740
        # THIS wins
1740
 
        self.assertEqual(this.wt.get_file(this.wt.id2path(b'd')).read(), 'd2')
 
1741
        self.assertEqual(this.wt.get_file(this.wt.id2path(b'd')).read(), b'd2')
1741
1742
        # Ambigious clean merge
1742
 
        self.assertEqual(this.wt.get_file(this.wt.id2path(b'e')).read(), 'e2')
 
1743
        self.assertEqual(this.wt.get_file(this.wt.id2path(b'e')).read(), b'e2')
1743
1744
        # No change
1744
 
        self.assertEqual(this.wt.get_file(this.wt.id2path(b'f')).read(), 'f')
 
1745
        self.assertEqual(this.wt.get_file(this.wt.id2path(b'f')).read(), b'f')
1745
1746
        # Correct correct results when THIS == OTHER
1746
 
        self.assertEqual(this.wt.get_file(this.wt.id2path(b'g')).read(), 'g')
 
1747
        self.assertEqual(this.wt.get_file(this.wt.id2path(b'g')).read(), b'g')
1747
1748
        # Text conflict when THIS & OTHER are text and BASE is dir
1748
1749
        self.assertEqual(this.wt.get_file(this.wt.id2path(b'h')).read(),
1749
1750
                         conflict_text('1\n2\n3\n4\n', 'h\ni\nj\nk\n'))
1750
1751
        self.assertEqual(this.wt.get_file('h.THIS').read(),
1751
 
                         '1\n2\n3\n4\n')
 
1752
                         b'1\n2\n3\n4\n')
1752
1753
        self.assertEqual(this.wt.get_file('h.OTHER').read(),
1753
 
                         'h\ni\nj\nk\n')
 
1754
                         b'h\ni\nj\nk\n')
1754
1755
        self.assertEqual(file_kind(this.wt.abspath('h.BASE')), 'directory')
1755
1756
        self.assertEqual(this.wt.get_file(this.wt.id2path(b'i')).read(),
1756
 
                         conflict_text('1\n2\n3\n4\n', 'h\ni\nj\nk\n'))
 
1757
                         conflict_text(b'1\n2\n3\n4\n', b'h\ni\nj\nk\n'))
1757
1758
        self.assertEqual(this.wt.get_file('i.THIS').read(),
1758
 
                         '1\n2\n3\n4\n')
 
1759
                         b'1\n2\n3\n4\n')
1759
1760
        self.assertEqual(this.wt.get_file('i.OTHER').read(),
1760
 
                         'h\ni\nj\nk\n')
 
1761
                         b'h\ni\nj\nk\n')
1761
1762
        self.assertEqual(os.path.exists(this.wt.abspath('i.BASE')), False)
1762
1763
        modified = ['a', 'b', 'c', 'h', 'i']
1763
1764
        merge_modified = this.wt.merge_modified()
1778
1779
        this = TransformGroup("THIS", root_id)
1779
1780
        other = TransformGroup("OTHER", root_id)
1780
1781
        for tg in this, base, other:
1781
 
            tg.tt.new_directory('a', tg.root, 'a')
 
1782
            tg.tt.new_directory('a', tg.root, b'a')
1782
1783
            tg.tt.new_symlink('b', tg.root, 'b', 'b')
1783
 
            tg.tt.new_file('c', tg.root, 'c', 'c')
1784
 
            tg.tt.new_symlink('d', tg.root, tg.name, 'd')
 
1784
            tg.tt.new_file('c', tg.root, b'c', b'c')
 
1785
            tg.tt.new_symlink('d', tg.root, tg.name, b'd')
1785
1786
        targets = ((base, 'base-e', 'base-f', None, None),
1786
1787
                   (this, 'other-e', 'this-f', 'other-g', 'this-h'),
1787
1788
                   (other, 'other-e', None, 'other-g', 'other-h'))
1914
1915
        source = self.make_branch_and_tree('source')
1915
1916
        target = self.make_branch_and_tree('target')
1916
1917
        self.build_tree(['source/file', 'target/file'])
1917
 
        source.add('file', 'new-file')
 
1918
        source.add('file', b'new-file')
1918
1919
        source.commit('added file')
1919
1920
        build_tree(source.basis_tree(), target)
1920
1921
        self.assertEqual([DuplicateEntry('Moved existing file to',
1938
1939
        self.requireFeature(SymlinkFeature)
1939
1940
        source = self.make_branch_and_tree('source')
1940
1941
        os.symlink('foo', 'source/symlink')
1941
 
        source.add('symlink', 'new-symlink')
 
1942
        source.add('symlink', b'new-symlink')
1942
1943
        source.commit('added file')
1943
1944
        target = self.make_branch_and_tree('target')
1944
1945
        os.symlink('bar', 'target/symlink')
1956
1957
        source = self.make_branch_and_tree('source')
1957
1958
        target = self.make_branch_and_tree('target')
1958
1959
        self.build_tree(['source/dir1/', 'source/dir1/file', 'target/dir1/'])
1959
 
        source.add(['dir1', 'dir1/file'], ['new-dir1', 'new-file'])
 
1960
        source.add(['dir1', 'dir1/file'], [b'new-dir1', b'new-file'])
1960
1961
        source.commit('added file')
1961
1962
        build_tree(source.basis_tree(), target)
1962
1963
        self.assertEqual([], target.conflicts())
1998
1999
        source = self.make_branch_and_tree('source')
1999
2000
        target = self.make_branch_and_tree('target')
2000
2001
        self.build_tree(['source/name', 'target/name/'])
2001
 
        source.add('name', 'new-name')
 
2002
        source.add('name', b'new-name')
2002
2003
        source.commit('added file')
2003
2004
        build_tree(source.basis_tree(), target)
2004
2005
        self.assertEqual([DuplicateEntry('Moved existing file to',
2339
2340
 
2340
2341
    def test_add_files(self):
2341
2342
        branch, tt = self.get_branch_and_transform()
2342
 
        tt.new_file('file', tt.root, 'contents', b'file-id')
 
2343
        tt.new_file('file', tt.root, b'contents', b'file-id')
2343
2344
        trans_id = tt.new_directory('dir', tt.root, 'dir-id')
2344
2345
        if SymlinkFeature.available():
2345
2346
            tt.new_symlink('symlink', trans_id, 'target', 'symlink-id')
2346
2347
        rev = tt.commit(branch, 'message')
2347
2348
        tree = branch.basis_tree()
2348
2349
        self.assertEqual('file', tree.id2path(b'file-id'))
2349
 
        self.assertEqual('contents', tree.get_file_text('file', b'file-id'))
 
2350
        self.assertEqual(b'contents', tree.get_file_text('file', b'file-id'))
2350
2351
        self.assertEqual('dir', tree.id2path(b'dir-id'))
2351
2352
        if SymlinkFeature.available():
2352
2353
            self.assertEqual('dir/symlink', tree.id2path(b'symlink-id'))
2354
2355
 
2355
2356
    def test_add_unversioned(self):
2356
2357
        branch, tt = self.get_branch_and_transform()
2357
 
        tt.new_file('file', tt.root, 'contents')
 
2358
        tt.new_file('file', tt.root, b'contents')
2358
2359
        self.assertRaises(errors.StrictCommitFailed, tt.commit, branch,
2359
2360
                          'message', strict=True)
2360
2361
 
2361
2362
    def test_modify_strict(self):
2362
2363
        branch, tt = self.get_branch_and_transform()
2363
 
        tt.new_file('file', tt.root, 'contents', b'file-id')
 
2364
        tt.new_file('file', tt.root, b'contents', b'file-id')
2364
2365
        tt.commit(branch, 'message', strict=True)
2365
2366
        tt = TransformPreview(branch.basis_tree())
2366
2367
        self.addCleanup(tt.finalize)
2367
2368
        trans_id = tt.trans_id_file_id('file-id')
2368
2369
        tt.delete_contents(trans_id)
2369
 
        tt.create_file('contents', trans_id)
 
2370
        tt.create_file([b'contents'], trans_id)
2370
2371
        tt.commit(branch, 'message', strict=True)
2371
2372
 
2372
2373
    def test_commit_malformed(self):
2376
2377
        """
2377
2378
        branch, tt = self.get_branch_and_transform()
2378
2379
        parent_id = tt.trans_id_file_id('parent-id')
2379
 
        tt.new_file('file', parent_id, 'contents', b'file-id')
 
2380
        tt.new_file('file', parent_id, b'contents', b'file-id')
2380
2381
        self.assertRaises(errors.MalformedTransform, tt.commit, branch,
2381
2382
                          'message')
2382
2383
 
2384
2385
        branch, tt = self.get_branch_and_transform()
2385
2386
        rev_id = tt.commit(branch, 'message', timestamp=1, timezone=43201,
2386
2387
                           committer='me <me@example.com>',
2387
 
                           revprops={'foo': 'bar'}, revision_id='revid-1',
 
2388
                           revprops={'foo': 'bar'}, revision_id=b'revid-1',
2388
2389
                           authors=['Author1 <author1@example.com>',
2389
2390
                              'Author2 <author2@example.com>',
2390
2391
                               ])
2578
2579
        tt, trans_id = self.create_transform_and_root_trans_id()
2579
2580
        self._override_globals_in_method(tt, "create_file",
2580
2581
            {"open": self._fake_open_raises_before})
2581
 
        self.assertRaises(RuntimeError, tt.create_file, ["contents"], trans_id)
 
2582
        self.assertRaises(RuntimeError, tt.create_file, [b"contents"], trans_id)
2582
2583
        path = tt._limbo_name(trans_id)
2583
2584
        self.assertPathDoesNotExist(path)
2584
2585
        tt.finalize()
2588
2589
        tt, trans_id = self.create_transform_and_root_trans_id()
2589
2590
        self._override_globals_in_method(tt, "create_file",
2590
2591
            {"open": self._fake_open_raises_after})
2591
 
        self.assertRaises(RuntimeError, tt.create_file, ["contents"], trans_id)
 
2592
        self.assertRaises(RuntimeError, tt.create_file, [b"contents"], trans_id)
2592
2593
        path = tt._limbo_name(trans_id)
2593
2594
        self.assertPathExists(path)
2594
2595
        tt.finalize()
2599
2600
        tt, trans_id = self.create_transform_and_subdir_trans_id()
2600
2601
        self._override_globals_in_method(tt, "create_file",
2601
2602
            {"open": self._fake_open_raises_before})
2602
 
        self.assertRaises(RuntimeError, tt.create_file, ["contents"], trans_id)
 
2603
        self.assertRaises(RuntimeError, tt.create_file, [b"contents"], trans_id)
2603
2604
        path = tt._limbo_name(trans_id)
2604
2605
        self.assertPathDoesNotExist(path)
2605
2606
        tt.finalize()
2609
2610
        tt, trans_id = self.create_transform_and_subdir_trans_id()
2610
2611
        self._override_globals_in_method(tt, "create_file",
2611
2612
            {"open": self._fake_open_raises_after})
2612
 
        self.assertRaises(RuntimeError, tt.create_file, ["contents"], trans_id)
 
2613
        self.assertRaises(RuntimeError, tt.create_file, [b"contents"], trans_id)
2613
2614
        path = tt._limbo_name(trans_id)
2614
2615
        self.assertPathExists(path)
2615
2616
        tt.finalize()
2619
2620
    def test_rename_in_limbo_rename_raises_after_rename(self):
2620
2621
        tt, trans_id = self.create_transform_and_root_trans_id()
2621
2622
        parent1 = tt.new_directory('parent1', tt.root)
2622
 
        child1 = tt.new_file('child1', parent1, 'contents')
 
2623
        child1 = tt.new_file('child1', parent1, b'contents')
2623
2624
        parent2 = tt.new_directory('parent2', tt.root)
2624
2625
 
2625
2626
        class FakeOSModule(object):
2639
2640
    def test_rename_in_limbo_rename_raises_before_rename(self):
2640
2641
        tt, trans_id = self.create_transform_and_root_trans_id()
2641
2642
        parent1 = tt.new_directory('parent1', tt.root)
2642
 
        child1 = tt.new_file('child1', parent1, 'contents')
 
2643
        child1 = tt.new_file('child1', parent1, b'contents')
2643
2644
        parent2 = tt.new_directory('parent2', tt.root)
2644
2645
 
2645
2646
        class FakeOSModule(object):
2670
2671
    def test_resolve_create_parent_for_versioned_file(self):
2671
2672
        wt, tt = self.make_tt_with_versioned_dir()
2672
2673
        dir_tid = tt.trans_id_tree_path('dir')
2673
 
        file_tid = tt.new_file('file', dir_tid, 'Contents', file_id=b'file-id')
 
2674
        file_tid = tt.new_file('file', dir_tid, b'Contents', file_id=b'file-id')
2674
2675
        tt.delete_contents(dir_tid)
2675
2676
        tt.unversion_file(dir_tid)
2676
2677
        conflicts = resolve_conflicts(tt)
2681
2682
    def test_non_versioned_file_create_conflict(self):
2682
2683
        wt, tt = self.make_tt_with_versioned_dir()
2683
2684
        dir_tid = tt.trans_id_tree_path('dir')
2684
 
        tt.new_file('file', dir_tid, 'Contents')
 
2685
        tt.new_file('file', dir_tid, b'Contents')
2685
2686
        tt.delete_contents(dir_tid)
2686
2687
        tt.unversion_file(dir_tid)
2687
2688
        conflicts = resolve_conflicts(tt)
2706
2707
        tree.set_root_id(b'TREE_ROOT')
2707
2708
        tree.add('a', b'a-id')
2708
2709
        tree.commit('rev1', rev_id=b'rev1')
2709
 
        return tree.branch.repository.revision_tree('rev1')
 
2710
        return tree.branch.repository.revision_tree(b'rev1')
2710
2711
 
2711
2712
    def get_empty_preview(self):
2712
2713
        repository = self.make_repository('repo')
2730
2731
        revision_tree = self.create_tree()
2731
2732
        preview = TransformPreview(revision_tree)
2732
2733
        self.addCleanup(preview.finalize)
2733
 
        preview.new_file('file2', preview.root, 'content B\n', 'file2-id')
 
2734
        preview.new_file('file2', preview.root, b'content B\n', b'file2-id')
2734
2735
        preview_tree = preview.get_preview_tree()
2735
2736
        self.assertEqual(preview_tree.kind('file2'), 'file')
2736
2737
        self.assertEqual(
2737
 
            preview_tree.get_file('file2', 'file2-id').read(), 'content B\n')
 
2738
            preview_tree.get_file('file2', b'file2-id').read(), b'content B\n')
2738
2739
 
2739
2740
    def test_diff_preview_tree(self):
2740
2741
        revision_tree = self.create_tree()
2741
2742
        preview = TransformPreview(revision_tree)
2742
2743
        self.addCleanup(preview.finalize)
2743
 
        preview.new_file('file2', preview.root, 'content B\n', 'file2-id')
 
2744
        preview.new_file('file2', preview.root, b'content B\n', b'file2-id')
2744
2745
        preview_tree = preview.get_preview_tree()
2745
2746
        out = BytesIO()
2746
2747
        show_diff_trees(revision_tree, preview_tree, out)
2753
2754
        revision_tree = self.create_tree()
2754
2755
        preview = TransformPreview(revision_tree)
2755
2756
        self.addCleanup(preview.finalize)
2756
 
        preview.new_file('a', preview.root, 'content 2')
 
2757
        preview.new_file('a', preview.root, b'content 2')
2757
2758
        resolve_conflicts(preview)
2758
2759
        trans_id = preview.trans_id_file_id('a-id')
2759
2760
        self.assertEqual('a.moved', preview.final_name(trans_id))
2764
2765
        self.addCleanup(preview.finalize)
2765
2766
        a_trans_id = preview.trans_id_file_id('a-id')
2766
2767
        preview.delete_contents(a_trans_id)
2767
 
        preview.create_file('b content', a_trans_id)
 
2768
        preview.create_file([b'b content'], a_trans_id)
2768
2769
        preview_tree = preview.get_preview_tree()
2769
2770
        return revision_tree, preview_tree
2770
2771
 
2816
2817
        revision_tree = self.create_tree()
2817
2818
        preview = TransformPreview(revision_tree)
2818
2819
        self.addCleanup(preview.finalize)
2819
 
        preview.new_file('file', preview.root, 'contents', b'file-id')
 
2820
        preview.new_file('file', preview.root, b'contents', b'file-id')
2820
2821
        preview.new_directory('directory', preview.root, 'dir-id')
2821
2822
        preview_tree = preview.get_preview_tree()
2822
2823
        self.assertEqual('file', preview_tree.kind('file'))
2824
2825
 
2825
2826
    def test_get_file_mtime(self):
2826
2827
        preview = self.get_empty_preview()
2827
 
        file_trans_id = preview.new_file('file', preview.root, 'contents',
 
2828
        file_trans_id = preview.new_file('file', preview.root, b'contents',
2828
2829
                                         b'file-id')
2829
2830
        limbo_path = preview._limbo_name(file_trans_id)
2830
2831
        preview_tree = preview.get_preview_tree()
2849
2850
        work_tree.add('old', b'old-id')
2850
2851
        preview = TransformPreview(work_tree)
2851
2852
        self.addCleanup(preview.finalize)
2852
 
        new_id = preview.new_file('name', preview.root, 'contents', b'new-id',
 
2853
        new_id = preview.new_file('name', preview.root, b'contents', b'new-id',
2853
2854
                                  'executable')
2854
2855
        tree = preview.get_preview_tree()
2855
2856
        self.assertEqual(len('old'), tree.get_file_size('old'))
2857
2858
 
2858
2859
    def test_get_file(self):
2859
2860
        preview = self.get_empty_preview()
2860
 
        preview.new_file('file', preview.root, 'contents', b'file-id')
 
2861
        preview.new_file('file', preview.root, b'contents', b'file-id')
2861
2862
        preview_tree = preview.get_preview_tree()
2862
2863
        tree_file = preview_tree.get_file('file')
2863
2864
        try:
2950
2951
    def test_iter_entries_by_dir_new(self):
2951
2952
        tree = self.make_branch_and_tree('tree')
2952
2953
        tt = TreeTransform(tree)
2953
 
        tt.new_file('new', tt.root, 'contents', b'new-id')
 
2954
        tt.new_file('new', tt.root, b'contents', b'new-id')
2954
2955
        self.assertMatchingIterEntries(tt)
2955
2956
 
2956
2957
    def test_iter_entries_by_dir_deleted(self):
3010
3011
 
3011
3012
    def test_file_content_summary_executable(self):
3012
3013
        preview = self.get_empty_preview()
3013
 
        path_id = preview.new_file('path', preview.root, 'contents', 'path-id')
 
3014
        path_id = preview.new_file('path', preview.root, b'contents', 'path-id')
3014
3015
        preview.set_executability(True, path_id)
3015
3016
        summary = preview.get_preview_tree().path_content_summary('path')
3016
3017
        self.assertEqual(4, len(summary))
3035
3036
 
3036
3037
    def test_file_content_summary_non_exec(self):
3037
3038
        preview = self.get_empty_preview()
3038
 
        preview.new_file('path', preview.root, 'contents', 'path-id')
 
3039
        preview.new_file('path', preview.root, b'contents', 'path-id')
3039
3040
        summary = preview.get_preview_tree().path_content_summary('path')
3040
3041
        self.assertEqual(4, len(summary))
3041
3042
        self.assertEqual('file', summary[0])
3070
3071
        self.addCleanup(preview.finalize)
3071
3072
        file_trans_id = preview.trans_id_file_id(b'file-id')
3072
3073
        preview.delete_contents(file_trans_id)
3073
 
        preview.create_file('a\nb\nc\n', file_trans_id)
 
3074
        preview.create_file([b'a\nb\nc\n'], file_trans_id)
3074
3075
        preview_tree = preview.get_preview_tree()
3075
3076
        expected = [
3076
3077
            ('one', 'a\n'),
3082
3083
 
3083
3084
    def test_annotate_missing(self):
3084
3085
        preview = self.get_empty_preview()
3085
 
        preview.new_file('file', preview.root, 'a\nb\nc\n', b'file-id')
 
3086
        preview.new_file('file', preview.root, b'a\nb\nc\n', 'file-id')
3086
3087
        preview_tree = preview.get_preview_tree()
3087
3088
        expected = [
3088
3089
            ('me:', 'a\n'),
3124
3125
 
3125
3126
    def test_stored_kind(self):
3126
3127
        preview = self.get_empty_preview()
3127
 
        preview.new_file('file', preview.root, 'a\nb\nc\n', b'file-id')
 
3128
        preview.new_file('file', preview.root, b'a\nb\nc\n', b'file-id')
3128
3129
        preview_tree = preview.get_preview_tree()
3129
3130
        self.assertEqual('file', preview_tree.stored_kind('file'))
3130
3131
 
3131
3132
    def test_is_executable(self):
3132
3133
        preview = self.get_empty_preview()
3133
 
        preview.new_file('file', preview.root, 'a\nb\nc\n', b'file-id')
 
3134
        preview.new_file('file', preview.root, b'a\nb\nc\n', b'file-id')
3134
3135
        preview.set_executability(True, preview.trans_id_file_id(b'file-id'))
3135
3136
        preview_tree = preview.get_preview_tree()
3136
3137
        self.assertEqual(True, preview_tree.is_executable('file'))
3151
3152
        self.addCleanup(preview.finalize)
3152
3153
        trans_id = preview.trans_id_file_id(b'file-id')
3153
3154
        preview.delete_contents(trans_id)
3154
 
        preview.create_file('b\nc\nd\ne\n', trans_id)
 
3155
        preview.create_file([b'b\nc\nd\ne\n'], trans_id)
3155
3156
        self.build_tree_contents([('wtb/file', b'a\nc\nd\nf\n')])
3156
3157
        tree_a = preview.get_preview_tree()
3157
3158
        tree_a.set_parent_ids([base_id])
3174
3175
        self.addCleanup(preview.finalize)
3175
3176
        trans_id = preview.trans_id_file_id(b'file-id')
3176
3177
        preview.delete_contents(trans_id)
3177
 
        preview.create_file('b\nc\nd\ne\n', trans_id)
 
3178
        preview.create_file([b'b\nc\nd\ne\n'], trans_id)
3178
3179
        self.build_tree_contents([('wtb/file', b'a\nc\nd\nf\n')])
3179
3180
        tree_a = preview.get_preview_tree()
3180
3181
        tree_a.set_parent_ids([base_id])
3193
3194
        # FIXME: new_directory should mark root.
3194
3195
        preview.fixup_new_roots()
3195
3196
        preview_tree = preview.get_preview_tree()
3196
 
        file_trans_id = preview.new_file('a', preview.root, 'contents',
 
3197
        file_trans_id = preview.new_file('a', preview.root, b'contents',
3197
3198
                                         b'a-id')
3198
3199
        expected = [(('', b'tree-root'),
3199
3200
                    [('a', 'a', 'file', None, b'a-id', 'file')])]
3206
3207
        work_tree.add(['removed-file', 'not-removed-file'])
3207
3208
        preview = TransformPreview(work_tree)
3208
3209
        self.addCleanup(preview.finalize)
3209
 
        preview.new_file('new-file', preview.root, 'contents')
3210
 
        preview.new_file('new-versioned-file', preview.root, 'contents',
 
3210
        preview.new_file('new-file', preview.root, b'contents')
 
3211
        preview.new_file('new-versioned-file', preview.root, b'contents',
3211
3212
                         b'new-versioned-id')
3212
3213
        tree = preview.get_preview_tree()
3213
3214
        preview.unversion_file(preview.trans_id_tree_path('removed-file'))
3230
3231
        self.addCleanup(preview.finalize)
3231
3232
        file_trans_id = preview.trans_id_file_id(b'file-id')
3232
3233
        preview.delete_contents(file_trans_id)
3233
 
        preview.create_file('a\nb\n', file_trans_id)
 
3234
        preview.create_file([b'a\nb\n'], file_trans_id)
3234
3235
        preview_tree = preview.get_preview_tree()
3235
3236
        merger = Merger.from_revision_ids(preview_tree,
3236
3237
                                          child_tree.branch.last_revision(),
3241
3242
        self.addCleanup(tt.finalize)
3242
3243
        final_tree = tt.get_preview_tree()
3243
3244
        self.assertEqual(
3244
 
                'a\nb\nc\n',
 
3245
                b'a\nb\nc\n',
3245
3246
                final_tree.get_file_text(final_tree.id2path(b'file-id')))
3246
3247
 
3247
3248
    def test_merge_preview_into_workingtree(self):
3249
3250
        tree.set_root_id(b'TREE_ROOT')
3250
3251
        tt = TransformPreview(tree)
3251
3252
        self.addCleanup(tt.finalize)
3252
 
        tt.new_file('name', tt.root, 'content', b'file-id')
 
3253
        tt.new_file('name', tt.root, b'content', b'file-id')
3253
3254
        tree2 = self.make_branch_and_tree('tree2')
3254
3255
        tree2.set_root_id(b'TREE_ROOT')
3255
3256
        merger = Merger.from_uncommitted(tree2, tt.get_preview_tree(),
3266
3267
        self.addCleanup(tt.finalize)
3267
3268
        trans_id = tt.trans_id_file_id(b'foo-id')
3268
3269
        tt.delete_contents(trans_id)
3269
 
        tt.create_file('baz', trans_id)
 
3270
        tt.create_file([b'baz'], trans_id)
3270
3271
        tree2 = tree.controldir.sprout('tree2').open_workingtree()
3271
3272
        self.build_tree_contents([('tree2/foo', b'qux')])
3272
3273
        merger = Merger.from_uncommitted(tree2, tt.get_preview_tree(),
3280
3281
        tt = TransformPreview(wt)
3281
3282
        removed_id = tt.trans_id_tree_path('removed')
3282
3283
        tt.delete_contents(removed_id)
3283
 
        tt.new_file('new', tt.root, 'contents')
 
3284
        tt.new_file('new', tt.root, b'contents')
3284
3285
        modified_id = tt.trans_id_tree_path('modified')
3285
3286
        tt.delete_contents(modified_id)
3286
 
        tt.create_file('modified-contents', modified_id)
 
3287
        tt.create_file([b'modified-contents'], modified_id)
3287
3288
        self.addCleanup(tt.finalize)
3288
3289
        tree = tt.get_preview_tree()
3289
3290
        self.assertTrue(tree.has_filename('unmodified'))
3296
3297
        tree = self.make_branch_and_tree('tree')
3297
3298
        preview = TransformPreview(tree)
3298
3299
        self.addCleanup(preview.finalize)
3299
 
        preview.new_file('foo', preview.root, 'bar', 'baz-id')
 
3300
        preview.new_file('foo', preview.root, b'bar', 'baz-id')
3300
3301
        preview_tree = preview.get_preview_tree()
3301
3302
        self.assertEqual(False, preview_tree.is_executable('tree/foo', 'baz-id'))
3302
3303
        self.assertEqual(False, preview_tree.is_executable('tree/foo'))
3307
3308
        tree.branch.lock_write()
3308
3309
        self.addCleanup(tree.branch.unlock)
3309
3310
        tt = TransformPreview(tree)
3310
 
        tt.new_file('file', tt.root, 'contents', 'file_id')
 
3311
        tt.new_file('file', tt.root, b'contents', b'file_id')
3311
3312
        self.addCleanup(tt.finalize)
3312
3313
        preview = tt.get_preview_tree()
3313
3314
        preview.set_parent_ids([rev_id])
3316
3317
        builder.finish_inventory()
3317
3318
        rev2_id = builder.commit('rev2')
3318
3319
        rev2_tree = tree.branch.repository.revision_tree(rev2_id)
3319
 
        self.assertEqual('contents', rev2_tree.get_file_text('file'))
 
3320
        self.assertEqual(b'contents', rev2_tree.get_file_text('file'))
3320
3321
 
3321
3322
    def test_ascii_limbo_paths(self):
3322
3323
        self.requireFeature(features.UnicodeFilenameFeature)
3325
3326
        tt = TransformPreview(tree)
3326
3327
        self.addCleanup(tt.finalize)
3327
3328
        foo_id = tt.new_directory('', ROOT_PARENT)
3328
 
        bar_id = tt.new_file(u'\u1234bar', foo_id, 'contents')
 
3329
        bar_id = tt.new_file(u'\u1234bar', foo_id, b'contents')
3329
3330
        limbo_path = tt._limbo_name(bar_id)
3330
3331
        self.assertEqual(limbo_path.encode('ascii', 'replace'), limbo_path)
3331
3332
 
3391
3392
 
3392
3393
    def test_serialize_creation(self):
3393
3394
        tt = self.get_preview()
3394
 
        tt.new_file(u'foo\u1234', tt.root, 'bar', 'baz', True)
 
3395
        tt.new_file(u'foo\u1234', tt.root, b'bar', 'baz', True)
3395
3396
        tt.new_directory('qux', tt.root, 'quxx')
3396
3397
        self.assertSerializesTo(self.creation_records(), tt)
3397
3398