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 2013/06/07 16:59:53 UTC

svn commit: r1490671 [1/2] - in /subversion/branches/fsfs-format7: ./ subversion/include/private/ subversion/libsvn_client/ subversion/libsvn_fs_fs/ subversion/libsvn_ra_svn/ subversion/libsvn_subr/ subversion/libsvn_wc/ subversion/tests/cmdline/ subve...

Author: stefan2
Date: Fri Jun  7 14:59:52 2013
New Revision: 1490671

URL: http://svn.apache.org/r1490671
Log:
On the fsfs-format7 branch: sync with trunk up to and inclduing r140669.

Added:
    subversion/branches/fsfs-format7/subversion/tests/cmdline/svntest/mergetrees.py
      - copied unchanged from r1490669, subversion/trunk/subversion/tests/cmdline/svntest/mergetrees.py
Modified:
    subversion/branches/fsfs-format7/   (props changed)
    subversion/branches/fsfs-format7/subversion/include/private/svn_cache.h
    subversion/branches/fsfs-format7/subversion/include/private/svn_ra_svn_private.h
    subversion/branches/fsfs-format7/subversion/include/private/svn_wc_private.h
    subversion/branches/fsfs-format7/subversion/libsvn_client/patch.c
    subversion/branches/fsfs-format7/subversion/libsvn_fs_fs/caching.c
    subversion/branches/fsfs-format7/subversion/libsvn_ra_svn/client.c
    subversion/branches/fsfs-format7/subversion/libsvn_ra_svn/marshal.c
    subversion/branches/fsfs-format7/subversion/libsvn_subr/cache-membuffer.c
    subversion/branches/fsfs-format7/subversion/libsvn_subr/cache-memcache.c
    subversion/branches/fsfs-format7/subversion/libsvn_subr/cache.c
    subversion/branches/fsfs-format7/subversion/libsvn_subr/io.c
    subversion/branches/fsfs-format7/subversion/libsvn_wc/deprecated.c
    subversion/branches/fsfs-format7/subversion/libsvn_wc/util.c
    subversion/branches/fsfs-format7/subversion/tests/cmdline/autoprop_tests.py
    subversion/branches/fsfs-format7/subversion/tests/cmdline/blame_tests.py
    subversion/branches/fsfs-format7/subversion/tests/cmdline/commit_tests.py
    subversion/branches/fsfs-format7/subversion/tests/cmdline/history_tests.py
    subversion/branches/fsfs-format7/subversion/tests/cmdline/lock_tests.py
    subversion/branches/fsfs-format7/subversion/tests/cmdline/log_tests.py
    subversion/branches/fsfs-format7/subversion/tests/cmdline/merge_authz_tests.py
    subversion/branches/fsfs-format7/subversion/tests/cmdline/merge_automatic_tests.py
    subversion/branches/fsfs-format7/subversion/tests/cmdline/merge_reintegrate_tests.py
    subversion/branches/fsfs-format7/subversion/tests/cmdline/merge_tests.py
    subversion/branches/fsfs-format7/subversion/tests/cmdline/merge_tree_conflict_tests.py
    subversion/branches/fsfs-format7/subversion/tests/cmdline/mergeinfo_tests.py
    subversion/branches/fsfs-format7/subversion/tests/cmdline/resolve_tests.py
    subversion/branches/fsfs-format7/subversion/tests/cmdline/revert_tests.py
    subversion/branches/fsfs-format7/subversion/tests/cmdline/stat_tests.py
    subversion/branches/fsfs-format7/subversion/tests/cmdline/svnadmin_tests.py
    subversion/branches/fsfs-format7/subversion/tests/cmdline/switch_tests.py
    subversion/branches/fsfs-format7/subversion/tests/cmdline/tree_conflict_tests.py
    subversion/branches/fsfs-format7/subversion/tests/cmdline/update_tests.py
    subversion/branches/fsfs-format7/tools/dev/unix-build/Makefile.svn
    subversion/branches/fsfs-format7/tools/dist/make-deps-tarball.sh   (props changed)
    subversion/branches/fsfs-format7/tools/server-side/svnpubsub/svnpubsub/server.py

Propchange: subversion/branches/fsfs-format7/
------------------------------------------------------------------------------
  Merged /subversion/trunk:r1489832-1490669

Modified: subversion/branches/fsfs-format7/subversion/include/private/svn_cache.h
URL: http://svn.apache.org/viewvc/subversion/branches/fsfs-format7/subversion/include/private/svn_cache.h?rev=1490671&r1=1490670&r2=1490671&view=diff
==============================================================================
--- subversion/branches/fsfs-format7/subversion/include/private/svn_cache.h (original)
+++ subversion/branches/fsfs-format7/subversion/include/private/svn_cache.h Fri Jun  7 14:59:52 2013
@@ -173,6 +173,12 @@ typedef struct svn_cache__info_t
    * May be 0 if that information is not available.
    */
   apr_uint64_t total_entries;
+
+  /** Number of index buckets with the given number of entries.
+   * Bucket sizes larger than the array will saturate into the
+   * highest array index.
+   */
+  apr_uint64_t histogram[32];
 } svn_cache__info_t;
 
 /**
@@ -503,10 +509,12 @@ svn_cache__get_info(svn_cache__t *cache,
 
 /**
  * Return the information given in @a info formatted as a multi-line string.
- * Allocations take place in @a result_pool.
+ * If @a access_only has been set, size and fill-level statistics will be
+ * omitted.  Allocations take place in @a result_pool.
  */
 svn_string_t *
 svn_cache__format_info(const svn_cache__info_t *info,
+                       svn_boolean_t access_only,
                        apr_pool_t *result_pool);
 
 /**
@@ -519,6 +527,13 @@ svn_cache__format_info(const svn_cache__
 struct svn_membuffer_t *
 svn_cache__get_global_membuffer_cache(void);
 
+/**
+ * Return total access and size stats over all membuffer caches as they
+ * share the underlying data buffer.  The result will be allocated in POOL.
+ */
+svn_cache__info_t *
+svn_cache__membuffer_get_global_info(apr_pool_t *pool);
+
 /** @} */
 
 

