You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@subversion.apache.org by br...@apache.org on 2014/01/09 10:31:15 UTC

svn commit: r1556765 [10/12] - in /subversion/branches/fsfs-ucsnorm: ./ contrib/server-side/fsfsfixer/fixer/ subversion/bindings/javahl/native/ subversion/bindings/javahl/native/jniwrapper/ subversion/bindings/javahl/src/org/apache/subversion/javahl/ s...

Modified: subversion/branches/fsfs-ucsnorm/subversion/mod_dav_svn/repos.c
URL: http://svn.apache.org/viewvc/subversion/branches/fsfs-ucsnorm/subversion/mod_dav_svn/repos.c?rev=1556765&r1=1556764&r2=1556765&view=diff
==============================================================================
--- subversion/branches/fsfs-ucsnorm/subversion/mod_dav_svn/repos.c (original)
+++ subversion/branches/fsfs-ucsnorm/subversion/mod_dav_svn/repos.c Thu Jan  9 09:31:10 2014
@@ -57,6 +57,7 @@
 #include "private/svn_log.h"
 #include "private/svn_fspath.h"
 #include "private/svn_repos_private.h"
+#include "private/svn_sorts_private.h"
 
 #include "dav_svn.h"
 
@@ -3808,10 +3809,9 @@ copy_resource(const dav_resource *src,
                                         dst->pool));
 
       if (!serr && (strcmp(src_repos_path, dst_repos_path) != 0))
-          return dav_svn__new_error_tag(
+          return dav_svn__new_error_svn(
                 dst->pool, HTTP_INTERNAL_SERVER_ERROR, 0,
-                "Copy source and destination are in different repositories.",
-                SVN_DAV_ERROR_NAMESPACE, SVN_DAV_ERROR_TAG);
+                "Copy source and destination are in different repositories");
     }
   else
       serr = SVN_NO_ERROR;
@@ -3939,8 +3939,9 @@ remove_resource(dav_resource *resource, 
      incoming lock-tokens into the filesystem's access_t.  Normally
      they come in via 'If:' header, and get_resource()
      automatically notices them and does this work for us.  In the
-     case of a directory deletion, however, svn clients are sending
-     'child' lock-tokens in the DELETE request body. */
+     case of a directory deletion, however, older subversion clients
+     are sending 'child' lock-tokens in the non-standard DELETE
+     request body. */
 
   err = dav_svn__build_lock_hash(&locks, resource->info->r,
                                  resource->info->repos_path, resource->pool);

Modified: subversion/branches/fsfs-ucsnorm/subversion/mod_dav_svn/util.c
URL: http://svn.apache.org/viewvc/subversion/branches/fsfs-ucsnorm/subversion/mod_dav_svn/util.c?rev=1556765&r1=1556764&r2=1556765&view=diff
==============================================================================
--- subversion/branches/fsfs-ucsnorm/subversion/mod_dav_svn/util.c (original)
+++ subversion/branches/fsfs-ucsnorm/subversion/mod_dav_svn/util.c Thu Jan  9 09:31:10 2014
@@ -59,26 +59,24 @@ dav_svn__new_error(apr_pool_t *pool,
   return dav_new_error(pool, status, error_id, 0, desc);
 #else
 
-  errno = 0; /* For the same reason as in dav_svn__new_error_tag */
+  errno = 0; /* For the same reason as in dav_svn__new_error_svn */
 
   return dav_new_error(pool, status, error_id, desc);
 #endif
 }
 
 dav_error *
-dav_svn__new_error_tag(apr_pool_t *pool,
+dav_svn__new_error_svn(apr_pool_t *pool,
                        int status,
                        int error_id,
-                       const char *desc,
-                       const char *namespace,
-                       const char *tagname)
+                       const char *desc)
 {
   if (error_id == 0)
     error_id = SVN_ERR_RA_DAV_REQUEST_FAILED;
 
 #if AP_MODULE_MAGIC_AT_LEAST(20091119,0)
   return dav_new_error_tag(pool, status, error_id, 0,
-                           desc, namespace, tagname);
+                           desc, SVN_DAV_ERROR_NAMESPACE, SVN_DAV_ERROR_TAG);
 #else
   /* dav_new_error_tag will record errno but Subversion makes no attempt
      to ensure that it is valid.  We reset it to avoid putting incorrect
@@ -86,7 +84,8 @@ dav_svn__new_error_tag(apr_pool_t *pool,
      valid information. */
   errno = 0;
 
-  return dav_new_error_tag(pool, status, error_id, desc, namespace, tagname);
+  return dav_new_error_tag(pool, status, error_id, desc,
+                           SVN_DAV_ERROR_NAMESPACE, SVN_DAV_ERROR_TAG);
 #endif
 }
 
