You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@subversion.apache.org by st...@apache.org on 2016/04/29 20:38:56 UTC

svn commit: r1741682 [18/26] - in /subversion/branches/authzperf: ./ build/ build/ac-macros/ build/generator/ contrib/server-side/svncutter/ notes/ notes/api-errata/1.9/ notes/move-tracking/ subversion/ subversion/bindings/ctypes-python/ subversion/bin...

Modified: subversion/branches/authzperf/subversion/mod_dav_svn/reports/log.c
URL: http://svn.apache.org/viewvc/subversion/branches/authzperf/subversion/mod_dav_svn/reports/log.c?rev=1741682&r1=1741681&r2=1741682&view=diff
==============================================================================
--- subversion/branches/authzperf/subversion/mod_dav_svn/reports/log.c (original)
+++ subversion/branches/authzperf/subversion/mod_dav_svn/reports/log.c Fri Apr 29 18:38:53 2016
@@ -56,6 +56,11 @@ struct log_receiver_baton
      writes to support mod_dav-based error handling. */
   svn_boolean_t needs_header;
 
+  /* Whether we've written the <S:log-item> header for the current revision.
+     Allows for lazy XML node creation while receiving the data through
+     callbacks. */
+  svn_boolean_t needs_log_item;
+
   /* How deep we are in the log message tree.  We only need to surpress the
      SVN_INVALID_REVNUM message if the stack_depth is 0. */
   int stack_depth;
@@ -88,6 +93,22 @@ maybe_send_header(struct log_receiver_ba
                                     "xmlns:D=\"DAV:\">" DEBUG_CR));
       lrb->needs_header = FALSE;
     }
+
+  return SVN_NO_ERROR;
+}
+
+/* If LRB->needs_log_item is true, send the "<S:log-item>" start
+   element and set LRB->needs_log_item to zero.  Else do nothing. */
+static svn_error_t *
+maybe_start_log_item(struct log_receiver_baton *lrb)
+{
+  if (lrb->needs_log_item)
+    {
+      SVN_ERR(dav_svn__brigade_printf(lrb->bb, lrb->output,
+                                      "<S:log-item>" DEBUG_CR));
+      lrb->needs_log_item = FALSE;
+    }
+
   return SVN_NO_ERROR;
 }
 
