~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to bzrlib/tests/test_dirstate.py

  • Committer: Tarmac
  • Author(s): Vincent Ladeuil
  • Date: 2017-01-30 14:42:05 UTC
  • mfrom: (6620.1.1 trunk)
  • Revision ID: tarmac-20170130144205-r8fh2xpmiuxyozpv
Merge  2.7 into trunk including fix for bug #1657238 [r=vila]

Show diffs side-by-side

added added

removed removed

Lines of Context:
20
20
import tempfile
21
21
 
22
22
from bzrlib import (
23
 
    bzrdir,
 
23
    controldir,
24
24
    dirstate,
25
25
    errors,
26
26
    inventory,
31
31
    tests,
32
32
    workingtree_4,
33
33
    )
34
 
from bzrlib.transport import memory
35
 
from bzrlib.tests import test_osutils
 
34
from bzrlib.tests import (
 
35
    features,
 
36
    test_osutils,
 
37
    )
36
38
from bzrlib.tests.scenarios import load_tests_apply_scenarios
37
39
 
38
40
 
62
64
    _native_to_unicode = None # Not used yet
63
65
 
64
66
    def setUp(self):
65
 
        tests.TestCaseWithTransport.setUp(self)
66
 
 
 
67
        super(TestCaseWithDirState, self).setUp()
67
68
        self.overrideAttr(osutils,
68
69
                          '_selected_dir_reader', self._dir_reader_class())
69
70
 
753
754
    def test_set_state_from_inventory_no_content_no_parents(self):
754
755
        # setting the current inventory is a slow but important api to support.
755
756
        tree1, revid1 = self.make_minimal_tree()
756
 
        inv = tree1.inventory
 
757
        inv = tree1.root_inventory
757
758
        root_id = inv.path2id('')
