You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@subversion.apache.org by br...@apache.org on 2015/01/28 00:27:46 UTC
svn commit: r1655189 [6/9] - in /subversion/branches/svn-auth-x509: ./
build/ build/generator/ subversion/bindings/javahl/native/
subversion/include/ subversion/include/private/ subversion/libsvn_client/
subversion/libsvn_fs_base/ subversion/libsvn_fs_...
Modified: subversion/branches/svn-auth-x509/subversion/libsvn_ra_serf/replay.c
URL: http://svn.apache.org/viewvc/subversion/branches/svn-auth-x509/subversion/libsvn_ra_serf/replay.c?rev=1655189&r1=1655188&r2=1655189&view=diff
==============================================================================
--- subversion/branches/svn-auth-x509/subversion/libsvn_ra_serf/replay.c (original)
+++ subversion/branches/svn-auth-x509/subversion/libsvn_ra_serf/replay.c Tue Jan 27 23:27:44 2015
@@ -112,14 +112,6 @@ static const svn_ra_serf__xml_transition
{ 0 }
};
-/*
- * An incredibly simple list.
- */
-typedef struct ra_serf_list_t {
- void *data;
- struct ra_serf_list_t *next;
-} svn_ra_serf__list_t;
-
/* Per directory/file state */
typedef struct replay_node_t {
apr_pool_t *pool; /* pool allocating this node's data */
@@ -141,8 +133,7 @@ typedef struct revision_report_t {
/* Are we done fetching this file?
Handles book-keeping in multi-report case */
svn_boolean_t *done;
- svn_ra_serf__list_t **done_list;
- svn_ra_serf__list_t done_item;
+ int *replay_reports; /* NULL or number of outstanding reports */
/* callback to get an editor */
svn_ra_replay_revstart_callback_t revstart_func;
@@ -169,12 +160,11 @@ typedef struct revision_report_t {
svn_revnum_t revprop_rev;
/* Revision properties for this revision. */
- apr_hash_t *revs_props;
- apr_hash_t *props;
+ apr_hash_t *rev_props;
/* Handlers for the PROPFIND and REPORT for the current revision. */
svn_ra_serf__handler_t *propfind_handler;
- svn_ra_serf__handler_t *report_handler;
+ svn_ra_serf__handler_t *report_handler; /* For done handler */
} revision_report_t;
@@ -193,19 +183,13 @@ replay_opened(svn_ra_serf__xml_estate_t
/* Before we can continue, we need the revision properties. */
SVN_ERR_ASSERT(!ctx->propfind_handler || ctx->propfind_handler->done);
- /* Create a pool for the commit editor. */
- SVN_ERR(svn_ra_serf__select_revprops(&ctx->props,
- ctx->revprop_target,
- ctx->revprop_rev,
- ctx->revs_props,
- ctx->pool,
- scratch_pool));
+ svn_ra_serf__keep_only_regular_props(ctx->rev_props, scratch_pool);
if (ctx->revstart_func)
{
SVN_ERR(ctx->revstart_func(ctx->revision, ctx->replay_baton,
&ctx->editor, &ctx->editor_baton,
- ctx->props,
+ ctx->rev_props,
ctx->pool));
}
}
@@ -261,8 +245,7 @@ replay_closed(svn_ra_serf__xml_estate_t
{
SVN_ERR(ctx->revfinish_func(ctx->revision, ctx->replay_baton,
ctx->editor, ctx->editor_baton,
- ctx->props,
- scratch_pool));
+ ctx->rev_props, scratch_pool));
}
}
else if (leaving_state == REPLAY_TARGET_REVISION)
@@ -486,35 +469,13 @@ replay_cdata(svn_ra_serf__xml_estate_t *
return SVN_NO_ERROR;
}
-/* Conforms to svn_ra_serf__response_done_delegate_t */
-static svn_error_t *
-replay_done(serf_request_t *request,
- void *baton,
- apr_pool_t *scratch_pool)
-{
- struct revision_report_t *ctx = baton;
- svn_ra_serf__handler_t *handler = ctx->report_handler;
-
- if (handler->server_error)
- return svn_ra_serf__server_error_create(handler, scratch_pool);
- else if (handler->sline.code != 200)
- return svn_error_trace(svn_ra_serf__unexpected_status(handler));
-
- *ctx->done = TRUE; /* Breaks out svn_ra_serf__context_run_wait */
-
- ctx->done_item.data = ctx;
- ctx->done_item.next = *ctx->done_list;
- *ctx->done_list = &ctx->done_item;
-
- return SVN_NO_ERROR;
-}
-
/* Implements svn_ra_serf__request_body_delegate_t */
static svn_error_t *
create_replay_body(serf_bucket_t **bkt,
void *baton,
serf_bucket_alloc_t *alloc,
- apr_pool_t *pool)
+ apr_pool_t *pool /* request pool */,
+ apr_pool_t *scratch_pool)
{
struct revision_report_t *ctx = baton;
serf_bucket_t *body_bkt;
@@ -573,7 +534,7 @@ svn_ra_serf__replay(svn_ra_session_t *ra
svn_ra_serf__xml_context_t *xmlctx;
const char *report_target;
- SVN_ERR(svn_ra_serf__report_resource(&report_target, session, NULL,
+ SVN_ERR(svn_ra_serf__report_resource(&report_target, session,
scratch_pool));
ctx.pool = svn_pool_create(scratch_pool);
@@ -583,7 +544,7 @@ svn_ra_serf__replay(svn_ra_session_t *ra
ctx.revision = revision;
ctx.low_water_mark = low_water_mark;
ctx.send_deltas = send_deltas;
- ctx.revs_props = apr_hash_make(scratch_pool);
+ ctx.rev_props = apr_hash_make(scratch_pool);
xmlctx = svn_ra_serf__xml_context_create(replay_ttable,
replay_opened, replay_closed,
@@ -591,20 +552,17 @@ svn_ra_serf__replay(svn_ra_session_t *ra
&ctx,
scratch_pool);
- handler = svn_ra_serf__create_expat_handler(xmlctx, NULL, scratch_pool);
+ handler = svn_ra_serf__create_expat_handler(session, xmlctx, NULL,
+ scratch_pool);
handler->method = "REPORT";
handler->path = session->session_url.path;
handler->body_delegate = create_replay_body;
handler->body_delegate_baton = &ctx;
handler->body_type = "text/xml";
- handler->conn = session->conns[0];
- handler->session = session;
/* Not setting up done handler as we don't use a global context */
- ctx.report_handler = handler; /* unused */
-
SVN_ERR(svn_ra_serf__context_run_one(handler, scratch_pool));
return svn_error_trace(
@@ -644,6 +602,33 @@ svn_ra_serf__replay(svn_ra_session_t *ra
*/
#define MAX_OUTSTANDING_REQUESTS 50
+/* Implements svn_ra_serf__response_done_delegate_t for svn_ra_serf__replay_range */
+static svn_error_t *
+replay_done(serf_request_t *request,
+ void *baton,
+ apr_pool_t *scratch_pool)
+{
+ struct revision_report_t *ctx = baton;
+ svn_ra_serf__handler_t *handler = ctx->report_handler;
+
+ if (handler->server_error)
+ return svn_ra_serf__server_error_create(handler, scratch_pool);
+ else if (handler->sline.code != 200)
+ return svn_error_trace(svn_ra_serf__unexpected_status(handler));
+
+ *ctx->done = TRUE; /* Breaks out svn_ra_serf__context_run_wait */
+
+ /* Are re replaying multiple revisions? */
+ if (ctx->replay_reports)
+ {
+ (*ctx->replay_reports)--;
+ }
+
+ svn_pool_destroy(ctx->pool); /* Destroys handler and request! */
+
+ return SVN_NO_ERROR;
+}
+
svn_error_t *
svn_ra_serf__replay_range(svn_ra_session_t *ra_session,
svn_revnum_t start_revision,
@@ -653,7 +638,7 @@ svn_ra_serf__replay_range(svn_ra_session
svn_ra_replay_revstart_callback_t revstart_func,
svn_ra_replay_revfinish_callback_t revfinish_func,
void *replay_baton,
- apr_pool_t *pool)
+ apr_pool_t *scratch_pool)
{
svn_ra_serf__session_t *session = ra_session->priv;
svn_revnum_t rev = start_revision;
@@ -661,9 +646,9 @@ svn_ra_serf__replay_range(svn_ra_session
int active_reports = 0;
const char *include_path;
svn_boolean_t done;
- svn_ra_serf__list_t *done_reports = NULL;
- SVN_ERR(svn_ra_serf__report_resource(&report_target, session, NULL, pool));
+ SVN_ERR(svn_ra_serf__report_resource(&report_target, session,
+ scratch_pool));
/* Prior to 1.8, mod_dav_svn expect to get replay REPORT requests
aimed at the session URL. But that's incorrect -- these reports
@@ -686,8 +671,7 @@ svn_ra_serf__replay_range(svn_ra_session
{
SVN_ERR(svn_ra_serf__get_relative_path(&include_path,
session->session_url.path,
- session, session->conns[0],
- pool));
+ session, scratch_pool));
}
else
{
@@ -703,55 +687,56 @@ svn_ra_serf__replay_range(svn_ra_session
requests to MAX_OUTSTANDING_REQUESTS. */
if (rev <= end_revision && active_reports < MAX_OUTSTANDING_REQUESTS)
{
- struct revision_report_t *replay_ctx;
+ struct revision_report_t *rev_ctx;
svn_ra_serf__handler_t *handler;
- apr_pool_t *ctx_pool = svn_pool_create(pool);
+ apr_pool_t *rev_pool = svn_pool_create(scratch_pool);
svn_ra_serf__xml_context_t *xmlctx;
const char *replay_target;
- replay_ctx = apr_pcalloc(ctx_pool, sizeof(*replay_ctx));
- replay_ctx->pool = ctx_pool;
- replay_ctx->revstart_func = revstart_func;
- replay_ctx->revfinish_func = revfinish_func;
- replay_ctx->replay_baton = replay_baton;
- replay_ctx->done = &done;
- replay_ctx->done_list = &done_reports;
- replay_ctx->include_path = include_path;
- replay_ctx->revision = rev;
- replay_ctx->low_water_mark = low_water_mark;
- replay_ctx->send_deltas = send_deltas;
- replay_ctx->done_item.data = replay_ctx;
+ rev_ctx = apr_pcalloc(rev_pool, sizeof(*rev_ctx));
+ rev_ctx->pool = rev_pool;
+ rev_ctx->revstart_func = revstart_func;
+ rev_ctx->revfinish_func = revfinish_func;
+ rev_ctx->replay_baton = replay_baton;
+ rev_ctx->done = &done;
+ rev_ctx->replay_reports = &active_reports;
+ rev_ctx->include_path = include_path;
+ rev_ctx->revision = rev;
+ rev_ctx->low_water_mark = low_water_mark;
+ rev_ctx->send_deltas = send_deltas;
/* Request all properties of a certain revision. */
- replay_ctx->revs_props = apr_hash_make(replay_ctx->pool);
+ rev_ctx->rev_props = apr_hash_make(rev_ctx->pool);
if (SVN_RA_SERF__HAVE_HTTPV2_SUPPORT(session))
{
- replay_ctx->revprop_target = apr_psprintf(pool, "%s/%ld",
- session->rev_stub, rev);
- replay_ctx->revprop_rev = SVN_INVALID_REVNUM;
+ rev_ctx->revprop_target = apr_psprintf(rev_pool, "%s/%ld",
+ session->rev_stub, rev);
+ rev_ctx->revprop_rev = SVN_INVALID_REVNUM;
}
else
{
- replay_ctx->revprop_target = report_target;
- replay_ctx->revprop_rev = rev;
+ rev_ctx->revprop_target = report_target;
+ rev_ctx->revprop_rev = rev;
}
- SVN_ERR(svn_ra_serf__deliver_props(&replay_ctx->propfind_handler,
- replay_ctx->revs_props, session,
- session->conns[0],
- replay_ctx->revprop_target,
- replay_ctx->revprop_rev,
- "0", all_props,
- replay_ctx->pool));
+ SVN_ERR(svn_ra_serf__create_propfind_handler(
+ &rev_ctx->propfind_handler,
+ session,
+ rev_ctx->revprop_target,
+ rev_ctx->revprop_rev,
+ "0", all_props,
+ svn_ra_serf__deliver_svn_props,
+ rev_ctx->rev_props,
+ rev_pool));
/* Spin up the serf request for the PROPFIND. */
- svn_ra_serf__request_create(replay_ctx->propfind_handler);
+ svn_ra_serf__request_create(rev_ctx->propfind_handler);
/* Send the replay REPORT request. */
if (session->supports_rev_rsrc_replay)
{
- replay_target = apr_psprintf(pool, "%s/%ld",
+ replay_target = apr_psprintf(rev_pool, "%s/%ld",
session->rev_stub, rev);
}
else
@@ -761,23 +746,21 @@ svn_ra_serf__replay_range(svn_ra_session
xmlctx = svn_ra_serf__xml_context_create(replay_ttable,
replay_opened, replay_closed,
- replay_cdata,
- replay_ctx,
- ctx_pool);
+ replay_cdata, rev_ctx,
+ rev_pool);
- handler = svn_ra_serf__create_expat_handler(xmlctx, NULL, ctx_pool);
+ handler = svn_ra_serf__create_expat_handler(session, xmlctx, NULL,
+ rev_pool);
handler->method = "REPORT";
handler->path = replay_target;
handler->body_delegate = create_replay_body;
- handler->body_delegate_baton = replay_ctx;
- handler->conn = session->conns[0];
- handler->session = session;
+ handler->body_delegate_baton = rev_ctx;
handler->done_delegate = replay_done;
- handler->done_delegate_baton = replay_ctx;
+ handler->done_delegate_baton = rev_ctx;
- replay_ctx->report_handler = handler;
+ rev_ctx->report_handler = handler;
svn_ra_serf__request_create(handler);
rev++;
@@ -785,32 +768,12 @@ svn_ra_serf__replay_range(svn_ra_session
}
/* Run the serf loop. */
- SVN_ERR(svn_ra_serf__context_run_wait(&done, session, pool));
+ done = FALSE;
+ SVN_ERR(svn_ra_serf__context_run_wait(&done, session, scratch_pool));
- /* Substract the number of completely handled responses from our
- total nr. of open requests', so we'll know when to stop this loop.
- Since the message is completely handled, we can destroy its pool. */
- {
- svn_ra_serf__list_t *done_list;
-
- done_list = done_reports;
-
- done = FALSE;
- done_reports = NULL;
-
- while (done_list)
- {
- revision_report_t *ctx = (revision_report_t *)done_list->data;
- svn_ra_serf__handler_t *done_handler = ctx->report_handler;
-
- done_list = done_list->next;
- SVN_ERR(svn_ra_serf__error_on_status(done_handler->sline,
- done_handler->path,
- done_handler->location));
- svn_pool_clear(ctx->pool);
- active_reports--;
- }
- }
+ /* The done handler of reports decrements active_reports when a report
+ is done. This same handler reports (fatal) report errors, so we can
+ just loop here. */
}
return SVN_NO_ERROR;
Modified: subversion/branches/svn-auth-x509/subversion/libsvn_ra_serf/serf.c
URL: http://svn.apache.org/viewvc/subversion/branches/svn-auth-x509/subversion/libsvn_ra_serf/serf.c?rev=1655189&r1=1655188&r2=1655189&view=diff
==============================================================================
--- subversion/branches/svn-auth-x509/subversion/libsvn_ra_serf/serf.c (original)
+++ subversion/branches/svn-auth-x509/subversion/libsvn_ra_serf/serf.c Tue Jan 27 23:27:44 2015
@@ -801,7 +801,7 @@ svn_ra_serf__reparent(svn_ra_session_t *
if (!session->repos_root_str)
{
const char *vcc_url;
- SVN_ERR(svn_ra_serf__discover_vcc(&vcc_url, session, NULL, pool));
+ SVN_ERR(svn_ra_serf__discover_vcc(&vcc_url, session, pool));
}
if (!svn_uri__is_ancestor(session->repos_root_str, url))
@@ -871,6 +871,7 @@ serf__rev_proplist(svn_ra_session_t *ra_
svn_ra_serf__session_t *session = ra_session->priv;
apr_hash_t *props;
const char *propfind_path;
+ svn_ra_serf__handler_t *handler;
if (SVN_RA_SERF__HAVE_HTTPV2_SUPPORT(session))
{
@@ -886,17 +887,23 @@ serf__rev_proplist(svn_ra_session_t *ra_
else
{
/* Use the VCC as the propfind target path. */
- SVN_ERR(svn_ra_serf__discover_vcc(&propfind_path, session, NULL,
+ SVN_ERR(svn_ra_serf__discover_vcc(&propfind_path, session,
scratch_pool));
}
- /* ### fix: fetch hash of *just* the PATH@REV props. no nested hash. */
- SVN_ERR(svn_ra_serf__retrieve_props(&props, session, session->conns[0],
- propfind_path, rev, "0", fetch_props,
- result_pool, scratch_pool));
+ props = apr_hash_make(result_pool);
+ SVN_ERR(svn_ra_serf__create_propfind_handler(&handler, session,
+ propfind_path, rev, "0",
+ fetch_props,
+ svn_ra_serf__deliver_svn_props,
+ props,
+ scratch_pool));
- SVN_ERR(svn_ra_serf__select_revprops(ret_props, propfind_path, rev, props,
- result_pool, scratch_pool));
+ SVN_ERR(svn_ra_serf__context_run_one(handler, scratch_pool));
+
+ svn_ra_serf__keep_only_regular_props(props, scratch_pool);
+
+ *ret_props = props;
return SVN_NO_ERROR;
}
@@ -967,7 +974,7 @@ svn_ra_serf__get_repos_root(svn_ra_sessi
if (!session->repos_root_str)
{
const char *vcc_url;
- SVN_ERR(svn_ra_serf__discover_vcc(&vcc_url, session, NULL, pool));
+ SVN_ERR(svn_ra_serf__discover_vcc(&vcc_url, session, pool));
}
*url = session->repos_root_str;
@@ -1003,7 +1010,7 @@ svn_ra_serf__get_uuid(svn_ra_session_t *
/* We're not interested in vcc_url and relative_url, but this call also
stores the repository's uuid in the session. */
- SVN_ERR(svn_ra_serf__discover_vcc(&vcc_url, session, NULL, pool));
+ SVN_ERR(svn_ra_serf__discover_vcc(&vcc_url, session, pool));
if (!session->uuid)
{
return svn_error_create(SVN_ERR_RA_DAV_RESPONSE_HEADER_BADNESS, NULL,
Modified: subversion/branches/svn-auth-x509/subversion/libsvn_ra_serf/stat.c
URL: http://svn.apache.org/viewvc/subversion/branches/svn-auth-x509/subversion/libsvn_ra_serf/stat.c?rev=1655189&r1=1655188&r2=1655189&view=diff
==============================================================================
--- subversion/branches/svn-auth-x509/subversion/libsvn_ra_serf/stat.c (original)
+++ subversion/branches/svn-auth-x509/subversion/libsvn_ra_serf/stat.c Tue Jan 27 23:27:44 2015
@@ -48,57 +48,41 @@
-static svn_error_t *
-fetch_path_props(apr_hash_t **props,
- svn_ra_serf__session_t *session,
- const char *session_relpath,
- svn_revnum_t revision,
- const svn_ra_serf__dav_props_t *desired_props,
- apr_pool_t *result_pool,
- apr_pool_t *scratch_pool)
+/* Implements svn_ra__vtable_t.check_path(). */
+svn_error_t *
+svn_ra_serf__check_path(svn_ra_session_t *ra_session,
+ const char *relpath,
+ svn_revnum_t revision,
+ svn_node_kind_t *kind,
+ apr_pool_t *scratch_pool)
{
+ svn_ra_serf__session_t *session = ra_session->priv;
+ apr_hash_t *props;
+ svn_error_t *err;
const char *url;
url = session->session_url.path;
/* If we have a relative path, append it. */
- if (session_relpath)
- url = svn_path_url_add_component2(url, session_relpath, scratch_pool);
+ if (relpath)
+ url = svn_path_url_add_component2(url, relpath, scratch_pool);
/* If we were given a specific revision, get a URL that refers to that
specific revision (rather than floating with HEAD). */
if (SVN_IS_VALID_REVNUM(revision))
{
SVN_ERR(svn_ra_serf__get_stable_url(&url, NULL /* latest_revnum */,
- session, NULL /* conn */,
+ session,
url, revision,
scratch_pool, scratch_pool));
}
/* URL is stable, so we use SVN_INVALID_REVNUM since it is now irrelevant.
Or we started with SVN_INVALID_REVNUM and URL may be floating. */
- SVN_ERR(svn_ra_serf__fetch_node_props(props, session->conns[0],
- url, SVN_INVALID_REVNUM,
- desired_props,
- result_pool, scratch_pool));
-
- return SVN_NO_ERROR;
-}
-
-/* Implements svn_ra__vtable_t.check_path(). */
-svn_error_t *
-svn_ra_serf__check_path(svn_ra_session_t *ra_session,
- const char *rel_path,
- svn_revnum_t revision,
- svn_node_kind_t *kind,
- apr_pool_t *pool)
-{
- svn_ra_serf__session_t *session = ra_session->priv;
- apr_hash_t *props;
-
- svn_error_t *err = fetch_path_props(&props, session, rel_path,
- revision, check_path_props,
- pool, pool);
+ err = svn_ra_serf__fetch_node_props(&props, session,
+ url, SVN_INVALID_REVNUM,
+ check_path_props,
+ scratch_pool, scratch_pool);
if (err && err->apr_err == SVN_ERR_FS_NOT_FOUND)
{
@@ -107,18 +91,35 @@ svn_ra_serf__check_path(svn_ra_session_t
}
else
{
+ apr_hash_t *dav_props;
+ const char *res_type;
+
/* Any other error, raise to caller. */
- if (err)
- return svn_error_trace(err);
+ SVN_ERR(err);
- SVN_ERR(svn_ra_serf__get_resource_type(kind, props));
+ dav_props = apr_hash_get(props, "DAV:", 4);
+ res_type = svn_prop_get_value(dav_props, "resourcetype");
+ if (!res_type)
+ {
+ /* How did this happen? */
+ return svn_error_create(SVN_ERR_RA_DAV_PROPS_NOT_FOUND, NULL,
+ _("The PROPFIND response did not include the "
+ "requested resourcetype value"));
+ }
+
+ if (strcmp(res_type, "collection") == 0)
+ *kind = svn_node_dir;
+ else
+ *kind = svn_node_file;
}
return SVN_NO_ERROR;
}
-struct dirent_walker_baton_t {
+/* Baton for fill_dirent_propfunc() */
+struct fill_dirent_baton_t
+{
/* Update the fields in this entry. */
svn_dirent_t *entry;
@@ -128,76 +129,78 @@ struct dirent_walker_baton_t {
apr_pool_t *result_pool;
};
+/* Implements svn_ra_serf__prop_func_t */
static svn_error_t *
-dirent_walker(void *baton,
- const char *ns,
- const char *name,
- const svn_string_t *val,
- apr_pool_t *scratch_pool)
+fill_dirent_propfunc(void *baton,
+ const char *path,
+ const char *ns,
+ const char *name,
+ const svn_string_t *val,
+ apr_pool_t *scratch_pool)
{
- struct dirent_walker_baton_t *dwb = baton;
+ struct fill_dirent_baton_t *fdb = baton;
- if (strcmp(ns, SVN_DAV_PROP_NS_CUSTOM) == 0)
- {
- dwb->entry->has_props = TRUE;
- }
- else if (strcmp(ns, SVN_DAV_PROP_NS_SVN) == 0)
- {
- dwb->entry->has_props = TRUE;
- }
- else if (strcmp(ns, SVN_DAV_PROP_NS_DAV) == 0)
- {
- if(strcmp(name, "deadprop-count") == 0)
- {
- if (*val->data)
- {
- apr_int64_t deadprop_count;
- SVN_ERR(svn_cstring_atoi64(&deadprop_count, val->data));
- dwb->entry->has_props = deadprop_count > 0;
- if (dwb->supports_deadprop_count)
- *dwb->supports_deadprop_count = svn_tristate_true;
- }
- else if (dwb->supports_deadprop_count)
- *dwb->supports_deadprop_count = svn_tristate_false;
- }
- }
- else if (strcmp(ns, "DAV:") == 0)
+ if (strcmp(ns, "DAV:") == 0)
{
if (strcmp(name, SVN_DAV__VERSION_NAME) == 0)
{
apr_int64_t rev;
SVN_ERR(svn_cstring_atoi64(&rev, val->data));
- dwb->entry->created_rev = (svn_revnum_t)rev;
+ fdb->entry->created_rev = (svn_revnum_t)rev;
}
else if (strcmp(name, "creator-displayname") == 0)
{
- dwb->entry->last_author = apr_pstrdup(dwb->result_pool, val->data);
+ fdb->entry->last_author = apr_pstrdup(fdb->result_pool, val->data);
}
else if (strcmp(name, SVN_DAV__CREATIONDATE) == 0)
{
- SVN_ERR(svn_time_from_cstring(&dwb->entry->time,
+ SVN_ERR(svn_time_from_cstring(&fdb->entry->time,
val->data,
- dwb->result_pool));
+ fdb->result_pool));
}
else if (strcmp(name, "getcontentlength") == 0)
{
/* 'getcontentlength' property is empty for directories. */
if (val->len)
{
- SVN_ERR(svn_cstring_atoi64(&dwb->entry->size, val->data));
+ SVN_ERR(svn_cstring_atoi64(&fdb->entry->size, val->data));
}
}
else if (strcmp(name, "resourcetype") == 0)
{
if (strcmp(val->data, "collection") == 0)
{
- dwb->entry->kind = svn_node_dir;
+ fdb->entry->kind = svn_node_dir;
}
else
{
- dwb->entry->kind = svn_node_file;
+ fdb->entry->kind = svn_node_file;
+ }
+ }
+ }
+ else if (strcmp(ns, SVN_DAV_PROP_NS_CUSTOM) == 0)
+ {
+ fdb->entry->has_props = TRUE;
+ }
+ else if (strcmp(ns, SVN_DAV_PROP_NS_SVN) == 0)
+ {
+ fdb->entry->has_props = TRUE;
+ }
+ else if (strcmp(ns, SVN_DAV_PROP_NS_DAV) == 0)
+ {
+ if(strcmp(name, "deadprop-count") == 0)
+ {
+ if (*val->data)
+ {
+ apr_int64_t deadprop_count;
+ SVN_ERR(svn_cstring_atoi64(&deadprop_count, val->data));
+ fdb->entry->has_props = deadprop_count > 0;
+ if (fdb->supports_deadprop_count)
+ *fdb->supports_deadprop_count = svn_tristate_true;
}
+ else if (fdb->supports_deadprop_count)
+ *fdb->supports_deadprop_count = svn_tristate_false;
}
}
@@ -279,21 +282,47 @@ get_dirent_props(apr_uint32_t dirent_fie
/* Implements svn_ra__vtable_t.stat(). */
svn_error_t *
svn_ra_serf__stat(svn_ra_session_t *ra_session,
- const char *rel_path,
+ const char *relpath,
svn_revnum_t revision,
svn_dirent_t **dirent,
apr_pool_t *pool)
{
svn_ra_serf__session_t *session = ra_session->priv;
- apr_hash_t *props;
svn_error_t *err;
- struct dirent_walker_baton_t dwb;
+ struct fill_dirent_baton_t fdb;
svn_tristate_t deadprop_count = svn_tristate_unknown;
+ svn_ra_serf__handler_t *handler;
+ const char *url;
+
+ url = session->session_url.path;
+
+ /* If we have a relative path, append it. */
+ if (relpath)
+ url = svn_path_url_add_component2(url, relpath, pool);
+
+ /* If we were given a specific revision, get a URL that refers to that
+ specific revision (rather than floating with HEAD). */
+ if (SVN_IS_VALID_REVNUM(revision))
+ {
+ SVN_ERR(svn_ra_serf__get_stable_url(&url, NULL /* latest_revnum */,
+ session,
+ url, revision,
+ pool, pool));
+ }
+
+ fdb.entry = svn_dirent_create(pool);
+ fdb.supports_deadprop_count = &deadprop_count;
+ fdb.result_pool = pool;
+
+ SVN_ERR(svn_ra_serf__create_propfind_handler(&handler, session, url,
+ SVN_INVALID_REVNUM, "0",
+ get_dirent_props(SVN_DIRENT_ALL,
+ session,
+ pool),
+ fill_dirent_propfunc, &fdb, pool));
+
+ err = svn_ra_serf__context_run_one(handler, pool);
- err = fetch_path_props(&props,
- session, rel_path, revision,
- get_dirent_props(SVN_DIRENT_ALL, session, pool),
- pool, pool);
if (err)
{
if (err->apr_err == SVN_ERR_FS_NOT_FOUND)
@@ -306,31 +335,22 @@ svn_ra_serf__stat(svn_ra_session_t *ra_s
return svn_error_trace(err);
}
- dwb.entry = svn_dirent_create(pool);
- dwb.supports_deadprop_count = &deadprop_count;
- dwb.result_pool = pool;
- SVN_ERR(svn_ra_serf__walk_node_props(props, dirent_walker, &dwb, pool));
-
if (deadprop_count == svn_tristate_false
&& session->supports_deadprop_count == svn_tristate_unknown
- && !dwb.entry->has_props)
+ && !fdb.entry->has_props)
{
/* We have to requery as the server didn't give us the right
information */
session->supports_deadprop_count = svn_tristate_false;
- SVN_ERR(fetch_path_props(&props,
- session, rel_path, SVN_INVALID_REVNUM,
- get_dirent_props(SVN_DIRENT_ALL, session, pool),
- pool, pool));
-
- SVN_ERR(svn_ra_serf__walk_node_props(props, dirent_walker, &dwb, pool));
+ /* Run the same handler again */
+ SVN_ERR(svn_ra_serf__context_run_one(handler, pool));
}
if (deadprop_count != svn_tristate_unknown)
session->supports_deadprop_count = deadprop_count;
- *dirent = dwb.entry;
+ *dirent = fdb.entry;
return SVN_NO_ERROR;
}
@@ -346,7 +366,7 @@ struct get_dir_baton_t
const char *path;
};
-/* Implements svn_ra_serf__prop_func */
+/* Implements svn_ra_serf__prop_func_t */
static svn_error_t *
get_dir_dirents_cb(void *baton,
const char *path,
@@ -362,22 +382,22 @@ get_dir_dirents_cb(void *baton,
if (relpath && relpath[0] != '\0')
{
- struct dirent_walker_baton_t dwb;
+ struct fill_dirent_baton_t fdb;
relpath = svn_path_uri_decode(relpath, scratch_pool);
- dwb.entry = svn_hash_gets(db->dirents, relpath);
+ fdb.entry = svn_hash_gets(db->dirents, relpath);
- if (!dwb.entry)
+ if (!fdb.entry)
{
- dwb.entry = svn_dirent_create(db->result_pool);
+ fdb.entry = svn_dirent_create(db->result_pool);
svn_hash_sets(db->dirents,
apr_pstrdup(db->result_pool, relpath),
- dwb.entry);
+ fdb.entry);
}
- dwb.result_pool = db->result_pool;
- dwb.supports_deadprop_count = &db->supports_deadprop_count;
- SVN_ERR(dirent_walker(&dwb, ns, name, value, scratch_pool));
+ fdb.result_pool = db->result_pool;
+ fdb.supports_deadprop_count = &db->supports_deadprop_count;
+ SVN_ERR(fill_dirent_propfunc(&fdb, path, ns, name, value, scratch_pool));
}
else if (relpath && !db->is_directory)
{
@@ -471,7 +491,7 @@ svn_ra_serf__get_dir(svn_ra_session_t *r
if (SVN_IS_VALID_REVNUM(revision) || fetched_rev)
{
SVN_ERR(svn_ra_serf__get_stable_url(&path, fetched_rev,
- session, NULL /* conn */,
+ session,
path, revision,
scratch_pool, scratch_pool));
revision = SVN_INVALID_REVNUM;
@@ -491,8 +511,8 @@ svn_ra_serf__get_dir(svn_ra_session_t *r
gdb.dirents = apr_hash_make(result_pool);
- SVN_ERR(svn_ra_serf__deliver_props2(&dirent_handler,
- session, session->conns[0],
+ SVN_ERR(svn_ra_serf__create_propfind_handler(
+ &dirent_handler, session,
path, SVN_INVALID_REVNUM, "1",
get_dirent_props(dirent_fields,
session,
@@ -508,8 +528,8 @@ svn_ra_serf__get_dir(svn_ra_session_t *r
if (ret_props)
{
gdb.ret_props = apr_hash_make(result_pool);
- SVN_ERR(svn_ra_serf__deliver_props2(&props_handler,
- session, session->conns[0],
+ SVN_ERR(svn_ra_serf__create_propfind_handler(
+ &props_handler, session,
path, SVN_INVALID_REVNUM, "0",
all_props,
get_dir_props_cb, &gdb,
@@ -526,9 +546,6 @@ svn_ra_serf__get_dir(svn_ra_session_t *r
session,
scratch_pool));
- if (dirent_handler->sline.code != 207)
- return svn_error_trace(svn_ra_serf__unexpected_status(dirent_handler));
-
if (gdb.supports_deadprop_count == svn_tristate_false
&& session->supports_deadprop_count == svn_tristate_unknown
&& dirent_fields & SVN_DIRENT_HAS_PROPS)
@@ -539,8 +556,8 @@ svn_ra_serf__get_dir(svn_ra_session_t *r
apr_hash_clear(gdb.dirents);
- SVN_ERR(svn_ra_serf__deliver_props2(&dirent_handler,
- session, session->conns[0],
+ SVN_ERR(svn_ra_serf__create_propfind_handler(
+ &dirent_handler, session,
path, SVN_INVALID_REVNUM, "1",
get_dirent_props(dirent_fields,
session,
@@ -557,9 +574,6 @@ svn_ra_serf__get_dir(svn_ra_session_t *r
SVN_ERR(svn_ra_serf__context_run_wait(&props_handler->done,
session,
scratch_pool));
-
- if (props_handler->sline.code != 207)
- return svn_error_trace(svn_ra_serf__unexpected_status(props_handler));
}
/* And dirent again for the case when we had to send the request again */
@@ -568,9 +582,6 @@ svn_ra_serf__get_dir(svn_ra_session_t *r
SVN_ERR(svn_ra_serf__context_run_wait(&dirent_handler->done,
session,
scratch_pool));
-
- if (dirent_handler->sline.code != 207)
- return svn_error_trace(svn_ra_serf__unexpected_status(dirent_handler));
}
if (gdb.supports_deadprop_count != svn_tristate_unknown)
Modified: subversion/branches/svn-auth-x509/subversion/libsvn_ra_serf/update.c
URL: http://svn.apache.org/viewvc/subversion/branches/svn-auth-x509/subversion/libsvn_ra_serf/update.c?rev=1655189&r1=1655188&r2=1655189&view=diff
==============================================================================
--- subversion/branches/svn-auth-x509/subversion/libsvn_ra_serf/update.c (original)
+++ subversion/branches/svn-auth-x509/subversion/libsvn_ra_serf/update.c Tue Jan 27 23:27:44 2015
@@ -931,7 +931,8 @@ ensure_file_opened(file_baton_t *file,
static svn_error_t *
headers_fetch(serf_bucket_t *headers,
void *baton,
- apr_pool_t *pool)
+ apr_pool_t *pool /* request pool */,
+ apr_pool_t *scratch_pool)
{
fetch_ctx_t *fetch_ctx = baton;
@@ -1428,7 +1429,7 @@ fetch_for_file(file_baton_t *file,
file->base_rev,
svn_path_uri_encode(
file->repos_relpath,
- file->pool));
+ scratch_pool));
}
else if (file->copyfrom_path)
{
@@ -1439,7 +1440,7 @@ fetch_for_file(file_baton_t *file,
file->copyfrom_rev,
svn_path_uri_encode(
file->copyfrom_path+1,
- file->pool));
+ scratch_pool));
}
}
else if (ctx->sess->wc_callbacks->get_wc_prop)
@@ -1460,13 +1461,12 @@ fetch_for_file(file_baton_t *file,
: NULL;
}
- handler = svn_ra_serf__create_handler(file->pool);
+ handler = svn_ra_serf__create_handler(ctx->sess, file->pool);
handler->method = "GET";
handler->path = file->url;
- handler->conn = conn;
- handler->session = ctx->sess;
+ handler->conn = conn; /* Explicit scheduling */
handler->custom_accept_encoding = TRUE;
handler->no_dav_headers = TRUE;
@@ -1493,12 +1493,13 @@ fetch_for_file(file_baton_t *file,
/* If needed, create the PROPFIND to retrieve the file's properties. */
if (file->fetch_props)
{
- SVN_ERR(svn_ra_serf__deliver_props2(&file->propfind_handler,
- ctx->sess, conn, file->url,
- ctx->target_rev, "0", all_props,
- set_file_props, file,
- file->pool));
- SVN_ERR_ASSERT(file->propfind_handler);
+ SVN_ERR(svn_ra_serf__create_propfind_handler(&file->propfind_handler,
+ ctx->sess, file->url,
+ ctx->target_rev, "0",
+ all_props,
+ set_file_props, file,
+ file->pool));
+ file->propfind_handler->conn = conn; /* Explicit scheduling */
file->propfind_handler->done_delegate = file_props_done;
file->propfind_handler->done_delegate_baton = file;
@@ -1590,13 +1591,14 @@ fetch_for_dir(dir_baton_t *dir,
/* If needed, create the PROPFIND to retrieve the file's properties. */
if (dir->fetch_props)
{
- SVN_ERR(svn_ra_serf__deliver_props2(&dir->propfind_handler,
- ctx->sess, conn, dir->url,
- ctx->target_rev, "0", all_props,
- set_dir_prop, dir,
- dir->pool));
- SVN_ERR_ASSERT(dir->propfind_handler);
+ SVN_ERR(svn_ra_serf__create_propfind_handler(&dir->propfind_handler,
+ ctx->sess, dir->url,
+ ctx->target_rev, "0",
+ all_props,
+ set_dir_prop, dir,
+ dir->pool));
+ dir->propfind_handler->conn = conn;
dir->propfind_handler->done_delegate = dir_props_done;
dir->propfind_handler->done_delegate_baton = dir;
@@ -2261,10 +2263,8 @@ link_path(void *report_baton,
_("Unable to parse URL '%s'"), url);
}
- SVN_ERR(svn_ra_serf__report_resource(&report_target, report->sess,
- NULL, pool));
- SVN_ERR(svn_ra_serf__get_relative_path(&link, uri.path, report->sess,
- NULL, pool));
+ SVN_ERR(svn_ra_serf__report_resource(&report_target, report->sess, pool));
+ SVN_ERR(svn_ra_serf__get_relative_path(&link, uri.path, report->sess, pool));
link = apr_pstrcat(pool, "/", link, SVN_VA_NULL);
@@ -2302,7 +2302,8 @@ static svn_error_t *
create_update_report_body(serf_bucket_t **body_bkt,
void *baton,
serf_bucket_alloc_t *alloc,
- apr_pool_t *pool)
+ apr_pool_t *pool /* request pool */,
+ apr_pool_t *scratch_pool)
{
report_context_t *report = baton;
body_create_baton_t *body = report->body;
@@ -2330,7 +2331,8 @@ create_update_report_body(serf_bucket_t
static svn_error_t *
setup_update_report_headers(serf_bucket_t *headers,
void *baton,
- apr_pool_t *pool)
+ apr_pool_t *pool /* request pool */,
+ apr_pool_t *scratch_pool)
{
report_context_t *report = baton;
@@ -2654,15 +2656,15 @@ finish_report(void *report_baton,
SVN_ERR(svn_stream_write(report->body_template, buf->data, &buf->len));
SVN_ERR(svn_stream_close(report->body_template));
- SVN_ERR(svn_ra_serf__report_resource(&report_target, sess, NULL,
- scratch_pool));
+ SVN_ERR(svn_ra_serf__report_resource(&report_target, sess, scratch_pool));
xmlctx = svn_ra_serf__xml_context_create(update_ttable,
update_opened, update_closed,
update_cdata,
report,
scratch_pool);
- handler = svn_ra_serf__create_expat_handler(xmlctx, NULL, scratch_pool);
+ handler = svn_ra_serf__create_expat_handler(sess, xmlctx, NULL,
+ scratch_pool);
handler->method = "REPORT";
handler->path = report_target;
@@ -2672,8 +2674,6 @@ finish_report(void *report_baton,
handler->custom_accept_encoding = TRUE;
handler->header_delegate = setup_update_report_headers;
handler->header_delegate_baton = report;
- handler->conn = sess->conns[0];
- handler->session = sess;
svn_ra_serf__request_create(handler);
Modified: subversion/branches/svn-auth-x509/subversion/libsvn_ra_serf/util.c
URL: http://svn.apache.org/viewvc/subversion/branches/svn-auth-x509/subversion/libsvn_ra_serf/util.c?rev=1655189&r1=1655188&r2=1655189&view=diff
==============================================================================
--- subversion/branches/svn-auth-x509/subversion/libsvn_ra_serf/util.c (original)
+++ subversion/branches/svn-auth-x509/subversion/libsvn_ra_serf/util.c Tue Jan 27 23:27:44 2015
@@ -567,6 +567,7 @@ accept_response(serf_request_t *request,
void *acceptor_baton,
apr_pool_t *pool)
{
+ /* svn_ra_serf__handler_t *handler = acceptor_baton; */
serf_bucket_t *c;
serf_bucket_alloc_t *bkt_alloc;
@@ -584,6 +585,7 @@ accept_head(serf_request_t *request,
void *acceptor_baton,
apr_pool_t *pool)
{
+ /* svn_ra_serf__handler_t *handler = acceptor_baton; */
serf_bucket_t *response;
response = accept_response(request, stream, acceptor_baton, pool);
@@ -601,7 +603,7 @@ connection_closed(svn_ra_serf__connectio
{
if (why)
{
- return svn_error_wrap_apr(why, NULL);
+ return svn_ra_serf__wrap_err(why, NULL);
}
if (conn->session->using_ssl)
@@ -831,9 +833,14 @@ setup_serf_req(serf_request_t *request,
serf_bucket_headers_setn(*hdrs_bkt, "Accept-Encoding", accept_encoding);
}
- /* These headers need to be sent with every request except GET; see
+ /* These headers need to be sent with every request that might need
+ capability processing (e.g. during commit, reports, etc.), see
issue #3255 ("mod_dav_svn does not pass client capabilities to
- start-commit hooks") for why. */
+ start-commit hooks") for why.
+
+ Some request types like GET/HEAD/PROPFIND are unaware of capability
+ handling; and in some cases the responses can even be cached by
+ proxies, so we don't have to send these hearders there. */
if (dav_headers)
{
serf_bucket_headers_setn(*hdrs_bkt, "DAV", SVN_DAV_NS_DAV_SVN_DEPTH);
@@ -1410,12 +1417,13 @@ static apr_status_t
handle_response_cb(serf_request_t *request,
serf_bucket_t *response,
void *baton,
- apr_pool_t *scratch_pool)
+ apr_pool_t *response_pool)
{
svn_ra_serf__handler_t *handler = baton;
svn_error_t *err;
apr_status_t inner_status;
apr_status_t outer_status;
+ apr_pool_t *scratch_pool = response_pool; /* Scratch pool needed? */
err = svn_error_trace(handle_response(request, response,
handler, &inner_status,
@@ -1470,9 +1478,8 @@ setup_request(serf_request_t *request,
{
serf_bucket_alloc_t *bkt_alloc = serf_request_get_alloc(request);
- /* ### should pass the scratch_pool */
SVN_ERR(handler->body_delegate(&body_bkt, handler->body_delegate_baton,
- bkt_alloc, request_pool));
+ bkt_alloc, request_pool, scratch_pool));
}
else
{
@@ -1501,10 +1508,9 @@ setup_request(serf_request_t *request,
if (handler->header_delegate)
{
- /* ### should pass the scratch_pool */
SVN_ERR(handler->header_delegate(headers_bkt,
handler->header_delegate_baton,
- request_pool));
+ request_pool, scratch_pool));
}
return SVN_NO_ERROR;
@@ -1521,27 +1527,29 @@ setup_request_cb(serf_request_t *request
void **acceptor_baton,
serf_response_handler_t *s_handler,
void **s_handler_baton,
- apr_pool_t *pool)
+ apr_pool_t *request_pool)
{
svn_ra_serf__handler_t *handler = setup_baton;
+ apr_pool_t *scratch_pool;
svn_error_t *err;
- /* ### construct a scratch_pool? serf gives us a pool that will live for
- ### the duration of the request. */
- apr_pool_t *scratch_pool = pool;
+ /* Construct a scratch_pool? serf gives us a pool that will live for
+ the duration of the request. But requests are retried in some cases */
+ scratch_pool = svn_pool_create(request_pool);
if (strcmp(handler->method, "HEAD") == 0)
*acceptor = accept_head;
else
*acceptor = accept_response;
- *acceptor_baton = handler->session;
+ *acceptor_baton = handler;
*s_handler = handle_response_cb;
*s_handler_baton = handler;
err = svn_error_trace(setup_request(request, handler, req_bkt,
- pool /* request_pool */, scratch_pool));
+ request_pool, scratch_pool));
+ svn_pool_destroy(scratch_pool);
return save_error(handler->session, err);
}
@@ -1579,8 +1587,7 @@ svn_ra_serf__request_create(svn_ra_serf_
svn_error_t *
svn_ra_serf__discover_vcc(const char **vcc_url,
svn_ra_serf__session_t *session,
- svn_ra_serf__connection_t *conn,
- apr_pool_t *pool)
+ apr_pool_t *scratch_pool)
{
const char *path;
const char *relative_path;
@@ -1593,12 +1600,6 @@ svn_ra_serf__discover_vcc(const char **v
return SVN_NO_ERROR;
}
- /* If no connection is provided, use the default one. */
- if (! conn)
- {
- conn = session->conns[0];
- }
-
path = session->session_url.path;
*vcc_url = NULL;
uuid = NULL;
@@ -1608,9 +1609,10 @@ svn_ra_serf__discover_vcc(const char **v
apr_hash_t *props;
svn_error_t *err;
- err = svn_ra_serf__fetch_node_props(&props, conn,
+ err = svn_ra_serf__fetch_node_props(&props, session,
path, SVN_INVALID_REVNUM,
- base_props, pool, pool);
+ base_props,
+ scratch_pool, scratch_pool);
if (! err)
{
apr_hash_t *ns_props;
@@ -1638,7 +1640,7 @@ svn_ra_serf__discover_vcc(const char **v
svn_error_clear(err);
/* Okay, strip off a component from PATH. */
- path = svn_urlpath__dirname(path, pool);
+ path = svn_urlpath__dirname(path, scratch_pool);
}
}
}
@@ -1664,7 +1666,7 @@ svn_ra_serf__discover_vcc(const char **v
{
svn_stringbuf_t *url_buf;
- url_buf = svn_stringbuf_create(path, pool);
+ url_buf = svn_stringbuf_create(path, scratch_pool);
svn_path_remove_components(url_buf,
svn_path_component_count(relative_path));
@@ -1692,7 +1694,6 @@ svn_error_t *
svn_ra_serf__get_relative_path(const char **rel_path,
const char *orig_path,
svn_ra_serf__session_t *session,
- svn_ra_serf__connection_t *conn,
apr_pool_t *pool)
{
const char *decoded_root, *decoded_orig;
@@ -1709,7 +1710,6 @@ svn_ra_serf__get_relative_path(const cha
promises to populate the session's root-url cache, and that's
what we really want. */
SVN_ERR(svn_ra_serf__discover_vcc(&vcc_url, session,
- conn ? conn : session->conns[0],
pool));
}
@@ -1723,7 +1723,6 @@ svn_ra_serf__get_relative_path(const cha
svn_error_t *
svn_ra_serf__report_resource(const char **report_target,
svn_ra_serf__session_t *session,
- svn_ra_serf__connection_t *conn,
apr_pool_t *pool)
{
/* If we have HTTP v2 support, we want to report against the 'me'
@@ -1733,7 +1732,7 @@ svn_ra_serf__report_resource(const char
/* Otherwise, we'll use the default VCC. */
else
- SVN_ERR(svn_ra_serf__discover_vcc(report_target, session, conn, pool));
+ SVN_ERR(svn_ra_serf__discover_vcc(report_target, session, pool));
return SVN_NO_ERROR;
}
@@ -1838,7 +1837,7 @@ svn_ra_serf__register_editor_shim_callba
return SVN_NO_ERROR;
}
-/* Shandard done_delegate handler */
+/* Shared/standard done_delegate handler */
static svn_error_t *
response_done(serf_request_t *request,
void *handler_baton,
@@ -1877,7 +1876,7 @@ static apr_status_t
handler_cleanup(void *baton)
{
svn_ra_serf__handler_t *handler = baton;
- if (handler->scheduled && handler->conn)
+ if (handler->scheduled && handler->conn && handler->conn->conn)
{
serf_connection_reset(handler->conn->conn);
}
@@ -1886,7 +1885,8 @@ handler_cleanup(void *baton)
}
svn_ra_serf__handler_t *
-svn_ra_serf__create_handler(apr_pool_t *result_pool)
+svn_ra_serf__create_handler(svn_ra_serf__session_t *session,
+ apr_pool_t *result_pool)
{
svn_ra_serf__handler_t *handler;
@@ -1896,6 +1896,9 @@ svn_ra_serf__create_handler(apr_pool_t *
apr_pool_cleanup_register(result_pool, handler, handler_cleanup,
apr_pool_cleanup_null);
+ handler->session = session;
+ handler->conn = session->conns[0];
+
/* Setup the default done handler, to handle server errors */
handler->done_delegate_baton = handler;
handler->done_delegate = response_done;
Modified: subversion/branches/svn-auth-x509/subversion/libsvn_ra_serf/xml.c
URL: http://svn.apache.org/viewvc/subversion/branches/svn-auth-x509/subversion/libsvn_ra_serf/xml.c?rev=1655189&r1=1655188&r2=1655189&view=diff
==============================================================================
--- subversion/branches/svn-auth-x509/subversion/libsvn_ra_serf/xml.c (original)
+++ subversion/branches/svn-auth-x509/subversion/libsvn_ra_serf/xml.c Tue Jan 27 23:27:44 2015
@@ -1087,7 +1087,8 @@ expat_response_handler(serf_request_t *r
svn_ra_serf__handler_t *
-svn_ra_serf__create_expat_handler(svn_ra_serf__xml_context_t *xmlctx,
+svn_ra_serf__create_expat_handler(svn_ra_serf__session_t *session,
+ svn_ra_serf__xml_context_t *xmlctx,
const int *expected_status,
apr_pool_t *result_pool)
{
@@ -1100,7 +1101,7 @@ svn_ra_serf__create_expat_handler(svn_ra
ectx->expected_status = expected_status;
ectx->cleanup_pool = result_pool;
- handler = svn_ra_serf__create_handler(result_pool);
+ handler = svn_ra_serf__create_handler(session, result_pool);
handler->response_handler = expat_response_handler;
handler->response_baton = ectx;
Modified: subversion/branches/svn-auth-x509/subversion/libsvn_repos/commit.c
URL: http://svn.apache.org/viewvc/subversion/branches/svn-auth-x509/subversion/libsvn_repos/commit.c?rev=1655189&r1=1655188&r2=1655189&view=diff
==============================================================================
--- subversion/branches/svn-auth-x509/subversion/libsvn_repos/commit.c (original)
+++ subversion/branches/svn-auth-x509/subversion/libsvn_repos/commit.c Tue Jan 27 23:27:44 2015
@@ -73,7 +73,7 @@ struct edit_baton
svn_repos_t *repos;
/* URL to the root of the open repository. */
- const char *repos_url;
+ const char *repos_url_decoded;
/* The name of the repository (here for convenience). */
const char *repos_name;
@@ -262,7 +262,9 @@ make_dir_baton(struct edit_baton *edit_b
/* This function is the shared guts of add_file() and add_directory(),
which see for the meanings of the parameters. The only extra
parameter here is IS_DIR, which is TRUE when adding a directory,
- and FALSE when adding a file. */
+ and FALSE when adding a file.
+
+ COPY_PATH must be a full URL, not a relative path. */
static svn_error_t *
add_file_or_directory(const char *path,
void *parent_baton,
@@ -317,8 +319,8 @@ add_file_or_directory(const char *path,
/* For now, require that the url come from the same repository
that this commit is operating on. */
copy_path = svn_path_uri_decode(copy_path, subpool);
- repos_url_len = strlen(eb->repos_url);
- if (strncmp(copy_path, eb->repos_url, repos_url_len) != 0)
+ repos_url_len = strlen(eb->repos_url_decoded);
+ if (strncmp(copy_path, eb->repos_url_decoded, repos_url_len) != 0)
return svn_error_createf
(SVN_ERR_FS_GENERAL, NULL,
_("Source url '%s' is from different repository"), copy_path);
@@ -932,7 +934,7 @@ svn_repos_get_commit_editor5(const svn_d
void **edit_baton,
svn_repos_t *repos,
svn_fs_txn_t *txn,
- const char *repos_url,
+ const char *repos_url_decoded,
const char *base_path,
apr_hash_t *revprop_table,
svn_commit_callback2_t commit_callback,
@@ -946,6 +948,7 @@ svn_repos_get_commit_editor5(const svn_d
struct edit_baton *eb;
svn_delta_shim_callbacks_t *shim_callbacks =
svn_delta_shim_callbacks_default(pool);
+ const char *repos_url = svn_path_uri_encode(repos_url_decoded, pool);
/* Do a global authz access lookup. Users with no write access
whatsoever to the repository don't get a commit editor. */
@@ -987,7 +990,7 @@ svn_repos_get_commit_editor5(const svn_d
eb->authz_baton = authz_baton;
eb->base_path = svn_fspath__canonicalize(base_path, subpool);
eb->repos = repos;
- eb->repos_url = repos_url;
+ eb->repos_url_decoded = repos_url_decoded;
eb->repos_name = svn_dirent_basename(svn_repos_path(repos, subpool),
subpool);
eb->fs = svn_repos_fs(repos);
@@ -1003,7 +1006,7 @@ svn_repos_get_commit_editor5(const svn_d
shim_callbacks->fetch_baton = eb;
SVN_ERR(svn_editor__insert_shims(editor, edit_baton, *editor, *edit_baton,
- eb->repos_url, eb->base_path,
+ repos_url, eb->base_path,
shim_callbacks, pool, pool));
return SVN_NO_ERROR;