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/04/23 20:52:06 UTC

svn commit: r937465 - /subversion/trunk/subversion/libsvn_repos/dump.c

Author: pburba
Date: Fri Apr 23 18:52:06 2010
New Revision: 937465

URL: http://svn.apache.org/viewvc?rev=937465&view=rev
Log:
Issue inline and end-of-dump summary warnings when dumping mergeinfo that
refers to revisions outside of the requested dump range.

This is analogous to the warnings we issue for copy-from revisions older
than the oldest dumped rev and is part of a group of fixes for issue #3020,
see http://svn.haxx.se/dev/archive-2010-04/0475.shtml

* subversion/libsvn_repos/dump.c

  (global): include svn_mergeinfo_private.h

  (edit_baton): Add new member found_old_mergeinfo.

  (dump_node): Issue inline warning.

  (svn_repos_dump_fs3): Issue end-of-dump summary warning.

Modified:
    subversion/trunk/subversion/libsvn_repos/dump.c

Modified: subversion/trunk/subversion/libsvn_repos/dump.c
URL: http://svn.apache.org/viewvc/subversion/trunk/subversion/libsvn_repos/dump.c?rev=937465&r1=937464&r2=937465&view=diff
==============================================================================
--- subversion/trunk/subversion/libsvn_repos/dump.c (original)
+++ subversion/trunk/subversion/libsvn_repos/dump.c Fri Apr 23 18:52:06 2010
@@ -34,6 +34,7 @@
 #include "svn_checksum.h"
 #include "svn_props.h"
 
+#include "private/svn_mergeinfo_private.h"
 
 #define ARE_VALID_COPY_ARGS(p,r) ((p) && SVN_IS_VALID_REVNUM(r))
 
@@ -200,6 +201,10 @@ struct edit_baton
      OLDEST_DUMPED_REV were found in the dumpstream. */
   svn_boolean_t found_old_reference;
 
+  /* Set to true if any mergeinfo was dumped which contains revisions
+     older than OLDEST_DUMPED_REV. */
+  svn_boolean_t found_old_mergeinfo;
+
   /* reusable buffer for writing file contents */
   char buffer[SVN__STREAM_CHUNK_SIZE];
   apr_size_t bufsize;
@@ -504,6 +509,43 @@ dump_node(struct edit_baton *eb,
       apr_size_t proplen;
 
       SVN_ERR(svn_fs_node_proplist(&prophash, eb->fs_root, path, pool));
+
+      /* If this is a partial dump, then issue a warning if we dump mergeinfo
+         properties that refer to revisions older than the first revision
+         dumped. */
+      if (eb->progress_func && eb->oldest_dumped_rev > 1)
+        {
+          svn_string_t *mergeinfo_str = apr_hash_get(prophash,
+                                                     SVN_PROP_MERGEINFO,
+                                                     APR_HASH_KEY_STRING);
+          if (mergeinfo_str)
+            {
+              svn_mergeinfo_t mergeinfo, old_mergeinfo;
+
+              SVN_ERR(svn_mergeinfo_parse(&mergeinfo, mergeinfo_str->data,
+                                          pool));
+              SVN_ERR(svn_mergeinfo__filter_mergeinfo_by_ranges(
+                &old_mergeinfo, mergeinfo,
+                eb->oldest_dumped_rev - 1, 0,
+                TRUE, pool, pool));
+              if (apr_hash_count(old_mergeinfo))
+                {
+                  const char *warning = apr_psprintf(
+                    pool,
+                    _("WARNING: Mergeinfo referencing revision(s) prior "
+                      "to the oldest dumped revision (%ld).\n"
+                      "WARNING: Loading this dump may result in invalid "
+                      "mergeinfo.\n"),
+                    eb->oldest_dumped_rev);
+
+                  eb->found_old_mergeinfo = TRUE;
+                  SVN_ERR(eb->progress_func(eb->progress_baton,
+                                            SVN_INVALID_REVNUM,
+                                            warning, pool));
+                }
+            }
+        }
+
       if (eb->use_deltas && compare_root)
         {
           /* Fetch the old property hash to diff against and output a header
@@ -987,6 +1029,7 @@ svn_repos_dump_fs3(svn_repos_t *repos,
   const char *uuid;
   int version;
   svn_boolean_t found_old_reference = FALSE;
+  svn_boolean_t found_old_mergeinfo = FALSE;
 
   /* Determine the current youngest revision of the filesystem. */
   SVN_ERR(svn_fs_youngest_rev(&youngest, fs, pool));
@@ -1115,21 +1158,39 @@ svn_repos_dump_fs3(svn_repos_t *repos,
       if (progress_func)
         SVN_ERR(progress_func(progress_baton, to_rev, NULL, subpool));
 
-      if (dump_edit_baton /* We never get an edit baton for r0. */
-          && ((struct edit_baton *)dump_edit_baton)->found_old_reference)
-        found_old_reference = TRUE;
+      if (dump_edit_baton) /* We never get an edit baton for r0. */
+        {
+          if (((struct edit_baton *)dump_edit_baton)->found_old_reference)
+            found_old_reference = TRUE;
+          if (((struct edit_baton *)dump_edit_baton)->found_old_mergeinfo)
+            found_old_mergeinfo = TRUE;
+        }
     }
 
-  /* Did we issue any warnings about references to revisions older than
-     the oldest dumped revision?  If so, then issue a final generic
-     warning, since the inline warnings already issued might easily be
-     missed. */
-  if (progress_func && found_old_reference)
-    SVN_ERR(progress_func(progress_baton, SVN_INVALID_REVNUM,
-                          _("WARNING: The range of revisions dumped "
-                            "contained references to\n"
-                            "WARNING: copy sources outside that range.\n"),
-                            subpool));
+  if (progress_func)
+    {
+      /* Did we issue any warnings about references to revisions older than
+         the oldest dumped revision?  If so, then issue a final generic
+         warning, since the inline warnings already issued might easily be
+         missed. */
+      if (found_old_reference)
+        SVN_ERR(progress_func(progress_baton, SVN_INVALID_REVNUM,
+                              _("WARNING: The range of revisions dumped "
+                                "contained references to\n"
+                                "WARNING: copy sources outside that "
+                                "range.\n"),
+                              subpool));
+
+      /* Ditto if we issued any warnings about old revisions referenced
+         in dumped mergeinfo. */
+      if (found_old_mergeinfo)
+        SVN_ERR(progress_func(progress_baton, SVN_INVALID_REVNUM,
+                              _("WARNING: The range of revisions dumped "
+                                "contained mergeinfo\n"
+                                "WARNING: which reference revisions outside "
+                                "that range.\n"),
+                              subpool));
+    }
 
   svn_pool_destroy(subpool);