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/27 00:33:47 UTC

svn commit: r1438992 - in /subversion/trunk/subversion/libsvn_client: client.h diff.c merge.c repos_diff.c

Author: rhuijben
Date: Sat Jan 26 23:33:46 2013
New Revision: 1438992

URL: http://svn.apache.org/viewvc?rev=1438992&view=rev
Log:
Apply a temporary workaround to the repository diff wrapping to allow merge to
see absent paths without implementing the diff processor yet.

* subversion/libsvn_client/client.h
  (svn_client__get_diff_editor): Add hashtable argument.

* subversion/libsvn_client/diff.c
  (diff_repos_repos,
   diff_summarize_repos_repos): Update caller.

* subversion/libsvn_client/merge.c
  (drive_merge_report_editor): Update caller. Put absent nodes in the skipped
    abspaths list.

* subversion/libsvn_client/repos_diff.c
  (diff_notify_baton_t): Add variable.
  (diff_state_absent): Fix exact notification type.
  (svn_client__get_diff_editor): Update baton initialization.

Modified:
    subversion/trunk/subversion/libsvn_client/client.h
    subversion/trunk/subversion/libsvn_client/diff.c
    subversion/trunk/subversion/libsvn_client/merge.c
    subversion/trunk/subversion/libsvn_client/repos_diff.c

