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/10 21:05:55 UTC
svn commit: r942845 - in /subversion/trunk/subversion: libsvn_repos/load.c
tests/cmdline/svndumpfilter_tests.py
Author: pburba
Date: Mon May 10 19:05:54 2010
New Revision: 942845
URL: http://svn.apache.org/viewvc?rev=942845&view=rev
Log:
Fix issue #3020 mergeinfo mapping bug when loading dump with non-contiguous
revisions.
* subversion/libsvn_repos/load.c
(parse_baton): New member last_rev_mapped.
(close_revision): Set last_rev_mapped. Map any missing revisions in the
dump stream.
(svn_repos_get_fs_build_parser2): Initialize last_rev_mapped.
* subversion/tests/cmdline/svndumpfilter_tests.py
(dropped_but_not_renumbered_empty_revs): Remove comment re XFail.
(test_list): Remove XFail from dropped_but_not_renumbered_empty_revs.
Modified:
subversion/trunk/subversion/libsvn_repos/load.c
subversion/trunk/subversion/tests/cmdline/svndumpfilter_tests.py
Modified: subversion/trunk/subversion/libsvn_repos/load.c
URL: http://svn.apache.org/viewvc/subversion/trunk/subversion/libsvn_repos/load.c?rev=942845&r1=942844&r2=942845&view=diff
==============================================================================
--- subversion/trunk/subversion/libsvn_repos/load.c (original)
+++ subversion/trunk/subversion/libsvn_repos/load.c Mon May 10 19:05:54 2010
@@ -62,6 +62,11 @@ struct parse_baton
contents are allocated in POOL. */
apr_hash_t *rev_map;
+ /* The most recent (youngest) revision from the dump stream mapped in
+ REV_MAP. If no revisions have been mapped yet, this is set to
+ SVN_INVALID_REVNUM. */
+ svn_revnum_t last_rev_mapped;
+
/* The oldest old revision loaded from the dump stream. If no revisions
have been loaded yet, this is set to SVN_INVALID_REVNUM. */
svn_revnum_t oldest_old_rev;
@@ -1424,6 +1429,31 @@ close_revision(void *baton)
correct repository revision to copy from. */
apr_hash_set(pb->rev_map, old_rev, sizeof(svn_revnum_t), new_rev);
+ /* If the incoming dump stream has non-contiguous revisions (e.g. from
+ using svndumpfilter --drop-empty-revs without --renumber-revs) then
+ we must account for the missing gaps in PB->REV_MAP. Otherwise we
+ might not be able to map all mergeinfo source revisions to the correct
+ revisions in the target repos. */
+ if (pb->last_rev_mapped != SVN_INVALID_REVNUM
+ && *old_rev != pb->last_rev_mapped + 1)
+ {
+ int i;
+
+ /* Map all dropped revisions between PB->LAST_REV_MAPPED and OLD_REV. */
+ for (i = pb->last_rev_mapped + 1; i < *old_rev; i++)
+ {
+ svn_revnum_t *gap_rev_old = apr_palloc(pb->pool,
+ sizeof(*gap_rev_old));
+ svn_revnum_t *gap_rev_new = apr_palloc(pb->pool,
+ sizeof(*gap_rev_new));
+ *gap_rev_old = i;
+ *gap_rev_new = pb->last_rev_mapped;
+ apr_hash_set(pb->rev_map, gap_rev_old, sizeof(svn_revnum_t),
+ gap_rev_new);
+ }
+ }
+ pb->last_rev_mapped = *old_rev;
+
/* Deltify the predecessors of paths changed in this revision. */
SVN_ERR(svn_fs_deltify_revision(pb->fs, *new_rev, rb->pool));
@@ -1492,6 +1522,7 @@ svn_repos_get_fs_build_parser2(const svn
pb->pool = pool;
pb->rev_map = apr_hash_make(pool);
pb->oldest_old_rev = SVN_INVALID_REVNUM;
+ pb->last_rev_mapped = SVN_INVALID_REVNUM;
*callbacks = parser;
*parse_baton = pb;
Modified: subversion/trunk/subversion/tests/cmdline/svndumpfilter_tests.py
URL: http://svn.apache.org/viewvc/subversion/trunk/subversion/tests/cmdline/svndumpfilter_tests.py?rev=942845&r1=942844&r2=942845&view=diff
==============================================================================
--- subversion/trunk/subversion/tests/cmdline/svndumpfilter_tests.py (original)
+++ subversion/trunk/subversion/tests/cmdline/svndumpfilter_tests.py Mon May 10 19:05:54 2010
@@ -579,20 +579,8 @@ def dropped_but_not_renumbered_empty_rev
# ^
# With r7 dropped, r8 and r9 in the incoming
# dump becomes r7 and r8 in the loaded repos.
-
-
+
# Check the resulting mergeinfo.
- #
- # Currently this test fails with this resulting mergeinfo:
- #
- # Properties on 'branches/B1':
- # svn:mergeinfo
- # /trunk:6,8
- # Properties on 'branches/B1/B/E':
- # svn:mergeinfo
- # /trunk/B/E:5-6,8-9
- # ^
- # Not remapped to 7-8!
url = sbox.repo_url + "/branches"
expected_output = svntest.verify.UnorderedOutput([
url + "/B1 - /trunk:6,8\n",
@@ -612,7 +600,7 @@ test_list = [ None,
dumpfilter_with_targets,
dumpfilter_with_patterns,
filter_mergeinfo_revs_outside_of_dump_stream,
- XFail(dropped_but_not_renumbered_empty_revs),
+ dropped_but_not_renumbered_empty_revs,
]
if __name__ == '__main__':