Author: rhuijben Date: Wed Aug 4 20:45:46 2010 New Revision: 982397 URL: http://svn.apache.org/viewvc?rev=982397&view=rev Log: Reintroduce svn_wc_props_modified_p2() to allow cheap access to the wc_db knowledge about whether properties are modified. Clients like TortoiseSVN and AnkhSVN will use this or a similar libsvn_client api which will wrap this api to determine if properties are changed in their status caches.
* subversion/include/svn_wc.h (svn_wc_props_modified_p2): New function. (svn_wc_props_modified_p): Refer to svn_wc_props_modified_p2 instead of a function that retrieves all modified property values. * subversion/libsvn_wc/deprecated.c (svn_wc_props_modified_p): Use svn_wc_props_modified_p2 instead of the internal version. * subversion/libsvn_wc/props.c (svn_wc__props_modified): Just fetch the props_modified boolean from svn_wc__db_read_info. No need to read the real data as properties not NULL in ACTUAL defines that there are property changes. (svn_wc_props_modified_p2): New function. Modified: subversion/trunk/subversion/include/svn_wc.h subversion/trunk/subversion/libsvn_wc/deprecated.c subversion/trunk/subversion/libsvn_wc/props.c Modified: subversion/trunk/subversion/include/svn_wc.h URL: http://svn.apache.org/viewvc/subversion/trunk/subversion/include/svn_wc.h?rev=982397&r1=982396&r2=982397&view=diff ============================================================================== --- subversion/trunk/subversion/include/svn_wc.h (original) +++ subversion/trunk/subversion/include/svn_wc.h Wed Aug 4 20:45:46 2010 @@ -2709,13 +2709,20 @@ svn_wc_text_modified_p(svn_boolean_t *mo svn_wc_adm_access_t *adm_access, apr_pool_t *pool); - /** Set @a *modified_p to non-zero if @a path's properties are modified * with regard to the base revision, else set @a modified_p to zero. * @a adm_access must be an access baton for @a path. * - * If you want to use this with a post-wc-ng working copy, just call - * svn_wc_get_prop_diffs2() and examine the output. + * @since New in 1.7. + */ +svn_error_t * +svn_wc_props_modified_p2(svn_boolean_t *modified_p, + svn_wc_context_t* wc_ctx, + const char *local_abspath, + apr_pool_t *scratch_pool); + +/** Similar to svn_wc_props_modified_p2(), but with a relative path and + * adm_access baton. * * @deprecated Provided for backward compatibility with the 1.6 API. */ Modified: subversion/trunk/subversion/libsvn_wc/deprecated.c URL: http://svn.apache.org/viewvc/subversion/trunk/subversion/libsvn_wc/deprecated.c?rev=982397&r1=982396&r2=982397&view=diff ============================================================================== --- subversion/trunk/subversion/libsvn_wc/deprecated.c (original) +++ subversion/trunk/subversion/libsvn_wc/deprecated.c Wed Aug 4 20:45:46 2010 @@ -2330,12 +2330,26 @@ svn_wc_props_modified_p(svn_boolean_t *m svn_wc_adm_access_t *adm_access, apr_pool_t *pool) { - svn_wc__db_t *db = svn_wc__adm_get_db(adm_access); + svn_wc_context_t *wc_ctx; const char *local_abspath; + svn_error_t *err; SVN_ERR(svn_dirent_get_absolute(&local_abspath, path, pool)); + SVN_ERR(svn_wc__context_create_with_db(&wc_ctx, NULL /* config */, + svn_wc__adm_get_db(adm_access), pool)); + + err = svn_wc_props_modified_p2(modified_p, + wc_ctx, + local_abspath, + pool); - return svn_wc__props_modified(modified_p, db, local_abspath, pool); + if (err && err->apr_err == SVN_ERR_WC_PATH_NOT_FOUND) + { + svn_error_clear(err); + *modified_p = FALSE; + } + + return svn_error_return(svn_wc_context_destroy(wc_ctx)); } Modified: subversion/trunk/subversion/libsvn_wc/props.c URL: http://svn.apache.org/viewvc/subversion/trunk/subversion/libsvn_wc/props.c?rev=982397&r1=982396&r2=982397&view=diff ============================================================================== --- subversion/trunk/subversion/libsvn_wc/props.c (original) +++ subversion/trunk/subversion/libsvn_wc/props.c Wed Aug 4 20:45:46 2010 @@ -2458,77 +2458,28 @@ svn_wc__props_modified(svn_boolean_t *mo const char *local_abspath, apr_pool_t *scratch_pool) { - apr_array_header_t *local_propchanges; - apr_hash_t *localprops; - apr_hash_t *baseprops; - svn_wc__db_status_t status; - svn_error_t *err; - - err = svn_wc__db_read_info(&status, NULL, NULL, NULL, NULL, NULL, NULL, - NULL, NULL, NULL, NULL, NULL, NULL, NULL, - NULL, NULL, NULL, NULL, NULL, NULL, NULL, - NULL, NULL, NULL, - db, local_abspath, - scratch_pool, scratch_pool); - - /* If we have no entry, we can't have any prop mods. */ - if (err && err->apr_err == SVN_ERR_WC_PATH_NOT_FOUND) - { - *modified_p = FALSE; - svn_error_clear(err); - return SVN_NO_ERROR; - } - else if (err) - return err; - - SVN_ERR(load_actual_props(&localprops, db, local_abspath, - scratch_pool, scratch_pool)); - SVN_ERR_ASSERT(localprops != NULL); - - /* ### this should not apply nowadays. especially if - (SVN_WC__VERSION >= SVN_WC__PROPS_IN_DB) */ -#if 0 - { - svn_boolean_t replaced; - - /* If something is scheduled for replacement, we do *not* want to - pay attention to any base-props; they might be residual from the - old deleted file. */ - /* ### in modern WC formats, they should be the replaced file's - ### base props. hard to know on old WCs tho? (given the above - ### comment). just declare propmods if the node has any working - ### properties. */ - SVN_ERR(svn_wc__internal_is_replaced(&replaced, db, local_abspath, - scratch_pool)); - if (replaced) - { - *modified_p = apr_hash_count(localprops) > 0; - return SVN_NO_ERROR; - } - } -#endif - - /* The WORKING props are present, so let's dig in and see what the - differences are. On really old WCs, they might be the same. On - newer WCs, the file would have been removed if there was no delta. */ - SVN_ERR(load_pristine_props(&baseprops, db, local_abspath, - scratch_pool, scratch_pool)); - if (baseprops == NULL) - { - /* No pristines are defined. Let's say mods exist if there are any - ACTUAL props on this node. */ - *modified_p = apr_hash_count(localprops) > 0; - return SVN_NO_ERROR; - } - - SVN_ERR(svn_prop_diffs(&local_propchanges, localprops, baseprops, - scratch_pool)); - - *modified_p = (local_propchanges->nelts > 0); + SVN_ERR(svn_wc__db_read_info(NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, modified_p, + NULL, NULL, NULL, NULL, + db, local_abspath, + scratch_pool, scratch_pool)); return SVN_NO_ERROR; } +svn_error_t * +svn_wc_props_modified_p2(svn_boolean_t *modified_p, + svn_wc_context_t* wc_ctx, + const char *local_abspath, + apr_pool_t *scratch_pool) +{ + return svn_error_return( + svn_wc__props_modified(modified_p, + wc_ctx->db, + local_abspath, + scratch_pool)); +} svn_error_t * svn_wc__internal_propdiff(apr_array_header_t **propchanges,