You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@subversion.apache.org by rh...@apache.org on 2011/04/29 10:01:48 UTC

svn commit: r1097718 - in /subversion/trunk/subversion/libsvn_wc: diff.c diff_editor.c diff_local.c

Author: rhuijben
Date: Fri Apr 29 08:01:47 2011
New Revision: 1097718

URL: http://svn.apache.org/viewvc?rev=1097718&view=rev
Log:
Separate the implementations of the working copy diff editor (svn diff -r 123
PATH and svn diff -r 123:BASE) and the local diff (svn diff PATH).

These two diffs currently share a lot of code, but they have to look at
restructuring changes in a different way.

This code was originally designed before Subversion 1.4, where all
restructuring changes where simply handled by the repository side of the diff:
we reported the original checked out version as deleted in the adm crawler
and received the restructurings from the repository.

With the invention of the revert base (in 1.4) and now with full local layering
this model grows apart from the local diff, which just reports changes against
the origin of the file. Separating the implementation makes things much
simpler.

No functional changes (yet).

* subversion/libsvn_wc/diff.c
  Deleted file.

* subversion/libsvn_wc/diff_editor.c
  New file; copied from subversion/libsvn_wc/diff.c
  (header): Updated.
  (svn_wc_diff6): Remove function.

* subversion/libsvn_wc/diff_local.c
  New file; copied from subversion/libsvn_wc/diff.c
  (*): Remove all functions and structs only used from the diff editor.

Added:
    subversion/trunk/subversion/libsvn_wc/diff_editor.c
      - copied, changed from r1097601, subversion/trunk/subversion/libsvn_wc/diff.c
    subversion/trunk/subversion/libsvn_wc/diff_local.c
      - copied, changed from r1097601, subversion/trunk/subversion/libsvn_wc/diff.c
Removed:
    subversion/trunk/subversion/libsvn_wc/diff.c

Copied: subversion/trunk/subversion/libsvn_wc/diff_editor.c (from r1097601, subversion/trunk/subversion/libsvn_wc/diff.c)
URL: http://svn.apache.org/viewvc/subversion/trunk/subversion/libsvn_wc/diff_editor.c?p2=subversion/trunk/subversion/libsvn_wc/diff_editor.c&p1=subversion/trunk/subversion/libsvn_wc/diff.c&r1=1097601&r2=1097718&rev=1097718&view=diff
==============================================================================
--- subversion/trunk/subversion/libsvn_wc/diff.c (original)
+++ subversion/trunk/subversion/libsvn_wc/diff_editor.c Fri Apr 29 08:01:47 2011
@@ -1,6 +1,6 @@
 /*
- * diff.c -- The diff editor for comparing the working copy against the
- *           repository.
+ * diff_editor.c -- The diff editor for comparing the working copy against the
+ *                  repository.
  *
  * ====================================================================
  *    Licensed to the Apache Software Foundation (ASF) under one
@@ -37,6 +37,13 @@
  * locally. Added directories do not have corresponding temporary
  * directories created, as they are not needed.
  *
+ * The diff result from this editor is a combination of the restructuring
+ * operations from the repository with the local restructurings since checking
+ * out.
+ *
+ * ### TODO: Make sure that we properly support and report multi layered
+ *           operations instead of only simple file replacements.
+ *
  * ### TODO: Replacements where the node kind changes needs support. It
  * mostly works when the change is in the repository, but not when it is
  * in the working copy.
@@ -1932,57 +1939,3 @@ svn_wc_get_diff_editor6(const svn_delta_
                                            edit_baton,
                                            result_pool);
 }
-
-
-/* Compare working copy against the text-base. */
-svn_error_t *
-svn_wc_diff6(svn_wc_context_t *wc_ctx,
-             const char *target_abspath,
-             const svn_wc_diff_callbacks4_t *callbacks,
-             void *callback_baton,
-             svn_depth_t depth,
-             svn_boolean_t ignore_ancestry,
-             svn_boolean_t show_copies_as_adds,
-             svn_boolean_t use_git_diff_format,
-             const apr_array_header_t *changelists,
-             svn_cancel_func_t cancel_func,
-             void *cancel_baton,
-             apr_pool_t *pool)
-{
-  struct edit_baton *eb;
-  const char *target;
-  const char *anchor_abspath;
-  svn_wc__db_kind_t kind;
-
-  SVN_ERR_ASSERT(svn_dirent_is_absolute(target_abspath));
-  SVN_ERR(svn_wc__db_read_kind(&kind, wc_ctx->db, target_abspath, FALSE,
-                               pool));
-
-  if (kind == svn_wc__db_kind_dir)
-    {
-      anchor_abspath = target_abspath;
-      target = "";
-    }
-  else
-    svn_dirent_split(&anchor_abspath, &target, target_abspath, pool);
-
-  SVN_ERR(make_edit_baton(&eb,
-                          wc_ctx->db,
-                          anchor_abspath,
-                          target,
-                          callbacks, callback_baton,
-                          depth, ignore_ancestry, show_copies_as_adds,
-                          use_git_diff_format,
-                          FALSE, FALSE, changelists,
-                          cancel_func, cancel_baton,
-                          pool));
-
-  SVN_ERR(walk_local_nodes_diff(eb,
-                                eb->anchor_abspath,
-                                "",
-                                depth,
-                                NULL,
-                                eb->pool));
-
-  return SVN_NO_ERROR;
-}

Copied: subversion/trunk/subversion/libsvn_wc/diff_local.c (from r1097601, subversion/trunk/subversion/libsvn_wc/diff.c)
URL: http://svn.apache.org/viewvc/subversion/trunk/subversion/libsvn_wc/diff_local.c?p2=subversion/trunk/subversion/libsvn_wc/diff_local.c&p1=subversion/trunk/subversion/libsvn_wc/diff.c&r1=1097601&r2=1097718&rev=1097718&view=diff
==============================================================================
--- subversion/trunk/subversion/libsvn_wc/diff.c (original)
+++ subversion/trunk/subversion/libsvn_wc/diff_local.c Fri Apr 29 08:01:47 2011
@@ -1,6 +1,6 @@
 /*
- * diff.c -- The diff editor for comparing the working copy against the
- *           repository.
+ * diff_pristine.c -- A simple diff walker which compares local files against
+ *                    their pristine versions.
  *
  * ====================================================================
  *    Licensed to the Apache Software Foundation (ASF) under one
@@ -20,33 +20,18 @@
  *    specific language governing permissions and limitations
  *    under the License.
  * ====================================================================
- */
-
-/*
- * This code uses an svn_delta_editor_t editor driven by
- * svn_wc_crawl_revisions (like the update command) to retrieve the
- * differences between the working copy and the requested repository
- * version. Rather than updating the working copy, this new editor creates
- * temporary files that contain the pristine repository versions. When the
- * crawler closes the files the editor calls back to a client layer
- * function to compare the working copy and the temporary file. There is
- * only ever one temporary file in existence at any time.
- *
- * When the crawler closes a directory, the editor then calls back to the
- * client layer to compare any remaining files that may have been modified
- * locally. Added directories do not have corresponding temporary
- * directories created, as they are not needed.
  *
- * ### TODO: Replacements where the node kind changes needs support. It
- * mostly works when the change is in the repository, but not when it is
- * in the working copy.
+ * This is the simple working copy diff algorithm which is used when you
+ * just use 'svn diff PATH'. It shows what is modified in your working copy
+ * since a node was checked out or copied but doesn't show most kinds of
+ * restructuring operations.
  *
- * ### TODO: Do we need to support copyfrom?
+ * You can look at this as another form of the status walker.
  *
+ * ### TODO: Simply use svn_wc_walk_status() to provide this diff.
  */
 
 #include <apr_hash.h>
