Index: subversion/svndumpfilter/main.c
===================================================================
--- subversion/svndumpfilter/main.c	(revision 27828)
+++ subversion/svndumpfilter/main.c	(working copy)
@@ -629,28 +629,43 @@
 }
 
 
-/* Renumber revisions for valid merge sources in mergeinfo. */
+/* Check whether we need to skip this PATH or not based on the
+   PREFIXES list and the DO_EXCLUDE option. */
+static svn_boolean_t
+skip_path(const char *path, apr_array_header_t *prefixes,
+          svn_boolean_t do_exclude)
+{
+  return (ary_prefix_match(prefixes, path) ? do_exclude : (! do_exclude));
+}
+
+
+/* Renumber revisions or skip missing merge sources in mergeinfo. */
 static svn_error_t *
-renumber_merge_source_rev_range(const char **mergeinfo_val,
-                                const char *mergeinfo_orig,
-                                struct revision_baton_t *rb,
-                                apr_pool_t *pool)
+skip_missing_merge_source_or_renumber_revs(const char **mergeinfo_val,
+                                           const char *mergeinfo_orig,
+                                           struct revision_baton_t *rb,
+                                           apr_pool_t *pool)
 {
   apr_hash_t *modified_mergeinfo, *mergeinfo;
   apr_hash_index_t *hi;
   svn_stringbuf_t *merge_val;
-  const void *merge_source;
-  void *rangelist;
 
   SVN_ERR(svn_mergeinfo_parse(&mergeinfo, mergeinfo_orig, pool));
   modified_mergeinfo = apr_hash_make(pool);
   for (hi = apr_hash_first(NULL, mergeinfo); hi; hi = apr_hash_next(hi))
     {
       int i;
-      apr_hash_this(hi, &merge_source, NULL, &rangelist);
+      const void *key;
+      void *val;
+      const char *merge_source;
+      apr_array_header_t *rangelist;
 
-      /* Look whether the merge_source is a part of the included prefix. */
-      if (!ary_prefix_match(rb->pb->prefixes, merge_source))
+      apr_hash_this(hi, &key, NULL, &val);
+      merge_source = (const char *)key;
+      rangelist = (apr_array_header_t *)val;
+
+      /* Look whether the merge_source is a part of the prefix. */
+      if (skip_path(merge_source, rb->pb->prefixes, rb->pb->do_exclude))
         {
           if (rb->pb->skip_missing_merge_sources)
             continue;
@@ -658,27 +673,37 @@
             return svn_error_createf(SVN_ERR_INCOMPLETE_DATA, 0,
                                      _("Missing merge source path '%s', try "
                                        "with --skip-missing-merge-sources"),
-                                     (const char *)merge_source);
+                                     merge_source);
         }
 
       /* Renumber mergeinfo rangelist. */
-      for (i = 0; i < ((apr_array_header_t *)rangelist)->nelts; i++)
+      if (rb->pb->do_renumber_revs)
         {
-          struct revmap_t *revmap_start;
-          struct revmap_t *revmap_end;
-          svn_merge_range_t *range;
+          for (i = 0; i < rangelist->nelts; i++)
+            {
+              struct revmap_t *revmap_start;
+              struct revmap_t *revmap_end;
+              svn_merge_range_t *range;
 
-          range = APR_ARRAY_IDX((apr_array_header_t *)rangelist, i,
-                                svn_merge_range_t *);
-          revmap_start = apr_hash_get(rb->pb->renumber_history, &range->start,
-                                      sizeof(svn_revnum_t));
-          revmap_end = apr_hash_get(rb->pb->renumber_history, &range->end,
-                                    sizeof(svn_revnum_t));
-          range->start = revmap_start->rev;
-          range->end = revmap_end->rev;
+              range = APR_ARRAY_IDX(rangelist, i, svn_merge_range_t *);
+              revmap_start = apr_hash_get(rb->pb->renumber_history, &range->start,
+                                          sizeof(svn_revnum_t));
+              revmap_end = apr_hash_get(rb->pb->renumber_history, &range->end,
+                                        sizeof(svn_revnum_t));
+              if (! (revmap_start && SVN_IS_VALID_REVNUM(revmap_start->rev)))
+                return svn_error_createf
+                  (SVN_ERR_NODE_UNEXPECTED_KIND, NULL,
+                   _("No valid mergerange start revision in filtered stream"));
+              if (! (revmap_end && SVN_IS_VALID_REVNUM(revmap_end->rev)))
+                return svn_error_createf
+                  (SVN_ERR_NODE_UNEXPECTED_KIND, NULL,
+                   _("No valid mergerange end revision in filtered stream"));
+              range->start = revmap_start->rev;
+              range->end = revmap_end->rev;
+            }
+          apr_hash_set(modified_mergeinfo, merge_source,
+                       APR_HASH_KEY_STRING, rangelist);
         }
-      apr_hash_set(modified_mergeinfo, (const char*)merge_source,
-                   APR_HASH_KEY_STRING, rangelist);
     }
   svn_mergeinfo_to_stringbuf(&merge_val, modified_mergeinfo, pool);
   *mergeinfo_val = merge_val->data;
@@ -723,9 +748,10 @@
       apr_pool_t *subpool = svn_pool_create(apr_hash_pool_get(rb->props));
       const char *mergeinfo_val;
 
-      /* Renumber revisions for valid merge sources in mergeinfo. */
-      SVN_ERR(renumber_merge_source_rev_range(&mergeinfo_val, value->data, rb,
-                                              subpool));
+      /* Renumber revisions or skip missing merge sources in mergeinfo. */
+      SVN_ERR(skip_missing_merge_source_or_renumber_revs(&mergeinfo_val,
+                                                         value->data, rb,
+                                                         subpool));
       value = svn_string_create(mergeinfo_val, apr_hash_pool_get(rb->props));
       svn_pool_destroy(subpool);
     }


