~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to bzrlib/weave.py

Basic stream insertion, no fast path yet for knit to knit.

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,
87
86
        WeaveRevisionNotPresent,
88
87
        )
89
88
import bzrlib.errors as errors
90
 
from bzrlib.osutils import sha_strings
 
89
from bzrlib.osutils import sha_strings, split_lines
91
90
import bzrlib.patiencediff
 
91
from bzrlib.trace import mutter
92
92
from bzrlib.tsort import topo_sort
93
93
from bzrlib.versionedfile import (
 
94
    adapter_registry,
94
95
    ContentFactory,
95
96
    InterVersionedFile,
96
97
    VersionedFile,
324
325
    def get_parents_with_ghosts(self, version_id):
325
326
        raise NotImplementedError(self.get_parents_with_ghosts)
326
327
 
 
328
    def insert_record_stream(self, stream):
 
329
        """Insert a record stream into this versioned file.
 
330
 
 
331
        :param stream: A stream of records to insert. 
 
332
        :return: None
 
333
        :seealso VersionedFile.get_record_stream:
 
334
        """
 
335
        adapters = {}
 
336
        for record in stream:
 
337
            # adapt to non-tuple interface
 
338
            parents = [parent[0] for parent in record.parents]
 
339
            if record.storage_kind == 'fulltext':
 
340
                self.add_lines(record.key[0], parents,
 
341
                    split_lines(record.get_bytes_as('fulltext')))
 
342
            else:
 
343
                adapter_key = record.storage_kind, 'fulltext'
 
344
                try:
 
345
                    adapter = adapters[adapter_key]
 
346
                except KeyError:
 
347
                    adapter_factory = adapter_registry.get(adapter_key)
 
348
                    adapter = adapter_factory(self)
 
349
                    adapters[adapter_key] = adapter
 
350
                lines = split_lines(adapter.get_bytes(
 
351
                    record, record.get_bytes_as(record.storage_kind)))
 
352
                self.add_lines(record.key[0], parents, lines)
 
353
 
327
354
    def _check_repeated_add(self, name, parents, text, sha1):
328
355
        """Check that a duplicated add is OK.
329
356