Modified: subversion/branches/fsx-1.10/subversion/mod_dav_svn/repos.c URL: http://svn.apache.org/viewvc/subversion/branches/fsx-1.10/subversion/mod_dav_svn/repos.c?rev=1687422&r1=1687421&r2=1687422&view=diff ============================================================================== --- subversion/branches/fsx-1.10/subversion/mod_dav_svn/repos.c (original) +++ subversion/branches/fsx-1.10/subversion/mod_dav_svn/repos.c Thu Jun 25 08:00:57 2015 @@ -929,14 +929,14 @@ prep_working(dav_resource_combined *comb if (txn_name == NULL) { if (!comb->priv.root.activity_id) - return dav_svn__new_error(comb->res.pool, HTTP_BAD_REQUEST, 0, + return dav_svn__new_error(comb->res.pool, HTTP_BAD_REQUEST, 0, 0, "The request did not specify an activity ID"); txn_name = dav_svn__get_txn(comb->priv.repos, comb->priv.root.activity_id); if (txn_name == NULL) { - return dav_svn__new_error(pool, HTTP_BAD_REQUEST, 0, + return dav_svn__new_error(pool, HTTP_BAD_REQUEST, 0, 0, "An unknown activity was specified in the " "URL. This is generally caused by a " "problem in the client software."); @@ -952,7 +952,7 @@ prep_working(dav_resource_combined *comb if (serr->apr_err == SVN_ERR_FS_NO_SUCH_TRANSACTION) { svn_error_clear(serr); - return dav_svn__new_error(pool, HTTP_INTERNAL_SERVER_ERROR, 0, + return dav_svn__new_error(pool, HTTP_INTERNAL_SERVER_ERROR, 0, 0, "An activity was specified and found, but " "the corresponding SVN FS transaction was " "not found."); @@ -1012,7 +1012,7 @@ prep_working(dav_resource_combined *comb } else if (!svn_string_compare(current_author, &request_author)) { - return dav_svn__new_error(pool, HTTP_NOT_IMPLEMENTED, 0, + return dav_svn__new_error(pool, HTTP_NOT_IMPLEMENTED, 0, 0, "Multi-author commits not supported."); } } @@ -1067,7 +1067,7 @@ prep_activity(dav_resource_combined *com const char *txn_name; if (!comb->priv.root.activity_id) - return dav_svn__new_error(comb->res.pool, HTTP_BAD_REQUEST, 0, + return dav_svn__new_error(comb->res.pool, HTTP_BAD_REQUEST, 0, 0, "The request did not specify an activity ID"); txn_name = dav_svn__get_txn(comb->priv.repos, comb->priv.root.activity_id); @@ -1094,7 +1094,7 @@ prep_private(dav_resource_combined *comb /* Open the named transaction. */ if (comb->priv.root.txn_name == NULL) - return dav_svn__new_error(pool, HTTP_BAD_REQUEST, 0, + return dav_svn__new_error(pool, HTTP_BAD_REQUEST, 0, 0, "An unknown txn name was specified in the " "URL."); @@ -1107,7 +1107,7 @@ prep_private(dav_resource_combined *comb { svn_error_clear(serr); comb->res.exists = FALSE; - return dav_svn__new_error(pool, HTTP_NOT_FOUND, 0, + return dav_svn__new_error(pool, HTTP_NOT_FOUND, 0, 0, "Named transaction doesn't exist."); } return dav_svn__convert_err(serr, HTTP_INTERNAL_SERVER_ERROR, @@ -1158,7 +1158,7 @@ prep_resource(dav_resource_combined *com return (*scan->prep)(comb); } - return dav_svn__new_error(comb->res.pool, HTTP_INTERNAL_SERVER_ERROR, 0, + return dav_svn__new_error(comb->res.pool, HTTP_INTERNAL_SERVER_ERROR, 0, 0, "DESIGN FAILURE: unknown resource type"); } @@ -1256,7 +1256,7 @@ dav_svn_split_uri2(request_rec *r, { /* ### are SVN_ERR_APMOD codes within the right numeric space? */ return dav_svn__new_error(pool, HTTP_INTERNAL_SERVER_ERROR, - SVN_ERR_APMOD_MISSING_PATH_TO_FS, + SVN_ERR_APMOD_MISSING_PATH_TO_FS, 0, "The server is misconfigured: " "either an SVNPath or SVNParentPath " "directive is required to specify the location " @@ -1339,7 +1339,7 @@ dav_svn_split_uri2(request_rec *r, { /* ### are SVN_ERR_APMOD codes within the right numeric space? */ return dav_svn__new_error(pool, HTTP_FORBIDDEN, - SVN_ERR_APMOD_MALFORMED_URI, + SVN_ERR_APMOD_MALFORMED_URI, 0, "The URI does not contain the name " "of a repository."); } @@ -1387,7 +1387,7 @@ dav_svn_split_uri2(request_rec *r, { /* relative is just "!svn", which is malformed. */ return dav_svn__new_error(pool, HTTP_NOT_FOUND, - SVN_ERR_APMOD_MALFORMED_URI, + SVN_ERR_APMOD_MALFORMED_URI, 0, "Nothing follows the svn special_uri."); } else @@ -1414,7 +1414,7 @@ dav_svn_split_uri2(request_rec *r, else return dav_svn__new_error( pool, HTTP_NOT_FOUND, - SVN_ERR_APMOD_MALFORMED_URI, + SVN_ERR_APMOD_MALFORMED_URI, 0, "Missing info after special_uri."); } else if (relative[len3] == '/') @@ -1438,7 +1438,7 @@ dav_svn_split_uri2(request_rec *r, if (j != (defn->numcomponents - 1)) return dav_svn__new_error( pool, HTTP_NOT_FOUND, - SVN_ERR_APMOD_MALFORMED_URI, + SVN_ERR_APMOD_MALFORMED_URI, 0, "Not enough components after " "special_uri."); @@ -1458,7 +1458,7 @@ dav_svn_split_uri2(request_rec *r, { return dav_svn__new_error(pool, HTTP_NOT_FOUND, - SVN_ERR_APMOD_MALFORMED_URI, + SVN_ERR_APMOD_MALFORMED_URI, 0, "Unknown data after special_uri."); } @@ -1469,7 +1469,7 @@ dav_svn_split_uri2(request_rec *r, if (defn->name == NULL) return dav_svn__new_error(pool, HTTP_NOT_FOUND, - SVN_ERR_APMOD_MALFORMED_URI, + SVN_ERR_APMOD_MALFORMED_URI, 0, "Couldn't match subdir after special_uri."); } } @@ -1571,7 +1571,7 @@ get_parentpath_resource(request_rec *r, "/", 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, + return dav_svn__new_error(r->pool, HTTP_MOVED_PERMANENTLY, 0, 0, "Requests for a collection must have a " "trailing slash on the URI."); } @@ -1994,7 +1994,7 @@ parse_querystring(request_rec *r, const prevstr++; peg_rev = SVN_STR_TO_REV(prevstr); if (!SVN_IS_VALID_REVNUM(peg_rev)) - return dav_svn__new_error(pool, HTTP_BAD_REQUEST, 0, + return dav_svn__new_error(pool, HTTP_BAD_REQUEST, 0, 0, "invalid peg rev in query string"); } else @@ -2013,7 +2013,7 @@ parse_querystring(request_rec *r, const wrevstr++; working_rev = SVN_STR_TO_REV(wrevstr); if (!SVN_IS_VALID_REVNUM(working_rev)) - return dav_svn__new_error(pool, HTTP_BAD_REQUEST, 0, + return dav_svn__new_error(pool, HTTP_BAD_REQUEST, 0, 0, "invalid working rev in query string"); } else @@ -2027,7 +2027,7 @@ parse_querystring(request_rec *r, const Our node-tracing algorithms can't handle that scenario, so we'll disallow it here. */ if (working_rev > peg_rev) - return dav_svn__new_error(pool, HTTP_BAD_REQUEST, 0, + return dav_svn__new_error(pool, HTTP_BAD_REQUEST, 0, 0, "working rev greater than peg rev."); /* If WORKING_REV and PEG_REV are equivalent, we want to return the @@ -2069,7 +2069,7 @@ parse_querystring(request_rec *r, const newpath = apr_hash_get(locations, &working_rev, sizeof(svn_revnum_t)); if (! newpath) - return dav_svn__new_error(pool, HTTP_NOT_FOUND, 0, + return dav_svn__new_error(pool, HTTP_NOT_FOUND, 0, 0, "path doesn't exist in that revision."); /* Redirect folks to a canonical, peg-revision-only location. @@ -2089,7 +2089,7 @@ parse_querystring(request_rec *r, const return dav_svn__new_error(r->pool, prevstr ? HTTP_MOVED_PERMANENTLY : HTTP_MOVED_TEMPORARILY, - 0, "redirecting to canonical location"); + 0, 0, "redirecting to canonical location"); } return NULL; @@ -2149,7 +2149,7 @@ get_resource(request_rec *r, /* Marshall the error back to the client by generating by * way of the dav_svn__error_response_tag trick. */ err = dav_svn__new_error(r->pool, HTTP_METHOD_NOT_ALLOWED, - SVN_ERR_APMOD_MALFORMED_URI, + SVN_ERR_APMOD_MALFORMED_URI, 0, "The URI does not contain the name " "of a repository."); /* can't use r->allowed since the default handler isn't called */ @@ -2550,7 +2550,7 @@ get_resource(request_rec *r, 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, + return dav_svn__new_error(r->pool, HTTP_MOVED_PERMANENTLY, 0, 0, "Requests for a collection must have a " "trailing slash on the URI."); } @@ -2575,7 +2575,7 @@ get_resource(request_rec *r, /* ### pick something other than HTTP_INTERNAL_SERVER_ERROR */ /* ### are SVN_ERR_APMOD codes within the right numeric space? */ return dav_svn__new_error(r->pool, HTTP_INTERNAL_SERVER_ERROR, - SVN_ERR_APMOD_MALFORMED_URI, + SVN_ERR_APMOD_MALFORMED_URI, 0, "The URI indicated a resource within Subversion's " "special resource area, but does not exist. This " "is generally caused by a problem in the client " @@ -2684,7 +2684,7 @@ get_parent_resource(const dav_resource * /* If we didn't create parent resource above, complain. */ if (! *parent_resource) - return dav_svn__new_error(resource->pool, HTTP_INTERNAL_SERVER_ERROR, 0, + return dav_svn__new_error(resource->pool, HTTP_INTERNAL_SERVER_ERROR, 0, 0, apr_psprintf(resource->pool, "get_parent_resource was called for " "%s (type %d)", @@ -2792,7 +2792,8 @@ open_stream(const dav_resource *resource { if (resource->type != DAV_RESOURCE_TYPE_WORKING) { - return dav_svn__new_error(resource->pool, HTTP_METHOD_NOT_ALLOWED, 0, + return dav_svn__new_error(resource->pool, HTTP_METHOD_NOT_ALLOWED, + 0, 0, "Resource body changes may only be made to " "working resources (at this time)."); } @@ -2801,7 +2802,7 @@ open_stream(const dav_resource *resource /* ### TODO: Can we support range writes someday? */ if (mode == DAV_MODE_WRITE_SEEKABLE) { - return dav_svn__new_error(resource->pool, HTTP_NOT_IMPLEMENTED, 0, + return dav_svn__new_error(resource->pool, HTTP_NOT_IMPLEMENTED, 0, 0, "Resource body writes cannot use ranges " "(at this time)."); } @@ -2995,7 +2996,7 @@ seek_stream(dav_stream *stream, apr_off_ { /* ### fill this in */ - return dav_svn__new_error(stream->res->pool, HTTP_NOT_IMPLEMENTED, 0, + return dav_svn__new_error(stream->res->pool, HTTP_NOT_IMPLEMENTED, 0, 0, "Resource body read/write cannot use ranges " "(at this time)"); } @@ -3301,7 +3302,7 @@ deliver(const dav_resource *resource, ap && resource->type != DAV_RESOURCE_TYPE_WORKING && resource->info->restype != DAV_SVN_RESTYPE_PARENTPATH_COLLECTION)) { - return dav_svn__new_error(resource->pool, HTTP_CONFLICT, 0, + return dav_svn__new_error(resource->pool, HTTP_CONFLICT, 0, 0, "Cannot GET this type of resource."); } @@ -3642,7 +3643,8 @@ deliver(const dav_resource *resource, ap bkt = apr_bucket_eos_create(output->c->bucket_alloc); APR_BRIGADE_INSERT_TAIL(bb, bkt); if ((status = ap_pass_brigade(output, bb)) != APR_SUCCESS) - return dav_svn__new_error(resource->pool, HTTP_INTERNAL_SERVER_ERROR, 0, + return dav_svn__new_error(resource->pool, HTTP_INTERNAL_SERVER_ERROR, + 0, status, "Could not write EOS to filter."); return NULL; @@ -3689,7 +3691,7 @@ deliver(const dav_resource *resource, ap "is really a file", resource->pool); if (!is_file) - return dav_svn__new_error(resource->pool, HTTP_BAD_REQUEST, 0, + return dav_svn__new_error(resource->pool, HTTP_BAD_REQUEST, 0, 0, apr_psprintf(resource->pool, "the delta base of '%s' does not refer " "to a file in revision %ld", @@ -3850,9 +3852,9 @@ deliver(const dav_resource *resource, ap output->c->bucket_alloc); APR_BRIGADE_INSERT_TAIL(bb, bkt); if ((status = ap_pass_brigade(output, bb)) != APR_SUCCESS) { - /* ### what to do with status; and that HTTP code... */ + /* ### that HTTP code... */ return dav_svn__new_error(resource->pool, - HTTP_INTERNAL_SERVER_ERROR, 0, + HTTP_INTERNAL_SERVER_ERROR, 0, status, "Could not write data to filter."); } } @@ -3862,9 +3864,9 @@ deliver(const dav_resource *resource, ap bkt = apr_bucket_eos_create(output->c->bucket_alloc); APR_BRIGADE_INSERT_TAIL(bb, bkt); if ((status = ap_pass_brigade(output, bb)) != APR_SUCCESS) { - /* ### what to do with status; and that HTTP code... */ + /* ### that HTTP code... */ return dav_svn__new_error(resource->pool, - HTTP_INTERNAL_SERVER_ERROR, 0, + HTTP_INTERNAL_SERVER_ERROR, 0, status, "Could not write EOS to filter."); } @@ -3882,7 +3884,7 @@ create_collection(dav_resource *resource if (resource->type != DAV_RESOURCE_TYPE_WORKING && resource->type != DAV_RESOURCE_TYPE_REGULAR) { - return dav_svn__new_error(resource->pool, HTTP_METHOD_NOT_ALLOWED, 0, + return dav_svn__new_error(resource->pool, HTTP_METHOD_NOT_ALLOWED, 0, 0, "Collections can only be created within a " "working or regular collection (at this " "time)."); @@ -3891,7 +3893,7 @@ create_collection(dav_resource *resource /* ...regular resources allowed only if autoversioning is turned on. */ if (resource->type == DAV_RESOURCE_TYPE_REGULAR && ! (resource->info->repos->autoversioning)) - return dav_svn__new_error(resource->pool, HTTP_METHOD_NOT_ALLOWED, 0, + return dav_svn__new_error(resource->pool, HTTP_METHOD_NOT_ALLOWED, 0, 0, "MKCOL called on regular resource, but " "autoversioning is not active."); @@ -3963,12 +3965,12 @@ copy_resource(const dav_resource *src, a new baseline afterwards. We need to safeguard here that nobody is calling COPY with the baseline as a Destination! */ if (dst->baselined && dst->type == DAV_RESOURCE_TYPE_VERSION) - return dav_svn__new_error(src->pool, HTTP_PRECONDITION_FAILED, 0, + return dav_svn__new_error(src->pool, HTTP_PRECONDITION_FAILED, 0, 0, "Illegal: COPY Destination is a baseline."); if (dst->type == DAV_RESOURCE_TYPE_REGULAR && !(dst->info->repos->autoversioning)) - return dav_svn__new_error(dst->pool, HTTP_METHOD_NOT_ALLOWED, 0, + return dav_svn__new_error(dst->pool, HTTP_METHOD_NOT_ALLOWED, 0, 0, "COPY called on regular resource, but " "autoversioning is not active."); @@ -3998,7 +4000,7 @@ copy_resource(const dav_resource *src, if (!serr && (strcmp(src_repos_path, dst_repos_path) != 0)) return dav_svn__new_error_svn( - dst->pool, HTTP_INTERNAL_SERVER_ERROR, 0, + dst->pool, HTTP_INTERNAL_SERVER_ERROR, 0, 0, "Copy source and destination are in different repositories"); } else @@ -4044,13 +4046,13 @@ remove_resource(dav_resource *resource, || resource->type == DAV_RESOURCE_TYPE_ACTIVITY || (resource->type == DAV_RESOURCE_TYPE_PRIVATE && resource->info->restype == DAV_SVN_RESTYPE_TXN_COLLECTION))) - return dav_svn__new_error(resource->pool, HTTP_METHOD_NOT_ALLOWED, 0, + return dav_svn__new_error(resource->pool, HTTP_METHOD_NOT_ALLOWED, 0, 0, "DELETE called on invalid resource type."); /* ...and regular resources only if autoversioning is turned on. */ if (resource->type == DAV_RESOURCE_TYPE_REGULAR && ! (resource->info->repos->autoversioning)) - return dav_svn__new_error(resource->pool, HTTP_METHOD_NOT_ALLOWED, 0, + return dav_svn__new_error(resource->pool, HTTP_METHOD_NOT_ALLOWED, 0, 0, "DELETE called on regular resource, but " "autoversioning is not active."); @@ -4208,7 +4210,7 @@ move_resource(dav_resource *src, if (src->type != DAV_RESOURCE_TYPE_REGULAR || dst->type != DAV_RESOURCE_TYPE_REGULAR || !(src->info->repos->autoversioning)) - return dav_svn__new_error(dst->pool, HTTP_METHOD_NOT_ALLOWED, 0, + return dav_svn__new_error(dst->pool, HTTP_METHOD_NOT_ALLOWED, 0, 0, "MOVE only allowed on two public URIs, and " "autoversioning must be active."); @@ -4307,7 +4309,7 @@ do_walk(walker_ctx_t *ctx, /* ### need to allow more walking in the future */ if (params->root->type != DAV_RESOURCE_TYPE_REGULAR) { - return dav_svn__new_error(params->pool, HTTP_METHOD_NOT_ALLOWED, 0, + return dav_svn__new_error(params->pool, HTTP_METHOD_NOT_ALLOWED, 0, 0, "Walking the resource hierarchy can only be " "done on 'regular' resources [at this time]."); } @@ -4630,7 +4632,7 @@ dav_svn__create_version_resource(dav_res result = parse_version_uri(comb, uri, NULL, 0); if (result != 0) - return dav_svn__new_error(pool, HTTP_INTERNAL_SERVER_ERROR, 0, + return dav_svn__new_error(pool, HTTP_INTERNAL_SERVER_ERROR, 0, 0, "Could not parse version resource uri."); err = prep_version(comb); @@ -4658,11 +4660,11 @@ handle_post_request(request_rec *r, status = dav_svn__parse_request_skel(&request_skel, r, pool); if (status != OK) - return dav_svn__new_error(pool, status, 0, + return dav_svn__new_error(pool, status, 0, 0, "Error parsing skel POST request body."); if (svn_skel__list_length(request_skel) < 1) - return dav_svn__new_error(pool, HTTP_BAD_REQUEST, 0, + return dav_svn__new_error(pool, HTTP_BAD_REQUEST, 0, 0, "Unable to identify skel POST request flavor."); post_skel = request_skel->children; @@ -4680,7 +4682,7 @@ handle_post_request(request_rec *r, request_skel, output); } - return dav_svn__new_error(pool, HTTP_BAD_REQUEST, 0, + return dav_svn__new_error(pool, HTTP_BAD_REQUEST, 0, 0, "Unsupported skel POST request flavor."); } @@ -4733,7 +4735,7 @@ int dav_svn__method_post(request_rec *r) } else { - derr = dav_svn__new_error(resource->pool, HTTP_BAD_REQUEST, 0, + derr = dav_svn__new_error(resource->pool, HTTP_BAD_REQUEST, 0, 0, "Unsupported POST request type."); }
Modified: subversion/branches/fsx-1.10/subversion/mod_dav_svn/util.c URL: http://svn.apache.org/viewvc/subversion/branches/fsx-1.10/subversion/mod_dav_svn/util.c?rev=1687422&r1=1687421&r2=1687422&view=diff ============================================================================== --- subversion/branches/fsx-1.10/subversion/mod_dav_svn/util.c (original) +++ subversion/branches/fsx-1.10/subversion/mod_dav_svn/util.c Thu Jun 25 08:00:57 2015 @@ -46,6 +46,7 @@ dav_error * dav_svn__new_error(apr_pool_t *pool, int status, int error_id, + apr_status_t aprerr, const char *desc) { if (error_id == 0) @@ -59,10 +60,10 @@ dav_svn__new_error(apr_pool_t *pool, * > 2.2 below perpetuates this. */ #if AP_MODULE_MAGIC_AT_LEAST(20091119,0) - return dav_new_error(pool, status, error_id, 0, desc); + return dav_new_error(pool, status, error_id, aprerr, desc); #else - errno = 0; /* For the same reason as in dav_svn__new_error_svn */ + errno = aprerr; /* For the same reason as in dav_svn__new_error_svn */ return dav_new_error(pool, status, error_id, desc); #endif @@ -72,20 +73,22 @@ dav_error * dav_svn__new_error_svn(apr_pool_t *pool, int status, int error_id, + apr_status_t aprerr, const char *desc) { if (error_id == 0) error_id = SVN_ERR_RA_DAV_REQUEST_FAILED; #if AP_MODULE_MAGIC_AT_LEAST(20091119,0) - return dav_new_error_tag(pool, status, error_id, 0, + return dav_new_error_tag(pool, status, error_id, aprerr, desc, SVN_DAV_ERROR_NAMESPACE, SVN_DAV_ERROR_TAG); #else - /* dav_new_error_tag will record errno but Subversion makes no attempt - to ensure that it is valid. We reset it to avoid putting incorrect - information into the error log, at the expense of possibly removing - valid information. */ - errno = 0; + /* dav_new_error_tag will record errno so we use it to pass aprerr. + This overrwites any existing errno value but since Subversion + makes no attempt to avoid system calls after a failed system call + there is no guarantee that any existing errno represents a + relevant error. */ + errno = aprerr; return dav_new_error_tag(pool, status, error_id, desc, SVN_DAV_ERROR_NAMESPACE, SVN_DAV_ERROR_TAG); @@ -101,7 +104,7 @@ build_error_chain(apr_pool_t *pool, svn_ char buffer[128]; const char *msg = svn_err_best_message(err, buffer, sizeof(buffer)); - dav_error *derr = dav_svn__new_error_svn(pool, status, err->apr_err, + dav_error *derr = dav_svn__new_error_svn(pool, status, err->apr_err, 0, apr_pstrdup(pool, msg)); if (err->child) @@ -540,7 +543,7 @@ dav_svn__test_canonical(const char *path /* Otherwise, generate a generic HTTP_BAD_REQUEST error. */ return dav_svn__new_error_svn( - pool, HTTP_BAD_REQUEST, 0, + pool, HTTP_BAD_REQUEST, 0, 0, apr_psprintf(pool, "Path '%s' is not canonicalized; " "there is a problem with the client.", path)); @@ -658,7 +661,7 @@ dav_svn__final_flush_or_error(request_re { apr_status_t apr_err = ap_fflush(output, bb); if (apr_err && (! derr)) - derr = dav_svn__new_error(pool, HTTP_INTERNAL_SERVER_ERROR, 0, + derr = dav_svn__new_error(pool, HTTP_INTERNAL_SERVER_ERROR, 0, apr_err, "Error flushing brigade."); } return derr; Modified: subversion/branches/fsx-1.10/subversion/mod_dav_svn/version.c URL: http://svn.apache.org/viewvc/subversion/branches/fsx-1.10/subversion/mod_dav_svn/version.c?rev=1687422&r1=1687421&r2=1687422&view=diff ============================================================================== --- subversion/branches/fsx-1.10/subversion/mod_dav_svn/version.c (original) +++ subversion/branches/fsx-1.10/subversion/mod_dav_svn/version.c Thu Jun 25 08:00:57 2015 @@ -88,7 +88,7 @@ set_auto_revprops(dav_resource *resource if (! (resource->type == DAV_RESOURCE_TYPE_WORKING && resource->info->auto_checked_out)) - return dav_svn__new_error(resource->pool, HTTP_INTERNAL_SERVER_ERROR, 0, + return dav_svn__new_error(resource->pool, HTTP_INTERNAL_SERVER_ERROR, 0, 0, "Set_auto_revprops called on invalid resource."); if ((serr = dav_svn__attach_auto_revprops(resource->info->root.txn, @@ -396,14 +396,14 @@ vsn_control(dav_resource *resource, cons /* All mod_dav_svn resources are versioned objects; so it doesn't make sense to call vsn_control on a resource that exists . */ if (resource->exists) - return dav_svn__new_error(resource->pool, HTTP_BAD_REQUEST, 0, + return dav_svn__new_error(resource->pool, HTTP_BAD_REQUEST, 0, 0, "vsn_control called on already-versioned " "resource."); /* Only allow a NULL target, which means an create an 'empty' VCR. */ if (target != NULL) return dav_svn__new_error_svn(resource->pool, HTTP_NOT_IMPLEMENTED, - SVN_ERR_UNSUPPORTED_FEATURE, + SVN_ERR_UNSUPPORTED_FEATURE, 0, "vsn_control called with non-null target"); /* This is kind of silly. The docstring for this callback says it's @@ -451,13 +451,13 @@ dav_svn__checkout(dav_resource *resource if (resource->type != DAV_RESOURCE_TYPE_REGULAR) return dav_svn__new_error_svn(resource->pool, HTTP_METHOD_NOT_ALLOWED, - SVN_ERR_UNSUPPORTED_FEATURE, + SVN_ERR_UNSUPPORTED_FEATURE, 0, "auto-checkout attempted on non-regular " "version-controlled resource"); if (resource->baselined) return dav_svn__new_error_svn(resource->pool, HTTP_METHOD_NOT_ALLOWED, - SVN_ERR_UNSUPPORTED_FEATURE, + SVN_ERR_UNSUPPORTED_FEATURE, 0, "auto-checkout attempted on baseline " "collection, which is not supported"); @@ -503,7 +503,7 @@ dav_svn__checkout(dav_resource *resource shared_activity); if (! shared_txn_name) return dav_svn__new_error(resource->pool, - HTTP_INTERNAL_SERVER_ERROR, 0, + HTTP_INTERNAL_SERVER_ERROR, 0, 0, "Cannot look up a txn_name by activity"); } @@ -542,21 +542,21 @@ dav_svn__checkout(dav_resource *resource if (resource->type != DAV_RESOURCE_TYPE_VERSION) { return dav_svn__new_error_svn(resource->pool, HTTP_METHOD_NOT_ALLOWED, - SVN_ERR_UNSUPPORTED_FEATURE, + SVN_ERR_UNSUPPORTED_FEATURE, 0, "CHECKOUT can only be performed on a " "version resource"); } if (create_activity) { return dav_svn__new_error_svn(resource->pool, HTTP_NOT_IMPLEMENTED, - SVN_ERR_UNSUPPORTED_FEATURE, + SVN_ERR_UNSUPPORTED_FEATURE, 0, "CHECKOUT cannot create an activity at " "this time. Use MKACTIVITY first"); } if (is_unreserved) { return dav_svn__new_error_svn(resource->pool, HTTP_NOT_IMPLEMENTED, - SVN_ERR_UNSUPPORTED_FEATURE, + SVN_ERR_UNSUPPORTED_FEATURE, 0, "Unreserved checkouts are not yet " "available. A version history may not be " "checked out more than once, into a " @@ -565,7 +565,7 @@ dav_svn__checkout(dav_resource *resource if (activities == NULL) { return dav_svn__new_error_svn(resource->pool, HTTP_CONFLICT, - SVN_ERR_INCOMPLETE_DATA, + SVN_ERR_INCOMPLETE_DATA, 0, "An activity must be provided for " "checkout"); } @@ -573,7 +573,7 @@ dav_svn__checkout(dav_resource *resource if (activities->nelts != 1) { return dav_svn__new_error_svn(resource->pool, HTTP_CONFLICT, - SVN_ERR_INCORRECT_PARAMS, + SVN_ERR_INCORRECT_PARAMS, 0, "Only one activity may be specified within " "the CHECKOUT"); } @@ -592,7 +592,7 @@ dav_svn__checkout(dav_resource *resource if (parse.activity_id == NULL) { return dav_svn__new_error_svn(resource->pool, HTTP_CONFLICT, - SVN_ERR_INCORRECT_PARAMS, + SVN_ERR_INCORRECT_PARAMS, 0, "The provided href is not an activity URI"); } @@ -600,7 +600,7 @@ dav_svn__checkout(dav_resource *resource parse.activity_id)) == NULL) { return dav_svn__new_error_svn(resource->pool, HTTP_CONFLICT, - SVN_ERR_APMOD_ACTIVITY_NOT_FOUND, + SVN_ERR_APMOD_ACTIVITY_NOT_FOUND, 0, "The specified activity does not exist"); } @@ -630,7 +630,7 @@ dav_svn__checkout(dav_resource *resource if (resource->info->root.rev != youngest) { return dav_svn__new_error_svn(resource->pool, HTTP_CONFLICT, - SVN_ERR_APMOD_BAD_BASELINE, + SVN_ERR_APMOD_BAD_BASELINE, 0, "The specified baseline is not the " "latest baseline, so it may not be " "checked out"); @@ -728,7 +728,7 @@ dav_svn__checkout(dav_resource *resource /* The item being modified is older than the one in the transaction. The client is out of date. */ return dav_svn__new_error_svn - (resource->pool, HTTP_CONFLICT, SVN_ERR_FS_CONFLICT, + (resource->pool, HTTP_CONFLICT, SVN_ERR_FS_CONFLICT, 0, "resource out of date; try updating"); } else if (resource->info->root.rev > txn_created_rev) @@ -745,7 +745,7 @@ dav_svn__checkout(dav_resource *resource resource->pool))) { err = dav_svn__new_error_svn - (resource->pool, HTTP_CONFLICT, serr->apr_err, + (resource->pool, HTTP_CONFLICT, serr->apr_err, 0, "Unable to fetch the node revision id of the version " "resource within the revision"); svn_error_clear(serr); @@ -754,7 +754,7 @@ dav_svn__checkout(dav_resource *resource if (node_relation != svn_fs_node_unchanged) { return dav_svn__new_error_svn - (resource->pool, HTTP_CONFLICT, SVN_ERR_FS_CONFLICT, + (resource->pool, HTTP_CONFLICT, SVN_ERR_FS_CONFLICT, 0, "version resource newer than txn (restart the commit)"); } } @@ -773,7 +773,7 @@ uncheckout(dav_resource *resource) { if (resource->type != DAV_RESOURCE_TYPE_WORKING) return dav_svn__new_error_svn(resource->pool, HTTP_INTERNAL_SERVER_ERROR, - SVN_ERR_UNSUPPORTED_FEATURE, + SVN_ERR_UNSUPPORTED_FEATURE, 0, "UNCHECKOUT called on non-working resource"); /* Try to abort the txn if it exists; but don't try too hard. :-) */ @@ -914,7 +914,7 @@ dav_svn__checkin(dav_resource *resource, if (resource->type != DAV_RESOURCE_TYPE_WORKING) return dav_svn__new_error_svn(resource->pool, HTTP_INTERNAL_SERVER_ERROR, - SVN_ERR_UNSUPPORTED_FEATURE, + SVN_ERR_UNSUPPORTED_FEATURE, 0, "CHECKIN called on non-working resource"); /* If the global autoversioning activity still exists, that means @@ -940,19 +940,22 @@ dav_svn__checkin(dav_resource *resource, shared_txn_name = dav_svn__get_txn(resource->info->repos, shared_activity); if (! shared_txn_name) - return dav_svn__new_error(resource->pool, HTTP_INTERNAL_SERVER_ERROR, 0, + return dav_svn__new_error(resource->pool, HTTP_INTERNAL_SERVER_ERROR, + 0, 0, "Cannot look up a txn_name by activity"); /* Sanity checks */ if (resource->info->root.txn_name && (strcmp(shared_txn_name, resource->info->root.txn_name) != 0)) - return dav_svn__new_error(resource->pool, HTTP_INTERNAL_SERVER_ERROR, 0, + return dav_svn__new_error(resource->pool, HTTP_INTERNAL_SERVER_ERROR, + 0, 0, "Internal txn_name doesn't match " "autoversioning transaction."); if (! resource->info->root.txn) /* should already be open by checkout */ - return dav_svn__new_error(resource->pool, HTTP_INTERNAL_SERVER_ERROR, 0, + return dav_svn__new_error(resource->pool, HTTP_INTERNAL_SERVER_ERROR, + 0, 0, "Autoversioning txn isn't open " "when it should be."); @@ -1018,7 +1021,7 @@ dav_svn__checkin(dav_resource *resource, { return dav_svn__new_error(resource->pool, HTTP_INTERNAL_SERVER_ERROR, - 0, + 0, 0, "Commit failed but there was no error " "provided."); } @@ -1151,7 +1154,7 @@ deliver_report(request_rec *r, /* ### what is a good error for an unknown report? */ return dav_svn__new_error_svn(resource->pool, HTTP_NOT_IMPLEMENTED, - SVN_ERR_UNSUPPORTED_FEATURE, + SVN_ERR_UNSUPPORTED_FEATURE, 0, "The requested report is unknown"); } @@ -1180,7 +1183,7 @@ make_activity(dav_resource *resource) case an older mod_dav doesn't do the check for us. */ if (! can_be_activity(resource)) return dav_svn__new_error_svn(resource->pool, HTTP_FORBIDDEN, - SVN_ERR_APMOD_MALFORMED_URI, + SVN_ERR_APMOD_MALFORMED_URI, 0, "Activities cannot be created at that " "location; query the " "DAV:activity-collection-set property"); @@ -1428,7 +1431,7 @@ merge(dav_resource *target, && source->info->restype == DAV_SVN_RESTYPE_TXN_COLLECTION))) { return dav_svn__new_error_svn(pool, HTTP_METHOD_NOT_ALLOWED, - SVN_ERR_INCORRECT_PARAMS, + SVN_ERR_INCORRECT_PARAMS, 0, "MERGE can only be performed using an " "activity or transaction resource as the " "source"); @@ -1436,7 +1439,7 @@ merge(dav_resource *target, if (! source->exists) { return dav_svn__new_error_svn(pool, HTTP_METHOD_NOT_ALLOWED, - SVN_ERR_INCORRECT_PARAMS, + SVN_ERR_INCORRECT_PARAMS, 0, "MERGE activity or transaction resource " "does not exist"); } @@ -1533,7 +1536,7 @@ merge(dav_resource *target, { return dav_svn__new_error(pool, HTTP_INTERNAL_SERVER_ERROR, - 0, + 0, 0, "Commit failed but there was no error " "provided."); } Modified: subversion/branches/fsx-1.10/subversion/svn/cl-conflicts.c URL: http://svn.apache.org/viewvc/subversion/branches/fsx-1.10/subversion/svn/cl-conflicts.c?rev=1687422&r1=1687421&r2=1687422&view=diff ============================================================================== --- subversion/branches/fsx-1.10/subversion/svn/cl-conflicts.c (original) +++ subversion/branches/fsx-1.10/subversion/svn/cl-conflicts.c Thu Jun 25 08:00:57 2015 @@ -301,32 +301,26 @@ svn_cl__get_human_readable_tree_conflict conflict_action = svn_client_conflict_get_incoming_change(conflict); conflict_reason = svn_client_conflict_get_local_change(conflict); conflict_operation = svn_client_conflict_get_operation(conflict); - conflict_node_kind = svn_client_conflict_get_node_kind(conflict); + conflict_node_kind = svn_client_conflict_tree_get_victim_node_kind(conflict); /* Determine the node kind of the incoming change. */ incoming_kind = svn_node_unknown; if (conflict_action == svn_wc_conflict_action_edit || conflict_action == svn_wc_conflict_action_delete) { - const svn_wc_conflict_version_t *src_left_version; - /* Change is acting on 'src_left' version of the node. */ - src_left_version = svn_client_conflict_get_src_left_version(conflict); - if (src_left_version) - incoming_kind = src_left_version->node_kind; + SVN_ERR(svn_client_conflict_get_incoming_old_repos_location( + NULL, NULL, &incoming_kind, conflict, pool, pool)); } else if (conflict_action == svn_wc_conflict_action_add || conflict_action == svn_wc_conflict_action_replace) { - const svn_wc_conflict_version_t *src_right_version; - /* Change is acting on 'src_right' version of the node. * * ### For 'replace', the node kind is ambiguous. However, src_left * ### is NULL for replace, so we must use src_right. */ - src_right_version = svn_client_conflict_get_src_right_version(conflict); - if (src_right_version) - incoming_kind = src_right_version->node_kind; + SVN_ERR(svn_client_conflict_get_incoming_new_repos_location( + NULL, NULL, &incoming_kind, conflict, pool, pool)); } reason = local_reason_str(conflict_node_kind, conflict_reason, @@ -380,13 +374,16 @@ svn_cl__get_human_readable_action_descri /* Helper for svn_cl__append_tree_conflict_info_xml(). - * Appends the attributes of the given VERSION to ATT_HASH. + * Appends the repository location of a conflicted node to ATT_HASH. * SIDE is the content of the version tag's side="..." attribute, * currently one of "source-left" or "source-right".*/ static svn_error_t * add_conflict_version_xml(svn_stringbuf_t **pstr, const char *side, - const svn_wc_conflict_version_t *version, + const char *repos_root_url, + const char *repos_relpath, + svn_revnum_t peg_rev, + svn_node_kind_t node_kind, apr_pool_t *pool) { apr_hash_t *att_hash = apr_hash_make(pool); @@ -394,18 +391,17 @@ add_conflict_version_xml(svn_stringbuf_t svn_hash_sets(att_hash, "side", side); - if (version->repos_url) - svn_hash_sets(att_hash, "repos-url", version->repos_url); + if (repos_root_url) + svn_hash_sets(att_hash, "repos-url", repos_root_url); - if (version->path_in_repos) - svn_hash_sets(att_hash, "path-in-repos", version->path_in_repos); + if (repos_relpath) + svn_hash_sets(att_hash, "path-in-repos", repos_relpath); - if (SVN_IS_VALID_REVNUM(version->peg_rev)) - svn_hash_sets(att_hash, "revision", apr_ltoa(pool, version->peg_rev)); + if (SVN_IS_VALID_REVNUM(peg_rev)) + svn_hash_sets(att_hash, "revision", apr_ltoa(pool, peg_rev)); - if (version->node_kind != svn_node_unknown) - svn_hash_sets(att_hash, "kind", - svn_cl__node_kind_str_xml(version->node_kind)); + if (node_kind != svn_node_unknown) + svn_hash_sets(att_hash, "kind", svn_cl__node_kind_str_xml(node_kind)); svn_xml_make_open_tag_hash(pstr, pool, svn_xml_self_closing, "version", att_hash); @@ -420,8 +416,10 @@ append_tree_conflict_info_xml(svn_string { apr_hash_t *att_hash = apr_hash_make(pool); const char *tmp; - const svn_wc_conflict_version_t *src_left_version; - const svn_wc_conflict_version_t *src_right_version; + const char *repos_root_url; + const char *repos_relpath; + svn_revnum_t peg_rev; + svn_node_kind_t node_kind; svn_hash_sets(att_hash, "victim", svn_dirent_basename( @@ -429,7 +427,7 @@ append_tree_conflict_info_xml(svn_string svn_hash_sets(att_hash, "kind", svn_cl__node_kind_str_xml( - svn_client_conflict_get_node_kind(conflict))); + svn_client_conflict_tree_get_victim_node_kind(conflict))); svn_hash_sets(att_hash, "operation", svn_cl__operation_str_xml( @@ -449,19 +447,30 @@ append_tree_conflict_info_xml(svn_string /* Add child tags for OLDER_VERSION and THEIR_VERSION. */ - src_left_version = svn_client_conflict_get_src_left_version(conflict); - if (src_left_version) - SVN_ERR(add_conflict_version_xml(&str, - "source-left", - src_left_version, - pool)); - - src_right_version = svn_client_conflict_get_src_right_version(conflict); - if (src_right_version) + SVN_ERR(svn_client_conflict_get_repos_info(&repos_root_url, NULL, conflict, + pool, pool)); + SVN_ERR(svn_client_conflict_get_incoming_old_repos_location(&repos_relpath, + &peg_rev, + &node_kind, + conflict, + pool, + pool)); + if (repos_root_url && repos_relpath) + SVN_ERR(add_conflict_version_xml(&str, "source-left", + repos_root_url, repos_relpath, peg_rev, + node_kind, pool)); + + SVN_ERR(svn_client_conflict_get_incoming_old_repos_location(&repos_relpath, + &peg_rev, + &node_kind, + conflict, + pool, + pool)); + if (repos_root_url && repos_relpath) SVN_ERR(add_conflict_version_xml(&str, "source-right", - src_right_version, - pool)); + repos_root_url, repos_relpath, peg_rev, + node_kind, pool)); svn_xml_make_close_tag(&str, pool, "tree-conflict"); @@ -477,8 +486,10 @@ svn_cl__append_conflict_info_xml(svn_str const char *kind; svn_wc_conflict_kind_t conflict_kind; svn_wc_operation_t conflict_operation; - const svn_wc_conflict_version_t *src_left_version; - const svn_wc_conflict_version_t *src_right_version; + const char *repos_root_url; + const char *repos_relpath; + svn_revnum_t peg_rev; + svn_node_kind_t node_kind; conflict_kind = svn_client_conflict_get_kind(conflict); conflict_operation = svn_client_conflict_get_operation(conflict); @@ -507,45 +518,60 @@ svn_cl__append_conflict_info_xml(svn_str svn_xml_make_open_tag_hash(&str, scratch_pool, svn_xml_normal, "conflict", att_hash); - src_left_version = svn_client_conflict_get_src_left_version(conflict); - if (src_left_version) - SVN_ERR(add_conflict_version_xml(&str, - "source-left", - src_left_version, - scratch_pool)); - - src_right_version = svn_client_conflict_get_src_right_version(conflict); - if (src_right_version) - SVN_ERR(add_conflict_version_xml(&str, - "source-right", - src_right_version, - scratch_pool)); + SVN_ERR(svn_client_conflict_get_repos_info(&repos_root_url, NULL, conflict, + scratch_pool, scratch_pool)); + SVN_ERR(svn_client_conflict_get_incoming_old_repos_location(&repos_relpath, + &peg_rev, + &node_kind, + conflict, + scratch_pool, + scratch_pool)); + if (repos_root_url && repos_relpath) + SVN_ERR(add_conflict_version_xml(&str, "source-left", + repos_root_url, repos_relpath, peg_rev, + node_kind, scratch_pool)); + + SVN_ERR(svn_client_conflict_get_incoming_old_repos_location(&repos_relpath, + &peg_rev, + &node_kind, + conflict, + scratch_pool, + scratch_pool)); + if (repos_root_url && repos_relpath) + SVN_ERR(add_conflict_version_xml(&str, "source-right", + repos_root_url, repos_relpath, peg_rev, + node_kind, scratch_pool)); switch (conflict_kind) { + const char *base_abspath; + const char *my_abspath; + const char *their_abspath; + case svn_wc_conflict_kind_text: + SVN_ERR(svn_client_conflict_text_get_contents(NULL, &my_abspath, + &base_abspath, + &their_abspath, + conflict, scratch_pool, + scratch_pool)); /* "<prev-base-file> xx </prev-base-file>" */ svn_cl__xml_tagged_cdata( - &str, scratch_pool, "prev-base-file", - svn_client_conflict_get_base_abspath(conflict)); + &str, scratch_pool, "prev-base-file", base_abspath); /* "<prev-wc-file> xx </prev-wc-file>" */ svn_cl__xml_tagged_cdata( - &str, scratch_pool, "prev-wc-file", - svn_client_conflict_get_my_abspath(conflict)); + &str, scratch_pool, "prev-wc-file", my_abspath); /* "<cur-base-file> xx </cur-base-file>" */ svn_cl__xml_tagged_cdata( - &str, scratch_pool, "cur-base-file", - svn_client_conflict_get_their_abspath(conflict)); + &str, scratch_pool, "cur-base-file", their_abspath); break; case svn_wc_conflict_kind_property: /* "<prop-file> xx </prop-file>" */ svn_cl__xml_tagged_cdata( - &str, scratch_pool, "prop-file", - svn_client_conflict_get_their_abspath(conflict)); + &str, scratch_pool, "prop-file", their_abspath); break; default: Modified: subversion/branches/fsx-1.10/subversion/svn/cl.h URL: http://svn.apache.org/viewvc/subversion/branches/fsx-1.10/subversion/svn/cl.h?rev=1687422&r1=1687421&r2=1687422&view=diff ============================================================================== --- subversion/branches/fsx-1.10/subversion/svn/cl.h (original) +++ subversion/branches/fsx-1.10/subversion/svn/cl.h Thu Jun 25 08:00:57 2015 @@ -777,15 +777,18 @@ svn_cl__args_to_target_array_print_reser svn_boolean_t keep_dest_origpath_on_truepath_collision, apr_pool_t *pool); -/* Return a string showing NODE's kind, URL and revision, to the extent that - * that information is available in NODE. If NODE itself is NULL, this prints - * just a 'none' node kind. +/* Return a string showing a conflicted node's kind, URL and revision, + * to the extent that that information is available. If REPOS_ROOT_URL or + * REPOS_RELPATH are NULL, this prints just a 'none' node kind. * WC_REPOS_ROOT_URL should reflect the target working copy's repository - * root URL. If NODE is from that same URL, the printed URL is abbreviated + * root URL. If the node is from that same URL, the printed URL is abbreviated * to caret notation (^/). WC_REPOS_ROOT_URL may be NULL, in which case * this function tries to print the conflicted node's complete URL. */ const char * -svn_cl__node_description(const svn_wc_conflict_version_t *node, +svn_cl__node_description(const char *repos_root_url, + const char *repos_relpath, + svn_revnum_t peg_rev, + svn_node_kind_t node_kind, const char *wc_repos_root_URL, apr_pool_t *pool); Modified: subversion/branches/fsx-1.10/subversion/svn/conflict-callbacks.c URL: http://svn.apache.org/viewvc/subversion/branches/fsx-1.10/subversion/svn/conflict-callbacks.c?rev=1687422&r1=1687421&r2=1687422&view=diff ============================================================================== --- subversion/branches/fsx-1.10/subversion/svn/conflict-callbacks.c (original) +++ subversion/branches/fsx-1.10/subversion/svn/conflict-callbacks.c Thu Jun 25 08:00:57 2015 @@ -141,8 +141,13 @@ show_diff(const svn_wc_conflict_descript svn_diff_t *diff; svn_stream_t *output; svn_diff_file_options_t *options; + const char *my_abspath; + const char *their_abspath; const char *merged_file; + SVN_ERR(svn_client_conflict_text_get_contents(NULL, &my_abspath, NULL, + &their_abspath, + desc, pool, pool)); merged_file = svn_client_conflict_get_merged_file(desc); if (merged_file) { @@ -160,12 +165,12 @@ show_diff(const svn_wc_conflict_descript * brought into the working copy by the update/switch/merge operation. */ if (svn_client_conflict_get_operation(desc) == svn_wc_operation_merge) { - path1 = svn_client_conflict_get_my_abspath(desc); + path1 = my_abspath; label1 = _("MINE"); } else { - path1 = svn_client_conflict_get_their_abspath(desc); + path1 = their_abspath; label1 = _("THEIRS"); } path2 = merged_file; @@ -175,9 +180,9 @@ show_diff(const svn_wc_conflict_descript { /* There's no merged file, but we can show the difference between mine and theirs. */ - path1 = svn_client_conflict_get_their_abspath(desc); + path1 = their_abspath; label1 = _("THEIRS"); - path2 = svn_client_conflict_get_my_abspath(desc); + path2 = my_abspath; label2 = _("MINE"); } @@ -216,22 +221,22 @@ show_conflicts(const svn_wc_conflict_des svn_diff_t *diff; svn_stream_t *output; svn_diff_file_options_t *options; - + const char *base_abspath; + const char *my_abspath; + const char *their_abspath; + + SVN_ERR(svn_client_conflict_text_get_contents(NULL, &my_abspath, + &base_abspath, &their_abspath, + desc, pool, pool)); options = svn_diff_file_options_create(pool); options->ignore_eol_style = TRUE; SVN_ERR(svn_stream_for_stdout(&output, pool)); - SVN_ERR(svn_diff_file_diff3_2(&diff, - svn_client_conflict_get_base_abspath(desc), - svn_client_conflict_get_my_abspath(desc), - svn_client_conflict_get_their_abspath(desc), + SVN_ERR(svn_diff_file_diff3_2(&diff, base_abspath, my_abspath, their_abspath, options, pool)); /* ### Consider putting the markers/labels from ### svn_wc__merge_internal in the conflict description. */ return svn_diff_file_output_merge3( - output, diff, - svn_client_conflict_get_base_abspath(desc), - svn_client_conflict_get_my_abspath(desc), - svn_client_conflict_get_their_abspath(desc), + output, diff, base_abspath, my_abspath, their_abspath, _("||||||| ORIGINAL"), _("<<<<<<< MINE (select with 'mc')"), _(">>>>>>> THEIRS (select with 'tc')"), @@ -245,61 +250,49 @@ show_conflicts(const svn_wc_conflict_des /* Perform a 3-way merge of the conflicting values of a property, * and write the result to the OUTPUT stream. * - * If MERGED_ABSPATH is non-NULL, use it as 'my' version instead of - * DESC->MY_ABSPATH. + * If MERGED_PROPVAL is non-NULL, use it as 'my' version instead of + * MY_ABSPATH. * * Assume the values are printable UTF-8 text. */ static svn_error_t * merge_prop_conflict(svn_stream_t *output, - const svn_wc_conflict_description2_t *desc, - const char *merged_abspath, + const svn_string_t *base_propval, + const svn_string_t *my_propval, + const svn_string_t *their_propval, + const svn_string_t *merged_propval, svn_cancel_func_t cancel_func, void *cancel_baton, apr_pool_t *pool) { - const char *base_abspath = svn_client_conflict_get_base_abspath(desc); - const char *my_abspath = svn_client_conflict_get_my_abspath(desc); - const char *their_abspath = svn_client_conflict_get_their_abspath(desc); svn_diff_file_options_t *options = svn_diff_file_options_create(pool); svn_diff_t *diff; - /* If any of the property values is missing, use an empty file instead + /* If any of the property values is missing, use an empty value instead * for the purpose of showing a diff. */ - if (! base_abspath || ! my_abspath || ! their_abspath) - { - const char *empty_file; - - SVN_ERR(svn_io_open_unique_file3(NULL, &empty_file, - NULL, svn_io_file_del_on_pool_cleanup, - pool, pool)); - if (! base_abspath) - base_abspath = empty_file; - if (! my_abspath) - my_abspath = empty_file; - if (! their_abspath) - their_abspath = empty_file; - } - + if (base_propval == NULL) + base_propval = svn_string_create_empty(pool); + if (my_propval == NULL) + my_propval = svn_string_create_empty(pool); + if (my_propval == NULL) + my_propval = svn_string_create_empty(pool); + options->ignore_eol_style = TRUE; - SVN_ERR(svn_diff_file_diff3_2(&diff, - base_abspath, - merged_abspath ? merged_abspath : my_abspath, - their_abspath, - options, pool)); - SVN_ERR(svn_diff_file_output_merge3(output, diff, - base_abspath, - merged_abspath ? merged_abspath - : my_abspath, - their_abspath, - _("||||||| ORIGINAL"), - _("<<<<<<< MINE"), - _(">>>>>>> THEIRS"), - "=======", - svn_diff_conflict_display_modified_original_latest, - cancel_func, - cancel_baton, - pool)); + SVN_ERR(svn_diff_mem_string_diff3(&diff, base_propval, + merged_propval ? + merged_propval : my_propval, + their_propval, options, pool)); + SVN_ERR(svn_diff_mem_string_output_merge3( + output, diff, base_propval, + merged_propval ? merged_propval : my_propval, their_propval, + _("||||||| ORIGINAL"), + _("<<<<<<< MINE"), + _(">>>>>>> THEIRS"), + "=======", + svn_diff_conflict_display_modified_original_latest, + cancel_func, + cancel_baton, + pool)); return SVN_NO_ERROR; } @@ -312,8 +305,10 @@ merge_prop_conflict(svn_stream_t *output * Assume the values are printable UTF-8 text. */ static svn_error_t * -show_prop_conflict(const svn_wc_conflict_description2_t *desc, - const char *merged_abspath, +show_prop_conflict(const svn_string_t *base_propval, + const svn_string_t *my_propval, + const svn_string_t *their_propval, + const svn_string_t *merged_propval, svn_cancel_func_t cancel_func, void *cancel_baton, apr_pool_t *pool) @@ -321,8 +316,8 @@ show_prop_conflict(const svn_wc_conflict svn_stream_t *output; SVN_ERR(svn_stream_for_stdout(&output, pool)); - SVN_ERR(merge_prop_conflict(output, desc, merged_abspath, - cancel_func, cancel_baton, pool)); + SVN_ERR(merge_prop_conflict(output, base_propval, my_propval, their_propval, + merged_propval, cancel_func, cancel_baton, pool)); return SVN_NO_ERROR; } @@ -371,12 +366,18 @@ open_editor(svn_boolean_t *performed_edi return SVN_NO_ERROR; } -/* Run an external editor, passing it the 'merged' property in DESC. +/* Run an external editor on the merged property value with conflict markers. + * Return the path to a file containing the edited result in *MERGED_FILE_PATH + * and also return the resulting property value in *MERGED_RPOPVAL. + * If the edit is aborted, set *MERGED_FILE_PATH and *MERGED_PROPVAL to NULL. * The tool to use is determined by B->editor_cmd, B->config and * environment variables; see svn_cl__edit_file_externally() for details. */ static svn_error_t * edit_prop_conflict(const char **merged_file_path, - const svn_wc_conflict_description2_t *desc, + const svn_string_t **merged_propval, + const svn_string_t *base_propval, + const svn_string_t *my_propval, + const svn_string_t *their_propval, svn_cl__interactive_conflict_baton_t *b, apr_pool_t *result_pool, apr_pool_t *scratch_pool) @@ -391,14 +392,28 @@ edit_prop_conflict(const char **merged_f result_pool, scratch_pool)); merged_prop = svn_stream_from_aprfile2(file, TRUE /* disown */, scratch_pool); - SVN_ERR(merge_prop_conflict(merged_prop, desc, NULL, + SVN_ERR(merge_prop_conflict(merged_prop, base_propval, my_propval, + their_propval, NULL, b->pb->cancel_func, b->pb->cancel_baton, scratch_pool)); SVN_ERR(svn_stream_close(merged_prop)); SVN_ERR(svn_io_file_flush(file, scratch_pool)); SVN_ERR(open_editor(&performed_edit, file_path, b, scratch_pool)); - *merged_file_path = (performed_edit ? file_path : NULL); + if (performed_edit) + { + svn_stringbuf_t *buf; + + *merged_file_path = file_path; + + SVN_ERR(svn_stringbuf_from_file2(&buf, file_path, scratch_pool)); + *merged_propval = svn_string_create_from_buf(buf, result_pool); + } + else + { + *merged_file_path = NULL; + *merged_propval = NULL; + } return SVN_NO_ERROR; } @@ -716,14 +731,17 @@ handle_text_conflict(svn_wc_conflict_res svn_boolean_t knows_something = FALSE; const char *local_relpath; const char *local_abspath = svn_client_conflict_get_local_abspath(desc); - svn_boolean_t is_binary = svn_client_conflict_get_is_binary(desc); - const char *base_abspath = svn_client_conflict_get_base_abspath(desc); - const char *my_abspath = svn_client_conflict_get_my_abspath(desc); - const char *their_abspath = svn_client_conflict_get_their_abspath(desc); + svn_boolean_t is_binary = svn_mime_type_is_binary( + svn_client_conflict_text_get_mime_type(desc)); + const char *base_abspath; + const char *my_abspath; + const char *their_abspath; const char *merged_file = svn_client_conflict_get_merged_file(desc); - SVN_ERR_ASSERT(svn_client_conflict_get_kind(desc) == - svn_wc_conflict_kind_text); + SVN_ERR(svn_client_conflict_text_get_contents(NULL, &my_abspath, + &base_abspath, &their_abspath, + desc, scratch_pool, + scratch_pool)); local_relpath = svn_cl__local_style_skip_ancestor(b->path_prefix, local_abspath, @@ -1036,21 +1054,20 @@ handle_prop_conflict(svn_wc_conflict_res apr_pool_t *iterpool; const char *message; const char *merged_file_path = NULL; + const svn_string_t *merged_propval = NULL; svn_boolean_t resolved_allowed = FALSE; - - /* ### Work around a historical bug in the provider: the path to the - * conflict description file was put in the 'theirs' field, and - * 'theirs' was put in the 'merged' field. */ - ((svn_wc_conflict_description2_t *)desc)->their_abspath = desc->merged_file; - ((svn_wc_conflict_description2_t *)desc)->merged_file = NULL; - - SVN_ERR_ASSERT(svn_client_conflict_get_kind(desc) == - svn_wc_conflict_kind_property); + const svn_string_t *base_propval; + const svn_string_t *my_propval; + const svn_string_t *their_propval; + + SVN_ERR(svn_client_conflict_prop_get_propvals(NULL, &my_propval, + &base_propval, &their_propval, + desc, scratch_pool)); SVN_ERR(svn_cmdline_fprintf(stderr, scratch_pool, _("Conflict for property '%s' discovered" " on '%s'.\n"), - svn_client_conflict_get_property_name(desc), + svn_client_conflict_prop_get_propname(desc), svn_cl__local_style_skip_ancestor( b->path_prefix, svn_client_conflict_get_local_abspath(desc), @@ -1094,15 +1111,17 @@ handle_prop_conflict(svn_wc_conflict_res } else if (strcmp(opt->code, "dc") == 0) { - SVN_ERR(show_prop_conflict(desc, merged_file_path, + SVN_ERR(show_prop_conflict(base_propval, my_propval, their_propval, + merged_propval, b->pb->cancel_func, b->pb->cancel_baton, scratch_pool)); } else if (strcmp(opt->code, "e") == 0) { - SVN_ERR(edit_prop_conflict(&merged_file_path, desc, b, - result_pool, scratch_pool)); - resolved_allowed = (merged_file_path != NULL); + SVN_ERR(edit_prop_conflict(&merged_file_path, &merged_propval, + base_propval, my_propval, their_propval, + b, result_pool, scratch_pool)); + resolved_allowed = (merged_propval != NULL); } else if (strcmp(opt->code, "r") == 0) { @@ -1142,6 +1161,10 @@ handle_tree_conflict(svn_wc_conflict_res const char *readable_desc; const char *src_left_version; const char *src_right_version; + const char *repos_root_url; + const char *repos_relpath; + svn_revnum_t peg_rev; + svn_node_kind_t node_kind; apr_pool_t *iterpool; SVN_ERR(svn_cl__get_human_readable_tree_conflict_description( @@ -1153,19 +1176,30 @@ handle_tree_conflict(svn_wc_conflict_res svn_client_conflict_get_local_abspath(desc), scratch_pool), readable_desc)); + SVN_ERR(svn_client_conflict_get_repos_info(&repos_root_url, NULL, + desc, scratch_pool, scratch_pool)); + SVN_ERR(svn_client_conflict_get_incoming_old_repos_location(&repos_relpath, + &peg_rev, + &node_kind, + desc, + scratch_pool, + scratch_pool)); src_left_version = - svn_cl__node_description( - svn_client_conflict_get_src_left_version(desc), - svn_client_conflict_get_src_left_version(desc)->repos_url, - scratch_pool); + svn_cl__node_description(repos_root_url, repos_relpath, peg_rev, + node_kind, repos_root_url, scratch_pool); if (src_left_version) SVN_ERR(svn_cmdline_fprintf(stderr, scratch_pool, "%s: %s\n", _("Source left"), src_left_version)); + + SVN_ERR(svn_client_conflict_get_incoming_new_repos_location(&repos_relpath, + &peg_rev, + &node_kind, + desc, + scratch_pool, + scratch_pool)); src_right_version = - svn_cl__node_description( - svn_client_conflict_get_src_right_version(desc), - svn_client_conflict_get_src_right_version(desc)->repos_url, - scratch_pool); + svn_cl__node_description(repos_root_url, repos_relpath, peg_rev, + node_kind, repos_root_url, scratch_pool); if (src_right_version) SVN_ERR(svn_cmdline_fprintf(stderr, scratch_pool, "%s: %s\n", _("Source right"), src_right_version)); @@ -1195,7 +1229,8 @@ handle_tree_conflict(svn_wc_conflict_res { if (svn_client_conflict_get_incoming_change(desc) == svn_wc_conflict_action_edit && - svn_client_conflict_get_node_kind(desc) == svn_node_dir) + svn_client_conflict_tree_get_victim_node_kind(desc) == + svn_node_dir) tc_opts = tree_conflict_options_update_edit_deleted_dir; } } @@ -1232,11 +1267,18 @@ conflict_func_interactive(svn_wc_conflic { svn_cl__interactive_conflict_baton_t *b = baton; svn_error_t *err; - const char *base_abspath = svn_client_conflict_get_base_abspath(desc); - const char *my_abspath = svn_client_conflict_get_my_abspath(desc); - const char *their_abspath = svn_client_conflict_get_their_abspath(desc); + const char *base_abspath = NULL; + const char *my_abspath = NULL; + const char *their_abspath = NULL; const char *merged_file = svn_client_conflict_get_merged_file(desc); + if (svn_client_conflict_get_kind(desc) == svn_wc_conflict_kind_text) + SVN_ERR(svn_client_conflict_text_get_contents(NULL, &my_abspath, + &base_abspath, + &their_abspath, + desc, scratch_pool, + scratch_pool)); + /* Start out assuming we're going to postpone the conflict. */ *result = svn_wc_create_conflict_result(svn_wc_conflict_choose_postpone, NULL, result_pool); Modified: subversion/branches/fsx-1.10/subversion/svn/info-cmd.c URL: http://svn.apache.org/viewvc/subversion/branches/fsx-1.10/subversion/svn/info-cmd.c?rev=1687422&r1=1687421&r2=1687422&view=diff ============================================================================== --- subversion/branches/fsx-1.10/subversion/svn/info-cmd.c (original) +++ subversion/branches/fsx-1.10/subversion/svn/info-cmd.c Thu Jun 25 08:00:57 2015 @@ -581,8 +581,8 @@ print_info(void *baton, if (info->wc_info->conflicts) { - svn_boolean_t printed_prop_conflict_file = FALSE; svn_boolean_t printed_tc = FALSE; + svn_stringbuf_t *conflicted_props = NULL; int i; for (i = 0; i < info->wc_info->conflicts->nelts; i++) @@ -591,17 +591,18 @@ print_info(void *baton, APR_ARRAY_IDX(info->wc_info->conflicts, i, const svn_wc_conflict_description2_t *); const char *desc; - const char *base_abspath; - const char *my_abspath; - const char *their_abspath; - - base_abspath = svn_client_conflict_get_base_abspath(conflict); - my_abspath = svn_client_conflict_get_my_abspath(conflict); - their_abspath = svn_client_conflict_get_their_abspath(conflict); + const char *base_abspath = NULL; + const char *my_abspath = NULL; + const char *their_abspath = NULL; switch (svn_client_conflict_get_kind(conflict)) { case svn_wc_conflict_kind_text: + + SVN_ERR(svn_client_conflict_text_get_contents( + NULL, &my_abspath, &base_abspath, &their_abspath, + conflict, pool, pool)); + if (base_abspath) SVN_ERR(svn_cmdline_printf(pool, _("Conflict Previous Base File: %s\n"), @@ -628,15 +629,18 @@ print_info(void *baton, break; case svn_wc_conflict_kind_property: - if (! printed_prop_conflict_file) - SVN_ERR(svn_cmdline_printf(pool, - _("Conflict Properties File: %s\n"), - svn_cl__local_style_skip_ancestor( - receiver_baton->path_prefix, - svn_client_conflict_get_prop_reject_abspath( - conflict), - pool))); - printed_prop_conflict_file = TRUE; + { + const char *name; + + name = svn_client_conflict_prop_get_propname(conflict); + if (conflicted_props == NULL) + conflicted_props = svn_stringbuf_create(name, pool); + else + { + svn_stringbuf_appendbyte(conflicted_props, ' '); + svn_stringbuf_appendcstr(conflicted_props, name); + } + } break; case svn_wc_conflict_kind_tree: @@ -651,6 +655,10 @@ print_info(void *baton, } } + if (conflicted_props) + SVN_ERR(svn_cmdline_printf(pool, _("Conflicted Properties: %s\n"), + conflicted_props->data)); + /* We only store one left and right version for all conflicts, which is referenced from all conflicts. Print it after the conflicts to match the 1.6/1.7 output where it is @@ -658,6 +666,10 @@ print_info(void *baton, { const char *src_left_version; const char *src_right_version; + const char *repos_root_url; + const char *repos_relpath; + svn_revnum_t peg_rev; + svn_node_kind_t node_kind; const svn_wc_conflict_description2_t *conflict = APR_ARRAY_IDX(info->wc_info->conflicts, 0, const svn_wc_conflict_description2_t *); @@ -669,21 +681,28 @@ print_info(void *baton, SVN_ERR(svn_cl__get_human_readable_action_description(&desc, svn_wc_conflict_action_edit, svn_client_conflict_get_operation(conflict), - svn_client_conflict_get_node_kind(conflict), pool)); + info->kind, + pool)); SVN_ERR(svn_cmdline_printf(pool, "%s: %s\n", _("Conflict Details"), desc)); } + SVN_ERR(svn_client_conflict_get_repos_info(&repos_root_url, NULL, + conflict, pool, pool)); + SVN_ERR(svn_client_conflict_get_incoming_old_repos_location( + &repos_relpath, &peg_rev, &node_kind, conflict, + pool, pool)); src_left_version = - svn_cl__node_description( - svn_client_conflict_get_src_left_version(conflict), - info->repos_root_URL, pool); + svn_cl__node_description(repos_root_url, repos_relpath, + peg_rev, node_kind, info->repos_root_URL, pool); + SVN_ERR(svn_client_conflict_get_incoming_new_repos_location( + &repos_relpath, &peg_rev, &node_kind, conflict, + pool, pool)); src_right_version = - svn_cl__node_description( - svn_client_conflict_get_src_right_version(conflict), - info->repos_root_URL, pool); + svn_cl__node_description(repos_root_url, repos_relpath, + peg_rev, node_kind, info->repos_root_URL, pool); if (src_left_version) SVN_ERR(svn_cmdline_printf(pool, " %s: %s\n", Modified: subversion/branches/fsx-1.10/subversion/svn/util.c URL: http://svn.apache.org/viewvc/subversion/branches/fsx-1.10/subversion/svn/util.c?rev=1687422&r1=1687421&r2=1687422&view=diff ============================================================================== --- subversion/branches/fsx-1.10/subversion/svn/util.c (original) +++ subversion/branches/fsx-1.10/subversion/svn/util.c Thu Jun 25 08:00:57 2015 @@ -907,14 +907,17 @@ svn_cl__time_cstring_to_human_cstring(co } const char * -svn_cl__node_description(const svn_wc_conflict_version_t *node, +svn_cl__node_description(const char *repos_root_url, + const char *repos_relpath, + svn_revnum_t peg_rev, + svn_node_kind_t node_kind, const char *wc_repos_root_URL, apr_pool_t *pool) { const char *root_str = "^"; const char *path_str = "..."; - if (!node) + if (!repos_root_url || !repos_relpath || !SVN_IS_VALID_REVNUM(peg_rev)) /* Printing "(none)" the harder way to ensure conformity (mostly with * translations). */ return apr_psprintf(pool, "(%s)", @@ -923,18 +926,18 @@ svn_cl__node_description(const svn_wc_co /* Construct a "caret notation" ^/URL if NODE matches WC_REPOS_ROOT_URL. * Otherwise show the complete URL, and if we can't, show dots. */ - if (node->repos_url && + if (repos_root_url && (wc_repos_root_URL == NULL || - strcmp(node->repos_url, wc_repos_root_URL) != 0)) - root_str = node->repos_url; + strcmp(repos_root_url, wc_repos_root_URL) != 0)) + root_str = repos_root_url; - if (node->path_in_repos) - path_str = node->path_in_repos; + if (repos_relpath) + path_str = repos_relpath; return apr_psprintf(pool, "(%s) %s@%ld", - svn_cl__node_kind_str_human_readable(node->node_kind), + svn_cl__node_kind_str_human_readable(node_kind), svn_path_url_add_component2(root_str, path_str, pool), - node->peg_rev); + peg_rev); } svn_error_t * Modified: subversion/branches/fsx-1.10/subversion/tests/cmdline/merge_tree_conflict_tests.py URL: http://svn.apache.org/viewvc/subversion/branches/fsx-1.10/subversion/tests/cmdline/merge_tree_conflict_tests.py?rev=1687422&r1=1687421&r2=1687422&view=diff ============================================================================== --- subversion/branches/fsx-1.10/subversion/tests/cmdline/merge_tree_conflict_tests.py (original) +++ subversion/branches/fsx-1.10/subversion/tests/cmdline/merge_tree_conflict_tests.py Thu Jun 25 08:00:57 2015 @@ -2012,9 +2012,7 @@ def merge_conflict_details(sbox): expected_info = [ { "Path" : re.escape(sbox.ospath('B')), - - "Conflict Properties File" : - re.escape(sbox.ospath('B/dir_conflicts.prej')) + '.*', + "Conflicted Properties" : "key", "Conflict Details": re.escape( 'incoming dir edit upon merge' + ' Source left: (dir) ^/A/B@1' + @@ -2124,18 +2122,16 @@ def merge_obstruction_recording(sbox): }) expected_mergeinfo_output = wc.State(wc_dir, { '' : Item(status=' U'), - 'dir' : Item(status=' U'), # Because dir already exists }) expected_elision_output = wc.State(wc_dir, { }) expected_disk = wc.State('', { 'dir/file.txt' : Item(contents="The file on branch\n"), - 'dir' : Item(props={'svn:mergeinfo':''}), '.' : Item(props={'svn:mergeinfo':'/trunk:2-4'}), }) expected_status = wc.State(wc_dir, { '' : Item(status=' M', wc_rev='4'), - 'dir' : Item(status=' M', treeconflict='C', wc_rev='4'), + 'dir' : Item(status=' ', treeconflict='C', wc_rev='4'), 'dir/file.txt' : Item(status=' ', wc_rev='4'), }) expected_skip = wc.State('', { @@ -2172,7 +2168,7 @@ def merge_obstruction_recording(sbox): expected_output = [ '--- Recording mergeinfo for merge of r4 into \'%s\':\n' % \ sbox.ospath('dir'), - ' G %s\n' % sbox.ospath('dir'), + ' U %s\n' % sbox.ospath('dir'), ] # ### Why are r1-r3 not recorded? # ### Guess: Because dir's history only exists since r4.