@@ -96,11 +95,11 @@ dav_svn__new_error_tag(apr_pool_t *pool,
 static dav_error *
 build_error_chain(apr_pool_t *pool, svn_error_t *err, int status)
 {
-  char *msg = err->message ? apr_pstrdup(pool, err->message) : NULL;
+  char buffer[128];
+  const char *msg = svn_err_best_message(err, buffer, sizeof(buffer));
 
-  dav_error *derr = dav_svn__new_error_tag(pool, status, err->apr_err, msg,
-                                           SVN_DAV_ERROR_NAMESPACE,
-                                           SVN_DAV_ERROR_TAG);
+  dav_error *derr = dav_svn__new_error_svn(pool, status, err->apr_err,
+                                           apr_pstrdup(pool, msg));
 
   if (err->child)
     derr->prev = build_error_chain(pool, err->child, status);
@@ -193,15 +192,9 @@ dav_svn__get_safe_cr(svn_fs_root_t *root
   svn_revnum_t history_rev;
   svn_fs_root_t *other_root;
   svn_fs_t *fs = svn_fs_root_fs(root);
-  const svn_fs_id_t *id, *other_id;
+  svn_fs_node_relation_t node_relation;
   svn_error_t *err;
 
-  if ((err = svn_fs_node_id(&id, root, path, pool)))
-    {
-      svn_error_clear(err);
-      return revision;   /* couldn't get id of root/path */
-    }
-
   if ((err = get_last_history_rev(&history_rev, root, path, pool)))
     {
       svn_error_clear(err);
@@ -214,13 +207,14 @@ dav_svn__get_safe_cr(svn_fs_root_t *root
       return revision;   /* couldn't open the history rev */
     }
 
-  if ((err = svn_fs_node_id(&other_id, other_root, path, pool)))
+  if ((err = svn_fs_node_relation(&node_relation, root, path,
+                                  other_root, path, pool)))
     {
       svn_error_clear(err);
-      return revision;   /* couldn't get id of other_root/path */
+      return revision;
     }
 
-  if (svn_fs_compare_ids(id, other_id) == 0)
+  if (node_relation == svn_fs_node_same)
     return history_rev;  /* the history rev is safe!  the same node
                             exists at the same path in both revisions. */
 
@@ -541,12 +535,11 @@ dav_svn__test_canonical(const char *path
     return NULL;
 
   /* Otherwise, generate a generic HTTP_BAD_REQUEST error. */
-  return dav_svn__new_error_tag
-    (pool, HTTP_BAD_REQUEST, 0,
+  return dav_svn__new_error_svn(
+     pool, HTTP_BAD_REQUEST, 0,
      apr_psprintf(pool,
                   "Path '%s' is not canonicalized; "
-                  "there is a problem with the client.", path),
-     SVN_DAV_ERROR_NAMESPACE, SVN_DAV_ERROR_TAG);
+                  "there is a problem with the client.", path));
 }
 
 

Modified: subversion/branches/fsfs-ucsnorm/subversion/mod_dav_svn/version.c
URL: http://svn.apache.org/viewvc/subversion/branches/fsfs-ucsnorm/subversion/mod_dav_svn/version.c?rev=1556765&r1=1556764&r2=1556765&view=diff
==============================================================================
--- subversion/branches/fsfs-ucsnorm/subversion/mod_dav_svn/version.c (original)
+++ subversion/branches/fsfs-ucsnorm/subversion/mod_dav_svn/version.c Thu Jan  9 09:31:10 2014
@@ -396,11 +396,9 @@ vsn_control(dav_resource *resource, cons
 
   /* Only allow a NULL target, which means an create an 'empty' VCR. */
   if (target != NULL)
-    return dav_svn__new_error_tag(resource->pool, HTTP_NOT_IMPLEMENTED,
+    return dav_svn__new_error_svn(resource->pool, HTTP_NOT_IMPLEMENTED,
                                   SVN_ERR_UNSUPPORTED_FEATURE,
-                                  "vsn_control called with non-null target.",
-                                  SVN_DAV_ERROR_NAMESPACE,
-                                  SVN_DAV_ERROR_TAG);
+                                  "vsn_control called with non-null target");
 
   /* This is kind of silly.  The docstring for this callback says it's
      supposed to "put a resource under version control".  But in
@@ -446,20 +444,16 @@ dav_svn__checkout(dav_resource *resource
         return NULL;
 
       if (resource->type != DAV_RESOURCE_TYPE_REGULAR)
-        return dav_svn__new_error_tag(resource->pool, HTTP_METHOD_NOT_ALLOWED,
+        return dav_svn__new_error_svn(resource->pool, HTTP_METHOD_NOT_ALLOWED,
                                       SVN_ERR_UNSUPPORTED_FEATURE,
                                       "auto-checkout attempted on non-regular "
-                                      "version-controlled resource.",
-                                      SVN_DAV_ERROR_NAMESPACE,
-                                      SVN_DAV_ERROR_TAG);
+                                      "version-controlled resource");
 
       if (resource->baselined)
-        return dav_svn__new_error_tag(resource->pool, HTTP_METHOD_NOT_ALLOWED,
+        return dav_svn__new_error_svn(resource->pool, HTTP_METHOD_NOT_ALLOWED,
                                       SVN_ERR_UNSUPPORTED_FEATURE,
                                       "auto-checkout attempted on baseline "
-                                      "collection, which is not supported.",
-                                      SVN_DAV_ERROR_NAMESPACE,
-                                      SVN_DAV_ERROR_TAG);
+                                      "collection, which is not supported");
 
       /* See if the shared activity already exists. */
       apr_err = apr_pool_userdata_get(&data,
@@ -541,51 +535,41 @@ dav_svn__checkout(dav_resource *resource
 
   if (resource->type != DAV_RESOURCE_TYPE_VERSION)
     {
-      return dav_svn__new_error_tag(resource->pool, HTTP_METHOD_NOT_ALLOWED,
+      return dav_svn__new_error_svn(resource->pool, HTTP_METHOD_NOT_ALLOWED,
                                     SVN_ERR_UNSUPPORTED_FEATURE,
                                     "CHECKOUT can only be performed on a "
-                                    "version resource [at this time].",
-                                    SVN_DAV_ERROR_NAMESPACE,
-                                    SVN_DAV_ERROR_TAG);
+                                    "version resource");
     }
   if (create_activity)
     {
-      return dav_svn__new_error_tag(resource->pool, HTTP_NOT_IMPLEMENTED,
+      return dav_svn__new_error_svn(resource->pool, HTTP_NOT_IMPLEMENTED,
                                     SVN_ERR_UNSUPPORTED_FEATURE,
                                     "CHECKOUT cannot create an activity at "
-                                    "this time. Use MKACTIVITY first.",
-                                    SVN_DAV_ERROR_NAMESPACE,
-                                    SVN_DAV_ERROR_TAG);
+                                    "this time. Use MKACTIVITY first");
     }
   if (is_unreserved)
     {
-      return dav_svn__new_error_tag(resource->pool, HTTP_NOT_IMPLEMENTED,
+      return dav_svn__new_error_svn(resource->pool, HTTP_NOT_IMPLEMENTED,
                                     SVN_ERR_UNSUPPORTED_FEATURE,
                                     "Unreserved checkouts are not yet "
                                     "available. A version history may not be "
                                     "checked out more than once, into a "
-                                    "specific activity.",
-                                    SVN_DAV_ERROR_NAMESPACE,
-                                    SVN_DAV_ERROR_TAG);
+                                    "specific activity");
     }
   if (activities == NULL)
     {
-      return dav_svn__new_error_tag(resource->pool, HTTP_CONFLICT,
+      return dav_svn__new_error_svn(resource->pool, HTTP_CONFLICT,
                                     SVN_ERR_INCOMPLETE_DATA,
                                     "An activity must be provided for "
-                                    "checkout.",
-                                    SVN_DAV_ERROR_NAMESPACE,
-                                    SVN_DAV_ERROR_TAG);
+                                    "checkout");
     }
   /* assert: nelts > 0.  the below check effectively means > 1. */
   if (activities->nelts != 1)
     {
-      return dav_svn__new_error_tag(resource->pool, HTTP_CONFLICT,
+      return dav_svn__new_error_svn(resource->pool, HTTP_CONFLICT,
                                     SVN_ERR_INCORRECT_PARAMS,
                                     "Only one activity may be specified within "
-                                    "the CHECKOUT.",
-                                    SVN_DAV_ERROR_NAMESPACE,
-                                    SVN_DAV_ERROR_TAG);
+                                    "the CHECKOUT");
     }
 
   serr = dav_svn__simple_parse_uri(&parse, resource,
@@ -601,21 +585,17 @@ dav_svn__checkout(dav_resource *resource
     }
   if (parse.activity_id == NULL)
     {
-      return dav_svn__new_error_tag(resource->pool, HTTP_CONFLICT,
+      return dav_svn__new_error_svn(resource->pool, HTTP_CONFLICT,
                                     SVN_ERR_INCORRECT_PARAMS,
-                                    "The provided href is not an activity URI.",
-                                    SVN_DAV_ERROR_NAMESPACE,
-                                    SVN_DAV_ERROR_TAG);
+                                    "The provided href is not an activity URI");
     }
 
   if ((txn_name = dav_svn__get_txn(resource->info->repos,
                                    parse.activity_id)) == NULL)
     {
-      return dav_svn__new_error_tag(resource->pool, HTTP_CONFLICT,
+      return dav_svn__new_error_svn(resource->pool, HTTP_CONFLICT,
                                     SVN_ERR_APMOD_ACTIVITY_NOT_FOUND,
-                                    "The specified activity does not exist.",
-                                    SVN_DAV_ERROR_NAMESPACE,
-                                    SVN_DAV_ERROR_TAG);
+                                    "The specified activity does not exist");
     }
 
   /* verify the specified version resource is the "latest", thus allowing
@@ -643,13 +623,11 @@ dav_svn__checkout(dav_resource *resource
 
       if (resource->info->root.rev != youngest)
         {
-          return dav_svn__new_error_tag(resource->pool, HTTP_CONFLICT,
+          return dav_svn__new_error_svn(resource->pool, HTTP_CONFLICT,
                                         SVN_ERR_APMOD_BAD_BASELINE,
                                         "The specified baseline is not the "
                                         "latest baseline, so it may not be "
-                                        "checked out.",
-                                        SVN_DAV_ERROR_NAMESPACE,
-                                        SVN_DAV_ERROR_TAG);
+                                        "checked out");
         }
 
       /* ### hmm. what if the transaction root's revision is different
@@ -743,11 +721,9 @@ dav_svn__checkout(dav_resource *resource
             {
               /* The item being modified is older than the one in the
                  transaction.  The client is out of date.  */
-              return dav_svn__new_error_tag
+              return dav_svn__new_error_svn
                 (resource->pool, HTTP_CONFLICT, SVN_ERR_FS_CONFLICT,
-                 "resource out of date; try updating",
-                 SVN_DAV_ERROR_NAMESPACE,
-                 SVN_DAV_ERROR_TAG);
+                 "resource out of date; try updating");
             }
           else if (resource->info->root.rev > txn_created_rev)
             {
@@ -755,42 +731,25 @@ dav_svn__checkout(dav_resource *resource
                  revision than the one in the transaction.  We'll
                  check to see if they are still the same node, and if
                  not, return an error. */
-              const svn_fs_id_t *url_noderev_id, *txn_noderev_id;
-
-              if ((serr = svn_fs_node_id(&txn_noderev_id, txn_root,
-                                         resource->info->repos_path,
-                                         resource->pool)))
-                {
-                  err = dav_svn__new_error_tag
-                    (resource->pool, HTTP_CONFLICT, serr->apr_err,
-                     "Unable to fetch the node revision id of the version "
-                     "resource within the transaction.",
-                     SVN_DAV_ERROR_NAMESPACE,
-                     SVN_DAV_ERROR_TAG);
-                  svn_error_clear(serr);
-                  return err;
-                }
-              if ((serr = svn_fs_node_id(&url_noderev_id,
-                                         resource->info->root.root,
-                                         resource->info->repos_path,
-                                         resource->pool)))
+              svn_fs_node_relation_t node_relation;
+              if ((serr = svn_fs_node_relation(&node_relation, txn_root,
+                                               resource->info->repos_path,
+                                               resource->info->root.root,
+                                               resource->info->repos_path,
+                                               resource->pool)))
                 {
-                  err = dav_svn__new_error_tag
+                  err = dav_svn__new_error_svn
                     (resource->pool, HTTP_CONFLICT, serr->apr_err,
                      "Unable to fetch the node revision id of the version "
-                     "resource within the revision.",
-                     SVN_DAV_ERROR_NAMESPACE,
-                     SVN_DAV_ERROR_TAG);
+                     "resource within the revision");
                   svn_error_clear(serr);
                   return err;
                 }
-              if (svn_fs_compare_ids(url_noderev_id, txn_noderev_id) != 0)
+              if (node_relation != svn_fs_node_same)
                 {
-                  return dav_svn__new_error_tag
+                  return dav_svn__new_error_svn
                     (resource->pool, HTTP_CONFLICT, SVN_ERR_FS_CONFLICT,
-                     "version resource newer than txn (restart the commit)",
-                     SVN_DAV_ERROR_NAMESPACE,
-                     SVN_DAV_ERROR_TAG);
+                     "version resource newer than txn (restart the commit)");
                 }
             }
         }
@@ -807,11 +766,9 @@ static dav_error *
 uncheckout(dav_resource *resource)
 {
   if (resource->type != DAV_RESOURCE_TYPE_WORKING)
-    return dav_svn__new_error_tag(resource->pool, HTTP_INTERNAL_SERVER_ERROR,
+    return dav_svn__new_error_svn(resource->pool, HTTP_INTERNAL_SERVER_ERROR,
                                   SVN_ERR_UNSUPPORTED_FEATURE,
-                                  "UNCHECKOUT called on non-working resource.",
-                                  SVN_DAV_ERROR_NAMESPACE,
-                                  SVN_DAV_ERROR_TAG);
+                                  "UNCHECKOUT called on non-working resource");
 
   /* Try to abort the txn if it exists;  but don't try too hard.  :-)  */
   if (resource->info->root.txn)
@@ -950,11 +907,9 @@ dav_svn__checkin(dav_resource *resource,
      txn?  Many txns?  Etc.) */
 
   if (resource->type != DAV_RESOURCE_TYPE_WORKING)
-    return dav_svn__new_error_tag(resource->pool, HTTP_INTERNAL_SERVER_ERROR,
+    return dav_svn__new_error_svn(resource->pool, HTTP_INTERNAL_SERVER_ERROR,
                                   SVN_ERR_UNSUPPORTED_FEATURE,
-                                  "CHECKIN called on non-working resource.",
-                                  SVN_DAV_ERROR_NAMESPACE,
-                                  SVN_DAV_ERROR_TAG);
+                                  "CHECKIN called on non-working resource");
 
   /* If the global autoversioning activity still exists, that means
      nobody's committed it yet. */
@@ -1189,11 +1144,9 @@ deliver_report(request_rec *r,
     }
 
   /* ### what is a good error for an unknown report? */
-  return dav_svn__new_error_tag(resource->pool, HTTP_NOT_IMPLEMENTED,
+  return dav_svn__new_error_svn(resource->pool, HTTP_NOT_IMPLEMENTED,
                                 SVN_ERR_UNSUPPORTED_FEATURE,
-                                "The requested report is unknown.",
-                                SVN_DAV_ERROR_NAMESPACE,
-                                SVN_DAV_ERROR_TAG);
+                                "The requested report is unknown");
 }
 
 
@@ -1220,13 +1173,11 @@ make_activity(dav_resource *resource)
   /* sanity check:  make sure the resource is a valid activity, in
      case an older mod_dav doesn't do the check for us. */
   if (! can_be_activity(resource))
-    return dav_svn__new_error_tag(resource->pool, HTTP_FORBIDDEN,
+    return dav_svn__new_error_svn(resource->pool, HTTP_FORBIDDEN,
                                   SVN_ERR_APMOD_MALFORMED_URI,
                                   "Activities cannot be created at that "
                                   "location; query the "
-                                  "DAV:activity-collection-set property.",
-                                  SVN_DAV_ERROR_NAMESPACE,
-                                  SVN_DAV_ERROR_TAG);
+                                  "DAV:activity-collection-set property");
 
   err = dav_svn__create_txn(resource->info->repos, &txn_name,
                             NULL, resource->pool);
@@ -1465,22 +1416,18 @@ merge(dav_resource *target,
          || (source->type == DAV_RESOURCE_TYPE_PRIVATE
              && source->info->restype == DAV_SVN_RESTYPE_TXN_COLLECTION)))
     {
-      return dav_svn__new_error_tag(pool, HTTP_METHOD_NOT_ALLOWED,
+      return dav_svn__new_error_svn(pool, HTTP_METHOD_NOT_ALLOWED,
                                     SVN_ERR_INCORRECT_PARAMS,
                                     "MERGE can only be performed using an "
                                     "activity or transaction resource as the "
-                                    "source.",
-                                    SVN_DAV_ERROR_NAMESPACE,
-                                    SVN_DAV_ERROR_TAG);
+                                    "source");
     }
   if (! source->exists)
     {
-      return dav_svn__new_error_tag(pool, HTTP_METHOD_NOT_ALLOWED,
+      return dav_svn__new_error_svn(pool, HTTP_METHOD_NOT_ALLOWED,
                                     SVN_ERR_INCORRECT_PARAMS,
                                     "MERGE activity or transaction resource "
-                                    "does not exist.",
-                                    SVN_DAV_ERROR_NAMESPACE,
-                                    SVN_DAV_ERROR_TAG);
+                                    "does not exist");
     }
 
   /* Before attempting the final commit, we need to push any incoming

Propchange: subversion/branches/fsfs-ucsnorm/subversion/svn/cl-log.h
------------------------------------------------------------------------------
    svn:eol-style = native

Modified: subversion/branches/fsfs-ucsnorm/subversion/svn/info-cmd.c
URL: http://svn.apache.org/viewvc/subversion/branches/fsfs-ucsnorm/subversion/svn/info-cmd.c?rev=1556765&r1=1556764&r2=1556765&view=diff
==============================================================================
--- subversion/branches/fsfs-ucsnorm/subversion/svn/info-cmd.c (original)
+++ subversion/branches/fsfs-ucsnorm/subversion/svn/info-cmd.c Thu Jan  9 09:31:10 2014
@@ -643,9 +643,12 @@ svn_cl__info(apr_getopt_t *os,
           SVN_ERR(svn_dirent_get_absolute(&truepath, truepath, subpool));
         }
 
-      err = svn_client_info3(truepath,
+      err = svn_client_info4(truepath,
                              &peg_revision, &(opt_state->start_revision),
-                             opt_state->depth, TRUE, TRUE,
+                             opt_state->depth,
+                             TRUE /* fetch_excluded */,
+                             TRUE /* fetch_actual_only */,
+                             opt_state->include_externals,
                              opt_state->changelists,
                              receiver, (void *) path_prefix,
                              ctx, subpool);

Modified: subversion/branches/fsfs-ucsnorm/subversion/svn/log-cmd.c
URL: http://svn.apache.org/viewvc/subversion/branches/fsfs-ucsnorm/subversion/svn/log-cmd.c?rev=1556765&r1=1556764&r2=1556765&view=diff
==============================================================================
--- subversion/branches/fsfs-ucsnorm/subversion/svn/log-cmd.c (original)
+++ subversion/branches/fsfs-ucsnorm/subversion/svn/log-cmd.c Thu Jan  9 09:31:10 2014
@@ -37,6 +37,7 @@
 #include "svn_pools.h"
 
 #include "private/svn_cmdline_private.h"
+#include "private/svn_sorts_private.h"
 
 #include "cl.h"
 #include "cl-log.h"

Modified: subversion/branches/fsfs-ucsnorm/subversion/svn/notify.c
URL: http://svn.apache.org/viewvc/subversion/branches/fsfs-ucsnorm/subversion/svn/notify.c?rev=1556765&r1=1556764&r2=1556765&view=diff
==============================================================================
--- subversion/branches/fsfs-ucsnorm/subversion/svn/notify.c (original)
+++ subversion/branches/fsfs-ucsnorm/subversion/svn/notify.c Thu Jan  9 09:31:10 2014
@@ -808,6 +808,13 @@ notify(void *baton, const svn_wc_notify_
         goto print_error;
       break;
 
+    case svn_wc_notify_info_external:
+      if ((err = svn_cmdline_printf(
+            pool, _("\nPerforming info on external item at '%s':\n"),
+            path_local)))
+        goto print_error;
+      break;
+
     case svn_wc_notify_status_completed:
       if (SVN_IS_VALID_REVNUM(n->revision))
         if ((err = svn_cmdline_printf(pool,

Modified: subversion/branches/fsfs-ucsnorm/subversion/svn/propget-cmd.c
URL: http://svn.apache.org/viewvc/subversion/branches/fsfs-ucsnorm/subversion/svn/propget-cmd.c?rev=1556765&r1=1556764&r2=1556765&view=diff
==============================================================================
--- subversion/branches/fsfs-ucsnorm/subversion/svn/propget-cmd.c (original)
+++ subversion/branches/fsfs-ucsnorm/subversion/svn/propget-cmd.c Thu Jan  9 09:31:10 2014
@@ -45,7 +45,7 @@
 #include "cl.h"
 
 #include "private/svn_cmdline_private.h"
-
+#include "private/svn_sorts_private.h"
 
 /*** Code. ***/
 

Modified: subversion/branches/fsfs-ucsnorm/subversion/svn/svn.c
URL: http://svn.apache.org/viewvc/subversion/branches/fsfs-ucsnorm/subversion/svn/svn.c?rev=1556765&r1=1556764&r2=1556765&view=diff
==============================================================================
--- subversion/branches/fsfs-ucsnorm/subversion/svn/svn.c (original)
+++ subversion/branches/fsfs-ucsnorm/subversion/svn/svn.c Thu Jan  9 09:31:10 2014
@@ -660,7 +660,8 @@ const svn_opt_subcommand_desc2_t svn_cl_
      "  Print information about each TARGET (default: '.').\n"
      "  TARGET may be either a working-copy path or URL.  If specified, REV\n"
      "  determines in which revision the target is first looked up.\n"),
-    {'r', 'R', opt_depth, opt_targets, opt_incremental, opt_xml, opt_changelist}
+    {'r', 'R', opt_depth, opt_targets, opt_incremental, opt_xml,
+     opt_changelist, opt_include_externals}
   },
 
   { "list", svn_cl__list, {"ls"}, N_

Modified: subversion/branches/fsfs-ucsnorm/subversion/svnadmin/svnadmin.c
URL: http://svn.apache.org/viewvc/subversion/branches/fsfs-ucsnorm/subversion/svnadmin/svnadmin.c?rev=1556765&r1=1556764&r2=1556765&view=diff
==============================================================================
--- subversion/branches/fsfs-ucsnorm/subversion/svnadmin/svnadmin.c (original)
+++ subversion/branches/fsfs-ucsnorm/subversion/svnadmin/svnadmin.c Thu Jan  9 09:31:10 2014
@@ -45,9 +45,10 @@
 #include "svn_user.h"
 #include "svn_xml.h"
 
+#include "private/svn_cmdline_private.h"
 #include "private/svn_opt_private.h"
+#include "private/svn_sorts_private.h"
 #include "private/svn_subr_private.h"
-#include "private/svn_cmdline_private.h"
 
 
 /*** Code. ***/
@@ -100,7 +101,7 @@ warning_func(void *baton,
 {
   if (! err)
     return;
-  svn_handle_error2(err, stderr, FALSE, "svnadmin: ");
+  svn_handle_warning2(stderr, err, "svnadmin: ");
 }
 
 
@@ -304,10 +305,8 @@ static const apr_getopt_option_t options
     {"file", 'F', 1, N_("read repository paths from file ARG")},
 
     {"check-normalization", svnadmin__check_normalization, 0,
-     N_("report paths in the filesystem and mergeinfo\n"
-        "                             that are not normalized to Unicode Normalization\n"
-        "                             Form C, and any names within the same directory\n"
-        "                             or svn:mergeinfo property value that differ only\n"
+     N_("report any names within the same directory or\n"
+        "                             svn:mergeinfo property value that differ only\n"
         "                             in character representation, but are otherwise\n"
         "                             identical")},
 
@@ -1842,6 +1841,7 @@ subcommand_info(apr_getopt_t *os, void *
   svn_repos_t *repos;
   svn_fs_t *fs;
   int fs_format;
+  const char *uuid;
 
   /* Expect no more arguments. */
   SVN_ERR(parse_args(NULL, os, 0, 0, pool));
@@ -1852,6 +1852,8 @@ subcommand_info(apr_getopt_t *os, void *
                              svn_dirent_local_style(svn_repos_path(repos, pool),
                                                     pool)));
 
+  SVN_ERR(svn_fs_get_uuid(fs, &uuid, pool));
+  SVN_ERR(svn_cmdline_printf(pool, _("UUID: %s\n"), uuid));
   {
     int repos_format, minor;
     svn_version_t *repos_version, *fs_version;

Modified: subversion/branches/fsfs-ucsnorm/subversion/svnauth/svnauth.c
URL: http://svn.apache.org/viewvc/subversion/branches/fsfs-ucsnorm/subversion/svnauth/svnauth.c?rev=1556765&r1=1556764&r2=1556765&view=diff
==============================================================================
--- subversion/branches/fsfs-ucsnorm/subversion/svnauth/svnauth.c (original)
+++ subversion/branches/fsfs-ucsnorm/subversion/svnauth/svnauth.c Thu Jan  9 09:31:10 2014
@@ -47,6 +47,7 @@
 #include "svn_sorts.h"
 
 #include "private/svn_cmdline_private.h"
+#include "private/svn_sorts_private.h"
 #include "private/svn_token.h"
 
 /* Baton for passing option/argument state to a subcommand function. */
@@ -413,7 +414,7 @@ load_cert(serf_ssl_certificate_t **cert,
                                  ascii_cert));
       return SVN_NO_ERROR;
     }
-  SVN_ERR(svn_io_file_flush_to_disk(pem_file, scratch_pool));
+  SVN_ERR(svn_io_file_flush(pem_file, scratch_pool));
 
   status = serf_ssl_load_cert_file(cert, pem_path, result_pool);
   if (status)

Modified: subversion/branches/fsfs-ucsnorm/subversion/svnlook/svnlook.c
URL: http://svn.apache.org/viewvc/subversion/branches/fsfs-ucsnorm/subversion/svnlook/svnlook.c?rev=1556765&r1=1556764&r2=1556765&view=diff
==============================================================================
--- subversion/branches/fsfs-ucsnorm/subversion/svnlook/svnlook.c (original)
+++ subversion/branches/fsfs-ucsnorm/subversion/svnlook/svnlook.c Thu Jan  9 09:31:10 2014
@@ -55,10 +55,11 @@
 #include "svn_version.h"
 #include "svn_xml.h"
 
-#include "private/svn_diff_private.h"
 #include "private/svn_cmdline_private.h"
+#include "private/svn_diff_private.h"
 #include "private/svn_fspath.h"
 #include "private/svn_io_private.h"
+#include "private/svn_sorts_private.h"
 
 
 /*** Some convenience macros and types. ***/

Modified: subversion/branches/fsfs-ucsnorm/subversion/svnmucc/svnmucc.c
URL: http://svn.apache.org/viewvc/subversion/branches/fsfs-ucsnorm/subversion/svnmucc/svnmucc.c?rev=1556765&r1=1556764&r2=1556765&view=diff
==============================================================================
--- subversion/branches/fsfs-ucsnorm/subversion/svnmucc/svnmucc.c (original)
+++ subversion/branches/fsfs-ucsnorm/subversion/svnmucc/svnmucc.c Thu Jan  9 09:31:10 2014
@@ -76,43 +76,6 @@ check_lib_versions(void)
 }
 
 static svn_error_t *
-open_tmp_file(apr_file_t **fp,
-              void *callback_baton,
-              apr_pool_t *pool)
-{
-  /* Open a unique file;  use APR_DELONCLOSE. */
-  return svn_io_open_unique_file3(fp, NULL, NULL, svn_io_file_del_on_close,
-                                  pool, pool);
-}
-
-static svn_error_t *
-create_ra_callbacks(svn_ra_callbacks2_t **callbacks,
-                    const char *username,
-                    const char *password,
-                    const char *config_dir,
-                    svn_config_t *cfg_config,
-                    svn_boolean_t non_interactive,
-                    svn_boolean_t trust_server_cert,
-                    svn_boolean_t no_auth_cache,
-                    apr_pool_t *pool)
-{
-  SVN_ERR(svn_ra_create_callbacks(callbacks, pool));
-
-  SVN_ERR(svn_cmdline_create_auth_baton(&(*callbacks)->auth_baton,
-                                        non_interactive,
-                                        username, password, config_dir,
-                                        no_auth_cache,
-                                        trust_server_cert,
-                                        cfg_config, NULL, NULL, pool));
-
-  (*callbacks)->open_tmp_file = open_tmp_file;
-
-  return SVN_NO_ERROR;
-}
-
-
-
-static svn_error_t *
 commit_callback(const svn_commit_info_t *commit_info,
                 void *baton,
                 apr_pool_t *pool)
@@ -136,204 +99,6 @@ typedef enum action_code_t {
   ACTION_RM
 } action_code_t;
 
-struct operation {
-  enum {
-    OP_OPEN,
-    OP_DELETE,
-    OP_ADD,
-    OP_REPLACE,
-    OP_PROPSET           /* only for files for which no other operation is
-                            occuring; directories are OP_OPEN with non-empty
-                            props */
-  } operation;
-  svn_node_kind_t kind;  /* to copy, mkdir, put or set revprops */
-  svn_revnum_t rev;      /* to copy, valid for add and replace */
-  const char *url;       /* to copy, valid for add and replace */
-  const char *src_file;  /* for put, the source file for contents */
-  apr_hash_t *children;  /* const char *path -> struct operation * */
-  apr_hash_t *prop_mods; /* const char *prop_name ->
-                            const svn_string_t *prop_value */
-  apr_array_header_t *prop_dels; /* const char *prop_name deletions */
-  void *baton;           /* as returned by the commit editor */
-};
-
-
-/* Set node properties.
-   ... */
-static svn_error_t *
-change_props(const svn_delta_editor_t *editor,
-             void *baton,
-             struct operation *child,
-             apr_pool_t *pool)
-{
-  apr_pool_t *iterpool = svn_pool_create(pool);
-
-  if (child->prop_dels)
-    {
-      int i;
-      for (i = 0; i < child->prop_dels->nelts; i++)
-        {
-          const char *prop_name;
-
-          svn_pool_clear(iterpool);
-          prop_name = APR_ARRAY_IDX(child->prop_dels, i, const char *);
-          if (child->kind == svn_node_dir)
-            SVN_ERR(editor->change_dir_prop(baton, prop_name,
-                                            NULL, iterpool));
-          else
-            SVN_ERR(editor->change_file_prop(baton, prop_name,
-                                             NULL, iterpool));
-        }
-    }
-  if (apr_hash_count(child->prop_mods))
-    {
-      apr_hash_index_t *hi;
-      for (hi = apr_hash_first(pool, child->prop_mods);
-           hi; hi = apr_hash_next(hi))
-        {
-          const char *propname = svn__apr_hash_index_key(hi);
-          const svn_string_t *val = svn__apr_hash_index_val(hi);
-
-          svn_pool_clear(iterpool);
-          if (child->kind == svn_node_dir)
-            SVN_ERR(editor->change_dir_prop(baton, propname, val, iterpool));
-          else
-            SVN_ERR(editor->change_file_prop(baton, propname, val, iterpool));
-        }
-    }
-
-  svn_pool_destroy(iterpool);
-  return SVN_NO_ERROR;
-}
-
-
-/* Drive EDITOR to affect the change represented by OPERATION.  HEAD
-   is the last-known youngest revision in the repository. */
-static svn_error_t *
-drive(struct operation *operation,
-      svn_revnum_t head,
-      const svn_delta_editor_t *editor,
-      apr_pool_t *pool)
-{
-  apr_pool_t *subpool = svn_pool_create(pool);
-  apr_hash_index_t *hi;
-
-  for (hi = apr_hash_first(pool, operation->children);
-       hi; hi = apr_hash_next(hi))
-    {
-      const char *key = svn__apr_hash_index_key(hi);
-      struct operation *child = svn__apr_hash_index_val(hi);
-      void *file_baton = NULL;
-
-      svn_pool_clear(subpool);
-
-      /* Deletes and replacements are simple -- delete something. */
-      if (child->operation == OP_DELETE || child->operation == OP_REPLACE)
-        {
-          SVN_ERR(editor->delete_entry(key, head, operation->baton, subpool));
-        }
-      /* Opens could be for directories or files. */
-      if (child->operation == OP_OPEN || child->operation == OP_PROPSET)
-        {
-          if (child->kind == svn_node_dir)
-            {
-              SVN_ERR(editor->open_directory(key, operation->baton, head,
-                                             subpool, &child->baton));
-            }
-          else
-            {
-              SVN_ERR(editor->open_file(key, operation->baton, head,
-                                        subpool, &file_baton));
-            }
-        }
-      /* Adds and replacements could also be for directories or files. */
-      if (child->operation == OP_ADD || child->operation == OP_REPLACE)
-        {
-          if (child->kind == svn_node_dir)
-            {
-              SVN_ERR(editor->add_directory(key, operation->baton,
-                                            child->url, child->rev,
-                                            subpool, &child->baton));
-            }
-          else
-            {
-              SVN_ERR(editor->add_file(key, operation->baton, child->url,
-                                       child->rev, subpool, &file_baton));
-            }
-        }
-      /* If there's a source file and an open file baton, we get to
-         change textual contents. */
-      if ((child->src_file) && (file_baton))
-        {
-          svn_txdelta_window_handler_t handler;
-          void *handler_baton;
-          svn_stream_t *contents;
-
-          SVN_ERR(editor->apply_textdelta(file_baton, NULL, subpool,
-                                          &handler, &handler_baton));
-          if (strcmp(child->src_file, "-") != 0)
-            {
-              SVN_ERR(svn_stream_open_readonly(&contents, child->src_file,
-                                               pool, pool));
-            }
-          else
-            {
-              SVN_ERR(svn_stream_for_stdin(&contents, pool));
-            }
-          SVN_ERR(svn_txdelta_send_stream(contents, handler,
-                                          handler_baton, NULL, pool));
-        }
-      /* If we opened a file, we need to apply outstanding propmods,
-         then close it. */
-      if (file_baton)
-        {
-          if (child->kind == svn_node_file)
-            {
-              SVN_ERR(change_props(editor, file_baton, child, subpool));
-            }
-          SVN_ERR(editor->close_file(file_baton, NULL, subpool));
-        }
-      /* If we opened, added, or replaced a directory, we need to
-         recurse, apply outstanding propmods, and then close it. */
-      if ((child->kind == svn_node_dir)
-          && child->operation != OP_DELETE)
-        {
-          SVN_ERR(change_props(editor, child->baton, child, subpool));
-
-          SVN_ERR(drive(child, head, editor, subpool));
-
-          SVN_ERR(editor->close_directory(child->baton, subpool));
-        }
-    }
-  svn_pool_destroy(subpool);
-  return SVN_NO_ERROR;
-}
-
-
-/* Find the operation associated with PATH, which is a single-path
-   component representing a child of the path represented by
-   OPERATION.  If no such child operation exists, create a new one of
-   type OP_OPEN. */
-static struct operation *
-get_operation(const char *path,
-              struct operation *operation,
-              apr_pool_t *pool)
-{
-  struct operation *child = svn_hash_gets(operation->children, path);
-  if (! child)
-    {
-      child = apr_pcalloc(pool, sizeof(*child));
-      child->children = apr_hash_make(pool);
-      child->operation = OP_OPEN;
-      child->rev = SVN_INVALID_REVNUM;
-      child->kind = svn_node_dir;
-      child->prop_mods = apr_hash_make(pool);
-      child->prop_dels = apr_array_make(pool, 1, sizeof(const char *));
-      svn_hash_sets(operation->children, path, child);
-    }
-  return child;
-}
-
 /* Return the portion of URL that is relative to ANCHOR (URI-decoded). */
 static const char *
 subtract_anchor(const char *anchor, const char *url, apr_pool_t *pool)
@@ -341,221 +106,6 @@ subtract_anchor(const char *anchor, cons
   return svn_uri_skip_ancestor(anchor, url, pool);
 }
 
-/* Add PATH to the operations tree rooted at OPERATION, creating any
-   intermediate nodes that are required.  Here's what's expected for
-   each action type:
-
-      ACTION          URL    REV      SRC-FILE  PROPNAME
-      ------------    -----  -------  --------  --------
-      ACTION_MKDIR    NULL   invalid  NULL      NULL
-      ACTION_CP       valid  valid    NULL      NULL
-      ACTION_PUT      NULL   invalid  valid     NULL
-      ACTION_RM       NULL   invalid  NULL      NULL
-      ACTION_PROPSET  valid  invalid  NULL      valid
-      ACTION_PROPDEL  valid  invalid  NULL      valid
-
-   Node type information is obtained for any copy source (to determine
-   whether to create a file or directory) and for any deleted path (to
-   ensure it exists since svn_delta_editor_t->delete_entry doesn't
-   return an error on non-existent nodes). */
-static svn_error_t *
-build(action_code_t action,
-      const char *path,
-      const char *url,
-      svn_revnum_t rev,
-      const char *prop_name,
-      const svn_string_t *prop_value,
-      const char *src_file,
-      svn_revnum_t head,
-      const char *anchor,
-      svn_ra_session_t *session,
-      struct operation *operation,
-      apr_pool_t *pool)
-{
-  apr_array_header_t *path_bits = svn_path_decompose(path, pool);
-  const char *path_so_far = "";
-  const char *copy_src = NULL;
-  svn_revnum_t copy_rev = SVN_INVALID_REVNUM;
-  int i;
-
-  /* Look for any previous operations we've recognized for PATH.  If
-     any of PATH's ancestors have not yet been traversed, we'll be
-     creating OP_OPEN operations for them as we walk down PATH's path
-     components. */
-  for (i = 0; i < path_bits->nelts; ++i)
-    {
-      const char *path_bit = APR_ARRAY_IDX(path_bits, i, const char *);
-      path_so_far = svn_relpath_join(path_so_far, path_bit, pool);
-      operation = get_operation(path_so_far, operation, pool);
-
-      /* If we cross a replace- or add-with-history, remember the
-      source of those things in case we need to lookup the node kind
-      of one of their children.  And if this isn't such a copy,
-      but we've already seen one in of our parent paths, we just need
-      to extend that copy source path by our current path
-      component. */
-      if (operation->url
-          && SVN_IS_VALID_REVNUM(operation->rev)
-          && (operation->operation == OP_REPLACE
-              || operation->operation == OP_ADD))
-        {
-          copy_src = subtract_anchor(anchor, operation->url, pool);
-          copy_rev = operation->rev;
-        }
-      else if (copy_src)
-        {
-          copy_src = svn_relpath_join(copy_src, path_bit, pool);
-        }
-    }
-
-  /* Handle property changes. */
-  if (prop_name)
-    {
-      if (operation->operation == OP_DELETE)
-        return svn_error_createf(SVN_ERR_BAD_URL, NULL,
-                                 "cannot set properties on a location being"
-                                 " deleted ('%s')", path);
-      /* If we're not adding this thing ourselves, check for existence.  */
-      if (! ((operation->operation == OP_ADD) ||
-             (operation->operation == OP_REPLACE)))
-        {
-          SVN_ERR(svn_ra_check_path(session,
-                                    copy_src ? copy_src : path,
-                                    copy_src ? copy_rev : head,
-                                    &operation->kind, pool));
-          if (operation->kind == svn_node_none)
-            return svn_error_createf(SVN_ERR_BAD_URL, NULL,
-                                     "propset: '%s' not found", path);
-          else if ((operation->kind == svn_node_file)
-                   && (operation->operation == OP_OPEN))
-            operation->operation = OP_PROPSET;
-        }
-      if (! prop_value)
-        APR_ARRAY_PUSH(operation->prop_dels, const char *) = prop_name;
-      else
-        svn_hash_sets(operation->prop_mods, prop_name, prop_value);
-      if (!operation->rev)
-        operation->rev = rev;
-      return SVN_NO_ERROR;
-    }
-
-  /* We won't fuss about multiple operations on the same path in the
-     following cases:
-
-       - the prior operation was, in fact, a no-op (open)
-       - the prior operation was a propset placeholder
-       - the prior operation was a deletion
-
-     Note: while the operation structure certainly supports the
-     ability to do a copy of a file followed by a put of new contents
-     for the file, we don't let that happen (yet).
-  */
-  if (operation->operation != OP_OPEN
-      && operation->operation != OP_PROPSET
-      && operation->operation != OP_DELETE)
-    return svn_error_createf(SVN_ERR_BAD_URL, NULL,
-                             "unsupported multiple operations on '%s'", path);
-
-  /* For deletions, we validate that there's actually something to
-     delete.  If this is a deletion of the child of a copied
-     directory, we need to remember to look in the copy source tree to
-     verify that this thing actually exists. */
-  if (action == ACTION_RM)
-    {
-      operation->operation = OP_DELETE;
-      SVN_ERR(svn_ra_check_path(session,
-                                copy_src ? copy_src : path,
-                                copy_src ? copy_rev : head,
-                                &operation->kind, pool));
-      if (operation->kind == svn_node_none)
-        {
-          if (copy_src && strcmp(path, copy_src))
-            return svn_error_createf(SVN_ERR_BAD_URL, NULL,
-                                     "'%s' (from '%s:%ld') not found",
-                                     path, copy_src, copy_rev);
-          else
-            return svn_error_createf(SVN_ERR_BAD_URL, NULL, "'%s' not found",
-                                     path);
-        }
-    }
-  /* Handle copy operations (which can be adds or replacements). */
-  else if (action == ACTION_CP)
-    {
-      if (rev > head)
-        return svn_error_create(SVN_ERR_CL_ARG_PARSING_ERROR, NULL,
-                                "Copy source revision cannot be younger "
-                                "than base revision");
-      operation->operation =
-        operation->operation == OP_DELETE ? OP_REPLACE : OP_ADD;
-      if (operation->operation == OP_ADD)
-        {
-          /* There is a bug in the current version of mod_dav_svn
-             which incorrectly replaces existing directories.
-             Therefore we need to check if the target exists
-             and raise an error here. */
-          SVN_ERR(svn_ra_check_path(session,
-                                    copy_src ? copy_src : path,
-                                    copy_src ? copy_rev : head,
-                                    &operation->kind, pool));
-          if (operation->kind != svn_node_none)
-            {
-              if (copy_src && strcmp(path, copy_src))
-                return svn_error_createf(SVN_ERR_BAD_URL, NULL,
-                                         "'%s' (from '%s:%ld') already exists",
-                                         path, copy_src, copy_rev);
-              else
-                return svn_error_createf(SVN_ERR_BAD_URL, NULL,
-                                         "'%s' already exists", path);
-            }
-        }
-      SVN_ERR(svn_ra_check_path(session, subtract_anchor(anchor, url, pool),
-                                rev, &operation->kind, pool));
-      if (operation->kind == svn_node_none)
-        return svn_error_createf(SVN_ERR_BAD_URL, NULL,
-                                 "'%s' not found",
-                                  subtract_anchor(anchor, url, pool));
-      operation->url = url;
-      operation->rev = rev;
-    }
-  /* Handle mkdir operations (which can be adds or replacements). */
-  else if (action == ACTION_MKDIR)
-    {
-      operation->operation =
-        operation->operation == OP_DELETE ? OP_REPLACE : OP_ADD;
-      operation->kind = svn_node_dir;
-    }
-  /* Handle put operations (which can be adds, replacements, or opens). */
-  else if (action == ACTION_PUT)
-    {
-      if (operation->operation == OP_DELETE)
-        {
-          operation->operation = OP_REPLACE;
-        }
-      else
-        {
-          SVN_ERR(svn_ra_check_path(session,
-                                    copy_src ? copy_src : path,
-                                    copy_src ? copy_rev : head,
-                                    &operation->kind, pool));
-          if (operation->kind == svn_node_file)
-            operation->operation = OP_OPEN;
-          else if (operation->kind == svn_node_none)
-            operation->operation = OP_ADD;
-          else
-            return svn_error_createf(SVN_ERR_BAD_URL, NULL,
-                                     "'%s' is not a file", path);
-        }
-      operation->kind = svn_node_file;
-      operation->src_file = src_file;
-    }
-  else
-    {
-      /* We shouldn't get here. */
-      SVN_ERR_MALFUNCTION();
-    }
-
-  return SVN_NO_ERROR;
-}
 
 struct action {
   action_code_t action;
@@ -579,274 +129,89 @@ struct action {
   const svn_string_t *prop_value;
 };
 
-struct fetch_baton
-{
-  svn_ra_session_t *session;
-  svn_revnum_t head;
-};
-
-static svn_error_t *
-fetch_base_func(const char **filename,
-                void *baton,
-                const char *path,
-                svn_revnum_t base_revision,
-                apr_pool_t *result_pool,
-                apr_pool_t *scratch_pool)
-{
-  struct fetch_baton *fb = baton;
-  svn_stream_t *fstream;
-  svn_error_t *err;
-
-  if (! SVN_IS_VALID_REVNUM(base_revision))
-    base_revision = fb->head;
-
-  SVN_ERR(svn_stream_open_unique(&fstream, filename, NULL,
-                                 svn_io_file_del_on_pool_cleanup,
-                                 result_pool, scratch_pool));
-
-  err = svn_ra_get_file(fb->session, path, base_revision, fstream, NULL, NULL,
-                         scratch_pool);
-  if (err && err->apr_err == SVN_ERR_FS_NOT_FOUND)
-    {
-      svn_error_clear(err);
-      SVN_ERR(svn_stream_close(fstream));
-
-      *filename = NULL;
-      return SVN_NO_ERROR;
-    }
-  else if (err)
-    return svn_error_trace(err);
-
-  SVN_ERR(svn_stream_close(fstream));
-
-  return SVN_NO_ERROR;
-}
-
-static svn_error_t *
-fetch_props_func(apr_hash_t **props,
-                 void *baton,
-                 const char *path,
-                 svn_revnum_t base_revision,
-                 apr_pool_t *result_pool,
-                 apr_pool_t *scratch_pool)
-{
-  struct fetch_baton *fb = baton;
-  svn_node_kind_t node_kind;
-
-  if (! SVN_IS_VALID_REVNUM(base_revision))
-    base_revision = fb->head;
-
-  SVN_ERR(svn_ra_check_path(fb->session, path, base_revision, &node_kind,
-                            scratch_pool));
-
-  if (node_kind == svn_node_file)
-    {
-      SVN_ERR(svn_ra_get_file(fb->session, path, base_revision, NULL, NULL,
-                              props, result_pool));
-    }
-  else if (node_kind == svn_node_dir)
-    {
-      apr_array_header_t *tmp_props;
-
-      SVN_ERR(svn_ra_get_dir2(fb->session, NULL, NULL, props, path,
-                              base_revision, 0 /* Dirent fields */,
-                              result_pool));
-      tmp_props = svn_prop_hash_to_array(*props, result_pool);
-      SVN_ERR(svn_categorize_props(tmp_props, NULL, NULL, &tmp_props,
-                                   result_pool));
-      *props = svn_prop_array_to_hash(tmp_props, result_pool);
-    }
-  else
-    {
-      *props = apr_hash_make(result_pool);
-    }
-
-  return SVN_NO_ERROR;
-}
-
-static svn_error_t *
-fetch_kind_func(svn_node_kind_t *kind,
-                void *baton,
-                const char *path,
-                svn_revnum_t base_revision,
-                apr_pool_t *scratch_pool)
-{
-  struct fetch_baton *fb = baton;
-
-  if (! SVN_IS_VALID_REVNUM(base_revision))
-    base_revision = fb->head;
-
-  SVN_ERR(svn_ra_check_path(fb->session, path, base_revision, kind,
-                             scratch_pool));
-
-  return SVN_NO_ERROR;
-}
-
-static svn_delta_shim_callbacks_t *
-get_shim_callbacks(svn_ra_session_t *session,
-                   svn_revnum_t head,
-                   apr_pool_t *result_pool)
-{
-  svn_delta_shim_callbacks_t *callbacks =
-                            svn_delta_shim_callbacks_default(result_pool);
-  struct fetch_baton *fb = apr_pcalloc(result_pool, sizeof(*fb));
-
-  fb->session = session;
-  fb->head = head;
-
-  callbacks->fetch_props_func = fetch_props_func;
-  callbacks->fetch_kind_func = fetch_kind_func;
-  callbacks->fetch_base_func = fetch_base_func;
-  callbacks->fetch_baton = fb;
-
-  return callbacks;
-}
-
 static svn_error_t *
 execute(const apr_array_header_t *actions,
         const char *anchor,
         apr_hash_t *revprops,
-        const char *username,
-        const char *password,
-        const char *config_dir,
-        const apr_array_header_t *config_options,
-        svn_boolean_t non_interactive,
-        svn_boolean_t trust_server_cert,
-        svn_boolean_t no_auth_cache,
         svn_revnum_t base_revision,
+        svn_client_ctx_t *ctx,
         apr_pool_t *pool)
 {
-  svn_ra_session_t *session;
-  svn_ra_session_t *aux_session;
-  const char *repos_root;
-  svn_revnum_t head;
-  const svn_delta_editor_t *editor;
-  svn_ra_callbacks2_t *ra_callbacks;
-  void *editor_baton;
-  struct operation root;
+  svn_client_mtcc_t *mtcc;
+  apr_pool_t *iterpool = svn_pool_create(pool);
   svn_error_t *err;
-  apr_hash_t *config;
-  svn_config_t *cfg_config;
   int i;
 
-  SVN_ERR(svn_config_get_config(&config, config_dir, pool));
-  SVN_ERR(svn_cmdline__apply_config_options(config, config_options,
-                                            "svnmucc: ", "--config-option"));
-  cfg_config = svn_hash_gets(config, SVN_CONFIG_CATEGORY_CONFIG);
-
-  if (! svn_hash_gets(revprops, SVN_PROP_REVISION_LOG))
-    {
-      svn_string_t *msg = svn_string_create("", pool);
-
-      /* If we can do so, try to pop up $EDITOR to fetch a log message. */
-      if (non_interactive)
-        {
-          return svn_error_create
-            (SVN_ERR_CL_INSUFFICIENT_ARGS, NULL,
-             _("Cannot invoke editor to get log message "
-               "when non-interactive"));
-        }
-      else
-        {
-          SVN_ERR(svn_cmdline__edit_string_externally(
-                      &msg, NULL, NULL, "", msg, "svnmucc-commit", config,
-                      TRUE, NULL, apr_hash_pool_get(revprops)));
-        }
-
-      svn_hash_sets(revprops, SVN_PROP_REVISION_LOG, msg);
-    }
-
-  SVN_ERR(create_ra_callbacks(&ra_callbacks, username, password, config_dir,
-                              cfg_config, non_interactive, trust_server_cert,
-                              no_auth_cache, pool));
-  SVN_ERR(svn_ra_open4(&session, NULL, anchor, NULL, ra_callbacks,
-                       NULL, config, pool));
-  /* Open, then reparent to avoid AUTHZ errors when opening the reposroot */
-  SVN_ERR(svn_ra_open4(&aux_session, NULL, anchor, NULL, ra_callbacks,
-                       NULL, config, pool));
-  SVN_ERR(svn_ra_get_repos_root2(aux_session, &repos_root, pool));
-  SVN_ERR(svn_ra_reparent(aux_session, repos_root, pool));
-  SVN_ERR(svn_ra_get_latest_revnum(session, &head, pool));
-
-  /* Reparent to ANCHOR's dir, if ANCHOR is not a directory. */
-  {
-    svn_node_kind_t kind;
-
-    SVN_ERR(svn_ra_check_path(aux_session,
-                              svn_uri_skip_ancestor(repos_root, anchor, pool),
-                              head, &kind, pool));
-    if (kind != svn_node_dir)
-      {
-        anchor = svn_uri_dirname(anchor, pool);
-        SVN_ERR(svn_ra_reparent(session, anchor, pool));
-      }
-  }
-
-  if (SVN_IS_VALID_REVNUM(base_revision))
-    {
-      if (base_revision > head)
-        return svn_error_createf(SVN_ERR_FS_NO_SUCH_REVISION, NULL,
-                                 "No such revision %ld (youngest is %ld)",
-                                 base_revision, head);
-      head = base_revision;
-    }
-
-  memset(&root, 0, sizeof(root));
-  root.children = apr_hash_make(pool);
-  root.operation = OP_OPEN;
-  root.kind = svn_node_dir; /* For setting properties */
-  root.prop_mods = apr_hash_make(pool);
-  root.prop_dels = apr_array_make(pool, 1, sizeof(const char *));
+  SVN_ERR(svn_client_mtcc_create(&mtcc, anchor,
+                                 SVN_IS_VALID_REVNUM(base_revision)
+                                    ? base_revision
+                                    : SVN_INVALID_REVNUM,
+                                 ctx, pool, iterpool));
 
   for (i = 0; i < actions->nelts; ++i)
     {
       struct action *action = APR_ARRAY_IDX(actions, i, struct action *);
       const char *path1, *path2;
+      svn_node_kind_t kind;
+
+      svn_pool_clear(iterpool);
+
       switch (action->action)
         {
         case ACTION_MV:
           path1 = subtract_anchor(anchor, action->path[0], pool);
           path2 = subtract_anchor(anchor, action->path[1], pool);
-          SVN_ERR(build(ACTION_RM, path1, NULL,
-                        SVN_INVALID_REVNUM, NULL, NULL, NULL, head, anchor,
-                        session, &root, pool));
-          SVN_ERR(build(ACTION_CP, path2, action->path[0],
-                        head, NULL, NULL, NULL, head, anchor,
-                        session, &root, pool));
+          SVN_ERR(svn_client_mtcc_add_move(path1, path2, mtcc, iterpool));
           break;
         case ACTION_CP:
+          path1 = subtract_anchor(anchor, action->path[0], pool);
           path2 = subtract_anchor(anchor, action->path[1], pool);
-          if (action->rev == SVN_INVALID_REVNUM)
-            action->rev = head;
-          SVN_ERR(build(ACTION_CP, path2, action->path[0],
-                        action->rev, NULL, NULL, NULL, head, anchor,
-                        session, &root, pool));
+          SVN_ERR(svn_client_mtcc_add_copy(path1, action->rev, path2,
+                                           mtcc, iterpool));
           break;
         case ACTION_RM:
           path1 = subtract_anchor(anchor, action->path[0], pool);
-          SVN_ERR(build(ACTION_RM, path1, NULL,
-                        SVN_INVALID_REVNUM, NULL, NULL, NULL, head, anchor,
-                        session, &root, pool));
+          SVN_ERR(svn_client_mtcc_add_delete(path1, mtcc, iterpool));
           break;
         case ACTION_MKDIR:
           path1 = subtract_anchor(anchor, action->path[0], pool);
-          SVN_ERR(build(ACTION_MKDIR, path1, action->path[0],
-                        SVN_INVALID_REVNUM, NULL, NULL, NULL, head, anchor,
-                        session, &root, pool));
+          SVN_ERR(svn_client_mtcc_add_mkdir(path1, mtcc, iterpool));
           break;
         case ACTION_PUT:
           path1 = subtract_anchor(anchor, action->path[0], pool);
-          SVN_ERR(build(ACTION_PUT, path1, action->path[0],
-                        SVN_INVALID_REVNUM, NULL, NULL, action->path[1],
-                        head, anchor, session, &root, pool));
+          SVN_ERR(svn_client_mtcc_check_path(&kind, path1, TRUE, mtcc, pool));
+
+          if (kind == svn_node_dir)
+            {
+              SVN_ERR(svn_client_mtcc_add_delete(path1, mtcc, pool));
+              kind = svn_node_none;
+            }
+
+          {
+            svn_stream_t *src;
+
+            if (strcmp(action->path[1], "-") != 0)
+              SVN_ERR(svn_stream_open_readonly(&src, action->path[1],
+                                               pool, iterpool));
+            else
+              SVN_ERR(svn_stream_for_stdin(&src, pool));
+
+
+            if (kind == svn_node_file)
+              SVN_ERR(svn_client_mtcc_add_update_file(path1, src, NULL,
+                                                      NULL, NULL,
+                                                      mtcc, iterpool));
+            else if (kind == svn_node_none)
+              SVN_ERR(svn_client_mtcc_add_add_file(path1, src, NULL,
+                                                   mtcc, iterpool));
+          }
           break;
         case ACTION_PROPSET:
         case ACTION_PROPDEL:
           path1 = subtract_anchor(anchor, action->path[0], pool);
-          SVN_ERR(build(action->action, path1, action->path[0],
-                        SVN_INVALID_REVNUM,
-                        action->prop_name, action->prop_value,
-                        NULL, head, anchor, session, &root, pool));
+          SVN_ERR(svn_client_mtcc_add_propset(path1, action->prop_name,
+                                              action->prop_value, FALSE,
+                                              mtcc, iterpool));
           break;
         case ACTION_PROPSETF:
         default:
@@ -854,25 +219,11 @@ execute(const apr_array_header_t *action
         }
     }
 
-  SVN_ERR(svn_ra__register_editor_shim_callbacks(session,
-                            get_shim_callbacks(aux_session, head, pool)));
-  SVN_ERR(svn_ra_get_commit_editor3(session, &editor, &editor_baton, revprops,
-                                    commit_callback, NULL, NULL, FALSE, pool));
-
-  SVN_ERR(editor->open_root(editor_baton, head, pool, &root.baton));
-  err = change_props(editor, root.baton, &root, pool);
-  if (!err)
-    err = drive(&root, head, editor, pool);
-  if (!err)
-    err = editor->close_directory(root.baton, pool);
-  if (!err)
-    err = editor->close_edit(editor_baton, pool);
-
-  if (err)
-    err = svn_error_compose_create(err,
-                                   editor->abort_edit(editor_baton, pool));
+  err = svn_client_mtcc_commit(revprops, commit_callback, NULL,
+                               mtcc, iterpool);
 
-  return err;
+  svn_pool_destroy(iterpool);
+  return svn_error_trace(err);;
 }
 
 static svn_error_t *
@@ -985,42 +336,100 @@ mutually_exclusive_logs_error(void)
                             "exclusive"));
 }
 
-/* Ensure that the REVPROPS hash contains a command-line-provided log
-   message, if any, and that there was but one source of such a thing
-   provided on that command-line.  */
+/* Obtain the log message from multiple sources, producing an error
+   if there are multiple sources. Store the result in *FINAL_MESSAGE.  */
 static svn_error_t *
-sanitize_log_sources(apr_hash_t *revprops,
+sanitize_log_sources(const char **final_message,
                      const char *message,
-                     svn_stringbuf_t *filedata)
+                     apr_hash_t *revprops,
+                     svn_stringbuf_t *filedata,
+                     apr_pool_t *result_pool,
+                     apr_pool_t *scratch_pool)
 {
-  apr_pool_t *hash_pool = apr_hash_pool_get(revprops);
+  svn_string_t *msg;
 
+  *final_message = NULL;
   /* If we already have a log message in the revprop hash, then just
      make sure the user didn't try to also use -m or -F.  Otherwise,
      we need to consult -m or -F to find a log message, if any. */
-  if (svn_hash_gets(revprops, SVN_PROP_REVISION_LOG))
+  msg = svn_hash_gets(revprops, SVN_PROP_REVISION_LOG);
+  if (msg)
     {
       if (filedata || message)
         return mutually_exclusive_logs_error();
+
+      *final_message = apr_pstrdup(result_pool, msg->data);
+
+      /* Will be re-added by libsvn_client */
+      svn_hash_sets(revprops, SVN_PROP_REVISION_LOG, NULL);
     }
   else if (filedata)
     {
       if (message)
         return mutually_exclusive_logs_error();
 
-      SVN_ERR(svn_utf_cstring_to_utf8(&message, filedata->data, hash_pool));
-      svn_hash_sets(revprops, SVN_PROP_REVISION_LOG,
-                    svn_stringbuf__morph_into_string(filedata));
+      SVN_ERR(svn_utf_cstring_to_utf8(&message, filedata->data,
+                                      scratch_pool));
+
+      *final_message = apr_pstrdup(result_pool, message);
     }
   else if (message)
     {
-      svn_hash_sets(revprops, SVN_PROP_REVISION_LOG,
-                    svn_string_create(message, hash_pool));
+      *final_message = apr_pstrdup(result_pool, message);
     }
 
   return SVN_NO_ERROR;
 }
 
+/* Baton for log_message_func */
+struct log_message_baton
+{
+  svn_boolean_t non_interactive;
+  const char *log_message;
+  svn_client_ctx_t *ctx;
+};
+
+/* Implements svn_client_get_commit_log3_t */
+static svn_error_t *
+log_message_func(const char **log_msg,
+                 const char **tmp_file,
+                 const apr_array_header_t *commit_items,
+                 void *baton,
+                 apr_pool_t *pool)
+{
+  struct log_message_baton *lmb = baton;
+
+  *tmp_file = NULL;
+
+  if (lmb->log_message)
+    {
+      *log_msg = apr_pstrdup(pool, lmb->log_message);
+      return SVN_NO_ERROR;
+    }
+
+  if (lmb->non_interactive)
+    {
+      return svn_error_create(SVN_ERR_CL_INSUFFICIENT_ARGS, NULL,
+                              _("Cannot invoke editor to get log message "
+                                "when non-interactive"));
+    }
+  else
+    {
+      svn_string_t *msg = svn_string_create("", pool);
+
+      SVN_ERR(svn_cmdline__edit_string_externally(
+                      &msg, NULL, NULL, "", msg, "svnmucc-commit",
+                      lmb->ctx->config, TRUE, NULL, pool));
+
+      if (msg && msg->data)
+        *log_msg = msg->data;
+      else
+        *log_msg = NULL;
+
+      return SVN_NO_ERROR;
+    }
+}
+
 /*
  * On success, leave *EXIT_CODE untouched and return SVN_NO_ERROR. On error,
  * either return an error to be displayed, or set *EXIT_CODE to non-zero and
@@ -1077,6 +486,10 @@ sub_main(int *exit_code, int argc, const
   svn_revnum_t base_revision = SVN_INVALID_REVNUM;
   apr_array_header_t *action_args;
   apr_hash_t *revprops = apr_hash_make(pool);
+  apr_hash_t *cfg_hash;
+  svn_config_t *cfg_config;
+  svn_client_ctx_t *ctx;
+  struct log_message_baton lmb;
   int i;
 
   /* Check library versions */
@@ -1191,9 +604,6 @@ sub_main(int *exit_code, int argc, const
                                 "--non-interactive"));
     }
 
-  /* Make sure we have a log message to use. */
-  SVN_ERR(sanitize_log_sources(revprops, message, filedata));
-
   /* Copy the rest of our command-line arguments to an array,
      UTF-8-ing them along the way. */
   action_args = apr_array_make(pool, opts->argc, sizeof(const char *));
@@ -1220,6 +630,55 @@ sub_main(int *exit_code, int argc, const
                                FALSE, pool);
     }
 
