You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@subversion.apache.org by hw...@apache.org on 2010/09/06 22:02:24 UTC

svn commit: r993141 [20/25] - in /subversion/branches/performance: ./ build/ac-macros/ build/generator/ contrib/server-side/ notes/ notes/wc-ng/ subversion/bindings/javahl/native/ subversion/bindings/javahl/src/org/apache/subversion/javahl/ subversion/...

Modified: subversion/branches/performance/subversion/svn/commit-cmd.c
URL: http://svn.apache.org/viewvc/subversion/branches/performance/subversion/svn/commit-cmd.c?rev=993141&r1=993140&r2=993141&view=diff
==============================================================================
--- subversion/branches/performance/subversion/svn/commit-cmd.c (original)
+++ subversion/branches/performance/subversion/svn/commit-cmd.c Mon Sep  6 20:02:15 2010
@@ -119,6 +119,9 @@ svn_cl__commit(apr_getopt_t *os,
                            opt_state->keep_changelists,
                            opt_state->changelists,
                            opt_state->revprop_table,
+                           ! opt_state->quiet
+                                ? svn_cl__print_commit_info : NULL,
+                           NULL,
                            ctx,
                            pool);
   if (err)

Modified: subversion/branches/performance/subversion/svn/copy-cmd.c
URL: http://svn.apache.org/viewvc/subversion/branches/performance/subversion/svn/copy-cmd.c?rev=993141&r1=993140&r2=993141&view=diff
==============================================================================
--- subversion/branches/performance/subversion/svn/copy-cmd.c (original)
+++ subversion/branches/performance/subversion/svn/copy-cmd.c Mon Sep  6 20:02:15 2010
@@ -139,7 +139,9 @@ svn_cl__copy(apr_getopt_t *os,
 
   err = svn_client_copy6(sources, dst_path, TRUE,
                          opt_state->parents, opt_state->ignore_externals,
-                         opt_state->revprop_table, ctx, pool);
+                         opt_state->revprop_table,
+                         svn_cl__print_commit_info, NULL,
+                         ctx, pool);
 
   if (ctx->log_msg_func3)
     SVN_ERR(svn_cl__cleanup_log_msg(ctx->log_msg_baton3, err, pool));

