~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: 2008-10-02 17:28:44 UTC
  • mfrom: (3744.2.2 merge_reprocess)
  • Revision ID: pqm@pqm.ubuntu.com-20081002172844-d6df1l8dzpsqzyup
(jam) For 'bzr merge' enable '--reprocess' by default whenever
        '--show-base' is not set.

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
31
 
from bzrlib.inventory import Inventory
 
32
from bzrlib.decorators import needs_read_lock, needs_write_lock
32
33
from bzrlib.osutils import sha_file
33
34
from bzrlib.mutabletree import needs_tree_write_lock
34
35
from bzrlib.transport.memory import MemoryTransport
35
36
 
36
37
 
37
 
class MemoryTree(mutabletree.MutableInventoryTree):
 
38
class MemoryTree(mutabletree.MutableTree):
38
39
    """A MemoryTree is a specialisation of MutableTree.
39
 
 
 
40
    
40
41
    It maintains nearly no state outside of read_lock and write_lock
41
42
    transactions. (it keeps a reference to the branch, and its last-revision
42
43
    only).
50
51
        self._locks = 0
51
52
        self._lock_mode = None
52
53
 
53
 
    def is_control_filename(self, filename):
54
 
        # Memory tree doesn't have any control filenames
55
 
        return False
56
 
 
57
54
    @needs_tree_write_lock
58
55
    def _add(self, files, ids, kinds):
59
56
        """See MutableTree._add."""
77
74
 
78
75
    def _gather_kinds(self, files, kinds):
79
76
        """See MutableTree._gather_kinds.
80
 
 
 
77
        
81
78
        This implementation does not care about the file kind of
82
79
        missing files, so is a no-op.
83
80
        """
215
212
 
216
213
    def _populate_from_branch(self):
217
214
        """Populate the in-tree state from the branch."""
218
 
        self._set_basis()
 
215
        self._basis_tree = self.branch.repository.revision_tree(
 
216
            self._branch_revision_id)
219
217
        if self._branch_revision_id == _mod_revision.NULL_REVISION:
220
218
            self._parent_ids = []
221
219
        else:
222
220
            self._parent_ids = [self._branch_revision_id]
223
 
        self._inventory = Inventory(None, self._basis_tree.get_revision_id())
 
221
        self._inventory = deepcopy(self._basis_tree._inventory)
224
222
        self._file_transport = MemoryTransport()
225
223
        # TODO copy the revision trees content, or do it lazy, or something.
226
 
        inventory_entries = self._basis_tree.iter_entries_by_dir()
 
224
        inventory_entries = self._inventory.iter_entries()
227
225
        for path, entry in inventory_entries:
228
 
            self._inventory.add(entry.copy())
229
226
            if path == '':
230
227
                continue
231
228
            if entry.kind == 'directory':
283
280
            _mod_revision.check_not_reserved_id(revision_id)
284
281
        if len(revision_ids) == 0:
285
282
            self._parent_ids = []
286
 
            self._branch_revision_id = _mod_revision.NULL_REVISION
 
283
            self._basis_tree = self.branch.repository.revision_tree(
 
284
                                    _mod_revision.NULL_REVISION)
287
285
        else:
288
286
            self._parent_ids = revision_ids
 
287
            self._basis_tree = self.branch.repository.revision_tree(
 
288
                                    revision_ids[0])
289
289
            self._branch_revision_id = revision_ids[0]
290
 
        self._allow_leftmost_as_ghost = allow_leftmost_as_ghost
291
 
        self._set_basis()
292
 
    
293
 
    def _set_basis(self):
294
 
        try:
295
 
            self._basis_tree = self.branch.repository.revision_tree(
296
 
                self._branch_revision_id)
297
 
        except errors.NoSuchRevision:
298
 
            if self._allow_leftmost_as_ghost:
299
 
                self._basis_tree = self.branch.repository.revision_tree(
300
 
                    _mod_revision.NULL_REVISION)
301
 
            else:
302
 
                raise
303
290
 
304
291
    def set_parent_trees(self, parents_list, allow_leftmost_as_ghost=False):
305
292
        """See MutableTree.set_parent_trees()."""