Author: pburba
Date: Fri Jul 15 20:02:07 2011
New Revision: 1147299

URL: http://svn.apache.org/viewvc?rev=1147299&view=rev
Log:
Add test for issue #3961 'reintegrate merge of replaced source produces
inaccurate mergeinfo'.

* subversion/tests/cmdline/merge_reintegrate_tests.py

  (reintegrate_replaced_source): New test.

  (test_list): Add reintegrate_replaced_source.

Modified:
    subversion/trunk/subversion/tests/cmdline/merge_reintegrate_tests.py

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=1147299&r1=1147298&r2=1147299&view=diff
==============================================================================
--- subversion/trunk/subversion/tests/cmdline/merge_reintegrate_tests.py 
(original)
+++ subversion/trunk/subversion/tests/cmdline/merge_reintegrate_tests.py Fri 
Jul 15 20:02:07 2011
@@ -2472,7 +2472,136 @@ def no_source_subtree_mergeinfo(sbox):
   #                                      None, None, None, None, None,
   #                                      1, 1, '--reintegrate')
 
-
+#----------------------------------------------------------------------
+@SkipUnless(server_has_mergeinfo)
+@Issue(3961)
+@XFail()
+def reintegrate_replaced_source(sbox):
+  "reintegrate a replaced source branch"
+
+  # Make A_COPY branch in r2, and do a few more commits to A in r3-6.
+  sbox.build()
+  wc_dir = sbox.wc_dir
+  expected_disk, expected_status = set_up_branch(sbox)
+
+  A_path         = os.path.join(sbox.wc_dir, "A")
+  A_COPY_path    = os.path.join(sbox.wc_dir, "A_COPY")
+  beta_COPY_path = os.path.join(sbox.wc_dir, "A_COPY", "B", "E", "beta")
+  mu_COPY_path   = os.path.join(sbox.wc_dir, "A_COPY", "mu")  
+
+  # Using cherrypick merges, simulate a series of sync merges from A to
+  # A_COPY with a replace of A_COPY along the way.
+  #
+  # r6 - Merge r3 from A to A_COPY
+  svntest.main.run_svn(None, 'up', wc_dir)
+  svntest.main.run_svn(None, 'merge', sbox.repo_url + '/A', A_COPY_path,
+                       '-c3')
+  svntest.main.run_svn(None, 'ci', '-m', 'Merge r3 from A to A_COPY', wc_dir)
+
+  # r8 - Merge r4 from A to A_COPY
+  svntest.main.run_svn(None, 'up', wc_dir)
+  svntest.main.run_svn(None, 'merge', sbox.repo_url + '/A', A_COPY_path,
+                       '-c4')
+  svntest.main.run_svn(None, 'ci', '-m', 'Merge r4 from A to A_COPY', wc_dir)
+
+  # r9 - Merge r5 from A to A_COPY. Make an additional edit to
+  # A_COPY/B/E/beta.
+  svntest.main.run_svn(None, 'up', wc_dir)
+  svntest.main.run_svn(None, 'merge', sbox.repo_url + '/A', A_COPY_path,
+                       '-c5')
+  svntest.main.file_write(beta_COPY_path, "Branch edit mistake.\n")
+  svntest.main.run_svn(None, 'ci', '-m', 'Merge r5 from A to A_COPY', wc_dir)
+
+  # r10 - Delete A_COPY and replace it with A_COPY@8. This removes the edit
+  # we made above in r9 to A_COPY/B/E/beta.
+  svntest.main.run_svn(None, 'up', wc_dir)
+  svntest.main.run_svn(None, 'delete', A_COPY_path)
+  svntest.main.run_svn(None, 'copy', sbox.repo_url + '/A_COPY@8',
+                       A_COPY_path)
+  svntest.main.run_svn(None, 'ci', '-m', 'Replace A_COPY with A_COPY@8',
+                       wc_dir)
+
+  # r11 - Make an edit on A_COPY/mu.
+  svntest.main.file_write(mu_COPY_path, "Branch edit.\n")
+  svntest.main.run_svn(None, 'ci', '-m', 'Branch edit',
+                       wc_dir)
+
+  # r12 - Do a final sync merge of A to A_COPY in preparation for
+  # reintegration.  
+  svntest.main.run_svn(None, 'up', wc_dir)
+  svntest.main.run_svn(None, 'merge', sbox.repo_url + '/A', A_COPY_path)
+  svntest.main.run_svn(None, 'ci', '-m', 'Sycn A_COPY with A', wc_dir)
+
+  # Reintegrate A_COPY to A.  The resulting mergeinfo should be
+  # '/A_COPY:2-8,10-12' because of the replacement which removed /A_COPY:9
+  # from the reintegrate source's history.
+  svntest.main.run_svn(None, 'up', wc_dir)
+  expected_output = wc.State(A_path, {
+    'mu' : Item(status='U '),
+    })
+  expected_mergeinfo_output = wc.State(A_path, {
+    ''   : Item(status=' U'),
+    })
+  expected_elision_output = wc.State(A_path, {
+    })
+  expected_status = wc.State(A_path, {
+    ''          : Item(status=' M'),
+    'B'         : Item(status='  '),
+    'mu'        : Item(status='M '),
+    'B/E'       : Item(status='  '),
+    'B/E/alpha' : Item(status='  '),
+    'B/E/beta'  : Item(status='  '),
+    'B/lambda'  : Item(status='  '),
+    'B/F'       : Item(status='  '),
+    'C'         : Item(status='  '),
+    'D'         : Item(status='  '),
+    'D/G'       : Item(status='  '),
+    'D/G/pi'    : Item(status='  '),
+    'D/G/rho'   : Item(status='  '),
+    'D/G/tau'   : Item(status='  '),
+    'D/gamma'   : Item(status='  '),
+    'D/H'       : Item(status='  '),
+    'D/H/chi'   : Item(status='  '),
+    'D/H/psi'   : Item(status='  '),
+    'D/H/omega' : Item(status='  '),
+    })
+  expected_status.tweak(wc_rev=12)
+  expected_disk = wc.State('', {
+    # This test currently fails because the resulting mergeinfo is
+    # /A_COPY:2-12, even though the changes in A_COPY:9 are *not*
+    # present on A.
+    ''          : Item(props={SVN_PROP_MERGEINFO : '/A_COPY:2-8,10-12'}),
+    'B'         : Item(),
+    'mu'        : Item("Branch edit.\n"),
+    'B/E'       : Item(),
+    'B/E/alpha' : Item("This is the file 'alpha'.\n"),
+    'B/E/beta'  : Item("New content"),
+    'B/lambda'  : Item("This is the file 'lambda'.\n"),
+    'B/F'       : Item(),
+    'C'         : Item(),
+    'D'         : Item(),
+    'D/G'       : Item(),
+    'D/G/pi'    : Item("This is the file 'pi'.\n"),
+    'D/G/rho'   : Item("New content"),
+    'D/G/tau'   : Item("This is the file 'tau'.\n"),
+    'D/gamma'   : Item("This is the file 'gamma'.\n"),
+    'D/H'       : Item(),
+    'D/H/chi'   : Item("This is the file 'chi'.\n"),
+    'D/H/psi'   : Item("New content"),
+    'D/H/omega' : Item("New content"),
+    })
+  expected_skip = wc.State(A_path, { })
+  svntest.actions.run_and_verify_merge(A_path, None, None,
+                                       sbox.repo_url + '/A_COPY', None,
+                                       expected_output,
+                                       expected_mergeinfo_output,
+                                       expected_elision_output,
+                                       expected_disk,
+                                       expected_status,
+                                       expected_skip,
+                                       [], None, None, None, None, True, True,
+                                       '--reintegrate', A_path)
+  
 ########################################################################
 # Run the tests
 
@@ -2495,6 +2624,7 @@ test_list = [ None,
               two_URL_merge_removes_valid_mergeinfo_from_target,
               reintegrate_creates_bogus_mergeinfo,
               no_source_subtree_mergeinfo,
+              reintegrate_replaced_source,
              ]
 
 if __name__ == '__main__':


Reply via email to