Modified: subversion/branches/performance/subversion/svn/delete-cmd.c
URL: http://svn.apache.org/viewvc/subversion/branches/performance/subversion/svn/delete-cmd.c?rev=993141&r1=993140&r2=993141&view=diff
==============================================================================
--- subversion/branches/performance/subversion/svn/delete-cmd.c (original)
+++ subversion/branches/performance/subversion/svn/delete-cmd.c Mon Sep  6 20:02:15 2010
@@ -47,6 +47,8 @@ svn_cl__delete(apr_getopt_t *os,
   svn_client_ctx_t *ctx = ((svn_cl__cmd_baton_t *) baton)->ctx;
   apr_array_header_t *targets;
   svn_error_t *err;
+  svn_boolean_t is_url;
+  int i;
 
   SVN_ERR(svn_cl__args_to_target_array_print_reserved(&targets, os,
                                                       opt_state->targets,
@@ -55,7 +57,19 @@ svn_cl__delete(apr_getopt_t *os,
   if (! targets->nelts)
     return svn_error_create(SVN_ERR_CL_INSUFFICIENT_ARGS, 0, NULL);
 
-  if (! svn_path_is_url(APR_ARRAY_IDX(targets, 0, const char *)))
+  /* Check that all targets are of the same type. */
+  is_url = svn_path_is_url(APR_ARRAY_IDX(targets, 0, const char *));
+  for (i = 1; i < targets->nelts; i++)
+    {
+      const char *target = APR_ARRAY_IDX(targets, i, const char *);
+      if (is_url != svn_path_is_url(target))
+        return svn_error_return(
+                 svn_error_create(SVN_ERR_CL_ARG_PARSING_ERROR, NULL,
+                                  _("Cannot mix repository and working copy "
+                                    "targets")));
+    }
+
+  if (! is_url)
     {
       ctx->log_msg_func3 = NULL;
       if (opt_state->message || opt_state->filedata || opt_state->revprop_table)
@@ -75,7 +89,8 @@ svn_cl__delete(apr_getopt_t *os,
   SVN_ERR(svn_cl__eat_peg_revisions(&targets, targets, pool));
 
   err = svn_client_delete4(targets, opt_state->force, opt_state->keep_local,
-                           opt_state->revprop_table, ctx, pool);
+                           opt_state->revprop_table, svn_cl__print_commit_info,
+                           NULL, ctx, pool);
   if (err)
     err = svn_cl__may_need_force(err);
 

Modified: subversion/branches/performance/subversion/svn/diff-cmd.c
URL: http://svn.apache.org/viewvc/subversion/branches/performance/subversion/svn/diff-cmd.c?rev=993141&r1=993140&r2=993141&view=diff
==============================================================================
--- subversion/branches/performance/subversion/svn/diff-cmd.c (original)
+++ subversion/branches/performance/subversion/svn/diff-cmd.c Mon Sep  6 20:02:15 2010
@@ -284,9 +284,9 @@ svn_cl__diff(apr_getopt_t *os,
         }
 
       if (url_present && working_copy_present)
-        return svn_error_createf(SVN_ERR_UNSUPPORTED_FEATURE, NULL,
-                                 _("Target lists to diff may not contain "
-                                   "both working copy paths and URLs"));
+        return svn_error_createf(SVN_ERR_CL_ARG_PARSING_ERROR, NULL,
+                                  _("Cannot mix repository and working copy "
+                                    "targets"));
 
       if (opt_state->start_revision.kind == svn_opt_revision_unspecified
           && working_copy_present)

Modified: subversion/branches/performance/subversion/svn/export-cmd.c
URL: http://svn.apache.org/viewvc/subversion/branches/performance/subversion/svn/export-cmd.c?rev=993141&r1=993140&r2=993141&view=diff
==============================================================================
--- subversion/branches/performance/subversion/svn/export-cmd.c (original)
+++ subversion/branches/performance/subversion/svn/export-cmd.c Mon Sep  6 20:02:15 2010
@@ -87,6 +87,11 @@ svn_cl__export(apr_getopt_t *os,
         SVN_ERR(svn_opt__split_arg_at_peg_revision(&to, NULL, to, pool));
     }
 
+  if (svn_path_is_url(to))
+    return svn_error_return(svn_error_createf(SVN_ERR_CL_ARG_PARSING_ERROR,
+                                              NULL,
+                                              _("'%s' is not a local path"),
+                                              to));
   if (! opt_state->quiet)
     SVN_ERR(svn_cl__notifier_mark_export(ctx->notify_baton2));
 

Modified: subversion/branches/performance/subversion/svn/import-cmd.c
URL: http://svn.apache.org/viewvc/subversion/branches/performance/subversion/svn/import-cmd.c?rev=993141&r1=993140&r2=993141&view=diff
==============================================================================
--- subversion/branches/performance/subversion/svn/import-cmd.c (original)
+++ subversion/branches/performance/subversion/svn/import-cmd.c Mon Sep  6 20:02:15 2010
@@ -100,6 +100,11 @@ svn_cl__import(apr_getopt_t *os,
       url = APR_ARRAY_IDX(targets, 1, const char *);
     }
 
+  if (svn_path_is_url(path))
+    return svn_error_return(svn_error_createf(SVN_ERR_CL_ARG_PARSING_ERROR,
+                                              NULL,
+                                              _("'%s' is not a local path"),
+                                              path));
   if (! svn_path_is_url(url))
     return svn_error_createf
       (SVN_ERR_CL_ARG_PARSING_ERROR, NULL,
@@ -119,6 +124,8 @@ svn_cl__import(apr_getopt_t *os,
                               opt_state->no_ignore,
                               opt_state->force,
                               opt_state->revprop_table,
+                              svn_cl__print_commit_info,
+                              NULL,
                               ctx,
                               pool), pool));
 

Modified: subversion/branches/performance/subversion/svn/log-cmd.c
URL: http://svn.apache.org/viewvc/subversion/branches/performance/subversion/svn/log-cmd.c?rev=993141&r1=993140&r2=993141&view=diff
==============================================================================
--- subversion/branches/performance/subversion/svn/log-cmd.c (original)
+++ subversion/branches/performance/subversion/svn/log-cmd.c Mon Sep  6 20:02:15 2010
@@ -27,6 +27,7 @@
 
 #include "svn_client.h"
 #include "svn_compat.h"
+#include "svn_dirent_uri.h"
 #include "svn_string.h"
 #include "svn_path.h"
 #include "svn_error.h"
@@ -351,6 +352,7 @@ log_entry_receiver(void *baton,
                       if (err->apr_err == SVN_ERR_FS_NOT_FOUND)
                         {
                           svn_error_clear(err);
+                          parent = svn_uri_dirname(parent, pool);
                           continue;
                         }
                       if (err->apr_err == SVN_ERR_RA_ILLEGAL_URL ||
@@ -362,8 +364,6 @@ log_entry_receiver(void *baton,
                         }
                       return svn_error_return(err);
                     }
-
-                  parent = svn_uri_dirname(parent, pool);
                 }
               svn_pool_destroy(iterpool);
             }
@@ -647,10 +647,13 @@ svn_cl__log(apr_getopt_t *os,
         {
           target = APR_ARRAY_IDX(targets, i, const char *);
 
-          if (svn_path_is_url(target))
-            return svn_error_create(SVN_ERR_UNSUPPORTED_FEATURE, NULL,
-                                    _("Only relative paths can be specified "
-                                      "after a URL"));
+          if (svn_path_is_url(target) || target[0] == '/')
+            return svn_error_return(svn_error_createf(
+                                      SVN_ERR_CL_ARG_PARSING_ERROR, NULL,
+                                      _("Only relative paths can be specified"
+                                        " after a URL for 'svn log', "
+                                        "but '%s' is not a relative path"),
+                                      target));
         }
     }
 

Modified: subversion/branches/performance/subversion/svn/main.c
URL: http://svn.apache.org/viewvc/subversion/branches/performance/subversion/svn/main.c?rev=993141&r1=993140&r2=993141&view=diff
==============================================================================
--- subversion/branches/performance/subversion/svn/main.c (original)
+++ subversion/branches/performance/subversion/svn/main.c Mon Sep  6 20:02:15 2010
@@ -368,7 +368,7 @@ const apr_getopt_option_t svn_cl__option
                        N_("override diff-cmd specified in config file\n"
                        "                             "
                        "[alias: --idiff]")},
-  {"git-diff", opt_use_git_diff_format, 0,
+  {"git", opt_use_git_diff_format, 0,
                        N_("use git's extended diff format\n")},
                   
   /* Long-opt Aliases
@@ -543,7 +543,7 @@ const svn_opt_subcommand_desc2_t svn_cl_
      "    committed, are immediately removed from the working copy\n"
      "    unless the --keep-local option is given.\n"
      "    PATHs that are, or contain, unversioned or modified items will\n"
-     "    not be removed unless the --force option is given.\n"
+     "    not be removed unless the --force or --keep-local option is given.\n"
      "\n"
      "  2. Each item specified by a URL is deleted from the repository\n"
      "    via an immediate commit.\n"),
@@ -934,20 +934,14 @@ const svn_opt_subcommand_desc2_t svn_cl_
      "      A mimetype beginning with 'text/' (or an absent mimetype) is\n"
      "      treated as text.  Anything else is treated as binary.\n"
      "    svn:externals  - A newline separated list of module specifiers,\n"
-     "      each of which consists of a relative directory path, optional\n"
-     "      revision flags and an URL.  The ordering of the three elements\n"
-     "      implements different behavior.  Subversion 1.4 and earlier only\n"
-     "      support the following formats and the URLs cannot have peg\n"
-     "      revisions:\n"
-     "        foo             http://example.com/repos/zig\n"
-     "        foo/bar -r 1234 http://example.com/repos/zag\n"
-     "      Subversion 1.5 and greater support the above formats and the\n"
-     "      following formats where the URLs may have peg revisions:\n"
-     "                http://example.com/repos/zig@42 foo\n"
-     "        -r 1234 http://example.com/repos/zig foo/bar\n"
-     "      Relative URLs are supported in Subversion 1.5 and greater for\n"
-     "      all above formats and are indicated by starting the URL with one\n"
-     "      of the following strings\n"
+     "      each of which consists of a URL and a relative directory path,\n"
+     "      similar to the syntax of the 'svn checkout' command:\n"
+     "        http://example.com/repos/zag foo/bar\n"
+     "      An optional peg revision may be appended to the URL to pin the\n"
+     "      external to a known revision:\n"
+     "        http://example.com/repos/zig@42 foo\n"
+     "      Relative URLs are indicated by starting the URL with one\n"
+     "      of the following strings:\n"
      "        ../  to the parent directory of the extracted external\n"
      "        ^/   to the repository root\n"
      "        //   to the scheme\n"
@@ -956,6 +950,13 @@ const svn_opt_subcommand_desc2_t svn_cl_
      "      'relative_url relative_path' with peg revision support.\n"
      "      Lines in externals definitions starting with the '#' character\n"
      "      are considered comments and are ignored.\n"
+     "      Subversion 1.4 and earlier only support the following formats\n"
+     "      where peg revisions can only be specified using a -r modifier\n"
+     "      and where URLs cannot be relative:\n"
+     "        foo             http://example.com/repos/zig\n"
+     "        foo/bar -r 1234 http://example.com/repos/zag\n"
+     "      Use of these formats is discouraged. They should only be used if\n"
+     "      interoperability with 1.4 clients is desired.\n"
      "    svn:needs-lock - If present, indicates that the file should be locked\n"
      "      before it is modified.  Makes the working copy file read-only\n"
      "      when it is not locked.  Use 'svn propdel svn:needs-lock PATH...'\n"
@@ -1782,6 +1783,7 @@ main(int argc, const char *argv[])
         break;
       case opt_use_git_diff_format:
         opt_state.use_git_diff_format = TRUE;
+        break;
       default:
         /* Hmmm. Perhaps this would be a good place to squirrel away
            opts that commands like svn diff might need. Hmmm indeed. */
@@ -2228,10 +2230,6 @@ main(int argc, const char *argv[])
         return svn_cmdline_handle_exit_error(err, pool, "svn: ");
     }
 
-  /* Set up our commit callback.  We leave the callback NULL. */
-  if (!opt_state.quiet)
-    ctx->commit_callback2 = svn_cl__print_commit_info;
-
   /* Set up our cancellation support. */
   ctx->cancel_func = svn_cl__check_cancel;
   apr_signal(SIGINT, signal_handler);

Modified: subversion/branches/performance/subversion/svn/merge-cmd.c
URL: http://svn.apache.org/viewvc/subversion/branches/performance/subversion/svn/merge-cmd.c?rev=993141&r1=993140&r2=993141&view=diff
==============================================================================
--- subversion/branches/performance/subversion/svn/merge-cmd.c (original)
+++ subversion/branches/performance/subversion/svn/merge-cmd.c Mon Sep  6 20:02:15 2010
@@ -337,6 +337,11 @@ svn_cl__merge(apr_getopt_t *os,
     }
   else
     {
+      if (svn_path_is_url(sourcepath1) != svn_path_is_url(sourcepath2))
+        return svn_error_return(svn_error_create(SVN_ERR_CL_ARG_PARSING_ERROR,
+                                                 NULL,
+                                                 _("Merge sources must both be "
+                                                   "either paths or URLs")));
       err = svn_client_merge3(sourcepath1,
                               &first_range_start,
                               sourcepath2,

Modified: subversion/branches/performance/subversion/svn/mkdir-cmd.c
URL: http://svn.apache.org/viewvc/subversion/branches/performance/subversion/svn/mkdir-cmd.c?rev=993141&r1=993140&r2=993141&view=diff
==============================================================================
--- subversion/branches/performance/subversion/svn/mkdir-cmd.c (original)
+++ subversion/branches/performance/subversion/svn/mkdir-cmd.c Mon Sep  6 20:02:15 2010
@@ -76,7 +76,8 @@ svn_cl__mkdir(apr_getopt_t *os,
   SVN_ERR(svn_cl__eat_peg_revisions(&targets, targets, pool));
 
   err = svn_client_mkdir4(targets, opt_state->parents,
-                          opt_state->revprop_table, ctx, pool);
+                          opt_state->revprop_table, svn_cl__print_commit_info,
+                          NULL, ctx, pool);
 
   if (ctx->log_msg_func3)
     err = svn_cl__cleanup_log_msg(ctx->log_msg_baton3, err, pool);

Modified: subversion/branches/performance/subversion/svn/move-cmd.c
URL: http://svn.apache.org/viewvc/subversion/branches/performance/subversion/svn/move-cmd.c?rev=993141&r1=993140&r2=993141&view=diff
==============================================================================
--- subversion/branches/performance/subversion/svn/move-cmd.c (original)
+++ subversion/branches/performance/subversion/svn/move-cmd.c Mon Sep  6 20:02:15 2010
@@ -86,7 +86,7 @@ svn_cl__move(apr_getopt_t *os,
 
   err = svn_client_move6(targets, dst_path, opt_state->force,
                          TRUE, opt_state->parents, opt_state->revprop_table,
-                         ctx, pool);
+                         svn_cl__print_commit_info, NULL, ctx, pool);
 
   if (err)
     err = svn_cl__may_need_force(err);

Modified: subversion/branches/performance/subversion/svn/notify.c
URL: http://svn.apache.org/viewvc/subversion/branches/performance/subversion/svn/notify.c?rev=993141&r1=993140&r2=993141&view=diff
==============================================================================
--- subversion/branches/performance/subversion/svn/notify.c (original)
+++ subversion/branches/performance/subversion/svn/notify.c Mon Sep  6 20:02:15 2010
@@ -274,7 +274,15 @@ notify(void *baton, const svn_wc_notify_
               statchar_buf[0] = 'U';
           }
 
-        if (statchar_buf[0] != ' ')
+        if (n->prop_state == svn_wc_notify_state_conflicted)
+          {
+            nb->prop_conflicts++;
+            statchar_buf[1] = 'C';
+          }
+        else if (n->prop_state == svn_wc_notify_state_changed)
+              statchar_buf[1] = 'U';
+
+        if (statchar_buf[0] != ' ' || statchar_buf[1] != ' ')
           {
             if ((err = svn_cmdline_printf(pool, "%s      %s\n",
                                           statchar_buf, path_local)))
@@ -302,49 +310,106 @@ notify(void *baton, const svn_wc_notify_
               minus = "-";
             }
 
-          /* ### APR_INT64_T_FMT isn't translator-friendly */
+          /* ### We're creating the localized strings without
+           * ### APR_INT64_T_FMT since it isn't translator-friendly */
           if (n->hunk_fuzz)
             {
-              s = _(">         applied hunk @@ -%lu,%lu +%lu,%lu @@ "
-                    "with offset %s");
-              if ((err = svn_cmdline_printf(pool,
-                                            apr_pstrcat(pool, s,
-                                                        "%"APR_UINT64_T_FMT
-                                                        " and fuzz %d\n",
-                                                        NULL),
-                                            n->hunk_original_start,
-                                            n->hunk_original_length,
-                                            n->hunk_modified_start,
-                                            n->hunk_modified_length,
-                                            minus, off, n->hunk_fuzz)))
+
+              if (n->prop_name)
+                {
+                  s = _(">         applied hunk ## -%lu,%lu +%lu,%lu ## "
+                        "with offset %s");
+
+                  err = svn_cmdline_printf(pool,
+                                           apr_pstrcat(pool, s,
+                                                       "%"APR_UINT64_T_FMT
+                                                       " and fuzz %d (%s)\n",
+                                                       NULL),
+                                           n->hunk_original_start,
+                                           n->hunk_original_length,
+                                           n->hunk_modified_start,
+                                           n->hunk_modified_length,
+                                           minus, off, n->hunk_fuzz,
+                                           n->prop_name);
+                }
+              else
+                {
+                  s = _(">         applied hunk @@ -%lu,%lu +%lu,%lu @@ "
+                        "with offset %s");
+
+                  err = svn_cmdline_printf(pool,
+                                           apr_pstrcat(pool, s,
+                                                       "%"APR_UINT64_T_FMT
+                                                       " and fuzz %d\n",
+                                                       NULL),
+                                           n->hunk_original_start,
+                                           n->hunk_original_length,
+                                           n->hunk_modified_start,
+                                           n->hunk_modified_length,
+                                           minus, off, n->hunk_fuzz);
+                }
+
+              if (err)
                 goto print_error;
             }
           else
             {
-              s = _(">         applied hunk @@ -%lu,%lu +%lu,%lu @@ "
-                    "with offset %s");
-              if ((err = svn_cmdline_printf(pool,
+
+              if (n->prop_name)
+                {
+                  s = _(">         applied hunk ## -%lu,%lu +%lu,%lu ## "
+                        "with offset %s");
+                  err = svn_cmdline_printf(pool,
                                             apr_pstrcat(pool, s,
-                                                        "%"APR_UINT64_T_FMT"\n",
+                                                        "%"APR_UINT64_T_FMT" (%s)\n",
                                                         NULL),
                                             n->hunk_original_start,
                                             n->hunk_original_length,
                                             n->hunk_modified_start,
                                             n->hunk_modified_length,
-                                            minus, off)))
+                                            minus, off, n->prop_name);
+                }
+              else
+                {
+                  s = _(">         applied hunk @@ -%lu,%lu +%lu,%lu @@ "
+                        "with offset %s");
+                  err = svn_cmdline_printf(pool,
+                                           apr_pstrcat(pool, s,
+                                                       "%"APR_UINT64_T_FMT"\n",
+                                                       NULL),
+                                           n->hunk_original_start,
+                                           n->hunk_original_length,
+                                           n->hunk_modified_start,
+                                           n->hunk_modified_length,
+                                           minus, off);
+                }
+
+              if (err)
                 goto print_error;
             }
         }
       else if (n->hunk_fuzz)
         {
-          if ((err = svn_cmdline_printf(pool,
+          if (n->prop_name)
+            err = svn_cmdline_printf(pool,
+                          _(">         applied hunk ## -%lu,%lu +%lu,%lu ## "
+                                        "with fuzz %d (%s)\n"),
+                                        n->hunk_original_start,
+                                        n->hunk_original_length,
+                                        n->hunk_modified_start,
+                                        n->hunk_modified_length,
+                                        n->hunk_fuzz,
+                                        n->prop_name);
+          else
+            err = svn_cmdline_printf(pool,
                           _(">         applied hunk @@ -%lu,%lu +%lu,%lu @@ "
                                         "with fuzz %d\n"),
                                         n->hunk_original_start,
                                         n->hunk_original_length,
                                         n->hunk_modified_start,
                                         n->hunk_modified_length,
-                                        n->hunk_fuzz)))
+                                        n->hunk_fuzz);
+          if (err)
             goto print_error;
 
         }
@@ -352,26 +417,50 @@ notify(void *baton, const svn_wc_notify_
 
     case svn_wc_notify_patch_rejected_hunk:
       nb->received_some_change = TRUE;
-      if ((err = svn_cmdline_printf(pool,
-                                    _(">         rejected hunk "
-                                      "@@ -%lu,%lu +%lu,%lu @@\n"),
-                                    n->hunk_original_start,
-                                    n->hunk_original_length,
-                                    n->hunk_modified_start,
-                                    n->hunk_modified_length)))
+
+      if (n->prop_name)
+        err = svn_cmdline_printf(pool,
+                                 _(">         rejected hunk "
+                                   "## -%lu,%lu +%lu,%lu ## (%s)\n"),
+                                 n->hunk_original_start,
+                                 n->hunk_original_length,
+                                 n->hunk_modified_start,
+                                 n->hunk_modified_length,
+                                 n->prop_name);
+      else
+        err = svn_cmdline_printf(pool,
+                                 _(">         rejected hunk "
+                                   "@@ -%lu,%lu +%lu,%lu @@\n"),
+                                 n->hunk_original_start,
+                                 n->hunk_original_length,
+                                 n->hunk_modified_start,
+                                 n->hunk_modified_length);
+      if (err)
         goto print_error;
       break;
 
     case svn_wc_notify_patch_hunk_already_applied:
       nb->received_some_change = TRUE;
-      if ((err = svn_cmdline_printf(pool,
-                                    _(">         hunk "
-                                      "@@ -%lu,%lu +%lu,%lu @@ "
-                                      "already applied\n"),
-                                    n->hunk_original_start,
-                                    n->hunk_original_length,
-                                    n->hunk_modified_start,
-                                    n->hunk_modified_length)))
+      if (n->prop_name)
+        err = svn_cmdline_printf(pool,
+                                 _(">         hunk "
+                                   "## -%lu,%lu +%lu,%lu ## "
+                                   "already applied (%s)\n"),
+                                 n->hunk_original_start,
+                                 n->hunk_original_length,
+                                 n->hunk_modified_start,
+                                 n->hunk_modified_length,
+                                 n->prop_name);
+      else
+        err = svn_cmdline_printf(pool,
+                                 _(">         hunk "
+                                   "@@ -%lu,%lu +%lu,%lu @@ "
+                                   "already applied\n"),
+                                 n->hunk_original_start,
+                                 n->hunk_original_length,
+                                 n->hunk_modified_start,
+                                 n->hunk_modified_length);
+      if (err)
         goto print_error;
       break;
 
@@ -792,6 +881,12 @@ notify(void *baton, const svn_wc_notify_
           goto print_error;
       break;
 
+    case svn_wc_notify_url_redirect:
+      err = svn_cmdline_printf(pool, _("Redirecting to URL '%s'\n"),
+                               n->url);
+      if (err)
+        goto print_error;
+
     default:
       break;
     }

Modified: subversion/branches/performance/subversion/svn/propdel-cmd.c
URL: http://svn.apache.org/viewvc/subversion/branches/performance/subversion/svn/propdel-cmd.c?rev=993141&r1=993140&r2=993141&view=diff
==============================================================================
--- subversion/branches/performance/subversion/svn/propdel-cmd.c (original)
+++ subversion/branches/performance/subversion/svn/propdel-cmd.c Mon Sep  6 20:02:15 2010
@@ -141,6 +141,7 @@ svn_cl__propdel(apr_getopt_t *os,
                                opt_state->depth,
                                FALSE, SVN_INVALID_REVNUM,
                                opt_state->changelists, NULL,
+                               svn_cl__print_commit_info, NULL,
                                ctx, subpool),
                               NULL, opt_state->quiet,
                               SVN_ERR_UNVERSIONED_RESOURCE,

Modified: subversion/branches/performance/subversion/svn/propedit-cmd.c
URL: http://svn.apache.org/viewvc/subversion/branches/performance/subversion/svn/propedit-cmd.c?rev=993141&r1=993140&r2=993141&view=diff
==============================================================================
--- subversion/branches/performance/subversion/svn/propedit-cmd.c (original)
+++ subversion/branches/performance/subversion/svn/propedit-cmd.c Mon Sep  6 20:02:15 2010
@@ -98,6 +98,9 @@ svn_cl__propedit(apr_getopt_t *os,
                                                       opt_state->targets,
                                                       ctx, pool));
 
+  /* We do our own notifications */
+  ctx->notify_func2 = NULL;
+
   if (opt_state->revprop)  /* operate on a revprop */
     {
       svn_revnum_t rev;
@@ -280,9 +283,6 @@ svn_cl__propedit(apr_getopt_t *os,
             : svn_dirent_local_style(target, subpool);
           cib.target_local = target_local;
 
-          ctx->commit_callback2 = commit_info_handler;
-          ctx->commit_baton = &cib;
-
           /* ...and re-set the property's value accordingly. */
           if (edited_propval && !svn_string_compare(propval, edited_propval))
             {
@@ -299,6 +299,7 @@ svn_cl__propedit(apr_getopt_t *os,
               err = svn_client_propset4(pname_utf8, edited_propval, target,
                                         svn_depth_empty, opt_state->force,
                                         base_rev, NULL, opt_state->revprop_table,
+                                        commit_info_handler, &cib,
                                         ctx, subpool);
               if (ctx->log_msg_func3)
                 SVN_ERR(svn_cl__cleanup_log_msg(ctx->log_msg_baton3,

Modified: subversion/branches/performance/subversion/svn/propset-cmd.c
URL: http://svn.apache.org/viewvc/subversion/branches/performance/subversion/svn/propset-cmd.c?rev=993141&r1=993140&r2=993141&view=diff
==============================================================================
--- subversion/branches/performance/subversion/svn/propset-cmd.c (original)
+++ subversion/branches/performance/subversion/svn/propset-cmd.c Mon Sep  6 20:02:15 2010
@@ -182,7 +182,8 @@ svn_cl__propset(apr_getopt_t *os,
                                pname_utf8, propval, target,
                                opt_state->depth, opt_state->force,
                                SVN_INVALID_REVNUM, opt_state->changelists,
-                               NULL, ctx, iterpool),
+                               NULL, svn_cl__print_commit_info, NULL, ctx,
+                               iterpool),
                               NULL, opt_state->quiet,
                               SVN_ERR_UNVERSIONED_RESOURCE,
                               SVN_ERR_ENTRY_NOT_FOUND,

Modified: subversion/branches/performance/subversion/svn/revert-cmd.c
URL: http://svn.apache.org/viewvc/subversion/branches/performance/subversion/svn/revert-cmd.c?rev=993141&r1=993140&r2=993141&view=diff
==============================================================================
--- subversion/branches/performance/subversion/svn/revert-cmd.c (original)
+++ subversion/branches/performance/subversion/svn/revert-cmd.c Mon Sep  6 20:02:15 2010
@@ -67,7 +67,7 @@ svn_cl__revert(apr_getopt_t *os,
                            opt_state->changelists, ctx, scratch_pool);
 
   if (err
-      && (err->apr_err == SVN_ERR_WC_NOT_LOCKED)
+      && (err->apr_err == SVN_ERR_WC_INVALID_OPERATION_DEPTH)
       && (! SVN_DEPTH_IS_RECURSIVE(opt_state->depth)))
     {
       err = svn_error_quick_wrap

Modified: subversion/branches/performance/subversion/svn/status-cmd.c
URL: http://svn.apache.org/viewvc/subversion/branches/performance/subversion/svn/status-cmd.c?rev=993141&r1=993140&r2=993141&view=diff
==============================================================================
--- subversion/branches/performance/subversion/svn/status-cmd.c (original)
+++ subversion/branches/performance/subversion/svn/status-cmd.c Mon Sep  6 20:02:15 2010
@@ -316,6 +316,7 @@ svn_cl__status(apr_getopt_t *os,
                                              opt_state->update,
                                              opt_state->no_ignore,
                                              opt_state->ignore_externals,
+                                             FALSE /* depth_as_sticky */,
                                              opt_state->changelists,
                                              print_status, &sb,
                                              iterpool),

Modified: subversion/branches/performance/subversion/svn/status.c
URL: http://svn.apache.org/viewvc/subversion/branches/performance/subversion/svn/status.c?rev=993141&r1=993140&r2=993141&view=diff
==============================================================================
--- subversion/branches/performance/subversion/svn/status.c (original)
+++ subversion/branches/performance/subversion/svn/status.c Mon Sep  6 20:02:15 2010
@@ -50,7 +50,6 @@ generate_status_code(enum svn_wc_status_
     case svn_wc_status_deleted:     return 'D';
     case svn_wc_status_replaced:    return 'R';
     case svn_wc_status_modified:    return 'M';
-    case svn_wc_status_merged:      return 'G';
     case svn_wc_status_conflicted:  return 'C';
     case svn_wc_status_obstructed:  return '~';
     case svn_wc_status_ignored:     return 'I';
@@ -108,7 +107,6 @@ generate_status_desc(enum svn_wc_status_
     case svn_wc_status_deleted:     return "deleted";
     case svn_wc_status_replaced:    return "replaced";
     case svn_wc_status_modified:    return "modified";
-    case svn_wc_status_merged:      return "merged";
     case svn_wc_status_conflicted:  return "conflicted";
     case svn_wc_status_obstructed:  return "obstructed";
     case svn_wc_status_ignored:     return "ignored";

Modified: subversion/branches/performance/subversion/svnrdump/dump_editor.c
URL: http://svn.apache.org/viewvc/subversion/branches/performance/subversion/svnrdump/dump_editor.c?rev=993141&r1=993140&r2=993141&view=diff
==============================================================================
--- subversion/branches/performance/subversion/svnrdump/dump_editor.c (original)
+++ subversion/branches/performance/subversion/svnrdump/dump_editor.c Mon Sep  6 20:02:15 2010
@@ -1,5 +1,6 @@
 /*
- *  dump_editor.c: The svn_delta_editor_t editor used by svnrdump
+ *  dump_editor.c: The svn_delta_editor_t editor used by svnrdump to
+ *  dump revisions.
  *
  * ====================================================================
  *    Licensed to the Apache Software Foundation (ASF) under one
@@ -498,21 +499,16 @@ open_file(const char *path,
   struct dir_baton *pb = parent_baton;
   const char *copyfrom_path = NULL;
   svn_revnum_t copyfrom_rev = SVN_INVALID_REVNUM;
-  apr_array_header_t *compose_path;
 
   /* Some pending properties to dump? */
   SVN_ERR(dump_props(pb->eb, &(pb->eb->dump_props_pending), TRUE, pool));
 
-  compose_path = apr_array_make(pool, 2, sizeof(const char *));
-
   /* If the parent directory has explicit copyfrom path and rev,
      record the same for this one. */
   if (pb && ARE_VALID_COPY_ARGS(pb->copyfrom_path, pb->copyfrom_rev))
     {
-      APR_ARRAY_PUSH(compose_path, const char *) = pb->copyfrom_path;
-      APR_ARRAY_PUSH(compose_path, const char *) =
-        svn_relpath_basename(path, pool);
-      copyfrom_path = svn_path_compose(compose_path, pool);
+      copyfrom_path = svn_relpath_join(pb->copyfrom_path,
+                                       svn_relpath_basename(path, pool), pool);
       copyfrom_rev = pb->copyfrom_rev;
     }
 

Propchange: subversion/branches/performance/subversion/svnrdump/dump_editor.c
------------------------------------------------------------------------------
    svn:eol-style = native

Modified: subversion/branches/performance/subversion/svnrdump/dump_editor.h
URL: http://svn.apache.org/viewvc/subversion/branches/performance/subversion/svnrdump/dump_editor.h?rev=993141&r1=993140&r2=993141&view=diff
==============================================================================
--- subversion/branches/performance/subversion/svnrdump/dump_editor.h (original)
+++ subversion/branches/performance/subversion/svnrdump/dump_editor.h Mon Sep  6 20:02:15 2010
@@ -21,7 +21,8 @@
  * @endcopyright
  *
  * @file dump_editor.h
- * @brief The svn_delta_editor_t editor used by svnrdump
+ * @brief The svn_delta_editor_t editor used by svnrdump to dump
+ * revisions.
  */
 
 #ifndef DUMP_EDITOR_H_

Propchange: subversion/branches/performance/subversion/svnrdump/dump_editor.h
------------------------------------------------------------------------------
    svn:eol-style = native

Modified: subversion/branches/performance/subversion/svnrdump/svnrdump.1
URL: http://svn.apache.org/viewvc/subversion/branches/performance/subversion/svnrdump/svnrdump.1?rev=993141&r1=993140&r2=993141&view=diff
==============================================================================
--- subversion/branches/performance/subversion/svnrdump/svnrdump.1 (original)
+++ subversion/branches/performance/subversion/svnrdump/svnrdump.1 Mon Sep  6 20:02:15 2010
@@ -23,10 +23,10 @@
 .\"
 .TH svnrdump 1
 .SH NAME
-svnrdump \- Subversion repository synchronization tool
+svnrdump \- Subversion remote repository dumper and loader
 .SH SYNOPSIS
 .TP
-\fBsvnrdump\fP \fIcommand\fP \fIdest-url\fP [\fIoptions\fP] [\fIargs\fP]
+\fBsvnrdump\fP \fIcommand\fP \fIurl\fP [\fIoptions\fP] [\fIargs\fP]
 .SH OVERVIEW
 Subversion is a version control system, which allows you to keep old
 versions of files and directories (usually source code), keep a log of

Propchange: subversion/branches/performance/subversion/svnrdump/svnrdump.1
------------------------------------------------------------------------------
    svn:eol-style = native

Modified: subversion/branches/performance/subversion/svnrdump/svnrdump.c
URL: http://svn.apache.org/viewvc/subversion/branches/performance/subversion/svnrdump/svnrdump.c?rev=993141&r1=993140&r2=993141&view=diff
==============================================================================
--- subversion/branches/performance/subversion/svnrdump/svnrdump.c (original)
+++ subversion/branches/performance/subversion/svnrdump/svnrdump.c Mon Sep  6 20:02:15 2010
@@ -35,6 +35,11 @@
 #include "svn_props.h"
 
 #include "dump_editor.h"
+#include "load_editor.h"
+
+#include "private/svn_cmdline_private.h"
+
+static svn_opt_subcommand_t dump_cmd, load_cmd;
 
 enum svn_svnrdump__longopt_t
   {
@@ -44,11 +49,32 @@ enum svn_svnrdump__longopt_t
     opt_non_interactive,
     opt_auth_nocache,
     opt_version,
+    opt_config_option,
+  };
+
+static const svn_opt_subcommand_desc2_t svnrdump__cmd_table[] =
+  {
+    { "dump", dump_cmd, { 0 },
+      N_("usage: svnrdump dump URL [-r LOWER[:UPPER]]\n\n"
+         "Dump revisions LOWER to UPPER of repository at remote URL "
+         "to stdout in a 'dumpfile' portable format.\n"
+         "If only LOWER is given, dump that one revision.\n"),
+      { 0 } },
+    { "load", load_cmd, { 0 },
+      N_("usage: svnrdump load URL\n\n"
+         "Load a 'dumpfile' given on stdin to a repository "
+         "at remote URL.\n"),
+      { 0 } },
+    { "help", 0, { "?", "h" },
+      N_("usage: svnrdump help [SUBCOMMAND...]\n\n"
+         "Describe the usage of this program or its subcommands.\n"),
+      { 0 } },
+    { NULL, NULL, { 0 }, NULL, { 0 } }
   };
 
 static const apr_getopt_option_t svnrdump__options[] =
   {
-    {"revision",     'r', 1, N_("REV1[:REV2] range of revisions to dump")},
+    {"revision",     'r', 1, N_("specify revision number ARG (or X:Y range)")},
     {"quiet",         'q', 0, N_("no progress (only errors) to stderr")},
     {"config-dir",    opt_config_dir, 1, N_("read user configuration files from"
                                             " directory ARG") },
@@ -61,7 +87,14 @@ static const apr_getopt_option_t svnrdum
   
     {"help",          'h', 0, N_("display this help")},
     {"version",       opt_version, 0, N_("show program version information")},
-
+    {"config-option", opt_config_option, 1,
+                    N_("set user configuration option in the format:\n"
+                       "                             "
+                       "    FILE:SECTION:OPTION=[VALUE]\n"
+                       "                             "
+                       "For example:\n"
+                       "                             "
+                       "    servers:global:http-library=serf")},
     {0,                  0,   0, 0}
   };
 
@@ -77,6 +110,14 @@ struct replay_baton {
   svn_boolean_t quiet;
 };
 
+typedef struct {
+  svn_ra_session_t *session;
+  const char *url;
+  svn_revnum_t start_revision;
+  svn_revnum_t end_revision;
+  svn_boolean_t quiet;
+} opt_baton_t;
+
 static svn_error_t *
 replay_revstart(svn_revnum_t revision,
                 void *replay_baton,
@@ -137,14 +178,15 @@ replay_revend(svn_revnum_t revision,
   /* No resources left to free. */
   struct replay_baton *rb = replay_baton;
   if (! rb->quiet)
-    svn_cmdline_fprintf(stderr, pool, "* Dumped revision %lu\n", revision);
+    svn_cmdline_fprintf(stderr, pool, "* Dumped revision %lu.\n", revision);
   return SVN_NO_ERROR;
 }
 
 /* Return in *SESSION a new RA session to URL.
  * Allocate *SESSION and related data structures in POOL.
  * Use CONFIG_DIR and pass USERNAME, PASSWORD, CONFIG_DIR and
- * NO_AUTH_CACHE to initialize the authorization baton.*/
+ * NO_AUTH_CACHE to initialize the authorization baton.
+ * CONFIG_OPTIONS (if not NULL) is a list of configuration overrides. */
 static svn_error_t *
 open_connection(svn_ra_session_t **session,
                 const char *url,
@@ -153,6 +195,7 @@ open_connection(svn_ra_session_t **sessi
                 const char *password,
                 const char *config_dir,
                 svn_boolean_t no_auth_cache,
+                apr_array_header_t *config_options,
                 apr_pool_t *pool)
 {
   svn_client_ctx_t *ctx = NULL;
@@ -165,6 +208,10 @@ open_connection(svn_ra_session_t **sessi
 
   SVN_ERR(svn_config_get_config(&(ctx->config), config_dir, pool));
 
+  if (config_options)
+    SVN_ERR(svn_cmdline__apply_config_options(ctx->config, config_options,
+                                              "svnrdump: ", "--config-option"));
+
   cfg_config = apr_hash_get(ctx->config, SVN_CONFIG_CATEGORY_CONFIG,
                             APR_HASH_KEY_STRING);
 
@@ -179,9 +226,9 @@ open_connection(svn_ra_session_t **sessi
 }
 
 static svn_error_t *
-replay_range(svn_ra_session_t *session, const char *url,
-             svn_revnum_t start_revision, svn_revnum_t end_revision,
-             svn_boolean_t quiet, apr_pool_t *pool)
+replay_revisions(svn_ra_session_t *session, const char *url,
+                 svn_revnum_t start_revision, svn_revnum_t end_revision,
+                 svn_boolean_t quiet, apr_pool_t *pool)
 {
   const svn_delta_editor_t *dump_editor;
   struct replay_baton *replay_baton;
@@ -240,7 +287,7 @@ replay_range(svn_ra_session_t *session, 
                                &(propstring->len)));
       SVN_ERR(svn_stream_printf(stdout_stream, pool, "\n"));
       if (! quiet)
-        svn_cmdline_fprintf(stderr, pool, "* Dumped revision %lu\n", start_revision);
+        svn_cmdline_fprintf(stderr, pool, "* Dumped revision %lu.\n", start_revision);
 
       start_revision++;
     }
@@ -252,6 +299,27 @@ replay_range(svn_ra_session_t *session, 
   return SVN_NO_ERROR;
 }
 
+static svn_error_t *
+load_revisions(svn_ra_session_t *session, const char *url,
+               svn_boolean_t quiet, apr_pool_t *pool)
+{
+  apr_file_t *stdin_file;
+  svn_stream_t *stdin_stream;
+  const svn_repos_parse_fns2_t *parser;
+  void *parse_baton;
+
+  apr_file_open_stdin(&stdin_file, pool);
+  stdin_stream = svn_stream_from_aprfile2(stdin_file, FALSE, pool);
+
+  SVN_ERR(get_dumpstream_loader(&parser, &parse_baton, session, pool));
+  SVN_ERR(drive_dumpstream_loader(stdin_stream, parser, parse_baton, session, pool));
+
+  svn_stream_close(stdin_stream);
+
+  return SVN_NO_ERROR;
+}
+
+
 static const char *
 ensure_appname(const char *progname, apr_pool_t *pool)
 {
@@ -268,45 +336,27 @@ usage(const char *progname, apr_pool_t *
   progname = ensure_appname(progname, pool);
 
   SVN_ERR(svn_cmdline_fprintf(stderr, pool,
-                              _("Type '%s --help' for usage.\n"),
+                              _("Type '%s help' for usage.\n"),
                               progname));
   return SVN_NO_ERROR;
 }
 
 static svn_error_t *
-help(const char *progname, apr_pool_t *pool)
+version(const char *progname, apr_pool_t *pool)
 {
-  apr_size_t i;
+  const char *ra_desc_start
+    = _("The following repository access (RA) modules are available:\n\n");
 
-  progname = ensure_appname(progname, pool);
+  svn_stringbuf_t *version_footer = svn_stringbuf_create(ra_desc_start,
+                                                         pool);
 
-  SVN_ERR(svn_cmdline_printf(
-                             pool,
-                             _("usage: %s URL [-r LOWER[:UPPER]]\n\n"
-                               "Dump the contents of repository at remote URL "
-                               "to stdout in a 'dumpfile' portable format.\n"
-                               "Dump revisions LOWER rev through UPPER rev.\n"
-                               "LOWER defaults to 0 and UPPER defaults to the "
-                               "highest possible revision if omitted.\n\n"
-                               "Valid options:\n"),
-                             progname));
+  SVN_ERR(svn_ra_print_modules(version_footer, pool));
 
-  for (i = 0; svnrdump__options[i].name && svnrdump__options[i].optch; i++)
-    {
-      const char *optstr;
-      svn_opt_format_option(&optstr, svnrdump__options + i, TRUE, pool);
-      SVN_ERR(svn_cmdline_fprintf(stdout, pool, "  %s\n", optstr));
-    }
-  return svn_cmdline_fprintf(stdout, pool, "\n");
-}
-
-static svn_error_t *
-version(const char *progname, apr_pool_t *pool)
-{
   progname = ensure_appname(progname, pool);
 
-  return svn_opt_print_help3(NULL, progname, TRUE, FALSE, NULL,
-                             NULL, NULL, NULL, NULL, NULL, pool);
+  return svn_opt_print_help3(NULL, progname, TRUE, FALSE,
+                             version_footer->data, NULL, NULL,
+                             NULL, NULL, NULL, pool);
 }
 
 
@@ -328,29 +378,65 @@ version(const char *progname, apr_pool_t
     }                                                                   \
   while (0)
 
+static svn_error_t *
+dump_cmd(apr_getopt_t *os, void *baton, apr_pool_t *pool)
+{
+  opt_baton_t *opt_baton = baton;
+  SVN_ERR(replay_revisions(opt_baton->session, opt_baton->url,
+                           opt_baton->start_revision, opt_baton->end_revision,
+                           opt_baton->quiet, pool));
+  return SVN_NO_ERROR;
+}
+
+static svn_error_t *
+load_cmd(apr_getopt_t *os, void *baton, apr_pool_t *pool)
+{
+  opt_baton_t *opt_baton = baton;
+  SVN_ERR(load_revisions(opt_baton->session, opt_baton->url,
+                         opt_baton->quiet, pool));  
+  return SVN_NO_ERROR;
+}
+
+static svn_error_t *
+help_cmd(apr_getopt_t *os, void *baton, apr_pool_t *pool)
+{
+  const char *header =
+    _("general usage: svnrdump SUBCOMMAND URL [-r LOWER[:UPPER]]\n"
+      "Type 'svnrdump help <subcommand>' for help on a specific subcommand.\n\n"
+      "Available subcommands:\n");
+
+  SVN_ERR(svn_opt_print_help3(os, "svnrdump", FALSE, FALSE, NULL, header,
+                              svnrdump__cmd_table, svnrdump__options, NULL,
+                              NULL, pool));
+
+  return SVN_NO_ERROR;
+}
 
 int
 main(int argc, const char **argv)
 {
-  const char *url = NULL;
+  const svn_opt_subcommand_desc2_t *subcommand = NULL;
+  opt_baton_t *opt_baton;
   char *revision_cut = NULL;
-  svn_revnum_t start_revision = svn_opt_revision_unspecified;
-  svn_revnum_t end_revision = svn_opt_revision_unspecified;
   svn_revnum_t latest_revision = svn_opt_revision_unspecified;
-  svn_boolean_t quiet = FALSE;
   apr_pool_t *pool = NULL;
-  svn_ra_session_t *session = NULL;
   const char *config_dir = NULL;
   const char *username = NULL;
   const char *password = NULL;
   svn_boolean_t no_auth_cache = FALSE;
   svn_boolean_t non_interactive = FALSE;
+  apr_array_header_t *config_options = NULL;
   apr_getopt_t *os;
+  const char *first_arg;
 
   if (svn_cmdline_init ("svnrdump", stderr) != EXIT_SUCCESS)
     return EXIT_FAILURE;
 
   pool = svn_pool_create(NULL);
+  opt_baton = apr_pcalloc(pool, sizeof(*opt_baton));
+  opt_baton->start_revision = svn_opt_revision_unspecified;
+  opt_baton->end_revision = svn_opt_revision_unspecified;
+  opt_baton->url = NULL;
 
   SVNRDUMP_ERR(svn_cmdline__getopt_init(&os, argc, argv, pool));
 
@@ -378,17 +464,20 @@ main(int argc, const char **argv)
             revision_cut = strchr(opt_arg, ':');
             if (revision_cut)
               {
-                start_revision = (svn_revnum_t)strtoul(opt_arg,
-                                                       &revision_cut, 10);
-                end_revision = (svn_revnum_t)strtoul(revision_cut + 1,
-                                                     NULL, 10);
+                opt_baton->start_revision = (svn_revnum_t)strtoul(opt_arg,
+                                                                  &revision_cut, 10);
+                opt_baton->end_revision = (svn_revnum_t)strtoul(revision_cut + 1,
+                                                                NULL, 10);
               }
             else
-              start_revision = (svn_revnum_t)strtoul(opt_arg, NULL, 10);
+              {
+                opt_baton->start_revision = (svn_revnum_t)strtoul(opt_arg, NULL, 10);
+                opt_baton->end_revision = opt_baton->start_revision;
+              }
           }
           break;
         case 'q':
-          quiet = TRUE;
+          opt_baton->quiet = TRUE;
           break;
         case opt_config_dir:
           config_dir = opt_arg;
@@ -398,7 +487,7 @@ main(int argc, const char **argv)
           exit(EXIT_SUCCESS);
           break;
         case 'h':
-          SVNRDUMP_ERR(help(argv[0], pool));
+          SVNRDUMP_ERR(help_cmd(os, opt_baton, pool));
           exit(EXIT_SUCCESS);
           break;
         case opt_auth_username:
@@ -413,12 +502,55 @@ main(int argc, const char **argv)
         case opt_non_interactive:
           non_interactive = TRUE;
           break;
+        case opt_config_option:
+          if (!config_options)
+              config_options =
+                    apr_array_make(pool, 1,
+                                   sizeof(svn_cmdline__config_argument_t*));
+
+            SVNRDUMP_ERR(svn_utf_cstring_to_utf8(&opt_arg, opt_arg, pool));
+            SVNRDUMP_ERR(svn_cmdline__parse_config_option(config_options,
+                                                          opt_arg, pool));
         }
     }
 
-  /* Only continue if the only not option argument is a url, to allow
-     implementing 'svnrdump dump URL' like handling later without breaking
-     backward compatibility */
+  if (os->ind >= os->argc)
+    {
+      svn_error_clear
+                (svn_cmdline_fprintf(stderr, pool,
+                                     _("Subcommand argument required\n")));
+      SVNRDUMP_ERR(help_cmd(NULL, NULL, pool));
+      svn_pool_destroy(pool);
+      exit(EXIT_FAILURE);
+    }
+
+  first_arg = os->argv[os->ind++];
+
+  subcommand = svn_opt_get_canonical_subcommand2(svnrdump__cmd_table,
+                                                 first_arg);
+
+  if (subcommand == NULL)
+    {
+      const char *first_arg_utf8;
+      svn_error_t *err = svn_utf_cstring_to_utf8(&first_arg_utf8,
+                                                 first_arg, pool);
+      if (err)
+        return svn_cmdline_handle_exit_error(err, pool, "svnrdump: ");
+      svn_error_clear(svn_cmdline_fprintf(stderr, pool,
+                                          _("Unknown command: '%s'\n"),
+                                          first_arg_utf8));
+      SVNRDUMP_ERR(help_cmd(NULL, NULL, pool));
+      svn_pool_destroy(pool);
+      exit(EXIT_FAILURE);
+    }
+
+  if (subcommand && strcmp(subcommand->name, "help") == 0)
+    {
+      SVNRDUMP_ERR(help_cmd(os, opt_baton, pool));
+      exit(EXIT_SUCCESS);
+    }
+
+  /* Only continue if the only not option argument is a url */
   if ((os->ind != os->argc-1)
       || !svn_path_is_url(os->argv[os->ind]))
     {
@@ -426,34 +558,34 @@ main(int argc, const char **argv)
       exit(EXIT_FAILURE);
     }
 
-  SVNRDUMP_ERR(svn_utf_cstring_to_utf8(&url, os->argv[os->ind], pool));
-
-  url = svn_uri_canonicalize(os->argv[os->ind], pool);
+  SVNRDUMP_ERR(svn_utf_cstring_to_utf8(&(opt_baton->url), os->argv[os->ind], pool));
 
+  opt_baton->url = svn_uri_canonicalize(os->argv[os->ind], pool);
 
-  SVNRDUMP_ERR(open_connection(&session,
-                               url,
+  SVNRDUMP_ERR(open_connection(&(opt_baton->session),
+                               opt_baton->url,
                                non_interactive,
                                username,
                                password,
                                config_dir,
                                no_auth_cache,
+                               config_options,
                                pool));
 
-  /* Have sane start_revision and end_revision defaults if unspecified */
-  SVNRDUMP_ERR(svn_ra_get_latest_revnum(session, &latest_revision, pool));
-  if (start_revision == svn_opt_revision_unspecified)
-    start_revision = 0;
-  if (end_revision == svn_opt_revision_unspecified)
-    end_revision = latest_revision;
-  if (end_revision > latest_revision)
+  /* Have sane opt_baton->start_revision and end_revision defaults if unspecified */
+  SVNRDUMP_ERR(svn_ra_get_latest_revnum(opt_baton->session, &latest_revision, pool));
+  if (opt_baton->start_revision == svn_opt_revision_unspecified)
+    opt_baton->start_revision = 0;
+  if (opt_baton->end_revision == svn_opt_revision_unspecified)
+    opt_baton->end_revision = latest_revision;
+  if (opt_baton->end_revision > latest_revision)
     {
       SVN_INT_ERR(svn_cmdline_fprintf(stderr, pool,
                                       _("Revision %ld does not exist.\n"),
-                                      end_revision));
+                                      opt_baton->end_revision));
       exit(EXIT_FAILURE);
     }
-  if (end_revision < start_revision)
+  if (opt_baton->end_revision < opt_baton->start_revision)
     {
       SVN_INT_ERR(svn_cmdline_fprintf(stderr, pool,
                                       _("LOWER cannot be greater "
@@ -461,8 +593,8 @@ main(int argc, const char **argv)
       exit(EXIT_FAILURE);
     }
 
-  SVNRDUMP_ERR(replay_range(session, url, start_revision, end_revision,
-                            quiet, pool));
+  /* Dispatch the subcommand */
+  SVNRDUMP_ERR((*subcommand->cmd_func)(os, opt_baton, pool));
 
   svn_pool_destroy(pool);
 

Modified: subversion/branches/performance/subversion/svnsync/main.c
URL: http://svn.apache.org/viewvc/subversion/branches/performance/subversion/svnsync/main.c?rev=993141&r1=993140&r2=993141&view=diff
==============================================================================
--- subversion/branches/performance/subversion/svnsync/main.c (original)
+++ subversion/branches/performance/subversion/svnsync/main.c Mon Sep  6 20:02:15 2010
@@ -338,8 +338,8 @@ get_lock(svn_ra_session_t *session, apr_
     }
 
   return svn_error_createf(APR_EINVAL, NULL,
-                           "Couldn't get lock on destination repos "
-                           "after %d attempts\n", i);
+                           _("Couldn't get lock on destination repos "
+                             "after %d attempts"), i);
 }
 
 
@@ -387,20 +387,8 @@ with_locked(svn_ra_session_t *session,
   err = func(session, baton, pool);
 
   err2 = svn_ra_change_rev_prop(session, 0, SVNSYNC_PROP_LOCK, NULL, pool);
-  if (err2 && err)
-    {
-      svn_error_clear(err2); /* XXX what to do here? */
 
-      return err;
-    }
-  else if (err2)
-    {
-      return err2;
-    }
-  else
-    {
-      return err;
-    }
+  return svn_error_compose_create(err, svn_error_return(err2));
 }
 
 
@@ -721,7 +709,7 @@ do_initialize(svn_ra_session_t *to_sessi
 
   /* Now fill in our bookkeeping info in the dest repository. */
 
-  SVN_ERR(svn_ra_open3(&from_session, baton->from_url, NULL,
+  SVN_ERR(svn_ra_open4(&from_session, NULL, baton->from_url, NULL,
                        &(baton->source_callbacks), baton,
                        baton->config, pool));
   SVN_ERR(svn_ra_get_repos_root2(from_session, &root_url, pool));
@@ -735,14 +723,11 @@ do_initialize(svn_ra_session_t *to_sessi
                                                &server_supports_partial_replay,
                                                SVN_RA_CAPABILITY_PARTIAL_REPLAY,
                                                pool);
-      if (err && err->apr_err == SVN_ERR_UNKNOWN_CAPABILITY)
-        {
-          svn_error_clear(err);
-          server_supports_partial_replay = FALSE;
-        }
+      if (err && err->apr_err != SVN_ERR_UNKNOWN_CAPABILITY)
+        return svn_error_return(err);
 
-      if (!server_supports_partial_replay)
-        return svn_error_create(SVN_ERR_RA_PARTIAL_REPLAY_NOT_SUPPORTED, NULL,
+      if (err || !server_supports_partial_replay)
+        return svn_error_create(SVN_ERR_RA_PARTIAL_REPLAY_NOT_SUPPORTED, err,
                                 NULL);
     }
 
@@ -824,7 +809,7 @@ initialize_cmd(apr_getopt_t *os, void *b
                              _("Path '%s' is not a URL"), from_url);
 
   baton = make_subcommand_baton(opt_baton, to_url, from_url, 0, 0, pool);
-  SVN_ERR(svn_ra_open3(&to_session, baton->to_url, NULL,
+  SVN_ERR(svn_ra_open4(&to_session, NULL, baton->to_url, NULL,
                        &(baton->sync_callbacks), baton, baton->config, pool));
   SVN_ERR(check_if_session_is_at_repos_root(to_session, baton->to_url, pool));
   if (opt_baton->disable_locking)
@@ -900,7 +885,7 @@ open_source_session(svn_ra_session_t **f
     from_url = from_url_str->data;
 
   /* Open the session to copy the revision data. */
-  SVN_ERR(svn_ra_open3(from_session, from_url, from_uuid_str->data,
+  SVN_ERR(svn_ra_open4(from_session, NULL, from_url, from_uuid_str->data,
                        callbacks, baton, config, pool));
 
   return SVN_NO_ERROR;
@@ -1324,7 +1309,7 @@ synchronize_cmd(apr_getopt_t *os, void *
     }
 
   baton = make_subcommand_baton(opt_baton, to_url, from_url, 0, 0, pool);
-  SVN_ERR(svn_ra_open3(&to_session, baton->to_url, NULL,
+  SVN_ERR(svn_ra_open4(&to_session, NULL, baton->to_url, NULL,
                        &(baton->sync_callbacks), baton, baton->config, pool));
   SVN_ERR(check_if_session_is_at_repos_root(to_session, baton->to_url, pool));
   if (opt_baton->disable_locking)
@@ -1560,7 +1545,7 @@ copy_revprops_cmd(apr_getopt_t *os, void
       
   baton = make_subcommand_baton(opt_baton, to_url, from_url,
                                 start_rev, end_rev, pool);
-  SVN_ERR(svn_ra_open3(&to_session, baton->to_url, NULL,
+  SVN_ERR(svn_ra_open4(&to_session, NULL, baton->to_url, NULL,
                        &(baton->sync_callbacks), baton, baton->config, pool));
   SVN_ERR(check_if_session_is_at_repos_root(to_session, baton->to_url, pool));
   if (opt_baton->disable_locking)
@@ -1604,7 +1589,7 @@ info_cmd(apr_getopt_t *os, void *b, apr_
 
   /* Open an RA session to the mirror repository URL. */
   baton = make_subcommand_baton(opt_baton, to_url, NULL, 0, 0, pool);
-  SVN_ERR(svn_ra_open3(&to_session, baton->to_url, NULL,
+  SVN_ERR(svn_ra_open4(&to_session, NULL, baton->to_url, NULL,
                        &(baton->sync_callbacks), baton, baton->config, pool));
   SVN_ERR(check_if_session_is_at_repos_root(to_session, baton->to_url, pool));
 

Modified: subversion/branches/performance/subversion/tests/cmdline/README
URL: http://svn.apache.org/viewvc/subversion/branches/performance/subversion/tests/cmdline/README?rev=993141&r1=993140&r2=993141&view=diff
==============================================================================
--- subversion/branches/performance/subversion/tests/cmdline/README (original)
+++ subversion/branches/performance/subversion/tests/cmdline/README Mon Sep  6 20:02:15 2010
@@ -72,7 +72,7 @@ paths adjusted appropriately:
      AuthUserFile /usr/local/apache2/conf/users
      Require valid-user
    </Location>
-     
+
    <Location /svn-test-work/local_tmp/repos>
      DAV svn
      SVNPath /home/yourusernamehere/projects/svn/subversion/tests/cmdline/svn-test-work/local_tmp/repos
@@ -83,6 +83,9 @@ paths adjusted appropriately:
      Require valid-user
    </Location>
 
+   RedirectMatch permanent ^/svn-test-work/repositories/REDIRECT-PERM-(.*)$ /svn-test-work/repositories/$1
+   RedirectMatch           ^/svn-test-work/repositories/REDIRECT-TEMP-(.*)$ /svn-test-work/repositories/$1
+
 Httpd should be running on port 80.  You may also need to ensure that
 it's running as you, so it has read/write access to the repositories
 that are probably living in your Subversion working copy.  To do this,

Modified: subversion/branches/performance/subversion/tests/cmdline/authz_tests.py
URL: http://svn.apache.org/viewvc/subversion/branches/performance/subversion/tests/cmdline/authz_tests.py?rev=993141&r1=993140&r2=993141&view=diff
==============================================================================
--- subversion/branches/performance/subversion/tests/cmdline/authz_tests.py (original)
+++ subversion/branches/performance/subversion/tests/cmdline/authz_tests.py Mon Sep  6 20:02:15 2010
@@ -37,6 +37,7 @@ from svntest.main import server_authz_ha
 # (abbreviation)
 Item = svntest.wc.StateItem
 XFail = svntest.testcase.XFail
+Wimp = svntest.testcase.Wimp
 Skip = svntest.testcase.Skip
 SkipUnless = svntest.testcase.SkipUnless
 
@@ -1021,6 +1022,9 @@ def wc_wc_copy_revert(sbox):
   svntest.actions.run_and_verify_svn(None, None, [],
                                      'revert', '--recursive', sbox.ospath('A2'))
   
+  expected_status = svntest.actions.get_virginal_state(sbox.wc_dir, 1)
+  expected_status.remove('A/B/E', 'A/B/E/alpha', 'A/B/E/beta')
+  svntest.actions.run_and_verify_status(sbox.wc_dir, expected_status)
 
 ########################################################################
 # Run the tests
@@ -1051,7 +1055,8 @@ test_list = [ None,
                    svntest.main.is_ra_type_file),
               Skip(multiple_matches, svntest.main.is_ra_type_file),
               Skip(wc_wc_copy, svntest.main.is_ra_type_file),
-              XFail(Skip(wc_wc_copy_revert, svntest.main.is_ra_type_file)),
+              Skip(wc_wc_copy_revert,
+                   svntest.main.is_ra_type_file),
              ]
 
 if __name__ == '__main__':

Modified: subversion/branches/performance/subversion/tests/cmdline/basic_tests.py
URL: http://svn.apache.org/viewvc/subversion/branches/performance/subversion/tests/cmdline/basic_tests.py?rev=993141&r1=993140&r2=993141&view=diff
==============================================================================
--- subversion/branches/performance/subversion/tests/cmdline/basic_tests.py (original)
+++ subversion/branches/performance/subversion/tests/cmdline/basic_tests.py Mon Sep  6 20:02:15 2010
@@ -1149,9 +1149,9 @@ def basic_delete(sbox):
 
   # check versioned dir is not removed
   if not verify_dir_deleted(F_path):
-    print("Removed versioned dir")
-    ### we should raise a less generic error here. which?
-    raise svntest.Failure
+    # If we are not running in single-db, this is an error
+    if os.path.isdir(os.path.join(F_path, '../' + svntest.main.get_admin_name())):
+      raise svntest.Failure("Removed administrative area")
 
   # check unversioned and added dirs has been removed
   if verify_dir_deleted(Q_path):
@@ -1213,8 +1213,8 @@ def basic_checkout_deleted(sbox):
 
 #----------------------------------------------------------------------
 
-# Issue 846, changing a deleted file to an added directory is not
-# supported.
+# Issue 846, changing a deleted file to an added directory was not
+# supported before WC-NG. But we can handle it.
 
 def basic_node_kind_change(sbox):
   "attempt to change node kind"
@@ -1232,25 +1232,24 @@ def basic_node_kind_change(sbox):
   svntest.actions.run_and_verify_status(wc_dir, expected_status)
 
   # Try and fail to create a directory (file scheduled for deletion)
-  svntest.actions.run_and_verify_svn('Cannot change node kind',
-                                     None, svntest.verify.AnyOutput,
-                                     'mkdir', gamma_path)
+  svntest.actions.run_and_verify_svn(None, None, [], 'mkdir', gamma_path)
 
-  # Status is unchanged
+  # Status is replaced
+  expected_status.tweak('A/D/gamma', status='R ')
   svntest.actions.run_and_verify_status(wc_dir, expected_status)
 
   # Commit file deletion
   expected_output = wc.State(wc_dir, {
-    'A/D/gamma' : Item(verb='Deleting'),
+    'A/D/gamma' : Item(verb='Replacing'),
     })
   expected_status = svntest.actions.get_virginal_state(wc_dir, 1)
-  expected_status.remove('A/D/gamma')
+  expected_status.tweak('A/D/gamma', status='  ', wc_rev='2')
   svntest.actions.run_and_verify_commit(wc_dir,
                                         expected_output, expected_status,
                                         None, wc_dir)
 
   # Try and fail to create a directory (file deleted)
-  svntest.actions.run_and_verify_svn('Cannot change node kind',
+  svntest.actions.run_and_verify_svn(None,
                                      None, svntest.verify.AnyOutput,
                                      'mkdir', gamma_path)
 
@@ -1261,11 +1260,12 @@ def basic_node_kind_change(sbox):
   svntest.actions.run_and_verify_svn(None, None, [], 'up', wc_dir)
 
   # mkdir should succeed
+  svntest.actions.run_and_verify_svn(None, None, [], 'rm', gamma_path)
   svntest.actions.run_and_verify_svn(None, None, [], 'mkdir', gamma_path)
 
   expected_status.tweak(wc_rev=2)
   expected_status.add({
-    'A/D/gamma' : Item(status='A ', wc_rev=0),
+    'A/D/gamma' : Item(status='R ', wc_rev=2),
     })
   svntest.actions.run_and_verify_status(wc_dir, expected_status)
 
@@ -2520,6 +2520,37 @@ def meta_correct_library_being_used(sbox
   svntest.actions.run_and_verify_svn("is $http_library available",
                                      expected_output, [], '--version')
 
+def delete_and_add_same_file(sbox):
+  "commit deletes a file and adds one with same text"
+  sbox.build()
+
+  wc_dir = sbox.wc_dir
+
+  iota = os.path.join(wc_dir, 'iota')
+  iota2 = os.path.join(wc_dir, 'iota2')
+
+  shutil.copyfile(iota, iota2)
+
+  svntest.main.run_svn(None, 'rm', iota)
+  svntest.main.run_svn(None, 'add', iota2)
+
+  expected_output = wc.State(wc_dir, {
+    'iota' : Item(verb='Deleting'),
+    'iota2' : Item(verb='Adding'),
+    })
+
+  expected_status = svntest.actions.get_virginal_state(wc_dir, 1)
+  expected_status.remove('iota')
+  expected_status.add({ 'iota2':  Item(status='  ', wc_rev='2')})
+
+  # At one time the commit post-processing used to fail with "Pristine text
+  # not found".
+  svntest.actions.run_and_verify_commit(wc_dir,
+                                        expected_output,
+                                        expected_status,
+                                        None,
+                                        wc_dir)
+
 #----------------------------------------------------------------------
 
 ########################################################################
@@ -2579,6 +2610,7 @@ test_list = [ None,
               delete_from_url_with_spaces,
               SkipUnless(meta_correct_library_being_used,
                          svntest.main.is_ra_type_dav),
+              delete_and_add_same_file,
              ]
 
 if __name__ == '__main__':

Modified: subversion/branches/performance/subversion/tests/cmdline/commit_tests.py
URL: http://svn.apache.org/viewvc/subversion/branches/performance/subversion/tests/cmdline/commit_tests.py?rev=993141&r1=993140&r2=993141&view=diff
==============================================================================
--- subversion/branches/performance/subversion/tests/cmdline/commit_tests.py (original)
+++ subversion/branches/performance/subversion/tests/cmdline/commit_tests.py Mon Sep  6 20:02:15 2010
@@ -86,11 +86,15 @@ def make_standard_slew_of_changes(wc_dir
   svntest.main.run_svn(None, 'add', 'Q')
 
   # Remove two directories
-  svntest.main.run_svn(None, 'rm', os.path.join('A', 'B', 'E'))
+  A_B_E = os.path.join('A', 'B', 'E')
+  svntest.main.run_svn(None, 'rm', A_B_E)
   svntest.main.run_svn(None, 'rm', os.path.join('A', 'C'))
 
   # Replace one of the removed directories
-  svntest.main.run_svn(None, 'add', os.path.join('A', 'B', 'E'))
+  # But first recreate if it doesn't exist (single-db)
+  if not os.path.exists(A_B_E):
+    os.mkdir(A_B_E)
+  svntest.main.run_svn(None, 'add', A_B_E)
 
   # Make property mods to two directories
   svntest.main.run_svn(None, 'propset', 'foo', 'bar', os.curdir)
@@ -452,16 +456,21 @@ def nested_dir_replacements(sbox):
   sbox.build()
   wc_dir = sbox.wc_dir
 
+  A_D = os.path.join(wc_dir, 'A', 'D')
+
   # Delete and re-add A/D (a replacement), and A/D/H (another replace).
-  svntest.main.run_svn(None, 'rm', os.path.join(wc_dir, 'A', 'D'))
-  svntest.main.run_svn(None, 'add', '--depth=empty',
-                       os.path.join(wc_dir, 'A', 'D'))
-  svntest.main.run_svn(None, 'add', '--depth=empty',
-                       os.path.join(wc_dir, 'A', 'D', 'H'))
+  svntest.main.run_svn(None, 'rm', A_D)
+
+  # Recreate directories for single-db
+  if not os.path.exists(A_D):
+    os.mkdir(A_D)
+    os.mkdir(os.path.join(A_D, 'H'))
+  svntest.main.run_svn(None, 'add', '--depth=empty', A_D)
+  svntest.main.run_svn(None, 'add', '--depth=empty', os.path.join(A_D, 'H'))
 
   # For kicks, add new file A/D/bloo.
-  svntest.main.file_append(os.path.join(wc_dir, 'A', 'D', 'bloo'), "hi")
-  svntest.main.run_svn(None, 'add', os.path.join(wc_dir, 'A', 'D', 'bloo'))
+  svntest.main.file_append(os.path.join(A_D, 'bloo'), "hi")
+  svntest.main.run_svn(None, 'add', os.path.join(A_D, 'bloo'))
 
   # Verify pre-commit status:
   #
@@ -1948,6 +1957,9 @@ def mods_in_schedule_delete(sbox):
   C_path = os.path.join(wc_dir, 'A', 'C')
   svntest.actions.run_and_verify_svn(None, svntest.verify.AnyOutput, [],
                                      'rm', C_path)
+
+  if not os.path.exists(C_path):
+    os.mkdir(C_path)
   foo_path = os.path.join(C_path, 'foo')
   foo_contents = 'zig\nzag\n'
   svntest.main.file_append(foo_path, foo_contents)

Modified: subversion/branches/performance/subversion/tests/cmdline/copy_tests.py
URL: http://svn.apache.org/viewvc/subversion/branches/performance/subversion/tests/cmdline/copy_tests.py?rev=993141&r1=993140&r2=993141&view=diff
==============================================================================
--- subversion/branches/performance/subversion/tests/cmdline/copy_tests.py (original)
+++ subversion/branches/performance/subversion/tests/cmdline/copy_tests.py Mon Sep  6 20:02:15 2010
@@ -36,6 +36,7 @@ from svntest.main import SVN_PROP_MERGEI
 Skip = svntest.testcase.Skip
 SkipUnless = svntest.testcase.SkipUnless
 XFail = svntest.testcase.XFail
+Wimp = svntest.testcase.Wimp
 Item = svntest.wc.StateItem
 
 
@@ -2460,16 +2461,18 @@ def move_dir_back_and_forth(sbox):
 
   # Move the moved dir: D_moved back to its starting
   # location at A/D.
-  exit_code, out, err = svntest.actions.run_and_verify_svn(
-    None, None, svntest.verify.AnyOutput,
-    'mv', D_move_path, D_path)
 
-  for line in err:
-    if re.match('.*Cannot copy to .*as it is scheduled for deletion',
-                line, ):
-      return
-  raise svntest.Failure("mv failed but not in the expected way")
+  if svntest.main.wc_is_singledb(wc_dir):
+    # In single-db target is gone on-disk after it was moved away, so this
+    # move works ok
+    expected_err = []
+  else:
+    # In !SINGLE_DB the target of the copy exists on-dir, so svn tries
+    # to move the file below the deleted directory
+    expected_err = '.*Cannot copy to .*as it is scheduled for deletion'
 
+  svntest.actions.run_and_verify_svn(None, None, expected_err,
+                                     'mv', D_move_path, D_path)
 
 def copy_move_added_paths(sbox):
   "copy and move added paths without commits"
@@ -4767,6 +4770,69 @@ def move_added_nodes(sbox):
   expected_status.add({'X/Z' : Item(status='A ', wc_rev='0')})
   svntest.actions.run_and_verify_status(sbox.wc_dir, expected_status)
 
+def locate_wrong_origin(sbox):
+  "update editor locates invalid file source"
+
+  sbox.build()
+
+  iota = os.path.join(sbox.wc_dir, 'iota')
+  gamma = os.path.join(sbox.wc_dir, 'A/D/gamma')
+
+  D1 = os.path.join(sbox.wc_dir, 'D1')
+  D2 = os.path.join(sbox.wc_dir, 'D2')
+
+  main.run_svn(None, 'mkdir', D1, D2)
+  main.run_svn(None, 'cp', iota, os.path.join(D1, 'iota'))
+  main.run_svn(None, 'cp', gamma, os.path.join(D2, 'iota'))
+
+  main.run_svn(None, 'ci', sbox.wc_dir, '-m', 'Add 2*iotas in r2')
+  main.run_svn(None, 'rm', D1)
+
+  main.run_svn(None, 'ci', sbox.wc_dir, '-m', 'Why?')
+
+  main.run_svn(None, 'cp', D2, D1)
+  main.run_svn(None, 'ci', sbox.wc_dir, '-m', 'Replace one iota')
+
+  # <= 1.6 needs a new checkout here to reproduce, but not since r961831.
+  # so we just perform an update
+  main.run_svn(None, 'up', sbox.wc_dir)
+
+  main.run_svn(None, 'cp', sbox.repo_url + '/D1/iota@2',
+               sbox.repo_url + '/iobeta', '-m', 'Copy iota')
+
+
+  expected_status = svntest.actions.get_virginal_state(sbox.wc_dir, 4)
+  expected_status.add({
+    'D1'                : Item(status='  ', wc_rev='4'),
+    'D1/iota'           : Item(status='  ', wc_rev='4'),
+    'D2'                : Item(status='  ', wc_rev='4'),
+    'D2/iota'           : Item(status='  ', wc_rev='4'),
+  })
+  svntest.actions.run_and_verify_status(sbox.wc_dir, expected_status)
+
+  # The next update receives an add_file('/D1/iota', 2), which it then tries
+  # to locate in the local working copy. It finds a '/D1/iota' in the expected
+  # place, with a last-changed revision of 2 and a local revision of HEAD-1
+  #
+  # locate_copyfrom identifies this file as correct because 
+  #     * last-mod <= 2 and
+  #     * 2 <= REV
+  #
+  # Luckily close_file() receives an expected_checksum which makes us fail, or
+  # we would have a completely broken working copy
+
+  # So this gives a Checksum mismatch error.
+  main.run_svn(None, 'up', sbox.wc_dir)
+
+# This test currently fails, but should work ok once we move to single DB
+def copy_over_deleted_dir(sbox):
+  "copy a directory over a deleted directory"
+  sbox.build(read_only = True)
+
+  main.run_svn(None, 'rm', os.path.join(sbox.wc_dir, 'A/B'))
+  main.run_svn(None, 'cp', os.path.join(sbox.wc_dir, 'A/D'),
+               os.path.join(sbox.wc_dir, 'A/B'))
+
 
 ########################################################################
 # Run the tests
@@ -4842,7 +4908,7 @@ test_list = [ None,
               copy_make_parents_wc_repo,
               copy_make_parents_repo_repo,
               URI_encoded_repos_to_wc,
-              XFail(allow_unversioned_parent_for_copy_src),
+              allow_unversioned_parent_for_copy_src,
               replaced_local_source_for_incoming_copy,
               unneeded_parents,
               double_parents_with_url,
@@ -4861,7 +4927,11 @@ test_list = [ None,
               copy_dir_with_space,
               changed_data_should_match_checkout,
               XFail(changed_dir_data_should_match_checkout),
-              XFail(move_added_nodes),
+              move_added_nodes,
+              # Serf needs a different testcase for this issue
+              XFail(Skip(locate_wrong_origin,
+                         svntest.main.is_ra_type_dav_serf)),
+              copy_over_deleted_dir,
              ]
 
 if __name__ == '__main__':

Modified: subversion/branches/performance/subversion/tests/cmdline/davautocheck.sh
URL: http://svn.apache.org/viewvc/subversion/branches/performance/subversion/tests/cmdline/davautocheck.sh?rev=993141&r1=993140&r2=993141&view=diff
==============================================================================
--- subversion/branches/performance/subversion/tests/cmdline/davautocheck.sh (original)
+++ subversion/branches/performance/subversion/tests/cmdline/davautocheck.sh Mon Sep  6 20:02:15 2010
@@ -210,6 +210,9 @@ LOAD_MOD_LOG_CONFIG=$(get_loadmodule_con
 LOAD_MOD_MIME=$(get_loadmodule_config mod_mime) \
   || fail "MIME module not found"
 
+LOAD_MOD_ALIAS=$(get_loadmodule_config mod_alias) \
+  || fail "ALIAS module not found"
+
 # needed for Auth*, Require, etc. directives
 LOAD_MOD_AUTH=$(get_loadmodule_config mod_auth) \
   || {
@@ -258,6 +261,7 @@ touch $HTTPD_MIME_TYPES
 cat > "$HTTPD_CFG" <<__EOF__
 $LOAD_MOD_LOG_CONFIG
 $LOAD_MOD_MIME
+$LOAD_MOD_ALIAS
 $LOAD_MOD_UNIXD
 $LOAD_MOD_DAV
 LoadModule          dav_svn_module "$MOD_DAV_SVN"
@@ -321,6 +325,8 @@ CustomLog           "$HTTPD_ROOT/ops" "%
   AuthUserFile      $HTTPD_USERS
   Require           valid-user
 </Location>
+RedirectMatch permanent ^/svn-test-work/repositories/REDIRECT-PERM-(.*)\$ /svn-test-work/repositories/\$1
+RedirectMatch           ^/svn-test-work/repositories/REDIRECT-TEMP-(.*)\$ /svn-test-work/repositories/\$1
 __EOF__
 
 START="$HTTPD -f $HTTPD_CFG"

Modified: subversion/branches/performance/subversion/tests/cmdline/depth_tests.py
URL: http://svn.apache.org/viewvc/subversion/branches/performance/subversion/tests/cmdline/depth_tests.py?rev=993141&r1=993140&r2=993141&view=diff
==============================================================================
--- subversion/branches/performance/subversion/tests/cmdline/depth_tests.py (original)
+++ subversion/branches/performance/subversion/tests/cmdline/depth_tests.py Mon Sep  6 20:02:15 2010
@@ -2442,6 +2442,8 @@ def make_depth_tree_conflicts(sbox):
   expected_disk.remove('A/mu',
                        'A/B', 'A/B/lambda', 'A/B/E/alpha', 'A/B/E/beta',
                        'A/D/gamma');
+  if svntest.main.wc_is_singledb(sbox.wc_dir):
+    expected_disk.remove('A/B/E', 'A/B/F')
 
   # This test is set XFail because this (correct) status cannot be
   # verified due to an "svn update" bug. The tree-conflict on A/B