Rev 3637: Add osutils.pump_string_file helper function. in http://people.ubuntu.com/~robertc/baz2.0/bug-255656

Robert Collins robertc at robertcollins.net
Fri Aug 15 06:35:25 BST 2008


At http://people.ubuntu.com/~robertc/baz2.0/bug-255656

------------------------------------------------------------
revno: 3637
revision-id: robertc at robertcollins.net-20080815053517-fjmv6jtns6s5ui9a
parent: robertc at robertcollins.net-20080815035953-1pm7xp97h9hckouv
committer: Robert Collins <robertc at robertcollins.net>
branch nick: bug-255656
timestamp: Fri 2008-08-15 15:35:17 +1000
message:
  Add osutils.pump_string_file helper function.
modified:
  bzrlib/osutils.py              osutils.py-20050309040759-eeaff12fbf77ac86
  bzrlib/tests/test_osutils.py   test_osutils.py-20051201224856-e48ee24c12182989
  bzrlib/transport/__init__.py   transport.py-20050711165921-4978aa7ce1285ad5
=== modified file 'bzrlib/osutils.py'
--- a/bzrlib/osutils.py	2008-08-13 16:07:10 +0000
+++ b/bzrlib/osutils.py	2008-08-15 05:35:17 +0000
@@ -569,6 +569,24 @@
     return length
 
 
+def pump_string_file(bytes, file_handle, segment_size=None):
+    """Write bytes to file_handle in many smaller writes.
+
+    :param bytes: The string to write.
+    :param file_handle: The file to write to.
+    """
+    # Write data in chunks rather than all at once, because very large
+    # writes fail on some platforms (e.g. Windows with SMB  mounted
+    # drives).
+    if not segment_size:
+        segment_size = 5242880 # 5MB
+    segments = range(len(bytes) / segment_size + 1)
+    write = file_handle.write
+    for segment_index in segments:
+        segment = buffer(bytes, segment_index * segment_size, segment_size)
+        write(segment)
+
+
 def file_iterator(input_file, readsize=32768):
     while True:
         b = input_file.read(readsize)

=== modified file 'bzrlib/tests/test_osutils.py'
--- a/bzrlib/tests/test_osutils.py	2008-07-17 20:16:43 +0000
+++ b/bzrlib/tests/test_osutils.py	2008-08-15 05:35:17 +0000
@@ -37,6 +37,7 @@
         is_inside_or_parent_of_any,
         pathjoin,
         pumpfile,
+        pump_string_file,
         )
 from bzrlib.tests import (
         probe_unicode_in_user_encoding,
@@ -440,6 +441,30 @@
             message = "Data not equal.  Expected %d bytes, received %d."
             self.fail(message % (len(response_data), self.test_data_len))
 
+
+class TestPumpStringFile(TestCase):
+
+    def test_empty(self):
+        output = StringIO()
+        pump_string_file("", output)
+        self.assertEqual("", output.getvalue())
+
+    def test_more_than_segment_size(self):
+        output = StringIO()
+        pump_string_file("123456789", output, 2)
+        self.assertEqual("123456789", output.getvalue())
+
+    def test_segment_size(self):
+        output = StringIO()
+        pump_string_file("12", output, 2)
+        self.assertEqual("12", output.getvalue())
+
+    def test_segment_size_multiple(self):
+        output = StringIO()
+        pump_string_file("1234", output, 2)
+        self.assertEqual("1234", output.getvalue())
+
+
 class TestSafeUnicode(TestCase):
 
     def test_from_ascii_string(self):

=== modified file 'bzrlib/transport/__init__.py'
--- a/bzrlib/transport/__init__.py	2008-08-15 03:59:53 +0000
+++ b/bzrlib/transport/__init__.py	2008-08-15 05:35:17 +0000
@@ -254,14 +254,7 @@
         self.file_handle.close()
 
     def write(self, bytes):
-        # Write data in 5MB chunks rather than all at once, because very large
-        # writes fail on some platforms (e.g. Windows with SMB  mounted
-        # drives).
-        segment_size = 5242880 # 5MB
-        segments = range(len(bytes) / segment_size + 1)
-        for segment_index in segments:
-            segment = buffer(bytes, segment_index * segment_size, segment_size)
-            self.file_handle.write(segment)
+        osutils.pump_string_file(bytes, self.file_handle)
 
 
 class AppendBasedFileStream(FileStream):




More information about the bazaar-commits mailing list