~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to bzrlib/weave.py

  • Committer: Canonical.com Patch Queue Manager
  • Date: 2008-05-12 03:07:05 UTC
  • mfrom: (3350.3.22 data_stream_revamp)
  • Revision ID: pqm@pqm.ubuntu.com-20080512030705-nvl2q1tuls904eru
Deprecate bzrlib.versionedfiles.VersionedFile.join.

Show diffs side-by-side

added added

removed removed

Lines of Context:
78
78
from bzrlib import (
79
79
    progress,
80
80
    )
81
 
from bzrlib.trace import mutter
82
81
from bzrlib.errors import (WeaveError, WeaveFormatError, WeaveParentMismatch,
83
82
        RevisionAlreadyPresent,
84
83
        RevisionNotPresent,
 
84
        UnavailableRepresentation,
85
85
        WeaveRevisionAlreadyPresent,
86
86
        WeaveRevisionNotPresent,
87
87
        )
88
88
import bzrlib.errors as errors
89
 
from bzrlib.osutils import sha_strings
 
89
from bzrlib.osutils import sha_strings, split_lines
90
90
import bzrlib.patiencediff
 
91
from bzrlib.symbol_versioning import *
 
92
from bzrlib.trace import mutter
91
93
from bzrlib.tsort import topo_sort
92
 
from bzrlib.versionedfile import VersionedFile, InterVersionedFile
 
94
from bzrlib.versionedfile import (
 
95
    AbsentContentFactory,
 
96
    adapter_registry,
 
97
    ContentFactory,
 
98
    InterVersionedFile,
 
99
    VersionedFile,
 
100
    )
93
101
from bzrlib.weavefile import _read_weave_v5, write_weave_v5
94
102
 
95
103
 
 
104
class WeaveContentFactory(ContentFactory):
 
105
    """Content factory for streaming from weaves.
 
106
 
 
107
    :seealso ContentFactory:
 
108
    """
 
109
 
 
110
    def __init__(self, version, weave):
 
111
        """Create a WeaveContentFactory for version from weave."""
 
112
        ContentFactory.__init__(self)
 
113
        self.sha1 = weave.get_sha1s([version])[0]
 
114
        self.key = (version,)
 
115
        parents = weave.get_parent_map([version])[version]
 
116
        self.parents = tuple((parent,) for parent in parents)
 
117
        self.storage_kind = 'fulltext'
 
118
        self._weave = weave
 
119
 
 
120
    def get_bytes_as(self, storage_kind):
 
121
        if storage_kind == 'fulltext':
 
122
            return self._weave.get_text(self.key[0])
 
123
        else:
 
124
            raise UnavailableRepresentation(self.key, storage_kind, 'fulltext')
 
125
 
 
126
 
96
127
class Weave(VersionedFile):
97
128
    """weave - versioned text file storage.
98
129
    
263
294
 
264
295
    __contains__ = has_version
265
296
 
 
297
    def get_record_stream(self, versions, ordering, include_delta_closure):
 
298
        """Get a stream of records for versions.
 
299
 
 
300
        :param versions: The versions to include. Each version is a tuple
 
301
            (version,).
 
302
        :param ordering: Either 'unordered' or 'topological'. A topologically
 
303
            sorted stream has compression parents strictly before their
 
304
            children.
 
305
        :param include_delta_closure: If True then the closure across any
 
306
            compression parents will be included (in the opaque data).
 
307
        :return: An iterator of ContentFactory objects, each of which is only
 
308
            valid until the iterator is advanced.
 
309
        """
 
310
        if ordering == 'topological':
 
311
            parents = self.get_parent_map(versions)
 
312
            new_versions = topo_sort(parents)
 
313
            new_versions.extend(set(versions).difference(set(parents)))
 
314
            versions = new_versions
 
315
        for version in versions:
 
316
            if version in self:
 
317
                yield WeaveContentFactory(version, self)
 
318
            else:
 
319
                yield AbsentContentFactory((version,))
 
320
 
266
321
    def get_parent_map(self, version_ids):
267
322
        """See VersionedFile.get_parent_map."""
268
323
        result = {}
277
332
    def get_parents_with_ghosts(self, version_id):
278
333
        raise NotImplementedError(self.get_parents_with_ghosts)
279
334
 
 
335
    def insert_record_stream(self, stream):
 
336
        """Insert a record stream into this versioned file.
 
337
 
 
338
        :param stream: A stream of records to insert. 
 
339
        :return: None
 
340
        :seealso VersionedFile.get_record_stream:
 
341
        """
 
342
        adapters = {}
 
343
        for record in stream:
 
344
            # Raise an error when a record is missing.
 
345
            if record.storage_kind == 'absent':
 
346
                raise RevisionNotPresent([record.key[0]], self)
 
347
            # adapt to non-tuple interface
 
348
            parents = [parent[0] for parent in record.parents]
 
349
            if record.storage_kind == 'fulltext':
 
350
                self.add_lines(record.key[0], parents,
 
351
                    split_lines(record.get_bytes_as('fulltext')))
 
352
            else:
 
353
                adapter_key = record.storage_kind, 'fulltext'
 
354
                try:
 
355
                    adapter = adapters[adapter_key]
 
356
                except KeyError:
 
357
                    adapter_factory = adapter_registry.get(adapter_key)
 
358
                    adapter = adapter_factory(self)
 
359
                    adapters[adapter_key] = adapter
 
360
                lines = split_lines(adapter.get_bytes(
 
361
                    record, record.get_bytes_as(record.storage_kind)))
 
362
                try:
 
363
                    self.add_lines(record.key[0], parents, lines)
 
364
                except RevisionAlreadyPresent:
 
365
                    pass
 
366
 
280
367
    def _check_repeated_add(self, name, parents, text, sha1):
281
368
        """Check that a duplicated add is OK.
282
369
 
911
998
        """See VersionedFile.get_suffixes()."""
912
999
        return [WeaveFile.WEAVE_SUFFIX]
913
1000
 
 
1001
    def insert_record_stream(self, stream):
 
1002
        super(WeaveFile, self).insert_record_stream(stream)
 
1003
        self._save()
 
1004
 
 
1005
    @deprecated_method(one_five)
914
1006
    def join(self, other, pb=None, msg=None, version_ids=None,
915
1007
             ignore_missing=False):
916
1008
        """Join other into self and save."""