You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@subversion.apache.org by br...@apache.org on 2014/03/11 11:53:28 UTC
svn commit: r1576277 - /subversion/trunk/subversion/libsvn_delta/compat.c
Author: brane
Date: Tue Mar 11 10:53:28 2014
New Revision: 1576277
URL: http://svn.apache.org/r1576277
Log:
Open delta source and target streams lazily in the Ev2 edit receiver.
Previously, when driving an Ev2 status editor through the Ev1->Ev2 adapter,
an empty temporary file would be created for every file mentioned in the
status report, even though a status edit drive does not transmit any text
deltas.
* subversion/libsvn_delta/compat.c
(open_delta_base, open_delta_target): Lazy-open stream handlers for opening
the delta source and target files.
(ev2_apply_textdelta): Open the delta source and target lazily.
Remove the now-unused local variable 'scratch_pool'.
Modified:
subversion/trunk/subversion/libsvn_delta/compat.c
Modified: subversion/trunk/subversion/libsvn_delta/compat.c
URL: http://svn.apache.org/viewvc/subversion/trunk/subversion/libsvn_delta/compat.c?rev=1576277&r1=1576276&r2=1576277&view=diff
==============================================================================
--- subversion/trunk/subversion/libsvn_delta/compat.c (original)
+++ subversion/trunk/subversion/libsvn_delta/compat.c Tue Mar 11 10:53:28 2014
@@ -791,6 +791,26 @@ window_handler(svn_txdelta_window_t *win
return svn_error_trace(err);
}
+/* Lazy-open handler for getting a read-only stream of the delta base. */
+static svn_error_t *
+open_delta_base(svn_stream_t **stream, void *baton,
+ apr_pool_t *result_pool, apr_pool_t *scratch_pool)
+{
+ const char *const delta_base = baton;
+ return svn_stream_open_readonly(stream, delta_base,
+ result_pool, scratch_pool);
+}
+
+/* Lazy-open handler for opening a stream for the delta result. */
+static svn_error_t *
+open_delta_target(svn_stream_t **stream, void *baton,
+ apr_pool_t *result_pool, apr_pool_t *scratch_pool)
+{
+ const char **delta_target = baton;
+ return svn_stream_open_unique(stream, delta_target, NULL,
+ svn_io_file_del_on_pool_cleanup,
+ result_pool, scratch_pool);
+}
static svn_error_t *
ev2_apply_textdelta(void *file_baton,
@@ -804,8 +824,6 @@ ev2_apply_textdelta(void *file_baton,
struct handler_baton *hb = apr_pcalloc(handler_pool, sizeof(*hb));
struct change_node *change;
svn_stream_t *target;
- /* ### fix this. for now, we know this has a "short" lifetime. */
- apr_pool_t *scratch_pool = handler_pool;
change = locate_change(fb->eb, fb->path);
SVN_ERR_ASSERT(change->contents_abspath == NULL);
@@ -816,12 +834,13 @@ ev2_apply_textdelta(void *file_baton,
if (! fb->delta_base)
hb->source = svn_stream_empty(handler_pool);
else
- SVN_ERR(svn_stream_open_readonly(&hb->source, fb->delta_base, handler_pool,
- scratch_pool));
-
- SVN_ERR(svn_stream_open_unique(&target, &change->contents_abspath, NULL,
- svn_io_file_del_on_pool_cleanup,
- fb->eb->edit_pool, scratch_pool));
+ hb->source = svn_stream_lazyopen_create(open_delta_base,
+ (char*)fb->delta_base,
+ FALSE, handler_pool);
+
+ target = svn_stream_lazyopen_create(open_delta_target,
+ &change->contents_abspath,
+ FALSE, fb->eb->edit_pool);
svn_txdelta_apply(hb->source, target,
NULL, NULL,