summaryrefslogtreecommitdiff
path: root/subversion/mod_dav_svn/merge.c
diff options
context:
space:
mode:
Diffstat (limited to 'subversion/mod_dav_svn/merge.c')
-rw-r--r--subversion/mod_dav_svn/merge.c95
1 files changed, 49 insertions, 46 deletions
diff --git a/subversion/mod_dav_svn/merge.c b/subversion/mod_dav_svn/merge.c
index 3d6d80b..5407a0f 100644
--- a/subversion/mod_dav_svn/merge.c
+++ b/subversion/mod_dav_svn/merge.c
@@ -72,21 +72,20 @@ send_response(const dav_svn_repos *repos,
svn_fs_root_t *root,
const char *path,
svn_boolean_t is_dir,
- ap_filter_t *output,
+ dav_svn__output *output,
apr_bucket_brigade *bb,
apr_pool_t *pool)
{
const char *href;
const char *vsn_url;
- apr_status_t status;
svn_revnum_t rev_to_use;
href = dav_svn__build_uri(repos, DAV_SVN__BUILD_URI_PUBLIC,
SVN_IGNORED_REVNUM, path, 0 /* add_href */, pool);
rev_to_use = dav_svn__get_safe_cr(root, path, pool);
vsn_url = dav_svn__build_uri(repos, DAV_SVN__BUILD_URI_VERSION,
- rev_to_use, path, 0 /* add_href */, pool);
- status = ap_fputstrs(output, bb,
+ rev_to_use, path, FALSE /* add_href */, pool);
+ SVN_ERR(dav_svn__brigade_putstrs(bb, output,
"<D:response>" DEBUG_CR
"<D:href>",
apr_xml_quote_string(pool, href, 1),
@@ -103,9 +102,7 @@ send_response(const dav_svn_repos *repos,
"<D:status>HTTP/1.1 200 OK</D:status>" DEBUG_CR
"</D:propstat>" DEBUG_CR
"</D:response>" DEBUG_CR,
- NULL);
- if (status != APR_SUCCESS)
- return svn_error_wrap_apr(status, "Can't write response to output");
+ SVN_VA_NULL));
return SVN_NO_ERROR;
}
@@ -115,7 +112,7 @@ static svn_error_t *
do_resources(const dav_svn_repos *repos,
svn_fs_root_t *root,
svn_revnum_t revision,
- ap_filter_t *output,
+ dav_svn__output *output,
apr_bucket_brigade *bb,
apr_pool_t *pool)
{
@@ -136,12 +133,13 @@ do_resources(const dav_svn_repos *repos,
const void *key;
void *val;
const char *path;
+ apr_ssize_t path_len;
svn_fs_path_change2_t *change;
svn_boolean_t send_self;
svn_boolean_t send_parent;
svn_pool_clear(subpool);
- apr_hash_this(hi, &key, NULL, &val);
+ apr_hash_this(hi, &key, &path_len, &val);
path = key;
change = val;
@@ -170,14 +168,14 @@ do_resources(const dav_svn_repos *repos,
{
/* If we haven't already sent this path, send it (and then
remember that we sent it). */
- if (! svn_hash_gets(sent, path))
+ if (! apr_hash_get(sent, path, path_len))
{
svn_node_kind_t kind;
SVN_ERR(svn_fs_check_path(&kind, root, path, subpool));
SVN_ERR(send_response(repos, root, path,
kind == svn_node_dir,
output, bb, subpool));
- svn_hash_sets(sent, path, (void *)1);
+ apr_hash_set(sent, path, path_len, (void *)1);
}
}
if (send_parent)
@@ -208,7 +206,7 @@ do_resources(const dav_svn_repos *repos,
*/
dav_error *
-dav_svn__merge_response(ap_filter_t *output,
+dav_svn__merge_response(dav_svn__output *output,
const dav_svn_repos *repos,
svn_revnum_t new_rev,
const char *post_commit_err,
@@ -224,7 +222,6 @@ dav_svn__merge_response(ap_filter_t *output,
svn_string_t *creationdate, *creator_displayname;
const char *post_commit_err_elem = NULL,
*post_commit_header_info = NULL;
- apr_status_t status;
serr = svn_fs_revision_root(&root, repos->fs, new_rev, pool);
if (serr != NULL)
@@ -235,13 +232,14 @@ dav_svn__merge_response(ap_filter_t *output,
repos->pool);
}
- bb = apr_brigade_create(pool, output->c->bucket_alloc);
+ bb = apr_brigade_create(pool,
+ dav_svn__output_get_bucket_alloc(output));
/* prep some strings */
/* the HREF for the baseline is actually the VCC */
vcc = dav_svn__build_uri(repos, DAV_SVN__BUILD_URI_VCC, SVN_IGNORED_REVNUM,
- NULL, 0 /* add_href */, pool);
+ NULL, FALSE /* add_href */, pool);
/* the version-name of the baseline is the revision number */
rev = apr_psprintf(pool, "%ld", new_rev);
@@ -285,7 +283,7 @@ dav_svn__merge_response(ap_filter_t *output,
}
- status = ap_fputstrs(output, bb,
+ serr = dav_svn__brigade_putstrs(bb, output,
DAV_XML_HEADER DEBUG_CR
"<D:merge-response xmlns:D=\"DAV:\"",
post_commit_header_info,
@@ -304,44 +302,47 @@ dav_svn__merge_response(ap_filter_t *output,
"<D:resourcetype><D:baseline/></D:resourcetype>" DEBUG_CR,
post_commit_err_elem, DEBUG_CR
"<D:version-name>", rev, "</D:version-name>" DEBUG_CR,
- NULL);
- if (status != APR_SUCCESS)
- return dav_svn__new_error(repos->pool, HTTP_INTERNAL_SERVER_ERROR, 0,
- "Could not write output");
+ SVN_VA_NULL);
+ if (serr != NULL)
+ return dav_svn__convert_err(serr, HTTP_INTERNAL_SERVER_ERROR,
+ "Could not write output",
+ repos->pool);
if (creationdate)
{
- status = ap_fputstrs(output, bb,
+ serr = dav_svn__brigade_putstrs(bb, output,
"<D:creationdate>",
apr_xml_quote_string(pool, creationdate->data, 1),
"</D:creationdate>" DEBUG_CR,
- NULL);
- if (status != APR_SUCCESS)
- return dav_svn__new_error(repos->pool, HTTP_INTERNAL_SERVER_ERROR, 0,
- "Could not write output");
+ SVN_VA_NULL);
+ if (serr != NULL)
+ return dav_svn__convert_err(serr, HTTP_INTERNAL_SERVER_ERROR,
+ "Could not write output",
+ repos->pool);
}
if (creator_displayname)
{
- status = ap_fputstrs(output, bb,
+ serr = dav_svn__brigade_putstrs(bb, output,
"<D:creator-displayname>",
apr_xml_quote_string(pool,
creator_displayname->data, 1),
"</D:creator-displayname>" DEBUG_CR,
- NULL);
- if (status != APR_SUCCESS)
- return dav_svn__new_error(repos->pool, HTTP_INTERNAL_SERVER_ERROR, 0,
- "Could not write output");
+ SVN_VA_NULL);
+ if (serr != NULL)
+ return dav_svn__convert_err(serr, HTTP_INTERNAL_SERVER_ERROR,
+ "Could not write output",
+ repos->pool);
}
- status = ap_fputstrs(output, bb,
+ serr = dav_svn__brigade_putstrs(bb, output,
"</D:prop>" DEBUG_CR
"<D:status>HTTP/1.1 200 OK</D:status>" DEBUG_CR
"</D:propstat>" DEBUG_CR
"</D:response>" DEBUG_CR,
-
- NULL);
- if (status != APR_SUCCESS)
- return dav_svn__new_error(repos->pool, HTTP_INTERNAL_SERVER_ERROR, 0,
- "Could not write output");
+ SVN_VA_NULL);
+ if (serr != NULL)
+ return dav_svn__convert_err(serr, HTTP_INTERNAL_SERVER_ERROR,
+ "Could not write output",
+ repos->pool);
/* ONLY have dir_delta drive the editor if the caller asked us to
generate a full MERGE response. svn clients can ask us to
@@ -370,18 +371,20 @@ dav_svn__merge_response(ap_filter_t *output,
}
/* wrap up the merge response */
- status = ap_fputs(output, bb,
- "</D:updated-set>" DEBUG_CR
- "</D:merge-response>" DEBUG_CR);
- if (status != APR_SUCCESS)
- return dav_svn__new_error(repos->pool, HTTP_INTERNAL_SERVER_ERROR, 0,
- "Could not write output");
+ serr = dav_svn__brigade_puts(bb, output,
+ "</D:updated-set>" DEBUG_CR
+ "</D:merge-response>" DEBUG_CR);
+ if (serr != NULL)
+ return dav_svn__convert_err(serr, HTTP_INTERNAL_SERVER_ERROR,
+ "Could not write output",
+ repos->pool);
/* send whatever is left in the brigade */
- status = ap_pass_brigade(output, bb);
- if (status != APR_SUCCESS)
- return dav_svn__new_error(repos->pool, HTTP_INTERNAL_SERVER_ERROR, 0,
- "Could not write output");
+ serr = dav_svn__output_pass_brigade(output, bb);
+ if (serr != NULL)
+ return dav_svn__convert_err(serr, HTTP_INTERNAL_SERVER_ERROR,
+ "Could not write output",
+ repos->pool);
return NULL;
}