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__':