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):