~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to bzrlib/workingtree_4.py

Merge bzr.dev

Show diffs side-by-side

added added

removed removed

Lines of Context:
151
151
        self._dirstate = None
152
152
        self._inventory = None
153
153
        #-------------
 
154
        self._setup_directory_is_tree_reference()
154
155
        self._detect_case_handling()
155
156
 
156
157
    @needs_tree_write_lock
1256
1257
        """See WorkingTreeFormat.get_format_description()."""
1257
1258
        return "Working tree format 4"
1258
1259
 
1259
 
    def initialize(self, a_bzrdir, revision_id=None, from_branch=None):
 
1260
    def initialize(self, a_bzrdir, revision_id=None, from_branch=None,
 
1261
                   accelerator_tree=None):
1260
1262
        """See WorkingTreeFormat.initialize().
1261
1263
 
1262
1264
        :param revision_id: allows creating a working tree at a different
1263
1265
        revision than the branch is at.
 
1266
        :param accelerator_tree: A tree which can be used for retrieving file
 
1267
            contents more quickly than the revision tree, i.e. a workingtree.
 
1268
            The revision tree will be used for cases where accelerator_tree's
 
1269
            content is different.
1264
1270
 
1265
1271
        These trees get an initial random root id, if their repository supports
1266
1272
        rich root data, TREE_ROOT otherwise.
1297
1303
                else:
1298
1304
                    wt._set_root_id(ROOT_ID)
1299
1305
                wt.flush()
1300
 
            wt.set_last_revision(revision_id)
 
1306
            basis = None
 
1307
            # frequently, we will get here due to branching.  The accelerator
 
1308
            # tree will be the tree from the branch, so the desired basis
 
1309
            # tree will often be a parent of the accelerator tree.
 
1310
            if accelerator_tree is not None:
 
1311
                try:
 
1312
                    basis = accelerator_tree.revision_tree(revision_id)
 
1313
                except errors.NoSuchRevision:
 
1314
                    pass
 
1315
            if basis is None:
 
1316
                basis = branch.repository.revision_tree(revision_id)
 
1317
            if revision_id == NULL_REVISION:
 
1318
                parents_list = []
 
1319
            else:
 
1320
                parents_list = [(revision_id, basis)]
 
1321
            basis.lock_read()
 
1322
            wt.set_parent_trees(parents_list, allow_leftmost_as_ghost=True)
1301
1323
            wt.flush()
1302
 
            basis = wt.basis_tree()
1303
 
            basis.lock_read()
1304
1324
            # if the basis has a root id we have to use that; otherwise we use
1305
1325
            # a new random one
1306
1326
            basis_root_id = basis.get_root_id()
1307
1327
            if basis_root_id is not None:
1308
1328
                wt._set_root_id(basis_root_id)
1309
1329
                wt.flush()
1310
 
            transform.build_tree(basis, wt)
 
1330
            transform.build_tree(basis, wt, accelerator_tree)
1311
1331
            basis.unlock()
1312
1332
        finally:
1313
1333
            control_files.unlock()
1735
1755
        # NB: show_status depends on being able to pass in non-versioned files
1736
1756
        # and report them as unknown
1737
1757
        # TODO: handle extra trees in the dirstate.
1738
 
        # TODO: handle comparisons as an empty tree as a different special
1739
 
        # case? mbp 20070226
1740
 
        if (extra_trees or (self.source._revision_id == NULL_REVISION)
1741
 
            or specific_files == []):
 
1758
        if (extra_trees or specific_files == []):
1742
1759
            # we can't fast-path these cases (yet)
1743
1760
            for f in super(InterDirStateTree, self)._iter_changes(
1744
1761
                include_unchanged, specific_files, pb, extra_trees,
1746
1763
                yield f
1747
1764
            return
1748
1765
        parent_ids = self.target.get_parent_ids()
1749
 
        assert (self.source._revision_id in parent_ids), \
 
1766
        assert (self.source._revision_id in parent_ids
 
1767
                or self.source._revision_id == NULL_REVISION), \
1750
1768
                "revision {%s} is not stored in {%s}, but %s " \
1751
1769
                "can only be used for trees stored in the dirstate" \
1752
1770
                % (self.source._revision_id, self.target, self._iter_changes)
1759
1777
                "Failure: source._revision_id: %s not in target.parent_ids(%s)" % (
1760
1778
                self.source._revision_id, parent_ids)
1761
1779
            source_index = 1 + parent_ids.index(self.source._revision_id)
1762
 
            indices = (source_index,target_index)
 
1780
            indices = (source_index, target_index)
1763
1781
        # -- make all specific_files utf8 --
1764
1782
        if specific_files:
1765
1783
            specific_files_utf8 = set()