Return-Path: X-Original-To: apmail-subversion-commits-archive@minotaur.apache.org Delivered-To: apmail-subversion-commits-archive@minotaur.apache.org Received: from mail.apache.org (hermes.apache.org [140.211.11.3]) by minotaur.apache.org (Postfix) with SMTP id 26550D244 for ; Fri, 14 Sep 2012 18:15:55 +0000 (UTC) Received: (qmail 53840 invoked by uid 500); 14 Sep 2012 18:15:55 -0000 Delivered-To: apmail-subversion-commits-archive@subversion.apache.org Received: (qmail 53789 invoked by uid 500); 14 Sep 2012 18:15:55 -0000 Mailing-List: contact commits-help@subversion.apache.org; run by ezmlm Precedence: bulk List-Help: List-Unsubscribe: List-Post: List-Id: Reply-To: dev@subversion.apache.org Delivered-To: mailing list commits@subversion.apache.org Received: (qmail 53781 invoked by uid 99); 14 Sep 2012 18:15:54 -0000 Received: from nike.apache.org (HELO nike.apache.org) (192.87.106.230) by apache.org (qpsmtpd/0.29) with ESMTP; Fri, 14 Sep 2012 18:15:54 +0000 X-ASF-Spam-Status: No, hits=-2000.0 required=5.0 tests=ALL_TRUSTED X-Spam-Check-By: apache.org Received: from [140.211.11.4] (HELO eris.apache.org) (140.211.11.4) by apache.org (qpsmtpd/0.29) with ESMTP; Fri, 14 Sep 2012 18:15:51 +0000 Received: from eris.apache.org (localhost [127.0.0.1]) by eris.apache.org (Postfix) with ESMTP id 2EBBC23888CD; Fri, 14 Sep 2012 18:15:07 +0000 (UTC) Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Subject: svn commit: r1384873 - in /subversion/branches/inheritable-props/subversion/libsvn_ra: compat.c ra_loader.c ra_loader.h Date: Fri, 14 Sep 2012 18:15:06 -0000 To: commits@subversion.apache.org From: cmpilato@apache.org X-Mailer: svnmailer-1.0.8-patched Message-Id: <20120914181507.2EBBC23888CD@eris.apache.org> Author: cmpilato Date: Fri Sep 14 18:15:06 2012 New Revision: 1384873 URL: http://svn.apache.org/viewvc?rev=1384873&view=rev Log: On the 'inheritable-props' branch: Move an RA compatability fallback function into the source file where other RA compatability fallback functions live. No real logic changes here. * subversion/libsvn_ra/ra_loader.h (svn_ra__get_inherited_props_walk): New function prototype. * subversion/libsvn_ra/compat.c (svn_ra__get_inherited_props_walk): Move (and renamed) here... * subversion/libsvn_ra/ra_loader.c (get_inherited_props): ...from here. (svn_ra_get_file2, svn_ra_get_dir3): Track renamed function. (svn_ra_get_inherited_props): Track renamed function, and rework logic to avoid an early return. Modified: subversion/branches/inheritable-props/subversion/libsvn_ra/compat.c subversion/branches/inheritable-props/subversion/libsvn_ra/ra_loader.c subversion/branches/inheritable-props/subversion/libsvn_ra/ra_loader.h Modified: subversion/branches/inheritable-props/subversion/libsvn_ra/compat.c URL: http://svn.apache.org/viewvc/subversion/branches/inheritable-props/subversion/libsvn_ra/compat.c?rev=1384873&r1=1384872&r2=1384873&view=diff ============================================================================== --- subversion/branches/inheritable-props/subversion/libsvn_ra/compat.c (original) +++ subversion/branches/inheritable-props/subversion/libsvn_ra/compat.c Fri Sep 14 18:15:06 2012 @@ -871,3 +871,89 @@ svn_ra__get_deleted_rev_from_log(svn_ra_ *revision_deleted = log_path_deleted_baton.revision_deleted; return SVN_NO_ERROR; } + + +svn_error_t * +svn_ra__get_inherited_props_walk(svn_ra_session_t *session, + const char *path, + svn_revnum_t revision, + apr_array_header_t **inherited_props, + apr_pool_t *result_pool, + apr_pool_t *scratch_pool) +{ + const char *repos_root_url; + const char *session_url; + const char *parent_url; + apr_pool_t *iterpool = svn_pool_create(scratch_pool); + + *inherited_props = + apr_array_make(result_pool, 1, sizeof(svn_prop_inherited_item_t *)); + + /* Walk to the root of the repository getting inherited + props for PATH. */ + SVN_ERR(svn_ra_get_repos_root2(session, &repos_root_url, scratch_pool)); + SVN_ERR(svn_ra_get_session_url(session, &session_url, scratch_pool)); + parent_url = session_url; + + while (strcmp(repos_root_url, parent_url)) + { + apr_hash_index_t *hi; + apr_hash_t *parent_props; + apr_hash_t *final_hash = apr_hash_make(result_pool); + svn_error_t *err; + + svn_pool_clear(iterpool); + parent_url = svn_uri_dirname(parent_url, iterpool); + SVN_ERR(svn_ra_reparent(session, parent_url, iterpool)); + err = session->vtable->get_dir(session, NULL, NULL, + &parent_props, NULL, "", + revision, SVN_DIRENT_ALL, + iterpool, iterpool); + + /* If the user doesn't have read access to a parent path then + skip, but allow them to inherit from further up. */ + if (err) + { + if (err->apr_err == SVN_ERR_RA_NOT_AUTHORIZED) + { + svn_error_clear(err); + continue; + } + else + { + return svn_error_trace(err); + } + } + + for (hi = apr_hash_first(scratch_pool, parent_props); + hi; + hi = apr_hash_next(hi)) + { + const char *name = svn__apr_hash_index_key(hi); + apr_ssize_t klen = svn__apr_hash_index_klen(hi); + svn_string_t *value = svn__apr_hash_index_val(hi); + + if (svn_property_kind(NULL, name) == svn_prop_regular_kind) + { + name = apr_pstrdup(result_pool, name); + value = svn_string_dup(value, result_pool); + apr_hash_set(final_hash, name, klen, value); + } + } + + if (apr_hash_count(final_hash)) + { + svn_prop_inherited_item_t *new_iprop = + apr_palloc(result_pool, sizeof(*new_iprop)); + new_iprop->path_or_url = apr_pstrdup(result_pool, parent_url); + new_iprop->prop_hash = final_hash; + svn_sort__array_insert(&new_iprop, *inherited_props, 0); + } + } + + /* Reparent session back to original URL. */ + SVN_ERR(svn_ra_reparent(session, session_url, scratch_pool)); + + svn_pool_destroy(iterpool); + return SVN_NO_ERROR; +} Modified: subversion/branches/inheritable-props/subversion/libsvn_ra/ra_loader.c URL: http://svn.apache.org/viewvc/subversion/branches/inheritable-props/subversion/libsvn_ra/ra_loader.c?rev=1384873&r1=1384872&r2=1384873&view=diff ============================================================================== --- subversion/branches/inheritable-props/subversion/libsvn_ra/ra_loader.c (original) +++ subversion/branches/inheritable-props/subversion/libsvn_ra/ra_loader.c Fri Sep 14 18:15:06 2012 @@ -738,95 +738,6 @@ svn_error_t *svn_ra_get_commit_editor3(s lock_tokens, keep_locks, pool); } -/* Helper for svn_ra_get_file2 and svn_ra_get_dir3 when those APIs need to - find PATH's inherited properties on a legacy server that doesn't have the - SVN_RA_CAPABILITY_INHERITED_PROPS capability. - - All arguments are as per the two aforementioned APIs. */ -static svn_error_t* -get_inherited_props(svn_ra_session_t *session, - const char *path, - svn_revnum_t revision, - apr_array_header_t **inherited_props, - apr_pool_t *result_pool, - apr_pool_t *scratch_pool) -{ - const char *repos_root_url; - const char *session_url; - const char *parent_url; - apr_pool_t *iterpool = svn_pool_create(scratch_pool); - - *inherited_props = - apr_array_make(result_pool, 1, sizeof(svn_prop_inherited_item_t *)); - - /* Walk to the root of the repository getting inherited - props for PATH. */ - SVN_ERR(svn_ra_get_repos_root2(session, &repos_root_url, scratch_pool)); - SVN_ERR(svn_ra_get_session_url(session, &session_url, scratch_pool)); - parent_url = session_url; - - while (strcmp(repos_root_url, parent_url)) - { - apr_hash_index_t *hi; - apr_hash_t *parent_props; - apr_hash_t *final_hash = apr_hash_make(result_pool); - svn_error_t *err; - - svn_pool_clear(iterpool); - parent_url = svn_uri_dirname(parent_url, iterpool); - SVN_ERR(svn_ra_reparent(session, parent_url, iterpool)); - err = session->vtable->get_dir(session, NULL, NULL, - &parent_props, NULL, "", - revision, SVN_DIRENT_ALL, - iterpool, iterpool); - - /* If the user doesn't have read access to a parent path then - skip, but allow them to inherit from further up. */ - if (err) - { - if (err->apr_err == SVN_ERR_RA_NOT_AUTHORIZED) - { - svn_error_clear(err); - continue; - } - else - { - return svn_error_trace(err); - } - } - - for (hi = apr_hash_first(scratch_pool, parent_props); - hi; - hi = apr_hash_next(hi)) - { - const char *name = svn__apr_hash_index_key(hi); - apr_ssize_t klen = svn__apr_hash_index_klen(hi); - svn_string_t *value = svn__apr_hash_index_val(hi); - - if (svn_property_kind(NULL, name) == svn_prop_regular_kind) - { - name = apr_pstrdup(result_pool, name); - value = svn_string_dup(value, result_pool); - apr_hash_set(final_hash, name, klen, value); - } - } - - if (apr_hash_count(final_hash)) - { - svn_prop_inherited_item_t *new_iprop = - apr_palloc(result_pool, sizeof(*new_iprop)); - new_iprop->path_or_url = apr_pstrdup(result_pool, parent_url); - new_iprop->prop_hash = final_hash; - svn_sort__array_insert(&new_iprop, *inherited_props, 0); - } - } - - /* Reparent session back to original URL. */ - SVN_ERR(svn_ra_reparent(session, session_url, scratch_pool)); - - svn_pool_destroy(iterpool); - return SVN_NO_ERROR; -} svn_error_t *svn_ra_get_file2(svn_ra_session_t *session, const char *path, @@ -861,9 +772,9 @@ svn_error_t *svn_ra_get_file2(svn_ra_ses SVN_ERR(session->vtable->get_file(session, path, revision, stream, fetched_rev, props, NULL, result_pool, scratch_pool)); - SVN_ERR(get_inherited_props(session, path, revision, - inherited_props, result_pool, - scratch_pool)); + SVN_ERR(svn_ra__get_inherited_props_walk(session, path, revision, + inherited_props, + result_pool, scratch_pool)); } } else @@ -912,9 +823,9 @@ svn_ra_get_dir3(svn_ra_session_t *sessio props, NULL, path, revision, dirent_fields, result_pool, scratch_pool)); - SVN_ERR(get_inherited_props(session, path, revision, - inherited_props, result_pool, - scratch_pool)); + SVN_ERR(svn_ra__get_inherited_props_walk(session, path, revision, + inherited_props, + result_pool, scratch_pool)); } } else @@ -1439,12 +1350,19 @@ svn_ra_get_inherited_props(svn_ra_sessio scratch_pool)); if (iprop_capable) - return svn_error_trace(session->vtable->get_inherited_props( - session, iprops, path, revision, result_pool, scratch_pool)); - /* Fallback for legacy servers. */ - return svn_error_trace(get_inherited_props(session, path, revision, - iprops, result_pool, - scratch_pool)); + { + SVN_ERR(session->vtable->get_inherited_props(session, iprops, path, + revision, result_pool, + scratch_pool)); + } + else + { + /* Fallback for legacy servers. */ + SVN_ERR(svn_ra__get_inherited_props_walk(session, path, revision, iprops, + result_pool, scratch_pool)); + } + + return SVN_NO_ERROR; } svn_error_t * Modified: subversion/branches/inheritable-props/subversion/libsvn_ra/ra_loader.h URL: http://svn.apache.org/viewvc/subversion/branches/inheritable-props/subversion/libsvn_ra/ra_loader.h?rev=1384873&r1=1384872&r2=1384873&view=diff ============================================================================== --- subversion/branches/inheritable-props/subversion/libsvn_ra/ra_loader.h (original) +++ subversion/branches/inheritable-props/subversion/libsvn_ra/ra_loader.h Fri Sep 14 18:15:06 2012 @@ -483,6 +483,21 @@ svn_ra__get_deleted_rev_from_log(svn_ra_ apr_pool_t *pool); +/** + * Fallback logic for svn_ra_get_fileX and svn_ra_get_dirX when those APIs + * need to find PATH's inherited properties on a legacy server that + * doesn't have the SVN_RA_CAPABILITY_INHERITED_PROPS capability. + * + * All arguments are as per the two aforementioned APIs. + */ +svn_error_t * +svn_ra__get_inherited_props_walk(svn_ra_session_t *session, + const char *path, + svn_revnum_t revision, + apr_array_header_t **inherited_props, + apr_pool_t *result_pool, + apr_pool_t *scratch_pool); + /* Utility function to provide a shim between a returned Ev2 and an RA provider's Ev1-based commit editor.