~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to bzrlib/store/revision/text.py

  • Committer: mbp at sourcefrog
  • Date: 2005-04-05 08:24:51 UTC
  • Revision ID: mbp@sourcefrog.net-20050405082451-408ebb0fd108440f
start adding quotes

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
 
# Copyright (C) 2006 by Canonical Ltd
2
 
#
3
 
# This program is free software; you can redistribute it and/or modify
4
 
# it under the terms of the GNU General Public License version 2 as published by
5
 
# the Free Software Foundation.
6
 
#
7
 
# This program is distributed in the hope that it will be useful,
8
 
# but WITHOUT ANY WARRANTY; without even the implied warranty of
9
 
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
10
 
# GNU General Public License for more details.
11
 
#
12
 
# You should have received a copy of the GNU General Public License
13
 
# along with this program; if not, write to the Free Software
14
 
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
15
 
 
16
 
"""TextStore based revision store.
17
 
 
18
 
This stores revisions as individual text entries in a TextStore and 
19
 
requires access to a inventory weave to produce object graphs.
20
 
"""
21
 
 
22
 
 
23
 
from cStringIO import StringIO
24
 
 
25
 
 
26
 
import bzrlib
27
 
import bzrlib.errors as errors
28
 
from bzrlib.store.revision import RevisionStore
29
 
from bzrlib.store.text import TextStore
30
 
from bzrlib.store.versioned import VersionedFileStore
31
 
from bzrlib.transport import get_transport
32
 
from bzrlib.tsort import topo_sort
33
 
 
34
 
 
35
 
class TextRevisionStoreTestFactory(object):
36
 
    """Factory to create a TextRevisionStore for testing.
37
 
 
38
 
    This creates a inventory weave and hooks it into the revision store
39
 
    """
40
 
 
41
 
    def create(self, url):
42
 
        """Create a revision store at url."""
43
 
        t = get_transport(url)
44
 
        t.mkdir('revstore')
45
 
        text_store = TextStore(t.clone('revstore'))
46
 
        return TextRevisionStore(text_store)
47
 
 
48
 
    def __str__(self):
49
 
        return "TextRevisionStore"
50
 
 
51
 
 
52
 
class TextRevisionStore(RevisionStore):
53
 
    """A RevisionStore layering on a TextStore and Inventory weave store."""
54
 
 
55
 
    def __init__(self, text_store, serializer=None):
56
 
        """Create a TextRevisionStore object.
57
 
 
58
 
        :param text_store: the text store to put serialised revisions into.
59
 
        """
60
 
        super(TextRevisionStore, self).__init__(serializer)
61
 
        self.text_store = text_store
62
 
        self.text_store.register_suffix('sig')
63
 
 
64
 
    def _add_revision(self, revision, revision_as_file, transaction):
65
 
        """Template method helper to store revision in this store."""
66
 
        self.text_store.add(revision_as_file, revision.revision_id)
67
 
 
68
 
    def add_revision_signature_text(self, revision_id, signature_text, transaction):
69
 
        """See RevisionStore.add_revision_signature_text()."""
70
 
        self.text_store.add(StringIO(signature_text), revision_id, "sig")
71
 
 
72
 
    def all_revision_ids(self, transaction):
73
 
        """See RevisionStore.all_revision_ids()."""
74
 
        # for TextRevisionStores, this is only functional
75
 
        # on listable transports.
76
 
        assert self.text_store.listable()
77
 
        result_graph = {}
78
 
        for rev_id in self.text_store:
79
 
            rev = self.get_revision(rev_id, transaction)
80
 
            result_graph[rev_id] = rev.parent_ids
81
 
        # remove ghosts
82
 
        for rev_id, parents in result_graph.items():
83
 
            for parent in list(parents):
84
 
                if not parent in result_graph:
85
 
                    del parents[parents.index(parent)]
86
 
        return topo_sort(result_graph.items())
87
 
 
88
 
    def get_revisions(self, revision_ids, transaction):
89
 
        """See RevisionStore.get_revisions()."""
90
 
        revisions = []
91
 
        for revision_id in revision_ids:
92
 
            xml_file = self._get_revision_xml_file(revision_id)
93
 
            try:
94
 
                r = self._serializer.read_revision(xml_file)
95
 
            except SyntaxError, e:
96
 
                raise errors.BzrError('failed to unpack revision_xml',
97
 
                                   [revision_id,
98
 
                                   str(e)])
99
 
            xml_file.close()
100
 
            assert r.revision_id == revision_id
101
 
            revisions.append(r)
102
 
        return revisions 
103
 
 
104
 
    def _get_revision_xml_file(self, revision_id):
105
 
        try:
106
 
            return self.text_store.get(revision_id)
107
 
        except (IndexError, KeyError):
108
 
            raise bzrlib.errors.NoSuchRevision(self, revision_id)
109
 
 
110
 
    def _get_signature_text(self, revision_id, transaction):
111
 
        """See RevisionStore._get_signature_text()."""
112
 
        try:
113
 
            return self.text_store.get(revision_id, suffix='sig').read()
114
 
        except (IndexError, KeyError):
115
 
            raise errors.NoSuchRevision(self, revision_id)
116
 
 
117
 
    def has_revision_id(self, revision_id, transaction):
118
 
        """True if the store contains revision_id."""
119
 
        return (revision_id is None
120
 
                or self.text_store.has_id(revision_id))
121
 
 
122
 
    def _has_signature(self, revision_id, transaction):
123
 
        """See RevisionStore._has_signature()."""
124
 
        return self.text_store.has_id(revision_id, suffix='sig')
125
 
 
126
 
    def total_size(self, transaction):
127
 
        """ See RevisionStore.total_size()."""
128
 
        return self.text_store.total_size()