-#include <apr_md5.h>
 
 #include "svn_error.h"
 #include "svn_pools.h"
@@ -64,64 +49,7 @@
 #include "svn_private_config.h"
 
 
-/*-------------------------------------------------------------------------*/
-/* A little helper function.
-
-   You see, when we ask the server to update us to a certain revision,
-   we construct the new fulltext, and then run
-
-         'diff <repos_fulltext> <working_fulltext>'
-
-   which is, of course, actually backwards from the repository's point
-   of view.  It thinks we want to move from working->repos.
-
-   So when the server sends property changes, they're effectively
-   backwards from what we want.  We don't want working->repos, but
-   repos->working.  So this little helper "reverses" the value in
-   BASEPROPS and PROPCHANGES before we pass them off to the
-   prop_changed() diff-callback.  */
-static void
-reverse_propchanges(apr_hash_t *baseprops,
-                    apr_array_header_t *propchanges,
-                    apr_pool_t *pool)
-{
-  int i;
-
-  /* ### todo: research lifetimes for property values below */
-
-  for (i = 0; i < propchanges->nelts; i++)
-    {
-      svn_prop_t *propchange
-        = &APR_ARRAY_IDX(propchanges, i, svn_prop_t);
 
-      const svn_string_t *original_value =
-        apr_hash_get(baseprops, propchange->name, APR_HASH_KEY_STRING);
-
-      if ((original_value == NULL) && (propchange->value != NULL))
-        {
-          /* found an addition.  make it look like a deletion. */
-          apr_hash_set(baseprops, propchange->name, APR_HASH_KEY_STRING,
-                       svn_string_dup(propchange->value, pool));
-          propchange->value = NULL;
-        }
-
-      else if ((original_value != NULL) && (propchange->value == NULL))
-        {
-          /* found a deletion.  make it look like an addition. */
-          propchange->value = svn_string_dup(original_value, pool);
-          apr_hash_set(baseprops, propchange->name, APR_HASH_KEY_STRING,
-                       NULL);
-        }
-
-      else if ((original_value != NULL) && (propchange->value != NULL))
-        {
-          /* found a change.  just swap the values.  */
-          const svn_string_t *str = svn_string_dup(propchange->value, pool);
-          propchange->value = svn_string_dup(original_value, pool);
-          apr_hash_set(baseprops, propchange->name, APR_HASH_KEY_STRING, str);
-        }
-    }
-}
 
 
 /* Set *RESULT_ABSPATH to the absolute path to a readable file containing
@@ -246,85 +174,6 @@ struct edit_baton {
   apr_pool_t *pool;
 };
 
-/* Directory level baton.
- */
-struct dir_baton {
-  /* Gets set if the directory is added rather than replaced/unchanged. */
-  svn_boolean_t added;
-
-  /* The depth at which this directory should be diffed. */
-  svn_depth_t depth;
-
-  /* The name and path of this directory as if they would be/are in the
-      local working copy. */
-  const char *name;
-  const char *local_abspath;
-
-  /* The "correct" path of the directory, but it may not exist in the
-     working copy. */
-  const char *path;
-
-  /* Identifies those directory elements that get compared while running
-     the crawler.  These elements should not be compared again when
-     recursively looking for local modifications.
-
-     This hash maps the full path of the entry to an unimportant value
-     (presence in the hash is the important factor here, not the value
-     itself).
-
-     If the directory's properties have been compared, an item with hash
-     key of path will be present in the hash. */
-  apr_hash_t *compared;
-
-  /* The baton for the parent directory, or null if this is the root of the
-     hierarchy to be compared. */
-  struct dir_baton *parent_baton;
-
-  /* The list of incoming BASE->repos propchanges. */
-  apr_array_header_t *propchanges;
-
-  /* The overall crawler editor baton. */
-  struct edit_baton *eb;
-
-  apr_pool_t *pool;
-};
-
-/* File level baton.
- */
-struct file_baton {
-  /* Gets set if the file is added rather than replaced. */
-  svn_boolean_t added;
-
-  /* The name and path of this file as if they would be/are in the
-      local working copy. */
-  const char *name;
-  const char *local_abspath;
-
-  /* PATH is the "correct" path of the file, but it may not exist in the
-     working copy */
-  const char *path;
-
- /* When constructing the requested repository version of the file, we
-    drop the result into a file at TEMP_FILE_PATH. */
-  const char *temp_file_path;
-
-  /* The list of incoming BASE->repos propchanges. */
-  apr_array_header_t *propchanges;
-
-  /* The current checksum on disk */
-  const svn_checksum_t *base_checksum;
-
-  /* The resulting checksum from apply_textdelta */
-  svn_checksum_t *result_checksum;
-
-  /* The overall crawler editor baton. */
-  struct edit_baton *eb;
-
-  struct dir_baton *parent_baton;
-
-  apr_pool_t *pool;
-};
-
 /* Create a new edit baton. TARGET_PATH/ANCHOR are working copy paths
  * that describe the root of the comparison. CALLBACKS/CALLBACK_BATON
  * define the callbacks to compare files. DEPTH defines if and how to
@@ -386,72 +235,6 @@ make_edit_baton(struct edit_baton **edit
   return SVN_NO_ERROR;
 }
 
-/* Create a new directory baton.  PATH is the directory path,
- * including anchor_path.  ADDED is set if this directory is being
- * added rather than replaced.  PARENT_BATON is the baton of the
- * parent directory, it will be null if this is the root of the
- * comparison hierarchy.  The directory and its parent may or may not
- * exist in the working copy.  EDIT_BATON is the overall crawler
- * editor baton.
- */
-static struct dir_baton *
-make_dir_baton(const char *path,
-               struct dir_baton *parent_baton,
-               struct edit_baton *eb,
-               svn_boolean_t added,
-               svn_depth_t depth,
-               apr_pool_t *pool)
-{
-  struct dir_baton *db = apr_pcalloc(pool, sizeof(*db));
-
-  db->eb = eb;
-  db->parent_baton = parent_baton;
-  db->added = added;
-  db->depth = depth;
-  db->pool = pool;
-  db->propchanges = apr_array_make(pool, 1, sizeof(svn_prop_t));
-  db->compared = apr_hash_make(db->pool);
-  db->path = apr_pstrdup(pool, path);
-
-  db->name = svn_dirent_basename(db->path, NULL);
-
-  if (parent_baton != NULL)
-    db->local_abspath = svn_dirent_join(parent_baton->local_abspath, db->name,
-                                        pool);
-  else
-    db->local_abspath = apr_pstrdup(pool, eb->anchor_abspath);
-
-  return db;
-}
-
-/* Create a new file baton.  PATH is the file path, including
- * anchor_path.  ADDED is set if this file is being added rather than
- * replaced.  PARENT_BATON is the baton of the parent directory.
- * The directory and its parent may or may not exist in the working copy.
- */
-static struct file_baton *
-make_file_baton(const char *path,
-                svn_boolean_t added,
-                struct dir_baton *parent_baton,
-                apr_pool_t *pool)
-{
-  struct file_baton *fb = apr_pcalloc(pool, sizeof(*fb));
-  struct edit_baton *eb = parent_baton->eb;
-
-  fb->eb = eb;
-  fb->parent_baton = parent_baton;
-  fb->added = added;
-  fb->pool = pool;
-  fb->propchanges  = apr_array_make(pool, 1, sizeof(svn_prop_t));
-  fb->path = apr_pstrdup(pool, path);
-
-  fb->name = svn_dirent_basename(fb->path, NULL);
-  fb->local_abspath = svn_dirent_join(parent_baton->local_abspath, fb->name,
-                                      pool);
-
-  return fb;
-}
-
 /* Get the empty file associated with the edit baton. This is cached so
  * that it can be reused, all empty files are the same.
  */
