/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: John Arbash Meinel
  • Date: 2008-09-05 02:29:34 UTC
  • mto: (3697.7.4 1.7)
  • mto: This revision was merged to the branch mainline in revision 3748.
  • Revision ID: john@arbash-meinel.com-20080905022934-s8692mbwpkdwi106
Cleanups to the algorithm documentation.

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
from copy import deepcopy
23
24
import os
24
25
 
25
26
from bzrlib import (
26
27
    errors,
27
28
    mutabletree,
 
29
    osutils,
28
30
    revision as _mod_revision,
29
31
    )
30
 
from bzrlib.decorators import needs_read_lock
 
32
from bzrlib.decorators import needs_read_lock, needs_write_lock
31
33
from bzrlib.osutils import sha_file
32
34
from bzrlib.mutabletree import needs_tree_write_lock
33
35
from bzrlib.transport.memory import MemoryTransport
35
37
 
36
38
class MemoryTree(mutabletree.MutableTree):
37
39
    """A MemoryTree is a specialisation of MutableTree.
38
 
 
 
40
    
39
41
    It maintains nearly no state outside of read_lock and write_lock
40
42
    transactions. (it keeps a reference to the branch, and its last-revision
41
43
    only).
68
70
    def create_on_branch(branch):
69
71
        """Create a MemoryTree for branch, using the last-revision of branch."""
70
72
        revision_id = _mod_revision.ensure_null(branch.last_revision())
 
73
        if _mod_revision.is_null(revision_id):
 
74
            revision_id = None
71
75
        return MemoryTree(branch, revision_id)
72
76
 
73
77
    def _gather_kinds(self, files, kinds):
74
78
        """See MutableTree._gather_kinds.
75
 
 
 
79
        
76
80
        This implementation does not care about the file kind of
77
81
        missing files, so is a no-op.
78
82
        """
103
107
    def rename_one(self, from_rel, to_rel):
104
108
        file_id = self.path2id(from_rel)
105
109
        to_dir, to_tail = os.path.split(to_rel)
106
 
        to_parent_id = self.path2id(to_dir)
 
110
        to_parent_id = self._inventory[file_id].parent_id
107
111
        self._file_transport.move(from_rel, to_rel)
108
112
        self._inventory.rename(file_id, to_parent_id, to_tail)
109
113
 
210
214
 
211
215
    def _populate_from_branch(self):
212
216
        """Populate the in-tree state from the branch."""
213
 
        self._set_basis()
214
 
        if self._branch_revision_id == _mod_revision.NULL_REVISION:
 
217
        self._basis_tree = self.branch.repository.revision_tree(
 
218
            self._branch_revision_id)
 
219
        if self._branch_revision_id is None:
215
220
            self._parent_ids = []
216
221
        else:
217
222
            self._parent_ids = [self._branch_revision_id]
218
 
        self._inventory = self._basis_tree._inventory._get_mutable_inventory()
 
223
        self._inventory = deepcopy(self._basis_tree._inventory)
219
224
        self._file_transport = MemoryTransport()
220
225
        # TODO copy the revision trees content, or do it lazy, or something.
221
226
        inventory_entries = self._inventory.iter_entries()
277
282
            _mod_revision.check_not_reserved_id(revision_id)
278
283
        if len(revision_ids) == 0:
279
284
            self._parent_ids = []
280
 
            self._branch_revision_id = _mod_revision.NULL_REVISION
 
285
            self._basis_tree = self.branch.repository.revision_tree(None)
281
286
        else:
282
287
            self._parent_ids = revision_ids
 
288
            self._basis_tree = self.branch.repository.revision_tree(
 
289
                                    revision_ids[0])
283
290
            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
297
291
 
298
292
    def set_parent_trees(self, parents_list, allow_leftmost_as_ghost=False):
299
293
        """See MutableTree.set_parent_trees()."""
300
294
        if len(parents_list) == 0:
301
295
            self._parent_ids = []
302
 
            self._basis_tree = self.branch.repository.revision_tree(
303
 
                                   _mod_revision.NULL_REVISION)
 
296
            self._basis_tree = self.branch.repository.revision_tree(None)
304
297
        else:
305
298
            if parents_list[0][1] is None and not allow_leftmost_as_ghost:
306
299
                # a ghost in the left most parent
307
300
                raise errors.GhostRevisionUnusableHere(parents_list[0][0])
308
301
            self._parent_ids = [parent_id for parent_id, tree in parents_list]
309
302
            if parents_list[0][1] is None or parents_list[0][1] == 'null:':
310
 
                self._basis_tree = self.branch.repository.revision_tree(
311
 
                                       _mod_revision.NULL_REVISION)
 
303
                self._basis_tree = self.branch.repository.revision_tree(None)
312
304
            else:
313
305
                self._basis_tree = parents_list[0][1]
314
306
            self._branch_revision_id = parents_list[0][0]