/brz/remove-bazaar

To get this branch, use:
bzr branch http://gegoxaren.bato24.eu/bzr/brz/remove-bazaar
1563.2.21 by Robert Collins
Smoke test for RevisionStore factories creating revision stores.
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
"""VersionedFile based revision store.
17
1563.2.22 by Robert Collins
Move responsibility for repository.has_revision into RevisionStore
18
This stores revisions as individual entries in a knit, and signatures in a 
19
parallel knit.
1563.2.21 by Robert Collins
Smoke test for RevisionStore factories creating revision stores.
20
"""
21
22
1563.2.23 by Robert Collins
Add add_revision and get_revision methods to RevisionStore
23
import bzrlib
24
import bzrlib.errors as errors
1563.2.31 by Robert Collins
Convert Knit repositories to use knits.
25
from bzrlib.knit import KnitVersionedFile
1563.2.21 by Robert Collins
Smoke test for RevisionStore factories creating revision stores.
26
from bzrlib.store.revision import RevisionStore
1563.2.22 by Robert Collins
Move responsibility for repository.has_revision into RevisionStore
27
from bzrlib.store.versioned import VersionedFileStore
1563.2.21 by Robert Collins
Smoke test for RevisionStore factories creating revision stores.
28
from bzrlib.transport import get_transport
29
30
31
class KnitRevisionStoreFactory(object):
32
    """Factory to create a KnitRevisionStore for testing."""
33
34
    def create(self, url):
35
        """Create a revision store at url."""
36
        t = get_transport(url)
1563.2.31 by Robert Collins
Convert Knit repositories to use knits.
37
        t.mkdir('revision-store')
38
        versioned_file_store = VersionedFileStore(
39
            t.clone('revision-store'),
1563.2.34 by Robert Collins
Remove the commit and rollback transaction methods as misleading, and implement a WriteTransaction
40
            precious=True,
1563.2.31 by Robert Collins
Convert Knit repositories to use knits.
41
            versionedfile_class=KnitVersionedFile)
1563.2.22 by Robert Collins
Move responsibility for repository.has_revision into RevisionStore
42
        return KnitRevisionStore(versioned_file_store)
1563.2.21 by Robert Collins
Smoke test for RevisionStore factories creating revision stores.
43
44
    def __str__(self):
45
        return "KnitRevisionStore"
1563.2.22 by Robert Collins
Move responsibility for repository.has_revision into RevisionStore
46
47
48
class KnitRevisionStore(RevisionStore):
49
    """A RevisionStore layering on a VersionedFileStore."""
50
51
    def __init__(self, versioned_file_store):
52
        """Create a KnitRevisionStore object.
53
54
        :param versioned_file_store: the text store to use for storing 
55
                                     revisions and signatures.
56
        """
1563.2.23 by Robert Collins
Add add_revision and get_revision methods to RevisionStore
57
        super(KnitRevisionStore, self).__init__()
1563.2.22 by Robert Collins
Move responsibility for repository.has_revision into RevisionStore
58
        self.versioned_file_store = versioned_file_store
59
1563.2.23 by Robert Collins
Add add_revision and get_revision methods to RevisionStore
60
    def _add_revision(self, revision, revision_as_file, transaction):
61
        """Template method helper to store revision in this store."""
1563.2.31 by Robert Collins
Convert Knit repositories to use knits.
62
        # FIXME: make this ghost aware at the knit level
63
        rf = self.get_revision_file(transaction)
1594.2.9 by Robert Collins
Teach Knit repositories how to handle ghosts without corrupting at all.
64
        self.get_revision_file(transaction).add_lines_with_ghosts(
1563.2.23 by Robert Collins
Add add_revision and get_revision methods to RevisionStore
65
            revision.revision_id,
1594.2.9 by Robert Collins
Teach Knit repositories how to handle ghosts without corrupting at all.
66
            revision.parent_ids,
1563.2.23 by Robert Collins
Add add_revision and get_revision methods to RevisionStore
67
            revision_as_file.readlines())
68
1563.2.30 by Robert Collins
Remove all but fetch references to revision_store, making the repository references that are weave specific use the RevisionTextStore.text_store attribute.
69
    def add_revision_signature_text(self, revision_id, signature_text, transaction):