+  /* Now initialize the client context */
+
+  err = svn_config_get_config(&cfg_hash, config_dir, pool);
+  if (err)
+    {
+      /* Fallback to default config if the config directory isn't readable
+         or is not a directory. */
+      if (APR_STATUS_IS_EACCES(err->apr_err)
+          || SVN__APR_STATUS_IS_ENOTDIR(err->apr_err))
+        {
+          svn_handle_warning2(stderr, err, "svnmucc: ");
+          svn_error_clear(err);
+          cfg_hash = NULL;
+        }
+      else
+        return err;
+    }
+
+  cfg_config = svn_hash_gets(cfg_hash, SVN_CONFIG_CATEGORY_CONFIG);
+  if (config_options)
+    {
+      svn_error_clear(
+          svn_cmdline__apply_config_options(cfg_hash, config_options,
+                                            "svnmucc: ", "--config-option"));
+    }
+
+  SVN_ERR(svn_client_create_context2(&ctx, cfg_hash, pool));
+
+  SVN_ERR(svn_cmdline_create_auth_baton(&ctx->auth_baton,
+                                        non_interactive,
+                                        username,
+                                        password,
+                                        config_dir,
+                                        no_auth_cache,
+                                        trust_server_cert,
+                                        cfg_config,
+                                        ctx->cancel_func,
+                                        ctx->cancel_baton,
+                                        pool));
+
+  lmb.non_interactive = non_interactive;
+  lmb.ctx = ctx;
+    /* Make sure we have a log message to use. */
+  SVN_ERR(sanitize_log_sources(&lmb.log_message, message, revprops, filedata,
+                               pool, pool));
+
+  ctx->log_msg_func3 = log_message_func;
+  ctx->log_msg_baton3 = &lmb;
+
   /* Now, we iterate over the combined set of arguments -- our actions. */
   for (i = 0; i < action_args->nelts; )
     {
@@ -1401,6 +860,7 @@ sub_main(int *exit_code, int argc, const
           if ((++i == action_args->nelts) && (j + 1 < num_url_args))
             return insufficient();
         }
+
       APR_ARRAY_PUSH(actions, struct action *) = action;
     }
 
