2574
2575
self.assertEqual(False, preview_tree.is_executable('baz-id',
2576
2577
self.assertEqual(False, preview_tree.is_executable('baz-id'))
2580
class TestSerializeTransform(tests.TestCaseWithTransport):
2582
def get_two_previews(self, tree):
2583
tt = TransformPreview(tree)
2584
self.addCleanup(tt.finalize)
2585
tt2 = TransformPreview(tree)
2586
self.addCleanup(tt2.finalize)
2590
def reserialize(tt, tt2):
2591
serializer = pack.ContainerSerialiser()
2592
parser = pack.ContainerPushParser()
2593
parser.accept_bytes(serializer.begin())
2594
for bytes in tt.serialize(serializer):
2595
parser.accept_bytes(bytes)
2596
parser.accept_bytes(serializer.end())
2597
tt2.deserialize(iter(parser.read_pending_records()))
2599
def test_roundtrip_creation(self):
2600
tree = self.make_branch_and_tree('.')
2601
tt, tt2 = self.get_two_previews(tree)
2602
tt.new_file(u'foo\u1234', tt.root, 'bar', 'baz', True)
2603
tt.new_directory('qux', tt.root, 'quxx')
2604
self.reserialize(tt, tt2)
2605
self.assertEqual(3, tt2._id_number)
2606
self.assertEqual({'new-1': u'foo\u1234',
2607
'new-2': 'qux'}, tt2._new_name)
2608
self.assertEqual({'new-1': 'baz', 'new-2': 'quxx'}, tt2._new_id)
2609
self.assertEqual({'new-1': tt.root, 'new-2': tt.root}, tt2._new_parent)
2610
self.assertEqual({'baz': 'new-1', 'quxx': 'new-2'}, tt2._r_new_id)
2611
self.assertEqual({'new-1': True}, tt2._new_executability)
2612
self.assertEqual({'new-1': 'file',
2613
'new-2': 'directory'}, tt2._new_contents)
2614
foo_limbo = open(tt2._limbo_name('new-1'), 'rb')
2616
foo_content = foo_limbo.read()
2619
self.assertEqual('bar', foo_content)
2621
def test_symlink_creation(self):
2622
self.requireFeature(tests.SymlinkFeature)
2623
tree = self.make_branch_and_tree('.')
2624
tt, tt2 = self.get_two_previews(tree)
2625
tt.new_symlink('foo', tt.root, 'bar')
2626
self.reserialize(tt, tt2)
2627
foo_content = os.readlink(tt2._limbo_name('new-1'))
2628
self.assertEqual('bar', foo_content)
2630
def test_roundtrip_destruction(self):
2631
tree = self.make_branch_and_tree('.')
2632
self.build_tree([u'foo\u1234', 'bar'])
2633
tree.add([u'foo\u1234', 'bar'], ['foo-id', 'bar-id'])
2634
tt, tt2 = self.get_two_previews(tree)
2635
foo_trans_id = tt.trans_id_tree_file_id('foo-id')
2636
tt.unversion_file(foo_trans_id)
2637
bar_trans_id = tt.trans_id_tree_file_id('bar-id')
2638
tt.delete_contents(bar_trans_id)
2639
self.reserialize(tt, tt2)
2640
self.assertEqual({u'foo\u1234': foo_trans_id,
2641
'bar': bar_trans_id,
2642
'': tt.root}, tt2._tree_path_ids)
2643
self.assertEqual({foo_trans_id: u'foo\u1234',
2644
bar_trans_id: 'bar',
2645
tt.root: ''}, tt2._tree_id_paths)
2646
self.assertEqual(set([foo_trans_id]), tt2._removed_id)
2647
self.assertEqual(set([bar_trans_id]), tt2._removed_contents)
2649
def test_roundtrip_missing(self):
2650
tree = self.make_branch_and_tree('.')
2651
tt, tt2 = self.get_two_previews(tree)
2652
boo_trans_id = tt.trans_id_file_id('boo')
2653
self.reserialize(tt, tt2)
2654
self.assertEqual({'boo': boo_trans_id}, tt2._non_present_ids)
2656
def test_roundtrip_modification(self):
2657
LINES_ONE = 'aa\nbb\ncc\ndd\n'
2658
LINES_TWO = 'z\nbb\nx\ndd\n'
2659
tree = self.make_branch_and_tree('tree')
2660
self.build_tree_contents([('tree/file', LINES_ONE)])
2661
tree.add('file', 'file-id')
2662
tt, tt2 = self.get_two_previews(tree)
2663
trans_id = tt.trans_id_file_id('file-id')
2664
tt.delete_contents(trans_id)
2665
tt.create_file(LINES_TWO, trans_id)
2666
self.reserialize(tt, tt2)
2667
self.assertFileEqual(LINES_TWO, tt2._limbo_name(trans_id))
2669
def test_roundtrip_kind_change(self):
2670
LINES_ONE = 'a\nb\nc\nd\n'
2671
tree = self.make_branch_and_tree('tree')
2672
self.build_tree(['tree/foo/'])
2673
tree.add('foo', 'foo-id')
2674
tt, tt2 = self.get_two_previews(tree)
2675
trans_id = tt.trans_id_file_id('foo-id')
2676
tt.delete_contents(trans_id)
2677
tt.create_file(LINES_ONE, trans_id)
2678
self.reserialize(tt, tt2)
2679
self.assertFileEqual(LINES_ONE, tt2._limbo_name(trans_id))
2681
def test_roundtrip_add_contents(self):
2682
LINES_ONE = 'a\nb\nc\nd\n'
2683
tree = self.make_branch_and_tree('tree')
2684
self.build_tree(['tree/foo'])
2686
os.unlink('tree/foo')
2687
tt, tt2 = self.get_two_previews(tree)
2688
trans_id = tt.trans_id_tree_path('foo')
2689
tt.create_file(LINES_ONE, trans_id)
2690
self.reserialize(tt, tt2)
2691
self.assertFileEqual(LINES_ONE, tt2._limbo_name(trans_id))
2693
def test_get_parents_lines(self):
2694
LINES_ONE = 'aa\nbb\ncc\ndd\n'
2695
LINES_TWO = 'z\nbb\nx\ndd\n'
2696
tree = self.make_branch_and_tree('tree')
2697
self.build_tree_contents([('tree/file', LINES_ONE)])
2698
tree.add('file', 'file-id')
2699
tt, tt2 = self.get_two_previews(tree)
2700
trans_id = tt.trans_id_tree_path('file')
2701
self.assertEqual((['aa\n', 'bb\n', 'cc\n', 'dd\n'],),
2702
tt._get_parents_lines(trans_id))
2704
def test_get_parents_texts(self):
2705
LINES_ONE = 'aa\nbb\ncc\ndd\n'
2706
LINES_TWO = 'z\nbb\nx\ndd\n'
2707
tree = self.make_branch_and_tree('tree')
2708
self.build_tree_contents([('tree/file', LINES_ONE)])
2709
tree.add('file', 'file-id')
2710
tt, tt2 = self.get_two_previews(tree)
2711
trans_id = tt.trans_id_tree_path('file')
2712
self.assertEqual((LINES_ONE,),
2713
tt._get_parents_texts(trans_id))