240
241
new_vf = self.get_file('bar')
241
242
for version in multiparent.topo_iter(vf):
242
243
mpdiff = vf.make_mpdiffs([version])[0]
243
new_vf.add_mpdiffs([(version, vf.get_parents(version),
244
new_vf.add_mpdiffs([(version, vf.get_parent_map([version])[version],
244
245
vf.get_sha1(version), mpdiff)])
245
246
self.assertEqualDiff(vf.get_text(version),
246
247
new_vf.get_text(version))
370
371
def verify_file(f):
371
372
self.assertEquals(f.get_lines('r1'), f.get_lines('r0'))
372
373
self.assertEquals(f.get_lines('r1'), ['a\n', 'b\n'])
373
self.assertEquals(f.get_parents('r1'), ['r0'])
374
self.assertEqual({'r1':('r0',)}, f.get_parent_map(['r1']))
375
375
self.assertRaises(RevisionNotPresent,
376
376
f.clone_text, 'r2', 'rX', [])
377
377
self.assertRaises(RevisionAlreadyPresent,
380
380
verify_file(self.reopen_file())
382
def test_create_empty(self):
384
f.add_lines('0', [], ['a\n'])
385
new_f = f.create_empty('t', MemoryTransport())
386
# smoke test, specific types should check it is honoured correctly for
387
# non type attributes
388
self.assertEqual([], new_f.versions())
389
self.assertTrue(isinstance(new_f, f.__class__))
391
382
def test_copy_to(self):
392
383
f = self.get_file()
393
384
f.add_lines('0', [], ['a\n'])
453
444
f.add_lines('r2', [], ['a\n', 'b\n'])
454
445
f.add_lines('r3', [], ['a\n', 'b\n'])
455
446
f.add_lines('m', ['r0', 'r1', 'r2', 'r3'], ['a\n', 'b\n'])
456
self.assertEquals(f.get_parents('m'), ['r0', 'r1', 'r2', 'r3'])
447
self.assertEqual(['r0', 'r1', 'r2', 'r3'],
448
self.applyDeprecated(one_four, f.get_parents, 'm'))
458
449
self.assertRaises(RevisionNotPresent,
450
self.applyDeprecated, one_four, f.get_parents, 'y')
452
def test_get_parent_map(self):
454
f.add_lines('r0', [], ['a\n', 'b\n'])
456
{'r0':()}, f.get_parent_map(['r0']))
457
f.add_lines('r1', ['r0'], ['a\n', 'b\n'])
459
{'r1':('r0',)}, f.get_parent_map(['r1']))
463
f.get_parent_map(['r0', 'r1']))
464
f.add_lines('r2', [], ['a\n', 'b\n'])
465
f.add_lines('r3', [], ['a\n', 'b\n'])
466
f.add_lines('m', ['r0', 'r1', 'r2', 'r3'], ['a\n', 'b\n'])
468
{'m':('r0', 'r1', 'r2', 'r3')}, f.get_parent_map(['m']))
469
self.assertEqual({}, f.get_parent_map('y'))
473
f.get_parent_map(['r0', 'y', 'r1']))
461
475
def test_annotate(self):
462
476
f = self.get_file()
607
621
vf.add_lines_with_ghosts('notbxbfse', [parent_id_utf8], [])
608
622
except NotImplementedError:
609
623
# check the other ghost apis are also not implemented
610
self.assertRaises(NotImplementedError, vf.has_ghost, 'foo')
611
624
self.assertRaises(NotImplementedError, vf.get_ancestry_with_ghosts, ['foo'])
612
625
self.assertRaises(NotImplementedError, vf.get_parents_with_ghosts, 'foo')
613
self.assertRaises(NotImplementedError, vf.get_graph_with_ghosts)
615
627
vf = self.reopen_file()
616
628
# test key graph related apis: getncestry, _graph, get_parents
618
630
# - these are ghost unaware and must not be reflect ghosts
619
631
self.assertEqual(['notbxbfse'], vf.get_ancestry('notbxbfse'))
620
self.assertEqual([], vf.get_parents('notbxbfse'))
633
self.applyDeprecated(one_four, vf.get_parents, 'notbxbfse'))
621
634
self.assertEqual({'notbxbfse':()}, vf.get_graph())
622
635
self.assertFalse(vf.has_version(parent_id_utf8))
623
636
# we have _with_ghost apis to give us ghost information.
624
637
self.assertEqual([parent_id_utf8, 'notbxbfse'], vf.get_ancestry_with_ghosts(['notbxbfse']))
625
638
self.assertEqual([parent_id_utf8], vf.get_parents_with_ghosts('notbxbfse'))
626
self.assertEqual({'notbxbfse':[parent_id_utf8]}, vf.get_graph_with_ghosts())
627
self.assertTrue(vf.has_ghost(parent_id_utf8))
639
self.assertEqual({'notbxbfse':(parent_id_utf8,)},
640
self.applyDeprecated(one_four, vf.get_graph_with_ghosts))
641
self.assertTrue(self.applyDeprecated(one_four, vf.has_ghost,
628
643
# if we add something that is a ghost of another, it should correct the
629
644
# results of the prior apis
630
645
vf.add_lines(parent_id_utf8, [], [])
631
646
self.assertEqual([parent_id_utf8, 'notbxbfse'], vf.get_ancestry(['notbxbfse']))
632
self.assertEqual([parent_id_utf8], vf.get_parents('notbxbfse'))
647
self.assertEqual({'notbxbfse':(parent_id_utf8,)},
648
vf.get_parent_map(['notbxbfse']))
633
649
self.assertEqual({parent_id_utf8:(),
634
650
'notbxbfse':(parent_id_utf8, ),
639
655
self.assertEqual([parent_id_utf8, 'notbxbfse'],
640
656
vf.get_ancestry_with_ghosts(['notbxbfse']))
641
657
self.assertEqual([parent_id_utf8], vf.get_parents_with_ghosts('notbxbfse'))
642
self.assertEqual({parent_id_utf8:[],
643
'notbxbfse':[parent_id_utf8],
658
self.assertEqual({parent_id_utf8:(),
659
'notbxbfse':(parent_id_utf8,),
645
vf.get_graph_with_ghosts())
646
self.assertFalse(vf.has_ghost(parent_id_utf8))
661
self.applyDeprecated(one_four, vf.get_graph_with_ghosts))
662
self.assertFalse(self.applyDeprecated(one_four, vf.has_ghost,
648
665
def test_add_lines_with_ghosts_after_normal_revs(self):
649
666
# some versioned file formats allow lines to be added with parent
653
670
vf = self.get_file()
654
671
# probe for ghost support
673
vf.add_lines_with_ghosts('base', [], ['line\n', 'line_b\n'])
657
674
except NotImplementedError:
659
vf.add_lines_with_ghosts('base', [], ['line\n', 'line_b\n'])
660
676
vf.add_lines_with_ghosts('references_ghost',
661
677
['base', 'a_ghost'],
662
678
['line\n', 'line_b\n', 'line_c\n'])
843
859
def test_get_parents(self):
844
860
self.setup_abcde()
845
self.assertEqual(['A'], self.plan_merge_vf.get_parents('B'))
846
self.assertEqual(['C'], self.plan_merge_vf.get_parents('D'))
847
self.assertEqual(['B', 'D'], self.plan_merge_vf.get_parents('E:'))
848
error = self.assertRaises(errors.RevisionNotPresent,
849
self.plan_merge_vf.get_parents, 'F')
850
self.assertContainsRe(str(error), '{F} not present in "root"')
861
self.assertEqual({'B':('A',)}, self.plan_merge_vf.get_parent_map(['B']))
862
self.assertEqual({'D':('C',)}, self.plan_merge_vf.get_parent_map(['D']))
863
self.assertEqual({'E:':('B', 'D')},
864
self.plan_merge_vf.get_parent_map(['E:']))
865
self.assertEqual({}, self.plan_merge_vf.get_parent_map(['F']))
870
}, self.plan_merge_vf.get_parent_map(['B', 'D', 'E:', 'F']))
852
872
def test_get_lines(self):
853
873
self.setup_abcde()