[[[
When committing a new gigantic file, ra-neon spends a long time
calculating a text delta and spooling it to disk, during which time
application progress meters are left hanging. Unless we call the
progress callback here, too, so let's do that.
* subversion/libsvn_ra_neon/ra_neon.h
(svn_ra_neon__session_t): Add fields for progress_func and baton.
* subversion/libsvn_ra_neon/session.c
(svn_ra_neon__open): Save progress_func and baton in ras.
* subversion/libsvn_ra_neon/commit.c
(put_baton_t): Add fields for progress bytes, session baton, and pool.
(commit_stream_write): Add bytes written to pb->progress and pass it
to the progress callback.
(commit_apply_txdelta): Set session baton and pool in put_baton.
]]]
Index: subversion/libsvn_ra_neon/session.c
===================================================================
--- subversion/libsvn_ra_neon/session.c (revision 26021)
+++ subversion/libsvn_ra_neon/session.c (working copy)
@@ -782,6 +782,8 @@
ras->callbacks = callbacks;
ras->callback_baton = callback_baton;
ras->compression = compression;
+ ras->progress_baton = callbacks->progress_baton;
+ ras->progress_func = callbacks->progress_func;
/* save config and server group in the auth parameter hash */
svn_auth_set_parameter(ras->callbacks->auth_baton,
SVN_AUTH_PARAM_CONFIG, cfg);
Index: subversion/libsvn_ra_neon/ra_neon.h
===================================================================
--- subversion/libsvn_ra_neon/ra_neon.h (revision 26021)
+++ subversion/libsvn_ra_neon/ra_neon.h (working copy)
@@ -95,6 +95,9 @@
svn_boolean_t compression; /* should we use http compression? */
const char *uuid; /* repository UUID */
+
+ svn_ra_progress_notify_func_t progress_func;
+ void *progress_baton;
} svn_ra_neon__session_t;
Index: subversion/libsvn_ra_neon/commit.c
===================================================================
--- subversion/libsvn_ra_neon/commit.c (revision 26021)
+++ subversion/libsvn_ra_neon/commit.c (working copy)
@@ -105,6 +105,9 @@
apr_file_t *tmpfile; /* may be NULL for content-less file */
svn_stringbuf_t *fname; /* may be NULL for content-less file */
const char *base_checksum; /* hex md5 of base text; may be null */
+ apr_off_t progress;
+ svn_ra_neon__session_t *ras;
+ apr_pool_t *pool;
} put_baton_t;
typedef struct
@@ -1122,6 +1125,8 @@
if (status)
return svn_error_wrap_apr(status,
_("Could not write svndiff to temp file"));
+ pb->progress += *len;
+ pb->ras->progress_func(pb->progress, -1, pb->ras->progress_baton, pb->pool);
return SVN_NO_ERROR;
}
@@ -1138,6 +1143,8 @@
svn_stream_t *stream;
baton = apr_pcalloc(file->pool, sizeof(*baton));
+ baton->ras = file->cc->ras;
+ baton->pool = pool;
file->put_baton = baton;
if (base_checksum)
---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscribe@subversion.tigris.org
For additional commands, e-mail: dev-help@subversion.tigris.org
Received on Fri Aug 17 02:45:22 2007