262
262
def test_change_root_id(self):
263
263
transform, root = self.get_transform()
264
self.assertNotEqual('new-root-id', self.wt.get_root_id())
265
transform.new_directory('', ROOT_PARENT, 'new-root-id')
264
self.assertNotEqual(b'new-root-id', self.wt.get_root_id())
265
transform.new_directory('', ROOT_PARENT, b'new-root-id')
266
266
transform.delete_contents(root)
267
267
transform.unversion_file(root)
268
268
transform.fixup_new_roots()
269
269
transform.apply()
270
self.assertEqual('new-root-id', self.wt.get_root_id())
270
self.assertEqual(b'new-root-id', self.wt.get_root_id())
272
272
def test_change_root_id_add_files(self):
273
273
transform, root = self.get_transform()
274
self.assertNotEqual('new-root-id', self.wt.get_root_id())
275
new_trans_id = transform.new_directory('', ROOT_PARENT, 'new-root-id')
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')
276
276
transform.new_file('file', new_trans_id, ['new-contents\n'],
278
278
transform.delete_contents(root)
279
279
transform.unversion_file(root)
280
280
transform.fixup_new_roots()
281
281
transform.apply()
282
self.assertEqual('new-root-id', self.wt.get_root_id())
283
self.assertEqual('new-file-id', self.wt.path2id('file'))
282
self.assertEqual(b'new-root-id', self.wt.get_root_id())
283
self.assertEqual(b'new-file-id', self.wt.path2id('file'))
284
284
self.assertFileEqual('new-contents\n', self.wt.abspath('file'))
286
286
def test_add_two_roots(self):
287
287
transform, root = self.get_transform()
288
new_trans_id = transform.new_directory('', ROOT_PARENT, 'new-root-id')
289
new_trans_id = transform.new_directory('', ROOT_PARENT, 'alt-root-id')
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')
290
290
self.assertRaises(ValueError, transform.fixup_new_roots)
292
292
def test_retain_existing_root(self):
293
293
tt, root = self.get_transform()
295
tt.new_directory('', ROOT_PARENT, 'new-root-id')
295
tt.new_directory('', ROOT_PARENT, b'new-root-id')
296
296
tt.fixup_new_roots()
297
self.assertNotEqual('new-root-id', tt.final_file_id(tt.root))
297
self.assertNotEqual(b'new-root-id', tt.final_file_id(tt.root))
299
299
def test_retain_existing_root_added_file(self):
300
300
tt, root = self.get_transform()
301
new_trans_id = tt.new_directory('', ROOT_PARENT, 'new-root-id')
302
child = tt.new_directory('child', new_trans_id, 'child-id')
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')
303
303
tt.fixup_new_roots()
304
304
self.assertEqual(tt.root, tt.final_parent(child))
663
663
mfile2_path = self.wt.abspath(pathjoin('new_directory', 'mfile2'))
664
664
self.assertEqual(mangle_tree.final_parent(mfile2), newdir)
665
665
self.assertEqual(file(mfile2_path).read(), 'later2')
666
self.assertEqual(self.wt.id2path('mfile2'), 'new_directory/mfile2')
667
self.assertEqual(self.wt.path2id('new_directory/mfile2'), 'mfile2')
666
self.assertEqual(self.wt.id2path(b'mfile2'), 'new_directory/mfile2')
667
self.assertEqual(self.wt.path2id('new_directory/mfile2'), b'mfile2')
668
668
newfile_path = self.wt.abspath(pathjoin('new_directory', 'newfile'))
669
669
self.assertEqual(file(newfile_path).read(), 'hello3')
670
self.assertEqual(self.wt.path2id('dying_directory'), 'ddir')
670
self.assertEqual(self.wt.path2id('dying_directory'), b'ddir')
671
671
self.assertIs(self.wt.path2id('dying_directory/dying_file'), None)
672
672
mfile2_path = self.wt.abspath(pathjoin('new_directory', 'mfile2'))
918
918
'new-3')}, raw_conflicts)
919
919
cooked_conflicts = cook_conflicts(raw_conflicts, tt)
920
920
self.assertEqual([NonDirectoryParent('Created directory', 'parent.new',
921
'parent-id')], cooked_conflicts)
921
b'parent-id')], cooked_conflicts)
923
923
self.assertFalse(self.wt.is_versioned('parent'))
924
924
self.assertEqual('parent-id', self.wt.path2id('parent.new'))
926
926
def test_resolve_conflicts_wrong_new_parent_kind(self):
927
927
tt, root = self.get_transform()
928
parent_id = tt.new_directory('parent', root, 'parent-id')
929
tt.new_file('child,', parent_id, 'contents2', 'file-id')
928
parent_id = tt.new_directory('parent', root, b'parent-id')
929
tt.new_file('child,', parent_id, 'contents2', b'file-id')
931
931
tt, root = self.get_transform()
932
932
parent_id = tt.trans_id_file_id('parent-id')
1606
1606
def test_create_from_tree(self):
1607
1607
tree1 = self.make_branch_and_tree('tree1')
1608
self.build_tree_contents([('tree1/foo/',), ('tree1/bar', 'baz')])
1609
tree1.add(['foo', 'bar'], ['foo-id', 'bar-id'])
1608
self.build_tree_contents([('tree1/foo/',), ('tree1/bar', b'baz')])
1609
tree1.add(['foo', 'bar'], [b'foo-id', b'bar-id'])
1610
1610
tree2 = self.make_branch_and_tree('tree2')
1611
1611
tt = TreeTransform(tree2)
1612
1612
foo_trans_id = tt.create_path('foo', tt.root)
1613
create_from_tree(tt, foo_trans_id, tree1, 'foo', file_id='foo-id')
1613
create_from_tree(tt, foo_trans_id, tree1, 'foo', file_id=b'foo-id')
1614
1614
bar_trans_id = tt.create_path('bar', tt.root)
1615
create_from_tree(tt, bar_trans_id, tree1, 'bar', file_id='bar-id')
1615
create_from_tree(tt, bar_trans_id, tree1, 'bar', file_id='bbar-id')
1617
1617
self.assertEqual('directory', osutils.file_kind('tree2/foo'))
1618
1618
self.assertFileEqual('baz', 'tree2/bar')
1664
1664
def test_inventory_altered_unchanged(self):
1665
1665
tree = self.make_branch_and_tree('tree')
1666
1666
self.build_tree(['tree/foo'])
1667
tree.add('foo', 'foo-id')
1667
tree.add('foo', b'foo-id')
1668
1668
with TransformPreview(tree) as tt:
1669
1669
self.assertEqual([], tt._inventory_altered())
1671
1671
def test_inventory_altered_changed_parent_id(self):
1672
1672
tree = self.make_branch_and_tree('tree')
1673
1673
self.build_tree(['tree/foo'])
1674
tree.add('foo', 'foo-id')
1674
tree.add('foo', b'foo-id')
1675
1675
with TransformPreview(tree) as tt:
1676
1676
tt.unversion_file(tt.root)
1677
tt.version_file('new-id', tt.root)
1677
tt.version_file(b'new-id', tt.root)
1678
1678
foo_trans_id = tt.trans_id_tree_path('foo')
1679
1679
foo_tuple = ('foo', foo_trans_id)
1680
1680
root_tuple = ('', tt.root)
1730
1730
Merge3Merger(this.wt, this.wt, base.wt, other.wt)
1732
1732
# textual merge
1733
self.assertEqual(this.wt.get_file(this.wt.id2path('a')).read(), 'y\nb\nc\nd\bz\n')
1733
self.assertEqual(this.wt.get_file(this.wt.id2path(b'a')).read(), 'y\nb\nc\nd\bz\n')
1734
1734
# three-way text conflict
1735
self.assertEqual(this.wt.get_file(this.wt.id2path('b')).read(),
1735
self.assertEqual(this.wt.get_file(this.wt.id2path(b'b')).read(),
1736
1736
conflict_text('b', 'b2'))
1738
self.assertEqual(this.wt.get_file(this.wt.id2path('c')).read(), 'c2')
1738
self.assertEqual(this.wt.get_file(this.wt.id2path(b'c')).read(), 'c2')
1740
self.assertEqual(this.wt.get_file(this.wt.id2path('d')).read(), 'd2')
1740
self.assertEqual(this.wt.get_file(this.wt.id2path(b'd')).read(), 'd2')
1741
1741
# Ambigious clean merge
1742
self.assertEqual(this.wt.get_file(this.wt.id2path('e')).read(), 'e2')
1742
self.assertEqual(this.wt.get_file(this.wt.id2path(b'e')).read(), 'e2')
1744
self.assertEqual(this.wt.get_file(this.wt.id2path('f')).read(), 'f')
1744
self.assertEqual(this.wt.get_file(this.wt.id2path(b'f')).read(), 'f')
1745
1745
# Correct correct results when THIS == OTHER
1746
self.assertEqual(this.wt.get_file(this.wt.id2path('g')).read(), 'g')
1746
self.assertEqual(this.wt.get_file(this.wt.id2path(b'g')).read(), 'g')
1747
1747
# Text conflict when THIS & OTHER are text and BASE is dir
1748
self.assertEqual(this.wt.get_file(this.wt.id2path('h')).read(),
1748
self.assertEqual(this.wt.get_file(this.wt.id2path(b'h')).read(),
1749
1749
conflict_text('1\n2\n3\n4\n', 'h\ni\nj\nk\n'))
1750
1750
self.assertEqual(this.wt.get_file('h.THIS').read(),
1751
1751
'1\n2\n3\n4\n')
1752
1752
self.assertEqual(this.wt.get_file('h.OTHER').read(),
1753
1753
'h\ni\nj\nk\n')
1754
1754
self.assertEqual(file_kind(this.wt.abspath('h.BASE')), 'directory')
1755
self.assertEqual(this.wt.get_file(this.wt.id2path('i')).read(),
1755
self.assertEqual(this.wt.get_file(this.wt.id2path(b'i')).read(),
1756
1756
conflict_text('1\n2\n3\n4\n', 'h\ni\nj\nk\n'))
1757
1757
self.assertEqual(this.wt.get_file('i.THIS').read(),
1758
1758
'1\n2\n3\n4\n')
2090
2090
def test_build_tree_accelerator_wrong_kind(self):
2091
2091
self.requireFeature(SymlinkFeature)
2092
2092
source = self.make_branch_and_tree('source')
2093
self.build_tree_contents([('source/file1', '')])
2094
self.build_tree_contents([('source/file2', '')])
2095
source.add(['file1', 'file2'], ['file1-id', 'file2-id'])
2093
self.build_tree_contents([('source/file1', b'')])
2094
self.build_tree_contents([('source/file2', b'')])
2095
source.add(['file1', 'file2'], [b'file1-id', b'file2-id'])
2096
2096
source.commit('commit files')
2097
2097
os.unlink('source/file2')
2098
self.build_tree_contents([('source/file2/', 'C')])
2098
self.build_tree_contents([('source/file2/', b'C')])
2099
2099
os.unlink('source/file1')
2100
2100
os.symlink('file2', 'source/file1')
2228
2228
raise tests.UnavailableFeature('Fully case sensitive filesystem')
2229
2229
source = self.make_branch_and_tree('source')
2230
2230
self.build_tree(['source/file', 'source/FILE'])
2231
source.add(['file', 'FILE'], ['lower-id', 'upper-id'])
2231
source.add(['file', 'FILE'], [b'lower-id', b'upper-id'])
2232
2232
source.commit('added files')
2233
2233
# Don't try this at home, kids!
2234
2234
# Force the tree to report that it is case insensitive
2235
2235
target = self.make_branch_and_tree('target')
2236
2236
target.case_sensitive = False
2237
2237
build_tree(source.basis_tree(), target, source, delta_from_tree=True)
2238
self.assertEqual('file.moved', target.id2path('lower-id'))
2239
self.assertEqual('FILE', target.id2path('upper-id'))
2238
self.assertEqual('file.moved', target.id2path(b'lower-id'))
2239
self.assertEqual('FILE', target.id2path(b'upper-id'))
2241
2241
def test_build_tree_observes_sha(self):
2242
2242
source = self.make_branch_and_tree('source')
2243
2243
self.build_tree(['source/file1', 'source/dir/', 'source/dir/file2'])
2244
2244
source.add(['file1', 'dir', 'dir/file2'],
2245
['file1-id', 'dir-id', 'file2-id'])
2245
[b'file1-id', b'dir-id', b'file2-id'])
2246
2246
source.commit('new files')
2247
2247
target = self.make_branch_and_tree('target')
2248
2248
target.lock_write()
2340
2340
def test_add_files(self):
2341
2341
branch, tt = self.get_branch_and_transform()
2342
tt.new_file('file', tt.root, 'contents', 'file-id')
2342
tt.new_file('file', tt.root, 'contents', b'file-id')
2343
2343
trans_id = tt.new_directory('dir', tt.root, 'dir-id')
2344
2344
if SymlinkFeature.available():
2345
2345
tt.new_symlink('symlink', trans_id, 'target', 'symlink-id')
2346
2346
rev = tt.commit(branch, 'message')
2347
2347
tree = branch.basis_tree()
2348
self.assertEqual('file', tree.id2path('file-id'))
2349
self.assertEqual('contents', tree.get_file_text('file', 'file-id'))
2350
self.assertEqual('dir', tree.id2path('dir-id'))
2348
self.assertEqual('file', tree.id2path(b'file-id'))
2349
self.assertEqual('contents', tree.get_file_text('file', b'file-id'))
2350
self.assertEqual('dir', tree.id2path(b'dir-id'))
2351
2351
if SymlinkFeature.available():
2352
self.assertEqual('dir/symlink', tree.id2path('symlink-id'))
2352
self.assertEqual('dir/symlink', tree.id2path(b'symlink-id'))
2353
2353
self.assertEqual('target', tree.get_symlink_target('dir/symlink'))
2355
2355
def test_add_unversioned(self):
2825
2825
def test_get_file_mtime(self):
2826
2826
preview = self.get_empty_preview()
2827
2827
file_trans_id = preview.new_file('file', preview.root, 'contents',
2829
2829
limbo_path = preview._limbo_name(file_trans_id)
2830
2830
preview_tree = preview.get_preview_tree()
2831
2831
self.assertEqual(os.stat(limbo_path).st_mtime,
2832
preview_tree.get_file_mtime('file', 'file-id'))
2832
preview_tree.get_file_mtime('file', b'file-id'))
2834
2834
def test_get_file_mtime_renamed(self):
2835
2835
work_tree = self.make_branch_and_tree('tree')
2836
2836
self.build_tree(['tree/file'])
2837
work_tree.add('file', 'file-id')
2837
work_tree.add('file', b'file-id')
2838
2838
preview = TransformPreview(work_tree)
2839
2839
self.addCleanup(preview.finalize)
2840
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
preview_mtime = preview_tree.get_file_mtime('renamed', 'file-id')
2844
work_mtime = work_tree.get_file_mtime('file', 'file-id')
2843
preview_mtime = preview_tree.get_file_mtime('renamed', b'file-id')
2844
work_mtime = work_tree.get_file_mtime('file', b'file-id')
2846
2846
def test_get_file_size(self):
2847
2847
work_tree = self.make_branch_and_tree('tree')
2848
self.build_tree_contents([('tree/old', 'old')])
2849
work_tree.add('old', 'old-id')
2848
self.build_tree_contents([('tree/old', b'old')])
2849
work_tree.add('old', b'old-id')
2850
2850
preview = TransformPreview(work_tree)
2851
2851
self.addCleanup(preview.finalize)
2852
new_id = preview.new_file('name', preview.root, 'contents', 'new-id',
2852
new_id = preview.new_file('name', preview.root, 'contents', b'new-id',
2854
2854
tree = preview.get_preview_tree()
2855
2855
self.assertEqual(len('old'), tree.get_file_size('old'))
2876
2876
def test_all_file_ids(self):
2877
2877
tree = self.make_branch_and_tree('tree')
2878
2878
self.build_tree(['tree/a', 'tree/b', 'tree/c'])
2879
tree.add(['a', 'b', 'c'], ['a-id', 'b-id', 'c-id'])
2879
tree.add(['a', 'b', 'c'], [b'a-id', b'b-id', b'c-id'])
2880
2880
preview = TransformPreview(tree)
2881
2881
self.addCleanup(preview.finalize)
2882
preview.unversion_file(preview.trans_id_file_id('b-id'))
2883
c_trans_id = preview.trans_id_file_id('c-id')
2882
preview.unversion_file(preview.trans_id_file_id(b'b-id'))
2883
c_trans_id = preview.trans_id_file_id(b'c-id')
2884
2884
preview.unversion_file(c_trans_id)
2885
preview.version_file('c-id', c_trans_id)
2885
preview.version_file(b'c-id', c_trans_id)
2886
2886
preview_tree = preview.get_preview_tree()
2887
self.assertEqual({'a-id', 'c-id', tree.get_root_id()},
2887
self.assertEqual({b'a-id', b'c-id', tree.get_root_id()},
2888
2888
preview_tree.all_file_ids())
2890
2890
def test_path2id_deleted_unchanged(self):
2891
2891
tree = self.make_branch_and_tree('tree')
2892
2892
self.build_tree(['tree/unchanged', 'tree/deleted'])
2893
tree.add(['unchanged', 'deleted'], ['unchanged-id', 'deleted-id'])
2893
tree.add(['unchanged', 'deleted'], [b'unchanged-id', b'deleted-id'])
2894
2894
preview = TransformPreview(tree)
2895
2895
self.addCleanup(preview.finalize)
2896
preview.unversion_file(preview.trans_id_file_id('deleted-id'))
2896
preview.unversion_file(preview.trans_id_file_id(b'deleted-id'))
2897
2897
preview_tree = preview.get_preview_tree()
2898
self.assertEqual('unchanged-id', preview_tree.path2id('unchanged'))
2898
self.assertEqual(b'unchanged-id', preview_tree.path2id('unchanged'))
2899
2899
self.assertFalse(preview_tree.is_versioned('deleted'))
2901
2901
def test_path2id_created(self):
2902
2902
tree = self.make_branch_and_tree('tree')
2903
2903
self.build_tree(['tree/unchanged'])
2904
tree.add(['unchanged'], ['unchanged-id'])
2904
tree.add(['unchanged'], [b'unchanged-id'])
2905
2905
preview = TransformPreview(tree)
2906
2906
self.addCleanup(preview.finalize)
2907
preview.new_file('new', preview.trans_id_file_id('unchanged-id'),
2907
preview.new_file('new', preview.trans_id_file_id(b'unchanged-id'),
2908
2908
'contents', 'new-id')
2909
2909
preview_tree = preview.get_preview_tree()
2910
self.assertEqual('new-id', preview_tree.path2id('unchanged/new'))
2910
self.assertEqual(b'new-id', preview_tree.path2id('unchanged/new'))
2912
2912
def test_path2id_moved(self):
2913
2913
tree = self.make_branch_and_tree('tree')
2914
2914
self.build_tree(['tree/old_parent/', 'tree/old_parent/child'])
2915
2915
tree.add(['old_parent', 'old_parent/child'],
2916
['old_parent-id', 'child-id'])
2916
[b'old_parent-id', b'child-id'])
2917
2917
preview = TransformPreview(tree)
2918
2918
self.addCleanup(preview.finalize)
2919
2919
new_parent = preview.new_directory('new_parent', preview.root,
2921
2921
preview.adjust_path('child', new_parent,
2922
preview.trans_id_file_id('child-id'))
2922
preview.trans_id_file_id(b'child-id'))
2923
2923
preview_tree = preview.get_preview_tree()
2924
2924
self.assertFalse(preview_tree.is_versioned('old_parent/child'))
2925
self.assertEqual('child-id', preview_tree.path2id('new_parent/child'))
2925
self.assertEqual(b'child-id', preview_tree.path2id('new_parent/child'))
2927
2927
def test_path2id_renamed_parent(self):
2928
2928
tree = self.make_branch_and_tree('tree')
2929
2929
self.build_tree(['tree/old_name/', 'tree/old_name/child'])
2930
2930
tree.add(['old_name', 'old_name/child'],
2931
['parent-id', 'child-id'])
2931
[b'parent-id', b'child-id'])
2932
2932
preview = TransformPreview(tree)
2933
2933
self.addCleanup(preview.finalize)
2934
2934
preview.adjust_path('new_name', preview.root,
2935
preview.trans_id_file_id('parent-id'))
2935
preview.trans_id_file_id(b'parent-id'))
2936
2936
preview_tree = preview.get_preview_tree()
2937
2937
self.assertFalse(preview_tree.is_versioned('old_name/child'))
2938
self.assertEqual('child-id', preview_tree.path2id('new_name/child'))
2938
self.assertEqual(b'child-id', preview_tree.path2id('new_name/child'))
2940
2940
def assertMatchingIterEntries(self, tt, specific_files=None):
2941
2941
preview_tree = tt.get_preview_tree()
2950
2950
def test_iter_entries_by_dir_new(self):
2951
2951
tree = self.make_branch_and_tree('tree')
2952
2952
tt = TreeTransform(tree)
2953
tt.new_file('new', tt.root, 'contents', 'new-id')
2953
tt.new_file('new', tt.root, 'contents', b'new-id')
2954
2954
self.assertMatchingIterEntries(tt)
2956
2956
def test_iter_entries_by_dir_deleted(self):
2957
2957
tree = self.make_branch_and_tree('tree')
2958
2958
self.build_tree(['tree/deleted'])
2959
tree.add('deleted', 'deleted-id')
2959
tree.add('deleted', b'deleted-id')
2960
2960
tt = TreeTransform(tree)
2961
tt.delete_contents(tt.trans_id_file_id('deleted-id'))
2961
tt.delete_contents(tt.trans_id_file_id(b'deleted-id'))
2962
2962
self.assertMatchingIterEntries(tt)
2964
2964
def test_iter_entries_by_dir_unversioned(self):
2965
2965
tree = self.make_branch_and_tree('tree')
2966
2966
self.build_tree(['tree/removed'])
2967
tree.add('removed', 'removed-id')
2967
tree.add('removed', b'removed-id')
2968
2968
tt = TreeTransform(tree)
2969
tt.unversion_file(tt.trans_id_file_id('removed-id'))
2969
tt.unversion_file(tt.trans_id_file_id(b'removed-id'))
2970
2970
self.assertMatchingIterEntries(tt)
2972
2972
def test_iter_entries_by_dir_moved(self):
2973
2973
tree = self.make_branch_and_tree('tree')
2974
2974
self.build_tree(['tree/moved', 'tree/new_parent/'])
2975
tree.add(['moved', 'new_parent'], ['moved-id', 'new_parent-id'])
2975
tree.add(['moved', 'new_parent'], [b'moved-id', b'new_parent-id'])
2976
2976
tt = TreeTransform(tree)
2977
tt.adjust_path('moved', tt.trans_id_file_id('new_parent-id'),
2978
tt.trans_id_file_id('moved-id'))
2977
tt.adjust_path('moved', tt.trans_id_file_id(b'new_parent-id'),
2978
tt.trans_id_file_id(b'moved-id'))
2979
2979
self.assertMatchingIterEntries(tt)
2981
2981
def test_iter_entries_by_dir_specific_files(self):
2982
2982
tree = self.make_branch_and_tree('tree')
2983
tree.set_root_id('tree-root-id')
2983
tree.set_root_id(b'tree-root-id')
2984
2984
self.build_tree(['tree/parent/', 'tree/parent/child'])
2985
tree.add(['parent', 'parent/child'], ['parent-id', 'child-id'])
2985
tree.add(['parent', 'parent/child'], [b'parent-id', b'child-id'])
2986
2986
tt = TreeTransform(tree)
2987
2987
self.assertMatchingIterEntries(tt, ['', 'parent/child'])
2989
2989
def test_symlink_content_summary(self):
2990
2990
self.requireFeature(SymlinkFeature)
2991
2991
preview = self.get_empty_preview()
2992
preview.new_symlink('path', preview.root, 'target', 'path-id')
2992
preview.new_symlink('path', preview.root, 'target', b'path-id')
2993
2993
summary = preview.get_preview_tree().path_content_summary('path')
2994
2994
self.assertEqual(('symlink', None, None, 'target'), summary)
3063
3063
def test_annotate(self):
3064
3064
tree = self.make_branch_and_tree('tree')
3065
self.build_tree_contents([('tree/file', 'a\n')])
3066
tree.add('file', 'file-id')
3067
tree.commit('a', rev_id='one')
3068
self.build_tree_contents([('tree/file', 'a\nb\n')])
3065
self.build_tree_contents([('tree/file', b'a\n')])
3066
tree.add('file', b'file-id')
3067
tree.commit('a', rev_id=b'one')
3068
self.build_tree_contents([('tree/file', b'a\nb\n')])
3069
3069
preview = TransformPreview(tree)
3070
3070
self.addCleanup(preview.finalize)
3071
file_trans_id = preview.trans_id_file_id('file-id')
3071
file_trans_id = preview.trans_id_file_id(b'file-id')
3072
3072
preview.delete_contents(file_trans_id)
3073
3073
preview.create_file('a\nb\nc\n', file_trans_id)
3074
3074
preview_tree = preview.get_preview_tree()
3077
3077
('me:', 'b\n'),
3078
3078
('me:', 'c\n'),
3080
annotation = preview_tree.annotate_iter('file', default_revision='me:')
3080
annotation = preview_tree.annotate_iter('file', default_revision=b'me:')
3081
3081
self.assertEqual(expected, annotation)
3083
3083
def test_annotate_missing(self):
3084
3084
preview = self.get_empty_preview()
3085
preview.new_file('file', preview.root, 'a\nb\nc\n', 'file-id')
3085
preview.new_file('file', preview.root, 'a\nb\nc\n', b'file-id')
3086
3086
preview_tree = preview.get_preview_tree()
3088
3088
('me:', 'a\n'),
3089
3089
('me:', 'b\n'),
3090
3090
('me:', 'c\n'),
3092
annotation = preview_tree.annotate_iter('file', default_revision='me:')
3092
annotation = preview_tree.annotate_iter('file', default_revision=b'me:')
3093
3093
self.assertEqual(expected, annotation)
3095
3095
def test_annotate_rename(self):
3096
3096
tree = self.make_branch_and_tree('tree')
3097
self.build_tree_contents([('tree/file', 'a\n')])
3098
tree.add('file', 'file-id')
3099
tree.commit('a', rev_id='one')
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')
3100
3100
preview = TransformPreview(tree)
3101
3101
self.addCleanup(preview.finalize)
3102
file_trans_id = preview.trans_id_file_id('file-id')
3102
file_trans_id = preview.trans_id_file_id(b'file-id')
3103
3103
preview.adjust_path('newname', preview.root, file_trans_id)
3104
3104
preview_tree = preview.get_preview_tree()
3106
3106
('one', 'a\n'),
3108
annotation = preview_tree.annotate_iter('file', default_revision='me:')
3108
annotation = preview_tree.annotate_iter('file', default_revision=b'me:')
3109
3109
self.assertEqual(expected, annotation)
3111
3111
def test_annotate_deleted(self):
3112
3112
tree = self.make_branch_and_tree('tree')
3113
self.build_tree_contents([('tree/file', 'a\n')])
3114
tree.add('file', 'file-id')
3115
tree.commit('a', rev_id='one')
3116
self.build_tree_contents([('tree/file', 'a\nb\n')])
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')])
3117
3117
preview = TransformPreview(tree)
3118
3118
self.addCleanup(preview.finalize)
3119
file_trans_id = preview.trans_id_file_id('file-id')
3119
file_trans_id = preview.trans_id_file_id(b'file-id')
3120
3120
preview.delete_contents(file_trans_id)
3121
3121
preview_tree = preview.get_preview_tree()
3122
annotation = preview_tree.annotate_iter('file', default_revision='me:')
3122
annotation = preview_tree.annotate_iter('file', default_revision=b'me:')
3123
3123
self.assertIs(None, annotation)
3125
3125
def test_stored_kind(self):
3126
3126
preview = self.get_empty_preview()
3127
preview.new_file('file', preview.root, 'a\nb\nc\n', 'file-id')
3127
preview.new_file('file', preview.root, 'a\nb\nc\n', b'file-id')
3128
3128
preview_tree = preview.get_preview_tree()
3129
3129
self.assertEqual('file', preview_tree.stored_kind('file'))
3131
3131
def test_is_executable(self):
3132
3132
preview = self.get_empty_preview()
3133
preview.new_file('file', preview.root, 'a\nb\nc\n', 'file-id')
3134
preview.set_executability(True, preview.trans_id_file_id('file-id'))
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'))
3135
3135
preview_tree = preview.get_preview_tree()
3136
3136
self.assertEqual(True, preview_tree.is_executable('file'))
3138
3138
def test_get_set_parent_ids(self):
3139
3139
revision_tree, preview_tree = self.get_tree_and_preview_tree()
3140
3140
self.assertEqual([], preview_tree.get_parent_ids())
3141
preview_tree.set_parent_ids(['rev-1'])
3142
self.assertEqual(['rev-1'], 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())
3144
3144
def test_plan_file_merge(self):
3145
3145
work_a = self.make_branch_and_tree('wta')
3146
self.build_tree_contents([('wta/file', 'a\nb\nc\nd\n')])
3147
work_a.add('file', 'file-id')
3146
self.build_tree_contents([('wta/file', b'a\nb\nc\nd\n')])
3147
work_a.add('file', b'file-id')
3148
3148
base_id = work_a.commit('base version')
3149
3149
tree_b = work_a.controldir.sprout('wtb').open_workingtree()
3150
3150
preview = TransformPreview(work_a)
3151
3151
self.addCleanup(preview.finalize)
3152
trans_id = preview.trans_id_file_id('file-id')
3152
trans_id = preview.trans_id_file_id(b'file-id')
3153
3153
preview.delete_contents(trans_id)
3154
3154
preview.create_file('b\nc\nd\ne\n', trans_id)
3155
self.build_tree_contents([('wtb/file', 'a\nc\nd\nf\n')])
3155
self.build_tree_contents([('wtb/file', b'a\nc\nd\nf\n')])
3156
3156
tree_a = preview.get_preview_tree()
3157
3157
tree_a.set_parent_ids([base_id])
3158
3158
self.assertEqual([
3162
3162
('unchanged', 'd\n'),
3163
3163
('new-a', 'e\n'),
3164
3164
('new-b', 'f\n'),
3165
], list(tree_a.plan_file_merge('file-id', tree_b)))
3165
], list(tree_a.plan_file_merge(b'file-id', tree_b)))
3167
3167
def test_plan_file_merge_revision_tree(self):
3168
3168
work_a = self.make_branch_and_tree('wta')
3169
self.build_tree_contents([('wta/file', 'a\nb\nc\nd\n')])
3170
work_a.add('file', 'file-id')
3169
self.build_tree_contents([('wta/file', b'a\nb\nc\nd\n')])
3170
work_a.add('file', b'file-id')
3171
3171
base_id = work_a.commit('base version')
3172
3172
tree_b = work_a.controldir.sprout('wtb').open_workingtree()
3173
3173
preview = TransformPreview(work_a.basis_tree())
3174
3174
self.addCleanup(preview.finalize)
3175
trans_id = preview.trans_id_file_id('file-id')
3175
trans_id = preview.trans_id_file_id(b'file-id')
3176
3176
preview.delete_contents(trans_id)
3177
3177
preview.create_file('b\nc\nd\ne\n', trans_id)
3178
self.build_tree_contents([('wtb/file', 'a\nc\nd\nf\n')])
3178
self.build_tree_contents([('wtb/file', b'a\nc\nd\nf\n')])
3179
3179
tree_a = preview.get_preview_tree()
3180
3180
tree_a.set_parent_ids([base_id])
3181
3181
self.assertEqual([
3260
3260
def test_merge_preview_into_workingtree_handles_conflicts(self):
3261
3261
tree = self.make_branch_and_tree('tree')
3262
self.build_tree_contents([('tree/foo', 'bar')])
3263
tree.add('foo', 'foo-id')
3262
self.build_tree_contents([('tree/foo', b'bar')])
3263
tree.add('foo', b'foo-id')
3264
3264
tree.commit('foo')
3265
3265
tt = TransformPreview(tree)
3266
3266
self.addCleanup(tt.finalize)
3267
trans_id = tt.trans_id_file_id('foo-id')
3267
trans_id = tt.trans_id_file_id(b'foo-id')
3268
3268
tt.delete_contents(trans_id)
3269
3269
tt.create_file('baz', trans_id)
3270
3270
tree2 = tree.controldir.sprout('tree2').open_workingtree()
3271
self.build_tree_contents([('tree2/foo', 'qux')])
3271
self.build_tree_contents([('tree2/foo', b'qux')])
3272
3272
merger = Merger.from_uncommitted(tree2, tt.get_preview_tree(),
3273
3273
tree.basis_tree())
3274
3274
merger.merge_type = Merge3Merger
3582
3582
self.assertFileEqual(LINES, tt._limbo_name('new-1'))
3584
3584
def test_get_parents_lines(self):
3585
LINES_ONE = 'aa\nbb\ncc\ndd\n'
3586
LINES_TWO = 'z\nbb\nx\ndd\n'
3585
LINES_ONE = b'aa\nbb\ncc\ndd\n'
3586
LINES_TWO = b'z\nbb\nx\ndd\n'
3587
3587
tree = self.make_branch_and_tree('tree')
3588
3588
self.build_tree_contents([('tree/file', LINES_ONE)])
3589
tree.add('file', 'file-id')
3589
tree.add('file', b'file-id')
3590
3590
tt = self.get_preview(tree)
3591
3591
trans_id = tt.trans_id_tree_path('file')
3592
3592
self.assertEqual((['aa\n', 'bb\n', 'cc\n', 'dd\n'],),
3593
3593
tt._get_parents_lines(trans_id))
3595
3595
def test_get_parents_texts(self):
3596
LINES_ONE = 'aa\nbb\ncc\ndd\n'
3597
LINES_TWO = 'z\nbb\nx\ndd\n'
3596
LINES_ONE = b'aa\nbb\ncc\ndd\n'
3597
LINES_TWO = b'z\nbb\nx\ndd\n'
3598
3598
tree = self.make_branch_and_tree('tree')
3599
3599
self.build_tree_contents([('tree/file', LINES_ONE)])
3600
tree.add('file', 'file-id')
3600
tree.add('file', b'file-id')
3601
3601
tt = self.get_preview(tree)
3602
3602
trans_id = tt.trans_id_tree_path('file')
3603
3603
self.assertEqual((LINES_ONE,),