758
759
        expected_result = [], [
759
760
            (('', '', root_id), [
774
775
 
775
776
    def test_set_state_from_scratch_no_parents(self):
776
777
        tree1, revid1 = self.make_minimal_tree()
777
 
        inv = tree1.inventory
 
778
        inv = tree1.root_inventory
778
779
        root_id = inv.path2id('')
779
780
        expected_result = [], [
780
781
            (('', '', root_id), [
795
796
 
796
797
    def test_set_state_from_scratch_identical_parent(self):
797
798
        tree1, revid1 = self.make_minimal_tree()
798
 
        inv = tree1.inventory
 
799
        inv = tree1.root_inventory
799
800
        root_id = inv.path2id('')
800
801
        rev_tree1 = tree1.branch.repository.revision_tree(revid1)
801
802
        d_entry = ('d', '', 0, False, dirstate.DirState.NULLSTAT)
853
854
                tree._dirstate._get_entry(0, 'foo-id'))
854
855
 
855
856
            # extract the inventory, and add something to it
856
 
            inv = tree._get_inventory()
 
857
            inv = tree._get_root_inventory()
857
858
            # should see the file we poked in...
858
859
            self.assertTrue(inv.has_id('foo-id'))
859
860
            self.assertTrue(inv.has_filename('foo'))
889
890
                      ['a-id', 'b-id', 'a-b-id', 'foo-id', 'bar-id'])
890
891
            tree1.commit('rev1', rev_id='rev1')
891
892
            root_id = tree1.get_root_id()
892
 
            inv = tree1.inventory
 
893
            inv = tree1.root_inventory
893
894
        finally:
894
895
            tree1.unlock()
895
896
        expected_result1 = [('', '', root_id, 'd'),
1209
1210
        # The most trivial addition of a symlink when there are no parents and
1210
1211
        # its in the root and all data about the file is supplied
1211
1212
        # bzr doesn't support fake symlinks on windows, yet.
1212
 
        self.requireFeature(tests.SymlinkFeature)
 
1213
        self.requireFeature(features.SymlinkFeature)
1213
1214
        os.symlink(target, link_name)
1214
1215
        stat = os.lstat(link_name)
1215
1216
        expected_entries = [
1240
1241
        self._test_add_symlink_to_root_no_parents_all_data('a link', 'target')
1241
1242
 
1242
1243
    def test_add_symlink_unicode_to_root_no_parents_all_data(self):
1243
 
        self.requireFeature(tests.UnicodeFilenameFeature)
 
1244
        self.requireFeature(features.UnicodeFilenameFeature)
1244
1245
        self._test_add_symlink_to_root_no_parents_all_data(
1245
1246
            u'\N{Euro Sign}link', u'targ\N{Euro Sign}et')
1246
1247
 
1323
1324
        try:
1324
1325
            tree1.add(['b'], ['b-id'])
1325
1326
            root_id = tree1.get_root_id()
1326
 
            inv = tree1.inventory
 
1327
            inv = tree1.root_inventory
1327
1328
            state = dirstate.DirState.initialize('dirstate')
1328
1329
            try:
1329
1330
                # Set the initial state with 'b'
2207
2208
class TestDirstateTreeReference(TestCaseWithDirState):
2208
2209
 
2209
2210
    def test_reference_revision_is_none(self):
2210
 
        tree = self.make_branch_and_tree('tree', format='dirstate-with-subtree')
 
2211
        tree = self.make_branch_and_tree('tree', format='development-subtree')
2211
2212
        subtree = self.make_branch_and_tree('tree/subtree',
2212
 
                            format='dirstate-with-subtree')
 
2213
                            format='development-subtree')
2213
2214
        subtree.set_root_id('subtree')
2214
2215
        tree.add_reference(subtree)
2215
2216
        tree.add('subtree')
2441
2442
    """A minimal api to get InventoryRevisionTree to work."""
2442
2443
 
2443
2444
    def __init__(self):
2444
 
        default_format = bzrdir.format_registry.make_bzrdir('default')
 
2445
        default_format = controldir.format_registry.make_bzrdir('default')
2445
2446
        self._format = default_format.repository_format
2446
2447
 
2447
2448
    def lock_read(self):
2477
2478
    def create_tree_from_shape(self, rev_id, shape):
2478
2479
        dir_ids = {'': 'root-id'}
2479
2480
        inv = inventory.Inventory('root-id', rev_id)
2480
 
        for path, file_id in shape:
 
2481
        for info in shape:
 
2482
            if len(info) == 2:
 
2483
                path, file_id = info
 
2484
                ie_rev_id = rev_id
 
2485
            else:
 
2486
                path, file_id, ie_rev_id = info
2481
2487
            if path == '':
2482
2488
                # Replace the root entry
2483
2489
                del inv._byid[inv.root.file_id]
2485
2491
                inv._byid[file_id] = inv.root
2486
2492
                dir_ids[''] = file_id
2487
2493
                continue
2488
 
            inv.add(self.path_to_ie(path, file_id, rev_id, dir_ids))
 
2494
            inv.add(self.path_to_ie(path, file_id, ie_rev_id, dir_ids))
2489
2495
        return revisiontree.InventoryRevisionTree(_Repo(), inv, rev_id)
2490
2496
 
2491
2497
    def create_empty_dirstate(self):
2524
2530
        basis_tree = self.create_tree_from_shape('basis', basis)
2525
2531
        target_tree = self.create_tree_from_shape('target', target)
2526
2532
        state = self.create_empty_dirstate()
2527
 
        state.set_state_from_scratch(active_tree.inventory,
 
2533
        state.set_state_from_scratch(active_tree.root_inventory,
2528
2534
            [('basis', basis_tree)], [])
2529
 
        delta = target_tree.inventory._make_delta(basis_tree.inventory)
 
2535
        delta = target_tree.root_inventory._make_delta(
 
2536
            basis_tree.root_inventory)
2530
2537
        state.update_basis_by_delta(delta, 'target')
2531
2538
        state._validate()
2532
2539
        dirstate_tree = workingtree_4.DirStateRevisionTree(state,
2537
2544
        # And the dirblock state should be identical to the state if we created
2538
2545
        # it from scratch.
2539
2546
        state2 = self.create_empty_dirstate()
2540
 
        state2.set_state_from_scratch(active_tree.inventory,
 
2547
        state2.set_state_from_scratch(active_tree.root_inventory,
2541
2548
            [('target', target_tree)], [])
2542
2549
        self.assertEqual(state2._dirblocks, state._dirblocks)
2543
2550
        return state
2558
2565
        basis_tree = self.create_tree_from_shape('basis', basis)
2559
2566
        inv_delta = self.create_inv_delta(delta, 'target')
2560
2567
        state = self.create_empty_dirstate()
2561
 
        state.set_state_from_scratch(active_tree.inventory,
 
2568
        state.set_state_from_scratch(active_tree.root_inventory,
2562
2569
            [('basis', basis_tree)], [])
2563
2570
        self.assertRaises(errors.InconsistentDelta,
2564
2571
            state.update_basis_by_delta, inv_delta, 'target')
2613
2620
            target=[('file', 'file-id')],
2614
2621
            )
2615
2622
 
 
2623
    def test_add_file_in_empty_dir_not_matching_active_state(self):
 
2624
        state = self.assertUpdate(
 
2625
                active=[],
 
2626
                basis=[('dir/', 'dir-id')],
 
2627
                target=[('dir/', 'dir-id', 'basis'), ('dir/file', 'file-id')],
 
2628
                )
 
2629
 
2616
2630
    def test_add_file_missing_in_active_state(self):
2617
2631
        state = self.assertUpdate(
2618
2632
            active=[],