Modified: subversion/branches/verify-keep-going/subversion/mod_dav_svn/mod_dav_svn.c URL: http://svn.apache.org/viewvc/subversion/branches/verify-keep-going/subversion/mod_dav_svn/mod_dav_svn.c?rev=1546002&r1=1546001&r2=1546002&view=diff ============================================================================== --- subversion/branches/verify-keep-going/subversion/mod_dav_svn/mod_dav_svn.c (original) +++ subversion/branches/verify-keep-going/subversion/mod_dav_svn/mod_dav_svn.c Wed Nov 27 11:52:35 2013 @@ -217,6 +217,7 @@ create_dir_config(apr_pool_t *p, char *d conf->bulk_updates = CONF_BULKUPD_ON; conf->v2_protocol = CONF_FLAG_ON; conf->hooks_env = NULL; + conf->txdelta_cache = CONF_FLAG_ON; return conf; } @@ -745,7 +746,7 @@ const char * dav_svn__get_me_resource_uri(request_rec *r) { return apr_pstrcat(r->pool, dav_svn__get_special_uri(r), "/me", - (char *)NULL); + SVN_VA_NULL); } @@ -753,7 +754,7 @@ const char * dav_svn__get_rev_stub(request_rec *r) { return apr_pstrcat(r->pool, dav_svn__get_special_uri(r), "/rev", - (char *)NULL); + SVN_VA_NULL); } @@ -761,7 +762,7 @@ const char * dav_svn__get_rev_root_stub(request_rec *r) { return apr_pstrcat(r->pool, dav_svn__get_special_uri(r), "/rvr", - (char *)NULL); + SVN_VA_NULL); } @@ -769,14 +770,14 @@ const char * dav_svn__get_txn_stub(request_rec *r) { return apr_pstrcat(r->pool, dav_svn__get_special_uri(r), "/txn", - (char *)NULL); + SVN_VA_NULL); } const char * dav_svn__get_txn_root_stub(request_rec *r) { - return apr_pstrcat(r->pool, dav_svn__get_special_uri(r), "/txr", (char *)NULL); + return apr_pstrcat(r->pool, dav_svn__get_special_uri(r), "/txr", SVN_VA_NULL); } @@ -784,7 +785,7 @@ const char * dav_svn__get_vtxn_stub(request_rec *r) { return apr_pstrcat(r->pool, dav_svn__get_special_uri(r), "/vtxn", - (char *)NULL); + SVN_VA_NULL); } @@ -792,7 +793,7 @@ const char * dav_svn__get_vtxn_root_stub(request_rec *r) { return apr_pstrcat(r->pool, dav_svn__get_special_uri(r), "/vtxr", - (char *)NULL); + SVN_VA_NULL); } @@ -979,7 +980,6 @@ merge_xml_filter_insert(request_rec *r) typedef struct merge_ctx_t { apr_bucket_brigade *bb; apr_xml_parser *parser; - apr_pool_t *pool; } merge_ctx_t; @@ -1009,7 +1009,6 @@ merge_xml_in_filter(ap_filter_t *f, f->ctx = ctx = apr_palloc(r->pool, sizeof(*ctx)); ctx->parser = apr_xml_parser_create(r->pool); ctx->bb = apr_brigade_create(r->pool, r->connection->bucket_alloc); - apr_pool_create(&ctx->pool, r->pool); } rv = ap_get_brigade(f->next, ctx->bb, mode, block, readbytes); @@ -1094,7 +1093,88 @@ static int dav_svn__handler(request_rec return DECLINED; } +#define NO_MAP_TO_STORAGE_NOTE "dav_svn-no-map-to-storage" +/* Fill the filename on the request with a bogus path since we aren't serving + * a file off the disk. This means that <Directory> blocks will not match and + * %f in logging formats will show as "dav_svn:/path/to/repo/path/in/repo". + */ +static int dav_svn__translate_name(request_rec *r) +{ + const char *fs_path, *repos_basename, *repos_path; + const char *ignore_cleaned_uri, *ignore_relative_path; + int ignore_had_slash; + dir_conf_t *conf = ap_get_module_config(r->per_dir_config, &dav_svn_module); + + /* module is not configured, bail out early */ + if (!conf->fs_path && !conf->fs_parent_path) + return DECLINED; + + if (dav_svn__is_parentpath_list(r)) + { + /* SVNListParentPath is on and the request is for the conf->root_dir, + * so just set the repos_basename to an empty string and the repos_path + * to NULL so we end up just reporting our parent path as the bogus + * path. */ + repos_basename = ""; + repos_path = NULL; + } + else + { + /* Retrieve path to repo and within repo for the request */ + dav_error *err = dav_svn_split_uri(r, r->uri, conf->root_dir, + &ignore_cleaned_uri, + &ignore_had_slash, &repos_basename, + &ignore_relative_path, &repos_path); + if (err) + { + dav_svn__log_err(r, err, APLOG_ERR); + return err->status; + } + } + + if (conf->fs_parent_path) + { + fs_path = svn_dirent_join(conf->fs_parent_path, repos_basename, + r->pool); + } + else + { + fs_path = conf->fs_path; + } + + /* Avoid a trailing slash on the bogus path when repos_path is just "/" */ + if (repos_path && '/' == repos_path[0] && '\0' == repos_path[1]) + repos_path = NULL; + + /* Combine 'dav_svn:', fs_path and repos_path to produce the bogus path we're + * placing in r->filename. We can't use our standard join helpers such + * as svn_dirent_join. fs_path is a dirent and repos_path is a fspath + * (that can be trivially converted to a relpath by skipping the leading + * slash). In general it is safe to join these, but when a path in a + * repository is 'trunk/c:hi' this results in a non canonical dirent on + * Windows. Instead we just cat them together. */ + r->filename = apr_pstrcat(r->pool, + "dav_svn:", fs_path, repos_path, SVN_VA_NULL); + + /* Leave a note to ourselves so that we know not to decline in the + * map_to_storage hook. */ + apr_table_setn(r->notes, NO_MAP_TO_STORAGE_NOTE, (const char*)1); + return OK; +} + +/* Prevent core_map_to_storage from running if we prevented the r->filename + * from being set since core_map_to_storage doesn't like r->filename being + * bogus. */ +static int dav_svn__map_to_storage(request_rec *r) +{ + /* Check a note we left in translate_name since map_to_storage doesn't + * have access to our configuration. */ + if (apr_table_get(r->notes, NO_MAP_TO_STORAGE_NOTE)) + return OK; + + return DECLINED; +} @@ -1175,7 +1255,7 @@ static const command_rec cmds[] = ACCESS_CONF|RSRC_CONF, "speeds up data access to older revisions by caching " "delta information if sufficient in-memory cache is " - "available (default is Off)."), + "available (default is On)."), /* per directory/location */ AP_INIT_FLAG("SVNCacheFullTexts", SVNCacheFullTexts_cmd, NULL, @@ -1268,6 +1348,12 @@ register_hooks(apr_pool_t *pconf) ap_register_input_filter("IncomingRewrite", dav_svn__location_in_filter, NULL, AP_FTYPE_CONTENT_SET); ap_hook_fixups(dav_svn__proxy_request_fixup, NULL, NULL, APR_HOOK_MIDDLE); + /* translate_name hook is LAST so that it doesn't interfere with modules + * like mod_alias that are MIDDLE. */ + ap_hook_translate_name(dav_svn__translate_name, NULL, NULL, APR_HOOK_LAST); + /* map_to_storage hook is LAST to avoid interferring with mod_http's + * handling of OPTIONS and TRACE. */ + ap_hook_map_to_storage(dav_svn__map_to_storage, NULL, NULL, APR_HOOK_LAST); }
Modified: subversion/branches/verify-keep-going/subversion/mod_dav_svn/reports/log.c URL: http://svn.apache.org/viewvc/subversion/branches/verify-keep-going/subversion/mod_dav_svn/reports/log.c?rev=1546002&r1=1546001&r2=1546002&view=diff ============================================================================== --- subversion/branches/verify-keep-going/subversion/mod_dav_svn/reports/log.c (original) +++ subversion/branches/verify-keep-going/subversion/mod_dav_svn/reports/log.c Wed Nov 27 11:52:35 2013 @@ -87,6 +87,48 @@ maybe_send_header(struct log_receiver_ba return SVN_NO_ERROR; } +/* Utility for log_receiver opening a new XML element in LRB's brigade + for LOG_ITEM and return the element's name in *ELEMENT. Use POOL for + temporary allocations. + + Call this function for items that may have a copy-from */ +static svn_error_t * +start_path_with_copy_from(const char **element, + struct log_receiver_baton *lrb, + svn_log_changed_path2_t *log_item, + apr_pool_t *pool) +{ + switch (log_item->action) + { + case 'A': *element = "S:added-path"; + break; + case 'R': *element = "S:replaced-path"; + break; + case 'V': *element = "S:moved-path"; + break; + case 'E': *element = "S:replaced-by-moved-path"; + break; + + default: /* Caller, you did wrong! */ + SVN_ERR_MALFUNCTION(); + } + + if (log_item->copyfrom_path + && SVN_IS_VALID_REVNUM(log_item->copyfrom_rev)) + SVN_ERR(dav_svn__brigade_printf + (lrb->bb, lrb->output, + "<%s copyfrom-path=\"%s\" copyfrom-rev=\"%ld\"", + *element, + apr_xml_quote_string(pool, + log_item->copyfrom_path, + 1), /* escape quotes */ + log_item->copyfrom_rev)); + else + SVN_ERR(dav_svn__brigade_printf(lrb->bb, lrb->output, "<%s", *element)); + + return SVN_NO_ERROR; +} + /* This implements `svn_log_entry_receiver_t'. BATON is a `struct log_receiver_baton *'. */ @@ -203,39 +245,11 @@ log_receiver(void *baton, switch (log_item->action) { case 'A': - if (log_item->copyfrom_path - && SVN_IS_VALID_REVNUM(log_item->copyfrom_rev)) - SVN_ERR(dav_svn__brigade_printf - (lrb->bb, lrb->output, - "<S:added-path copyfrom-path=\"%s\"" - " copyfrom-rev=\"%ld\"", - apr_xml_quote_string(iterpool, - log_item->copyfrom_path, - 1), /* escape quotes */ - log_item->copyfrom_rev)); - else - SVN_ERR(dav_svn__brigade_puts(lrb->bb, lrb->output, - "<S:added-path")); - - close_element = "S:added-path"; - break; - case 'R': - if (log_item->copyfrom_path - && SVN_IS_VALID_REVNUM(log_item->copyfrom_rev)) - SVN_ERR(dav_svn__brigade_printf - (lrb->bb, lrb->output, - "<S:replaced-path copyfrom-path=\"%s\"" - " copyfrom-rev=\"%ld\"", - apr_xml_quote_string(iterpool, - log_item->copyfrom_path, - 1), /* escape quotes */ - log_item->copyfrom_rev)); - else - SVN_ERR(dav_svn__brigade_puts(lrb->bb, lrb->output, - "<S:replaced-path")); - - close_element = "S:replaced-path"; + case 'V': + case 'E': + SVN_ERR(start_path_with_copy_from(&close_element, lrb, + log_item, iterpool)); break; case 'D': @@ -301,6 +315,9 @@ dav_svn__log_report(const dav_resource * svn_boolean_t discover_changed_paths = FALSE; /* off by default */ svn_boolean_t strict_node_history = FALSE; /* off by default */ svn_boolean_t include_merged_revisions = FALSE; /* off by default */ + svn_move_behavior_t move_behavior = svn_move_behavior_no_moves; + /* no moves by default */ + apr_array_header_t *revprops = apr_array_make(resource->pool, 3, sizeof(const char *)); apr_array_header_t *paths @@ -395,6 +412,24 @@ dav_svn__log_report(const dav_resource * resource->pool); APR_ARRAY_PUSH(paths, const char *) = target; } + else if (strcmp(child->name, "move-behavior") == 0) + { + int move_behavior_param; + serr = svn_cstring_atoi(&move_behavior_param, + dav_xml_get_cdata(child, resource->pool, 1)); + if (serr) + return dav_svn__convert_err(serr, HTTP_BAD_REQUEST, + "Malformed CDATA in element " + "\"move-behavior\"", resource->pool); + + if ( move_behavior_param < 0 + || move_behavior_param > svn_move_behavior_auto_moves) + return dav_svn__convert_err(serr, HTTP_BAD_REQUEST, + "Invalid CDATA in element " + "\"move-behavior\"", resource->pool); + + move_behavior = (svn_move_behavior_t) move_behavior_param; + } /* else unknown element; skip it */ } @@ -424,7 +459,7 @@ dav_svn__log_report(const dav_resource * flag in our log_receiver_baton structure). */ /* Send zero or more log items. */ - serr = svn_repos_get_logs4(repos->repos, + serr = svn_repos_get_logs5(repos->repos, paths, start, end, @@ -432,6 +467,7 @@ dav_svn__log_report(const dav_resource * discover_changed_paths, strict_node_history, include_merged_revisions, + move_behavior, revprops, dav_svn__authz_read_func(&arb), &arb, Modified: subversion/branches/verify-keep-going/subversion/mod_dav_svn/reports/replay.c URL: http://svn.apache.org/viewvc/subversion/branches/verify-keep-going/subversion/mod_dav_svn/reports/replay.c?rev=1546002&r1=1546001&r2=1546002&view=diff ============================================================================== --- subversion/branches/verify-keep-going/subversion/mod_dav_svn/reports/replay.c (original) +++ subversion/branches/verify-keep-going/subversion/mod_dav_svn/reports/replay.c Wed Nov 27 11:52:35 2013 @@ -406,7 +406,7 @@ malformed_element_error(const char *tagn "The request's '", tagname, "' element is malformed; there " "is a problem with the client.", - (char *)NULL), + SVN_VA_NULL), SVN_DAV_ERROR_NAMESPACE, SVN_DAV_ERROR_TAG); } Modified: subversion/branches/verify-keep-going/subversion/mod_dav_svn/reports/update.c URL: http://svn.apache.org/viewvc/subversion/branches/verify-keep-going/subversion/mod_dav_svn/reports/update.c?rev=1546002&r1=1546001&r2=1546002&view=diff ============================================================================== --- subversion/branches/verify-keep-going/subversion/mod_dav_svn/reports/update.c (original) +++ subversion/branches/verify-keep-going/subversion/mod_dav_svn/reports/update.c Wed Nov 27 11:52:35 2013 @@ -913,7 +913,7 @@ malformed_element_error(const char *tagn const char *errstr = apr_pstrcat(pool, "The request's '", tagname, "' element is malformed; there " "is a problem with the client.", - (char *)NULL); + SVN_VA_NULL); return dav_svn__new_error_tag(pool, HTTP_BAD_REQUEST, 0, errstr, SVN_DAV_ERROR_NAMESPACE, SVN_DAV_ERROR_TAG); } @@ -934,7 +934,7 @@ validate_input_revision(svn_revnum_t rev const dav_resource *resource) { if (! SVN_IS_VALID_REVNUM(revision)) - return SVN_NO_ERROR; + return NULL; if (revision > youngest) { @@ -958,7 +958,7 @@ validate_input_revision(svn_revnum_t rev "Invalid revision found in update report " "request.", resource->pool); } - return SVN_NO_ERROR; + return NULL; } Modified: subversion/branches/verify-keep-going/subversion/mod_dav_svn/repos.c URL: http://svn.apache.org/viewvc/subversion/branches/verify-keep-going/subversion/mod_dav_svn/repos.c?rev=1546002&r1=1546001&r2=1546002&view=diff ============================================================================== --- subversion/branches/verify-keep-going/subversion/mod_dav_svn/repos.c (original) +++ subversion/branches/verify-keep-going/subversion/mod_dav_svn/repos.c Wed Nov 27 11:52:35 2013 @@ -53,6 +53,7 @@ #include "mod_dav_svn.h" #include "svn_ra.h" /* for SVN_RA_CAPABILITY_* */ #include "svn_dirent_uri.h" + #include "private/svn_log.h" #include "private/svn_fspath.h" #include "private/svn_repos_private.h" @@ -1153,7 +1154,7 @@ create_private_resource(const dav_resour if (base->info->repos->root_path[1]) comb->res.uri = apr_pstrcat(base->pool, base->info->repos->root_path, - path->data, (char *)NULL); + path->data, SVN_VA_NULL); else comb->res.uri = path->data; comb->res.info = &comb->priv; @@ -1347,7 +1348,7 @@ dav_svn_split_uri(request_rec *r, if (ch == '\0') { /* relative is just "!svn", which is malformed. */ - return dav_svn__new_error(r->pool, HTTP_INTERNAL_SERVER_ERROR, + return dav_svn__new_error(r->pool, HTTP_NOT_FOUND, SVN_ERR_APMOD_MALFORMED_URI, "Nothing follows the svn special_uri."); } @@ -1374,7 +1375,7 @@ dav_svn_split_uri(request_rec *r, *repos_path = NULL; else return dav_svn__new_error( - r->pool, HTTP_INTERNAL_SERVER_ERROR, + r->pool, HTTP_NOT_FOUND, SVN_ERR_APMOD_MALFORMED_URI, "Missing info after special_uri."); } @@ -1398,7 +1399,7 @@ dav_svn_split_uri(request_rec *r, /* Did we break from the loop prematurely? */ if (j != (defn->numcomponents - 1)) return dav_svn__new_error( - r->pool, HTTP_INTERNAL_SERVER_ERROR, + r->pool, HTTP_NOT_FOUND, SVN_ERR_APMOD_MALFORMED_URI, "Not enough components after " "special_uri."); @@ -1412,13 +1413,13 @@ dav_svn_split_uri(request_rec *r, else { /* Found a slash after the special components. */ - *repos_path = apr_pstrdup(r->pool, start); + *repos_path = apr_pstrdup(r->pool, start - 1); } } else { return - dav_svn__new_error(r->pool, HTTP_INTERNAL_SERVER_ERROR, + dav_svn__new_error(r->pool, HTTP_NOT_FOUND, SVN_ERR_APMOD_MALFORMED_URI, "Unknown data after special_uri."); } @@ -1429,7 +1430,7 @@ dav_svn_split_uri(request_rec *r, if (defn->name == NULL) return - dav_svn__new_error(r->pool, HTTP_INTERNAL_SERVER_ERROR, + dav_svn__new_error(r->pool, HTTP_NOT_FOUND, SVN_ERR_APMOD_MALFORMED_URI, "Couldn't match subdir after special_uri."); } @@ -1438,7 +1439,7 @@ dav_svn_split_uri(request_rec *r, { /* There's no "!svn/" at all, so the relative path is already a valid path within the repository. */ - *repos_path = apr_pstrdup(r->pool, relative); + *repos_path = apr_pstrdup(r->pool, relative - 1); } } @@ -1515,7 +1516,7 @@ get_parentpath_resource(request_rec *r, if (r->uri[len-1] != '/') { new_uri = apr_pstrcat(r->pool, ap_escape_uri(r->pool, r->uri), - "/", (char *)NULL); + "/", SVN_VA_NULL); apr_table_setn(r->headers_out, "Location", ap_construct_url(r->pool, new_uri, r)); return dav_svn__new_error(r->pool, HTTP_MOVED_PERMANENTLY, 0, @@ -1969,26 +1970,12 @@ get_resource(request_rec *r, /* Special case: detect and build the SVNParentPath as a unique type of private resource, iff the SVNListParentPath directive is 'on'. */ - if (fs_parent_path && dav_svn__get_list_parentpath_flag(r)) + if (dav_svn__is_parentpath_list(r)) { - char *uri = apr_pstrdup(r->pool, r->uri); - char *parentpath = apr_pstrdup(r->pool, root_path); - apr_size_t uri_len = strlen(uri); - apr_size_t parentpath_len = strlen(parentpath); - - if (uri[uri_len-1] == '/') - uri[uri_len-1] = '\0'; - - if (parentpath[parentpath_len-1] == '/') - parentpath[parentpath_len-1] = '\0'; - - if (strcmp(parentpath, uri) == 0) - { - err = get_parentpath_resource(r, resource); - if (err) - return err; - return NULL; - } + err = get_parentpath_resource(r, resource); + if (err) + return err; + return NULL; } /* This does all the work of interpreting/splitting the request uri. */ @@ -2158,7 +2145,7 @@ get_resource(request_rec *r, } /* Retrieve/cache open repository */ - repos_key = apr_pstrcat(r->pool, "mod_dav_svn:", fs_path, (char *)NULL); + repos_key = apr_pstrcat(r->pool, "mod_dav_svn:", fs_path, SVN_VA_NULL); apr_pool_userdata_get(&userdata, repos_key, r->connection->pool); repos->repos = userdata; if (repos->repos == NULL) @@ -2172,7 +2159,7 @@ get_resource(request_rec *r, svn_hash_sets(fs_config, SVN_FS_CONFIG_FSFS_CACHE_FULLTEXTS, dav_svn__get_fulltext_cache_flag(r) ? "1" :"0"); svn_hash_sets(fs_config, SVN_FS_CONFIG_FSFS_CACHE_REVPROPS, - dav_svn__get_revprop_cache_flag(r) ? "1" :"0"); + dav_svn__get_revprop_cache_flag(r) ? "2" :"0"); /* Disallow BDB/event until issue 4157 is fixed. */ if (!strcmp(ap_show_mpm(), "event")) @@ -2204,9 +2191,16 @@ get_resource(request_rec *r, leak that path back to the client, because that would be a security risk, but we do want to log the real error on the server side. */ - return dav_svn__sanitize_error(serr, "Could not open the requested " - "SVN filesystem", - HTTP_INTERNAL_SERVER_ERROR, r); + + apr_status_t cause = svn_error_root_cause(serr)->apr_err; + if (APR_STATUS_IS_ENOENT(cause) || APR_STATUS_IS_ENOTDIR(cause)) + return dav_svn__sanitize_error( + serr, "Could not find the requested SVN filesystem", + HTTP_NOT_FOUND, r); + else + return dav_svn__sanitize_error( + serr, "Could not open the requested SVN filesystem", + HTTP_INTERNAL_SERVER_ERROR, r); } /* Cache the open repos for the next request on this connection */ @@ -2364,7 +2358,7 @@ get_resource(request_rec *r, "/", r->args ? "?" : "", r->args ? r->args : "", - (char *)NULL); + SVN_VA_NULL); apr_table_setn(r->headers_out, "Location", ap_construct_url(r->pool, new_path, r)); return dav_svn__new_error(r->pool, HTTP_MOVED_PERMANENTLY, 0, @@ -2408,21 +2402,12 @@ get_parent_path(const char *path, svn_boolean_t is_urlpath, apr_pool_t *pool) { - apr_size_t len; - char *tmp = apr_pstrdup(pool, path); - - len = strlen(tmp); - - if (len > 0) + if (*path != '\0') /* not an empty string */ { - /* Remove any trailing slash; else svn_path_dirname() asserts. */ - if (tmp[len-1] == '/') - tmp[len-1] = '\0'; - if (is_urlpath) - return svn_urlpath__dirname(tmp, pool); + return svn_urlpath__dirname(path, pool); else - return svn_fspath__dirname(tmp, pool); + return svn_fspath__dirname(path, pool); } return path; @@ -2458,13 +2443,18 @@ get_parent_resource(const dav_resource * parent->versioned = 1; parent->hooks = resource->hooks; parent->pool = resource->pool; - parent->uri = get_parent_path(resource->uri, TRUE, resource->pool); + parent->uri = get_parent_path(svn_urlpath__canonicalize(resource->uri, + resource->pool), + TRUE, resource->pool); parent->info = parentinfo; parentinfo->uri_path = - svn_stringbuf_create(get_parent_path(resource->info->uri_path->data, - TRUE, resource->pool), - resource->pool); + svn_stringbuf_create( + get_parent_path( + svn_urlpath__canonicalize(resource->info->uri_path->data, + resource->pool), + TRUE, resource->pool), + resource->pool); parentinfo->repos = resource->info->repos; parentinfo->root = resource->info->root; parentinfo->r = resource->info->r; @@ -3372,7 +3362,7 @@ deliver(const dav_resource *resource, ap /* ### The xml output doesn't like to see a trailing slash on ### the visible portion, so avoid that. */ if (is_dir) - href = apr_pstrcat(entry_pool, href, "/", (char *)NULL); + href = apr_pstrcat(entry_pool, href, "/", SVN_VA_NULL); if (gen_html) name = href; @@ -3624,11 +3614,11 @@ deliver(const dav_resource *resource, ap resource->info->repos->base_url, ap_escape_uri(resource->pool, resource->info->r->uri), - NULL); + SVN_VA_NULL); str_root = apr_pstrcat(resource->pool, resource->info->repos->base_url, resource->info->repos->root_path, - NULL); + SVN_VA_NULL); serr = svn_subst_build_keywords3(&kw, keywords->data, str_cmt_rev, str_uri, str_root, @@ -3805,23 +3795,29 @@ copy_resource(const dav_resource *src, return err; } - serr = svn_dirent_get_absolute(&src_repos_path, - svn_repos_path(src->info->repos->repos, - src->pool), - src->pool); - if (!serr) - serr = svn_dirent_get_absolute(&dst_repos_path, - svn_repos_path(dst->info->repos->repos, - dst->pool), - dst->pool); + src_repos_path = svn_repos_path(src->info->repos->repos, src->pool); + dst_repos_path = svn_repos_path(dst->info->repos->repos, dst->pool); + + if (strcmp(src_repos_path, dst_repos_path) != 0) + { + /* Perhaps the source and dst repos use different path formats? */ + serr = svn_error_compose_create( + svn_dirent_get_absolute(&src_repos_path, src_repos_path, + src->pool), + svn_dirent_get_absolute(&dst_repos_path, dst_repos_path, + dst->pool)); + + if (!serr && (strcmp(src_repos_path, dst_repos_path) != 0)) + return dav_svn__new_error_tag( + dst->pool, HTTP_INTERNAL_SERVER_ERROR, 0, + "Copy source and destination are in different repositories.", + SVN_DAV_ERROR_NAMESPACE, SVN_DAV_ERROR_TAG); + } + else + serr = SVN_NO_ERROR; if (!serr) { - if (strcmp(src_repos_path, dst_repos_path) != 0) - return dav_svn__new_error_tag - (dst->pool, HTTP_INTERNAL_SERVER_ERROR, 0, - "Copy source and destination are in different repositories.", - SVN_DAV_ERROR_NAMESPACE, SVN_DAV_ERROR_TAG); serr = svn_fs_copy(src->info->root.root, /* root object of src rev*/ src->info->repos_path, /* relative path of src */ dst->info->root.root, /* root object of dst txn*/ @@ -4166,7 +4162,7 @@ do_walk(walker_ctx_t *ctx, int depth) apr_pstrmemdup(iterpool, ctx->repos_path->data, ctx->repos_path->len), - key, (char *)NULL); + key, SVN_VA_NULL); if (! dav_svn__allow_read(ctx->info.r, ctx->info.repos, repos_relpath, ctx->info.root.rev, iterpool)) @@ -4327,7 +4323,7 @@ dav_svn__create_working_resource(dav_res if (base->info->repos->root_path[1]) res->uri = apr_pstrcat(base->pool, base->info->repos->root_path, - path, (char *)NULL); + path, SVN_VA_NULL); else res->uri = path; res->hooks = &dav_svn__hooks_repository; Modified: subversion/branches/verify-keep-going/subversion/mod_dav_svn/util.c URL: http://svn.apache.org/viewvc/subversion/branches/verify-keep-going/subversion/mod_dav_svn/util.c?rev=1546002&r1=1546001&r2=1546002&view=diff ============================================================================== --- subversion/branches/verify-keep-going/subversion/mod_dav_svn/util.c (original) +++ subversion/branches/verify-keep-going/subversion/mod_dav_svn/util.c Wed Nov 27 11:52:35 2013 @@ -425,6 +425,32 @@ dav_svn__simple_parse_uri(dav_svn__uri_i "Unsupported URI form"); } +svn_boolean_t +dav_svn__is_parentpath_list(request_rec *r) +{ + const char *fs_parent_path = dav_svn__get_fs_parent_path(r); + + if (fs_parent_path && dav_svn__get_list_parentpath_flag(r)) + { + const char *root_path = dav_svn__get_root_dir(r); + char *uri = apr_pstrdup(r->pool, r->uri); + char *parentpath = apr_pstrdup(r->pool, root_path); + apr_size_t uri_len = strlen(uri); + apr_size_t parentpath_len = strlen(parentpath); + + if (uri[uri_len-1] == '/') + uri[uri_len-1] = '\0'; + + if (parentpath[parentpath_len-1] == '/') + parentpath[parentpath_len-1] = '\0'; + + if (strcmp(parentpath, uri) == 0) + { + return TRUE; + } + } + return FALSE; +} /* ### move this into apr_xml */ int Modified: subversion/branches/verify-keep-going/subversion/mod_dav_svn/version.c URL: http://svn.apache.org/viewvc/subversion/branches/verify-keep-going/subversion/mod_dav_svn/version.c?rev=1546002&r1=1546001&r2=1546002&view=diff ============================================================================== --- subversion/branches/verify-keep-going/subversion/mod_dav_svn/version.c (original) +++ subversion/branches/verify-keep-going/subversion/mod_dav_svn/version.c Wed Nov 27 11:52:35 2013 @@ -39,6 +39,7 @@ #include "svn_dav.h" #include "svn_base64.h" #include "svn_version.h" + #include "private/svn_repos_private.h" #include "private/svn_subr_private.h" #include "private/svn_dav_protocol.h" @@ -297,25 +298,25 @@ get_option(const dav_resource *resource, apr_table_set(r->headers_out, SVN_DAV_ROOT_URI_HEADER, repos_root_uri); apr_table_set(r->headers_out, SVN_DAV_ME_RESOURCE_HEADER, apr_pstrcat(resource->pool, repos_root_uri, "/", - dav_svn__get_me_resource_uri(r), (char *)NULL)); + dav_svn__get_me_resource_uri(r), SVN_VA_NULL)); apr_table_set(r->headers_out, SVN_DAV_REV_ROOT_STUB_HEADER, apr_pstrcat(resource->pool, repos_root_uri, "/", - dav_svn__get_rev_root_stub(r), (char *)NULL)); + dav_svn__get_rev_root_stub(r), SVN_VA_NULL)); apr_table_set(r->headers_out, SVN_DAV_REV_STUB_HEADER, apr_pstrcat(resource->pool, repos_root_uri, "/", - dav_svn__get_rev_stub(r), (char *)NULL)); + dav_svn__get_rev_stub(r), SVN_VA_NULL)); apr_table_set(r->headers_out, SVN_DAV_TXN_ROOT_STUB_HEADER, apr_pstrcat(resource->pool, repos_root_uri, "/", - dav_svn__get_txn_root_stub(r), (char *)NULL)); + dav_svn__get_txn_root_stub(r), SVN_VA_NULL)); apr_table_set(r->headers_out, SVN_DAV_TXN_STUB_HEADER, apr_pstrcat(resource->pool, repos_root_uri, "/", - dav_svn__get_txn_stub(r), (char *)NULL)); + dav_svn__get_txn_stub(r), SVN_VA_NULL)); apr_table_set(r->headers_out, SVN_DAV_VTXN_ROOT_STUB_HEADER, apr_pstrcat(resource->pool, repos_root_uri, "/", - dav_svn__get_vtxn_root_stub(r), (char *)NULL)); + dav_svn__get_vtxn_root_stub(r), SVN_VA_NULL)); apr_table_set(r->headers_out, SVN_DAV_VTXN_STUB_HEADER, apr_pstrcat(resource->pool, repos_root_uri, "/", - dav_svn__get_vtxn_stub(r), (char *)NULL)); + dav_svn__get_vtxn_stub(r), SVN_VA_NULL)); apr_table_set(r->headers_out, SVN_DAV_ALLOW_BULK_UPDATES, bulk_upd_conf == CONF_BULKUPD_ON ? "On" : bulk_upd_conf == CONF_BULKUPD_OFF ? "Off" : "Prefer");