Modified: subversion/branches/fsfs-format7/subversion/include/private/svn_ra_svn_private.h
URL: http://svn.apache.org/viewvc/subversion/branches/fsfs-format7/subversion/include/private/svn_ra_svn_private.h?rev=1490671&r1=1490670&r2=1490671&view=diff
==============================================================================
--- subversion/branches/fsfs-format7/subversion/include/private/svn_ra_svn_private.h (original)
+++ subversion/branches/fsfs-format7/subversion/include/private/svn_ra_svn_private.h Fri Jun  7 14:59:52 2013
@@ -835,7 +835,7 @@ svn_ra_svn__write_cmd_finish_replay(svn_
  */
 
 /**
- * @defgroup svn_data sending data structures over ra_svn
+ * @defgroup svn_send_data sending data structures over ra_svn
  * @{
  */
 
@@ -880,6 +880,30 @@ svn_ra_svn__write_data_log_entry(svn_ra_
 /**
  * @}
  */
+
+/**
+ * @defgroup svn_read_data reading data structures from ra_svn
+ * @{
+ */
+
+/** Take the data tuple ITEMS received over ra_svn and convert it to the
+ * a changed path (as part of receiving a log entry).
+ *
+ * @see svn_log_changed_path2_t for a description of the output parameters.
+ */
+svn_error_t *
+svn_ra_svn__read_data_log_changed_entry(const apr_array_header_t *items,
+                                        svn_string_t **cpath,
+                                        const char **action,
+                                        const char **copy_path,
+                                        svn_revnum_t *copy_rev,
+                                        const char **kind_str,
+                                        apr_uint64_t *text_mods,
+                                        apr_uint64_t *prop_mods);
+/**
+ * @}
+ */
+
 #ifdef __cplusplus
 }
 #endif /* __cplusplus */

Modified: subversion/branches/fsfs-format7/subversion/include/private/svn_wc_private.h
URL: http://svn.apache.org/viewvc/subversion/branches/fsfs-format7/subversion/include/private/svn_wc_private.h?rev=1490671&r1=1490670&r2=1490671&view=diff
==============================================================================
--- subversion/branches/fsfs-format7/subversion/include/private/svn_wc_private.h (original)
+++ subversion/branches/fsfs-format7/subversion/include/private/svn_wc_private.h Fri Jun  7 14:59:52 2013
@@ -370,7 +370,11 @@ svn_wc__cd2_to_cd(const svn_wc_conflict_
 /*
  * Convert from svn_wc_status3_t to svn_wc_status2_t.
  * Allocate the result in RESULT_POOL.
+ *
+ * Deprecated because svn_wc_status2_t is deprecated and the only
+ * calls are from other deprecated functions.
  */
+SVN_DEPRECATED
 svn_error_t *
 svn_wc__status2_from_3(svn_wc_status2_t **status,
                        const svn_wc_status3_t *old_status,

Modified: subversion/branches/fsfs-format7/subversion/libsvn_client/patch.c
URL: http://svn.apache.org/viewvc/subversion/branches/fsfs-format7/subversion/libsvn_client/patch.c?rev=1490671&r1=1490670&r2=1490671&view=diff
==============================================================================
--- subversion/branches/fsfs-format7/subversion/libsvn_client/patch.c (original)
+++ subversion/branches/fsfs-format7/subversion/libsvn_client/patch.c Fri Jun  7 14:59:52 2013
@@ -2815,10 +2815,13 @@ check_ancestor_delete(const char *delete
 {
   struct can_delete_baton_t cb;
   svn_error_t *err;
+  apr_array_header_t *ignores;
   apr_pool_t *iterpool = svn_pool_create(scratch_pool);
 
   const char *dir_abspath = svn_dirent_dirname(deleted_target, scratch_pool);
 
+  SVN_ERR(svn_wc_get_default_ignores(&ignores, ctx->config, scratch_pool));
+
   while (svn_dirent_is_child(apply_root, dir_abspath, iterpool))
     {
       svn_pool_clear(iterpool);
@@ -2828,7 +2831,7 @@ check_ancestor_delete(const char *delete
       cb.targets_info = targets_info;
 
       err = svn_wc_walk_status(ctx->wc_ctx, dir_abspath, svn_depth_infinity,
-                               TRUE, FALSE, FALSE, NULL,
+                               TRUE, FALSE, FALSE, ignores,
                                can_delete_callback, &cb,
                                ctx->cancel_func, ctx->cancel_baton,
                                iterpool);

Modified: subversion/branches/fsfs-format7/subversion/libsvn_fs_fs/caching.c
URL: http://svn.apache.org/viewvc/subversion/branches/fsfs-format7/subversion/libsvn_fs_fs/caching.c?rev=1490671&r1=1490670&r2=1490671&view=diff
==============================================================================
--- subversion/branches/fsfs-format7/subversion/libsvn_fs_fs/caching.c (original)
+++ subversion/branches/fsfs-format7/subversion/libsvn_fs_fs/caching.c Fri Jun  7 14:59:52 2013
@@ -215,9 +215,10 @@ dump_cache_statistics(void *baton_void)
                                          TRUE,
                                          baton->pool);
 
-  if (! err)
+  /* skip unused caches */
+  if (! err && (info.gets > 0 || info.sets > 0))
     {
-      text_stats = svn_cache__format_info(&info, baton->pool);
+      text_stats = svn_cache__format_info(&info, TRUE, baton->pool);
       lines = svn_cstring_split(text_stats->data, "\n", FALSE, baton->pool);
 
       for (i = 0; i < lines->nelts; ++i)
@@ -238,6 +239,29 @@ dump_cache_statistics(void *baton_void)
 
   return result;
 }
+
+static apr_status_t
+dump_global_cache_statistics(void *baton_void)
+{
+  apr_pool_t *pool = baton_void;
+
+  svn_cache__info_t *info = svn_cache__membuffer_get_global_info(pool);
+  svn_string_t *text_stats = svn_cache__format_info(info, FALSE, pool);
+  apr_array_header_t *lines = svn_cstring_split(text_stats->data, "\n",
+                                                FALSE, pool);
+
+  int i;
+  for (i = 0; i < lines->nelts; ++i)
+    {
+      const char *line = APR_ARRAY_IDX(lines, i, const char *);
+#ifdef SVN_DEBUG
+      SVN_DBG(("%s\n", line));
+#endif
+    }
+
+  return APR_SUCCESS;
+}
+
 #endif /* SVN_DEBUG_CACHE_DUMP_STATS */
 
 /* This function sets / registers the required callbacks for a given
@@ -387,6 +411,18 @@ svn_fs_fs__initialize_caches(svn_fs_t *f
    * - everthing else should use default prio
    */
 
+#ifdef SVN_DEBUG_CACHE_DUMP_STATS
+
+  /* schedule printing the global access statistics upon pool cleanup,
+    * i.e. end of FSFS session.
+    */
+  if (membuffer)
+    apr_pool_cleanup_register(pool,
+                              pool,
+                              dump_global_cache_statistics,
+                              apr_pool_cleanup_null);
+#endif
+
   /* Make the cache for revision roots.  For the vast majority of
    * commands, this is only going to contain a few entries (svnadmin
    * dump/verify is an exception here), so to reduce overhead let's

Modified: subversion/branches/fsfs-format7/subversion/libsvn_ra_svn/client.c
URL: http://svn.apache.org/viewvc/subversion/branches/fsfs-format7/subversion/libsvn_ra_svn/client.c?rev=1490671&r1=1490670&r2=1490671&view=diff
==============================================================================
--- subversion/branches/fsfs-format7/subversion/libsvn_ra_svn/client.c (original)
+++ subversion/branches/fsfs-format7/subversion/libsvn_ra_svn/client.c Fri Jun  7 14:59:52 2013
@@ -1597,8 +1597,7 @@ static svn_error_t *ra_svn_log(svn_ra_se
               if (elt->kind != SVN_RA_SVN_LIST)
                 return svn_error_create(SVN_ERR_RA_SVN_MALFORMED_DATA, NULL,
                                         _("Changed-path entry not a list"));
-              SVN_ERR(svn_ra_svn__parse_tuple(elt->u.list, iterpool,
-                                              "sw(?cr)?(?c?BB)",
+              SVN_ERR(svn_ra_svn__read_data_log_changed_entry(elt->u.list,
                                               &cpath, &action, &copy_path,
                                               &copy_rev, &kind_str,
                                               &text_mods, &prop_mods));

Modified: subversion/branches/fsfs-format7/subversion/libsvn_ra_svn/marshal.c
URL: http://svn.apache.org/viewvc/subversion/branches/fsfs-format7/subversion/libsvn_ra_svn/marshal.c?rev=1490671&r1=1490670&r2=1490671&view=diff
==============================================================================
--- subversion/branches/fsfs-format7/subversion/libsvn_ra_svn/marshal.c (original)
+++ subversion/branches/fsfs-format7/subversion/libsvn_ra_svn/marshal.c Fri Jun  7 14:59:52 2013
@@ -2422,3 +2422,161 @@ svn_ra_svn__write_data_log_entry(svn_ra_
   
   return SVN_NO_ERROR;
 }
+
+/* If condition COND is not met, return a "malformed network data" error.
+ */
+#define CHECK_PROTOCOL_COND(cond)\
+  if (!(cond)) \
+    return svn_error_create(SVN_ERR_RA_SVN_MALFORMED_DATA, NULL, \
+                            _("Malformed network data"));
+
+/* In *RESULT, return the SVN-style string at index IDX in tuple ITEMS.
+ */
+static svn_error_t *
+svn_ra_svn__read_string(const apr_array_header_t *items,
+                        int idx,
+                        svn_string_t **result)
+{
+  svn_ra_svn_item_t *elt = &APR_ARRAY_IDX(items, idx, svn_ra_svn_item_t);
+  CHECK_PROTOCOL_COND(elt->kind == SVN_RA_SVN_STRING);
+  *result = elt->u.string;
+    
+  return SVN_NO_ERROR;
+}
+
+/* In *RESULT, return the C-style string at index IDX in tuple ITEMS.
+ */
+static svn_error_t *
+svn_ra_svn__read_cstring(const apr_array_header_t *items,
+                         int idx,
+                         const char **result)
+{
+  svn_ra_svn_item_t *elt = &APR_ARRAY_IDX(items, idx, svn_ra_svn_item_t);
+  CHECK_PROTOCOL_COND(elt->kind == SVN_RA_SVN_STRING);
+  *result = elt->u.string->data;
+    
+  return SVN_NO_ERROR;
+}
+
+/* In *RESULT, return the word at index IDX in tuple ITEMS.
+ */
+static svn_error_t *
+svn_ra_svn__read_word(const apr_array_header_t *items,
+                      int idx,
+                      const char **result)
+{
+  svn_ra_svn_item_t *elt = &APR_ARRAY_IDX(items, idx, svn_ra_svn_item_t);
+  CHECK_PROTOCOL_COND(elt->kind == SVN_RA_SVN_WORD);
+  *result = elt->u.word;
+   
+  return SVN_NO_ERROR;
+}
+
+/* In *RESULT, return the revision at index IDX in tuple ITEMS.
+ */
+static svn_error_t *
+svn_ra_svn__read_revision(const apr_array_header_t *items,
+                          int idx,
+                          svn_revnum_t *result)
+{
+  svn_ra_svn_item_t *elt = &APR_ARRAY_IDX(items, idx, svn_ra_svn_item_t);
+  CHECK_PROTOCOL_COND(elt->kind == SVN_RA_SVN_NUMBER);
+  *result = (svn_revnum_t)elt->u.number;
+    
+  return SVN_NO_ERROR;
+}
+
+/* In *RESULT, return the boolean at index IDX in tuple ITEMS.
+ */
+static svn_error_t *
+svn_ra_svn__read_boolean(const apr_array_header_t *items,
+                         int idx,
+                         apr_uint64_t *result)
+{
+  svn_ra_svn_item_t *elt = &APR_ARRAY_IDX(items, idx, svn_ra_svn_item_t);
+  CHECK_PROTOCOL_COND(elt->kind == SVN_RA_SVN_WORD);
+  if (elt->u.word[0] == 't' && strcmp(elt->u.word, "true") == 0)
+    *result = TRUE;
+  else if (strcmp(elt->u.word, "false") == 0)
+    *result = FALSE;
+  else
+    CHECK_PROTOCOL_COND(FALSE);
+    
+  return SVN_NO_ERROR;
+}
+
+/* In *RESULT, return the tuple at index IDX in tuple ITEMS.
+ */
+static svn_error_t *
+svn_ra_svn__read_list(const apr_array_header_t *items,
+                      int idx,
+                      const apr_array_header_t **result)
+{
+  svn_ra_svn_item_t *elt  = &APR_ARRAY_IDX(items, idx, svn_ra_svn_item_t);
+  CHECK_PROTOCOL_COND(elt->kind == SVN_RA_SVN_LIST);
+
+  *result = elt->u.list;
+  return SVN_NO_ERROR;
+}
+
+/* Verify the tuple ITEMS contains at least MIN and at most MAX elements.
+ */
+static svn_error_t *
+svn_ra_svn__read_check_array_size(const apr_array_header_t *items,
+                                  int min,
+                                  int max)
+{
+  CHECK_PROTOCOL_COND(items->nelts >= min && items->nelts <= max);
+  return SVN_NO_ERROR;
+}
+
+svn_error_t *
+svn_ra_svn__read_data_log_changed_entry(const apr_array_header_t *items,
+                                        svn_string_t **cpath,
+                                        const char **action,
+                                        const char **copy_path,
+                                        svn_revnum_t *copy_rev,
+                                        const char **kind_str,
+                                        apr_uint64_t *text_mods,
+                                        apr_uint64_t *prop_mods)
+{
+  const apr_array_header_t *sub_items;
+
+  /* initialize optional values */
+  *copy_path = NULL;
+  *copy_rev = SVN_INVALID_REVNUM;
+  *kind_str = NULL;
+  *text_mods = SVN_RA_SVN_UNSPECIFIED_NUMBER;
+  *prop_mods = SVN_RA_SVN_UNSPECIFIED_NUMBER;
+
+  /* top-level elements (mandatory) */
+  SVN_ERR(svn_ra_svn__read_check_array_size(items, 3, 4));
+  SVN_ERR(svn_ra_svn__read_string(items, 0, cpath));
+  SVN_ERR(svn_ra_svn__read_word(items, 1, action));
+
+  /* first sub-structure (mandatory) */
+  SVN_ERR(svn_ra_svn__read_list(items, 2, &sub_items));
+  if (sub_items->nelts)
+    {
+      SVN_ERR(svn_ra_svn__read_check_array_size(sub_items, 2, 2));
+      SVN_ERR(svn_ra_svn__read_cstring(sub_items, 0, copy_path));
+      SVN_ERR(svn_ra_svn__read_revision(sub_items, 1, copy_rev));
+    }
+
+  /* second sub-structure (optional) */
+  if (items->nelts == 4)
+    {
+      SVN_ERR(svn_ra_svn__read_list(items, 3, &sub_items));
+      SVN_ERR(svn_ra_svn__read_check_array_size(sub_items, 0, 3));
+
+      switch (sub_items->nelts)
+        {
+          case 3 : SVN_ERR(svn_ra_svn__read_boolean(sub_items, 2, prop_mods));
+          case 2 : SVN_ERR(svn_ra_svn__read_boolean(sub_items, 1, text_mods));
+          case 1 : SVN_ERR(svn_ra_svn__read_cstring(sub_items, 0, kind_str));
+          default: break;
+        }
+    }
+
+  return SVN_NO_ERROR;
+}

Modified: subversion/branches/fsfs-format7/subversion/libsvn_subr/cache-membuffer.c
URL: http://svn.apache.org/viewvc/subversion/branches/fsfs-format7/subversion/libsvn_subr/cache-membuffer.c?rev=1490671&r1=1490670&r2=1490671&view=diff
==============================================================================
--- subversion/branches/fsfs-format7/subversion/libsvn_subr/cache-membuffer.c (original)
+++ subversion/branches/fsfs-format7/subversion/libsvn_subr/cache-membuffer.c Fri Jun  7 14:59:52 2013
@@ -31,6 +31,7 @@
 #include "svn_private_config.h"
 #include "cache.h"
 #include "svn_string.h"
+#include "svn_sorts.h"  /* get the MIN macro */
 #include "private/svn_dep_compat.h"
 #include "private/svn_mutex.h"
 #include "private/svn_pseudo_md5.h"
@@ -892,8 +893,9 @@ get_group_index(svn_membuffer_t **cache,
    * Since key may not be well-distributed, pre-fold it to a smaller but
    * "denser" ranger.  The divisors are primes larger than the largest
    * counts. */
-  *cache = &segment0[(key[1] % 2809637ull) & (segment0->segment_count - 1)];
-  return (key[0] % 5030895599ull) % segment0->group_count;
+  *cache = &segment0[(key[1] % APR_UINT64_C(2809637))
+         & (segment0->segment_count - 1)];
+  return (key[0] % APR_UINT64_C(5030895599)) % segment0->group_count;
 }
 
 /* Reduce the hit count of ENTRY and update the accumulated hit info
@@ -2340,7 +2342,7 @@ combine_key(svn_membuffer_cache_t *cache
    * collisions.  So, we limit ourselves to xor and permutations. */
   data[1] = (data[1] << 27) | (data[1] >> 37);
   data[1] ^= data[0] & 0xffff;
-  data[0] ^= data[1] & 0xffffffffffff0000ull;
+  data[0] ^= data[1] & APR_UINT64_C(0xffffffffffff0000);
 
   /* combine with this cache's namespace */
   cache->combined_key[0] = data[0] ^ cache->prefix[0];
@@ -2552,12 +2554,16 @@ svn_membuffer_cache_is_cachable(void *ca
   return size <= cache->membuffer->max_entry_size;
 }
 
-/* Add statistics of SEGMENT to INFO.
+/* Add statistics of SEGMENT to INFO.  If INCLUDE_HISTOGRAM is TRUE,
+ * accumulate index bucket fill levels in INFO->HISTOGRAM.
  */
 static svn_error_t *
 svn_membuffer_get_segment_info(svn_membuffer_t *segment,
-                               svn_cache__info_t *info)
+                               svn_cache__info_t *info,
+                               svn_boolean_t include_histogram)
 {
+  apr_size_t i;
+
   info->data_size += segment->l1.size + segment->l2.size;
   info->used_size += segment->data_used;
   info->total_size += segment->l1.size + segment->l2.size +
@@ -2566,6 +2572,15 @@ svn_membuffer_get_segment_info(svn_membu
   info->used_entries += segment->used_entries;
   info->total_entries += segment->group_count * GROUP_SIZE;
 
+  if (include_histogram)
+    for (i = 0; i < segment->group_count; ++i)
+      {
+        apr_size_t use
+          = MIN(segment->directory[i].used,
+                sizeof(info->histogram) / sizeof(info->histogram[0]) - 1);
+        info->histogram[use]++;
+      }
+
   return SVN_NO_ERROR;
 }
 
@@ -2587,18 +2602,11 @@ svn_membuffer_cache_get_info(void *cache
 
   /* collect info from shared cache back-end */
 
-  info->data_size = 0;
-  info->used_size = 0;
-  info->total_size = 0;
-
-  info->used_entries = 0;
-  info->total_entries = 0;
-
   for (i = 0; i < cache->membuffer->segment_count; ++i)
     {
       svn_membuffer_t *segment = cache->membuffer + i;
       WITH_READ_LOCK(segment,
-                     svn_membuffer_get_segment_info(segment, info));
+                     svn_membuffer_get_segment_info(segment, info, FALSE));
     }
 
   return SVN_NO_ERROR;
@@ -2848,3 +2856,37 @@ svn_cache__create_membuffer_cache(svn_ca
   return SVN_NO_ERROR;
 }
 
+static svn_error_t *
+svn_membuffer_get_global_segment_info(svn_membuffer_t *segment,
+                                      svn_cache__info_t *info)
+{
+  info->gets += segment->total_reads;
+  info->sets += segment->total_writes;
+  info->hits += segment->total_hits;
+
+  WITH_READ_LOCK(segment,
+                  svn_membuffer_get_segment_info(segment, info, TRUE));
+
+  return SVN_NO_ERROR;
+}
+
+svn_cache__info_t *
+svn_cache__membuffer_get_global_info(apr_pool_t *pool)
+{
+  apr_uint32_t i;
+
+  svn_membuffer_t *membuffer = svn_cache__get_global_membuffer_cache();
+  svn_cache__info_t *info = apr_pcalloc(pool, sizeof(*info));
+
+  /* cache front-end specific data */
+
+  info->id = "membuffer globals";
+
+  /* collect info from shared cache back-end */
+
+  for (i = 0; i < membuffer->segment_count; ++i)
+    svn_error_clear(svn_membuffer_get_global_segment_info(membuffer + i,
+                                                          info));
+
+  return info;
+}

Modified: subversion/branches/fsfs-format7/subversion/libsvn_subr/cache-memcache.c
URL: http://svn.apache.org/viewvc/subversion/branches/fsfs-format7/subversion/libsvn_subr/cache-memcache.c?rev=1490671&r1=1490670&r2=1490671&view=diff
==============================================================================
--- subversion/branches/fsfs-format7/subversion/libsvn_subr/cache-memcache.c (original)
+++ subversion/branches/fsfs-format7/subversion/libsvn_subr/cache-memcache.c Fri Jun  7 14:59:52 2013
@@ -386,12 +386,6 @@ memcache_get_info(void *cache_void,
 
   /* we don't have any memory allocation info */
 
-  info->used_size = 0;
-  info->total_size = 0;
-  info->data_size = 0;
-  info->used_entries = 0;
-  info->total_entries = 0;
-
   return SVN_NO_ERROR;
 }
 

Modified: subversion/branches/fsfs-format7/subversion/libsvn_subr/cache.c
URL: http://svn.apache.org/viewvc/subversion/branches/fsfs-format7/subversion/libsvn_subr/cache.c?rev=1490671&r1=1490670&r2=1490671&view=diff
==============================================================================
--- subversion/branches/fsfs-format7/subversion/libsvn_subr/cache.c (original)
+++ subversion/branches/fsfs-format7/subversion/libsvn_subr/cache.c Fri Jun  7 14:59:52 2013
@@ -207,6 +207,7 @@ svn_cache__get_info(svn_cache__t *cache,
 {
   /* write general statistics */
 
+  memset(info, 0, sizeof(*info));
   info->gets = cache->reads;
   info->hits = cache->hits;
   info->sets = cache->writes;
@@ -236,6 +237,7 @@ svn_cache__get_info(svn_cache__t *cache,
 
 svn_string_t *
 svn_cache__format_info(const svn_cache__info_t *info,
+                       svn_boolean_t access_only,
                        apr_pool_t *result_pool)
 {
   enum { _1MB = 1024 * 1024 };
@@ -250,9 +252,40 @@ svn_cache__format_info(const svn_cache__
   double data_entry_rate = (100.0 * (double)info->used_entries)
                  / (double)(info->total_entries ? info->total_entries : 1);
 
-  return svn_string_createf(result_pool,
+  const char *histogram = "";
+  if (!access_only)
+    {
+      svn_stringbuf_t *text = svn_stringbuf_create_empty(result_pool);
+
+      int i;
+      int count = sizeof(info->histogram) / sizeof(info->histogram[0]);
+      for (i = 0; i < count; ++i)
+        if (info->histogram[i] > 0 || text->len > 0)
+          text = svn_stringbuf_createf(result_pool,
+                                       i == count - 1
+                                         ? "%12" APR_UINT64_T_FMT
+                                           " buckets with >%d entries\n%s"
+                                         : "%12" APR_UINT64_T_FMT
+                                           " buckets with %d entries\n%s",
+                                        info->histogram[i], i, text->data);
+
+      histogram = text->data;
+    }
+
+  return access_only
+       ? svn_string_createf(result_pool,
+                            "%s\n"
+                            "gets    : %" APR_UINT64_T_FMT
+                            ", %" APR_UINT64_T_FMT " hits (%5.2f%%)\n"
+                            "sets    : %" APR_UINT64_T_FMT
+                            " (%5.2f%% of misses)\n",
+                            info->id,
+                            info->gets,
+                            info->hits, hit_rate,
+                            info->sets, write_rate)
+       : svn_string_createf(result_pool,
 
-                            "prefix  : %s\n"
+                            "%s\n"
                             "gets    : %" APR_UINT64_T_FMT
                             ", %" APR_UINT64_T_FMT " hits (%5.2f%%)\n"
                             "sets    : %" APR_UINT64_T_FMT
@@ -262,7 +295,7 @@ svn_cache__format_info(const svn_cache__
                             " of %" APR_UINT64_T_FMT " MB data cache"
                             " / %" APR_UINT64_T_FMT " MB total cache memory\n"
                             "          %" APR_UINT64_T_FMT " entries (%5.2f%%)"
-                            " of %" APR_UINT64_T_FMT " total\n",
+                            " of %" APR_UINT64_T_FMT " total\n%s",
 
                             info->id,
 
@@ -276,5 +309,6 @@ svn_cache__format_info(const svn_cache__
                             info->total_size / _1MB,
 
                             info->used_entries, data_entry_rate,
-                            info->total_entries);
+                            info->total_entries,
+                            histogram);
 }

Modified: subversion/branches/fsfs-format7/subversion/libsvn_subr/io.c
URL: http://svn.apache.org/viewvc/subversion/branches/fsfs-format7/subversion/libsvn_subr/io.c?rev=1490671&r1=1490670&r2=1490671&view=diff
==============================================================================
--- subversion/branches/fsfs-format7/subversion/libsvn_subr/io.c (original)
+++ subversion/branches/fsfs-format7/subversion/libsvn_subr/io.c Fri Jun  7 14:59:52 2013
@@ -2833,13 +2833,13 @@ svn_io_wait_for_cmd(apr_proc_t *cmd_proc
            && APR_PROC_CHECK_CORE_DUMP(exitwhy_val))
     return svn_error_createf
       (SVN_ERR_EXTERNAL_PROGRAM, NULL,
-       _("Process '%s' failed (exitwhy %d, signal %d, core dumped)"),
-       cmd, exitwhy_val, exitcode_val);
+       _("Process '%s' failed (signal %d, core dumped)"),
+       cmd, exitcode_val);
   else if (APR_PROC_CHECK_SIGNALED(exitwhy_val))
     return svn_error_createf
       (SVN_ERR_EXTERNAL_PROGRAM, NULL,
-       _("Process '%s' failed (exitwhy %d, signal %d)"),
-       cmd, exitwhy_val, exitcode_val);
+       _("Process '%s' failed (signal %d)"),
+       cmd, exitcode_val);
   else if (! APR_PROC_CHECK_EXIT(exitwhy_val))
     /* Don't really know what happened here. */
     return svn_error_createf

Modified: subversion/branches/fsfs-format7/subversion/libsvn_wc/deprecated.c
URL: http://svn.apache.org/viewvc/subversion/branches/fsfs-format7/subversion/libsvn_wc/deprecated.c?rev=1490671&r1=1490670&r2=1490671&view=diff
==============================================================================
--- subversion/branches/fsfs-format7/subversion/libsvn_wc/deprecated.c (original)
+++ subversion/branches/fsfs-format7/subversion/libsvn_wc/deprecated.c Fri Jun  7 14:59:52 2013
@@ -2633,6 +2633,146 @@ svn_wc_props_modified_p(svn_boolean_t *m
 }
 
 
+svn_error_t *
+svn_wc__status2_from_3(svn_wc_status2_t **status,
+                       const svn_wc_status3_t *old_status,
+                       svn_wc_context_t *wc_ctx,
+                       const char *local_abspath,
+                       apr_pool_t *result_pool,
+                       apr_pool_t *scratch_pool)
+{
+  const svn_wc_entry_t *entry = NULL;
+
+  if (old_status == NULL)
+    {
+      *status = NULL;
+      return SVN_NO_ERROR;
+    }
+
+  *status = apr_pcalloc(result_pool, sizeof(**status));
+
+  if (old_status->versioned)
+    {
+      svn_error_t *err;
+      err= svn_wc__get_entry(&entry, wc_ctx->db, local_abspath, FALSE,
+                             svn_node_unknown, result_pool, scratch_pool);
+
+      if (err && err->apr_err == SVN_ERR_NODE_UNEXPECTED_KIND)
+        svn_error_clear(err);
+      else
+        SVN_ERR(err);
+    }
+
+  (*status)->entry = entry;
+  (*status)->copied = old_status->copied;
+  (*status)->repos_lock = svn_lock_dup(old_status->repos_lock, result_pool);
+
+  if (old_status->repos_relpath)
+    (*status)->url = svn_path_url_add_component2(old_status->repos_root_url,
+                                                 old_status->repos_relpath,
+                                                 result_pool);
+  (*status)->ood_last_cmt_rev = old_status->ood_changed_rev;
+  (*status)->ood_last_cmt_date = old_status->ood_changed_date;
+  (*status)->ood_kind = old_status->ood_kind;
+  (*status)->ood_last_cmt_author = old_status->ood_changed_author;
+
+  if (old_status->conflicted)
+    {
+      const svn_wc_conflict_description2_t *tree_conflict;
+      SVN_ERR(svn_wc__get_tree_conflict(&tree_conflict, wc_ctx, local_abspath,
+                                        scratch_pool, scratch_pool));
+      (*status)->tree_conflict = svn_wc__cd2_to_cd(tree_conflict, result_pool);
+    }
+
+  (*status)->switched = old_status->switched;
+
+  (*status)->text_status = old_status->node_status;
+  (*status)->prop_status = old_status->prop_status;
+
+  (*status)->repos_text_status = old_status->repos_node_status;
+  (*status)->repos_prop_status = old_status->repos_prop_status;
+
+  /* Some values might be inherited from properties */
+  if (old_status->node_status == svn_wc_status_modified
+      || old_status->node_status == svn_wc_status_conflicted)
+    (*status)->text_status = old_status->text_status;
+
+  /* (Currently a no-op, but just make sure it is ok) */
+  if (old_status->repos_node_status == svn_wc_status_modified
+      || old_status->repos_node_status == svn_wc_status_conflicted)
+    (*status)->repos_text_status = old_status->repos_text_status;
+
+  if (old_status->node_status == svn_wc_status_added)
+    (*status)->prop_status = svn_wc_status_none; /* No separate info */
+
+  /* Find pristine_text_status value */
+  switch (old_status->text_status)
+    {
+      case svn_wc_status_none:
+      case svn_wc_status_normal:
+      case svn_wc_status_modified:
+        (*status)->pristine_text_status = old_status->text_status;
+        break;
+      case svn_wc_status_conflicted:
+      default:
+        /* ### Fetch compare data, or fall back to the documented
+               not retrieved behavior? */
+        (*status)->pristine_text_status = svn_wc_status_none;
+        break;
+    }
+
+  /* Find pristine_prop_status value */
+  switch (old_status->prop_status)
+    {
+      case svn_wc_status_none:
+      case svn_wc_status_normal:
+      case svn_wc_status_modified:
+        if (old_status->node_status != svn_wc_status_added
+            && old_status->node_status != svn_wc_status_deleted
+            && old_status->node_status != svn_wc_status_replaced)
+          {
+            (*status)->pristine_prop_status = old_status->prop_status;
+          }
+        else
+          (*status)->pristine_prop_status = svn_wc_status_none;
+        break;
+      case svn_wc_status_conflicted:
+      default:
+        /* ### Fetch compare data, or fall back to the documented
+               not retrieved behavior? */
+        (*status)->pristine_prop_status = svn_wc_status_none;
+        break;
+    }
+
+  if (old_status->versioned
+      && old_status->conflicted
+      && old_status->node_status != svn_wc_status_obstructed
+      && (old_status->kind == svn_node_file
+          || old_status->node_status != svn_wc_status_missing))
+    {
+      svn_boolean_t text_conflict_p, prop_conflict_p;
+
+      /* The entry says there was a conflict, but the user might have
+         marked it as resolved by deleting the artifact files, so check
+         for that. */
+      SVN_ERR(svn_wc__internal_conflicted_p(&text_conflict_p,
+                                            &prop_conflict_p,
+                                            NULL,
+                                            wc_ctx->db, local_abspath,
+                                            scratch_pool));
+
+      if (text_conflict_p)
+        (*status)->text_status = svn_wc_status_conflicted;
+
+      if (prop_conflict_p)
+        (*status)->prop_status = svn_wc_status_conflicted;
+    }
+
+  return SVN_NO_ERROR;
+}
+
+
+
 /*** From status.c ***/
 
 struct status4_wrapper_baton

Modified: subversion/branches/fsfs-format7/subversion/libsvn_wc/util.c
URL: http://svn.apache.org/viewvc/subversion/branches/fsfs-format7/subversion/libsvn_wc/util.c?rev=1490671&r1=1490670&r2=1490671&view=diff
==============================================================================
--- subversion/branches/fsfs-format7/subversion/libsvn_wc/util.c (original)
+++ subversion/branches/fsfs-format7/subversion/libsvn_wc/util.c Fri Jun  7 14:59:52 2013
@@ -403,145 +403,6 @@ svn_wc__cd2_to_cd(const svn_wc_conflict_
 
 
 svn_error_t *
-svn_wc__status2_from_3(svn_wc_status2_t **status,
-                       const svn_wc_status3_t *old_status,
-                       svn_wc_context_t *wc_ctx,
-                       const char *local_abspath,
-                       apr_pool_t *result_pool,
-                       apr_pool_t *scratch_pool)
-{
-  const svn_wc_entry_t *entry = NULL;
-
-  if (old_status == NULL)
-    {
-      *status = NULL;
-      return SVN_NO_ERROR;
-    }
-
-  *status = apr_pcalloc(result_pool, sizeof(**status));
-
-  if (old_status->versioned)
-    {
-      svn_error_t *err;
-      err= svn_wc__get_entry(&entry, wc_ctx->db, local_abspath, FALSE,
-                             svn_node_unknown, result_pool, scratch_pool);
-
-      if (err && err->apr_err == SVN_ERR_NODE_UNEXPECTED_KIND)
-        svn_error_clear(err);
-      else
-        SVN_ERR(err);
-    }
-
-  (*status)->entry = entry;
-  (*status)->copied = old_status->copied;
-  (*status)->repos_lock = svn_lock_dup(old_status->repos_lock, result_pool);
-
-  if (old_status->repos_relpath)
-    (*status)->url = svn_path_url_add_component2(old_status->repos_root_url,
-                                                 old_status->repos_relpath,
-                                                 result_pool);
-  (*status)->ood_last_cmt_rev = old_status->ood_changed_rev;
-  (*status)->ood_last_cmt_date = old_status->ood_changed_date;
-  (*status)->ood_kind = old_status->ood_kind;
-  (*status)->ood_last_cmt_author = old_status->ood_changed_author;
-
-  if (old_status->conflicted)
-    {
-      const svn_wc_conflict_description2_t *tree_conflict;
-      SVN_ERR(svn_wc__get_tree_conflict(&tree_conflict, wc_ctx, local_abspath,
-                                        scratch_pool, scratch_pool));
-      (*status)->tree_conflict = svn_wc__cd2_to_cd(tree_conflict, result_pool);
-    }
-
-  (*status)->switched = old_status->switched;
-
-  (*status)->text_status = old_status->node_status;
-  (*status)->prop_status = old_status->prop_status;
-
-  (*status)->repos_text_status = old_status->repos_node_status;
-  (*status)->repos_prop_status = old_status->repos_prop_status;
-
-  /* Some values might be inherited from properties */
-  if (old_status->node_status == svn_wc_status_modified
-      || old_status->node_status == svn_wc_status_conflicted)
-    (*status)->text_status = old_status->text_status;
-
-  /* (Currently a no-op, but just make sure it is ok) */
-  if (old_status->repos_node_status == svn_wc_status_modified
-      || old_status->repos_node_status == svn_wc_status_conflicted)
-    (*status)->repos_text_status = old_status->repos_text_status;
-
-  if (old_status->node_status == svn_wc_status_added)
-    (*status)->prop_status = svn_wc_status_none; /* No separate info */
-
-  /* Find pristine_text_status value */
-  switch (old_status->text_status)
-    {
-      case svn_wc_status_none:
-      case svn_wc_status_normal:
-      case svn_wc_status_modified:
-        (*status)->pristine_text_status = old_status->text_status;
-        break;
-      case svn_wc_status_conflicted:
-      default:
-        /* ### Fetch compare data, or fall back to the documented
-               not retrieved behavior? */
-        (*status)->pristine_text_status = svn_wc_status_none;
-        break;
-    }
-
-  /* Find pristine_prop_status value */
-  switch (old_status->prop_status)
-    {
-      case svn_wc_status_none:
-      case svn_wc_status_normal:
-      case svn_wc_status_modified:
-        if (old_status->node_status != svn_wc_status_added
-            && old_status->node_status != svn_wc_status_deleted
-            && old_status->node_status != svn_wc_status_replaced)
-          {
-            (*status)->pristine_prop_status = old_status->prop_status;
-          }
-        else
-          (*status)->pristine_prop_status = svn_wc_status_none;
-        break;
-      case svn_wc_status_conflicted:
-      default:
-        /* ### Fetch compare data, or fall back to the documented
-               not retrieved behavior? */
-        (*status)->pristine_prop_status = svn_wc_status_none;
-        break;
-    }
-
-  if (old_status->versioned
-      && old_status->conflicted
-      && old_status->node_status != svn_wc_status_obstructed
-      && (old_status->kind == svn_node_file
-          || old_status->node_status != svn_wc_status_missing))
-    {
-      svn_boolean_t text_conflict_p, prop_conflict_p;
-
-      /* The entry says there was a conflict, but the user might have
-         marked it as resolved by deleting the artifact files, so check
-         for that. */
-      SVN_ERR(svn_wc__internal_conflicted_p(&text_conflict_p,
-                                            &prop_conflict_p,
-                                            NULL,
-                                            wc_ctx->db, local_abspath,
-                                            scratch_pool));
-
-      if (text_conflict_p)
-        (*status)->text_status = svn_wc_status_conflicted;
-
-      if (prop_conflict_p)
-        (*status)->prop_status = svn_wc_status_conflicted;
-    }
-
-  return SVN_NO_ERROR;
-}
-
-
-svn_error_t *
 svn_wc__fetch_kind_func(svn_node_kind_t *kind,
                         void *baton,
                         const char *path,

Modified: subversion/branches/fsfs-format7/subversion/tests/cmdline/autoprop_tests.py
URL: http://svn.apache.org/viewvc/subversion/branches/fsfs-format7/subversion/tests/cmdline/autoprop_tests.py?rev=1490671&r1=1490670&r2=1490671&view=diff
==============================================================================
--- subversion/branches/fsfs-format7/subversion/tests/cmdline/autoprop_tests.py (original)
+++ subversion/branches/fsfs-format7/subversion/tests/cmdline/autoprop_tests.py Fri Jun  7 14:59:52 2013
@@ -695,8 +695,7 @@ def svn_prop_inheritable_autoprops_unver
                        '*.c=svn:eol-style=CR', sbox.ospath('A/B'))
   svntest.main.run_svn(None, 'ps', SVN_PROP_INHERITABLE_AUTOPROPS,
                        '*.c=svn:eol-style=native', sbox.ospath('A/D'))
-  svntest.main.run_svn(None, 'ci', '-m', 'Add inheritable autoprops',
-                       sbox.wc_dir)
+  sbox.simple_commit(message='Add inheritable autoprops')
 
   # Create two subtrees, each with one new file.
   os.mkdir(Z_path)

Modified: subversion/branches/fsfs-format7/subversion/tests/cmdline/blame_tests.py
URL: http://svn.apache.org/viewvc/subversion/branches/fsfs-format7/subversion/tests/cmdline/blame_tests.py?rev=1490671&r1=1490670&r2=1490671&view=diff
==============================================================================
--- subversion/branches/fsfs-format7/subversion/tests/cmdline/blame_tests.py (original)
+++ subversion/branches/fsfs-format7/subversion/tests/cmdline/blame_tests.py Fri Jun  7 14:59:52 2013
@@ -34,7 +34,7 @@ from svntest.main import server_has_merg
 from prop_tests import binary_mime_type_on_text_file_warning
 
 # For some basic merge setup used by blame -g tests.
-from merge_tests import set_up_branch
+from svntest.mergetrees import set_up_branch
 
 # (abbreviation)
 Skip = svntest.testcase.Skip_deco
@@ -772,7 +772,7 @@ def merge_sensitive_blame_and_empty_merg
 
   # Make an edit to A/D/H/psi in r3.
   svntest.main.file_append(psi_path, "trunk edit in revision three.\n")
-  svntest.main.run_svn(None, 'ci', '-m', 'trunk edit', wc_dir)
+  sbox.simple_commit(message='trunk edit')
 
   # Merge r3 from A to A_COPY, reverse merge r3 from A/D/H/psi
   # to A_COPY/D/H/psi, and commit as r4.  This results in empty
@@ -782,21 +782,18 @@ def merge_sensitive_blame_and_empty_merg
                        sbox.repo_url + '/A', A_COPY_path)
   svntest.main.run_svn(None, 'merge', '-c-3',
                        sbox.repo_url + '/A/D/H/psi', psi_COPY_path)
-  svntest.main.run_svn(None, 'ci', '-m',
-                       'Sync merge A to A_COPY excepting A_COPY/D/H/psi',
-                       wc_dir)
+  sbox.simple_commit(message='Sync merge A to A_COPY excepting A_COPY/D/H/psi')
 
   # Make an edit to A/D/H/psi in r5.
   svntest.main.file_append(psi_path, "trunk edit in revision five.\n")
-  svntest.main.run_svn(None, 'ci', '-m', 'trunk edit', wc_dir)
+  sbox.simple_commit(message='trunk edit')
 
   # Sync merge A/D/H/psi to A_COPY/D/H/psi and commit as r6.  This replaces
   # the empty mergeinfo on A_COPY/D/H/psi with '/A/D/H/psi:2-5'.
   svntest.main.run_svn(None, 'up', wc_dir)
   svntest.main.run_svn(None, 'merge',  sbox.repo_url + '/A/D/H/psi',
                        psi_COPY_path)
-  svntest.main.run_svn(None, 'ci', '-m',
-                       'Sync merge A/D/H/psi to A_COPY/D/H/psi', wc_dir)
+  sbox.simple_commit(message='Sync merge A/D/H/psi to A_COPY/D/H/psi')
 
   # Check the blame -g output:
   # Currently this test fails because the trunk edit done in r3 is

Modified: subversion/branches/fsfs-format7/subversion/tests/cmdline/commit_tests.py
URL: http://svn.apache.org/viewvc/subversion/branches/fsfs-format7/subversion/tests/cmdline/commit_tests.py?rev=1490671&r1=1490670&r2=1490671&view=diff
==============================================================================
--- subversion/branches/fsfs-format7/subversion/tests/cmdline/commit_tests.py (original)
+++ subversion/branches/fsfs-format7/subversion/tests/cmdline/commit_tests.py Fri Jun  7 14:59:52 2013
@@ -1797,7 +1797,7 @@ def commit_out_of_date_deletions(sbox):
   I_path = sbox.ospath('A/I')
   os.mkdir(I_path)
   svntest.main.run_svn(None, 'add', I_path)
-  svntest.main.run_svn(None, 'ci', '-m', 'prep', wc_dir)
+  sbox.simple_commit(message='prep')
   svntest.main.run_svn(None, 'up', wc_dir)
 
   # Make a backup copy of the working copy
@@ -2945,6 +2945,24 @@ def last_changed_of_copied_subdir(sbox):
              }
   svntest.actions.run_and_verify_info([expected], E_copied)
 
+@XFail()
+def commit_unversioned(sbox):
+  "verify behavior on unversioned targets"
+  
+  sbox.build(read_only=True)
+  wc_dir = sbox.wc_dir
+  
+  expected_err = 'E200009: .*existing.*\' is not under version control'
+
+  # Unversioned, but existing file
+  svntest.main.file_write(sbox.ospath('existing'), "xxxx")  
+  svntest.actions.run_and_verify_commit(wc_dir, None, None, expected_err,
+                                         sbox.ospath('existing'))
+  
+  # Unversioned, not existing
+  svntest.actions.run_and_verify_commit(wc_dir, None, None, expected_err,
+                                         sbox.ospath('not-existing'))
+                                         
 
 ########################################################################
 # Run the tests
@@ -3017,6 +3035,7 @@ test_list = [ None,
               commit_add_subadd,
               commit_danglers,
               last_changed_of_copied_subdir,
+              commit_unversioned,
              ]
 
 if __name__ == '__main__':

Modified: subversion/branches/fsfs-format7/subversion/tests/cmdline/history_tests.py
URL: http://svn.apache.org/viewvc/subversion/branches/fsfs-format7/subversion/tests/cmdline/history_tests.py?rev=1490671&r1=1490670&r2=1490671&view=diff
==============================================================================
--- subversion/branches/fsfs-format7/subversion/tests/cmdline/history_tests.py (original)
+++ subversion/branches/fsfs-format7/subversion/tests/cmdline/history_tests.py Fri Jun  7 14:59:52 2013
@@ -189,20 +189,17 @@ def cat_avoids_false_identities(sbox):
   svntest.main.run_svn(None, 'del', iota_path)
   svntest.main.file_append(iota_path, "YOU SHOULD NOT SEE THIS\n")
   svntest.main.run_svn(None, 'add', iota_path)
-  svntest.main.run_svn(None, 'ci', '-m', 'log msg',
-                       wc_dir)
+  sbox.simple_commit(message='log msg')
   svntest.main.run_svn(None, 'up', wc_dir)
 
   # r3
   svntest.main.run_svn(None, 'del', iota_path)
-  svntest.main.run_svn(None, 'ci', '-m', 'log msg',
-                       wc_dir)
+  sbox.simple_commit(message='log msg')
   svntest.main.run_svn(None, 'up', wc_dir)
 
   # r4
   svntest.main.run_svn(None, 'cp', iota_url + '@1', wc_dir)
-  svntest.main.run_svn(None, 'ci', '-m', 'log msg',
-                       wc_dir)
+  sbox.simple_commit(message='log msg')
   svntest.main.run_svn(None, 'up', wc_dir)
 
   # 'svn cat -r2 iota' should error, because the line of history

Modified: subversion/branches/fsfs-format7/subversion/tests/cmdline/lock_tests.py
URL: http://svn.apache.org/viewvc/subversion/branches/fsfs-format7/subversion/tests/cmdline/lock_tests.py?rev=1490671&r1=1490670&r2=1490671&view=diff
==============================================================================
--- subversion/branches/fsfs-format7/subversion/tests/cmdline/lock_tests.py (original)
+++ subversion/branches/fsfs-format7/subversion/tests/cmdline/lock_tests.py Fri Jun  7 14:59:52 2013
@@ -1500,7 +1500,7 @@ def verify_path_escaping(sbox):
 
   svntest.main.run_svn(None, 'add', file1, file2, file3)
 
-  svntest.main.run_svn(None, 'ci', '-m', 'commit', wc_dir)
+  sbox.simple_commit(message='commit')
 
   svntest.main.run_svn(None, 'lock', '-m', 'lock 1', file1)
   svntest.main.run_svn(None, 'lock', '-m', 'lock 2', sbox.repo_url + '/file%20%232')

Modified: subversion/branches/fsfs-format7/subversion/tests/cmdline/log_tests.py
URL: http://svn.apache.org/viewvc/subversion/branches/fsfs-format7/subversion/tests/cmdline/log_tests.py?rev=1490671&r1=1490670&r2=1490671&view=diff
==============================================================================
--- subversion/branches/fsfs-format7/subversion/tests/cmdline/log_tests.py (original)
+++ subversion/branches/fsfs-format7/subversion/tests/cmdline/log_tests.py Fri Jun  7 14:59:52 2013
@@ -33,7 +33,7 @@ from svntest import wc
 
 from svntest.main import server_has_mergeinfo
 from svntest.main import SVN_PROP_MERGEINFO
-from merge_tests import set_up_branch
+from svntest.mergetrees import set_up_branch
 from diff_tests import make_diff_header, make_no_diff_deleted_header
 
 # (abbreviation)
@@ -1875,14 +1875,12 @@ def merge_sensitive_log_reverse_merges(s
   # Merge -c3,5 from A to A_COPY, commit as r7
   svntest.main.run_svn(None, 'up', wc_dir)
   svntest.main.run_svn(None, 'merge', '-c3,5', A_path, A_COPY_path)
-  svntest.main.run_svn(None, 'ci', '-m', 'Merge -c3,5 from A to A_COPY',
-                       wc_dir)
+  sbox.simple_commit(message='Merge -c3,5 from A to A_COPY')
 
   # Merge -c-3,-5,4,6 from A to A_COPY, commit as r8
   svntest.main.run_svn(None, 'up', wc_dir)
   svntest.main.run_svn(None, 'merge', '-c-3,4,-5,6', A_path, A_COPY_path)
-  svntest.main.run_svn(None, 'ci', '-m', 'Merge -c-3,-5,4,6 from A to A_COPY',
-                       wc_dir)
+  sbox.simple_commit(message='Merge -c-3,-5,4,6 from A to A_COPY')
 
   # Update so
   svntest.main.run_svn(None, 'up', wc_dir)
@@ -1938,58 +1936,55 @@ def merge_sensitive_log_ignores_cyclic_m
 
   # Make an edit on the "branch" to A_COPY/mu, commit as r7.
   svntest.main.file_write(mu_COPY_path, "Branch edit.\n")
-  svntest.main.run_svn(None, 'ci', '-m', 'Branch edit', wc_dir)
+  sbox.simple_commit(message='Branch edit')
 
   # Make an edit on both the "trunk" and the "branch", commit as r8.
   svntest.main.file_write(chi_path, "Trunk edit.\n")
   svntest.main.file_write(tau_COPY_path, "Branch edit.\n")
-  svntest.main.run_svn(None, 'ci', '-m', 'Branch and trunk edits in one rev',
-                       wc_dir)
+  sbox.simple_commit(message='Branch and trunk edits in one rev')
 
   # Sync merge A to A_COPY, commit as r9
   svntest.main.run_svn(None, 'up', wc_dir)
   svntest.main.run_svn(None, 'merge', sbox.repo_url + '/A', A_COPY_path)
-  svntest.main.run_svn(None, 'ci', '-m', 'Sync merge A to A_COPY', wc_dir)
+  sbox.simple_commit(message='Sync merge A to A_COPY')
 
   # Reintegrate A_COPY to A, commit as r10
   svntest.main.run_svn(None, 'up', wc_dir)
   svntest.main.run_svn(None, 'merge', '--reintegrate',
                        sbox.repo_url + '/A_COPY', A_path)
-  svntest.main.run_svn(None, 'ci', '-m', 'Reintegrate A_COPY to A', wc_dir)
+  sbox.simple_commit(message='Reintegrate A_COPY to A')
 
   # Do a --record-only merge of r10 from A to A_COPY, commit as r11.
   # This will allow us to continue using the branch without deleting it.
   svntest.main.run_svn(None, 'up', wc_dir)
   svntest.main.run_svn(None, 'merge', sbox.repo_url + '/A', A_COPY_path)
-  svntest.main.run_svn(None, 'ci', '-m',
-                       '--record-only merge r10 from A to A_COPY', wc_dir)
+  sbox.simple_commit(message='--record-only merge r10 from A to A_COPY')
 
   # Make an edit on the "branch"; add A_COPY/C and A_COPY/C/Z/nu,
   # commit as r12.
   svntest.main.run_svn(None, 'mkdir', Z_COPY_path)
   svntest.main.file_write(nu_COPY_path, "A new branch file.\n")
   svntest.main.run_svn(None, 'add', nu_COPY_path)
-  svntest.main.run_svn(None, 'ci', '-m', 'Branch edit: Add a subtree', wc_dir)
+  sbox.simple_commit(message='Branch edit: Add a subtree')
 
   # Make an edit on the "trunk"; add A/C/X and A/C/X/kappa,
   # commit as r13.
   svntest.main.run_svn(None, 'mkdir', X_path)
   svntest.main.file_write(kappa_path, "A new trunk file.\n")
   svntest.main.run_svn(None, 'add', kappa_path)
-  svntest.main.run_svn(None, 'ci', '-m', 'Trunk edit: Add a subtree', wc_dir)
+  sbox.simple_commit(message='Trunk edit: Add a subtree')
   svntest.main.run_svn(None, 'up', wc_dir)
 
   # Sync merge A to A_COPY, commit as r14
   svntest.main.run_svn(None, 'up', wc_dir)
   svntest.main.run_svn(None, 'merge', sbox.repo_url + '/A', A_COPY_path)
-  svntest.main.run_svn(None, 'ci', '-m', 'Sync merge A to A_COPY', wc_dir)
+  sbox.simple_commit(message='Sync merge A to A_COPY')
 
   # Reintegrate A_COPY to A, commit as r15
   svntest.main.run_svn(None, 'up', wc_dir)
   svntest.main.run_svn(None, 'merge', '--reintegrate',
                        sbox.repo_url + '/A_COPY', A_path)
-  svntest.main.run_svn(None, 'ci', '-m', '2nd reintegrate of A_COPY to A',
-                       wc_dir)
+  sbox.simple_commit(message='2nd reintegrate of A_COPY to A')
 
   # Run 'svn log -g A'.  We expect to see r13, r10, r6, r5, r4, and r3 only
   # once, as part of A's own history, not as merged in from A_COPY.
@@ -2090,17 +2085,17 @@ def merge_sensitive_log_copied_path_inhe
 
   # r3 - Modify a file (A_COPY/D/gamma) on the branch
   svntest.main.file_write(gamma_COPY_path, "Branch edit.\n")
-  svntest.main.run_svn(None, 'ci', '-m', 'Branch edit', wc_dir)
+  sbox.simple_commit(message='Branch edit')
 
   # r4 - Reintegrate A_COPY to A
   svntest.main.run_svn(None, 'up', wc_dir)
   svntest.main.run_svn(None, 'merge', '--reintegrate',
                        sbox.repo_url + '/A_COPY', A_path)
-  svntest.main.run_svn(None, 'ci', '-m', 'Reintegrate A_COPY to A', wc_dir)
+  sbox.simple_commit(message='Reintegrate A_COPY to A')
 
   # r5 - Move file modified by reintegrate (A/D/gamma to A/C/gamma).
   svntest.main.run_svn(None, 'move', old_gamma_path, new_gamma_path)
-  svntest.main.run_svn(None, 'ci', '-m', 'Move file', wc_dir)
+  sbox.simple_commit(message='Move file')
 
   # 'svn log -g --stop-on-copy ^/A/C/gamma' hould return *only* r5
   # Previously this test failed because the change in gamma's inherited

Modified: subversion/branches/fsfs-format7/subversion/tests/cmdline/merge_authz_tests.py
URL: http://svn.apache.org/viewvc/subversion/branches/fsfs-format7/subversion/tests/cmdline/merge_authz_tests.py?rev=1490671&r1=1490670&r2=1490671&view=diff
==============================================================================
--- subversion/branches/fsfs-format7/subversion/tests/cmdline/merge_authz_tests.py (original)
+++ subversion/branches/fsfs-format7/subversion/tests/cmdline/merge_authz_tests.py Fri Jun  7 14:59:52 2013
@@ -41,8 +41,8 @@ Issues = svntest.testcase.Issues_deco
 Issue = svntest.testcase.Issue_deco
 Wimp = svntest.testcase.Wimp_deco
 
-from merge_tests import set_up_branch
-from merge_tests import expected_merge_output
+from svntest.mergetrees import set_up_branch
+from svntest.mergetrees import expected_merge_output
 from svntest.main import SVN_PROP_MERGEINFO
 from svntest.main import write_restrictive_svnserve_conf
 from svntest.main import write_authz_file
@@ -659,7 +659,7 @@ def reintegrate_fails_if_no_root_access(
                                            ' U   ' + A_COPY_path     + '\n'])
   svntest.actions.run_and_verify_svn(None, expected_output, [], 'merge',
                                      sbox.repo_url + '/A', A_COPY_path)
-  svntest.main.run_svn(None, 'ci', '-m', 'synch A_COPY with A', wc_dir)
+  sbox.simple_commit(message='synch A_COPY with A')
 
   # Update so we are ready for reintegrate.
   svntest.main.run_svn(None, 'up', wc_dir)

Modified: subversion/branches/fsfs-format7/subversion/tests/cmdline/merge_automatic_tests.py
URL: http://svn.apache.org/viewvc/subversion/branches/fsfs-format7/subversion/tests/cmdline/merge_automatic_tests.py?rev=1490671&r1=1490670&r2=1490671&view=diff
==============================================================================
--- subversion/branches/fsfs-format7/subversion/tests/cmdline/merge_automatic_tests.py (original)
+++ subversion/branches/fsfs-format7/subversion/tests/cmdline/merge_automatic_tests.py Fri Jun  7 14:59:52 2013
@@ -43,10 +43,10 @@ Wimp = svntest.testcase.Wimp_deco
 
 from svntest.main import SVN_PROP_MERGEINFO
 from svntest.main import server_has_mergeinfo
-from merge_tests import local_path
-from merge_tests import expected_merge_output
-from merge_tests import svn_merge
-from merge_tests import set_up_branch
+from svntest.mergetrees import local_path
+from svntest.mergetrees import expected_merge_output
+from svntest.mergetrees import svn_merge
+from svntest.mergetrees import set_up_branch
 
 #----------------------------------------------------------------------
 

Modified: subversion/branches/fsfs-format7/subversion/tests/cmdline/merge_reintegrate_tests.py
URL: http://svn.apache.org/viewvc/subversion/branches/fsfs-format7/subversion/tests/cmdline/merge_reintegrate_tests.py?rev=1490671&r1=1490670&r2=1490671&view=diff
==============================================================================
--- subversion/branches/fsfs-format7/subversion/tests/cmdline/merge_reintegrate_tests.py (original)
+++ subversion/branches/fsfs-format7/subversion/tests/cmdline/merge_reintegrate_tests.py Fri Jun  7 14:59:52 2013
@@ -44,8 +44,8 @@ exp_noop_up_out = svntest.actions.expect
 
 from svntest.main import SVN_PROP_MERGEINFO
 from svntest.main import server_has_mergeinfo
-from merge_tests import set_up_branch
-from merge_tests import expected_merge_output
+from svntest.mergetrees import set_up_branch
+from svntest.mergetrees import expected_merge_output
 
 #----------------------------------------------------------------------
 def run_reintegrate(src_url, tgt_path):
@@ -2584,13 +2584,13 @@ def reintegrate_replaced_source(sbox):
   svntest.main.run_svn(None, 'up', wc_dir)
   svntest.main.run_svn(None, 'merge', sbox.repo_url + '/A', A_COPY_path,
                        '-c3')
-  svntest.main.run_svn(None, 'ci', '-m', 'Merge r3 from A to A_COPY', wc_dir)
+  sbox.simple_commit(message='Merge r3 from A to A_COPY')
 
   # r8 - Merge r4 from A to A_COPY
   svntest.main.run_svn(None, 'up', wc_dir)
   svntest.main.run_svn(None, 'merge', sbox.repo_url + '/A', A_COPY_path,
                        '-c4')
-  svntest.main.run_svn(None, 'ci', '-m', 'Merge r4 from A to A_COPY', wc_dir)
+  sbox.simple_commit(message='Merge r4 from A to A_COPY')
 
   # r9 - Merge r5 from A to A_COPY. Make an additional edit to
   # A_COPY/B/E/beta.
@@ -2598,7 +2598,7 @@ def reintegrate_replaced_source(sbox):
   svntest.main.run_svn(None, 'merge', sbox.repo_url + '/A', A_COPY_path,
                        '-c5')
   svntest.main.file_write(beta_COPY_path, "Branch edit mistake.\n")
-  svntest.main.run_svn(None, 'ci', '-m', 'Merge r5 from A to A_COPY', wc_dir)
+  sbox.simple_commit(message='Merge r5 from A to A_COPY')
 
   # r10 - Delete A_COPY and replace it with A_COPY@8. This removes the edit
   # we made above in r9 to A_COPY/B/E/beta.
@@ -2606,19 +2606,17 @@ def reintegrate_replaced_source(sbox):
   svntest.main.run_svn(None, 'delete', A_COPY_path)
   svntest.main.run_svn(None, 'copy', sbox.repo_url + '/A_COPY@8',
                        A_COPY_path)
-  svntest.main.run_svn(None, 'ci', '-m', 'Replace A_COPY with A_COPY@8',
-                       wc_dir)
+  sbox.simple_commit(message='Replace A_COPY with A_COPY@8')
 
   # r11 - Make an edit on A_COPY/mu.
   svntest.main.file_write(mu_COPY_path, "Branch edit.\n")
-  svntest.main.run_svn(None, 'ci', '-m', 'Branch edit',
-                       wc_dir)
+  sbox.simple_commit(message='Branch edit')
 
   # r12 - Do a final sync merge of A to A_COPY in preparation for
   # reintegration.
   svntest.main.run_svn(None, 'up', wc_dir)
   svntest.main.run_svn(None, 'merge', sbox.repo_url + '/A', A_COPY_path)
-  svntest.main.run_svn(None, 'ci', '-m', 'Sycn A_COPY with A', wc_dir)
+  sbox.simple_commit(message='Sync A_COPY with A')
 
   # Reintegrate A_COPY to A.  The resulting mergeinfo should be
   # '/A_COPY:2-8,10-12' because of the replacement which removed /A_COPY:9

Modified: subversion/branches/fsfs-format7/subversion/tests/cmdline/merge_tests.py
URL: http://svn.apache.org/viewvc/subversion/branches/fsfs-format7/subversion/tests/cmdline/merge_tests.py?rev=1490671&r1=1490670&r2=1490671&view=diff
==============================================================================
--- subversion/branches/fsfs-format7/subversion/tests/cmdline/merge_tests.py (original)
+++ subversion/branches/fsfs-format7/subversion/tests/cmdline/merge_tests.py Fri Jun  7 14:59:52 2013
@@ -51,86 +51,16 @@ from svntest.actions import make_conflic
 from svntest.actions import inject_conflict_into_expected_state
 from svntest.verify import RegexListOutput
 
-def expected_merge_output(rev_ranges, additional_lines=[], foreign=False,
-                          elides=False, two_url=False, target=None,
-                          text_conflicts=0, prop_conflicts=0, tree_conflicts=0,
-                          text_resolved=0, prop_resolved=0, tree_resolved=0,
-                          skipped_paths=0):
-  """Generate an (inefficient) regex representing the expected merge
-  output and mergeinfo notifications from REV_RANGES and ADDITIONAL_LINES.
-
-  REV_RANGES is a list of revision ranges for which mergeinfo is being
-  recorded.  Each range is of the form [start, end] (where both START and
-  END are inclusive, unlike in '-rX:Y') or the form [single_rev] (which is
-  like '-c SINGLE_REV').  If REV_RANGES is None then only the standard
-  notification for a 3-way merge is expected.
-
-  ADDITIONAL_LINES is a list of strings to match the other lines of output;
-  these are basically regular expressions except that backslashes will be
-  escaped herein.  If ADDITIONAL_LINES is a single string, it is interpreted
-  the same as a list containing that string.
-
-  If ELIDES is true, add to the regex an expression representing elision
-  notification.  If TWO_URL is true, tweak the regex to expect the
-  appropriate mergeinfo notification for a 3-way merge.
-
-  TARGET is the local path to the target, as it should appear in
-  notifications; if None, it is not checked.
-
-  TEXT_CONFLICTS, PROP_CONFLICTS, TREE_CONFLICTS and SKIPPED_PATHS specify
-  the number of each kind of conflict to expect.
-  """
-
-  if rev_ranges is None:
-    lines = [svntest.main.merge_notify_line(None, None, False, foreign)]
-  else:
-    lines = []
-    for rng in rev_ranges:
-      start_rev = rng[0]
-      if len(rng) > 1:
-        end_rev = rng[1]
-      else:
-        end_rev = None
-      lines += [svntest.main.merge_notify_line(start_rev, end_rev,
-                                               True, foreign, target)]
-      lines += [svntest.main.mergeinfo_notify_line(start_rev, end_rev, target)]
-
-  if (elides):
-    lines += ["--- Eliding mergeinfo from .*\n"]
-
-  if (two_url):
-    lines += ["--- Recording mergeinfo for merge between repository URLs .*\n"]
-
-  # Address "The Backslash Plague"
-  #
-  # If ADDITIONAL_LINES are present there are possibly paths in it with
-  # multiple components and on Windows these components are separated with
-  # '\'.  These need to be escaped properly in the regexp for the match to
-  # work correctly.  See http://aspn.activestate.com/ASPN/docs/ActivePython
-  # /2.2/howto/regex/regex.html#SECTION000420000000000000000.
-  if isinstance(additional_lines, str):
-    additional_lines = [additional_lines]
-  if sys.platform == 'win32':
-    additional_lines = [line.replace("\\", "\\\\") for line in additional_lines]
-  lines += additional_lines
-
-  lines += svntest.main.summary_of_conflicts(
-             text_conflicts, prop_conflicts, tree_conflicts,
-             text_resolved, prop_resolved, tree_resolved,
-             skipped_paths,
-             as_regex=True)
-
-  return "|".join(lines)
-
-def check_mergeinfo_recursively(root_path, subpaths_mergeinfo):
-  """Check that the mergeinfo properties on and under ROOT_PATH are those in
-     SUBPATHS_MERGEINFO, a {path: mergeinfo-prop-val} dictionary."""
-  expected = svntest.verify.UnorderedOutput(
-    [path + ' - ' + subpaths_mergeinfo[path] + '\n'
-     for path in subpaths_mergeinfo])
-  svntest.actions.run_and_verify_svn(None, expected, [],
-                                     'propget', '-R', SVN_PROP_MERGEINFO,
-                                     root_path)
+from svntest.mergetrees import expected_merge_output, \
+                               check_mergeinfo_recursively, \
+                               set_up_dir_replace, \
+                               set_up_branch, \
+                               local_path, \
+                               svn_mkfile, \
+                               svn_modfile, \
+                               svn_copy, \
+                               svn_merge, \
+                               noninheritable_mergeinfo_test_set_up
 
 ######################################################################
 # Tests
@@ -2346,118 +2276,6 @@ def merge_prop_change_to_deleted_target(
                                      '-r1:2', '--ignore-ancestry', '.')
 
 #----------------------------------------------------------------------
-def set_up_dir_replace(sbox):
-  """Set up the working copy for directory replace tests, creating
-  directory 'A/B/F/foo' with files 'new file' and 'new file2' within
-  it (r2), and merging 'foo' onto 'C' (r3), then deleting 'A/B/F/foo'
-  (r4)."""
-
-  sbox.build()
-  wc_dir = sbox.wc_dir
-
-  C_path = sbox.ospath('A/C')
-  F_path = sbox.ospath('A/B/F')
-  F_url = sbox.repo_url + '/A/B/F'
-
-  foo_path = os.path.join(F_path, 'foo')
-  new_file = os.path.join(foo_path, "new file")
-  new_file2 = os.path.join(foo_path, "new file 2")
-
-  # Make directory foo in F, and add some files within it.
-  svntest.actions.run_and_verify_svn(None, None, [], 'mkdir', foo_path)
-  svntest.main.file_append(new_file, "Initial text in new file.\n")
-  svntest.main.file_append(new_file2, "Initial text in new file 2.\n")
-  svntest.main.run_svn(None, "add", new_file)
-  svntest.main.run_svn(None, "add", new_file2)
-
-  # Commit all the new content, creating r2.
-  expected_output = wc.State(wc_dir, {
-    'A/B/F/foo'            : Item(verb='Adding'),
-    'A/B/F/foo/new file'   : Item(verb='Adding'),
-    'A/B/F/foo/new file 2' : Item(verb='Adding'),
-    })
-  expected_status = svntest.actions.get_virginal_state(wc_dir, 1)
-  expected_status.add({
-    'A/B/F/foo'             : Item(status='  ', wc_rev=2),
-    'A/B/F/foo/new file'    : Item(status='  ', wc_rev=2),
-    'A/B/F/foo/new file 2'  : Item(status='  ', wc_rev=2),
-    })
-  svntest.actions.run_and_verify_commit(wc_dir,
-                                        expected_output,
-                                        expected_status,
-                                        None, wc_dir)
-
-  # Merge foo onto C
-  expected_output = wc.State(C_path, {
-    'foo' : Item(status='A '),
-    'foo/new file'   : Item(status='A '),
-    'foo/new file 2' : Item(status='A '),
-    })
-  expected_mergeinfo_output = wc.State(C_path, {
-    '' : Item(status=' U'),
-    })
-  expected_elision_output = wc.State(C_path, {
-    })
-  expected_disk = wc.State('', {
-    ''               : Item(props={SVN_PROP_MERGEINFO : '/A/B/F:2'}),
-    'foo' : Item(),
-    'foo/new file'   : Item("Initial text in new file.\n"),
-    'foo/new file 2' : Item("Initial text in new file 2.\n"),
-    })
-  expected_status = wc.State(C_path, {
-    ''    : Item(status=' M', wc_rev=1),
-    'foo' : Item(status='A ', wc_rev='-', copied='+'),
-    'foo/new file'   : Item(status='  ', wc_rev='-', copied='+'),
-    'foo/new file 2' : Item(status='  ', wc_rev='-', copied='+'),
-    })
-  expected_skip = wc.State(C_path, { })
-  svntest.actions.run_and_verify_merge(C_path, '1', '2', F_url, None,
-                                       expected_output,
-                                       expected_mergeinfo_output,
-                                       expected_elision_output,
-                                       expected_disk,
-                                       expected_status,
-                                       expected_skip,
-                                       None, None, None, None, None, 1)
-  # Commit merge of foo onto C, creating r3.
-  expected_output = svntest.wc.State(wc_dir, {
-    'A/C'        : Item(verb='Sending'),
-    'A/C/foo'    : Item(verb='Adding'),
-    })
-  expected_status = svntest.actions.get_virginal_state(wc_dir, 1)
-  expected_status.add({
-    'A/B/F/foo'  : Item(status='  ', wc_rev=2),
-    'A/C'        : Item(status='  ', wc_rev=3),
-    'A/B/F/foo/new file'      : Item(status='  ', wc_rev=2),
-    'A/B/F/foo/new file 2'    : Item(status='  ', wc_rev=2),
-    'A/C/foo'    : Item(status='  ', wc_rev=3),
-    'A/C/foo/new file'      : Item(status='  ', wc_rev=3),
-    'A/C/foo/new file 2'    : Item(status='  ', wc_rev=3),
-
-    })
-  svntest.actions.run_and_verify_commit(wc_dir,
-                                        expected_output,
-                                        expected_status,
-                                        None, wc_dir)
-
-  # Delete foo on F, creating r4.
-  svntest.actions.run_and_verify_svn(None, None, [], 'rm', foo_path)
-  expected_output = svntest.wc.State(wc_dir, {
-    'A/B/F/foo'   : Item(verb='Deleting'),
-    })
-  expected_status = svntest.actions.get_virginal_state(wc_dir, 1)
-  expected_status.add({
-    'A/C'         : Item(status='  ', wc_rev=3),
-    'A/C/foo'     : Item(status='  ', wc_rev=3),
-    'A/C/foo/new file'      : Item(status='  ', wc_rev=3),
-    'A/C/foo/new file 2'    : Item(status='  ', wc_rev=3),
-    })
-  svntest.actions.run_and_verify_commit(wc_dir,
-                                        expected_output,
-                                        expected_status,
-                                        None, wc_dir)
-
-#----------------------------------------------------------------------
 # A merge that replaces a directory
 # Tests for Issue #2144 and Issue #2607
 @SkipUnless(server_has_mergeinfo)
@@ -4479,154 +4297,6 @@ def obey_reporter_api_semantics_while_do
                                        None, 1)
 
 #----------------------------------------------------------------------
-def set_up_branch(sbox, branch_only = False, nbr_of_branches = 1):
-  '''Starting with standard greek tree, copy 'A' NBR_OF_BRANCHES times
-  to A_COPY, A_COPY_2, A_COPY_3, and so on.  Then, unless BRANCH_ONLY is
-  true, make four modifications (setting file contents to "New content")
-  under A:
-    r(2 + NBR_OF_BRANCHES) - A/D/H/psi
-    r(3 + NBR_OF_BRANCHES) - A/D/G/rho
-    r(4 + NBR_OF_BRANCHES) - A/B/E/beta
-    r(5 + NBR_OF_BRANCHES) - A/D/H/omega
-  Return (expected_disk, expected_status).'''
-
-  # With the default parameters, the branching looks like this:
-  #
-  #   A         -1-----3-4-5-6--
-  #                \
-  #   A_COPY        2-----------
-
-  wc_dir = sbox.wc_dir
-
-  expected_status = svntest.actions.get_virginal_state(wc_dir, 1)
-  expected_disk = svntest.main.greek_state.copy()
-
-  def copy_A(dest_name, rev):
-    expected = svntest.verify.UnorderedOutput(
-      ["A    " + os.path.join(wc_dir, dest_name, "B") + "\n",
-       "A    " + os.path.join(wc_dir, dest_name, "B", "lambda") + "\n",
-       "A    " + os.path.join(wc_dir, dest_name, "B", "E") + "\n",
-       "A    " + os.path.join(wc_dir, dest_name, "B", "E", "alpha") + "\n",
-       "A    " + os.path.join(wc_dir, dest_name, "B", "E", "beta") + "\n",
-       "A    " + os.path.join(wc_dir, dest_name, "B", "F") + "\n",
-       "A    " + os.path.join(wc_dir, dest_name, "mu") + "\n",
-       "A    " + os.path.join(wc_dir, dest_name, "C") + "\n",
-       "A    " + os.path.join(wc_dir, dest_name, "D") + "\n",
-       "A    " + os.path.join(wc_dir, dest_name, "D", "gamma") + "\n",
-       "A    " + os.path.join(wc_dir, dest_name, "D", "G") + "\n",
-       "A    " + os.path.join(wc_dir, dest_name, "D", "G", "pi") + "\n",
-       "A    " + os.path.join(wc_dir, dest_name, "D", "G", "rho") + "\n",
-       "A    " + os.path.join(wc_dir, dest_name, "D", "G", "tau") + "\n",
-       "A    " + os.path.join(wc_dir, dest_name, "D", "H") + "\n",
-       "A    " + os.path.join(wc_dir, dest_name, "D", "H", "chi") + "\n",
-       "A    " + os.path.join(wc_dir, dest_name, "D", "H", "omega") + "\n",
-       "A    " + os.path.join(wc_dir, dest_name, "D", "H", "psi") + "\n",
-       "Checked out revision " + str(rev - 1) + ".\n",
-       "A         " + os.path.join(wc_dir, dest_name) + "\n"])
-    expected_status.add({
-      dest_name + "/B"         : Item(status='  ', wc_rev=rev),
-      dest_name + "/B/lambda"  : Item(status='  ', wc_rev=rev),
-      dest_name + "/B/E"       : Item(status='  ', wc_rev=rev),
-      dest_name + "/B/E/alpha" : Item(status='  ', wc_rev=rev),
-      dest_name + "/B/E/beta"  : Item(status='  ', wc_rev=rev),
-      dest_name + "/B/F"       : Item(status='  ', wc_rev=rev),
-      dest_name + "/mu"        : Item(status='  ', wc_rev=rev),
-      dest_name + "/C"         : Item(status='  ', wc_rev=rev),
-      dest_name + "/D"         : Item(status='  ', wc_rev=rev),
-      dest_name + "/D/gamma"   : Item(status='  ', wc_rev=rev),
-      dest_name + "/D/G"       : Item(status='  ', wc_rev=rev),
-      dest_name + "/D/G/pi"    : Item(status='  ', wc_rev=rev),
-      dest_name + "/D/G/rho"   : Item(status='  ', wc_rev=rev),
-      dest_name + "/D/G/tau"   : Item(status='  ', wc_rev=rev),
-      dest_name + "/D/H"       : Item(status='  ', wc_rev=rev),
-      dest_name + "/D/H/chi"   : Item(status='  ', wc_rev=rev),
-      dest_name + "/D/H/omega" : Item(status='  ', wc_rev=rev),
-      dest_name + "/D/H/psi"   : Item(status='  ', wc_rev=rev),
-      dest_name                : Item(status='  ', wc_rev=rev)})
-    expected_disk.add({
-      dest_name                : Item(),
-      dest_name + '/B'         : Item(),
-      dest_name + '/B/lambda'  : Item("This is the file 'lambda'.\n"),
-      dest_name + '/B/E'       : Item(),
-      dest_name + '/B/E/alpha' : Item("This is the file 'alpha'.\n"),
-      dest_name + '/B/E/beta'  : Item("This is the file 'beta'.\n"),
-      dest_name + '/B/F'       : Item(),
-      dest_name + '/mu'        : Item("This is the file 'mu'.\n"),
-      dest_name + '/C'         : Item(),
-      dest_name + '/D'         : Item(),
-      dest_name + '/D/gamma'   : Item("This is the file 'gamma'.\n"),
-      dest_name + '/D/G'       : Item(),
-      dest_name + '/D/G/pi'    : Item("This is the file 'pi'.\n"),
-      dest_name + '/D/G/rho'   : Item("This is the file 'rho'.\n"),
-      dest_name + '/D/G/tau'   : Item("This is the file 'tau'.\n"),
-      dest_name + '/D/H'       : Item(),
-      dest_name + '/D/H/chi'   : Item("This is the file 'chi'.\n"),
-      dest_name + '/D/H/omega' : Item("This is the file 'omega'.\n"),
-      dest_name + '/D/H/psi'   : Item("This is the file 'psi'.\n"),
-      })
-
-    # Make a branch A_COPY to merge into.
-    svntest.actions.run_and_verify_svn(None, expected, [], 'copy',
-                                       sbox.repo_url + "/A",
-                                       os.path.join(wc_dir,
-                                                    dest_name))
-
-    expected_output = wc.State(wc_dir, {dest_name : Item(verb='Adding')})
-    svntest.actions.run_and_verify_commit(wc_dir,
-                                          expected_output,
-                                          expected_status,
-                                          None,
-                                          wc_dir)
-  for i in range(nbr_of_branches):
-    if i == 0:
-      copy_A('A_COPY', i + 2)
-    else:
-      copy_A('A_COPY_' + str(i + 1), i + 2)
-
-  if branch_only:
-    return expected_disk, expected_status
-
-  # Make some changes under A which we'll later merge under A_COPY:
-
-  # r(nbr_of_branches + 2) - modify and commit A/D/H/psi
-  svntest.main.file_write(sbox.ospath('A/D/H/psi'),
-                          "New content")
-  expected_output = wc.State(wc_dir, {'A/D/H/psi' : Item(verb='Sending')})
-  expected_status.tweak('A/D/H/psi', wc_rev=nbr_of_branches + 2)
-  svntest.actions.run_and_verify_commit(wc_dir, expected_output,
-                                        expected_status, None, wc_dir)
-  expected_disk.tweak('A/D/H/psi', contents="New content")
-
-  # r(nbr_of_branches + 3) - modify and commit A/D/G/rho
-  svntest.main.file_write(sbox.ospath('A/D/G/rho'),
-                          "New content")
-  expected_output = wc.State(wc_dir, {'A/D/G/rho' : Item(verb='Sending')})
-  expected_status.tweak('A/D/G/rho', wc_rev=nbr_of_branches + 3)
-  svntest.actions.run_and_verify_commit(wc_dir, expected_output,
-                                        expected_status, None, wc_dir)
-  expected_disk.tweak('A/D/G/rho', contents="New content")
-
-  # r(nbr_of_branches + 4) - modify and commit A/B/E/beta
-  svntest.main.file_write(sbox.ospath('A/B/E/beta'),
-                          "New content")
-  expected_output = wc.State(wc_dir, {'A/B/E/beta' : Item(verb='Sending')})
-  expected_status.tweak('A/B/E/beta', wc_rev=nbr_of_branches + 4)
-  svntest.actions.run_and_verify_commit(wc_dir, expected_output,
-                                        expected_status, None, wc_dir)
-  expected_disk.tweak('A/B/E/beta', contents="New content")
-
-  # r(nbr_of_branches + 5) - modify and commit A/D/H/omega
-  svntest.main.file_write(sbox.ospath('A/D/H/omega'),
-                          "New content")
-  expected_output = wc.State(wc_dir, {'A/D/H/omega' : Item(verb='Sending')})
-  expected_status.tweak('A/D/H/omega', wc_rev=nbr_of_branches + 5)
-  svntest.actions.run_and_verify_commit(wc_dir, expected_output,
-                                        expected_status, None, wc_dir)
-  expected_disk.tweak('A/D/H/omega', contents="New content")
-
-  return expected_disk, expected_status
-
-#----------------------------------------------------------------------
 @SkipUnless(server_has_mergeinfo)
 @Issues(2733,2734)
 def mergeinfo_inheritance(sbox):
@@ -10535,7 +10205,7 @@ def merge_range_predates_history(sbox):
 
   # Tweak a file and commit. (r2)
   svntest.main.file_append(iota_path, "More data.\n")
-  svntest.main.run_svn(None, 'ci', '-m', 'tweak iota', wc_dir)
+  sbox.simple_commit(message='tweak iota')
 
   # Create our trunk and branches directory, and update working copy. (r3)
   svntest.main.run_svn(None, 'mkdir', trunk_url, branches_url,
@@ -10545,7 +10215,7 @@ def merge_range_predates_history(sbox):
   # Add a file to the trunk and commit. (r4)
   svntest.main.file_append(trunk_file_path, "This is the file 'file'.\n")
   svntest.main.run_svn(None, 'add', trunk_file_path)
-  svntest.main.run_svn(None, 'ci', '-m', 'add trunk file', wc_dir)
+  sbox.simple_commit(message='add trunk file')
 
   # Branch trunk from r3, and update working copy. (r5)
   svntest.main.run_svn(None, 'cp', trunk_url, branch_url, '-r3',
@@ -10659,7 +10329,7 @@ def foreign_repos(sbox):
 
   ### TODO: Use run_and_verify_merge() ###
   svntest.main.run_svn(None, 'merge', '-c2', sbox.repo_url, wc_dir2)
-  svntest.main.run_svn(None, 'ci', '-m', 'Merge from foreign repos', wc_dir2)
+  sbox2.simple_commit(message='Merge from foreign repo')
   svntest.actions.verify_disk(wc_dir2, expected_disk, True)
 
   # Now, let's make a third checkout -- our second from the original
@@ -10721,7 +10391,7 @@ def foreign_repos_uuid(sbox):
   svntest.actions.verify_disk(wc_dir, expected_disk, True)
 
   svntest.main.run_svn(None, 'merge', '-c2', sbox.repo_url, wc_dir2)
-  svntest.main.run_svn(None, 'ci', '-m', 'Merge from foreign repos', wc_dir2)
+  sbox2.simple_commit(message='Merge from foreign repos')
 
   # Run info to check the copied rev to make sure it's right
   zeta2_path = os.path.join(wc_dir2, 'A', 'D', 'G', 'zeta')
@@ -10843,7 +10513,7 @@ def foreign_repos_2_url(sbox):
   svntest.main.run_svn(None, 'merge', sbox.repo_url + '/A-tag1',
                        sbox.repo_url + '/A-tag2',
                        os.path.join(wc_dir2, 'A'))
-  svntest.main.run_svn(None, 'ci', '-m', 'Merge from foreign repos', wc_dir2)
+  sbox2.simple_commit(message='Merge from foreign repos')
   svntest.actions.verify_disk(wc_dir2, expected_disk, True)
 
 #----------------------------------------------------------------------
@@ -12527,84 +12197,6 @@ def commit_to_subtree_added_by_merge(sbo
 
 
 #----------------------------------------------------------------------
-# Helper functions. These take local paths using '/' separators.
-
-def local_path(path):
-  "Convert a path from '/' separators to the local style."
-  return os.sep.join(path.split('/'))
-
-def svn_mkfile(path):
-  "Make and add a file with some default content, and keyword expansion."
-  path = local_path(path)
-  dirname, filename = os.path.split(path)
-  svntest.main.file_write(path, "This is the file '" + filename + "'.\n" +
-                                "Last changed in '$Revision$'.\n")
-  svntest.actions.run_and_verify_svn(None, None, [], 'add', path)
-  svntest.actions.run_and_verify_svn(None, None, [], 'propset',
-                                     'svn:keywords', 'Revision', path)
-
-def svn_modfile(path):
-  "Make text and property mods to a WC file."
-  path = local_path(path)
-  svntest.main.file_append(path, "An extra line.\n")
-  svntest.actions.run_and_verify_svn(None, None, [], 'propset',
-                                     'newprop', 'v', path)
-
-def svn_copy(s_rev, path1, path2):
-  "Copy a WC path locally."
-  path1 = local_path(path1)
-  path2 = local_path(path2)
-  svntest.actions.run_and_verify_svn(None, None, [], 'copy', '--parents',
-                                     '-r', s_rev, path1, path2)
-
-def svn_merge(rev_range, source, target, lines=None, elides=[],
-              text_conflicts=0, prop_conflicts=0, tree_conflicts=0,
-              text_resolved=0, prop_resolved=0, tree_resolved=0,
-              args=[]):
-  """Merge a single change from path SOURCE to path TARGET and verify the
-  output and that there is no error.  (The changes made are not verified.)
-
-  REV_RANGE is either a number (to cherry-pick that specific change) or a
-  two-element list [X,Y] to pick the revision range '-r(X-1):Y'.
-
-  LINES is a list of regular expressions to match other lines of output; if
-  LINES is 'None' then match all normal (non-conflicting) merges.
-
-  ELIDES is a list of paths on which mergeinfo elision should be reported.
-
-  TEXT_CONFLICTS, PROP_CONFLICTS and TREE_CONFLICTS specify the number of
-  each kind of conflict to expect.
-
-  ARGS are additional arguments passed to svn merge.
-  """
-
-  source = local_path(source)
-  target = local_path(target)
-  elides = [local_path(p) for p in elides]
-  if isinstance(rev_range, int):
-    mi_rev_range = [rev_range]
-    rev_arg = '-c' + str(rev_range)
-  else:
-    mi_rev_range = rev_range
-    rev_arg = '-r' + str(rev_range[0] - 1) + ':' + str(rev_range[1])
-  if lines is None:
-    lines = ["(A |D |[UG] | [UG]|[UG][UG])   " + target + ".*\n"]
-  else:
-    # Expect mergeinfo on the target; caller must supply matches for any
-    # subtree mergeinfo paths.
-    lines.append(" [UG]   " + target + "\n")
-  exp_out = expected_merge_output([mi_rev_range], lines, target=target,
-                                  elides=elides,
-                                  text_conflicts=text_conflicts,
-                                  prop_conflicts=prop_conflicts,
-                                  tree_conflicts=tree_conflicts,
-                                  text_resolved=text_resolved,
-                                  prop_resolved=prop_resolved,
-                                  tree_resolved=tree_resolved)
-  svntest.actions.run_and_verify_svn(None, exp_out, [],
-                                     'merge', rev_arg, source, target, *args)
-
-#----------------------------------------------------------------------
 # Tests for merging the deletion of a node, where the node to be deleted
 # is the same as or different from the node that was deleted.
 
@@ -14913,17 +14505,17 @@ def copy_then_replace_via_merge(sbox):
   main.file_append(AJK_zeta, 'new text')
   main.file_append(AJL_zeta, 'new text')
   main.run_svn(None, 'add', AJ)
-  main.run_svn(None, 'ci', wc_dir, '-m', 'create tree J') # r3
+  sbox.simple_commit(message='create tree J') # r3
   main.run_svn(None, 'up', wc_dir)
 
   # Copy J to the branch via merge
   main.run_svn(None, 'merge', url_A, branch)
-  main.run_svn(None, 'ci', wc_dir, '-m', 'merge to branch') # r4
+  sbox.simple_commit(message='merge to branch') # r4
   main.run_svn(None, 'up', wc_dir)
 
   # In A, replace J with a slightly different tree
   main.run_svn(None, 'rm', AJ)
-  main.run_svn(None, 'ci', wc_dir, '-m', 'rm AJ') # r5
+  sbox.simple_commit(message='rm AJ') # r5
   main.run_svn(None, 'up', wc_dir)
 
   os.makedirs(AJL)
@@ -14933,7 +14525,7 @@ def copy_then_replace_via_merge(sbox):
   main.file_append(AJL_zeta, 'really new text')
   main.file_append(AJM_zeta, 'really new text')
   main.run_svn(None, 'add', AJ)
-  main.run_svn(None, 'ci', wc_dir, '-m', 'create tree J again') # r6
+  sbox.simple_commit(message='create tree J again') # r6
   main.run_svn(None, 'up', wc_dir)
 
   # Run merge to replace /branch/J in one swell foop.
@@ -17212,62 +16804,6 @@ def record_only_merge_adds_new_subtree_m
                                        None, None, None, None,
                                        None, 1, False)
 
-#----------------------------------------------------------------------
-# Setup helper for issue #4056 and issue #4057 tests.
-def noninheritable_mergeinfo_test_set_up(sbox):
-  '''Starting with standard greek tree, copy 'A' to 'branch' in r2 and
-  then made a file edit to A/B/lambda in r3.
-  Return (expected_output, expected_mergeinfo_output, expected_elision_output,
-          expected_status, expected_disk, expected_skip) for a merge of
-  r3 from ^/A/B to branch/B.'''
-
-  sbox.build()
-  wc_dir = sbox.wc_dir
-
-  lambda_path   = sbox.ospath('A/B/lambda')
-  B_branch_path = sbox.ospath('branch/B')
-
-  # r2 - Branch ^/A to ^/branch.
-  svntest.main.run_svn(None, 'copy', sbox.repo_url + '/A',
-                       sbox.repo_url + '/branch', '-m', 'make a branch')
-
-  # r3 - Make an edit to A/B/lambda.
-  svntest.main.file_write(lambda_path, "trunk edit.\n")
-  svntest.main.run_svn(None, 'commit', '-m', 'file edit', wc_dir)
-  svntest.main.run_svn(None, 'up', wc_dir)
-
-  expected_output = wc.State(B_branch_path, {
-    'lambda' : Item(status='U '),
-    })
-  expected_mergeinfo_output = wc.State(B_branch_path, {
-    ''       : Item(status=' U'),
-    'lambda' : Item(status=' U'),
-    })
-  expected_elision_output = wc.State(B_branch_path, {
-    'lambda' : Item(status=' U'),
-    })
-  expected_status = wc.State(B_branch_path, {
-    ''        : Item(status=' M'),
-    'lambda'  : Item(status='M '),
-    'E'       : Item(status='  '),
-    'E/alpha' : Item(status='  '),
-    'E/beta'  : Item(status='  '),
-    'F'       : Item(status='  '),
-    })
-  expected_status.tweak(wc_rev='3')
-  expected_disk = wc.State('', {
-    ''          : Item(props={SVN_PROP_MERGEINFO : '/A/B:3'}),
-    'lambda'  : Item("trunk edit.\n"),
-    'E'       : Item(),
-    'E/alpha' : Item("This is the file 'alpha'.\n"),
-    'E/beta'  : Item("This is the file 'beta'.\n"),
-    'F'       : Item(),
-    })
-  expected_skip = wc.State(B_branch_path, {})
-
-  return expected_output, expected_mergeinfo_output, expected_elision_output, \
-    expected_status, expected_disk, expected_skip
-
 
 #----------------------------------------------------------------------
 # Test for issue #4056 "don't record non-inheritable mergeinfo if missing
@@ -17508,12 +17044,11 @@ def merge_source_with_replacement(sbox):
   svntest.main.run_svn(None, 'up', wc_dir)
   svntest.main.run_svn(None, 'del', A_path)
   svntest.main.run_svn(None, 'copy', sbox.repo_url + '/A@5', A_path)
-  svntest.main.run_svn(None, 'ci', '-m',
-                       'Replace A with older version of itself', wc_dir)
+  sbox.simple_commit(message='Replace A with older version of itself')
 
   # r8: Make an edit to A/D/H/omega:
   svntest.main.file_write(omega_path, "New content for 'omega'.\n")
-  svntest.main.run_svn(None, 'ci', '-m', 'file edit', wc_dir)
+  sbox.simple_commit(message='file edit')
 
   # Update and sync merge ^/A to A_COPY.
   #
@@ -17616,7 +17151,7 @@ def reverse_merge_with_rename(sbox):
 
   # r8 - Make and edit to trunk/D/H/omega (which was also edited in r6).
   svntest.main.file_write(omega_path, "Edit 'omega' on trunk.\n")
-  svntest.main.run_svn(None, 'ci', '-m', 'Another omega edit', wc_dir)
+  sbox.simple_commit(message='Another omega edit')
 
   # r9 - Sync merge ^/trunk to A_COPY.
   svntest.actions.run_and_verify_svn(None,
@@ -17624,7 +17159,7 @@ def reverse_merge_with_rename(sbox):
                                            # type of merge to death elsewhere.
                                      [], 'merge', sbox.repo_url + '/trunk',
                                      A_COPY_path)
-  svntest.main.run_svn(None, 'ci', '-m', 'Sync A_COPY with ^/trunk', wc_dir)
+  sbox.simple_commit(message='Sync A_COPY with ^/trunk')
   svntest.actions.run_and_verify_svn(None, None, [], 'up', wc_dir)
 
   # Reverse merge -r9:1 from ^/trunk to A_COPY.  This should return