subversion-commits mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From s...@apache.org
Subject svn commit: r1199357 - in /subversion/branches/moves-scan-log/subversion: include/svn_wc.h libsvn_client/update.c libsvn_wc/deprecated.c libsvn_wc/update_editor.c
Date Tue, 08 Nov 2011 17:39:23 GMT
Author: stsp
Date: Tue Nov  8 17:39:23 2011
New Revision: 1199357

URL: http://svn.apache.org/viewvc?rev=1199357&view=rev
Log:
On the moves-scan-log branch, rev svn_wc_get_update_editor(), adding
a callback the wc library can use to ask for information about
server-side moves. This way we can avoid scanning the log for move
information at the start of every update, and only scan the log in
case the update adds or deletes items.

Currently, the callback is only invoked if the update deletes a
node from the working copy. This needs to be extended later.

Information about server-side moves is still unused.

This is still experimental work in progress and lacks docstrings.

* subversion/include/svn_wc.h
  (svn_wc_repos_move_info_t): New data structure.
  (svn_wc_get_repos_moves_func_t): New callback type.
  (svn_wc_get_update_editor5): New, lke svn_wc_get_update_editor4(), but
   also takes REPOS_MOVES_FUNC and REPOS_MOVES_BATON parameters.

* subversion/libsvn_wc/deprecated.c
  (svn_wc_get_update_editor4): Re-implement as wrapper around
    svn_wc_get_update_editor5().

* subversion/libsvn_wc/update_editor.c
  (edit_baton): Add REPOS_MOVES_FUNC and REPOS_MOVES_BATON, to obtain
   server-side move information from the client layer. Add a REPOS_MOVES
   hash to store the information.
  (get_repos_moves): New helper. Based on code moved here from client/update.c.
  (delete_entry): Obtain information on server-side moves (not used yet).
  (make_editor): Add REPOS_MOVES_FUNC and REPOS_MOVES_BATON parameters,
   and copy their values into the edit baton.
  (svn_wc_get_update_editor4): Rename to ...
  (svn_wc_get_update_editor5): ... this, adding REPOS_MOVES_FUNC and
   REPOS_MOVES_BATON parameters.
  (svn_wc_get_switch_editor4): Pass NULL for new make_editor() parameters.
   To be revisited later.

* subversion/libsvn_client/update.c
  (scan_moves_log_receiver_baton): Rename MOVED_NODES member to MOVES,
   and change its semantics. This hash now maps a repository relpath
   to a repos_move_info_t structure, instead of to another relpath.
  (scan_moves_log_receiver): Adjust for baton changes above.
  (scan_for_server_side_moves): Remove. Replaced by ...
  (get_repos_moves): ... this new function, which is a callback of type
   svn_wc_get_repos_moves_func_t passed to the WC layer when creating
   the update editor. Likewise, adjust for changes to the log receiver
   baton above.
  (update_internal): Create update editor with svn_wc_get_update_editor5().

Modified:
    subversion/branches/moves-scan-log/subversion/include/svn_wc.h
    subversion/branches/moves-scan-log/subversion/libsvn_client/update.c
    subversion/branches/moves-scan-log/subversion/libsvn_wc/deprecated.c
    subversion/branches/moves-scan-log/subversion/libsvn_wc/update_editor.c

Modified: subversion/branches/moves-scan-log/subversion/include/svn_wc.h
URL: http://svn.apache.org/viewvc/subversion/branches/moves-scan-log/subversion/include/svn_wc.h?rev=1199357&r1=1199356&r2=1199357&view=diff
==============================================================================
--- subversion/branches/moves-scan-log/subversion/include/svn_wc.h (original)
+++ subversion/branches/moves-scan-log/subversion/include/svn_wc.h Tue Nov  8 17:39:23 2011
@@ -5484,6 +5484,21 @@ typedef svn_error_t *(*svn_wc_dirents_fu
                                               apr_pool_t *scratch_pool);
 
 
