148
148
self.assertIs(None, transform.final_kind(trans_id))
149
149
transform.create_file([b'contents'], trans_id)
150
150
transform.set_executability(True, trans_id)
151
transform.version_file('my_pretties', trans_id)
151
transform.version_file(b'my_pretties', trans_id)
152
152
self.assertRaises(DuplicateKey, transform.version_file,
153
'my_pretties', trans_id)
154
self.assertEqual(transform.final_file_id(trans_id), 'my_pretties')
153
b'my_pretties', trans_id)
154
self.assertEqual(transform.final_file_id(trans_id), b'my_pretties')
155
155
self.assertEqual(transform.final_parent(trans_id), root)
156
156
self.assertIs(transform.final_parent(root), ROOT_PARENT)
157
157
self.assertIs(transform.get_tree_parent(root), ROOT_PARENT)
158
158
oz_id = transform.create_path('oz', root)
159
159
transform.create_directory(oz_id)
160
transform.version_file('ozzie', oz_id)
160
transform.version_file(b'ozzie', oz_id)
161
161
trans_id2 = transform.create_path('name2', root)
162
162
transform.create_file([b'contents'], trans_id2)
163
163
transform.set_executability(False, trans_id2)
164
transform.version_file('my_pretties2', trans_id2)
164
transform.version_file(b'my_pretties2', trans_id2)
165
165
modified_paths = transform.apply().modified_paths
166
self.assertEqual('contents', self.wt.get_file('name').read())
167
self.assertEqual(self.wt.path2id('name'), 'my_pretties')
166
with self.wt.get_file('name') as f:
167
self.assertEqual(b'contents', f.read())
168
self.assertEqual(self.wt.path2id('name'), b'my_pretties')
168
169
self.assertIs(self.wt.is_executable('name'), True)
169
170
self.assertIs(self.wt.is_executable('name2'), False)
170
171
self.assertEqual('directory', file_kind(self.wt.abspath('oz')))
171
172
self.assertEqual(len(modified_paths), 3)
172
173
tree_mod_paths = [self.wt.abspath(self.wt.id2path(f)) for f in
173
('ozzie', 'my_pretties', 'my_pretties2')]
174
(b'ozzie', b'my_pretties', b'my_pretties2')]
174
175
self.assertSubset(tree_mod_paths, modified_paths)
175
176
# is it safe to finalize repeatedly?
176
177
transform.finalize()
371
372
transform, root = self.get_transform()
372
373
self.wt.lock_tree_write()
373
374
self.addCleanup(self.wt.unlock)
374
trans_id = transform.new_file('name', root, b'contents',
375
trans_id = transform.new_file('name', root, [b'contents'],
376
b'my_pretties', True)
376
377
oz = transform.new_directory('oz', root, 'oz-id')
377
dorothy = transform.new_directory('dorothy', oz, 'dorothy-id')
378
toto = transform.new_file('toto', dorothy, b'toto-contents',
378
dorothy = transform.new_directory('dorothy', oz, b'dorothy-id')
379
toto = transform.new_file('toto', dorothy, [b'toto-contents'],
381
382
self.assertEqual(len(transform.find_conflicts()), 0)
382
383
transform.apply()
383
384
self.assertRaises(ReusingTransform, transform.find_conflicts)
384
self.assertEqual('contents', file(self.wt.abspath('name')).read())
385
with open(self.wt.abspath('name'), 'r') as f:
386
self.assertEqual('contents', f.read())
385
387
self.assertEqual(self.wt.path2id('name'), 'my_pretties')
386
388
self.assertIs(self.wt.is_executable('name'), True)
387
self.assertEqual(self.wt.path2id('oz'), 'oz-id')
388
self.assertEqual(self.wt.path2id('oz/dorothy'), 'dorothy-id')
389
self.assertEqual(self.wt.path2id('oz/dorothy/toto'), 'toto-id')
389
self.assertEqual(self.wt.path2id('oz'), b'oz-id')
390
self.assertEqual(self.wt.path2id('oz/dorothy'), b'dorothy-id')
391
self.assertEqual(self.wt.path2id('oz/dorothy/toto'), b'toto-id')
391
self.assertEqual('toto-contents',
393
self.assertEqual(b'toto-contents',
392
394
self.wt.get_file('oz/dorothy/toto').read())
393
395
self.assertIs(self.wt.is_executable('oz/dorothy/toto'), False)
445
447
transform.set_executability(True, oz_id)
446
448
self.assertEqual(transform.find_conflicts(),
447
449
[('unversioned executability', oz_id)])
448
transform.version_file('oz-id', oz_id)
450
transform.version_file(b'oz-id', oz_id)
449
451
self.assertEqual(transform.find_conflicts(),
450
452
[('non-file executability', oz_id)])
451
453
transform.set_executability(None, oz_id)
452
tip_id = transform.new_file('tip', oz_id, b'ozma', 'tip-id')
454
tip_id = transform.new_file('tip', oz_id, [b'ozma'], b'tip-id')
453
455
transform.apply()
454
self.assertEqual(self.wt.path2id('name'), 'my_pretties')
455
self.assertEqual('contents', file(self.wt.abspath('name')).read())
456
self.assertEqual(self.wt.path2id('name'), b'my_pretties')
457
with open(self.wt.abspath('name'), 'r') as f:
458
self.assertEqual(b'contents', f.read())
456
459
transform2, root = self.get_transform()
457
460
oz_id = transform2.trans_id_tree_path('oz')
458
newtip = transform2.new_file('tip', oz_id, b'other', 'tip-id')
461
newtip = transform2.new_file('tip', oz_id, [b'other'], b'tip-id')
459
462
result = transform2.find_conflicts()
460
463
fp = FinalPaths(transform2)
461
464
self.assertTrue('oz/tip' in transform2._tree_path_ids)
625
628
create_tree, root = self.get_transform()
627
630
root = create_tree.root
628
create_tree.new_file('name1', root, b'hello1', 'name1')
629
create_tree.new_file('name2', root, b'hello2', 'name2')
630
ddir = create_tree.new_directory('dying_directory', root, 'ddir')
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')
631
create_tree.new_file('name1', root, [b'hello1'], b'name1')
632
create_tree.new_file('name2', root, [b'hello2'], b'name2')
633
ddir = create_tree.new_directory('dying_directory', root, b'ddir')
634
create_tree.new_file('dying_file', ddir, [b'goodbye1'], b'dfile')
635
create_tree.new_file('moving_file', ddir, [b'later1'], b'mfile')
636
create_tree.new_file('moving_file2', root, [b'later2'], b'mfile2')
634
637
create_tree.apply()
636
639
mangle_tree, root = self.get_transform()
654
657
newdir = mangle_tree.new_directory('new_directory', root, 'newdir')
655
658
mfile2 = mangle_tree.trans_id_tree_path('moving_file2')
656
659
mangle_tree.adjust_path('mfile2', newdir, mfile2)
657
mangle_tree.new_file('newfile', newdir, b'hello3', 'dfile')
658
self.assertEqual(mangle_tree.final_file_id(mfile2), 'mfile2')
660
mangle_tree.new_file('newfile', newdir, [b'hello3'], b'dfile')
661
self.assertEqual(mangle_tree.final_file_id(mfile2), b'mfile2')
659
662
self.assertEqual(mangle_tree.final_parent(mfile2), newdir)
660
self.assertEqual(mangle_tree.final_file_id(mfile2), 'mfile2')
663
self.assertEqual(mangle_tree.final_file_id(mfile2), b'mfile2')
661
664
mangle_tree.apply()
662
self.assertEqual(file(self.wt.abspath('name1')).read(), 'hello2')
663
self.assertEqual(file(self.wt.abspath('name2')).read(), 'hello1')
665
with open(self.wt.abspath('name1'), 'r') as f:
666
self.assertEqual(f.read(), 'hello2')
667
with open(self.wt.abspath('name2'), 'r') as f:
668
self.assertEqual(f.read(), 'hello1')
664
669
mfile2_path = self.wt.abspath(pathjoin('new_directory', 'mfile2'))
665
670
self.assertEqual(mangle_tree.final_parent(mfile2), newdir)
666
self.assertEqual(file(mfile2_path).read(), 'later2')
671
with open(mfile2_path, 'r') as f:
672
self.assertEqual(f.read(), 'later2')
667
673
self.assertEqual(self.wt.id2path(b'mfile2'), 'new_directory/mfile2')
668
674
self.assertEqual(self.wt.path2id('new_directory/mfile2'), b'mfile2')
669
675
newfile_path = self.wt.abspath(pathjoin('new_directory', 'newfile'))
670
self.assertEqual(file(newfile_path).read(), 'hello3')
676
with open(newfile_path, 'r') as f:
677
self.assertEqual(f.read(), 'hello3')
671
678
self.assertEqual(self.wt.path2id('dying_directory'), b'ddir')
672
679
self.assertIs(self.wt.path2id('dying_directory/dying_file'), None)
673
680
mfile2_path = self.wt.abspath(pathjoin('new_directory', 'mfile2'))
675
682
def test_both_rename(self):
676
683
create_tree, root = self.get_transform()
677
newdir = create_tree.new_directory('selftest', root, 'selftest-id')
678
create_tree.new_file('blackbox.py', newdir, b'hello1', 'blackbox-id')
684
newdir = create_tree.new_directory('selftest', root, b'selftest-id')
685
create_tree.new_file('blackbox.py', newdir, [b'hello1'], b'blackbox-id')
679
686
create_tree.apply()
680
687
mangle_tree, root = self.get_transform()
681
688
selftest = mangle_tree.trans_id_tree_path('selftest')
761
768
self.requireFeature(SymlinkFeature)
762
769
transform, root = self.get_transform()
763
oz_id = transform.new_directory('oz', root, 'oz-id')
770
oz_id = transform.new_directory('oz', root, b'oz-id')
764
771
wizard = transform.new_symlink(link_name1, oz_id, link_target1,
766
773
wiz_id = transform.create_path(link_name2, oz_id)
767
774
transform.create_symlink(link_target2, wiz_id)
768
transform.version_file('wiz-id2', wiz_id)
775
transform.version_file(b'wiz-id2', wiz_id)
769
776
transform.set_executability(True, wiz_id)
770
777
self.assertEqual(transform.find_conflicts(),
771
778
[('non-file executability', wiz_id)])
772
779
transform.set_executability(None, wiz_id)
773
780
transform.apply()
774
self.assertEqual(self.wt.path2id(ozpath(link_name1)), 'wizard-id')
781
self.assertEqual(self.wt.path2id(ozpath(link_name1)), b'wizard-id')
775
782
self.assertEqual('symlink',
776
783
file_kind(self.wt.abspath(ozpath(link_name1))))
777
784
self.assertEqual(link_target2,
813
820
def get_conflicted(self):
814
821
create, root = self.get_transform()
815
create.new_file('dorothy', root, b'dorothy', 'dorothy-id')
816
oz = create.new_directory('oz', root, 'oz-id')
817
create.new_directory('emeraldcity', oz, 'emerald-id')
822
create.new_file('dorothy', root, [b'dorothy'], b'dorothy-id')
823
oz = create.new_directory('oz', root, b'oz-id')
824
create.new_directory('emeraldcity', oz, b'emerald-id')
819
826
conflicts, root = self.get_transform()
820
827
# set up duplicate entry, duplicate id
821
new_dorothy = conflicts.new_file('dorothy', root, b'dorothy',
828
new_dorothy = conflicts.new_file('dorothy', root, [b'dorothy'],
823
830
old_dorothy = conflicts.trans_id_tree_path('dorothy')
824
831
oz = conflicts.trans_id_tree_path('oz')
825
832
# set up DeletedParent parent conflict
826
833
conflicts.delete_versioned(oz)
827
834
emerald = conflicts.trans_id_tree_path('oz/emeraldcity')
828
835
# set up MissingParent conflict
829
munchkincity = conflicts.trans_id_file_id('munchkincity-id')
836
munchkincity = conflicts.trans_id_file_id(b'munchkincity-id')
830
837
conflicts.adjust_path('munchkincity', root, munchkincity)
831
conflicts.new_directory('auntem', munchkincity, 'auntem-id')
838
conflicts.new_directory('auntem', munchkincity, b'auntem-id')
832
839
# set up parent loop
833
840
conflicts.adjust_path('emeraldcity', emerald, emerald)
834
841
return conflicts, emerald, oz, old_dorothy, new_dorothy
849
856
raw_conflicts = resolve_conflicts(tt)
850
857
cooked_conflicts = cook_conflicts(raw_conflicts, tt)
851
858
duplicate = DuplicateEntry('Moved existing file to', 'dorothy.moved',
852
'dorothy', None, 'dorothy-id')
859
'dorothy', None, b'dorothy-id')
853
860
self.assertEqual(cooked_conflicts[0], duplicate)
854
861
duplicate_id = DuplicateID('Unversioned existing file',
855
862
'dorothy.moved', 'dorothy', None,
857
864
self.assertEqual(cooked_conflicts[1], duplicate_id)
858
865
missing_parent = MissingParent('Created directory', 'munchkincity',
860
deleted_parent = DeletingParent('Not deleting', 'oz', 'oz-id')
867
deleted_parent = DeletingParent('Not deleting', 'oz', b'oz-id')
861
868
self.assertEqual(cooked_conflicts[2], missing_parent)
862
869
unversioned_parent = UnversionedParent('Versioned directory',
865
872
unversioned_parent2 = UnversionedParent('Versioned directory', 'oz',
867
874
self.assertEqual(cooked_conflicts[3], unversioned_parent)
868
875
parent_loop = ParentLoop('Cancelled move', 'oz/emeraldcity',
869
'oz/emeraldcity', 'emerald-id', 'emerald-id')
876
'oz/emeraldcity', b'emerald-id', b'emerald-id')
870
877
self.assertEqual(cooked_conflicts[4], deleted_parent)
871
878
self.assertEqual(cooked_conflicts[5], unversioned_parent2)
872
879
self.assertEqual(cooked_conflicts[6], parent_loop)
984
991
def test_moving_root(self):
985
992
create, root = self.get_transform()
986
fun = create.new_directory('fun', root, 'fun-id')
987
create.new_directory('sun', root, 'sun-id')
988
create.new_directory('moon', root, 'moon')
993
fun = create.new_directory('fun', root, b'fun-id')
994
create.new_directory('sun', root, b'sun-id')
995
create.new_directory('moon', root, b'moon')
990
997
transform, root = self.get_transform()
991
998
transform.adjust_root_path('oldroot', fun)
992
999
new_root = transform.trans_id_tree_path('')
993
transform.version_file('new-root', new_root)
1000
transform.version_file(b'new-root', new_root)
994
1001
transform.apply()
996
1003
def test_renames(self):
997
1004
create, root = self.get_transform()
998
old = create.new_directory('old-parent', root, 'old-id')
999
intermediate = create.new_directory('intermediate', old, 'im-id')
1000
myfile = create.new_file('myfile', intermediate, b'myfile-text',
1005
old = create.new_directory('old-parent', root, b'old-id')
1006
intermediate = create.new_directory('intermediate', old, b'im-id')
1007
myfile = create.new_file('myfile', intermediate, [b'myfile-text'],
1003
1010
rename, root = self.get_transform()
1004
old = rename.trans_id_file_id('old-id')
1011
old = rename.trans_id_file_id(b'old-id')
1005
1012
rename.adjust_path('new', root, old)
1006
myfile = rename.trans_id_file_id('myfile-id')
1013
myfile = rename.trans_id_file_id(b'myfile-id')
1007
1014
rename.set_executability(True, myfile)
1011
1018
self.requireFeature(features.not_running_as_root)
1012
1019
# see https://bugs.launchpad.net/bzr/+bug/491763
1013
1020
create, root_id = self.get_transform()
1014
first_dir = create.new_directory('first-dir', root_id, 'first-id')
1015
myfile = create.new_file('myfile', root_id, b'myfile-text',
1021
first_dir = create.new_directory('first-dir', root_id, b'first-id')
1022
myfile = create.new_file('myfile', root_id, [b'myfile-text'],
1018
1025
if os.name == "posix" and sys.platform != "cygwin":
1019
1026
# posix filesystems fail on renaming if the readonly bit is set
1020
1027
osutils.make_readonly(self.wt.abspath('first-dir'))
1021
1028
elif os.name == "nt":
1022
1029
# windows filesystems fail on renaming open files
1023
self.addCleanup(file(self.wt.abspath('myfile')).close)
1030
self.addCleanup(open(self.wt.abspath('myfile')).close)
1025
1032
self.skipTest("Can't force a permissions error on rename")
1026
1033
# now transform to rename
1027
1034
rename_transform, root_id = self.get_transform()
1028
file_trans_id = rename_transform.trans_id_file_id('myfile-id')
1029
dir_id = rename_transform.trans_id_file_id('first-id')
1035
file_trans_id = rename_transform.trans_id_file_id(b'myfile-id')
1036
dir_id = rename_transform.trans_id_file_id(b'first-id')
1030
1037
rename_transform.adjust_path('newname', dir_id, file_trans_id)
1031
1038
e = self.assertRaises(errors.TransformRenameFailed,
1032
1039
rename_transform.apply)
1120
1127
def test_iter_changes(self):
1121
1128
self.wt.set_root_id(b'eert_toor')
1122
1129
transform, root = self.get_transform()
1123
transform.new_file('old', root, b'blah', b'id-1', True)
1130
transform.new_file('old', root, [b'blah'], b'id-1', True)
1124
1131
transform.apply()
1125
1132
transform, root = self.get_transform()
1127
1134
self.assertEqual([], list(transform.iter_changes()))
1128
1135
old = transform.trans_id_tree_path('old')
1129
1136
transform.unversion_file(old)
1130
self.assertEqual([('id-1', ('old', None), False, (True, False),
1131
('eert_toor', 'eert_toor'), ('old', 'old'), ('file', 'file'),
1137
self.assertEqual([(b'id-1', ('old', None), False, (True, False),
1138
(b'eert_toor', b'eert_toor'), ('old', 'old'), ('file', 'file'),
1132
1139
(True, True))], list(transform.iter_changes()))
1133
transform.new_directory('new', root, 'id-1')
1134
self.assertEqual([('id-1', ('old', 'new'), True, (True, True),
1135
('eert_toor', 'eert_toor'), ('old', 'new'),
1140
transform.new_directory('new', root, b'id-1')
1141
self.assertEqual([(b'id-1', ('old', 'new'), True, (True, True),
1142
(b'eert_toor', b'eert_toor'), ('old', 'new'),
1136
1143
('file', 'directory'),
1137
1144
(True, False))], list(transform.iter_changes()))
1141
1148
def test_iter_changes_new(self):
1142
1149
self.wt.set_root_id(b'eert_toor')
1143
1150
transform, root = self.get_transform()
1144
transform.new_file('old', root, b'blah')
1151
transform.new_file('old', root, [b'blah'])
1145
1152
transform.apply()
1146
1153
transform, root = self.get_transform()
1148
1155
old = transform.trans_id_tree_path('old')
1149
transform.version_file('id-1', old)
1150
self.assertEqual([('id-1', (None, 'old'), False, (False, True),
1151
('eert_toor', 'eert_toor'), ('old', 'old'), ('file', 'file'),
1156
transform.version_file(b'id-1', old)
1157
self.assertEqual([(b'id-1', (None, 'old'), False, (False, True),
1158
(b'eert_toor', b'eert_toor'), ('old', 'old'), ('file', 'file'),
1152
1159
(False, False))], list(transform.iter_changes()))
1154
1161
transform.finalize()
1170
1177
#content deletion
1171
1178
transform.delete_contents(old)
1172
self.assertEqual([('id-1', ('old', 'old'), True, (True, True),
1173
('eert_toor', 'eert_toor'), ('old', 'old'), ('file', None),
1179
self.assertEqual([(b'id-1', ('old', 'old'), True, (True, True),
1180
(b'eert_toor', b'eert_toor'), ('old', 'old'), ('file', None),
1174
1181
(False, False))], list(transform.iter_changes()))
1176
1183
#content change
1177
1184
transform.create_file([b'blah'], old)
1178
self.assertEqual([('id-1', ('old', 'old'), True, (True, True),
1179
('eert_toor', 'eert_toor'), ('old', 'old'), ('file', 'file'),
1185
self.assertEqual([(b'id-1', ('old', 'old'), True, (True, True),
1186
(b'eert_toor', b'eert_toor'), ('old', 'old'), ('file', 'file'),
1180
1187
(False, False))], list(transform.iter_changes()))
1181
1188
transform.cancel_deletion(old)
1182
1189
self.assertEqual([('id-1', ('old', 'old'), True, (True, True),
1183
('eert_toor', 'eert_toor'), ('old', 'old'), ('file', 'file'),
1190
(b'eert_toor', b'eert_toor'), ('old', 'old'), ('file', 'file'),
1184
1191
(False, False))], list(transform.iter_changes()))
1185
1192
transform.cancel_creation(old)
1187
1194
# move file_id to a different file
1188
1195
self.assertEqual([], list(transform.iter_changes()))
1189
1196
transform.unversion_file(old)
1190
transform.version_file('id-1', new)
1197
transform.version_file(b'id-1', new)
1191
1198
transform.adjust_path('old', root, new)
1192
self.assertEqual([('id-1', ('old', 'old'), True, (True, True),
1199
self.assertEqual([(b'id-1', ('old', 'old'), True, (True, True),
1193
1200
('eert_toor', 'eert_toor'), ('old', 'old'), ('file', 'file'),
1194
1201
(False, False))], list(transform.iter_changes()))
1195
1202
transform.cancel_versioning(new)
1233
1240
# obviously can't bleed into file2's change output. But for now, it
1235
1242
transform, root = self.get_transform()
1236
transform.new_file('file1', root, b'blah', 'id-1')
1237
transform.new_file('file2', root, b'blah', 'id-2')
1243
transform.new_file('file1', root, [b'blah'], b'id-1')
1244
transform.new_file('file2', root, [b'blah'], b'id-2')
1238
1245
transform.apply()
1239
1246
transform, root = self.get_transform()
1241
transform.delete_contents(transform.trans_id_file_id('id-1'))
1248
transform.delete_contents(transform.trans_id_file_id(b'id-1'))
1242
1249
transform.set_executability(True,
1243
transform.trans_id_file_id('id-2'))
1244
self.assertEqual([('id-1', (u'file1', u'file1'), True, (True, True),
1245
('eert_toor', 'eert_toor'), ('file1', u'file1'),
1250
transform.trans_id_file_id(b'id-2'))
1251
self.assertEqual([(b'id-1', (u'file1', u'file1'), True, (True, True),
1252
(b'eert_toor', b'eert_toor'), ('file1', u'file1'),
1246
1253
('file', None), (False, False)),
1247
('id-2', (u'file2', u'file2'), False, (True, True),
1248
('eert_toor', 'eert_toor'), ('file2', u'file2'),
1254
(b'id-2', (u'file2', u'file2'), False, (True, True),
1255
(b'eert_toor', b'eert_toor'), ('file2', u'file2'),
1249
1256
('file', 'file'), (False, True))],
1250
1257
list(transform.iter_changes()))
1613
1620
foo_trans_id = tt.create_path('foo', tt.root)
1614
1621
create_from_tree(tt, foo_trans_id, tree1, 'foo', file_id=b'foo-id')
1615
1622
bar_trans_id = tt.create_path('bar', tt.root)
1616
create_from_tree(tt, bar_trans_id, tree1, 'bar', file_id='bbar-id')
1623
create_from_tree(tt, bar_trans_id, tree1, 'bar', file_id=b'bar-id')
1618
1625
self.assertEqual('directory', osutils.file_kind('tree2/foo'))
1619
self.assertFileEqual('baz', 'tree2/bar')
1626
self.assertFileEqual(b'baz', 'tree2/bar')
1621
1628
def test_create_from_tree_bytes(self):
1622
1629
"""Provided lines are used instead of tree content."""
1623
1630
tree1 = self.make_branch_and_tree('tree1')
1624
self.build_tree_contents([('tree1/foo', 'bar'),])
1631
self.build_tree_contents([('tree1/foo', b'bar'),])
1625
1632
tree1.add('foo', b'foo-id')
1626
1633
tree2 = self.make_branch_and_tree('tree2')
1627
1634
tt = TreeTransform(tree2)
1628
1635
foo_trans_id = tt.create_path('foo', tt.root)
1629
1636
create_from_tree(tt, foo_trans_id, tree1, 'foo', file_id=b'foo-id',
1632
self.assertFileEqual('qux', 'tree2/foo')
1639
self.assertFileEqual(b'qux', 'tree2/foo')
1634
1641
def test_create_from_tree_symlink(self):
1635
1642
self.requireFeature(SymlinkFeature)
1697
1704
def test_text_merge(self):
1698
1705
root_id = generate_ids.gen_root_id()
1699
1706
base = TransformGroup("base", root_id)
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')
1707
base.tt.new_file('a', base.root, [b'a\nb\nc\nd\be\n'], b'a')
1708
base.tt.new_file('b', base.root, [b'b1'], b'b')
1709
base.tt.new_file('c', base.root, [b'c'], b'c')
1710
base.tt.new_file('d', base.root, [b'd'], b'd')
1711
base.tt.new_file('e', base.root, [b'e'], b'e')
1712
base.tt.new_file('f', base.root, [b'f'], b'f')
1706
1713
base.tt.new_directory('g', base.root, b'g')
1707
1714
base.tt.new_directory('h', base.root, b'h')
1708
1715
base.tt.apply()
1709
1716
other = TransformGroup("other", root_id)
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')
1717
other.tt.new_file('a', other.root, [b'y\nb\nc\nd\be\n'], b'a')
1718
other.tt.new_file('b', other.root, [b'b2'], b'b')
1719
other.tt.new_file('c', other.root, [b'c2'], b'c')
1720
other.tt.new_file('d', other.root, [b'd'], b'd')
1721
other.tt.new_file('e', other.root, [b'e2'], b'e')
1722
other.tt.new_file('f', other.root, [b'f'], b'f')
1723
other.tt.new_file('g', other.root, [b'g'], b'g')
1724
other.tt.new_file('h', other.root, [b'h\ni\nj\nk\n'], b'h')
1725
other.tt.new_file('i', other.root, [b'h\ni\nj\nk\n'], b'i')
1719
1726
other.tt.apply()
1720
1727
this = TransformGroup("this", root_id)
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')
1728
this.tt.new_file('a', this.root, [b'a\nb\nc\nd\bz\n'], b'a')
1729
this.tt.new_file('b', this.root, [b'b'], b'b')
1730
this.tt.new_file('c', this.root, [b'c'], b'c')
1731
this.tt.new_file('d', this.root, [b'd2'], b'd')
1732
this.tt.new_file('e', this.root, [b'e2'], b'e')
1733
this.tt.new_file('f', this.root, [b'f'], b'f')
1734
this.tt.new_file('g', this.root, [b'g'], b'g')
1735
this.tt.new_file('h', this.root, [b'1\n2\n3\n4\n'], b'h')
1736
this.tt.new_file('i', this.root, [b'1\n2\n3\n4\n'], b'i')
1730
1737
this.tt.apply()
1731
1738
Merge3Merger(this.wt, this.wt, base.wt, other.wt)
1733
1740
# textual merge
1734
self.assertEqual(this.wt.get_file(this.wt.id2path(b'a')).read(), b'y\nb\nc\nd\bz\n')
1741
with this.wt.get_file(this.wt.id2path(b'a')) as f:
1742
self.assertEqual(f.read(), b'y\nb\nc\nd\bz\n')
1735
1743
# three-way text conflict
1736
self.assertEqual(this.wt.get_file(this.wt.id2path(b'b')).read(),
1737
conflict_text('b', 'b2'))
1744
with this.wt.get_file(this.wt.id2path(b'b')) as f:
1745
self.assertEqual(f.read(), conflict_text('b', 'b2'))
1739
1747
self.assertEqual(this.wt.get_file(this.wt.id2path(b'c')).read(), b'c2')
1857
1865
base_b, this_b, other_b = [t.tt.new_directory('b', t.root, 'b')
1858
1866
for t in [base, this, other]]
1860
base.tt.new_file('g', base_a, 'g', 'g')
1861
other.tt.new_file('g1', other_b, 'g1', 'g')
1863
base.tt.new_file('h', base_a, 'h', 'h')
1864
this.tt.new_file('h1', this_b, 'h1', 'h')
1866
base.tt.new_file('i', base.root, 'i', 'i')
1867
other.tt.new_directory('i1', this_b, 'i')
1868
base.tt.new_file('g', base_a, [b'g'], b'g')
1869
other.tt.new_file('g1', other_b, [b'g1'], b'g')
1871
base.tt.new_file('h', base_a, [b'h'], b'h')
1872
this.tt.new_file('h1', this_b, [b'h1'], b'h')
1874
base.tt.new_file('i', base.root, [b'i'], b'i')
1875
other.tt.new_directory('i1', this_b, b'i')
1869
1877
for tg in [this, base, other]:
2058
2061
revision_tree.lock_read()
2059
2062
self.addCleanup(revision_tree.unlock)
2060
2063
build_tree(revision_tree, target, source)
2061
self.assertEqual(['file1-id'], calls)
2064
self.assertEqual([b'file1-id'], calls)
2062
2065
target.lock_read()
2063
2066
self.addCleanup(target.unlock)
2064
2067
self.assertEqual([], list(target.iter_changes(revision_tree)))
2066
2069
def test_build_tree_accelerator_tree_observes_sha1(self):
2067
2070
source = self.create_ab_tree()
2068
sha1 = osutils.sha_string('A')
2071
sha1 = osutils.sha_string(b'A')
2069
2072
target = self.make_branch_and_tree('target')
2070
2073
target.lock_write()
2071
2074
self.addCleanup(target.unlock)
2072
2075
state = target.current_dirstate()
2073
2076
state._cutoff_time = time.time() + 60
2074
2077
build_tree(source.basis_tree(), target, source)
2075
entry = state._get_entry(0, path_utf8='file1')
2078
entry = state._get_entry(0, path_utf8=b'file1')
2076
2079
self.assertEqual(sha1, entry[1][0][1])
2078
2081
def test_build_tree_accelerator_tree_missing_file(self):
2356
2358
def test_add_unversioned(self):
2357
2359
branch, tt = self.get_branch_and_transform()
2358
tt.new_file('file', tt.root, b'contents')
2360
tt.new_file('file', tt.root, [b'contents'])
2359
2361
self.assertRaises(errors.StrictCommitFailed, tt.commit, branch,
2360
2362
'message', strict=True)
2362
2364
def test_modify_strict(self):
2363
2365
branch, tt = self.get_branch_and_transform()
2364
tt.new_file('file', tt.root, b'contents', b'file-id')
2366
tt.new_file('file', tt.root, [b'contents'], b'file-id')
2365
2367
tt.commit(branch, 'message', strict=True)
2366
2368
tt = TransformPreview(branch.basis_tree())
2367
2369
self.addCleanup(tt.finalize)
2368
trans_id = tt.trans_id_file_id('file-id')
2370
trans_id = tt.trans_id_file_id(b'file-id')
2369
2371
tt.delete_contents(trans_id)
2370
2372
tt.create_file([b'contents'], trans_id)
2371
2373
tt.commit(branch, 'message', strict=True)
2692
2694
conflicts.pop())
2695
A_ENTRY = ('a-id', ('a', 'a'), True, (True, True),
2696
('TREE_ROOT', 'TREE_ROOT'), ('a', 'a'), ('file', 'file'),
2697
A_ENTRY = (b'a-id', ('a', 'a'), True, (True, True),
2698
(b'TREE_ROOT', b'TREE_ROOT'), ('a', 'a'), ('file', 'file'),
2697
2699
(False, False))
2698
ROOT_ENTRY = ('TREE_ROOT', ('', ''), False, (True, True), (None, None),
2700
ROOT_ENTRY = (b'TREE_ROOT', ('', ''), False, (True, True), (None, None),
2699
2701
('', ''), ('directory', 'directory'), (False, False))
2731
2733
revision_tree = self.create_tree()
2732
2734
preview = TransformPreview(revision_tree)
2733
2735
self.addCleanup(preview.finalize)
2734
preview.new_file('file2', preview.root, b'content B\n', b'file2-id')
2736
preview.new_file('file2', preview.root, [b'content B\n'], b'file2-id')
2735
2737
preview_tree = preview.get_preview_tree()
2736
2738
self.assertEqual(preview_tree.kind('file2'), 'file')
2738
preview_tree.get_file('file2', b'file2-id').read(), b'content B\n')
2739
with preview_tree.get_file('file2', b'file2-id') as f:
2740
self.assertEqual(f.read(), b'content B\n')
2740
2742
def test_diff_preview_tree(self):
2741
2743
revision_tree = self.create_tree()
2742
2744
preview = TransformPreview(revision_tree)
2743
2745
self.addCleanup(preview.finalize)
2744
preview.new_file('file2', preview.root, b'content B\n', b'file2-id')
2746
preview.new_file('file2', preview.root, [b'content B\n'], b'file2-id')
2745
2747
preview_tree = preview.get_preview_tree()
2746
2748
out = BytesIO()
2747
2749
show_diff_trees(revision_tree, preview_tree, out)
3379
3378
def creation_records(self):
3380
3379
attribs = self.default_attribs()
3381
attribs['_id_number'] = 3
3382
attribs['_new_name'] = {
3383
'new-1': u'foo\u1234'.encode('utf-8'), 'new-2': 'qux'}
3384
attribs['_new_id'] = {'new-1': 'baz', 'new-2': 'quxx'}
3385
attribs['_new_parent'] = {'new-1': 'new-0', 'new-2': 'new-0'}
3386
attribs['_new_executability'] = {'new-1': 1}
3380
attribs[b'_id_number'] = 3
3381
attribs[b'_new_name'] = {
3382
b'new-1': u'foo\u1234'.encode('utf-8'), b'new-2': b'qux'}
3383
attribs[b'_new_id'] = {b'new-1': b'baz', b'new-2': b'quxx'}
3384
attribs[b'_new_parent'] = {b'new-1': b'new-0', b'new-2': b'new-0'}
3385
attribs[b'_new_executability'] = {b'new-1': 1}
3388
('new-1', 'file', 'i 1\nbar\n'),
3389
('new-2', 'directory', ''),
3387
('new-1', 'file', b'i 1\nbar\n'),
3388
('new-2', 'directory', b''),
3391
3390
return self.make_records(attribs, contents)
3393
3392
def test_serialize_creation(self):
3394
3393
tt = self.get_preview()
3395
tt.new_file(u'foo\u1234', tt.root, b'bar', 'baz', True)
3394
tt.new_file(u'foo\u1234', tt.root, [b'bar'], b'baz', True)
3396
3395
tt.new_directory('qux', tt.root, 'quxx')
3397
3396
self.assertSerializesTo(self.creation_records(), tt)