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 2013/01/30 12:42:27 UTC

svn commit: r1440354 - in /subversion/trunk/subversion: include/private/svn_diff_tree.h libsvn_diff/diff_tree.c

Author: rhuijben
Date: Wed Jan 30 11:42:27 2013
New Revision: 1440354

URL: http://svn.apache.org/viewvc?rev=1440354&view=rev
Log:
To help in slowly migrating the merge code to the tree processor, create a
tee implementation of the tee processor that sends everything to two
processors.

* subversion/include/private/svn_diff_tree.h
  (svn_diff_tree_processor_t): Fix indentation of dir_changed arguments.
  (svn_diff__tree_processor_tee_create): New function.

* subversion/libsvn_diff/diff_tree.c
  (tee_baton_t): New struct.
  (tee_node_baton_t): New struct.

  (tee_*): New functions. Wrapping two processors to one.
  (svn_diff__tree_processor_tee_create): New function.

Modified:
    subversion/trunk/subversion/include/private/svn_diff_tree.h
    subversion/trunk/subversion/libsvn_diff/diff_tree.c

Modified: subversion/trunk/subversion/include/private/svn_diff_tree.h
URL: http://svn.apache.org/viewvc/subversion/trunk/subversion/include/private/svn_diff_tree.h?rev=1440354&r1=1440353&r2=1440354&view=diff
==============================================================================
--- subversion/trunk/subversion/include/private/svn_diff_tree.h (original)
+++ subversion/trunk/subversion/include/private/svn_diff_tree.h Wed Jan 30 11:42:27 2013
@@ -117,14 +117,14 @@ typedef struct svn_diff_tree_processor_t
    */
   svn_error_t *
   (*dir_changed)(const char *relpath,
-                const svn_diff_source_t *left_source,
-                const svn_diff_source_t *right_source,
-                /*const*/ apr_hash_t *left_props,
-                /*const*/ apr_hash_t *right_props,
-                const apr_array_header_t *prop_changes,
-                void *dir_baton,
-                const struct svn_diff_tree_processor_t *processor,
-                apr_pool_t *scratch_pool);
+                 const svn_diff_source_t *left_source,
+                 const svn_diff_source_t *right_source,
+                 /*const*/ apr_hash_t *left_props,
+                 /*const*/ apr_hash_t *right_props,
+                 const apr_array_header_t *prop_changes,
+                 void *dir_baton,
+                 const struct svn_diff_tree_processor_t *processor,
+                 apr_pool_t *scratch_pool);
 
   /* Called when a directory is closed without applying changes to
    * the directory itself.
@@ -233,6 +233,20 @@ svn_diff__tree_processor_reverse_create(
                                         const char *prefix_relpath,
                                         apr_pool_t *result_pool);
 
+/**
+ * Create a new svn_diff_tree_processor_t instance with all functions setup
+ * to first call into processor1 and then processor2.
+ *
+ * This function is mostly a debug and migration helper.
+ *
+ * @since New in 1.8.
+ */ /* Used by libsvn clients repository diff */
+const svn_diff_tree_processor_t *
+svn_diff__tree_processor_tee_create(svn_diff_tree_processor_t * processor1,
+                                    svn_diff_tree_processor_t * processor2,
+                                    apr_pool_t *result_pool);
+
+
 svn_diff_source_t *
 svn_diff__source_create(svn_revnum_t revision,
                         apr_pool_t *result_pool);

Modified: subversion/trunk/subversion/libsvn_diff/diff_tree.c
URL: http://svn.apache.org/viewvc/subversion/trunk/subversion/libsvn_diff/diff_tree.c?rev=1440354&r1=1440353&r2=1440354&view=diff
==============================================================================
--- subversion/trunk/subversion/libsvn_diff/diff_tree.c (original)
+++ subversion/trunk/subversion/libsvn_diff/diff_tree.c Wed Jan 30 11:42:27 2013
@@ -576,6 +576,425 @@ svn_diff__tree_processor_reverse_create(
   return reverse;
 }
 
