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()
446
447
transform.set_executability(True, oz_id)
447
448
self.assertEqual(transform.find_conflicts(),
448
449
[('unversioned executability', oz_id)])
449
transform.version_file('oz-id', oz_id)
450
transform.version_file(b'oz-id', oz_id)
450
451
self.assertEqual(transform.find_conflicts(),
451
452
[('non-file executability', oz_id)])
452
453
transform.set_executability(None, oz_id)
453
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')
454
455
transform.apply()
455
self.assertEqual(self.wt.path2id('name'), 'my_pretties')
456
self.assertEqual(self.wt.path2id('name'), b'my_pretties')
456
457
with open(self.wt.abspath('name'), 'r') as f:
457
self.assertEqual('contents', f.read())
458
self.assertEqual(b'contents', f.read())
458
459
transform2, root = self.get_transform()
459
460
oz_id = transform2.trans_id_tree_path('oz')
460
newtip = transform2.new_file('tip', oz_id, b'other', 'tip-id')
461
newtip = transform2.new_file('tip', oz_id, [b'other'], b'tip-id')
461
462
result = transform2.find_conflicts()
462
463
fp = FinalPaths(transform2)
463
464
self.assertTrue('oz/tip' in transform2._tree_path_ids)
627
628
create_tree, root = self.get_transform()
629
630
root = create_tree.root
630
create_tree.new_file('name1', root, b'hello1', 'name1')
631
create_tree.new_file('name2', root, b'hello2', 'name2')
632
ddir = create_tree.new_directory('dying_directory', root, 'ddir')
633
create_tree.new_file('dying_file', ddir, b'goodbye1', 'dfile')
634
create_tree.new_file('moving_file', ddir, b'later1', 'mfile')
635
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')
636
637
create_tree.apply()
638
639
mangle_tree, root = self.get_transform()
767
768
self.requireFeature(SymlinkFeature)
768
769
transform, root = self.get_transform()
769
oz_id = transform.new_directory('oz', root, 'oz-id')
770
oz_id = transform.new_directory('oz', root, b'oz-id')
770
771
wizard = transform.new_symlink(link_name1, oz_id, link_target1,
772
773
wiz_id = transform.create_path(link_name2, oz_id)
773
774
transform.create_symlink(link_target2, wiz_id)
774
transform.version_file('wiz-id2', wiz_id)
775
transform.version_file(b'wiz-id2', wiz_id)
775
776
transform.set_executability(True, wiz_id)
776
777
self.assertEqual(transform.find_conflicts(),
777
778
[('non-file executability', wiz_id)])
778
779
transform.set_executability(None, wiz_id)
779
780
transform.apply()
780
self.assertEqual(self.wt.path2id(ozpath(link_name1)), 'wizard-id')
781
self.assertEqual(self.wt.path2id(ozpath(link_name1)), b'wizard-id')
781
782
self.assertEqual('symlink',
782
783
file_kind(self.wt.abspath(ozpath(link_name1))))
783
784
self.assertEqual(link_target2,
819
820
def get_conflicted(self):
820
821
create, root = self.get_transform()
821
create.new_file('dorothy', root, b'dorothy', 'dorothy-id')
822
oz = create.new_directory('oz', root, 'oz-id')
823
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')
825
826
conflicts, root = self.get_transform()
826
827
# set up duplicate entry, duplicate id
827
new_dorothy = conflicts.new_file('dorothy', root, b'dorothy',
828
new_dorothy = conflicts.new_file('dorothy', root, [b'dorothy'],
829
830
old_dorothy = conflicts.trans_id_tree_path('dorothy')
830
831
oz = conflicts.trans_id_tree_path('oz')
831
832
# set up DeletedParent parent conflict
832
833
conflicts.delete_versioned(oz)
833
834
emerald = conflicts.trans_id_tree_path('oz/emeraldcity')
834
835
# set up MissingParent conflict
835
munchkincity = conflicts.trans_id_file_id('munchkincity-id')
836
munchkincity = conflicts.trans_id_file_id(b'munchkincity-id')
836
837
conflicts.adjust_path('munchkincity', root, munchkincity)
837
conflicts.new_directory('auntem', munchkincity, 'auntem-id')
838
conflicts.new_directory('auntem', munchkincity, b'auntem-id')
838
839
# set up parent loop
839
840
conflicts.adjust_path('emeraldcity', emerald, emerald)
840
841
return conflicts, emerald, oz, old_dorothy, new_dorothy
855
856
raw_conflicts = resolve_conflicts(tt)
856
857
cooked_conflicts = cook_conflicts(raw_conflicts, tt)
857
858
duplicate = DuplicateEntry('Moved existing file to', 'dorothy.moved',
858
'dorothy', None, 'dorothy-id')
859
'dorothy', None, b'dorothy-id')
859
860
self.assertEqual(cooked_conflicts[0], duplicate)
860
861
duplicate_id = DuplicateID('Unversioned existing file',
861
862
'dorothy.moved', 'dorothy', None,
863
864
self.assertEqual(cooked_conflicts[1], duplicate_id)
864
865
missing_parent = MissingParent('Created directory', 'munchkincity',
866
deleted_parent = DeletingParent('Not deleting', 'oz', 'oz-id')
867
deleted_parent = DeletingParent('Not deleting', 'oz', b'oz-id')
867
868
self.assertEqual(cooked_conflicts[2], missing_parent)
868
869
unversioned_parent = UnversionedParent('Versioned directory',
871
872
unversioned_parent2 = UnversionedParent('Versioned directory', 'oz',
873
874
self.assertEqual(cooked_conflicts[3], unversioned_parent)
874
875
parent_loop = ParentLoop('Cancelled move', 'oz/emeraldcity',
875
'oz/emeraldcity', 'emerald-id', 'emerald-id')
876
'oz/emeraldcity', b'emerald-id', b'emerald-id')
876
877
self.assertEqual(cooked_conflicts[4], deleted_parent)
877
878
self.assertEqual(cooked_conflicts[5], unversioned_parent2)
878
879
self.assertEqual(cooked_conflicts[6], parent_loop)
990
991
def test_moving_root(self):
991
992
create, root = self.get_transform()
992
fun = create.new_directory('fun', root, 'fun-id')
993
create.new_directory('sun', root, 'sun-id')
994
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')
996
997
transform, root = self.get_transform()
997
998
transform.adjust_root_path('oldroot', fun)
998
999
new_root = transform.trans_id_tree_path('')
999
transform.version_file('new-root', new_root)
1000
transform.version_file(b'new-root', new_root)
1000
1001
transform.apply()
1002
1003
def test_renames(self):
1003
1004
create, root = self.get_transform()
1004
old = create.new_directory('old-parent', root, 'old-id')
1005
intermediate = create.new_directory('intermediate', old, 'im-id')
1006
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'],
1009
1010
rename, root = self.get_transform()
1010
old = rename.trans_id_file_id('old-id')
1011
old = rename.trans_id_file_id(b'old-id')
1011
1012
rename.adjust_path('new', root, old)
1012
myfile = rename.trans_id_file_id('myfile-id')
1013
myfile = rename.trans_id_file_id(b'myfile-id')
1013
1014
rename.set_executability(True, myfile)
1126
1127
def test_iter_changes(self):
1127
1128
self.wt.set_root_id(b'eert_toor')
1128
1129
transform, root = self.get_transform()
1129
transform.new_file('old', root, b'blah', b'id-1', True)
1130
transform.new_file('old', root, [b'blah'], b'id-1', True)
1130
1131
transform.apply()
1131
1132
transform, root = self.get_transform()
1133
1134
self.assertEqual([], list(transform.iter_changes()))
1134
1135
old = transform.trans_id_tree_path('old')
1135
1136
transform.unversion_file(old)
1136
self.assertEqual([('id-1', ('old', None), False, (True, False),
1137
('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'),
1138
1139
(True, True))], list(transform.iter_changes()))
1139
transform.new_directory('new', root, 'id-1')
1140
self.assertEqual([('id-1', ('old', 'new'), True, (True, True),
1141
('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'),
1142
1143
('file', 'directory'),
1143
1144
(True, False))], list(transform.iter_changes()))
1147
1148
def test_iter_changes_new(self):
1148
1149
self.wt.set_root_id(b'eert_toor')
1149
1150
transform, root = self.get_transform()
1150
transform.new_file('old', root, b'blah')
1151
transform.new_file('old', root, [b'blah'])
1151
1152
transform.apply()
1152
1153
transform, root = self.get_transform()
1154
1155
old = transform.trans_id_tree_path('old')
1155
transform.version_file('id-1', old)
1156
self.assertEqual([('id-1', (None, 'old'), False, (False, True),
1157
('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'),
1158
1159
(False, False))], list(transform.iter_changes()))
1160
1161
transform.finalize()
1176
1177
#content deletion
1177
1178
transform.delete_contents(old)
1178
self.assertEqual([('id-1', ('old', 'old'), True, (True, True),
1179
('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),
1180
1181
(False, False))], list(transform.iter_changes()))
1182
1183
#content change
1183
1184
transform.create_file([b'blah'], old)
1184
self.assertEqual([('id-1', ('old', 'old'), True, (True, True),
1185
('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'),
1186
1187
(False, False))], list(transform.iter_changes()))
1187
1188
transform.cancel_deletion(old)
1188
1189
self.assertEqual([('id-1', ('old', 'old'), True, (True, True),
1189
('eert_toor', 'eert_toor'), ('old', 'old'), ('file', 'file'),
1190
(b'eert_toor', b'eert_toor'), ('old', 'old'), ('file', 'file'),
1190
1191
(False, False))], list(transform.iter_changes()))
1191
1192
transform.cancel_creation(old)
1193
1194
# move file_id to a different file
1194
1195
self.assertEqual([], list(transform.iter_changes()))
1195
1196
transform.unversion_file(old)
1196
transform.version_file('id-1', new)
1197
transform.version_file(b'id-1', new)
1197
1198
transform.adjust_path('old', root, new)
1198
self.assertEqual([('id-1', ('old', 'old'), True, (True, True),
1199
self.assertEqual([(b'id-1', ('old', 'old'), True, (True, True),
1199
1200
('eert_toor', 'eert_toor'), ('old', 'old'), ('file', 'file'),
1200
1201
(False, False))], list(transform.iter_changes()))
1201
1202
transform.cancel_versioning(new)
1239
1240
# obviously can't bleed into file2's change output. But for now, it
1241
1242
transform, root = self.get_transform()
1242
transform.new_file('file1', root, b'blah', 'id-1')
1243
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')
1244
1245
transform.apply()
1245
1246
transform, root = self.get_transform()
1247
transform.delete_contents(transform.trans_id_file_id('id-1'))
1248
transform.delete_contents(transform.trans_id_file_id(b'id-1'))
1248
1249
transform.set_executability(True,
1249
transform.trans_id_file_id('id-2'))
1250
self.assertEqual([('id-1', (u'file1', u'file1'), True, (True, True),
1251
('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'),
1252
1253
('file', None), (False, False)),
1253
('id-2', (u'file2', u'file2'), False, (True, True),
1254
('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'),
1255
1256
('file', 'file'), (False, True))],
1256
1257
list(transform.iter_changes()))
1619
1620
foo_trans_id = tt.create_path('foo', tt.root)
1620
1621
create_from_tree(tt, foo_trans_id, tree1, 'foo', file_id=b'foo-id')
1621
1622
bar_trans_id = tt.create_path('bar', tt.root)
1622
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')
1624
1625
self.assertEqual('directory', osutils.file_kind('tree2/foo'))
1625
self.assertFileEqual('baz', 'tree2/bar')
1626
self.assertFileEqual(b'baz', 'tree2/bar')
1627
1628
def test_create_from_tree_bytes(self):
1628
1629
"""Provided lines are used instead of tree content."""
1629
1630
tree1 = self.make_branch_and_tree('tree1')
1630
self.build_tree_contents([('tree1/foo', 'bar'),])
1631
self.build_tree_contents([('tree1/foo', b'bar'),])
1631
1632
tree1.add('foo', b'foo-id')
1632
1633
tree2 = self.make_branch_and_tree('tree2')
1633
1634
tt = TreeTransform(tree2)
1634
1635
foo_trans_id = tt.create_path('foo', tt.root)
1635
1636
create_from_tree(tt, foo_trans_id, tree1, 'foo', file_id=b'foo-id',
1638
self.assertFileEqual('qux', 'tree2/foo')
1639
self.assertFileEqual(b'qux', 'tree2/foo')
1640
1641
def test_create_from_tree_symlink(self):
1641
1642
self.requireFeature(SymlinkFeature)
1703
1704
def test_text_merge(self):
1704
1705
root_id = generate_ids.gen_root_id()
1705
1706
base = TransformGroup("base", root_id)
1706
base.tt.new_file('a', base.root, b'a\nb\nc\nd\be\n', b'a')
1707
base.tt.new_file('b', base.root, b'b1', b'b')
1708
base.tt.new_file('c', base.root, b'c', b'c')
1709
base.tt.new_file('d', base.root, b'd', b'd')
1710
base.tt.new_file('e', base.root, b'e', b'e')
1711
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')
1712
1713
base.tt.new_directory('g', base.root, b'g')
1713
1714
base.tt.new_directory('h', base.root, b'h')
1714
1715
base.tt.apply()
1715
1716
other = TransformGroup("other", root_id)
1716
other.tt.new_file('a', other.root, b'y\nb\nc\nd\be\n', b'a')
1717
other.tt.new_file('b', other.root, b'b2', b'b')
1718
other.tt.new_file('c', other.root, b'c2', b'c')
1719
other.tt.new_file('d', other.root, b'd', b'd')
1720
other.tt.new_file('e', other.root, b'e2', b'e')
1721
other.tt.new_file('f', other.root, b'f', b'f')
1722
other.tt.new_file('g', other.root, b'g', b'g')
1723
other.tt.new_file('h', other.root, b'h\ni\nj\nk\n', b'h')
1724
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')
1725
1726
other.tt.apply()
1726
1727
this = TransformGroup("this", root_id)
1727
this.tt.new_file('a', this.root, b'a\nb\nc\nd\bz\n', b'a')
1728
this.tt.new_file('b', this.root, b'b', b'b')
1729
this.tt.new_file('c', this.root, b'c', b'c')
1730
this.tt.new_file('d', this.root, b'd2', b'd')
1731
this.tt.new_file('e', this.root, b'e2', b'e')
1732
this.tt.new_file('f', this.root, b'f', b'f')
1733
this.tt.new_file('g', this.root, b'g', b'g')
1734
this.tt.new_file('h', this.root, b'1\n2\n3\n4\n', b'h')
1735
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')
1736
1737
this.tt.apply()
1737
1738
Merge3Merger(this.wt, this.wt, base.wt, other.wt)
1739
1740
# textual merge
1740
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')
1741
1743
# three-way text conflict
1742
self.assertEqual(this.wt.get_file(this.wt.id2path(b'b')).read(),
1743
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'))
1745
1747
self.assertEqual(this.wt.get_file(this.wt.id2path(b'c')).read(), b'c2')
1863
1865
base_b, this_b, other_b = [t.tt.new_directory('b', t.root, 'b')
1864
1866
for t in [base, this, other]]
1866
base.tt.new_file('g', base_a, 'g', 'g')
1867
other.tt.new_file('g1', other_b, 'g1', 'g')
1869
base.tt.new_file('h', base_a, 'h', 'h')
1870
this.tt.new_file('h1', this_b, 'h1', 'h')
1872
base.tt.new_file('i', base.root, 'i', 'i')
1873
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')
1875
1877
for tg in [this, base, other]:
2059
2061
revision_tree.lock_read()
2060
2062
self.addCleanup(revision_tree.unlock)
2061
2063
build_tree(revision_tree, target, source)
2062
self.assertEqual(['file1-id'], calls)
2064
self.assertEqual([b'file1-id'], calls)
2063
2065
target.lock_read()
2064
2066
self.addCleanup(target.unlock)
2065
2067
self.assertEqual([], list(target.iter_changes(revision_tree)))
2067
2069
def test_build_tree_accelerator_tree_observes_sha1(self):
2068
2070
source = self.create_ab_tree()
2069
sha1 = osutils.sha_string('A')
2071
sha1 = osutils.sha_string(b'A')
2070
2072
target = self.make_branch_and_tree('target')
2071
2073
target.lock_write()
2072
2074
self.addCleanup(target.unlock)
2073
2075
state = target.current_dirstate()
2074
2076
state._cutoff_time = time.time() + 60
2075
2077
build_tree(source.basis_tree(), target, source)
2076
entry = state._get_entry(0, path_utf8='file1')
2078
entry = state._get_entry(0, path_utf8=b'file1')
2077
2079
self.assertEqual(sha1, entry[1][0][1])
2079
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)