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