@@ -489,31 +272,6 @@ get_prop_mimetype(apr_hash_t *props)
 }
 
 
-/* Return the property hash resulting from combining PROPS and PROPCHANGES.
- *
- * A note on pool usage: The returned hash and hash keys are allocated in
- * the same pool as PROPS, but the hash values will be taken directly from
- * either PROPS or PROPCHANGES, as appropriate.  Caller must therefore
- * ensure that the returned hash is only used for as long as PROPS and
- * PROPCHANGES remain valid.
- */
-static apr_hash_t *
-apply_propchanges(apr_hash_t *props,
-                  const apr_array_header_t *propchanges)
-{
-  apr_hash_t *newprops = apr_hash_copy(apr_hash_pool_get(props), props);
-  int i;
-
-  for (i = 0; i < propchanges->nelts; ++i)
-    {
-      const svn_prop_t *prop = &APR_ARRAY_IDX(propchanges, i, svn_prop_t);
-      apr_hash_set(newprops, prop->name, APR_HASH_KEY_STRING, prop->value);
-    }
-
-  return newprops;
-}
-
-
 /* Diff the file PATH against its text base.  At this
  * stage we are dealing with a file that does exist in the working copy.
  *
@@ -924,1017 +682,8 @@ walk_local_nodes_diff(struct edit_baton 
   return SVN_NO_ERROR;
 }
 
-/* Report an existing file in the working copy (either in BASE or WORKING)
- * as having been added.
- *
- * DIR_BATON is the parent directory baton, ADM_ACCESS/PATH is the path
- * to the file to be compared.
- *
- * Do all allocation in POOL.
- */
-static svn_error_t *
-report_wc_file_as_added(struct edit_baton *eb,
-                        const char *local_abspath,
-                        const char *path,
-                        apr_pool_t *scratch_pool)
-{
-  svn_wc__db_t *db = eb->db;
-  apr_hash_t *emptyprops;
-  const char *mimetype;
-  apr_hash_t *wcprops = NULL;
-  apr_array_header_t *propchanges;
-  const char *empty_file;
-  const char *source_file;
-  const char *translated_file;
-  svn_wc__db_status_t status;
-  svn_revnum_t revision;
-
-  /* If this entry is filtered by changelist specification, do nothing. */
-  if (! svn_wc__internal_changelist_match(db, local_abspath,
-                                          eb->changelist_hash, scratch_pool))
-    return SVN_NO_ERROR;
-
-  SVN_ERR(get_empty_file(eb, &empty_file));
-
-  SVN_ERR(svn_wc__db_read_info(&status, NULL, &revision, NULL, NULL, NULL,
-                               NULL, NULL, NULL, NULL, NULL, NULL, NULL,
-                               NULL, NULL, NULL, NULL, NULL, NULL, NULL,
-                               NULL, NULL, NULL, NULL, NULL, NULL, NULL,
-                               db, local_abspath,
-                               scratch_pool, scratch_pool));
-
-  if (status == svn_wc__db_status_added)
-    SVN_ERR(svn_wc__db_scan_addition(&status, NULL, NULL, NULL, NULL, NULL,
-                                     NULL, NULL, NULL, db, local_abspath,
-                                     scratch_pool, scratch_pool));
-
-  /* We can't show additions for files that don't exist. */
-  SVN_ERR_ASSERT(status != svn_wc__db_status_deleted || eb->use_text_base);
-
-  /* If the file was added *with history*, then we don't want to
-     see a comparison to the empty file;  we want the usual working
-     vs. text-base comparison. */
-  if (status == svn_wc__db_status_copied ||
-      status == svn_wc__db_status_moved_here)
-    {
-      /* Don't show anything if we're comparing to BASE, since by
-         definition there can't be any local modifications. */
-      if (eb->use_text_base)
-        return SVN_NO_ERROR;
-
-      /* Otherwise show just the local modifications. */
-      return file_diff(eb, local_abspath, path, scratch_pool);
-    }
-
-  emptyprops = apr_hash_make(scratch_pool);
-
-  if (eb->use_text_base)
-    SVN_ERR(svn_wc__get_pristine_props(&wcprops, db, local_abspath,
-                                       scratch_pool, scratch_pool));
-  else
-    SVN_ERR(svn_wc__get_actual_props(&wcprops, db, local_abspath,
-                                     scratch_pool, scratch_pool));
-  mimetype = get_prop_mimetype(wcprops);
-
-  SVN_ERR(svn_prop_diffs(&propchanges,
-                         wcprops, emptyprops, scratch_pool));
-
-
-  if (eb->use_text_base)
-    SVN_ERR(get_pristine_file(&source_file, db, local_abspath,
-                              TRUE, scratch_pool, scratch_pool));
-  else
-    source_file = local_abspath;
-
-  SVN_ERR(svn_wc__internal_translated_file(
-           &translated_file, source_file, db, local_abspath,
-           SVN_WC_TRANSLATE_TO_NF | SVN_WC_TRANSLATE_USE_GLOBAL_TMP,
-           eb->cancel_func, eb->cancel_baton,
-           scratch_pool, scratch_pool));
-
-  SVN_ERR(eb->callbacks->file_added(NULL, NULL, NULL,
-                                    path,
-                                    empty_file, translated_file,
-                                    0, revision,
-                                    NULL, mimetype,
-                                    NULL, SVN_INVALID_REVNUM,
-                                    propchanges, emptyprops,
-                                    eb->callback_baton,
-                                    scratch_pool));
-
-  return SVN_NO_ERROR;
-}
-
-/* Report an existing directory in the working copy (either in BASE
- * or WORKING) as having been added.  If recursing, also report any
- * subdirectories as added.
- *
- * DIR_BATON is the baton for the directory.
- *
- * Do all allocation in POOL.
- */
-static svn_error_t *
-report_wc_directory_as_added(struct edit_baton *eb,
-                             const char *local_abspath,
-                             const char *path,
-                             svn_depth_t depth,
-                             apr_pool_t *scratch_pool)
-{
-  svn_wc__db_t *db = eb->db;
-  apr_hash_t *emptyprops, *wcprops = NULL;
-  apr_array_header_t *propchanges;
-  const apr_array_header_t *children;
-  int i;
-  apr_pool_t *iterpool;
-
-  emptyprops = apr_hash_make(scratch_pool);
-
-  /* If this directory passes changelist filtering, get its BASE or
-     WORKING properties, as appropriate, and simulate their
-     addition.
-     ### it should be noted that we do not currently allow directories
-     ### to be part of changelists, so if a changelist is provided, this
-     ### check will always fail. */
-  if (svn_wc__internal_changelist_match(db, local_abspath,
-                                        eb->changelist_hash, scratch_pool))
-    {
-      if (eb->use_text_base)
-        SVN_ERR(svn_wc__get_pristine_props(&wcprops, db, local_abspath,
-                                           scratch_pool, scratch_pool));
-      else
-        SVN_ERR(svn_wc__get_actual_props(&wcprops, db, local_abspath,
-                                         scratch_pool, scratch_pool));
-
-      SVN_ERR(svn_prop_diffs(&propchanges, wcprops, emptyprops, scratch_pool));
-
-      if (propchanges->nelts > 0)
-        SVN_ERR(eb->callbacks->dir_props_changed(NULL, NULL,
-                                                 path, TRUE,
-                                                 propchanges, emptyprops,
-                                                 eb->callback_baton,
-                                                 scratch_pool));
-    }
-
-  /* Report the addition of the directory's contents. */
-  iterpool = svn_pool_create(scratch_pool);
-
-  SVN_ERR(svn_wc__db_read_children(&children, db, local_abspath,
-                                   scratch_pool, iterpool));
-
-  for (i = 0; i < children->nelts; i++)
-    {
-      const char *name = APR_ARRAY_IDX(children, i, const char *);
-      const char *child_abspath, *child_path;
-      svn_wc__db_status_t status;
-      svn_wc__db_kind_t kind;
-
-      svn_pool_clear(iterpool);
-
-      if (eb->cancel_func)
-        SVN_ERR(eb->cancel_func(eb->cancel_baton));
-
-      child_abspath = svn_dirent_join(local_abspath, name, iterpool);
-
-      SVN_ERR(svn_wc__db_read_info(&status, &kind, NULL, NULL, NULL, NULL,
-                                   NULL, NULL, NULL, NULL, NULL, NULL, NULL,
-                                   NULL, NULL, NULL, NULL, NULL, NULL, NULL,
-                                   NULL, NULL, NULL, NULL, NULL, NULL, NULL,
-                                   db, child_abspath, iterpool, iterpool));
-
-      if (status == svn_wc__db_status_not_present
-          || status == svn_wc__db_status_excluded
-          || status == svn_wc__db_status_absent)
-        {
-          continue;
-        }
-
-      /* If comparing against WORKING, skip entries that are
-         schedule-deleted - they don't really exist. */
-      if (!eb->use_text_base && status == svn_wc__db_status_deleted)
-        continue;
-
-      child_path = svn_relpath_join(path, name, iterpool);
-
-      switch (kind)
-        {
-        case svn_wc__db_kind_file:
-        case svn_wc__db_kind_symlink:
-          SVN_ERR(report_wc_file_as_added(eb, child_abspath, child_path,
-                                          iterpool));
-          break;
-
-        case svn_wc__db_kind_dir:
-          if (depth > svn_depth_files || depth == svn_depth_unknown)
-            {
-              svn_depth_t depth_below_here = depth;
-
-              if (depth_below_here == svn_depth_immediates)
-                depth_below_here = svn_depth_empty;
-
-              SVN_ERR(report_wc_directory_as_added(eb,
-                                                   child_abspath,
-                                                   child_path,
-                                                   depth_below_here,
-                                                   iterpool));
-            }
-          break;
-
-        default:
-          break;
-        }
-    }
-
-  svn_pool_destroy(iterpool);
-
-  return SVN_NO_ERROR;
-}
-
-
-/* An editor function. */
-static svn_error_t *
-set_target_revision(void *edit_baton,
-                    svn_revnum_t target_revision,
-                    apr_pool_t *pool)
-{
-  struct edit_baton *eb = edit_baton;
-  eb->revnum = target_revision;
-
-  return SVN_NO_ERROR;
-}
-
-/* An editor function. The root of the comparison hierarchy */
-static svn_error_t *
-open_root(void *edit_baton,
-          svn_revnum_t base_revision,
-          apr_pool_t *dir_pool,
-          void **root_baton)
-{
-  struct edit_baton *eb = edit_baton;
-  struct dir_baton *db;
-
-  eb->root_opened = TRUE;
-  db = make_dir_baton("", NULL, eb, FALSE, eb->depth, dir_pool);
-  *root_baton = db;
-
-  return SVN_NO_ERROR;
-}
-
-/* An editor function. */
-static svn_error_t *
-delete_entry(const char *path,
-             svn_revnum_t base_revision,
-             void *parent_baton,
-             apr_pool_t *pool)
-{
-  struct dir_baton *pb = parent_baton;
-  struct edit_baton *eb = pb->eb;
-  svn_wc__db_t *db = eb->db;
-  const char *empty_file;
-  const char *name = svn_dirent_basename(path, NULL);
-  const char *local_abspath = svn_dirent_join(pb->local_abspath, name, pool);
-  svn_wc__db_status_t status;
-  svn_wc__db_kind_t kind;
-
-  /* Mark this node as compared in the parent directory's baton. */
-  apr_hash_set(pb->compared, apr_pstrdup(pb->pool, path),
-               APR_HASH_KEY_STRING, "");
-
-  SVN_ERR(svn_wc__db_read_info(&status, &kind, NULL, NULL, NULL, NULL,
-                               NULL, NULL, NULL, NULL, NULL, NULL, NULL,
-                               NULL, NULL, NULL, NULL, NULL, NULL, NULL,
-                               NULL, NULL, NULL, NULL, NULL, NULL, NULL,
-                               db, local_abspath, pool, pool));
-
-  /* If comparing against WORKING, skip nodes that are deleted
-     - they don't really exist. */
-  if (!eb->use_text_base && status == svn_wc__db_status_deleted)
-    return SVN_NO_ERROR;
-
-  SVN_ERR(get_empty_file(pb->eb, &empty_file));
-  switch (kind)
-    {
-    case svn_wc__db_kind_file:
-    case svn_wc__db_kind_symlink:
-      /* A delete is required to change working-copy into requested
-         revision, so diff should show this as an add. Thus compare
-         the empty file against the current working copy.  If
-         'reverse_order' is set, then show a deletion. */
-
-      if (eb->reverse_order)
-        {
-          /* Whenever showing a deletion, we show the text-base vanishing. */
-          /* ### This is wrong if we're diffing WORKING->repos. */
-          const char *textbase;
-
-          apr_hash_t *baseprops = NULL;
-          const char *base_mimetype;
-
-          SVN_ERR(get_pristine_file(&textbase, db, local_abspath,
-                                    eb->use_text_base, pool, pool));
-
-          SVN_ERR(svn_wc__get_pristine_props(&baseprops, eb->db, local_abspath,
-                                             pool, pool));
-          base_mimetype = get_prop_mimetype(baseprops);
-
-          SVN_ERR(eb->callbacks->file_deleted(NULL, NULL, path,
-                                              textbase,
-                                              empty_file,
-                                              base_mimetype,
-                                              NULL,
-                                              baseprops,
-                                              eb->callback_baton,
-                                              pool));
-        }
-      else
-        {
-          /* Or normally, show the working file being added. */
-          SVN_ERR(report_wc_file_as_added(eb, local_abspath, path, pool));
-        }
-      break;
-    case svn_wc__db_kind_dir:
-      /* A delete is required to change working-copy into requested
-         revision, so diff should show this as an add. */
-      SVN_ERR(report_wc_directory_as_added(eb,
-                                           local_abspath,
-                                           path,
-                                           svn_depth_infinity,
-                                           pool));
-
-    default:
-      break;
-    }
-
-  return SVN_NO_ERROR;
-}
-
-/* An editor function. */
-static svn_error_t *
-add_directory(const char *path,
-              void *parent_baton,
-              const char *copyfrom_path,
-              svn_revnum_t copyfrom_revision,
-              apr_pool_t *dir_pool,
-              void **child_baton)
-{
-  struct dir_baton *pb = parent_baton;
-  struct dir_baton *db;
-  svn_depth_t subdir_depth = (pb->depth == svn_depth_immediates)
-                              ? svn_depth_empty : pb->depth;
-
-  /* ### TODO: support copyfrom? */
-
-  db = make_dir_baton(path, pb, pb->eb, TRUE, subdir_depth,
-                      dir_pool);
-  *child_baton = db;
-
-  return SVN_NO_ERROR;
-}
-
-/* An editor function. */
-static svn_error_t *
-open_directory(const char *path,
-               void *parent_baton,
-               svn_revnum_t base_revision,
-               apr_pool_t *dir_pool,
-               void **child_baton)
-{
-  struct dir_baton *pb = parent_baton;
-  struct dir_baton *db;
-  svn_depth_t subdir_depth = (pb->depth == svn_depth_immediates)
-                              ? svn_depth_empty : pb->depth;
-
-  /* Allocate path from the parent pool since the memory is used in the
-     parent's compared hash */
-  db = make_dir_baton(path, pb, pb->eb, FALSE, subdir_depth, dir_pool);
-  *child_baton = db;
-
-  SVN_ERR(db->eb->callbacks->dir_opened(NULL, NULL, NULL,
-                                        path, base_revision,
-                                        db->eb->callback_baton, dir_pool));
-
-  return SVN_NO_ERROR;
-}
-
-
-/* An editor function.  When a directory is closed, all the directory
- * elements that have been added or replaced will already have been
- * diff'd. However there may be other elements in the working copy
- * that have not yet been considered.  */
-static svn_error_t *
-close_directory(void *dir_baton,
-                apr_pool_t *pool)
-{
-  struct dir_baton *db = dir_baton;
-  struct dir_baton *pb = db->parent_baton;
-  struct edit_baton *eb = db->eb;
-
-  /* Report the property changes on the directory itself, if necessary. */
-  if (db->propchanges->nelts > 0)
-    {
-      /* The working copy properties at the base of the wc->repos comparison:
-         either BASE or WORKING. */
-      apr_hash_t *originalprops;
-
-      if (db->added)
-        {
-          originalprops = apr_hash_make(db->pool);
-        }
-      else
-        {
-          if (db->eb->use_text_base)
-            {
-              SVN_ERR(svn_wc__get_pristine_props(&originalprops,
-                                                 eb->db, db->local_abspath,
-                                                 pool, pool));
-            }
-          else
-            {
-              apr_hash_t *base_props, *repos_props;
-
-              SVN_ERR(svn_wc__get_actual_props(&originalprops,
-                                               eb->db, db->local_abspath,
-                                               pool, pool));
-
-              /* Load the BASE and repository directory properties. */
-              SVN_ERR(svn_wc__get_pristine_props(&base_props,
-                                                 eb->db, db->local_abspath,
-                                                 pool, pool));
-
-              repos_props = apply_propchanges(base_props, db->propchanges);
-
-              /* Recalculate b->propchanges as the change between WORKING
-                 and repos. */
-              SVN_ERR(svn_prop_diffs(&db->propchanges,
-                                     repos_props, originalprops, db->pool));
-            }
-        }
-
-      if (!eb->reverse_order)
-        reverse_propchanges(originalprops, db->propchanges, db->pool);
-
-      SVN_ERR(eb->callbacks->dir_props_changed(NULL, NULL,
-                                               db->path,
-                                               db->added,
-                                               db->propchanges,
-                                               originalprops,
-                                               eb->callback_baton,
-                                               pool));
-
-      /* Mark the properties of this directory as having already been
-         compared so that we know not to show any local modifications
-         later on. */
-      apr_hash_set(db->compared, db->path, 0, "");
-    }
-
-  /* Report local modifications for this directory.  Skip added
-     directories since they can only contain added elements, all of
-     which have already been diff'd. */
-  if (!db->added)
-    SVN_ERR(walk_local_nodes_diff(eb,
-                                  db->local_abspath,
-                                  db->path,
-                                  db->depth,
-                                  db->compared,
-                                  db->pool));
-
-  /* Mark this directory as compared in the parent directory's baton,
-     unless this is the root of the comparison. */
-  if (pb)
-    apr_hash_set(pb->compared, apr_pstrdup(pb->pool, db->path),
-                 APR_HASH_KEY_STRING, "");
-
-  SVN_ERR(db->eb->callbacks->dir_closed(NULL, NULL, NULL, db->path,
-                                        db->added, db->eb->callback_baton,
-                                        db->pool));
-
-  return SVN_NO_ERROR;
-}
-
-/* An editor function. */
-static svn_error_t *
-add_file(const char *path,
-         void *parent_baton,
-         const char *copyfrom_path,
-         svn_revnum_t copyfrom_revision,
-         apr_pool_t *file_pool,
-         void **file_baton)
-{
-  struct dir_baton *pb = parent_baton;
-  struct file_baton *fb;
-
-  /* ### TODO: support copyfrom? */
-
-  fb = make_file_baton(path, TRUE, pb, file_pool);
-  *file_baton = fb;
-
-  /* Add this filename to the parent directory's list of elements that
-     have been compared. */
-  apr_hash_set(pb->compared, apr_pstrdup(pb->pool, path),
-               APR_HASH_KEY_STRING, "");
-
-  return SVN_NO_ERROR;
-}
-
-/* An editor function. */
-static svn_error_t *
-open_file(const char *path,
-          void *parent_baton,
-          svn_revnum_t base_revision,
-          apr_pool_t *file_pool,
-          void **file_baton)
-{
-  struct dir_baton *pb = parent_baton;
-  struct edit_baton *eb = pb->eb;
-  struct file_baton *fb;
-
-  fb = make_file_baton(path, FALSE, pb, file_pool);
-  *file_baton = fb;
-
-  /* Add this filename to the parent directory's list of elements that
-     have been compared. */
-  apr_hash_set(pb->compared, apr_pstrdup(pb->pool, path),
-               APR_HASH_KEY_STRING, "");
-
-  SVN_ERR(svn_wc__db_base_get_info(NULL, NULL, NULL, NULL, NULL, NULL, NULL,
-                                   NULL, NULL, NULL, &fb->base_checksum, NULL,
-                                   NULL, NULL, NULL, NULL, NULL, NULL,
-                                   eb->db, fb->local_abspath,
-                                   fb->pool, fb->pool));
-
-  SVN_ERR(eb->callbacks->file_opened(NULL, NULL, fb->path, base_revision,
-                                     eb->callback_baton, fb->pool));
-
-  return SVN_NO_ERROR;
-}
-
-/* Baton for window_handler */
-struct window_handler_baton
-{
-  struct file_baton *fb;
-
-  /* APPLY_HANDLER/APPLY_BATON represent the delta applcation baton. */
-  svn_txdelta_window_handler_t apply_handler;
-  void *apply_baton;
-
-  unsigned char result_digest[APR_MD5_DIGESTSIZE];
-};
-
-/* Do the work of applying the text delta. */
-static svn_error_t *
-window_handler(svn_txdelta_window_t *window,
-               void *window_baton)
-{
-  struct window_handler_baton *whb = window_baton;
-  struct file_baton *fb = whb->fb;
-
-  SVN_ERR(whb->apply_handler(window, whb->apply_baton));
-
-  if (!window)
-    {
-      fb->result_checksum = svn_checksum__from_digest(whb->result_digest,
-                                                      svn_checksum_md5,
-                                                      fb->pool);
-    }
-
-  return SVN_NO_ERROR;
-}
-
-/* An editor function. */
-static svn_error_t *
-apply_textdelta(void *file_baton,
-                const char *base_checksum,
-                apr_pool_t *pool,
-                svn_txdelta_window_handler_t *handler,
-                void **handler_baton)
-{
-  struct file_baton *fb = file_baton;
-  struct window_handler_baton *whb;
-  struct edit_baton *eb = fb->eb;
-  const char *temp_dir;
-  svn_stream_t *source;
-  svn_stream_t *temp_stream;
-
-  if (fb->base_checksum)
-    SVN_ERR(svn_wc__db_pristine_read(&source, NULL,
-                                     eb->db, fb->local_abspath,
-                                     fb->base_checksum,
-                                     pool, pool));
-  else
-    source = svn_stream_empty(pool);
-
-
-
-  /* This is the file that will contain the pristine repository version. It
-     is created in the admin temporary area. This file continues to exists
-     until after the diff callback is run, at which point it is deleted. */
-  SVN_ERR(svn_wc__db_temp_wcroot_tempdir(&temp_dir, eb->db, fb->local_abspath,
-                                         pool, pool));
-  SVN_ERR(svn_stream_open_unique(&temp_stream, &fb->temp_file_path,
-                                 temp_dir, svn_io_file_del_on_pool_cleanup,
-                                 fb->pool, fb->pool));
-
-  whb = apr_pcalloc(fb->pool, sizeof(*whb));
-  whb->fb = fb;
-
-  svn_txdelta_apply(source, temp_stream,
-                    whb->result_digest,
-                    fb->temp_file_path /* error_info */,
-                    fb->pool,
-                    &whb->apply_handler, &whb->apply_baton);
-
-  *handler = window_handler;
-  *handler_baton = whb;
-  return SVN_NO_ERROR;
-}
-
-/* An editor function.  When the file is closed we have a temporary
- * file containing a pristine version of the repository file. This can
- * be compared against the working copy.
- *
- * Ignore TEXT_CHECKSUM.
- */
-static svn_error_t *
-close_file(void *file_baton,
-           const char *expected_md5_digest,
-           apr_pool_t *pool)
-{
-  struct file_baton *fb = file_baton;
-  struct edit_baton *eb = fb->eb;
-  svn_wc__db_t *db = eb->db;
-  apr_pool_t *scratch_pool = fb->pool;
-  svn_wc__db_status_t status;
-  const char *empty_file;
-  svn_error_t *err;
-
-  /* The BASE information */
-  const svn_checksum_t *pristine_checksum;
-  const char *pristine_file;
-  apr_hash_t *pristine_props;
-
-  /* The repository information; constructed from BASE + Changes */
-  const char *repos_file;
-  apr_hash_t *repos_props;
-  const char *repos_mimetype;
-  svn_boolean_t had_props, props_mod;
-
-  /* The path to the wc file: either a pristine or actual. */
-  const char *localfile;
-  svn_boolean_t modified;
-  /* The working copy properties at the base of the wc->repos
-     comparison: either BASE or WORKING. */
-  apr_hash_t *originalprops;
-
-  if (expected_md5_digest != NULL)
-    {
-      svn_checksum_t *expected_checksum;
-      const svn_checksum_t *repos_checksum = fb->result_checksum;
-
-      SVN_ERR(svn_checksum_parse_hex(&expected_checksum, svn_checksum_md5,
-                                     expected_md5_digest, pool));
-
-      if (repos_checksum == NULL)
-        repos_checksum = fb->base_checksum;
-
-      if (repos_checksum->kind != svn_checksum_md5)
-        SVN_ERR(svn_wc__db_pristine_get_md5(&repos_checksum,
-                                            eb->db, fb->local_abspath,
-                                            repos_checksum,
-                                            pool, pool));
-
-      if (!svn_checksum_match(expected_checksum, repos_checksum))
-        return svn_checksum_mismatch_err(
-                            expected_checksum,
-                            repos_checksum,
-                            pool,
-                            _("Checksum mismatch for '%s'"),
-                            svn_dirent_local_style(fb->local_abspath, pool));
-    }
-
-  err = svn_wc__db_read_info(&status, NULL, NULL, NULL, NULL, NULL, NULL,
-                             NULL, NULL, NULL, &pristine_checksum, NULL, NULL,
-                             NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
-                             NULL, &had_props, &props_mod,
-                             NULL, NULL, NULL,
-                             db, fb->local_abspath,
-                             scratch_pool, scratch_pool);
-  if (fb->added
-      && err && err->apr_err == SVN_ERR_WC_PATH_NOT_FOUND)
-    {
-      svn_error_clear(err);
-      status = svn_wc__db_status_not_present;
-      pristine_checksum = NULL;
-      had_props = FALSE;
-      props_mod = FALSE;
-    }
-  else
-    SVN_ERR(err);
-
-  SVN_ERR(get_empty_file(eb, &empty_file));
-
-  if (fb->added)
-    {
-      pristine_props = apr_hash_make(scratch_pool);
-      pristine_file = empty_file;
-    }
-  else
-    {
-      if (status != svn_wc__db_status_normal)
-        SVN_ERR(svn_wc__db_base_get_info(NULL, NULL, NULL, NULL, NULL, NULL,
-                                         NULL, NULL, NULL, NULL,
-                                         &pristine_checksum,
-                                         NULL, NULL, NULL, NULL,
-                                         &had_props, NULL, NULL,
-                                         db, fb->local_abspath,
-                                         scratch_pool, scratch_pool));
-
-      SVN_ERR(svn_wc__db_pristine_get_path(&pristine_file,
-                                           db, fb->local_abspath,
-                                           pristine_checksum,
-                                           scratch_pool, scratch_pool));
-
-      if (had_props)
-        SVN_ERR(svn_wc__db_base_get_props(&pristine_props,
-                                           db, fb->local_abspath,
-                                           scratch_pool, scratch_pool));
-      else
-        pristine_props = apr_hash_make(scratch_pool);
-    }
-
-  if (status == svn_wc__db_status_added)
-    SVN_ERR(svn_wc__db_scan_addition(&status, NULL, NULL, NULL, NULL, NULL,
-                                     NULL, NULL, NULL, eb->db,
-                                     fb->local_abspath, pool, pool));
-
-  repos_props = apply_propchanges(pristine_props, fb->propchanges);
-  repos_mimetype = get_prop_mimetype(repos_props);
-  repos_file = fb->temp_file_path ? fb->temp_file_path : pristine_file;
-
-  /* If the file isn't in the working copy (either because it was added
-     in the BASE->repos diff or because we're diffing against WORKING
-     and it was marked as schedule-deleted), we show either an addition
-     or a deletion of the complete contents of the repository file,
-     depending upon the direction of the diff. */
-  if (fb->added || (!eb->use_text_base && status == svn_wc__db_status_deleted))
-    {
-      if (eb->reverse_order)
-        return eb->callbacks->file_added(NULL, NULL, NULL, fb->path,
-                                         empty_file,
-                                         repos_file,
-                                         0,
-                                         eb->revnum,
-                                         NULL,
-                                         repos_mimetype,
-                                         NULL, SVN_INVALID_REVNUM,
-                                         fb->propchanges,
-                                         apr_hash_make(pool),
-                                         eb->callback_baton,
-                                         pool);
-      else
-        return eb->callbacks->file_deleted(NULL, NULL, fb->path,
-                                           repos_file,
-                                           empty_file,
-                                           repos_mimetype,
-                                           NULL,
-                                           repos_props,
-                                           eb->callback_baton,
-                                           pool);
-    }
-
-  /* If the file was locally added with history, and we want to show copies
-   * as added, diff the file with the empty file. */
-  if ((status == svn_wc__db_status_copied ||
-       status == svn_wc__db_status_moved_here) && eb->show_copies_as_adds)
-    return eb->callbacks->file_added(NULL, NULL, NULL, fb->path,
-                                     empty_file,
-                                     fb->local_abspath,
-                                     0,
-                                     eb->revnum,
-                                     NULL,
-                                     repos_mimetype,
-                                     NULL, SVN_INVALID_REVNUM,
-                                     fb->propchanges,
-                                     apr_hash_make(pool),
-                                     eb->callback_baton,
-                                     pool);
-
-  /* If we didn't see any content changes between the BASE and repository
-     versions (i.e. we only saw property changes), then, if we're diffing
-     against WORKING, we also need to check whether there are any local
-     (BASE:WORKING) modifications. */
-  modified = (fb->temp_file_path != NULL);
-  if (!modified && !eb->use_text_base)
-    SVN_ERR(svn_wc__internal_file_modified_p(&modified, NULL, NULL, eb->db,
-                                             fb->local_abspath,
-                                             FALSE, TRUE, pool));
-
-  if (modified)
-    {
-      if (eb->use_text_base)
-        SVN_ERR(get_pristine_file(&localfile, eb->db, fb->local_abspath,
-                                  TRUE, fb->pool, pool));
-      else
-        /* a detranslated version of the working file */
-        SVN_ERR(svn_wc__internal_translated_file(
-                 &localfile, fb->local_abspath, eb->db, fb->local_abspath,
-                 SVN_WC_TRANSLATE_TO_NF | SVN_WC_TRANSLATE_USE_GLOBAL_TMP,
-                 eb->cancel_func, eb->cancel_baton,
-                 pool, pool));
-    }
-  else
-    localfile = repos_file = NULL;
-
-  if (eb->use_text_base)
-    {
-      originalprops = pristine_props;
-    }
-  else
-    {
-      SVN_ERR(svn_wc__get_actual_props(&originalprops,
-                                       eb->db, fb->local_abspath,
-                                       pool, pool));
-
-      /* We have the repository properties in repos_props, and the
-         WORKING properties in originalprops.  Recalculate
-         fb->propchanges as the change between WORKING and repos. */
-      SVN_ERR(svn_prop_diffs(&fb->propchanges,
-                             repos_props, originalprops, fb->pool));
-    }
-
-  if (localfile || fb->propchanges->nelts > 0)
-    {
-      const char *original_mimetype = get_prop_mimetype(originalprops);
-
-      if (fb->propchanges->nelts > 0
-          && ! eb->reverse_order)
-        reverse_propchanges(originalprops, fb->propchanges, fb->pool);
-
-      SVN_ERR(eb->callbacks->file_changed(NULL, NULL, NULL,
-                                          fb->path,
-                                          eb->reverse_order ? localfile
-                                                            : repos_file,
-                                           eb->reverse_order
-                                                          ? repos_file
-                                                          : localfile,
-                                           eb->reverse_order
-                                                          ? SVN_INVALID_REVNUM
-                                                          : eb->revnum,
-                                           eb->reverse_order
-                                                          ? eb->revnum
-                                                          : SVN_INVALID_REVNUM,
-                                           eb->reverse_order
-                                                          ? original_mimetype
-                                                          : repos_mimetype,
-                                           eb->reverse_order
-                                                          ? repos_mimetype
-                                                          : original_mimetype,
-                                           fb->propchanges, originalprops,
-                                           eb->callback_baton,
-                                           pool));
-    }
-
-  return SVN_NO_ERROR;
-}
-
-
-/* An editor function. */
-static svn_error_t *
-change_file_prop(void *file_baton,
-                 const char *name,
-                 const svn_string_t *value,
-                 apr_pool_t *pool)
-{
-  struct file_baton *fb = file_baton;
-  svn_prop_t *propchange;
-
-  propchange = apr_array_push(fb->propchanges);
-  propchange->name = apr_pstrdup(fb->pool, name);
-  propchange->value = value ? svn_string_dup(value, fb->pool) : NULL;
-
-  return SVN_NO_ERROR;
-}
-
-
-/* An editor function. */
-static svn_error_t *
-change_dir_prop(void *dir_baton,
-                const char *name,
-                const svn_string_t *value,
-                apr_pool_t *pool)
-{
-  struct dir_baton *db = dir_baton;
-  svn_prop_t *propchange;
-
-  propchange = apr_array_push(db->propchanges);
-  propchange->name = apr_pstrdup(db->pool, name);
-  propchange->value = value ? svn_string_dup(value, db->pool) : NULL;
-
-  return SVN_NO_ERROR;
-}
-
-
-/* An editor function. */
-static svn_error_t *
-close_edit(void *edit_baton,
-           apr_pool_t *pool)
-{
-  struct edit_baton *eb = edit_baton;
-
-  if (!eb->root_opened)
-    {
-      SVN_ERR(walk_local_nodes_diff(eb,
-                                    eb->anchor_abspath,
-                                    "",
-                                    eb->depth,
-                                    NULL,
-                                    eb->pool));
-    }
-
-  return SVN_NO_ERROR;
-}
 
 /* Public Interface */
