Author: cmpilato
Date: Fri Apr 15 16:27:50 2011
New Revision: 1092759

URL: http://svn.apache.org/viewvc?rev=1092759&view=rev
Log:
Fix issue #3857 ("Segmentation Fault in foreign repository merge with
prop conflict (propmod atop missing prop)").

* subversion/libsvn_wc/util.c
  (svn_wc__cd2_to_cd): Don't operate on NULL paths.

* subversion/tests/cmdline/merge_tests.py
  (foreign_repos_prop_conflict): New regression test.
  (test_list): Add reference to new test.

Modified:
    subversion/trunk/subversion/libsvn_wc/util.c
    subversion/trunk/subversion/tests/cmdline/merge_tests.py

Modified: subversion/trunk/subversion/libsvn_wc/util.c
URL: 
http://svn.apache.org/viewvc/subversion/trunk/subversion/libsvn_wc/util.c?rev=1092759&r1=1092758&r2=1092759&view=diff
==============================================================================
--- subversion/trunk/subversion/libsvn_wc/util.c (original)
+++ subversion/trunk/subversion/libsvn_wc/util.c Fri Apr 15 16:27:50 2011
@@ -426,19 +426,21 @@ svn_wc__cd2_to_cd(const svn_wc_conflict_
 
       case svn_wc_conflict_kind_text:
         new_conflict->is_binary = conflict->is_binary;
-        new_conflict->mime_type = conflict->mime_type
-                              ? apr_pstrdup(result_pool, conflict->mime_type)
-                              : NULL;
-        new_conflict->base_file = svn_dirent_basename(conflict->base_abspath,
+        if (conflict->mime_type)
+          new_conflict->mime_type = apr_pstrdup(result_pool,
+                                                conflict->mime_type);
+        if (conflict->base_abspath)
+          new_conflict->base_file = svn_dirent_basename(conflict->base_abspath,
+                                                        result_pool);
+        if (conflict->their_abspath)
+          new_conflict->their_file = 
svn_dirent_basename(conflict->their_abspath,
+                                                         result_pool);
+        if (conflict->my_abspath)
+          new_conflict->my_file = svn_dirent_basename(conflict->my_abspath,
                                                       result_pool);
-        new_conflict->their_file = svn_dirent_basename(conflict->their_abspath,
-                                                       result_pool);
-        new_conflict->my_file = svn_dirent_basename(conflict->my_abspath,
-                                                    result_pool);
-        new_conflict->merged_file = conflict->merged_file
-                                    ? apr_pstrdup(result_pool,
-                                                  conflict->merged_file)
-                                    : NULL;
+        if (conflict->merged_file)
+          new_conflict->merged_file = apr_pstrdup(result_pool,
+                                                  conflict->merged_file);
         break;
 
       case svn_wc_conflict_kind_tree:

Modified: subversion/trunk/subversion/tests/cmdline/merge_tests.py
URL: 
http://svn.apache.org/viewvc/subversion/trunk/subversion/tests/cmdline/merge_tests.py?rev=1092759&r1=1092758&r2=1092759&view=diff
==============================================================================
--- subversion/trunk/subversion/tests/cmdline/merge_tests.py (original)
+++ subversion/trunk/subversion/tests/cmdline/merge_tests.py Fri Apr 15 
16:27:50 2011
@@ -16677,6 +16677,49 @@ def dry_run_merge_conflicting_binary(sbo
                                        None, None, None, None, None,
                                        True, True, '--allow-mixed-revisions',
                                        other_wc)
+
+#----------------------------------------------------------------------
+@Issue(3857)
+def foreign_repos_prop_conflict(sbox):
+  "prop conflict from foreign repos merge"
+
+  sbox.build()
+  wc_dir = sbox.wc_dir
+
+  # Create a second repository and working copy with the original
+  # greek tree.
+  repo_dir = sbox.repo_dir
+  other_repo_dir, other_repo_url = sbox.add_repo_path("other")
+  other_wc_dir = sbox.add_wc_path("other")
+  svntest.main.copy_repos(repo_dir, other_repo_dir, 1, 1)
+  svntest.actions.run_and_verify_svn(None, None, [], 'co', other_repo_url,
+                                     other_wc_dir)
+
+  # Add properties in the first repos and commit.
+  sbox.simple_propset('red', 'rojo', 'A/D/G')
+  sbox.simple_propset('yellow', 'amarillo', 'A/D/G')
+  svntest.actions.run_and_verify_svn(None, None, [],
+                                     'ci', '-m', 'spenglish', wc_dir)
+
+  # Tweak properties in the first repos and commit.
+  sbox.simple_propset('red', 'rosso', 'A/D/G')
+  sbox.simple_propset('yellow', 'giallo', 'A/D/G')
+  svntest.actions.run_and_verify_svn(None, None, [],
+                                     'ci', '-m', 'engtalian', wc_dir)
+
+  # Now, merge the propchange to the *second* working copy.
+  expected_output = [' C   %s\n' % (os.path.join(other_wc_dir,
+                                                 "A", "D", "G")),
+                     'Summary of conflicts:\n',
+                     '  Property conflicts: 1\n',
+                     ]
+  expected_output = expected_merge_output([[3]], expected_output, True)
+  svntest.actions.run_and_verify_svn(None,
+                                     expected_output,
+                                     [], 'merge', '-c3',
+                                     sbox.repo_url,
+                                     other_wc_dir)
+
 ########################################################################
 # Run the tests
 
@@ -16800,6 +16843,7 @@ test_list = [ None,
               subtree_merges_inherit_invalid_working_mergeinfo,
               merge_change_to_file_with_executable,
               dry_run_merge_conflicting_binary,
+              foreign_repos_prop_conflict,
              ]
 
 if __name__ == '__main__':


Reply via email to