~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to bzrlib/weavefile.py

  • Committer: Jelmer Vernooij
  • Date: 2011-02-05 14:24:01 UTC
  • mto: (5582.12.2 weave-plugin)
  • mto: This revision was merged to the branch mainline in revision 5718.
  • Revision ID: jelmer@samba.org-20110205142401-yhslm4pbjov9aw4n
revert weavefile changes

Show diffs side-by-side

added added

removed removed

Lines of Context:
16
16
#
17
17
# Author: Martin Pool <mbp@canonical.com>
18
18
 
 
19
 
 
20
 
 
21
 
19
22
"""Store and retrieve weaves in files.
20
23
 
21
24
There is one format marker followed by a blank line, followed by a
38
41
# an iterator returning the weave lines...  We don't really need to
39
42
# deserialize it into memory.
40
43
 
41
 
from cStringIO import StringIO
42
 
 
43
 
from bzrlib import (
44
 
    errors,
45
 
    )
46
 
from bzrlib.osutils import dirname
47
 
from bzrlib.weave import (
48
 
    Weave,
49
 
    WeaveFormatError,
50
 
    )
51
 
 
52
44
FORMAT_1 = '# bzr weave file v5\n'
53
45
 
54
46
 
98
90
 
99
91
def read_weave(f):
100
92
    # FIXME: detect the weave type and dispatch
 
93
    from bzrlib.trace import mutter
101
94
    from weave import Weave
102
95
    w = Weave(getattr(f, 'name', None))
103
96
    _read_weave_v5(f, w)
123
116
    # +59363 0    311.8780    311.8780   +<method 'append' of 'list' objects>
124
117
    # +200   0     30.2500     30.2500   +<method 'readlines' of 'file' objects>
125
118
 
 
119
    from weave import WeaveFormatError
 
120
 
126
121
    try:
127
122
        lines = iter(f.readlines())
128
123
    finally:
172
167
        else:
173
168
            w._weave.append((intern(l[0]), int(l[2:])))
174
169
    return w
175
 
 
176
 
 
177
 
class WeaveFile(Weave):
178
 
    """A WeaveFile represents a Weave on disk and writes on change."""
179
 
 
180
 
    WEAVE_SUFFIX = '.weave'
181
 
 
182
 
    def __init__(self, name, transport, filemode=None, create=False, access_mode='w', get_scope=None):
183
 
        """Create a WeaveFile.
184
 
 
185
 
        :param create: If not True, only open an existing knit.
186
 
        """
187
 
        super(WeaveFile, self).__init__(name, access_mode, get_scope=get_scope,
188
 
            allow_reserved=False)
189
 
        self._transport = transport
190
 
        self._filemode = filemode
191
 
        try:
192
 
            _read_weave_v5(self._transport.get(name + WeaveFile.WEAVE_SUFFIX), self)
193
 
        except errors.NoSuchFile:
194
 
            if not create:
195
 
                raise
196
 
            # new file, save it
197
 
            self._save()
198
 
 
199
 
    def _add_lines(self, version_id, parents, lines, parent_texts,
200
 
        left_matching_blocks, nostore_sha, random_id, check_content):
201
 
        """Add a version and save the weave."""
202
 
        self.check_not_reserved_id(version_id)
203
 
        result = super(WeaveFile, self)._add_lines(version_id, parents, lines,
204
 
            parent_texts, left_matching_blocks, nostore_sha, random_id,
205
 
            check_content)
206
 
        self._save()
207
 
        return result
208
 
 
209
 
    def copy_to(self, name, transport):
210
 
        """See VersionedFile.copy_to()."""
211
 
        # as we are all in memory always, just serialise to the new place.
212
 
        sio = StringIO()
213
 
        write_weave_v5(self, sio)
214
 
        sio.seek(0)
215
 
        transport.put_file(name + WeaveFile.WEAVE_SUFFIX, sio, self._filemode)
216
 
 
217
 
    def _save(self):
218
 
        """Save the weave."""
219
 
        self._check_write_ok()
220
 
        sio = StringIO()
221
 
        write_weave_v5(self, sio)
222
 
        sio.seek(0)
223
 
        bytes = sio.getvalue()
224
 
        path = self._weave_name + WeaveFile.WEAVE_SUFFIX
225
 
        try:
226
 
            self._transport.put_bytes(path, bytes, self._filemode)
227
 
        except errors.NoSuchFile:
228
 
            self._transport.mkdir(dirname(path))
229
 
            self._transport.put_bytes(path, bytes, self._filemode)
230
 
 
231
 
    @staticmethod
232
 
    def get_suffixes():
233
 
        """See VersionedFile.get_suffixes()."""
234
 
        return [WeaveFile.WEAVE_SUFFIX]
235
 
 
236
 
    def insert_record_stream(self, stream):
237
 
        super(WeaveFile, self).insert_record_stream(stream)
238
 
        self._save()
239
 
 
240
 
 
241