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/31 18:22:05 UTC

svn commit: r1441076 - in /subversion/trunk/subversion: libsvn_client/merge.c tests/cmdline/merge_reintegrate_tests.py tests/cmdline/merge_tests.py tests/cmdline/merge_tree_conflict_tests.py

Author: rhuijben
Date: Thu Jan 31 17:22:04 2013
New Revision: 1441076

URL: http://svn.apache.org/viewvc?rev=1441076&view=rev
Log:
For merge targets that are skipped because one of their ancestors is
obstructed, notify a shadowed update style notification.

I wish I had this output before I started doing this merge work, as
it makes the tree conflict tests much easier to understand.

* subversion/libsvn_client/merge.c
  (record_skip): Allow notifying more actions as skip.

  (merge_file_opened): Notify missing root as skipped when receiving changes.
    Always record the path as skipped.
  (merge_file_changed,
   merge_file_added,
   merge_file_deleted): Use specific skip type.

  (merge_dir_opened): Notify missing root as skipped when receiving changes.
    Always record the path as skipped.
  (merge_dir_changed,
   merge_dir_added,
   merge_dir_deleted): Use specific skip type.

  (merge_node_absent): Update caller.

* subversion/tests/cmdline/merge_reintegrate_tests.py
  (reintegrate_on_shallow_wc): Tweak expected result.

* subversion/tests/cmdline/merge_tests.py
  (merge_skips_obstructions,
   merge_to_sparse_directories): Tweak expected results.

* subversion/tests/cmdline/merge_tree_conflict_tests.py
  (tree_conflicts_merge_edit_onto_missing,
   tree_conflicts_merge_del_onto_missing): Tweak expected results.

Modified:
    subversion/trunk/subversion/libsvn_client/merge.c
    subversion/trunk/subversion/tests/cmdline/merge_reintegrate_tests.py
    subversion/trunk/subversion/tests/cmdline/merge_tests.py
    subversion/trunk/subversion/tests/cmdline/merge_tree_conflict_tests.py

