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
# 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()
76
50
def create_empty_dirstate(self):
77
51
"""Return a locked but empty dirstate"""
78
52
state = dirstate.DirState.initialize('dirstate')
1130
1106
state._validate()
1131
1107
self.assertEqual(expected_entries, list(state._iter_entries()))
1133
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):
1134
1110
# The most trivial addition of a symlink when there are no parents and
1135
1111
# its in the root and all data about the file is supplied
1136
1112
# bzr doesn't support fake symlinks on windows, yet.
1137
1113
self.requireFeature(tests.SymlinkFeature)
1138
os.symlink(target, link_name)
1139
stat = os.lstat(link_name)
1114
os.symlink('target', 'a link')
1115
stat = os.lstat('a link')
1140
1116
expected_entries = [
1141
1117
(('', '', 'TREE_ROOT'), [
1142
1118
('d', '', 0, False, dirstate.DirState.NULLSTAT), # 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
1120
(('', 'a link', 'a link id'), [
1121
('l', 'target', 6, False, dirstate.pack_stat(stat)), # current tree
1149
1124
state = dirstate.DirState.initialize('dirstate')
1151
state.add(link_name, 'a link id', 'symlink', stat,
1152
target.encode('UTF-8'))
1126
state.add('a link', 'a link id', 'symlink', stat, 'target')
1153
1127
# having added it, it should be in the output of iter_entries.
1154
1128
self.assertEqual(expected_entries, list(state._iter_entries()))
1155
1129
# saving and reloading should not affect this.
1161
1135
self.addCleanup(state.unlock)
1162
1136
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')
1172
1138
def test_add_directory_and_child_no_parents_all_data(self):
1173
1139
# after adding a directory, we should be able to add children to it.
1174
1140
self.build_tree(['a dir/', 'a dir/a file'])
1236
1202
self.assertRaises(errors.BzrError,
1237
1203
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)
1272
1206
class TestGetLines(TestCaseWithDirState):
2270
2204
self.assertIsInstance(tree_data, str)
2272
2206
def test_unicode_symlink(self):
2273
inv_entry = inventory.InventoryLink('link-file-id',
2274
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',
2275
2210
'link-parent-id')
2276
2211
inv_entry.revision = 'link-revision-id'
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)
2212
inv_entry.symlink_target = u'link-target'
2213
details = self.assertDetails(('l', 'link-target', 0, False,
2214
'link-revision-id'), inv_entry)
2283
2217
class TestSHA1Provider(tests.TestCaseInTempDir):