419
413
(('', '', tree.get_root_id()), # common details
420
414
[('d', '', 0, False, dirstate.DirState.NULLSTAT), # current tree
421
415
('d', '', 0, False, rev_id), # first parent details
422
('d', '', 0, False, rev_id2), # second parent details
416
('d', '', 0, False, rev_id), # second parent details
424
418
state = dirstate.DirState.from_tree(tree, 'dirstate')
425
419
self.check_state_with_reopen(expected_result, state)
500
494
(('', '', tree.get_root_id()), # common details
501
495
[('d', '', 0, False, dirstate.DirState.NULLSTAT), # current tree
502
496
('d', '', 0, False, rev_id), # first parent details
503
('d', '', 0, False, rev_id2), # second parent details
497
('d', '', 0, False, rev_id), # second parent details
505
499
(('', 'a file', 'a-file-id'), # common
506
500
[('f', '', 0, False, dirstate.DirState.NULLSTAT), # current
737
731
class TestDirStateManipulations(TestCaseWithDirState):
733
def test_update_minimal_updates_id_index(self):
734
state = self.create_dirstate_with_root_and_subdir()
735
self.addCleanup(state.unlock)
736
id_index = state._get_id_index()
737
self.assertEqual(['a-root-value', 'subdir-id'], sorted(id_index))
738
state.add('file-name', 'file-id', 'file', None, '')
739
self.assertEqual(['a-root-value', 'file-id', 'subdir-id'],
741
state.update_minimal(('', 'new-name', 'file-id'), 'f',
742
path_utf8='new-name')
743
self.assertEqual(['a-root-value', 'file-id', 'subdir-id'],
745
self.assertEqual([('', 'new-name', 'file-id')],
746
sorted(id_index['file-id']))
739
749
def test_set_state_from_inventory_no_content_no_parents(self):
740
750
# setting the current inventory is a slow but important api to support.
741
751
tree1 = self.make_branch_and_memory_tree('tree1')
874
883
state = dirstate.DirState.initialize('dirstate')
876
885
# check precondition to be sure the state does change appropriately.
878
[(('', '', 'TREE_ROOT'), [('d', '', 0, False,
879
'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx')])],
880
list(state._iter_entries()))
881
state.set_path_id('', 'foobarbaz')
883
(('', '', 'foobarbaz'), [('d', '', 0, False,
884
'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx')])]
886
root_entry = (('', '', 'TREE_ROOT'), [('d', '', 0, False, 'x'*32)])
887
self.assertEqual([root_entry], list(state._iter_entries()))
888
self.assertEqual(root_entry, state._get_entry(0, path_utf8=''))
889
self.assertEqual(root_entry,
890
state._get_entry(0, fileid_utf8='TREE_ROOT'))
891
self.assertEqual((None, None),
892
state._get_entry(0, fileid_utf8='second-root-id'))
893
state.set_path_id('', 'second-root-id')
894
new_root_entry = (('', '', 'second-root-id'),
895
[('d', '', 0, False, 'x'*32)])
896
expected_rows = [new_root_entry]
885
897
self.assertEqual(expected_rows, list(state._iter_entries()))
898
self.assertEqual(new_root_entry, state._get_entry(0, path_utf8=''))
899
self.assertEqual(new_root_entry,
900
state._get_entry(0, fileid_utf8='second-root-id'))
901
self.assertEqual((None, None),
902
state._get_entry(0, fileid_utf8='TREE_ROOT'))
886
903
# should work across save too
906
923
state._validate()
908
925
state.set_parent_trees([('parent-revid', rt)], ghosts=[])
909
state.set_path_id('', 'foobarbaz')
926
root_entry = (('', '', 'TREE_ROOT'),
927
[('d', '', 0, False, 'x'*32),
928
('d', '', 0, False, 'parent-revid')])
929
self.assertEqual(root_entry, state._get_entry(0, path_utf8=''))
930
self.assertEqual(root_entry,
931
state._get_entry(0, fileid_utf8='TREE_ROOT'))
932
self.assertEqual((None, None),
933
state._get_entry(0, fileid_utf8='Asecond-root-id'))
934
state.set_path_id('', 'Asecond-root-id')
910
935
state._validate()
911
936
# now see that it is what we expected
913
(('', '', 'TREE_ROOT'),
914
[('a', '', 0, False, ''),
915
('d', '', 0, False, 'parent-revid'),
917
(('', '', 'foobarbaz'),
918
[('d', '', 0, False, ''),
919
('a', '', 0, False, ''),
937
old_root_entry = (('', '', 'TREE_ROOT'),
938
[('a', '', 0, False, ''),
939
('d', '', 0, False, 'parent-revid')])
940
new_root_entry = (('', '', 'Asecond-root-id'),
941
[('d', '', 0, False, ''),
942
('a', '', 0, False, '')])
943
expected_rows = [new_root_entry, old_root_entry]
922
944
state._validate()
923
945
self.assertEqual(expected_rows, list(state._iter_entries()))
946
self.assertEqual(new_root_entry, state._get_entry(0, path_utf8=''))
947
self.assertEqual(old_root_entry, state._get_entry(1, path_utf8=''))
948
self.assertEqual((None, None),
949
state._get_entry(0, fileid_utf8='TREE_ROOT'))
950
self.assertEqual(old_root_entry,
951
state._get_entry(1, fileid_utf8='TREE_ROOT'))
952
self.assertEqual(new_root_entry,
953
state._get_entry(0, fileid_utf8='Asecond-root-id'))
954
self.assertEqual((None, None),
955
state._get_entry(1, fileid_utf8='Asecond-root-id'))
924
956
# should work across save too
1002
1033
[(('', '', root_id), [
1003
1034
('d', '', 0, False, dirstate.DirState.NULLSTAT),
1004
1035
('d', '', 0, False, revid1),
1005
('d', '', 0, False, revid2)
1036
('d', '', 0, False, revid1)
1007
1038
list(state._iter_entries()))
1036
1067
(('', '', root_id), [
1037
1068
('d', '', 0, False, dirstate.DirState.NULLSTAT),
1038
1069
('d', '', 0, False, revid1.encode('utf8')),
1039
('d', '', 0, False, revid2.encode('utf8'))
1070
('d', '', 0, False, revid1.encode('utf8'))
1041
1072
(('', 'a file', 'file-id'), [
1042
1073
('a', '', 0, False, ''),
1238
1269
self.assertRaises(errors.BzrError,
1239
1270
state.add, '..', 'ass-id', 'directory', None, None)
1272
def test_set_state_with_rename_b_a_bug_395556(self):
1273
# bug 395556 uncovered a bug where the dirstate ends up with a false
1274
# relocation record - in a tree with no parents there should be no
1275
# absent or relocated records. This then leads to further corruption
1276
# when a commit occurs, as the incorrect relocation gathers an
1277
# incorrect absent in tree 1, and future changes go to pot.
1278
tree1 = self.make_branch_and_tree('tree1')
1279
self.build_tree(['tree1/b'])
1282
tree1.add(['b'], ['b-id'])
1283
root_id = tree1.get_root_id()
1284
inv = tree1.inventory
1285
state = dirstate.DirState.initialize('dirstate')
1287
# Set the initial state with 'b'
1288
state.set_state_from_inventory(inv)
1289
inv.rename('b-id', root_id, 'a')
1290
# Set the new state with 'a', which currently corrupts.
1291
state.set_state_from_inventory(inv)
1292
expected_result1 = [('', '', root_id, 'd'),
1293
('', 'a', 'b-id', 'f'),
1296
for entry in state._iter_entries():
1297
values.append(entry[0] + entry[1][0][:1])
1298
self.assertEqual(expected_result1, values)
1242
1305
class TestGetLines(TestCaseWithDirState):