You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@subversion.apache.org by pb...@apache.org on 2010/05/28 23:44:18 UTC

svn commit: r949307 - in /subversion/trunk/subversion: libsvn_client/merge.c tests/cmdline/merge_tests.py tests/cmdline/mergeinfo_tests.py

Author: pburba
Date: Fri May 28 21:44:18 2010
New Revision: 949307

URL: http://svn.apache.org/viewvc?rev=949307&view=rev
Log:
Fix issue #3646 'record-only merges create self-referential mergeinfo'.

* subversion/libsvn_client/merge.c

  (populate_remaining_ranges): Start getting the target's implicit mergeinfo
   during --record-only merges; record_mergeinfo_for_dir_merge() already
   does the right thing re self-referential mergeinfo once we do this.

* subversion/tests/cmdline/merge_tests.py

  (self_reverse_merge): Tweak test setup to use 'svn propset' rather than
   expecting self-referential mergeinfo to be set by --record-only.

  (cyclic_record_only_merge_creates_self_referential_mergeinfo): Rename to...

  (record_only_merge_creates_self_referential_mergeinfo): ...this, to reflect
   the fact that this issue has nothing to do with cyclic merges.  Also
   remove comment about XFail status.

  (test_list): Rename
   cyclic_record_only_merge_creates_self_referential_mergeinfo to
   record_only_merge_creates_self_referential_mergeinfo and remove XFail.

* subversion/tests/cmdline/mergeinfo_tests.py

  (mergeinfo): As per self_reverse_merge above.

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

