44
44
# set_path_id setting id when state is in memory modified
47
def load_tests(basic_tests, module, loader):
48
suite = loader.suiteClass()
49
dir_reader_tests, remaining_tests = tests.split_suite_by_condition(
50
basic_tests, tests.condition_isinstance(TestCaseWithDirState))
51
tests.multiply_tests(dir_reader_tests,
52
test_osutils.dir_reader_scenarios(), suite)
53
suite.addTest(remaining_tests)
57
47
class TestCaseWithDirState(tests.TestCaseWithTransport):
58
48
"""Helper functions for creating DirState objects with various content."""
61
_dir_reader_class = None
62
_native_to_unicode = None # Not used yet
65
tests.TestCaseWithTransport.setUp(self)
67
self.overrideAttr(osutils,
68
'_selected_dir_reader', self._dir_reader_class())
70
50
def create_empty_dirstate(self):
71
51
"""Return a locked but empty dirstate"""
72
52
state = dirstate.DirState.initialize('dirstate')
413
393
(('', '', tree.get_root_id()), # common details
414
394
[('d', '', 0, False, dirstate.DirState.NULLSTAT), # current tree
415
395
('d', '', 0, False, rev_id), # first parent details
416
('d', '', 0, False, rev_id), # second parent details
396
('d', '', 0, False, rev_id2), # second parent details
418
398
state = dirstate.DirState.from_tree(tree, 'dirstate')
419
399
self.check_state_with_reopen(expected_result, state)
494
474
(('', '', tree.get_root_id()), # common details
495
475
[('d', '', 0, False, dirstate.DirState.NULLSTAT), # current tree
496
476
('d', '', 0, False, rev_id), # first parent details
497
('d', '', 0, False, rev_id), # second parent details
477
('d', '', 0, False, rev_id2), # second parent details
499
479
(('', 'a file', 'a-file-id'), # common
500
480
[('f', '', 0, False, dirstate.DirState.NULLSTAT), # current
867
848
state = dirstate.DirState.initialize('dirstate')
869
850
# check precondition to be sure the state does change appropriately.
870
root_entry = (('', '', 'TREE_ROOT'), [('d', '', 0, False, 'x'*32)])
871
self.assertEqual([root_entry], list(state._iter_entries()))
872
self.assertEqual(root_entry, state._get_entry(0, path_utf8=''))
873
self.assertEqual(root_entry,
874
state._get_entry(0, fileid_utf8='TREE_ROOT'))
875
self.assertEqual((None, None),
876
state._get_entry(0, fileid_utf8='second-root-id'))
877
state.set_path_id('', 'second-root-id')
878
new_root_entry = (('', '', 'second-root-id'),
879
[('d', '', 0, False, 'x'*32)])
880
expected_rows = [new_root_entry]
852
[(('', '', 'TREE_ROOT'), [('d', '', 0, False,
853
'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx')])],
854
list(state._iter_entries()))
855
state.set_path_id('', 'foobarbaz')
857
(('', '', 'foobarbaz'), [('d', '', 0, False,
858
'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx')])]
881
859
self.assertEqual(expected_rows, list(state._iter_entries()))
882
self.assertEqual(new_root_entry, state._get_entry(0, path_utf8=''))
883
self.assertEqual(new_root_entry,
884
state._get_entry(0, fileid_utf8='second-root-id'))
885
self.assertEqual((None, None),
886
state._get_entry(0, fileid_utf8='TREE_ROOT'))
887
860
# should work across save too
907
880
state._validate()
909
882
state.set_parent_trees([('parent-revid', rt)], ghosts=[])
910
root_entry = (('', '', 'TREE_ROOT'),
911
[('d', '', 0, False, 'x'*32),
912
('d', '', 0, False, 'parent-revid')])
913
self.assertEqual(root_entry, state._get_entry(0, path_utf8=''))
914
self.assertEqual(root_entry,
915
state._get_entry(0, fileid_utf8='TREE_ROOT'))
916
self.assertEqual((None, None),
917
state._get_entry(0, fileid_utf8='Asecond-root-id'))
918
state.set_path_id('', 'Asecond-root-id')
883
state.set_path_id('', 'foobarbaz')
919
884
state._validate()
920
885
# now see that it is what we expected
921
old_root_entry = (('', '', 'TREE_ROOT'),
922
[('a', '', 0, False, ''),
923
('d', '', 0, False, 'parent-revid')])
924
new_root_entry = (('', '', 'Asecond-root-id'),
925
[('d', '', 0, False, ''),
926
('a', '', 0, False, '')])
927
expected_rows = [new_root_entry, old_root_entry]
887
(('', '', 'TREE_ROOT'),
888
[('a', '', 0, False, ''),
889
('d', '', 0, False, 'parent-revid'),
891
(('', '', 'foobarbaz'),
892
[('d', '', 0, False, ''),
893
('a', '', 0, False, ''),
928
896
state._validate()
929
897
self.assertEqual(expected_rows, list(state._iter_entries()))
930
self.assertEqual(new_root_entry, state._get_entry(0, path_utf8=''))
931
self.assertEqual(old_root_entry, state._get_entry(1, path_utf8=''))
932
self.assertEqual((None, None),
933
state._get_entry(0, fileid_utf8='TREE_ROOT'))
934
self.assertEqual(old_root_entry,
935
state._get_entry(1, fileid_utf8='TREE_ROOT'))
936
self.assertEqual(new_root_entry,
937
state._get_entry(0, fileid_utf8='Asecond-root-id'))
938
self.assertEqual((None, None),
939
state._get_entry(1, fileid_utf8='Asecond-root-id'))
940
898
# should work across save too
1017
976
[(('', '', root_id), [
1018
977
('d', '', 0, False, dirstate.DirState.NULLSTAT),
1019
978
('d', '', 0, False, revid1),
1020
('d', '', 0, False, revid1)
979
('d', '', 0, False, revid2)
1022
981
list(state._iter_entries()))
1051
1010
(('', '', root_id), [
1052
1011
('d', '', 0, False, dirstate.DirState.NULLSTAT),
1053
1012
('d', '', 0, False, revid1.encode('utf8')),
1054
('d', '', 0, False, revid1.encode('utf8'))
1013
('d', '', 0, False, revid2.encode('utf8'))
1056
1015
(('', 'a file', 'file-id'), [
1057
1016
('a', '', 0, False, ''),
1147
1106
state._validate()
1148
1107
self.assertEqual(expected_entries, list(state._iter_entries()))
1150
def _test_add_symlink_to_root_no_parents_all_data(self, link_name, target):
1109
def test_add_symlink_to_root_no_parents_all_data(self):
1151
1110
# The most trivial addition of a symlink when there are no parents and
1152
1111
# its in the root and all data about the file is supplied
1153
1112
# bzr doesn't support fake symlinks on windows, yet.
1154
1113
self.requireFeature(tests.SymlinkFeature)
1155
os.symlink(target, link_name)
1156
stat = os.lstat(link_name)
1114
os.symlink('target', 'a link')
1115
stat = os.lstat('a link')
1157
1116
expected_entries = [
1158
1117
(('', '', 'TREE_ROOT'), [
1159
1118
('d', '', 0, False, dirstate.DirState.NULLSTAT), # current tree
1161
(('', link_name.encode('UTF-8'), 'a link id'), [
1162
('l', target.encode('UTF-8'), stat[6],
1163
False, dirstate.pack_stat(stat)), # current tree
1120
(('', 'a link', 'a link id'), [
1121
('l', 'target', 6, False, dirstate.pack_stat(stat)), # current tree
1166
1124
state = dirstate.DirState.initialize('dirstate')
1168
state.add(link_name, 'a link id', 'symlink', stat,
1169
target.encode('UTF-8'))
1126
state.add('a link', 'a link id', 'symlink', stat, 'target')
1170
1127
# having added it, it should be in the output of iter_entries.
1171
1128
self.assertEqual(expected_entries, list(state._iter_entries()))
1172
1129
# saving and reloading should not affect this.
1178
1135
self.addCleanup(state.unlock)
1179
1136
self.assertEqual(expected_entries, list(state._iter_entries()))
1181
def test_add_symlink_to_root_no_parents_all_data(self):
1182
self._test_add_symlink_to_root_no_parents_all_data('a link', 'target')
1184
def test_add_symlink_unicode_to_root_no_parents_all_data(self):
1185
self.requireFeature(tests.UnicodeFilenameFeature)
1186
self._test_add_symlink_to_root_no_parents_all_data(
1187
u'\N{Euro Sign}link', u'targ\N{Euro Sign}et')
1189
1138
def test_add_directory_and_child_no_parents_all_data(self):
1190
1139
# after adding a directory, we should be able to add children to it.
1191
1140
self.build_tree(['a dir/', 'a dir/a file'])
1253
1202
self.assertRaises(errors.BzrError,
1254
1203
state.add, '..', 'ass-id', 'directory', None, None)
1256
def test_set_state_with_rename_b_a_bug_395556(self):
1257
# bug 395556 uncovered a bug where the dirstate ends up with a false
1258
# relocation record - in a tree with no parents there should be no
1259
# absent or relocated records. This then leads to further corruption
1260
# when a commit occurs, as the incorrect relocation gathers an
1261
# incorrect absent in tree 1, and future changes go to pot.
1262
tree1 = self.make_branch_and_tree('tree1')
1263
self.build_tree(['tree1/b'])
1266
tree1.add(['b'], ['b-id'])
1267
root_id = tree1.get_root_id()
1268
inv = tree1.inventory
1269
state = dirstate.DirState.initialize('dirstate')
1271
# Set the initial state with 'b'
1272
state.set_state_from_inventory(inv)
1273
inv.rename('b-id', root_id, 'a')
1274
# Set the new state with 'a', which currently corrupts.
1275
state.set_state_from_inventory(inv)
1276
expected_result1 = [('', '', root_id, 'd'),
1277
('', 'a', 'b-id', 'f'),
1280
for entry in state._iter_entries():
1281
values.append(entry[0] + entry[1][0][:1])
1282
self.assertEqual(expected_result1, values)
1289
1206
class TestGetLines(TestCaseWithDirState):
2287
2204
self.assertIsInstance(tree_data, str)
2289
2206
def test_unicode_symlink(self):
2290
inv_entry = inventory.InventoryLink('link-file-id',
2291
u'nam\N{Euro Sign}e',
2207
# In general, the code base doesn't support a target that contains
2208
# non-ascii characters. So we just assert tha
2209
inv_entry = inventory.InventoryLink('link-file-id', 'name',
2292
2210
'link-parent-id')
2293
2211
inv_entry.revision = 'link-revision-id'
2294
target = u'link-targ\N{Euro Sign}t'
2295
inv_entry.symlink_target = target
2296
self.assertDetails(('l', target.encode('UTF-8'), 0, False,
2297
'link-revision-id'), inv_entry)
2212
inv_entry.symlink_target = u'link-target'
2213
details = self.assertDetails(('l', 'link-target', 0, False,
2214
'link-revision-id'), inv_entry)
2300
2217
class TestSHA1Provider(tests.TestCaseInTempDir):