svn_error_t * svn_ra_neon__copy(svn_ra_neon__session_t *ras, svn_boolean_t overwrite, int depth, const char *src, const char *dst, apr_pool_t *pool) { const char *abs_dst; apr_hash_t *extra_headers = apr_hash_make(pool); abs_dst = apr_psprintf(pool, "%s://%s%s", ne_get_scheme(ras->ne_sess), ne_get_server_hostport(ras->ne_sess), dst); apr_hash_set(extra_headers, "Destination", APR_HASH_KEY_STRING, abs_dst); apr_hash_set(extra_headers, "Overwrite", APR_HASH_KEY_STRING, overwrite ? "T" : "F"); svn_ra_neon__add_depth_header(extra_headers, depth); return svn_ra_neon__simple_request(NULL, ras, "COPY", src, extra_headers, NULL, 201, 204, pool); }
svn_error_t * svn_ra_neon__do_proppatch(svn_ra_neon__session_t *ras, const char *url, apr_hash_t *prop_changes, apr_array_header_t *prop_deletes, apr_hash_t *extra_headers, apr_pool_t *pool) { svn_error_t *err; svn_stringbuf_t *body; apr_pool_t *subpool = svn_pool_create(pool); /* just punt if there are no changes to make. */ if ((prop_changes == NULL || (! apr_hash_count(prop_changes))) && (prop_deletes == NULL || prop_deletes->nelts == 0)) return SVN_NO_ERROR; /* easier to roll our own PROPPATCH here than use ne_proppatch(), which * doesn't really do anything clever. */ body = svn_stringbuf_create ("<?xml version=\"1.0\" encoding=\"utf-8\" ?>" DEBUG_CR "<D:propertyupdate xmlns:D=\"DAV:\" xmlns:V=\"" SVN_DAV_PROP_NS_DAV "\" xmlns:C=\"" SVN_DAV_PROP_NS_CUSTOM "\" xmlns:S=\"" SVN_DAV_PROP_NS_SVN "\">" DEBUG_CR, pool); /* Handle property changes. */ if (prop_changes) { apr_hash_index_t *hi; svn_stringbuf_appendcstr(body, "<D:set><D:prop>"); for (hi = apr_hash_first(pool, prop_changes); hi; hi = apr_hash_next(hi)) { const void *key; void *val; svn_pool_clear(subpool); apr_hash_this(hi, &key, NULL, &val); append_setprop(body, key, val, subpool); } svn_stringbuf_appendcstr(body, "</D:prop></D:set>"); } /* Handle property deletions. */ if (prop_deletes) { int n; svn_stringbuf_appendcstr(body, "<D:remove><D:prop>"); for (n = 0; n < prop_deletes->nelts; n++) { const char *name = APR_ARRAY_IDX(prop_deletes, n, const char *); svn_pool_clear(subpool); append_setprop(body, name, NULL, subpool); } svn_stringbuf_appendcstr(body, "</D:prop></D:remove>"); } svn_pool_destroy(subpool); /* Finish up the body. */ svn_stringbuf_appendcstr(body, "</D:propertyupdate>"); /* Finish up the headers. */ if (! extra_headers) extra_headers = apr_hash_make(pool); apr_hash_set(extra_headers, "Content-Type", APR_HASH_KEY_STRING, "text/xml; charset=UTF-8"); err = svn_ra_neon__simple_request(NULL, ras, "PROPPATCH", url, extra_headers, body->data, 200, 207, pool); if (err) return svn_error_create (SVN_ERR_RA_DAV_PROPPATCH_FAILED, err, _("At least one property change failed; repository is unchanged")); return SVN_NO_ERROR; }