/* Implements the #merge_dir_config method of Apache's #module vtable. */ static void * merge_dir_config(apr_pool_t *p, void *base, void *overrides) { dir_conf_t *parent = base; dir_conf_t *child = overrides; dir_conf_t *newconf; newconf = apr_pcalloc(p, sizeof(*newconf)); newconf->fs_path = INHERIT_VALUE(parent, child, fs_path); newconf->master_uri = INHERIT_VALUE(parent, child, master_uri); newconf->master_version = INHERIT_VALUE(parent, child, master_version); newconf->activities_db = INHERIT_VALUE(parent, child, activities_db); newconf->repo_name = INHERIT_VALUE(parent, child, repo_name); newconf->xslt_uri = INHERIT_VALUE(parent, child, xslt_uri); newconf->fs_parent_path = INHERIT_VALUE(parent, child, fs_parent_path); newconf->autoversioning = INHERIT_VALUE(parent, child, autoversioning); newconf->bulk_updates = INHERIT_VALUE(parent, child, bulk_updates); newconf->v2_protocol = INHERIT_VALUE(parent, child, v2_protocol); newconf->path_authz_method = INHERIT_VALUE(parent, child, path_authz_method); newconf->list_parentpath = INHERIT_VALUE(parent, child, list_parentpath); newconf->txdelta_cache = INHERIT_VALUE(parent, child, txdelta_cache); newconf->fulltext_cache = INHERIT_VALUE(parent, child, fulltext_cache); newconf->revprop_cache = INHERIT_VALUE(parent, child, revprop_cache); newconf->block_read = INHERIT_VALUE(parent, child, block_read); newconf->root_dir = INHERIT_VALUE(parent, child, root_dir); newconf->hooks_env = INHERIT_VALUE(parent, child, hooks_env); if (parent->fs_path) ap_log_error(APLOG_MARK, APLOG_WARNING, 0, NULL, "mod_dav_svn: nested Location '%s' hinders access to '%s' " "in SVNPath Location '%s'", child->root_dir, svn_urlpath__skip_ancestor(parent->root_dir, child->root_dir), parent->root_dir); return newconf; }
/* Conforms to svn_ra_serf__xml_closed_t */ static svn_error_t * merge_closed(svn_ra_serf__xml_estate_t *xes, void *baton, int leaving_state, const svn_string_t *cdata, apr_hash_t *attrs, apr_pool_t *scratch_pool) { merge_context_t *merge_ctx = baton; if (leaving_state == RESPONSE) { const char *rtype; rtype = svn_hash_gets(attrs, "resourcetype"); /* rtype can only be "baseline" or "collection" (or NULL). We can keep this check simple. */ if (rtype && *rtype == 'b') { const char *rev_str; rev_str = svn_hash_gets(attrs, "revision"); if (rev_str) { apr_int64_t rev; SVN_ERR(svn_cstring_atoi64(&rev, rev_str)); merge_ctx->commit_info->revision = (svn_revnum_t)rev; } else merge_ctx->commit_info->revision = SVN_INVALID_REVNUM; merge_ctx->commit_info->date = apr_pstrdup(merge_ctx->pool, svn_hash_gets(attrs, "date")); merge_ctx->commit_info->author = apr_pstrdup(merge_ctx->pool, svn_hash_gets(attrs, "author")); merge_ctx->commit_info->post_commit_err = apr_pstrdup(merge_ctx->pool, svn_hash_gets(attrs, "post-commit-err")); } else { const char *href; href = svn_urlpath__skip_ancestor( merge_ctx->merge_url, svn_hash_gets(attrs, "href")); if (href == NULL) return svn_error_createf(SVN_ERR_RA_DAV_REQUEST_FAILED, NULL, _("A MERGE response for '%s' is not " "a child of the destination ('%s')"), href, merge_ctx->merge_url); /* We now need to dive all the way into the WC to update the base VCC url. */ if (!SVN_RA_SERF__HAVE_HTTPV2_SUPPORT(merge_ctx->session) && merge_ctx->session->wc_callbacks->push_wc_prop) { const char *checked_in; svn_string_t checked_in_str; checked_in = svn_hash_gets(attrs, "checked-in"); checked_in_str.data = checked_in; checked_in_str.len = strlen(checked_in); SVN_ERR(merge_ctx->session->wc_callbacks->push_wc_prop( merge_ctx->session->wc_callback_baton, href, SVN_RA_SERF__WC_CHECKED_IN_URL, &checked_in_str, scratch_pool)); } } } else if (leaving_state == BASELINE) { svn_ra_serf__xml_note(xes, RESPONSE, "resourcetype", "baseline"); } else if (leaving_state == COLLECTION) { svn_ra_serf__xml_note(xes, RESPONSE, "resourcetype", "collection"); } else { const char *name; const char *value = cdata->data; if (leaving_state == HREF) { name = "href"; value = svn_urlpath__canonicalize(value, scratch_pool); } else if (leaving_state == CHECKED_IN) { name = "checked-in"; value = svn_urlpath__canonicalize(value, scratch_pool); } else if (leaving_state == VERSION_NAME) name = "revision"; else if (leaving_state == DATE) name = "date"; else if (leaving_state == AUTHOR) name = "author"; else if (leaving_state == POST_COMMIT_ERR) name = "post-commit-err"; else SVN_ERR_MALFUNCTION(); svn_ra_serf__xml_note(xes, RESPONSE, name, value); } return SVN_NO_ERROR; }