Modified: subversion/trunk/subversion/libsvn_client/client.h
URL: http://svn.apache.org/viewvc/subversion/trunk/subversion/libsvn_client/client.h?rev=1438992&r1=1438991&r2=1438992&view=diff
==============================================================================
--- subversion/trunk/subversion/libsvn_client/client.h (original)
+++ subversion/trunk/subversion/libsvn_client/client.h Sat Jan 26 23:33:46 2013
@@ -722,6 +722,9 @@ svn_client__get_inheritable_props(apr_ha
    If NOTIFY_FUNC is non-null, invoke it with NOTIFY_BATON for each
    file and directory operated on during the edit.
 
+   If ABSENT_RELPATHS is non-null, collect const char * keys in it with
+   the relative paths marked as absent by the diff driver.
+
    EDITOR/EDIT_BATON return the newly created editor and baton. */
 svn_error_t *
 svn_client__get_diff_editor(const svn_delta_editor_t **editor,
@@ -731,6 +734,7 @@ svn_client__get_diff_editor(const svn_de
                             svn_revnum_t revision,
                             svn_boolean_t walk_deleted_dirs,
                             svn_boolean_t text_deltas,
+                            apr_hash_t *absent_relpaths,
                             const svn_wc_diff_callbacks4_t *diff_callbacks,
                             void *diff_cmd_baton,
                             svn_cancel_func_t cancel_func,

Modified: subversion/trunk/subversion/libsvn_client/diff.c
URL: http://svn.apache.org/viewvc/subversion/trunk/subversion/libsvn_client/diff.c?rev=1438992&r1=1438991&r2=1438992&view=diff
==============================================================================
--- subversion/trunk/subversion/libsvn_client/diff.c (original)
+++ subversion/trunk/subversion/libsvn_client/diff.c Sat Jan 26 23:33:46 2013
@@ -2015,6 +2015,7 @@ diff_repos_repos(const svn_wc_diff_callb
                 depth,
                 extra_ra_session, rev1, TRUE /* walk_deleted_dirs */,
                 TRUE /* text_deltas */,
+                NULL /* absent relpaths */,
                 callbacks, callback_baton,
                 ctx->cancel_func, ctx->cancel_baton,
                 NULL /* no notify_func */, NULL /* no notify_baton */,
@@ -2701,6 +2702,7 @@ diff_summarize_repos_repos(svn_client_di
             depth,
             extra_ra_session, rev1, TRUE /* walk_deleted_dirs */,
             FALSE /* text_deltas */,
+            NULL /* absent relpaths */,
             callbacks, callback_baton,
             ctx->cancel_func, ctx->cancel_baton,
             NULL /* notify_func */, NULL /* notify_baton */, pool));

Modified: subversion/trunk/subversion/libsvn_client/merge.c
URL: http://svn.apache.org/viewvc/subversion/trunk/subversion/libsvn_client/merge.c?rev=1438992&r1=1438991&r2=1438992&view=diff
==============================================================================
--- subversion/trunk/subversion/libsvn_client/merge.c (original)
+++ subversion/trunk/subversion/libsvn_client/merge.c Sat Jan 26 23:33:46 2013
@@ -5130,6 +5130,7 @@ drive_merge_report_editor(const char *ta
   svn_boolean_t honor_mergeinfo = HONOR_MERGEINFO(merge_b);
   const char *old_sess1_url, *old_sess2_url;
   svn_boolean_t is_rollback = source->loc1->rev > source->loc2->rev;
+  apr_hash_t *absent_relpaths = apr_hash_make(scratch_pool);
 
   /* Start with a safe default starting revision for the editor and the
      merge target. */
@@ -5201,6 +5202,7 @@ drive_merge_report_editor(const char *ta
                                       merge_b->ra_session2, source->loc1->rev,
                                       FALSE /* walk_deleted_dirs */,
                                       TRUE /* text_deltas */,
+                                      absent_relpaths,
                                       &merge_callbacks, merge_b,
                                       merge_b->ctx->cancel_func,
                                       merge_b->ctx->cancel_baton,
@@ -5322,6 +5324,24 @@ drive_merge_report_editor(const char *ta
   /* Caller must call svn_sleep_for_timestamps() */
   *(merge_b->use_sleep) = TRUE;
 
+  if (apr_hash_count(absent_relpaths))
+    {
+      apr_hash_index_t *hi;
+
+      for (hi = apr_hash_first(scratch_pool, absent_relpaths);
+           hi;
+           hi = apr_hash_next(hi))
+        {
+          const char *absent_abspath;
+
+          absent_abspath = svn_dirent_join(target_abspath,
+                                           svn__apr_hash_index_key(hi),
+                                           merge_b->pool);
+
+          apr_hash_set(merge_b->skipped_abspaths, absent_abspath,
+                       APR_HASH_KEY_STRING, absent_abspath);
+        }
+    }
   return SVN_NO_ERROR;
 }
 

Modified: subversion/trunk/subversion/libsvn_client/repos_diff.c
URL: http://svn.apache.org/viewvc/subversion/trunk/subversion/libsvn_client/repos_diff.c?rev=1438992&r1=1438991&r2=1438992&view=diff
==============================================================================
--- subversion/trunk/subversion/libsvn_client/repos_diff.c (original)
+++ subversion/trunk/subversion/libsvn_client/repos_diff.c Sat Jan 26 23:33:46 2013
@@ -1272,6 +1272,9 @@ struct diff_notify_baton_t
   svn_wc_notify_func2_t notify_func;
   void *notify_baton;
 
+  /* If not NULL collects the absent paths */
+  apr_hash_t *absent_relpaths;
+
   apr_pool_t *pool;
 };
 
@@ -1481,9 +1484,17 @@ diff_state_absent(const char *relpath,
         = svn_wc_create_notify(relpath, svn_wc_notify_skip, scratch_pool);
 
       notify->kind = svn_node_file;
+      notify->content_state = notify->prop_state
+        = svn_wc_notify_state_missing;
       (*dnb->notify_func)(dnb->notify_baton, notify, scratch_pool);
     }
 
+  if (dnb->absent_relpaths)
+    apr_hash_set(dnb->absent_relpaths,
+                 apr_pstrdup(apr_hash_pool_get(dnb->absent_relpaths), relpath),
+                 APR_HASH_KEY_STRING,
+                 "");
+
   return SVN_NO_ERROR;
 }
 
@@ -1496,6 +1507,7 @@ svn_client__get_diff_editor(const svn_de
                             svn_revnum_t revision,
                             svn_boolean_t walk_deleted_dirs,
                             svn_boolean_t text_deltas,
+                            apr_hash_t *absent_relpaths,
                             const svn_wc_diff_callbacks4_t *diff_callbacks,
                             void *diff_cmd_baton,
                             svn_cancel_func_t cancel_func,
@@ -1518,6 +1530,7 @@ svn_client__get_diff_editor(const svn_de
   dnb->deleted_paths = apr_hash_make(eb->pool);
   dnb->notify_func = notify_func;
   dnb->notify_baton = notify_baton;
+  dnb->absent_relpaths = absent_relpaths;
 
   SVN_ERR(svn_wc__wrap_diff_callbacks(&eb->processor,
                                       diff_callbacks, diff_cmd_baton,