-
-
-/* Create a diff editor and baton. */
-svn_error_t *
-svn_wc_get_diff_editor6(const svn_delta_editor_t **editor,
-                        void **edit_baton,
-                        svn_wc_context_t *wc_ctx,
-                        const char *anchor_abspath,
-                        const char *target,
-                        svn_depth_t depth,
-                        svn_boolean_t ignore_ancestry,
-                        svn_boolean_t show_copies_as_adds,
-                        svn_boolean_t use_git_diff_format,
-                        svn_boolean_t use_text_base,
-                        svn_boolean_t reverse_order,
-                        svn_boolean_t server_performs_filtering,
-                        const apr_array_header_t *changelists,
-                        const svn_wc_diff_callbacks4_t *callbacks,
-                        void *callback_baton,
-                        svn_cancel_func_t cancel_func,
-                        void *cancel_baton,
-                        apr_pool_t *result_pool,
-                        apr_pool_t *scratch_pool)
-{
-  struct edit_baton *eb;
-  void *inner_baton;
-  svn_delta_editor_t *tree_editor;
-  const svn_delta_editor_t *inner_editor;
-
-  SVN_ERR_ASSERT(svn_dirent_is_absolute(anchor_abspath));
-
-  SVN_ERR(make_edit_baton(&eb,
-                          wc_ctx->db,
-                          anchor_abspath, target,
-                          callbacks, callback_baton,
-                          depth, ignore_ancestry, show_copies_as_adds,
-                          use_git_diff_format,
-                          use_text_base, reverse_order, changelists,
-                          cancel_func, cancel_baton,
-                          result_pool));
-
-  tree_editor = svn_delta_default_editor(eb->pool);
-
-  tree_editor->set_target_revision = set_target_revision;
-  tree_editor->open_root = open_root;
-  tree_editor->delete_entry = delete_entry;
-  tree_editor->add_directory = add_directory;
-  tree_editor->open_directory = open_directory;
-  tree_editor->close_directory = close_directory;
-  tree_editor->add_file = add_file;
-  tree_editor->open_file = open_file;
-  tree_editor->apply_textdelta = apply_textdelta;
-  tree_editor->change_file_prop = change_file_prop;
-  tree_editor->change_dir_prop = change_dir_prop;
-  tree_editor->close_file = close_file;
-  tree_editor->close_edit = close_edit;
-
-  inner_editor = tree_editor;
-  inner_baton = eb;
-
-  if (!server_performs_filtering
-      && depth == svn_depth_unknown)
-    SVN_ERR(svn_wc__ambient_depth_filter_editor(&inner_editor,
-                                                &inner_baton,
-                                                wc_ctx->db,
-                                                anchor_abspath,
-                                                target,
-                                                inner_editor,
-                                                inner_baton,
-                                                result_pool));
-
-  return svn_delta_get_cancellation_editor(cancel_func,
-                                           cancel_baton,
-                                           inner_editor,
-                                           inner_baton,
-                                           editor,
-                                           edit_baton,
-                                           result_pool);
-}
-
-
-/* Compare working copy against the text-base. */
 svn_error_t *
 svn_wc_diff6(svn_wc_context_t *wc_ctx,
              const char *target_abspath,