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 10:59:33 UTC
svn commit: r1703369 - in
/subversion/branches/ra_serf-stream-commit/subversion: include/svn_delta.h
libsvn_delta/cancel.c libsvn_delta/default_editor.c
Author: kotkov
Date: Wed Sep 16 08:59:32 2015
New Revision: 1703369
URL: http://svn.apache.org/r1703369
Log:
On the ra_serf-stream-commit branch: Sketch the new delta editor callback.
It would allow us to apply an existing svn_txdelta_stream_t delta stream
to a file. Using this callback in libsvn_ra_serf would allow us to get rid
of storing the svndiff into a temporary file prior to PUT'tting contents.
* subversion\include\svn_delta.h
(svn_txdelta_stream_open_func_t): New typedef.
(svn_delta_editor_t): Add a forward declaration for this type.
(svn_delta_editor_t.apply_textdelta_stream): New callback.
* subversion\libsvn_delta\default_editor.c
(apply_textdelta_stream): Provide default implementation for this callback
that fallbacks to apply_textdelta().
(default_editor): Extend the default instance of svn_delta_editor_t.
* subversion\libsvn_delta\cancel.c
(apply_textdelta_stream): Implement this forwarding callback, and ...
(svn_delta_get_cancellation_editor): ...install it here.
Modified:
subversion/branches/ra_serf-stream-commit/subversion/include/svn_delta.h
subversion/branches/ra_serf-stream-commit/subversion/libsvn_delta/cancel.c
subversion/branches/ra_serf-stream-commit/subversion/libsvn_delta/default_editor.c
Modified: subversion/branches/ra_serf-stream-commit/subversion/include/svn_delta.h
URL: http://svn.apache.org/viewvc/subversion/branches/ra_serf-stream-commit/subversion/include/svn_delta.h?rev=1703369&r1=1703368&r2=1703369&view=diff
==============================================================================
--- subversion/branches/ra_serf-stream-commit/subversion/include/svn_delta.h (original)
+++ subversion/branches/ra_serf-stream-commit/subversion/include/svn_delta.h Wed Sep 16 08:59:32 2015
@@ -330,6 +330,16 @@ typedef svn_error_t *
typedef const unsigned char *
(*svn_txdelta_md5_digest_fn_t)(void *baton);
+/** A typedef for a function that opens a #svn_txdelta_stream_t object,
+ * allocated in @a pool. @a baton is provided by the caller.
+ *
+ * @since New in 1.10.
+ */
+typedef svn_error_t *
+(*svn_txdelta_stream_open_func_t)(svn_txdelta_stream_t **txdelta_stream,
+ void *baton,
+ apr_pool_t *pool);
+
/** Create and return a generic text delta stream with @a baton, @a
* next_window and @a md5_digest. Allocate the new stream in @a
* pool.
@@ -662,6 +672,9 @@ svn_txdelta_skip_svndiff_window(apr_file
* @{
*/
+/* Forward declarations. */
+typedef struct svn_delta_editor_t svn_delta_editor_t;
+
/** A structure full of callback functions the delta source will invoke
* as it produces the delta.
*
@@ -843,7 +856,7 @@ svn_txdelta_skip_svndiff_window(apr_file
* dead; the only further operation which may be called on the editor
* is @c abort_edit.
*/
-typedef struct svn_delta_editor_t
+struct svn_delta_editor_t
{
/** Set the target revision for this edit to @a target_revision. This
* call, if used, should precede all other editor calls.
@@ -1115,9 +1128,44 @@ typedef struct svn_delta_editor_t
svn_error_t *(*abort_edit)(void *edit_baton,
apr_pool_t *scratch_pool);
+ /** Apply a text delta stream, yielding the new revision of a file.
+ *
+ * @a file_baton indicates the file we're creating or updating, and the
+ * ancestor file on which it is based; it is the baton set by some
+ * prior @c add_file or @c open_file callback.
+ *
+ * @a open_func is a function that opens a #svn_txdelta_stream_t object.
+ * @a open_baton is provided by the caller.
+ *
+ * @a base_checksum is the hex MD5 digest for the base text against
+ * which the delta is being applied; it is ignored if NULL, and may
+ * be ignored even if not NULL. If it is not ignored, it must match
+ * the checksum of the base text against which svndiff data is being
+ * applied; if it does not, @c apply_textdelta_stream call which detects
+ * the mismatch will return the error SVN_ERR_CHECKSUM_MISMATCH
+ * (if there is no base text, there may still be an error if
+ * @a base_checksum is neither NULL nor the hex MD5 checksum of the
+ * empty string).
+ *
+ * @a result_checksum is the hex MD5 digest for the fulltext that
+ * resulted from a delta application. The checksum is ignored if NULL.
+ * If not null, it is compared to the checksum of the new fulltext, and
+ * the error SVN_ERR_CHECKSUM_MISMATCH is returned if they do not match.
+ *
+ * Any temporary allocations may be performed in @a scratch_pool.
+ */
+ svn_error_t *(*apply_textdelta_stream)(
+ const svn_delta_editor_t *editor,
+ void *file_baton,
+ const char *base_checksum,
+ const char *result_checksum,
+ svn_txdelta_stream_open_func_t open_func,
+ void *open_baton,
+ apr_pool_t *scratch_pool);
+
/* Be sure to update svn_delta_get_cancellation_editor() and
* svn_delta_default_editor() if you add a new callback here. */
-} svn_delta_editor_t;
+};
/** Return a default delta editor template, allocated in @a pool.
Modified: subversion/branches/ra_serf-stream-commit/subversion/libsvn_delta/cancel.c
URL: http://svn.apache.org/viewvc/subversion/branches/ra_serf-stream-commit/subversion/libsvn_delta/cancel.c?rev=1703369&r1=1703368&r2=1703369&view=diff
==============================================================================
--- subversion/branches/ra_serf-stream-commit/subversion/libsvn_delta/cancel.c (original)
+++ subversion/branches/ra_serf-stream-commit/subversion/libsvn_delta/cancel.c Wed Sep 16 08:59:32 2015
@@ -222,6 +222,28 @@ apply_textdelta(void *file_baton,
}
static svn_error_t *
+apply_textdelta_stream(const svn_delta_editor_t *editor,
+ void *file_baton,
+ const char *base_checksum,
+ const char *result_checksum,
+ svn_txdelta_stream_open_func_t open_func,
+ void *open_baton,
+ apr_pool_t *scratch_pool)
+{
+ struct file_baton *fb = file_baton;
+ struct edit_baton *eb = fb->edit_baton;
+
+ SVN_ERR(eb->cancel_func(eb->cancel_baton));
+
+ return eb->wrapped_editor->apply_textdelta_stream(eb->wrapped_editor,
+ fb->wrapped_file_baton,
+ base_checksum,
+ result_checksum,
+ open_func, open_baton,
+ scratch_pool);
+}
+
+static svn_error_t *
close_file(void *file_baton,
const char *text_checksum,
apr_pool_t *pool)
@@ -354,6 +376,7 @@ svn_delta_get_cancellation_editor(svn_ca
tree_editor->add_file = add_file;
tree_editor->open_file = open_file;
tree_editor->apply_textdelta = apply_textdelta;
+ tree_editor->apply_textdelta_stream = apply_textdelta_stream;
tree_editor->change_file_prop = change_file_prop;
tree_editor->close_file = close_file;
tree_editor->absent_file = absent_file;
Modified: subversion/branches/ra_serf-stream-commit/subversion/libsvn_delta/default_editor.c
URL: http://svn.apache.org/viewvc/subversion/branches/ra_serf-stream-commit/subversion/libsvn_delta/default_editor.c?rev=1703369&r1=1703368&r2=1703369&view=diff
==============================================================================
--- subversion/branches/ra_serf-stream-commit/subversion/libsvn_delta/default_editor.c (original)
+++ subversion/branches/ra_serf-stream-commit/subversion/libsvn_delta/default_editor.c Wed Sep 16 08:59:32 2015
@@ -133,6 +133,33 @@ close_file(void *file_baton,
}
+static svn_error_t *
+apply_textdelta_stream(const svn_delta_editor_t *editor,
+ void *file_baton,
+ const char *base_checksum,
+ const char *result_checksum,
+ svn_txdelta_stream_open_func_t open_func,
+ void *open_baton,
+ apr_pool_t *scratch_pool)
+{
+ svn_txdelta_window_handler_t handler;
+ void *handler_baton;
+
+ SVN_ERR(editor->apply_textdelta(file_baton, base_checksum,
+ scratch_pool, &handler,
+ &handler_baton));
+ if (handler != svn_delta_noop_window_handler)
+ {
+ svn_txdelta_stream_t *txdelta_stream;
+
+ SVN_ERR(open_func(&txdelta_stream, open_baton, scratch_pool));
+ SVN_ERR(svn_txdelta_send_txstream(txdelta_stream, handler,
+ handler_baton, scratch_pool));
+ }
+
+ return SVN_NO_ERROR;
+}
+
static const svn_delta_editor_t default_editor =
{
@@ -151,7 +178,8 @@ static const svn_delta_editor_t default_
close_file,
absent_xxx_func,
single_baton_func,
- single_baton_func
+ single_baton_func,
+ apply_textdelta_stream
};
svn_delta_editor_t *