70
        """See RevisionStore.add_revision_signature_text()."""
1563.2.35 by Robert Collins
cleanup deprecation warnings and finish conversion so the inventory is knit based too.
71
        self.get_signature_file(transaction).add_lines(
1563.2.29 by Robert Collins
Remove all but fetch references to repository.revision_store.
72
            revision_id, [], bzrlib.osutils.split_lines(signature_text))
73
74
    def all_revision_ids(self, transaction):
75
        """See RevisionStore.all_revision_ids()."""
76
        rev_file = self.get_revision_file(transaction)
77
        return rev_file.get_ancestry(rev_file.versions())
1563.2.27 by Robert Collins
Add signature text addition to the revisionstore api.
78
1563.2.23 by Robert Collins
Add add_revision and get_revision methods to RevisionStore
79
    def get_revision(self, revision_id, transaction):
80
        """See RevisionStore.get_revision()."""
81
        xml = self._get_revision_xml(revision_id, transaction)
82
        try:
1563.2.28 by Robert Collins
Add total_size to the revision_store api.
83
            r = self._serializer.read_revision_from_string(xml)
1563.2.23 by Robert Collins
Add add_revision and get_revision methods to RevisionStore
84
        except SyntaxError, e:
85
            raise errors.BzrError('failed to unpack revision_xml',
86
                                   [revision_id,
87
                                   str(e)])
88
        assert r.revision_id == revision_id
89
        return r
90
91
    def _get_revision_xml(self, revision_id, transaction):
92
        try:
93
            return self.get_revision_file(transaction).get_text(revision_id)
94
        except (errors.RevisionNotPresent):
95
            raise errors.NoSuchRevision(self, revision_id)
96
1563.2.22 by Robert Collins
Move responsibility for repository.has_revision into RevisionStore
97
    def get_revision_file(self, transaction):
98
        """Get the revision versioned file object."""
1563.2.25 by Robert Collins
Merge in upstream.
99
        return self.versioned_file_store.get_weave_or_empty('revisions', transaction)
1563.2.22 by Robert Collins
Move responsibility for repository.has_revision into RevisionStore
100
1563.2.35 by Robert Collins
cleanup deprecation warnings and finish conversion so the inventory is knit based too.
101
    def get_signature_file(self, transaction):
1563.2.29 by Robert Collins
Remove all but fetch references to repository.revision_store.
102
        """Get the signature text versioned file object."""
103
        return self.versioned_file_store.get_weave_or_empty('signatures', transaction)
104
1563.2.30 by Robert Collins
Remove all but fetch references to revision_store, making the repository references that are weave specific use the RevisionTextStore.text_store attribute.
105
    def _get_signature_text(self, revision_id, transaction):
106
        """See RevisionStore._get_signature_text()."""
107
        try:
1563.2.35 by Robert Collins
cleanup deprecation warnings and finish conversion so the inventory is knit based too.
108
            return self.get_signature_file(transaction).get_text(revision_id)
1563.2.30 by Robert Collins
Remove all but fetch references to revision_store, making the repository references that are weave specific use the RevisionTextStore.text_store attribute.
109
        except errors.RevisionNotPresent:
110
            raise errors.NoSuchRevision(self, revision_id)
111
1563.2.22 by Robert Collins
Move responsibility for repository.has_revision into RevisionStore
112
    def has_revision_id(self, revision_id, transaction):
113
        """True if the store contains revision_id."""
114
        return (revision_id is None
115
                or self.get_revision_file(transaction).has_version(revision_id))
1563.2.28 by Robert Collins
Add total_size to the revision_store api.
116
        
1563.2.29 by Robert Collins
Remove all but fetch references to repository.revision_store.
117
    def _has_signature(self, revision_id, transaction):
118
        """See RevisionStore._has_signature()."""
1563.2.35 by Robert Collins
cleanup deprecation warnings and finish conversion so the inventory is knit based too.
119
        return self.get_signature_file(transaction).has_version(revision_id)
1563.2.29 by Robert Collins
Remove all but fetch references to repository.revision_store.
120
1563.2.28 by Robert Collins
Add total_size to the revision_store api.
121
    def total_size(self, transaction):
122
        """ See RevisionStore.total_size()."""
123
        return self.versioned_file_store.total_size()