Author: cmpilato
Date: Wed Dec  9 21:24:19 2009
New Revision: 888979

URL: http://svn.apache.org/viewvc?rev=888979&view=rev
Log:
Fix issue #3547 - 'svnadmin load --parent-dir PATH' can destroy mergeinfo

* subversion/libsvn_repos/load.c
  (prefix_mergeinfo_paths): If the parent_dir prefix isn't absolute,
    be sure to correct that in the merge source path.

* subversion/tests/cmdline/svnadmin_tests.py
  (load_with_parent_dir): Modify this test to also attempt the load
    with the --parent-dir argument lacking its leading slash.  (A
    couple of minor, nearby formatting tweaks are included, too.)

Modified:
    subversion/trunk/subversion/libsvn_repos/load.c
    subversion/trunk/subversion/tests/cmdline/svnadmin_tests.py

Modified: subversion/trunk/subversion/libsvn_repos/load.c
URL: 
http://svn.apache.org/viewvc/subversion/trunk/subversion/libsvn_repos/load.c?rev=888979&r1=888978&r2=888979&view=diff
==============================================================================
--- subversion/trunk/subversion/libsvn_repos/load.c (original)
+++ subversion/trunk/subversion/libsvn_repos/load.c Wed Dec  9 21:24:19 2009
@@ -234,10 +234,20 @@
   prefixed_mergeinfo = apr_hash_make(pool);
   for (hi = apr_hash_first(pool, mergeinfo); hi; hi = apr_hash_next(hi))
     {
-      const char *path;
-      const void *merge_source;
-      apr_hash_this(hi, &merge_source, NULL, &rangelist);
-      path = svn_path_join(parent_dir, (const char*)merge_source+1, pool);
+      const void *key;
+      const char *path, *merge_source;
+
+      apr_hash_this(hi, &key, NULL, &rangelist);
+      merge_source = key;
+
+      /* The svn:mergeinfo property syntax demands absolute repository
+         paths, so prepend a leading slash if   */
+      if (*parent_dir != '/')
+        path = svn_path_join_many(pool, "/", parent_dir, 
+                                  merge_source + 1, NULL);
+      else
+        path = svn_path_join(parent_dir, merge_source + 1, pool);
+
       apr_hash_set(prefixed_mergeinfo, path, APR_HASH_KEY_STRING, rangelist);
     }
   return svn_mergeinfo_to_string(mergeinfo_val, prefixed_mergeinfo, pool);

Modified: subversion/trunk/subversion/tests/cmdline/svnadmin_tests.py
URL: 
http://svn.apache.org/viewvc/subversion/trunk/subversion/tests/cmdline/svnadmin_tests.py?rev=888979&r1=888978&r2=888979&view=diff
==============================================================================
--- subversion/trunk/subversion/tests/cmdline/svnadmin_tests.py (original)
+++ subversion/trunk/subversion/tests/cmdline/svnadmin_tests.py Wed Dec  9 
21:24:19 2009
@@ -701,14 +701,12 @@
                                    'mergeinfo_included.dump')
   dumpfile = svntest.main.file_read(dumpfile_location)
 
-  # Create 'sample' dir in sbox.repo_url
+  # Create 'sample' dir in sbox.repo_url, and load the dump stream there.
   svntest.actions.run_and_verify_svn(None,
                                      ['\n', 'Committed revision 1.\n'],
                                      [], "mkdir", sbox.repo_url + "/sample",
                                      "-m", "Create sample dir")
-
-  # Load the dump stream
-  load_and_verify_dumpstream(sbox,[],[], None, dumpfile, '--parent-dir',
+  load_and_verify_dumpstream(sbox, [], [], None, dumpfile, '--parent-dir',
                              '/sample')
 
   # Verify the svn:mergeinfo properties for '--parent-dir'
@@ -724,6 +722,30 @@
                                      [], 'propget', 'svn:mergeinfo', '-R',
                                      sbox.repo_url + '/sample/branch1')
 
+  # Create 'sample-2' dir in sbox.repo_url, and load the dump stream again.
+  # This time, don't include a leading slash on the --parent-dir argument.
+  # See issue #3547.
+  svntest.actions.run_and_verify_svn(None,
+                                     ['\n', 'Committed revision 11.\n'],
+                                     [], "mkdir", sbox.repo_url + "/sample-2",
+                                     "-m", "Create sample-2 dir")
+  load_and_verify_dumpstream(sbox, [], [], None, dumpfile, '--parent-dir',
+                             'sample-2')
+
+  # Verify the svn:mergeinfo properties for '--parent-dir'.
+  svntest.actions.run_and_verify_svn(None,
+                                     [sbox.repo_url +
+                                      "/sample-2/branch - " +
+                                      "/sample-2/trunk:15-17\n"],
+                                     [], 'propget', 'svn:mergeinfo', '-R',
+                                     sbox.repo_url + '/sample-2/branch')
+  svntest.actions.run_and_verify_svn(None,
+                                     [sbox.repo_url +
+                                      "/sample-2/branch1 - " +
+                                      "/sample-2/branch:16-19\n"],
+                                     [], 'propget', 'svn:mergeinfo', '-R',
+                                     sbox.repo_url + '/sample-2/branch1')
+
 #----------------------------------------------------------------------
 
 def set_uuid(sbox):


Reply via email to