262
261
def test_change_root_id(self):
263
262
transform, root = self.get_transform()
264
self.assertNotEqual(b'new-root-id', self.wt.get_root_id())
265
transform.new_directory('', ROOT_PARENT, b'new-root-id')
263
self.assertNotEqual('new-root-id', self.wt.get_root_id())
264
transform.new_directory('', ROOT_PARENT, 'new-root-id')
266
265
transform.delete_contents(root)
267
266
transform.unversion_file(root)
268
267
transform.fixup_new_roots()
269
268
transform.apply()
270
self.assertEqual(b'new-root-id', self.wt.get_root_id())
269
self.assertEqual('new-root-id', self.wt.get_root_id())
272
271
def test_change_root_id_add_files(self):
273
272
transform, root = self.get_transform()
274
self.assertNotEqual(b'new-root-id', self.wt.get_root_id())
275
new_trans_id = transform.new_directory('', ROOT_PARENT, b'new-root-id')
273
self.assertNotEqual('new-root-id', self.wt.get_root_id())
274
new_trans_id = transform.new_directory('', ROOT_PARENT, 'new-root-id')
276
275
transform.new_file('file', new_trans_id, ['new-contents\n'],
278
277
transform.delete_contents(root)
279
278
transform.unversion_file(root)
280
279
transform.fixup_new_roots()
281
280
transform.apply()
282
self.assertEqual(b'new-root-id', self.wt.get_root_id())
283
self.assertEqual(b'new-file-id', self.wt.path2id('file'))
281
self.assertEqual('new-root-id', self.wt.get_root_id())
282
self.assertEqual('new-file-id', self.wt.path2id('file'))
284
283
self.assertFileEqual('new-contents\n', self.wt.abspath('file'))
286
285
def test_add_two_roots(self):
287
286
transform, root = self.get_transform()
288
new_trans_id = transform.new_directory('', ROOT_PARENT, b'new-root-id')
289
new_trans_id = transform.new_directory('', ROOT_PARENT, b'alt-root-id')
287
new_trans_id = transform.new_directory('', ROOT_PARENT, 'new-root-id')
288
new_trans_id = transform.new_directory('', ROOT_PARENT, 'alt-root-id')
290
289
self.assertRaises(ValueError, transform.fixup_new_roots)
292
291
def test_retain_existing_root(self):
293
292
tt, root = self.get_transform()
295
tt.new_directory('', ROOT_PARENT, b'new-root-id')
294
tt.new_directory('', ROOT_PARENT, 'new-root-id')
296
295
tt.fixup_new_roots()
297
self.assertNotEqual(b'new-root-id', tt.final_file_id(tt.root))
296
self.assertNotEqual('new-root-id', tt.final_file_id(tt.root))
299
298
def test_retain_existing_root_added_file(self):
300
299
tt, root = self.get_transform()
301
new_trans_id = tt.new_directory('', ROOT_PARENT, b'new-root-id')
302
child = tt.new_directory('child', new_trans_id, b'child-id')
300
new_trans_id = tt.new_directory('', ROOT_PARENT, 'new-root-id')
301
child = tt.new_directory('child', new_trans_id, 'child-id')
303
302
tt.fixup_new_roots()
304
303
self.assertEqual(tt.root, tt.final_parent(child))
632
631
create_tree.new_file('moving_file2', root, 'later2', 'mfile2')
633
632
create_tree.apply()
635
mangle_tree, root = self.get_transform()
634
mangle_tree,root = self.get_transform()
636
635
root = mangle_tree.root
638
name1 = mangle_tree.trans_id_tree_path('name1')
639
name2 = mangle_tree.trans_id_tree_path('name2')
637
name1 = mangle_tree.trans_id_tree_file_id('name1')
638
name2 = mangle_tree.trans_id_tree_file_id('name2')
640
639
mangle_tree.adjust_path('name2', root, name1)
641
640
mangle_tree.adjust_path('name1', root, name2)
643
642
#tests for deleting parent directories
644
ddir = mangle_tree.trans_id_tree_path('dying_directory')
643
ddir = mangle_tree.trans_id_tree_file_id('ddir')
645
644
mangle_tree.delete_contents(ddir)
646
dfile = mangle_tree.trans_id_tree_path('dying_directory/dying_file')
645
dfile = mangle_tree.trans_id_tree_file_id('dfile')
647
646
mangle_tree.delete_versioned(dfile)
648
647
mangle_tree.unversion_file(dfile)
649
mfile = mangle_tree.trans_id_tree_path('dying_directory/moving_file')
648
mfile = mangle_tree.trans_id_tree_file_id('mfile')
650
649
mangle_tree.adjust_path('mfile', root, mfile)
652
651
#tests for adding parent directories
653
652
newdir = mangle_tree.new_directory('new_directory', root, 'newdir')
654
mfile2 = mangle_tree.trans_id_tree_path('moving_file2')
653
mfile2 = mangle_tree.trans_id_tree_file_id('mfile2')
655
654
mangle_tree.adjust_path('mfile2', newdir, mfile2)
656
655
mangle_tree.new_file('newfile', newdir, 'hello3', 'dfile')
657
656
self.assertEqual(mangle_tree.final_file_id(mfile2), 'mfile2')
660
659
mangle_tree.apply()
661
660
self.assertEqual(file(self.wt.abspath('name1')).read(), 'hello2')
662
661
self.assertEqual(file(self.wt.abspath('name2')).read(), 'hello1')
663
mfile2_path = self.wt.abspath(pathjoin('new_directory', 'mfile2'))
662
mfile2_path = self.wt.abspath(pathjoin('new_directory','mfile2'))
664
663
self.assertEqual(mangle_tree.final_parent(mfile2), newdir)
665
664
self.assertEqual(file(mfile2_path).read(), 'later2')
666
self.assertEqual(self.wt.id2path(b'mfile2'), 'new_directory/mfile2')
667
self.assertEqual(self.wt.path2id('new_directory/mfile2'), b'mfile2')
668
newfile_path = self.wt.abspath(pathjoin('new_directory', 'newfile'))
665
self.assertEqual(self.wt.id2path('mfile2'), 'new_directory/mfile2')
666
self.assertEqual(self.wt.path2id('new_directory/mfile2'), 'mfile2')
667
newfile_path = self.wt.abspath(pathjoin('new_directory','newfile'))
669
668
self.assertEqual(file(newfile_path).read(), 'hello3')
670
self.assertEqual(self.wt.path2id('dying_directory'), b'ddir')
669
self.assertEqual(self.wt.path2id('dying_directory'), 'ddir')
671
670
self.assertIs(self.wt.path2id('dying_directory/dying_file'), None)
672
mfile2_path = self.wt.abspath(pathjoin('new_directory', 'mfile2'))
671
mfile2_path = self.wt.abspath(pathjoin('new_directory','mfile2'))
674
673
def test_both_rename(self):
675
create_tree, root = self.get_transform()
674
create_tree,root = self.get_transform()
676
675
newdir = create_tree.new_directory('selftest', root, 'selftest-id')
677
676
create_tree.new_file('blackbox.py', newdir, 'hello1', 'blackbox-id')
678
677
create_tree.apply()
679
mangle_tree, root = self.get_transform()
680
selftest = mangle_tree.trans_id_tree_path('selftest')
681
blackbox = mangle_tree.trans_id_tree_path('selftest/blackbox.py')
678
mangle_tree,root = self.get_transform()
679
selftest = mangle_tree.trans_id_tree_file_id('selftest-id')
680
blackbox = mangle_tree.trans_id_tree_file_id('blackbox-id')
682
681
mangle_tree.adjust_path('test', root, selftest)
683
682
mangle_tree.adjust_path('test_too_much', root, selftest)
684
683
mangle_tree.set_executability(True, blackbox)
685
684
mangle_tree.apply()
687
686
def test_both_rename2(self):
688
create_tree, root = self.get_transform()
689
breezy = create_tree.new_directory('breezy', root, 'breezy-id')
690
tests = create_tree.new_directory('tests', breezy, 'tests-id')
687
create_tree,root = self.get_transform()
688
bzrlib = create_tree.new_directory('bzrlib', root, 'bzrlib-id')
689
tests = create_tree.new_directory('tests', bzrlib, 'tests-id')
691
690
blackbox = create_tree.new_directory('blackbox', tests, 'blackbox-id')
692
691
create_tree.new_file('test_too_much.py', blackbox, 'hello1',
693
692
'test_too_much-id')
694
693
create_tree.apply()
695
mangle_tree, root = self.get_transform()
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
mangle_tree.adjust_path('selftest', breezy, tests)
694
mangle_tree,root = self.get_transform()
695
bzrlib = mangle_tree.trans_id_tree_file_id('bzrlib-id')
696
tests = mangle_tree.trans_id_tree_file_id('tests-id')
697
test_too_much = mangle_tree.trans_id_tree_file_id('test_too_much-id')
698
mangle_tree.adjust_path('selftest', bzrlib, tests)
700
699
mangle_tree.adjust_path('blackbox.py', tests, test_too_much)
701
700
mangle_tree.set_executability(True, test_too_much)
702
701
mangle_tree.apply()
704
703
def test_both_rename3(self):
705
create_tree, root = self.get_transform()
704
create_tree,root = self.get_transform()
706
705
tests = create_tree.new_directory('tests', root, 'tests-id')
707
706
create_tree.new_file('test_too_much.py', tests, 'hello1',
708
707
'test_too_much-id')
709
708
create_tree.apply()
710
mangle_tree, root = self.get_transform()
711
tests = mangle_tree.trans_id_tree_path('tests')
712
test_too_much = mangle_tree.trans_id_tree_path('tests/test_too_much.py')
709
mangle_tree,root = self.get_transform()
710
tests = mangle_tree.trans_id_tree_file_id('tests-id')
711
test_too_much = mangle_tree.trans_id_tree_file_id('test_too_much-id')
713
712
mangle_tree.adjust_path('selftest', root, tests)
714
713
mangle_tree.adjust_path('blackbox.py', tests, test_too_much)
715
714
mangle_tree.set_executability(True, test_too_much)
914
913
def test_resolve_conflicts_wrong_existing_parent_kind(self):
915
914
tt = self.prepare_wrong_parent_kind()
916
915
raw_conflicts = resolve_conflicts(tt)
917
self.assertEqual({('non-directory parent', 'Created directory',
918
'new-3')}, raw_conflicts)
916
self.assertEqual(set([('non-directory parent', 'Created directory',
917
'new-3')]), raw_conflicts)
919
918
cooked_conflicts = cook_conflicts(raw_conflicts, tt)
920
919
self.assertEqual([NonDirectoryParent('Created directory', 'parent.new',
921
b'parent-id')], cooked_conflicts)
920
'parent-id')], cooked_conflicts)
923
self.assertFalse(self.wt.is_versioned('parent'))
922
self.assertEqual(None, self.wt.path2id('parent'))
924
923
self.assertEqual('parent-id', self.wt.path2id('parent.new'))
926
925
def test_resolve_conflicts_wrong_new_parent_kind(self):
927
926
tt, root = self.get_transform()
928
parent_id = tt.new_directory('parent', root, b'parent-id')
929
tt.new_file('child,', parent_id, 'contents2', b'file-id')
927
parent_id = tt.new_directory('parent', root, 'parent-id')
928
tt.new_file('child,', parent_id, 'contents2', 'file-id')
931
930
tt, root = self.get_transform()
932
931
parent_id = tt.trans_id_file_id('parent-id')
933
932
tt.delete_contents(parent_id)
934
933
tt.create_file('contents', parent_id)
935
934
raw_conflicts = resolve_conflicts(tt)
936
self.assertEqual({('non-directory parent', 'Created directory',
937
'new-3')}, raw_conflicts)
935
self.assertEqual(set([('non-directory parent', 'Created directory',
936
'new-3')]), raw_conflicts)
939
self.assertFalse(self.wt.is_versioned('parent'))
938
self.assertEqual(None, self.wt.path2id('parent'))
940
939
self.assertEqual('parent-id', self.wt.path2id('parent.new'))
942
941
def test_resolve_conflicts_wrong_parent_kind_unversioned(self):
1730
1728
Merge3Merger(this.wt, this.wt, base.wt, other.wt)
1732
1730
# textual merge
1733
self.assertEqual(this.wt.get_file(this.wt.id2path(b'a')).read(), 'y\nb\nc\nd\bz\n')
1731
self.assertEqual(this.wt.get_file('a').read(), 'y\nb\nc\nd\bz\n')
1734
1732
# three-way text conflict
1735
self.assertEqual(this.wt.get_file(this.wt.id2path(b'b')).read(),
1733
self.assertEqual(this.wt.get_file('b').read(),
1736
1734
conflict_text('b', 'b2'))
1738
self.assertEqual(this.wt.get_file(this.wt.id2path(b'c')).read(), 'c2')
1736
self.assertEqual(this.wt.get_file('c').read(), 'c2')
1740
self.assertEqual(this.wt.get_file(this.wt.id2path(b'd')).read(), 'd2')
1738
self.assertEqual(this.wt.get_file('d').read(), 'd2')
1741
1739
# Ambigious clean merge
1742
self.assertEqual(this.wt.get_file(this.wt.id2path(b'e')).read(), 'e2')
1740
self.assertEqual(this.wt.get_file('e').read(), 'e2')
1744
self.assertEqual(this.wt.get_file(this.wt.id2path(b'f')).read(), 'f')
1742
self.assertEqual(this.wt.get_file('f').read(), 'f')
1745
1743
# Correct correct results when THIS == OTHER
1746
self.assertEqual(this.wt.get_file(this.wt.id2path(b'g')).read(), 'g')
1744
self.assertEqual(this.wt.get_file('g').read(), 'g')
1747
1745
# Text conflict when THIS & OTHER are text and BASE is dir
1748
self.assertEqual(this.wt.get_file(this.wt.id2path(b'h')).read(),
1746
self.assertEqual(this.wt.get_file('h').read(),
1749
1747
conflict_text('1\n2\n3\n4\n', 'h\ni\nj\nk\n'))
1750
self.assertEqual(this.wt.get_file('h.THIS').read(),
1748
self.assertEqual(this.wt.get_file_byname('h.THIS').read(),
1751
1749
'1\n2\n3\n4\n')
1752
self.assertEqual(this.wt.get_file('h.OTHER').read(),
1750
self.assertEqual(this.wt.get_file_byname('h.OTHER').read(),
1753
1751
'h\ni\nj\nk\n')
1754
1752
self.assertEqual(file_kind(this.wt.abspath('h.BASE')), 'directory')
1755
self.assertEqual(this.wt.get_file(this.wt.id2path(b'i')).read(),
1753
self.assertEqual(this.wt.get_file('i').read(),
1756
1754
conflict_text('1\n2\n3\n4\n', 'h\ni\nj\nk\n'))
1757
self.assertEqual(this.wt.get_file('i.THIS').read(),
1755
self.assertEqual(this.wt.get_file_byname('i.THIS').read(),
1758
1756
'1\n2\n3\n4\n')
1759
self.assertEqual(this.wt.get_file('i.OTHER').read(),
1757
self.assertEqual(this.wt.get_file_byname('i.OTHER').read(),
1760
1758
'h\ni\nj\nk\n')
1761
1759
self.assertEqual(os.path.exists(this.wt.abspath('i.BASE')), False)
1762
1760
modified = ['a', 'b', 'c', 'h', 'i']
1763
1761
merge_modified = this.wt.merge_modified()
1764
1762
self.assertSubset(merge_modified, modified)
1765
1763
self.assertEqual(len(merge_modified), len(modified))
1766
with file(this.wt.abspath(this.wt.id2path('a')), 'wb') as f: f.write('booga')
1764
with file(this.wt.id2abspath('a'), 'wb') as f: f.write('booga')
1767
1765
modified.pop(0)
1768
1766
merge_modified = this.wt.merge_modified()
1769
1767
self.assertSubset(merge_modified, modified)
2816
2814
revision_tree = self.create_tree()
2817
2815
preview = TransformPreview(revision_tree)
2818
2816
self.addCleanup(preview.finalize)
2819
preview.new_file('file', preview.root, 'contents', b'file-id')
2817
preview.new_file('file', preview.root, 'contents', 'file-id')
2820
2818
preview.new_directory('directory', preview.root, 'dir-id')
2821
2819
preview_tree = preview.get_preview_tree()
2822
self.assertEqual('file', preview_tree.kind('file'))
2823
self.assertEqual('directory', preview_tree.kind('directory'))
2820
self.assertEqual('file', preview_tree.kind('file-id'))
2821
self.assertEqual('directory', preview_tree.kind('dir-id'))
2825
2823
def test_get_file_mtime(self):
2826
2824
preview = self.get_empty_preview()
2827
2825
file_trans_id = preview.new_file('file', preview.root, 'contents',
2829
2827
limbo_path = preview._limbo_name(file_trans_id)
2830
2828
preview_tree = preview.get_preview_tree()
2831
2829
self.assertEqual(os.stat(limbo_path).st_mtime,
2832
preview_tree.get_file_mtime('file', b'file-id'))
2830
preview_tree.get_file_mtime('file-id'))
2834
2832
def test_get_file_mtime_renamed(self):
2835
2833
work_tree = self.make_branch_and_tree('tree')
2836
2834
self.build_tree(['tree/file'])
2837
work_tree.add('file', b'file-id')
2835
work_tree.add('file', 'file-id')
2838
2836
preview = TransformPreview(work_tree)
2839
2837
self.addCleanup(preview.finalize)
2840
file_trans_id = preview.trans_id_tree_path('file')
2838
file_trans_id = preview.trans_id_tree_file_id('file-id')
2841
2839
preview.adjust_path('renamed', preview.root, file_trans_id)
2842
2840
preview_tree = preview.get_preview_tree()
2843
preview_mtime = preview_tree.get_file_mtime('renamed', b'file-id')
2844
work_mtime = work_tree.get_file_mtime('file', b'file-id')
2841
preview_mtime = preview_tree.get_file_mtime('file-id', 'renamed')
2842
work_mtime = work_tree.get_file_mtime('file-id', 'file')
2846
2844
def test_get_file_size(self):
2847
2845
work_tree = self.make_branch_and_tree('tree')
2848
self.build_tree_contents([('tree/old', b'old')])
2849
work_tree.add('old', b'old-id')
2846
self.build_tree_contents([('tree/old', 'old')])
2847
work_tree.add('old', 'old-id')
2850
2848
preview = TransformPreview(work_tree)
2851
2849
self.addCleanup(preview.finalize)
2852
new_id = preview.new_file('name', preview.root, 'contents', b'new-id',
2850
new_id = preview.new_file('name', preview.root, 'contents', 'new-id',
2854
2852
tree = preview.get_preview_tree()
2855
self.assertEqual(len('old'), tree.get_file_size('old'))
2856
self.assertEqual(len('contents'), tree.get_file_size('name'))
2853
self.assertEqual(len('old'), tree.get_file_size('old-id'))
2854
self.assertEqual(len('contents'), tree.get_file_size('new-id'))
2858
2856
def test_get_file(self):
2859
2857
preview = self.get_empty_preview()
2860
preview.new_file('file', preview.root, 'contents', b'file-id')
2858
preview.new_file('file', preview.root, 'contents', 'file-id')
2861
2859
preview_tree = preview.get_preview_tree()
2862
tree_file = preview_tree.get_file('file')
2860
tree_file = preview_tree.get_file('file-id')
2864
2862
self.assertEqual('contents', tree_file.read())
2871
2869
preview.new_symlink('symlink', preview.root, 'target', 'symlink-id')
2872
2870
preview_tree = preview.get_preview_tree()
2873
2871
self.assertEqual('target',
2874
preview_tree.get_symlink_target('symlink'))
2872
preview_tree.get_symlink_target('symlink-id'))
2876
2874
def test_all_file_ids(self):
2877
2875
tree = self.make_branch_and_tree('tree')
2878
2876
self.build_tree(['tree/a', 'tree/b', 'tree/c'])
2879
tree.add(['a', 'b', 'c'], [b'a-id', b'b-id', b'c-id'])
2877
tree.add(['a', 'b', 'c'], ['a-id', 'b-id', 'c-id'])
2880
2878
preview = TransformPreview(tree)
2881
2879
self.addCleanup(preview.finalize)
2882
preview.unversion_file(preview.trans_id_file_id(b'b-id'))
2883
c_trans_id = preview.trans_id_file_id(b'c-id')
2880
preview.unversion_file(preview.trans_id_file_id('b-id'))
2881
c_trans_id = preview.trans_id_file_id('c-id')
2884
2882
preview.unversion_file(c_trans_id)
2885
preview.version_file(b'c-id', c_trans_id)
2883
preview.version_file('c-id', c_trans_id)
2886
2884
preview_tree = preview.get_preview_tree()
2887
self.assertEqual({b'a-id', b'c-id', tree.get_root_id()},
2885
self.assertEqual(set(['a-id', 'c-id', tree.get_root_id()]),
2888
2886
preview_tree.all_file_ids())
2890
2888
def test_path2id_deleted_unchanged(self):
2891
2889
tree = self.make_branch_and_tree('tree')
2892
2890
self.build_tree(['tree/unchanged', 'tree/deleted'])
2893
tree.add(['unchanged', 'deleted'], [b'unchanged-id', b'deleted-id'])
2891
tree.add(['unchanged', 'deleted'], ['unchanged-id', 'deleted-id'])
2894
2892
preview = TransformPreview(tree)
2895
2893
self.addCleanup(preview.finalize)
2896
preview.unversion_file(preview.trans_id_file_id(b'deleted-id'))
2894
preview.unversion_file(preview.trans_id_file_id('deleted-id'))
2897
2895
preview_tree = preview.get_preview_tree()
2898
self.assertEqual(b'unchanged-id', preview_tree.path2id('unchanged'))
2899
self.assertFalse(preview_tree.is_versioned('deleted'))
2896
self.assertEqual('unchanged-id', preview_tree.path2id('unchanged'))
2897
self.assertIs(None, preview_tree.path2id('deleted'))
2901
2899
def test_path2id_created(self):
2902
2900
tree = self.make_branch_and_tree('tree')
2903
2901
self.build_tree(['tree/unchanged'])
2904
tree.add(['unchanged'], [b'unchanged-id'])
2902
tree.add(['unchanged'], ['unchanged-id'])
2905
2903
preview = TransformPreview(tree)
2906
2904
self.addCleanup(preview.finalize)
2907
preview.new_file('new', preview.trans_id_file_id(b'unchanged-id'),
2905
preview.new_file('new', preview.trans_id_file_id('unchanged-id'),
2908
2906
'contents', 'new-id')
2909
2907
preview_tree = preview.get_preview_tree()
2910
self.assertEqual(b'new-id', preview_tree.path2id('unchanged/new'))
2908
self.assertEqual('new-id', preview_tree.path2id('unchanged/new'))
2912
2910
def test_path2id_moved(self):
2913
2911
tree = self.make_branch_and_tree('tree')
2914
2912
self.build_tree(['tree/old_parent/', 'tree/old_parent/child'])
2915
2913
tree.add(['old_parent', 'old_parent/child'],
2916
[b'old_parent-id', b'child-id'])
2914
['old_parent-id', 'child-id'])
2917
2915
preview = TransformPreview(tree)
2918
2916
self.addCleanup(preview.finalize)
2919
2917
new_parent = preview.new_directory('new_parent', preview.root,
2921
2919
preview.adjust_path('child', new_parent,
2922
preview.trans_id_file_id(b'child-id'))
2920
preview.trans_id_file_id('child-id'))
2923
2921
preview_tree = preview.get_preview_tree()
2924
self.assertFalse(preview_tree.is_versioned('old_parent/child'))
2925
self.assertEqual(b'child-id', preview_tree.path2id('new_parent/child'))
2922
self.assertIs(None, preview_tree.path2id('old_parent/child'))
2923
self.assertEqual('child-id', preview_tree.path2id('new_parent/child'))
2927
2925
def test_path2id_renamed_parent(self):
2928
2926
tree = self.make_branch_and_tree('tree')
2929
2927
self.build_tree(['tree/old_name/', 'tree/old_name/child'])
2930
2928
tree.add(['old_name', 'old_name/child'],
2931
[b'parent-id', b'child-id'])
2929
['parent-id', 'child-id'])
2932
2930
preview = TransformPreview(tree)
2933
2931
self.addCleanup(preview.finalize)
2934
2932
preview.adjust_path('new_name', preview.root,
2935
preview.trans_id_file_id(b'parent-id'))
2933
preview.trans_id_file_id('parent-id'))
2936
2934
preview_tree = preview.get_preview_tree()
2937
self.assertFalse(preview_tree.is_versioned('old_name/child'))
2938
self.assertEqual(b'child-id', preview_tree.path2id('new_name/child'))
2935
self.assertIs(None, preview_tree.path2id('old_name/child'))
2936
self.assertEqual('child-id', preview_tree.path2id('new_name/child'))
2940
def assertMatchingIterEntries(self, tt, specific_files=None):
2938
def assertMatchingIterEntries(self, tt, specific_file_ids=None):
2941
2939
preview_tree = tt.get_preview_tree()
2942
2940
preview_result = list(preview_tree.iter_entries_by_dir(
2943
specific_files=specific_files))
2944
2942
tree = tt._tree
2946
actual_result = list(tree.iter_entries_by_dir(
2947
specific_files=specific_files))
2944
actual_result = list(tree.iter_entries_by_dir(specific_file_ids))
2948
2945
self.assertEqual(actual_result, preview_result)
2950
2947
def test_iter_entries_by_dir_new(self):
2951
2948
tree = self.make_branch_and_tree('tree')
2952
2949
tt = TreeTransform(tree)
2953
tt.new_file('new', tt.root, 'contents', b'new-id')
2950
tt.new_file('new', tt.root, 'contents', 'new-id')
2954
2951
self.assertMatchingIterEntries(tt)
2956
2953
def test_iter_entries_by_dir_deleted(self):
2957
2954
tree = self.make_branch_and_tree('tree')
2958
2955
self.build_tree(['tree/deleted'])
2959
tree.add('deleted', b'deleted-id')
2956
tree.add('deleted', 'deleted-id')
2960
2957
tt = TreeTransform(tree)
2961
tt.delete_contents(tt.trans_id_file_id(b'deleted-id'))
2958
tt.delete_contents(tt.trans_id_file_id('deleted-id'))
2962
2959
self.assertMatchingIterEntries(tt)
2964
2961
def test_iter_entries_by_dir_unversioned(self):
2965
2962
tree = self.make_branch_and_tree('tree')
2966
2963
self.build_tree(['tree/removed'])
2967
tree.add('removed', b'removed-id')
2964
tree.add('removed', 'removed-id')
2968
2965
tt = TreeTransform(tree)
2969
tt.unversion_file(tt.trans_id_file_id(b'removed-id'))
2966
tt.unversion_file(tt.trans_id_file_id('removed-id'))
2970
2967
self.assertMatchingIterEntries(tt)
2972
2969
def test_iter_entries_by_dir_moved(self):
2973
2970
tree = self.make_branch_and_tree('tree')
2974
2971
self.build_tree(['tree/moved', 'tree/new_parent/'])
2975
tree.add(['moved', 'new_parent'], [b'moved-id', b'new_parent-id'])
2972
tree.add(['moved', 'new_parent'], ['moved-id', 'new_parent-id'])
2976
2973
tt = TreeTransform(tree)
2977
tt.adjust_path('moved', tt.trans_id_file_id(b'new_parent-id'),
2978
tt.trans_id_file_id(b'moved-id'))
2974
tt.adjust_path('moved', tt.trans_id_file_id('new_parent-id'),
2975
tt.trans_id_file_id('moved-id'))
2979
2976
self.assertMatchingIterEntries(tt)
2981
def test_iter_entries_by_dir_specific_files(self):
2978
def test_iter_entries_by_dir_specific_file_ids(self):
2982
2979
tree = self.make_branch_and_tree('tree')
2983
tree.set_root_id(b'tree-root-id')
2980
tree.set_root_id('tree-root-id')
2984
2981
self.build_tree(['tree/parent/', 'tree/parent/child'])
2985
tree.add(['parent', 'parent/child'], [b'parent-id', b'child-id'])
2982
tree.add(['parent', 'parent/child'], ['parent-id', 'child-id'])
2986
2983
tt = TreeTransform(tree)
2987
self.assertMatchingIterEntries(tt, ['', 'parent/child'])
2984
self.assertMatchingIterEntries(tt, ['tree-root-id', 'child-id'])
2989
2986
def test_symlink_content_summary(self):
2990
2987
self.requireFeature(SymlinkFeature)
2991
2988
preview = self.get_empty_preview()
2992
preview.new_symlink('path', preview.root, 'target', b'path-id')
2989
preview.new_symlink('path', preview.root, 'target', 'path-id')
2993
2990
summary = preview.get_preview_tree().path_content_summary('path')
2994
2991
self.assertEqual(('symlink', None, None, 'target'), summary)
3077
3074
('me:', 'b\n'),
3078
3075
('me:', 'c\n'),
3080
annotation = preview_tree.annotate_iter('file', default_revision=b'me:')
3077
annotation = preview_tree.annotate_iter('file-id', 'me:')
3081
3078
self.assertEqual(expected, annotation)
3083
3080
def test_annotate_missing(self):
3084
3081
preview = self.get_empty_preview()
3085
preview.new_file('file', preview.root, 'a\nb\nc\n', b'file-id')
3082
preview.new_file('file', preview.root, 'a\nb\nc\n', 'file-id')
3086
3083
preview_tree = preview.get_preview_tree()
3088
3085
('me:', 'a\n'),
3089
3086
('me:', 'b\n'),
3090
3087
('me:', 'c\n'),
3092
annotation = preview_tree.annotate_iter('file', default_revision=b'me:')
3089
annotation = preview_tree.annotate_iter('file-id', 'me:')
3093
3090
self.assertEqual(expected, annotation)
3095
3092
def test_annotate_rename(self):
3096
3093
tree = self.make_branch_and_tree('tree')
3097
self.build_tree_contents([('tree/file', b'a\n')])
3098
tree.add('file', b'file-id')
3099
tree.commit('a', rev_id=b'one')
3094
self.build_tree_contents([('tree/file', 'a\n')])
3095
tree.add('file', 'file-id')
3096
tree.commit('a', rev_id='one')
3100
3097
preview = TransformPreview(tree)
3101
3098
self.addCleanup(preview.finalize)
3102
file_trans_id = preview.trans_id_file_id(b'file-id')
3099
file_trans_id = preview.trans_id_file_id('file-id')
3103
3100
preview.adjust_path('newname', preview.root, file_trans_id)
3104
3101
preview_tree = preview.get_preview_tree()
3106
3103
('one', 'a\n'),
3108
annotation = preview_tree.annotate_iter('file', default_revision=b'me:')
3105
annotation = preview_tree.annotate_iter('file-id', 'me:')
3109
3106
self.assertEqual(expected, annotation)
3111
3108
def test_annotate_deleted(self):
3112
3109
tree = self.make_branch_and_tree('tree')
3113
self.build_tree_contents([('tree/file', b'a\n')])
3114
tree.add('file', b'file-id')
3115
tree.commit('a', rev_id=b'one')
3116
self.build_tree_contents([('tree/file', b'a\nb\n')])
3110
self.build_tree_contents([('tree/file', 'a\n')])
3111
tree.add('file', 'file-id')
3112
tree.commit('a', rev_id='one')
3113
self.build_tree_contents([('tree/file', 'a\nb\n')])
3117
3114
preview = TransformPreview(tree)
3118
3115
self.addCleanup(preview.finalize)
3119
file_trans_id = preview.trans_id_file_id(b'file-id')
3116
file_trans_id = preview.trans_id_file_id('file-id')
3120
3117
preview.delete_contents(file_trans_id)
3121
3118
preview_tree = preview.get_preview_tree()
3122
annotation = preview_tree.annotate_iter('file', default_revision=b'me:')
3119
annotation = preview_tree.annotate_iter('file-id', 'me:')
3123
3120
self.assertIs(None, annotation)
3125
3122
def test_stored_kind(self):
3126
3123
preview = self.get_empty_preview()
3127
preview.new_file('file', preview.root, 'a\nb\nc\n', b'file-id')
3124
preview.new_file('file', preview.root, 'a\nb\nc\n', 'file-id')
3128
3125
preview_tree = preview.get_preview_tree()
3129
self.assertEqual('file', preview_tree.stored_kind('file'))
3126
self.assertEqual('file', preview_tree.stored_kind('file-id'))
3131
3128
def test_is_executable(self):
3132
3129
preview = self.get_empty_preview()
3133
preview.new_file('file', preview.root, 'a\nb\nc\n', b'file-id')
3134
preview.set_executability(True, preview.trans_id_file_id(b'file-id'))
3130
preview.new_file('file', preview.root, 'a\nb\nc\n', 'file-id')
3131
preview.set_executability(True, preview.trans_id_file_id('file-id'))
3135
3132
preview_tree = preview.get_preview_tree()
3136
self.assertEqual(True, preview_tree.is_executable('file'))
3133
self.assertEqual(True, preview_tree.is_executable('file-id'))
3138
3135
def test_get_set_parent_ids(self):
3139
3136
revision_tree, preview_tree = self.get_tree_and_preview_tree()
3140
3137
self.assertEqual([], preview_tree.get_parent_ids())
3141
preview_tree.set_parent_ids([b'rev-1'])
3142
self.assertEqual([b'rev-1'], preview_tree.get_parent_ids())
3138
preview_tree.set_parent_ids(['rev-1'])
3139
self.assertEqual(['rev-1'], preview_tree.get_parent_ids())
3144
3141
def test_plan_file_merge(self):
3145
3142
work_a = self.make_branch_and_tree('wta')
3146
self.build_tree_contents([('wta/file', b'a\nb\nc\nd\n')])
3147
work_a.add('file', b'file-id')
3143
self.build_tree_contents([('wta/file', 'a\nb\nc\nd\n')])
3144
work_a.add('file', 'file-id')
3148
3145
base_id = work_a.commit('base version')
3149
tree_b = work_a.controldir.sprout('wtb').open_workingtree()
3146
tree_b = work_a.bzrdir.sprout('wtb').open_workingtree()
3150
3147
preview = TransformPreview(work_a)
3151
3148
self.addCleanup(preview.finalize)
3152
trans_id = preview.trans_id_file_id(b'file-id')
3149
trans_id = preview.trans_id_file_id('file-id')
3153
3150
preview.delete_contents(trans_id)
3154
3151
preview.create_file('b\nc\nd\ne\n', trans_id)
3155
self.build_tree_contents([('wtb/file', b'a\nc\nd\nf\n')])
3152
self.build_tree_contents([('wtb/file', 'a\nc\nd\nf\n')])
3156
3153
tree_a = preview.get_preview_tree()
3157
3154
tree_a.set_parent_ids([base_id])
3158
3155
self.assertEqual([
3240
3237
tt = merger.make_merger().make_preview_transform()
3241
3238
self.addCleanup(tt.finalize)
3242
3239
final_tree = tt.get_preview_tree()
3245
final_tree.get_file_text(final_tree.id2path(b'file-id')))
3240
self.assertEqual('a\nb\nc\n', final_tree.get_file_text('file-id'))
3247
3242
def test_merge_preview_into_workingtree(self):
3248
3243
tree = self.make_branch_and_tree('tree')
3249
tree.set_root_id(b'TREE_ROOT')
3244
tree.set_root_id('TREE_ROOT')
3250
3245
tt = TransformPreview(tree)
3251
3246
self.addCleanup(tt.finalize)
3252
tt.new_file('name', tt.root, 'content', b'file-id')
3247
tt.new_file('name', tt.root, 'content', 'file-id')
3253
3248
tree2 = self.make_branch_and_tree('tree2')
3254
tree2.set_root_id(b'TREE_ROOT')
3249
tree2.set_root_id('TREE_ROOT')
3255
3250
merger = Merger.from_uncommitted(tree2, tt.get_preview_tree(),
3251
None, tree.basis_tree())
3257
3252
merger.merge_type = Merge3Merger
3258
3253
merger.do_merge()
3260
3255
def test_merge_preview_into_workingtree_handles_conflicts(self):
3261
3256
tree = self.make_branch_and_tree('tree')
3262
self.build_tree_contents([('tree/foo', b'bar')])
3263
tree.add('foo', b'foo-id')
3257
self.build_tree_contents([('tree/foo', 'bar')])
3258
tree.add('foo', 'foo-id')
3264
3259
tree.commit('foo')
3265
3260
tt = TransformPreview(tree)
3266
3261
self.addCleanup(tt.finalize)
3267
trans_id = tt.trans_id_file_id(b'foo-id')
3262
trans_id = tt.trans_id_file_id('foo-id')
3268
3263
tt.delete_contents(trans_id)
3269
3264
tt.create_file('baz', trans_id)
3270
tree2 = tree.controldir.sprout('tree2').open_workingtree()
3271
self.build_tree_contents([('tree2/foo', b'qux')])
3265
tree2 = tree.bzrdir.sprout('tree2').open_workingtree()
3266
self.build_tree_contents([('tree2/foo', 'qux')])
3272
3268
merger = Merger.from_uncommitted(tree2, tt.get_preview_tree(),
3269
pb, tree.basis_tree())
3274
3270
merger.merge_type = Merge3Merger
3275
3271
merger.do_merge()
3729
3726
old_root_id = transform.tree_file_id(root)
3730
3727
transform.apply()
3731
3728
self.assertEqual(old_root_id, self.wt.get_root_id())
3732
self.assertEqual([(self.wt, transform)], calls)
3735
class TestLinkTree(tests.TestCaseWithTransport):
3737
_test_needs_features = [HardlinkFeature]
3740
tests.TestCaseWithTransport.setUp(self)
3741
self.parent_tree = self.make_branch_and_tree('parent')
3742
self.parent_tree.lock_write()
3743
self.addCleanup(self.parent_tree.unlock)
3744
self.build_tree_contents([('parent/foo', b'bar')])
3745
self.parent_tree.add('foo')
3746
self.parent_tree.commit('added foo')
3747
child_controldir = self.parent_tree.controldir.sprout('child')
3748
self.child_tree = child_controldir.open_workingtree()
3750
def hardlinked(self):
3751
parent_stat = os.lstat(self.parent_tree.abspath('foo'))
3752
child_stat = os.lstat(self.child_tree.abspath('foo'))
3753
return parent_stat.st_ino == child_stat.st_ino
3755
def test_link_fails_if_modified(self):
3756
"""If the file to be linked has modified text, don't link."""
3757
self.build_tree_contents([('child/foo', b'baz')])
3758
transform.link_tree(self.child_tree, self.parent_tree)
3759
self.assertFalse(self.hardlinked())
3761
def test_link_fails_if_execute_bit_changed(self):
3762
"""If the file to be linked has modified execute bit, don't link."""
3763
tt = TreeTransform(self.child_tree)
3765
trans_id = tt.trans_id_tree_path('foo')
3766
tt.set_executability(True, trans_id)
3770
transform.link_tree(self.child_tree, self.parent_tree)
3771
self.assertFalse(self.hardlinked())
3773
def test_link_succeeds_if_unmodified(self):
3774
"""If the file to be linked is unmodified, link"""
3775
transform.link_tree(self.child_tree, self.parent_tree)
3776
self.assertTrue(self.hardlinked())
3729
self.assertEquals([(self.wt, transform)], calls)