diff options
author | Lorry Tar Creator <lorry-tar-importer@lorry> | 2017-08-05 16:22:51 +0000 |
---|---|---|
committer | Lorry Tar Creator <lorry-tar-importer@lorry> | 2017-08-05 16:22:51 +0000 |
commit | cf46733632c7279a9fd0fe6ce26f9185a4ae82a9 (patch) | |
tree | da27775a2161723ef342e91af41a8b51fedef405 /subversion/mod_dav_svn/merge.c | |
parent | bb0ef45f7c46b0ae221b26265ef98a768c33f820 (diff) | |
download | subversion-tarball-master.tar.gz |
subversion-1.9.7HEADsubversion-1.9.7master
Diffstat (limited to 'subversion/mod_dav_svn/merge.c')
-rw-r--r-- | subversion/mod_dav_svn/merge.c | 95 |
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; } |