Author: stefan2
Date: Thu Jun 25 08:00:57 2015
New Revision: 1687422

URL: http://svn.apache.org/r1687422
Log:
On the fsx-1.10 branch:
Catch-up with /trunk up to and including r1687421.

Modified:
    subversion/branches/fsx-1.10/   (props changed)
    subversion/branches/fsx-1.10/build/ac-macros/apache.m4
    subversion/branches/fsx-1.10/subversion/include/svn_client.h
    subversion/branches/fsx-1.10/subversion/libsvn_client/merge.c
    subversion/branches/fsx-1.10/subversion/libsvn_client/resolved.c
    subversion/branches/fsx-1.10/subversion/libsvn_fs_fs/fs.c
    subversion/branches/fsx-1.10/subversion/libsvn_fs_fs/fs.h
    subversion/branches/fsx-1.10/subversion/libsvn_fs_fs/fs_fs.h
    subversion/branches/fsx-1.10/subversion/libsvn_fs_fs/hotcopy.c
    subversion/branches/fsx-1.10/subversion/libsvn_fs_fs/hotcopy.h
    subversion/branches/fsx-1.10/subversion/libsvn_fs_fs/pack.c
    subversion/branches/fsx-1.10/subversion/libsvn_fs_fs/transaction.c
    subversion/branches/fsx-1.10/subversion/libsvn_repos/rev_hunt.c
    subversion/branches/fsx-1.10/subversion/libsvn_subr/io.c
    subversion/branches/fsx-1.10/subversion/mod_dav_svn/activity.c
    subversion/branches/fsx-1.10/subversion/mod_dav_svn/dav_svn.h
    subversion/branches/fsx-1.10/subversion/mod_dav_svn/deadprops.c
    subversion/branches/fsx-1.10/subversion/mod_dav_svn/lock.c
    subversion/branches/fsx-1.10/subversion/mod_dav_svn/merge.c
    subversion/branches/fsx-1.10/subversion/mod_dav_svn/reports/dated-rev.c
    subversion/branches/fsx-1.10/subversion/mod_dav_svn/reports/deleted-rev.c
    subversion/branches/fsx-1.10/subversion/mod_dav_svn/reports/file-revs.c
    
subversion/branches/fsx-1.10/subversion/mod_dav_svn/reports/get-location-segments.c
    subversion/branches/fsx-1.10/subversion/mod_dav_svn/reports/get-locations.c
    subversion/branches/fsx-1.10/subversion/mod_dav_svn/reports/get-locks.c
    
subversion/branches/fsx-1.10/subversion/mod_dav_svn/reports/inherited-props.c
    subversion/branches/fsx-1.10/subversion/mod_dav_svn/reports/log.c
    subversion/branches/fsx-1.10/subversion/mod_dav_svn/reports/mergeinfo.c
    subversion/branches/fsx-1.10/subversion/mod_dav_svn/reports/replay.c
    subversion/branches/fsx-1.10/subversion/mod_dav_svn/reports/update.c
    subversion/branches/fsx-1.10/subversion/mod_dav_svn/repos.c
    subversion/branches/fsx-1.10/subversion/mod_dav_svn/util.c
    subversion/branches/fsx-1.10/subversion/mod_dav_svn/version.c
    subversion/branches/fsx-1.10/subversion/svn/cl-conflicts.c
    subversion/branches/fsx-1.10/subversion/svn/cl.h
    subversion/branches/fsx-1.10/subversion/svn/conflict-callbacks.c
    subversion/branches/fsx-1.10/subversion/svn/info-cmd.c
    subversion/branches/fsx-1.10/subversion/svn/util.c
    
subversion/branches/fsx-1.10/subversion/tests/cmdline/merge_tree_conflict_tests.py
    subversion/branches/fsx-1.10/subversion/tests/cmdline/mergeinfo_tests.py
    subversion/branches/fsx-1.10/subversion/tests/cmdline/move_tests.py
    subversion/branches/fsx-1.10/subversion/tests/cmdline/prop_tests.py
    subversion/branches/fsx-1.10/subversion/tests/cmdline/svnadmin_tests.py
    subversion/branches/fsx-1.10/subversion/tests/cmdline/svntest/main.py
    subversion/branches/fsx-1.10/subversion/tests/cmdline/update_tests.py

Propchange: subversion/branches/fsx-1.10/
------------------------------------------------------------------------------
--- svn:mergeinfo (original)
+++ svn:mergeinfo Thu Jun 25 08:00:57 2015
@@ -91,4 +91,4 @@
 /subversion/branches/verify-at-commit:1462039-1462408
 /subversion/branches/verify-keep-going:1439280-1546110
 /subversion/branches/wc-collate-path:1402685-1480384
-/subversion/trunk:1658218-1685462
+/subversion/trunk:1658218-1687421

Modified: subversion/branches/fsx-1.10/build/ac-macros/apache.m4
URL: 
http://svn.apache.org/viewvc/subversion/branches/fsx-1.10/build/ac-macros/apache.m4?rev=1687422&r1=1687421&r2=1687422&view=diff
==============================================================================
--- subversion/branches/fsx-1.10/build/ac-macros/apache.m4 (original)
+++ subversion/branches/fsx-1.10/build/ac-macros/apache.m4 Thu Jun 25 08:00:57 
2015
@@ -166,7 +166,7 @@ if test -n "$APXS" && test "$APXS" != "n
     if ! test -e $HTTPD ; then
       HTTPD="`$APXS -q bindir`/`$APXS -q PROGNAME`"
     fi
-    HTTPD_VERSION=["`$HTTPD -v | $SED -e 's@^.*/\([0-9.]*\)\(.*$\)@\1@ ; 1q'`"]
+    HTTPD_VERSION=["`$HTTPD -v | $SED -e 's/^.*\/\([0-9.]*\).*$/\1/' -e 1q`"]
 
     case $host in
       *-*-cygwin*)

