You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@subversion.apache.org by da...@apache.org on 2010/08/05 22:56:20 UTC
svn commit: r982782 [1/2] - in /subversion/branches/atomic-revprop: ./
subversion/include/private/ subversion/libsvn_diff/
subversion/libsvn_ra_serf/ subversion/libsvn_repos/ subversion/libsvn_subr/
subversion/libsvn_wc/ subversion/tests/cmdline/ subve...
Author: danielsh
Date: Thu Aug 5 20:56:19 2010
New Revision: 982782
URL: http://svn.apache.org/viewvc?rev=982782&view=rev
Log:
On the 'atomic-revprop' branch, merge r982401 through r982780 from trunk.
Modified:
subversion/branches/atomic-revprop/ (props changed)
subversion/branches/atomic-revprop/subversion/include/private/svn_mergeinfo_private.h
subversion/branches/atomic-revprop/subversion/libsvn_diff/parse-diff.c
subversion/branches/atomic-revprop/subversion/libsvn_ra_serf/blame.c
subversion/branches/atomic-revprop/subversion/libsvn_ra_serf/commit.c
subversion/branches/atomic-revprop/subversion/libsvn_ra_serf/get_deleted_rev.c
subversion/branches/atomic-revprop/subversion/libsvn_ra_serf/getdate.c
subversion/branches/atomic-revprop/subversion/libsvn_ra_serf/getlocations.c
subversion/branches/atomic-revprop/subversion/libsvn_ra_serf/getlocationsegments.c
subversion/branches/atomic-revprop/subversion/libsvn_ra_serf/getlocks.c
subversion/branches/atomic-revprop/subversion/libsvn_ra_serf/locks.c
subversion/branches/atomic-revprop/subversion/libsvn_ra_serf/log.c
subversion/branches/atomic-revprop/subversion/libsvn_ra_serf/merge.c
subversion/branches/atomic-revprop/subversion/libsvn_ra_serf/mergeinfo.c
subversion/branches/atomic-revprop/subversion/libsvn_ra_serf/options.c
subversion/branches/atomic-revprop/subversion/libsvn_ra_serf/property.c
subversion/branches/atomic-revprop/subversion/libsvn_ra_serf/ra_serf.h
subversion/branches/atomic-revprop/subversion/libsvn_ra_serf/replay.c
subversion/branches/atomic-revprop/subversion/libsvn_ra_serf/serf.c
subversion/branches/atomic-revprop/subversion/libsvn_ra_serf/update.c
subversion/branches/atomic-revprop/subversion/libsvn_ra_serf/util.c
subversion/branches/atomic-revprop/subversion/libsvn_repos/load.c
subversion/branches/atomic-revprop/subversion/libsvn_subr/mergeinfo.c
subversion/branches/atomic-revprop/subversion/libsvn_wc/deprecated.c
subversion/branches/atomic-revprop/subversion/libsvn_wc/wc_db.c
subversion/branches/atomic-revprop/subversion/libsvn_wc/wc_db.h
subversion/branches/atomic-revprop/subversion/tests/cmdline/export_tests.py
subversion/branches/atomic-revprop/subversion/tests/cmdline/merge_authz_tests.py
subversion/branches/atomic-revprop/subversion/tests/cmdline/svnadmin_tests.py
subversion/branches/atomic-revprop/subversion/tests/cmdline/svnrdump_tests.py
subversion/branches/atomic-revprop/subversion/tests/cmdline/svntest/sandbox.py
subversion/branches/atomic-revprop/subversion/tests/cmdline/update_tests.py
subversion/branches/atomic-revprop/subversion/tests/libsvn_diff/parse-diff-test.c
subversion/branches/atomic-revprop/subversion/tests/libsvn_wc/pristine-store-test.c
Propchange: subversion/branches/atomic-revprop/
------------------------------------------------------------------------------
--- svn:mergeinfo (original)
+++ svn:mergeinfo Thu Aug 5 20:56:19 2010
@@ -34,4 +34,4 @@
/subversion/branches/tc_url_rev:874351-874483
/subversion/branches/tree-conflicts:868291-873154
/subversion/branches/tree-conflicts-notify:873926-874008
-/subversion/trunk:965046-982400
+/subversion/trunk:965046-982780
Modified: subversion/branches/atomic-revprop/subversion/include/private/svn_mergeinfo_private.h
URL: http://svn.apache.org/viewvc/subversion/branches/atomic-revprop/subversion/include/private/svn_mergeinfo_private.h?rev=982782&r1=982781&r2=982782&view=diff
==============================================================================
--- subversion/branches/atomic-revprop/subversion/include/private/svn_mergeinfo_private.h (original)
+++ subversion/branches/atomic-revprop/subversion/include/private/svn_mergeinfo_private.h Thu Aug 5 20:56:19 2010
@@ -225,6 +225,21 @@ svn_rangelist__initialize(svn_revnum_t s
svn_boolean_t inheritable,
apr_pool_t *result_pool);
+/* Adjust in-place MERGEINFO's rangelists by OFFSET. If OFFSET is negative
+ and would adjust any part of MERGEINFO's source revisions to 0 or less,
+ then those revisions are dropped. If all the source revisions for a merge
+ source path are dropped, then the path itself is dropped. If all merge
+ source paths are dropped, then *ADJUSTED_MERGEINFO is set to an empty
+ hash. *ADJUSTED_MERGEINFO is allocated in RESULT_POOL. SCRATCH_POOL is
+ used for any temporary allocations. */
+svn_error_t *
+svn_mergeinfo__adjust_mergeinfo_rangelists(svn_mergeinfo_t *adjusted_mergeinfo,
+ svn_mergeinfo_t mergeinfo,
+ svn_revnum_t offset,
+ apr_pool_t *result_pool,
+ apr_pool_t *scratch_pool);
+
+
#ifdef __cplusplus
}
#endif /* __cplusplus */
Modified: subversion/branches/atomic-revprop/subversion/libsvn_diff/parse-diff.c
URL: http://svn.apache.org/viewvc/subversion/branches/atomic-revprop/subversion/libsvn_diff/parse-diff.c?rev=982782&r1=982781&r2=982782&view=diff
==============================================================================
--- subversion/branches/atomic-revprop/subversion/libsvn_diff/parse-diff.c (original)
+++ subversion/branches/atomic-revprop/subversion/libsvn_diff/parse-diff.c Thu Aug 5 20:56:19 2010
@@ -881,10 +881,12 @@ static svn_error_t *
git_start(enum parse_state *new_state, const char *line, svn_patch_t *patch,
apr_pool_t *result_pool, apr_pool_t *scratch_pool)
{
- const char *old_path;
- const char *new_path;
- char *end_old_path;
- char *slash;
+ const char *old_path_start;
+ char *old_path_end;
+ const char *new_path_start;
+ const char *new_path_end;
+ char *new_path_marker;
+ const char *old_path_marker;
/* ### Add handling of escaped paths
* http://www.kernel.org/pub/software/scm/git/docs/git-diff.html:
@@ -897,59 +899,79 @@ git_start(enum parse_state *new_state, c
/* Our line should look like this: 'git --diff a/path b/path'.
* If we find any deviations from that format, we return with state reset
* to start.
- *
- * ### We can't handle paths with spaces!
*/
- slash = strchr(line, '/');
+ old_path_marker = strstr(line, " a/");
- if (! slash)
+ if (! old_path_marker)
{
*new_state = state_start;
return SVN_NO_ERROR;
}
- old_path = slash + 1;
-
- if (! *old_path)
+ if (! *(old_path_marker + 3))
{
*new_state = state_start;
return SVN_NO_ERROR;
}
- end_old_path = strchr(old_path, ' ');
+ new_path_marker = strstr(old_path_marker, " b/");
- if (end_old_path)
- *end_old_path = '\0';
- else
+ if (! new_path_marker)
{
*new_state = state_start;
return SVN_NO_ERROR;
}
- /* The new path begins after the first slash after the old path. */
- slash = strchr(end_old_path + 1, '/');
-
- if (! slash)
+ if (! *(new_path_marker + 3))
{
*new_state = state_start;
return SVN_NO_ERROR;
}
- /* The path starts after the slash */
- new_path = slash + 1;
+ /* By now, we know that we have a line on the form '--git diff a/.+ b/.+'
+ * We only need the filenames when we have deleted or added empty
+ * files. In those cases the old_path and new_path is identical on the
+ * '--git diff' line. For all other cases we fetch the filenames from
+ * other header lines. */
+ old_path_start = line + strlen("--git diff a/");
+ new_path_end = line + strlen(line);
+ new_path_start = old_path_start;
+
+ while (TRUE)
+ {
+ int len_old;
+ int len_new;
+
+ new_path_marker = strstr(new_path_start, " b/");
+
+ /* No new path marker, bail out. */
+ if (! new_path_marker)
+ break;
+
+ old_path_end = new_path_marker;
+ new_path_start = new_path_marker + strlen(" b/");
+
+ /* No path after the marker. */
+ if (! *new_path_start)
+ break;
+
+ len_old = old_path_end - old_path_start;
+ len_new = new_path_end - new_path_start;
+
+ /* Are the paths before and after the " b/" marker the same? */
+ if (len_old == len_new
+ && ! strncmp(old_path_start, new_path_start, len_old))
+ {
+ *old_path_end = '\0';
+ SVN_ERR(grab_filename(&patch->old_filename, old_path_start,
+ result_pool, scratch_pool));
- if (! *new_path)
- {
- *new_state = state_start;
- return SVN_NO_ERROR;
+ SVN_ERR(grab_filename(&patch->new_filename, new_path_start,
+ result_pool, scratch_pool));
+ break;
+ }
}
- SVN_ERR(grab_filename(&patch->old_filename, old_path,
- result_pool, scratch_pool));
-
- SVN_ERR(grab_filename(&patch->new_filename, new_path,
- result_pool, scratch_pool));
-
/* We assume that the path is only modified until we've found a 'tree'
* header */
patch->operation = svn_diff_op_modified;
@@ -963,7 +985,18 @@ static svn_error_t *
git_minus(enum parse_state *new_state, const char *line, svn_patch_t *patch,
apr_pool_t *result_pool, apr_pool_t *scratch_pool)
{
- /* ### Check that the path is consistent with the 'git --diff ' line. */
+ /* If we can find a tab, it separates the filename from
+ * the rest of the line which we can discard. */
+ char *tab = strchr(line, '\t');
+ if (tab)
+ *tab = '\0';
+
+ if (starts_with(line, "--- /dev/null"))
+ SVN_ERR(grab_filename(&patch->old_filename, "/dev/null",
+ result_pool, scratch_pool));
+ else
+ SVN_ERR(grab_filename(&patch->old_filename, line + strlen("--- a/"),
+ result_pool, scratch_pool));
*new_state = state_git_minus_seen;
return SVN_NO_ERROR;
@@ -974,7 +1007,18 @@ static svn_error_t *
git_plus(enum parse_state *new_state, const char *line, svn_patch_t *patch,
apr_pool_t *result_pool, apr_pool_t *scratch_pool)
{
- /* ### Check that the path is consistent with the 'git --diff ' line. */
+ /* If we can find a tab, it separates the filename from
+ * the rest of the line which we can discard. */
+ char *tab = strchr(line, '\t');
+ if (tab)
+ *tab = '\0';
+
+ if (starts_with(line, "+++ /dev/null"))
+ SVN_ERR(grab_filename(&patch->new_filename, "/dev/null",
+ result_pool, scratch_pool));
+ else
+ SVN_ERR(grab_filename(&patch->new_filename, line + strlen("+++ b/"),
+ result_pool, scratch_pool));
*new_state = state_git_header_found;
return SVN_NO_ERROR;
@@ -985,7 +1029,8 @@ static svn_error_t *
git_move_from(enum parse_state *new_state, const char *line, svn_patch_t *patch,
apr_pool_t *result_pool, apr_pool_t *scratch_pool)
{
- /* ### Check that the path is consistent with the 'git --diff ' line. */
+ SVN_ERR(grab_filename(&patch->old_filename, line + strlen("rename from "),
+ result_pool, scratch_pool));
*new_state = state_move_from_seen;
return SVN_NO_ERROR;
@@ -996,7 +1041,8 @@ static svn_error_t *
git_move_to(enum parse_state *new_state, const char *line, svn_patch_t *patch,
apr_pool_t *result_pool, apr_pool_t *scratch_pool)
{
- /* ### Check that the path is consistent with the 'git --diff ' line. */
+ SVN_ERR(grab_filename(&patch->new_filename, line + strlen("rename to "),
+ result_pool, scratch_pool));
patch->operation = svn_diff_op_moved;
@@ -1009,7 +1055,8 @@ static svn_error_t *
git_copy_from(enum parse_state *new_state, const char *line, svn_patch_t *patch,
apr_pool_t *result_pool, apr_pool_t *scratch_pool)
{
- /* ### Check that the path is consistent with the 'git --diff ' line. */
+ SVN_ERR(grab_filename(&patch->old_filename, line + strlen("copy from "),
+ result_pool, scratch_pool));
*new_state = state_copy_from_seen;
return SVN_NO_ERROR;
@@ -1020,7 +1067,8 @@ static svn_error_t *
git_copy_to(enum parse_state *new_state, const char *line, svn_patch_t *patch,
apr_pool_t *result_pool, apr_pool_t *scratch_pool)
{
- /* ### Check that the path is consistent with the 'git --diff ' line. */
+ SVN_ERR(grab_filename(&patch->new_filename, line + strlen("copy to "),
+ result_pool, scratch_pool));
patch->operation = svn_diff_op_copied;
@@ -1035,7 +1083,7 @@ git_new_file(enum parse_state *new_state
{
patch->operation = svn_diff_op_added;
- *new_state = state_git_header_found;
+ *new_state = state_git_tree_seen;
return SVN_NO_ERROR;
}
@@ -1046,7 +1094,7 @@ git_deleted_file(enum parse_state *new_s
{
patch->operation = svn_diff_op_deleted;
- *new_state = state_git_header_found;
+ *new_state = state_git_tree_seen;
return SVN_NO_ERROR;
}
@@ -1095,11 +1143,6 @@ svn_diff_parse_next_patch(svn_patch_t **
enum parse_state state = state_start;
- /* ### dannas: As I've understood the git diff format, the first line
- * ### contains both paths and the paths in the headers that follow are only
- * ### there to ensure that the path is valid. Not sure though, the
- * ### research continues... */
-
/* Our table consisting of:
* Expected Input Required state Function to call */
struct transition transitions[] =
@@ -1109,9 +1152,11 @@ svn_diff_parse_next_patch(svn_patch_t **
{"git --diff", state_start, git_start},
{"--- a/", state_git_diff_seen, git_minus},
{"--- a/", state_git_tree_seen, git_minus},
+ {"--- /dev/null", state_git_tree_seen, git_minus},
{"+++ b/", state_git_minus_seen, git_plus},
- {"move from ", state_git_diff_seen, git_move_from},
- {"move to ", state_move_from_seen, git_move_to},
+ {"+++ /dev/null", state_git_minus_seen, git_plus},
+ {"rename from ", state_git_diff_seen, git_move_from},
+ {"rename to ", state_move_from_seen, git_move_to},
{"copy from ", state_git_diff_seen, git_copy_from},
{"copy to ", state_copy_from_seen, git_copy_to},
{"new file ", state_git_diff_seen, git_new_file},
Modified: subversion/branches/atomic-revprop/subversion/libsvn_ra_serf/blame.c
URL: http://svn.apache.org/viewvc/subversion/branches/atomic-revprop/subversion/libsvn_ra_serf/blame.c?rev=982782&r1=982781&r2=982782&view=diff
==============================================================================
--- subversion/branches/atomic-revprop/subversion/libsvn_ra_serf/blame.c (original)
+++ subversion/branches/atomic-revprop/subversion/libsvn_ra_serf/blame.c Thu Aug 5 20:56:19 2010
@@ -382,8 +382,10 @@ cdata_blame(svn_ra_serf__xml_parser_t *p
return SVN_NO_ERROR;
}
-static serf_bucket_t*
-create_file_revs_body(void *baton,
+/* Implements svn_ra_serf__request_body_delegate_t */
+static svn_error_t *
+create_file_revs_body(serf_bucket_t **body_bkt,
+ void *baton,
serf_bucket_alloc_t *alloc,
apr_pool_t *pool)
{
@@ -419,7 +421,8 @@ create_file_revs_body(void *baton,
svn_ra_serf__add_close_tag_buckets(buckets, alloc,
"S:file-revs-report");
- return buckets;
+ *body_bkt = buckets;
+ return SVN_NO_ERROR;
}
svn_error_t *
Modified: subversion/branches/atomic-revprop/subversion/libsvn_ra_serf/commit.c
URL: http://svn.apache.org/viewvc/subversion/branches/atomic-revprop/subversion/libsvn_ra_serf/commit.c?rev=982782&r1=982781&r2=982782&view=diff
==============================================================================
--- subversion/branches/atomic-revprop/subversion/libsvn_ra_serf/commit.c (original)
+++ subversion/branches/atomic-revprop/subversion/libsvn_ra_serf/commit.c Thu Aug 5 20:56:19 2010
@@ -238,8 +238,10 @@ return_response_err(svn_ra_serf__handler
err);
}
-static serf_bucket_t *
-create_checkout_body(void *baton,
+/* Implements svn_ra_serf__request_body_delegate_t */
+static svn_error_t *
+create_checkout_body(serf_bucket_t **bkt,
+ void *baton,
serf_bucket_alloc_t *alloc,
apr_pool_t *pool)
{
@@ -263,7 +265,8 @@ create_checkout_body(void *baton,
svn_ra_serf__add_tag_buckets(body_bkt, "D:apply-to-version", NULL, alloc);
svn_ra_serf__add_close_tag_buckets(body_bkt, alloc, "D:checkout");
- return body_bkt;
+ *bkt = body_bkt;
+ return SVN_NO_ERROR;
}
/* Implements svn_ra_serf__response_handler_t */
@@ -707,7 +710,7 @@ proppatch_walker(void *baton,
return SVN_NO_ERROR;
}
-static apr_status_t
+static svn_error_t *
setup_proppatch_headers(serf_bucket_t *headers,
void *baton,
apr_pool_t *pool)
@@ -738,16 +741,19 @@ setup_proppatch_headers(serf_bucket_t *h
}
}
- return APR_SUCCESS;
+ return SVN_NO_ERROR;
}
-static serf_bucket_t *
-create_proppatch_body(void *baton,
+/* Implements svn_ra_serf__request_body_delegate_t */
+static svn_error_t *
+create_proppatch_body(serf_bucket_t **bkt,
+ void *baton,
serf_bucket_alloc_t *alloc,
apr_pool_t *pool)
{
proppatch_context_t *ctx = baton;
serf_bucket_t *body_bkt;
+ svn_error_t *err;
body_bkt = serf_bucket_aggregate_create(alloc);
@@ -764,9 +770,9 @@ create_proppatch_body(void *baton,
svn_ra_serf__add_open_tag_buckets(body_bkt, alloc, "D:set", NULL);
svn_ra_serf__add_open_tag_buckets(body_bkt, alloc, "D:prop", NULL);
- svn_ra_serf__walk_all_props(ctx->changed_props, ctx->path,
- SVN_INVALID_REVNUM,
- proppatch_walker, body_bkt, pool);
+ SVN_ERR(svn_ra_serf__walk_all_props(ctx->changed_props, ctx->path,
+ SVN_INVALID_REVNUM,
+ proppatch_walker, body_bkt, pool));
svn_ra_serf__add_close_tag_buckets(body_bkt, alloc, "D:prop");
svn_ra_serf__add_close_tag_buckets(body_bkt, alloc, "D:set");
@@ -777,9 +783,9 @@ create_proppatch_body(void *baton,
svn_ra_serf__add_open_tag_buckets(body_bkt, alloc, "D:remove", NULL);
svn_ra_serf__add_open_tag_buckets(body_bkt, alloc, "D:prop", NULL);
- svn_ra_serf__walk_all_props(ctx->removed_props, ctx->path,
- SVN_INVALID_REVNUM,
- proppatch_walker, body_bkt, pool);
+ SVN_ERR(svn_ra_serf__walk_all_props(ctx->removed_props, ctx->path,
+ SVN_INVALID_REVNUM,
+ proppatch_walker, body_bkt, pool));
svn_ra_serf__add_close_tag_buckets(body_bkt, alloc, "D:prop");
svn_ra_serf__add_close_tag_buckets(body_bkt, alloc, "D:remove");
@@ -787,7 +793,8 @@ create_proppatch_body(void *baton,
svn_ra_serf__add_close_tag_buckets(body_bkt, alloc, "D:propertyupdate");
- return body_bkt;
+ *bkt = body_bkt;
+ return SVN_NO_ERROR;
}
static svn_error_t*
@@ -829,8 +836,10 @@ proppatch_resource(proppatch_context_t *
return SVN_NO_ERROR;
}
-static serf_bucket_t *
-create_put_body(void *baton,
+/* Implements svn_ra_serf__request_body_delegate_t */
+static svn_error_t *
+create_put_body(serf_bucket_t **body_bkt,
+ void *baton,
serf_bucket_alloc_t *alloc,
apr_pool_t *pool)
{
@@ -853,18 +862,22 @@ create_put_body(void *baton,
offset = 0;
apr_file_seek(ctx->svndiff, APR_SET, &offset);
- return serf_bucket_file_create(ctx->svndiff, alloc);
+ *body_bkt = serf_bucket_file_create(ctx->svndiff, alloc);
+ return SVN_NO_ERROR;
}
-static serf_bucket_t *
-create_empty_put_body(void *baton,
+/* Implements svn_ra_serf__request_body_delegate_t */
+static svn_error_t *
+create_empty_put_body(serf_bucket_t **body_bkt,
+ void *baton,
serf_bucket_alloc_t *alloc,
apr_pool_t *pool)
{
- return SERF_BUCKET_SIMPLE_STRING("", alloc);
+ *body_bkt = SERF_BUCKET_SIMPLE_STRING("", alloc);
+ return SVN_NO_ERROR;
}
-static apr_status_t
+static svn_error_t *
setup_put_headers(serf_bucket_t *headers,
void *baton,
apr_pool_t *pool)
@@ -909,7 +922,7 @@ setup_put_headers(serf_bucket_t *headers
return APR_SUCCESS;
}
-static apr_status_t
+static svn_error_t *
setup_copy_file_headers(serf_bucket_t *headers,
void *baton,
apr_pool_t *pool)
@@ -928,10 +941,10 @@ setup_copy_file_headers(serf_bucket_t *h
serf_bucket_headers_set(headers, "Depth", "0");
serf_bucket_headers_set(headers, "Overwrite", "T");
- return APR_SUCCESS;
+ return SVN_NO_ERROR;
}
-static apr_status_t
+static svn_error_t *
setup_copy_dir_headers(serf_bucket_t *headers,
void *baton,
apr_pool_t *pool)
@@ -972,10 +985,10 @@ setup_copy_dir_headers(serf_bucket_t *he
apr_pstrdup(dir->commit->pool, dir->name), APR_HASH_KEY_STRING,
(void*)1);
- return APR_SUCCESS;
+ return SVN_NO_ERROR;
}
-static apr_status_t
+static svn_error_t *
setup_delete_headers(serf_bucket_t *headers,
void *baton,
apr_pool_t *pool)
@@ -1005,11 +1018,13 @@ setup_delete_headers(serf_bucket_t *head
}
}
- return APR_SUCCESS;
+ return SVN_NO_ERROR;
}
-static serf_bucket_t *
-create_delete_body(void *baton,
+/* Implements svn_ra_serf__request_body_delegate_t */
+static svn_error_t *
+create_delete_body(serf_bucket_t **body_bkt,
+ void *baton,
serf_bucket_alloc_t *alloc,
apr_pool_t *pool)
{
@@ -1023,7 +1038,8 @@ create_delete_body(void *baton,
svn_ra_serf__merge_lock_token_list(ctx->lock_token_hash, ctx->path,
body, alloc, pool);
- return body;
+ *body_bkt = body;
+ return SVN_NO_ERROR;
}
/* Helper function to write the svndiff stream to temporary file. */
Modified: subversion/branches/atomic-revprop/subversion/libsvn_ra_serf/get_deleted_rev.c
URL: http://svn.apache.org/viewvc/subversion/branches/atomic-revprop/subversion/libsvn_ra_serf/get_deleted_rev.c?rev=982782&r1=982781&r2=982782&view=diff
==============================================================================
--- subversion/branches/atomic-revprop/subversion/libsvn_ra_serf/get_deleted_rev.c (original)
+++ subversion/branches/atomic-revprop/subversion/libsvn_ra_serf/get_deleted_rev.c Thu Aug 5 20:56:19 2010
@@ -136,8 +136,10 @@ cdata_getdrev(svn_ra_serf__xml_parser_t
return SVN_NO_ERROR;
}
-static serf_bucket_t*
-create_getdrev_body(void *baton,
+/* Implements svn_ra_serf__request_body_delegate_t */
+static svn_error_t *
+create_getdrev_body(serf_bucket_t **body_bkt,
+ void *baton,
serf_bucket_alloc_t *alloc,
apr_pool_t *pool)
{
@@ -169,7 +171,8 @@ create_getdrev_body(void *baton,
svn_ra_serf__add_close_tag_buckets(buckets, alloc,
"S:get-deleted-rev-report");
- return buckets;
+ *body_bkt = buckets;
+ return SVN_NO_ERROR;
}
svn_error_t *
Modified: subversion/branches/atomic-revprop/subversion/libsvn_ra_serf/getdate.c
URL: http://svn.apache.org/viewvc/subversion/branches/atomic-revprop/subversion/libsvn_ra_serf/getdate.c?rev=982782&r1=982781&r2=982782&view=diff
==============================================================================
--- subversion/branches/atomic-revprop/subversion/libsvn_ra_serf/getdate.c (original)
+++ subversion/branches/atomic-revprop/subversion/libsvn_ra_serf/getdate.c Thu Aug 5 20:56:19 2010
@@ -164,8 +164,10 @@ cdata_getdate(svn_ra_serf__xml_parser_t
return SVN_NO_ERROR;
}
-static serf_bucket_t*
-create_getdate_body(void *baton,
+/* Implements svn_ra_serf__request_body_delegate_t */
+static svn_error_t *
+create_getdate_body(serf_bucket_t **body_bkt,
+ void *baton,
serf_bucket_alloc_t *alloc,
apr_pool_t *pool)
{
@@ -186,7 +188,8 @@ create_getdate_body(void *baton,
svn_ra_serf__add_close_tag_buckets(buckets, alloc, "S:dated-rev-report");
- return buckets;
+ *body_bkt = buckets;
+ return SVN_NO_ERROR;
}
svn_error_t *
Modified: subversion/branches/atomic-revprop/subversion/libsvn_ra_serf/getlocations.c
URL: http://svn.apache.org/viewvc/subversion/branches/atomic-revprop/subversion/libsvn_ra_serf/getlocations.c?rev=982782&r1=982781&r2=982782&view=diff
==============================================================================
--- subversion/branches/atomic-revprop/subversion/libsvn_ra_serf/getlocations.c (original)
+++ subversion/branches/atomic-revprop/subversion/libsvn_ra_serf/getlocations.c Thu Aug 5 20:56:19 2010
@@ -180,8 +180,10 @@ end_getloc(svn_ra_serf__xml_parser_t *pa
return SVN_NO_ERROR;
}
-static serf_bucket_t*
-create_get_locations_body(void *baton,
+/* Implements svn_ra_serf__request_body_delegate_t */
+static svn_error_t *
+create_get_locations_body(serf_bucket_t **body_bkt,
+ void *baton,
serf_bucket_alloc_t *alloc,
apr_pool_t *pool)
{
@@ -216,7 +218,8 @@ create_get_locations_body(void *baton,
svn_ra_serf__add_close_tag_buckets(buckets, alloc,
"S:get-locations");
- return buckets;
+ *body_bkt = buckets;
+ return SVN_NO_ERROR;
}
svn_error_t *
Modified: subversion/branches/atomic-revprop/subversion/libsvn_ra_serf/getlocationsegments.c
URL: http://svn.apache.org/viewvc/subversion/branches/atomic-revprop/subversion/libsvn_ra_serf/getlocationsegments.c?rev=982782&r1=982781&r2=982782&view=diff
==============================================================================
--- subversion/branches/atomic-revprop/subversion/libsvn_ra_serf/getlocationsegments.c (original)
+++ subversion/branches/atomic-revprop/subversion/libsvn_ra_serf/getlocationsegments.c Thu Aug 5 20:56:19 2010
@@ -126,8 +126,10 @@ end_gls(svn_ra_serf__xml_parser_t *parse
return SVN_NO_ERROR;
}
-static serf_bucket_t *
-create_gls_body(void *baton,
+/* Implements svn_ra_serf__request_body_delegate_t */
+static svn_error_t *
+create_gls_body(serf_bucket_t **body_bkt,
+ void *baton,
serf_bucket_alloc_t *alloc,
apr_pool_t *pool)
{
@@ -163,7 +165,8 @@ create_gls_body(void *baton,
svn_ra_serf__add_close_tag_buckets(buckets, alloc,
"S:get-location-segments");
- return buckets;
+ *body_bkt = buckets;
+ return SVN_NO_ERROR;
}
svn_error_t *
Modified: subversion/branches/atomic-revprop/subversion/libsvn_ra_serf/getlocks.c
URL: http://svn.apache.org/viewvc/subversion/branches/atomic-revprop/subversion/libsvn_ra_serf/getlocks.c?rev=982782&r1=982781&r2=982782&view=diff
==============================================================================
--- subversion/branches/atomic-revprop/subversion/libsvn_ra_serf/getlocks.c (original)
+++ subversion/branches/atomic-revprop/subversion/libsvn_ra_serf/getlocks.c Thu Aug 5 20:56:19 2010
@@ -295,8 +295,10 @@ cdata_getlocks(svn_ra_serf__xml_parser_t
return SVN_NO_ERROR;
}
-static serf_bucket_t*
-create_getlocks_body(void *baton,
+/* Implements svn_ra_serf__request_body_delegate_t */
+static svn_error_t *
+create_getlocks_body(serf_bucket_t **body_bkt,
+ void *baton,
serf_bucket_alloc_t *alloc,
apr_pool_t *pool)
{
@@ -310,7 +312,8 @@ create_getlocks_body(void *baton,
"depth", svn_depth_to_word(lock_ctx->requested_depth), NULL);
svn_ra_serf__add_close_tag_buckets(buckets, alloc, "S:get-locks-report");
- return buckets;
+ *body_bkt = buckets;
+ return SVN_NO_ERROR;
}
svn_error_t *
Modified: subversion/branches/atomic-revprop/subversion/libsvn_ra_serf/locks.c
URL: http://svn.apache.org/viewvc/subversion/branches/atomic-revprop/subversion/libsvn_ra_serf/locks.c?rev=982782&r1=982781&r2=982782&view=diff
==============================================================================
--- subversion/branches/atomic-revprop/subversion/libsvn_ra_serf/locks.c (original)
+++ subversion/branches/atomic-revprop/subversion/libsvn_ra_serf/locks.c Thu Aug 5 20:56:19 2010
@@ -321,7 +321,7 @@ static const svn_ra_serf__dav_props_t lo
{ NULL }
};
-static apr_status_t
+static svn_error_t *
set_lock_headers(serf_bucket_t *headers,
void *baton,
apr_pool_t *pool)
@@ -430,8 +430,10 @@ handle_lock(serf_request_t *request,
handler_baton, pool);
}
-static serf_bucket_t*
-create_getlock_body(void *baton,
+/* Implements svn_ra_serf__request_body_delegate_t */
+static svn_error_t *
+create_getlock_body(serf_bucket_t **body_bkt,
+ void *baton,
serf_bucket_alloc_t *alloc,
apr_pool_t *pool)
{
@@ -448,21 +450,24 @@ create_getlock_body(void *baton,
svn_ra_serf__add_close_tag_buckets(buckets, alloc, "prop");
svn_ra_serf__add_close_tag_buckets(buckets, alloc, "propfind");
- return buckets;
+ *body_bkt = buckets;
+ return SVN_NO_ERROR;
}
-static apr_status_t
+static svn_error_t*
setup_getlock_headers(serf_bucket_t *headers,
void *baton,
apr_pool_t *pool)
{
serf_bucket_headers_set(headers, "Depth", "0");
- return APR_SUCCESS;
+ return SVN_NO_ERROR;
}
-static serf_bucket_t*
-create_lock_body(void *baton,
+/* Implements svn_ra_serf__request_body_delegate_t */
+static svn_error_t *
+create_lock_body(serf_bucket_t **body_bkt,
+ void *baton,
serf_bucket_alloc_t *alloc,
apr_pool_t *pool)
{
@@ -492,7 +497,8 @@ create_lock_body(void *baton,
svn_ra_serf__add_close_tag_buckets(buckets, alloc, "lockinfo");
- return buckets;
+ *body_bkt = buckets;
+ return SVN_NO_ERROR;
}
svn_error_t *
@@ -651,7 +657,7 @@ struct unlock_context_t {
svn_boolean_t force;
};
-static apr_status_t
+static svn_error_t *
set_unlock_headers(serf_bucket_t *headers,
void *baton,
apr_pool_t *pool)
@@ -665,7 +671,7 @@ set_unlock_headers(serf_bucket_t *header
SVN_DAV_OPTION_LOCK_BREAK);
}
- return APR_SUCCESS;
+ return SVN_NO_ERROR;
}
svn_error_t *
Modified: subversion/branches/atomic-revprop/subversion/libsvn_ra_serf/log.c
URL: http://svn.apache.org/viewvc/subversion/branches/atomic-revprop/subversion/libsvn_ra_serf/log.c?rev=982782&r1=982781&r2=982782&view=diff
==============================================================================
--- subversion/branches/atomic-revprop/subversion/libsvn_ra_serf/log.c (original)
+++ subversion/branches/atomic-revprop/subversion/libsvn_ra_serf/log.c Thu Aug 5 20:56:19 2010
@@ -459,8 +459,9 @@ cdata_log(svn_ra_serf__xml_parser_t *par
return SVN_NO_ERROR;
}
-static serf_bucket_t *
-create_log_body(void *baton,
+static svn_error_t *
+create_log_body(serf_bucket_t **body_bkt,
+ void *baton,
serf_bucket_alloc_t *alloc,
apr_pool_t *pool)
{
@@ -550,7 +551,8 @@ create_log_body(void *baton,
svn_ra_serf__add_close_tag_buckets(buckets, alloc,
"S:log-report");
- return buckets;
+ *body_bkt = buckets;
+ return SVN_NO_ERROR;
}
svn_error_t *
Modified: subversion/branches/atomic-revprop/subversion/libsvn_ra_serf/merge.c
URL: http://svn.apache.org/viewvc/subversion/branches/atomic-revprop/subversion/libsvn_ra_serf/merge.c?rev=982782&r1=982781&r2=982782&view=diff
==============================================================================
--- subversion/branches/atomic-revprop/subversion/libsvn_ra_serf/merge.c (original)
+++ subversion/branches/atomic-revprop/subversion/libsvn_ra_serf/merge.c Thu Aug 5 20:56:19 2010
@@ -405,7 +405,7 @@ cdata_merge(svn_ra_serf__xml_parser_t *p
return SVN_NO_ERROR;
}
-static apr_status_t
+static svn_error_t *
setup_merge_headers(serf_bucket_t *headers,
void *baton,
apr_pool_t *pool)
@@ -418,7 +418,7 @@ setup_merge_headers(serf_bucket_t *heade
SVN_DAV_OPTION_RELEASE_LOCKS);
}
- return APR_SUCCESS;
+ return SVN_NO_ERROR;
}
void
@@ -469,8 +469,9 @@ svn_ra_serf__merge_lock_token_list(apr_h
svn_ra_serf__add_close_tag_buckets(body, alloc, "S:lock-token-list");
}
-static serf_bucket_t*
-create_merge_body(void *baton,
+static svn_error_t*
+create_merge_body(serf_bucket_t **bkt,
+ void *baton,
serf_bucket_alloc_t *alloc,
apr_pool_t *pool)
{
@@ -508,7 +509,9 @@ create_merge_body(void *baton,
svn_ra_serf__add_close_tag_buckets(body_bkt, alloc, "D:merge");
- return body_bkt;
+ *bkt = body_bkt;
+
+ return SVN_NO_ERROR;
}
svn_error_t *
Modified: subversion/branches/atomic-revprop/subversion/libsvn_ra_serf/mergeinfo.c
URL: http://svn.apache.org/viewvc/subversion/branches/atomic-revprop/subversion/libsvn_ra_serf/mergeinfo.c?rev=982782&r1=982781&r2=982782&view=diff
==============================================================================
--- subversion/branches/atomic-revprop/subversion/libsvn_ra_serf/mergeinfo.c (original)
+++ subversion/branches/atomic-revprop/subversion/libsvn_ra_serf/mergeinfo.c Thu Aug 5 20:56:19 2010
@@ -176,8 +176,9 @@ cdata_handler(svn_ra_serf__xml_parser_t
return SVN_NO_ERROR;
}
-static serf_bucket_t *
-create_mergeinfo_body(void *baton,
+static svn_error_t *
+create_mergeinfo_body(serf_bucket_t **bkt,
+ void *baton,
serf_bucket_alloc_t *alloc,
apr_pool_t *pool)
{
@@ -221,7 +222,8 @@ create_mergeinfo_body(void *baton,
svn_ra_serf__add_close_tag_buckets(body_bkt, alloc,
"S:" SVN_DAV__MERGEINFO_REPORT);
- return body_bkt;
+ *bkt = body_bkt;
+ return SVN_NO_ERROR;
}
/* Request a mergeinfo-report from the URL attached to SESSION,
Modified: subversion/branches/atomic-revprop/subversion/libsvn_ra_serf/options.c
URL: http://svn.apache.org/viewvc/subversion/branches/atomic-revprop/subversion/libsvn_ra_serf/options.c?rev=982782&r1=982781&r2=982782&view=diff
==============================================================================
--- subversion/branches/atomic-revprop/subversion/libsvn_ra_serf/options.c (original)
+++ subversion/branches/atomic-revprop/subversion/libsvn_ra_serf/options.c Thu Aug 5 20:56:19 2010
@@ -210,8 +210,9 @@ cdata_options(svn_ra_serf__xml_parser_t
return SVN_NO_ERROR;
}
-static serf_bucket_t*
-create_options_body(void *baton,
+static svn_error_t *
+create_options_body(serf_bucket_t **body_bkt,
+ void *baton,
serf_bucket_alloc_t *alloc,
apr_pool_t *pool)
{
@@ -224,7 +225,8 @@ create_options_body(void *baton,
svn_ra_serf__add_tag_buckets(body, "D:activity-collection-set", NULL, alloc);
svn_ra_serf__add_close_tag_buckets(body, alloc, "D:options");
- return body;
+ *body_bkt = body;
+ return SVN_NO_ERROR;
}
svn_boolean_t*
Modified: subversion/branches/atomic-revprop/subversion/libsvn_ra_serf/property.c
URL: http://svn.apache.org/viewvc/subversion/branches/atomic-revprop/subversion/libsvn_ra_serf/property.c?rev=982782&r1=982781&r2=982782&view=diff
==============================================================================
--- subversion/branches/atomic-revprop/subversion/libsvn_ra_serf/property.c (original)
+++ subversion/branches/atomic-revprop/subversion/libsvn_ra_serf/property.c Thu Aug 5 20:56:19 2010
@@ -420,7 +420,7 @@ cdata_propfind(svn_ra_serf__xml_parser_t
return SVN_NO_ERROR;
}
-static apr_status_t
+static svn_error_t *
setup_propfind_headers(serf_bucket_t *headers,
void *setup_baton,
apr_pool_t *pool)
@@ -437,14 +437,15 @@ setup_propfind_headers(serf_bucket_t *he
serf_bucket_headers_setn(headers, "Label", ctx->label);
}
- return APR_SUCCESS;
+ return SVN_NO_ERROR;
}
#define PROPFIND_HEADER "<?xml version=\"1.0\" encoding=\"utf-8\"?><propfind xmlns=\"DAV:\">"
#define PROPFIND_TRAILER "</propfind>"
-static serf_bucket_t*
-create_propfind_body(void *setup_baton,
+static svn_error_t *
+create_propfind_body(serf_bucket_t **bkt,
+ void *setup_baton,
serf_bucket_alloc_t *alloc,
apr_pool_t *pool)
{
@@ -515,7 +516,8 @@ create_propfind_body(void *setup_baton,
alloc);
serf_bucket_aggregate_append(body_bkt, tmp);
- return body_bkt;
+ *bkt = body_bkt;
+ return SVN_NO_ERROR;
}
static svn_boolean_t
Modified: subversion/branches/atomic-revprop/subversion/libsvn_ra_serf/ra_serf.h
URL: http://svn.apache.org/viewvc/subversion/branches/atomic-revprop/subversion/libsvn_ra_serf/ra_serf.h?rev=982782&r1=982781&r2=982782&view=diff
==============================================================================
--- subversion/branches/atomic-revprop/subversion/libsvn_ra_serf/ra_serf.h (original)
+++ subversion/branches/atomic-revprop/subversion/libsvn_ra_serf/ra_serf.h Thu Aug 5 20:56:19 2010
@@ -408,7 +408,7 @@ svn_ra_serf__handle_client_cert_pw(void
*
* If CONTENT_TYPE is not-NULL, it will be sent as the Content-Type header.
*/
-void
+svn_error_t *
svn_ra_serf__setup_serf_req(serf_request_t *request,
serf_bucket_t **req_bkt, serf_bucket_t **hdrs_bkt,
svn_ra_serf__connection_t *conn,
@@ -444,19 +444,20 @@ typedef svn_error_t *
apr_pool_t *pool);
/* Callback for when a request body is needed. */
-typedef serf_bucket_t*
-(*svn_ra_serf__request_body_delegate_t)(void *baton,
+typedef svn_error_t *
+(*svn_ra_serf__request_body_delegate_t)(serf_bucket_t **body_bkt,
+ void *baton,
serf_bucket_alloc_t *alloc,
apr_pool_t *pool);
/* Callback for when request headers are needed. */
-typedef apr_status_t
+typedef svn_error_t *
(*svn_ra_serf__request_header_delegate_t)(serf_bucket_t *headers,
void *baton,
apr_pool_t *pool);
/* Callback for when a response has an error. */
-typedef apr_status_t
+typedef svn_error_t *
(*svn_ra_serf__response_error_t)(serf_request_t *request,
serf_bucket_t *response,
int status_code,
Modified: subversion/branches/atomic-revprop/subversion/libsvn_ra_serf/replay.c
URL: http://svn.apache.org/viewvc/subversion/branches/atomic-revprop/subversion/libsvn_ra_serf/replay.c?rev=982782&r1=982781&r2=982782&view=diff
==============================================================================
--- subversion/branches/atomic-revprop/subversion/libsvn_ra_serf/replay.c (original)
+++ subversion/branches/atomic-revprop/subversion/libsvn_ra_serf/replay.c Thu Aug 5 20:56:19 2010
@@ -183,9 +183,10 @@ start_replay(svn_ra_serf__xml_parser_t *
/* Create a pool for the commit editor. */
ctx->dst_rev_pool = svn_pool_create(ctx->src_rev_pool);
ctx->props = apr_hash_make(ctx->dst_rev_pool);
- svn_ra_serf__walk_all_props(ctx->revs_props, ctx->report_target,
- ctx->revision, svn_ra_serf__set_bare_props,
- ctx->props, ctx->dst_rev_pool);
+ SVN_ERR(svn_ra_serf__walk_all_props(ctx->revs_props, ctx->report_target,
+ ctx->revision,
+ svn_ra_serf__set_bare_props,
+ ctx->props, ctx->dst_rev_pool));
if (ctx->revstart_func)
{
SVN_ERR(ctx->revstart_func(ctx->revision, ctx->replay_baton,
@@ -563,8 +564,9 @@ cdata_replay(svn_ra_serf__xml_parser_t *
return SVN_NO_ERROR;
}
-static serf_bucket_t *
-create_replay_body(void *baton,
+static svn_error_t *
+create_replay_body(serf_bucket_t **bkt,
+ void *baton,
serf_bucket_alloc_t *alloc,
apr_pool_t *pool)
{
@@ -594,7 +596,8 @@ create_replay_body(void *baton,
svn_ra_serf__add_close_tag_buckets(body_bkt, alloc, "S:replay-report");
- return body_bkt;
+ *bkt = body_bkt;
+ return SVN_NO_ERROR;
}
svn_error_t *
Modified: subversion/branches/atomic-revprop/subversion/libsvn_ra_serf/serf.c
URL: http://svn.apache.org/viewvc/subversion/branches/atomic-revprop/subversion/libsvn_ra_serf/serf.c?rev=982782&r1=982781&r2=982782&view=diff
==============================================================================
--- subversion/branches/atomic-revprop/subversion/libsvn_ra_serf/serf.c (original)
+++ subversion/branches/atomic-revprop/subversion/libsvn_ra_serf/serf.c Thu Aug 5 20:56:19 2010
@@ -541,8 +541,9 @@ svn_ra_serf__rev_proplist(svn_ra_session
propfind_path, rev, "0", all_props,
pool));
- svn_ra_serf__walk_all_props(props, propfind_path, rev,
- svn_ra_serf__set_bare_props, *ret_props, pool);
+ SVN_ERR(svn_ra_serf__walk_all_props(props, propfind_path, rev,
+ svn_ra_serf__set_bare_props, *ret_props,
+ pool));
return SVN_NO_ERROR;
}
@@ -801,13 +802,13 @@ svn_ra_serf__stat(svn_ra_session_t *ra_s
return SVN_NO_ERROR;
}
else
- return err;
+ return svn_error_return(err);
}
entry = apr_pcalloc(pool, sizeof(*entry));
- svn_ra_serf__walk_all_props(props, path, fetched_rev, dirent_walker, entry,
- pool);
+ SVN_ERR(svn_ra_serf__walk_all_props(props, path, fetched_rev, dirent_walker,
+ entry, pool));
*dirent = entry;
@@ -920,9 +921,9 @@ svn_ra_serf__get_dir(svn_ra_session_t *r
/* Check if the path is really a directory. */
SVN_ERR(resource_is_directory (props, path, revision));
- svn_ra_serf__walk_all_props(props, path, revision,
- svn_ra_serf__set_flat_props,
- *ret_props, pool);
+ SVN_ERR(svn_ra_serf__walk_all_props(props, path, revision,
+ svn_ra_serf__set_flat_props,
+ *ret_props, pool));
}
return SVN_NO_ERROR;
Modified: subversion/branches/atomic-revprop/subversion/libsvn_ra_serf/update.c
URL: http://svn.apache.org/viewvc/subversion/branches/atomic-revprop/subversion/libsvn_ra_serf/update.c?rev=982782&r1=982781&r2=982782&view=diff
==============================================================================
--- subversion/branches/atomic-revprop/subversion/libsvn_ra_serf/update.c (original)
+++ subversion/branches/atomic-revprop/subversion/libsvn_ra_serf/update.c Thu Aug 5 20:56:19 2010
@@ -563,17 +563,21 @@ close_dir(report_dir_t *dir)
SVN_ERR_ASSERT(! dir->ref_count);
- svn_ra_serf__walk_all_props(dir->props, dir->base_name, dir->base_rev,
- set_dir_props, dir, dir->dir_baton_pool);
-
- svn_ra_serf__walk_all_props(dir->removed_props, dir->base_name,
- dir->base_rev, remove_dir_props, dir,
- dir->dir_baton_pool);
+ SVN_ERR(svn_ra_serf__walk_all_props(dir->props, dir->base_name,
+ dir->base_rev,
+ set_dir_props, dir,
+ dir->dir_baton_pool));
+
+ SVN_ERR(svn_ra_serf__walk_all_props(dir->removed_props, dir->base_name,
+ dir->base_rev, remove_dir_props, dir,
+ dir->dir_baton_pool));
if (dir->fetch_props)
{
- svn_ra_serf__walk_all_props(dir->props, dir->url, dir->target_rev,
- set_dir_props, dir, dir->dir_baton_pool);
+ SVN_ERR(svn_ra_serf__walk_all_props(dir->props, dir->url,
+ dir->target_rev,
+ set_dir_props, dir,
+ dir->dir_baton_pool));
}
SVN_ERR(dir->update_editor->close_directory(dir->dir_baton,
@@ -664,7 +668,7 @@ check_lock(report_info_t *info)
}
}
-static apr_status_t
+static svn_error_t *
headers_fetch(serf_bucket_t *headers,
void *baton,
apr_pool_t *pool)
@@ -685,10 +689,10 @@ headers_fetch(serf_bucket_t *headers,
serf_bucket_headers_setn(headers, "Accept-Encoding", "gzip");
}
- return APR_SUCCESS;
+ return SVN_NO_ERROR;
}
-static apr_status_t
+static svn_error_t *
cancel_fetch(serf_request_t *request,
serf_bucket_t *response,
int status_code,
@@ -721,7 +725,7 @@ cancel_fetch(serf_request_t *request,
}
/* We have no idea what went wrong. */
- SVN_ERR_MALFUNCTION_NO_RETURN();
+ SVN_ERR_MALFUNCTION();
}
static svn_error_t *
@@ -937,28 +941,31 @@ handle_fetch(serf_request_t *request,
check_lock(info);
/* set all of the properties we received */
- svn_ra_serf__walk_all_props(info->props,
- info->base_name,
- info->base_rev,
- set_file_props,
- info, info->editor_pool);
- svn_ra_serf__walk_all_props(info->dir->removed_props,
- info->base_name,
- info->base_rev,
- remove_file_props,
- info, info->editor_pool);
- if (info->fetch_props)
+ err = svn_ra_serf__walk_all_props(info->props,
+ info->base_name,
+ info->base_rev,
+ set_file_props,
+ info, info->editor_pool);
+
+ if (!err)
+ err = svn_ra_serf__walk_all_props(info->dir->removed_props,
+ info->base_name,
+ info->base_rev,
+ remove_file_props,
+ info, info->editor_pool);
+ if (!err && info->fetch_props)
{
- svn_ra_serf__walk_all_props(info->props,
- info->url,
- info->target_rev,
- set_file_props,
- info, info->editor_pool);
+ err = svn_ra_serf__walk_all_props(info->props,
+ info->url,
+ info->target_rev,
+ set_file_props,
+ info, info->editor_pool);
}
- err = info->dir->update_editor->close_file(info->file_baton,
- info->final_checksum,
- info->editor_pool);
+ if (!err)
+ err = info->dir->update_editor->close_file(info->file_baton,
+ info->final_checksum,
+ info->editor_pool);
if (err)
{
@@ -1122,16 +1129,19 @@ handle_propchange_only(report_info_t *in
check_lock(info);
/* set all of the properties we received */
- svn_ra_serf__walk_all_props(info->props,
- info->base_name, info->base_rev,
- set_file_props, info, info->editor_pool);
- svn_ra_serf__walk_all_props(info->dir->removed_props,
- info->base_name, info->base_rev,
- remove_file_props, info, info->editor_pool);
+ SVN_ERR(svn_ra_serf__walk_all_props(info->props,
+ info->base_name, info->base_rev,
+ set_file_props, info,
+ info->editor_pool));
+ SVN_ERR(svn_ra_serf__walk_all_props(info->dir->removed_props,
+ info->base_name, info->base_rev,
+ remove_file_props, info,
+ info->editor_pool));
if (info->fetch_props)
{
- svn_ra_serf__walk_all_props(info->props, info->url, info->target_rev,
- set_file_props, info, info->editor_pool);
+ SVN_ERR(svn_ra_serf__walk_all_props(info->props, info->url,
+ info->target_rev, set_file_props,
+ info, info->editor_pool));
}
SVN_ERR(info->dir->update_editor->close_file(info->file_baton,
@@ -2203,8 +2213,9 @@ open_connection_if_needed(svn_ra_serf__s
}
/* Serf callback to create update request body bucket. */
-static serf_bucket_t *
-create_update_report_body(void *baton,
+static svn_error_t *
+create_update_report_body(serf_bucket_t **body_bkt,
+ void *baton,
serf_bucket_alloc_t *alloc,
apr_pool_t *pool)
{
@@ -2214,7 +2225,9 @@ create_update_report_body(void *baton,
offset = 0;
apr_file_seek(report->body_file, APR_SET, &offset);
- return serf_bucket_file_create(report->body_file, alloc);
+ *body_bkt = serf_bucket_file_create(report->body_file, alloc);
+
+ return SVN_NO_ERROR;
}
static svn_error_t *
@@ -2453,7 +2466,10 @@ abort_report(void *report_baton,
#if 0
report_context_t *report = report_baton;
#endif
- SVN_ERR_MALFUNCTION();
+
+ /* Should we perform some cleanup here? */
+
+ return SVN_NO_ERROR;
}
static const svn_ra_reporter3_t ra_serf_reporter = {
@@ -2715,8 +2731,8 @@ svn_ra_serf__get_file(svn_ra_session_t *
SVN_ERR(svn_ra_serf__retrieve_props(fetch_props, session, conn, fetch_url,
revision, "0", all_props, pool));
- svn_ra_serf__walk_all_props(fetch_props, fetch_url, revision,
- svn_ra_serf__set_flat_props, *props, pool);
+ SVN_ERR(svn_ra_serf__walk_all_props(fetch_props, fetch_url, revision,
+ svn_ra_serf__set_flat_props, *props, pool));
}
if (stream)
Modified: subversion/branches/atomic-revprop/subversion/libsvn_ra_serf/util.c
URL: http://svn.apache.org/viewvc/subversion/branches/atomic-revprop/subversion/libsvn_ra_serf/util.c?rev=982782&r1=982781&r2=982782&view=diff
==============================================================================
--- subversion/branches/atomic-revprop/subversion/libsvn_ra_serf/util.c (original)
+++ subversion/branches/atomic-revprop/subversion/libsvn_ra_serf/util.c Thu Aug 5 20:56:19 2010
@@ -126,25 +126,23 @@ convert_organisation_to_str(apr_hash_t *
(char*)apr_hash_get(org, "E", APR_HASH_KEY_STRING));
}
-/* Callback that implements serf_ssl_need_server_cert_t. This function is
- called on receiving a ssl certificate of a server when opening a https
- connection. It allows Subversion to override the initial validation done
- by serf.
+/* This function is called on receiving a ssl certificate of a server when
+ opening a https connection. It allows Subversion to override the initial
+ validation done by serf.
Serf provides us the @a baton as provided in the call to
serf_ssl_server_cert_callback_set. The result of serf's initial validation
of the certificate @a CERT is returned as a bitmask in FAILURES. */
-static apr_status_t
+static svn_error_t *
ssl_server_cert(void *baton, int failures,
- const serf_ssl_certificate_t *cert)
+ const serf_ssl_certificate_t *cert,
+ apr_pool_t *scratch_pool)
{
svn_ra_serf__connection_t *conn = baton;
- apr_pool_t *subpool;
svn_auth_ssl_server_cert_info_t cert_info;
svn_auth_cred_ssl_server_trust_t *server_creds = NULL;
svn_auth_iterstate_t *state;
const char *realmstring;
apr_uint32_t svn_failures;
- svn_error_t *err;
apr_hash_t *issuer, *subject, *serf_cert;
void *creds;
@@ -154,27 +152,25 @@ ssl_server_cert(void *baton, int failure
return APR_SUCCESS;
}
- subpool = svn_pool_create(conn->session->pool);
-
/* Extract the info from the certificate */
- subject = serf_ssl_cert_subject(cert, subpool);
- issuer = serf_ssl_cert_issuer(cert, subpool);
- serf_cert = serf_ssl_cert_certificate(cert, subpool);
+ subject = serf_ssl_cert_subject(cert, scratch_pool);
+ issuer = serf_ssl_cert_issuer(cert, scratch_pool);
+ serf_cert = serf_ssl_cert_certificate(cert, scratch_pool);
cert_info.hostname = apr_hash_get(subject, "CN", APR_HASH_KEY_STRING);
cert_info.fingerprint = apr_hash_get(serf_cert, "sha1", APR_HASH_KEY_STRING);
if (! cert_info.fingerprint)
- cert_info.fingerprint = apr_pstrdup(subpool, "<unknown>");
+ cert_info.fingerprint = apr_pstrdup(scratch_pool, "<unknown>");
cert_info.valid_from = apr_hash_get(serf_cert, "notBefore",
APR_HASH_KEY_STRING);
if (! cert_info.valid_from)
- cert_info.valid_from = apr_pstrdup(subpool, "[invalid date]");
+ cert_info.valid_from = apr_pstrdup(scratch_pool, "[invalid date]");
cert_info.valid_until = apr_hash_get(serf_cert, "notAfter",
APR_HASH_KEY_STRING);
if (! cert_info.valid_until)
- cert_info.valid_until = apr_pstrdup(subpool, "[invalid date]");
- cert_info.issuer_dname = convert_organisation_to_str(issuer, subpool);
- cert_info.ascii_cert = serf_ssl_cert_export(cert, subpool);
+ cert_info.valid_until = apr_pstrdup(scratch_pool, "[invalid date]");
+ cert_info.issuer_dname = convert_organisation_to_str(issuer, scratch_pool);
+ cert_info.ascii_cert = serf_ssl_cert_export(cert, scratch_pool);
svn_failures = ssl_convert_serf_failures(failures);
@@ -198,32 +194,52 @@ ssl_server_cert(void *baton, int failure
realmstring = construct_realm(conn->session, conn->session->pool);
- err = svn_auth_first_credentials(&creds, &state,
- SVN_AUTH_CRED_SSL_SERVER_TRUST,
- realmstring,
- conn->session->wc_callbacks->auth_baton,
- subpool);
- if (err || ! creds)
- {
- svn_error_clear(err);
- }
- else
+ SVN_ERR(svn_auth_first_credentials(&creds, &state,
+ SVN_AUTH_CRED_SSL_SERVER_TRUST,
+ realmstring,
+ conn->session->wc_callbacks->auth_baton,
+ scratch_pool));
+ if (creds)
{
server_creds = creds;
- err = svn_auth_save_credentials(state, subpool);
- if (err)
- {
- /* It would be nice to show the error to the user somehow... */
- svn_error_clear(err);
- }
+ SVN_ERR(svn_auth_save_credentials(state, scratch_pool));
}
svn_auth_set_parameter(conn->session->wc_callbacks->auth_baton,
SVN_AUTH_PARAM_SSL_SERVER_CERT_INFO, NULL);
+ if (!server_creds)
+ return svn_error_create(SVN_ERR_RA_SERF_SSL_CERT_UNTRUSTED, NULL, NULL);
+
+ return SVN_NO_ERROR;
+}
+
+/* Implements serf_ssl_need_server_cert_t for ssl_server_cert */
+static apr_status_t
+ssl_server_cert_cb(void *baton, int failures,
+ const serf_ssl_certificate_t *cert)
+{
+ svn_ra_serf__connection_t *conn = baton;
+ svn_ra_serf__session_t *session = conn->session;
+ apr_pool_t *subpool;
+ svn_error_t *err;
+
+ subpool = svn_pool_create(session->pool);
+ err = ssl_server_cert(baton, failures, cert, subpool);
+
svn_pool_destroy(subpool);
- return server_creds ? APR_SUCCESS : SVN_ERR_RA_SERF_SSL_CERT_UNTRUSTED;
+ if (err || session->pending_error)
+ {
+ session->pending_error = svn_error_compose_create(
+ session->pending_error,
+ err);
+
+ return session->pending_error->apr_err;
+ }
+
+ return APR_SUCCESS;
+
}
static svn_error_t *
@@ -253,43 +269,28 @@ load_authorities(svn_ra_serf__connection
return SVN_NO_ERROR;
}
-#if SERF_VERSION_AT_LEAST(0, 4, 0)
-/* This ugly ifdef construction can be cleaned up as soon as serf >= 0.4
- gets the minimum supported serf version! */
-
-/* svn_ra_serf__conn_setup is a callback for serf. This function
- creates a read bucket and will wrap the write bucket if SSL
- is needed. */
-apr_status_t
-svn_ra_serf__conn_setup(apr_socket_t *sock,
- serf_bucket_t **read_bkt,
- serf_bucket_t **write_bkt,
- void *baton,
- apr_pool_t *pool)
-{
-#else
-/* This is the old API, for compatibility with serf
- versions <= 0.3. */
-serf_bucket_t *
-svn_ra_serf__conn_setup(apr_socket_t *sock,
- void *baton,
- apr_pool_t *pool)
+static svn_error_t *
+conn_setup(apr_socket_t *sock,
+ serf_bucket_t **read_bkt,
+ serf_bucket_t **write_bkt,
+ void *baton,
+ apr_pool_t *pool)
{
-#endif
- serf_bucket_t *rb = NULL;
svn_ra_serf__connection_t *conn = baton;
- rb = serf_context_bucket_socket_create(conn->session->context,
- sock, conn->bkt_alloc);
+ /* While serf < 0.4.0 is supported we should set read_bkt even when
+ we have an error. See svn_ra_serf__conn_setup() */
+ *read_bkt = serf_context_bucket_socket_create(conn->session->context,
+ sock, conn->bkt_alloc);
if (conn->using_ssl)
{
/* input stream */
- rb = serf_bucket_ssl_decrypt_create(rb, conn->ssl_context,
- conn->bkt_alloc);
+ *read_bkt = serf_bucket_ssl_decrypt_create(*read_bkt, conn->ssl_context,
+ conn->bkt_alloc);
if (!conn->ssl_context)
{
- conn->ssl_context = serf_bucket_ssl_encrypt_context_get(rb);
+ conn->ssl_context = serf_bucket_ssl_encrypt_context_get(*read_bkt);
serf_ssl_client_cert_provider_set(conn->ssl_context,
svn_ra_serf__handle_client_cert,
@@ -298,7 +299,7 @@ svn_ra_serf__conn_setup(apr_socket_t *so
svn_ra_serf__handle_client_cert_pw,
conn, conn->session->pool);
serf_ssl_server_cert_callback_set(conn->ssl_context,
- ssl_server_cert,
+ ssl_server_cert_cb,
conn);
/* See if the user wants us to trust "default" openssl CAs. */
@@ -309,34 +310,72 @@ svn_ra_serf__conn_setup(apr_socket_t *so
/* Are there custom CAs to load? */
if (conn->session->ssl_authorities)
{
- svn_error_t *err;
- err = load_authorities(conn, conn->session->ssl_authorities,
- conn->session->pool);
- if (err)
- {
- /* TODO: we need a way to pass this error back to the
- caller */
- svn_error_clear(err);
- }
+ SVN_ERR(load_authorities(conn, conn->session->ssl_authorities,
+ conn->session->pool));
}
}
-#if SERF_VERSION_AT_LEAST(0, 4, 0)
+
+ if (write_bkt) /* = Serf >= 0.4.0, see svn_ra_serf__conn_setup() */
/* output stream */
*write_bkt = serf_bucket_ssl_encrypt_create(*write_bkt, conn->ssl_context,
conn->bkt_alloc);
-#endif
-
}
+ return SVN_NO_ERROR;
+}
+
#if SERF_VERSION_AT_LEAST(0, 4, 0)
- *read_bkt = rb;
+/* This ugly ifdef construction can be cleaned up as soon as serf >= 0.4
+ gets the minimum supported serf version! */
- return APR_SUCCESS;
-}
+/* svn_ra_serf__conn_setup is a callback for serf. This function
+ creates a read bucket and will wrap the write bucket if SSL
+ is needed. */
+apr_status_t
+svn_ra_serf__conn_setup(apr_socket_t *sock,
+ serf_bucket_t **read_bkt,
+ serf_bucket_t **write_bkt,
+ void *baton,
+ apr_pool_t *pool)
+{
#else
+/* This is the old API, for compatibility with serf
+ versions <= 0.3. */
+serf_bucket_t *
+svn_ra_serf__conn_setup(apr_socket_t *sock,
+ void *baton,
+ apr_pool_t *pool)
+{
+ serf_bucket_t **write_bkt = NULL;
+ serf_bucket_t *rb = NULL;
+ serf_bucket_t **read_bkt = &rb;
+#endif
+ svn_ra_serf__connection_t *conn = baton;
+ svn_ra_serf__session_t *session = conn->session;
+ apr_status_t status = SVN_NO_ERROR;
+
+ svn_error_t *err = conn_setup(sock,
+ read_bkt,
+ write_bkt,
+ baton,
+ pool);
+
+ if (err || session->pending_error)
+ {
+ session->pending_error = svn_error_compose_create(
+ session->pending_error,
+ err);
+
+ status = session->pending_error->apr_err;
+ }
+
+#if ! SERF_VERSION_AT_LEAST(0, 4, 0)
+ SVN_ERR_ASSERT_NO_RETURN(rb != NULL);
return rb;
-}
+#else
+ return status;
#endif
+}
serf_bucket_t*
svn_ra_serf__accept_response(serf_request_t *request,
@@ -370,30 +409,44 @@ accept_head(serf_request_t *request,
return response;
}
+static svn_error_t *
+connection_closed(serf_connection_t *conn,
+ svn_ra_serf__connection_t *sc,
+ apr_status_t why,
+ apr_pool_t *pool)
+{
+ if (why)
+ {
+ SVN_ERR_MALFUNCTION();
+ }
+
+ if (sc->using_ssl)
+ sc->ssl_context = NULL;
+
+ /* Restart the authentication phase on this new connection. */
+ if (sc->session->auth_protocol)
+ SVN_ERR(sc->session->auth_protocol->init_conn_func(sc->session,
+ sc,
+ sc->session->pool));
+
+ return SVN_NO_ERROR;
+}
+
void
svn_ra_serf__conn_closed(serf_connection_t *conn,
void *closed_baton,
apr_status_t why,
apr_pool_t *pool)
{
- svn_ra_serf__connection_t *our_conn = closed_baton;
+ svn_ra_serf__connection_t *sc = closed_baton;
+ svn_error_t *err;
- if (why)
- {
- SVN_ERR_MALFUNCTION_NO_RETURN();
- }
+ err = connection_closed(conn, sc, why, pool);
- if (our_conn->using_ssl)
- {
- our_conn->ssl_context = NULL;
- }
- /* Restart the authentication phase on this new connection. */
- if (our_conn->session->auth_protocol)
- {
- our_conn->session->auth_protocol->init_conn_func(our_conn->session,
- our_conn,
- our_conn->session->pool);
- }
+ if (err)
+ sc->session->pending_error = svn_error_compose_create(
+ sc->session->pending_error,
+ err);
}
apr_status_t
@@ -406,13 +459,15 @@ svn_ra_serf__cleanup_serf_session(void *
return APR_SUCCESS;
}
-apr_status_t svn_ra_serf__handle_client_cert(void *data,
- const char **cert_path)
+/* Implementation of svn_ra_serf__handle_client_cert */
+static svn_error_t *
+handle_client_cert(void *data,
+ const char **cert_path,
+ apr_pool_t *pool)
{
svn_ra_serf__connection_t *conn = data;
svn_ra_serf__session_t *session = conn->session;
const char *realm;
- svn_error_t *err;
void *creds;
*cert_path = NULL;
@@ -421,24 +476,18 @@ apr_status_t svn_ra_serf__handle_client_
if (!conn->ssl_client_auth_state)
{
- err = svn_auth_first_credentials(&creds,
- &conn->ssl_client_auth_state,
- SVN_AUTH_CRED_SSL_CLIENT_CERT,
- realm,
- session->wc_callbacks->auth_baton,
- session->pool);
+ SVN_ERR(svn_auth_first_credentials(&creds,
+ &conn->ssl_client_auth_state,
+ SVN_AUTH_CRED_SSL_CLIENT_CERT,
+ realm,
+ session->wc_callbacks->auth_baton,
+ pool));
}
else
{
- err = svn_auth_next_credentials(&creds,
- conn->ssl_client_auth_state,
- session->pool);
- }
-
- if (err)
- {
- session->pending_error = err;
- return err->apr_err;
+ SVN_ERR(svn_auth_next_credentials(&creds,
+ conn->ssl_client_auth_state,
+ session->pool));
}
if (creds)
@@ -448,40 +497,58 @@ apr_status_t svn_ra_serf__handle_client_
*cert_path = client_creds->cert_file;
}
- return APR_SUCCESS;
+ return SVN_NO_ERROR;
}
-apr_status_t svn_ra_serf__handle_client_cert_pw(void *data,
- const char *cert_path,
- const char **password)
+/* Implements serf_ssl_need_client_cert_t for handle_client_cert */
+apr_status_t svn_ra_serf__handle_client_cert(void *data,
+ const char **cert_path)
+{
+ svn_ra_serf__connection_t *conn = data;
+ svn_ra_serf__session_t *session = conn->session;
+ svn_error_t *err = handle_client_cert(data,
+ cert_path,
+ session->pool);
+
+ if (err || session->pending_error)
+ {
+ session->pending_error = svn_error_compose_create(
+ session->pending_error,
+ err);
+
+ return session->pending_error->apr_err;
+ }
+
+ return APR_SUCCESS;
+}
+
+/* Implementation for svn_ra_serf__handle_client_cert_pw */
+static svn_error_t *
+handle_client_cert_pw(void *data,
+ const char *cert_path,
+ const char **password,
+ apr_pool_t *pool)
{
svn_ra_serf__connection_t *conn = data;
svn_ra_serf__session_t *session = conn->session;
- svn_error_t *err;
void *creds;
*password = NULL;
if (!conn->ssl_client_pw_auth_state)
{
- err = svn_auth_first_credentials(&creds,
- &conn->ssl_client_pw_auth_state,
- SVN_AUTH_CRED_SSL_CLIENT_CERT_PW,
- cert_path,
- session->wc_callbacks->auth_baton,
- session->pool);
+ SVN_ERR(svn_auth_first_credentials(&creds,
+ &conn->ssl_client_pw_auth_state,
+ SVN_AUTH_CRED_SSL_CLIENT_CERT_PW,
+ cert_path,
+ session->wc_callbacks->auth_baton,
+ pool));
}
else
{
- err = svn_auth_next_credentials(&creds,
- conn->ssl_client_pw_auth_state,
- session->pool);
- }
-
- if (err)
- {
- session->pending_error = err;
- return err->apr_err;
+ SVN_ERR(svn_auth_next_credentials(&creds,
+ conn->ssl_client_pw_auth_state,
+ pool));
}
if (creds)
@@ -494,7 +561,32 @@ apr_status_t svn_ra_serf__handle_client_
return APR_SUCCESS;
}
-void
+/* Implements serf_ssl_need_client_cert_pw_t for handle_client_cert_pw */
+apr_status_t svn_ra_serf__handle_client_cert_pw(void *data,
+ const char *cert_path,
+ const char **password)
+{
+ svn_ra_serf__connection_t *conn = data;
+ svn_ra_serf__session_t *session = conn->session;
+ svn_error_t *err = handle_client_cert_pw(data,
+ cert_path,
+ password,
+ session->pool);
+
+ if (err || session->pending_error)
+ {
+ session->pending_error = svn_error_compose_create(
+ session->pending_error,
+ err);
+
+ return session->pending_error->apr_err;
+ }
+
+ return APR_SUCCESS;
+}
+
+
+svn_error_t *
svn_ra_serf__setup_serf_req(serf_request_t *request,
serf_bucket_t **req_bkt,
serf_bucket_t **ret_hdrs_bkt,
@@ -527,13 +619,15 @@ svn_ra_serf__setup_serf_req(serf_request
/* Setup server authorization headers */
if (conn->session->auth_protocol)
- conn->session->auth_protocol->setup_request_func(conn, method, url,
- hdrs_bkt);
+ SVN_ERR(conn->session->auth_protocol->setup_request_func(conn, method, url,
+ hdrs_bkt));
/* Setup proxy authorization headers */
if (conn->session->proxy_auth_protocol)
- conn->session->proxy_auth_protocol->setup_request_func(conn, method,
- url, hdrs_bkt);
+ SVN_ERR(conn->session->proxy_auth_protocol->setup_request_func(conn,
+ method,
+ url,
+ hdrs_bkt));
#if ! SERF_VERSION_AT_LEAST(0, 4, 0)
/* Set up SSL if we need to */
@@ -559,6 +653,8 @@ svn_ra_serf__setup_serf_req(serf_request
{
*ret_hdrs_bkt = hdrs_bkt;
}
+
+ return SVN_NO_ERROR;
}
svn_error_t *
@@ -1227,7 +1323,8 @@ svn_ra_serf__credentials_callback(char *
if (err)
{
- ctx->session->pending_error = err;
+ session->pending_error
+ = svn_error_compose_create(session->pending_error, err);
return err->apr_err;
}
@@ -1236,10 +1333,13 @@ svn_ra_serf__credentials_callback(char *
if (!creds || session->auth_attempts > 4)
{
/* No more credentials. */
- ctx->session->pending_error =
- svn_error_create(SVN_ERR_AUTHN_FAILED, NULL,
- "No more credentials or we tried too many times.\n"
- "Authentication failed");
+ session->pending_error
+ = svn_error_compose_create(
+ session->pending_error,
+ svn_error_create(
+ SVN_ERR_AUTHN_FAILED, NULL,
+ _("No more credentials or we tried too many times.\n"
+ "Authentication failed")));
return SVN_ERR_AUTHN_FAILED;
}
@@ -1257,9 +1357,11 @@ svn_ra_serf__credentials_callback(char *
if (!session->proxy_username || session->proxy_auth_attempts > 4)
{
/* No more credentials. */
- ctx->session->pending_error =
- svn_error_create(SVN_ERR_AUTHN_FAILED, NULL,
- "Proxy authentication failed");
+ session->pending_error
+ = svn_error_compose_create(
+ ctx->session->pending_error,
+ svn_error_create(SVN_ERR_AUTHN_FAILED, NULL,
+ _("Proxy authentication failed")));
return SVN_ERR_AUTHN_FAILED;
}
}
@@ -1269,18 +1371,20 @@ svn_ra_serf__credentials_callback(char *
return APR_SUCCESS;
}
-/* Implements the serf_response_handler_t interface. Wait for HTTP
- response status and headers, and invoke CTX->response_handler() to
- carry out operation-specific processing. Afterwards, check for
- connection close.
+/* Wait for HTTP response status and headers, and invoke CTX->
+ response_handler() to carry out operation-specific processing.
+ Afterwards, check for connection close.
+
+ SERF_STATUS allows returning errors to serf without creating a
+ subversion error object.
*/
-static apr_status_t
+static svn_error_t *
handle_response(serf_request_t *request,
serf_bucket_t *response,
- void *baton,
+ svn_ra_serf__handler_t *ctx,
+ apr_status_t *serf_status,
apr_pool_t *pool)
{
- svn_ra_serf__handler_t *ctx = baton;
serf_status_line sl;
apr_status_t status;
@@ -1288,14 +1392,8 @@ handle_response(serf_request_t *request,
{
/* Uh-oh. Our connection died. Requeue. */
if (ctx->response_error)
- {
- status = ctx->response_error(request, response, 0,
- ctx->response_error_baton);
- if (status)
- {
- goto cleanup;
- }
- }
+ SVN_ERR(ctx->response_error(request, response, 0,
+ ctx->response_error_baton));
svn_ra_serf__request_create(ctx);
@@ -1305,12 +1403,14 @@ handle_response(serf_request_t *request,
status = serf_bucket_response_status(response, &sl);
if (SERF_BUCKET_READ_ERROR(status))
{
- return status;
+ *serf_status = status;
+ return SVN_NO_ERROR; /* Handled by serf */
}
if (!sl.version && (APR_STATUS_IS_EOF(status) ||
APR_STATUS_IS_EAGAIN(status)))
{
- goto cleanup;
+ *serf_status = status;
+ return SVN_NO_ERROR; /* Handled by serf */
}
status = serf_bucket_response_wait_for_headers(response);
@@ -1318,7 +1418,8 @@ handle_response(serf_request_t *request,
{
if (!APR_STATUS_IS_EOF(status))
{
- goto cleanup;
+ *serf_status = status;
+ return SVN_NO_ERROR;
}
/* Cases where a lack of a response body (via EOF) is okay:
@@ -1331,26 +1432,22 @@ handle_response(serf_request_t *request,
*/
if (strcmp(ctx->method, "HEAD") != 0 && sl.code != 204 && sl.code != 304)
{
- ctx->session->pending_error =
+ svn_error_t *err =
svn_error_createf(SVN_ERR_RA_DAV_MALFORMED_DATA,
- svn_error_compose_create(
- ctx->session->pending_error,
- svn_error_wrap_apr(status, NULL)),
+ svn_error_wrap_apr(status, NULL),
_("Premature EOF seen from server "
"(http status=%d)"), sl.code);
/* This discard may be no-op, but let's preserve the algorithm
used elsewhere in this function for clarity's sake. */
svn_ra_serf__response_discard_handler(request, response, NULL, pool);
- status = ctx->session->pending_error->apr_err;
- goto cleanup;
+ return err;
}
}
if (ctx->conn->last_status_code == 401 && sl.code < 400)
{
- svn_error_clear(
- svn_auth_save_credentials(ctx->session->auth_state,
- ctx->session->pool));
+ SVN_ERR(svn_auth_save_credentials(ctx->session->auth_state,
+ ctx->session->pool));
ctx->session->auth_attempts = 0;
ctx->session->auth_state = NULL;
ctx->session->realm = NULL;
@@ -1361,49 +1458,39 @@ handle_response(serf_request_t *request,
if (sl.code == 401 || sl.code == 407)
{
/* 401 Authorization or 407 Proxy-Authentication required */
- svn_error_t *err;
status = svn_ra_serf__response_discard_handler(request, response, NULL, pool);
/* Don't bother handling the authentication request if the response
wasn't received completely yet. Serf will call handle_response
again when more data is received. */
- if (! APR_STATUS_IS_EAGAIN(status))
- {
- err = svn_ra_serf__handle_auth(sl.code, ctx,
- request, response, pool);
- if (err)
- {
- ctx->session->pending_error = svn_error_compose_create(
- err,
- ctx->session->pending_error);
- status = ctx->session->pending_error->apr_err;
- goto cleanup;
- }
-
- svn_ra_serf__priority_request_create(ctx);
- return status;
- }
- else
+ if (APR_STATUS_IS_EAGAIN(status))
{
- return status;
+ *serf_status = status;
+ return SVN_NO_ERROR;
}
+
+ SVN_ERR(svn_ra_serf__handle_auth(sl.code, ctx,
+ request, response, pool));
+
+ svn_ra_serf__priority_request_create(ctx);
+
+ *serf_status = status;
+ return SVN_NO_ERROR;
}
else if (sl.code == 409 || sl.code >= 500)
{
/* 409 Conflict: can indicate a hook error.
5xx (Internal) Server error. */
- ctx->session->pending_error = svn_error_compose_create(
- svn_ra_serf__handle_server_error(request, response, pool),
- ctx->session->pending_error);
+ SVN_ERR(svn_ra_serf__handle_server_error(request, response, pool));
if (!ctx->session->pending_error)
{
- ctx->session->pending_error =
+ return
svn_error_createf(APR_EGENERAL, NULL,
_("Unspecified error message: %d %s"), sl.code, sl.reason);
}
- status = ctx->session->pending_error->apr_err;
- goto cleanup;
+
+ return SVN_NO_ERROR; /* Error is set in caller */
}
else
{
@@ -1425,56 +1512,72 @@ handle_response(serf_request_t *request,
{
svn_ra_serf__response_discard_handler(request, response, NULL,
pool);
- ctx->session->pending_error = err;
- status = ctx->session->pending_error->apr_err;
- goto cleanup;
+ /* Ignore serf status code, just return the real error */
+
+ return svn_error_return(err);
}
}
err = ctx->response_handler(request,response, ctx->response_baton, pool);
- if (err)
- {
- status = err->apr_err;
- if (!SERF_BUCKET_READ_ERROR(err->apr_err))
- {
- /* These errors are special cased in serf
- ### We hope no handler returns these by accident. */
- svn_error_clear(err);
- }
- else
- {
- ctx->session->pending_error =
- svn_error_return(svn_error_compose_create(
- err,
- ctx->session->pending_error));
- }
+ if (err
+ && (!SERF_BUCKET_READ_ERROR(err->apr_err)
+ || APR_STATUS_IS_ECONNRESET(err->apr_err)))
+ {
+ /* These errors are special cased in serf
+ ### We hope no handler returns these by accident. */
+ *serf_status = err->apr_err;
+ svn_error_clear(err);
+ return SVN_NO_ERROR;
}
+
+ return svn_error_return(err);
}
+}
-cleanup:
- return status;
+/* Implements serf_response_handler_t for handle_response. Storing
+ errors in ctx->session->pending_error if appropriate. */
+static apr_status_t
+handle_response_cb(serf_request_t *request,
+ serf_bucket_t *response,
+ void *baton,
+ apr_pool_t *pool)
+{
+ svn_ra_serf__handler_t *ctx = baton;
+ svn_ra_serf__session_t *session = ctx->session;
+ svn_error_t *err;
+ apr_status_t serf_status = APR_SUCCESS;
+
+ err = svn_error_return(
+ handle_response(request, response, ctx, &serf_status, pool));
+
+ if (err || session->pending_error)
+ {
+ session->pending_error = svn_error_compose_create(session->pending_error,
+ err);
+
+ serf_status = session->pending_error->apr_err;
+ }
+
+ return serf_status;
}
-/* Implements the serf_request_setup_t interface (which sets up both a
- request and its response handler callback). If the CTX->setup()
- callback is non-NULL, invoke it to carry out the majority of the
- serf_request_setup_t implementation. Otherwise, perform default
- setup, with special handling for HEAD requests, and finer-grained
+/* If the CTX->setup() callback is non-NULL, invoke it to carry out the
+ majority of the serf_request_setup_t implementation. Otherwise, perform
+ default setup, with special handling for HEAD requests, and finer-grained
callbacks invoked (if non-NULL) to produce the request headers and
body. */
-static apr_status_t
+static svn_error_t *
setup_request(serf_request_t *request,
- void *setup_baton,
- serf_bucket_t **req_bkt,
- serf_response_acceptor_t *acceptor,
- void **acceptor_baton,
- serf_response_handler_t *handler,
- void **handler_baton,
- apr_pool_t *pool)
+ svn_ra_serf__handler_t *ctx,
+ serf_bucket_t **req_bkt,
+ serf_response_acceptor_t *acceptor,
+ void **acceptor_baton,
+ serf_response_handler_t *handler,
+ void **handler_baton,
+ apr_pool_t *pool)
{
- svn_ra_serf__handler_t *ctx = setup_baton;
serf_bucket_t *headers_bkt;
*acceptor = svn_ra_serf__accept_response;
@@ -1484,17 +1587,11 @@ setup_request(serf_request_t *request,
{
svn_ra_serf__response_handler_t response_handler;
void *response_baton;
- svn_error_t *error;
- error = ctx->setup(request, ctx->setup_baton, req_bkt,
- acceptor, acceptor_baton,
- &response_handler, &response_baton,
- pool);
- if (error)
- {
- ctx->session->pending_error = error;
- return error->apr_err;
- }
+ SVN_ERR(ctx->setup(request, ctx->setup_baton, req_bkt,
+ acceptor, acceptor_baton,
+ &response_handler, &response_baton,
+ pool));
ctx->response_handler = response_handler;
ctx->response_baton = response_baton;
@@ -1511,42 +1608,77 @@ setup_request(serf_request_t *request,
if (ctx->body_delegate)
{
- body_bkt =
- ctx->body_delegate(ctx->body_delegate_baton, bkt_alloc, pool);
+ SVN_ERR(ctx->body_delegate(&body_bkt, ctx->body_delegate_baton,
+ bkt_alloc, pool));
}
else
{
body_bkt = NULL;
}
- svn_ra_serf__setup_serf_req(request, req_bkt, &headers_bkt, ctx->conn,
- ctx->method, ctx->path,
- body_bkt, ctx->body_type);
+ SVN_ERR(svn_ra_serf__setup_serf_req(request, req_bkt, &headers_bkt,
+ ctx->conn, ctx->method, ctx->path,
+ body_bkt, ctx->body_type));
if (ctx->header_delegate)
{
- ctx->header_delegate(headers_bkt, ctx->header_delegate_baton, pool);
+ SVN_ERR(ctx->header_delegate(headers_bkt, ctx->header_delegate_baton,
+ pool));
}
}
- *handler = handle_response;
+ *handler = handle_response_cb;
*handler_baton = ctx;
return APR_SUCCESS;
}
+/* Implements the serf_request_setup_t interface (which sets up both a
+ request and its response handler callback). Handles errors for
+ setup_request_cb */
+static apr_status_t
+setup_request_cb(serf_request_t *request,
+ void *setup_baton,
+ serf_bucket_t **req_bkt,
+ serf_response_acceptor_t *acceptor,
+ void **acceptor_baton,
+ serf_response_handler_t *handler,
+ void **handler_baton,
+ apr_pool_t *pool)
+{
+ svn_ra_serf__handler_t *ctx = setup_baton;
+ svn_error_t *err;
+
+ err = setup_request(request, ctx,
+ req_bkt,
+ acceptor, acceptor_baton,
+ handler, handler_baton,
+ pool);
+
+ if (err)
+ {
+ ctx->session->pending_error
+ = svn_error_compose_create(ctx->session->pending_error,
+ err);
+
+ return err->apr_err;
+ }
+
+ return APR_SUCCESS;
+}
+
serf_request_t *
svn_ra_serf__request_create(svn_ra_serf__handler_t *handler)
{
return serf_connection_request_create(handler->conn->conn,
- setup_request, handler);
+ setup_request_cb, handler);
}
serf_request_t *
svn_ra_serf__priority_request_create(svn_ra_serf__handler_t *handler)
{
return serf_connection_priority_request_create(handler->conn->conn,
- setup_request, handler);
+ setup_request_cb, handler);
}
svn_error_t *