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/26 23:48:21 UTC

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

Author: rhuijben
Date: Sat Jan 26 22:48:20 2013
New Revision: 1438980

URL: http://svn.apache.org/viewvc?rev=1438980&view=rev
Log:
To facilitate merge handling, add a node_absent() callback to the diff tree processor.

* subversion/include/private/svn_diff_tree.h
  (svn_diff_tree_processor_t): Add several comments and node_absent() callback.

* subversion/libsvn_diff/diff_tree.c
  (default_node_absent): New function.
  (svn_diff__tree_processor_create): Hook node_absent.

  (reverse_node_absent): New function.
  (svn_diff__tree_processor_reverse_create): Hook node_absent.

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=1438980&r1=1438979&r2=1438980&view=diff
==============================================================================
--- subversion/trunk/subversion/include/private/svn_diff_tree.h (original)
+++ subversion/trunk/subversion/include/private/svn_diff_tree.h Sat Jan 26 22:48:20 2013
@@ -155,6 +155,7 @@ typedef struct svn_diff_tree_processor_t
                  apr_pool_t *result_pool,
                  apr_pool_t *scratch_pool);
 
+  /* Called after file_opened() for newly added and copied files */
   svn_error_t *
   (*file_added)(const char *relpath,
                 const svn_diff_source_t *copyfrom_source,
@@ -167,6 +168,7 @@ typedef struct svn_diff_tree_processor_t
                 const struct svn_diff_tree_processor_t *processor,
                 apr_pool_t *scratch_pool);
 
+  /* Called after file_opened() for deleted or moved away files */
   svn_error_t *
   (*file_deleted)(const char *relpath,
                   const svn_diff_source_t *left_source,
@@ -176,6 +178,7 @@ typedef struct svn_diff_tree_processor_t
                   const struct svn_diff_tree_processor_t *processor,
                   apr_pool_t *scratch_pool);
 
+  /* Called after file_opened() for changed files */
   svn_error_t *
   (*file_changed)(const char *relpath,
                   const svn_diff_source_t *left_source,
@@ -190,6 +193,7 @@ typedef struct svn_diff_tree_processor_t
                   const struct svn_diff_tree_processor_t *processor,
                   apr_pool_t *scratch_pool);
 
+  /* Called after file_opened() for unmodified files */
   svn_error_t *
   (*file_closed)(const char *relpath,
                  const svn_diff_source_t *left_source,
@@ -197,6 +201,13 @@ typedef struct svn_diff_tree_processor_t
                  void *file_baton,
                  const struct svn_diff_tree_processor_t *processor,
                  apr_pool_t *scratch_pool);
+
+  /* Called when encountering a marker for an absent file or directory */
+  svn_error_t *
+  (*node_absent)(const char *relpath,
+                 void *dir_baton,
+                 const struct svn_diff_tree_processor_t *processor,
+                 apr_pool_t *scratch_pool);
 } svn_diff_tree_processor_t;
 
 /**

Modified: subversion/trunk/subversion/libsvn_diff/diff_tree.c
URL: http://svn.apache.org/viewvc/subversion/trunk/subversion/libsvn_diff/diff_tree.c?rev=1438980&r1=1438979&r2=1438980&view=diff
==============================================================================
--- subversion/trunk/subversion/libsvn_diff/diff_tree.c (original)
+++ subversion/trunk/subversion/libsvn_diff/diff_tree.c Sat Jan 26 22:48:20 2013
@@ -199,6 +199,15 @@ default_file_closed(const char *relpath,
   return SVN_NO_ERROR;
 }
 
+static svn_error_t *
+default_node_absent(const char *relpath,
+                    void *dir_baton,
+                    const svn_diff_tree_processor_t *processor,
+                    apr_pool_t *scratch_pool)
+{
+  return SVN_NO_ERROR;
+}
+
 svn_diff_tree_processor_t *
 svn_diff__tree_processor_create(void *baton,
                                 apr_pool_t *result_pool)
@@ -220,6 +229,9 @@ svn_diff__tree_processor_create(void *ba
   wrapper->tp.file_changed  = default_file_changed;
   wrapper->tp.file_closed   = default_file_closed;
 
+  wrapper->tp.node_absent   = default_node_absent;
+
+
   return &wrapper->tp;
 }
 
@@ -513,6 +525,25 @@ reverse_file_closed(const char *relpath,
   return SVN_NO_ERROR;
 }
 
+static svn_error_t *
+reverse_node_absent(const char *relpath,
+                    void *dir_baton,
+                    const svn_diff_tree_processor_t *processor,
+                    apr_pool_t *scratch_pool)
+{
+  struct reverse_tree_baton_t *rb = processor->baton;
+
+  if (rb->prefix_relpath)
+    relpath = svn_relpath_join(rb->prefix_relpath, relpath, scratch_pool);
+
+  SVN_ERR(rb->processor->node_absent(relpath,
+                                    dir_baton,
+                                    processor,
+                                    scratch_pool));
+  return SVN_NO_ERROR;
+}
+
+
 const svn_diff_tree_processor_t *
 svn_diff__tree_processor_reverse_create(svn_diff_tree_processor_t * processor,
                                         const char *prefix_relpath,
@@ -533,12 +564,15 @@ svn_diff__tree_processor_reverse_create(
   reverse->dir_deleted  = reverse_dir_deleted;
   reverse->dir_changed  = reverse_dir_changed;
   reverse->dir_closed   = reverse_dir_closed;
+
   reverse->file_opened   = reverse_file_opened;
   reverse->file_added    = reverse_file_added;
   reverse->file_deleted  = reverse_file_deleted;
   reverse->file_changed  = reverse_file_changed;
   reverse->file_closed   = reverse_file_closed;
 
+  reverse->node_absent   = reverse_node_absent;
+
   return reverse;
 }