Modified: subversion/branches/move-tracking-2/subversion/libsvn_wc/workqueue.c
URL: 
http://svn.apache.org/viewvc/subversion/branches/move-tracking-2/subversion/libsvn_wc/workqueue.c?rev=1660173&r1=1660172&r2=1660173&view=diff
==============================================================================
--- subversion/branches/move-tracking-2/subversion/libsvn_wc/workqueue.c 
(original)
+++ subversion/branches/move-tracking-2/subversion/libsvn_wc/workqueue.c Mon 
Feb 16 17:40:07 2015
@@ -1107,7 +1107,7 @@ run_prej_install(work_item_baton_t *wqb,
   SVN_ERR(svn_wc__db_from_relpath(&local_abspath, db, wri_abspath,
                                   local_relpath, scratch_pool, scratch_pool));
 
-  SVN_ERR(svn_wc__db_read_conflict(&conflicts, db, local_abspath,
+  SVN_ERR(svn_wc__db_read_conflict(&conflicts, NULL, db, local_abspath,
                                    scratch_pool, scratch_pool));
 
   SVN_ERR(svn_wc__conflict_read_prop_conflict(&prejfile_abspath,
@@ -1287,7 +1287,7 @@ run_set_text_conflict_markers(work_item_
     /* Check if we should combine with a property conflict... */
     svn_skel_t *conflicts;
 
-    SVN_ERR(svn_wc__db_read_conflict(&conflicts, db, local_abspath,
+    SVN_ERR(svn_wc__db_read_conflict(&conflicts, NULL, db, local_abspath,
                                      scratch_pool, scratch_pool));
 
     if (! conflicts)
@@ -1353,7 +1353,7 @@ run_set_property_conflict_marker(work_it
     svn_skel_t *conflicts;
     apr_hash_t *prop_names;
 
-    SVN_ERR(svn_wc__db_read_conflict(&conflicts, db, local_abspath,
+    SVN_ERR(svn_wc__db_read_conflict(&conflicts, NULL, db, local_abspath,
                                      scratch_pool, scratch_pool));
 
     if (! conflicts)

Modified: subversion/branches/move-tracking-2/subversion/mod_dav_svn/lock.c
URL: 
http://svn.apache.org/viewvc/subversion/branches/move-tracking-2/subversion/mod_dav_svn/lock.c?rev=1660173&r1=1660172&r2=1660173&view=diff
==============================================================================
--- subversion/branches/move-tracking-2/subversion/mod_dav_svn/lock.c (original)
+++ subversion/branches/move-tracking-2/subversion/mod_dav_svn/lock.c Mon Feb 
16 17:40:07 2015
@@ -805,7 +805,7 @@ append_locks(dav_lockdb *lockdb,
          to return the lock details?
 
          Add yet another custom header?
-         Just an header doesn't handle a full error chain... 
+         Just an header doesn't handle a full error chain...
 
          ### Current behavior: we don't report an error.
        */

Modified: 
subversion/branches/move-tracking-2/subversion/mod_dav_svn/mod_dav_svn.c
URL: 
http://svn.apache.org/viewvc/subversion/branches/move-tracking-2/subversion/mod_dav_svn/mod_dav_svn.c?rev=1660173&r1=1660172&r2=1660173&view=diff
==============================================================================
--- subversion/branches/move-tracking-2/subversion/mod_dav_svn/mod_dav_svn.c 
(original)
+++ subversion/branches/move-tracking-2/subversion/mod_dav_svn/mod_dav_svn.c 
Mon Feb 16 17:40:07 2015
@@ -249,7 +249,7 @@ merge_dir_config(apr_pool_t *p, void *ba
   newconf->txdelta_cache = INHERIT_VALUE(parent, child, txdelta_cache);
   newconf->fulltext_cache = INHERIT_VALUE(parent, child, fulltext_cache);
   newconf->revprop_cache = INHERIT_VALUE(parent, child, revprop_cache);
-  newconf->block_read = INHERIT_VALUE(parent, child, block_read);  
+  newconf->block_read = INHERIT_VALUE(parent, child, block_read);
   newconf->root_dir = INHERIT_VALUE(parent, child, root_dir);
   newconf->hooks_env = INHERIT_VALUE(parent, child, hooks_env);
 

Modified: subversion/branches/move-tracking-2/subversion/mod_dav_svn/status.c
URL: 
http://svn.apache.org/viewvc/subversion/branches/move-tracking-2/subversion/mod_dav_svn/status.c?rev=1660173&r1=1660172&r2=1660173&view=diff
==============================================================================
--- subversion/branches/move-tracking-2/subversion/mod_dav_svn/status.c 
(original)
+++ subversion/branches/move-tracking-2/subversion/mod_dav_svn/status.c Mon Feb 
16 17:40:07 2015
@@ -57,7 +57,7 @@ int dav_svn__status(request_rec *r)
 
   ap_set_content_type(r, "text/html; charset=ISO-8859-1");
 
-  ap_rvputs(r, 
+  ap_rvputs(r,
             DOCTYPE_HTML_3_2
             "<html><head>\n"
             "<title>Apache SVN Status</title>\n"

Modified: subversion/branches/move-tracking-2/subversion/svn/auth-cmd.c
URL: 
http://svn.apache.org/viewvc/subversion/branches/move-tracking-2/subversion/svn/auth-cmd.c?rev=1660173&r1=1660172&r2=1660173&view=diff
==============================================================================
--- subversion/branches/move-tracking-2/subversion/svn/auth-cmd.c (original)
+++ subversion/branches/move-tracking-2/subversion/svn/auth-cmd.c Mon Feb 16 
17:40:07 2015
@@ -373,7 +373,7 @@ svn_cl__auth(apr_getopt_t *os, void *bat
             SVN_ERR(svn_cmdline_printf(pool,
                       _("Credentials cache in '%s' is empty\n"),
                       svn_dirent_local_style(config_path, pool)));
-          else 
+          else
             return svn_error_createf(SVN_ERR_ILLEGAL_TARGET, 0,
                                      _("Credentials cache in '%s' contains "
                                        "no matching credentials"),

Modified: subversion/branches/move-tracking-2/subversion/svn/cl-conflicts.c
URL: 
http://svn.apache.org/viewvc/subversion/branches/move-tracking-2/subversion/svn/cl-conflicts.c?rev=1660173&r1=1660172&r2=1660173&view=diff
==============================================================================
--- subversion/branches/move-tracking-2/subversion/svn/cl-conflicts.c (original)
+++ subversion/branches/move-tracking-2/subversion/svn/cl-conflicts.c Mon Feb 
16 17:40:07 2015
@@ -337,6 +337,27 @@ svn_cl__get_human_readable_tree_conflict
   return SVN_NO_ERROR;
 }
 
+svn_error_t *
+svn_cl__get_human_readable_action_description(
+        const char **desc,
+        svn_wc_conflict_action_t action,
+        svn_wc_operation_t operation,
+        svn_node_kind_t kind,
+        apr_pool_t *pool)
+{
+  const char *action_s, *operation_s;
+
+  action_s = incoming_action_str(kind, action);
+  operation_s = operation_str(operation);
+
+  SVN_ERR_ASSERT(operation_s);
+
+  *desc = apr_psprintf(pool, _("%s %s"),
+                       action_s, operation_s);
+
+  return SVN_NO_ERROR;
+}
+
 
 /* Helper for svn_cl__append_tree_conflict_info_xml().
  * Appends the attributes of the given VERSION to ATT_HASH.

Modified: subversion/branches/move-tracking-2/subversion/svn/cl-conflicts.h
URL: 
http://svn.apache.org/viewvc/subversion/branches/move-tracking-2/subversion/svn/cl-conflicts.h?rev=1660173&r1=1660172&r2=1660173&view=diff
==============================================================================
--- subversion/branches/move-tracking-2/subversion/svn/cl-conflicts.h (original)
+++ subversion/branches/move-tracking-2/subversion/svn/cl-conflicts.h Mon Feb 
16 17:40:07 2015
@@ -63,6 +63,16 @@ svn_cl__get_human_readable_tree_conflict
   const svn_wc_conflict_description2_t *conflict,
   apr_pool_t *pool);
 
+/* Like svn_cl__get_human_readable_tree_conflict_description but
+   for other conflict types */
+svn_error_t *
+svn_cl__get_human_readable_action_description(
+        const char **desc,
+        svn_wc_conflict_action_t action,
+        svn_wc_operation_t operation,
+        svn_node_kind_t kind,
+        apr_pool_t *pool);
+
 /**
  * Append to @a str an XML representation of the conflict data
  * for @a conflict, in a format suitable for 'svn info --xml'.

Modified: subversion/branches/move-tracking-2/subversion/svn/cl.h
URL: 
http://svn.apache.org/viewvc/subversion/branches/move-tracking-2/subversion/svn/cl.h?rev=1660173&r1=1660172&r2=1660173&view=diff
==============================================================================
--- subversion/branches/move-tracking-2/subversion/svn/cl.h (original)
+++ subversion/branches/move-tracking-2/subversion/svn/cl.h Mon Feb 16 17:40:07 
2015
@@ -248,6 +248,7 @@ typedef struct svn_cl__opt_state_t
   svn_boolean_t remove_ignored;    /* remove ignored items */
   svn_boolean_t no_newline;        /* do not output the trailing newline */
   svn_boolean_t show_passwords;    /* show cached passwords */
+  svn_boolean_t pin_externals;     /* pin externals to last-changed revisions 
*/
 } svn_cl__opt_state_t;
 
 

Modified: subversion/branches/move-tracking-2/subversion/svn/copy-cmd.c
URL: 
http://svn.apache.org/viewvc/subversion/branches/move-tracking-2/subversion/svn/copy-cmd.c?rev=1660173&r1=1660172&r2=1660173&view=diff
==============================================================================
--- subversion/branches/move-tracking-2/subversion/svn/copy-cmd.c (original)
+++ subversion/branches/move-tracking-2/subversion/svn/copy-cmd.c Mon Feb 16 
17:40:07 2015
@@ -167,8 +167,10 @@ svn_cl__copy(apr_getopt_t *os,
     SVN_ERR(svn_cl__make_log_msg_baton(&(ctx->log_msg_baton3), opt_state,
                                        NULL, ctx->config, pool));
 
-  err = svn_client_copy6(sources, dst_path, TRUE,
+  err = svn_client_copy7(sources, dst_path, TRUE,
                          opt_state->parents, opt_state->ignore_externals,
+                         opt_state->pin_externals,
+                         NULL, /* pin all externals */
                          opt_state->revprop_table,
                          (opt_state->quiet ? NULL : svn_cl__print_commit_info),
                          NULL,

Modified: subversion/branches/move-tracking-2/subversion/svn/info-cmd.c
URL: 
http://svn.apache.org/viewvc/subversion/branches/move-tracking-2/subversion/svn/info-cmd.c?rev=1660173&r1=1660172&r2=1660173&view=diff
==============================================================================
--- subversion/branches/move-tracking-2/subversion/svn/info-cmd.c (original)
+++ subversion/branches/move-tracking-2/subversion/svn/info-cmd.c Mon Feb 16 
17:40:07 2015
@@ -389,30 +389,18 @@ print_info(void *baton,
         SVN_ERR(svn_cmdline_printf(pool, _("Copied From Rev: %ld\n"),
                                    info->wc_info->copyfrom_rev));
       if (info->wc_info->moved_from_abspath)
-        {
-          const char *relpath;
-
-          relpath = svn_dirent_skip_ancestor(info->wc_info->wcroot_abspath,
-                                             
info->wc_info->moved_from_abspath);
-          if (relpath && relpath[0] != '\0')
-            SVN_ERR(svn_cmdline_printf(pool, _("Moved From: %s\n"), relpath));
-          else
-            SVN_ERR(svn_cmdline_printf(pool, _("Moved From: %s\n"),
-                                       info->wc_info->moved_from_abspath));
-        }
+        SVN_ERR(svn_cmdline_printf(pool, _("Moved From: %s\n"),
+                                   svn_cl__local_style_skip_ancestor(
+                                      path_prefix,
+                                      info->wc_info->moved_from_abspath,
+                                      pool)));
 
       if (info->wc_info->moved_to_abspath)
-        {
-          const char *relpath;
-
-          relpath = svn_dirent_skip_ancestor(info->wc_info->wcroot_abspath,
-                                             info->wc_info->moved_to_abspath);
-          if (relpath && relpath[0] != '\0')
-            SVN_ERR(svn_cmdline_printf(pool, _("Moved To: %s\n"), relpath));
-          else
-            SVN_ERR(svn_cmdline_printf(pool, _("Moved To: %s\n"),
-                                       info->wc_info->moved_to_abspath));
-        }
+        SVN_ERR(svn_cmdline_printf(pool, _("Moved To: %s\n"),
+                                   svn_cl__local_style_skip_ancestor(
+                                      path_prefix,
+                                      info->wc_info->moved_to_abspath,
+                                      pool)));
     }
 
   if (info->last_changed_author)
@@ -441,6 +429,7 @@ print_info(void *baton,
       if (info->wc_info->conflicts)
         {
           svn_boolean_t printed_prop_conflict_file = FALSE;
+          svn_boolean_t printed_tc = FALSE;
           int i;
 
           for (i = 0; i < info->wc_info->conflicts->nelts; i++)
@@ -479,12 +468,15 @@ print_info(void *baton,
                     if (! printed_prop_conflict_file)
                       SVN_ERR(svn_cmdline_printf(pool,
                                 _("Conflict Properties File: %s\n"),
-                                svn_dirent_local_style(conflict->their_abspath,
-                                                       pool)));
+                                svn_cl__local_style_skip_ancestor(
+                                        path_prefix,
+                                        conflict->prop_reject_abspath,
+                                        pool)));
                     printed_prop_conflict_file = TRUE;
                   break;
 
                   case svn_wc_conflict_kind_tree:
+                    printed_tc = TRUE;
                     SVN_ERR(
                         svn_cl__get_human_readable_tree_conflict_description(
                                                     &desc, conflict, pool));
@@ -506,6 +498,19 @@ print_info(void *baton,
                   APR_ARRAY_IDX(info->wc_info->conflicts, 0,
                                 const svn_wc_conflict_description2_t *);
 
+            if (!printed_tc)
+              {
+                const char *desc;
+
+                SVN_ERR(svn_cl__get_human_readable_action_description(&desc,
+                                        svn_wc_conflict_action_edit,
+                                        conflict->operation,
+                                        conflict->node_kind, pool));
+
+                SVN_ERR(svn_cmdline_printf(pool, "%s: %s\n",
+                                               _("Conflict Details"), desc));
+              }
+
             src_left_version =
                         svn_cl__node_description(conflict->src_left_version,
                                                  info->repos_root_URL, pool);

Modified: subversion/branches/move-tracking-2/subversion/svn/mergeinfo-cmd.c
URL: 
http://svn.apache.org/viewvc/subversion/branches/move-tracking-2/subversion/svn/mergeinfo-cmd.c?rev=1660173&r1=1660172&r2=1660173&view=diff
==============================================================================
--- subversion/branches/move-tracking-2/subversion/svn/mergeinfo-cmd.c 
(original)
+++ subversion/branches/move-tracking-2/subversion/svn/mergeinfo-cmd.c Mon Feb 
16 17:40:07 2015
@@ -240,7 +240,7 @@ mergeinfo_summary(
 
   target_is_wc = (! svn_path_is_url(target_path_or_url))
                  && (target_revision->kind == svn_opt_revision_unspecified
-                     || target_revision->kind == svn_opt_revision_working 
+                     || target_revision->kind == svn_opt_revision_working
                      || target_revision->kind == svn_opt_revision_base);
   SVN_ERR(svn_client_get_merging_summary(
             &is_reintegration,
@@ -304,10 +304,10 @@ mergeinfo_log(svn_boolean_t finding_merg
       baton->show_diff = FALSE;
       baton->depth = depth;
       baton->diff_extensions = NULL;
-      baton->merge_stack = NULL; 
+      baton->merge_stack = NULL;
       baton->search_patterns = NULL;
       baton->pool = pool;
-      log_receiver_baton = baton; 
+      log_receiver_baton = baton;
     }
   else
     {

Modified: subversion/branches/move-tracking-2/subversion/svn/notify.c
URL: 
http://svn.apache.org/viewvc/subversion/branches/move-tracking-2/subversion/svn/notify.c?rev=1660173&r1=1660172&r2=1660173&view=diff
==============================================================================
--- subversion/branches/move-tracking-2/subversion/svn/notify.c (original)
+++ subversion/branches/move-tracking-2/subversion/svn/notify.c Mon Feb 16 
17:40:07 2015
@@ -129,7 +129,7 @@ svn_cl__conflict_stats_resolved(svn_cl__
 static const char *
 remaining_str(apr_pool_t *pool, int n_remaining)
 {
-  return apr_psprintf(pool, Q_("%d remaining", 
+  return apr_psprintf(pool, Q_("%d remaining",
                                "%d remaining",
                                n_remaining),
                       n_remaining);

Modified: subversion/branches/move-tracking-2/subversion/svn/propget-cmd.c
URL: 
http://svn.apache.org/viewvc/subversion/branches/move-tracking-2/subversion/svn/propget-cmd.c?rev=1660173&r1=1660172&r2=1660173&view=diff
==============================================================================
--- subversion/branches/move-tracking-2/subversion/svn/propget-cmd.c (original)
+++ subversion/branches/move-tracking-2/subversion/svn/propget-cmd.c Mon Feb 16 
17:40:07 2015
@@ -490,7 +490,7 @@ svn_cl__propget(apr_getopt_t *os,
             {
               svn_error_t *err;
               err = svn_error_createf(SVN_ERR_PROPERTY_NOT_FOUND, NULL,
-                                      _("Property '%s' not found on '%s'"), 
+                                      _("Property '%s' not found on '%s'"),
                                       pname_utf8, target);
               svn_handle_warning2(stderr, err, "svn: ");
               svn_error_clear(err);

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=1660173&r1=1660172&r2=1660173&view=diff
==============================================================================
--- subversion/branches/move-tracking-2/subversion/svn/svn.c (original)
+++ subversion/branches/move-tracking-2/subversion/svn/svn.c Mon Feb 16 
17:40:07 2015
@@ -144,7 +144,8 @@ typedef enum svn_cl__longopt_t {
   opt_remove_unversioned,
   opt_remove_ignored,
   opt_no_newline,
-  opt_show_passwords
+  opt_show_passwords,
+  opt_pin_externals,
 } svn_cl__longopt_t;
 
 
@@ -418,6 +419,10 @@ const apr_getopt_option_t svn_cl__option
   {"remove-ignored", opt_remove_ignored, 0, N_("remove ignored items")},
   {"no-newline", opt_no_newline, 0, N_("do not output the trailing newline")},
   {"show-passwords", opt_show_passwords, 0, N_("show cached passwords")},
+  {"pin-externals", opt_pin_externals, 0,
+                       N_("pin externals with no explicit revision to their\n"
+                          "                             "
+                          "current revision (recommended when tagging)")},
 
   /* Long-opt Aliases
    *
@@ -498,7 +503,7 @@ const svn_opt_subcommand_desc2_t svn_cl_
     "  expand them.\n"),
     { opt_remove, opt_show_passwords },
     { {opt_remove, N_("remove matching authentication credentials")} }
-    
+
     },
 
   { "blame", svn_cl__blame, {"praise", "annotate", "ann"}, N_
@@ -608,7 +613,8 @@ const svn_opt_subcommand_desc2_t svn_cl_
      "  contact the repository.  As such, they may not, by default, be able\n"
      "  to propagate merge tracking information from the source of the copy\n"
      "  to the destination.\n"),
-    {'r', 'q', opt_ignore_externals, opt_parents, SVN_CL__LOG_MSG_OPTIONS} },
+    {'r', 'q', opt_ignore_externals, opt_parents, SVN_CL__LOG_MSG_OPTIONS,
+     opt_pin_externals} },
 
   { "delete", svn_cl__delete, {"del", "remove", "rm"}, N_
     ("Remove files and directories from version control.\n"
@@ -2390,6 +2396,9 @@ sub_main(int *exit_code, int argc, const
       case opt_show_passwords:
         opt_state.show_passwords = TRUE;
         break;
+      case opt_pin_externals:
+        opt_state.pin_externals = TRUE;
+        break;
       default:
         /* Hmmm. Perhaps this would be a good place to squirrel away
            opts that commands like svn diff might need. Hmmm indeed. */

Modified: subversion/branches/move-tracking-2/subversion/svn/util.c
URL: 
http://svn.apache.org/viewvc/subversion/branches/move-tracking-2/subversion/svn/util.c?rev=1660173&r1=1660172&r2=1660173&view=diff
==============================================================================
--- subversion/branches/move-tracking-2/subversion/svn/util.c (original)
+++ subversion/branches/move-tracking-2/subversion/svn/util.c Mon Feb 16 
17:40:07 2015
@@ -75,6 +75,13 @@ svn_cl__print_commit_info(const svn_comm
                           void *baton,
                           apr_pool_t *pool)
 {
+  /* Be very careful with returning errors from this callback as those
+     will be returned as errors from editor->close_edit(...), which may
+     cause callers to assume that the commit itself failed.
+
+     See log message of r1659867 and the svn_ra_get_commit_editor3
+     documentation for details on error scenarios. */
+
   if (SVN_IS_VALID_REVNUM(commit_info->revision))
     SVN_ERR(svn_cmdline_printf(pool, _("Committed revision %ld%s.\n"),
                                commit_info->revision,

Modified: subversion/branches/move-tracking-2/subversion/svnadmin/svnadmin.c
URL: 
http://svn.apache.org/viewvc/subversion/branches/move-tracking-2/subversion/svnadmin/svnadmin.c?rev=1660173&r1=1660172&r2=1660173&view=diff
==============================================================================
--- subversion/branches/move-tracking-2/subversion/svnadmin/svnadmin.c 
(original)
+++ subversion/branches/move-tracking-2/subversion/svnadmin/svnadmin.c Mon Feb 
16 17:40:07 2015
@@ -906,7 +906,7 @@ repos_notify_handler(void *baton,
           if (b->error_summary && notify->revision != SVN_INVALID_REVNUM)
             {
               struct verification_error *verr;
-              
+
               verr = apr_palloc(b->result_pool, sizeof(*verr));
               verr->rev = notify->revision;
               verr->err = svn_error_dup(notify->err);
@@ -1880,7 +1880,7 @@ subcommand_verify(apr_getopt_t *os, void
           struct verification_error *verr;
           svn_error_t *err;
           const char *rev_str;
-          
+
           svn_pool_clear(iterpool);
 
           verr = APR_ARRAY_IDX(notify_baton.error_summary, i,
@@ -1892,7 +1892,7 @@ subcommand_verify(apr_getopt_t *os, void
             {
               char buf[512];
               const char *message;
-              
+
               message = svn_err_best_message(err, buf, sizeof(buf));
               svn_error_clear(svn_stream_printf(notify_baton.feedback_stream,
                                                 iterpool,

Modified: 
subversion/branches/move-tracking-2/subversion/svndumpfilter/svndumpfilter.c
URL: 
http://svn.apache.org/viewvc/subversion/branches/move-tracking-2/subversion/svndumpfilter/svndumpfilter.c?rev=1660173&r1=1660172&r2=1660173&view=diff
==============================================================================
--- 
subversion/branches/move-tracking-2/subversion/svndumpfilter/svndumpfilter.c 
(original)
+++ 
subversion/branches/move-tracking-2/subversion/svndumpfilter/svndumpfilter.c 
Mon Feb 16 17:40:07 2015
@@ -278,7 +278,7 @@ struct node_baton_t
   svn_filesize_t tcl;
 
   /* Pointers to dumpfile data. */
-  apr_array_header_t *headers;
+  svn_repos__dumpfile_headers_t *headers;
   svn_stringbuf_t *props;
 
   /* Expect deltas? */

Modified: subversion/branches/move-tracking-2/subversion/svnrdump/dump_editor.c
URL: 
http://svn.apache.org/viewvc/subversion/branches/move-tracking-2/subversion/svnrdump/dump_editor.c?rev=1660173&r1=1660172&r2=1660173&view=diff
==============================================================================
--- subversion/branches/move-tracking-2/subversion/svnrdump/dump_editor.c 
(original)
+++ subversion/branches/move-tracking-2/subversion/svnrdump/dump_editor.c Mon 
Feb 16 17:40:07 2015
@@ -58,7 +58,7 @@ struct dir_baton
   svn_revnum_t copyfrom_rev;
 
   /* Headers accumulated so far for this directory */
-  apr_array_header_t *headers;
+  svn_repos__dumpfile_headers_t *headers;
 
   /* Properties which were modified during change_dir_prop. */
   apr_hash_t *props;
@@ -72,9 +72,8 @@ struct dir_baton
      us, although they're all really within this directory. */
   apr_hash_t *deleted_entries;
 
-  /* Flags to trigger dumping props and record termination newlines. */
+  /* Flag to trigger dumping props. */
   svn_boolean_t dump_props;
-  svn_boolean_t dump_newlines;
 };
 
 /* A file baton used by all file-related callback functions in the dump
@@ -223,7 +222,7 @@ make_file_baton(const char *path,
  * content section, to represent the property delta of PROPS/DELETED_PROPS.
  */
 static svn_error_t *
-get_props_content(apr_array_header_t *headers,
+get_props_content(svn_repos__dumpfile_headers_t *headers,
                   svn_stringbuf_t **content,
                   apr_hash_t *props,
                   apr_hash_t *deleted_props,
@@ -262,7 +261,8 @@ dump_node_delete(svn_stream_t *stream,
                  const char *node_relpath,
                  apr_pool_t *pool)
 {
-  apr_array_header_t *headers = svn_repos__dumpfile_headers_create(pool);
+  svn_repos__dumpfile_headers_t *headers
+    = svn_repos__dumpfile_headers_create(pool);
 
   assert(svn_relpath_is_canonical(node_relpath));
 
@@ -274,7 +274,9 @@ dump_node_delete(svn_stream_t *stream,
   svn_repos__dumpfile_header_push(
     headers, SVN_REPOS_DUMPFILE_NODE_ACTION, "delete");
 
-  SVN_ERR(svn_repos__dump_headers(stream, headers, TRUE, pool));
+  SVN_ERR(svn_repos__dump_node_record(stream, headers,
+                                      NULL, FALSE, 0,  /* props & text */
+                                      FALSE /*content_length_always*/, pool));
   return SVN_NO_ERROR;
 }
 
@@ -296,7 +298,7 @@ dump_node_delete(svn_stream_t *stream,
  * header block.)
  */
 static svn_error_t *
-dump_node(apr_array_header_t **headers_p,
+dump_node(svn_repos__dumpfile_headers_t **headers_p,
           struct dump_edit_baton *eb,
           const char *repos_relpath,
           struct dir_baton *db,
@@ -308,7 +310,8 @@ dump_node(apr_array_header_t **headers_p
           apr_pool_t *pool)
 {
   const char *node_relpath = repos_relpath;
-  apr_array_header_t *headers = svn_repos__dumpfile_headers_create(pool);
+  svn_repos__dumpfile_headers_t *headers
+    = svn_repos__dumpfile_headers_create(pool);
 
   assert(svn_relpath_is_canonical(repos_relpath));
   assert(!copyfrom_path || svn_relpath_is_canonical(copyfrom_path));
@@ -394,16 +397,6 @@ dump_node(apr_array_header_t **headers_p
             headers, SVN_REPOS_DUMPFILE_NODE_COPYFROM_REV, "%ld", 
copyfrom_rev);
           svn_repos__dumpfile_header_push(
             headers, SVN_REPOS_DUMPFILE_NODE_COPYFROM_PATH, copyfrom_path);
-
-          /* Ugly hack: If a directory was copied from a previous
-             revision, nothing like close_file() will be called to write two
-             blank lines. If change_dir_prop() is called, props are dumped
-             (along with the necessary PROPS-END\n\n and we're good. So
-             set DUMP_NEWLINES here to print the newlines unless
-             change_dir_prop() is called next otherwise the `svnadmin load`
-             parser will fail.  */
-          if (db)
-            db->dump_newlines = TRUE;
         }
       else
         {
@@ -445,7 +438,8 @@ dump_mkdir(struct dump_edit_baton *eb,
            apr_pool_t *pool)
 {
   svn_stringbuf_t *prop_content;
-  apr_array_header_t *headers = svn_repos__dumpfile_headers_create(pool);
+  svn_repos__dumpfile_headers_t *headers
+    = svn_repos__dumpfile_headers_create(pool);
 
   /* Node-path: ... */
   svn_repos__dumpfile_header_push(
@@ -496,25 +490,18 @@ dump_pending_dir(struct dump_edit_baton
                                       FALSE, 0, FALSE 
/*content_length_always*/,
                                       scratch_pool));
 
+  /* No text is going to be dumped. Write a couple of newlines and
+       wait for the next node/ revision. */
+  SVN_ERR(svn_stream_puts(eb->stream, "\n\n"));
+
   if (db->dump_props)
     {
-      /* No text is going to be dumped. Write a couple of newlines and
-         wait for the next node/ revision. */
-      SVN_ERR(svn_stream_puts(eb->stream, "\n\n"));
-
       /* Cleanup so that data is never dumped twice. */
       apr_hash_clear(db->props);
       apr_hash_clear(db->deleted_props);
       db->dump_props = FALSE;
     }
 
-  /* Some pending newlines to dump? */
-  if (db->dump_newlines)
-    {
-      SVN_ERR(svn_stream_puts(eb->stream, "\n\n"));
-      db->dump_newlines = FALSE;
-    }
-
   /* Anything that was pending is pending no longer. */
   eb->pending_db = NULL;
 
@@ -828,9 +815,7 @@ change_dir_prop(void *parent_baton,
   else
     svn_hash_sets(db->deleted_props, apr_pstrdup(db->pool, name), "");
 
-  /* Make sure we eventually output the props, and disable printing
-     a couple of extra newlines */
-  db->dump_newlines = FALSE;
+  /* Make sure we eventually output the props */
   db->dump_props = TRUE;
 
   return SVN_NO_ERROR;
@@ -896,7 +881,7 @@ close_file(void *file_baton,
   struct dump_edit_baton *eb = fb->eb;
   apr_finfo_t *info = apr_pcalloc(pool, sizeof(apr_finfo_t));
   svn_stringbuf_t *propstring = NULL;
-  apr_array_header_t *headers;
+  svn_repos__dumpfile_headers_t *headers;
 
   SVN_ERR(dump_pending_dir(eb, pool));
 

Modified: subversion/branches/move-tracking-2/subversion/svnserve/logger.c
URL: 
http://svn.apache.org/viewvc/subversion/branches/move-tracking-2/subversion/svnserve/logger.c?rev=1660173&r1=1660172&r2=1660173&view=diff
==============================================================================
--- subversion/branches/move-tracking-2/subversion/svnserve/logger.c (original)
+++ subversion/branches/move-tracking-2/subversion/svnserve/logger.c Mon Feb 16 
17:40:07 2015
@@ -58,7 +58,7 @@ logger__create_for_stderr(logger_t **log
 {
   logger_t *result = apr_pcalloc(pool, sizeof(*result));
   result->pool = svn_pool_create(pool);
-  
+
   SVN_ERR(svn_stream_for_stderr(&result->stream, pool));
   SVN_ERR(svn_mutex__init(&result->mutex, TRUE, pool));
 
@@ -74,7 +74,7 @@ logger__create(logger_t **logger,
 {
   logger_t *result = apr_pcalloc(pool, sizeof(*result));
   apr_file_t *file;
-  
+
   SVN_ERR(svn_io_file_open(&file, filename,
                            APR_WRITE | APR_CREATE | APR_APPEND,
                            APR_OS_DEFAULT, pool));
@@ -145,7 +145,7 @@ logger__log_error(logger_t *logger,
         }
 
       svn_pool_clear(logger->pool);
-      
+
       svn_error_clear(svn_mutex__unlock(logger->mutex, SVN_NO_ERROR));
     }
 }

Modified: subversion/branches/move-tracking-2/subversion/svnserve/serve.c
URL: 
http://svn.apache.org/viewvc/subversion/branches/move-tracking-2/subversion/svnserve/serve.c?rev=1660173&r1=1660172&r2=1660173&view=diff
==============================================================================
--- subversion/branches/move-tracking-2/subversion/svnserve/serve.c (original)
+++ subversion/branches/move-tracking-2/subversion/svnserve/serve.c Mon Feb 16 
17:40:07 2015
@@ -2179,7 +2179,7 @@ static svn_error_t *log_receiver(void *b
         }
     }
   SVN_ERR(svn_ra_svn__end_list(conn, pool));
-  
+
   /* send LOG_ENTRY main members */
   SVN_ERR(svn_ra_svn__write_data_log_entry(conn, pool,
                                            log_entry->revision,
@@ -2856,7 +2856,7 @@ static svn_error_t *lock_many(svn_ra_svn
                                           &current_rev);
       if (write_err)
         break;
-      
+
       full_path = svn_fspath__join(b->repository->fs_path->data,
                                    svn_relpath_canonicalize(path, subpool),
                                    subpool);
@@ -3755,7 +3755,7 @@ construct_server_baton(server_baton_t **
   server_baton_t *b = apr_pcalloc(conn_pool, sizeof(*b));
   fs_warning_baton_t *warn_baton;
   svn_stringbuf_t *cap_log = svn_stringbuf_create_empty(scratch_pool);
-  
+
   b->repository = apr_pcalloc(conn_pool, sizeof(*b->repository));
   b->repository->username_case = params->username_case;
   b->repository->base = params->base;
@@ -3857,7 +3857,7 @@ construct_server_baton(server_baton_t **
   err = handle_config_error(find_repos(client_url, params->root, b->vhost,
                                        b->read_only, params->cfg,
                                        b->repository, params->config_pool,
-                                       params->authz_pool, params->fs_config, 
+                                       params->authz_pool, params->fs_config,
                                        conn_pool, scratch_pool),
                             b);
   if (!err)

Modified: subversion/branches/move-tracking-2/subversion/svnserve/server.h
URL: 
http://svn.apache.org/viewvc/subversion/branches/move-tracking-2/subversion/svnserve/server.h?rev=1660173&r1=1660172&r2=1660173&view=diff
==============================================================================
--- subversion/branches/move-tracking-2/subversion/svnserve/server.h (original)
+++ subversion/branches/move-tracking-2/subversion/svnserve/server.h Mon Feb 16 
17:40:07 2015
@@ -40,7 +40,7 @@ extern "C" {
 #include "private/svn_mutex.h"
 #include "private/svn_repos_private.h"
 #include "private/svn_subr_private.h"
-  
+
 enum username_case_type { CASE_FORCE_UPPER, CASE_FORCE_LOWER, CASE_ASIS };
 
 enum authn_type { UNAUTHENTICATED, AUTHENTICATED };
@@ -70,7 +70,7 @@ typedef struct repository_t {
 
   enum access_type auth_access; /* access granted to authenticated users */
   enum access_type anon_access; /* access granted to annonymous users */
-  
+
 } repository_t;
 
 typedef struct client_info_t {
@@ -186,7 +186,7 @@ typedef struct connection_t
      the new thread decrease it and when it reaches 0 the pool can be
      released.  */
   svn_atomic_t ref_count;
-  
+
 } connection_t;
 
 /* Return a client_info_t structure allocated in POOL and initialize it

Modified: subversion/branches/move-tracking-2/subversion/svnserve/svnserve.c
URL: 
http://svn.apache.org/viewvc/subversion/branches/move-tracking-2/subversion/svnserve/svnserve.c?rev=1660173&r1=1660172&r2=1660173&view=diff
==============================================================================
--- subversion/branches/move-tracking-2/subversion/svnserve/svnserve.c 
(original)
+++ subversion/branches/move-tracking-2/subversion/svnserve/svnserve.c Mon Feb 
16 17:40:07 2015
@@ -126,7 +126,7 @@ enum run_mode {
  *
  * Since very slow connections will hog a full thread for a potentially
  * long time before timing out, be sure to not set this limit too low.
- * 
+ *
  * On the other hand, keep in mind that every thread will allocate up to
  * 4MB of unused RAM in the APR allocator of its root pool.  32 bit servers
  * must hence do with fewer threads.
@@ -150,7 +150,7 @@ enum run_mode {
  *
  * Larger values improve scalability with lots of small requests coming
  * on over long latency networks.
- * 
+ *
  * The OS may actually use a lower limit than specified here.
  */
 #define ACCEPT_BACKLOG 128
@@ -475,7 +475,7 @@ static apr_status_t redirect_stdout(void
 /* Wait for the next client connection to come in from SOCK.  Allocate
  * the connection in a root pool from CONNECTION_POOLS and assign PARAMS.
  * Return the connection object in *CONNECTION.
- * 
+ *
  * Use HANDLING_MODE for proper internal cleanup.
  */
 static svn_error_t *
@@ -486,30 +486,30 @@ accept_connection(connection_t **connect
                   apr_pool_t *pool)
 {
   apr_status_t status;
-  
+
   /* Non-standard pool handling.  The main thread never blocks to join
    *         the connection threads so it cannot clean up after each one.  So
    *         separate pools that can be cleared at thread exit are used. */
-  
+
   apr_pool_t *connection_pool = svn_pool_create(pool);
   *connection = apr_pcalloc(connection_pool, sizeof(**connection));
   (*connection)->pool = connection_pool;
   (*connection)->params = params;
   (*connection)->ref_count = 1;
-  
+
   do
     {
       #ifdef WIN32
       if (winservice_is_stopping())
         exit(0);
       #endif
-      
+
       status = apr_socket_accept(&(*connection)->usock, sock,
                                  connection_pool);
       if (handling_mode == connection_mode_fork)
         {
           apr_proc_t proc;
-          
+
           /* Collect any zombie child processes. */
           while (apr_proc_wait_all_procs(&proc, NULL, NULL, APR_NOWAIT,
             connection_pool) == APR_CHILD_DONE)
@@ -519,7 +519,7 @@ accept_connection(connection_t **connect
   while (APR_STATUS_IS_EINTR(status)
     || APR_STATUS_IS_ECONNABORTED(status)
     || APR_STATUS_IS_ECONNRESET(status));
-  
+
   return status
        ? svn_error_wrap_apr(status, _("Can't accept client connection"))
        : SVN_NO_ERROR;
@@ -611,7 +611,7 @@ static void * APR_THREAD_FUNC serve_thre
     close_connection(connection);
   else
     apr_thread_pool_push(threads, serve_thread, connection, 0, NULL);
-    
+
   return NULL;
 }
 
@@ -983,7 +983,7 @@ sub_main(int *exit_code, int argc, const
   svn_hash_sets(params.fs_config, SVN_FS_CONFIG_FSFS_CACHE_REVPROPS,
                 cache_revprops ? "2" :"0");
   svn_hash_sets(params.fs_config, SVN_FS_CONFIG_FSFS_BLOCK_READ,
-                use_block_read ? "1" :"0");  
+                use_block_read ? "1" :"0");
 
   SVN_ERR(svn_repos__config_pool_create(&params.config_pool,
                                         is_multi_threaded,
@@ -1001,7 +1001,7 @@ sub_main(int *exit_code, int argc, const
 
       SVN_ERR(svn_repos__config_pool_get(&params.cfg, NULL,
                                          params.config_pool,
-                                         config_filename, 
+                                         config_filename,
                                          TRUE, /* must_exist */
                                          FALSE, /* names_case_sensitive */
                                          NULL,

Modified: 
subversion/branches/move-tracking-2/subversion/tests/cmdline/blame_tests.py
URL: 
http://svn.apache.org/viewvc/subversion/branches/move-tracking-2/subversion/tests/cmdline/blame_tests.py?rev=1660173&r1=1660172&r2=1660173&view=diff
==============================================================================
--- subversion/branches/move-tracking-2/subversion/tests/cmdline/blame_tests.py 
(original)
+++ subversion/branches/move-tracking-2/subversion/tests/cmdline/blame_tests.py 
Mon Feb 16 17:40:07 2015
@@ -951,12 +951,12 @@ def blame_youngest_to_oldest(sbox):
   line = "New contents for iota\n"
   svntest.main.file_append(iota, line)
   sbox.simple_commit()
-  
+
   # Move the file, to check that the operation will peg correctly.
   iota_moved = sbox.ospath('iota_moved')
   sbox.simple_move('iota', 'iota_moved')
   sbox.simple_commit()
-  
+
   # Delete a line.
   open(iota_moved, 'w').write(line)
   sbox.simple_commit()

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=1660173&r1=1660172&r2=1660173&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 Feb 16 17:40:07 2015
@@ -707,7 +707,7 @@ def checkout_peg_rev_date(sbox):
                                           expected_output,
                                           expected_wc)
 
-  # now try another checkout with repo@r1_string 
+  # now try another checkout with repo@r1_string
   checkout_target = sbox.add_wc_path('checkout2')
   os.mkdir(checkout_target)
 
@@ -1160,9 +1160,9 @@ def checkout_wc_from_drive(sbox):
       'D/G/tau'   : Item(contents="This is the file 'tau'.\n"),
       'D/G/pi'    : Item(contents="This is the file 'pi'.\n"),
       'D/gamma'   : Item(contents="This is the file 'gamma'.\n"),
-      'mu'        : Item(contents="This is the file 'mu'.\n"),    
+      'mu'        : Item(contents="This is the file 'mu'.\n"),
     })
-    
+
     svntest.actions.run_and_verify_checkout(repo_url + '/A', wc2_dir,
                                             expected_output, expected_wc,
                                             None, None, None, None)
@@ -1187,7 +1187,7 @@ def checkout_wc_from_drive(sbox):
       'G/pi'    : Item(contents="This is the file 'pi'.\n"),
       'G/tau'   : Item(contents="This is the file 'tau'.\n"),
       'G/rho'   : Item(contents="This is the file 'rho'.\n"),
-      'gamma'   : Item(contents="This is the file 'gamma'.\n"),    
+      'gamma'   : Item(contents="This is the file 'gamma'.\n"),
     })
 
     svntest.actions.run_and_verify_checkout(repo_url + '/A/D', wc3_dir,

Modified: 
subversion/branches/move-tracking-2/subversion/tests/cmdline/commit_tests.py
URL: 
http://svn.apache.org/viewvc/subversion/branches/move-tracking-2/subversion/tests/cmdline/commit_tests.py?rev=1660173&r1=1660172&r2=1660173&view=diff
==============================================================================
--- 
subversion/branches/move-tracking-2/subversion/tests/cmdline/commit_tests.py 
(original)
+++ 
subversion/branches/move-tracking-2/subversion/tests/cmdline/commit_tests.py 
Mon Feb 16 17:40:07 2015
@@ -2931,17 +2931,17 @@ def last_changed_of_copied_subdir(sbox):
 
 def commit_unversioned(sbox):
   "verify behavior on unversioned targets"
-  
+
   sbox.build(read_only=True)
   wc_dir = sbox.wc_dir
-  
+
   expected_err = 'E200009: .*existing.*\' is not under version control'
 
   # Unversioned, but existing file
-  svntest.main.file_write(sbox.ospath('existing'), "xxxx")  
+  svntest.main.file_write(sbox.ospath('existing'), "xxxx")
   svntest.actions.run_and_verify_commit(wc_dir, None, None, expected_err,
                                          sbox.ospath('existing'))
-  
+
   # Unversioned, not existing
   svntest.actions.run_and_verify_commit(wc_dir, None, None, expected_err,
                                          sbox.ospath('not-existing'))

Modified: 
subversion/branches/move-tracking-2/subversion/tests/cmdline/dav-mirror-autocheck.sh
URL: 
http://svn.apache.org/viewvc/subversion/branches/move-tracking-2/subversion/tests/cmdline/dav-mirror-autocheck.sh?rev=1660173&r1=1660172&r2=1660173&view=diff
==============================================================================
--- 
subversion/branches/move-tracking-2/subversion/tests/cmdline/dav-mirror-autocheck.sh
 (original)
+++ 
subversion/branches/move-tracking-2/subversion/tests/cmdline/dav-mirror-autocheck.sh
 Mon Feb 16 17:40:07 2015
@@ -23,7 +23,7 @@
 # to the slave.  The test should be able to throw all kinds
 # of svn operations at one or the other, and master/slave
 # verified as identical in the end.
-# 
+#
 # Master / slave setup is achieved in a single httpd process
 # using virtual hosts bound to different addresses on the
 # loopback network (127.0.0.1, 127.0.0.2) for slave and
@@ -34,7 +34,7 @@
 # http://subversion.tigris.org/issues/show_bug.cgi?id=2939
 # But of course, any svn traffic liable to break over
 # mirroring would be a good addition.
-# 
+#
 # Most of the httpd setup was lifted from davautocheck.sh.
 # The common boilerplate snippets to setup/start/stop httpd
 # between the two could be factored out and shared.
@@ -95,7 +95,7 @@ function get_prog_name() {
   return 1
 }
 
-# splat out httpd config 
+# splat out httpd config
 function setup_config() {
 
   say "setting up config: " $1
@@ -152,7 +152,7 @@ CustomLog           "${HTTPD_ROOT}/ops"
   ServerName ${SLAVE_HOST}
   CustomLog           "${HTTPD_ROOT}/slave_access_log" common
   ErrorLog            "${HTTPD_ROOT}/slave_error_log"
-# slave 'normal' location  
+# slave 'normal' location
   <Location "/${SLAVE_LOCATION}">
     DAV               svn
     SVNPath           "${SLAVE_REPOS}"
@@ -196,7 +196,7 @@ function usage() {
   echo
   echo " " '<test-work-directory>' must not exist, \
     I will not clobber it for you 1>&2
-  exit 1  
+  exit 1
 }
 ### Start execution here ###
 
@@ -403,7 +403,7 @@ $SVNSYNC initialize --non-interactive "$
 #
 # reproducible test case from:
 # http://subversion.tigris.org/issues/show_bug.cgi?id=2939
-# 
+#
 BASE_URL="$SLAVE_URL"
 say running svnmucc test to $BASE_URL
 svnmucc="$SVNMUCC --non-interactive --username jrandom --password rayjandom 
-mm"
@@ -492,7 +492,7 @@ say "Some house-keeping..."
 say "Re-activating the post-commit hook on the master repo: $MASTER_REPOS."
 mv "$MASTER_REPOS/hooks/post-commit_" "$MASTER_REPOS/hooks/post-commit"
 say "Syncing slave with master."
-$SVNSYNC --non-interactive sync "$SYNC_URL" --username=svnsync 
--password=svnsync 
+$SVNSYNC --non-interactive sync "$SYNC_URL" --username=svnsync 
--password=svnsync
 # shut it down
 echo -n "${SCRIPT}: stopping httpd: "
 $HTTPD -f $HTTPD_CONFIG -k stop

Modified: 
subversion/branches/move-tracking-2/subversion/tests/cmdline/davautocheck.sh
URL: 
http://svn.apache.org/viewvc/subversion/branches/move-tracking-2/subversion/tests/cmdline/davautocheck.sh?rev=1660173&r1=1660172&r2=1660173&view=diff
==============================================================================
--- 
subversion/branches/move-tracking-2/subversion/tests/cmdline/davautocheck.sh 
(original)
+++ 
subversion/branches/move-tracking-2/subversion/tests/cmdline/davautocheck.sh 
Mon Feb 16 17:40:07 2015
@@ -62,7 +62,7 @@
 # one version's client against another version's server) specify both APXS
 # *and* MODULE_PATH for the other server:
 #
-#   APXS=/opt/svn/1.4.x/bin/apxs MODULE_PATH=/opt/svn/1.4.x/modules \ 
+#   APXS=/opt/svn/1.4.x/bin/apxs MODULE_PATH=/opt/svn/1.4.x/modules \
 #     subversion/tests/cmdline/davautocheck.sh
 #
 # To prevent the server from advertising httpv2, pass USE_HTTPV1 in
@@ -71,7 +71,7 @@
 # To enable "SVNCacheRevProps on" set CACHE_REVPROPS in the environment.
 #
 # To test over https set USE_SSL in the environment.
-# 
+#
 # To use value for "SVNPathAuthz" directive set SVN_PATH_AUTHZ with
 # appropriate value in the environment.
 #
@@ -114,7 +114,7 @@ query() {
   if [ -n "$BASH_VERSION" ]; then
     read -n 1 -t 32
   else
-    # 
+    #
     prog="
 import select as s
 import sys
@@ -163,7 +163,7 @@ get_prog_name() {
 }
 
 # Don't assume sbin is in the PATH.
-# ### Presumably this is used to locate /usr/sbin/apxs or /usr/sbin/apache2    
+# ### Presumably this is used to locate /usr/sbin/apxs or /usr/sbin/apache2
 PATH="$PATH:/usr/sbin:/usr/local/sbin"
 
 # Find the source and build directories. The build dir can be found if it is

Modified: 
subversion/branches/move-tracking-2/subversion/tests/cmdline/export_tests.py
URL: 
http://svn.apache.org/viewvc/subversion/branches/move-tracking-2/subversion/tests/cmdline/export_tests.py?rev=1660173&r1=1660172&r2=1660173&view=diff
==============================================================================
--- 
subversion/branches/move-tracking-2/subversion/tests/cmdline/export_tests.py 
(original)
+++ 
subversion/branches/move-tracking-2/subversion/tests/cmdline/export_tests.py 
Mon Feb 16 17:40:07 2015
@@ -1016,18 +1016,18 @@ def export_file_external(sbox):
 @Issue(4427)
 def export_file_externals2(sbox):
   "exporting file externals"
-  
+
   sbox.build()
   sbox.simple_mkdir('DIR', 'DIR2')
-  
+
   sbox.simple_propset('svn:externals', '^/iota file', 'DIR')
   sbox.simple_propset('svn:externals', '^/DIR TheDir', 'DIR2')
   sbox.simple_commit()
   sbox.simple_update()
-  
+
   tmp = sbox.add_wc_path('tmp')
   os.mkdir(tmp)
-  
+
   expected_output = svntest.wc.State(tmp, {
     'file'          : Item(status='A '),
   })
@@ -1040,7 +1040,7 @@ def export_file_externals2(sbox):
                                         tmp,
                                         expected_output,
                                         expected_disk)
-  
+
   expected_output = svntest.wc.State(tmp, {
     'DIR/file'           : Item(status='A '),
   })
@@ -1052,7 +1052,7 @@ def export_file_externals2(sbox):
                                         os.path.join(tmp, 'DIR'),
                                         expected_output,
                                         expected_disk)
-                                        
+
   expected_output = svntest.wc.State(tmp, {
     'DIR2/TheDir/file' : Item(status='A '),
   })

Modified: 
subversion/branches/move-tracking-2/subversion/tests/cmdline/externals_tests.py
URL: 
http://svn.apache.org/viewvc/subversion/branches/move-tracking-2/subversion/tests/cmdline/externals_tests.py?rev=1660173&r1=1660172&r2=1660173&view=diff
==============================================================================
--- 
subversion/branches/move-tracking-2/subversion/tests/cmdline/externals_tests.py 
(original)
+++ 
subversion/branches/move-tracking-2/subversion/tests/cmdline/externals_tests.py 
Mon Feb 16 17:40:07 2015
@@ -3343,7 +3343,6 @@ def file_external_versioned_obstruction(
                                         expected_status)
 
 @Issue(4495)
-@XFail()
 def update_external_peg_rev(sbox):
   "update external peg rev"
 
@@ -3437,7 +3436,7 @@ def update_deletes_file_external(sbox):
   # As of r1448345, this update fails:
   # E000002: Can't remove directory '.../A_copy/C': No such file or directory
   sbox.simple_update()
-  
+
 
 @Issue(4519)
 def switch_relative_externals(sbox):
@@ -3541,6 +3540,540 @@ def replace_tree_with_foreign_external(s
                                         None, None, None, None, None, 1,
                                         '-r', '2', wc_dir)
 
+
+def verify_pinned_externals(sbox, external_url_for, base_path_or_url,
+                            external_youngest_rev, 
other_external_youngest_rev):
+  "helper for pin-externals tests"
+
+  expected_output = [
+    '%s@%d gamma\n' % (external_url_for["A/B/gamma"],
+                       external_youngest_rev),
+    '\n',
+  ]
+  if svntest.sandbox.is_url(base_path_or_url):
+    target = base_path_or_url + '/A_copy/B'
+  else:
+    target = sbox.ospath('A_copy/B')
+  svntest.actions.run_and_verify_svn(expected_output, [],
+                                     'propget', 'svn:externals',
+                                     target)
+  expected_output = [
+    'exdir_G -r%d %s\n' % (other_external_youngest_rev,
+                           external_url_for["A/C/exdir_G"]),
+    '%s exdir_H\n' % external_url_for["A/C/exdir_H"],
+    '\n',
+  ]
+  if svntest.sandbox.is_url(base_path_or_url):
+    target = base_path_or_url + '/A_copy/C'
+  else:
+    target = sbox.ospath('A_copy/C')
+  svntest.actions.run_and_verify_svn(expected_output, [],
+                                     'propget', 'svn:externals',
+                                     target)
+  expected_output = [
+    '%s@%d exdir_A\n' % (external_url_for["A/D/exdir_A"],
+                         other_external_youngest_rev),
+    '%s@%d exdir_A/G\n' % (external_url_for["A/D/exdir_A/G/"],
+                           other_external_youngest_rev),
+    'exdir_A/H -r1 %s\n' % external_url_for["A/D/exdir_A/H"],
+    '%s@%d x/y/z/blah\n' % (external_url_for["A/D/x/y/z/blah"],
+                            other_external_youngest_rev),
+    '\n',
+  ]
+  if svntest.sandbox.is_url(base_path_or_url):
+    target = base_path_or_url + '/A_copy/D'
+  else:
+    target = sbox.ospath('A_copy/D')
+  svntest.actions.run_and_verify_svn(expected_output, [],
+                                     'propget', 'svn:externals',
+                                     target)
+
+
+def copy_pin_externals_repos_repos(sbox):
+  "svn copy --pin-externals repos->repos"
+
+  external_url_for = externals_test_setup(sbox)
+
+  repo_url       = sbox.repo_url
+  repo_dir       = sbox.repo_dir
+  other_repo_dir = repo_dir + ".other"
+
+  external_youngest_rev = svntest.main.youngest(repo_dir)
+  other_external_youngest_rev = svntest.main.youngest(other_repo_dir)
+
+  # Perform a repos->repos copy, pinning externals
+  svntest.actions.run_and_verify_svn(None, [],
+                                     'copy',
+                                     repo_url + '/A',
+                                     repo_url + '/A_copy',
+                                     '-m', 'copy',
+                                     '--pin-externals')
+  verify_pinned_externals(sbox, external_url_for, repo_url,
+                          external_youngest_rev, other_external_youngest_rev)
+
+
+def copy_pin_externals_repos_wc(sbox):
+  "svn copy --pin-externals repos->wc"
+
+  external_url_for = externals_test_setup(sbox)
+
+  wc_dir         = sbox.wc_dir
+  repo_url       = sbox.repo_url
+  repo_dir       = sbox.repo_dir
+  other_repo_dir = repo_dir + ".other"
+
+  external_youngest_rev = svntest.main.youngest(repo_dir)
+  other_external_youngest_rev = svntest.main.youngest(other_repo_dir)
+
+  # Create a working copy.
+  svntest.actions.run_and_verify_svn(None, [],
+                                     'checkout',
+                                     repo_url, wc_dir)
+
+  # Perform a repos->wc copy, pinning externals
+  external_youngest_rev = svntest.main.youngest(repo_dir)
+  svntest.actions.run_and_verify_svn(None, [],
+                                     'copy',
+                                     repo_url + '/A',
+                                     os.path.join(wc_dir, 'A_copy'),
+                                     '--pin-externals')
+  verify_pinned_externals(sbox, external_url_for, wc_dir,
+                          external_youngest_rev, other_external_youngest_rev)
+
+
+def copy_pin_externals_wc_repos(sbox):
+  "svn copy --pin-externals wc->repos"
+
+  external_url_for = externals_test_setup(sbox)
+
+  wc_dir         = sbox.wc_dir
+  repo_url       = sbox.repo_url
+  repo_dir       = sbox.repo_dir
+  other_repo_dir = repo_dir + ".other"
+
+  external_youngest_rev = svntest.main.youngest(repo_dir)
+  other_external_youngest_rev = svntest.main.youngest(other_repo_dir)
+
+  # Create a working copy.
+  svntest.actions.run_and_verify_svn(None, [],
+                                     'checkout',
+                                     repo_url, wc_dir)
+
+  # Perform a wc->repos copy, pinning externals
+  svntest.actions.run_and_verify_svn(None, [],
+                                     'copy',
+                                     os.path.join(wc_dir, 'A'),
+                                     repo_url + '/A_copy',
+                                     '-m', 'copy',
+                                     '--pin-externals')
+  verify_pinned_externals(sbox, external_url_for, repo_url,
+                          external_youngest_rev, other_external_youngest_rev)
+
+
+def copy_pin_externals_wc_wc(sbox):
+  "svn copy --pin-externals wc->wc"
+
+  external_url_for = externals_test_setup(sbox)
+
+  wc_dir         = sbox.wc_dir
+  repo_url       = sbox.repo_url
+  repo_dir       = sbox.repo_dir
+  other_repo_dir = repo_dir + ".other"
+
+  external_youngest_rev = svntest.main.youngest(repo_dir)
+  other_external_youngest_rev = svntest.main.youngest(other_repo_dir)
+
+  # Create a working copy.
+  svntest.actions.run_and_verify_svn(None, [],
+                                     'checkout',
+                                     repo_url, wc_dir)
+
+  # Perform a wc->wc copy, pinning externals
+  svntest.actions.run_and_verify_svn(None, [],
+                                     'copy',
+                                     os.path.join(wc_dir, 'A'),
+                                     os.path.join(wc_dir, 'A_copy'),
+                                     '--pin-externals')
+  verify_pinned_externals(sbox, external_url_for, wc_dir,
+                          external_youngest_rev, other_external_youngest_rev)
+
+
+def copy_pin_externals_moved_external(sbox):
+  "pin externals which were moved since last changed"
+
+  external_url_for = externals_test_setup(sbox)
+
+  wc_dir         = sbox.wc_dir
+  repo_url       = sbox.repo_url
+  repo_dir       = sbox.repo_dir
+  other_repo_dir = repo_dir + ".other"
+
+  external_youngest_rev = svntest.main.youngest(repo_dir)
+  other_external_youngest_rev = svntest.main.youngest(other_repo_dir)
+
+  # Create a working copy.
+  svntest.actions.run_and_verify_svn(None, [],
+                                     'checkout',
+                                     repo_url, wc_dir)
+
+  # Test behaviour for external URLs which were moved since
+  # their last-changed revision.
+  sbox.simple_move('A/D/gamma', 'A/D/gamma-moved')
+  sbox.simple_commit()
+  change_external(sbox.ospath('A/B'), '^/A/D/gamma-moved gamma', commit=True)
+  sbox.simple_update()
+  external_youngest_rev = svntest.main.youngest(repo_dir)
+  svntest.actions.run_and_verify_svn(None, [],
+                                     'copy',
+                                     os.path.join(wc_dir, 'A'),
+                                     os.path.join(wc_dir, 'A_copy'),
+                                     '--pin-externals')
+  external_url_for["A/B/gamma"] = '^/A/D/gamma-moved'
+  verify_pinned_externals(sbox, external_url_for, wc_dir,
+                          external_youngest_rev, other_external_youngest_rev)
+
+
+def copy_pin_externals_removed_in_head(sbox):
+  "already pinned external which was removed in HEAD"
+
+  external_url_for = externals_test_setup(sbox)
+
+  wc_dir         = sbox.wc_dir
+  repo_url       = sbox.repo_url
+  repo_dir       = sbox.repo_dir
+  other_repo_url = repo_url + ".other"
+  other_repo_dir = repo_dir + ".other"
+
+  # Create a working copy.
+  svntest.actions.run_and_verify_svn(None, [],
+                                     'checkout',
+                                     repo_url, wc_dir)
+
+  # Test an already pinned external which was removed in HEAD.
+  svntest.actions.run_and_verify_svn(None, [],
+                                     'rm',
+                                     other_repo_url + '/A/D/H',
+                                     '-m', 'remove A/D/H')
+  sbox.simple_update()
+  external_youngest_rev = svntest.main.youngest(repo_dir)
+  other_external_youngest_rev = svntest.main.youngest(other_repo_dir)
+  svntest.actions.run_and_verify_svn(None, [],
+                                     'copy',
+                                     os.path.join(wc_dir, 'A'),
+                                     os.path.join(wc_dir, 'A_copy'),
+                                     '--pin-externals')
+  verify_pinned_externals(sbox, external_url_for, wc_dir,
+                          external_youngest_rev, other_external_youngest_rev)
+
+
+def copy_pin_externals_from_old_rev(sbox):
+  "copy from an old revision with pinning"
+
+  external_url_for = externals_test_setup(sbox)
+
+  wc_dir         = sbox.wc_dir
+  repo_url       = sbox.repo_url
+  repo_dir       = sbox.repo_dir
+  other_repo_url = repo_url + ".other"
+  other_repo_dir = repo_dir + ".other"
+
+  # Create a working copy.
+  svntest.actions.run_and_verify_svn(None, [],
+                                     'checkout',
+                                     repo_url, wc_dir)
+  # Create a couple of revisions affecting 'A'.
+  for i in range(5):
+    svntest.main.file_append(sbox.ospath('A/mu'), 'a new line')
+    sbox.simple_commit()
+  sbox.simple_update()
+
+  # Test a copy from an old revision with pinning.
+  external_youngest_rev = svntest.main.youngest(repo_dir)
+  other_external_youngest_rev = svntest.main.youngest(other_repo_dir)
+  svntest.actions.run_and_verify_svn(None, [],
+                                     'copy',
+                                     os.path.join(wc_dir, 'A@6'),
+                                     os.path.join(wc_dir, 'A_copy'),
+                                     '--pin-externals')
+  external_url_for["A/B/gamma"] = '^/A/D/gamma'
+  verify_pinned_externals(sbox, external_url_for, wc_dir,
+                          external_youngest_rev, other_external_youngest_rev)
+
+
+def copy_pin_externals_wc_local_mods(sbox):
+  "cannot pin WC externals with local mods"
+
+  external_url_for = externals_test_setup(sbox)
+
+  wc_dir         = sbox.wc_dir
+  repo_url       = sbox.repo_url
+
+  # Create a working copy.
+  svntest.actions.run_and_verify_svn(None, [],
+                                     'checkout',
+                                     repo_url, wc_dir)
+
+  svntest.main.file_append(sbox.ospath('A/C/exdir_G/pi'), 'this file changed')
+  expected_stderr = verify.RegexOutput(".*Cannot pin.*local modifications.*",
+                                       match_all=False)
+  svntest.actions.run_and_verify_svn(None, expected_stderr,
+                                     'copy',
+                                     os.path.join(wc_dir, 'A'),
+                                     os.path.join(wc_dir, 'A_copy'),
+                                     '--pin-externals')
+
+
+def copy_pin_externals_wc_switched_subtrees(sbox):
+  "cannot pin WC externals with switched subtrees"
+
+  external_url_for = externals_test_setup(sbox)
+
+  wc_dir         = sbox.wc_dir
+  repo_url       = sbox.repo_url
+
+  # Create a working copy.
+  svntest.actions.run_and_verify_svn(None, [],
+                                     'checkout',
+                                     repo_url, wc_dir)
+
+  svntest.actions.run_and_verify_svn(None, [],
+                                     'switch', '--ignore-ancestry', '^/A/B',
+                                     sbox.ospath('A/D/exdir_A/C'))
+  expected_stderr = verify.RegexOutput(".*Cannot pin.*switched subtree.*",
+                                       match_all=False)
+  svntest.actions.run_and_verify_svn(None, expected_stderr,
+                                     'copy',
+                                     os.path.join(wc_dir, 'A'),
+                                     os.path.join(wc_dir, 'A_copy'),
+                                     '--pin-externals')
+
+
+def copy_pin_externals_wc_mixed_revisions(sbox):
+  "cannot pin WC externals with mixed revisions"
+
+  external_url_for = externals_test_setup(sbox)
+
+  wc_dir         = sbox.wc_dir
+  repo_url       = sbox.repo_url
+
+  # Create a working copy.
+  svntest.actions.run_and_verify_svn(None, [],
+                                     'checkout',
+                                     repo_url, wc_dir)
+
+  svntest.actions.run_and_verify_svn(None, [],
+                                     'update', '-r1',
+                                     sbox.ospath('A/D/exdir_A/mu'))
+  expected_stderr = verify.RegexOutput(".*Cannot pin.*mixed-revision.*",
+                                       match_all=False)
+  svntest.actions.run_and_verify_svn(None, expected_stderr,
+                                     'copy',
+                                     os.path.join(wc_dir, 'A'),
+                                     os.path.join(wc_dir, 'A_copy'),
+                                     '--pin-externals')
+
+@Issue(4558)
+def copy_pin_externals_whitepace_dir(sbox):
+  "copy --pin-externals with whitepace dir"
+
+  sbox.build(empty=True)
+  repo_url = sbox.repo_url
+  wc_dir = sbox.wc_dir
+  ss_path = repo_url[repo_url.find('//'):]
+
+  extdef = sbox.get_tempname('extdef')
+  info = sbox.get_tempname('info')
+
+  open(extdef, 'w').write(
+      '"' + ss_path +'/deps/sqlite"  ext/sqlite\n' +
+      '"^/deps/A P R" \'ext/A P R\'\n' +
+      '^/deps/B\ D\ B\' ext/B\ D\ B\'\n' +
+      repo_url + '/deps/wors%23+t ext/wors#+t')
+  open(info, 'w').write('info\n')
+
+  svntest.actions.run_and_verify_svnmucc(None, [], '-U', repo_url,
+                                         'mkdir', 'trunk',
+                                         'mkdir', 'branches',
+                                         'mkdir', 'deps',
+                                         'mkdir', 'deps/sqlite',
+                                         'put', info, 'deps/sqlite/readme',
+                                         'mkdir', 'deps/A P R',
+                                         'put', info, 'deps/A P R/about',
+                                         'mkdir', 'deps/B D B\'',
+                                         'put', info, 'deps/B D B\'/copying',
+                                         'mkdir', 'deps/wors#+t',
+                                         'put', info, 'deps/wors#+t/brood',
+                                         'propsetf', 'svn:externals', extdef,
+                                                    'trunk',
+                                         '-mm'
+                                         )
+
+  svntest.actions.run_and_verify_svn(None, [], 'update', sbox.ospath('trunk'),
+                                     '--ignore-externals')
+  sbox.simple_update('branches')
+
+  expected_status = svntest.wc.State(wc_dir, {
+    ''                          : Item(status='  ', wc_rev='0'),
+    'trunk'                     : Item(status='  ', wc_rev='1'),
+    'branches'                  : Item(status='  ', wc_rev='1'),
+  })
+
+  svntest.actions.run_and_verify_status(wc_dir, expected_status)
+
+  trunk_url = repo_url + '/trunk'
+  branches_url = repo_url + '/branches'
+  trunk_wc = sbox.ospath('trunk')
+
+  # Create a new revision to creat interesting pinning revisions
+  sbox.simple_propset('A', 'B', 'trunk')
+  sbox.simple_commit('trunk')
+
+  # And let's copy/pin
+  svntest.actions.run_and_verify_svn(None, [],
+                                     'copy', '--pin-externals',
+                                     trunk_url, branches_url + '/url-url', 
'-mm')
+
+  svntest.actions.run_and_verify_svn(None, [],
+                                     'copy', '--pin-externals',
+                                     trunk_url, sbox.ospath('branches/url-wc'))
+  sbox.simple_commit('branches/url-wc')
+
+  # Now try to copy without externals in the WC
+  expected_err = '.*E155035: Cannot pin external.*'
+  svntest.actions.run_and_verify_svn(None, expected_err,
+                                     'copy', '--pin-externals',
+                                     trunk_wc, branches_url + '/wc-url', '-mm')
+
+  svntest.actions.run_and_verify_svn(None, expected_err,
+                                     'copy', '--pin-externals',
+                                     trunk_wc, sbox.ospath('branches/wc-wc'))
+
+  # Bring in the externals on trunk
+  svntest.actions.run_and_verify_svn(None, [], 'update', sbox.ospath('trunk'))
+  expected_status = svntest.wc.State(wc_dir, {
+    'trunk'                     : Item(status='  ', wc_rev='4'),
+    'trunk/ext'                 : Item(status='X '),
+    'trunk/ext/sqlite'          : Item(status='  ', wc_rev='4'),
+    'trunk/ext/sqlite/readme'   : Item(status='  ', wc_rev='4'),
+    'trunk/ext/A P R'           : Item(status='  ', wc_rev='4'),
+    'trunk/ext/A P R/about'     : Item(status='  ', wc_rev='4'),
+    'trunk/ext/B D B\''         : Item(status='  ', wc_rev='4'),
+    'trunk/ext/B D B\'/copying' : Item(status='  ', wc_rev='4'),
+    'trunk/ext/wors#+t'         : Item(status='  ', wc_rev='4'),
+    'trunk/ext/wors#+t/brood'   : Item(status='  ', wc_rev='4'),
+  })
+  svntest.actions.run_and_verify_status(sbox.ospath('trunk'), expected_status)
+
+  # And copy again
+  svntest.actions.run_and_verify_svn(None, [],
+                                     'copy', '--pin-externals',
+                                     trunk_wc, branches_url + '/wc-url', '-mm')
+
+  svntest.actions.run_and_verify_svn(None, [],
+                                     'copy', '--pin-externals',
+                                     trunk_wc, sbox.ospath('branches/wc-wc'))
+  sbox.simple_commit('branches/wc-wc')
+
+
+  expected_output = svntest.wc.State(wc_dir, {
+    'branches/url-url'                      : Item(status='A '),
+    'branches/url-url/ext/A P R/about'      : Item(status='A '),
+    'branches/url-url/ext/B D B\'/copying'  : Item(status='A '),
+    'branches/url-url/ext/wors#+t/brood'    : Item(status='A '),
+    'branches/url-url/ext/sqlite/readme'    : Item(status='A '),
+
+    # url-wc is already up to date
+
+    'branches/wc-url'                       : Item(status='A '),
+    'branches/wc-url/ext/wors#+t/brood'     : Item(status='A '),
+    'branches/wc-url/ext/sqlite/readme'     : Item(status='A '),
+    'branches/wc-url/ext/B D B\'/copying'   : Item(status='A '),
+    'branches/wc-url/ext/A P R/about'       : Item(status='A '),
+
+    ## branches/wc-wc should checkout its externals here
+  })
+  expected_status = svntest.wc.State(wc_dir, {
+    'branches'                              : Item(status='  ', wc_rev='6'),
+
+    'branches/url-url'                      : Item(status='  ', wc_rev='6'),
+    'branches/url-url/ext'                  : Item(status='X '),
+    'branches/url-url/ext/A P R'            : Item(status='  ', wc_rev='2'),
+    'branches/url-url/ext/A P R/about'      : Item(status='  ', wc_rev='2'),
+    'branches/url-url/ext/sqlite'           : Item(status='  ', wc_rev='2'),
+    'branches/url-url/ext/sqlite/readme'    : Item(status='  ', wc_rev='2'),
+    'branches/url-url/ext/wors#+t'          : Item(status='  ', wc_rev='2'),
+    'branches/url-url/ext/wors#+t/brood'    : Item(status='  ', wc_rev='2'),
+    'branches/url-url/ext/B D B\''          : Item(status='  ', wc_rev='2'),
+    'branches/url-url/ext/B D B\'/copying'  : Item(status='  ', wc_rev='2'),
+
+    'branches/url-wc'                       : Item(status='  ', wc_rev='6'),
+    'branches/url-wc/ext'                   : Item(status='X '),
+    'branches/url-wc/ext/wors#+t'           : Item(status='  ', wc_rev='3'),
+    'branches/url-wc/ext/wors#+t/brood'     : Item(status='  ', wc_rev='3'),
+    'branches/url-wc/ext/B D B\''           : Item(status='  ', wc_rev='3'),
+    'branches/url-wc/ext/B D B\'/copying'   : Item(status='  ', wc_rev='3'),
+    'branches/url-wc/ext/sqlite'            : Item(status='  ', wc_rev='3'),
+    'branches/url-wc/ext/sqlite/readme'     : Item(status='  ', wc_rev='3'),
+    'branches/url-wc/ext/A P R'             : Item(status='  ', wc_rev='3'),
+    'branches/url-wc/ext/A P R/about'       : Item(status='  ', wc_rev='3'),
+
+    'branches/wc-url'                       : Item(status='  ', wc_rev='6'),
+    'branches/wc-url/ext'                   : Item(status='X '),
+    'branches/wc-url/ext/wors#+t'           : Item(status='  ', wc_rev='4'),
+    'branches/wc-url/ext/wors#+t/brood'     : Item(status='  ', wc_rev='4'),
+    'branches/wc-url/ext/sqlite'            : Item(status='  ', wc_rev='4'),
+    'branches/wc-url/ext/sqlite/readme'     : Item(status='  ', wc_rev='4'),
+    'branches/wc-url/ext/B D B\''           : Item(status='  ', wc_rev='4'),
+    'branches/wc-url/ext/B D B\'/copying'   : Item(status='  ', wc_rev='4'),
+    'branches/wc-url/ext/A P R'             : Item(status='  ', wc_rev='4'),
+    'branches/wc-url/ext/A P R/about'       : Item(status='  ', wc_rev='4'),
+
+    'branches/wc-wc'                        : Item(status='  ', wc_rev='6'),
+    'branches/wc-wc/ext'                    : Item(status='X '),
+    'branches/wc-wc/ext/wors#+t'            : Item(status='  ', wc_rev='4'),
+    'branches/wc-wc/ext/wors#+t/brood'      : Item(status='  ', wc_rev='4'),
+    'branches/wc-wc/ext/sqlite'             : Item(status='  ', wc_rev='4'),
+    'branches/wc-wc/ext/sqlite/readme'      : Item(status='  ', wc_rev='4'),
+    'branches/wc-wc/ext/B D B\''            : Item(status='  ', wc_rev='4'),
+    'branches/wc-wc/ext/B D B\'/copying'    : Item(status='  ', wc_rev='4'),
+    'branches/wc-wc/ext/A P R'              : Item(status='  ', wc_rev='4'),
+    'branches/wc-wc/ext/A P R/about'        : Item(status='  ', wc_rev='4'),
+  })
+  svntest.actions.run_and_verify_update(wc_dir + '/branches', expected_output,
+                                        None, expected_status, [])
+
+  # Now let's use our existing setup to perform some copies with dynamic
+  # destinations
+  svntest.actions.run_and_verify_svn(None, [],
+                                     'copy', '--parents', '--pin-externals',
+                                     repo_url + '/branches/wc-url',
+                                     repo_url + '/branches/url-url',
+                                     trunk_url,
+                                     branches_url + '/3x-url-url',
+                                     '-mm')
+
+  svntest.actions.run_and_verify_svn(None, [],
+                                     'copy', '--parents', '--pin-externals',
+                                     repo_url + '/branches/wc-url',
+                                     repo_url + '/branches/url-url',
+                                     trunk_url,
+                                     sbox.ospath('branches/3x-url-wc'))
+
+  svntest.actions.run_and_verify_svn(None, [],
+                                     'copy', '--parents', '--pin-externals',
+                                     sbox.ospath('branches/wc-url'),
+                                     sbox.ospath('branches/url-url'),
+                                     sbox.ospath('trunk'),
+                                     branches_url + '/3x-wc-url',
+                                     '-mm')
+
+  svntest.actions.run_and_verify_svn(None, [],
+                                     'copy', '--parents', '--pin-externals',
+                                     sbox.ospath('branches/wc-url'),
+                                     sbox.ospath('branches/url-url'),
+                                     sbox.ospath('trunk'),
+                                     sbox.ospath('branches/3x-wc-wc'))
+
 def nested_notification(sbox):
   "notification for nested externals"
 
@@ -3638,6 +4171,17 @@ test_list = [ None,
               switch_relative_externals,
               copy_file_external_to_repo,
               replace_tree_with_foreign_external,
+              copy_pin_externals_repos_repos,
+              copy_pin_externals_repos_wc,
+              copy_pin_externals_wc_repos,
+              copy_pin_externals_wc_wc,
+              copy_pin_externals_moved_external,
+              copy_pin_externals_removed_in_head,
+              copy_pin_externals_from_old_rev,
+              copy_pin_externals_wc_local_mods,
+              copy_pin_externals_wc_switched_subtrees,
+              copy_pin_externals_wc_mixed_revisions,
+              copy_pin_externals_whitepace_dir,
               nested_notification,
              ]
 

Modified: 
subversion/branches/move-tracking-2/subversion/tests/cmdline/lock_tests.py
URL: 
http://svn.apache.org/viewvc/subversion/branches/move-tracking-2/subversion/tests/cmdline/lock_tests.py?rev=1660173&r1=1660172&r2=1660173&view=diff
==============================================================================
--- subversion/branches/move-tracking-2/subversion/tests/cmdline/lock_tests.py 
(original)
+++ subversion/branches/move-tracking-2/subversion/tests/cmdline/lock_tests.py 
Mon Feb 16 17:40:07 2015
@@ -1841,8 +1841,8 @@ def commit_stolen_lock(sbox):
                                         err_re,
                                         wc_dir)
 
-# When removing directories, the locks of contained files were not 
-# correctly removed from the working copy database, thus they later 
+# When removing directories, the locks of contained files were not
+# correctly removed from the working copy database, thus they later
 # magically reappeared when new files or directories with the same
 # pathes were added.
 @Issue(4364)
@@ -1857,10 +1857,10 @@ def drop_locks_on_parent_deletion(sbox):
   sbox.simple_lock('A/B/E/alpha')
   sbox.simple_lock('A/B/E/beta')
   sbox.simple_rm('A/B')
-  
+
   expected_status = svntest.actions.get_virginal_state(wc_dir, 1)
   expected_status.remove_subtree('A/B')
-  
+
   svntest.actions.run_and_verify_commit(wc_dir,
                                         [],
                                         expected_status,
@@ -1874,7 +1874,7 @@ def drop_locks_on_parent_deletion(sbox):
   # The bug also resurrected locks on directories when their path
   # matched a former file.
   sbox.simple_mkdir('A/B/E', 'A/B/E/alpha')
-    
+
   expected_status = svntest.actions.get_virginal_state(wc_dir, 1)
   expected_status.tweak('A/B',
                         'A/B/E',
@@ -1883,7 +1883,7 @@ def drop_locks_on_parent_deletion(sbox):
                         'A/B/lambda',
                         wc_rev='3')
   expected_status.remove('A/B/E/beta')
-   
+
   svntest.actions.run_and_verify_commit(wc_dir,
                                         [],
                                         expected_status,
@@ -2147,7 +2147,7 @@ def non_root_locks(sbox):
                                      'cp', sbox.repo_url, sbox.repo_url + '/X',
                                      '-m', 'copy greek tree')
 
-  sbox.simple_switch(sbox.repo_url + '/X')  
+  sbox.simple_switch(sbox.repo_url + '/X')
   expected_status = svntest.actions.get_virginal_state(wc_dir, 2)
   svntest.actions.run_and_verify_status(wc_dir, expected_status)
 
@@ -2336,20 +2336,20 @@ def lock_commit_bump(sbox):
   })
   expected_status = svntest.actions.get_virginal_state(wc_dir, 1)
   expected_status.tweak('A/mu', wc_rev=3)
-  
+
   svntest.actions.run_and_verify_commit(wc_dir,
                                         expected_output,
                                         expected_status,
                                         None, wc_dir)
 
   # We explicitly check both the Revision and Last Changed Revision.
-  expected_infos = [ { 
+  expected_infos = [ {
     'Revision'           : '1' ,
     'Last Changed Rev'   : '1' ,
     'URL'                : '.*',
     'Lock Token'         : None, }
   ]
-  svntest.actions.run_and_verify_info(expected_infos, 
+  svntest.actions.run_and_verify_info(expected_infos,
                                       sbox.ospath('iota'))
 
 def copy_dir_with_locked_file(sbox):
@@ -2372,6 +2372,44 @@ def copy_dir_with_locked_file(sbox):
                                      'mv', A_url, AA2_url,
                                      '-m', '')
 
+@Issue(4557)
+@XFail(svntest.main.is_ra_type_dav)
+def delete_dir_with_lots_of_locked_files(sbox):
+  "delete a directory containing lots of locked files"
+
+  sbox.build()
+  wc_dir = sbox.wc_dir
+
+  # A lot of paths.
+  nfiles = 75 # NOTE: test XPASSES with 50 files!!!
+  locked_paths = []
+  for i in range(nfiles):
+      locked_paths.append("A/locked_files/file-%i" % i)
+
+  # Create files at these paths
+  os.mkdir(sbox.ospath("A/locked_files"))
+  for file_path in locked_paths:
+    svntest.main.file_write(sbox.ospath(file_path), "This is a file\n")
+  sbox.simple_add("A/locked_files")
+  sbox.simple_commit()
+  sbox.simple_update()
+
+  # lock all the files
+  for file_path in locked_paths:
+    svntest.actions.run_and_verify_svn(None, [], 'lock',
+                                       '--username', 'jrandom',
+                                       '-m', 'lock %s' % file_path,
+                                       sbox.ospath(file_path))
+  # Locally delete A
+  sbox.simple_rm("A")
+
+  # Commit the deletion
+  # XFAIL: As of 1.8.10, this commit fails with:
+  #  svn: E175002: Unexpected HTTP status 400 'Bad Request' on '<path>'
+  # and the following error in the httpd error log:
+  #  request failed: error reading the headers
+  # This problem was introduced on the 1.8.x branch in r1606976.
+  sbox.simple_commit()
 
 ########################################################################
 # Run the tests
@@ -2438,6 +2476,7 @@ test_list = [ None,
               delete_locked_file_with_percent,
               lock_commit_bump,
               copy_dir_with_locked_file,
+              delete_dir_with_lots_of_locked_files,
             ]
 
 if __name__ == '__main__':

Modified: 
subversion/branches/move-tracking-2/subversion/tests/cmdline/merge_tests.py
URL: 
http://svn.apache.org/viewvc/subversion/branches/move-tracking-2/subversion/tests/cmdline/merge_tests.py?rev=1660173&r1=1660172&r2=1660173&view=diff
==============================================================================
--- subversion/branches/move-tracking-2/subversion/tests/cmdline/merge_tests.py 
(original)
+++ subversion/branches/move-tracking-2/subversion/tests/cmdline/merge_tests.py 
Mon Feb 16 17:40:07 2015
@@ -18505,7 +18505,7 @@ def merge_to_empty_target_merge_to_infin
 
   C1_path = sbox.ospath('A/C/C1')
   test3_path = sbox.ospath('A/C/C1/test.txt')
-  
+
   # r3 - Add some subtrees:
   #   A /A/B/B1
   #   A /A/B/B1/B1a

Modified: 
subversion/branches/move-tracking-2/subversion/tests/cmdline/merge_tree_conflict_tests.py
URL: 
http://svn.apache.org/viewvc/subversion/branches/move-tracking-2/subversion/tests/cmdline/merge_tree_conflict_tests.py?rev=1660173&r1=1660172&r2=1660173&view=diff
==============================================================================
--- 
subversion/branches/move-tracking-2/subversion/tests/cmdline/merge_tree_conflict_tests.py
 (original)
+++ 
subversion/branches/move-tracking-2/subversion/tests/cmdline/merge_tree_conflict_tests.py
 Mon Feb 16 17:40:07 2015
@@ -1949,6 +1949,159 @@ def merge_replace_on_del_fails(sbox):
   actions.run_and_verify_svn2(expected_stdout, [], 0, 'merge',
     sbox.repo_url + '/A', branch_path)
 
+def merge_conflict_details(sbox):
+  "merge conflict details"
+
+  sbox.build()
+  wc_dir = sbox.wc_dir
+
+  sbox.simple_append('A/B/E/new', 'new\n')
+  sbox.simple_add('A/B/E/new')
+  sbox.simple_append('A/B/E/alpha', '\nextra\nlines\n')
+  sbox.simple_rm('A/B/E/beta', 'A/B/F')
+  sbox.simple_propset('key', 'VAL', 'A/B/E', 'A/B')
+  sbox.simple_mkdir('A/B/E/new-dir1')
+  sbox.simple_mkdir('A/B/E/new-dir2')
+  sbox.simple_mkdir('A/B/E/new-dir3')
+  sbox.simple_rm('A/B/lambda')
+  sbox.simple_mkdir('A/B/lambda')
+  sbox.simple_commit()
+
+  sbox.simple_update('', 1)
+
+  sbox.simple_move('A/B', 'B')
+
+  sbox.simple_propset('key', 'vAl', 'B')
+  sbox.simple_move('B/E/beta', 'beta')
+  sbox.simple_propset('a', 'b', 'B/F', 'B/lambda')
+  sbox.simple_append('B/E/alpha', 'other\nnew\nlines')
+  sbox.simple_mkdir('B/E/new')
+  sbox.simple_mkdir('B/E/new-dir1')
+  sbox.simple_append('B/E/new-dir2', 'something')
+  sbox.simple_append('B/E/new-dir3', 'something')
+  sbox.simple_add('B/E/new-dir3')
+
+  expected_status = svntest.actions.get_virginal_state(wc_dir, 1)
+  expected_status.add({
+    'B'                  : Item(status=' C', copied='+', moved_from='A/B',
+                                wc_rev='-', entry_status='AC'),
+    'B/E'                 : Item(status=' M', copied='+', wc_rev='-'),
+    'B/E/new'             : Item(status='A ', treeconflict='C', wc_rev='-'),
+    'B/E/beta'            : Item(status='D ', copied='+', treeconflict='C',
+                                 wc_rev='-', moved_to='beta'),
+    'B/E/alpha'           : Item(status='C ', copied='+', wc_rev='-'),
+    'B/E/new-dir3'        : Item(status='A ', treeconflict='C', wc_rev='-'),
+    'B/E/new-dir1'        : Item(status='A ', treeconflict='C', wc_rev='-'),
+    'B/F'                 : Item(status=' M', copied='+', treeconflict='C',
+                                 wc_rev='-'),
+    'B/lambda'            : Item(status=' M', copied='+', treeconflict='C',
+                                 wc_rev='-'),
+    'beta'                : Item(status='A ', copied='+',
+                                 moved_from='B/E/beta', wc_rev='-')
+  })
+  expected_status.tweak('A/B', status='D ', wc_rev='1', moved_to='B')
+  expected_status.tweak('A/B/lambda', 'A/B/E', 'A/B/E/beta', 'A/B/E/alpha',
+                        'A/B/F', status='D ')
+
+  expected_output = svntest.wc.State(wc_dir, {
+    'B'                   : Item(status=' C'),
+    'B/E'                 : Item(status=' U'),
+    'B/E/new'             : Item(status='  ', treeconflict='C'),
+    'B/E/beta'            : Item(status='  ', treeconflict='C'),
+    'B/E/alpha'           : Item(status='C '),
+    'B/E/new-dir3'        : Item(status='  ', treeconflict='C'),
+    'B/E/new-dir1'        : Item(status='  ', treeconflict='C'),
+    'B/F'                 : Item(status='  ', treeconflict='C'),
+    'B/lambda'            : Item(status='  ', treeconflict='C'),
+  })
+  expected_skip = wc.State(wc_dir, {
+    'B/E/new-dir2'      : Item(verb='Skipped'),
+  })
+  svntest.actions.run_and_verify_merge(sbox.ospath('B'),
+                                       1, 2, '^/A/B', '^/A/B',
+                                       expected_output,
+                                       None, None,
+                                       None, None, expected_skip)
+  svntest.actions.run_and_verify_status(wc_dir, expected_status)
+
+  expected_info = [
+    {
+      "Path" : re.escape(sbox.ospath('B')),
+
+      "Conflict Properties File" :
+            re.escape(sbox.ospath('B/dir_conflicts.prej')) + '.*',
+      "Conflict Details": re.escape(
+            'incoming dir edit upon merge' +
+            ' Source  left: (dir) ^/A/B@1' +
+            ' Source right: (dir) ^/A/B@2')
+    },
+    {
+      "Path" : re.escape(sbox.ospath('B/E')),
+    },
+    {
+      "Path" : re.escape(sbox.ospath('B/E/alpha')),
+      "Conflict Previous Base File" : '.*alpha.*',
+      "Conflict Previous Working File" : '.*alpha.*',
+      "Conflict Current Base File": '.*alpha.*',
+      "Conflict Details": re.escape(
+          'incoming file edit upon merge' +
+          ' Source  left: (file) ^/A/B/E/alpha@1' +
+          ' Source right: (file) ^/A/B/E/alpha@2')
+    },
+    {
+      "Path" : re.escape(sbox.ospath('B/E/beta')),
+      "Tree conflict": re.escape(
+          'local file moved away, incoming file delete or move upon merge' +
+          ' Source  left: (file) ^/A/B/E/beta@1' +
+          ' Source right: (none) ^/A/B/E/beta@2')
+    },
+    {
+      "Path" : re.escape(sbox.ospath('B/E/new')),
+      "Tree conflict": re.escape(
+          'local dir add, incoming file add upon merge' +
+          ' Source  left: (none) ^/A/B/E/new@1' +
+          ' Source right: (file) ^/A/B/E/new@2')
+    },
+    {
+      "Path" : re.escape(sbox.ospath('B/E/new-dir1')),
+      "Tree conflict": re.escape(
+          'local dir add, incoming dir add upon merge' +
+          ' Source  left: (none) ^/A/B/E/new-dir1@1' +
+          ' Source right: (dir) ^/A/B/E/new-dir1@2')
+    },
+    #{ ### Skipped
+    #  "Path" : re.escape(sbox.ospath('B/E/new-dir2')),
+    #  "Tree conflict": re.escape(
+    #      'local file unversioned, incoming dir add upon merge' +
+    #      ' Source  left: (none) ^/A/B/E/new-dir2@1' +
+    #      ' Source right: (dir) ^/A/B/E/new-dir2@2')
+    #},
+    {
+      "Path" : re.escape(sbox.ospath('B/E/new-dir3')),
+      "Tree conflict": re.escape(
+          'local file add, incoming dir add upon merge' +
+          ' Source  left: (none) ^/A/B/E/new-dir3@1' +
+          ' Source right: (dir) ^/A/B/E/new-dir3@2')
+    },
+    {
+      "Path" : re.escape(sbox.ospath('B/F')),
+      "Tree conflict": re.escape(
+          'local dir edit, incoming dir delete or move upon merge' +
+          ' Source  left: (dir) ^/A/B/F@1' +
+          ' Source right: (none) ^/A/B/F@2')
+    },
+    {
+      "Path" : re.escape(sbox.ospath('B/lambda')),
+      "Tree conflict": re.escape(
+          'local file edit, incoming replace with dir upon merge' +
+          ' Source  left: (file) ^/A/B/lambda@1' +
+          ' Source right: (dir) ^/A/B/lambda@2')
+    },
+  ]
+
+  svntest.actions.run_and_verify_info(expected_info, sbox.ospath('B'),
+                                      '--depth', 'infinity')
+
 ########################################################################
 # Run the tests
 
@@ -1979,6 +2132,7 @@ test_list = [ None,
               merge_replace_causes_tree_conflict,
               merge_replace_causes_tree_conflict2,
               merge_replace_on_del_fails,
+              merge_conflict_details,
              ]
 
 if __name__ == '__main__':


Reply via email to