You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@subversion.apache.org by ko...@apache.org on 2015/09/16 12:06:04 UTC

svn commit: r1703374 - in /subversion/branches/ra_serf-stream-commit/subversion: libsvn_delta/svndiff.c tests/libsvn_delta/random-test.c

Author: kotkov
Date: Wed Sep 16 10:06:04 2015
New Revision: 1703374

URL: http://svn.apache.org/r1703374
Log:
On the ra_serf-stream-commit branch: Provide a rough implementation for
the svn_txdelta_to_svndiff_stream() function.

* subversion\libsvn_delta\svndiff.c
  (svndiff_stream_baton_t): New baton.
  (svndiff_stream_write_fn): Put the svndiff-format diff originating
   from text delta windows into a temporary buffer.
  (svndiff_stream_read_fn): Give the currently buffered data to the caller.
   Consume the next delta window if there is no buffered data remaining.
  (svn_txdelta_to_svndiff_stream): Set up a pull- and a push-stream.  Install
   the read and write functions, and return the pull stream to the caller.

* subversion\tests\libsvn_delta\random-test.c
  (test_funcs): The random_txdelta_to_stream_test() no longer fails.

Modified:
    subversion/branches/ra_serf-stream-commit/subversion/libsvn_delta/svndiff.c
    subversion/branches/ra_serf-stream-commit/subversion/tests/libsvn_delta/random-test.c

Modified: subversion/branches/ra_serf-stream-commit/subversion/libsvn_delta/svndiff.c
URL: http://svn.apache.org/viewvc/subversion/branches/ra_serf-stream-commit/subversion/libsvn_delta/svndiff.c?rev=1703374&r1=1703373&r2=1703374&view=diff
==============================================================================
--- subversion/branches/ra_serf-stream-commit/subversion/libsvn_delta/svndiff.c (original)
+++ subversion/branches/ra_serf-stream-commit/subversion/libsvn_delta/svndiff.c Wed Sep 16 10:06:04 2015
@@ -954,11 +954,99 @@ svn_txdelta__read_raw_window_len(apr_siz
   return SVN_NO_ERROR;
 }
 
+typedef struct svndiff_stream_baton_t
+{
+  apr_pool_t *scratch_pool;
+  svn_txdelta_stream_t *txstream;
+  svn_txdelta_window_handler_t handler;
+  void *handler_baton;
+  svn_stringbuf_t *window_buffer;
+  apr_size_t read_pos;
+  svn_boolean_t hit_eof;
+} svndiff_stream_baton_t;
+
+static svn_error_t *
+svndiff_stream_write_fn(void *baton, const char *data, apr_size_t *len)
+{
+  svndiff_stream_baton_t *b = baton;
+
+  svn_stringbuf_appendbytes(b->window_buffer, data, *len);
+
+  return SVN_NO_ERROR;
+}
+
+static svn_error_t *
+svndiff_stream_read_fn(void *baton, char *buffer, apr_size_t *len)
+{
+  svndiff_stream_baton_t *b = baton;
+  apr_size_t left = *len;
+  apr_size_t read = 0;
+
+  /* ### TODO: As of now, we are tossing the memory back and forth in this
+         implementation with the intermediate buffer.  A better way would be
+         to implement a state-based parser, but this should work for now.
+  */
+  while (left && !b->hit_eof)
+    {
+      apr_size_t chunk_size;
+
+      if (b->read_pos == b->window_buffer->len)
+        {
+          svn_txdelta_window_t *window;
+
+          svn_pool_clear(b->scratch_pool);
+          svn_stringbuf_setempty(b->window_buffer);
+          SVN_ERR(svn_txdelta_next_window(&window, b->txstream,
+                                          b->scratch_pool));
+          SVN_ERR(b->handler(window, b->handler_baton));
+          b->read_pos = 0;
+
+          if (!window)
+            b->hit_eof = TRUE;
+        }
+
+      if (left > b->window_buffer->len - b->read_pos)
+        chunk_size = b->window_buffer->len - b->read_pos;
+      else
+        chunk_size = left;
+
+      memcpy(buffer, b->window_buffer->data + b->read_pos, chunk_size);
+      b->read_pos += chunk_size;
+      buffer += chunk_size;
+      read += chunk_size;
+      left -= chunk_size;
+    }
+
+  *len = read;
+  return SVN_NO_ERROR;
+}
+
 svn_stream_t *
 svn_txdelta_to_svndiff_stream(svn_txdelta_stream_t *txstream,
                               int svndiff_version,
                               int compression_level,
                               apr_pool_t *pool)
 {
-  return NULL;
+  svndiff_stream_baton_t *baton;
+  svn_stream_t *push_stream;
+  svn_stream_t *pull_stream;
+
+  baton = apr_pcalloc(pool, sizeof(*baton));
+  baton->scratch_pool = svn_pool_create(pool);
+  baton->txstream = txstream;
+  baton->window_buffer = svn_stringbuf_create_empty(pool);
+  baton->hit_eof = FALSE;
+  baton->read_pos = 0;
+
+  push_stream = svn_stream_create(baton, pool);
+  svn_stream_set_write(push_stream, svndiff_stream_write_fn);
+
+  svn_txdelta_to_svndiff3(&baton->handler, &baton->handler_baton,
+                          push_stream, svndiff_version,
+                          compression_level, pool);
+
+  pull_stream = svn_stream_create(baton, pool);
+  svn_stream_set_read2(pull_stream, NULL, svndiff_stream_read_fn);
+
+  return pull_stream;
 }

Modified: subversion/branches/ra_serf-stream-commit/subversion/tests/libsvn_delta/random-test.c
URL: http://svn.apache.org/viewvc/subversion/branches/ra_serf-stream-commit/subversion/tests/libsvn_delta/random-test.c?rev=1703374&r1=1703373&r2=1703374&view=diff
==============================================================================
--- subversion/branches/ra_serf-stream-commit/subversion/tests/libsvn_delta/random-test.c (original)
+++ subversion/branches/ra_serf-stream-commit/subversion/tests/libsvn_delta/random-test.c Wed Sep 16 10:06:04 2015
@@ -623,8 +623,8 @@ static struct svn_test_descriptor_t test
                    "random delta test"),
     SVN_TEST_PASS2(random_combine_test,
                    "random combine delta test"),
-    SVN_TEST_XFAIL2(random_txdelta_to_stream_test,
-                    "random txdelta to svndiff stream test"),
+    SVN_TEST_PASS2(random_txdelta_to_stream_test,
+                   "random txdelta to svndiff stream test"),
 #ifdef SVN_RANGE_INDEX_TEST_H
     SVN_TEST_PASS2(random_range_index_test,
                    "random range index test"),