~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

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

  • Committer: Aaron Bentley
  • Date: 2008-03-11 14:29:08 UTC
  • mto: This revision was merged to the branch mainline in revision 3264.
  • Revision ID: aaron@aaronbentley.com-20080311142908-yyrvcpn2mldt0fnn
Update documentation to reflect conflict-handling difference

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
# Copyright (C) 2006 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 as published by
 
5
# the Free Software Foundation; either version 2 of the License, or
 
6
# (at your option) any later version.
 
7
#
 
8
# This program is distributed in the hope that it will be useful,
 
9
# but WITHOUT ANY WARRANTY; without even the implied warranty of
 
10
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 
11
# GNU General Public License for more details.
 
12
#
 
13
# You should have received a copy of the GNU General Public License
 
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
 
16
 
 
17
"""VersionedFile based revision store.
 
18
 
 
19
This stores revisions as individual entries in a knit, and signatures in a 
 
20
parallel knit.
 
21
"""
 
22
 
 
23
 
 
24
from bzrlib import (
 
25
    errors,
 
26
    osutils,
 
27
    revision as _mod_revision,
 
28
    )
 
29
from bzrlib.knit import KnitVersionedFile, KnitPlainFactory
 
30
from bzrlib.store.revision import RevisionStore
 
31
from bzrlib.store.versioned import VersionedFileStore
 
32
from bzrlib.transport import get_transport
 
33
 
 
34
 
 
35
class KnitRevisionStoreFactory(object):
 
36
    """Factory to create a KnitRevisionStore for testing."""
 
37
 
 
38
    def create(self, url):
 
39
        """Create a revision store at url."""
 
40
        t = get_transport(url)
 
41
        t.mkdir('revision-store')
 
42
        versioned_file_store = VersionedFileStore(
 
43
            t.clone('revision-store'),
 
44
            precious=True,
 
45
            versionedfile_class=KnitVersionedFile,
 
46
            versionedfile_kwargs={'delta':False, 'factory':KnitPlainFactory()})
 
47
        return KnitRevisionStore(versioned_file_store)
 
48
 
 
49
    def __str__(self):
 
50
        return "KnitRevisionStore"
 
51
 
 
52
 
 
53
class KnitRevisionStore(RevisionStore):
 
54
    """A RevisionStore layering on a VersionedFileStore."""
 
55
 
 
56
    def __init__(self, versioned_file_store):
 
57
        """Create a KnitRevisionStore object.
 
58
 
 
59
        :param versioned_file_store: the text store to use for storing 
 
60
                                     revisions and signatures.
 
61
        """
 
62
        super(KnitRevisionStore, self).__init__()
 
63
        self.versioned_file_store = versioned_file_store
 
64
 
 
65
    def __repr__(self):
 
66
        return "%s(%s)" % (self.__class__.__name__,
 
67
                           self.versioned_file_store)
 
68
 
 
69
    def _add_revision(self, revision, revision_as_file, transaction):
 
70
        """Template method helper to store revision in this store."""
 
71
        self.get_revision_file(transaction).add_lines_with_ghosts(
 
72
            revision.revision_id,
 
73
            revision.parent_ids,
 
74
            osutils.split_lines(revision_as_file.read()))
 
75
 
 
76
    def add_revision_signature_text(self, revision_id, signature_text, transaction):
 
77
        """See RevisionStore.add_revision_signature_text()."""
 
78
        self.get_signature_file(transaction).add_lines(
 
79
            revision_id, [], osutils.split_lines(signature_text))
 
80
 
 
81
    def all_revision_ids(self, transaction):
 
82
        """See RevisionStore.all_revision_ids()."""
 
83
        rev_file = self.get_revision_file(transaction)
 
84
        return rev_file.get_ancestry(rev_file.versions())
 
85
 
 
86
    def get_revisions(self, revision_ids, transaction):
 
87
        """See RevisionStore.get_revisions()."""
 
88
        texts = self._get_serialized_revisions(revision_ids, transaction)
 
89
        revisions = []
 
90
        try:
 
91
            for text, revision_id in zip(texts, revision_ids):
 
92
                r = self._serializer.read_revision_from_string(text)
 
93
                assert r.revision_id == revision_id
 
94
                revisions.append(r)
 
95
        except SyntaxError, e:
 
96
            raise errors.BzrError('failed to unpack revision_xml for %s: %s' %
 
97
                                   (revision_id, str(e)))
 
98
        return revisions
 
99
 
 
100
    def _get_serialized_revisions(self, revision_ids, transaction):
 
101
        texts = []
 
102
        vf = self.get_revision_file(transaction)
 
103
        try:
 
104
            return vf.get_texts(revision_ids)
 
105
        except (errors.RevisionNotPresent), e:
 
106
            raise errors.NoSuchRevision(self, e.revision_id)
 
107
 
 
108
    def _get_revision_xml(self, revision_id, transaction):
 
109
        try:
 
110
            return self.get_revision_file(transaction).get_text(revision_id)
 
111
        except (errors.RevisionNotPresent):
 
112
            raise errors.NoSuchRevision(self, revision_id)
 
113
 
 
114
    def get_revision_file(self, transaction):
 
115
        """Get the revision versioned file object."""
 
116
        return self.versioned_file_store.get_weave_or_empty('revisions', transaction)
 
117
 
 
118
    def get_signature_file(self, transaction):
 
119
        """Get the signature text versioned file object."""
 
120
        return self.versioned_file_store.get_weave_or_empty('signatures', transaction)
 
121
 
 
122
    def _get_signature_text(self, revision_id, transaction):
 
123
        """See RevisionStore._get_signature_text()."""
 
124
        try:
 
125
            return self.get_signature_file(transaction).get_text(revision_id)
 
126
        except errors.RevisionNotPresent:
 
127
            raise errors.NoSuchRevision(self, revision_id)
 
128
 
 
129
    def has_revision_id(self, revision_id, transaction):
 
130
        """True if the store contains revision_id."""
 
131
        return (_mod_revision.is_null(revision_id)
 
132
                or self.get_revision_file(transaction).has_version(revision_id))
 
133
 
 
134
    def _has_signature(self, revision_id, transaction):
 
135
        """See RevisionStore._has_signature()."""
 
136
        return self.get_signature_file(transaction).has_version(revision_id)
 
137
 
 
138
    def total_size(self, transaction):
 
139
        """ See RevisionStore.total_size()."""
 
140
        return (len(self.all_revision_ids(transaction)),
 
141
            self.versioned_file_store.total_size()[1])