@@ -1411,9 +871,7 @@ sub_main(int *exit_code, int argc, const
       return SVN_NO_ERROR;
     }
 
-  if ((err = execute(actions, anchor, revprops, username, password,
-                     config_dir, config_options, non_interactive,
-                     trust_server_cert, no_auth_cache, base_revision, pool)))
+  if ((err = execute(actions, anchor, revprops, base_revision, ctx, pool)))
     {
       if (err->apr_err == SVN_ERR_AUTHN_FAILED && non_interactive)
         err = svn_error_quick_wrap(err,

Modified: subversion/branches/fsfs-ucsnorm/subversion/svnserve/logger.c
URL: http://svn.apache.org/viewvc/subversion/branches/fsfs-ucsnorm/subversion/svnserve/logger.c?rev=1556765&r1=1556764&r2=1556765&view=diff
==============================================================================
--- subversion/branches/fsfs-ucsnorm/subversion/svnserve/logger.c (original)
+++ subversion/branches/fsfs-ucsnorm/subversion/svnserve/logger.c Thu Jan  9 09:31:10 2014
@@ -149,8 +149,7 @@ logger__log_error(logger_t *logger,
           if (len > sizeof(errstr) - sizeof(APR_EOL_STR)) {
             len = sizeof(errstr) - sizeof(APR_EOL_STR);
           }
-          strcpy(errstr + len, APR_EOL_STR);
-          len += strlen(APR_EOL_STR);
+          memcpy(errstr + len, APR_EOL_STR, sizeof(APR_EOL_STR));
           svn_error_clear(svn_stream_write(logger->stream, errstr, &len));
 
           continuation = "-";

Modified: subversion/branches/fsfs-ucsnorm/subversion/svnserve/serve.c
URL: http://svn.apache.org/viewvc/subversion/branches/fsfs-ucsnorm/subversion/svnserve/serve.c?rev=1556765&r1=1556764&r2=1556765&view=diff
==============================================================================
--- subversion/branches/fsfs-ucsnorm/subversion/svnserve/serve.c (original)
+++ subversion/branches/fsfs-ucsnorm/subversion/svnserve/serve.c Thu Jan  9 09:31:10 2014
@@ -3886,7 +3886,7 @@ serve_interruptable(svn_boolean_t *termi
                                   connection->params->compression_level,
                                   connection->params->zero_copy_limit,
                                   connection->params->error_check_interval,
-                                  pool);
+                                  connection->pool);
 
       /* Construct server baton and open the repository for the first time. */
       SVN_ERR(construct_server_baton(&connection->baton, connection->conn,

Modified: subversion/branches/fsfs-ucsnorm/subversion/svnsync/svnsync.c
URL: http://svn.apache.org/viewvc/subversion/branches/fsfs-ucsnorm/subversion/svnsync/svnsync.c?rev=1556765&r1=1556764&r2=1556765&view=diff
==============================================================================
--- subversion/branches/fsfs-ucsnorm/subversion/svnsync/svnsync.c (original)
+++ subversion/branches/fsfs-ucsnorm/subversion/svnsync/svnsync.c Thu Jan  9 09:31:10 2014
@@ -965,14 +965,18 @@ open_target_session(svn_ra_session_t **t
 typedef struct replay_baton_t {
   svn_ra_session_t *from_session;
   svn_ra_session_t *to_session;
-  /* Extra 'backdoor' session for fetching data *from* the target repo. */
-  svn_ra_session_t *extra_to_session;
   svn_revnum_t current_revision;
   subcommand_baton_t *sb;
   svn_boolean_t has_commit_revprops_capability;
+  svn_boolean_t has_atomic_revprops_capability;
   int normalized_rev_props_count;
   int normalized_node_props_count;
   const char *to_root;
+
+#ifdef ENABLE_EV2_SHIMS
+  /* Extra 'backdoor' session for fetching data *from* the target repo. */
+  svn_ra_session_t *extra_to_session;
+#endif
 } replay_baton_t;
 
 /* Return a replay baton allocated from POOL and populated with
@@ -1049,7 +1053,7 @@ filter_include_log(const char *key)
   return ! filter_exclude_log(key);
 }
 
-
+#ifdef ENABLE_EV2_SHIMS
 static svn_error_t *
 fetch_base_func(const char **filename,
                 void *baton,
@@ -1177,6 +1181,7 @@ get_shim_callbacks(replay_baton_t *rb,
 
   return callbacks;
 }
+#endif
 
 
 /* Callback function for svn_ra_replay_range, invoked when starting to parse
@@ -1245,8 +1250,10 @@ replay_rev_started(svn_revnum_t revision
                                      rb->sb->source_prop_encoding, pool));
   rb->normalized_rev_props_count += normalized_count;
 
+#ifdef ENABLE_EV2_SHIMS
   SVN_ERR(svn_ra__register_editor_shim_callbacks(rb->to_session,
                                 get_shim_callbacks(rb, pool)));
+#endif
   SVN_ERR(svn_ra_get_commit_editor3(rb->to_session, &commit_editor,
                                     &commit_baton,
                                     filtered,
@@ -1289,6 +1296,7 @@ replay_rev_finished(svn_revnum_t revisio
   apr_hash_t *filtered, *existing_props;
   int filtered_count;
   int normalized_count;
+  const svn_string_t *rev_str;
 
   SVN_ERR(editor->close_edit(edit_baton, pool));
 
@@ -1328,21 +1336,24 @@ replay_rev_finished(svn_revnum_t revisio
 
   svn_pool_clear(subpool);
 
+  rev_str = svn_string_create(apr_psprintf(pool, "%ld", revision), subpool);
+
   /* Ok, we're done, bring the last-merged-rev property up to date. */
   SVN_ERR(svn_ra_change_rev_prop2(
            rb->to_session,
            0,
            SVNSYNC_PROP_LAST_MERGED_REV,
            NULL,
-           svn_string_create(apr_psprintf(pool, "%ld", revision),
-                             subpool),
+           rev_str,
            subpool));
 
   /* And finally drop the currently copying prop, since we're done
      with this revision. */
   SVN_ERR(svn_ra_change_rev_prop2(rb->to_session, 0,
                                   SVNSYNC_PROP_CURRENTLY_COPYING,
-                                  NULL, NULL, subpool));
+                                  rb->has_atomic_revprops_capability
+                                    ? &rev_str : NULL,
+                                  NULL, subpool));
 
   /* Notify the user that we copied revision properties. */
   if (! rb->sb->quiet)
@@ -1472,6 +1483,11 @@ do_synchronize(svn_ra_session_t *to_sess
                                 SVN_RA_CAPABILITY_COMMIT_REVPROPS,
                                 pool));
 
+  SVN_ERR(svn_ra_has_capability(rb->to_session,
+                                &rb->has_atomic_revprops_capability,
+                                SVN_RA_CAPABILITY_ATOMIC_REVPROPS,
+                                pool));
+
   start_revision = last_merged + 1;
   end_revision = from_latest;
 

Modified: subversion/branches/fsfs-ucsnorm/subversion/tests/cmdline/README
URL: http://svn.apache.org/viewvc/subversion/branches/fsfs-ucsnorm/subversion/tests/cmdline/README?rev=1556765&r1=1556764&r2=1556765&view=diff
==============================================================================
--- subversion/branches/fsfs-ucsnorm/subversion/tests/cmdline/README (original)
+++ subversion/branches/fsfs-ucsnorm/subversion/tests/cmdline/README Thu Jan  9 09:31:10 2014
@@ -151,7 +151,13 @@ it will run just one suite or just one t
      $ ./davautocheck.sh basic
      $ ./davautocheck.sh basic 15
 
-It also respects some environment variables.
+With '--no-tests' argument, it will start httpd but not run any tests.  This is
+useful for manual testing --- create repositories in
+./svn-test-work/repositories/<$repo> and they will be accessible at
+<URL>/svn-test-work/repositories/<$repo>.  You can also run individual tests by passing the --url option to them, as described above.
+
+davautocheck.sh also respects some environment variables; see the comments at
+the top of the script for details.
 
 Running over ra_svn
 -------------------

Modified: subversion/branches/fsfs-ucsnorm/subversion/tests/cmdline/authz_tests.py
URL: http://svn.apache.org/viewvc/subversion/branches/fsfs-ucsnorm/subversion/tests/cmdline/authz_tests.py?rev=1556765&r1=1556764&r2=1556765&view=diff
==============================================================================
--- subversion/branches/fsfs-ucsnorm/subversion/tests/cmdline/authz_tests.py (original)
+++ subversion/branches/fsfs-ucsnorm/subversion/tests/cmdline/authz_tests.py Thu Jan  9 09:31:10 2014
@@ -169,7 +169,7 @@ def authz_read_access(sbox):
   fws_empty_folder_url = fws_url + '/empty folder'
 
   if sbox.repo_url.startswith("http"):
-    expected_err = ".*[Ff]orbidden.*"
+    expected_err = ".*svn: E175013: .*[Ff]orbidden.*"
   else:
     expected_err = ".*svn: E170001: Authorization failed.*"
 
@@ -291,7 +291,7 @@ def authz_write_access(sbox):
   write_restrictive_svnserve_conf(sbox.repo_dir)
 
   if sbox.repo_url.startswith('http'):
-    expected_err = ".*[Ff]orbidden.*"
+    expected_err = ".*svn: E175013: .*[Ff]orbidden.*"
   else:
     expected_err = ".*svn: E220004: Access denied.*"
 
@@ -387,7 +387,7 @@ def authz_checkout_test(sbox):
 
   # write an authz file with *= on /
   if sbox.repo_url.startswith('http'):
-    expected_err = ".*[Ff]orbidden.*"
+    expected_err = ".*svn: E175013: .*[Ff]orbidden.*"
   else:
     expected_err = ".*svn: E170001: Authorization failed.*"
 
@@ -524,7 +524,7 @@ def authz_log_and_tracing_test(sbox):
 
   # write an authz file with *=rw on /
   if sbox.repo_url.startswith('http'):
-    expected_err = ".*[Ff]orbidden.*"
+    expected_err = ".*svn: E175013: .*[Ff]orbidden.*"
   else:
     expected_err = ".*svn: E170001: Authorization failed.*"
 
@@ -555,7 +555,7 @@ def authz_log_and_tracing_test(sbox):
   # now disable read access on the first version of rho, keep the copy in
   # /A/D readable.
   if sbox.repo_url.startswith('http'):
-    expected_err = ".*[Ff]orbidden.*"
+    expected_err = ".*svn: E175013: .*[Ff]orbidden.*"
   else:
     expected_err = ".*svn: E170001: Authorization failed.*"
 
@@ -576,8 +576,8 @@ def authz_log_and_tracing_test(sbox):
   if sbox.repo_url.startswith('http'):
     expected_err2 = expected_err
   else:
-    expected_err2 = ".*svn: E220001: Unreadable path encountered; " \
-                    "access denied.*"
+    expected_err2 = ".*svn: E220001: ((Unreadable path encountered; " \
+                    "access denied)|(Item is not readable)).*"
 
   # if we do the same thing directly on the unreadable file, we get:
   # svn: Item is not readable
@@ -644,7 +644,7 @@ def authz_aliases(sbox):
   write_restrictive_svnserve_conf(sbox.repo_dir)
 
   if sbox.repo_url.startswith("http"):
-    expected_err = ".*[Ff]orbidden.*"
+    expected_err = ".*svn: E175013: .*[Ff]orbidden.*"
   else:
     expected_err = ".*svn: E170001: Authorization failed.*"
 
@@ -691,7 +691,7 @@ def authz_validate(sbox):
                            "/A/B" : "@undefined_group = rw" })
 
   if sbox.repo_url.startswith("http"):
