77
77
builder = tree.branch.get_commit_builder([])
79
builder.record_iter_changes(tree, tree.last_revision(),
80
tree.iter_changes(tree.basis_tree()))
79
list(builder.record_iter_changes(tree, tree.last_revision(),
80
tree.iter_changes(tree.basis_tree())))
81
81
builder.finish_inventory()
107
107
basis = tree.basis_tree()
108
108
last_rev = tree.last_revision()
109
109
changes = tree.iter_changes(basis)
110
builder.record_iter_changes(tree, last_rev, changes)
110
list(builder.record_iter_changes(tree, last_rev, changes))
111
111
builder.finish_inventory()
180
180
self.assertFalse(builder.random_revid)
182
builder.record_iter_changes(tree, tree.last_revision(),
183
tree.iter_changes(tree.basis_tree()))
182
list(builder.record_iter_changes(tree, tree.last_revision(),
183
tree.iter_changes(tree.basis_tree())))
184
184
builder.finish_inventory()
255
255
tree.lock_write()
256
256
builder = tree.branch.get_commit_builder([old_revision_id])
258
builder.record_iter_changes(tree, old_revision_id, [])
258
list(builder.record_iter_changes(tree, old_revision_id, []))
259
259
# Regardless of repository root behaviour we should consider this a
260
260
# pointless commit.
261
261
self.assertFalse(builder.any_changes())
393
393
delete_change = ('foo-id', ('foo', None), True, (True, False),
394
394
(tree.path2id(''), None), ('foo', None), ('file', None),
396
builder.record_iter_changes(tree, rev_id, [delete_change])
396
list(builder.record_iter_changes(tree, rev_id,
397
398
self.assertEqual(("foo", None, "foo-id", None),
398
399
builder._basis_delta[0])
399
400
self.assertTrue(builder.any_changes())
449
450
builder = tree.branch.get_commit_builder([])
451
builder.record_iter_changes(tree, _mod_revision.NULL_REVISION,
452
tree.iter_changes(tree.basis_tree()))
452
list(builder.record_iter_changes(tree,
453
_mod_revision.NULL_REVISION,
454
tree.iter_changes(tree.basis_tree())))
453
455
builder.finish_inventory()
454
456
rev_id = builder.commit('foo bar')
503
505
def _add_commit_check_unchanged(self, tree, name, mini_commit=None):
504
506
tree.add([name], [name + 'id'])
507
self._commit_check_unchanged(tree, name, name + 'id',
508
mini_commit=mini_commit)
510
def _commit_check_unchanged(self, tree, name, file_id, mini_commit=None):
505
511
rev1 = tree.commit('')
506
512
if mini_commit is None:
507
513
mini_commit = self.mini_commit
508
514
rev2 = mini_commit(tree, name, name, False, False)
509
515
tree1, tree2 = self._get_revtrees(tree, [rev1, rev2])
510
self.assertEqual(rev1, tree1.inventory[name + 'id'].revision)
511
self.assertEqual(rev1, tree2.inventory[name + 'id'].revision)
512
file_id = name + 'id'
516
self.assertEqual(rev1, tree1.inventory[file_id].revision)
517
self.assertEqual(rev1, tree2.inventory[file_id].revision)
513
518
expected_graph = {}
514
519
expected_graph[(file_id, rev1)] = ()
515
520
self.assertFileGraph(expected_graph, tree, (file_id, rev1))
573
578
self._add_commit_check_unchanged(tree, 'link',
574
579
mini_commit=self.mini_commit_record_iter_changes)
581
def test_last_modified_revision_after_commit_reference_unchanged(self):
582
# committing without changing a subtree does not change the last
584
tree = self.make_branch_and_tree('.')
585
subtree = self.make_reference('reference')
587
tree.add_reference(subtree)
588
self._commit_check_unchanged(tree, 'reference',
589
subtree.get_root_id())
590
except errors.UnsupportedOperation:
593
def test_last_modified_revision_after_commit_reference_unchanged_ric(self):
594
# committing without changing a subtree does not change the last
596
tree = self.make_branch_and_tree('.')
597
subtree = self.make_reference('reference')
599
tree.add_reference(subtree)
600
self._commit_check_unchanged(tree, 'reference',
601
subtree.get_root_id(),
602
mini_commit=self.mini_commit_record_iter_changes)
603
except errors.UnsupportedOperation:
576
606
def _add_commit_renamed_check_changed(self, tree, name,
577
607
expect_fs_hash=False, mini_commit=None):
579
609
tree.rename_one(name, 'new_' + name)
580
if mini_commit is None:
581
mini_commit = self.mini_commit
582
610
self._add_commit_change_check_changed(tree, name, rename,
583
611
expect_fs_hash=expect_fs_hash, mini_commit=mini_commit)
613
def _commit_renamed_check_changed(self, tree, name, file_id,
614
expect_fs_hash=False, mini_commit=None):
616
tree.rename_one(name, 'new_' + name)
617
self._commit_change_check_changed(tree, name, file_id, rename,
618
expect_fs_hash=expect_fs_hash, mini_commit=mini_commit)
585
620
def test_last_modified_revision_after_rename_dir_changes(self):
586
621
# renaming a dir changes the last modified.
587
622
tree = self.make_branch_and_tree('.')
625
660
self._add_commit_renamed_check_changed(tree, 'link',
626
661
mini_commit=self.mini_commit_record_iter_changes)
663
def test_last_modified_revision_after_rename_ref_changes(self):
664
# renaming a reference changes the last modified.
665
tree = self.make_branch_and_tree('.')
666
subtree = self.make_reference('reference')
668
tree.add_reference(subtree)
669
self._commit_renamed_check_changed(tree, 'reference',
670
subtree.get_root_id())
671
except errors.UnsupportedOperation:
674
def test_last_modified_revision_after_rename_ref_changes_ric(self):
675
# renaming a reference changes the last modified.
676
tree = self.make_branch_and_tree('.')
677
subtree = self.make_reference('reference')
679
tree.add_reference(subtree)
680
self._commit_renamed_check_changed(tree, 'reference',
681
subtree.get_root_id(),
682
mini_commit=self.mini_commit_record_iter_changes)
683
except errors.UnsupportedOperation:
628
686
def _add_commit_reparent_check_changed(self, tree, name,
629
687
expect_fs_hash=False, mini_commit=None):
630
688
self.build_tree(['newparent/'])
680
738
def _add_commit_change_check_changed(self, tree, name, changer,
681
739
expect_fs_hash=False, mini_commit=None):
682
740
tree.add([name], [name + 'id'])
741
self._commit_change_check_changed(tree, name, name + 'id',
742
changer, expect_fs_hash=expect_fs_hash, mini_commit=mini_commit)
744
def _commit_change_check_changed(self, tree, name, file_id, changer,
745
expect_fs_hash=False, mini_commit=None):
683
746
rev1 = tree.commit('')
685
748
if mini_commit is None:
686
749
mini_commit = self.mini_commit
687
rev2 = mini_commit(tree, name, tree.id2path(name + 'id'),
750
rev2 = mini_commit(tree, name, tree.id2path(file_id),
688
751
expect_fs_hash=expect_fs_hash)
689
752
tree1, tree2 = self._get_revtrees(tree, [rev1, rev2])
690
self.assertEqual(rev1, tree1.inventory[name + 'id'].revision)
691
self.assertEqual(rev2, tree2.inventory[name + 'id'].revision)
692
file_id = name + 'id'
753
self.assertEqual(rev1, tree1.inventory[file_id].revision)
754
self.assertEqual(rev2, tree2.inventory[file_id].revision)
693
755
expected_graph = {}
694
756
expected_graph[(file_id, rev1)] = ()
695
757
expected_graph[(file_id, rev2)] = ((file_id, rev1),)
732
794
path = tree.id2path(file_id)
733
795
ie = inventory.make_entry(tree.kind(file_id), old_ie.name,
734
796
old_ie.parent_id, file_id)
797
content_summary = tree.path_content_summary(path)
798
if content_summary[0] == 'tree-reference':
799
content_summary = content_summary[:3] + (
800
tree.get_reference_revision(file_id),)
735
801
return builder.record_entry_contents(ie, parent_invs, path,
736
tree, tree.path_content_summary(path))
802
tree, content_summary)
738
804
file_id = tree.path2id(new_name)
739
805
parent_id = tree.inventory[file_id].parent_id
803
869
parent_invs.append(tree.branch.repository.revision_tree(
804
870
parent_id).inventory)
805
871
changes = list(tree.iter_changes(parent_tree))
806
builder.record_iter_changes(tree, parent_ids[0], changes)
872
result = list(builder.record_iter_changes(tree, parent_ids[0],
874
file_id = tree.path2id(new_name)
876
tree_file_stat = tree.get_file_with_stat(file_id)
877
tree_file_stat[0].close()
878
self.assertLength(1, result)
880
self.assertEqual(result[:2], (file_id, new_name))
881
self.assertEqual(result[2][0], tree.get_file_sha1(file_id))
882
self.assertEqualStat(result[2][1], tree_file_stat[1])
884
self.assertEqual([], result)
807
885
delta = builder._basis_delta
808
886
delta_dict = dict((change[2], change) for change in delta)
809
file_id = tree.path2id(new_name)
810
887
version_recorded = (file_id in delta_dict and
811
888
delta_dict[file_id][3] is not None and
812
889
delta_dict[file_id][3].revision == builder._new_revision_id)
958
1035
# Make a merge which just incorporates a change from a branch:
959
1036
# The per-file graph is straight line, and no alteration occurs
960
1037
# in the inventory.
1038
# Part 1: change in the merged branch.
961
1039
rev1, tree2 = self._commit_sprout(tree1, name)
962
1040
# change on the other side to merge back
963
1041
rev2 = self._rename_in_tree(tree2, name)
964
1042
tree1.merge_from_branch(tree2.branch)
965
1043
if mini_commit is None:
966
1044
mini_commit = self.mini_commit
967
rev3 = mini_commit(tree1, name, 'new_' + name, False)
968
tree3, = self._get_revtrees(tree1, [rev2])
969
self.assertEqual(rev2, tree3.inventory[name + 'id'].revision)
970
file_id = name + 'id'
972
expected_graph[(file_id, rev1)] = ()
973
expected_graph[(file_id, rev2)] = ((file_id, rev1),)
974
self.assertFileGraph(expected_graph, tree1, (file_id, rev2))
1045
def _check_graph(in_tree, changed_in_tree):
1046
rev3 = mini_commit(in_tree, name, 'new_' + name, False,
1047
delta_against_basis=changed_in_tree)
1048
tree3, = self._get_revtrees(in_tree, [rev2])
1049
self.assertEqual(rev2, tree3.inventory[name + 'id'].revision)
1050
file_id = name + 'id'
1052
expected_graph[(file_id, rev1)] = ()
1053
expected_graph[(file_id, rev2)] = ((file_id, rev1),)
1054
self.assertFileGraph(expected_graph, in_tree, (file_id, rev2))
1055
_check_graph(tree1, True)
1056
# Part 2: change in the merged into branch - we use tree2 that has a
1057
# change to name, branch tree1 and give it an unrelated change, then
1059
other_tree = tree1.bzrdir.sprout('t3').open_workingtree()
1060
other_rev = other_tree.commit('')
1061
tree2.merge_from_branch(other_tree.branch)
1062
_check_graph(tree2, False)
976
1064
def _commit_sprout_make_merge(self, tree1, make, mini_commit=None):
977
1065
# Make a merge which incorporates the addition of a new object to
1079
1167
self.requireFeature(tests.SymlinkFeature)
1080
1168
os.symlink('target', name)
1170
def make_reference(self, name):
1171
tree = self.make_branch_and_tree(name, format='1.9-rich-root')
1082
1175
def _check_kind_change(self, make_before, make_after, expect_fs_hash=False,
1083
1176
mini_commit=None):
1084
1177
tree = self.make_branch_and_tree('.')