Modified: 
subversion/branches/move-tracking-2/subversion/libsvn_wc/wc-metadata.sql
URL: 
http://svn.apache.org/viewvc/subversion/branches/move-tracking-2/subversion/libsvn_wc/wc-metadata.sql?rev=1674754&r1=1674753&r2=1674754&view=diff
==============================================================================
--- subversion/branches/move-tracking-2/subversion/libsvn_wc/wc-metadata.sql 
(original)
+++ subversion/branches/move-tracking-2/subversion/libsvn_wc/wc-metadata.sql 
Mon Apr 20 08:10:40 2015
@@ -598,30 +598,30 @@ CREATE UNIQUE INDEX I_EXTERNALS_DEFINED
 ANALYZE sqlite_master; /* Creates empty sqlite_stat1 if necessary */
 
 DELETE FROM sqlite_stat1
-WHERE tbl in ('NODES', 'ACTUAL_NODE', 'LOCK', 'WC_LOCK');
+WHERE tbl in ('NODES', 'ACTUAL_NODE', 'LOCK', 'WC_LOCK', 'EXTERNALS');
 
-INSERT OR REPLACE INTO sqlite_stat1(tbl, idx, stat) VALUES
+INSERT INTO sqlite_stat1(tbl, idx, stat) VALUES
     ('NODES', 'sqlite_autoindex_NODES_1',               '8000 8000 2 1');
-INSERT OR REPLACE INTO sqlite_stat1(tbl, idx, stat) VALUES
+INSERT INTO sqlite_stat1(tbl, idx, stat) VALUES
     ('NODES', 'I_NODES_PARENT',                         '8000 8000 10 2 1');
 /* Tell a lie: We ignore that 99.9% of all moved_to values are NULL */
-INSERT OR REPLACE INTO sqlite_stat1(tbl, idx, stat) VALUES
+INSERT INTO sqlite_stat1(tbl, idx, stat) VALUES
     ('NODES', 'I_NODES_MOVED',                          '8000 8000 1 1');
 
-INSERT OR REPLACE INTO sqlite_stat1(tbl, idx, stat) VALUES
+INSERT INTO sqlite_stat1(tbl, idx, stat) VALUES
     ('ACTUAL_NODE', 'sqlite_autoindex_ACTUAL_NODE_1',   '8000 8000 1');
-INSERT OR REPLACE INTO sqlite_stat1(tbl, idx, stat) VALUES
+INSERT INTO sqlite_stat1(tbl, idx, stat) VALUES
     ('ACTUAL_NODE', 'I_ACTUAL_PARENT',                  '8000 8000 10 1');
 
-INSERT OR REPLACE INTO sqlite_stat1(tbl, idx, stat) VALUES
+INSERT INTO sqlite_stat1(tbl, idx, stat) VALUES
     ('LOCK', 'sqlite_autoindex_LOCK_1',                 '100 100 1');
 
-INSERT OR REPLACE INTO sqlite_stat1(tbl, idx, stat) VALUES
+INSERT INTO sqlite_stat1(tbl, idx, stat) VALUES
     ('WC_LOCK', 'sqlite_autoindex_WC_LOCK_1',           '100 100 1');
 
-INSERT OR REPLACE INTO sqlite_stat1(tbl, idx, stat) VALUES
+INSERT INTO sqlite_stat1(tbl, idx, stat) VALUES
     ('EXTERNALS','sqlite_autoindex_EXTERNALS_1',        '100 100 1');
-INSERT OR REPLACE INTO sqlite_stat1(tbl, idx, stat) VALUES
+INSERT INTO sqlite_stat1(tbl, idx, stat) VALUES
     ('EXTERNALS','I_EXTERNALS_DEFINED',                 '100 100 3 1');
 
 /* sqlite_autoindex_WORK_QUEUE_1 doesn't exist because WORK_QUEUE is

Modified: subversion/branches/move-tracking-2/subversion/libsvn_wc/wc_db.c
URL: 
http://svn.apache.org/viewvc/subversion/branches/move-tracking-2/subversion/libsvn_wc/wc_db.c?rev=1674754&r1=1674753&r2=1674754&view=diff
==============================================================================
--- subversion/branches/move-tracking-2/subversion/libsvn_wc/wc_db.c (original)
+++ subversion/branches/move-tracking-2/subversion/libsvn_wc/wc_db.c Mon Apr 20 
08:10:40 2015
@@ -9434,8 +9434,8 @@ read_children_info(svn_wc__db_wcroot_t *
                                                            moved_to_relpath,
                                                            result_pool);
 
-              shadow_op_relpath = svn_relpath_limit(child_relpath, op_depth,
-                                                    scratch_pool);
+              shadow_op_relpath = svn_relpath_prefix(child_relpath, op_depth,
+                                                     scratch_pool);
 
               moved_to->shadow_op_root_abspath =
                         svn_dirent_join(wcroot->abspath, shadow_op_relpath,
@@ -9624,8 +9624,8 @@ read_single_info(const struct svn_wc__db
                                                    moved_to_relpath,
                                                    result_pool);
 
-          cur_relpath = svn_relpath_limit(local_relpath, op_depth,
-                                          scratch_pool);
+          cur_relpath = svn_relpath_prefix(local_relpath, op_depth,
+                                           scratch_pool);
 
           move->shadow_op_root_abspath = svn_dirent_join(wcroot->abspath,
                                                          cur_relpath,
@@ -12700,7 +12700,8 @@ scan_addition(svn_wc__db_status_t *statu
 
 
     /* Calculate the op root local path components */
-    op_root_relpath = svn_relpath_limit(local_relpath, op_depth, scratch_pool);
+    op_root_relpath = svn_relpath_prefix(local_relpath, op_depth,
+                                         scratch_pool);
     repos_prefix_path = svn_relpath_skip_ancestor(op_root_relpath,
                                                   local_relpath);
 
