~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to bzrlib/memorytree.py

  • Committer: Mark Hammond
  • Date: 2008-08-10 11:16:39 UTC
  • mto: (3606.5.3 1.6)
  • mto: This revision was merged to the branch mainline in revision 3626.
  • Revision ID: mhammond@skippinet.com.au-20080810111639-9upz1wig1s8lvz62
install all files with 'restartreplace uninsrestartdelete' and close
tbzrcache at uninstall time.

Show diffs side-by-side

added added

removed removed

Lines of Context:
12
12
#
13
13
# You should have received a copy of the GNU General Public License
14
14
# along with this program; if not, write to the Free Software
15
 
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
 
15
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
16
16
 
17
17
"""MemoryTree object.
18
18
 
20
20
"""
21
21
 
22
22
 
23
 
import os
 
23
from copy import deepcopy
24
24
 
25
25
from bzrlib import (
26
26
    errors,
27
27
    mutabletree,
28
 
    osutils,
29
28
    revision as _mod_revision,
30
29
    )
31
30
from bzrlib.decorators import needs_read_lock, needs_write_lock
36
35
 
37
36
class MemoryTree(mutabletree.MutableTree):
38
37
    """A MemoryTree is a specialisation of MutableTree.
39
 
 
 
38
    
40
39
    It maintains nearly no state outside of read_lock and write_lock
41
40
    transactions. (it keeps a reference to the branch, and its last-revision
42
41
    only).
69
68
    def create_on_branch(branch):
70
69
        """Create a MemoryTree for branch, using the last-revision of branch."""
71
70
        revision_id = _mod_revision.ensure_null(branch.last_revision())
 
71
        if _mod_revision.is_null(revision_id):
 
72
            revision_id = None
72
73
        return MemoryTree(branch, revision_id)
73
74
 
74
75
    def _gather_kinds(self, files, kinds):
75
76
        """See MutableTree._gather_kinds.
76
 
 
 
77
        
77
78
        This implementation does not care about the file kind of
78
79
        missing files, so is a no-op.
79
80
        """
100
101
            return None, False, None
101
102
        return entry.kind, entry.executable, None
102
103
 
103
 
    @needs_tree_write_lock
104
 
    def rename_one(self, from_rel, to_rel):
105
 
        file_id = self.path2id(from_rel)
106
 
        to_dir, to_tail = os.path.split(to_rel)
107
 
        to_parent_id = self.path2id(to_dir)
108
 
        self._file_transport.move(from_rel, to_rel)
109
 
        self._inventory.rename(file_id, to_parent_id, to_tail)
110
 
 
111
104
    def path_content_summary(self, path):
112
105
        """See Tree.path_content_summary."""
113
106
        id = self.path2id(path)
211
204
 
212
205
    def _populate_from_branch(self):
213
206
        """Populate the in-tree state from the branch."""
214
 
        self._set_basis()
215
 
        if self._branch_revision_id == _mod_revision.NULL_REVISION:
 
207
        self._basis_tree = self.branch.repository.revision_tree(
 
208
            self._branch_revision_id)
 
209
        if self._branch_revision_id is None:
216
210
            self._parent_ids = []
217
211
        else:
218
212
            self._parent_ids = [self._branch_revision_id]
219
 
        self._inventory = self._basis_tree._inventory._get_mutable_inventory()
 
213
        self._inventory = deepcopy(self._basis_tree._inventory)
220
214
        self._file_transport = MemoryTransport()
221
215
        # TODO copy the revision trees content, or do it lazy, or something.
222
216
        inventory_entries = self._inventory.iter_entries()
278
272
            _mod_revision.check_not_reserved_id(revision_id)
279
273
        if len(revision_ids) == 0:
280
274
            self._parent_ids = []
281
 
            self._branch_revision_id = _mod_revision.NULL_REVISION
 
275
            self._basis_tree = self.branch.repository.revision_tree(None)
282
276
        else:
283
277
            self._parent_ids = revision_ids
 
278
            self._basis_tree = self.branch.repository.revision_tree(
 
279
                                    revision_ids[0])
284
280
            self._branch_revision_id = revision_ids[0]
285
 
        self._allow_leftmost_as_ghost = allow_leftmost_as_ghost
286
 
        self._set_basis()
287
 
    
288
 
    def _set_basis(self):
289
 
        try:
290
 
            self._basis_tree = self.branch.repository.revision_tree(
291
 
                self._branch_revision_id)
292
 
        except errors.NoSuchRevision:
293
 
            if self._allow_leftmost_as_ghost:
294
 
                self._basis_tree = self.branch.repository.revision_tree(
295
 
                    _mod_revision.NULL_REVISION)
296
 
            else:
297
 
                raise
298
281
 
299
282
    def set_parent_trees(self, parents_list, allow_leftmost_as_ghost=False):
300
283
        """See MutableTree.set_parent_trees()."""
301
284
        if len(parents_list) == 0:
302
285
            self._parent_ids = []
303
 
            self._basis_tree = self.branch.repository.revision_tree(
304
 
                                   _mod_revision.NULL_REVISION)
 
286
            self._basis_tree = self.branch.repository.revision_tree(None)
305
287
        else:
306
288
            if parents_list[0][1] is None and not allow_leftmost_as_ghost:
307
289
                # a ghost in the left most parent
308
290
                raise errors.GhostRevisionUnusableHere(parents_list[0][0])
309
291
            self._parent_ids = [parent_id for parent_id, tree in parents_list]
310
292
            if parents_list[0][1] is None or parents_list[0][1] == 'null:':
311
 
                self._basis_tree = self.branch.repository.revision_tree(
312
 
                                       _mod_revision.NULL_REVISION)
 
293
                self._basis_tree = self.branch.repository.revision_tree(None)
313
294
            else:
314
295
                self._basis_tree = parents_list[0][1]
315
296
            self._branch_revision_id = parents_list[0][0]