subversion-commits mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From hwri...@apache.org
Subject svn commit: r1189956 - /subversion/trunk/subversion/libsvn_delta/compat.c
Date Thu, 27 Oct 2011 19:28:51 GMT
Author: hwright
Date: Thu Oct 27 19:28:51 2011
New Revision: 1189956

URL: http://svn.apache.org/viewvc?rev=1189956&view=rev
Log:
Add a callback to the Ev2 shims which allows a caller to perform some pre-run
initialization.  This is similar to the open_root() function but for Ev2, and
is required so that other shim callbacks can potentially initialize state.

Current test failures: 1168

* subversion/libsvn_delta/compat.c
  (start_edit_func_t): New type.
  (ev2_edit_baton): Hold the new start edit func.
  (ev2_open_root): Run the start edit handler.
  (start_edit_baton, start_edit_func): New.
  (delta_from_editor): Take the start edit func, and shove it in the baton.
  (svn_editor__insert_shims): Update caller to delta_from_editor().

Modified:
    subversion/trunk/subversion/libsvn_delta/compat.c

Modified: subversion/trunk/subversion/libsvn_delta/compat.c
URL: http://svn.apache.org/viewvc/subversion/trunk/subversion/libsvn_delta/compat.c?rev=1189956&r1=1189955&r2=1189956&view=diff
==============================================================================
--- subversion/trunk/subversion/libsvn_delta/compat.c (original)
+++ subversion/trunk/subversion/libsvn_delta/compat.c Thu Oct 27 19:28:51 2011
@@ -92,12 +92,24 @@ svn_compat_wrap_file_rev_handler(svn_fil
  * large amount of information in the dir batons, and then process it in the
  * close_directory() handler. */
 
+typedef svn_error_t *(*start_edit_func_t)(
+    void *baton,
+    svn_revnum_t base_revision,
+    apr_pool_t *result_pool,
+    void **root_baton);
+
 struct ev2_edit_baton
 {
   svn_editor_t *editor;
   apr_hash_t *paths;
   svn_revnum_t target_revision;
   apr_pool_t *edit_pool;
+
+  void *root_baton;
+
+  start_edit_func_t start_edit;
+  void *start_edit_baton;
+
   svn_delta_fetch_props_func_t fetch_props_func;
   void *fetch_props_baton;
 };
@@ -307,6 +319,11 @@ ev2_open_root(void *edit_baton,
   db->path = "";
 
   *root_baton = db;
+
+  if (eb->start_edit)
+    SVN_ERR(eb->start_edit(eb->start_edit_baton, base_revision, result_pool,
+                           &eb->root_baton));
+
   return SVN_NO_ERROR;
 }
 
@@ -507,12 +524,34 @@ ev2_abort_edit(void *edit_baton,
   return svn_error_trace(svn_editor_abort(eb->editor));
 }
 
+struct start_edit_baton
+{
+  const svn_delta_editor_t *deditor;
+  void *dedit_baton;
+};
+
+static svn_error_t *
+start_edit_func(void *baton,
+                svn_revnum_t base_revision,
+                apr_pool_t *result_pool,
+                void **root_baton)
+{
+  struct start_edit_baton *seb = baton;
+
+  SVN_ERR(seb->deditor->open_root(seb->dedit_baton, base_revision, result_pool,
+                                  root_baton));
+
+  return SVN_NO_ERROR;
+}
+
 static svn_error_t *
 delta_from_editor(const svn_delta_editor_t **deditor,
                   void **dedit_baton,
                   svn_editor_t *editor,
                   svn_delta_fetch_props_func_t fetch_props_func,
                   void *fetch_props_baton,
+                  start_edit_func_t start_edit,
+                  void *start_edit_baton,
                   apr_pool_t *pool)
 {
   /* Static 'cause we don't want it to be on the stack. */
@@ -534,7 +573,7 @@ delta_from_editor(const svn_delta_editor
       ev2_close_edit,
       ev2_abort_edit
     };
-  struct ev2_edit_baton *eb = apr_palloc(pool, sizeof(*eb));
+  struct ev2_edit_baton *eb = apr_pcalloc(pool, sizeof(*eb));
 
   eb->editor = editor;
   eb->paths = apr_hash_make(pool);
@@ -543,6 +582,9 @@ delta_from_editor(const svn_delta_editor
   eb->fetch_props_func = fetch_props_func;
   eb->fetch_props_baton = fetch_props_baton;
 
+  eb->start_edit = start_edit;
+  eb->start_edit_baton = start_edit_baton;
+
   *dedit_baton = eb;
   *deditor = &delta_editor;
 
@@ -1133,6 +1175,10 @@ svn_editor__insert_shims(const svn_delta
      wrap that again back into a svn_delta_editor_t.  This introduces
      a lot of overhead. */
   svn_editor_t *editor;
+  struct start_edit_baton *seb = apr_palloc(result_pool, sizeof(*seb));
+
+  seb->deditor = deditor_in;
+  seb->dedit_baton = dedit_baton_in;
 
   SVN_ERR(editor_from_delta(&editor, deditor_in, dedit_baton_in,
                             NULL, NULL, shim_callbacks->fetch_kind_func,
@@ -1141,6 +1187,7 @@ svn_editor__insert_shims(const svn_delta
   SVN_ERR(delta_from_editor(deditor_out, dedit_baton_out, editor,
                             shim_callbacks->fetch_props_func,
                             shim_callbacks->fetch_props_baton,
+                            start_edit_func, seb,
                             result_pool));
 
 #endif



Mime
View raw message