78
78
from bzrlib import (
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,
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 (
93
101
from bzrlib.weavefile import _read_weave_v5, write_weave_v5
104
class WeaveContentFactory(ContentFactory):
105
"""Content factory for streaming from weaves.
107
:seealso ContentFactory:
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'
120
def get_bytes_as(self, storage_kind):
121
if storage_kind == 'fulltext':
122
return self._weave.get_text(self.key[0])
124
raise UnavailableRepresentation(self.key, storage_kind, 'fulltext')
96
127
class Weave(VersionedFile):
97
128
"""weave - versioned text file storage.
264
295
__contains__ = has_version
297
def get_record_stream(self, versions, ordering, include_delta_closure):
298
"""Get a stream of records for versions.
300
:param versions: The versions to include. Each version is a tuple
302
:param ordering: Either 'unordered' or 'topological'. A topologically
303
sorted stream has compression parents strictly before their
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.
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:
317
yield WeaveContentFactory(version, self)
319
yield AbsentContentFactory((version,))
266
321
def get_parent_map(self, version_ids):
267
322
"""See VersionedFile.get_parent_map."""
277
332
def get_parents_with_ghosts(self, version_id):
278
333
raise NotImplementedError(self.get_parents_with_ghosts)
335
def insert_record_stream(self, stream):
336
"""Insert a record stream into this versioned file.
338
:param stream: A stream of records to insert.
340
:seealso VersionedFile.get_record_stream:
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')))
353
adapter_key = record.storage_kind, 'fulltext'
355
adapter = adapters[adapter_key]
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)))
363
self.add_lines(record.key[0], parents, lines)
364
except RevisionAlreadyPresent:
280
367
def _check_repeated_add(self, name, parents, text, sha1):
281
368
"""Check that a duplicated add is OK.
911
998
"""See VersionedFile.get_suffixes()."""
912
999
return [WeaveFile.WEAVE_SUFFIX]
1001
def insert_record_stream(self, stream):
1002
super(WeaveFile, self).insert_record_stream(stream)
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."""