On Wed, Nov 23, 2011 at 2:36 AM, Bert Huijben <b...@qqmail.nl> wrote: > > >> -----Original Message----- >> From: hwri...@apache.org [mailto:hwri...@apache.org] >> Sent: woensdag 23 november 2011 5:54 >> To: comm...@subversion.apache.org >> Subject: svn commit: r1205287 - in /subversion/trunk/subversion/libsvn_wc: >> status.c update_editor.c util.c wc.h >> >> Author: hwright >> Date: Wed Nov 23 04:53:47 2011 >> New Revision: 1205287 >> >> URL: http://svn.apache.org/viewvc?rev=1205287&view=rev >> Log: >> Generalize the prop fetching shim handler in libsvn_wc, and use it with the >> status editor. >> >> This doesn't fix any tests, but does handle a few segfaults. >> >> * subversion/libsvn_wc/util.c >> (svn_wc__fetch_kind_func, svn_wc__fetch_props_func): New. >> >> * subversion/libsvn_wc/wc.h >> (svn_wc__shim_fetch_baton_t, svn_wc__fetch_kind_func, >> svn_wc__fetch_props_func): New. >> >> * subversion/libsvn_wc/update_editor.c >> (fetch_baton, fetch_props_func, fetch_kind_func): Remove. >> (make_editor): Update references. >> >> * subversion/libsvn_wc/status.c >> (svn_wc_get_status_editor5): Create a baton, and use the proper handlers >> for >> the shims. >> >> Modified: >> subversion/trunk/subversion/libsvn_wc/status.c >> subversion/trunk/subversion/libsvn_wc/update_editor.c >> subversion/trunk/subversion/libsvn_wc/util.c >> subversion/trunk/subversion/libsvn_wc/wc.h >> >> Modified: subversion/trunk/subversion/libsvn_wc/status.c >> URL: >> http://svn.apache.org/viewvc/subversion/trunk/subversion/libsvn_wc/stat >> us.c?rev=1205287&r1=1205286&r2=1205287&view=diff >> ========================================================== >> ==================== >> --- subversion/trunk/subversion/libsvn_wc/status.c (original) >> +++ subversion/trunk/subversion/libsvn_wc/status.c Wed Nov 23 04:53:47 >> 2011 >> @@ -2455,6 +2455,7 @@ svn_wc_get_status_editor5(const svn_delt >> struct edit_baton *eb; >> svn_delta_editor_t *tree_editor = svn_delta_default_editor(result_pool); >> void *inner_baton; >> + struct svn_wc__shim_fetch_baton_t *sfb; >> const svn_delta_editor_t *inner_editor; >> svn_delta_shim_callbacks_t *shim_callbacks = >> >> svn_delta_shim_callbacks_default(result_pool); >> @@ -2545,6 +2546,15 @@ svn_wc_get_status_editor5(const svn_delt >> if (set_locks_baton) >> *set_locks_baton = eb; >> >> + sfb = apr_palloc(result_pool, sizeof(*sfb)); >> + sfb->db = wc_ctx->db; >> + sfb->base_abspath = eb->target_abspath; >> + >> + shim_callbacks->fetch_kind_func = svn_wc__fetch_kind_func; >> + shim_callbacks->fetch_kind_baton = sfb; >> + shim_callbacks->fetch_props_func = svn_wc__fetch_props_func; >> + shim_callbacks->fetch_props_baton = sfb; >> + >> SVN_ERR(svn_editor__insert_shims(editor, edit_baton, *editor, >> *edit_baton, >> shim_callbacks, >> result_pool, scratch_pool)); >> >> Modified: subversion/trunk/subversion/libsvn_wc/update_editor.c >> URL: >> http://svn.apache.org/viewvc/subversion/trunk/subversion/libsvn_wc/upd >> ate_editor.c?rev=1205287&r1=1205286&r2=1205287&view=diff >> ========================================================== >> ==================== >> --- subversion/trunk/subversion/libsvn_wc/update_editor.c (original) >> +++ subversion/trunk/subversion/libsvn_wc/update_editor.c Wed Nov 23 >> 04:53:47 2011 >> @@ -4719,55 +4719,6 @@ close_edit(void *edit_baton, >> > >> /*** Returning editors. ***/ >> >> -struct fetch_baton >> -{ >> - svn_wc__db_t *db; >> - const char *target_abspath; >> -}; >> - >> -static svn_error_t * >> -fetch_props_func(apr_hash_t **props, >> - void *baton, >> - const char *path, >> - apr_pool_t *result_pool, >> - apr_pool_t *scratch_pool) >> -{ >> - struct fetch_baton *fpb = baton; >> - const char *local_abspath = svn_dirent_join(fpb->target_abspath, path, >> - scratch_pool); >> - svn_error_t *err; >> - >> - err = svn_wc__db_read_props(props, fpb->db, local_abspath, >> - result_pool, scratch_pool); >> - >> - /* If the path doesn't exist, just return an empty set of props. */ >> - if (err && err->apr_err == SVN_ERR_WC_PATH_NOT_FOUND) >> - { >> - svn_error_clear(err); >> - *props = apr_hash_make(result_pool); >> - } >> - else if (err) >> - return svn_error_trace(err); >> - >> - return SVN_NO_ERROR; >> -} >> - >> -static svn_error_t * >> -fetch_kind_func(svn_kind_t *kind, >> - void *baton, >> - const char *path, >> - apr_pool_t *scratch_pool) >> -{ >> - struct fetch_baton *fpb = baton; >> - const char *local_abspath = svn_dirent_join(fpb->target_abspath, path, >> - scratch_pool); >> - >> - SVN_ERR(svn_wc__db_read_kind(kind, fpb->db, local_abspath, FALSE, >> - scratch_pool)); >> - >> - return SVN_NO_ERROR; >> -} >> - >> /* Helper for the three public editor-supplying functions. */ >> static svn_error_t * >> make_editor(svn_revnum_t *target_revision, >> @@ -4805,7 +4756,7 @@ make_editor(svn_revnum_t *target_revisio >> svn_delta_editor_t *tree_editor = svn_delta_default_editor(edit_pool); >> const svn_delta_editor_t *inner_editor; >> const char *repos_root, *repos_uuid; >> - struct fetch_baton *fpb; >> + struct svn_wc__shim_fetch_baton_t *sfb; >> svn_delta_shim_callbacks_t *shim_callbacks = >> svn_delta_shim_callbacks_default(edit_pool); >> >> @@ -5035,14 +4986,14 @@ make_editor(svn_revnum_t *target_revisio >> edit_baton, >> result_pool)); >> >> - fpb = apr_palloc(result_pool, sizeof(*fpb)); >> - fpb->db = db; >> - fpb->target_abspath = eb->target_abspath; >> - >> - shim_callbacks->fetch_kind_func = fetch_kind_func; >> - shim_callbacks->fetch_kind_baton = fpb; >> - shim_callbacks->fetch_props_func = fetch_props_func; >> - shim_callbacks->fetch_props_baton = fpb; >> + sfb = apr_palloc(result_pool, sizeof(*sfb)); >> + sfb->db = db; >> + sfb->base_abspath = eb->target_abspath; >> + >> + shim_callbacks->fetch_kind_func = svn_wc__fetch_kind_func; >> + shim_callbacks->fetch_kind_baton = sfb; >> + shim_callbacks->fetch_props_func = svn_wc__fetch_props_func; >> + shim_callbacks->fetch_props_baton = sfb; >> >> SVN_ERR(svn_editor__insert_shims(editor, edit_baton, *editor, >> *edit_baton, >> shim_callbacks, result_pool, >> scratch_pool)); >> >> Modified: subversion/trunk/subversion/libsvn_wc/util.c >> URL: >> http://svn.apache.org/viewvc/subversion/trunk/subversion/libsvn_wc/util.c >> ?rev=1205287&r1=1205286&r2=1205287&view=diff >> ========================================================== >> ==================== >> --- subversion/trunk/subversion/libsvn_wc/util.c (original) >> +++ subversion/trunk/subversion/libsvn_wc/util.c Wed Nov 23 04:53:47 2011 >> @@ -533,3 +533,48 @@ svn_wc__status2_from_3(svn_wc_status2_t >> >> return SVN_NO_ERROR; >> } >> + >> + >> +svn_error_t * >> +svn_wc__fetch_kind_func(svn_kind_t *kind, >> + void *baton, >> + const char *path, >> + apr_pool_t *scratch_pool) >> +{ >> + struct svn_wc__shim_fetch_baton_t *sfb = baton; >> + const char *local_abspath = svn_dirent_join(sfb->base_abspath, path, >> + scratch_pool); >> + >> + SVN_ERR(svn_wc__db_read_kind(kind, sfb->db, local_abspath, FALSE, >> + scratch_pool)); >> + >> + return SVN_NO_ERROR; >> +} >> + >> + >> +svn_error_t * >> +svn_wc__fetch_props_func(apr_hash_t **props, >> + void *baton, >> + const char *path, >> + apr_pool_t *result_pool, >> + apr_pool_t *scratch_pool) >> +{ >> + struct svn_wc__shim_fetch_baton_t *sfb = baton; >> + const char *local_abspath = svn_dirent_join(sfb->base_abspath, path, >> + scratch_pool); >> + svn_error_t *err; >> + >> + err = svn_wc__db_read_props(props, sfb->db, local_abspath, >> + result_pool, scratch_pool); > > At least in the update editor you want to fetch the BASE (op_depth 0) > properties from here. I think you need the pristine properties in most other > cases. > > But this code fetches the local properties from ACTUAL.
I think r1208833 should address your concern. -Hyrum >> + >> + /* If the path doesn't exist, just return an empty set of props. */ >> + if (err && err->apr_err == SVN_ERR_WC_PATH_NOT_FOUND) >> + { >> + svn_error_clear(err); >> + *props = apr_hash_make(result_pool); >> + } >> + else if (err) >> + return svn_error_trace(err); >> + >> + return SVN_NO_ERROR; >> +} >> >> Modified: subversion/trunk/subversion/libsvn_wc/wc.h >> URL: >> http://svn.apache.org/viewvc/subversion/trunk/subversion/libsvn_wc/wc.h >> ?rev=1205287&r1=1205286&r2=1205287&view=diff >> ========================================================== >> ==================== >> --- subversion/trunk/subversion/libsvn_wc/wc.h (original) >> +++ subversion/trunk/subversion/libsvn_wc/wc.h Wed Nov 23 04:53:47 2011 >> @@ -724,6 +724,30 @@ svn_wc__perform_file_merge(svn_skel_t ** >> apr_pool_t *scratch_pool); >> >> >> +/* Couple of random helpers for the Ev2 shims. >> + ### These will eventually be obsoleted and removed. */ >> +struct svn_wc__shim_fetch_baton_t >> +{ >> + svn_wc__db_t *db; >> + const char *base_abspath; >> +}; >> + >> +/* Using a BATON of struct shim_fetch_baton, return KIND for PATH. */ >> +svn_error_t * >> +svn_wc__fetch_kind_func(svn_kind_t *kind, >> + void *baton, >> + const char *path, >> + apr_pool_t *scratch_pool); >> + >> +/* Using a BATON of struct shim_fetch_baton, return PROPS for PATH. */ >> +svn_error_t * >> +svn_wc__fetch_props_func(apr_hash_t **props, >> + void *baton, >> + const char *path, >> + apr_pool_t *result_pool, >> + apr_pool_t *scratch_pool); >> + >> + >> #ifdef __cplusplus >> } >> #endif /* __cplusplus */ >> > > > -- uberSVN: Apache Subversion Made Easy http://www.uberSVN.com/