Author: rinrab
Date: Mon Nov 25 19:22:32 2024
New Revision: 1922093

URL: http://svn.apache.org/viewvc?rev=1922093&view=rev
Log:
On the 'apply-processor' branch: Notify merge.c about mergeinfo changes.

This continues extending the code from r1922090 (Add callbacks for notifying
merge.c's stuff from the apply processor), but related to mergeinfo changes.
This also solves some TODO_STORE_PATH todos.

* subversion/libsvn_client/client.h
  (svn_client__apply_processor_callbacks_t): Declare mergeinfo_changed.
* subversion/libsvn_client/merge.c
  (apply_processor_mergeinfo_changed): New function.
  (do_merge): Initialize cb_table.mergeinfo_changed.
* subversion/libsvn_client/merge_processor.c
  (): Use cb_table->mergeinfo_changed callback where mergeinfo property has
   been changed. Then, merge.c will handle it.

Modified:
    subversion/branches/apply-processor/subversion/libsvn_client/client.h
    subversion/branches/apply-processor/subversion/libsvn_client/merge.c
    
subversion/branches/apply-processor/subversion/libsvn_client/merge_processor.c

Modified: subversion/branches/apply-processor/subversion/libsvn_client/client.h
URL: 
http://svn.apache.org/viewvc/subversion/branches/apply-processor/subversion/libsvn_client/client.h?rev=1922093&r1=1922092&r2=1922093&view=diff
==============================================================================
--- subversion/branches/apply-processor/subversion/libsvn_client/client.h 
(original)
+++ subversion/branches/apply-processor/subversion/libsvn_client/client.h Mon 
Nov 25 19:22:32 2024
@@ -1295,6 +1295,12 @@ typedef struct svn_client__apply_process
                                const char *local_abspath,
                                svn_wc_notify_action_t action,
                                apr_pool_t *pool);
+
+  svn_error_t *(*mergeinfo_changed)(void *baton,
+                                    const char *local_abspath,
+                                    const svn_string_t *old_mergeinfo,
+                                    const svn_string_t *new_mergeinfo,
+                                    apr_pool_t *pool);
 } svn_client__apply_processor_callbacks_t;
 
 /* Return a diff processor that will apply the merge to the WC.

Modified: subversion/branches/apply-processor/subversion/libsvn_client/merge.c
URL: 
http://svn.apache.org/viewvc/subversion/branches/apply-processor/subversion/libsvn_client/merge.c?rev=1922093&r1=1922092&r2=1922093&view=diff
==============================================================================
--- subversion/branches/apply-processor/subversion/libsvn_client/merge.c 
(original)
+++ subversion/branches/apply-processor/subversion/libsvn_client/merge.c Mon 
Nov 25 19:22:32 2024
@@ -7330,6 +7330,29 @@ apply_processor_updated_path(void *baton
   return SVN_NO_ERROR;
 }
 
+/* Implements svn_client__apply_processor_callbacks_t::mergeinfo_changed */
+static svn_error_t *
+apply_processor_mergeinfo_changed(void *baton, const char *local_abspath,
+                                  const svn_string_t *old_mergeinfo,
+                                  const svn_string_t *new_mergeinfo,
+                                  apr_pool_t *pool)
+{
+  merge_cmd_baton_t *merge_b = baton;
+
+  if (old_mergeinfo && !new_mergeinfo)
+    {
+      alloc_and_store_path(&merge_b->paths_with_deleted_mergeinfo,
+                           local_abspath, merge_b->pool);
+    }
+  else if (!old_mergeinfo && new_mergeinfo)
+    {
+      alloc_and_store_path(&merge_b->paths_with_new_mergeinfo, local_abspath,
+                           merge_b->pool);
+    }
+
+  return SVN_NO_ERROR;
+}
+
 /* Drive a merge of MERGE_SOURCES into working copy node TARGET
    and possibly record mergeinfo describing the merge -- see
    RECORD_MERGEINFO().
@@ -7549,6 +7572,7 @@ do_merge(apr_hash_t **modified_subtrees,
       cb_table.conflicted_path = apply_processor_conflicted_path;
       cb_table.skipped_path = apply_processor_skipped_path;
       cb_table.updated_path = apply_processor_updated_path;
+      cb_table.mergeinfo_changed = apply_processor_mergeinfo_changed;
 
       svn_pool_clear(iterpool);
 

Modified: 
subversion/branches/apply-processor/subversion/libsvn_client/merge_processor.c
URL: 
http://svn.apache.org/viewvc/subversion/branches/apply-processor/subversion/libsvn_client/merge_processor.c?rev=1922093&r1=1922092&r2=1922093&view=diff
==============================================================================
--- 
subversion/branches/apply-processor/subversion/libsvn_client/merge_processor.c 
(original)
+++ 
subversion/branches/apply-processor/subversion/libsvn_client/merge_processor.c 
Mon Nov 25 19:22:32 2024
@@ -1512,13 +1512,17 @@ merge_file_added(const char *relpath,
           pristine_props = right_props; /* Includes last_* information */
           new_props = NULL; /* No local changes */
 
