Modified: subversion/branches/wc-collate-path/subversion/tests/libsvn_delta/range-index-test.h URL: http://svn.apache.org/viewvc/subversion/branches/wc-collate-path/subversion/tests/libsvn_delta/range-index-test.h?rev=1479901&r1=1479900&r2=1479901&view=diff ============================================================================== --- subversion/branches/wc-collate-path/subversion/tests/libsvn_delta/range-index-test.h (original) +++ subversion/branches/wc-collate-path/subversion/tests/libsvn_delta/range-index-test.h Tue May 7 13:26:25 2013 @@ -27,7 +27,7 @@ #include "../../libsvn_delta/compose_delta.c" static range_index_node_t *prev_node, *prev_prev_node; -static apr_off_t +static apr_size_t walk_range_index(range_index_node_t *node, const char **msg) { apr_off_t ret; @@ -70,19 +70,18 @@ print_node_data(range_index_node_t *node { if (-node->target_offset == ndx) { - printf(" * Node: [%3"APR_OFF_T_FMT - ",%3"APR_OFF_T_FMT - ") = %-5"APR_OFF_T_FMT"%s\n", + printf(" * Node: [%3"APR_SIZE_T_FMT + ",%3"APR_SIZE_T_FMT + ") = %-5"APR_SIZE_T_FMT"%s\n", node->offset, node->limit, -node->target_offset, msg); } else { - printf(" Node: [%3"APR_OFF_T_FMT - ",%3"APR_OFF_T_FMT - ") = %"APR_OFF_T_FMT"\n", + printf(" Node: [%3"APR_SIZE_T_FMT + ",%3"APR_SIZE_T_FMT + ") = %"APR_SIZE_T_FMT"\n", node->offset, node->limit, - (node->target_offset < 0 - ? -node->target_offset : node->target_offset)); + node->target_offset); } } @@ -154,13 +153,13 @@ random_range_index_test(apr_pool_t *pool ndx = create_range_index(pool); for (i = 1; i <= iterations; ++i) { - apr_off_t offset = svn_test_rand(&seed) % 47; - apr_off_t limit = offset + svn_test_rand(&seed) % 16 + 1; + apr_size_t offset = svn_test_rand(&seed) % 47; + apr_size_t limit = offset + svn_test_rand(&seed) % 16 + 1; range_list_node_t *list, *r; - apr_off_t ret; + apr_size_t ret; const char *msg2; - printf("%3d: Inserting [%3"APR_OFF_T_FMT",%3"APR_OFF_T_FMT") ...", + printf("%3d: Inserting [%3"APR_SIZE_T_FMT",%3"APR_SIZE_T_FMT") ...", i, offset, limit); splay_range_index(offset, ndx); list = build_range_list(offset, limit, ndx); @@ -170,7 +169,7 @@ random_range_index_test(apr_pool_t *pool if (ret == 0) { for (r = list; r; r = r->next) - printf(" %s[%3"APR_OFF_T_FMT",%3"APR_OFF_T_FMT")", + printf(" %s[%3"APR_SIZE_T_FMT",%3"APR_SIZE_T_FMT")", (r->kind == range_from_source ? (++src_cp, "S") : (++tgt_cp, "T")), r->offset, r->limit);
Modified: subversion/branches/wc-collate-path/subversion/tests/libsvn_fs/fs-test.c URL: http://svn.apache.org/viewvc/subversion/branches/wc-collate-path/subversion/tests/libsvn_fs/fs-test.c?rev=1479901&r1=1479900&r2=1479901&view=diff ============================================================================== --- subversion/branches/wc-collate-path/subversion/tests/libsvn_fs/fs-test.c (original) +++ subversion/branches/wc-collate-path/subversion/tests/libsvn_fs/fs-test.c Tue May 7 13:26:25 2013 @@ -2074,7 +2074,7 @@ copy_test(const svn_test_opts_t *opts, svn_revnum_t after_rev; /* Prepare a filesystem. */ - SVN_ERR(svn_test__create_fs(&fs, "test-repo-copy-test", + SVN_ERR(svn_test__create_fs(&fs, "test-repo-copy", opts, pool)); /* In first txn, create and commit the greek tree. */ @@ -4237,7 +4237,7 @@ branch_test(const svn_test_opts_t *opts, svn_revnum_t youngest_rev = 0; /* Create a filesystem and repository. */ - SVN_ERR(svn_test__create_fs(&fs, "test-repo-branch-test", + SVN_ERR(svn_test__create_fs(&fs, "test-repo-branch", opts, pool)); /*** Revision 1: Create the greek tree in revision. ***/ @@ -4984,7 +4984,6 @@ filename_trailing_newline(const svn_test return SVN_NO_ERROR; } -#ifdef SVN_FS_INFO static svn_error_t * test_fs_info_format(const svn_test_opts_t *opts, apr_pool_t *pool) @@ -5005,7 +5004,6 @@ test_fs_info_format(const svn_test_opts_ return SVN_NO_ERROR; } -#endif /* ------------------------------------------------------------------------ */ @@ -5089,9 +5087,7 @@ struct svn_test_descriptor_t test_funcs[ "test svn_fs_delete_fs"), SVN_TEST_OPTS_PASS(filename_trailing_newline, "filenames with trailing \\n might be rejected"), -#ifdef SVN_FS_INFO SVN_TEST_OPTS_PASS(test_fs_info_format, "test svn_fs_info_format"), -#endif SVN_TEST_NULL }; Modified: subversion/branches/wc-collate-path/subversion/tests/libsvn_fs_fs/fs-pack-test.c URL: http://svn.apache.org/viewvc/subversion/branches/wc-collate-path/subversion/tests/libsvn_fs_fs/fs-pack-test.c?rev=1479901&r1=1479900&r2=1479901&view=diff ============================================================================== --- subversion/branches/wc-collate-path/subversion/tests/libsvn_fs_fs/fs-pack-test.c (original) +++ subversion/branches/wc-collate-path/subversion/tests/libsvn_fs_fs/fs-pack-test.c Tue May 7 13:26:25 2013 @@ -788,6 +788,50 @@ file_hint_at_shard_boundary(const svn_te #undef SHARD_SIZE /* ------------------------------------------------------------------------ */ +#define REPO_NAME "test-repo-fsfs-info" +#define SHARD_SIZE 3 +#define MAX_REV 5 +static svn_error_t * +test_info(const svn_test_opts_t *opts, + apr_pool_t *pool) +{ + svn_fs_t *fs; + const svn_fs_fsfs_info_t *fsfs_info; + const svn_fs_info_placeholder_t *info; + + SVN_ERR(create_packed_filesystem(REPO_NAME, opts, MAX_REV, SHARD_SIZE, + pool)); + + SVN_ERR(svn_fs_open(&fs, REPO_NAME, NULL, pool)); + SVN_ERR(svn_fs_info(&info, fs, pool, pool)); + info = svn_fs_info_dup(info, pool, pool); + + SVN_TEST_STRING_ASSERT(opts->fs_type, info->fs_type); + + /* Bail (with success) on known-untestable scenarios */ + if (strcmp(opts->fs_type, "fsfs") != 0) + return SVN_NO_ERROR; + + fsfs_info = (const void *)info; + if (opts->server_minor_version && (opts->server_minor_version < 6)) + { + SVN_TEST_ASSERT(fsfs_info->shard_size == 0); + SVN_TEST_ASSERT(fsfs_info->min_unpacked_rev == 0); + } + else + { + SVN_TEST_ASSERT(fsfs_info->shard_size == SHARD_SIZE); + SVN_TEST_ASSERT(fsfs_info->min_unpacked_rev + == (MAX_REV + 1) / SHARD_SIZE * SHARD_SIZE); + } + + return SVN_NO_ERROR; +} +#undef REPO_NAME +#undef SHARD_SIZE +#undef MAX_REV + +/* ------------------------------------------------------------------------ */ /* The test table. */ @@ -812,5 +856,7 @@ struct svn_test_descriptor_t test_funcs[ "recover a fully packed filesystem"), SVN_TEST_OPTS_PASS(file_hint_at_shard_boundary, "test file hint at shard boundary"), + SVN_TEST_OPTS_PASS(test_info, + "test svn_fs_info"), SVN_TEST_NULL }; Modified: subversion/branches/wc-collate-path/subversion/tests/libsvn_repos/repos-test.c URL: http://svn.apache.org/viewvc/subversion/branches/wc-collate-path/subversion/tests/libsvn_repos/repos-test.c?rev=1479901&r1=1479900&r2=1479901&view=diff ============================================================================== --- subversion/branches/wc-collate-path/subversion/tests/libsvn_repos/repos-test.c (original) +++ subversion/branches/wc-collate-path/subversion/tests/libsvn_repos/repos-test.c Tue May 7 13:26:25 2013 @@ -3259,7 +3259,6 @@ filename_with_control_chars(const svn_te return SVN_NO_ERROR; } -#ifdef SVN_FS_INFO static svn_error_t * test_repos_info(const svn_test_opts_t *opts, apr_pool_t *pool) @@ -3297,7 +3296,6 @@ test_repos_info(const svn_test_opts_t *o return SVN_NO_ERROR; } -#endif /* The test table. */ @@ -3345,9 +3343,7 @@ struct svn_test_descriptor_t test_funcs[ "test svn_repos_delete"), SVN_TEST_OPTS_PASS(filename_with_control_chars, "test filenames with control characters"), -#ifdef SVN_FS_INFO SVN_TEST_OPTS_PASS(test_repos_info, "test svn_repos_info_*"), -#endif SVN_TEST_NULL }; Modified: subversion/branches/wc-collate-path/subversion/tests/libsvn_subr/cache-test.c URL: http://svn.apache.org/viewvc/subversion/branches/wc-collate-path/subversion/tests/libsvn_subr/cache-test.c?rev=1479901&r1=1479900&r2=1479901&view=diff ============================================================================== --- subversion/branches/wc-collate-path/subversion/tests/libsvn_subr/cache-test.c (original) +++ subversion/branches/wc-collate-path/subversion/tests/libsvn_subr/cache-test.c Tue May 7 13:26:25 2013 @@ -155,8 +155,8 @@ test_memcache_basic(const svn_test_opts_ if (opts->config_file) { - SVN_ERR(svn_config_read2(&config, opts->config_file, - TRUE, FALSE, pool)); + SVN_ERR(svn_config_read3(&config, opts->config_file, + TRUE, FALSE, FALSE, pool)); SVN_ERR(svn_cache__make_memcache_from_config(&memcache, config, pool)); } @@ -223,8 +223,8 @@ test_memcache_long_key(const svn_test_op if (opts->config_file) { - SVN_ERR(svn_config_read2(&config, opts->config_file, - TRUE, FALSE, pool)); + SVN_ERR(svn_config_read3(&config, opts->config_file, + TRUE, FALSE, FALSE, pool)); SVN_ERR(svn_cache__make_memcache_from_config(&memcache, config, pool)); } Modified: subversion/branches/wc-collate-path/subversion/tests/libsvn_subr/config-test.c URL: http://svn.apache.org/viewvc/subversion/branches/wc-collate-path/subversion/tests/libsvn_subr/config-test.c?rev=1479901&r1=1479900&r2=1479901&view=diff ============================================================================== --- subversion/branches/wc-collate-path/subversion/tests/libsvn_subr/config-test.c (original) +++ subversion/branches/wc-collate-path/subversion/tests/libsvn_subr/config-test.c Tue May 7 13:26:25 2013 @@ -109,7 +109,7 @@ test_text_retrieval(apr_pool_t *pool) SVN_ERR(init_params(pool)); cfg_file = apr_pstrcat(pool, srcdir, "/", "config-test.cfg", (char *)NULL); - SVN_ERR(svn_config_read2(&cfg, cfg_file, TRUE, FALSE, pool)); + SVN_ERR(svn_config_read3(&cfg, cfg_file, TRUE, FALSE, FALSE, pool)); /* Test values retrieved from our ConfigParser instance against values retrieved using svn_config. */ @@ -160,7 +160,7 @@ test_boolean_retrieval(apr_pool_t *pool) SVN_ERR(init_params(pool)); cfg_file = apr_pstrcat(pool, srcdir, "/", "config-test.cfg", (char *)NULL); - SVN_ERR(svn_config_read2(&cfg, cfg_file, TRUE, FALSE, pool)); + SVN_ERR(svn_config_read3(&cfg, cfg_file, TRUE, FALSE, FALSE, pool)); for (i = 0; true_keys[i] != NULL; i++) { @@ -220,7 +220,7 @@ test_has_section_case_insensitive(apr_po SVN_ERR(init_params(pool)); cfg_file = apr_pstrcat(pool, srcdir, "/", "config-test.cfg", (char *)NULL); - SVN_ERR(svn_config_read2(&cfg, cfg_file, TRUE, FALSE, pool)); + SVN_ERR(svn_config_read3(&cfg, cfg_file, TRUE, FALSE, FALSE, pool)); if (! svn_config_has_section(cfg, "section1")) return fail(pool, "Failed to find section1"); @@ -250,7 +250,7 @@ test_has_section_case_sensitive(apr_pool SVN_ERR(init_params(pool)); cfg_file = apr_pstrcat(pool, srcdir, "/", "config-test.cfg", (char *)NULL); - SVN_ERR(svn_config_read2(&cfg, cfg_file, TRUE, TRUE, pool)); + SVN_ERR(svn_config_read3(&cfg, cfg_file, TRUE, TRUE, FALSE, pool)); if (! svn_config_has_section(cfg, "section1")) return fail(pool, "Failed to find section1"); @@ -271,6 +271,48 @@ test_has_section_case_sensitive(apr_pool } static svn_error_t * +test_has_option_case_sensitive(apr_pool_t *pool) +{ + svn_config_t *cfg; + const char *cfg_file; + apr_int64_t value; + int i; + + static struct test_dataset { + const char *option; + apr_int64_t value; + } const test_data[] = { + { "a", 1 }, + { "A", 2 }, + { "B", 3 }, + { "b", 4 } + }; + static const int test_data_size = sizeof(test_data)/sizeof(*test_data); + + if (!srcdir) + SVN_ERR(init_params(pool)); + + cfg_file = apr_pstrcat(pool, srcdir, "/", "config-test.cfg", (char *)NULL); + SVN_ERR(svn_config_read3(&cfg, cfg_file, TRUE, TRUE, TRUE, pool)); + + for (i = 0; i < test_data_size; ++i) + { + SVN_ERR(svn_config_get_int64(cfg, &value, "case-sensitive-option", + test_data[i].option, -1)); + if (test_data[i].value != value) + return fail(pool, + apr_psprintf(pool, + "case-sensitive-option.%s != %" + APR_INT64_T_FMT" but %"APR_INT64_T_FMT, + test_data[i].option, + test_data[i].value, + value)); + } + + return SVN_NO_ERROR; +} + +static svn_error_t * test_stream_interface(apr_pool_t *pool) { svn_config_t *cfg; @@ -283,7 +325,7 @@ test_stream_interface(apr_pool_t *pool) cfg_file = apr_pstrcat(pool, srcdir, "/", "config-test.cfg", (char *)NULL); SVN_ERR(svn_stream_open_readonly(&stream, cfg_file, pool, pool)); - SVN_ERR(svn_config_parse(&cfg, stream, TRUE, pool)); + SVN_ERR(svn_config_parse(&cfg, stream, TRUE, TRUE, pool)); /* nominal test to make sure cfg is populated with something since * svn_config_parse will happily return an empty cfg if the stream is @@ -313,6 +355,8 @@ struct svn_test_descriptor_t test_funcs[ "test svn_config_has_section (case insensitive)"), SVN_TEST_PASS2(test_has_section_case_sensitive, "test svn_config_has_section (case sensitive)"), + SVN_TEST_PASS2(test_has_option_case_sensitive, + "test case-sensitive option name lookup"), SVN_TEST_PASS2(test_stream_interface, "test svn_config_parse"), SVN_TEST_NULL Modified: subversion/branches/wc-collate-path/subversion/tests/libsvn_subr/config-test.cfg URL: http://svn.apache.org/viewvc/subversion/branches/wc-collate-path/subversion/tests/libsvn_subr/config-test.cfg?rev=1479901&r1=1479900&r2=1479901&view=diff ============================================================================== --- subversion/branches/wc-collate-path/subversion/tests/libsvn_subr/config-test.cfg (original) +++ subversion/branches/wc-collate-path/subversion/tests/libsvn_subr/config-test.cfg Tue May 7 13:26:25 2013 @@ -55,3 +55,9 @@ false2 = no false3 = oFf false4 = 0 bad_false = nyet! + +[case-sensitive-option] +a = 1 +A = 2 +B = 3 +b = 4 Modified: subversion/branches/wc-collate-path/subversion/tests/libsvn_wc/conflict-data-test.c URL: http://svn.apache.org/viewvc/subversion/branches/wc-collate-path/subversion/tests/libsvn_wc/conflict-data-test.c?rev=1479901&r1=1479900&r2=1479901&view=diff ============================================================================== --- subversion/branches/wc-collate-path/subversion/tests/libsvn_wc/conflict-data-test.c (original) +++ subversion/branches/wc-collate-path/subversion/tests/libsvn_wc/conflict-data-test.c Tue May 7 13:26:25 2013 @@ -28,6 +28,7 @@ #include <apr_hash.h> #include <apr_tables.h> +#include "svn_props.h" #include "svn_pools.h" #include "svn_hash.h" #include "svn_types.h" @@ -54,42 +55,128 @@ fail(apr_pool_t *pool, const char *fmt, return svn_error_create(SVN_ERR_TEST_FAILED, 0, msg); } -/* Raise a test error if EXPECTED and ACTUAL differ. */ +/* Assert that two integers are equal. Return an error if not. */ +#define ASSERT_INT_EQ(a, b) \ + do { \ + if ((a) != (b)) \ + return svn_error_createf(SVN_ERR_TEST_FAILED, NULL, \ + "failed: ASSERT_INT_EQ(" #a ", " #b ") " \ + "-> (%d == %d)", a, b); \ + } while (0) + +/* Assert that two strings are equal or both null. Return an error if not. */ +#define ASSERT_STR_EQ(a, b) \ + SVN_TEST_STRING_ASSERT(a, b) + +/* Assert that two version_t's are equal or both null. Return an error if not. */ +static svn_error_t * +compare_version(const svn_wc_conflict_version_t *actual, + const svn_wc_conflict_version_t *expected) +{ + if (actual == NULL && expected == NULL) + return SVN_NO_ERROR; + + SVN_TEST_ASSERT(actual && expected); + ASSERT_STR_EQ(actual->repos_url, expected->repos_url); + ASSERT_INT_EQ((int)actual->peg_rev, (int)expected->peg_rev); + ASSERT_STR_EQ(actual->path_in_repos, expected->path_in_repos); + ASSERT_INT_EQ(actual->node_kind, expected->node_kind); + return SVN_NO_ERROR; +} + +/* Assert that two conflict descriptions contain exactly the same data + * (including names of temporary files), or are both NULL. Return an + * error if not. */ +static svn_error_t * +compare_conflict(const svn_wc_conflict_description2_t *actual, + const svn_wc_conflict_description2_t *expected) +{ + if (actual == NULL && expected == NULL) + return SVN_NO_ERROR; + + SVN_TEST_ASSERT(actual && expected); + + ASSERT_INT_EQ(actual->kind, expected->kind); + ASSERT_STR_EQ(actual->local_abspath, expected->local_abspath); + ASSERT_INT_EQ(actual->node_kind, expected->node_kind); + ASSERT_STR_EQ(actual->property_name, expected->property_name); + ASSERT_INT_EQ(actual->is_binary, expected->is_binary); + ASSERT_STR_EQ(actual->mime_type, expected->mime_type); + ASSERT_INT_EQ(actual->action, expected->action); + ASSERT_INT_EQ(actual->reason, expected->reason); + ASSERT_STR_EQ(actual->base_abspath, expected->base_abspath); + ASSERT_STR_EQ(actual->their_abspath, expected->their_abspath); + ASSERT_STR_EQ(actual->my_abspath, expected->my_abspath); + ASSERT_STR_EQ(actual->merged_file, expected->merged_file); + ASSERT_INT_EQ(actual->operation, expected->operation); + SVN_ERR(compare_version(actual->src_left_version, + expected->src_left_version)); + SVN_ERR(compare_version(actual->src_right_version, + expected->src_right_version)); + return SVN_NO_ERROR; +} + +/* Assert that a file contains the expected data. Return an + * error if not. */ static svn_error_t * -compare_version(const svn_wc_conflict_version_t *expected, - const svn_wc_conflict_version_t *actual) +compare_file_content(const char *file_abspath, + const char *expected_val, + apr_pool_t *scratch_pool) { - SVN_TEST_STRING_ASSERT(expected->repos_url, actual->repos_url); - SVN_TEST_ASSERT(expected->peg_rev == actual->peg_rev); - SVN_TEST_STRING_ASSERT(expected->path_in_repos, actual->path_in_repos); - SVN_TEST_ASSERT(expected->node_kind == actual->node_kind); + svn_stringbuf_t *actual_val; + + SVN_ERR(svn_stringbuf_from_file2(&actual_val, file_abspath, scratch_pool)); + ASSERT_STR_EQ(actual_val->data, expected_val); return SVN_NO_ERROR; } -/* Raise a test error if EXPECTED and ACTUAL differ or if ACTUAL is NULL. */ -static svn_error_t * -compare_conflict(const svn_wc_conflict_description2_t *expected, - const svn_wc_conflict_description2_t *actual) -{ - SVN_TEST_ASSERT(actual != NULL); - - SVN_TEST_STRING_ASSERT(expected->local_abspath, actual->local_abspath); - SVN_TEST_ASSERT(expected->node_kind == actual->node_kind); - SVN_TEST_ASSERT(expected->kind == actual->kind); - SVN_TEST_STRING_ASSERT(expected->property_name, actual->property_name); - SVN_TEST_ASSERT(expected->is_binary == actual->is_binary); - SVN_TEST_STRING_ASSERT(expected->mime_type, actual->mime_type); - SVN_TEST_ASSERT(expected->action == actual->action); - SVN_TEST_ASSERT(expected->reason == actual->reason); - SVN_TEST_STRING_ASSERT(expected->base_abspath, actual->base_abspath); - SVN_TEST_STRING_ASSERT(expected->their_abspath, actual->their_abspath); - SVN_TEST_STRING_ASSERT(expected->my_abspath, actual->my_abspath); - SVN_TEST_STRING_ASSERT(expected->merged_file, actual->merged_file); - SVN_TEST_ASSERT(expected->operation == actual->operation); - SVN_ERR(compare_version(expected->src_left_version, - actual->src_left_version)); - SVN_ERR(compare_version(expected->src_right_version, - actual->src_right_version)); +/* Assert that ACTUAL and EXPECTED both represent the same property + * conflict, or are both NULL. Return an error if not. + * + * Compare the property values found in files named by + * ACTUAL->base_abspath, ACTUAL->my_abspath, ACTUAL->merged_abspath + * with EXPECTED_BASE_VAL, EXPECTED_MY_VAL, EXPECTED_THEIR_VAL + * respectively, ignoring the corresponding fields in EXPECTED. */ +static svn_error_t * +compare_prop_conflict(const svn_wc_conflict_description2_t *actual, + const svn_wc_conflict_description2_t *expected, + const char *expected_base_val, + const char *expected_my_val, + const char *expected_their_val, + apr_pool_t *scratch_pool) +{ + if (actual == NULL && expected == NULL) + return SVN_NO_ERROR; + + SVN_TEST_ASSERT(actual && expected); + ASSERT_INT_EQ(actual->kind, svn_wc_conflict_kind_property); + ASSERT_INT_EQ(expected->kind, svn_wc_conflict_kind_property); + + ASSERT_STR_EQ(actual->local_abspath, expected->local_abspath); + ASSERT_INT_EQ(actual->node_kind, expected->node_kind); + ASSERT_STR_EQ(actual->property_name, expected->property_name); + ASSERT_INT_EQ(actual->action, expected->action); + ASSERT_INT_EQ(actual->reason, expected->reason); + ASSERT_INT_EQ(actual->operation, expected->operation); + SVN_ERR(compare_version(actual->src_left_version, + expected->src_left_version)); + SVN_ERR(compare_version(actual->src_right_version, + expected->src_right_version)); + + SVN_ERR(compare_file_content(actual->base_abspath, expected_base_val, + scratch_pool)); + SVN_ERR(compare_file_content(actual->my_abspath, expected_my_val, + scratch_pool)); + /* Historical wart: for a prop conflict, 'theirs' is in the 'merged_file' + * field, and the conflict artifact file is in the 'theirs_abspath' field. */ + SVN_ERR(compare_file_content(actual->merged_file, expected_their_val, + scratch_pool)); + /*ASSERT_STR_EQ(actual->theirs_abspath, conflict_artifact_file));*/ + + /* These are 'undefined' for a prop conflict */ + /*ASSERT_INT_EQ(actual->is_binary, expected->is_binary);*/ + /*ASSERT_STR_EQ(actual->mime_type, expected->mime_type);*/ + return SVN_NO_ERROR; } @@ -254,11 +341,11 @@ test_read_write_tree_conflicts(const svn SVN_ERR(svn_wc__get_tree_conflict(&read_conflict, sbox.wc_ctx, child1_abspath, pool, pool)); - SVN_ERR(compare_conflict(conflict1, read_conflict)); + SVN_ERR(compare_conflict(read_conflict, conflict1)); SVN_ERR(svn_wc__get_tree_conflict(&read_conflict, sbox.wc_ctx, child2_abspath, pool, pool)); - SVN_ERR(compare_conflict(conflict2, read_conflict)); + SVN_ERR(compare_conflict(read_conflict, conflict2)); } /* Read many */ @@ -540,6 +627,186 @@ test_serialize_tree_conflict(const svn_t return SVN_NO_ERROR; } +/* A conflict resolver callback baton for test_prop_conflicts(). */ +typedef struct test_prop_conflict_baton_t +{ + /* Sets of properties. */ + apr_hash_t *mine; + apr_hash_t *their_old; + apr_hash_t *theirs; + /* The set of prop names in conflict. */ + apr_hash_t *conflicts; + + /* We use all the fields of DESC except the base/theirs/mine/merged paths. */ + svn_wc_conflict_description2_t *desc; + + int conflicts_seen; +} test_prop_conflict_baton_t; + +/* Set *CONFLICT_SKEL_P to a new property conflict skel reflecting the + * conflict details given in B. */ +static svn_error_t * +create_prop_conflict_skel(svn_skel_t **conflict_skel_p, + svn_wc_context_t *wc_ctx, + const test_prop_conflict_baton_t *b, + apr_pool_t *result_pool, + apr_pool_t *scratch_pool) +{ + svn_skel_t *conflict_skel = svn_wc__conflict_skel_create(result_pool); + const char *marker_abspath; + svn_boolean_t complete; + + SVN_ERR(svn_io_write_unique(&marker_abspath, + b->desc->local_abspath, + "conflict-artifact-file-content\n", 6, + svn_io_file_del_none, scratch_pool)); + + SVN_ERR(svn_wc__conflict_skel_add_prop_conflict(conflict_skel, + wc_ctx->db, + b->desc->local_abspath, + marker_abspath, + b->mine, b->their_old, + b->theirs, b->conflicts, + result_pool, scratch_pool)); + + switch (b->desc->operation) + { + case svn_wc_operation_update: + SVN_ERR(svn_wc__conflict_skel_set_op_update( + conflict_skel, + b->desc->src_left_version, b->desc->src_right_version, + result_pool, scratch_pool)); + break; + case svn_wc_operation_switch: + SVN_ERR(svn_wc__conflict_skel_set_op_switch( + conflict_skel, + b->desc->src_left_version, b->desc->src_right_version, + result_pool, scratch_pool)); + break; + case svn_wc_operation_merge: + SVN_ERR(svn_wc__conflict_skel_set_op_merge( + conflict_skel, + b->desc->src_left_version, b->desc->src_right_version, + result_pool, scratch_pool)); + break; + default: + SVN_ERR_MALFUNCTION(); + } + + SVN_ERR(svn_wc__conflict_skel_is_complete(&complete, conflict_skel)); + SVN_TEST_ASSERT(complete); + *conflict_skel_p = conflict_skel; + return SVN_NO_ERROR; +} + +/* A conflict resolver callback for test_prop_conflicts(), that checks + * that the conflict described to it matches the one described in BATON, + * and also counts the number of times it is called. */ +static svn_error_t * +prop_conflict_cb(svn_wc_conflict_result_t **result_p, + const svn_wc_conflict_description2_t *desc, + void *baton, + apr_pool_t *result_pool, + apr_pool_t *scratch_pool) +{ + test_prop_conflict_baton_t *b = baton; + + SVN_ERR(compare_prop_conflict( + desc, b->desc, + svn_prop_get_value(b->their_old, desc->property_name), + svn_prop_get_value(b->mine, desc->property_name), + svn_prop_get_value(b->theirs, desc->property_name), + scratch_pool)); + b->conflicts_seen++; + + *result_p = svn_wc_create_conflict_result(svn_wc_conflict_choose_postpone, + NULL /*merged_file*/, result_pool); + return SVN_NO_ERROR; +} + +/* Test for correct retrieval of property conflict descriptions from + * the WC DB. + * + * Presently it tests just one prop conflict, and only during the + * 'resolve' operation. We should also test during the 'update'/ + * 'switch'/'merge' operations. + */ +static svn_error_t * +test_prop_conflicts(const svn_test_opts_t *opts, + apr_pool_t *pool) +{ + svn_test__sandbox_t sbox; + svn_skel_t *conflict_skel; + svn_error_t *err; + const char *lock_abspath; + test_prop_conflict_baton_t *b = apr_pcalloc(pool, sizeof(*b)); + svn_wc_conflict_description2_t *desc = apr_pcalloc(pool, sizeof(*b)); + + SVN_ERR(svn_test__sandbox_create(&sbox, "test_prop_conflicts", opts, pool)); + + /* Describe a property conflict */ + b->mine = apr_hash_make(pool); + b->their_old = apr_hash_make(pool); + b->theirs = apr_hash_make(pool); + b->conflicts = apr_hash_make(pool); + svn_hash_sets(b->mine, "prop", svn_string_create("Mine", pool)); + svn_hash_sets(b->their_old, "prop", svn_string_create("Their-Old", pool)); + svn_hash_sets(b->theirs, "prop", svn_string_create("Theirs", pool)); + svn_hash_sets(b->conflicts, "prop", ""); + + b->desc = desc; + desc->local_abspath = sbox.wc_abspath; + desc->kind = svn_wc_conflict_kind_property; + desc->node_kind = svn_node_dir; + desc->operation = svn_wc_operation_update; + desc->action = svn_wc_conflict_action_edit; + desc->reason = svn_wc_conflict_reason_edited; + desc->mime_type = NULL; + desc->is_binary = FALSE; + desc->property_name = "prop"; + desc->src_left_version + = svn_wc_conflict_version_create2(sbox.repos_url, "uuid", + "trunk", 12, svn_node_dir, pool); + desc->src_right_version = NULL; /* WC only */ + + b->conflicts_seen = 0; + + /* Record a conflict */ + { + apr_pool_t *subpool = svn_pool_create(pool); + SVN_ERR(create_prop_conflict_skel(&conflict_skel, sbox.wc_ctx, b, + pool, subpool)); + svn_pool_clear(subpool); + SVN_ERR(svn_wc__db_op_mark_conflict(sbox.wc_ctx->db, + sbox.wc_abspath, + conflict_skel, NULL, subpool)); + svn_pool_destroy(subpool); + } + + /* Test the API for resolving the conflict: check that correct details + * of the conflict are returned. */ + SVN_ERR(svn_wc__acquire_write_lock_for_resolve(&lock_abspath, sbox.wc_ctx, + sbox.wc_abspath, pool, pool)); + err = svn_wc__resolve_conflicts(sbox.wc_ctx, sbox.wc_abspath, + svn_depth_empty, + FALSE /* resolve_text */, + "" /* resolve_prop (ALL props) */, + FALSE /* resolve_tree */, + svn_wc_conflict_choose_unspecified, + prop_conflict_cb, b, + NULL, NULL, /* cancellation */ + NULL, NULL, /* notification */ + pool); + + SVN_ERR(svn_error_compose_create(err, + svn_wc__release_write_lock(sbox.wc_ctx, + lock_abspath, + pool))); + + ASSERT_INT_EQ(b->conflicts_seen, 1); + return SVN_NO_ERROR; +} + /* The test table. */ struct svn_test_descriptor_t test_funcs[] = @@ -557,6 +824,8 @@ struct svn_test_descriptor_t test_funcs[ "read and write a text conflict"), SVN_TEST_OPTS_PASS(test_serialize_tree_conflict, "read and write a tree conflict"), + SVN_TEST_OPTS_PASS(test_prop_conflicts, + "test prop conflicts"), SVN_TEST_NULL }; Modified: subversion/branches/wc-collate-path/tools/dev/aprerr.txt URL: http://svn.apache.org/viewvc/subversion/branches/wc-collate-path/tools/dev/aprerr.txt?rev=1479901&r1=1479900&r2=1479901&view=diff ============================================================================== --- subversion/branches/wc-collate-path/tools/dev/aprerr.txt (original) +++ subversion/branches/wc-collate-path/tools/dev/aprerr.txt Tue May 7 13:26:25 2013 @@ -1,3 +1,4 @@ +# This file is used by which-error.py and gen_base.py:write_errno_table() APR_SUCCESS = 0 SOCBASEERR = 10000 SOCEPERM = 10001 Modified: subversion/branches/wc-collate-path/tools/dev/build-svn-deps-win.pl URL: http://svn.apache.org/viewvc/subversion/branches/wc-collate-path/tools/dev/build-svn-deps-win.pl?rev=1479901&r1=1479900&r2=1479901&view=diff ============================================================================== --- subversion/branches/wc-collate-path/tools/dev/build-svn-deps-win.pl (original) +++ subversion/branches/wc-collate-path/tools/dev/build-svn-deps-win.pl Tue May 7 13:26:25 2013 @@ -82,7 +82,7 @@ our $HTTPD_VER = '2.4.4'; our $APR_VER = '1.4.6'; our $APU_VER = '1.5.2'; # apr-util version our $API_VER = '1.2.1'; # arp-iconv version -our $ZLIB_VER = '1.2.7'; +our $ZLIB_VER = '1.2.8'; our $OPENSSL_VER = '1.0.1e'; our $PCRE_VER = '8.32'; our $BDB_VER = '5.3.21'; Modified: subversion/branches/wc-collate-path/tools/dev/remove-trailing-whitespace.sh URL: http://svn.apache.org/viewvc/subversion/branches/wc-collate-path/tools/dev/remove-trailing-whitespace.sh?rev=1479901&r1=1479900&r2=1479901&view=diff ============================================================================== --- subversion/branches/wc-collate-path/tools/dev/remove-trailing-whitespace.sh (original) +++ subversion/branches/wc-collate-path/tools/dev/remove-trailing-whitespace.sh Tue May 7 13:26:25 2013 @@ -20,5 +20,5 @@ for ext in c h cpp java py pl rb hpp cmd bat; do find . -name "*.$ext" -exec \ perl -pi -e 's/[ \t]*$//' {} + ; - # don't use \t to not strip ^L pagebreaks + # don't use \s to not strip ^L pagebreaks done Modified: subversion/branches/wc-collate-path/tools/dev/unix-build/Makefile.svn URL: http://svn.apache.org/viewvc/subversion/branches/wc-collate-path/tools/dev/unix-build/Makefile.svn?rev=1479901&r1=1479900&r2=1479901&view=diff ============================================================================== --- subversion/branches/wc-collate-path/tools/dev/unix-build/Makefile.svn (original) +++ subversion/branches/wc-collate-path/tools/dev/unix-build/Makefile.svn Tue May 7 13:26:25 2013 @@ -1246,7 +1246,7 @@ $(SVN_OBJDIR)/.installed: $(SVN_OBJDIR)/ # by the same version of SWIG. $(SVN_OBJDIR)/.pre-generated-swig-cleaned: -cd $(svn_builddir) \ - && make extraclean-swig + && make clean-swig touch $@ $(SVN_OBJDIR)/.bindings-compiled: $(SVN_OBJDIR)/.installed $(SVN_OBJDIR)/.pre-generated-swig-cleaned Modified: subversion/branches/wc-collate-path/tools/dev/which-error.py URL: http://svn.apache.org/viewvc/subversion/branches/wc-collate-path/tools/dev/which-error.py?rev=1479901&r1=1479900&r2=1479901&view=diff ============================================================================== --- subversion/branches/wc-collate-path/tools/dev/which-error.py (original) +++ subversion/branches/wc-collate-path/tools/dev/which-error.py Tue May 7 13:26:25 2013 @@ -73,6 +73,9 @@ def get_errors(): errs.update(errno.errorcode) ## APR-defined errors, from apr_errno.h. for line in open(os.path.join(os.path.dirname(sys.argv[0]), 'aprerr.txt')): + # aprerr.txt parsing duplicated in gen_base.py:write_errno_table() + if line.startswith('#'): + continue key, _, val = line.split() errs[int(val)] = key ## Subversion errors, from svn_error_codes.h. Modified: subversion/branches/wc-collate-path/tools/dist/backport.pl URL: http://svn.apache.org/viewvc/subversion/branches/wc-collate-path/tools/dist/backport.pl?rev=1479901&r1=1479900&r2=1479901&view=diff ============================================================================== --- subversion/branches/wc-collate-path/tools/dist/backport.pl (original) +++ subversion/branches/wc-collate-path/tools/dist/backport.pl Tue May 7 13:26:25 2013 @@ -30,10 +30,10 @@ my $STATUS = './STATUS'; my $BRANCHES = '^/subversion/branches'; my $YES = $ENV{YES}; # batch mode: eliminate prompts, add sleeps -my $WET_RUN = qw[false true][1]; # don't commit +my $MAY_COMMIT = qw[false true][0]; my $DEBUG = qw[false true][0]; # 'set -x', etc -$WET_RUN = 'true' if exists $ENV{WET_RUN}; $DEBUG = 'true' if exists $ENV{DEBUG}; +$MAY_COMMIT = 'true' if ($ENV{MAY_COMMIT} // "false") =~ /^(1|yes|true)$/i; # derived values my $SVNq; @@ -65,7 +65,7 @@ EOF sub prompt { local $\; # disable 'perl -l' effects - print "Go ahead? "; + print "$_[0] "; # TODO: this part was written by trial-and-error ReadMode 'cbreak'; @@ -117,22 +117,37 @@ if $DEBUG; then set -x fi $SVN diff > $backupfile +cp STATUS STATUS.$$ $SVNq revert -R . +mv STATUS.$$ STATUS $SVNq up $SVNq merge $mergeargs -$VIM -e -s -n -N -i NONE -u NONE -c '/$pattern/normal! dap' -c wq $STATUS -if $WET_RUN; then +if [ "`$SVN status -q | wc -l`" -eq 1 ]; then + if [ -n "`$SVN diff | perl -lne 'print if s/^(Added|Deleted|Modified): //' | grep -vx svn:mergeinfo`" ]; then + # This check detects STATUS entries that name non-^/subversion/ revnums. + # ### Q: What if we actually commit a mergeinfo fix to trunk and then want + # ### to backport it? + # ### A: We don't merge it using the script. + echo "Bogus merge: includes only svn:mergeinfo changes!" >&2 + exit 2 + fi +fi +if $MAY_COMMIT; then + $VIM -e -s -n -N -i NONE -u NONE -c '/$pattern/normal! dap' -c wq $STATUS $SVNq commit -F $logmsg_filename else - echo "Committing:" + echo "Would have committed:" + echo '[[[' $SVN status -q + echo 'M STATUS (not shown in the diff)' cat $logmsg_filename + echo ']]]' fi EOF $script .= <<"EOF" if $entry{branch}; reinteg_rev=\`$SVN info $STATUS | sed -ne 's/Last Changed Rev: //p'\` -if $WET_RUN; then +if $MAY_COMMIT; then # Sleep to avoid out-of-order commit notifications if [ -n "\$YES" ]; then sleep 15; fi $SVNq rm $BRANCHES/$entry{branch} -m "Remove the '$entry{branch}' branch, $reintegrated_word in r\$reinteg_rev." @@ -169,7 +184,8 @@ sub parse_entry { s/^ // for @_; # revisions - $branch = sanitize_branch $1 if $_[0] =~ /^(\S*) branch$/; + $branch = sanitize_branch $1 + if $_[0] =~ /^(\S*) branch$/ or $_[0] =~ m#branches/(\S+)#; while ($_[0] =~ /^r/) { while ($_[0] =~ s/^r(\d+)(?:$|[,; ]+)//) { push @revisions, $1; @@ -207,11 +223,12 @@ sub parse_entry { } sub handle_entry { + my $in_approved = shift; my %entry = parse_entry @_; my @vetoes = grep { /^ -1:/ } @{$entry{votes}}; if ($YES) { - merge %entry unless @vetoes; + merge %entry if $in_approved and not @vetoes; } else { print ""; print "\n>>> The $entry{header}:"; @@ -224,7 +241,14 @@ sub handle_entry { print ""; print "Vetoes found!" if @vetoes; - merge %entry if prompt; + if (prompt 'Go ahead?') { + merge %entry; + system($ENV{SHELL} // "/bin/sh") == 0 + or warn "Creating an interactive subshell failed ($?): $!" + if prompt "Shall I open a subshell?"; + # Don't revert. The next merge() call will do that anyway, or maybe the + # user did in his interactive shell. + } } # TODO: merge() changes ./STATUS, which we're reading below, but @@ -244,17 +268,17 @@ sub main { # ### TODO: need to run 'revert' here # ### TODO: both here and in merge(), unlink files that previous merges added - die "Local mods to STATUS file $STATUS" if `$SVN status -q $STATUS`; + # When running from cron, there shouldn't be local mods. (For interactive + # usage, we preserve local mods to STATUS.) + die "Local mods to STATUS file $STATUS" if $YES and `$SVN status -q $STATUS`; # Skip most of the file while (<STATUS>) { - last if /^Approved changes/; - } - while (<STATUS>) { - last unless /^=+$/; + last if /^Status of \d+\.\d+/; } $/ = ""; # paragraph mode + my $in_approved = 0; while (<STATUS>) { my @lines = split /\n/; @@ -262,6 +286,11 @@ sub main { # Section header when (/^[A-Z].*:$/i) { print "\n\n=== $lines[0]" unless $YES; + $in_approved = $lines[0] =~ /^Approved changes/; + } + # Comment + when (/^[#\x5b]/i) { + next; } # Separator after section header when (/^=+$/i) { @@ -271,10 +300,10 @@ sub main { when (/^ \*/) { warn "Too many bullets in $lines[0]" and next if grep /^ \*/, @lines[1..$#lines]; - handle_entry @lines; + handle_entry $in_approved, @lines; } default { - warn "Unknown entry '$lines[0]' at $ARGV:$.\n"; + warn "Unknown entry '$lines[0]' at line $.\n"; } } } Modified: subversion/branches/wc-collate-path/tools/dist/release.py URL: http://svn.apache.org/viewvc/subversion/branches/wc-collate-path/tools/dist/release.py?rev=1479901&r1=1479900&r2=1479901&view=diff ============================================================================== --- subversion/branches/wc-collate-path/tools/dist/release.py (original) +++ subversion/branches/wc-collate-path/tools/dist/release.py Tue May 7 13:26:25 2013 @@ -69,9 +69,14 @@ except ImportError: # Our required / recommended release tool versions by release branch tool_versions = { 'trunk' : { - 'autoconf' : '2.68', - 'libtool' : '2.4', - 'swig' : '2.0.4', + 'autoconf' : '2.69', + 'libtool' : '2.4.2', + 'swig' : '2.0.9', + }, + '1.8' : { + 'autoconf' : '2.69', + 'libtool' : '2.4.2', + 'swig' : '2.0.9', }, '1.7' : { 'autoconf' : '2.68', @@ -522,7 +527,8 @@ def create_tag(args): svnmucc_cmd += ['--username', args.username] svnmucc_cmd += ['cp', str(args.revnum), branch, tag] svnmucc_cmd += ['put', os.path.join(get_deploydir(args.base_dir), - 'svn_version.h.dist'), + 'svn_version.h.dist' + '-' + + str(args.version)), tag + '/subversion/include/svn_version.h'] # don't redirect stdout/stderr since svnmucc might ask for a password Modified: subversion/branches/wc-collate-path/tools/server-side/mod_dontdothat/mod_dontdothat.c URL: http://svn.apache.org/viewvc/subversion/branches/wc-collate-path/tools/server-side/mod_dontdothat/mod_dontdothat.c?rev=1479901&r1=1479900&r2=1479901&view=diff ============================================================================== --- subversion/branches/wc-collate-path/tools/server-side/mod_dontdothat/mod_dontdothat.c (original) +++ subversion/branches/wc-collate-path/tools/server-side/mod_dontdothat/mod_dontdothat.c Tue May 7 13:26:25 2013 @@ -584,7 +584,8 @@ dontdothat_insert_filters(request_rec *r /* XXX is there a way to error out from this point? Would be nice... */ - err = svn_config_read2(&config, cfg->config_file, TRUE, FALSE, r->pool); + err = svn_config_read3(&config, cfg->config_file, TRUE, + FALSE, TRUE, r->pool); if (err) { char buff[256];
