Author: pburba Date: Thu Dec 20 21:19:08 2012 New Revision: 1424708 URL: http://svn.apache.org/viewvc?rev=1424708&view=rev Log: Store repos root relative paths in NODES.INHERITED_PROPS rather than full URLs.
See http://svn.haxx.se/dev/archive-2012-12/0427.shtml * subversion/include/svn_ra.h (svn_ra_get_inherited_props): Add a new argument allowing the API to retrieve an array of svn_prop_inherited_item_t items with the path_or_url member set to either a URL or (new) a repos relpath. * subversion/libsvn_client/client.h (svn_client__get_inheritable_props): Same as svn_ra_get_inherited_props(). * subversion/libsvn_client/externals.c (switch_file_external): * subversion/libsvn_client/update.c (update_internal): * subversion/libsvn_client/switch.c (switch_internal): Update calls to svn_ra_get_inherited_props() in all these functions, getting svn_prop_inherited_item_t's keyed on relpaths rather than URLs as before. * subversion/libsvn_client/iprops.c (svn_client__get_inheritable_props): Implement new argument. * subversion/libsvn_client/prop_commands.c (remote_propget, remote_proplist): Update call to svn_ra_get_inherited_props(), getting svn_prop_inherited_item_t's keyed on URLs as before. * subversion/libsvn_ra/ra_loader.c (svn_ra_get_inherited_props): Implement new argument. * subversion/libsvn_wc/wc_db.c (read_inherited_props_baton_t): Add new member tracking the repos root URL. (db_read_inherited_props): Convert repos rel paths to URLs in output. (svn_wc__db_read_inherited_props): Initialize new baton member. Modified: subversion/trunk/subversion/include/svn_ra.h subversion/trunk/subversion/libsvn_client/client.h subversion/trunk/subversion/libsvn_client/externals.c subversion/trunk/subversion/libsvn_client/iprops.c subversion/trunk/subversion/libsvn_client/prop_commands.c subversion/trunk/subversion/libsvn_client/switch.c subversion/trunk/subversion/libsvn_client/update.c subversion/trunk/subversion/libsvn_ra/ra_loader.c subversion/trunk/subversion/libsvn_wc/wc_db.c Modified: subversion/trunk/subversion/include/svn_ra.h URL: http://svn.apache.org/viewvc/subversion/trunk/subversion/include/svn_ra.h?rev=1424708&r1=1424707&r2=1424708&view=diff ============================================================================== --- subversion/trunk/subversion/include/svn_ra.h (original) +++ subversion/trunk/subversion/include/svn_ra.h Thu Dec 20 21:19:08 2012 @@ -1930,6 +1930,12 @@ svn_ra_get_deleted_rev(svn_ra_session_t * inheritable properties are found, then set @a *inherited_props to * an empty array. * + * If @a use_relpath_keys is true, then the + * #svn_prop_inherited_item_t->path_or_url members of the + * #svn_prop_inherited_item_t * structures in @a *inherited_props are + * paths relative to the repository root URL (of the repository which + * @a ra_session is associated). Otherwise these members are URLs. + * * Allocated @a *inherited_props in @a result_pool, use @a scratch_pool * for temporary allocations. * @@ -1940,6 +1946,7 @@ svn_ra_get_inherited_props(svn_ra_sessio apr_array_header_t **inherited_props, const char *path, svn_revnum_t revision, + svn_boolean_t use_relpath_keys, apr_pool_t *result_pool, apr_pool_t *scratch_pool); Modified: subversion/trunk/subversion/libsvn_client/client.h URL: http://svn.apache.org/viewvc/subversion/trunk/subversion/libsvn_client/client.h?rev=1424708&r1=1424707&r2=1424708&view=diff ============================================================================== --- subversion/trunk/subversion/libsvn_client/client.h (original) +++ subversion/trunk/subversion/libsvn_client/client.h Thu Dec 20 21:19:08 2012 @@ -653,7 +653,10 @@ svn_client__list_internal(const char *pa as any WC roots under LOCAL_ABSPATH (as limited by DEPTH) using RA_SESSION. Store the results in *WCROOT_IPROPS, a hash mapping const char * absolute working copy paths to depth-first ordered arrays - of svn_prop_inherited_item_t * structures. + of svn_prop_inherited_item_t * structures. If WANT_RELPATH_KEYS is true, + then any svn_prop_inherited_item_t->path_or_url members returned in + *WCROOT_IPROPS are repository relative paths, otherwise these members are + URLs. If LOCAL_ABSPATH has no base then do nothing. @@ -668,6 +671,7 @@ svn_client__get_inheritable_props(apr_ha const char *local_abspath, svn_revnum_t revision, svn_depth_t depth, + svn_boolean_t use_relpath_keys, svn_ra_session_t *ra_session, svn_client_ctx_t *ctx, apr_pool_t *result_pool, Modified: subversion/trunk/subversion/libsvn_client/externals.c URL: http://svn.apache.org/viewvc/subversion/trunk/subversion/libsvn_client/externals.c?rev=1424708&r1=1424707&r2=1424708&view=diff ============================================================================== --- subversion/trunk/subversion/libsvn_client/externals.c (original) +++ subversion/trunk/subversion/libsvn_client/externals.c Thu Dec 20 21:19:08 2012 @@ -484,7 +484,8 @@ switch_file_external(const char *local_a ctx, subpool)); /* Get the external file's iprops. */ SVN_ERR(svn_ra_get_inherited_props(ra_session, &inherited_props, "", - switch_loc->rev, subpool, subpool)); + switch_loc->rev, TRUE, + subpool, subpool)); SVN_ERR(svn_ra_reparent(ra_session, svn_uri_dirname(url, subpool), subpool)); Modified: subversion/trunk/subversion/libsvn_client/iprops.c URL: http://svn.apache.org/viewvc/subversion/trunk/subversion/libsvn_client/iprops.c?rev=1424708&r1=1424707&r2=1424708&view=diff ============================================================================== --- subversion/trunk/subversion/libsvn_client/iprops.c (original) +++ subversion/trunk/subversion/libsvn_client/iprops.c Thu Dec 20 21:19:08 2012 @@ -81,6 +81,7 @@ svn_client__get_inheritable_props(apr_ha const char *local_abspath, svn_revnum_t revision, svn_depth_t depth, + svn_boolean_t use_relpath_keys, svn_ra_session_t *ra_session, svn_client_ctx_t *ctx, apr_pool_t *result_pool, @@ -163,8 +164,8 @@ svn_client__get_inheritable_props(apr_ha } SVN_ERR(svn_ra_get_inherited_props(ra_session, &inherited_props, - "", revision, result_pool, - iterpool)); + "", revision, use_relpath_keys, + result_pool, iterpool)); apr_hash_set(*wcroot_iprops, apr_pstrdup(result_pool, child_abspath), APR_HASH_KEY_STRING, Modified: subversion/trunk/subversion/libsvn_client/prop_commands.c URL: http://svn.apache.org/viewvc/subversion/trunk/subversion/libsvn_client/prop_commands.c?rev=1424708&r1=1424707&r2=1424708&view=diff ============================================================================== --- subversion/trunk/subversion/libsvn_client/prop_commands.c (original) +++ subversion/trunk/subversion/libsvn_client/prop_commands.c Thu Dec 20 21:19:08 2012 @@ -639,7 +639,7 @@ remote_propget(apr_hash_t *props, /* We will filter out all but PROPNAME later, making a final copy in RESULT_POOL, so pass SCRATCH_POOL for both pools. */ SVN_ERR(svn_ra_get_inherited_props(ra_session, inherited_props, - target_relative, revnum, + target_relative, revnum, FALSE, scratch_pool, scratch_pool)); } @@ -1125,7 +1125,7 @@ remote_proplist(const char *target_prefi if (get_target_inherited_props) SVN_ERR(svn_ra_get_inherited_props(ra_session, &inherited_props, - target_relative, revnum, + target_relative, revnum, FALSE, result_pool, scratch_pool)); else inherited_props = NULL; Modified: subversion/trunk/subversion/libsvn_client/switch.c URL: http://svn.apache.org/viewvc/subversion/trunk/subversion/libsvn_client/switch.c?rev=1424708&r1=1424707&r2=1424708&view=diff ============================================================================== --- subversion/trunk/subversion/libsvn_client/switch.c (original) +++ subversion/trunk/subversion/libsvn_client/switch.c Thu Dec 20 21:19:08 2012 @@ -267,7 +267,7 @@ switch_internal(svn_revnum_t *result_rev if (needs_iprop_cache) { SVN_ERR(svn_ra_get_inherited_props(ra_session, &inherited_props, - "", switch_loc->rev, pool, + "", switch_loc->rev, TRUE, pool, pool)); apr_hash_set(wcroot_iprops, local_abspath, APR_HASH_KEY_STRING, inherited_props); Modified: subversion/trunk/subversion/libsvn_client/update.c URL: http://svn.apache.org/viewvc/subversion/trunk/subversion/libsvn_client/update.c?rev=1424708&r1=1424707&r2=1424708&view=diff ============================================================================== --- subversion/trunk/subversion/libsvn_client/update.c (original) +++ subversion/trunk/subversion/libsvn_client/update.c Thu Dec 20 21:19:08 2012 @@ -377,8 +377,8 @@ update_internal(svn_revnum_t *result_rev dfb.anchor_url = anchor_loc->url; err = svn_client__get_inheritable_props(&wcroot_iprops, local_abspath, - revnum, depth, ra_session, ctx, - pool, pool); + revnum, depth, TRUE, ra_session, + ctx, pool, pool); /* We might be trying to update to a non-existant path-rev. */ if (err) Modified: subversion/trunk/subversion/libsvn_ra/ra_loader.c URL: http://svn.apache.org/viewvc/subversion/trunk/subversion/libsvn_ra/ra_loader.c?rev=1424708&r1=1424707&r2=1424708&view=diff ============================================================================== --- subversion/trunk/subversion/libsvn_ra/ra_loader.c (original) +++ subversion/trunk/subversion/libsvn_ra/ra_loader.c Thu Dec 20 21:19:08 2012 @@ -1298,6 +1298,7 @@ svn_ra_get_inherited_props(svn_ra_sessio apr_array_header_t **iprops, const char *path, svn_revnum_t revision, + svn_boolean_t use_relpath_keys, apr_pool_t *result_pool, apr_pool_t *scratch_pool) { @@ -1323,6 +1324,23 @@ svn_ra_get_inherited_props(svn_ra_sessio result_pool, scratch_pool)); } + if (use_relpath_keys && (*iprops)->nelts) + { + const char *repos_root_url; + int i; + + SVN_ERR(svn_ra_get_repos_root2(session, &repos_root_url, scratch_pool)); + for (i = 0; i < (*iprops)->nelts; i++) + { + svn_prop_inherited_item_t *elt = + APR_ARRAY_IDX(*iprops, i, svn_prop_inherited_item_t *); + elt->path_or_url = + svn_dirent_skip_ancestor(repos_root_url, elt->path_or_url); + elt->path_or_url = svn_path_uri_decode(elt->path_or_url, + result_pool); + } + } + return SVN_NO_ERROR; } Modified: subversion/trunk/subversion/libsvn_wc/wc_db.c URL: http://svn.apache.org/viewvc/subversion/trunk/subversion/libsvn_wc/wc_db.c?rev=1424708&r1=1424707&r2=1424708&view=diff ============================================================================== --- subversion/trunk/subversion/libsvn_wc/wc_db.c (original) +++ subversion/trunk/subversion/libsvn_wc/wc_db.c Thu Dec 20 21:19:08 2012 @@ -9151,6 +9151,7 @@ struct read_inherited_props_baton_t { apr_array_header_t *iprops; const char *propname; + const char *repos_root_url; apr_pool_t *result_pool; }; @@ -9273,7 +9274,15 @@ db_read_inherited_props(void *baton, /* If we didn't filter everything then keep this iprop. */ if (apr_hash_count(cached_iprop->prop_hash)) - svn_sort__array_insert(&cached_iprop, ripb->iprops, 0); + { + /* Convert the repository relative path in the + cache to a full URL. */ + cached_iprop->path_or_url = + svn_path_url_add_component2(ripb->repos_root_url, + cached_iprop->path_or_url, + result_pool); + svn_sort__array_insert(&cached_iprop, ripb->iprops, 0); + } } } @@ -9292,9 +9301,14 @@ svn_wc__db_read_inherited_props(apr_arra svn_wc__db_wcroot_t *wcroot; const char *local_relpath; struct read_inherited_props_baton_t ripb; + const char *repos_root_url; SVN_ERR_ASSERT(svn_dirent_is_absolute(local_abspath)); + SVN_ERR(svn_wc__internal_get_repos_info(&repos_root_url, NULL, db, + local_abspath, scratch_pool, + scratch_pool)); + SVN_ERR(svn_wc__db_wcroot_parse_local_abspath(&wcroot, &local_relpath, db, local_abspath, scratch_pool, scratch_pool)); @@ -9302,6 +9316,7 @@ svn_wc__db_read_inherited_props(apr_arra ripb.iprops = NULL; ripb.propname = propname; + ripb.repos_root_url = repos_root_url; ripb.result_pool = result_pool; SVN_ERR(svn_wc__db_with_txn(wcroot, local_relpath, db_read_inherited_props,
