~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to bzrlib/tests/test_dirstate.py

  • Committer: Canonical.com Patch Queue Manager
  • Date: 2010-09-29 22:03:03 UTC
  • mfrom: (5416.2.6 jam-integration)
  • Revision ID: pqm@pqm.ubuntu.com-20100929220303-cr95h8iwtggco721
(mbp) Add 'break-lock --force'

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
 
# Copyright (C) 2006, 2007 Canonical Ltd
 
1
# Copyright (C) 2006-2010 Canonical Ltd
2
2
#
3
3
# This program is free software; you can redistribute it and/or modify
4
4
# it under the terms of the GNU General Public License as published by
64
64
    def setUp(self):
65
65
        tests.TestCaseWithTransport.setUp(self)
66
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()
 
67
        self.overrideAttr(osutils,
 
68
                          '_selected_dir_reader', self._dir_reader_class())
75
69
 
76
70
    def create_empty_dirstate(self):
77
71
        """Return a locked but empty dirstate"""
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
423
417
             ])])
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
504
498
             ]),
505
499
            (('', 'a file', 'a-file-id'), # common
506
500
             [('f', '', 0, False, dirstate.DirState.NULLSTAT), # current
736
730
 
737
731
class TestDirStateManipulations(TestCaseWithDirState):
738
732
 
 
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'],
 
740
                         sorted(id_index))
 
741
        state.update_minimal(('', 'new-name', 'file-id'), 'f',
 
742
                             path_utf8='new-name')
 
743
        self.assertEqual(['a-root-value', 'file-id', 'subdir-id'],
 
744
                         sorted(id_index))
 
745
        self.assertEqual([('', 'new-name', 'file-id')],
 
746
                         sorted(id_index['file-id']))
 
747
        state._validate()
 
748
 
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')
827
837
        finally:
828
838
            tree.unlock()
829
839
 
830
 
 
831
840
    def test_set_state_from_inventory_mixed_paths(self):
832
841
        tree1 = self.make_branch_and_tree('tree1')
833
842
        self.build_tree(['tree1/a/', 'tree1/a/b/', 'tree1/a-b/',
874
883
        state = dirstate.DirState.initialize('dirstate')
875
884
        try:
876
885
            # check precondition to be sure the state does change appropriately.
877
 
            self.assertEqual(
878
 
                [(('', '', 'TREE_ROOT'), [('d', '', 0, False,
879
 
                   'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx')])],
880
 
                list(state._iter_entries()))
881
 
            state.set_path_id('', 'foobarbaz')
882
 
            expected_rows = [
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
887
904
            state.save()
888
905
        finally:
906
923
        state._validate()
907
924
        try:
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
912
 
            expected_rows = [
913
 
                (('', '', 'TREE_ROOT'),
914
 
                    [('a', '', 0, False, ''),
915
 
                     ('d', '', 0, False, 'parent-revid'),
916
 
                     ]),
917
 
                (('', '', 'foobarbaz'),
918
 
                    [('d', '', 0, False, ''),
919
 
                     ('a', '', 0, False, ''),
920
 
                     ]),
921
 
                ]
 
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
925
957
            state.save()
926
958
        finally:
942
974
        finally:
943
975
            state.unlock()
944
976
 
945
 
 
946
977
    def test_set_parent_trees_no_content(self):
947
978
        # set_parent_trees is a slow but important api to support.
948
979
        tree1 = self.make_branch_and_memory_tree('tree1')
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)
1006
1037
                  ])],
1007
1038
                list(state._iter_entries()))
1008
1039
        finally:
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'))
1040
1071
             ]),
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)
1240
1271
 
 
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'])
 
1280
        tree1.lock_write()
 
1281
        try:
 
1282
            tree1.add(['b'], ['b-id'])
 
1283
            root_id = tree1.get_root_id()
 
1284
            inv = tree1.inventory
 
1285
            state = dirstate.DirState.initialize('dirstate')
 
1286
            try:
 
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'),
 
1294
                                   ]
 
1295
                values = []
 
1296
                for entry in state._iter_entries():
 
1297
                    values.append(entry[0] + entry[1][0][:1])
 
1298
                self.assertEqual(expected_result1, values)
 
1299
            finally:
 
1300
                state.unlock()
 
1301
        finally:
 
1302
            tree1.unlock()
 
1303
 
1241
1304
 
1242
1305
class TestGetLines(TestCaseWithDirState):
1243
1306