@@ -99,17 +120,22 @@ maybe_send_header(struct log_receiver_ba
 static svn_error_t *
 start_path_with_copy_from(const char **element,
                           struct log_receiver_baton *lrb,
-                          svn_log_changed_path2_t *log_item,
+                          svn_repos_path_change_t *log_item,
                           apr_pool_t *pool)
 {
-  switch (log_item->action)
+  switch (log_item->change_kind)
     {
-      case 'A': *element = "S:added-path";
-                break;
-      case 'R': *element = "S:replaced-path";
-                break;
-      default:  /* Caller, you did wrong! */
-                SVN_ERR_MALFUNCTION();
+      case svn_fs_path_change_add: 
+        *element = "S:added-path";
+        break;
+
+      case svn_fs_path_change_replace:
+        *element = "S:replaced-path";
+        break;
+
+      default:
+        /* Caller, you did wrong! */
+        SVN_ERR_MALFUNCTION();
     }
 
   if (log_item->copyfrom_path
@@ -129,15 +155,76 @@ start_path_with_copy_from(const char **e
 }
 
 
-/* This implements `svn_log_entry_receiver_t'.
+/* This implements `svn_repos_path_change_receiver_t'.
+   BATON is a `struct log_receiver_baton *'.  */
+static svn_error_t *
+log_change_receiver(void *baton,
+                    svn_repos_path_change_t *change,
+                    apr_pool_t *scratch_pool)
+{
+  struct log_receiver_baton *lrb = baton;
+  const char *close_element = NULL;
+
+  /* We must open the XML nodes for the report and log-item before
+     sending the first changed path.
+
+     Note that we can't get here for empty revisions that log() injects
+     to indicate the end of a recursive merged rev sequence.
+   */
+  SVN_ERR(maybe_send_header(lrb));
+  SVN_ERR(maybe_start_log_item(lrb));
+
+  /* ### todo: is there a D: namespace equivalent for
+      `changed-path'?  Should use it if so. */
+  switch (change->change_kind)
+    {
+    case svn_fs_path_change_add:
+    case svn_fs_path_change_replace:
+      SVN_ERR(start_path_with_copy_from(&close_element, lrb,
+                                        change, scratch_pool));
+      break;
+
+    case svn_fs_path_change_delete:
+      SVN_ERR(dav_svn__brigade_puts(lrb->bb, lrb->output,
+                                    "<S:deleted-path"));
+      close_element = "S:deleted-path";
+      break;
+
+    case svn_fs_path_change_modify:
+      SVN_ERR(dav_svn__brigade_puts(lrb->bb, lrb->output,
+                                    "<S:modified-path"));
+      close_element = "S:modified-path";
+      break;
+
+    default:
+      break;
+    }
+
+  /* If we need to close the element, then send the attributes
+      that apply to all changed items and then close the element. */
+  if (close_element)
+    SVN_ERR(dav_svn__brigade_printf
+             (lrb->bb, lrb->output,
+              " node-kind=\"%s\""
+              " text-mods=\"%s\""
+              " prop-mods=\"%s\">%s</%s>" DEBUG_CR,
+              svn_node_kind_to_word(change->node_kind),
+              change->text_mod ? "true" : "false",
+              change->prop_mod ? "true" : "false",
+              apr_xml_quote_string(scratch_pool, change->path.data, 0),
+              close_element));
+
+  return SVN_NO_ERROR;
+}
+
+/* This implements `svn_repos_log_entry_receiver_t'.
    BATON is a `struct log_receiver_baton *'.  */
 static svn_error_t *
-log_receiver(void *baton,
-             svn_log_entry_t *log_entry,
-             apr_pool_t *pool)
+log_revision_receiver(void *baton,
+                      svn_repos_log_entry_t *log_entry,
+                      apr_pool_t *scratch_pool)
 {
   struct log_receiver_baton *lrb = baton;
-  apr_pool_t *iterpool = svn_pool_create(pool);
 
   SVN_ERR(maybe_send_header(lrb));
 
@@ -151,15 +238,24 @@ log_receiver(void *baton,
         lrb->stack_depth--;
     }
 
+  /* If we have not received any path changes, the log-item XML node
+     still needs to be opened.  Also, reset the controlling flag to
+     prepare it for the next revision - if there should be one. */
+  SVN_ERR(maybe_start_log_item(lrb));
+  lrb->needs_log_item = TRUE;
+
+  /* Path changes have been processed already. 
+     Now send the remaining per-revision info. */
   SVN_ERR(dav_svn__brigade_printf(lrb->bb, lrb->output,
-                                  "<S:log-item>" DEBUG_CR "<D:version-name>%ld"
+                                  "<D:version-name>%ld"
                                   "</D:version-name>" DEBUG_CR,
                                   log_entry->revision));
 
   if (log_entry->revprops)
     {
+      apr_pool_t *iterpool = svn_pool_create(scratch_pool);
       apr_hash_index_t *hi;
-      for (hi = apr_hash_first(pool, log_entry->revprops);
+      for (hi = apr_hash_first(scratch_pool, log_entry->revprops);
            hi != NULL;
            hi = apr_hash_next(hi))
         {
@@ -200,7 +296,7 @@ log_receiver(void *baton,
             SVN_ERR(dav_svn__brigade_printf
                     (lrb->bb, lrb->output,
                      "<D:comment%s>%s</D:comment>" DEBUG_CR, encoding_str,
-                     apr_xml_quote_string(pool,
+                     apr_xml_quote_string(scratch_pool,
                                           svn_xml_fuzzy_escape(value->data,
                                                                iterpool), 0)));
           else
@@ -210,6 +306,8 @@ log_receiver(void *baton,
                      apr_xml_quote_string(iterpool, name, 0), encoding_str,
                      apr_xml_quote_string(iterpool, value->data, 0)));
         }
+
+      svn_pool_destroy(iterpool);
     }
 
   if (log_entry->has_children)
@@ -222,67 +320,6 @@ log_receiver(void *baton,
     SVN_ERR(dav_svn__brigade_puts(lrb->bb, lrb->output,
                                   "<S:subtractive-merge/>"));
 
-  if (log_entry->changed_paths2)
-    {
-      apr_hash_index_t *hi;
-      char *path;
-
-      for (hi = apr_hash_first(pool, log_entry->changed_paths2);
-           hi != NULL;
-           hi = apr_hash_next(hi))
-        {
-          void *val;
-          svn_log_changed_path2_t *log_item;
-          const char *close_element = NULL;
-
-          svn_pool_clear(iterpool);
-          apr_hash_this(hi, (void *) &path, NULL, &val);
-          log_item = val;
-
-          /* ### todo: is there a D: namespace equivalent for
-             `changed-path'?  Should use it if so. */
-          switch (log_item->action)
-            {
-            case 'A':
-            case 'R':
-              SVN_ERR(start_path_with_copy_from(&close_element, lrb,
-                                                log_item, iterpool));
-              break;
-
-            case 'D':
-              SVN_ERR(dav_svn__brigade_puts(lrb->bb, lrb->output,
-                                            "<S:deleted-path"));
-              close_element = "S:deleted-path";
-              break;
-
-            case 'M':
-              SVN_ERR(dav_svn__brigade_puts(lrb->bb, lrb->output,
-                                            "<S:modified-path"));
-              close_element = "S:modified-path";
-              break;
-
-            default:
-              break;
-            }
-
-          /* If we need to close the element, then send the attributes
-             that apply to all changed items and then close the element. */
-          if (close_element)
-            SVN_ERR(dav_svn__brigade_printf
-                    (lrb->bb, lrb->output,
-                     " node-kind=\"%s\""
-                     " text-mods=\"%s\""
-                     " prop-mods=\"%s\">%s</%s>" DEBUG_CR,
-                     svn_node_kind_to_word(log_item->node_kind),
-                     svn_tristate__to_word(log_item->text_modified),
-                     svn_tristate__to_word(log_item->props_modified),
-                     apr_xml_quote_string(iterpool, path, 0),
-                     close_element));
-        }
-    }
-
-  svn_pool_destroy(iterpool);
-
   SVN_ERR(dav_svn__brigade_puts(lrb->bb, lrb->output,
                                 "</S:log-item>" DEBUG_CR));
 
@@ -463,6 +500,7 @@ dav_svn__log_report(const dav_resource *
                               output->c->bucket_alloc);
   lrb.output = output;
   lrb.needs_header = TRUE;
+  lrb.needs_log_item = TRUE;
   lrb.stack_depth = 0;
   /* lrb.requested_custom_revprops set above */
 
@@ -475,18 +513,20 @@ dav_svn__log_report(const dav_resource *
      flag in our log_receiver_baton structure). */
 
   /* Send zero or more log items. */
-  serr = svn_repos_get_logs4(repos->repos,
+  serr = svn_repos_get_logs5(repos->repos,
                              paths,
                              start,
                              end,
                              limit,
-                             discover_changed_paths,
                              strict_node_history,
                              include_merged_revisions,
                              revprops,
                              dav_svn__authz_read_func(&arb),
                              &arb,
-                             log_receiver,
+                             discover_changed_paths ? log_change_receiver
+                                                    : NULL,
+                             &lrb,
+                             log_revision_receiver,
                              &lrb,
                              resource->pool);
   if (serr)

Modified: subversion/branches/authzperf/subversion/mod_dav_svn/reports/update.c
URL: http://svn.apache.org/viewvc/subversion/branches/authzperf/subversion/mod_dav_svn/reports/update.c?rev=1741682&r1=1741681&r2=1741682&view=diff
==============================================================================
--- subversion/branches/authzperf/subversion/mod_dav_svn/reports/update.c (original)
+++ subversion/branches/authzperf/subversion/mod_dav_svn/reports/update.c Fri Apr 29 18:38:53 2016
@@ -970,7 +970,7 @@ dav_svn__update_report(const dav_resourc
   dav_error *derr = NULL;
   const char *src_path = NULL;
   const char *dst_path = NULL;
-  const dav_svn_repos *repos = resource->info->repos;
+  dav_svn_repos *repos = resource->info->repos;
   const char *target = "";
   svn_boolean_t text_deltas = TRUE;
   svn_depth_t requested_depth = svn_depth_unknown;
@@ -1028,7 +1028,7 @@ dav_svn__update_report(const dav_resourc
 
   /* Ask the repository about its youngest revision (which we'll need
      for some input validation later). */
-  if ((serr = svn_fs_youngest_rev(&youngest, repos->fs, resource->pool)))
+  if ((serr = dav_svn__get_youngest_rev(&youngest, repos, resource->pool)))
     return dav_svn__convert_err(serr, HTTP_INTERNAL_SERVER_ERROR,
                                 "Could not determine the youngest "
                                 "revision for the update process.",

Modified: subversion/branches/authzperf/subversion/mod_dav_svn/repos.c
URL: http://svn.apache.org/viewvc/subversion/branches/authzperf/subversion/mod_dav_svn/repos.c?rev=1741682&r1=1741681&r2=1741682&view=diff
==============================================================================
--- subversion/branches/authzperf/subversion/mod_dav_svn/repos.c (original)
+++ subversion/branches/authzperf/subversion/mod_dav_svn/repos.c Fri Apr 29 18:38:53 2016
@@ -173,6 +173,9 @@ parse_version_uri(dav_resource_combined
   if (comb->priv.root.rev == SVN_INVALID_REVNUM)
     return TRUE;
 
+  /* We have idempotent resource. */
+  comb->priv.idempotent = TRUE;
+
   return FALSE;
 }
 
@@ -447,6 +450,9 @@ parse_revstub_uri(dav_resource_combined
   /* which baseline (revision tree) to access */
   comb->priv.root.rev = revnum;
 
+  /* all resource parameters are fixed in URI. */
+  comb->priv.idempotent = TRUE;
+
   /* NOTE: comb->priv.repos_path == NULL */
   /* NOTE: comb->priv.created_rev == SVN_INVALID_REVNUM */
 
@@ -804,7 +810,7 @@ prep_regular(dav_resource_combined *comb
      ### other cases besides a BC? */
   if (comb->priv.root.rev == SVN_INVALID_REVNUM)
     {
-      serr = svn_fs_youngest_rev(&comb->priv.root.rev, repos->fs, pool);
+      serr = dav_svn__get_youngest_rev(&comb->priv.root.rev, repos, pool);
       if (serr != NULL)
         {
           return dav_svn__convert_err(serr, HTTP_INTERNAL_SERVER_ERROR,
@@ -813,6 +819,21 @@ prep_regular(dav_resource_combined *comb
                                       pool);
         }
     }
+  else
+    {
+      /* Did we have a query for this REGULAR resource? */
+      if (comb->priv.r->parsed_uri.query)
+        {
+          /* If yes, it's 'idempotent' only if peg revision is specified. */
+          comb->priv.idempotent = comb->priv.pegged;
+        }
+      else
+        {
+          /* Otherwise, we have the specific revision in URI, so the resource
+             is 'idempotent'. */
+          comb->priv.idempotent = TRUE;
+        }
+    }
 
   /* get the root of the tree */
   serr = svn_fs_revision_root(&comb->priv.root.root, repos->fs,
@@ -858,9 +879,9 @@ prep_version(dav_resource_combined *comb
   /* if we don't have a revision, then assume the youngest */
   if (!SVN_IS_VALID_REVNUM(comb->priv.root.rev))
     {
-      serr = svn_fs_youngest_rev(&comb->priv.root.rev,
-                                 comb->priv.repos->fs,
-                                 pool);
+      serr = dav_svn__get_youngest_rev(&comb->priv.root.rev,
+                                       comb->priv.repos,
+                                       pool);
       if (serr != NULL)
         {
           /* ### might not be a baseline */
@@ -1562,6 +1583,7 @@ get_parentpath_resource(request_rec *r,
   repos->special_uri = dav_svn__get_special_uri(r);
   repos->username = r->user;
   repos->client_capabilities = apr_hash_make(repos->pool);
+  repos->youngest_rev = SVN_INVALID_REVNUM;
 
   /* Make sure this type of resource always has a trailing slash; if
      not, redirect to a URI that does. */
@@ -1729,7 +1751,7 @@ negotiate_encoding_prefs(request_rec *r,
      httpd/modules/mappers/mod_negotiation.c).  Thus, we duplicate the
      necessary ones in this file. */
   int i;
-  const apr_array_header_t *encoding_prefs;
+  apr_array_header_t *encoding_prefs;
   encoding_prefs = do_header_line(r->pool,
                                   apr_table_get(r->headers_in,
                                                 "Accept-Encoding"));
@@ -1741,8 +1763,7 @@ negotiate_encoding_prefs(request_rec *r,
     }
 
   *svndiff_version = 0;
-  qsort(encoding_prefs->elts, (size_t) encoding_prefs->nelts,
-        sizeof(accept_rec), sort_encoding_pref);
+  svn_sort__array(encoding_prefs, sort_encoding_pref);
   for (i = 0; i < encoding_prefs->nelts; i++)
     {
       struct accept_rec rec = APR_ARRAY_IDX(encoding_prefs, i,
@@ -2000,7 +2021,7 @@ parse_querystring(request_rec *r, const
   else
     {
       /* No peg-rev?  Default to HEAD, just like the cmdline client. */
-      serr = svn_fs_youngest_rev(&peg_rev, comb->priv.repos->fs, pool);
+      serr = dav_svn__get_youngest_rev(&peg_rev, comb->priv.repos, pool);
       if (serr != NULL)
         return dav_svn__convert_err(serr, HTTP_INTERNAL_SERVER_ERROR,
                                     "Couldn't fetch youngest rev.", pool);
@@ -2239,6 +2260,7 @@ get_resource(request_rec *r,
   /* create the repository structure and stash it away */
   repos = apr_pcalloc(r->pool, sizeof(*repos));
   repos->pool = r->pool;
+  repos->youngest_rev = SVN_INVALID_REVNUM;
 
   comb->priv.repos = repos;
 
@@ -2347,6 +2369,8 @@ get_resource(request_rec *r,
                     dav_svn__get_fulltext_cache_flag(r) ? "1" :"0");
       svn_hash_sets(fs_config, SVN_FS_CONFIG_FSFS_CACHE_REVPROPS,
                     dav_svn__get_revprop_cache_flag(r) ? "2" :"0");
+      svn_hash_sets(fs_config, SVN_FS_CONFIG_FSFS_CACHE_NODEPROPS,
+                    dav_svn__get_nodeprop_cache_flag(r) ? "1" :"0");
       svn_hash_sets(fs_config, SVN_FS_CONFIG_FSFS_BLOCK_READ,
                     dav_svn__get_block_read_flag(r) ? "1" :"0");
 
@@ -3014,49 +3038,6 @@ seek_stream(dav_stream *stream, apr_off_
        && resource->baselined))
 
 
-/* Return the last modification time of RESOURCE, or -1 if the DAV
-   resource type is not handled, or if an error occurs.  Temporary
-   allocations are made from RESOURCE->POOL. */
-static apr_time_t
-get_last_modified(const dav_resource *resource)
-{
-  apr_time_t last_modified;
-  svn_error_t *serr;
-  svn_revnum_t created_rev;
-  svn_string_t *date_time;
-
-  if (RESOURCE_LACKS_ETAG_POTENTIAL(resource))
-    return -1;
-
-  if ((serr = svn_fs_node_created_rev(&created_rev, resource->info->root.root,
-                                      resource->info->repos_path,
-                                      resource->pool)))
-    {
-      svn_error_clear(serr);
-      return -1;
-    }
-
-  if ((serr = svn_fs_revision_prop(&date_time, resource->info->repos->fs,
-                                   created_rev, "svn:date", resource->pool)))
-    {
-      svn_error_clear(serr);
-      return -1;
-    }
-
-  if (date_time == NULL || date_time->data == NULL)
-    return -1;
-
-  if ((serr = svn_time_from_cstring(&last_modified, date_time->data,
-                                    resource->pool)))
-    {
-      svn_error_clear(serr);
-      return -1;
-    }
-
-  return last_modified;
-}
-
-
 const char *
 dav_svn__getetag(const dav_resource *resource, apr_pool_t *pool)
 {
@@ -3096,6 +3077,29 @@ getetag_pathetic(const dav_resource *res
   return dav_svn__getetag(resource, resource->pool);
 }
 
+/* Helper for set_headers(). Returns TRUE if request R to RESOURCE can be
+ * cached. Returns FALSe otherwise. */
+static svn_boolean_t
+is_cacheable(request_rec *r, const dav_resource *resource)
+{
+  /* Non-idempotent resource cannot be cached because actual
+     target could change when youngest revision or transacation
+     will change. */
+  if (!resource->info->idempotent)
+    return FALSE;
+
+  /* Our GET requests on collections include dynamic data (the
+     HEAD revision, the build version of Subversion, etc.).
+     Directory content is also subject of authz filtering.*/
+  if (resource->collection)
+    return FALSE;
+
+  if (resource->type == DAV_RESOURCE_TYPE_REGULAR ||
+      resource->type == DAV_RESOURCE_TYPE_VERSION)
+      return TRUE;
+  else
+      return FALSE;
+}
 
 static dav_error *
 set_headers(request_rec *r, const dav_resource *resource)
@@ -3103,31 +3107,21 @@ set_headers(request_rec *r, const dav_re
   svn_error_t *serr;
   svn_filesize_t length;
   const char *mimetype = NULL;
-  apr_time_t last_modified;
+
+  /* As version resources don't change, encourage caching. */
+  if (is_cacheable(r, resource))
+    /* Cache resource for one week (specified in seconds). */
+    apr_table_setn(r->headers_out, "Cache-Control", "max-age=604800");
+  else
+    apr_table_setn(r->headers_out, "Cache-Control", "max-age=0");
 
   if (!resource->exists)
     return NULL;
 
-  last_modified = get_last_modified(resource);
-  if (last_modified != -1)
-    {
-      /* Note the modification time for the requested resource, and
-         include the Last-Modified header in the response. */
-      ap_update_mtime(r, last_modified);
-      ap_set_last_modified(r);
-    }
-
   /* generate our etag and place it into the output */
   apr_table_setn(r->headers_out, "ETag",
                  dav_svn__getetag(resource, resource->pool));
 
-  /* As version resources don't change, encourage caching. */
-  if ((resource->type == DAV_RESOURCE_TYPE_REGULAR
-       && resource->versioned && !resource->collection)
-      || resource->type == DAV_RESOURCE_TYPE_VERSION)
-    /* Cache resource for one week (specified in seconds). */
-    apr_table_setn(r->headers_out, "Cache-Control", "max-age=604800");
-
   /* we accept byte-ranges */
   apr_table_setn(r->headers_out, "Accept-Ranges", "bytes");
 
@@ -4589,7 +4583,7 @@ dav_svn__working_to_regular_resource(dav
   /* Change the URL into either a baseline-collection or a public one. */
   if (priv->root.rev == SVN_INVALID_REVNUM)
     {
-      serr = svn_fs_youngest_rev(&priv->root.rev, repos->fs, resource->pool);
+      serr = dav_svn__get_youngest_rev(&priv->root.rev, repos, resource->pool);
       if (serr != NULL)
         return dav_svn__convert_err(serr, HTTP_INTERNAL_SERVER_ERROR,
                                     "Could not determine youngest rev.",

Modified: subversion/branches/authzperf/subversion/mod_dav_svn/status.c
URL: http://svn.apache.org/viewvc/subversion/branches/authzperf/subversion/mod_dav_svn/status.c?rev=1741682&r1=1741681&r2=1741682&view=diff
==============================================================================
--- subversion/branches/authzperf/subversion/mod_dav_svn/status.c (original)
+++ subversion/branches/authzperf/subversion/mod_dav_svn/status.c Fri Apr 29 18:38:53 2016
@@ -29,6 +29,32 @@
 #include "private/svn_cache.h"
 #include "private/svn_fs_private.h"
 
+#ifdef HAVE_UNISTD_H
+#include <unistd.h>   /* For getpid() */
+#endif
+
+#if APR_HAVE_PROCESS_H
+#include <process.h>
+#endif
+
+/* The apache headers define these and they conflict with our definitions. */
+#ifdef PACKAGE_BUGREPORT
+#undef PACKAGE_BUGREPORT
+#endif
+#ifdef PACKAGE_NAME
+#undef PACKAGE_NAME
+#endif
+#ifdef PACKAGE_STRING
+#undef PACKAGE_STRING
+#endif
+#ifdef PACKAGE_TARNAME
+#undef PACKAGE_TARNAME
+#endif
+#ifdef PACKAGE_VERSION
+#undef PACKAGE_VERSION
+#endif
+#include "svn_private_config.h"
+
 #ifndef DEFAULT_TIME_FORMAT
 #define DEFAULT_TIME_FORMAT "%Y-%m-%d %H:%M:%S %Z"
 #endif
@@ -72,13 +98,12 @@ int dav_svn__status(request_rec *r)
             ap_ht_time(r->pool, apr_time_now(), DEFAULT_TIME_FORMAT, 0),
             "</dt>\n", SVN_VA_NULL);
 
-#if !defined(WIN32) && defined(HAVE_UNISTD_H) && defined(HAVE_GETPID)
+#if defined(WIN32) || (defined(HAVE_UNISTD_H) && defined(HAVE_GETPID))
   /* On Unix the server is generally multiple processes and this
      request only shows the status of the single process that handles
      the request. Ideally we would iterate over all processes but that
      would need some MPM support, so we settle for simply showing the
      process ID. */
-#include <unistd.h>
   ap_rprintf(r, "<dt>Server process id: %d</dt>\n", (int)getpid());
 #endif
 

Modified: subversion/branches/authzperf/subversion/mod_dav_svn/util.c
URL: http://svn.apache.org/viewvc/subversion/branches/authzperf/subversion/mod_dav_svn/util.c?rev=1741682&r1=1741681&r2=1741682&view=diff
==============================================================================
--- subversion/branches/authzperf/subversion/mod_dav_svn/util.c (original)
+++ subversion/branches/authzperf/subversion/mod_dav_svn/util.c Fri Apr 29 18:38:53 2016
@@ -620,7 +620,7 @@ dav_svn__make_base64_output_stream(apr_b
   wb->output = output;
   svn_stream_set_write(stream, brigade_write_fn);
 
-  return svn_base64_encode(stream, pool);
+  return svn_base64_encode2(stream, FALSE, pool);
 }
 
 void
@@ -779,7 +779,12 @@ request_body_to_string(svn_string_t **re
 
   if (content_length)
     {
-      buf = svn_stringbuf_create_ensure(content_length, pool);
+      /* Do not allocate more than 1 MB until we receive request body. */
+      apr_size_t alloc_len = 1 * 1024 *1024;
+      if (content_length < alloc_len)
+        alloc_len = (apr_size_t) content_length;
+
+      buf = svn_stringbuf_create_ensure(alloc_len, pool);
     }
   else
     {
@@ -865,3 +870,19 @@ dav_svn__parse_request_skel(svn_skel_t *
   *skel = svn_skel__parse(skel_str->data, skel_str->len, pool);
   return OK;
 }
+
+svn_error_t *
+dav_svn__get_youngest_rev(svn_revnum_t *youngest_p,
+                          dav_svn_repos *repos,
+                          apr_pool_t *scratch_pool)
+{
+  if (repos->youngest_rev == SVN_INVALID_REVNUM)
+    {
+      svn_revnum_t revnum;
+      SVN_ERR(svn_fs_youngest_rev(&revnum, repos->fs, scratch_pool));
+      repos->youngest_rev = revnum;
+    }
+
+   *youngest_p = repos->youngest_rev;
+   return SVN_NO_ERROR;
+}

Modified: subversion/branches/authzperf/subversion/mod_dav_svn/version.c
URL: http://svn.apache.org/viewvc/subversion/branches/authzperf/subversion/mod_dav_svn/version.c?rev=1741682&r1=1741681&r2=1741682&view=diff
==============================================================================
--- subversion/branches/authzperf/subversion/mod_dav_svn/version.c (original)
+++ subversion/branches/authzperf/subversion/mod_dav_svn/version.c Fri Apr 29 18:38:53 2016
@@ -221,8 +221,8 @@ get_option(const dav_resource *resource,
       const char *uuid;
 
       /* Got youngest revision? */
-      if ((serr = svn_fs_youngest_rev(&youngest, resource->info->repos->fs,
-                                      resource->pool)))
+      if ((serr = dav_svn__get_youngest_rev(&youngest, resource->info->repos,
+                                            resource->pool)))
         {
           return dav_svn__convert_err
             (serr, HTTP_INTERNAL_SERVER_ERROR,
@@ -304,25 +304,25 @@ get_option(const dav_resource *resource,
          addressable resources. */
       apr_table_set(r->headers_out, SVN_DAV_ROOT_URI_HEADER, repos_root_uri);
       apr_table_set(r->headers_out, SVN_DAV_ME_RESOURCE_HEADER,
-                    apr_pstrcat(resource->pool, repos_root_uri, "/",
+                    apr_pstrcat(r->pool, repos_root_uri, "/",
                                 dav_svn__get_me_resource_uri(r), SVN_VA_NULL));
       apr_table_set(r->headers_out, SVN_DAV_REV_ROOT_STUB_HEADER,
-                    apr_pstrcat(resource->pool, repos_root_uri, "/",
+                    apr_pstrcat(r->pool, repos_root_uri, "/",
                                 dav_svn__get_rev_root_stub(r), SVN_VA_NULL));
       apr_table_set(r->headers_out, SVN_DAV_REV_STUB_HEADER,
-                    apr_pstrcat(resource->pool, repos_root_uri, "/",
+                    apr_pstrcat(r->pool, repos_root_uri, "/",
                                 dav_svn__get_rev_stub(r), SVN_VA_NULL));
       apr_table_set(r->headers_out, SVN_DAV_TXN_ROOT_STUB_HEADER,
-                    apr_pstrcat(resource->pool, repos_root_uri, "/",
+                    apr_pstrcat(r->pool, repos_root_uri, "/",
                                 dav_svn__get_txn_root_stub(r), SVN_VA_NULL));
       apr_table_set(r->headers_out, SVN_DAV_TXN_STUB_HEADER,
-                    apr_pstrcat(resource->pool, repos_root_uri, "/",
+                    apr_pstrcat(r->pool, repos_root_uri, "/",
                                 dav_svn__get_txn_stub(r), SVN_VA_NULL));
       apr_table_set(r->headers_out, SVN_DAV_VTXN_ROOT_STUB_HEADER,
-                    apr_pstrcat(resource->pool, repos_root_uri, "/",
+                    apr_pstrcat(r->pool, repos_root_uri, "/",
                                 dav_svn__get_vtxn_root_stub(r), SVN_VA_NULL));
       apr_table_set(r->headers_out, SVN_DAV_VTXN_STUB_HEADER,
-                    apr_pstrcat(resource->pool, repos_root_uri, "/",
+                    apr_pstrcat(r->pool, repos_root_uri, "/",
                                 dav_svn__get_vtxn_stub(r), SVN_VA_NULL));
       apr_table_set(r->headers_out, SVN_DAV_ALLOW_BULK_UPDATES,
                     bulk_upd_conf == CONF_BULKUPD_ON ? "On" :
@@ -342,7 +342,7 @@ get_option(const dav_resource *resource,
             continue;
 
           apr_table_addn(r->headers_out, SVN_DAV_SUPPORTED_POSTS_HEADER,
-                         apr_pstrdup(resource->pool, posts_versions[i].post_name));
+                         apr_pstrdup(r->pool, posts_versions[i].post_name));
         }
     }
 
@@ -616,8 +616,8 @@ dav_svn__checkout(dav_resource *resource
       svn_revnum_t youngest;
 
       /* make sure the baseline being checked out is the latest */
-      serr = svn_fs_youngest_rev(&youngest, resource->info->repos->fs,
-                                 resource->pool);
+      serr = dav_svn__get_youngest_rev(&youngest, resource->info->repos,
+                                       resource->pool);
       if (serr != NULL)
         {
           /* ### correct HTTP error? */

Modified: subversion/branches/authzperf/subversion/po/es.po
URL: http://svn.apache.org/viewvc/subversion/branches/authzperf/subversion/po/es.po?rev=1741682&r1=1741681&r2=1741682&view=diff
==============================================================================
--- subversion/branches/authzperf/subversion/po/es.po [UTF-8] (original)
+++ subversion/branches/authzperf/subversion/po/es.po [UTF-8] Fri Apr 29 18:38:53 2016
@@ -10197,13 +10197,11 @@ msgid "local %s, incoming %s upon %s"
 msgstr ""
 
 #: ../svn/util.c:74
-#, fuzzy, c-format
+#, c-format
 msgid ""
-"\n"
 "Committed revision %ld%s.\n"
 msgstr ""
-"\n"
-"Commit de la revisión %ld.\n"
+"Commit de la revisión %ld%s.\n"
 
 #: ../svn/util.c:78
 msgid " (the answer to life, the universe, and everything)"

Modified: subversion/branches/authzperf/subversion/po/fr.po
URL: http://svn.apache.org/viewvc/subversion/branches/authzperf/subversion/po/fr.po?rev=1741682&r1=1741681&r2=1741682&view=diff
==============================================================================
--- subversion/branches/authzperf/subversion/po/fr.po [UTF-8] (original)
+++ subversion/branches/authzperf/subversion/po/fr.po [UTF-8] Fri Apr 29 18:38:53 2016
@@ -11331,6 +11331,11 @@ msgstr "Mise à jour de '%s'\n"
 msgid "Redirecting to URL '%s':\n"
 msgstr "Redirection vers l'URL '%s' :\n"
 
+#: ../svn/notify.c:1066
+#, c-format
+msgid "Committing transaction...\n"
+msgstr "Transaction de propagation...\n"
+
 #: ../svn/propdel-cmd.c:88
 #, c-format
 msgid "Cannot specify revision for deleting versioned property '%s'"
@@ -11543,10 +11548,8 @@ msgstr "'%s' actualisé à la révision
 #: ../svn/util.c:76
 #, c-format
 msgid ""
-"\n"
 "Committed revision %ld%s.\n"
 msgstr ""
-"\n"
 "Révision %ld%s propagée.\n"
 
 #: ../svn/util.c:80

Modified: subversion/branches/authzperf/subversion/po/it.po
URL: http://svn.apache.org/viewvc/subversion/branches/authzperf/subversion/po/it.po?rev=1741682&r1=1741681&r2=1741682&view=diff
==============================================================================
--- subversion/branches/authzperf/subversion/po/it.po (original)
+++ subversion/branches/authzperf/subversion/po/it.po Fri Apr 29 18:38:53 2016
@@ -10286,13 +10286,11 @@ msgid "local %s, incoming %s upon %s"
 msgstr ""
 
 #: ../svn/util.c:74
-#, fuzzy, c-format
+#, c-format
 msgid ""
-"\n"
 "Committed revision %ld%s.\n"
 msgstr ""
-"\n"
-"Commit della Revisione %ld eseguito.\n"
+"Commit della Revisione %ld%s eseguito.\n"
 
 #: ../svn/util.c:78
 msgid " (the answer to life, the universe, and everything)"

Modified: subversion/branches/authzperf/subversion/po/ja.po
URL: http://svn.apache.org/viewvc/subversion/branches/authzperf/subversion/po/ja.po?rev=1741682&r1=1741681&r2=1741682&view=diff
==============================================================================
--- subversion/branches/authzperf/subversion/po/ja.po [UTF-8] (original)
+++ subversion/branches/authzperf/subversion/po/ja.po [UTF-8] Fri Apr 29 18:38:53 2016
@@ -10643,13 +10643,11 @@ msgid "local %s, incoming %s upon %s"
 msgstr ""
 
 #: ../svn/util.c:74
-#, fuzzy, c-format
+#, c-format
 msgid ""
-"\n"
 "Committed revision %ld%s.\n"
 msgstr ""
-"\n"
-"リビジョン %ld をコミットしました。\n"
+"リビジョン %ld%s をコミットしました。\n"
 
 #: ../svn/util.c:78
 msgid " (the answer to life, the universe, and everything)"

Modified: subversion/branches/authzperf/subversion/po/ko.po
URL: http://svn.apache.org/viewvc/subversion/branches/authzperf/subversion/po/ko.po?rev=1741682&r1=1741681&r2=1741682&view=diff
==============================================================================
--- subversion/branches/authzperf/subversion/po/ko.po [UTF-8] (original)
+++ subversion/branches/authzperf/subversion/po/ko.po [UTF-8] Fri Apr 29 18:38:53 2016
@@ -10530,10 +10530,8 @@ msgstr "  '%s' 을(를) r%ld 로 업데�
 #: ../svn/util.c:75
 #, c-format
 msgid ""
-"\n"
 "Committed revision %ld%s.\n"
 msgstr ""
-"\n"
 "커밋된 리비전 %ld%s.\n"
 
 #: ../svn/util.c:79

Modified: subversion/branches/authzperf/subversion/po/nb.po
URL: http://svn.apache.org/viewvc/subversion/branches/authzperf/subversion/po/nb.po?rev=1741682&r1=1741681&r2=1741682&view=diff
==============================================================================
--- subversion/branches/authzperf/subversion/po/nb.po [UTF-8] (original)
+++ subversion/branches/authzperf/subversion/po/nb.po [UTF-8] Fri Apr 29 18:38:53 2016
@@ -10226,13 +10226,11 @@ msgid "local %s, incoming %s upon %s"
 msgstr "lokal %s, innkommende %s på %s"
 
 #: ../svn/util.c:74
-#, fuzzy, c-format
+#, c-format
 msgid ""
-"\n"
 "Committed revision %ld%s.\n"
 msgstr ""
-"\n"
-"La inn revisjon %ld.\n"
+"La inn revisjon %ld%s.\n"
 
 #: ../svn/util.c:78
 msgid " (the answer to life, the universe, and everything)"

Modified: subversion/branches/authzperf/subversion/po/pl.po
URL: http://svn.apache.org/viewvc/subversion/branches/authzperf/subversion/po/pl.po?rev=1741682&r1=1741681&r2=1741682&view=diff
==============================================================================
--- subversion/branches/authzperf/subversion/po/pl.po [UTF-8] (original)
+++ subversion/branches/authzperf/subversion/po/pl.po [UTF-8] Fri Apr 29 18:38:53 2016
@@ -10285,13 +10285,11 @@ msgid "local %s, incoming %s upon %s"
 msgstr "lokalne: %s, przychodzące: %s, operacja: %s"
 
 #: ../svn/util.c:74
-#, fuzzy, c-format
+#, c-format
 msgid ""
-"\n"
 "Committed revision %ld%s.\n"
 msgstr ""
-"\n"
-"Zatwierdzona wersja %ld.\n"
+"Zatwierdzona wersja %ld%s.\n"
 
 #: ../svn/util.c:78
 msgid " (the answer to life, the universe, and everything)"

Modified: subversion/branches/authzperf/subversion/po/pt_BR.po
URL: http://svn.apache.org/viewvc/subversion/branches/authzperf/subversion/po/pt_BR.po?rev=1741682&r1=1741681&r2=1741682&view=diff
==============================================================================
--- subversion/branches/authzperf/subversion/po/pt_BR.po [UTF-8] (original)
+++ subversion/branches/authzperf/subversion/po/pt_BR.po [UTF-8] Fri Apr 29 18:38:53 2016
@@ -10087,13 +10087,11 @@ msgid "local %s, incoming %s upon %s"
 msgstr ""
 
 #: ../svn/util.c:74
-#, fuzzy, c-format
+#, c-format
 msgid ""
-"\n"
 "Committed revision %ld%s.\n"
 msgstr ""
-"\n"
-"Commit da revisão %ld.\n"
+"Commit da revisão %ld%s.\n"
 
 #: ../svn/util.c:78
 msgid " (the answer to life, the universe, and everything)"

Modified: subversion/branches/authzperf/subversion/po/sv.po
URL: http://svn.apache.org/viewvc/subversion/branches/authzperf/subversion/po/sv.po?rev=1741682&r1=1741681&r2=1741682&view=diff
==============================================================================
--- subversion/branches/authzperf/subversion/po/sv.po [UTF-8] (original)
+++ subversion/branches/authzperf/subversion/po/sv.po [UTF-8] Fri Apr 29 18:38:53 2016
@@ -13145,10 +13145,8 @@ msgstr "  Uppdaterade \"%s\" till r%ld.\
 #: ../svn/util.c:79
 #, c-format
 msgid ""
-"\n"
 "Committed revision %ld%s.\n"
 msgstr ""
-"\n"
 "Arkiverade revision %ld%s.\n"
 
 #: ../svn/util.c:83

Modified: subversion/branches/authzperf/subversion/po/zh_CN.po
URL: http://svn.apache.org/viewvc/subversion/branches/authzperf/subversion/po/zh_CN.po?rev=1741682&r1=1741681&r2=1741682&view=diff
==============================================================================
--- subversion/branches/authzperf/subversion/po/zh_CN.po [UTF-8] (original)
+++ subversion/branches/authzperf/subversion/po/zh_CN.po [UTF-8] Fri Apr 29 18:38:53 2016
@@ -11284,9 +11284,9 @@ msgid "done\n"
 msgstr "完成。\n"
 
 #: ../svn/notify.c:1066
-#, fuzzy, c-format
+#, c-format
 msgid "Committing transaction...\n"
-msgstr "正在读取事务"
+msgstr "正在读取事务\n"
 
 #: ../svn/propdel-cmd.c:88
 #, c-format
@@ -13710,10 +13710,9 @@ msgid "  Updated '%s' to r%ld.\n"
 msgstr "更新 '%s' 到版本 %ld。\n"
 
 #: ../svn/util.c:79
-#, fuzzy, c-format
+#, c-format
 msgid "Committed revision %ld%s.\n"
 msgstr ""
-"\n"
 "提交后的版本为 %ld%s。\n"
 
 #: ../svn/util.c:83

Modified: subversion/branches/authzperf/subversion/po/zh_TW.po
URL: http://svn.apache.org/viewvc/subversion/branches/authzperf/subversion/po/zh_TW.po?rev=1741682&r1=1741681&r2=1741682&view=diff
==============================================================================
--- subversion/branches/authzperf/subversion/po/zh_TW.po [UTF-8] (original)
+++ subversion/branches/authzperf/subversion/po/zh_TW.po [UTF-8] Fri Apr 29 18:38:53 2016
@@ -10123,13 +10123,11 @@ msgid "local %s, incoming %s upon %s"
 msgstr ""
 
 #: ../svn/util.c:74
-#, fuzzy, c-format
+#, c-format
 msgid ""
-"\n"
 "Committed revision %ld%s.\n"
 msgstr ""
-"\n"
-"送交修訂版 %ld.\n"
+"送交修訂版 %ld%s.\n"
 
 #: ../svn/util.c:78
 msgid " (the answer to life, the universe, and everything)"

Modified: subversion/branches/authzperf/subversion/svn/cl-conflicts.c
URL: http://svn.apache.org/viewvc/subversion/branches/authzperf/subversion/svn/cl-conflicts.c?rev=1741682&r1=1741681&r2=1741682&view=diff
==============================================================================
--- subversion/branches/authzperf/subversion/svn/cl-conflicts.c (original)
+++ subversion/branches/authzperf/subversion/svn/cl-conflicts.c Fri Apr 29 18:38:53 2016
@@ -58,14 +58,6 @@ static const svn_token_map_t map_conflic
   { NULL,               0 }
 };
 
-static const svn_token_map_t map_conflict_kind_xml[] =
-{
-  { "text",             svn_wc_conflict_kind_text },
-  { "property",         svn_wc_conflict_kind_property },
-  { "tree",             svn_wc_conflict_kind_tree },
-  { NULL,               0 }
-};
-
 /* Return a localised string representation of the local part of a conflict;
    NULL for non-localised odd cases. */
 static const char *
@@ -229,7 +221,7 @@ operation_str(svn_wc_operation_t operati
 svn_error_t *
 svn_cl__get_human_readable_prop_conflict_description(
   const char **desc,
-  const svn_client_conflict_t *conflict,
+  svn_client_conflict_t *conflict,
   apr_pool_t *pool)
 {
   const char *reason_str, *action_str;
@@ -288,7 +280,7 @@ svn_cl__get_human_readable_prop_conflict
 svn_error_t *
 svn_cl__get_human_readable_tree_conflict_description(
   const char **desc,
-  const svn_client_conflict_t *conflict,
+  svn_client_conflict_t *conflict,
   apr_pool_t *pool)
 {
   const char *action, *reason, *operation;
@@ -411,7 +403,7 @@ add_conflict_version_xml(svn_stringbuf_t
 
 static svn_error_t *
 append_tree_conflict_info_xml(svn_stringbuf_t *str,
-                              const svn_client_conflict_t *conflict,
+                              svn_client_conflict_t *conflict,
                               apr_pool_t *pool)
 {
   apr_hash_t *att_hash = apr_hash_make(pool);
@@ -479,115 +471,128 @@ append_tree_conflict_info_xml(svn_string
 
 svn_error_t *
 svn_cl__append_conflict_info_xml(svn_stringbuf_t *str,
-                                 const svn_client_conflict_t *conflict,
+                                 svn_client_conflict_t *conflict,
                                  apr_pool_t *scratch_pool)
 {
   apr_hash_t *att_hash;
-  const char *kind;
-  svn_wc_conflict_kind_t conflict_kind;
+  svn_boolean_t text_conflicted;
+  apr_array_header_t *props_conflicted;
+  svn_boolean_t tree_conflicted;
   svn_wc_operation_t conflict_operation;
   const char *repos_root_url;
   const char *repos_relpath;
   svn_revnum_t peg_rev;
   svn_node_kind_t node_kind;
 
-  conflict_kind = svn_client_conflict_get_kind(conflict);
   conflict_operation = svn_client_conflict_get_operation(conflict);
 
-  if (conflict_kind == svn_wc_conflict_kind_tree)
+  SVN_ERR(svn_client_conflict_get_conflicted(&text_conflicted,
+                                             &props_conflicted,
+                                             &tree_conflicted,
+                                             conflict,
+                                             scratch_pool, scratch_pool));
+  if (tree_conflicted)
     {
       /* Uses other element type */
       return svn_error_trace(
                 append_tree_conflict_info_xml(str, conflict, scratch_pool));
     }
 
+  SVN_ERR(svn_client_conflict_get_repos_info(&repos_root_url, NULL,
+                                             conflict,
+                                             scratch_pool, scratch_pool));
   att_hash = apr_hash_make(scratch_pool);
 
   svn_hash_sets(att_hash, "operation",
                 svn_cl__operation_str_xml(conflict_operation, scratch_pool));
 
-
-  kind = svn_token__to_word(map_conflict_kind_xml, conflict_kind);
-  svn_hash_sets(att_hash, "type", kind);
-
   svn_hash_sets(att_hash, "operation",
                 svn_cl__operation_str_xml(conflict_operation, scratch_pool));
 
-
-  /* "<conflict>" */
-  svn_xml_make_open_tag_hash(&str, scratch_pool,
-                             svn_xml_normal, "conflict", att_hash);
-
-  SVN_ERR(svn_client_conflict_get_repos_info(&repos_root_url, NULL, conflict,
-                                             scratch_pool, scratch_pool));
-  SVN_ERR(svn_client_conflict_get_incoming_old_repos_location(&repos_relpath,
-                                                              &peg_rev,
-                                                              &node_kind,
-                                                              conflict,
-                                                              scratch_pool,
-                                                              scratch_pool));
-  if (repos_root_url && repos_relpath)
-    SVN_ERR(add_conflict_version_xml(&str, "source-left",
-                                     repos_root_url, repos_relpath, peg_rev,
-                                     node_kind, scratch_pool));
-
-  SVN_ERR(svn_client_conflict_get_incoming_old_repos_location(&repos_relpath,
-                                                              &peg_rev,
-                                                              &node_kind,
-                                                              conflict,
-                                                              scratch_pool,
-                                                              scratch_pool));
-  if (repos_root_url && repos_relpath)
-    SVN_ERR(add_conflict_version_xml(&str, "source-right",
-                                     repos_root_url, repos_relpath, peg_rev,
-                                     node_kind, scratch_pool));
-
-  switch (conflict_kind)
+  if (text_conflicted)
     {
       const char *base_abspath;
       const char *my_abspath;
       const char *their_abspath;
 
-      case svn_wc_conflict_kind_text:
-        SVN_ERR(svn_client_conflict_text_get_contents(NULL, &my_abspath,
-                                                      &base_abspath,
-                                                      &their_abspath,
-                                                      conflict, scratch_pool,
-                                                      scratch_pool));
-        /* "<prev-base-file> xx </prev-base-file>" */
-        svn_cl__xml_tagged_cdata(
-          &str, scratch_pool, "prev-base-file", base_abspath);
-
-        /* "<prev-wc-file> xx </prev-wc-file>" */
-        svn_cl__xml_tagged_cdata(
-          &str, scratch_pool, "prev-wc-file", my_abspath);
-
-        /* "<cur-base-file> xx </cur-base-file>" */
-        svn_cl__xml_tagged_cdata(
-          &str, scratch_pool, "cur-base-file", their_abspath);
+      svn_hash_sets(att_hash, "type", "text");
 
-        break;
+      /* "<conflict>" */
+      svn_xml_make_open_tag_hash(&str, scratch_pool,
+                                 svn_xml_normal, "conflict", att_hash);
 
-      case svn_wc_conflict_kind_property:
-        {
-          const char *reject_abspath;
-
-          /* "<prop-file> xx </prop-file>" */
-          reject_abspath =
-            svn_client_conflict_prop_get_reject_abspath(conflict);
-          svn_cl__xml_tagged_cdata(
-            &str, scratch_pool, "prop-file", reject_abspath);
-        }
-        break;
+      SVN_ERR(svn_client_conflict_get_incoming_old_repos_location(
+                &repos_relpath, &peg_rev, &node_kind, conflict,
+                scratch_pool, scratch_pool));
+      if (repos_root_url && repos_relpath)
+        SVN_ERR(add_conflict_version_xml(&str, "source-left",
+                                         repos_root_url, repos_relpath, peg_rev,
+                                         node_kind, scratch_pool));
 
-      default:
-      case svn_wc_conflict_kind_tree:
-        SVN_ERR_MALFUNCTION(); /* Handled separately */
-        break;
-    }
+      SVN_ERR(svn_client_conflict_get_incoming_old_repos_location(
+                &repos_relpath, &peg_rev, &node_kind, conflict,
+                scratch_pool, scratch_pool));
+      if (repos_root_url && repos_relpath)
+        SVN_ERR(add_conflict_version_xml(&str, "source-right",
+                                         repos_root_url, repos_relpath, peg_rev,
+                                         node_kind, scratch_pool));
+
+      SVN_ERR(svn_client_conflict_text_get_contents(NULL, &my_abspath,
+                                                    &base_abspath,
+                                                    &their_abspath,
+                                                    conflict, scratch_pool,
+                                                    scratch_pool));
+      /* "<prev-base-file> xx </prev-base-file>" */
+      svn_cl__xml_tagged_cdata(
+        &str, scratch_pool, "prev-base-file", base_abspath);
+
+      /* "<prev-wc-file> xx </prev-wc-file>" */
+      svn_cl__xml_tagged_cdata(
+        &str, scratch_pool, "prev-wc-file", my_abspath);
+
+      /* "<cur-base-file> xx </cur-base-file>" */
+      svn_cl__xml_tagged_cdata(
+        &str, scratch_pool, "cur-base-file", their_abspath);
+
+      /* "</conflict>" */
+      svn_xml_make_close_tag(&str, scratch_pool, "conflict");
+    }
+
+  if (props_conflicted->nelts > 0)
+    {
+      const char *reject_abspath;
+
+      svn_hash_sets(att_hash, "type", "property");
+
+      /* "<conflict>" */
+      svn_xml_make_open_tag_hash(&str, scratch_pool,
+                                 svn_xml_normal, "conflict", att_hash);
 
-  /* "</conflict>" */
-  svn_xml_make_close_tag(&str, scratch_pool, "conflict");
+      SVN_ERR(svn_client_conflict_get_incoming_old_repos_location(
+                &repos_relpath, &peg_rev, &node_kind, conflict,
+                scratch_pool, scratch_pool));
+      if (repos_root_url && repos_relpath)
+        SVN_ERR(add_conflict_version_xml(&str, "source-left",
+                                         repos_root_url, repos_relpath, peg_rev,
+                                         node_kind, scratch_pool));
+
+      SVN_ERR(svn_client_conflict_get_incoming_old_repos_location(
+                &repos_relpath, &peg_rev, &node_kind, conflict,
+                scratch_pool, scratch_pool));
+      if (repos_root_url && repos_relpath)
+        SVN_ERR(add_conflict_version_xml(&str, "source-right",
+                                         repos_root_url, repos_relpath, peg_rev,
+                                         node_kind, scratch_pool));
+
+      /* "<prop-file> xx </prop-file>" */
+      reject_abspath =
+        svn_client_conflict_prop_get_reject_abspath(conflict);
+      svn_cl__xml_tagged_cdata(
+        &str, scratch_pool, "prop-file", reject_abspath);
+
+      /* "</conflict>" */
+      svn_xml_make_close_tag(&str, scratch_pool, "conflict");
+    }
 
   return SVN_NO_ERROR;
 }

Modified: subversion/branches/authzperf/subversion/svn/cl-conflicts.h
URL: http://svn.apache.org/viewvc/subversion/branches/authzperf/subversion/svn/cl-conflicts.h?rev=1741682&r1=1741681&r2=1741682&view=diff
==============================================================================
--- subversion/branches/authzperf/subversion/svn/cl-conflicts.h (original)
+++ subversion/branches/authzperf/subversion/svn/cl-conflicts.h Fri Apr 29 18:38:53 2016
@@ -49,7 +49,7 @@ extern "C" {
 svn_error_t *
 svn_cl__get_human_readable_prop_conflict_description(
   const char **desc,
-  const svn_client_conflict_t *conflict,
+  svn_client_conflict_t *conflict,
   apr_pool_t *pool);
 
 /**
@@ -61,7 +61,7 @@ svn_cl__get_human_readable_prop_conflict
 svn_error_t *
 svn_cl__get_human_readable_tree_conflict_description(
   const char **desc,
-  const svn_client_conflict_t *conflict,
+  svn_client_conflict_t *conflict,
   apr_pool_t *pool);
 
 /* Like svn_cl__get_human_readable_tree_conflict_description but
@@ -81,7 +81,7 @@ svn_cl__get_human_readable_action_descri
 svn_error_t *
 svn_cl__append_conflict_info_xml(
   svn_stringbuf_t *str,
-  const svn_client_conflict_t *conflict,
+  svn_client_conflict_t *conflict,
   apr_pool_t *pool);
 
 #ifdef __cplusplus

Modified: subversion/branches/authzperf/subversion/svn/cl-log.h
URL: http://svn.apache.org/viewvc/subversion/branches/authzperf/subversion/svn/cl-log.h?rev=1741682&r1=1741681&r2=1741682&view=diff
==============================================================================
--- subversion/branches/authzperf/subversion/svn/cl-log.h (original)
+++ subversion/branches/authzperf/subversion/svn/cl-log.h Fri Apr 29 18:38:53 2016
@@ -31,6 +31,8 @@
 
 #include "svn_types.h"
 
+#include "private/svn_string_private.h"
+
 #ifdef __cplusplus
 extern "C" {
 #endif /* __cplusplus */
@@ -70,6 +72,9 @@ typedef struct svn_cl__log_receiver_bato
    * the log message, or a changed path matches one of these patterns. */
   apr_array_header_t *search_patterns;
 
+  /* Buffer for Unicode normalization and case folding. */
+  svn_membuf_t buffer;
+
   /* Pool for persistent allocations. */
   apr_pool_t *pool;
 } svn_cl__log_receiver_baton;

Modified: subversion/branches/authzperf/subversion/svn/cl.h
URL: http://svn.apache.org/viewvc/subversion/branches/authzperf/subversion/svn/cl.h?rev=1741682&r1=1741681&r2=1741682&view=diff
==============================================================================
--- subversion/branches/authzperf/subversion/svn/cl.h (original)
+++ subversion/branches/authzperf/subversion/svn/cl.h Fri Apr 29 18:38:53 2016
@@ -338,8 +338,7 @@ svn_cl__try(svn_error_t *err,
 
 
 /* Our cancellation callback. */
-svn_error_t *
-svn_cl__check_cancel(void *baton);
+extern svn_cancel_func_t svn_cl__check_cancel;
 
 
 
@@ -362,6 +361,14 @@ svn_cl__conflict_stats_resolved(svn_cl__
                                 const char *path_local,
                                 svn_wc_conflict_kind_t conflict_kind);
 
+/* Set *CONFLICTED_PATHS to the conflicted paths contained in CONFLICT_STATS.
+ * If no conflicted path exists, set *CONFLICTED_PATHS to NULL. */
+svn_error_t *
+svn_cl__conflict_stats_get_paths(apr_array_header_t **conflicted_paths,
+                                 svn_cl__conflict_stats_t *conflict_stats,
+                                 apr_pool_t *result_pool,
+                                 apr_pool_t *scratch_pool);
+
 /* Print the conflict stats accumulated in CONFLICT_STATS.
  *
  * Return any error encountered during printing.
@@ -371,39 +378,11 @@ svn_error_t *
 svn_cl__print_conflict_stats(svn_cl__conflict_stats_t *conflict_stats,
                              apr_pool_t *scratch_pool);
 
-/* Create and return an baton for use with svn_cl__conflict_func_interactive
- * in *B, allocated from RESULT_POOL, and initialised with the values
- * ACCEPT_WHICH, CONFIG, EDITOR_CMD, CANCEL_FUNC and CANCEL_BATON. */
-svn_error_t *
-svn_cl__get_conflict_func_interactive_baton(
-  svn_cl__interactive_conflict_baton_t **b,
-  svn_cl__accept_t accept_which,
-  apr_hash_t *config,
-  const char *editor_cmd,
-  svn_cl__conflict_stats_t *conflict_stats,
-  svn_cancel_func_t cancel_func,
-  void *cancel_baton,
-  apr_pool_t *result_pool);
-
-/* A callback capable of doing interactive conflict resolution.
-
-   The BATON must come from svn_cl__get_conflict_func_interactive_baton().
-   Resolves based on the --accept option if one was given to that function,
-   otherwise prompts the user to choose one of the three fulltexts, edit
-   the merged file on the spot, or just skip the conflict (to be resolved
-   later), among other options.
-
-   Implements svn_wc_conflict_resolver_func2_t.
+/* 
+ * Interactively resolve the conflict a @a CONFLICT.
+ * TODO: more docs
  */
 svn_error_t *
-svn_cl__conflict_func_interactive(svn_wc_conflict_result_t **result,
-                                  const svn_wc_conflict_description2_t *desc,
-                                  void *baton,
-                                  apr_pool_t *result_pool,
-                                  apr_pool_t *scratch_pool);
-
-
-svn_error_t *
 svn_cl__resolve_conflict(svn_boolean_t *resolved,
                          svn_cl__accept_t *accept_which,
                          svn_boolean_t *quit,
@@ -419,6 +398,18 @@ svn_cl__resolve_conflict(svn_boolean_t *
                          svn_client_ctx_t *ctx,
                          apr_pool_t *scratch_pool);
 
+/* 
+ * Interactively resolve conflicts for all TARGETS.
+ * TODO: more docs
+ */
+svn_error_t *
+svn_cl__walk_conflicts(apr_array_header_t *targets,
+                       svn_cl__conflict_stats_t *conflict_stats,
+                       svn_boolean_t is_resolve_cmd,
+                       svn_cl__opt_state_t *opt_state,
+                       svn_client_ctx_t *ctx,
+                       apr_pool_t *scratch_pool);
+
 
 /*** Command-line output functions -- printing to the user. ***/