Modified: subversion/trunk/subversion/libsvn_client/merge.c
URL: http://svn.apache.org/viewvc/subversion/trunk/subversion/libsvn_client/merge.c?rev=949307&r1=949306&r2=949307&view=diff
==============================================================================
--- subversion/trunk/subversion/libsvn_client/merge.c (original)
+++ subversion/trunk/subversion/libsvn_client/merge.c Fri May 28 21:44:18 2010
@@ -4112,6 +4112,9 @@ populate_remaining_ranges(apr_array_head
   apr_pool_t *iterpool;
   int i;
   svn_revnum_t gap_start, gap_end;
+  svn_boolean_t child_inherits_implicit;
+  svn_client__merge_path_t *parent;
+  int parent_index;
 
   iterpool = svn_pool_create(pool);
 
@@ -4125,6 +4128,46 @@ populate_remaining_ranges(apr_array_head
           svn_client__merge_path_t *child =
             APR_ARRAY_IDX(children_with_mergeinfo, i,
                           svn_client__merge_path_t *);
+
+          parent = NULL;
+          svn_pool_clear(iterpool);
+
+          /* Issue #3646 'record-only merges create self-referential
+             mergeinfo'.  Get the merge target's implicit mergeinfo (natural
+             history).  We'll use it later to avoid setting self-referential
+             mergeinfo -- see filter_natural_history_from_mergeinfo(). */
+          if (i == 0) /* First item is always the merge target. */
+            {
+              SVN_ERR(get_full_mergeinfo(NULL, /* child->pre_merge_mergeinfo */
+                                         &(child->implicit_mergeinfo),
+                                         NULL, /* child->indirect_mergeinfo */
+                                         svn_mergeinfo_inherited, ra_session,
+                                         child->abspath,
+                                         MAX(revision1, revision2),
+                                         MIN(revision1, revision2),
+                                         merge_b->ctx, pool, iterpool));
+            }
+          else
+            {
+              /* Issue #3443 - Subtrees of the merge target can inherit
+                 their parent's implicit mergeinfo in most cases. */
+              parent_index = find_nearest_ancestor(children_with_mergeinfo,
+                                                   FALSE, child->abspath);
+              parent = APR_ARRAY_IDX(children_with_mergeinfo, parent_index,
+                                     svn_client__merge_path_t *);
+              /* If CHILD is a subtree then its parent must be in
+                 CHILDREN_WITH_MERGEINFO, see the global comment
+                 'THE CHILDREN_WITH_MERGEINFO ARRAY'. */
+              SVN_ERR_ASSERT(parent);
+ 
+              child_inherits_implicit = (parent && !child->switched);
+              SVN_ERR(ensure_implicit_mergeinfo(parent, child,
+                                                child_inherits_implicit,
+                                                revision1, revision2,
+                                                ra_session, merge_b->ctx,
+                                                pool, iterpool));
+            }
+
           child->remaining_ranges = svn_rangelist__initialize(revision1,
                                                               revision2,
                                                               TRUE, pool);
@@ -4163,8 +4206,8 @@ populate_remaining_ranges(apr_array_head
       const char *child_url1, *child_url2;
       svn_client__merge_path_t *child =
         APR_ARRAY_IDX(children_with_mergeinfo, i, svn_client__merge_path_t *);
-      svn_client__merge_path_t *parent = NULL;
-      svn_boolean_t child_inherits_implicit;
+
+      parent = NULL;
 
       /* If the path is absent don't do subtree merge either. */
       SVN_ERR_ASSERT(child);
@@ -4201,8 +4244,8 @@ populate_remaining_ranges(apr_array_head
       /* If CHILD isn't the merge target find its parent. */
       if (i > 0)
         {
-          int parent_index = find_nearest_ancestor(children_with_mergeinfo,
-                                                   FALSE, child->abspath);
+          parent_index = find_nearest_ancestor(children_with_mergeinfo,
+                                               FALSE, child->abspath);
           parent = APR_ARRAY_IDX(children_with_mergeinfo, parent_index,
                                  svn_client__merge_path_t *);
           /* If CHILD is a subtree then its parent must be in

Modified: subversion/trunk/subversion/tests/cmdline/merge_tests.py
URL: http://svn.apache.org/viewvc/subversion/trunk/subversion/tests/cmdline/merge_tests.py?rev=949307&r1=949306&r2=949307&view=diff
==============================================================================
--- subversion/trunk/subversion/tests/cmdline/merge_tests.py (original)
+++ subversion/trunk/subversion/tests/cmdline/merge_tests.py Fri May 28 21:44:18 2010
@@ -8999,8 +8999,8 @@ def self_reverse_merge(sbox):
 
   # record dummy self mergeinfo to test the fact that self-reversal should work
   # irrespective of mergeinfo.
-  svntest.actions.run_and_verify_svn(None, None, [], 'merge', '-c', '1',
-                                     '--record-only', sbox.repo_url, wc_dir)
+  svntest.actions.run_and_verify_svn(None, None, [], 'ps', SVN_PROP_MERGEINFO,
+                                     '/:1', wc_dir)
 
   # Bad svntest.main.greek_state does not have '', so adding it explicitly.
   expected_disk.add({'' : Item(props={SVN_PROP_MERGEINFO : '/:1'})})
@@ -15514,8 +15514,8 @@ def immediate_depth_merge_creates_minima
 #----------------------------------------------------------------------
 # Test for issue #3646 'cyclic --record-only merges create self-referential
 # mergeinfo'
-def cyclic_record_only_merge_creates_self_referential_mergeinfo(sbox):
-  "cyclic merge creates self referential mergeinfo"
+def record_only_merge_creates_self_referential_mergeinfo(sbox):
+  "merge creates self referential mergeinfo"
 
   # Given a copy of trunk@M to branch, committed in r(M+1), if we
   # --record-only merge the branch back to trunk with no revisions
@@ -15544,20 +15544,7 @@ def cyclic_record_only_merge_creates_sel
   svntest.actions.run_and_verify_svn(None, None, [], 'up', wc_dir)
 
   # Merge A-branch back to A.  This should record the mergeinfo '/A-branch:3'
-  # on A.  Currently however, it records self referential mergeinfo on A of
-  # '/A:2'.  This test is set as XFail until this issue is fixed.
-  #
-  #   >svn merge ^/A-branch A --record-only
-  #   --- Recording mergeinfo for merge of r2 into 'A':
-  #    U   A
-  #   --- Recording mergeinfo for merge of r3 into 'A':
-  #    G   A
-  #
-  #   >svn pg svn:mergeinfo -vR
-  #   Properties on 'A':
-  #     svn:mergeinfo
-  #       /A:2  <-- This is part of A's own history!
-  #       /A-branch:3
+  # on A.
   expected_output = wc.State(A_path, {})
   expected_mergeinfo_output = wc.State(A_path, {
     '' : Item(status=' U'),
@@ -15803,7 +15790,7 @@ test_list = [ None,
               merge_into_wc_for_deleted_branch,
               foreign_repos_del_and_props,
               immediate_depth_merge_creates_minimal_subtree_mergeinfo,
-              XFail(cyclic_record_only_merge_creates_self_referential_mergeinfo),
+              record_only_merge_creates_self_referential_mergeinfo,
              ]
 
 if __name__ == '__main__':

Modified: subversion/trunk/subversion/tests/cmdline/mergeinfo_tests.py
URL: http://svn.apache.org/viewvc/subversion/trunk/subversion/tests/cmdline/mergeinfo_tests.py?rev=949307&r1=949306&r2=949307&view=diff
==============================================================================
--- subversion/trunk/subversion/tests/cmdline/mergeinfo_tests.py (original)
+++ subversion/trunk/subversion/tests/cmdline/mergeinfo_tests.py Fri May 28 21:44:18 2010
@@ -74,8 +74,8 @@ def mergeinfo(sbox):
   wc_dir = sbox.wc_dir
 
   # Dummy up some mergeinfo.
-  svntest.actions.run_and_verify_svn(None, None, [], "merge", "-c", "1",
-                                     "--record-only", sbox.repo_url, wc_dir)
+  svntest.actions.run_and_verify_svn(None, None, [], 'ps', SVN_PROP_MERGEINFO,
+                                     '/:1', wc_dir)
   svntest.actions.run_and_verify_mergeinfo(adjust_error_for_server_version(""),
                                            ['1'], sbox.repo_url, wc_dir)