-#if TODO_STORE_PATH
-          if (svn_hash_gets(pristine_props, SVN_PROP_MERGEINFO))
+          if (merge_b->cb_table && merge_b->cb_table->mergeinfo_changed)
             {
-              alloc_and_store_path(&merge_b->paths_with_new_mergeinfo,
-                                   local_abspath, merge_b->pool);
+              const svn_string_t *new_mergeinfo
+                = svn_hash_gets(pristine_props, SVN_PROP_MERGEINFO);
+
+              SVN_ERR(merge_b->cb_table->mergeinfo_changed(merge_b->cb_baton,
+                                                           local_abspath,
+                                                           NULL,
+                                                           new_mergeinfo,
+                                                           scratch_pool));
             }
-#endif
         }
       else
         {
@@ -1756,11 +1760,22 @@ merge_file_deleted(const char *relpath,
                                NULL, NULL /* no notify */,
                                scratch_pool));
 
-#if TODO_STORE_PATH
-      /* Record that we might have deleted mergeinfo */
-      alloc_and_store_path(&merge_b->paths_with_deleted_mergeinfo,
-                           local_abspath, merge_b->pool);
-#endif
+      if (merge_b->cb_table && merge_b->cb_table->mergeinfo_changed)
+        {
+          /* Does LOCAL_ABSPATH have any pristine mergeinfo? */
+          const svn_string_t *old_mergeinfo;
+
+          if (left_props)
+            old_mergeinfo = svn_hash_gets(left_props, SVN_PROP_MERGEINFO);
+          else
+            old_mergeinfo = NULL;
+
+          /* Record that we might have deleted mergeinfo */
+          SVN_ERR(merge_b->cb_table->mergeinfo_changed(merge_b->cb_baton, 
local_abspath,
+                                                       old_mergeinfo,
+                                                       NULL,
+                                                       scratch_pool));
+        }
 
       /* And notify the deletion */
       SVN_ERR(record_update_delete(merge_b, fb->parent_baton, local_abspath,
@@ -2377,13 +2392,17 @@ merge_dir_added(const char *relpath,
                                                 scratch_pool));
         }
 
-#if TODO_STORE_PATH
-      if (svn_hash_gets(new_pristine_props, SVN_PROP_MERGEINFO))
+      if (merge_b->cb_table && merge_b->cb_table->mergeinfo_changed)
         {
-          alloc_and_store_path(&merge_b->paths_with_new_mergeinfo,
-                               local_abspath, merge_b->pool);
+          const svn_string_t *new_mergeinfo = svn_hash_gets(new_pristine_props,
+                                                            
SVN_PROP_MERGEINFO);
+
+          SVN_ERR(merge_b->cb_table->mergeinfo_changed(merge_b->cb_baton,
+                                                       local_abspath,
+                                                       NULL,
+                                                       new_mergeinfo,
+                                                       scratch_pool));
         }
-#endif
     }
   else
     {
@@ -2611,14 +2630,22 @@ merge_dir_deleted(const char *relpath,
   else
     {
       /* Record that we might have deleted mergeinfo */
-      if (working_props
-          && svn_hash_gets(working_props, SVN_PROP_MERGEINFO))
+      if (merge_b->cb_table && merge_b->cb_table->mergeinfo_changed)
         {
-#if TODO_STORE_PATH
-          alloc_and_store_path(&merge_b->paths_with_deleted_mergeinfo,
-                               local_abspath, merge_b->pool);
-#endif
-        }
+          const svn_string_t *old_mergeinfo;
+          if (working_props)
+            old_mergeinfo = svn_hash_gets(working_props, SVN_PROP_MERGEINFO);
+          else
+            old_mergeinfo = NULL;
+
+          if (old_mergeinfo)
+            {
+              SVN_ERR(merge_b->cb_table->mergeinfo_changed(merge_b->cb_baton, 
local_abspath,
+                                                           old_mergeinfo,
+                                                           NULL,
+                                                           scratch_pool));
+            }
+      }
 
       SVN_ERR(record_update_delete(merge_b, db->parent_baton, local_abspath,
                                    svn_node_dir, scratch_pool));


Reply via email to