~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to bzrlib/memorytree.py

  • Committer: Canonical.com Patch Queue Manager
  • Date: 2009-08-27 02:27:19 UTC
  • mfrom: (4634.3.19 gc-batching)
  • Revision ID: pqm@pqm.ubuntu.com-20090827022719-bl2yoqhpj3fcfczu
(andrew) Fix #402657: 2a fetch over dumb transport reads one group at
        a 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., 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
    osutils,
28
29
    revision as _mod_revision,
29
30
    )
30
31
from bzrlib.decorators import needs_read_lock, needs_write_lock
35
36
 
36
37
class MemoryTree(mutabletree.MutableTree):
37
38
    """A MemoryTree is a specialisation of MutableTree.
38
 
    
 
39
 
39
40
    It maintains nearly no state outside of read_lock and write_lock
40
41
    transactions. (it keeps a reference to the branch, and its last-revision
41
42
    only).
72
73
 
73
74
    def _gather_kinds(self, files, kinds):
74
75
        """See MutableTree._gather_kinds.
75
 
        
 
76
 
76
77
        This implementation does not care about the file kind of
77
78
        missing files, so is a no-op.
78
79
        """
99
100
            return None, False, None
100
101
        return entry.kind, entry.executable, None
101
102
 
 
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
 
102
111
    def path_content_summary(self, path):
103
112
        """See Tree.path_content_summary."""
104
113
        id = self.path2id(path)
202
211
 
203
212
    def _populate_from_branch(self):
204
213
        """Populate the in-tree state from the branch."""
205
 
        self._basis_tree = self.branch.repository.revision_tree(
206
 
            self._branch_revision_id)
 
214
        self._set_basis()
207
215
        if self._branch_revision_id == _mod_revision.NULL_REVISION:
208
216
            self._parent_ids = []
209
217
        else:
210
218
            self._parent_ids = [self._branch_revision_id]
211
 
        self._inventory = deepcopy(self._basis_tree._inventory)
 
219
        self._inventory = self._basis_tree._inventory._get_mutable_inventory()
212
220
        self._file_transport = MemoryTransport()
213
221
        # TODO copy the revision trees content, or do it lazy, or something.
214
222
        inventory_entries = self._inventory.iter_entries()
270
278
            _mod_revision.check_not_reserved_id(revision_id)
271
279
        if len(revision_ids) == 0:
272
280
            self._parent_ids = []
273
 
            self._basis_tree = self.branch.repository.revision_tree(
274
 
                                    _mod_revision.NULL_REVISION)
 
281
            self._branch_revision_id = _mod_revision.NULL_REVISION
275
282
        else:
276
283
            self._parent_ids = revision_ids
277
 
            self._basis_tree = self.branch.repository.revision_tree(
278
 
                                    revision_ids[0])
279
284
            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
280
298
 
281
299
    def set_parent_trees(self, parents_list, allow_leftmost_as_ghost=False):
282
300
        """See MutableTree.set_parent_trees()."""