Modified: subversion/branches/fsx-1.10/subversion/include/svn_client.h
URL: 
http://svn.apache.org/viewvc/subversion/branches/fsx-1.10/subversion/include/svn_client.h?rev=1687422&r1=1687421&r2=1687422&view=diff
==============================================================================
--- subversion/branches/fsx-1.10/subversion/include/svn_client.h (original)
+++ subversion/branches/fsx-1.10/subversion/include/svn_client.h Thu Jun 25 
08:00:57 2015
@@ -4362,6 +4362,15 @@ svn_client_revert(const apr_array_header
  */
 
 /**
+ * Return the kind of conflict (text conflict, property conflict,
+ * or tree conflict) represented by @a conflict.
+ *
+ * New in 1.10.
+ */
+svn_wc_conflict_kind_t
+svn_client_conflict_get_kind(const svn_wc_conflict_description2_t *conflict);
+
+/**
  * Return the absolute path to the conflicted working copy node described
  * by @a conflict.
  *
@@ -4407,58 +4416,153 @@ svn_client_conflict_get_local_change(
   const svn_wc_conflict_description2_t *conflict);
 
 /**
- * Accessor functions for svn_wc_conflict_description2_t. This is a temporary
- * API for eventually replacing svn_wc_conflict_description2_t with an opaque
- * type and providing improved APIs for conflict resolution.
- * 
- * @since New in 1.10. 
+ * Return information about the repository associated with @a conflict. 
+ * In case of a foreign-repository merge this will differ from the
+ * repository information associated with the merge target working copy.
+ *
+ * @since New in 1.10.
  */
+svn_error_t *
+svn_client_conflict_get_repos_info(
+  const char **repos_root_url,
+  const char **repos_uuid,
+  const svn_wc_conflict_description2_t *conflict,
+  apr_pool_t *result_pool,
+  apr_pool_t *scratch_pool);
 
-#define svn_client_conflict_get_node_kind(conflict) \
-  ((conflict)->node_kind)
+/**
+ * Return the repository-relative location and the node kind of the incoming
+ * old version of the conflicted node described by @a conflict.
+ *
+ * If the repository-relative path is not available, the @a
+ * *incoming_old_repos_relpath will be set to @c NULL, 
+ *
+ * If the peg revision is not available, @a *incoming_old_regrev will be
+ * set to SVN_INVALID_REVNUM.
+ * 
+ * If the node kind is not available or if the node does not exist at the
+ * specified path and revision, @a *incoming_old_node_kind will be set to
+ * svn_node_none.
+ * ### Should return svn_node_unkown if not available?
+ *
+ * Any output parameter may be set to @c NULL by the caller to indicate that
+ * a particular piece of information should not be returned.
+ *
+ * In case of tree conflicts, this path@revision does not necessarily exist
+ * in the repository, and it does not necessarily represent the incoming
+ * change which is responsible for the occurance of the tree conflict.
+ * The responsible incoming change is generally located somewhere between
+ * the old and new incoming versions.
+ *
+ * @since New in 1.10.
+ */
+svn_error_t *
+svn_client_conflict_get_incoming_old_repos_location(
+  const char **incoming_old_repos_relpath,
+  svn_revnum_t *incoming_old_regrev,
+  svn_node_kind_t *incoming_old_node_kind,
+  const svn_wc_conflict_description2_t *conflict,
+  apr_pool_t *result_pool,
+  apr_pool_t *scratch_pool);
 
-#define svn_client_conflict_get_kind(conflict) \
-  ((conflict)->kind)
+/**
+ * Like svn_client_conflict_get_incoming_old_repos_location(), expect this
+ * function returns the same data for the incoming new version.
+ *
+ * The same note about tree conflicts applies.
+ *
+ * @since New in 1.10.
+ */
+svn_error_t *
+svn_client_conflict_get_incoming_new_repos_location(
+  const char **incoming_new_repos_relpath,
+  svn_revnum_t *incoming_new_regrev,
+  svn_node_kind_t *incoming_new_node_kind,
+  const svn_wc_conflict_description2_t *conflict,
+  apr_pool_t *result_pool,
+  apr_pool_t *scratch_pool);
 
-#define svn_client_conflict_get_property_name(conflict) \
-  ((conflict)->property_name)
+/**
+ * Return the node kind of the tree conflict victim described by @a conflict.
+ * The victim is the local node in the working copy which was affected by the
+ * tree conflict at the time the conflict was raised.
+ *
+ * @since New in 1.10.
+ */
+svn_node_kind_t
+svn_client_conflict_tree_get_victim_node_kind(
+  const svn_wc_conflict_description2_t *conflict);
 
-#define svn_client_conflict_get_is_binary(conflict) \
-  ((conflict)->is_binary)
+/**
+ * Return the name of the conflicted property represented by @a conflict.
+ *
+ * @since New in 1.10.
+ */
+const char *
+svn_client_conflict_prop_get_propname(
+  const svn_wc_conflict_description2_t *conflict);
 
-#define svn_client_conflict_get_mime_type(conflict) \
-  ((conflict)->mime_type)
+/**
+ * Return the set of property values involved in the property conflict
+ * described by @a conflict. If a property value is unavailable the
+ * corresponding output argument is set to @c NULL.
+ *  
+ * A 3-way diff of these property values can be generated with
+ * svn_diff_mem_string_diff3(). A merged version with conflict
+ * markers can be generated with svn_diff_mem_string_output_merge3().
+ *
+ * @since New in 1.10.
+ */
+svn_error_t *
+svn_client_conflict_prop_get_propvals(
+  const svn_string_t **base_propval,
+  const svn_string_t **working_propval,
+  const svn_string_t **incoming_old_propval,
+  const svn_string_t **incoming_new_propval,
+  const svn_wc_conflict_description2_t *conflict,
+  apr_pool_t *result_pool);
 
-#define svn_client_conflict_get_base_abspath(conflict) \
-  ((conflict)->base_abspath)
+/**
+ * Return the MIME-type of the working version of the text-conflicted file
+ * described by @a conflict.
+ *
+ * ### Really needed? What about base/incoming_old/incoming_new values?
+ * @since: New in 1.10.
+ */
+const char *
+svn_client_conflict_text_get_mime_type(
+  const svn_wc_conflict_description2_t *conflict);
 
-#define svn_client_conflict_get_their_abspath(conflict) \
-  ((conflict)->their_abspath)
+/**
+ * Return absolute paths to the versions of the text-conflicted file 
+ * described by @a conflict.
+ *
+ * If a particular content is not available, it is set to @c NULL.
+ * 
+ * ### Should this be returning svn_stream_t instead of paths?
+ * @since: New in 1.10.
+ */
+svn_error_t *
+svn_client_conflict_text_get_contents(
+  const char **base_abspath,
+  const char **working_abspath,
+  const char **incoming_old_abspath,
+  const char **incoming_new_abspath,
+  const svn_wc_conflict_description2_t *conflict,
+  apr_pool_t *result_pool,
+  apr_pool_t *scratch_pool);
 
-#define svn_client_conflict_get_my_abspath(conflict) \
-  ((conflict)->my_abspath)
+/**
+ * Accessor functions for svn_wc_conflict_description2_t. This is a temporary
+ * API for eventually replacing svn_wc_conflict_description2_t with an opaque
+ * type and providing improved APIs for conflict resolution.
+ * 
+ * @since New in 1.10. 
+ */
 
 #define svn_client_conflict_get_merged_file(conflict) \
   ((conflict)->merged_file)
 
-#define svn_client_conflict_get_src_left_version(conflict) \
-  ((conflict)->src_left_version)
-
-#define svn_client_conflict_get_src_right_version(conflict) \
-  ((conflict)->src_right_version)
-
-#define svn_client_conflict_get_prop_reject_abspath(conflict) \
-  ((conflict)->prop_reject_abspath)
-
-#define svn_client_conflict_get_prop_value_working(conflict) \
-  ((conflict)->prop_value_working)
-
-#define svn_client_conflict_get_prop_value_incoming_old(conflict) \
-  ((conflict)->prop_value_incoming_old)
-
-#define svn_client_conflict_get_prop_value_incoming_new(conflict) \
-  ((conflict)->prop_value_incoming_new)
-
 /** @} */
 
 /**

Modified: subversion/branches/fsx-1.10/subversion/libsvn_client/merge.c
URL: 
http://svn.apache.org/viewvc/subversion/branches/fsx-1.10/subversion/libsvn_client/merge.c?rev=1687422&r1=1687421&r2=1687422&view=diff
==============================================================================
--- subversion/branches/fsx-1.10/subversion/libsvn_client/merge.c (original)
+++ subversion/branches/fsx-1.10/subversion/libsvn_client/merge.c Thu Jun 25 
08:00:57 2015
@@ -5398,6 +5398,14 @@ record_skips_in_mergeinfo(const char *me
           || obstruction_state == svn_wc_notify_state_missing)
         continue;
 
+      /* Make sure this is not a tree-conflicted path either. We don't
+       * want to add mergeinfo on such nodes since it causes problems down
+       * the line (see issue #4582, "reintegrate complains about missing
+       * ranges from node unrelated to branch") */
+      if (svn_hash_gets(merge_b->tree_conflicted_abspaths,
+                        skipped_abspath) != NULL)
+        continue;
+
       /* Add an empty range list for this path.
 
          ### TODO: This works fine for a file path skipped because it is

Modified: subversion/branches/fsx-1.10/subversion/libsvn_client/resolved.c
URL: 
http://svn.apache.org/viewvc/subversion/branches/fsx-1.10/subversion/libsvn_client/resolved.c?rev=1687422&r1=1687421&r2=1687422&view=diff
==============================================================================
--- subversion/branches/fsx-1.10/subversion/libsvn_client/resolved.c (original)
+++ subversion/branches/fsx-1.10/subversion/libsvn_client/resolved.c Thu Jun 25 
08:00:57 2015
@@ -148,6 +148,12 @@ svn_client_resolve(const char *path,
 
 /*** Dealing with conflicts. ***/
 
+svn_wc_conflict_kind_t
+svn_client_conflict_get_kind(const svn_wc_conflict_description2_t *conflict)
+{
+  return conflict->kind;
+}
+
 const char *
 svn_client_conflict_get_local_abspath(
   const svn_wc_conflict_description2_t *conflict)
@@ -175,3 +181,201 @@ svn_client_conflict_get_local_change(
 {
   return conflict->reason;
 }
+
+svn_error_t *
+svn_client_conflict_get_repos_info(
+  const char **repos_root_url,
+  const char **repos_uuid,
+  const svn_wc_conflict_description2_t *conflict,
+  apr_pool_t *result_pool,
+  apr_pool_t *scratch_pool)
+{
+  if (repos_root_url)
+    {
+      if (conflict->src_left_version)
+        *repos_root_url = conflict->src_left_version->repos_url;
+      else if (conflict->src_right_version)
+        *repos_root_url = conflict->src_right_version->repos_url;
+      else
+        *repos_root_url = NULL;
+    }
+
+  if (repos_uuid)
+    {
+      if (conflict->src_left_version)
+        *repos_uuid = conflict->src_left_version->repos_uuid;
+      else if (conflict->src_right_version)
+        *repos_uuid = conflict->src_right_version->repos_uuid;
+      else
+        *repos_uuid = NULL;
+    }
+
+  return SVN_NO_ERROR;
+}
+
+svn_error_t *
+svn_client_conflict_get_incoming_old_repos_location(
+  const char **incoming_old_repos_relpath,
+  svn_revnum_t *incoming_old_pegrev,
+  svn_node_kind_t *incoming_old_node_kind,
+  const svn_wc_conflict_description2_t *conflict,
+  apr_pool_t *result_pool,
+  apr_pool_t *scratch_pool)
+{
+  if (incoming_old_repos_relpath)
+    {
+      if (conflict->src_left_version)
+        *incoming_old_repos_relpath = 
conflict->src_left_version->path_in_repos;
+      else
+        *incoming_old_repos_relpath = NULL;
+    }
+
+  if (incoming_old_pegrev)
+    {
+      if (conflict->src_left_version)
+        *incoming_old_pegrev = conflict->src_left_version->peg_rev;
+      else
+        *incoming_old_pegrev = SVN_INVALID_REVNUM;
+    }
+
+  if (incoming_old_node_kind)
+    {
+      if (conflict->src_left_version)
+        *incoming_old_node_kind = conflict->src_left_version->node_kind;
+      else
+        *incoming_old_node_kind = svn_node_none;
+    }
+
+  return SVN_NO_ERROR;
+}
+
+svn_error_t *
+svn_client_conflict_get_incoming_new_repos_location(
+  const char **incoming_new_repos_relpath,
+  svn_revnum_t *incoming_new_pegrev,
+  svn_node_kind_t *incoming_new_node_kind,
+  const svn_wc_conflict_description2_t *conflict,
+  apr_pool_t *result_pool,
+  apr_pool_t *scratch_pool)
+{
+  if (incoming_new_repos_relpath)
+    {
+      if (conflict->src_right_version)
+        *incoming_new_repos_relpath =
+          conflict->src_right_version->path_in_repos;
+      else
+        *incoming_new_repos_relpath = NULL;
+    }
+
+  if (incoming_new_pegrev)
+    {
+      if (conflict->src_right_version)
+        *incoming_new_pegrev = conflict->src_right_version->peg_rev;
+      else
+        *incoming_new_pegrev = SVN_INVALID_REVNUM;
+    }
+
+  if (incoming_new_node_kind)
+    {
+      if (conflict->src_right_version)
+        *incoming_new_node_kind = conflict->src_right_version->node_kind;
+      else
+        *incoming_new_node_kind = svn_node_none;
+    }
+
+  return SVN_NO_ERROR;
+}
+
+svn_node_kind_t
+svn_client_conflict_tree_get_victim_node_kind(
+  const svn_wc_conflict_description2_t *conflict)
+{
+  SVN_ERR_ASSERT_NO_RETURN(svn_client_conflict_get_kind(conflict)
+      == svn_wc_conflict_kind_tree);
+
+  return conflict->node_kind;
+}
+
+const char *
+svn_client_conflict_prop_get_propname(
+  const svn_wc_conflict_description2_t *conflict)
+{
+  SVN_ERR_ASSERT_NO_RETURN(svn_client_conflict_get_kind(conflict)
+      == svn_wc_conflict_kind_property);
+
+  return conflict->property_name;
+}
+
+svn_error_t *
+svn_client_conflict_prop_get_propvals(
+  const svn_string_t **base_propval,
+  const svn_string_t **working_propval,
+  const svn_string_t **incoming_old_propval,
+  const svn_string_t **incoming_new_propval,
+  const svn_wc_conflict_description2_t *conflict,
+  apr_pool_t *result_pool)
+{
+  SVN_ERR_ASSERT(svn_client_conflict_get_kind(conflict) ==
+                 svn_wc_conflict_kind_property);
+
+  if (base_propval)
+    *base_propval = svn_string_dup(conflict->prop_value_base, result_pool);
+
+  if (working_propval)
+    *working_propval = svn_string_dup(conflict->prop_value_working,
+                                      result_pool);
+
+  if (incoming_old_propval)
+    *incoming_old_propval = svn_string_dup(conflict->prop_value_incoming_old,
+                                           result_pool);
+
+  if (incoming_new_propval)
+    *incoming_new_propval = svn_string_dup(conflict->prop_value_incoming_new,
+                                           result_pool);
+
+  return SVN_NO_ERROR;
+}
+
+const char *
+svn_client_conflict_text_get_mime_type(
+  const svn_wc_conflict_description2_t *conflict)
+{
+  SVN_ERR_ASSERT_NO_RETURN(svn_client_conflict_get_kind(conflict)
+      == svn_wc_conflict_kind_text);
+
+  return conflict->mime_type;
+}
+
+svn_error_t *
+svn_client_conflict_text_get_contents(
+  const char **base_abspath,
+  const char **working_abspath,
+  const char **incoming_old_abspath,
+  const char **incoming_new_abspath,
+  const svn_wc_conflict_description2_t *conflict,
+  apr_pool_t *result_pool,
+  apr_pool_t *scratch_pool)
+{
+  SVN_ERR_ASSERT(svn_client_conflict_get_kind(conflict)
+      == svn_wc_conflict_kind_text);
+
+  if (base_abspath)
+    {
+      if (svn_client_conflict_get_operation(conflict) ==
+          svn_wc_operation_merge)
+        *base_abspath = NULL; /* ### WC base contents not available yet */
+      else /* update/switch */
+        *base_abspath = conflict->base_abspath;
+    }
+
+  if (working_abspath)
+    *working_abspath = conflict->my_abspath;
+
+  if (incoming_old_abspath)
+    *incoming_old_abspath = conflict->base_abspath;
+
+  if (incoming_new_abspath)
+    *incoming_new_abspath = conflict->their_abspath;
+
+  return SVN_NO_ERROR;
+}

Modified: subversion/branches/fsx-1.10/subversion/libsvn_fs_fs/fs.c
URL: 
http://svn.apache.org/viewvc/subversion/branches/fsx-1.10/subversion/libsvn_fs_fs/fs.c?rev=1687422&r1=1687421&r2=1687422&view=diff
==============================================================================
--- subversion/branches/fsx-1.10/subversion/libsvn_fs_fs/fs.c (original)
+++ subversion/branches/fsx-1.10/subversion/libsvn_fs_fs/fs.c Thu Jun 25 
08:00:57 2015
@@ -134,6 +134,18 @@ fs_serialized_init(svn_fs_t *fs, apr_poo
   return SVN_NO_ERROR;
 }
 
+svn_error_t *
+svn_fs_fs__initialize_shared_data(svn_fs_t *fs,
+                                  svn_mutex__t *common_pool_lock,
+                                  apr_pool_t *pool,
+                                  apr_pool_t *common_pool)
+{
+  SVN_MUTEX__WITH_LOCK(common_pool_lock,
+                       fs_serialized_init(fs, common_pool, pool));
+
+  return SVN_NO_ERROR;
+}
+
 
 
 /* This function is provided for Subversion 1.0.x compatibility.  It
@@ -480,28 +492,19 @@ fs_hotcopy(svn_fs_t *src_fs,
            apr_pool_t *pool,
            apr_pool_t *common_pool)
 {
-  /* Open the source repo as usual. */
   SVN_ERR(fs_open(src_fs, src_path, common_pool_lock, pool, common_pool));
-  if (cancel_func)
-    SVN_ERR(cancel_func(cancel_baton));
 
-  /* Test target repo when in INCREMENTAL mode, initialize it when not.
-   * For this, we need our FS internal data structures to be temporarily
-   * available. */
+  SVN_ERR(svn_fs__check_fs(dst_fs, FALSE));
   SVN_ERR(initialize_fs_struct(dst_fs));
-  SVN_ERR(svn_fs_fs__hotcopy_prepare_target(src_fs, dst_fs, dst_path,
-                                            incremental, pool));
-  uninitialize_fs_struct(dst_fs);
-
-  /* Now, the destination repo should open just fine. */
-  SVN_ERR(fs_open(dst_fs, dst_path, common_pool_lock, pool, common_pool));
-  if (cancel_func)
-    SVN_ERR(cancel_func(cancel_baton));
-
-  /* Now, we may copy data as needed ... */
-  return svn_fs_fs__hotcopy(src_fs, dst_fs, incremental,
-                            notify_func, notify_baton,
-                            cancel_func, cancel_baton, pool);
+
+  /* In INCREMENTAL mode, svn_fs_fs__hotcopy() will open DST_FS.
+     Otherwise, it's not an FS yet --- possibly just an empty dir --- so
+     can't be opened.
+   */
+  return svn_fs_fs__hotcopy(src_fs, dst_fs, src_path, dst_path,
+                            incremental, notify_func, notify_baton,
+                            cancel_func, cancel_baton, common_pool_lock,
+                            pool, common_pool);
 }
 
 

Modified: subversion/branches/fsx-1.10/subversion/libsvn_fs_fs/fs.h
URL: 
http://svn.apache.org/viewvc/subversion/branches/fsx-1.10/subversion/libsvn_fs_fs/fs.h?rev=1687422&r1=1687421&r2=1687422&view=diff
==============================================================================
--- subversion/branches/fsx-1.10/subversion/libsvn_fs_fs/fs.h (original)
+++ subversion/branches/fsx-1.10/subversion/libsvn_fs_fs/fs.h Thu Jun 25 
08:00:57 2015
@@ -82,8 +82,6 @@ extern "C" {
 /* Names of special files and file extensions for transactions */
 #define PATH_CHANGES       "changes"       /* Records changes made so far */
 #define PATH_TXN_PROPS     "props"         /* Transaction properties */
-#define PATH_TXN_PROPS_FINAL "props-final" /* Final transaction properties
-                                              before moving to revprops */
 #define PATH_NEXT_IDS      "next-ids"      /* Next temporary ID assignments */
 #define PATH_PREFIX_NODE   "node."         /* Prefix for node filename */
 #define PATH_EXT_TXN       ".txn"          /* Extension of txn dir */

Modified: subversion/branches/fsx-1.10/subversion/libsvn_fs_fs/fs_fs.h
URL: 
http://svn.apache.org/viewvc/subversion/branches/fsx-1.10/subversion/libsvn_fs_fs/fs_fs.h?rev=1687422&r1=1687421&r2=1687422&view=diff
==============================================================================
--- subversion/branches/fsx-1.10/subversion/libsvn_fs_fs/fs_fs.h (original)
+++ subversion/branches/fsx-1.10/subversion/libsvn_fs_fs/fs_fs.h Thu Jun 25 
08:00:57 2015
@@ -39,6 +39,15 @@ svn_error_t *svn_fs_fs__open(svn_fs_t *f
                              const char *path,
                              apr_pool_t *pool);
 
+/* Initialize parts of the FS data that are being shared across multiple
+   filesystem objects.  Use COMMON_POOL for process-wide and POOL for
+   temporary allocations.  Use COMMON_POOL_LOCK to ensure that the
+   initialization is serialized. */
+svn_error_t *svn_fs_fs__initialize_shared_data(svn_fs_t *fs,
+                                               svn_mutex__t *common_pool_lock,
+                                               apr_pool_t *pool,
+                                               apr_pool_t *common_pool);
+
 /* Upgrade the fsfs filesystem FS.  Indicate progress via the optional
  * NOTIFY_FUNC callback using NOTIFY_BATON.  The optional CANCEL_FUNC
  * will periodically be called with CANCEL_BATON to allow for preemption.

Modified: subversion/branches/fsx-1.10/subversion/libsvn_fs_fs/hotcopy.c
URL: 
http://svn.apache.org/viewvc/subversion/branches/fsx-1.10/subversion/libsvn_fs_fs/hotcopy.c?rev=1687422&r1=1687421&r2=1687422&view=diff
==============================================================================
--- subversion/branches/fsx-1.10/subversion/libsvn_fs_fs/hotcopy.c (original)
+++ subversion/branches/fsx-1.10/subversion/libsvn_fs_fs/hotcopy.c Thu Jun 25 
08:00:57 2015
@@ -982,6 +982,10 @@ hotcopy_body(void *baton, apr_pool_t *po
       if (kind == svn_node_file)
         {
           SVN_ERR(svn_sqlite__hotcopy(src_subdir, dst_subdir, pool));
+
+          /* The source might have r/o flags set on it - which would be
+             carried over to the copy. */
+          SVN_ERR(svn_io_set_file_read_write(dst_subdir, FALSE, pool));
           SVN_ERR(svn_fs_fs__del_rep_reference(dst_fs, src_youngest, pool));
         }
     }