+/* Processor baton for the tee tree processor */
+struct tee_baton_t
+{
+  const svn_diff_tree_processor_t *p1;
+  const svn_diff_tree_processor_t *p2;
+};
+
+/* Wrapper baton for file and directory batons in the tee processor */
+struct tee_node_baton_t
+{
+  void *baton1;
+  void *baton2;
+};
+
+static svn_error_t *
+tee_dir_opened(void **new_dir_baton,
+               svn_boolean_t *skip,
+               svn_boolean_t *skip_children,
+               const char *relpath,
+               const svn_diff_source_t *left_source,
+               const svn_diff_source_t *right_source,
+               const svn_diff_source_t *copyfrom_source,
+               void *parent_dir_baton,
+               const svn_diff_tree_processor_t *processor,
+               apr_pool_t *result_pool,
+               apr_pool_t *scratch_pool)
+{
+  struct tee_baton_t *tb = processor->baton;
+  struct tee_node_baton_t *pb = parent_dir_baton;
+  struct tee_node_baton_t *nb = apr_pcalloc(result_pool, sizeof(*nb));
+
+  SVN_ERR(tb->p1->dir_opened(&(nb->baton1),
+                             skip,
+                             skip_children,
+                             relpath,
+                             left_source,
+                             right_source,
+                             copyfrom_source,
+                             pb ? pb->baton1 : NULL,
+                             tb->p1,
+                             result_pool,
+                             scratch_pool));
+
+  SVN_ERR(tb->p2->dir_opened(&(nb->baton2),
+                             skip,
+                             skip_children,
+                             relpath,
+                             left_source,
+                             right_source,
+                             copyfrom_source,
+                             pb ? pb->baton2 : NULL,
+                             tb->p2,
+                             result_pool,
+                             scratch_pool));
+
+  *new_dir_baton = nb;
+
+  return SVN_NO_ERROR;
+}
+
+static svn_error_t *
+tee_dir_added(const char *relpath,
+              const svn_diff_source_t *copyfrom_source,
+              const svn_diff_source_t *right_source,
+              /*const*/ apr_hash_t *copyfrom_props,
+              /*const*/ apr_hash_t *right_props,
+              void *dir_baton,
+              const svn_diff_tree_processor_t *processor,
+              apr_pool_t *scratch_pool)
+{
+  struct tee_baton_t *tb = processor->baton;
+  struct tee_node_baton_t *db = dir_baton;
+
+  SVN_ERR(tb->p1->dir_added(relpath,
+                            copyfrom_source,
+                            right_source,
+                            copyfrom_props,
+                            right_props,
+                            db->baton1,
+                            tb->p1,
+                            scratch_pool));
+
+  SVN_ERR(tb->p2->dir_added(relpath,
+                            copyfrom_source,
+                            right_source,
+                            copyfrom_props,
+                            right_props,
+                            db->baton2,
+                            tb->p2,
+                            scratch_pool));
+
+  return SVN_NO_ERROR;
+}
+
+static svn_error_t *
+tee_dir_deleted(const char *relpath,
+                const svn_diff_source_t *left_source,
+                /*const*/ apr_hash_t *left_props,
+                void *dir_baton,
+                const svn_diff_tree_processor_t *processor,
+                apr_pool_t *scratch_pool)
+{
+  struct tee_baton_t *tb = processor->baton;
+  struct tee_node_baton_t *db = dir_baton;
+
+  SVN_ERR(tb->p1->dir_deleted(relpath,
+                              left_source,
+                              left_props,
+                              db->baton1,
+                              tb->p1,
+                              scratch_pool));
+
+  SVN_ERR(tb->p2->dir_deleted(relpath,
+                              left_source,
+                              left_props,
+                              db->baton2,
+                              tb->p2,
+                              scratch_pool));
+
+  return SVN_NO_ERROR;
+}
+
+static svn_error_t *
+tee_dir_changed(const char *relpath,
+                    const svn_diff_source_t *left_source,
+                    const svn_diff_source_t *right_source,
+                    /*const*/ apr_hash_t *left_props,
+                    /*const*/ apr_hash_t *right_props,
+                    const apr_array_header_t *prop_changes,
+                    void *dir_baton,
+                    const struct svn_diff_tree_processor_t *processor,
+                    apr_pool_t *scratch_pool)
+{
+  struct tee_baton_t *tb = processor->baton;
+  struct tee_node_baton_t *db = dir_baton;
+
+  SVN_ERR(tb->p1->dir_changed(relpath,
+                              left_source,
+                              right_source,
+                              left_props,
+                              right_props,
+                              prop_changes,
+                              db->baton1,
+                              tb->p1,
+                              scratch_pool));
+
+  SVN_ERR(tb->p2->dir_changed(relpath,
+                              left_source,
+                              right_source,
+                              left_props,
+                              right_props,
+                              prop_changes,
+                              db->baton2,
+                              tb->p2,
+                              scratch_pool));
+  return SVN_NO_ERROR;
+}
+
+static svn_error_t *
+tee_dir_closed(const char *relpath,
+               const svn_diff_source_t *left_source,
+               const svn_diff_source_t *right_source,
+               void *dir_baton,
+               const svn_diff_tree_processor_t *processor,
+               apr_pool_t *scratch_pool)
+{
+  struct tee_baton_t *tb = processor->baton;
+  struct tee_node_baton_t *db = dir_baton;
+
+  SVN_ERR(tb->p1->dir_closed(relpath,
+                             left_source,
+                             right_source,
+                             db->baton1,
+                             tb->p1,
+                             scratch_pool));
+
+  SVN_ERR(tb->p2->dir_closed(relpath,
+                             left_source,
+                             right_source,
+                             db->baton2,
+                             tb->p2,
+                             scratch_pool));
+  return SVN_NO_ERROR;
+}
+
+static svn_error_t *
+tee_file_opened(void **new_file_baton,
+                svn_boolean_t *skip,
+                const char *relpath,
+                const svn_diff_source_t *left_source,
+                const svn_diff_source_t *right_source,
+                const svn_diff_source_t *copyfrom_source,
+                void *dir_baton,
+                const svn_diff_tree_processor_t *processor,
+                apr_pool_t *result_pool,
+                apr_pool_t *scratch_pool)
+{
+  struct tee_baton_t *tb = processor->baton;
+  struct tee_node_baton_t *pb = dir_baton;
+  struct tee_node_baton_t *nb = apr_pcalloc(result_pool, sizeof(*nb));
+
+  SVN_ERR(tb->p1->file_opened(&(nb->baton1),
+                              skip,
+                              relpath,
+                              left_source,
+                              right_source,
+                              copyfrom_source,
+                              pb ? pb->baton1 : NULL,
+                              tb->p1,
+                              result_pool,
+                              scratch_pool));
+
+  SVN_ERR(tb->p2->file_opened(&(nb->baton2),
+                              skip,
+                              relpath,
+                              left_source,
+                              right_source,
+                              copyfrom_source,
+                              pb ? pb->baton2 : NULL,
+                              tb->p2,
+                              result_pool,
+                              scratch_pool));
+
+  *new_file_baton = nb;
+
+  return SVN_NO_ERROR;
+}
+
+static svn_error_t *
+tee_file_added(const char *relpath,
+               const svn_diff_source_t *copyfrom_source,
+               const svn_diff_source_t *right_source,
+               const char *copyfrom_file,
+               const char *right_file,
+               /*const*/ apr_hash_t *copyfrom_props,
+               /*const*/ apr_hash_t *right_props,
+               void *file_baton,
+               const svn_diff_tree_processor_t *processor,
+               apr_pool_t *scratch_pool)
+{
+  struct tee_baton_t *tb = processor->baton;
+  struct tee_node_baton_t *fb = file_baton;
+
+  SVN_ERR(tb->p1->file_added(relpath,
+                             copyfrom_source,
+                             right_source,
+                             copyfrom_file,
+                             right_file,
+                             copyfrom_props,
+                             right_props,
+                             fb->baton1,
+                             tb->p1,
+                             scratch_pool));
+
+  SVN_ERR(tb->p2->file_added(relpath,
+                             copyfrom_source,
+                             right_source,
+                             copyfrom_file,
+                             right_file,
+                             copyfrom_props,
+                             right_props,
+                             fb->baton2,
+                             tb->p2,
+                             scratch_pool));
+  return SVN_NO_ERROR;
+}
+
+static svn_error_t *
+tee_file_deleted(const char *relpath,
+                 const svn_diff_source_t *left_source,
+                 const char *left_file,
+                 /*const*/ apr_hash_t *left_props,
+                 void *file_baton,
+                 const svn_diff_tree_processor_t *processor,
+                 apr_pool_t *scratch_pool)
+{
+  struct tee_baton_t *tb = processor->baton;
+  struct tee_node_baton_t *fb = file_baton;
+
+  SVN_ERR(tb->p1->file_deleted(relpath,
+                               left_source,
+                               left_file,
+                               left_props,
+                               fb->baton1,
+                               tb->p1,
+                               scratch_pool));
+
+  SVN_ERR(tb->p2->file_deleted(relpath,
+                               left_source,
+                               left_file,
+                               left_props,
+                               fb->baton2,
+                               tb->p2,
+                               scratch_pool));
+  return SVN_NO_ERROR;
+}
+
+static svn_error_t *
+tee_file_changed(const char *relpath,
+                 const svn_diff_source_t *left_source,
+                 const svn_diff_source_t *right_source,
+                 const char *left_file,
+                 const char *right_file,
+                 /*const*/ apr_hash_t *left_props,
+                 /*const*/ apr_hash_t *right_props,
+                 svn_boolean_t file_modified,
+                 const apr_array_header_t *prop_changes,
+                 void *file_baton,
+                 const svn_diff_tree_processor_t *processor,
+                 apr_pool_t *scratch_pool)
+{
+  struct tee_baton_t *tb = processor->baton;
+  struct tee_node_baton_t *fb = file_baton;
+
+  SVN_ERR(tb->p1->file_changed(relpath,
+                               left_source,
+                               right_source,
+                               left_file,
+                               right_file,
+                               left_props,
+                               right_props,
+                               file_modified,
+                               prop_changes,
+                               fb->baton1,
+                               tb->p1,
+                               scratch_pool));
+
+  SVN_ERR(tb->p2->file_changed(relpath,
+                               left_source,
+                               right_source,
+                               left_file,
+                               right_file,
+                               left_props,
+                               right_props,
+                               file_modified,
+                               prop_changes,
+                               fb->baton2,
+                               tb->p2,
+                               scratch_pool));
+  return SVN_NO_ERROR;
+}
+
+static svn_error_t *
+tee_file_closed(const char *relpath,
+                    const svn_diff_source_t *left_source,
+                    const svn_diff_source_t *right_source,
+                    void *file_baton,
+                    const svn_diff_tree_processor_t *processor,
+                    apr_pool_t *scratch_pool)
+{
+  struct tee_baton_t *tb = processor->baton;
+  struct tee_node_baton_t *fb = file_baton;
+
+  SVN_ERR(tb->p1->file_closed(relpath,
+                              left_source,
+                              right_source,
+                              fb->baton1,
+                              tb->p1,
+                              scratch_pool));
+
+  SVN_ERR(tb->p2->file_closed(relpath,
+                              left_source,
+                              right_source,
+                              fb->baton2,
+                              tb->p2,
+                              scratch_pool));
+
+  return SVN_NO_ERROR;
+}
+
+static svn_error_t *
+tee_node_absent(const char *relpath,
+                void *dir_baton,
+                const svn_diff_tree_processor_t *processor,
+                apr_pool_t *scratch_pool)
+{
+  struct tee_baton_t *tb = processor->baton;
+  struct tee_node_baton_t *db = dir_baton;
+
+  SVN_ERR(tb->p1->node_absent(relpath,
+                              db ? db->baton1 : NULL,
+                              tb->p1,
+                              scratch_pool));
+
+  SVN_ERR(tb->p2->node_absent(relpath,
+                              db ? db->baton2 : NULL,
+                              tb->p2,
+                              scratch_pool));
+
+  return SVN_NO_ERROR;
+}
+
+const svn_diff_tree_processor_t *
+svn_diff__tree_processor_tee_create(svn_diff_tree_processor_t * processor1,
+                                    svn_diff_tree_processor_t * processor2,
+                                    apr_pool_t *result_pool)
+{
+  struct tee_baton_t *tb = apr_pcalloc(result_pool, sizeof(*tb));
+  svn_diff_tree_processor_t *tee;
+  tb->p1 = processor1;
+  tb->p2 = processor2;
+
+  tee = svn_diff__tree_processor_create(tb, result_pool);
+
+  tee->dir_opened    = tee_dir_opened;
+  tee->dir_added     = tee_dir_added;
+  tee->dir_deleted   = tee_dir_deleted;
+  tee->dir_changed   = tee_dir_changed;
+  tee->dir_closed    = tee_dir_closed;
+  tee->file_opened   = tee_file_opened;
+  tee->file_added    = tee_file_added;
+  tee->file_deleted  = tee_file_deleted;
+  tee->file_changed  = tee_file_changed;
+  tee->file_closed   = tee_file_closed;
+  tee->node_absent   = tee_node_absent;
+
+  return tee;
+}
+
 svn_diff_source_t *
 svn_diff__source_create(svn_revnum_t revision,
                         apr_pool_t *result_pool)