416
416
def added(self, tree, file_id):
417
417
entry = tree.inventory[file_id]
418
418
path = tree.id2path(file_id)
419
return (file_id, path, True, (False, True), (None, entry.parent_id),
419
return (file_id, (None, path), True, (False, True), (None, entry.parent_id),
420
420
(None, entry.name), (None, entry.kind),
421
421
(None, entry.executable))
423
423
def content_changed(self, tree, file_id):
424
424
entry = tree.inventory[file_id]
425
425
path = tree.id2path(file_id)
426
return (file_id, path, True, (True, True), (entry.parent_id, entry.parent_id),
426
return (file_id, (path, path), True, (True, True), (entry.parent_id, entry.parent_id),
427
427
(entry.name, entry.name), (entry.kind, entry.kind),
428
428
(entry.executable, entry.executable))
431
431
old_entry = from_tree.inventory[file_id]
432
432
new_entry = to_tree.inventory[file_id]
433
433
path = to_tree.id2path(file_id)
434
return (file_id, path, True, (True, True), (old_entry.parent_id, new_entry.parent_id),
434
from_path = from_tree.id2path(file_id)
435
return (file_id, (from_path, path), True, (True, True), (old_entry.parent_id, new_entry.parent_id),
435
436
(old_entry.name, new_entry.name), (old_entry.kind, new_entry.kind),
436
437
(old_entry.executable, new_entry.executable))
438
def missing(self, file_id, path, parent_id, kind):
439
_, basename = os.path.split(path)
440
return (file_id, path, True, (True, True), (parent_id, parent_id),
441
(basename, basename), (kind, None), (False, False))
439
def missing(self, file_id, from_path, to_path, parent_id, kind):
440
_, from_basename = os.path.split(from_path)
441
_, to_basename = os.path.split(to_path)
442
# missing files have both paths, but no kind.
443
return (file_id, (from_path, to_path), True, (True, True),
444
(parent_id, parent_id),
445
(from_basename, to_basename), (kind, None), (False, False))
443
447
def deleted(self, tree, file_id):
444
448
entry = tree.inventory[file_id]
445
449
path = tree.id2path(file_id)
446
return (file_id, path, True, (True, False), (entry.parent_id, None),
450
return (file_id, (path, None), True, (True, False), (entry.parent_id, None),
447
451
(entry.name, None), (entry.kind, None),
448
452
(entry.executable, None))
452
456
to_entry = to_tree.inventory[file_id]
453
457
from_path = from_tree.id2path(file_id)
454
458
to_path = to_tree.id2path(file_id)
455
return (file_id, to_path, content_changed, (True, True),
459
return (file_id, (from_path, to_path), content_changed, (True, True),
456
460
(from_entry.parent_id, to_entry.parent_id),
457
461
(from_entry.name, to_entry.name),
458
462
(from_entry.kind, to_entry.kind),
464
468
name = entry.name
465
469
kind = entry.kind
466
470
executable = entry.executable
467
return (file_id, tree.id2path(file_id), False, (True, True),
471
path = tree.id2path(file_id)
472
return (file_id, (path, path), False, (True, True),
468
473
(parent, parent), (name, name), (kind, kind),
469
474
(executable, executable))
472
477
"""Create an unversioned result."""
473
478
_, basename = os.path.split(path)
474
479
kind = file_kind(tree.abspath(path))
475
return (None, path, True, (False, False), (None, None),
480
return (None, (None, path), True, (False, False), (None, None),
476
481
(None, basename), (None, kind),
547
552
def deleted(file_id):
548
553
entry = tree1.inventory[file_id]
549
554
path = tree1.id2path(file_id)
550
return (file_id, path, True, (True, False),
555
return (file_id, (path, None), True, (True, False),
551
556
(entry.parent_id, None),
552
557
(entry.name, None), (entry.kind, None),
553
558
(entry.executable, None))
554
expected_results = sorted([self.added(tree2, 'empty-root-id'),
555
deleted('root-id'), deleted('a-id'),
556
deleted('b-id'), deleted('c-id')])
559
expected_results = sorted([
560
self.added(tree2, 'empty-root-id'),
561
deleted('root-id'), deleted('a-id'),
562
deleted('b-id'), deleted('c-id')])
559
565
self.assertEqual(
567
573
tree2 = self.get_tree_no_parents_abc_content_2(tree2)
568
574
tree1, tree2 = self.mutable_trees_to_test_trees(tree1, tree2)
569
575
root_id = tree1.path2id('')
570
self.assertEqual([('a-id', 'a', True, (True, True),
571
(root_id, root_id), ('a', 'a'),
572
('file', 'file'), (False, False))],
576
self.assertEqual([('a-id', ('a', 'a'), True, (True, True),
577
(root_id, root_id), ('a', 'a'),
578
('file', 'file'), (False, False))],
573
579
self.do_iter_changes(tree1, tree2))
575
581
def test_meta_modification(self):
578
584
tree1 = self.get_tree_no_parents_abc_content(tree1)
579
585
tree2 = self.get_tree_no_parents_abc_content_3(tree2)
580
586
tree1, tree2 = self.mutable_trees_to_test_trees(tree1, tree2)
581
self.assertEqual([('c-id', 'b/c', False, (True, True),
582
('b-id', 'b-id'), ('c', 'c'), ('file', 'file'),
587
self.assertEqual([('c-id', ('b/c', 'b/c'), False, (True, True),
588
('b-id', 'b-id'), ('c', 'c'), ('file', 'file'),
584
590
self.do_iter_changes(tree1, tree2))
604
610
tree2 = self.get_tree_no_parents_abc_content_4(tree2)
605
611
tree1, tree2 = self.mutable_trees_to_test_trees(tree1, tree2)
606
612
root_id = tree1.path2id('')
607
self.assertEqual([('a-id', 'd', False, (True, True),
608
(root_id, root_id), ('a', 'd'), ('file', 'file'),
613
self.assertEqual([('a-id', ('a', 'd'), False, (True, True),
614
(root_id, root_id), ('a', 'd'), ('file', 'file'),
610
616
self.do_iter_changes(tree1, tree2))
612
618
def test_file_rename_and_modification(self):
616
622
tree2 = self.get_tree_no_parents_abc_content_5(tree2)
617
623
tree1, tree2 = self.mutable_trees_to_test_trees(tree1, tree2)
618
624
root_id = tree1.path2id('')
619
self.assertEqual([('a-id', 'd', True, (True, True),
620
(root_id, root_id), ('a', 'd'), ('file', 'file'),
625
self.assertEqual([('a-id', ('a', 'd'), True, (True, True),
626
(root_id, root_id), ('a', 'd'), ('file', 'file'),
621
627
(False, False))],
622
628
self.do_iter_changes(tree1, tree2))
628
634
tree2 = self.get_tree_no_parents_abc_content_6(tree2)
629
635
tree1, tree2 = self.mutable_trees_to_test_trees(tree1, tree2)
630
636
root_id = tree1.path2id('')
631
self.assertEqual([('c-id', 'e', False, (True, True),
632
('b-id', root_id), ('c', 'e'), ('file', 'file'),
637
self.assertEqual([('c-id', ('b/c', 'e'), False, (True, True),
638
('b-id', root_id), ('c', 'e'), ('file', 'file'),
634
640
self.do_iter_changes(tree1, tree2))
636
642
def test_missing_in_target(self):
645
651
tree1, tree2 = self.mutable_trees_to_test_trees(tree1, tree2)
646
652
root_id = tree1.path2id('')
647
653
expected = sorted([
648
self.missing('a-id', 'a', root_id, 'file'),
649
self.missing('b-id', 'b', root_id, 'directory'),
650
self.missing('c-id', 'b/c', 'b-id', 'file'),
654
self.missing('a-id', 'a', 'a', root_id, 'file'),
655
self.missing('b-id', 'b', 'b', root_id, 'directory'),
656
self.missing('c-id', 'b/c', 'b/c', 'b-id', 'file'),
658
self.assertEqual(expected, self.do_iter_changes(tree1, tree2))
660
def test_missing_and_renamed(self):
661
tree1 = self.make_branch_and_tree('tree1')
662
tree2 = self.make_to_branch_and_tree('tree2')
663
self.build_tree(['tree1/file'])
664
tree1.add(['file'], ['file-id'])
665
self.build_tree(['tree2/directory/'])
666
tree2.add(['directory'], ['file-id'])
667
os.rmdir('tree2/directory')
668
tree1, tree2 = self.mutable_trees_to_test_trees(tree1, tree2)
670
self.addCleanup(tree1.unlock)
672
self.addCleanup(tree2.unlock)
673
root_id = tree1.path2id('')
675
self.missing('file-id', 'file', 'directory', root_id, 'file'),
652
677
self.assertEqual(expected, self.do_iter_changes(tree1, tree2))
664
689
tree2.lock_read()
665
690
self.addCleanup(tree2.unlock)
666
691
self.assertEqual(sorted([self.unchanged(tree1, root_id),
667
self.unchanged(tree1, 'b-id'), ('a-id', 'd', True, (True, True),
668
(root_id, root_id), ('a', 'd'), ('file', 'file'),
692
self.unchanged(tree1, 'b-id'),
693
('a-id', ('a', 'd'), True, (True, True),
694
(root_id, root_id), ('a', 'd'), ('file', 'file'),
669
695
(False, False)), self.unchanged(tree1, 'c-id')]),
670
696
self.do_iter_changes(tree1, tree2, include_unchanged=True))