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)
47
57
class TestCaseWithDirState(tests.TestCaseWithTransport):
48
58
"""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
# Save platform specific info and reset it
68
cur_dir_reader = osutils._selected_dir_reader
71
osutils._selected_dir_reader = cur_dir_reader
72
self.addCleanup(restore)
74
osutils._selected_dir_reader = self._dir_reader_class()
50
76
def create_empty_dirstate(self):
51
77
"""Return a locked but empty dirstate"""
52
78
state = dirstate.DirState.initialize('dirstate')
393
419
(('', '', tree.get_root_id()), # common details
394
420
[('d', '', 0, False, dirstate.DirState.NULLSTAT), # current tree
395
421
('d', '', 0, False, rev_id), # first parent details
396
('d', '', 0, False, rev_id2), # second parent details
422
('d', '', 0, False, rev_id), # second parent details
398
424
state = dirstate.DirState.from_tree(tree, 'dirstate')
399
425
self.check_state_with_reopen(expected_result, state)
474
500
(('', '', tree.get_root_id()), # common details
475
501
[('d', '', 0, False, dirstate.DirState.NULLSTAT), # current tree
476
502
('d', '', 0, False, rev_id), # first parent details
477
('d', '', 0, False, rev_id2), # second parent details
503
('d', '', 0, False, rev_id), # second parent details
479
505
(('', 'a file', 'a-file-id'), # common
480
506
[('f', '', 0, False, dirstate.DirState.NULLSTAT), # current
976
1000
[(('', '', root_id), [
977
1001
('d', '', 0, False, dirstate.DirState.NULLSTAT),
978
1002
('d', '', 0, False, revid1),
979
('d', '', 0, False, revid2)
1003
('d', '', 0, False, revid1)
981
1005
list(state._iter_entries()))
1010
1034
(('', '', root_id), [
1011
1035
('d', '', 0, False, dirstate.DirState.NULLSTAT),
1012
1036
('d', '', 0, False, revid1.encode('utf8')),
1013
('d', '', 0, False, revid2.encode('utf8'))
1037
('d', '', 0, False, revid1.encode('utf8'))
1015
1039
(('', 'a file', 'file-id'), [
1016
1040
('a', '', 0, False, ''),
1106
1130
state._validate()
1107
1131
self.assertEqual(expected_entries, list(state._iter_entries()))
1109
def test_add_symlink_to_root_no_parents_all_data(self):
1133
def _test_add_symlink_to_root_no_parents_all_data(self, link_name, target):
1110
1134
# The most trivial addition of a symlink when there are no parents and
1111
1135
# its in the root and all data about the file is supplied
1112
1136
# bzr doesn't support fake symlinks on windows, yet.
1113
1137
self.requireFeature(tests.SymlinkFeature)
1114
os.symlink('target', 'a link')
1115
stat = os.lstat('a link')
1138
os.symlink(target, link_name)
1139
stat = os.lstat(link_name)
1116
1140
expected_entries = [
1117
1141
(('', '', 'TREE_ROOT'), [
1118
1142
('d', '', 0, False, dirstate.DirState.NULLSTAT), # current tree
1120
(('', 'a link', 'a link id'), [
1121
('l', 'target', 6, False, dirstate.pack_stat(stat)), # current tree
1144
(('', link_name.encode('UTF-8'), 'a link id'), [
1145
('l', target.encode('UTF-8'), stat[6],
1146
False, dirstate.pack_stat(stat)), # current tree
1124
1149
state = dirstate.DirState.initialize('dirstate')
1126
state.add('a link', 'a link id', 'symlink', stat, 'target')
1151
state.add(link_name, 'a link id', 'symlink', stat,
1152
target.encode('UTF-8'))
1127
1153
# having added it, it should be in the output of iter_entries.
1128
1154
self.assertEqual(expected_entries, list(state._iter_entries()))
1129
1155
# saving and reloading should not affect this.
1135
1161
self.addCleanup(state.unlock)
1136
1162
self.assertEqual(expected_entries, list(state._iter_entries()))
1164
def test_add_symlink_to_root_no_parents_all_data(self):
1165
self._test_add_symlink_to_root_no_parents_all_data('a link', 'target')
1167
def test_add_symlink_unicode_to_root_no_parents_all_data(self):
1168
self.requireFeature(tests.UnicodeFilenameFeature)
1169
self._test_add_symlink_to_root_no_parents_all_data(
1170
u'\N{Euro Sign}link', u'targ\N{Euro Sign}et')
1138
1172
def test_add_directory_and_child_no_parents_all_data(self):
1139
1173
# after adding a directory, we should be able to add children to it.
1140
1174
self.build_tree(['a dir/', 'a dir/a file'])
1202
1236
self.assertRaises(errors.BzrError,
1203
1237
state.add, '..', 'ass-id', 'directory', None, None)
1239
def test_set_state_with_rename_b_a_bug_395556(self):
1240
# bug 395556 uncovered a bug where the dirstate ends up with a false
1241
# relocation record - in a tree with no parents there should be no
1242
# absent or relocated records. This then leads to further corruption
1243
# when a commit occurs, as the incorrect relocation gathers an
1244
# incorrect absent in tree 1, and future changes go to pot.
1245
tree1 = self.make_branch_and_tree('tree1')
1246
self.build_tree(['tree1/b'])
1249
tree1.add(['b'], ['b-id'])
1250
root_id = tree1.get_root_id()
1251
inv = tree1.inventory
1252
state = dirstate.DirState.initialize('dirstate')
1254
# Set the initial state with 'b'
1255
state.set_state_from_inventory(inv)
1256
inv.rename('b-id', root_id, 'a')
1257
# Set the new state with 'a', which currently corrupts.
1258
state.set_state_from_inventory(inv)
1259
expected_result1 = [('', '', root_id, 'd'),
1260
('', 'a', 'b-id', 'f'),
1263
for entry in state._iter_entries():
1264
values.append(entry[0] + entry[1][0][:1])
1265
self.assertEqual(expected_result1, values)
1206
1272
class TestGetLines(TestCaseWithDirState):
2204
2270
self.assertIsInstance(tree_data, str)
2206
2272
def test_unicode_symlink(self):
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',
2273
inv_entry = inventory.InventoryLink('link-file-id',
2274
u'nam\N{Euro Sign}e',
2210
2275
'link-parent-id')
2211
2276
inv_entry.revision = 'link-revision-id'
2212
inv_entry.symlink_target = u'link-target'
2213
details = self.assertDetails(('l', 'link-target', 0, False,
2214
'link-revision-id'), inv_entry)
2277
target = u'link-targ\N{Euro Sign}t'
2278
inv_entry.symlink_target = target
2279
self.assertDetails(('l', target.encode('UTF-8'), 0, False,
2280
'link-revision-id'), inv_entry)
2217
2283
class TestSHA1Provider(tests.TestCaseInTempDir):