@@ -12819,8 +12820,8 @@ scan_addition(svn_wc__db_status_t *statu
             /* Skip to op_depth */
             tmp = op_root_relpath;
 
-            op_root_relpath = svn_relpath_limit(op_root_relpath, op_depth,
-                                                scratch_pool);
+            op_root_relpath = svn_relpath_prefix(op_root_relpath, op_depth,
+                                                 scratch_pool);
             repos_prefix_path = svn_relpath_join(
                                                  
svn_relpath_skip_ancestor(op_root_relpath, tmp),
                                                  repos_prefix_path, 
scratch_pool);
@@ -13029,8 +13030,8 @@ svn_wc__db_scan_moved(const char **moved
   /* The deleted node is either where we moved from, or one of its ancestors */
   if (moved_from_delete_abspath)
     {
-      const char *tmp = svn_relpath_limit(moved_from_op_root_relpath,
-                                          moved_from_op_depth, scratch_pool);
+      const char *tmp = svn_relpath_prefix(moved_from_op_root_relpath,
+                                           moved_from_op_depth, scratch_pool);
 
       *moved_from_delete_abspath = svn_dirent_join(wcroot->abspath, tmp,
                                                    scratch_pool);
@@ -13236,8 +13237,8 @@ svn_wc__db_scan_moved_to_internal(const
         *move_dst_relpath = apr_pstrdup(result_pool, dst_relpath);
 
       if (delete_relpath)
-        *delete_relpath = svn_relpath_limit(local_relpath, delete_op_depth,
-                                            result_pool);
+        *delete_relpath = svn_relpath_prefix(local_relpath, delete_op_depth,
+                                             result_pool);
     }
 
   return SVN_NO_ERROR;

Modified: 
subversion/branches/move-tracking-2/subversion/libsvn_wc/wc_db_update_move.c
URL: 
http://svn.apache.org/viewvc/subversion/branches/move-tracking-2/subversion/libsvn_wc/wc_db_update_move.c?rev=1674754&r1=1674753&r2=1674754&view=diff
==============================================================================
--- 
subversion/branches/move-tracking-2/subversion/libsvn_wc/wc_db_update_move.c 
(original)
+++ 
subversion/branches/move-tracking-2/subversion/libsvn_wc/wc_db_update_move.c 
Mon Apr 20 08:10:40 2015
@@ -490,9 +490,9 @@ create_node_tree_conflict(svn_skel_t **c
 {
   update_move_baton_t *umb = nmb->umb;
   const char *dst_repos_relpath;
-  const char *dst_root_relpath = svn_relpath_limit(nmb->dst_relpath,
-                                                   nmb->umb->dst_op_depth,
-                                                   scratch_pool);
+  const char *dst_root_relpath = svn_relpath_prefix(nmb->dst_relpath,
+                                                    nmb->umb->dst_op_depth,
+                                                    scratch_pool);
 
   dst_repos_relpath =
             svn_relpath_join(nmb->umb->old_version->path_in_repos,
@@ -504,9 +504,9 @@ create_node_tree_conflict(svn_skel_t **c
 
   return svn_error_trace(
             create_tree_conflict(conflict_p, umb->wcroot, dst_local_relpath,
-                                 svn_relpath_limit(dst_local_relpath,
-                                                   umb->dst_op_depth,
-                                                   scratch_pool),
+                                 svn_relpath_prefix(dst_local_relpath,
+                                                    umb->dst_op_depth,
+                                                    scratch_pool),
                                  umb->db,
                                  umb->old_version, umb->new_version,
                                  umb->operation, old_kind, new_kind,
@@ -2083,8 +2083,8 @@ bump_moved_layer(svn_boolean_t *recurse,
         can_bump = FALSE;
     }
 
-  src_root_relpath = svn_relpath_limit(src_relpath, src_del_depth,
-                                       scratch_pool);
+  src_root_relpath = svn_relpath_prefix(src_relpath, src_del_depth,
+                                        scratch_pool);
 
   if (!can_bump)
     {
@@ -2404,9 +2404,9 @@ svn_wc__db_op_raise_moved_away_internal(
                                  src_repos_relpath,
                                  svn_wc_conflict_reason_moved_away,
                                  action,
-                                 svn_relpath_limit(src_relpath,
-                                                   delete_op_depth,
-                                                   iterpool),
+                                 svn_relpath_prefix(src_relpath,
+                                                    delete_op_depth,
+                                                    iterpool),
                                  iterpool, iterpool);
 
       if (!err)

Modified: subversion/branches/move-tracking-2/subversion/mod_dav_svn/liveprops.c
URL: 
http://svn.apache.org/viewvc/subversion/branches/move-tracking-2/subversion/mod_dav_svn/liveprops.c?rev=1674754&r1=1674753&r2=1674754&view=diff
==============================================================================
--- subversion/branches/move-tracking-2/subversion/mod_dav_svn/liveprops.c 
(original)
+++ subversion/branches/move-tracking-2/subversion/mod_dav_svn/liveprops.c Mon 
Apr 20 08:10:40 2015
@@ -787,58 +787,39 @@ insert_prop_internal(const dav_resource
 
     case SVN_PROPID_deadprop_count:
       {
+        svn_boolean_t has_props;
+
         if (resource->type != DAV_RESOURCE_TYPE_REGULAR)
           return DAV_PROP_INSERT_NOTSUPP;
 
-        if (resource->info->repos->is_svn_client)
-          {
-            svn_boolean_t has_props;
-            /* Retrieving the actual properties is quite expensive while
-               svn clients only want to know if there are properties, and
-               in many cases aren't interested at all (see r1673153) */
-            serr = svn_fs_node_has_props(&has_props,
-                                         resource->info->root.root,
-                                         resource->info->repos_path,
-                                         scratch_pool);
-
-            if (serr != NULL)
-              {
-                ap_log_rerror(APLOG_MARK, APLOG_ERR, serr->apr_err,
-                              resource->info->r,
-                              "Can't fetch has props of '%s': "
-                              "%s",
-                              resource->info->repos_path,
-                              serr->message);
-                svn_error_clear(serr);
-                value = error_value;
-                break;
-              }
+        /* Retrieving the actual properties is quite expensive while
+           svn clients only want to know if there are properties, by
+           using this svn defined property.
+
+           Our and and SvnKit's implementation of the ra layer check
+           for '> 0' to provide the boolean if the node has custom
+           properties or not, so starting with 1.9 we just provide
+           "1" or "0".
+         */
+        serr = svn_fs_node_has_props(&has_props,
+                                      resource->info->root.root,
+                                      resource->info->repos_path,
+                                      scratch_pool);
 
-            value = has_props ? "99" /* Magic (undocumented) value */ : "0";
-          }
-        else
+        if (serr != NULL)
           {
-            unsigned int propcount;
-            apr_hash_t *proplist;
-            serr = svn_fs_node_proplist(&proplist,
-                                        resource->info->root.root,
-                                        resource->info->repos_path, 
scratch_pool);
-            if (serr != NULL)
-              {
-                ap_log_rerror(APLOG_MARK, APLOG_ERR, serr->apr_err,
-                              resource->info->r,
-                              "Can't fetch proplist of '%s': "
-                              "%s",
-                              resource->info->repos_path,
-                              serr->message);
-                svn_error_clear(serr);
-                value = error_value;
-                break;
-              }
-
-            propcount = apr_hash_count(proplist);
-            value = apr_psprintf(scratch_pool, "%u", propcount);
+            ap_log_rerror(APLOG_MARK, APLOG_ERR, serr->apr_err,
+                          resource->info->r,
+                          "Can't fetch has properties on '%s': "
+                          "%s",
+                          resource->info->repos_path,
+                          serr->message);
+            svn_error_clear(serr);
+            value = error_value;
+            break;
           }
+
+        value = has_props ? "1" : "0";
         break;
       }
 

Modified: subversion/branches/move-tracking-2/subversion/mod_dav_svn/repos.c
URL: 
http://svn.apache.org/viewvc/subversion/branches/move-tracking-2/subversion/mod_dav_svn/repos.c?rev=1674754&r1=1674753&r2=1674754&view=diff
==============================================================================
--- subversion/branches/move-tracking-2/subversion/mod_dav_svn/repos.c 
(original)
+++ subversion/branches/move-tracking-2/subversion/mod_dav_svn/repos.c Mon Apr 
20 08:10:40 2015
@@ -2126,6 +2126,16 @@ get_resource(request_rec *r,
   xslt_uri = dav_svn__get_xslt_uri(r);
   fs_parent_path = dav_svn__get_fs_parent_path(r);
 
+  if (r->method_number == M_COPY)
+    {
+      /* Workaround for issue #4531: Avoid a depth-infinity walk on
+         the copy source by overriding the Depth header here.
+         mod_dav defaults to infinite depth if this header is not set
+         which makes copies O(size of source) rather than the desired O(1).
+         ### Should be fixed by an explicit provider API feature in mod_dav. */
+      apr_table_setn(r->headers_in, "Depth", "0");
+    }
+
   /* Special case: detect and build the SVNParentPath as a unique type
      of private resource, iff the SVNListParentPath directive is 'on'. */
   if (dav_svn__is_parentpath_list(r))

Modified: 
subversion/branches/move-tracking-2/subversion/svn/conflict-callbacks.c
URL: 
http://svn.apache.org/viewvc/subversion/branches/move-tracking-2/subversion/svn/conflict-callbacks.c?rev=1674754&r1=1674753&r2=1674754&view=diff
==============================================================================
--- subversion/branches/move-tracking-2/subversion/svn/conflict-callbacks.c 
(original)
+++ subversion/branches/move-tracking-2/subversion/svn/conflict-callbacks.c Mon 
Apr 20 08:10:40 2015
@@ -44,6 +44,9 @@
 #include "svn_private_config.h"
 
 #define ARRAY_LEN(ary) ((sizeof (ary)) / (sizeof ((ary)[0])))
+#define MAX_ARRAY_LEN(aryx, aryz)               \
+  (ARRAY_LEN((aryx)) > ARRAY_LEN((aryz))        \
+   ? ARRAY_LEN((aryx)) : ARRAY_LEN((aryz)))
 
 
 
@@ -709,12 +712,12 @@ handle_text_conflict(svn_wc_conflict_res
      give them a rational basis for choosing (r)esolved? */
   svn_boolean_t knows_something = FALSE;
   const char *local_relpath;
-  
+
   SVN_ERR_ASSERT(desc->kind == svn_wc_conflict_kind_text);
 
   local_relpath = svn_cl__local_style_skip_ancestor(b->path_prefix,
                                                     desc->local_abspath,
-                                                    scratch_pool);;
+                                                    scratch_pool);
 
   if (desc->is_binary)
     SVN_ERR(svn_cmdline_fprintf(stderr, scratch_pool,
@@ -740,22 +743,17 @@ handle_text_conflict(svn_wc_conflict_res
 
   while (TRUE)
     {
+      const char *options[1 + MAX_ARRAY_LEN(binary_conflict_options,
+                                            text_conflict_options)];
+
       const resolver_option_t *conflict_options = desc->is_binary
                                                     ? binary_conflict_options
                                                     : text_conflict_options;
-      const char **options;
-      const char **next_option;
+      const char **next_option = options;
       const resolver_option_t *opt;
 
       svn_pool_clear(iterpool);
 
-      options = apr_palloc(iterpool,
-                           sizeof (const char *) *
-                           (desc->is_binary
-                              ? ARRAY_LEN(binary_conflict_options)
-                              : ARRAY_LEN(text_conflict_options)));
-      next_option = options;
-
       *next_option++ = "p";
       if (diff_allowed)
         {

Modified: subversion/branches/move-tracking-2/subversion/svn/similarity.c
URL: 
http://svn.apache.org/viewvc/subversion/branches/move-tracking-2/subversion/svn/similarity.c?rev=1674754&r1=1674753&r2=1674754&view=diff
==============================================================================
--- subversion/branches/move-tracking-2/subversion/svn/similarity.c (original)
+++ subversion/branches/move-tracking-2/subversion/svn/similarity.c Mon Apr 20 
08:10:40 2015
@@ -114,6 +114,8 @@ svn_cl__similarity_check(const char *key
     {
       svn_cl__simcheck_t *const token = tokens[i];
       token->context = NULL;
+      /* If you update this factor, consider updating
+       * ../libsvn_subr/cmdline.c:most_similar(). */
       if (token->score >= (2 * SVN_STRING__SIM_RANGE_MAX + 1) / 3)
         ++result;
     }

Modified: subversion/branches/move-tracking-2/subversion/svn/svn.c
URL: 
http://svn.apache.org/viewvc/subversion/branches/move-tracking-2/subversion/svn/svn.c?rev=1674754&r1=1674753&r2=1674754&view=diff
==============================================================================
--- subversion/branches/move-tracking-2/subversion/svn/svn.c (original)
+++ subversion/branches/move-tracking-2/subversion/svn/svn.c Mon Apr 20 
08:10:40 2015
@@ -2265,7 +2265,7 @@ sub_main(int *exit_code, int argc, const
 
         SVN_ERR(svn_utf_cstring_to_utf8(&utf8_opt_arg, opt_arg, pool));
         SVN_ERR(svn_cmdline__parse_config_option(opt_state.config_options,
-                                                 utf8_opt_arg, pool));
+                                                 utf8_opt_arg, "svn: ", pool));
         break;
       case opt_autoprops:
         opt_state.autoprops = TRUE;

Modified: subversion/branches/move-tracking-2/subversion/svnbench/cl.h
URL: 
http://svn.apache.org/viewvc/subversion/branches/move-tracking-2/subversion/svnbench/cl.h?rev=1674754&r1=1674753&r2=1674754&view=diff
==============================================================================
--- subversion/branches/move-tracking-2/subversion/svnbench/cl.h (original)
+++ subversion/branches/move-tracking-2/subversion/svnbench/cl.h Mon Apr 20 
08:10:40 2015
@@ -80,7 +80,6 @@ typedef struct svn_cl__opt_state_t
   svn_boolean_t help;            /* print usage message */
   const char *auth_username;     /* auth username */ /* UTF-8! */
   const char *auth_password;     /* auth password */ /* UTF-8! */
-  const char *extensions;        /* subprocess extension args */ /* UTF-8! */
   apr_array_header_t *targets;   /* target list from file */ /* UTF-8! */
   svn_boolean_t no_auth_cache;   /* do not cache authentication information */
   svn_boolean_t stop_on_copy;    /* don't cross copies during processing */
@@ -109,6 +108,7 @@ typedef struct svn_cl__cmd_baton_t
 /* Declare all the command procedures */
 svn_opt_subcommand_t
   svn_cl__help,
+  svn_cl__null_blame,
   svn_cl__null_export,
   svn_cl__null_list,
   svn_cl__null_log,

Modified: subversion/branches/move-tracking-2/subversion/svnbench/svnbench.c
URL: 
http://svn.apache.org/viewvc/subversion/branches/move-tracking-2/subversion/svnbench/svnbench.c?rev=1674754&r1=1674753&r2=1674754&view=diff
==============================================================================
--- subversion/branches/move-tracking-2/subversion/svnbench/svnbench.c 
(original)
+++ subversion/branches/move-tracking-2/subversion/svnbench/svnbench.c Mon Apr 
20 08:10:40 2015
@@ -219,6 +219,26 @@ const svn_opt_subcommand_desc2_t svn_cl_
     {0} },
   /* This command is also invoked if we see option "--help", "-h" or "-?". */
 
+  { "null-blame", svn_cl__null_blame, {0}, N_
+    ("Fetch all versions of a file in a batch.\n"
+     "usage: null-blame [-rM:N] TARGET[@REV]...\n"
+     "\n"
+     "  With no revision range (same as -r0:REV), or with '-r M:N' where M < 
N,\n"
+     "  annotate each line that is present in revision N of the file, with\n"
+     "  the last revision at or before rN that changed or added the line,\n"
+     "  looking back no further than rM.\n"
+     "\n"
+     "  With a reverse revision range '-r M:N' where M > N,\n"
+     "  annotate each line that is present in revision N of the file, with\n"
+     "  the next revision after rN that changed or deleted the line,\n"
+     "  looking forward no further than rM.\n"
+     "\n"
+     "  If specified, REV determines in which revision the target is first\n"
+     "  looked up.\n"
+     "\n"
+     "  Write the annotated result to standard output.\n"),
+    {'r', 'g'} },
+
   { "null-export", svn_cl__null_export, {0}, N_
     ("Create an unversioned copy of a tree.\n"
      "usage: null-export [-r REV] URL[@PEGREV]\n"
@@ -281,8 +301,7 @@ const svn_opt_subcommand_desc2_t svn_cl_
      "  follow copy history by default.  Use --stop-on-copy to disable this\n"
      "  behavior, which can be useful for determining branchpoints.\n"),
     {'r', 'q', 'v', 'g', 'c', opt_targets, opt_stop_on_copy,
-     'l', opt_with_all_revprops, opt_with_no_revprops, opt_with_revprop,
-     'x',},
+     'l', opt_with_all_revprops, opt_with_no_revprops, opt_with_revprop,},
     {{opt_with_revprop, N_("retrieve revision property ARG")},
      {'c', N_("the change made in revision ARG")}} },
 
@@ -620,10 +639,6 @@ sub_main(int *exit_code, int argc, const
       case opt_trust_server_cert_other_failure:
         opt_state.trust_server_cert_other_failure = TRUE;
         break;
-      case 'x':
-        SVN_ERR(svn_utf_cstring_to_utf8(&opt_state.extensions,
-                                            opt_arg, pool));
-        break;
       case opt_config_dir:
         {
           const char *path_utf8;
@@ -639,7 +654,7 @@ sub_main(int *exit_code, int argc, const
 
         SVN_ERR(svn_utf_cstring_to_utf8(&opt_arg, opt_arg, pool));
         SVN_ERR(svn_cmdline__parse_config_option(opt_state.config_options,
-                                                     opt_arg, pool));
+                                                 opt_arg, "svnbench: ", pool));
         break;
       case opt_with_all_revprops:
         /* If --with-all-revprops is specified along with one or more
@@ -842,7 +857,8 @@ sub_main(int *exit_code, int argc, const
 
   /* Only a few commands can accept a revision range; the rest can take at
      most one revision number. */
-  if (subcommand->cmd_func != svn_cl__null_log)
+  if (subcommand->cmd_func != svn_cl__null_blame
+      && subcommand->cmd_func != svn_cl__null_log)
     {
       if (opt_state.end_revision.kind != svn_opt_revision_unspecified)
         {

Modified: subversion/branches/move-tracking-2/subversion/svnmover/svnmover.c
URL: 
http://svn.apache.org/viewvc/subversion/branches/move-tracking-2/subversion/svnmover/svnmover.c?rev=1674754&r1=1674753&r2=1674754&view=diff
==============================================================================
--- subversion/branches/move-tracking-2/subversion/svnmover/svnmover.c 
(original)
+++ subversion/branches/move-tracking-2/subversion/svnmover/svnmover.c Mon Apr 
20 08:10:40 2015
@@ -2378,7 +2378,7 @@ sub_main(int *exit_code, int argc, const
         case config_inline_opt:
           SVN_ERR(svn_utf_cstring_to_utf8(&opt_arg, arg, pool));
           SVN_ERR(svn_cmdline__parse_config_option(config_options, opt_arg,
-                                                   pool));
+                                                   "svnmover: ", pool));
           break;
         case no_auth_cache_opt:
           no_auth_cache = TRUE;

Modified: subversion/branches/move-tracking-2/subversion/svnmucc/svnmucc.c
URL: 
http://svn.apache.org/viewvc/subversion/branches/move-tracking-2/subversion/svnmucc/svnmucc.c?rev=1674754&r1=1674753&r2=1674754&view=diff
==============================================================================
--- subversion/branches/move-tracking-2/subversion/svnmucc/svnmucc.c (original)
+++ subversion/branches/move-tracking-2/subversion/svnmucc/svnmucc.c Mon Apr 20 
08:10:40 2015
@@ -625,6 +625,7 @@ sub_main(int *exit_code, int argc, const
         case config_inline_opt:
           SVN_ERR(svn_utf_cstring_to_utf8(&opt_arg, arg, pool));
           SVN_ERR(svn_cmdline__parse_config_option(config_options, opt_arg,
+                                                   "svnmucc: ", 
                                                    pool));
           break;
         case no_auth_cache_opt:

Modified: subversion/branches/move-tracking-2/subversion/svnrdump/svnrdump.c
URL: 
http://svn.apache.org/viewvc/subversion/branches/move-tracking-2/subversion/svnrdump/svnrdump.c?rev=1674754&r1=1674753&r2=1674754&view=diff
==============================================================================
--- subversion/branches/move-tracking-2/subversion/svnrdump/svnrdump.c 
(original)
+++ subversion/branches/move-tracking-2/subversion/svnrdump/svnrdump.c Mon Apr 
20 08:10:40 2015
@@ -950,7 +950,9 @@ sub_main(int *exit_code, int argc, const
 
             SVN_ERR(svn_utf_cstring_to_utf8(&opt_arg, opt_arg, pool));
             SVN_ERR(svn_cmdline__parse_config_option(config_options,
-                                                     opt_arg, pool));
+                                                     opt_arg, 
+                                                     "svnrdump: ",
+                                                     pool));
         }
     }
 

Modified: subversion/branches/move-tracking-2/subversion/svnsync/svnsync.c
URL: 
http://svn.apache.org/viewvc/subversion/branches/move-tracking-2/subversion/svnsync/svnsync.c?rev=1674754&r1=1674753&r2=1674754&view=diff
==============================================================================
--- subversion/branches/move-tracking-2/subversion/svnsync/svnsync.c (original)
+++ subversion/branches/move-tracking-2/subversion/svnsync/svnsync.c Mon Apr 20 
08:10:40 2015
@@ -2073,7 +2073,8 @@ sub_main(int *exit_code, int argc, const
 
             SVN_ERR(svn_utf_cstring_to_utf8(&opt_arg, opt_arg, pool));
             SVN_ERR(svn_cmdline__parse_config_option(config_options,
-                                                     opt_arg, pool));
+                                                     opt_arg, "svnsync: ",
+                                                     pool));
             break;
 
           case svnsync_opt_source_prop_encoding:
@@ -2139,6 +2140,7 @@ sub_main(int *exit_code, int argc, const
                       apr_psprintf(pool,
                                    "config:miscellany:memory-cache-size=%s",
                                    opt_arg),
+                      NULL /* won't be used */,
                       pool));
             break;
 

Modified: 
subversion/branches/move-tracking-2/subversion/tests/cmdline/checkout_tests.py
URL: 
http://svn.apache.org/viewvc/subversion/branches/move-tracking-2/subversion/tests/cmdline/checkout_tests.py?rev=1674754&r1=1674753&r2=1674754&view=diff
==============================================================================
--- 
subversion/branches/move-tracking-2/subversion/tests/cmdline/checkout_tests.py 
(original)
+++ 
subversion/branches/move-tracking-2/subversion/tests/cmdline/checkout_tests.py 
Mon Apr 20 08:10:40 2015
@@ -1044,6 +1044,7 @@ def co_with_obstructing_local_adds(sbox)
 
 #----------------------------------------------------------------------
 # Test if checking out from a Windows driveroot is supported.
+@SkipUnless(svntest.main.is_os_windows)
 def checkout_wc_from_drive(sbox):
   "checkout from the root of a Windows drive"
 
@@ -1070,10 +1071,6 @@ def checkout_wc_from_drive(sbox):
 
     return None
 
-  # Skip the test if not on Windows
-  if not svntest.main.windows:
-    raise svntest.Skip
-
   # just create an empty folder, we'll checkout later.
   sbox.build(create_wc = False)
   svntest.main.safe_rmtree(sbox.wc_dir)
@@ -1082,7 +1079,7 @@ def checkout_wc_from_drive(sbox):
   # create a virtual drive to the repository folder
   drive = find_the_next_available_drive_letter()
   if drive is None:
-    raise svntest.Skip
+    raise svntest.Skip('No drive letter available')
 
   subprocess.call(['subst', drive +':', sbox.repo_dir])
   repo_url = 'file:///' + drive + ':/'

Modified: 
subversion/branches/move-tracking-2/subversion/tests/cmdline/copy_tests.py
URL: 
http://svn.apache.org/viewvc/subversion/branches/move-tracking-2/subversion/tests/cmdline/copy_tests.py?rev=1674754&r1=1674753&r2=1674754&view=diff
==============================================================================
--- subversion/branches/move-tracking-2/subversion/tests/cmdline/copy_tests.py 
(original)
+++ subversion/branches/move-tracking-2/subversion/tests/cmdline/copy_tests.py 
Mon Apr 20 08:10:40 2015
@@ -5822,6 +5822,17 @@ def copy_subtree_deleted(sbox):
   svntest.actions.run_and_verify_commit(wc2_dir,
                                         expected_output, None)
 
+def resurrect_at_root(sbox):
+   "resurrect directory at root"
+
+   sbox.build(create_wc=False)
+
+   svntest.actions.run_and_verify_svn(None, [], 'rm', sbox.repo_url + '/A',
+                                      '-m', '')
+
+   svntest.actions.run_and_verify_svn(None, [], 'cp',
+                                      sbox.repo_url + '/A/D/H@1',
+                                      sbox.repo_url + '/A', '-m', '')
 
 ########################################################################
 # Run the tests
@@ -5943,6 +5954,7 @@ test_list = [ None,
               copy_relocate,
               ext_wc_copy_deleted,
               copy_subtree_deleted,
+              resurrect_at_root,
              ]
 
 if __name__ == '__main__':

Modified: 
subversion/branches/move-tracking-2/subversion/tests/cmdline/diff_tests.py
URL: 
http://svn.apache.org/viewvc/subversion/branches/move-tracking-2/subversion/tests/cmdline/diff_tests.py?rev=1674754&r1=1674753&r2=1674754&view=diff
==============================================================================
--- subversion/branches/move-tracking-2/subversion/tests/cmdline/diff_tests.py 
(original)
+++ subversion/branches/move-tracking-2/subversion/tests/cmdline/diff_tests.py 
Mon Apr 20 08:10:40 2015
@@ -4867,6 +4867,151 @@ def diff_summarize_ignore_properties(sbo
   svntest.actions.run_and_verify_diff_summarize_xml(
     [], wc_dir, paths, items, props, kinds, wc_dir, '--ignore-properties')
 
+def diff_incomplete(sbox):
+  "diff incomplete directory"
+
+  sbox.build()
+  svntest.actions.run_and_verify_svn(None, [], 'rm', sbox.repo_url + '/A',
+                                     '-m', '')
+
+  # This works ok
+  _, out1a, _ = svntest.actions.run_and_verify_svn(None, [], 'diff',
+                                                   '-r', 'HEAD',
+                                                   sbox.wc_dir,
+                                                   '--notice-ancestry')
+
+  _, out1b, _ = svntest.actions.run_and_verify_svn(None, [], 'diff',
+                                                   sbox.wc_dir,
+                                                   '--notice-ancestry')
+
+
+  svntest.main.run_wc_incomplete_tester(sbox.ospath('A'), 1)
+
+  # And this used to miss certain changes
+  _, out2a, _ = svntest.actions.run_and_verify_svn(None, [], 'diff',
+                                                  '-r', 'HEAD',
+                                                  sbox.wc_dir,
+                                                  '--notice-ancestry')
+
+  _, out2b, _ = svntest.actions.run_and_verify_svn(None, [], 'diff',
+                                                   sbox.wc_dir,
+                                                   '--notice-ancestry')
+
+  # Ordering may be different, but length should match
+  if len(out1a) != len(out2a):
+    raise svntest.Failure('Different output when incomplete against repos')
+
+  svntest.verify.compare_and_display_lines('local diff', 'local diff', out1b,
+                                           out2b)
+
+  # And add a replacement on top of the incomplete, server side
+  svntest.actions.run_and_verify_svn(None, [], 'cp',
+                                     sbox.repo_url + '/A/D/H@1',
+                                     sbox.repo_url + '/A', '-m', '')
+
+  svntest.actions.run_and_verify_svn(None, [], 'diff',
+                                     '-r', 'HEAD',
+                                     sbox.wc_dir,
+                                     '--notice-ancestry')
+
+  # And client side
+  svntest.actions.run_and_verify_svn(None, [], 'rm', sbox.ospath('A'),
+                                     '--force')
+  sbox.simple_mkdir('A')
+  svntest.actions.run_and_verify_svn(None, [], 'diff',
+                                    '-r', 'HEAD',
+                                    sbox.wc_dir,
+                                    '--notice-ancestry')
+
+  svntest.actions.run_and_verify_svn(None, [], 'diff',
+                                    sbox.wc_dir,
+                                    '--notice-ancestry')
+
+def diff_incomplete_props(sbox):
+  "incomplete set of properties"
+
+  sbox.build()
+  wc_dir = sbox.wc_dir
+
+  sbox.simple_propset('r2-1', 'r2', 'iota', 'A')
+  sbox.simple_propset('r2-2', 'r2', 'iota', 'A')
+  sbox.simple_propset('r', 'r2', 'iota', 'A')
+  sbox.simple_commit() # r2
+
+  svntest.actions.run_and_verify_svnmucc(None, [],
+                                         '-U', sbox.repo_url,
+                                         'propset', 'r3-1', 'r3', 'iota',
+                                         'propset', 'r3-1', 'r3', 'A',
+                                         'propset', 'r3-2', 'r3', 'iota',
+                                         'propset', 'r3-2', 'r3', 'A',
+                                         'propset', 'r', 'r3', 'iota',
+                                         'propset', 'r', 'r3', 'A',
+                                         'propdel', 'r2-1', 'iota',
+                                         'propdel', 'r2-1', 'A',
+                                         'propdel', 'r2-2', 'iota',
+                                         'propdel', 'r2-2', 'A',
+                                         '-m', 'r3')
+
+  _, out1, _ = svntest.actions.run_and_verify_svn(None, [], 'diff',
+                                                  '-r', 'HEAD', wc_dir,
+                                                  '--notice-ancestry')
+
+  # Now simulate a broken update to r3
+  svntest.actions.set_incomplete(wc_dir, 3)
+  svntest.actions.set_incomplete(sbox.ospath('A'), 3)
+
+  # The properties are still at r2
+  expected_disk = svntest.main.greek_state.copy()
+  expected_disk.tweak('iota', 'A', props={'r2-1':'r2', 'r2-2':'r2', 'r':'r2'})
+  svntest.actions.verify_disk(wc_dir, expected_disk, True)
+
+  # But the working copy is incomplete at r3
+  expected_status = svntest.actions.get_virginal_state(wc_dir, 1)
+  expected_status.tweak('iota', wc_rev=2)
+  expected_status.tweak('', 'A', wc_rev=3, status='! ')
+  svntest.actions.run_and_verify_status(wc_dir, expected_status)
+
+  expected_output = svntest.wc.State(wc_dir, {
+    'A'    : Item(status=' U'),
+    'iota' : Item(status=' U'),
+  })
+  expected_status = svntest.actions.get_virginal_state(wc_dir, 3)
+  expected_disk = svntest.main.greek_state.copy()
+
+  # Expect that iota and A have the expected sets of properties
+  # The r2 set is properly deleted where necessary
+  expected_disk.tweak('iota', 'A', props={'r3-2':'r3', 'r':'r3', 'r3-1':'r3'})
+
+  _, out2, _ = svntest.actions.run_and_verify_svn(None, [], 'diff',
+                                                  '-r', 'HEAD', wc_dir,
+                                                  '--notice-ancestry')
+
+  svntest.actions.run_and_verify_update(wc_dir,
+                                        expected_output, expected_disk,
+                                        expected_status, [], True)
+
+  # Ok, we tested that the update worked properly, but we also do this
+  # in the update tests... Let's see, what the diffs said
+
+  _, out3, _ = svntest.actions.run_and_verify_svn(None, [], 'diff',
+                                                  '-r', 'BASE:2', wc_dir,
+                                                  '--notice-ancestry')
+
+  # Filter out all headers (which include revisions, etc.)
+  out1 = [i for i in out1 if i[0].isupper()]
+  out1.sort()
+
+  out2 = [i for i in out2 if i[0].isupper()]
+  out2.sort()
+
+  out3 = [i for i in out3 if i[0].isupper()]
+  out3.sort()
+
+  svntest.verify.compare_and_display_lines('base vs incomplete', 'local diff',
+                                           out1, out2)
+
+  svntest.verify.compare_and_display_lines('base vs after', 'local diff',
+                                           out1, out3)
 
 ########################################################################
 #Run the tests
@@ -4959,6 +5104,8 @@ test_list = [ None,
               diff_replaced_moved,
               diff_local_copied_dir,
               diff_summarize_ignore_properties,
+              diff_incomplete,
+              diff_incomplete_props,
               ]
 
 if __name__ == '__main__':

Modified: 
subversion/branches/move-tracking-2/subversion/tests/cmdline/getopt_tests.py
URL: 
http://svn.apache.org/viewvc/subversion/branches/move-tracking-2/subversion/tests/cmdline/getopt_tests.py?rev=1674754&r1=1674753&r2=1674754&view=diff
==============================================================================
--- 
subversion/branches/move-tracking-2/subversion/tests/cmdline/getopt_tests.py 
(original)
+++ 
subversion/branches/move-tracking-2/subversion/tests/cmdline/getopt_tests.py 
Mon Apr 20 08:10:40 2015
@@ -223,6 +223,18 @@ def getopt_help_bogus_cmd(sbox):
   "run svn help bogus-cmd"
   run_one_test(sbox, 'svn_help_bogus-cmd', 'help', 'bogus-cmd')
 
+def getopt_config_option(sbox):
+  "--config-option's spell checking"
+  sbox.build(create_wc=False, read_only=True)
+  expected_stderr = '.*W205000.*did you mean.*'
+  expected_stdout = svntest.verify.AnyOutput
+  svntest.actions.run_and_verify_svn2(expected_stdout, expected_stderr, 0,
+                                      'info', 
+                                      '--config-option',
+                                      'config:miscellanous:diff-extensions=' +
+                                        '-u -p',
+                                      sbox.repo_url)
+
 ########################################################################
 # Run the tests
 
@@ -237,6 +249,7 @@ test_list = [ None,
               getopt_help,
               getopt_help_bogus_cmd,
               getopt_help_log_switch,
+              getopt_config_option,
             ]
 
 if __name__ == '__main__':

Modified: 
subversion/branches/move-tracking-2/subversion/tests/cmdline/svnadmin_tests.py
URL: 
http://svn.apache.org/viewvc/subversion/branches/move-tracking-2/subversion/tests/cmdline/svnadmin_tests.py?rev=1674754&r1=1674753&r2=1674754&view=diff
==============================================================================
--- 
subversion/branches/move-tracking-2/subversion/tests/cmdline/svnadmin_tests.py 
(original)
+++ 
subversion/branches/move-tracking-2/subversion/tests/cmdline/svnadmin_tests.py 
Mon Apr 20 08:10:40 2015
@@ -792,7 +792,7 @@ def verify_incremental_fsfs(sbox):
   # the listing itself is valid.
   r2 = fsfs_file(sbox.repo_dir, 'revs', '2')
   if r2.endswith('pack'):
-    raise svntest.Skip
+    raise svntest.Skip('Test doesn\'t handle packed revisions')
 
   fp = open(r2, 'wb')
   fp.write("""id: 0-2.0.r2/0
@@ -2646,7 +2646,7 @@ def fsfs_hotcopy_progress(sbox):
   # and incremental scenarios.  The progress output can be affected by
   # the --fsfs-packing option, so skip the test if that is the case.
   if svntest.main.options.fsfs_packing:
-    raise svntest.Skip
+    raise svntest.Skip('fsfs packing set')
 
   # Create an empty repository, configure three files per shard.
   sbox.build(create_wc=False, empty=True)
@@ -2760,7 +2760,7 @@ def fsfs_hotcopy_progress_with_revprop_c
   # The progress output can be affected by the --fsfs-packing
   # option, so skip the test if that is the case.
   if svntest.main.options.fsfs_packing:
-    raise svntest.Skip
+    raise svntest.Skip('fsfs packing set')
 
   # Create an empty repository, commit several revisions and hotcopy it.
   sbox.build(create_wc=False, empty=True)

Modified: 
subversion/branches/move-tracking-2/subversion/tests/cmdline/svnsync_authz_tests.py
URL: 
http://svn.apache.org/viewvc/subversion/branches/move-tracking-2/subversion/tests/cmdline/svnsync_authz_tests.py?rev=1674754&r1=1674753&r2=1674754&view=diff
==============================================================================
--- 
subversion/branches/move-tracking-2/subversion/tests/cmdline/svnsync_authz_tests.py
 (original)
+++ 
subversion/branches/move-tracking-2/subversion/tests/cmdline/svnsync_authz_tests.py
 Mon Apr 20 08:10:40 2015
@@ -383,7 +383,7 @@ def identity_copy(sbox):
     except:
       pass
   if locale.setlocale(locale.LC_ALL) != other_locale:
-    raise svntest.Skip
+    raise svntest.Skip('Setting test locale failed')
 
   try:
     run_test(sbox, "copy-bad-encoding.expected.dump",

Modified: 
subversion/branches/move-tracking-2/subversion/tests/cmdline/svntest/wc.py
URL: 
http://svn.apache.org/viewvc/subversion/branches/move-tracking-2/subversion/tests/cmdline/svntest/wc.py?rev=1674754&r1=1674753&r2=1674754&view=diff
==============================================================================
--- subversion/branches/move-tracking-2/subversion/tests/cmdline/svntest/wc.py 
(original)
+++ subversion/branches/move-tracking-2/subversion/tests/cmdline/svntest/wc.py 
Mon Apr 20 08:10:40 2015
@@ -980,6 +980,20 @@ def svn_uri_quote(url):
 
 # ------------
 
+def python_sqlite_can_read_wc():
+  """Check if the Python builtin is capable enough to peek into wc.db"""
+
+  try:
+    db = svntest.sqlite3.connect('')
+
+    c = db.cursor()
+    c.execute('select sqlite_version()')
+    ver = tuple(map(int, c.fetchall()[0][0].split('.')))
+
+    return ver >= (3, 6, 18) # Currently enough (1.7-1.9)
+  except:
+    return False
+
 def open_wc_db(local_path):
   """Open the SQLite DB for the WC path LOCAL_PATH.
      Return (DB object, WC root path, WC relpath of LOCAL_PATH)."""

Modified: 
subversion/branches/move-tracking-2/subversion/tests/cmdline/switch_tests.py
URL: 
http://svn.apache.org/viewvc/subversion/branches/move-tracking-2/subversion/tests/cmdline/switch_tests.py?rev=1674754&r1=1674753&r2=1674754&view=diff
==============================================================================
--- 
subversion/branches/move-tracking-2/subversion/tests/cmdline/switch_tests.py 
(original)
+++ 
subversion/branches/move-tracking-2/subversion/tests/cmdline/switch_tests.py 
Mon Apr 20 08:10:40 2015
@@ -771,7 +771,7 @@ def refresh_read_only_attribute(sbox):
   # behavior, just skip the test.
   if os.name == 'posix':
     if os.geteuid() == 0:
-      raise svntest.Skip
+      raise svntest.Skip('Test doesn\'t work as uid 0')
 
   sbox.build()
   wc_dir = sbox.wc_dir

Modified: 
subversion/branches/move-tracking-2/subversion/tests/cmdline/update_tests.py
URL: 
http://svn.apache.org/viewvc/subversion/branches/move-tracking-2/subversion/tests/cmdline/update_tests.py?rev=1674754&r1=1674753&r2=1674754&view=diff
==============================================================================
--- 
subversion/branches/move-tracking-2/subversion/tests/cmdline/update_tests.py 
(original)
+++ 
subversion/branches/move-tracking-2/subversion/tests/cmdline/update_tests.py 
Mon Apr 20 08:10:40 2015
@@ -2227,6 +2227,7 @@ def forced_update_failures(sbox):
 # Test for issue #2556. The tests maps a virtual drive to a working copy
 # and tries some basic update, commit and status actions on the virtual
 # drive.
+@SkipUnless(svntest.main.is_os_windows)
 def update_wc_on_windows_drive(sbox):
   "update wc on the root of a Windows (virtual) drive"
 
@@ -2253,10 +2254,6 @@ def update_wc_on_windows_drive(sbox):
 
     return None
 
-  # Skip the test if not on Windows
-  if not svntest.main.windows:
-    raise svntest.Skip
-
   # just create an empty folder, we'll checkout later.
   sbox.build(create_wc = False)
   svntest.main.safe_rmtree(sbox.wc_dir)
@@ -2265,7 +2262,7 @@ def update_wc_on_windows_drive(sbox):
   # create a virtual drive to the working copy folder
   drive = find_the_next_available_drive_letter()
   if drive is None:
-    raise svntest.Skip
+    raise svntest.Skip('No drive letter available')
 
   subprocess.call(['subst', drive +':', sbox.wc_dir])
   wc_dir = drive + ':/'
@@ -5137,7 +5134,7 @@ def skip_access_denied(sbox):
   try:
     import msvcrt
   except ImportError:
-    raise svntest.Skip
+    raise svntest.Skip('python msvcrt library not available')
 
   sbox.build()
   wc_dir = sbox.wc_dir

Modified: 
subversion/branches/move-tracking-2/subversion/tests/cmdline/upgrade_tests.py
URL: 
http://svn.apache.org/viewvc/subversion/branches/move-tracking-2/subversion/tests/cmdline/upgrade_tests.py?rev=1674754&r1=1674753&r2=1674754&view=diff
==============================================================================
--- 
subversion/branches/move-tracking-2/subversion/tests/cmdline/upgrade_tests.py 
(original)
+++ 
subversion/branches/move-tracking-2/subversion/tests/cmdline/upgrade_tests.py 
Mon Apr 20 08:10:40 2015
@@ -1438,6 +1438,7 @@ def upgrade_1_7_dir_external(sbox):
   # svn: warning: W200033: sqlite[S5]: database is locked
   svntest.actions.run_and_verify_svn(None, [], 'upgrade', sbox.wc_dir)
 
+@SkipUnless(svntest.wc.python_sqlite_can_read_wc)
 def auto_analyze(sbox):
   """automatic SQLite ANALYZE"""
 

Modified: 
subversion/branches/move-tracking-2/subversion/tests/libsvn_client/client-test.c
URL: 
http://svn.apache.org/viewvc/subversion/branches/move-tracking-2/subversion/tests/libsvn_client/client-test.c?rev=1674754&r1=1674753&r2=1674754&view=diff
==============================================================================
--- 
subversion/branches/move-tracking-2/subversion/tests/libsvn_client/client-test.c
 (original)
+++ 
subversion/branches/move-tracking-2/subversion/tests/libsvn_client/client-test.c
 Mon Apr 20 08:10:40 2015
@@ -1287,6 +1287,123 @@ test_copy_pin_externals(const svn_test_o
   return SVN_NO_ERROR;
 }
 
+/* issue #4560 */
+static svn_error_t *
+test_copy_pin_externals_select_subtree(const svn_test_opts_t *opts, apr_pool_t 
*pool)
+{
+  svn_opt_revision_t rev;
+  svn_opt_revision_t peg_rev;
+  const char *repos_url;
+  const char *A_copy_url;
+  const char *B_url;
+  const char *wc_path;
+  svn_client_ctx_t *ctx;
+  apr_hash_t *externals_to_pin;
+  apr_array_header_t *external_items;
+  apr_array_header_t *copy_sources;
+  svn_wc_external_item2_t item;
+  svn_client_copy_source_t copy_source;
+  apr_hash_t *props;
+  int i;
+  struct test_data {
+    const char *subtree_relpath;
+    const char *src_external_desc;
+    const char *expected_dst_external_desc;
+  } test_data[] = {
+    /* External on A/B will be pinned. */
+    { "B", "^/A/D/gamma gamma-ext", "^/A/D/gamma@3 gamma-ext" },
+
+    /* External on A/D won't be pinned. */
+    { "D", "^/A/B/F F-ext", "^/A/B/F F-ext" } ,
+
+    { NULL },
+  };
+
+  /* Create a filesytem and repository containing the Greek tree. */
+  SVN_ERR(create_greek_repos(&repos_url, "pin-externals-select-subtree",
+                             opts, pool));
+
+  wc_path = svn_test_data_path("pin-externals-select-subtree-wc", pool);
+
+  /* Remove old test data from the previous run */
+  SVN_ERR(svn_io_remove_dir2(wc_path, TRUE, NULL, NULL, pool));
+
+  SVN_ERR(svn_io_make_dir_recursively(wc_path, pool));
+  svn_test_add_dir_cleanup(wc_path);
+
+  rev.kind = svn_opt_revision_head;
+  peg_rev.kind = svn_opt_revision_unspecified;
+  SVN_ERR(svn_client_create_context(&ctx, pool));
+
+  /* Configure externals. */
+  i = 0;
+  while (test_data[i].subtree_relpath)
+    {
+      const char *subtree_relpath;
+      const char *url;
+      const svn_string_t *propval;
+
+      subtree_relpath = test_data[i].subtree_relpath;
+      propval = svn_string_create(test_data[i].src_external_desc, pool);
+
+      url = apr_pstrcat(pool, repos_url, "/A/", subtree_relpath, SVN_VA_NULL);
+      SVN_ERR(svn_client_propset_remote(SVN_PROP_EXTERNALS, propval,
+                                        url, TRUE, 1, NULL,
+                                        NULL, NULL, ctx, pool));
+      i++;
+    }
+
+  /* Set up parameters for pinning externals on A/B. */
+  externals_to_pin = apr_hash_make(pool);
+
+  item.url = "^/A/D/gamma";
+  item.target_dir = "gamma-ext";
+
+  external_items = apr_array_make(pool, 2, sizeof(svn_wc_external_item2_t *));
+  APR_ARRAY_PUSH(external_items, svn_wc_external_item2_t *) = &item;
+  B_url = apr_pstrcat(pool, repos_url, "/A/B", SVN_VA_NULL);
+  svn_hash_sets(externals_to_pin, B_url, external_items);
+
+  /* Copy ^/A to ^/A_copy, pinning externals on ^/A/B. */
+  copy_source.path = apr_pstrcat(pool, repos_url, "/A", SVN_VA_NULL);
+  copy_source.revision = &rev;
+  copy_source.peg_revision = &peg_rev;
+  copy_sources = apr_array_make(pool, 1, sizeof(svn_client_copy_source_t *));
+  APR_ARRAY_PUSH(copy_sources, svn_client_copy_source_t *) = &copy_source;
+  A_copy_url = apr_pstrcat(pool, repos_url, "/A_copy", SVN_VA_NULL);
+  SVN_ERR(svn_client_copy7(copy_sources, A_copy_url, FALSE, FALSE,
+                           FALSE, FALSE, TRUE, externals_to_pin,
+                           NULL, NULL, NULL, ctx, pool));
+
+  /* Verify that externals were pinned as expected. */
+  i = 0;
+  while (test_data[i].subtree_relpath)
+    {
+      const char *subtree_relpath;
+      const char *url;
+      const svn_string_t *propval;
+      svn_stringbuf_t *externals_desc;
+      const char *expected_desc;
+
+      subtree_relpath = test_data[i].subtree_relpath;
+      url = apr_pstrcat(pool, A_copy_url, "/", subtree_relpath, SVN_VA_NULL);
+
+      SVN_ERR(svn_client_propget5(&props, NULL, SVN_PROP_EXTERNALS,
+                                  url, &peg_rev, &rev, NULL,
+                                  svn_depth_empty, NULL, ctx, pool, pool));
+      propval = svn_hash_gets(props, url);
+      SVN_TEST_ASSERT(propval);
+      externals_desc = svn_stringbuf_create(propval->data, pool);
+      svn_stringbuf_strip_whitespace(externals_desc);
+      expected_desc = test_data[i].expected_dst_external_desc;
+      SVN_TEST_STRING_ASSERT(externals_desc->data, expected_desc);
+
+      i++;
+    }
+
+  return SVN_NO_ERROR;
+}
+
 /* ========================================================================== 
*/
 
 
@@ -1313,6 +1430,8 @@ static struct svn_test_descriptor_t test
                        "test svn_client_status6 with ignore_local_mods"),
     SVN_TEST_OPTS_PASS(test_copy_pin_externals,
                        "test svn_client_copy7 with externals_to_pin"),
+    SVN_TEST_OPTS_PASS(test_copy_pin_externals_select_subtree,
+                       "pin externals on selected subtrees only"),
     SVN_TEST_NULL
   };
 

Modified: 
subversion/branches/move-tracking-2/subversion/tests/libsvn_wc/op-depth-test.c
URL: 
http://svn.apache.org/viewvc/subversion/branches/move-tracking-2/subversion/tests/libsvn_wc/op-depth-test.c?rev=1674754&r1=1674753&r2=1674754&view=diff
==============================================================================
--- 
subversion/branches/move-tracking-2/subversion/tests/libsvn_wc/op-depth-test.c 
(original)
+++ 
subversion/branches/move-tracking-2/subversion/tests/libsvn_wc/op-depth-test.c 
Mon Apr 20 08:10:40 2015
@@ -3622,6 +3622,17 @@ revert_file_externals(const svn_test_opt
     SVN_ERR(check_db_rows(&b, "", rows));
   }
 
+  SVN_ERR(sbox_wc_update(&b, "", 1));
+  {
+    nodes_row_t rows[] = {
+      { 0, "",    "normal",      1, "" },
+      { 0, "f",   "normal",      1, "f" },
+      { 0, "g",   "normal",      1, "f", TRUE },
+      { 0 }
+    };
+    SVN_ERR(check_db_rows(&b, "", rows));
+  }
+
   return SVN_NO_ERROR;
 }
 
@@ -12086,7 +12097,7 @@ static struct svn_test_descriptor_t test
     SVN_TEST_OPTS_PASS(test_global_commit,
                        "test global commit"),
     SVN_TEST_OPTS_PASS(test_global_commit_switched,
-                       "test global commit"),
+                       "test global commit switched"),
     SVN_TEST_NULL
   };
 

Propchange: subversion/branches/move-tracking-2/tools/
------------------------------------------------------------------------------
--- svn:mergeinfo (original)
+++ svn:mergeinfo Mon Apr 20 08:10:40 2015
@@ -82,4 +82,4 @@
 /subversion/branches/verify-at-commit/tools:1462039-1462408
 /subversion/branches/verify-keep-going/tools:1439280-1546110
 /subversion/branches/wc-collate-path/tools:1402685-1480384
-/subversion/trunk/tools:1606692-1671790
+/subversion/trunk/tools:1606692-1674752

Modified: subversion/branches/move-tracking-2/tools/client-side/bash_completion
URL: 
http://svn.apache.org/viewvc/subversion/branches/move-tracking-2/tools/client-side/bash_completion?rev=1674754&r1=1674753&r2=1674754&view=diff
==============================================================================
--- subversion/branches/move-tracking-2/tools/client-side/bash_completion 
(original)
+++ subversion/branches/move-tracking-2/tools/client-side/bash_completion Mon 
Apr 20 08:10:40 2015
@@ -938,7 +938,7 @@ _svn()
        status|stat|st)
                cmdOpts="-u --show-updates -v --verbose $nOpts $qOpts $pOpts \
                         --no-ignore --ignore-externals --incremental --xml \
-                         $cOpts"
+                         $rOpts $cOpts"
                ;;
        switch|sw)
                cmdOpts="--relocate $rOpts $nOpts $qOpts $pOpts --diff3-cmd \

Modified: subversion/branches/move-tracking-2/tools/dist/backport.pl
URL: 
http://svn.apache.org/viewvc/subversion/branches/move-tracking-2/tools/dist/backport.pl?rev=1674754&r1=1674753&r2=1674754&view=diff
==============================================================================
--- subversion/branches/move-tracking-2/tools/dist/backport.pl (original)
+++ subversion/branches/move-tracking-2/tools/dist/backport.pl Mon Apr 20 
08:10:40 2015
@@ -765,7 +765,7 @@ sub vote {
         "Approve $_->{entry}->{header}."
       } @votesarray;
     (@sentences == 1)
-    ? $sentences[0]
+    ? "* STATUS: $sentences[0]"
     : "* STATUS:\n" . join "", map "  $_\n", @sentences;
   };
 
@@ -1287,7 +1287,7 @@ sub nominate_main {
   # Done!
   system "$SVN diff -- $STATUS";
   if (prompt "Commit this nomination? ") {
-    system "$SVN commit -m 'Nominate r$revnums[0].' -- $STATUS";
+    system "$SVN commit -m '* STATUS: Nominate r$revnums[0].' -- $STATUS";
     exit $?;
   }
   elsif (!$had_local_mods or prompt "Revert STATUS (destroying local mods)? ") 
{

Modified: subversion/branches/move-tracking-2/tools/dist/release.py
URL: 
http://svn.apache.org/viewvc/subversion/branches/move-tracking-2/tools/dist/release.py?rev=1674754&r1=1674753&r2=1674754&view=diff
==============================================================================
--- subversion/branches/move-tracking-2/tools/dist/release.py (original)
+++ subversion/branches/move-tracking-2/tools/dist/release.py Mon Apr 20 
08:10:40 2015
@@ -87,12 +87,12 @@ tool_versions = {
   'trunk' : {
             'autoconf' : '2.69',
             'libtool'  : '2.4.3',
-            'swig'     : '3.0.0',
+            'swig'     : '2.0.12',
   },
   '1.9' : {
             'autoconf' : '2.69',
             'libtool'  : '2.4.3',
-            'swig'     : '3.0.0'
+            'swig'     : '2.0.12'
   },
   '1.8' : {
             'autoconf' : '2.69',

Modified: subversion/branches/move-tracking-2/win-tests.py
URL: 
http://svn.apache.org/viewvc/subversion/branches/move-tracking-2/win-tests.py?rev=1674754&r1=1674753&r2=1674754&view=diff
==============================================================================
--- subversion/branches/move-tracking-2/win-tests.py (original)
+++ subversion/branches/move-tracking-2/win-tests.py Mon Apr 20 08:10:40 2015
@@ -569,6 +569,8 @@ class Httpd:
                                     'jrandom', 'rayjandom'])
     os.spawnv(os.P_WAIT, htpasswd, ['htpasswd.exe', '-bp',  self.httpd_users,
                                     'jconstant', 'rayjandom'])
+    os.spawnv(os.P_WAIT, htpasswd, ['htpasswd.exe', '-bp',  self.httpd_users,
+                                    '__dumpster__', '__loadster__'])
 
   def _create_mime_types_file(self):
     "Create empty mime.types file"
@@ -635,6 +637,10 @@ class Httpd:
     else:
       self._start_daemon()
 
+    # Avoid output from starting and preparing between test results
+    sys.stderr.flush()
+    sys.stdout.flush()
+
   def stop(self):
     if self.service:
       self._stop_service()

Propchange: subversion/branches/move-tracking-2/win-tests.py
------------------------------------------------------------------------------
--- svn:mergeinfo (original)
+++ svn:mergeinfo Mon Apr 20 08:10:40 2015
@@ -86,4 +86,4 @@
 /subversion/branches/verify-at-commit/win-tests.py:1462039-1462408
 /subversion/branches/verify-keep-going/win-tests.py:1439280-1546110
 /subversion/branches/wc-collate-path/win-tests.py:1402685-1480384
-/subversion/trunk/win-tests.py:1606692-1671790
+/subversion/trunk/win-tests.py:1606692-1674752


Reply via email to