/brz/remove-bazaar

To get this branch, use:
bzr branch http://gegoxaren.bato24.eu/bzr/brz/remove-bazaar

« back to all changes in this revision

Viewing changes to bzrlib/memorytree.py

  • Committer: Robert Collins
  • Date: 2010-05-06 11:08:10 UTC
  • mto: This revision was merged to the branch mainline in revision 5223.
  • Revision ID: robertc@robertcollins.net-20100506110810-h3j07fh5gmw54s25
Cleaner matcher matching revised unlocking protocol.

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