168
168
self.assertIs(self.wt.is_executable('name2'), False)
169
169
self.assertEqual('directory', file_kind(self.wt.abspath('oz')))
170
170
self.assertEqual(len(modified_paths), 3)
171
tree_mod_paths = [self.wt.id2abspath(f) for f in
171
tree_mod_paths = [self.wt.abspath(self.wt.id2path(f)) for f in
172
172
('ozzie', 'my_pretties', 'my_pretties2')]
173
173
self.assertSubset(tree_mod_paths, modified_paths)
174
174
# is it safe to finalize repeatedly?
453
453
self.assertEqual(self.wt.path2id('name'), 'my_pretties')
454
454
self.assertEqual('contents', file(self.wt.abspath('name')).read())
455
455
transform2, root = self.get_transform()
456
oz_id = transform2.trans_id_tree_file_id('oz-id')
456
oz_id = transform2.trans_id_tree_path('oz')
457
457
newtip = transform2.new_file('tip', oz_id, 'other', 'tip-id')
458
458
result = transform2.find_conflicts()
459
459
fp = FinalPaths(transform2)
467
467
transform2.finalize()
468
468
transform3 = TreeTransform(self.wt)
469
469
self.addCleanup(transform3.finalize)
470
oz_id = transform3.trans_id_tree_file_id('oz-id')
470
oz_id = transform3.trans_id_tree_path('oz')
471
471
transform3.delete_contents(oz_id)
472
472
self.assertEqual(transform3.find_conflicts(),
473
473
[('missing parent', oz_id)])
474
474
root_id = transform3.root
475
tip_id = transform3.trans_id_tree_file_id('tip-id')
475
tip_id = transform3.trans_id_tree_path('oz/tip')
476
476
transform3.adjust_path('tip', root_id, tip_id)
477
477
transform3.apply()
601
601
start.new_directory('a', root, 'a')
603
603
transform, root = self.get_transform()
604
transform.delete_versioned(transform.trans_id_tree_file_id('a'))
604
transform.delete_versioned(transform.trans_id_tree_path('a'))
605
605
transform.new_directory('a', root, 'a')
606
606
transform.apply()
616
616
unversion.unversion_file(parent)
617
617
self.assertEqual(unversion.find_conflicts(),
618
618
[('unversioned parent', parent_id)])
619
file_id = unversion.trans_id_tree_file_id(b'child-id')
619
file_id = unversion.trans_id_tree_path('parent/child')
620
620
unversion.unversion_file(file_id)
621
621
unversion.apply()
635
635
mangle_tree, root = self.get_transform()
636
636
root = mangle_tree.root
638
name1 = mangle_tree.trans_id_tree_file_id('name1')
639
name2 = mangle_tree.trans_id_tree_file_id('name2')
638
name1 = mangle_tree.trans_id_tree_path('name1')
639
name2 = mangle_tree.trans_id_tree_path('name2')
640
640
mangle_tree.adjust_path('name2', root, name1)
641
641
mangle_tree.adjust_path('name1', root, name2)
643
643
#tests for deleting parent directories
644
ddir = mangle_tree.trans_id_tree_file_id('ddir')
644
ddir = mangle_tree.trans_id_tree_path('dying_directory')
645
645
mangle_tree.delete_contents(ddir)
646
dfile = mangle_tree.trans_id_tree_file_id('dfile')
646
dfile = mangle_tree.trans_id_tree_path('dying_directory/dying_file')
647
647
mangle_tree.delete_versioned(dfile)
648
648
mangle_tree.unversion_file(dfile)
649
mfile = mangle_tree.trans_id_tree_file_id('mfile')
649
mfile = mangle_tree.trans_id_tree_path('dying_directory/moving_file')
650
650
mangle_tree.adjust_path('mfile', root, mfile)
652
652
#tests for adding parent directories
653
653
newdir = mangle_tree.new_directory('new_directory', root, 'newdir')
654
mfile2 = mangle_tree.trans_id_tree_file_id('mfile2')
654
mfile2 = mangle_tree.trans_id_tree_path('moving_file2')
655
655
mangle_tree.adjust_path('mfile2', newdir, mfile2)
656
656
mangle_tree.new_file('newfile', newdir, 'hello3', 'dfile')
657
657
self.assertEqual(mangle_tree.final_file_id(mfile2), 'mfile2')
677
677
create_tree.new_file('blackbox.py', newdir, 'hello1', 'blackbox-id')
678
678
create_tree.apply()
679
679
mangle_tree, root = self.get_transform()
680
selftest = mangle_tree.trans_id_tree_file_id('selftest-id')
681
blackbox = mangle_tree.trans_id_tree_file_id('blackbox-id')
680
selftest = mangle_tree.trans_id_tree_path('selftest')
681
blackbox = mangle_tree.trans_id_tree_path('selftest/blackbox.py')
682
682
mangle_tree.adjust_path('test', root, selftest)
683
683
mangle_tree.adjust_path('test_too_much', root, selftest)
684
684
mangle_tree.set_executability(True, blackbox)
693
693
'test_too_much-id')
694
694
create_tree.apply()
695
695
mangle_tree, root = self.get_transform()
696
breezy = mangle_tree.trans_id_tree_file_id('breezy-id')
697
tests = mangle_tree.trans_id_tree_file_id('tests-id')
698
test_too_much = mangle_tree.trans_id_tree_file_id('test_too_much-id')
696
breezy = mangle_tree.trans_id_tree_path('breezy')
697
tests = mangle_tree.trans_id_tree_path('breezy/tests')
698
test_too_much = mangle_tree.trans_id_tree_path('breezy/tests/blackbox/test_too_much.py')
699
699
mangle_tree.adjust_path('selftest', breezy, tests)
700
700
mangle_tree.adjust_path('blackbox.py', tests, test_too_much)
701
701
mangle_tree.set_executability(True, test_too_much)
708
708
'test_too_much-id')
709
709
create_tree.apply()
710
710
mangle_tree, root = self.get_transform()
711
tests = mangle_tree.trans_id_tree_file_id('tests-id')
712
test_too_much = mangle_tree.trans_id_tree_file_id('test_too_much-id')
711
tests = mangle_tree.trans_id_tree_path('tests')
712
test_too_much = mangle_tree.trans_id_tree_path('tests/test_too_much.py')
713
713
mangle_tree.adjust_path('selftest', root, tests)
714
714
mangle_tree.adjust_path('blackbox.py', tests, test_too_much)
715
715
mangle_tree.set_executability(True, test_too_much)
722
722
create_tree.new_file('name1', root, 'hello1', 'name1')
723
723
create_tree.apply()
724
724
delete_contents, root = self.get_transform()
725
file = delete_contents.trans_id_tree_file_id('name1')
725
file = delete_contents.trans_id_tree_path('name1')
726
726
delete_contents.delete_contents(file)
727
727
delete_contents.apply()
728
728
move_id, root = self.get_transform()
729
name1 = move_id.trans_id_tree_file_id('name1')
729
name1 = move_id.trans_id_tree_path('name1')
730
730
newdir = move_id.new_directory('dir', root, 'newdir')
731
731
move_id.adjust_path('name2', newdir, name1)
739
739
create_tree.apply()
740
740
delete_contents = TreeTransform(self.wt)
741
741
self.addCleanup(delete_contents.finalize)
742
file = delete_contents.trans_id_tree_file_id('name1')
742
file = delete_contents.trans_id_tree_path('name1')
743
743
delete_contents.delete_contents(file)
744
744
delete_contents.apply()
745
745
delete_contents.finalize()
747
747
self.addCleanup(replace.finalize)
748
748
name2 = replace.new_file('name2', root, 'hello2', 'name1')
749
749
conflicts = replace.find_conflicts()
750
name1 = replace.trans_id_tree_file_id('name1')
750
name1 = replace.trans_id_tree_path('name1')
751
751
self.assertEqual(conflicts, [('duplicate id', name1, name2)])
752
752
resolve_conflicts(replace)
819
819
# set up duplicate entry, duplicate id
820
820
new_dorothy = conflicts.new_file('dorothy', root, 'dorothy',
822
old_dorothy = conflicts.trans_id_tree_file_id('dorothy-id')
823
oz = conflicts.trans_id_tree_file_id('oz-id')
822
old_dorothy = conflicts.trans_id_tree_path('dorothy')
823
oz = conflicts.trans_id_tree_path('oz')
824
824
# set up DeletedParent parent conflict
825
825
conflicts.delete_versioned(oz)
826
emerald = conflicts.trans_id_tree_file_id('emerald-id')
826
emerald = conflicts.trans_id_tree_path('oz/emeraldcity')
827
827
# set up MissingParent conflict
828
828
munchkincity = conflicts.trans_id_file_id('munchkincity-id')
829
829
conflicts.adjust_path('munchkincity', root, munchkincity)
975
975
create.new_directory('oz', root, 'oz-id')
977
977
cyclone, root = self.get_transform()
978
oz = cyclone.trans_id_tree_file_id('oz-id')
979
house = cyclone.trans_id_tree_file_id('house-id')
978
oz = cyclone.trans_id_tree_path('oz')
979
house = cyclone.trans_id_tree_path('house')
980
980
cyclone.adjust_path('house', oz, house)
1080
1080
self.addCleanup(self.wt.unlock)
1081
1081
self.assertTrue(self.wt.is_executable('file1'))
1082
1082
transform, root = self.get_transform()
1083
file1_id = transform.trans_id_tree_file_id('file1-id')
1083
file1_id = transform.trans_id_tree_path('file1')
1084
1084
transform.delete_contents(file1_id)
1085
1085
transform.create_file('contents2', file1_id)
1086
1086
transform.apply()
1124
1124
transform, root = self.get_transform()
1126
1126
self.assertEqual([], list(transform.iter_changes()))
1127
old = transform.trans_id_tree_file_id('id-1')
1127
old = transform.trans_id_tree_path('old')
1128
1128
transform.unversion_file(old)
1129
1129
self.assertEqual([('id-1', ('old', None), False, (True, False),
1130
1130
('eert_toor', 'eert_toor'), ('old', 'old'), ('file', 'file'),
1162
1162
transform, root = self.get_transform()
1164
1164
old = transform.trans_id_tree_path('old')
1165
subdir = transform.trans_id_tree_file_id('subdir-id')
1165
subdir = transform.trans_id_tree_path('subdir')
1166
1166
new = transform.trans_id_tree_path('new')
1167
1167
self.assertEqual([], list(transform.iter_changes()))
1280
1280
transform, root = self.get_transform()
1282
1282
old = transform.trans_id_tree_path('old')
1283
subdir = transform.trans_id_tree_file_id('subdir-id')
1283
subdir = transform.trans_id_tree_path('subdir')
1284
1284
self.assertEqual([], list(transform.iter_changes()))
1285
1285
transform.delete_contents(subdir)
1286
1286
transform.create_directory(subdir)
1651
1651
self.wt.set_root_id(root_id)
1652
1652
self.b = self.wt.branch
1653
1653
self.tt = TreeTransform(self.wt)
1654
self.root = self.tt.trans_id_tree_file_id(self.wt.get_root_id())
1654
self.root = self.tt.trans_id_tree_path('')
1657
1657
def conflict_text(tree, merge):
1675
1675
with TransformPreview(tree) as tt:
1676
1676
tt.unversion_file(tt.root)
1677
1677
tt.version_file(b'new-id', tt.root)
1678
foo_trans_id = tt.trans_id_tree_file_id(b'foo-id')
1678
foo_trans_id = tt.trans_id_tree_path('foo')
1679
1679
foo_tuple = ('foo', foo_trans_id)
1680
1680
root_tuple = ('', tt.root)
1681
1681
self.assertEqual([root_tuple, foo_tuple], tt._inventory_altered())
1687
1687
with TransformPreview(tree) as tt:
1688
1688
tt.unversion_file(tt.root)
1689
1689
tt.version_file(tree.get_root_id(), tt.root)
1690
foo_trans_id = tt.trans_id_tree_file_id(b'foo-id')
1690
foo_trans_id = tt.trans_id_tree_path('foo')
1691
1691
self.assertEqual([], tt._inventory_altered())
1763
1763
merge_modified = this.wt.merge_modified()
1764
1764
self.assertSubset(merge_modified, modified)
1765
1765
self.assertEqual(len(merge_modified), len(modified))
1766
with file(this.wt.id2abspath('a'), 'wb') as f: f.write('booga')
1766
with file(this.wt.abspath(this.wt.id2path('a')), 'wb') as f: f.write('booga')
1767
1767
modified.pop(0)
1768
1768
merge_modified = this.wt.merge_modified()
1769
1769
self.assertSubset(merge_modified, modified)
2160
2160
self.requireFeature(HardlinkFeature)
2161
2161
source = self.create_ab_tree()
2162
2162
tt = TreeTransform(source)
2163
trans_id = tt.trans_id_tree_file_id('file1-id')
2163
trans_id = tt.trans_id_tree_path('file1')
2164
2164
tt.set_executability(True, trans_id)
2166
2166
self.assertTrue(source.is_executable('file1'))
2670
2670
def test_resolve_create_parent_for_versioned_file(self):
2671
2671
wt, tt = self.make_tt_with_versioned_dir()
2672
dir_tid = tt.trans_id_tree_file_id(b'dir-id')
2672
dir_tid = tt.trans_id_tree_path('dir')
2673
2673
file_tid = tt.new_file('file', dir_tid, 'Contents', file_id=b'file-id')
2674
2674
tt.delete_contents(dir_tid)
2675
2675
tt.unversion_file(dir_tid)
2681
2681
def test_non_versioned_file_create_conflict(self):
2682
2682
wt, tt = self.make_tt_with_versioned_dir()
2683
dir_tid = tt.trans_id_tree_file_id(b'dir-id')
2683
dir_tid = tt.trans_id_tree_path('dir')
2684
2684
tt.new_file('file', dir_tid, 'Contents')
2685
2685
tt.delete_contents(dir_tid)
2686
2686
tt.unversion_file(dir_tid)
2837
2837
work_tree.add('file', b'file-id')
2838
2838
preview = TransformPreview(work_tree)
2839
2839
self.addCleanup(preview.finalize)
2840
file_trans_id = preview.trans_id_tree_file_id(b'file-id')
2840
file_trans_id = preview.trans_id_tree_path('file')
2841
2841
preview.adjust_path('renamed', preview.root, file_trans_id)
2842
2842
preview_tree = preview.get_preview_tree()
2843
2843
preview_mtime = preview_tree.get_file_mtime('renamed', b'file-id')
2937
2937
self.assertFalse(preview_tree.is_versioned('old_name/child'))
2938
2938
self.assertEqual(b'child-id', preview_tree.path2id('new_name/child'))
2940
def assertMatchingIterEntries(self, tt, specific_file_ids=None):
2940
def assertMatchingIterEntries(self, tt, specific_files=None):
2941
2941
preview_tree = tt.get_preview_tree()
2942
2942
preview_result = list(preview_tree.iter_entries_by_dir(
2943
specific_files=specific_files))
2944
2944
tree = tt._tree
2946
actual_result = list(tree.iter_entries_by_dir(specific_file_ids))
2946
actual_result = list(tree.iter_entries_by_dir(
2947
specific_files=specific_files))
2947
2948
self.assertEqual(actual_result, preview_result)
2949
2950
def test_iter_entries_by_dir_new(self):
2977
2978
tt.trans_id_file_id(b'moved-id'))
2978
2979
self.assertMatchingIterEntries(tt)
2980
def test_iter_entries_by_dir_specific_file_ids(self):
2981
def test_iter_entries_by_dir_specific_files(self):
2981
2982
tree = self.make_branch_and_tree('tree')
2982
2983
tree.set_root_id(b'tree-root-id')
2983
2984
self.build_tree(['tree/parent/', 'tree/parent/child'])
2984
2985
tree.add(['parent', 'parent/child'], [b'parent-id', b'child-id'])
2985
2986
tt = TreeTransform(tree)
2986
self.assertMatchingIterEntries(tt, [b'tree-root-id', b'child-id'])
2987
self.assertMatchingIterEntries(tt, ['', 'parent/child'])
2988
2989
def test_symlink_content_summary(self):
2989
2990
self.requireFeature(SymlinkFeature)
3456
3457
def test_serialize_destruction(self):
3457
3458
tt = self.make_destruction_preview()
3458
foo_trans_id = tt.trans_id_tree_file_id(b'foo-id')
3459
foo_trans_id = tt.trans_id_tree_path(u'foo\u1234')
3459
3460
tt.unversion_file(foo_trans_id)
3460
bar_trans_id = tt.trans_id_tree_file_id(b'bar-id')
3461
bar_trans_id = tt.trans_id_tree_path('bar')
3461
3462
tt.delete_contents(bar_trans_id)
3462
3463
self.assertSerializesTo(self.destruction_records(), tt)
3612
3613
self.assertRaises(NotImplementedError, tt.new_orphan, 'foo', 'bar')
3614
3615
def _set_orphan_policy(self, wt, policy):
3615
wt.branch.get_config_stack().set('bzr.transform.orphan_policy',
3616
wt.branch.get_config_stack().set('transform.orphan_policy',
3618
3619
def _prepare_orphan(self, wt):
3741
3742
self.parent_tree.lock_write()
3742
3743
self.addCleanup(self.parent_tree.unlock)
3743
3744
self.build_tree_contents([('parent/foo', b'bar')])
3744
self.parent_tree.add('foo', b'foo-id')
3745
self.parent_tree.add('foo')
3745
3746
self.parent_tree.commit('added foo')
3746
3747
child_controldir = self.parent_tree.controldir.sprout('child')
3747
3748
self.child_tree = child_controldir.open_workingtree()
3761
3762
"""If the file to be linked has modified execute bit, don't link."""
3762
3763
tt = TreeTransform(self.child_tree)
3764
trans_id = tt.trans_id_tree_file_id(b'foo-id')
3765
trans_id = tt.trans_id_tree_path('foo')
3765
3766
tt.set_executability(True, trans_id)