~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to bzrlib/memorytree.py

(jameinel) Allow 'bzr serve' to interpret SIGHUP as a graceful shutdown.
 (bug #795025) (John A Meinel)

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