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, ©_path,
©_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