@@ -991,65 +995,33 @@ hotcopy_body(void *baton, apr_pool_t *po
     SVN_ERR(svn_io_dir_file_copy(src_fs->path, dst_fs->path,
                                  PATH_TXN_CURRENT, pool));
 
-  return SVN_NO_ERROR;
-}
-
-/* Wrapper around hotcopy_body taking out all necessary source repository
- * locks.
- */
-static svn_error_t *
-hotcopy_locking_src_body(void *baton, apr_pool_t *pool)
-{
-  struct hotcopy_body_baton *hbb = baton;
-  fs_fs_data_t *src_ffd = hbb->src_fs->fsap_data;
+  /* Hotcopied FS is complete. Stamp it with a format file. */
+  SVN_ERR(svn_fs_fs__write_format(dst_fs, TRUE, pool));
 
-  return src_ffd->format >= SVN_FS_FS__MIN_PACK_LOCK_FORMAT
-    ? svn_error_trace(svn_fs_fs__with_pack_lock(hbb->src_fs, hotcopy_body,
-                                                baton, pool))
-    : hotcopy_body(baton, pool);
+  return SVN_NO_ERROR;
 }
 
-/* Create an empty filesystem at DST_FS at DST_PATH with the same
- * configuration as SRC_FS (uuid, format, and other parameters).
- * After creation DST_FS has no revisions, not even revision zero. */
-static svn_error_t *
-hotcopy_create_empty_dest(svn_fs_t *src_fs,
-                          svn_fs_t *dst_fs,
-                          const char *dst_path,
-                          apr_pool_t *pool)
+svn_error_t *
+svn_fs_fs__hotcopy(svn_fs_t *src_fs,
+                   svn_fs_t *dst_fs,
+                   const char *src_path,
+                   const char *dst_path,
+                   svn_boolean_t incremental,
+                   svn_fs_hotcopy_notify_t notify_func,
+                   void *notify_baton,
+                   svn_cancel_func_t cancel_func,
+                   void *cancel_baton,
+                   svn_mutex__t *common_pool_lock,
+                   apr_pool_t *pool,
+                   apr_pool_t *common_pool)
 {
-  fs_fs_data_t *src_ffd = src_fs->fsap_data;
+  struct hotcopy_body_baton hbb;
 
-  /* Create the DST_FS repository with the same layout as SRC_FS. */
-  SVN_ERR(svn_fs_fs__create_file_tree(dst_fs, dst_path, src_ffd->format,
-                                      src_ffd->max_files_per_dir,
-                                      src_ffd->use_log_addressing,
-                                      pool));
-
-  /* Copy the UUID.  Hotcopy destination receives a new instance ID, but
-   * has the same filesystem UUID as the source. */
-  SVN_ERR(svn_fs_fs__set_uuid(dst_fs, src_fs->uuid, NULL, pool));
-
-  /* Remove revision 0 contents.  Otherwise, it may not get overwritten
-   * due to having a newer timestamp. */
-  SVN_ERR(hotcopy_remove_file(svn_fs_fs__path_rev(dst_fs, 0, pool), pool));
-  SVN_ERR(hotcopy_remove_file(svn_fs_fs__path_revprops(dst_fs, 0, pool),
-                              pool));
-
-  /* This filesystem is ready.  Stamp it with a format number.  Fail if
-   * the 'format' file should already exist. */
-  SVN_ERR(svn_fs_fs__write_format(dst_fs, FALSE, pool));
+  if (cancel_func)
+    SVN_ERR(cancel_func(cancel_baton));
 
-  return SVN_NO_ERROR;
-}
+  SVN_ERR(svn_fs_fs__open(src_fs, src_path, pool));
 