Modified: subversion/trunk/subversion/libsvn_client/merge.c
URL: http://svn.apache.org/viewvc/subversion/trunk/subversion/libsvn_client/merge.c?rev=1441076&r1=1441075&r2=1441076&view=diff
==============================================================================
--- subversion/trunk/subversion/libsvn_client/merge.c (original)
+++ subversion/trunk/subversion/libsvn_client/merge.c Thu Jan 31 17:22:04 2013
@@ -1537,6 +1537,7 @@ static svn_error_t *
 record_skip(const merge_cmd_baton_t *merge_b,
             const char *local_abspath,
             svn_node_kind_t kind,
+            svn_wc_notify_action_t action,
             svn_wc_notify_state_t state,
             apr_pool_t *scratch_pool)
 {
@@ -1553,8 +1554,7 @@ record_skip(const merge_cmd_baton_t *mer
     {
       svn_wc_notify_t *notify;
 
-      notify = svn_wc_create_notify(local_abspath, svn_wc_notify_skip,
-                                    scratch_pool);
+      notify = svn_wc_create_notify(local_abspath, action, scratch_pool);
       notify->kind = kind;
       notify->content_state = notify->prop_state = state;
 
@@ -2071,8 +2071,15 @@ merge_file_opened(void **new_file_baton,
                 {
                   fb->shadowed = TRUE;
 
-                  /*db->tree_conflict_reason = CONFLICT_REASON_SKIP; */
+                  fb->tree_conflict_reason = CONFLICT_REASON_SKIP;
                   fb->skip_reason = svn_wc_notify_state_missing;
+
+                  if (merge_b->merge_source.ancestral
+                      || merge_b->reintegrate_merge)
+                    {
+                      store_path(merge_b->skipped_abspaths, local_abspath);
+                    }
+
                   return SVN_NO_ERROR;
                 }
             }
@@ -2198,6 +2205,7 @@ merge_file_changed(const char *relpath,
         {
           /* We haven't notified for this node yet: report a skip */
           SVN_ERR(record_skip(merge_b, local_abspath, svn_node_file,
+                              svn_wc_notify_update_shadowed_update,
                               fb->skip_reason, scratch_pool));
         }
 
@@ -2341,6 +2349,7 @@ merge_file_added(const char *relpath,
         {
           /* We haven't notified for this node yet: report a skip */
           SVN_ERR(record_skip(merge_b, local_abspath, svn_node_file,
+                              svn_wc_notify_update_shadowed_add,
                               fb->skip_reason, scratch_pool));
         }
 
@@ -2594,6 +2603,7 @@ merge_file_deleted(const char *relpath,
         {
           /* We haven't notified for this node yet: report a skip */
           SVN_ERR(record_skip(merge_b, local_abspath, svn_node_file,
+                              svn_wc_notify_update_shadowed_delete,
                               fb->skip_reason, scratch_pool));
         }
 
@@ -2774,8 +2784,15 @@ merge_dir_opened(void **new_dir_baton,
                 {
                   db->shadowed = TRUE;
 
-                  /*db->tree_conflict_reason = CONFLICT_REASON_SKIP; */
+                  db->tree_conflict_reason = CONFLICT_REASON_SKIP;
                   db->skip_reason = svn_wc_notify_state_missing;
+
+                  if (merge_b->merge_source.ancestral
+                      || merge_b->reintegrate_merge)
+                    {
+                      store_path(merge_b->skipped_abspaths, local_abspath);
+                    }
+
                   return SVN_NO_ERROR;
                 }
             }
@@ -2973,6 +2990,7 @@ merge_dir_changed(const char *relpath,
         {
           /* We haven't notified for this node yet: report a skip */
           SVN_ERR(record_skip(merge_b, local_abspath, svn_node_dir,
+                              svn_wc_notify_update_shadowed_update,
                               db->skip_reason, scratch_pool));
         }
 
@@ -3055,6 +3073,7 @@ merge_dir_added(const char *relpath,
         {
           /* We haven't notified for this node yet: report a skip */
           SVN_ERR(record_skip(merge_b, local_abspath, svn_node_dir,
+                              svn_wc_notify_update_shadowed_add,
                               db->skip_reason, scratch_pool));
         }
 
@@ -3190,6 +3209,7 @@ merge_dir_deleted(const char *relpath,
         {
           /* We haven't notified for this node yet: report a skip */
           SVN_ERR(record_skip(merge_b, local_abspath, svn_node_dir,
+                              svn_wc_notify_update_shadowed_delete,
                               db->skip_reason, scratch_pool));
         }
 
@@ -3298,7 +3318,7 @@ merge_node_absent(const char *relpath,
                                               relpath, scratch_pool);
 
   record_skip(merge_b, local_abspath, svn_node_unknown,
-              svn_wc_notify_state_missing, scratch_pool);
+              svn_wc_notify_skip, svn_wc_notify_state_missing, scratch_pool);
 
   return SVN_NO_ERROR;
 }

Modified: subversion/trunk/subversion/tests/cmdline/merge_reintegrate_tests.py
URL: http://svn.apache.org/viewvc/subversion/trunk/subversion/tests/cmdline/merge_reintegrate_tests.py?rev=1441076&r1=1441075&r2=1441076&view=diff
==============================================================================
--- subversion/trunk/subversion/tests/cmdline/merge_reintegrate_tests.py (original)
+++ subversion/trunk/subversion/tests/cmdline/merge_reintegrate_tests.py Thu Jan 31 17:22:04 2013
@@ -905,7 +905,11 @@ def reintegrate_on_shallow_wc(sbox):
   expected_A_disk.tweak('D', props={SVN_PROP_MERGEINFO : '/A_COPY/D:2-4*'})
   # ... a depth-restricted item is skipped ...
   expected_A_skip.add({
-      'D/H/psi' : Item(verb='Skipped')
+      'D/H' : Item(verb='Skipped missing target')
+  })
+  expected_output.add({
+    # Below the skip
+    'D/H/psi'           : Item(status='  ', treeconflict='U'),
   })
   # Currently this fails due to r1424469.  For a full explanation see
   # http://svn.haxx.se/dev/archive-2012-12/0472.shtml

Modified: subversion/trunk/subversion/tests/cmdline/merge_tests.py
URL: http://svn.apache.org/viewvc/subversion/trunk/subversion/tests/cmdline/merge_tests.py?rev=1441076&r1=1441075&r2=1441076&view=diff
==============================================================================
--- subversion/trunk/subversion/tests/cmdline/merge_tests.py (original)
+++ subversion/trunk/subversion/tests/cmdline/merge_tests.py Thu Jan 31 17:22:04 2013
@@ -1512,6 +1512,7 @@ def merge_skips_obstructions(sbox):
 
   expected_output = wc.State(C_path, {
     'foo'    : Item(status='A '),
+    'Q/bar'  : Item(status='  ', treeconflict='A'), # Skipped
     })
   expected_mergeinfo_output = wc.State(C_path, {
     '' : Item(status=' U'),
@@ -1529,7 +1530,6 @@ def merge_skips_obstructions(sbox):
     })
   expected_skip = wc.State(C_path, {
     'Q'     : Item(verb='Skipped'),
-    'Q/bar' : Item(verb='Skipped'),
     })
 
   svntest.actions.run_and_verify_merge(C_path, '1', '2', F_url, None,
@@ -7796,6 +7796,9 @@ def merge_to_sparse_directories(sbox):
     'D'   : Item(status=' U'),
     'mu'  : Item(status='U '),
     ''    : Item(status=' U'),
+    # Shadowed below skips
+    'D/H/omega' : Item(status='  ', treeconflict='U'),
+    'B/E/beta'  : Item(status='  ', treeconflict='U'),
     })
   expected_mergeinfo_output = wc.State(immediates_dir, {
     ''  : Item(status=' U'),
@@ -7821,8 +7824,8 @@ def merge_to_sparse_directories(sbox):
                               "prop:name" : "propval"}),
     })
   expected_skip = svntest.wc.State(immediates_dir, {
-    'D/H/omega' : Item(verb='Skipped missing target'),
-    'B/E/beta'  : Item(verb='Skipped missing target'),
+    'D/H'       : Item(verb='Skipped missing target'),
+    'B/E'       : Item(verb='Skipped missing target'),
     })
   svntest.actions.run_and_verify_merge(immediates_dir, '4', '9',
                                        sbox.repo_url + '/A', None,
@@ -7857,6 +7860,9 @@ def merge_to_sparse_directories(sbox):
   expected_output = wc.State(files_dir, {
     'mu' : Item(status='U '),
     ''   : Item(status=' U'),
+    # Below the skips
+    'D/H/omega' : Item(status='  ', treeconflict='U'),
+    'B/E/beta'  : Item(status='  ', treeconflict='U'),
     })
   expected_mergeinfo_output = wc.State(files_dir, {
     ''   : Item(status=' U'),
@@ -7876,8 +7882,7 @@ def merge_to_sparse_directories(sbox):
     })
   expected_skip = svntest.wc.State(files_dir, {
     'D'         : Item(verb='Skipped missing target'),
-    'D/H/omega' : Item(verb='Skipped missing target'),
-    'B/E/beta'  : Item(verb='Skipped missing target'),
+    'B'         : Item(verb='Skipped missing target'),
     })
   svntest.actions.run_and_verify_merge(files_dir, '4', '9',
                                        sbox.repo_url + '/A', None,
@@ -7905,6 +7910,9 @@ def merge_to_sparse_directories(sbox):
   # the one change that affects it directly (the prop add from r9).
   expected_output = wc.State(empty_dir, {
     ''   : Item(status=' U'),
+    # Below the skips
+    'B/E/beta'  : Item(status='  ', treeconflict='U'),
+    'D/H/omega' : Item(status='  ', treeconflict='U'),
     })
   expected_mergeinfo_output = wc.State(empty_dir, {
     '' : Item(status=' U'),
@@ -7921,8 +7929,7 @@ def merge_to_sparse_directories(sbox):
   expected_skip = svntest.wc.State(empty_dir, {
     'mu'        : Item(verb='Skipped missing target'),
     'D'         : Item(verb='Skipped missing target'),
-    'D/H/omega' : Item(verb='Skipped missing target'),
-    'B/E/beta'  : Item(verb='Skipped missing target'),
+    'B'         : Item(verb='Skipped missing target'),
     })
   svntest.actions.run_and_verify_merge(empty_dir, '4', '9',
                                        sbox.repo_url + '/A', None,

Modified: subversion/trunk/subversion/tests/cmdline/merge_tree_conflict_tests.py
URL: http://svn.apache.org/viewvc/subversion/trunk/subversion/tests/cmdline/merge_tree_conflict_tests.py?rev=1441076&r1=1441075&r2=1441076&view=diff
==============================================================================
--- subversion/trunk/subversion/tests/cmdline/merge_tree_conflict_tests.py (original)
+++ subversion/trunk/subversion/tests/cmdline/merge_tree_conflict_tests.py Thu Jan 31 17:22:04 2013
@@ -1284,6 +1284,14 @@ def tree_conflicts_merge_edit_onto_missi
 
   sbox.build()
   expected_output = wc.State('', {
+  # Below the skips
+  'DD/D1/D2'          : Item(status='  ', treeconflict='U'),
+  'DD/D1/D2/epsilon'  : Item(status='  ', treeconflict='A'),
+  'DDD/D1/D2/D3'      : Item(status='  ', treeconflict='U'),
+  'DDD/D1/D2/D3/zeta' : Item(status='  ', treeconflict='A'),
+  'DDF/D1/D2/gamma'   : Item(status='  ', treeconflict='U'),
+  'D/D1/delta'        : Item(status='  ', treeconflict='A'),
+  'DF/D1/beta'        : Item(status='  ', treeconflict='U'),
   })
 
   expected_disk = disk_after_tree_del
@@ -1315,19 +1323,12 @@ def tree_conflicts_merge_edit_onto_missi
   expected_skip = svntest.wc.State('', {
     'F/alpha'           : Item(verb='Skipped missing target'),
     # Obstruction handling improvements in 1.7 and 1.8 added
-    'DF/D1/beta'        : Item(verb='Skipped missing target'),
-    'DDD/D1/D2/D3/zeta' : Item(verb='Skipped missing target'),
-    'DDD/D1/D2/D3'      : Item(verb='Skipped missing target'),
-    'DDF/D1/D2/gamma'   : Item(verb='Skipped missing target'),
-    'D/D1/delta'        : Item(verb='Skipped missing target'),
-    'D/D1'              : Item(verb='Skipped missing target'),
-    'DD/D1/D2/epsilon'  : Item(verb='Skipped missing target'),
-    'DD/D1/D2'          : Item(verb='Skipped missing target'),
-    # And more recent changes added the obstruction roots
-    'DD/D1'             : Item(verb='Skipped missing target'),
-    'DF/D1'             : Item(verb='Skipped missing target'),
     'DDD/D1'            : Item(verb='Skipped missing target'),
+    'DF/D1'             : Item(verb='Skipped missing target'),
     'DDF/D1'            : Item(verb='Skipped missing target'),
+    'D/D1'              : Item(verb='Skipped missing target'),
+    'DD/D1'             : Item(verb='Skipped missing target'),
+    'F/alpha'           : Item(verb='Skipped missing target'),
   })
 
   # Currently this test fails because some parts of the merge
@@ -1361,6 +1362,11 @@ def tree_conflicts_merge_del_onto_missin
 
   sbox.build()
   expected_output = wc.State('', {
+  # Below the skips
+    'DF/D1/beta'        : Item(status='  ', treeconflict='D'),
+    'DDD/D1/D2/D3'      : Item(status='  ', treeconflict='D'),
+    'DD/D1/D2'          : Item(status='  ', treeconflict='D'),
+    'DDF/D1/D2/gamma'   : Item(status='  ', treeconflict='D'),
   })
 
   expected_disk = disk_after_tree_del
@@ -1393,15 +1399,10 @@ def tree_conflicts_merge_del_onto_missin
     'F/alpha'           : Item(verb='Skipped missing target'),
     'D/D1'              : Item(verb='Skipped missing target'),
     # Obstruction handling improvements in 1.7 and 1.8 added
-    'DD/D1/D2'          : Item(verb='Skipped missing target'),
-    'DF/D1/beta'        : Item(verb='Skipped missing target'),
-    'DDD/D1/D2/D3'      : Item(verb='Skipped missing target'),
-    'DDF/D1/D2/gamma'   : Item(verb='Skipped missing target'),
-    # And more recent changes added the obstruction roots
-    'DDF/D1'            : Item(verb='Skipped missing target'),
-    'DF/D1'             : Item(verb='Skipped missing target'),
     'DDD/D1'            : Item(verb='Skipped missing target'),
     'DD/D1'             : Item(verb='Skipped missing target'),
+    'DDF/D1'            : Item(verb='Skipped missing target'),
+    'DF/D1'             : Item(verb='Skipped missing target'),
   })
 
   svntest.actions.deep_trees_run_tests_scheme_for_merge(sbox,