> -----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. > + > + /* 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 */ >