-    expected_err = ".*[Ff]orbidden.*"
+    expected_err = ".*svn: E175013: .*[Ff]orbidden.*"
   elif sbox.repo_url.startswith("svn"):
     expected_err = ".*Invalid authz configuration"
   else:
@@ -711,7 +711,7 @@ devs2 = @admins, dev2
 devs = @devs1, dev3, dev4""" })
 
   if sbox.repo_url.startswith("http"):
-    expected_err = ".*[Ff]orbidden.*"
+    expected_err = ".*svn: E175013: .*[Ff]orbidden.*"
   elif sbox.repo_url.startswith("svn"):
     expected_err = ".*Invalid authz configuration"
   else:
@@ -751,7 +751,7 @@ def authz_locking(sbox):
   write_restrictive_svnserve_conf(sbox.repo_dir)
 
   if sbox.repo_url.startswith('http'):
-    expected_err = ".*[Ff]orbidden.*"
+    expected_err = ".*svn: E175013: .*[Ff]orbidden.*"
   else:
     expected_err = ".*svn: E170001: Authorization failed.*"
 
@@ -980,7 +980,7 @@ def multiple_matches(sbox):
   root_url = sbox.repo_url
   write_restrictive_svnserve_conf(sbox.repo_dir)
   if sbox.repo_url.startswith("http"):
-    expected_err = ".*[Ff]orbidden.*"
+    expected_err = ".*svn: E175013: .*[Ff]orbidden.*"
   else:
     expected_err = ".*svn: E170001: Authorization failed.*"
 
@@ -1281,7 +1281,7 @@ def wc_commit_error_handling(sbox):
   write_authz_file(sbox, {'/'   : '* = r', })
 
   # Creating editor fail: unfriendly error
-  expected_err = "(svn: E175013: .*orbidden.*)|" + \
+  expected_err = "(svn: E175013: .*[Ff]orbidden.*)|" + \
                  "(svn: E170001: Authorization failed)"
   svntest.actions.run_and_verify_svn(None, None, expected_err,
                                      'ci', wc_dir, '-m', '')
@@ -1315,7 +1315,7 @@ def wc_commit_error_handling(sbox):
 
   # Allow a generic dav error and the ra_svn specific one that is returned
   # on editor->edit_close().
-  expected_err = "(svn: E175013: .*orbidden.*)|" + \
+  expected_err = "(svn: E175013: .*[Ff]orbidden.*)|" + \
                  "(svn: E220004: Access denied)"
   svntest.actions.run_and_verify_svn(None, None, expected_err,
                                      'ci', wc_dir, '-m', '')
@@ -1532,7 +1532,6 @@ def authz_del_from_subdir(sbox):
                                       '-m', '')
 
 
-@XFail()
 @SkipUnless(svntest.main.is_ra_type_dav) # dontdothat is dav only
 @SkipUnless(svntest.main.is_os_windows) # until the buildbots are configured
 def log_diff_dontdothat(sbox):
@@ -1547,7 +1546,8 @@ def log_diff_dontdothat(sbox):
 
   # We should expect a PASS or a proper error message instead of
   # svn: E175009: XML parsing failed: (403 Forbidden)
-  svntest.actions.run_and_verify_svn(None, None, [],
+  expected_err = ".*E175013: Access to '.*authz_tests-28.*' forbidden"
+  svntest.actions.run_and_verify_svn(None, None, expected_err,
                                       'log', ddt_url,
                                       '-c', 1, '--diff')
 

Modified: subversion/branches/fsfs-ucsnorm/subversion/tests/cmdline/basic_tests.py
URL: http://svn.apache.org/viewvc/subversion/branches/fsfs-ucsnorm/subversion/tests/cmdline/basic_tests.py?rev=1556765&r1=1556764&r2=1556765&view=diff
==============================================================================
--- subversion/branches/fsfs-ucsnorm/subversion/tests/cmdline/basic_tests.py (original)
+++ subversion/branches/fsfs-ucsnorm/subversion/tests/cmdline/basic_tests.py Thu Jan  9 09:31:10 2014
@@ -1501,7 +1501,7 @@ def nonexistent_repository(sbox):
     'log', 'file:///nonexistent_path')
 
   for line in errput:
-    if re.match(".*Unable to open an ra_local session to URL.*", line):
+    if re.match(".*Unable to connect to a repository at URL.*", line):
       return
 
   # Else never matched the expected error output, so the test failed.