+typedef struct svn_wc_repos_move_info_t {
+  const char *moved_from_repos_relpath;
+  const char *moved_to_repos_relpath;
+  svn_revnum_t revision;
+} svn_wc_repos_move_info_t;
+
+/* ### TODO docco
+ * @since New in 1.8. */
+typedef svn_error_t *(*svn_wc_get_repos_moves_func_t)(void *baton,
+                                                      apr_hash_t **moves,
+                                                      svn_revnum_t start,
+                                                      svn_revnum_t end,
+                                                      apr_pool_t *result_pool,
+                                                      apr_pool_t *scratch_pool);
+
 /**
  * Set @a *editor and @a *edit_baton to an editor and baton for updating a
  * working copy.
@@ -5557,9 +5572,45 @@ typedef svn_error_t *(*svn_wc_dirents_fu
  * callback, when asked to perform a depth restricted update. It will do this
  * before returning the editor to allow using the primary ra session for this.
  *
- * @since New in 1.7.
+ * If @a repos_moves_func is not NULL, the update editor may invoke
+ * this callback to obtain move information about server-side moves which
+ * happened in a specified revision range.
+ *
+ * @since New in 1.8.
  */
 svn_error_t *
+svn_wc_get_update_editor5(const svn_delta_editor_t **editor,
+                          void **edit_baton,
+                          svn_revnum_t *target_revision,
+                          svn_wc_context_t *wc_ctx,
+                          const char *anchor_abspath,
+                          const char *target_basename,
+                          svn_boolean_t use_commit_times,
+                          svn_depth_t depth,
+                          svn_boolean_t depth_is_sticky,
+                          svn_boolean_t allow_unver_obstructions,
+                          svn_boolean_t adds_as_modification,
+                          svn_boolean_t server_performs_filtering,
+                          svn_boolean_t clean_checkout,
+                          const char *diff3_cmd,
+                          const apr_array_header_t *preserved_exts,
+                          svn_wc_dirents_func_t fetch_dirents_func,
+                          void *fetch_dirents_baton,
+                          svn_wc_conflict_resolver_func2_t conflict_func,
+                          void *conflict_baton,
+                          svn_wc_external_update_t external_func,
+                          void *external_baton,
+                          svn_wc_get_repos_moves_func_t repos_moves_func,
+                          void *repos_moves_baton,
+                          svn_cancel_func_t cancel_func,
+                          void *cancel_baton,
+                          svn_wc_notify_func2_t notify_func,
+                          void *notify_baton,
+                          apr_pool_t *result_pool,
+                          apr_pool_t *scratch_pool);
+
+/* Line svn_wc_get_update_editor5, but without the @a get_move_info callback. */
+svn_error_t *
 svn_wc_get_update_editor4(const svn_delta_editor_t **editor,
                           void **edit_baton,
                           svn_revnum_t *target_revision,

Modified: subversion/branches/moves-scan-log/subversion/libsvn_client/update.c
URL: http://svn.apache.org/viewvc/subversion/branches/moves-scan-log/subversion/libsvn_client/update.c?rev=1199357&r1=1199356&r2=1199357&view=diff
==============================================================================
--- subversion/branches/moves-scan-log/subversion/libsvn_client/update.c (original)
+++ subversion/branches/moves-scan-log/subversion/libsvn_client/update.c Tue Nov  8 17:39:23
2011
@@ -162,20 +162,21 @@ is_empty_wc(svn_boolean_t *clean_checkou
 
 struct scan_moves_log_receiver_baton {
   /* The moved nodes hash to be populated.
-   * Maps moved-from path to moved-to path. */
-  apr_hash_t *moved_nodes;
+   * Maps moved-from path to an array of repos_move_info_t. */
+  apr_hash_t *moves;
 } scan_moves_log_receiver_baton;
 
 static svn_error_t *
-scan_moves_log_recevier(void *baton,
+scan_moves_log_receiver(void *baton,
                         svn_log_entry_t *log_entry,
                         apr_pool_t *scratch_pool)
 {
   apr_hash_index_t *hi;
-  apr_hash_t *copied_paths = apr_hash_make(scratch_pool); /* copyfrom->path */
+  apr_hash_t *copied_paths = apr_hash_make(scratch_pool); /* copyfrom->copyto */
   apr_array_header_t *deleted_paths = apr_array_make(scratch_pool, 0,
                                                      sizeof(const char *));
   struct scan_moves_log_receiver_baton *b = baton;
+  apr_pool_t *result_pool = apr_hash_pool_get(b->moves);
   int i;
 
   /* Scan for copied and deleted nodes in this revision. */
@@ -222,104 +223,104 @@ scan_moves_log_recevier(void *baton,
 
           /* We found a single deleted node which matches the copyfrom
            * of single a copied node. This is a non-ambiguous move.
-           * In case we previously found a move of the same node,
-           * update the existing entry to point to the node's current
-           * location. */
-          for (hi2 = apr_hash_first(scratch_pool, b->moved_nodes);
+           * In case we previously found one or more moves of the same node,
+           * add this move to the list of move events for this node. */
+          for (hi2 = apr_hash_first(scratch_pool, b->moves);
                hi2; hi2 = apr_hash_next(hi2))
             {
-              const char *moved_from = svn__apr_hash_index_key(hi2);
-              const char *moved_to = svn__apr_hash_index_key(hi2);
+              apr_array_header_t *moves = svn__apr_hash_index_val(hi2);
+              svn_wc_repos_move_info_t *info;
 
-              if (strcmp(moved_to, deleted_path))
+              info = APR_ARRAY_IDX(moves, moves->nelts - 1,
+                                   svn_wc_repos_move_info_t *);
+              /* ### really check for node identify */
+              if (strcmp(info->moved_to_repos_relpath, deleted_path))
                 {
+                  svn_wc_repos_move_info_t *new_info;
+
+                  new_info = apr_palloc(result_pool, sizeof(*new_info));
+                  new_info->moved_from_repos_relpath = apr_pstrdup(
+                                                         result_pool,
+                                                         deleted_path);
+                  new_info->moved_to_repos_relpath = apr_pstrdup(
+                                                       result_pool,
+                                                       copied_path);
+                  new_info->revision = log_entry->revision;
+                  APR_ARRAY_PUSH(moves, svn_wc_repos_move_info_t *) = new_info;
+
                   first_move = FALSE;
-                  apr_hash_set(b->moved_nodes, moved_from,
-                               APR_HASH_KEY_STRING,
-                               apr_pstrdup(apr_hash_pool_get(b->moved_nodes),
-                                           copied_path));
                 }
             }
 
-          /* If we haven't seen this node being moved before, add it. */
+          /* If we haven't seen this node being moved before, create
+           * a new list of move events for it. */
           if (first_move)
-            apr_hash_set(b->moved_nodes,
-                         apr_pstrdup(apr_hash_pool_get(b->moved_nodes),
-                                     deleted_path),
-                         APR_HASH_KEY_STRING,
-                         apr_pstrdup(apr_hash_pool_get(b->moved_nodes),
-                                     copied_path));
+            {
+              apr_array_header_t *moves;
+              svn_wc_repos_move_info_t *new_info;
+              
+              moves = apr_array_make(result_pool,  1,
+                                     sizeof(svn_wc_repos_move_info_t *));
+              new_info = apr_palloc(result_pool, sizeof(*new_info));
+              new_info->moved_from_repos_relpath = apr_pstrdup(result_pool,
+                                                               deleted_path);
+              new_info->moved_to_repos_relpath = apr_pstrdup(result_pool,
+                                                             copied_path);
+              new_info->revision = log_entry->revision;
+              APR_ARRAY_PUSH(moves, svn_wc_repos_move_info_t *) = new_info;
+              apr_hash_set(b->moves, apr_pstrdup(result_pool, deleted_path),
+                           APR_HASH_KEY_STRING, moves);
+            }
         }
     }
 
   return SVN_NO_ERROR;
 }
 
+/* Implements svn_wc_get_repos_moves_func_t */
 static svn_error_t *
-scan_for_server_side_moves(apr_hash_t **server_side_moves,
-                           const char *anchor_abspath,
-                           svn_ra_session_t *ra_session,
-                           svn_revnum_t target_rev,
-                           svn_client_ctx_t *ctx,
-                           apr_pool_t *result_pool,
-                           apr_pool_t *scratch_pool)
+get_repos_moves(void *baton,
+                apr_hash_t **moves,
+                svn_revnum_t start,
+                svn_revnum_t end,
+                apr_pool_t *result_pool,
+                apr_pool_t *scratch_pool)
 {
-  svn_revnum_t local_min_rev;
-  svn_revnum_t local_max_rev;
-  svn_revnum_t start;
-  svn_revnum_t end;
-  struct scan_moves_log_receiver_baton b;
-  svn_boolean_t adjust_moves_list = FALSE;
-
-  /* Determine the min/max revisions of the working copy. */
-  SVN_ERR(svn_wc__min_max_revisions(&local_min_rev, &local_max_rev,
-                                    ctx->wc_ctx, anchor_abspath,
-                                    FALSE, scratch_pool));
-
-  /* Determine the range of revisions we'll have to scan for moves.
-   * We always scan the log forwards, and adjust the resulting moves
-   * map if the target revision is below or within the local min:max range. */
-  if (target_rev == SVN_INVALID_REVNUM || target_rev > local_max_rev)
-    {
-      /* We're updating to HEAD for some other revision newer than
-       * the local max. */
-      start = local_min_rev; 
-      end = target_rev;
-    }
-  else if (target_rev < local_min_rev)
-    {
-      /* We're updating down to a revision older than the local max. */
-      start = target_rev;
-      end = local_max_rev;
-      adjust_moves_list = TRUE;
-    }
-  else if (target_rev >= local_min_rev && target_rev <= local_max_rev)
-    {
-      /* We're updating to a revision within the local min:max. */
-      start = local_min_rev;
-      end = local_max_rev;
-      adjust_moves_list = TRUE;
-    }
+  svn_ra_session_t *ra_session = baton;
+  struct scan_moves_log_receiver_baton lrb;
 
-  b.moved_nodes = apr_hash_make(result_pool);
+  lrb.moves = apr_hash_make(result_pool);
   SVN_ERR(svn_ra_get_log2(ra_session, NULL, start, end, 0, TRUE, FALSE, FALSE,
                           apr_array_make(scratch_pool, 0,
                                          sizeof(const char *)),
-                          scan_moves_log_recevier, &b, scratch_pool));
+                          scan_moves_log_receiver, &lrb, scratch_pool));
 #ifdef SVN_DEBUG
   {
     apr_hash_index_t *hi;
-    for (hi = apr_hash_first(scratch_pool, b.moved_nodes);
+    for (hi = apr_hash_first(scratch_pool, lrb.moves);
          hi; hi = apr_hash_next(hi))
       {
         const char *moved_from = svn__apr_hash_index_key(hi);
-        const char *moved_to = svn__apr_hash_index_val(hi);
-        SVN_DBG(("found server-side move: '%s' -> '%s'\n",
-                 moved_from, moved_to));
+        apr_array_header_t *moves_for_node =  svn__apr_hash_index_val(hi);
+        int i;
+        
+        for (i = 0; i < moves_for_node->nelts; i++)
+          {
+            svn_wc_repos_move_info_t *move_info;
+            
+            move_info = APR_ARRAY_IDX(moves_for_node, i,
+                                      svn_wc_repos_move_info_t *);
+            SVN_DBG(("found server-side move in r%ld: '%s' -> '%s'\n",
+                     move_info->revision,
+                     moved_from, move_info->moved_to_repos_relpath));
+          }
       }
   }
 #endif
 
+  if (moves)
+    *moves = lrb.moves;
+
   return SVN_NO_ERROR;
 }
 
@@ -531,15 +532,9 @@ update_internal(svn_revnum_t *result_rev
   dfb.target_revision = revnum;
   dfb.anchor_url = anchor_url;
 
-  /* Scan the log within the min:target-revision range for moves which
-   * happened on the server within this range. */
-  SVN_ERR(scan_for_server_side_moves(NULL /* ### TODO */, anchor_abspath,
-                                     ra_session, revnum, ctx,
-                                     pool, pool));
-
   /* Fetch the update editor.  If REVISION is invalid, that's okay;
      the RA driver will call editor->set_target_revision later on. */
-  SVN_ERR(svn_wc_get_update_editor4(&update_editor, &update_edit_baton,
+  SVN_ERR(svn_wc_get_update_editor5(&update_editor, &update_edit_baton,
                                     &revnum, ctx->wc_ctx, anchor_abspath,
                                     target, use_commit_times, depth,
                                     depth_is_sticky, allow_unver_obstructions,
@@ -550,6 +545,7 @@ update_internal(svn_revnum_t *result_rev
                                     svn_client__dirent_fetcher, &dfb,
                                     ctx->conflict_func2, ctx->conflict_baton2,
                                     NULL, NULL,
+                                    get_repos_moves, ra_session,
                                     ctx->cancel_func, ctx->cancel_baton,
                                     ctx->notify_func2, ctx->notify_baton2,
                                     pool, pool));

Modified: subversion/branches/moves-scan-log/subversion/libsvn_wc/deprecated.c
URL: http://svn.apache.org/viewvc/subversion/branches/moves-scan-log/subversion/libsvn_wc/deprecated.c?rev=1199357&r1=1199356&r2=1199357&view=diff
==============================================================================
--- subversion/branches/moves-scan-log/subversion/libsvn_wc/deprecated.c (original)
+++ subversion/branches/moves-scan-log/subversion/libsvn_wc/deprecated.c Tue Nov  8 17:39:23
2011
@@ -3155,6 +3155,59 @@ svn_wc_is_wc_root(svn_boolean_t *wc_root
 }
 
 svn_error_t *
+svn_wc_get_update_editor4(const svn_delta_editor_t **editor,
+                          void **edit_baton,
+                          svn_revnum_t *target_revision,
+                          svn_wc_context_t *wc_ctx,
+                          const char *anchor_abspath,
+                          const char *target_basename,
+                          svn_boolean_t use_commit_times,
+                          svn_depth_t depth,
+                          svn_boolean_t depth_is_sticky,
+                          svn_boolean_t allow_unver_obstructions,
+                          svn_boolean_t adds_as_modification,
+                          svn_boolean_t server_performs_filtering,
+                          svn_boolean_t clean_checkout,
+                          const char *diff3_cmd,
+                          const apr_array_header_t *preserved_exts,
+                          svn_wc_dirents_func_t fetch_dirents_func,
+                          void *fetch_dirents_baton,
+                          svn_wc_conflict_resolver_func2_t conflict_func,
+                          void *conflict_baton,
+                          svn_wc_external_update_t external_func,
+                          void *external_baton,
+                          svn_cancel_func_t cancel_func,
+                          void *cancel_baton,
+                          svn_wc_notify_func2_t notify_func,
+                          void *notify_baton,
+                          apr_pool_t *result_pool,
+                          apr_pool_t *scratch_pool)
+{
+  return svn_error_trace(svn_wc_get_update_editor5(editor, edit_baton,
+                                                   target_revision, wc_ctx,
+                                                   anchor_abspath,
+                                                   target_basename,
+                                                   use_commit_times,
+                                                   depth, depth_is_sticky,
+                                                   allow_unver_obstructions,
+                                                   adds_as_modification,
+                                                   server_performs_filtering,
+                                                   clean_checkout,
+                                                   diff3_cmd,
+                                                   preserved_exts,
+                                                   fetch_dirents_func,
+                                                   fetch_dirents_baton,
+                                                   NULL, NULL,
+                                                   conflict_func,
+                                                   conflict_baton,
+                                                   external_func,
+                                                   external_baton,
+                                                   cancel_func, cancel_baton,
+                                                   notify_func, notify_baton,
+                                                   result_pool, scratch_pool));
+}
+
+svn_error_t *
 svn_wc_get_update_editor3(svn_revnum_t *target_revision,
                           svn_wc_adm_access_t *anchor,
                           const char *target,

Modified: subversion/branches/moves-scan-log/subversion/libsvn_wc/update_editor.c
URL: http://svn.apache.org/viewvc/subversion/branches/moves-scan-log/subversion/libsvn_wc/update_editor.c?rev=1199357&r1=1199356&r2=1199357&view=diff
==============================================================================
--- subversion/branches/moves-scan-log/subversion/libsvn_wc/update_editor.c (original)
+++ subversion/branches/moves-scan-log/subversion/libsvn_wc/update_editor.c Tue Nov  8 17:39:23
2011
@@ -250,6 +250,10 @@ struct edit_baton
   /* Absolute path of the working copy root or NULL if not initialized yet */
   const char *wcroot_abspath;
 
+  svn_wc_get_repos_moves_func_t repos_moves_func;
+  void *repos_moves_baton;
+  apr_hash_t *repos_moves;
+
   apr_pool_t *pool;
 };
 
@@ -1758,6 +1762,49 @@ node_already_conflicted(svn_boolean_t *c
   return SVN_NO_ERROR;
 }
 
+static svn_error_t *
+get_repos_moves(struct edit_baton *eb, apr_pool_t *scratch_pool)
+{
+  svn_revnum_t local_min_rev;
+  svn_revnum_t local_max_rev;
+  svn_revnum_t start;
+  svn_revnum_t end;
+
+  if (eb->repos_moves || eb->repos_moves_func == NULL)
+    return SVN_NO_ERROR;
+
+  /* Determine the min/max revisions of the working copy. */
+  SVN_ERR(svn_wc__db_min_max_revisions(&local_min_rev, &local_max_rev,
+                                       eb->db, eb->anchor_abspath, FALSE,
+                                       scratch_pool));
+ 
+  /* Determine the range of revisions we'll have to scan for moves. */
+  if (*eb->target_revision == SVN_INVALID_REVNUM ||
+      *eb->target_revision > local_max_rev)
+    {
+      /* We're updating to HEAD or some other revision newer than
+       * the local max. */
+      start = local_min_rev; 
+      end = *eb->target_revision;
+    }
+  else if (*eb->target_revision < local_min_rev)
+    {
+      /* We're updating down to a revision older than the local max. */
+      start = *eb->target_revision;
+      end = local_max_rev;
+    }
+  else if (*eb->target_revision >= local_min_rev &&
+           *eb->target_revision <= local_max_rev)
+    {
+      /* We're updating to a revision within the local min:max. */
+      start = local_min_rev;
+      end = local_max_rev;
+    }
+
+  SVN_ERR(eb->repos_moves_func(eb->repos_moves_baton, &eb->repos_moves,
+                               start, end, eb->pool, scratch_pool));
+  return SVN_NO_ERROR;
+}
 
 /* An svn_delta_editor_t function. */
 static svn_error_t *
@@ -1793,6 +1840,8 @@ delete_entry(const char *path,
   SVN_ERR(path_join_under_root(&local_abspath, pb->local_abspath, base,
                                scratch_pool));
 
+  SVN_ERR(get_repos_moves(eb, scratch_pool));
+
   deleting_target =  (strcmp(local_abspath, eb->target_abspath) == 0);
 
   /* Detect obstructing working copies */
@@ -4794,6 +4843,8 @@ make_editor(svn_revnum_t *target_revisio
             void *conflict_baton,
             svn_wc_external_update_t external_func,
             void *external_baton,
+            svn_wc_get_repos_moves_func_t repos_moves_func,
+            void *repos_moves_baton,
             const char *diff3_cmd,
             const apr_array_header_t *preserved_exts,
             const svn_delta_editor_t **editor,
@@ -4872,6 +4923,9 @@ make_editor(svn_revnum_t *target_revisio
   eb->skipped_trees            = apr_hash_make(edit_pool);
   eb->dir_dirents              = apr_hash_make(edit_pool);
   eb->ext_patterns             = preserved_exts;
+  eb->repos_moves_func         = repos_moves_func;
+  eb->repos_moves_baton        = repos_moves_baton;
+  eb->repos_moves              = NULL;
 
   apr_pool_cleanup_register(edit_pool, eb, cleanup_edit_baton,
                             cleanup_edit_baton_child);
@@ -5047,7 +5101,7 @@ make_editor(svn_revnum_t *target_revisio
 
 
 svn_error_t *
-svn_wc_get_update_editor4(const svn_delta_editor_t **editor,
+svn_wc_get_update_editor5(const svn_delta_editor_t **editor,
                           void **edit_baton,
                           svn_revnum_t *target_revision,
                           svn_wc_context_t *wc_ctx,
@@ -5068,6 +5122,8 @@ svn_wc_get_update_editor4(const svn_delt
                           void *conflict_baton,
                           svn_wc_external_update_t external_func,
                           void *external_baton,
+                          svn_wc_get_repos_moves_func_t repos_moves_func,
+                          void *repos_moves_baton,
                           svn_cancel_func_t cancel_func,
                           void *cancel_baton,
                           svn_wc_notify_func2_t notify_func,
@@ -5085,6 +5141,7 @@ svn_wc_get_update_editor4(const svn_delt
                      fetch_dirents_func, fetch_dirents_baton,
                      conflict_func, conflict_baton,
                      external_func, external_baton,
+                     repos_moves_func, repos_moves_baton,
                      diff3_cmd, preserved_exts, editor, edit_baton,
                      result_pool, scratch_pool);
 }
@@ -5131,6 +5188,7 @@ svn_wc_get_switch_editor4(const svn_delt
                      fetch_dirents_func, fetch_dirents_baton,
                      conflict_func, conflict_baton,
                      external_func, external_baton,
+                     NULL, NULL,
                      diff3_cmd, preserved_exts,
                      editor, edit_baton,
                      result_pool, scratch_pool);



Mime
View raw message