~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to bzrlib/tests/test_dirstate.py

  • Committer: Joe Julian
  • Date: 2010-01-10 02:25:31 UTC
  • mto: (4634.119.7 2.0)
  • mto: This revision was merged to the branch mainline in revision 4959.
  • Revision ID: joe@julianfamily.org-20100110022531-wqk61rsagz8xsiga
Added MANIFEST.in to allow bdist_rpm to have all the required include files and tools. bdist_rpm will still fail to build correctly on some distributions due to a disttools bug http://bugs.python.org/issue644744

Show diffs side-by-side

added added

removed removed

Lines of Context:
44
44
# set_path_id  setting id when state is in memory modified
45
45
 
46
46
 
 
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)
 
54
    return suite
 
55
 
 
56
 
47
57
class TestCaseWithDirState(tests.TestCaseWithTransport):
48
58
    """Helper functions for creating DirState objects with various content."""
49
59
 
 
60
    # Set by load_tests
 
61
    _dir_reader_class = None
 
62
    _native_to_unicode = None # Not used yet
 
63
 
 
64
    def setUp(self):
 
65
        tests.TestCaseWithTransport.setUp(self)
 
66
 
 
67
        # Save platform specific info and reset it
 
68
        cur_dir_reader = osutils._selected_dir_reader
 
69
 
 
70
        def restore():
 
71
            osutils._selected_dir_reader = cur_dir_reader
 
72
        self.addCleanup(restore)
 
73
 
 
74
        osutils._selected_dir_reader = self._dir_reader_class()
 
75
 
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
397
423
             ])])
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
478
504
             ]),
479
505
            (('', 'a file', 'a-file-id'), # common
480
506
             [('f', '', 0, False, dirstate.DirState.NULLSTAT), # current
801
827
        finally:
802
828
            tree.unlock()
803
829
 
804
 
 
805
830
    def test_set_state_from_inventory_mixed_paths(self):
806
831
        tree1 = self.make_branch_and_tree('tree1')
807
832
        self.build_tree(['tree1/a/', 'tree1/a/b/', 'tree1/a-b/',
916
941
        finally:
917
942
            state.unlock()
918
943
 
919
 
 
920
944
    def test_set_parent_trees_no_content(self):
921
945
        # set_parent_trees is a slow but important api to support.
922
946
        tree1 = self.make_branch_and_memory_tree('tree1')
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)
980
1004
                  ])],
981
1005
                list(state._iter_entries()))
982
1006
        finally:
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'))
1014
1038
             ]),
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()))
1108
1132
 
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
1119
1143
             ]),
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
1122
1147
             ]),
1123
1148
            ]
1124
1149
        state = dirstate.DirState.initialize('dirstate')
1125
1150
        try:
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()))
1137
1163
 
 
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')
 
1166
 
 
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')
 
1171
 
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)
1204
1238
 
 
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'])
 
1247
        tree1.lock_write()
 
1248
        try:
 
1249
            tree1.add(['b'], ['b-id'])
 
1250
            root_id = tree1.get_root_id()
 
1251
            inv = tree1.inventory
 
1252
            state = dirstate.DirState.initialize('dirstate')
 
1253
            try:
 
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'),
 
1261
                                   ]
 
1262
                values = []
 
1263
                for entry in state._iter_entries():
 
1264
                    values.append(entry[0] + entry[1][0][:1])
 
1265
                self.assertEqual(expected_result1, values)
 
1266
            finally:
 
1267
                state.unlock()
 
1268
        finally:
 
1269
            tree1.unlock()
 
1270
 
1205
1271
 
1206
1272
class TestGetLines(TestCaseWithDirState):
1207
1273
 
2204
2270
        self.assertIsInstance(tree_data, str)
2205
2271
 
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)
2215
2281
 
2216
2282
 
2217
2283
class TestSHA1Provider(tests.TestCaseInTempDir):