Rev 3358: Basic stream insertion, no fast path yet for knit to knit. in http://people.ubuntu.com/~robertc/baz2.0/versioned_files
Robert Collins
robertc at robertcollins.net
Wed Apr 23 06:17:10 BST 2008
At http://people.ubuntu.com/~robertc/baz2.0/versioned_files
------------------------------------------------------------
revno: 3358
revision-id: robertc at robertcollins.net-20080423051705-q3237l16tnx9niz3
parent: robertc at robertcollins.net-20080423035302-8dpsshc599ws75qu
committer: Robert Collins <robertc at robertcollins.net>
branch nick: data_stream_revamp
timestamp: Wed 2008-04-23 15:17:05 +1000
message:
Basic stream insertion, no fast path yet for knit to knit.
modified:
bzrlib/knit.py knit.py-20051212171256-f056ac8f0fbe1bd9
bzrlib/tests/test_versionedfile.py test_versionedfile.py-20060222045249-db45c9ed14a1c2e5
bzrlib/versionedfile.py versionedfile.py-20060222045106-5039c71ee3b65490
bzrlib/weave.py knit.py-20050627021749-759c29984154256b
=== modified file 'bzrlib/knit.py'
--- a/bzrlib/knit.py 2008-04-23 03:53:02 +0000
+++ b/bzrlib/knit.py 2008-04-23 05:17:05 +0000
@@ -107,6 +107,7 @@
contains_linebreaks,
sha_string,
sha_strings,
+ split_lines,
)
from bzrlib.symbol_versioning import (
DEPRECATED_PARAMETER,
@@ -118,6 +119,7 @@
from bzrlib.tuned_gzip import GzipFile, bytes_to_gzip
import bzrlib.ui
from bzrlib.versionedfile import (
+ adapter_registry,
ContentFactory,
InterVersionedFile,
VersionedFile,
@@ -1048,6 +1050,32 @@
return KnitVersionedFile(self.filename, self.transport,
factory=factory, index=index, access_method=access)
+ def insert_record_stream(self, stream):
+ """Insert a record stream into this versioned file.
+
+ :param stream: A stream of records to insert.
+ :return: None
+ :seealso VersionedFile.get_record_stream:
+ """
+ adapters = {}
+ for record in stream:
+ # adapt to non-tuple interface
+ parents = [parent[0] for parent in record.parents]
+ if record.storage_kind == 'fulltext':
+ self.add_lines(record.key[0], parents,
+ split_lines(record.get_bytes_as('fulltext')))
+ else:
+ adapter_key = record.storage_kind, 'fulltext'
+ try:
+ adapter = adapters[adapter_key]
+ except KeyError:
+ adapter_factory = adapter_registry.get(adapter_key)
+ adapter = adapter_factory(self)
+ adapters[adapter_key] = adapter
+ lines = split_lines(adapter.get_bytes(
+ record, record.get_bytes_as(record.storage_kind)))
+ self.add_lines(record.key[0], parents, lines)
+
def versions(self):
"""See VersionedFile.versions."""
if 'evil' in debug.debug_flags:
=== modified file 'bzrlib/tests/test_versionedfile.py'
--- a/bzrlib/tests/test_versionedfile.py 2008-04-23 03:53:02 +0000
+++ b/bzrlib/tests/test_versionedfile.py 2008-04-23 05:17:05 +0000
@@ -204,6 +204,86 @@
self.assertEqual(set([('base',), ('left',), ('right',), ('merged',)]),
seen)
+ def test_insert_record_stream_empty(self):
+ """Inserting an empty record stream should work."""
+ f = self.get_file()
+ stream = []
+ f.insert_record_stream([])
+
+ def assertIdenticalVersionedFile(self, left, right):
+ """Assert that left and right have the same contents."""
+ self.assertEqual(set(left.versions()), set(right.versions()))
+ self.assertEqual(left.get_parent_map(left.versions()),
+ right.get_parent_map(right.versions()))
+ for v in left.versions():
+ self.assertEqual(left.get_text(v), right.get_text(v))
+
+ def test_insert_record_stream_fulltexts(self):
+ """Any file should accept a stream of fulltexts."""
+ f = self.get_file()
+ weave_vf = WeaveFile('source', get_transport(self.get_url('.')),
+ create=True, get_scope=self.get_transaction)
+ source, _ = get_diamond_vf(weave_vf)
+ stream = source.get_record_stream(source.versions(), 'topological',
+ False)
+ f.insert_record_stream(stream)
+ self.assertIdenticalVersionedFile(f, source)
+
+ def test_insert_record_stream_fulltexts_noeol(self):
+ """Any file should accept a stream of fulltexts."""
+ f = self.get_file()
+ weave_vf = WeaveFile('source', get_transport(self.get_url('.')),
+ create=True, get_scope=self.get_transaction)
+ source, _ = get_diamond_vf(weave_vf, trailing_eol=False)
+ stream = source.get_record_stream(source.versions(), 'topological',
+ False)
+ f.insert_record_stream(stream)
+ self.assertIdenticalVersionedFile(f, source)
+
+ def test_insert_record_stream_annotated_knits(self):
+ """Any file should accept a stream from plain knits."""
+ f = self.get_file()
+ source = make_file_knit('source', get_transport(self.get_url('.')),
+ create=True)
+ get_diamond_vf(source)
+ stream = source.get_record_stream(source.versions(), 'topological',
+ False)
+ f.insert_record_stream(stream)
+ self.assertIdenticalVersionedFile(f, source)
+
+ def test_insert_record_stream_annotated_knits_noeol(self):
+ """Any file should accept a stream from plain knits."""
+ f = self.get_file()
+ source = make_file_knit('source', get_transport(self.get_url('.')),
+ create=True)
+ get_diamond_vf(source, trailing_eol=False)
+ stream = source.get_record_stream(source.versions(), 'topological',
+ False)
+ f.insert_record_stream(stream)
+ self.assertIdenticalVersionedFile(f, source)
+
+ def test_insert_record_stream_plain_knits(self):
+ """Any file should accept a stream from plain knits."""
+ f = self.get_file()
+ source = make_file_knit('source', get_transport(self.get_url('.')),
+ create=True, factory=KnitPlainFactory())
+ get_diamond_vf(source)
+ stream = source.get_record_stream(source.versions(), 'topological',
+ False)
+ f.insert_record_stream(stream)
+ self.assertIdenticalVersionedFile(f, source)
+
+ def test_insert_record_stream_plain_knits_noeol(self):
+ """Any file should accept a stream from plain knits."""
+ f = self.get_file()
+ source = make_file_knit('source', get_transport(self.get_url('.')),
+ create=True, factory=KnitPlainFactory())
+ get_diamond_vf(source, trailing_eol=False)
+ stream = source.get_record_stream(source.versions(), 'topological',
+ False)
+ f.insert_record_stream(stream)
+ self.assertIdenticalVersionedFile(f, source)
+
def test_adds_with_parent_texts(self):
f = self.get_file()
parent_texts = {}
=== modified file 'bzrlib/versionedfile.py'
--- a/bzrlib/versionedfile.py 2008-04-23 03:53:02 +0000
+++ b/bzrlib/versionedfile.py 2008-04-23 05:17:05 +0000
@@ -126,6 +126,15 @@
"""Returns whether version is present."""
raise NotImplementedError(self.has_version)
+ def insert_record_stream(self, stream):
+ """Insert a record stream into this versioned file.
+
+ :param stream: A stream of records to insert.
+ :return: None
+ :seealso VersionedFile.get_record_stream:
+ """
+ raise NotImplementedError
+
def add_lines(self, version_id, parents, lines, parent_texts=None,
left_matching_blocks=None, nostore_sha=None, random_id=False,
check_content=True):
=== modified file 'bzrlib/weave.py'
--- a/bzrlib/weave.py 2008-04-16 04:07:40 +0000
+++ b/bzrlib/weave.py 2008-04-23 05:17:05 +0000
@@ -78,7 +78,6 @@
from bzrlib import (
progress,
)
-from bzrlib.trace import mutter
from bzrlib.errors import (WeaveError, WeaveFormatError, WeaveParentMismatch,
RevisionAlreadyPresent,
RevisionNotPresent,
@@ -87,10 +86,12 @@
WeaveRevisionNotPresent,
)
import bzrlib.errors as errors
-from bzrlib.osutils import sha_strings
+from bzrlib.osutils import sha_strings, split_lines
import bzrlib.patiencediff
+from bzrlib.trace import mutter
from bzrlib.tsort import topo_sort
from bzrlib.versionedfile import (
+ adapter_registry,
ContentFactory,
InterVersionedFile,
VersionedFile,
@@ -324,6 +325,32 @@
def get_parents_with_ghosts(self, version_id):
raise NotImplementedError(self.get_parents_with_ghosts)
+ def insert_record_stream(self, stream):
+ """Insert a record stream into this versioned file.
+
+ :param stream: A stream of records to insert.
+ :return: None
+ :seealso VersionedFile.get_record_stream:
+ """
+ adapters = {}
+ for record in stream:
+ # adapt to non-tuple interface
+ parents = [parent[0] for parent in record.parents]
+ if record.storage_kind == 'fulltext':
+ self.add_lines(record.key[0], parents,
+ split_lines(record.get_bytes_as('fulltext')))
+ else:
+ adapter_key = record.storage_kind, 'fulltext'
+ try:
+ adapter = adapters[adapter_key]
+ except KeyError:
+ adapter_factory = adapter_registry.get(adapter_key)
+ adapter = adapter_factory(self)
+ adapters[adapter_key] = adapter
+ lines = split_lines(adapter.get_bytes(
+ record, record.get_bytes_as(record.storage_kind)))
+ self.add_lines(record.key[0], parents, lines)
+
def _check_repeated_add(self, name, parents, text, sha1):
"""Check that a duplicated add is OK.
More information about the bazaar-commits
mailing list