You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@subversion.apache.org by hw...@apache.org on 2011/11/23 05:53:47 UTC

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/status.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/update_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);
+
+  /* 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 */



Re: svn commit: r1205287 - in /subversion/trunk/subversion/libsvn_wc: status.c update_editor.c util.c wc.h

Posted by Hyrum K Wright <hy...@wandisco.com>.
On Wed, Nov 23, 2011 at 2:36 AM, Bert Huijben <be...@qqmail.nl> wrote:
>
>
>> -----Original Message-----
>> From: hwright@apache.org [mailto:hwright@apache.org]
>> Sent: woensdag 23 november 2011 5:54
>> To: commits@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/

Re: svn commit: r1205287 - in /subversion/trunk/subversion/libsvn_wc: status.c update_editor.c util.c wc.h

Posted by Hyrum K Wright <hy...@wandisco.com>.
On Wed, Nov 23, 2011 at 2:36 AM, Bert Huijben <be...@qqmail.nl> wrote:
>
>
>> -----Original Message-----
>> From: hwright@apache.org [mailto:hwright@apache.org]
>> Sent: woensdag 23 november 2011 5:54
>> To: commits@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/

RE: svn commit: r1205287 - in /subversion/trunk/subversion/libsvn_wc: status.c update_editor.c util.c wc.h

Posted by Bert Huijben <be...@qqmail.nl>.

> -----Original Message-----
> From: hwright@apache.org [mailto:hwright@apache.org]
> Sent: woensdag 23 november 2011 5:54
> To: commits@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 */
> 



RE: svn commit: r1205287 - in /subversion/trunk/subversion/libsvn_wc: status.c update_editor.c util.c wc.h

Posted by Bert Huijben <be...@qqmail.nl>.

> -----Original Message-----
> From: hwright@apache.org [mailto:hwright@apache.org]
> Sent: woensdag 23 november 2011 5:54
> To: commits@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 */
>