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/05 23:12:24 UTC

svn commit: r941491 - in /subversion/trunk/subversion: libsvn_repos/load.c tests/cmdline/svndumpfilter_tests.py

Author: pburba
Date: Wed May  5 21:12:24 2010
New Revision: 941491

URL: http://svn.apache.org/viewvc?rev=941491&view=rev
Log:
Fix svndumpfilter_tests.py 5 'filter mergeinfo revs outside of dump stream'.

This change reapplies part of r927243 which was reverted in r936387
and is part of the issue #3020 group of fixes.

* subversion/libsvn_repos/load.c

  (parse_baton): New member oldest_old_rev.

  (renumber_mergeinfo_revs): Account for the fact that svn_merge_range_t's
   start_rev member is not inclusive when renumbering merge source revs.

  (close_revision): Set oldest_old_rev.

  (svn_repos_get_fs_build_parser2): Initialize oldest_old_rev.

* subversion/tests/cmdline/svndumpfilter_tests.py

  (filter_mergeinfo_revs_outside_of_dump_stream): Remove comment about
   XFail.

  (test_list): Remove XFail from
   filter_mergeinfo_revs_outside_of_dump_stream.

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=941491&r1=941490&r2=941491&view=diff
==============================================================================
--- subversion/trunk/subversion/libsvn_repos/load.c (original)
+++ subversion/trunk/subversion/libsvn_repos/load.c Wed May  5 21:12:24 2010
@@ -61,6 +61,10 @@ struct parse_baton
      (svn_revnum_t *) in the loaded repository.  The hash and its
      contents are allocated in POOL. */
   apr_hash_t *rev_map;
+
+  /* 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;
 };
 
 struct revision_baton
@@ -295,18 +299,41 @@ renumber_mergeinfo_revs(svn_string_t **f
                                                    svn_merge_range_t *);
           rev_from_map = apr_hash_get(pb->rev_map, &range->start,
                                       sizeof(svn_revnum_t));
-          /* If we can't remap the start revision then don't even bother
-             trying to remap the end revision.  It's possible we might
-             actually succeed at the latter, which can result in invalid
-             mergeinfo with a start rev > end red.  If that gets into the
-             repository then a world of bustage breaks loose anytime that
-             bogus mergeinfo is parsed.  See
-             http://subversion.tigris.org/issues/show_bug.cgi?id=3020#desc16.
-             */
           if (rev_from_map && SVN_IS_VALID_REVNUM(*rev_from_map))
-            range->start = *rev_from_map;
+            {
+              range->start = *rev_from_map;
+            }
+          else if (range->start == pb->oldest_old_rev - 1)
+            {
+              /* Since the start revision of svn_merge_range_t are not
+                 inclusive there is one possible valid start revision that
+                 won't be found in the PB->REV_MAP mapping of load stream
+                 revsions to loaded revisions: The revision immediately
+                 preceeding the oldest revision from the load stream.
+                 This is a valid revision for mergeinfo, but not a valid
+                 copy from revision (which PB->REV_MAP also maps for) so it
+                 will never be in the mapping.
+
+                 If that is what we have here, then find the mapping for the
+                 oldest rev from the load stream and subtract 1 to get the
+                 renumbered, non-inclusive, start revision. */
+              rev_from_map = apr_hash_get(pb->rev_map, &pb->oldest_old_rev,
+                                          sizeof(svn_revnum_t));
+              if (rev_from_map && SVN_IS_VALID_REVNUM(*rev_from_map))
+                range->start = *rev_from_map - 1;
+            }
           else
-            continue;
+            {
+              /* If we can't remap the start revision then don't even bother
+                 trying to remap the end revision.  It's possible we might
+                 actually succeed at the latter, which can result in invalid
+                 mergeinfo with a start rev > end rev.  If that gets into the
+                 repository then a world of bustage breaks loose anytime that
+                 bogus mergeinfo is parsed.  See
+                 http://subversion.tigris.org/issues/show_bug.cgi?id=3020#desc16.
+                 */
+              continue;
+            }
 
           rev_from_map = apr_hash_get(pb->rev_map, &range->end,
                                       sizeof(svn_revnum_t));
@@ -1379,6 +1406,10 @@ close_revision(void *baton)
         return svn_error_return(err);
     }
 
+  /* Stash the oldest "old" revision committed from the load stream. */
+  if (!SVN_IS_VALID_REVNUM(pb->oldest_old_rev))
+    pb->oldest_old_rev = *old_rev;
+
   /* Run post-commit hook, if so commanded.  */
   if (pb->use_post_commit_hook)
     {
@@ -1460,6 +1491,7 @@ svn_repos_get_fs_build_parser2(const svn
   pb->parent_dir = parent_dir;
   pb->pool = pool;
   pb->rev_map = apr_hash_make(pool);
+  pb->oldest_old_rev = 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=941491&r1=941490&r2=941491&view=diff
==============================================================================
--- subversion/trunk/subversion/tests/cmdline/svndumpfilter_tests.py (original)
+++ subversion/trunk/subversion/tests/cmdline/svndumpfilter_tests.py Wed May  5 21:12:24 2010
@@ -338,20 +338,6 @@ def filter_mergeinfo_revs_outside_of_dum
   load_and_verify_dumpstream(sbox, [], [], None, filtered_dumpfile2,
                              '--ignore-uuid')
   # Check the resulting mergeinfo.
-  #
-  # Currently this fails with this mergeinfo:
-  #
-  #  Properties on 'branches\B1':
-  #    svn:mergeinfo
-  #      /branches/B2:6-7
-  #      /trunk:4,6 <-- r6 should be mapped to r1 and then removed.
-  #  Properties on 'branches\B2':
-  #    svn:mergeinfo
-  #      /trunk:4
-  #  Properties on 'branches\B1\B\E':
-  #    svn:mergeinfo
-  #      /branches/B2/B/E:6-7
-  #      /trunk/B/E:3-4,6 <-- r6 should be mapped to r1 and then removed.
   url = sbox.repo_url + "/branches"
   expected_output = svntest.verify.UnorderedOutput([
     url + "/B1 - /branches/B2:6-7\n",
@@ -373,7 +359,7 @@ test_list = [ None,
               svndumpfilter_loses_mergeinfo,
               dumpfilter_with_targets,
               dumpfilter_with_patterns,
-              XFail(filter_mergeinfo_revs_outside_of_dump_stream),
+              filter_mergeinfo_revs_outside_of_dump_stream,
               ]
 
 if __name__ == '__main__':