-svn_error_t *
-svn_fs_fs__hotcopy_prepare_target(svn_fs_t *src_fs,
-                                  svn_fs_t *dst_fs,
-                                  const char *dst_path,
-                                  svn_boolean_t incremental,
-                                  apr_pool_t *pool)
-{
   if (incremental)
     {
       const char *dst_format_abspath;
@@ -1061,39 +1033,51 @@ svn_fs_fs__hotcopy_prepare_target(svn_fs
       SVN_ERR(svn_io_check_path(dst_format_abspath, &dst_format_kind, pool));
       if (dst_format_kind == svn_node_none)
         {
-          /* Destination doesn't exist yet. Perform a normal hotcopy to a
-           * empty destination using the same configuration as the source. */
-          SVN_ERR(hotcopy_create_empty_dest(src_fs, dst_fs, dst_path, pool));
-        }
-      else
-        {
-          /* Check the existing repository. */
-          SVN_ERR(svn_fs_fs__open(dst_fs, dst_path, pool));
-          SVN_ERR(hotcopy_incremental_check_preconditions(src_fs, dst_fs,
-                                                          pool));
+          /* No destination?  Fallback to a non-incremental hotcopy. */
+          incremental = FALSE;
         }
     }
+
+  if (incremental)
+    {
+      /* Check the existing repository. */
+      SVN_ERR(svn_fs_fs__open(dst_fs, dst_path, pool));
+      SVN_ERR(hotcopy_incremental_check_preconditions(src_fs, dst_fs, pool));
+
+      SVN_ERR(svn_fs_fs__initialize_shared_data(dst_fs, common_pool_lock,
+                                                pool, common_pool));
+      SVN_ERR(svn_fs_fs__initialize_caches(dst_fs, pool));
+    }
   else
     {
       /* Start out with an empty destination using the same configuration
        * as the source. */
-      SVN_ERR(hotcopy_create_empty_dest(src_fs, dst_fs, dst_path, pool));
+      fs_fs_data_t *src_ffd = src_fs->fsap_data;
+
+      /* Create the DST_FS repository with the same layout as SRC_FS. */
+      SVN_ERR(svn_fs_fs__create_file_tree(dst_fs, dst_path, src_ffd->format,
+                                          src_ffd->max_files_per_dir,
+                                          src_ffd->use_log_addressing,
+                                          pool));
+
+      /* Copy the UUID.  Hotcopy destination receives a new instance ID, but
+       * has the same filesystem UUID as the source. */
+      SVN_ERR(svn_fs_fs__set_uuid(dst_fs, src_fs->uuid, NULL, pool));
+
+      /* Remove revision 0 contents.  Otherwise, it may not get overwritten
+       * due to having a newer timestamp. */
+      SVN_ERR(hotcopy_remove_file(svn_fs_fs__path_rev(dst_fs, 0, pool),
+                                  pool));
+      SVN_ERR(hotcopy_remove_file(svn_fs_fs__path_revprops(dst_fs, 0, pool),
+                                  pool));
+
+      SVN_ERR(svn_fs_fs__initialize_shared_data(dst_fs, common_pool_lock,
+                                                pool, common_pool));
+      SVN_ERR(svn_fs_fs__initialize_caches(dst_fs, pool));
     }
 
-  return SVN_NO_ERROR;
-}
-
-svn_error_t *
-svn_fs_fs__hotcopy(svn_fs_t *src_fs,
-                   svn_fs_t *dst_fs,
-                   svn_boolean_t incremental,
-                   svn_fs_hotcopy_notify_t notify_func,
-                   void *notify_baton,
-                   svn_cancel_func_t cancel_func,
-                   void *cancel_baton,
-                   apr_pool_t *pool)
-{
-  struct hotcopy_body_baton hbb;
+  if (cancel_func)
+    SVN_ERR(cancel_func(cancel_baton));
 
   hbb.src_fs = src_fs;
   hbb.dst_fs = dst_fs;
@@ -1102,8 +1086,15 @@ svn_fs_fs__hotcopy(svn_fs_t *src_fs,
   hbb.notify_baton = notify_baton;
   hbb.cancel_func = cancel_func;
   hbb.cancel_baton = cancel_baton;
-  SVN_ERR(svn_fs_fs__with_all_locks(dst_fs, hotcopy_locking_src_body, &hbb,
-                                    pool));
+
+  /* Lock the destination in the incremental mode.  For a non-incremental
+   * hotcopy, don't take any locks.  In that case the destination cannot be
+   * opened until the hotcopy finishes, and we don't have to worry about
+   * concurrency. */
+  if (incremental)
+    SVN_ERR(svn_fs_fs__with_all_locks(dst_fs, hotcopy_body, &hbb, pool));
+  else
+    SVN_ERR(hotcopy_body(&hbb, pool));
 
   return SVN_NO_ERROR;
 }

Modified: subversion/branches/fsx-1.10/subversion/libsvn_fs_fs/hotcopy.h
URL: 
http://svn.apache.org/viewvc/subversion/branches/fsx-1.10/subversion/libsvn_fs_fs/hotcopy.h?rev=1687422&r1=1687421&r2=1687422&view=diff
==============================================================================
--- subversion/branches/fsx-1.10/subversion/libsvn_fs_fs/hotcopy.h (original)
+++ subversion/branches/fsx-1.10/subversion/libsvn_fs_fs/hotcopy.h Thu Jun 25 
08:00:57 2015
@@ -25,27 +25,23 @@
 
 #include "fs.h"
 
-/* Create an empty copy of the fsfs filesystem SRC_FS into a new DST_FS at
- * DST_PATH.  If INCREMENTAL is TRUE, perform a few pre-checks only if
- * a repo already exists at DST_PATH. Use POOL for temporary allocations. */
-svn_error_t *
-svn_fs_fs__hotcopy_prepare_target(svn_fs_t *src_fs,
-                                  svn_fs_t *dst_fs,
-                                  const char *dst_path,
-                                  svn_boolean_t incremental,
-                                  apr_pool_t *pool);
-
-/* Copy the fsfs filesystem SRC_FS into DST_FS. If INCREMENTAL is TRUE, do
- * not re-copy data which already exists in DST_FS.  Indicate progress via
- * the optional NOTIFY_FUNC callback using NOTIFY_BATON.  Use POOL for
- * temporary allocations. */
+/* Copy the fsfs filesystem SRC_FS at SRC_PATH into a new copy DST_FS at
+ * DST_PATH.  If INCREMENTAL is TRUE, do not re-copy data which already
+ * exists in DST_FS.  Indicate progress via the optional NOTIFY_FUNC
+ * callback using NOTIFY_BATON.  Use COMMON_POOL for process-wide and
+ * POOL for temporary allocations.  Use COMMON_POOL_LOCK to ensure
+ * that the initialization of the shared data is serialized. */
 svn_error_t * svn_fs_fs__hotcopy(svn_fs_t *src_fs,
                                  svn_fs_t *dst_fs,
+                                 const char *src_path,
+                                 const char *dst_path,
                                  svn_boolean_t incremental,
                                  svn_fs_hotcopy_notify_t notify_func,
                                  void *notify_baton,
                                  svn_cancel_func_t cancel_func,
                                  void *cancel_baton,
-                                 apr_pool_t *pool);
+                                 svn_mutex__t *common_pool_lock,
+                                 apr_pool_t *pool,
+                                 apr_pool_t *common_pool);
 
 #endif

Modified: subversion/branches/fsx-1.10/subversion/libsvn_fs_fs/pack.c
URL: 
http://svn.apache.org/viewvc/subversion/branches/fsx-1.10/subversion/libsvn_fs_fs/pack.c?rev=1687422&r1=1687421&r2=1687422&view=diff
==============================================================================
--- subversion/branches/fsx-1.10/subversion/libsvn_fs_fs/pack.c (original)
+++ subversion/branches/fsx-1.10/subversion/libsvn_fs_fs/pack.c Thu Jun 25 
08:00:57 2015
@@ -1931,6 +1931,34 @@ pack_shard(struct pack_baton *baton,
   return SVN_NO_ERROR;
 }
 
+/* Read the youngest rev and the first non-packed rev info for FS from disk.
+   Set *FULLY_PACKED when there is no completed unpacked shard.
+   Use SCRATCH_POOL for temporary allocations.
+ */
+static svn_error_t *
+get_pack_status(svn_boolean_t *fully_packed,
+                svn_fs_t *fs,
+                apr_pool_t *scratch_pool)
+{
+  fs_fs_data_t *ffd = fs->fsap_data;
+  apr_int64_t completed_shards;
+  svn_revnum_t youngest;
+
+  SVN_ERR(svn_fs_fs__read_min_unpacked_rev(&ffd->min_unpacked_rev, fs,
+                                           scratch_pool));
+
+  SVN_ERR(svn_fs_fs__youngest_rev(&youngest, fs, scratch_pool));
+  completed_shards = (youngest + 1) / ffd->max_files_per_dir;
+
+  /* See if we've already completed all possible shards thus far. */
+  if (ffd->min_unpacked_rev == (completed_shards * ffd->max_files_per_dir))
+    *fully_packed = TRUE;
+  else
+    *fully_packed = FALSE;
+
+  return SVN_NO_ERROR;
+}
+
 /* The work-horse for svn_fs_fs__pack, called with the FS write lock.
    This implements the svn_fs_fs__with_write_lock() 'body' callback
    type.  BATON is a 'struct pack_baton *'.
@@ -1952,30 +1980,16 @@ pack_body(void *baton,
   struct pack_baton *pb = baton;
   fs_fs_data_t *ffd = pb->fs->fsap_data;
   apr_int64_t completed_shards;
-  svn_revnum_t youngest;
   apr_pool_t *iterpool;
+  svn_boolean_t fully_packed;
 
-  /* If the repository isn't a new enough format, we don't support packing.
-     Return a friendly error to that effect. */
-  if (ffd->format < SVN_FS_FS__MIN_PACKED_FORMAT)
-    return svn_error_createf(SVN_ERR_UNSUPPORTED_FEATURE, NULL,
-      _("FSFS format (%d) too old to pack; please upgrade the filesystem."),
-      ffd->format);
-
-  /* If we aren't using sharding, we can't do any packing, so quit. */
-  if (!ffd->max_files_per_dir)
-    return SVN_NO_ERROR;
-
-  SVN_ERR(svn_fs_fs__read_min_unpacked_rev(&ffd->min_unpacked_rev, pb->fs,
-                                           pool));
-
-  SVN_ERR(svn_fs_fs__youngest_rev(&youngest, pb->fs, pool));
-  completed_shards = (youngest + 1) / ffd->max_files_per_dir;
-
-  /* See if we've already completed all possible shards thus far. */
-  if (ffd->min_unpacked_rev == (completed_shards * ffd->max_files_per_dir))
+  /* Since another process might have already packed the repo,
+     we need to re-read the pack status. */
+  SVN_ERR(get_pack_status(&fully_packed, pb->fs, pool));
+  if (fully_packed)
     return SVN_NO_ERROR;
 
+  completed_shards = (ffd->youngest_rev_cache + 1) / ffd->max_files_per_dir;
   pb->revs_dir = svn_dirent_join(pb->fs->path, PATH_REVS_DIR, pool);
   if (ffd->format >= SVN_FS_FS__MIN_PACKED_REVPROP_FORMAT)
     pb->revsprops_dir = svn_dirent_join(pb->fs->path, PATH_REVPROPS_DIR,
@@ -2009,7 +2023,25 @@ svn_fs_fs__pack(svn_fs_t *fs,
   struct pack_baton pb = { 0 };
   fs_fs_data_t *ffd = fs->fsap_data;
   svn_error_t *err;
+  svn_boolean_t fully_packed;
+
+  /* If the repository isn't a new enough format, we don't support packing.
+     Return a friendly error to that effect. */
+  if (ffd->format < SVN_FS_FS__MIN_PACKED_FORMAT)
+    return svn_error_createf(SVN_ERR_UNSUPPORTED_FEATURE, NULL,
+      _("FSFS format (%d) too old to pack; please upgrade the filesystem."),
+      ffd->format);
+
+  /* If we aren't using sharding, we can't do any packing, so quit. */
+  if (!ffd->max_files_per_dir)
+    return SVN_NO_ERROR;
+
+  /* Is there we even anything to do?. */
+  SVN_ERR(get_pack_status(&fully_packed, fs, pool));
+  if (fully_packed)
+    return SVN_NO_ERROR;
 
+  /* Lock the repo and start the pack process. */
   pb.fs = fs;
   pb.notify_func = notify_func;
   pb.notify_baton = notify_baton;

Modified: subversion/branches/fsx-1.10/subversion/libsvn_fs_fs/transaction.c
URL: 
http://svn.apache.org/viewvc/subversion/branches/fsx-1.10/subversion/libsvn_fs_fs/transaction.c?rev=1687422&r1=1687421&r2=1687422&view=diff
==============================================================================
--- subversion/branches/fsx-1.10/subversion/libsvn_fs_fs/transaction.c 
(original)
+++ subversion/branches/fsx-1.10/subversion/libsvn_fs_fs/transaction.c Thu Jun 
25 08:00:57 2015
@@ -89,15 +89,6 @@ path_txn_props(svn_fs_t *fs,
 }
 
 static APR_INLINE const char *
-path_txn_props_final(svn_fs_t *fs,
-                     const svn_fs_fs__id_part_t *txn_id,
-                     apr_pool_t *pool)
-{
-  return svn_dirent_join(svn_fs_fs__path_txn_dir(fs, txn_id, pool),
-                         PATH_TXN_PROPS_FINAL, pool);
-}
-
-static APR_INLINE const char *
 path_txn_next_ids(svn_fs_t *fs,
                   const svn_fs_fs__id_part_t *txn_id,
                   apr_pool_t *pool)
@@ -1160,7 +1151,6 @@ static svn_error_t *
 set_txn_proplist(svn_fs_t *fs,
                  const svn_fs_fs__id_part_t *txn_id,
                  apr_hash_t *props,
-                 svn_boolean_t final,
                  apr_pool_t *pool)
 {
   svn_stringbuf_t *buf;
@@ -1173,9 +1163,7 @@ set_txn_proplist(svn_fs_t *fs,
   SVN_ERR(svn_stream_close(stream));
 
   /* Open the transaction properties file and write new contents to it. */
-  SVN_ERR(svn_io_write_atomic((final
-                               ? path_txn_props_final(fs, txn_id, pool)
-                               : path_txn_props(fs, txn_id, pool)),
+  SVN_ERR(svn_io_write_atomic(path_txn_props(fs, txn_id, pool),
                               buf->data, buf->len,
                               NULL /* copy_perms_path */, pool));
   return SVN_NO_ERROR;
@@ -1232,7 +1220,7 @@ svn_fs_fs__change_txn_props(svn_fs_txn_t
 
   /* Create a new version of the file and write out the new props. */
   /* Open the transaction properties file. */
-  SVN_ERR(set_txn_proplist(txn->fs, &ftd->txn_id, txn_prop, FALSE, pool));
+  SVN_ERR(set_txn_proplist(txn->fs, &ftd->txn_id, txn_prop, pool));
 
   return SVN_NO_ERROR;
 }
@@ -3337,41 +3325,31 @@ verify_locks(svn_fs_t *fs,
   return SVN_NO_ERROR;
 }
 
-/* Return in *PATH the path to a file containing the properties that
-   make up the final revision properties file.  This involves setting
-   svn:date and removing any temporary properties associated with the
-   commit flags. */
+/* Writes final revision properties to file PATH applying permissions
+   from file PERMS_REFERENCE. This involves setting svn:date and
+   removing any temporary properties associated with the commit flags. */
 static svn_error_t *
-write_final_revprop(const char **path,
+write_final_revprop(const char *path,
+                    const char *perms_reference,
                     svn_fs_txn_t *txn,
-                    const svn_fs_fs__id_part_t *txn_id,
                     apr_pool_t *pool)
 {
   apr_hash_t *txnprops;
-  svn_boolean_t final_mods = FALSE;
   svn_string_t date;
   svn_string_t *client_date;
+  apr_file_t *revprop_file;
+  svn_stream_t *stream;
 
   SVN_ERR(svn_fs_fs__txn_proplist(&txnprops, txn, pool));
 
   /* Remove any temporary txn props representing 'flags'. */
-  if (svn_hash_gets(txnprops, SVN_FS__PROP_TXN_CHECK_OOD))
-    {
-      svn_hash_sets(txnprops, SVN_FS__PROP_TXN_CHECK_OOD, NULL);
-      final_mods = TRUE;
-    }
-
-  if (svn_hash_gets(txnprops, SVN_FS__PROP_TXN_CHECK_LOCKS))
-    {
-      svn_hash_sets(txnprops, SVN_FS__PROP_TXN_CHECK_LOCKS, NULL);
-      final_mods = TRUE;
-    }
+  svn_hash_sets(txnprops, SVN_FS__PROP_TXN_CHECK_OOD, NULL);
+  svn_hash_sets(txnprops, SVN_FS__PROP_TXN_CHECK_LOCKS, NULL);
 
   client_date = svn_hash_gets(txnprops, SVN_FS__PROP_TXN_CLIENT_DATE);
   if (client_date)
     {
       svn_hash_sets(txnprops, SVN_FS__PROP_TXN_CLIENT_DATE, NULL);
-      final_mods = TRUE;
     }
 
   /* Update commit time to ensure that svn:date revprops remain ordered if
@@ -3381,18 +3359,22 @@ write_final_revprop(const char **path,
       date.data = svn_time_to_cstring(apr_time_now(), pool);
       date.len = strlen(date.data);
       svn_hash_sets(txnprops, SVN_PROP_REVISION_DATE, &date);
-      final_mods = TRUE;
     }
 
-  if (final_mods)
-    {
-      SVN_ERR(set_txn_proplist(txn->fs, txn_id, txnprops, TRUE, pool));
-      *path = path_txn_props_final(txn->fs, txn_id, pool);
-    }
-  else
-    {
-      *path = path_txn_props(txn->fs, txn_id, pool);
-    }
+  /* Create new revprops file. Tell OS to truncate existing file,
+     since  file may already exists from failed transaction. */
+  SVN_ERR(svn_io_file_open(&revprop_file, path,
+                           APR_WRITE | APR_CREATE | APR_TRUNCATE
+                           | APR_BUFFERED, APR_OS_DEFAULT, pool));
+
+  stream = svn_stream_from_aprfile2(revprop_file, TRUE, pool);
+  SVN_ERR(svn_hash_write2(txnprops, stream, SVN_HASH_TERMINATOR, pool));
+  SVN_ERR(svn_stream_close(stream));
+
+  SVN_ERR(svn_io_file_flush_to_disk(revprop_file, pool));
+  SVN_ERR(svn_io_file_close(revprop_file, pool));
+
+  SVN_ERR(svn_io_copy_perms(perms_reference, path, pool));
 
   return SVN_NO_ERROR;
 }
@@ -3457,7 +3439,7 @@ commit_body(void *baton, apr_pool_t *poo
   struct commit_baton *cb = baton;
   fs_fs_data_t *ffd = cb->fs->fsap_data;
   const char *old_rev_filename, *rev_filename, *proto_filename;
-  const char *revprop_filename, *final_revprop;
+  const char *revprop_filename;
   const svn_fs_id_t *root_id, *new_root_id;
   apr_uint64_t start_node_id;
   apr_uint64_t start_copy_id;
@@ -3610,12 +3592,11 @@ commit_body(void *baton, apr_pool_t *poo
      remove the transaction directory later. */
   SVN_ERR(unlock_proto_rev(cb->fs, txn_id, proto_file_lockcookie, pool));
 
-  /* Move the revprops file into place. */
+  /* Write final revprops file. */
   SVN_ERR_ASSERT(! svn_fs_fs__is_packed_revprop(cb->fs, new_rev));
-  SVN_ERR(write_final_revprop(&revprop_filename, cb->txn, txn_id, pool));
-  final_revprop = svn_fs_fs__path_revprops(cb->fs, new_rev, pool);
-  SVN_ERR(svn_fs_fs__move_into_place(revprop_filename, final_revprop,
-                                     old_rev_filename, pool));
+  revprop_filename = svn_fs_fs__path_revprops(cb->fs, new_rev, pool);
+  SVN_ERR(write_final_revprop(revprop_filename, old_rev_filename,
+                              cb->txn, pool));
 
   /* Update the 'current' file. */
   SVN_ERR(verify_as_revision_before_current_plus_plus(cb->fs, new_rev, pool));
@@ -3919,6 +3900,5 @@ svn_fs_fs__begin_txn(svn_fs_txn_t **txn_
                   svn_string_create("0", pool));
 
   ftd = (*txn_p)->fsap_data;
-  return svn_error_trace(set_txn_proplist(fs, &ftd->txn_id, props, FALSE,
-                                          pool));
+  return svn_error_trace(set_txn_proplist(fs, &ftd->txn_id, props, pool));
 }

Modified: subversion/branches/fsx-1.10/subversion/libsvn_repos/rev_hunt.c
URL: 
http://svn.apache.org/viewvc/subversion/branches/fsx-1.10/subversion/libsvn_repos/rev_hunt.c?rev=1687422&r1=1687421&r2=1687422&view=diff
==============================================================================
--- subversion/branches/fsx-1.10/subversion/libsvn_repos/rev_hunt.c (original)
+++ subversion/branches/fsx-1.10/subversion/libsvn_repos/rev_hunt.c Thu Jun 25 
08:00:57 2015
@@ -1336,6 +1336,7 @@ struct send_baton
   apr_hash_t *last_props;
   const char *last_path;
   svn_fs_root_t *last_root;
+  svn_boolean_t include_merged_revisions;
 };
 
 /* Send PATH_REV to HANDLER and HANDLER_BATON, using information provided by
@@ -1373,15 +1374,32 @@ send_path_revision(struct path_revision
   SVN_ERR(svn_prop_diffs(&prop_diffs, props, sb->last_props,
                          sb->iterpool));
 
-  /* Check if the contents *may* have changed. (Allow false positives,
-     for now, as the blame implementation currently depends on them.) */
-  /* Special case: In the first revision, we always provide a delta. */
-  if (sb->last_root)
-    SVN_ERR(svn_fs_contents_different(&contents_changed, sb->last_root,
-                                      sb->last_path, root, path_rev->path,
-                                      sb->iterpool));
+  /* Check if the contents *may* have changed. */
+  if (! sb->last_root)
+    {
+      /* Special case: In the first revision, we always provide a delta. */
+      contents_changed = TRUE;
+    }
+  else if (sb->include_merged_revisions
+           && strcmp(sb->last_path, path_rev->path))
+    {
+      /* ### This is a HACK!!!
+       * Blame -g, in older clients anyways, relies on getting a notification
+       * whenever the path changes - even if there was no content change.
+       *
+       * TODO: A future release should take an extra parameter and depending
+       * on that either always send a text delta or only send it if there
+       * is a difference. */
+      contents_changed = TRUE;
+    }
   else
-    contents_changed = TRUE;
+    {
+      /* Did the file contents actually change?
+       * It could e.g. be a property-only change. */
+      SVN_ERR(svn_fs_contents_different(&contents_changed, sb->last_root,
+                                        sb->last_path, root, path_rev->path,
+                                        sb->iterpool));
+    }
 
   /* We have all we need, give to the handler. */
   SVN_ERR(handler(handler_baton, path_rev->path, path_rev->revnum,
@@ -1450,6 +1468,7 @@ get_file_revs_backwards(svn_repos_t *rep
   last_pool = svn_pool_create(scratch_pool);
   sb.iterpool = svn_pool_create(scratch_pool);
   sb.last_pool = svn_pool_create(scratch_pool);
+  sb.include_merged_revisions = FALSE;
 
   /* We want the first txdelta to be against the empty file. */
   sb.last_root = NULL;
@@ -1605,6 +1624,9 @@ svn_repos_get_file_revs2(svn_repos_t *re
   /* Create an empty hash table for the first property diff. */
   sb.last_props = apr_hash_make(sb.last_pool);
 
+  /* Inform send_path_revision() whether workarounds / special behavior
+   * may be needed. */
+  sb.include_merged_revisions = include_merged_revisions;
 
   /* Get the revisions we are interested in. */
   duplicate_path_revs = apr_hash_make(scratch_pool);

Modified: subversion/branches/fsx-1.10/subversion/libsvn_subr/io.c
URL: 
http://svn.apache.org/viewvc/subversion/branches/fsx-1.10/subversion/libsvn_subr/io.c?rev=1687422&r1=1687421&r2=1687422&view=diff
==============================================================================
--- subversion/branches/fsx-1.10/subversion/libsvn_subr/io.c (original)
+++ subversion/branches/fsx-1.10/subversion/libsvn_subr/io.c Thu Jun 25 
08:00:57 2015
@@ -2301,6 +2301,14 @@ svn_error_t *svn_io_file_flush_to_disk(a
                                        apr_pool_t *pool)
 {
   apr_os_file_t filehand;
+  const char *fname;
+  apr_status_t apr_err;
+
+  /* We need this only in case of an error but this is cheap to get -
+   * so we do it here for clarity. */
+  apr_err = apr_file_name_get(&fname, file);
+  if (apr_err)
+    return svn_error_wrap_apr(apr_err, _("Can't get file name"));
 
   /* ### In apr 1.4+ we could delegate most of this function to
          apr_file_sync(). The only major difference is that this doesn't
@@ -2318,7 +2326,8 @@ svn_error_t *svn_io_file_flush_to_disk(a
 
     if (! FlushFileBuffers(filehand))
         return svn_error_wrap_apr(apr_get_os_error(),
-                                  _("Can't flush file to disk"));
+                                  _("Can't flush file '%s' to disk"),
+                                  try_utf8_from_internal_style(fname, pool));
 
 #else
       int rv;
@@ -2339,7 +2348,8 @@ svn_error_t *svn_io_file_flush_to_disk(a
 
       if (rv == -1)
         return svn_error_wrap_apr(apr_get_os_error(),
-                                  _("Can't flush file to disk"));
+                                  _("Can't flush file '%s' to disk"),
+                                  try_utf8_from_internal_style(fname, pool));
 
 #endif
   }
@@ -4060,36 +4070,11 @@ svn_io_file_move(const char *from_path,
 
   if (err && APR_STATUS_IS_EXDEV(err->apr_err))
     {
-      const char *tmp_to_path;
-
       svn_error_clear(err);
 
-      SVN_ERR(svn_io_open_unique_file3(NULL, &tmp_to_path,
-                                       svn_dirent_dirname(to_path, pool),
-                                       svn_io_file_del_none,
-                                       pool, pool));
-
-      err = svn_error_trace(svn_io_copy_file(from_path, tmp_to_path, TRUE,
+      /* svn_io_copy_file() performs atomic copy via temporary file. */
+      err = svn_error_trace(svn_io_copy_file(from_path, to_path, TRUE,
                                              pool));
-      if (err)
-        goto failed_tmp;
-
-      err = svn_error_trace(svn_io_file_rename(tmp_to_path, to_path, pool));
-      if (err)
-        goto failed_tmp;
-
-      err = svn_error_trace(svn_io_remove_file2(from_path, FALSE, pool));
-      if (! err)
-        return SVN_NO_ERROR;
-
-      return svn_error_compose_create(
-                  err,
-                  svn_error_trace(svn_io_remove_file2(to_path, FALSE, pool)));
-
-    failed_tmp:
-      err = svn_error_compose_create(
-              err,
-              svn_error_trace(svn_io_remove_file2(tmp_to_path, FALSE, pool)));
     }
 
   return err;

Modified: subversion/branches/fsx-1.10/subversion/mod_dav_svn/activity.c
URL: 
http://svn.apache.org/viewvc/subversion/branches/fsx-1.10/subversion/mod_dav_svn/activity.c?rev=1687422&r1=1687421&r2=1687422&view=diff
==============================================================================
--- subversion/branches/fsx-1.10/subversion/mod_dav_svn/activity.c (original)
+++ subversion/branches/fsx-1.10/subversion/mod_dav_svn/activity.c Thu Jun 25 
08:00:57 2015
@@ -165,7 +165,7 @@ dav_svn__delete_activity(const dav_svn_r
   txn_name = read_txn(pathname, repos->pool);
   if (txn_name == NULL)
     {
-      return dav_svn__new_error(repos->pool, HTTP_NOT_FOUND, 0,
+      return dav_svn__new_error(repos->pool, HTTP_NOT_FOUND, 0, 0,
                                 "could not find activity.");
     }
 

Modified: subversion/branches/fsx-1.10/subversion/mod_dav_svn/dav_svn.h
URL: 
http://svn.apache.org/viewvc/subversion/branches/fsx-1.10/subversion/mod_dav_svn/dav_svn.h?rev=1687422&r1=1687421&r2=1687422&view=diff
==============================================================================
--- subversion/branches/fsx-1.10/subversion/mod_dav_svn/dav_svn.h (original)
+++ subversion/branches/fsx-1.10/subversion/mod_dav_svn/dav_svn.h Thu Jun 25 
08:00:57 2015
@@ -796,28 +796,35 @@ dav_svn__authz_read_func(dav_svn__authz_
 
    If ERROR_ID is 0, SVN_ERR_RA_DAV_REQUEST_FAILED will be used as a
    default value for the error code.
+
+   mod_dav is definitive documentation of the parameters, but a
+   guideline to the different error is:
+
+   STATUS is the HTTP status returned to the client.
+
+   ERROR_ID is an additional DAV-specific error such as a violation of
+   the DAV rules.  mod_dav.h defines some values but callers can pass
+   others.
+
+   APRERR is any underlying OS/system error.
 */
 dav_error *
 dav_svn__new_error_svn(apr_pool_t *pool,
                        int status,
                        int error_id,
+                       apr_status_t aprerr,
                        const char *desc);
 
 
 /* A wrapper around mod_dav's dav_new_error, mod_dav_svn uses this
    instead of the mod_dav function to enable special mod_dav_svn specific
-   processing.  See dav_new_error for parameter documentation.
-   Note that DESC may be null (it's hard to track this down from
-   dav_new_error()'s documentation, but see the dav_error type,
-   which says that its desc field may be NULL).
-
-   If ERROR_ID is 0, SVN_ERR_RA_DAV_REQUEST_FAILED will be used as a
-   default value for the error code.
+   processing.  See dav_svn__new_error_svn for additional details.
 */
 dav_error *
 dav_svn__new_error(apr_pool_t *pool,
                    int status,
                    int error_id,
+                   apr_status_t aprerr,
                    const char *desc);
 
 

Modified: subversion/branches/fsx-1.10/subversion/mod_dav_svn/deadprops.c
URL: 
http://svn.apache.org/viewvc/subversion/branches/fsx-1.10/subversion/mod_dav_svn/deadprops.c?rev=1687422&r1=1687421&r2=1687422&view=diff
==============================================================================
--- subversion/branches/fsx-1.10/subversion/mod_dav_svn/deadprops.c (original)
+++ subversion/branches/fsx-1.10/subversion/mod_dav_svn/deadprops.c Thu Jun 25 
08:00:57 2015
@@ -199,7 +199,7 @@ save_value(dav_db *db, const dav_prop_na
         /* ignore the unknown namespace of the incoming prop. */
         propname = name->name;
       else
-        return dav_svn__new_error(db->p, HTTP_CONFLICT, 0,
+        return dav_svn__new_error(db->p, HTTP_CONFLICT, 0, 0,
                                   "Properties may only be defined in the "
                                   SVN_DAV_PROP_NS_SVN " and "
                                   SVN_DAV_PROP_NS_CUSTOM " namespaces.");
@@ -328,7 +328,7 @@ db_open(apr_pool_t *p,
          changing unversioned rev props.  Remove this someday: see IZ #916. */
       if (! (resource->baselined
              && resource->type == DAV_RESOURCE_TYPE_VERSION))
-        return dav_svn__new_error(p, HTTP_CONFLICT, 0,
+        return dav_svn__new_error(p, HTTP_CONFLICT, 0, 0,
                                   "Properties may only be changed on working "
                                   "resources.");
     }
@@ -479,7 +479,7 @@ decode_property_value(const svn_string_t
             *out_propval_p = svn_base64_decode_string(maybe_encoded_propval,
                                                       pool);
           else
-            return dav_svn__new_error(pool, HTTP_INTERNAL_SERVER_ERROR, 0,
+            return dav_svn__new_error(pool, HTTP_INTERNAL_SERVER_ERROR, 0, 0,
                                       "Unknown property encoding");
           break;
         }
@@ -526,7 +526,7 @@ db_store(dav_db *db,
 
   if (absent && ! elem->first_child)
     /* ### better error check */
-    return dav_svn__new_error(pool, HTTP_INTERNAL_SERVER_ERROR, 0,
+    return dav_svn__new_error(pool, HTTP_INTERNAL_SERVER_ERROR, 0, 0,
                               apr_psprintf(pool,
                                            "'%s' cannot be specified on the "
                                            "value without specifying an "

Modified: subversion/branches/fsx-1.10/subversion/mod_dav_svn/lock.c
URL: 
http://svn.apache.org/viewvc/subversion/branches/fsx-1.10/subversion/mod_dav_svn/lock.c?rev=1687422&r1=1687421&r2=1687422&view=diff
==============================================================================
--- subversion/branches/fsx-1.10/subversion/mod_dav_svn/lock.c (original)
+++ subversion/branches/fsx-1.10/subversion/mod_dav_svn/lock.c Thu Jun 25 
08:00:57 2015
@@ -147,7 +147,7 @@ unescape_xml(const char **output,
       errbuf[0] = '\0';
       (void)apr_xml_parser_geterror(xml_parser, errbuf, sizeof(errbuf));
       return dav_svn__new_error(pool, HTTP_INTERNAL_SERVER_ERROR,
-                                DAV_ERR_LOCK_SAVE_LOCK, errbuf);
+                                DAV_ERR_LOCK_SAVE_LOCK, apr_err, errbuf);
     }
 
   apr_xml_to_text(pool, xml_doc->root, APR_XML_X2T_INNER,
@@ -170,12 +170,12 @@ dav_lock_to_svn_lock(svn_lock_t **slock,
   /* Sanity checks */
   if (dlock->type != DAV_LOCKTYPE_WRITE)
     return dav_svn__new_error(pool, HTTP_BAD_REQUEST,
-                              DAV_ERR_LOCK_SAVE_LOCK,
+                              DAV_ERR_LOCK_SAVE_LOCK, 0,
                               "Only 'write' locks are supported.");
 
   if (dlock->scope != DAV_LOCKSCOPE_EXCLUSIVE)
     return dav_svn__new_error(pool, HTTP_BAD_REQUEST,
-                              DAV_ERR_LOCK_SAVE_LOCK,
+                              DAV_ERR_LOCK_SAVE_LOCK, 0,
                               "Only exclusive locks are supported.");
 
   lock = svn_lock_create(pool);
@@ -470,7 +470,7 @@ get_locks(dav_lockdb *lockdb,
   if (! dav_svn__allow_read_resource(resource, SVN_INVALID_REVNUM,
                                      resource->pool))
     return dav_svn__new_error(resource->pool, HTTP_FORBIDDEN,
-                              DAV_ERR_LOCK_SAVE_LOCK,
+                              DAV_ERR_LOCK_SAVE_LOCK, 0,
                               "Path is not accessible.");
 
   serr = svn_fs_get_lock(&slock,
@@ -531,7 +531,7 @@ find_lock(dav_lockdb *lockdb,
   if (! dav_svn__allow_read_resource(resource, SVN_INVALID_REVNUM,
                                      resource->pool))
     return dav_svn__new_error(resource->pool, HTTP_FORBIDDEN,
-                              DAV_ERR_LOCK_SAVE_LOCK,
+                              DAV_ERR_LOCK_SAVE_LOCK, 0,
                               "Path is not accessible.");
 
   serr = svn_fs_get_lock(&slock,
@@ -548,7 +548,7 @@ find_lock(dav_lockdb *lockdb,
       /* Sanity check. */
       if (strcmp(locktoken->uuid_str, slock->token) != 0)
         return dav_svn__new_error(resource->pool, HTTP_BAD_REQUEST,
-                                  DAV_ERR_LOCK_SAVE_LOCK,
+                                  DAV_ERR_LOCK_SAVE_LOCK, 0,
                                   "Incoming token doesn't match existing "
                                   "lock.");
 
@@ -612,7 +612,7 @@ has_locks(dav_lockdb *lockdb, const dav_
   if (! dav_svn__allow_read_resource(resource, SVN_INVALID_REVNUM,
                                      resource->pool))
     return dav_svn__new_error(resource->pool, HTTP_FORBIDDEN,
-                              DAV_ERR_LOCK_SAVE_LOCK,
+                              DAV_ERR_LOCK_SAVE_LOCK, 0,
                               "Path is not accessible.");
 
   serr = svn_fs_get_lock(&slock,
@@ -655,13 +655,13 @@ append_locks(dav_lockdb *lockdb,
   /* We don't allow anonymous locks */
   if (! repos->username)
     return dav_svn__new_error(resource->pool, HTTP_NOT_IMPLEMENTED,
-                              DAV_ERR_LOCK_SAVE_LOCK,
+                              DAV_ERR_LOCK_SAVE_LOCK, 0,
                               "Anonymous lock creation is not allowed.");
 
   /* Not a path in the repository so can't lock it. */
   if (! resource->info->repos_path)
     return dav_svn__new_error(resource->pool, HTTP_BAD_REQUEST,
-                              DAV_ERR_LOCK_SAVE_LOCK,
+                              DAV_ERR_LOCK_SAVE_LOCK, 0,
                               "Attempted to lock path not in repository.");
 
   /* If the resource's fs path is unreadable, we don't allow a lock to
@@ -669,12 +669,12 @@ append_locks(dav_lockdb *lockdb,
   if (! dav_svn__allow_read_resource(resource, SVN_INVALID_REVNUM,
                                      resource->pool))
     return dav_svn__new_error(resource->pool, HTTP_FORBIDDEN,
-                              DAV_ERR_LOCK_SAVE_LOCK,
+                              DAV_ERR_LOCK_SAVE_LOCK, 0,
                               "Path is not accessible.");
 
   if (lock->next)
     return dav_svn__new_error(resource->pool, HTTP_BAD_REQUEST,
-                              DAV_ERR_LOCK_SAVE_LOCK,
+                              DAV_ERR_LOCK_SAVE_LOCK, 0,
                               "Tried to attach multiple locks to a resource.");
 
   /* RFC2518bis (section 7.4) doesn't require us to support
@@ -693,13 +693,13 @@ append_locks(dav_lockdb *lockdb,
 
       if (resource->info->repos->is_svn_client)
         return dav_svn__new_error(resource->pool, HTTP_METHOD_NOT_ALLOWED,
-                                  DAV_ERR_LOCK_SAVE_LOCK,
+                                  DAV_ERR_LOCK_SAVE_LOCK, 0,
                                   "Subversion clients may not lock "
                                   "nonexistent paths.");
 
       else if (! resource->info->repos->autoversioning)
         return dav_svn__new_error(resource->pool, HTTP_METHOD_NOT_ALLOWED,
-                                  DAV_ERR_LOCK_SAVE_LOCK,
+                                  DAV_ERR_LOCK_SAVE_LOCK, 0,
                                   "Attempted to lock non-existent path; "
                                   "turn on autoversioning first.");
 
@@ -755,7 +755,7 @@ append_locks(dav_lockdb *lockdb,
           else
             return dav_svn__new_error(resource->pool,
                                       HTTP_INTERNAL_SERVER_ERROR,
-                                      0,
+                                      0, 0,
                                       "Commit failed but there was no error "
                                       "provided.");
         }
@@ -784,7 +784,7 @@ append_locks(dav_lockdb *lockdb,
     {
       svn_error_clear(serr);
       return dav_svn__new_error(resource->pool, HTTP_NOT_IMPLEMENTED,
-                                DAV_ERR_LOCK_SAVE_LOCK,
+                                DAV_ERR_LOCK_SAVE_LOCK, 0,
                                 "Anonymous lock creation is not allowed.");
     }
   else if (serr && serr->apr_err == SVN_ERR_REPOS_POST_LOCK_HOOK_FAILED)
@@ -881,7 +881,7 @@ remove_lock(dav_lockdb *lockdb,
   if (! dav_svn__allow_read_resource(resource, SVN_INVALID_REVNUM,
                                      resource->pool))
     return dav_svn__new_error(resource->pool, HTTP_FORBIDDEN,
-                              DAV_ERR_LOCK_SAVE_LOCK,
+                              DAV_ERR_LOCK_SAVE_LOCK, 0,
                               "Path is not accessible.");
 
   if (locktoken == NULL)
@@ -918,7 +918,7 @@ remove_lock(dav_lockdb *lockdb,
         {
           svn_error_clear(serr);
           return dav_svn__new_error(resource->pool, HTTP_NOT_IMPLEMENTED,
-                                    DAV_ERR_LOCK_SAVE_LOCK,
+                                    DAV_ERR_LOCK_SAVE_LOCK, 0,
                                     "Anonymous lock removal is not allowed.");
         }
       else if (serr && serr->apr_err == SVN_ERR_REPOS_POST_UNLOCK_HOOK_FAILED
@@ -1014,7 +1014,7 @@ refresh_locks(dav_lockdb *lockdb,
   if (! dav_svn__allow_read_resource(resource, SVN_INVALID_REVNUM,
                                      resource->pool))
     return dav_svn__new_error(resource->pool, HTTP_FORBIDDEN,
-                              DAV_ERR_LOCK_SAVE_LOCK,
+                              DAV_ERR_LOCK_SAVE_LOCK, 0,
                               "Path is not accessible.");
 
   /* Convert the path into an svn_lock_t. */
@@ -1032,7 +1032,7 @@ refresh_locks(dav_lockdb *lockdb,
   if ((! slock)
       || (strcmp(token->uuid_str, slock->token) != 0))
     return dav_svn__new_error(resource->pool, HTTP_PRECONDITION_FAILED,
-                              DAV_ERR_LOCK_SAVE_LOCK,
+                              DAV_ERR_LOCK_SAVE_LOCK, 0,
                               "Lock refresh request doesn't match existing "
                               "lock.");
 
@@ -1053,7 +1053,7 @@ refresh_locks(dav_lockdb *lockdb,
     {
       svn_error_clear(serr);
       return dav_svn__new_error(resource->pool, HTTP_NOT_IMPLEMENTED,
-                                DAV_ERR_LOCK_SAVE_LOCK,
+                                DAV_ERR_LOCK_SAVE_LOCK, 0,
                                 "Anonymous lock refreshing is not allowed.");
     }
   else if (serr && (svn_error_find_cause(serr, SVN_ERR_REPOS_HOOK_FAILURE) ||

Modified: subversion/branches/fsx-1.10/subversion/mod_dav_svn/merge.c
URL: 
http://svn.apache.org/viewvc/subversion/branches/fsx-1.10/subversion/mod_dav_svn/merge.c?rev=1687422&r1=1687421&r2=1687422&view=diff
==============================================================================
--- subversion/branches/fsx-1.10/subversion/mod_dav_svn/merge.c (original)
+++ subversion/branches/fsx-1.10/subversion/mod_dav_svn/merge.c Thu Jun 25 
08:00:57 2015
@@ -307,7 +307,8 @@ dav_svn__merge_response(ap_filter_t *out
                      "<D:version-name>", rev, "</D:version-name>" DEBUG_CR,
                      NULL);
   if (status != APR_SUCCESS)
-    return dav_svn__new_error(repos->pool, HTTP_INTERNAL_SERVER_ERROR, 0,
+    return dav_svn__new_error(repos->pool, HTTP_INTERNAL_SERVER_ERROR,
+                              0, status,
                               "Could not write output");
 
   if (creationdate)
@@ -318,7 +319,8 @@ dav_svn__merge_response(ap_filter_t *out
                          "</D:creationdate>" DEBUG_CR,
                          NULL);
       if (status != APR_SUCCESS)
-        return dav_svn__new_error(repos->pool, HTTP_INTERNAL_SERVER_ERROR, 0,
+        return dav_svn__new_error(repos->pool, HTTP_INTERNAL_SERVER_ERROR,
+                                  0, status,
                                   "Could not write output");
     }
   if (creator_displayname)
@@ -330,7 +332,8 @@ dav_svn__merge_response(ap_filter_t *out
                          "</D:creator-displayname>" DEBUG_CR,
                          NULL);
       if (status != APR_SUCCESS)
-        return dav_svn__new_error(repos->pool, HTTP_INTERNAL_SERVER_ERROR, 0,
+        return dav_svn__new_error(repos->pool, HTTP_INTERNAL_SERVER_ERROR,
+                                  0, status,
                                   "Could not write output");
     }
   status = ap_fputstrs(output, bb,
@@ -341,7 +344,8 @@ dav_svn__merge_response(ap_filter_t *out
 
                      NULL);
   if (status != APR_SUCCESS)
-    return dav_svn__new_error(repos->pool, HTTP_INTERNAL_SERVER_ERROR, 0,
+    return dav_svn__new_error(repos->pool, HTTP_INTERNAL_SERVER_ERROR,
+                              0, status,
                               "Could not write output");
 
   /* ONLY have dir_delta drive the editor if the caller asked us to
@@ -375,13 +379,15 @@ dav_svn__merge_response(ap_filter_t *out
                   "</D:updated-set>" DEBUG_CR
                   "</D:merge-response>" DEBUG_CR);
   if (status != APR_SUCCESS)
-    return dav_svn__new_error(repos->pool, HTTP_INTERNAL_SERVER_ERROR, 0,
+    return dav_svn__new_error(repos->pool, HTTP_INTERNAL_SERVER_ERROR,
+                              0, status,
                               "Could not write output");
 
   /* send whatever is left in the brigade */
   status = ap_pass_brigade(output, bb);
   if (status != APR_SUCCESS)
-    return dav_svn__new_error(repos->pool, HTTP_INTERNAL_SERVER_ERROR, 0,
+    return dav_svn__new_error(repos->pool, HTTP_INTERNAL_SERVER_ERROR,
+                              0, status,
                               "Could not write output");
 
   return NULL;

Modified: 
subversion/branches/fsx-1.10/subversion/mod_dav_svn/reports/dated-rev.c
URL: 
http://svn.apache.org/viewvc/subversion/branches/fsx-1.10/subversion/mod_dav_svn/reports/dated-rev.c?rev=1687422&r1=1687421&r2=1687422&view=diff
==============================================================================
--- subversion/branches/fsx-1.10/subversion/mod_dav_svn/reports/dated-rev.c 
(original)
+++ subversion/branches/fsx-1.10/subversion/mod_dav_svn/reports/dated-rev.c Thu 
Jun 25 08:00:57 2015
@@ -80,7 +80,7 @@ dav_svn__dated_rev_report(const dav_reso
 
   if (tm == (apr_time_t) -1)
     {
-      return dav_svn__new_error(resource->pool, HTTP_BAD_REQUEST, 0,
+      return dav_svn__new_error(resource->pool, HTTP_BAD_REQUEST, 0, 0,
                                 "The request does not contain a valid "
                                 "'DAV:" SVN_DAV__CREATIONDATE "' element.");
     }
@@ -90,7 +90,8 @@ dav_svn__dated_rev_report(const dav_reso
                                       resource->pool)) != SVN_NO_ERROR)
     {
       svn_error_clear(err);
-      return dav_svn__new_error(resource->pool, HTTP_INTERNAL_SERVER_ERROR, 0,
+      return dav_svn__new_error(resource->pool, HTTP_INTERNAL_SERVER_ERROR,
+                                0, 0,
                                 "Could not access revision times.");
     }
 

Modified: 
subversion/branches/fsx-1.10/subversion/mod_dav_svn/reports/deleted-rev.c
URL: 
http://svn.apache.org/viewvc/subversion/branches/fsx-1.10/subversion/mod_dav_svn/reports/deleted-rev.c?rev=1687422&r1=1687421&r2=1687422&view=diff
==============================================================================
--- subversion/branches/fsx-1.10/subversion/mod_dav_svn/reports/deleted-rev.c 
(original)
+++ subversion/branches/fsx-1.10/subversion/mod_dav_svn/reports/deleted-rev.c 
Thu Jun 25 08:00:57 2015
@@ -57,11 +57,11 @@ dav_svn__get_deleted_rev_report(const da
 
   /* Sanity check. */
   if (!resource->info->repos_path)
-    return dav_svn__new_error(resource->pool, HTTP_BAD_REQUEST, 0,
+    return dav_svn__new_error(resource->pool, HTTP_BAD_REQUEST, 0, 0,
                               "The request does not specify a repository 
path");
   ns = dav_svn__find_ns(doc->namespaces, SVN_XML_NAMESPACE);
   if (ns == -1)
-    return dav_svn__new_error_svn(resource->pool, HTTP_BAD_REQUEST, 0,
+    return dav_svn__new_error_svn(resource->pool, HTTP_BAD_REQUEST, 0, 0,
                                   "The request does not contain the 'svn:' "
                                   "namespace, so it is not going to have "
                                   "certain required elements");
@@ -102,7 +102,7 @@ dav_svn__get_deleted_rev_report(const da
          && SVN_IS_VALID_REVNUM(peg_rev)
          && SVN_IS_VALID_REVNUM(end_rev)))
     {
-      return dav_svn__new_error_svn(resource->pool, HTTP_BAD_REQUEST, 0,
+      return dav_svn__new_error_svn(resource->pool, HTTP_BAD_REQUEST, 0, 0,
                                     "Not all parameters passed");
     }
 
@@ -113,7 +113,8 @@ dav_svn__get_deleted_rev_report(const da
   if (err)
     {
       svn_error_clear(err);
-      return dav_svn__new_error(resource->pool, HTTP_INTERNAL_SERVER_ERROR, 0,
+      return dav_svn__new_error(resource->pool, HTTP_INTERNAL_SERVER_ERROR,
+                                0, 0,
                                 "Could not find revision path was deleted.");
     }
 

Modified: 
subversion/branches/fsx-1.10/subversion/mod_dav_svn/reports/file-revs.c
URL: 
http://svn.apache.org/viewvc/subversion/branches/fsx-1.10/subversion/mod_dav_svn/reports/file-revs.c?rev=1687422&r1=1687421&r2=1687422&view=diff
==============================================================================
--- subversion/branches/fsx-1.10/subversion/mod_dav_svn/reports/file-revs.c 
(original)
+++ subversion/branches/fsx-1.10/subversion/mod_dav_svn/reports/file-revs.c Thu 
Jun 25 08:00:57 2015
@@ -255,14 +255,14 @@ dav_svn__file_revs_report(const dav_reso
 
   /* Sanity check. */
   if (!resource->info->repos_path)
-    return dav_svn__new_error(resource->pool, HTTP_BAD_REQUEST, 0,
+    return dav_svn__new_error(resource->pool, HTTP_BAD_REQUEST, 0, 0,
                               "The request does not specify a repository 
path");
   ns = dav_svn__find_ns(doc->namespaces, SVN_XML_NAMESPACE);
   /* ### This is done on other places, but the document element is
      in this namespace, so is this necessary at all? */
   if (ns == -1)
     {
-      return dav_svn__new_error_svn(resource->pool, HTTP_BAD_REQUEST, 0,
+      return dav_svn__new_error_svn(resource->pool, HTTP_BAD_REQUEST, 0, 0,
                                     "The request does not contain the 'svn:' "
                                     "namespace, so it is not going to have "
                                     "certain required elements");
@@ -300,7 +300,7 @@ dav_svn__file_revs_report(const dav_reso
 
   /* Check that all parameters are present and valid. */
   if (! abs_path)
-    return dav_svn__new_error_svn(resource->pool, HTTP_BAD_REQUEST, 0,
+    return dav_svn__new_error_svn(resource->pool, HTTP_BAD_REQUEST, 0, 0,
                                   "Not all parameters passed");
 
   frb.bb = apr_brigade_create(resource->pool,

Modified: 
subversion/branches/fsx-1.10/subversion/mod_dav_svn/reports/get-location-segments.c
URL: 
http://svn.apache.org/viewvc/subversion/branches/fsx-1.10/subversion/mod_dav_svn/reports/get-location-segments.c?rev=1687422&r1=1687421&r2=1687422&view=diff
==============================================================================
--- 
subversion/branches/fsx-1.10/subversion/mod_dav_svn/reports/get-location-segments.c
 (original)
+++ 
subversion/branches/fsx-1.10/subversion/mod_dav_svn/reports/get-location-segments.c
 Thu Jun 25 08:00:57 2015
@@ -124,12 +124,12 @@ dav_svn__get_location_segments_report(co
 
   /* Sanity check. */
   if (!resource->info->repos_path)
-    return dav_svn__new_error(resource->pool, HTTP_BAD_REQUEST, 0,
+    return dav_svn__new_error(resource->pool, HTTP_BAD_REQUEST, 0, 0,
                               "The request does not specify a repository 
path");
   ns = dav_svn__find_ns(doc->namespaces, SVN_XML_NAMESPACE);
   if (ns == -1)
     {
-      return dav_svn__new_error_svn(resource->pool, HTTP_BAD_REQUEST, 0,
+      return dav_svn__new_error_svn(resource->pool, HTTP_BAD_REQUEST, 0, 0,
                                     "The request does not contain the 'svn:' "
                                     "namespace, so it is not going to have "
                                     "certain required elements");
@@ -175,7 +175,7 @@ dav_svn__get_location_segments_report(co
 
   /* Check that all parameters are present and valid. */
   if (! abs_path)
-    return dav_svn__new_error_svn(resource->pool, HTTP_BAD_REQUEST, 0,
+    return dav_svn__new_error_svn(resource->pool, HTTP_BAD_REQUEST, 0, 0,
                                   "Not all parameters passed");
 
   /* No START_REV or PEG_REVISION?  We'll use HEAD. */
@@ -202,12 +202,12 @@ dav_svn__get_location_segments_report(co
 
   if (end_rev > start_rev)
     return dav_svn__new_error_svn(resource->pool, HTTP_BAD_REQUEST,
-                                  SVN_ERR_FS_NO_SUCH_REVISION,
+                                  SVN_ERR_FS_NO_SUCH_REVISION, 0,
                                   "End revision must not be younger than "
                                   "start revision");
   if (start_rev > peg_revision)
     return dav_svn__new_error_svn(resource->pool, HTTP_BAD_REQUEST,
-                                  SVN_ERR_FS_NO_SUCH_REVISION,
+                                  SVN_ERR_FS_NO_SUCH_REVISION, 0,
                                   "Start revision must not be younger than "
                                   "peg revision");
 

Modified: 
subversion/branches/fsx-1.10/subversion/mod_dav_svn/reports/get-locations.c
URL: 
http://svn.apache.org/viewvc/subversion/branches/fsx-1.10/subversion/mod_dav_svn/reports/get-locations.c?rev=1687422&r1=1687421&r2=1687422&view=diff
==============================================================================
--- subversion/branches/fsx-1.10/subversion/mod_dav_svn/reports/get-locations.c 
(original)
+++ subversion/branches/fsx-1.10/subversion/mod_dav_svn/reports/get-locations.c 
Thu Jun 25 08:00:57 2015
@@ -107,12 +107,12 @@ dav_svn__get_locations_report(const dav_
 
   /* Sanity check. */
   if (!resource->info->repos_path)
-    return dav_svn__new_error(resource->pool, HTTP_BAD_REQUEST, 0,
+    return dav_svn__new_error(resource->pool, HTTP_BAD_REQUEST, 0, 0,
                               "The request does not specify a repository 
path");
   ns = dav_svn__find_ns(doc->namespaces, SVN_XML_NAMESPACE);
   if (ns == -1)
     {
-      return dav_svn__new_error_svn(resource->pool, HTTP_BAD_REQUEST, 0,
+      return dav_svn__new_error_svn(resource->pool, HTTP_BAD_REQUEST, 0, 0,
                                     "The request does not contain the 'svn:' "
                                     "namespace, so it is not going to have "
                                     "certain required elements");
@@ -152,7 +152,7 @@ dav_svn__get_locations_report(const dav_
 
   /* Check that all parameters are present and valid. */
   if (! (abs_path && SVN_IS_VALID_REVNUM(peg_revision)))
-    return dav_svn__new_error_svn(resource->pool, HTTP_BAD_REQUEST, 0,
+    return dav_svn__new_error_svn(resource->pool, HTTP_BAD_REQUEST, 0, 0,
                                   "Not all parameters passed");
 
   /* Build an authz read baton */

Modified: 
subversion/branches/fsx-1.10/subversion/mod_dav_svn/reports/get-locks.c
URL: 
http://svn.apache.org/viewvc/subversion/branches/fsx-1.10/subversion/mod_dav_svn/reports/get-locks.c?rev=1687422&r1=1687421&r2=1687422&view=diff
==============================================================================
--- subversion/branches/fsx-1.10/subversion/mod_dav_svn/reports/get-locks.c 
(original)
+++ subversion/branches/fsx-1.10/subversion/mod_dav_svn/reports/get-locks.c Thu 
Jun 25 08:00:57 2015
@@ -190,7 +190,7 @@ dav_svn__get_locks_report(const dav_reso
   /* The request URI should be a public one representing an fs path. */
   if ((! resource->info->repos_path)
       || (! resource->info->repos->repos))
-    return dav_svn__new_error(resource->pool, HTTP_BAD_REQUEST, 0,
+    return dav_svn__new_error(resource->pool, HTTP_BAD_REQUEST, 0, 0,
                               "get-locks-report run on resource which doesn't "
                               "represent a path within a repository.");
 
@@ -207,7 +207,7 @@ dav_svn__get_locks_report(const dav_reso
               (depth != svn_depth_files) &&
               (depth != svn_depth_immediates) &&
               (depth != svn_depth_infinity))
-            return dav_svn__new_error(resource->pool, HTTP_BAD_REQUEST, 0,
+            return dav_svn__new_error(resource->pool, HTTP_BAD_REQUEST, 0, 0,
                                       "Invalid 'depth' specified in "
                                       "get-locks-report request.");
           continue;

Modified: 
subversion/branches/fsx-1.10/subversion/mod_dav_svn/reports/inherited-props.c
URL: 
http://svn.apache.org/viewvc/subversion/branches/fsx-1.10/subversion/mod_dav_svn/reports/inherited-props.c?rev=1687422&r1=1687421&r2=1687422&view=diff
==============================================================================
--- 
subversion/branches/fsx-1.10/subversion/mod_dav_svn/reports/inherited-props.c 
(original)
+++ 
subversion/branches/fsx-1.10/subversion/mod_dav_svn/reports/inherited-props.c 
Thu Jun 25 08:00:57 2015
@@ -65,12 +65,12 @@ dav_svn__get_inherited_props_report(cons
 
   /* Sanity check. */
   if (!resource->info->repos_path)
-    return dav_svn__new_error(resource->pool, HTTP_BAD_REQUEST, 0,
+    return dav_svn__new_error(resource->pool, HTTP_BAD_REQUEST, 0, 0,
                               "The request does not specify a repository 
path");
   ns = dav_svn__find_ns(doc->namespaces, SVN_XML_NAMESPACE);
   if (ns == -1)
     {
-      return dav_svn__new_error_svn(resource->pool, HTTP_BAD_REQUEST, 0,
+      return dav_svn__new_error_svn(resource->pool, HTTP_BAD_REQUEST, 0, 0,
                                     "The request does not contain the 'svn:' "
                                     "namespace, so it is not going to have "
                                     "certain required elements");

Modified: subversion/branches/fsx-1.10/subversion/mod_dav_svn/reports/log.c
URL: 
http://svn.apache.org/viewvc/subversion/branches/fsx-1.10/subversion/mod_dav_svn/reports/log.c?rev=1687422&r1=1687421&r2=1687422&view=diff
==============================================================================
--- subversion/branches/fsx-1.10/subversion/mod_dav_svn/reports/log.c (original)
+++ subversion/branches/fsx-1.10/subversion/mod_dav_svn/reports/log.c Thu Jun 
25 08:00:57 2015
@@ -355,12 +355,12 @@ dav_svn__log_report(const dav_resource *
 
   /* Sanity check. */
   if (!resource->info->repos_path)
-    return dav_svn__new_error(resource->pool, HTTP_BAD_REQUEST, 0,
+    return dav_svn__new_error(resource->pool, HTTP_BAD_REQUEST, 0, 0,
                               "The request does not specify a repository 
path");
   ns = dav_svn__find_ns(doc->namespaces, SVN_XML_NAMESPACE);
   if (ns == -1)
     {
-      return dav_svn__new_error_svn(resource->pool, HTTP_BAD_REQUEST, 0,
+      return dav_svn__new_error_svn(resource->pool, HTTP_BAD_REQUEST, 0, 0,
                                     "The request does not contain the 'svn:' "
                                     "namespace, so it is not going to have "
                                     "certain required elements");

Modified: 
subversion/branches/fsx-1.10/subversion/mod_dav_svn/reports/mergeinfo.c
URL: 
http://svn.apache.org/viewvc/subversion/branches/fsx-1.10/subversion/mod_dav_svn/reports/mergeinfo.c?rev=1687422&r1=1687421&r2=1687422&view=diff
==============================================================================
--- subversion/branches/fsx-1.10/subversion/mod_dav_svn/reports/mergeinfo.c 
(original)
+++ subversion/branches/fsx-1.10/subversion/mod_dav_svn/reports/mergeinfo.c Thu 
Jun 25 08:00:57 2015
@@ -68,12 +68,12 @@ dav_svn__get_mergeinfo_report(const dav_
 
   /* Sanity check. */
   if (!resource->info->repos_path)
-    return dav_svn__new_error(resource->pool, HTTP_BAD_REQUEST, 0,
+    return dav_svn__new_error(resource->pool, HTTP_BAD_REQUEST, 0, 0,
                               "The request does not specify a repository 
path");
   ns = dav_svn__find_ns(doc->namespaces, SVN_XML_NAMESPACE);
   if (ns == -1)
     {
-      return dav_svn__new_error_svn(resource->pool, HTTP_BAD_REQUEST, 0,
+      return dav_svn__new_error_svn(resource->pool, HTTP_BAD_REQUEST, 0, 0,
                                     "The request does not contain the 'svn:' "
                                     "namespace, so it is not going to have "
                                     "certain required elements");

Modified: subversion/branches/fsx-1.10/subversion/mod_dav_svn/reports/replay.c
URL: 
http://svn.apache.org/viewvc/subversion/branches/fsx-1.10/subversion/mod_dav_svn/reports/replay.c?rev=1687422&r1=1687421&r2=1687422&view=diff
==============================================================================
--- subversion/branches/fsx-1.10/subversion/mod_dav_svn/reports/replay.c 
(original)
+++ subversion/branches/fsx-1.10/subversion/mod_dav_svn/reports/replay.c Thu 
Jun 25 08:00:57 2015
@@ -401,7 +401,7 @@ make_editor(const svn_delta_editor_t **e
 static dav_error *
 malformed_element_error(const char *tagname, apr_pool_t *pool)
 {
-  return dav_svn__new_error_svn(pool, HTTP_BAD_REQUEST, 0,
+  return dav_svn__new_error_svn(pool, HTTP_BAD_REQUEST, 0, 0,
                                 apr_pstrcat(pool,
                                             "The request's '", tagname,
                                             "' element is malformed; there "
@@ -455,7 +455,7 @@ dav_svn__replay_report(const dav_resourc
 
   ns = dav_svn__find_ns(doc->namespaces, SVN_XML_NAMESPACE);
   if (ns == -1)
-    return dav_svn__new_error_svn(resource->pool, HTTP_BAD_REQUEST, 0,
+    return dav_svn__new_error_svn(resource->pool, HTTP_BAD_REQUEST, 0, 0,
                                   "The request does not contain the 'svn:' "
                                   "namespace, so it is not going to have an "
                                   "svn:revision element. That element is "
@@ -519,12 +519,12 @@ dav_svn__replay_report(const dav_resourc
 
   if (! SVN_IS_VALID_REVNUM(rev))
     return dav_svn__new_error_svn
-             (resource->pool, HTTP_BAD_REQUEST, 0,
+             (resource->pool, HTTP_BAD_REQUEST, 0, 0,
               "Request was missing the revision argument");
 
   if (! SVN_IS_VALID_REVNUM(low_water_mark))
     return dav_svn__new_error_svn
-             (resource->pool, HTTP_BAD_REQUEST, 0,
+             (resource->pool, HTTP_BAD_REQUEST, 0, 0,
               "Request was missing the low-water-mark argument");
 
   if (! base_dir)

Modified: subversion/branches/fsx-1.10/subversion/mod_dav_svn/reports/update.c
URL: 
http://svn.apache.org/viewvc/subversion/branches/fsx-1.10/subversion/mod_dav_svn/reports/update.c?rev=1687422&r1=1687421&r2=1687422&view=diff
==============================================================================
--- subversion/branches/fsx-1.10/subversion/mod_dav_svn/reports/update.c 
(original)
+++ subversion/branches/fsx-1.10/subversion/mod_dav_svn/reports/update.c Thu 
Jun 25 08:00:57 2015
@@ -904,7 +904,7 @@ malformed_element_error(const char *tagn
                                    "' element is malformed; there "
                                    "is a problem with the client.",
                                    SVN_VA_NULL);
-  return dav_svn__new_error_svn(pool, HTTP_BAD_REQUEST, 0, errstr);
+  return dav_svn__new_error_svn(pool, HTTP_BAD_REQUEST, 0, 0, errstr);
 }
 
 
@@ -988,14 +988,14 @@ dav_svn__update_report(const dav_resourc
 
   if ((resource->info->restype != DAV_SVN_RESTYPE_VCC)
       && (resource->info->restype != DAV_SVN_RESTYPE_ME))
-    return dav_svn__new_error_svn(resource->pool, HTTP_CONFLICT, 0,
+    return dav_svn__new_error_svn(resource->pool, HTTP_CONFLICT, 0, 0,
                                   "This report can only be run against "
                                   "a VCC or root-stub URI");
 
   ns = dav_svn__find_ns(doc->namespaces, SVN_XML_NAMESPACE);
   if (ns == -1)
     {
-      return dav_svn__new_error_svn(resource->pool, HTTP_BAD_REQUEST, 0,
+      return dav_svn__new_error_svn(resource->pool, HTTP_BAD_REQUEST, 0, 0,
                                     "The request does not contain the 'svn:' "
                                     "namespace, so it is not going to have an "
                                     "svn:target-revision element. That element 
"
@@ -1191,7 +1191,7 @@ dav_svn__update_report(const dav_resourc
   if (! src_path)
     {
       return dav_svn__new_error_svn
-        (resource->pool, HTTP_BAD_REQUEST, 0,
+        (resource->pool, HTTP_BAD_REQUEST, 0, 0,
          "The request did not contain the '<src-path>' element.\n"
          "This may indicate that your client is too old");
     }


Reply via email to