Modified: subversion/branches/move-tracking-2/subversion/svn-bench/help-cmd.c URL: http://svn.apache.org/viewvc/subversion/branches/move-tracking-2/subversion/svn-bench/help-cmd.c?rev=1641647&r1=1641646&r2=1641647&view=diff ============================================================================== --- subversion/branches/move-tracking-2/subversion/svn-bench/help-cmd.c (original) +++ subversion/branches/move-tracking-2/subversion/svn-bench/help-cmd.c Tue Nov 25 16:26:48 2014 @@ -45,10 +45,9 @@ svn_cl__help(apr_getopt_t *os, { svn_cl__opt_state_t *opt_state; - /* xgettext: the %s is for SVN_VER_NUMBER. */ - char help_header_template[] = + char help_header[] = N_("usage: svn-bench <subcommand> [options] [args]\n" - "Subversion command-line client, version %s.\n" + "Subversion benchmarking tool.\n" "Type 'svn-bench help <subcommand>' for help on a specific subcommand.\n" "Type 'svn-bench --version' to see the program version and RA modules\n" " or 'svn-bench --version --quiet' to see just the version number.\n" @@ -63,9 +62,6 @@ svn_cl__help(apr_getopt_t *os, N_("Subversion is a tool for version control.\n" "For additional information, see http://subversion.apache.org/\n"); - char *help_header = - apr_psprintf(pool, _(help_header_template), SVN_VER_NUMBER); - const char *ra_desc_start = _("The following repository access (RA) modules are available:\n\n");
Modified: subversion/branches/move-tracking-2/subversion/svn-bench/svn-bench.c URL: http://svn.apache.org/viewvc/subversion/branches/move-tracking-2/subversion/svn-bench/svn-bench.c?rev=1641647&r1=1641646&r2=1641647&view=diff ============================================================================== --- subversion/branches/move-tracking-2/subversion/svn-bench/svn-bench.c (original) +++ subversion/branches/move-tracking-2/subversion/svn-bench/svn-bench.c Tue Nov 25 16:26:48 2014 @@ -232,7 +232,7 @@ const svn_opt_subcommand_desc2_t svn_cl_ { "null-list", svn_cl__null_list, {"ls"}, N_ ("List directory entries in the repository.\n" - "usage: list [TARGET[@REV]...]\n" + "usage: null-list [TARGET[@REV]...]\n" "\n" " List each TARGET file and the contents of each TARGET directory as\n" " they exist in the repository. If TARGET is a working copy path, the\n" @@ -288,7 +288,7 @@ const svn_opt_subcommand_desc2_t svn_cl_ { "null-info", svn_cl__null_info, {0}, N_ ("Display information about a local or remote item.\n" - "usage: info [TARGET[@REV]...]\n" + "usage: null-info [TARGET[@REV]...]\n" "\n" " Print information about each TARGET (default: '.').\n" " TARGET may be either a working-copy path or URL. If specified, REV\n" Modified: subversion/branches/move-tracking-2/subversion/svnadmin/svnadmin.c URL: http://svn.apache.org/viewvc/subversion/branches/move-tracking-2/subversion/svnadmin/svnadmin.c?rev=1641647&r1=1641646&r2=1641647&view=diff ============================================================================== --- subversion/branches/move-tracking-2/subversion/svnadmin/svnadmin.c (original) +++ subversion/branches/move-tracking-2/subversion/svnadmin/svnadmin.c Tue Nov 25 16:26:48 2014 @@ -329,7 +329,7 @@ static const apr_getopt_option_t options " identical")}, {"metadata-only", svnadmin__metadata_only, 0, - N_("verify metadata only (ignored for BDB)," + N_("verify metadata only (ignored for BDB),\n" " checking against external corruption in\n" " Subversion 1.9+ format repositories.\n")}, @@ -358,8 +358,8 @@ static const svn_opt_subcommand_desc2_t } }, {"delrevprop", subcommand_delrevprop, {0}, N_ - ("usage: 1. svnadmin delrevprop -r REVISION REPOS_PATH NAME\n" - " 2. svnadmin delrevprop -t TXN REPOS_PATH NAME\n\n" + ("usage: 1. svnadmin delrevprop REPOS_PATH -r REVISION NAME\n" + " 2. svnadmin delrevprop REPO_PATH -t TXN NAME\n\n" "1. Delete the property NAME on revision REVISION.\n\n" "Use --use-pre-revprop-change-hook/--use-post-revprop-change-hook to\n" "trigger the revision property-related hooks (for example, if you want\n" @@ -499,8 +499,8 @@ static const svn_opt_subcommand_desc2_t {'r', svnadmin__bypass_hooks} }, {"setrevprop", subcommand_setrevprop, {0}, N_ - ("usage: 1. svnadmin setrevprop -r REVISION REPOS_PATH FILE\n" - " 2. svnadmin setrevprop -t TXN REPOS_PATH FILE\n\n" + ("usage: 1. svnadmin setrevprop REPOS_PATH -r REVISION NAME FILE\n" + " 2. svnadmin setrevprop REPOS_PATH -t TXN NAME FILE\n\n" "1. Set the property NAME on revision REVISION to the contents of FILE.\n\n" "Use --use-pre-revprop-change-hook/--use-post-revprop-change-hook to\n" "trigger the revision property-related hooks (for example, if you want\n" @@ -2027,6 +2027,11 @@ subcommand_info(apr_getopt_t *os, void * SVN_ERR(svn_cmdline_printf(pool, _("FSFS Shards Packed: %ld/%ld\n"), shards_packed, shards_full)); } + + if (fsfs_info->log_addressing) + SVN_ERR(svn_cmdline_printf(pool, _("FSFS Logical Addressing: yes\n"))); + else + SVN_ERR(svn_cmdline_printf(pool, _("FSFS Logical Addressing: no\n"))); } } Modified: subversion/branches/move-tracking-2/subversion/svnfsfs/stats-cmd.c URL: http://svn.apache.org/viewvc/subversion/branches/move-tracking-2/subversion/svnfsfs/stats-cmd.c?rev=1641647&r1=1641646&r2=1641647&view=diff ============================================================================== --- subversion/branches/move-tracking-2/subversion/svnfsfs/stats-cmd.c (original) +++ subversion/branches/move-tracking-2/subversion/svnfsfs/stats-cmd.c Tue Nov 25 16:26:48 2014 @@ -44,14 +44,14 @@ print_rep_stats(svn_fs_fs__representatio "%20s bytes expanded shared size\n" "%20s bytes with rep-sharing off\n" "%20s shared references\n"), - svn__i64toa_sep(stats->total.packed_size, ',', pool), - svn__i64toa_sep(stats->total.count, ',', pool), - svn__i64toa_sep(stats->shared.packed_size, ',', pool), - svn__i64toa_sep(stats->shared.count, ',', pool), - svn__i64toa_sep(stats->total.expanded_size, ',', pool), - svn__i64toa_sep(stats->shared.expanded_size, ',', pool), - svn__i64toa_sep(stats->expanded_size, ',', pool), - svn__i64toa_sep(stats->references - stats->total.count, ',', pool)); + svn__ui64toa_sep(stats->total.packed_size, ',', pool), + svn__ui64toa_sep(stats->total.count, ',', pool), + svn__ui64toa_sep(stats->shared.packed_size, ',', pool), + svn__ui64toa_sep(stats->shared.count, ',', pool), + svn__ui64toa_sep(stats->total.expanded_size, ',', pool), + svn__ui64toa_sep(stats->shared.expanded_size, ',', pool), + svn__ui64toa_sep(stats->expanded_size, ',', pool), + svn__ui64toa_sep(stats->references - stats->total.count, ',', pool)); } /* Print the (used) contents of CHANGES. Use POOL for allocations. @@ -63,7 +63,7 @@ print_largest_reps(svn_fs_fs__largest_ch apr_size_t i; for (i = 0; i < changes->count && changes->changes[i]->size; ++i) printf(_("%12s r%-8ld %s\n"), - svn__i64toa_sep(changes->changes[i]->size, ',', pool), + svn__ui64toa_sep(changes->changes[i]->size, ',', pool), changes->changes[i]->revision, changes->changes[i]->path->data); } @@ -90,9 +90,9 @@ print_histogram(svn_fs_fs__histogram_t * for (i = last; i >= first; --i) printf(_(" [2^%2d, 2^%2d) %15s (%2d%%) bytes in %12s (%2d%%) items\n"), i-1, i, - svn__i64toa_sep(histogram->lines[i].sum, ',', pool), + svn__ui64toa_sep(histogram->lines[i].sum, ',', pool), (int)(histogram->lines[i].sum * 100 / histogram->total.sum), - svn__i64toa_sep(histogram->lines[i].count, ',', pool), + svn__ui64toa_sep(histogram->lines[i].count, ',', pool), (int)(histogram->lines[i].count * 100 / histogram->total.count)); } @@ -209,14 +209,14 @@ print_extensions_by_changes(svn_fs_fs__s sum += info->node_histogram.total.count; printf(_("%11s %20s (%2d%%) representations\n"), info->extension, - svn__i64toa_sep(info->node_histogram.total.count, ',', pool), + svn__ui64toa_sep(info->node_histogram.total.count, ',', pool), (int)(info->node_histogram.total.count * 100 / stats->file_histogram.total.count)); } printf(_("%11s %20s (%2d%%) representations\n"), "(others)", - svn__i64toa_sep(stats->file_histogram.total.count - sum, ',', pool), + svn__ui64toa_sep(stats->file_histogram.total.count - sum, ',', pool), (int)((stats->file_histogram.total.count - sum) * 100 / stats->file_histogram.total.count)); } @@ -239,14 +239,14 @@ print_extensions_by_nodes(svn_fs_fs__sta sum += info->node_histogram.total.sum; printf(_("%11s %20s (%2d%%) bytes\n"), info->extension, - svn__i64toa_sep(info->node_histogram.total.sum, ',', pool), + svn__ui64toa_sep(info->node_histogram.total.sum, ',', pool), (int)(info->node_histogram.total.sum * 100 / stats->file_histogram.total.sum)); } printf(_("%11s %20s (%2d%%) bytes\n"), "(others)", - svn__i64toa_sep(stats->file_histogram.total.sum - sum, ',', pool), + svn__ui64toa_sep(stats->file_histogram.total.sum - sum, ',', pool), (int)((stats->file_histogram.total.sum - sum) * 100 / stats->file_histogram.total.sum)); } @@ -269,14 +269,15 @@ print_extensions_by_reps(svn_fs_fs__stat sum += info->rep_histogram.total.sum; printf(_("%11s %20s (%2d%%) bytes\n"), info->extension, - svn__i64toa_sep(info->rep_histogram.total.sum, ',', pool), + svn__ui64toa_sep(info->rep_histogram.total.sum, ',', pool), (int)(info->rep_histogram.total.sum * 100 / stats->rep_size_histogram.total.sum)); } printf(_("%11s %20s (%2d%%) bytes\n"), "(others)", - svn__i64toa_sep(stats->rep_size_histogram.total.sum - sum, ',', pool), + svn__ui64toa_sep(stats->rep_size_histogram.total.sum - sum, ',', + pool), (int)((stats->rep_size_histogram.total.sum - sum) * 100 / stats->rep_size_histogram.total.sum)); } @@ -320,29 +321,29 @@ print_stats(svn_fs_fs__stats_t *stats, "%20s bytes in %12s representations\n" "%20s bytes expanded representation size\n" "%20s bytes with rep-sharing off\n"), - svn__i64toa_sep(stats->total_size, ',', pool), - svn__i64toa_sep(stats->revision_count, ',', pool), - svn__i64toa_sep(stats->change_len, ',', pool), - svn__i64toa_sep(stats->change_count, ',', pool), - svn__i64toa_sep(stats->total_node_stats.size, ',', pool), - svn__i64toa_sep(stats->total_node_stats.count, ',', pool), - svn__i64toa_sep(stats->total_rep_stats.total.packed_size, ',', + svn__ui64toa_sep(stats->total_size, ',', pool), + svn__ui64toa_sep(stats->revision_count, ',', pool), + svn__ui64toa_sep(stats->change_len, ',', pool), + svn__ui64toa_sep(stats->change_count, ',', pool), + svn__ui64toa_sep(stats->total_node_stats.size, ',', pool), + svn__ui64toa_sep(stats->total_node_stats.count, ',', pool), + svn__ui64toa_sep(stats->total_rep_stats.total.packed_size, ',', pool), - svn__i64toa_sep(stats->total_rep_stats.total.count, ',', pool), - svn__i64toa_sep(stats->total_rep_stats.total.expanded_size, ',', + svn__ui64toa_sep(stats->total_rep_stats.total.count, ',', pool), + svn__ui64toa_sep(stats->total_rep_stats.total.expanded_size, ',', pool), - svn__i64toa_sep(stats->total_rep_stats.expanded_size, ',', pool)); + svn__ui64toa_sep(stats->total_rep_stats.expanded_size, ',', pool)); printf("\nNoderev statistics:\n"); printf(_("%20s bytes in %12s nodes total\n" "%20s bytes in %12s directory noderevs\n" "%20s bytes in %12s file noderevs\n"), - svn__i64toa_sep(stats->total_node_stats.size, ',', pool), - svn__i64toa_sep(stats->total_node_stats.count, ',', pool), - svn__i64toa_sep(stats->dir_node_stats.size, ',', pool), - svn__i64toa_sep(stats->dir_node_stats.count, ',', pool), - svn__i64toa_sep(stats->file_node_stats.size, ',', pool), - svn__i64toa_sep(stats->file_node_stats.count, ',', pool)); + svn__ui64toa_sep(stats->total_node_stats.size, ',', pool), + svn__ui64toa_sep(stats->total_node_stats.count, ',', pool), + svn__ui64toa_sep(stats->dir_node_stats.size, ',', pool), + svn__ui64toa_sep(stats->dir_node_stats.count, ',', pool), + svn__ui64toa_sep(stats->file_node_stats.size, ',', pool), + svn__ui64toa_sep(stats->file_node_stats.count, ',', pool)); printf("\nRepresentation statistics:\n"); printf(_("%20s bytes in %12s representations total\n" @@ -352,26 +353,26 @@ print_stats(svn_fs_fs__stats_t *stats, "%20s bytes in %12s directory property representations\n" "%20s bytes in %12s file property representations\n" "%20s bytes in header & footer overhead\n"), - svn__i64toa_sep(stats->total_rep_stats.total.packed_size, ',', + svn__ui64toa_sep(stats->total_rep_stats.total.packed_size, ',', pool), - svn__i64toa_sep(stats->total_rep_stats.total.count, ',', pool), - svn__i64toa_sep(stats->dir_rep_stats.total.packed_size, ',', + svn__ui64toa_sep(stats->total_rep_stats.total.count, ',', pool), + svn__ui64toa_sep(stats->dir_rep_stats.total.packed_size, ',', pool), - svn__i64toa_sep(stats->dir_rep_stats.total.count, ',', pool), - svn__i64toa_sep(stats->file_rep_stats.total.packed_size, ',', + svn__ui64toa_sep(stats->dir_rep_stats.total.count, ',', pool), + svn__ui64toa_sep(stats->file_rep_stats.total.packed_size, ',', pool), - svn__i64toa_sep(stats->file_rep_stats.total.count, ',', pool), - svn__i64toa_sep(stats->added_rep_size_histogram.total.sum, ',', + svn__ui64toa_sep(stats->file_rep_stats.total.count, ',', pool), + svn__ui64toa_sep(stats->added_rep_size_histogram.total.sum, ',', pool), - svn__i64toa_sep(stats->added_rep_size_histogram.total.count, ',', + svn__ui64toa_sep(stats->added_rep_size_histogram.total.count, ',', pool), - svn__i64toa_sep(stats->dir_prop_rep_stats.total.packed_size, ',', + svn__ui64toa_sep(stats->dir_prop_rep_stats.total.packed_size, ',', pool), - svn__i64toa_sep(stats->dir_prop_rep_stats.total.count, ',', pool), - svn__i64toa_sep(stats->file_prop_rep_stats.total.packed_size, ',', + svn__ui64toa_sep(stats->dir_prop_rep_stats.total.count, ',', pool), + svn__ui64toa_sep(stats->file_prop_rep_stats.total.packed_size, ',', pool), - svn__i64toa_sep(stats->file_prop_rep_stats.total.count, ',', pool), - svn__i64toa_sep(stats->total_rep_stats.total.overhead_size, ',', + svn__ui64toa_sep(stats->file_prop_rep_stats.total.count, ',', pool), + svn__ui64toa_sep(stats->total_rep_stats.total.overhead_size, ',', pool)); printf("\nDirectory representation statistics:\n"); Modified: subversion/branches/move-tracking-2/subversion/svnfsfs/svnfsfs.c URL: http://svn.apache.org/viewvc/subversion/branches/move-tracking-2/subversion/svnfsfs/svnfsfs.c?rev=1641647&r1=1641646&r2=1641647&view=diff ============================================================================== --- subversion/branches/move-tracking-2/subversion/svnfsfs/svnfsfs.c (original) +++ subversion/branches/move-tracking-2/subversion/svnfsfs/svnfsfs.c Tue Nov 25 16:26:48 2014 @@ -186,9 +186,9 @@ static const svn_opt_subcommand_desc2_t {"load-index", subcommand__load_index, {0}, N_ ("usage: svnfsfs load-index REPOS_PATH\n\n" - "Read the index contents to console. The format is the same as produced by the\n" - "dump command, except that checksum as well as header are optional and will be\n" - "ignored. The data must cover the full revision / pack file; the revision\n" + "Read index contents from console. The format is the same as produced by the\n" + "dump-index command, except that checksum as well as header are optional and will\n" + "be ignored. The data must cover the full revision / pack file; the revision\n" "number is automatically extracted from input stream. No ordering is required.\n"), {'M'} }, @@ -479,7 +479,7 @@ sub_main(int *exit_code, int argc, const apr_signal(SIGXFSZ, SIG_IGN); #endif - /* Configure FSFS caches for maximum efficiency with svnadmin. + /* Configure FSFS caches for maximum efficiency with svnfsfs. * Also, apply the respective command line parameters, if given. */ { svn_cache_config_t settings = *svn_cache_config_get(); @@ -500,7 +500,7 @@ sub_main(int *exit_code, int argc, const || err->apr_err == SVN_ERR_CL_ARG_PARSING_ERROR) { err = svn_error_quick_wrap(err, - _("Try 'svnadmin help' for more info")); + _("Try 'svnfsfs help' for more info")); } return err; } @@ -516,7 +516,7 @@ main(int argc, const char *argv[]) svn_error_t *err; /* Initialize the app. */ - if (svn_cmdline_init("svnadmin", stderr) != EXIT_SUCCESS) + if (svn_cmdline_init("svnfsfs", stderr) != EXIT_SUCCESS) return EXIT_FAILURE; /* Create our top-level pool. Use a separate mutexless allocator, Modified: subversion/branches/move-tracking-2/subversion/tests/cmdline/basic_tests.py URL: http://svn.apache.org/viewvc/subversion/branches/move-tracking-2/subversion/tests/cmdline/basic_tests.py?rev=1641647&r1=1641646&r2=1641647&view=diff ============================================================================== --- subversion/branches/move-tracking-2/subversion/tests/cmdline/basic_tests.py (original) +++ subversion/branches/move-tracking-2/subversion/tests/cmdline/basic_tests.py Tue Nov 25 16:26:48 2014 @@ -2003,6 +2003,7 @@ def delete_keep_local_twice(sbox): logger.warn('Directory was really deleted') raise svntest.Failure +@XFail(svntest.main.is_mod_dav_url_quoting_broken) def special_paths_in_repos(sbox): "use folders with names like 'c:hi'" Modified: subversion/branches/move-tracking-2/subversion/tests/cmdline/davautocheck.sh URL: http://svn.apache.org/viewvc/subversion/branches/move-tracking-2/subversion/tests/cmdline/davautocheck.sh?rev=1641647&r1=1641646&r2=1641647&view=diff ============================================================================== --- subversion/branches/move-tracking-2/subversion/tests/cmdline/davautocheck.sh (original) +++ subversion/branches/move-tracking-2/subversion/tests/cmdline/davautocheck.sh Tue Nov 25 16:26:48 2014 @@ -264,8 +264,6 @@ HTTPD=$(get_prog_name $httpd) || fail "H "$HTTPD" -v 1>/dev/null 2>&1 \ || fail "HTTPD '$HTTPD' doesn't start properly" -say "Using '$HTTPD'..." - HTPASSWD=$(get_prog_name htpasswd htpasswd2) \ || fail "Could not find htpasswd or htpasswd2" [ -x $HTPASSWD ] \ Modified: subversion/branches/move-tracking-2/subversion/tests/cmdline/externals_tests.py URL: http://svn.apache.org/viewvc/subversion/branches/move-tracking-2/subversion/tests/cmdline/externals_tests.py?rev=1641647&r1=1641646&r2=1641647&view=diff ============================================================================== --- subversion/branches/move-tracking-2/subversion/tests/cmdline/externals_tests.py (original) +++ subversion/branches/move-tracking-2/subversion/tests/cmdline/externals_tests.py Tue Nov 25 16:26:48 2014 @@ -3121,7 +3121,7 @@ def move_with_file_externals(sbox): sbox.simple_commit() sbox.simple_update() -@Issue(4185) +@Issue(4185,4529) def pinned_externals(sbox): "pinned external" @@ -3134,6 +3134,7 @@ def pinned_externals(sbox): sbox.simple_mkdir('Z') sbox.simple_commit('') + repo_X_C = repo_url + '/X/C' repo_X_mu = repo_url + '/X/mu' expected_output = verify.RegexOutput( @@ -3153,20 +3154,18 @@ def pinned_externals(sbox): 'old-rev -r 1 ' + repo_X_mu + '\n' + repo_X_mu + ' new-plain\n' + '-r1 ' + repo_X_mu + ' new-rev\n' + - repo_X_mu + '@1 new-peg\n', + repo_X_mu + '@1 new-peg\n' + '-r1 ' + repo_X_C + ' new-dir-rev\n', 'Z') - expected_output = svntest.wc.State(wc_dir, { - 'A/D' : Item(status=' U'), - 'A/D/exdir_E/beta' : Item(status='A '), - 'A/D/exdir_E/alpha' : Item(status='A '), - }) expected_error = "svn: E205011: Failure.*externals" expected_disk = svntest.main.greek_state.copy() expected_disk.add({ # The interesting values 'Z/old-plain' : Item(contents="This is the file 'mu'.\n"), 'Z/new-plain' : Item(contents="This is the file 'mu'.\n"), + 'Z/new-rev' : Item(contents="This is the file 'mu'.\n"), + 'Z/new-dir-rev' : Item(), # And verifying X 'X/D/H/psi' : Item(contents="This is the file 'psi'.\n"), Modified: subversion/branches/move-tracking-2/subversion/tests/cmdline/redirect_tests.py URL: http://svn.apache.org/viewvc/subversion/branches/move-tracking-2/subversion/tests/cmdline/redirect_tests.py?rev=1641647&r1=1641646&r2=1641647&view=diff ============================================================================== --- subversion/branches/move-tracking-2/subversion/tests/cmdline/redirect_tests.py (original) +++ subversion/branches/move-tracking-2/subversion/tests/cmdline/redirect_tests.py Tue Nov 25 16:26:48 2014 @@ -178,6 +178,33 @@ def redirected_nonroot_update(sbox): verify_url(wc_dir, checkout_url) #---------------------------------------------------------------------- +@SkipUnless(svntest.main.is_ra_type_dav) +def redirected_externals(sbox): + "redirected externals" + + sbox.build() + + sbox.simple_propset('svn:externals', + '^/A/B/E/alpha fileX\n' + '^/A/B/F dirX', + 'A/C') + sbox.simple_commit() + sbox.simple_update() + + wc_dir = sbox.add_wc_path("my") + co_url = sbox.redirected_root_url() + exit_code, out, err = svntest.main.run_svn(None, 'co', co_url, wc_dir) + if err: + raise svntest.Failure + if not redirect_regex.match(out[0]): + raise svntest.Failure + + verify_url(wc_dir, sbox.repo_url) + verify_url(sbox.ospath('A/C/fileX'), sbox.repo_url + '/A/B/E/alpha', + wc_path_is_file=True) + verify_url(sbox.ospath('A/C/dirX'), sbox.repo_url + '/A/B/F') + +#---------------------------------------------------------------------- ######################################################################## # Run the tests @@ -188,6 +215,7 @@ test_list = [ None, redirected_checkout, redirected_update, redirected_nonroot_update, + redirected_externals, ] if __name__ == '__main__': Modified: subversion/branches/move-tracking-2/subversion/tests/cmdline/svnadmin_tests.py URL: http://svn.apache.org/viewvc/subversion/branches/move-tracking-2/subversion/tests/cmdline/svnadmin_tests.py?rev=1641647&r1=1641646&r2=1641647&view=diff ============================================================================== --- subversion/branches/move-tracking-2/subversion/tests/cmdline/svnadmin_tests.py (original) +++ subversion/branches/move-tracking-2/subversion/tests/cmdline/svnadmin_tests.py Tue Nov 25 16:26:48 2014 @@ -32,6 +32,7 @@ import shutil import sys import threading import time +import gzip logger = logging.getLogger() @@ -2938,6 +2939,35 @@ def upgrade(sbox): '-m', svntest.main.make_log_msg(), sbox.repo_url + '/dir') +def load_txdelta(sbox): + "exercising svn_txdelta_target on BDB" + + test_create(sbox) + + # This dumpfile produced a BDB repository that generated cheksum + # mismatches on read caused by the improper handling of + # svn_txdelta_target ops. The bug was fixed by r1640832. + + dumpfile_location = os.path.join(os.path.dirname(sys.argv[0]), + 'svnadmin_tests_data', + 'load_txdelta.dump.gz') + dumpfile = gzip.open(dumpfile_location).read() + + load_dumpstream(sbox, dumpfile) + + # Verify would fail with a checksum mismatch: + # * Error verifying revision 14. + # svnadmin: E200014: MD5 checksum mismatch on representation 'r': + # expected: 5182e8876ed894dc7fe28f6ff5b2fee6 + # actual: 5121f82875508863ad70daa8244e6947 + + exit_code, output, errput = svntest.main.run_svnadmin("verify", sbox.repo_dir) + if errput: + raise SVNUnexpectedStderr(errput) + if svntest.verify.verify_outputs( + "Output of 'svnadmin verify' is unexpected.", None, output, None, + ".*Verified revision *"): + raise svntest.Failure ######################################################################## # Run the tests @@ -2992,6 +3022,7 @@ test_list = [ None, fsfs_hotcopy_progress_old, freeze_same_uuid, upgrade, + load_txdelta, ] if __name__ == '__main__': Modified: subversion/branches/move-tracking-2/subversion/tests/cmdline/svntest/main.py URL: http://svn.apache.org/viewvc/subversion/branches/move-tracking-2/subversion/tests/cmdline/svntest/main.py?rev=1641647&r1=1641646&r2=1641647&view=diff ============================================================================== --- subversion/branches/move-tracking-2/subversion/tests/cmdline/svntest/main.py (original) +++ subversion/branches/move-tracking-2/subversion/tests/cmdline/svntest/main.py Tue Nov 25 16:26:48 2014 @@ -915,68 +915,10 @@ def file_substitute(path, contents, new_ fcontent = open(path, 'r').read().replace(contents, new_contents) open(path, 'w').write(fcontent) -def _unpack_precooked_repos(path, template): - testdir = os.path.dirname(os.path.abspath(os.path.dirname(__file__))) - repozip = os.path.join(os.path.dirname(testdir), "templates", template) - zipfile.ZipFile(repozip, 'r').extractall(path) - -# For creating new, pre-cooked greek repositories -def unpack_greek_repos(path): - template = "greek-fsfs-v%d.zip" % options.fsfs_version - _unpack_precooked_repos(path, template) - -# For creating blank new repositories -def create_repos(path, minor_version = None): - """Create a brand-new SVN repository at PATH. If PATH does not yet - exist, create it.""" - - if not os.path.exists(path): - os.makedirs(path) # this creates all the intermediate dirs, if necessary - - if options.fsfs_version is None: - if options.fs_type == "bdb": - opts = ("--bdb-txn-nosync",) - else: - opts = () - if minor_version is None or minor_version > options.server_minor_version: - minor_version = options.server_minor_version - opts += ("--compatible-version=1.%d" % (minor_version),) - if options.fs_type is not None: - opts += ("--fs-type=" + options.fs_type,) - exit_code, stdout, stderr = run_command(svnadmin_binary, 1, False, - "create", path, *opts) - else: - # Copy a pre-cooked FSFS repository - assert options.fs_type == "fsfs" - template = "empty-fsfs-v%d.zip" % options.fsfs_version - _unpack_precooked_repos(path, template) - exit_code, stdout, stderr = run_command(svnadmin_binary, 1, False, - "setuuid", path) - - # Skip tests if we can't create the repository. - if stderr: - stderr_lines = 0 - not_using_fsfs_backend = (options.fs_type != "fsfs") - backend_deprecation_warning = False - for line in stderr: - stderr_lines += 1 - if line.find('Unknown FS type') != -1: - raise Skip - if not_using_fsfs_backend: - if 0 < line.find('repository back-end is deprecated, consider using'): - backend_deprecation_warning = True - - # Creating BDB repositories will cause svnadmin to print a warning - # which should be ignored. - if (stderr_lines == 1 - and not_using_fsfs_backend - and backend_deprecation_warning): - pass - else: - # If the FS type is known and we noticed more than just the - # BDB-specific warning, assume the repos couldn't be created - # (e.g. due to a missing 'svnadmin' binary). - raise SVNRepositoryCreateFailure("".join(stderr).rstrip()) +# For setting up authz and hooks in existing repos +def _post_create_repos(path, minor_version = None): + """Set default access right configurations for svnserve and mod_dav + as well as hooks etc. in the SVN repository at PATH.""" # Require authentication to write to the repos, for ra_svn testing. file_write(get_svnserve_conf_file_path(path), @@ -1046,6 +988,73 @@ def create_repos(path, minor_version = N # make the repos world-writeable, for mod_dav_svn's sake. chmod_tree(path, 0666, 0666) +def _unpack_precooked_repos(path, template): + testdir = os.path.dirname(os.path.abspath(os.path.dirname(__file__))) + repozip = os.path.join(os.path.dirname(testdir), "templates", template) + zipfile.ZipFile(repozip, 'r').extractall(path) + +# For creating new, pre-cooked greek repositories +def unpack_greek_repos(path): + template = "greek-fsfs-v%d.zip" % options.fsfs_version + _unpack_precooked_repos(path, template) + _post_create_repos(path, options.server_minor_version) + +# For creating blank new repositories +def create_repos(path, minor_version = None): + """Create a brand-new SVN repository at PATH. If PATH does not yet + exist, create it.""" + + if not os.path.exists(path): + os.makedirs(path) # this creates all the intermediate dirs, if necessary + + if options.fsfs_version is None: + if options.fs_type == "bdb": + opts = ("--bdb-txn-nosync",) + else: + opts = () + if minor_version is None or minor_version > options.server_minor_version: + minor_version = options.server_minor_version + opts += ("--compatible-version=1.%d" % (minor_version),) + if options.fs_type is not None: + opts += ("--fs-type=" + options.fs_type,) + exit_code, stdout, stderr = run_command(svnadmin_binary, 1, False, + "create", path, *opts) + else: + # Copy a pre-cooked FSFS repository + assert options.fs_type == "fsfs" + template = "empty-fsfs-v%d.zip" % options.fsfs_version + _unpack_precooked_repos(path, template) + exit_code, stdout, stderr = run_command(svnadmin_binary, 1, False, + "setuuid", path) + + # Skip tests if we can't create the repository. + if stderr: + stderr_lines = 0 + not_using_fsfs_backend = (options.fs_type != "fsfs") + backend_deprecation_warning = False + for line in stderr: + stderr_lines += 1 + if line.find('Unknown FS type') != -1: + raise Skip + if not_using_fsfs_backend: + if 0 < line.find('repository back-end is deprecated, consider using'): + backend_deprecation_warning = True + + # Creating BDB repositories will cause svnadmin to print a warning + # which should be ignored. + if (stderr_lines == 1 + and not_using_fsfs_backend + and backend_deprecation_warning): + pass + else: + # If the FS type is known and we noticed more than just the + # BDB-specific warning, assume the repos couldn't be created + # (e.g. due to a missing 'svnadmin' binary). + raise SVNRepositoryCreateFailure("".join(stderr).rstrip()) + + # Configure the new repository. + _post_create_repos(path, minor_version) + # For copying a repository def copy_repos(src_path, dst_path, head_revision, ignore_uuid = 1, minor_version = None): @@ -1472,6 +1481,17 @@ def is_plaintext_password_storage_disabl return False return True + +# https://issues.apache.org/bugzilla/show_bug.cgi?id=56480 +__mod_dav_url_quoting_broken_versions = frozenset([ + '2.2.26', + '2.4.9', +]) +def is_mod_dav_url_quoting_broken(): + if is_ra_type_dav(): + return (options.httpd_version in __mod_dav_url_quoting_broken_versions) + return None + ###################################################################### @@ -1533,6 +1553,8 @@ class TestSpawningThread(threading.Threa args.append('--http-proxy-username=' + options.http_proxy_username) if options.http_proxy_password: args.append('--http-proxy-password=' + options.http_proxy_password) + if options.httpd_version: + args.append('--httpd-version=' + options.httpd_version) if options.exclusive_wc_locks: args.append('--exclusive-wc-locks') if options.memcached_server: @@ -1894,6 +1916,8 @@ def _create_parser(): help='Username for the HTTP Proxy.') parser.add_option('--http-proxy-password', action='store', help='Password for the HTTP Proxy.') + parser.add_option('--httpd-version', action='store', + help='Assume HTTPD is this version.') parser.add_option('--tools-bin', action='store', dest='tools_bin', help='Use the svn tools installed in this path') parser.add_option('--exclusive-wc-locks', action='store_true', Modified: subversion/branches/move-tracking-2/subversion/tests/libsvn_fs/fs-test.c URL: http://svn.apache.org/viewvc/subversion/branches/move-tracking-2/subversion/tests/libsvn_fs/fs-test.c?rev=1641647&r1=1641646&r2=1641647&view=diff ============================================================================== --- subversion/branches/move-tracking-2/subversion/tests/libsvn_fs/fs-test.c (original) +++ subversion/branches/move-tracking-2/subversion/tests/libsvn_fs/fs-test.c Tue Nov 25 16:26:48 2014 @@ -1596,6 +1596,10 @@ merging_commit(const svn_test_opts_t *op SVN_ERR(svn_fs_make_file(txn_root, "theta", pool)); SVN_ERR(svn_test__set_file_contents (txn_root, "theta", "This is another file 'theta'.\n", pool)); + + /* TXN must actually be based upon revisions[4] (instead of HEAD). */ + SVN_TEST_ASSERT(svn_fs_txn_base_revision(txn) == revisions[4]); + SVN_ERR(test_commit_txn(&failed_rev, txn, "/theta", pool)); SVN_ERR(svn_fs_abort_txn(txn, pool)); @@ -1619,6 +1623,9 @@ merging_commit(const svn_test_opts_t *op SVN_ERR(svn_fs_txn_root(&txn_root, txn, pool)); SVN_ERR(svn_fs_delete(txn_root, "A/D/H", pool)); + /* TXN must actually be based upon revisions[1] (instead of HEAD). */ + SVN_TEST_ASSERT(svn_fs_txn_base_revision(txn) == revisions[1]); + /* We used to create the revision like this before fixing issue #2751 -- Directory prop mods reverted in overlapping commits scenario. @@ -5562,11 +5569,11 @@ upgrade_while_committing(const svn_test_ /* Upgrade filesystem, but keep existing svn_fs_t object. */ SVN_ERR(svn_fs_upgrade(fs_path, pool)); - /* Creating a new txn for the old svn_fs_t object shall fail. */ - SVN_TEST_ASSERT_ANY_ERROR(svn_fs_begin_txn(&txn2, fs, head_rev, pool)); + /* Creating a new txn for the old svn_fs_t should not fail. */ + SVN_ERR(svn_fs_begin_txn(&txn2, fs, head_rev, pool)); - /* Committing the already existing txn shall fail as well. */ - SVN_TEST_ASSERT_ANY_ERROR(test_commit_txn(&head_rev, txn1, NULL, pool)); + /* Committing the already existing txn should not fail. */ + SVN_ERR(test_commit_txn(&head_rev, txn1, NULL, pool)); /* Verify filesystem content. */ SVN_ERR(svn_fs_verify(fs_path, NULL, 0, SVN_INVALID_REVNUM, NULL, NULL, @@ -5862,7 +5869,736 @@ purge_txn_test(const svn_test_opts_t *op return SVN_NO_ERROR; } +static svn_error_t * +compare_contents(const svn_test_opts_t *opts, + apr_pool_t *pool) +{ + svn_fs_t *fs; + svn_fs_txn_t *txn; + svn_fs_root_t *txn_root, *root1, *root2; + const char *original = "original contents"; + svn_revnum_t rev; + int i; + apr_pool_t *iterpool = svn_pool_create(pool); + + /* Two similar but different texts that yield the same MD5 digest. */ + const char *evil_text1 + = "\xd1\x31\xdd\x02\xc5\xe6\xee\xc4\x69\x3d\x9a\x06\x98\xaf\xf9\x5c" + "\x2f\xca\xb5\x87\x12\x46\x7e\xab\x40\x04\x58\x3e\xb8\xfb\x7f\x89" + "\x55\xad\x34\x06\x09\xf4\xb3\x02\x83\xe4\x88\x83\x25\x71\x41\x5a" + "\x08\x51\x25\xe8\xf7\xcd\xc9\x9f\xd9\x1d\xbd\xf2\x80\x37\x3c\x5b" + "\xd8\x82\x3e\x31\x56\x34\x8f\x5b\xae\x6d\xac\xd4\x36\xc9\x19\xc6" + "\xdd\x53\xe2\xb4\x87\xda\x03\xfd\x02\x39\x63\x06\xd2\x48\xcd\xa0" + "\xe9\x9f\x33\x42\x0f\x57\x7e\xe8\xce\x54\xb6\x70\x80\xa8\x0d\x1e" + "\xc6\x98\x21\xbc\xb6\xa8\x83\x93\x96\xf9\x65\x2b\x6f\xf7\x2a\x70"; + const char *evil_text2 + = "\xd1\x31\xdd\x02\xc5\xe6\xee\xc4\x69\x3d\x9a\x06\x98\xaf\xf9\x5c" + "\x2f\xca\xb5\x07\x12\x46\x7e\xab\x40\x04\x58\x3e\xb8\xfb\x7f\x89" + "\x55\xad\x34\x06\x09\xf4\xb3\x02\x83\xe4\x88\x83\x25\xf1\x41\x5a" + "\x08\x51\x25\xe8\xf7\xcd\xc9\x9f\xd9\x1d\xbd\x72\x80\x37\x3c\x5b" + "\xd8\x82\x3e\x31\x56\x34\x8f\x5b\xae\x6d\xac\xd4\x36\xc9\x19\xc6" + "\xdd\x53\xe2\x34\x87\xda\x03\xfd\x02\x39\x63\x06\xd2\x48\xcd\xa0" + "\xe9\x9f\x33\x42\x0f\x57\x7e\xe8\xce\x54\xb6\x70\x80\x28\x0d\x1e" + "\xc6\x98\x21\xbc\xb6\xa8\x83\x93\x96\xf9\x65\xab\x6f\xf7\x2a\x70"; + svn_checksum_t *checksum1, *checksum2; + + /* (path, rev) pairs to compare plus the expected API return values */ + struct + { + svn_revnum_t rev1; + const char *path1; + svn_revnum_t rev2; + const char *path2; + + svn_boolean_t different; /* result of svn_fs_*_different */ + svn_tristate_t changed; /* result of svn_fs_*_changed */ + } to_compare[] = + { + /* same representation */ + { 1, "foo", 2, "foo", FALSE, svn_tristate_false }, + { 1, "foo", 2, "bar", FALSE, svn_tristate_false }, + { 2, "foo", 2, "bar", FALSE, svn_tristate_false }, + + /* different content but MD5 check is not reliable */ + { 3, "foo", 3, "bar", TRUE, svn_tristate_true }, + + /* different contents */ + { 1, "foo", 3, "bar", TRUE, svn_tristate_true }, + { 1, "foo", 3, "foo", TRUE, svn_tristate_true }, + { 3, "foo", 4, "bar", TRUE, svn_tristate_true }, + { 3, "foo", 4, "bar", TRUE, svn_tristate_true }, + { 2, "bar", 3, "bar", TRUE, svn_tristate_true }, + { 3, "bar", 4, "bar", TRUE, svn_tristate_true }, + + /* variations on the same theme: same content, possibly different rep */ + { 4, "foo", 4, "bar", FALSE, svn_tristate_unknown }, + { 1, "foo", 4, "bar", FALSE, svn_tristate_unknown }, + { 2, "foo", 4, "bar", FALSE, svn_tristate_unknown }, + { 1, "foo", 4, "foo", FALSE, svn_tristate_unknown }, + { 2, "foo", 4, "foo", FALSE, svn_tristate_unknown }, + { 2, "bar", 4, "bar", FALSE, svn_tristate_unknown }, + + /* EOL */ + { 0 }, + }; + + /* Same same, but different. + * Just checking that we actually have an MD5 collision. */ + SVN_ERR(svn_checksum(&checksum1, svn_checksum_md5, evil_text1, + strlen(evil_text1), pool)); + SVN_ERR(svn_checksum(&checksum2, svn_checksum_md5, evil_text2, + strlen(evil_text2), pool)); + SVN_TEST_ASSERT(svn_checksum_match(checksum1, checksum1)); + SVN_TEST_ASSERT(strcmp(evil_text1, evil_text2)); + + /* Now, build up our test repo. */ + SVN_ERR(svn_test__create_fs(&fs, "test-repo-compare-contents", + opts, pool)); + + /* Rev 1: create a file. */ + SVN_ERR(svn_fs_begin_txn(&txn, fs, 0, iterpool)); + SVN_ERR(svn_fs_txn_root(&txn_root, txn, iterpool)); + SVN_ERR(svn_fs_make_file(txn_root, "foo", iterpool)); + SVN_ERR(svn_test__set_file_contents(txn_root, "foo", original, iterpool)); + SVN_ERR(svn_fs_change_node_prop(txn_root, "foo", "prop", + svn_string_create(original, iterpool), + iterpool)); + SVN_ERR(svn_fs_commit_txn(NULL, &rev, txn, iterpool)); + SVN_TEST_ASSERT(rev == 1); + svn_pool_clear(iterpool); + + /* Rev 2: copy that file. */ + SVN_ERR(svn_fs_revision_root(&root1, fs, rev, iterpool)); + SVN_ERR(svn_fs_begin_txn(&txn, fs, 0, iterpool)); + SVN_ERR(svn_fs_txn_root(&txn_root, txn, iterpool)); + SVN_ERR(svn_fs_copy(root1, "foo", txn_root, "bar", iterpool)); + SVN_ERR(svn_fs_commit_txn(NULL, &rev, txn, iterpool)); + SVN_TEST_ASSERT(rev == 2); + svn_pool_clear(iterpool); + + /* Rev 3: modify both files. + * The new contents differs for both files but has the same length and MD5. + */ + SVN_ERR(svn_fs_begin_txn(&txn, fs, rev, iterpool)); + SVN_ERR(svn_fs_txn_root(&txn_root, txn, iterpool)); + SVN_ERR(svn_test__set_file_contents(txn_root, "foo", evil_text1, iterpool)); + SVN_ERR(svn_test__set_file_contents(txn_root, "bar", evil_text2, iterpool)); + SVN_ERR(svn_fs_change_node_prop(txn_root, "foo", "prop", + svn_string_create(evil_text1, iterpool), + iterpool)); + SVN_ERR(svn_fs_change_node_prop(txn_root, "bar", "prop", + svn_string_create(evil_text2, iterpool), + iterpool)); + SVN_ERR(svn_fs_commit_txn(NULL, &rev, txn, iterpool)); + SVN_TEST_ASSERT(rev == 3); + svn_pool_clear(iterpool); + + /* Rev 4: revert both file contents. + */ + SVN_ERR(svn_fs_begin_txn(&txn, fs, rev, iterpool)); + SVN_ERR(svn_fs_txn_root(&txn_root, txn, iterpool)); + SVN_ERR(svn_test__set_file_contents(txn_root, "foo", original, iterpool)); + SVN_ERR(svn_test__set_file_contents(txn_root, "bar", original, iterpool)); + SVN_ERR(svn_fs_change_node_prop(txn_root, "foo", "prop", + svn_string_create(original, iterpool), + iterpool)); + SVN_ERR(svn_fs_change_node_prop(txn_root, "bar", "prop", + svn_string_create(original, iterpool), + iterpool)); + SVN_ERR(svn_fs_commit_txn(NULL, &rev, txn, iterpool)); + SVN_TEST_ASSERT(rev == 4); + svn_pool_clear(iterpool); + + /* Perform all comparisons listed in TO_COMPARE. */ + for (i = 0; to_compare[i].rev1 > 0; ++i) + { + svn_boolean_t text_different; + svn_boolean_t text_changed; + svn_boolean_t props_different; + svn_boolean_t props_changed; + + svn_pool_clear(iterpool); + SVN_ERR(svn_fs_revision_root(&root1, fs, to_compare[i].rev1, iterpool)); + SVN_ERR(svn_fs_revision_root(&root2, fs, to_compare[i].rev2, iterpool)); + + /* Compare node texts. */ + SVN_ERR(svn_fs_contents_different(&text_different, + root1, to_compare[i].path1, + root2, to_compare[i].path2, + iterpool)); + SVN_ERR(svn_fs_contents_changed(&text_changed, + root1, to_compare[i].path1, + root2, to_compare[i].path2, + iterpool)); + + /* Compare properties. */ + SVN_ERR(svn_fs_props_different(&props_different, + root1, to_compare[i].path1, + root2, to_compare[i].path2, + iterpool)); + SVN_ERR(svn_fs_props_changed(&props_changed, + root1, to_compare[i].path1, + root2, to_compare[i].path2, + iterpool)); + + /* Check results. */ + SVN_TEST_ASSERT(text_different == to_compare[i].different); + SVN_TEST_ASSERT(props_different == to_compare[i].different); + + switch (to_compare[i].changed) + { + case svn_tristate_true: + SVN_TEST_ASSERT(text_changed); + SVN_TEST_ASSERT(props_changed); + break; + + case svn_tristate_false: + SVN_TEST_ASSERT(!text_changed); + SVN_TEST_ASSERT(!props_changed); + break; + + default: + break; + } + } + + svn_pool_destroy(iterpool); + + return SVN_NO_ERROR; +} + +static svn_error_t * +test_path_change_create(const svn_test_opts_t *opts, + apr_pool_t *pool) +{ + svn_fs_t *fs; + svn_fs_root_t *root; + const svn_fs_id_t *id; + svn_fs_path_change2_t *change; + + /* Build an empty test repo ... */ + SVN_ERR(svn_test__create_fs(&fs, "test-repo-path-change-create", + opts, pool)); + + /* ... just to give us a valid ID. */ + SVN_ERR(svn_fs_revision_root(&root, fs, 0, pool)); + SVN_ERR(svn_fs_node_id(&id, root, "", pool)); + + /* Do what we came here for. */ + change = svn_fs_path_change2_create(id, svn_fs_path_change_replace, pool); + + SVN_TEST_ASSERT(change); + SVN_TEST_ASSERT(change->node_rev_id == id); + SVN_TEST_ASSERT(change->change_kind == svn_fs_path_change_replace); + + /* All other fields should be "empty" / "unused". */ + SVN_TEST_ASSERT(change->node_kind == svn_node_none); + + SVN_TEST_ASSERT(change->text_mod == FALSE); + SVN_TEST_ASSERT(change->prop_mod == FALSE); + SVN_TEST_ASSERT(change->mergeinfo_mod == svn_tristate_unknown); + + SVN_TEST_ASSERT(change->copyfrom_known == FALSE); + SVN_TEST_ASSERT(change->copyfrom_rev == SVN_INVALID_REVNUM); + SVN_TEST_ASSERT(change->copyfrom_path == NULL); + + return SVN_NO_ERROR; +} + +static svn_error_t * +test_node_created_info(const svn_test_opts_t *opts, + apr_pool_t *pool) +{ + svn_fs_t *fs; + svn_fs_txn_t *txn; + svn_fs_root_t *txn_root, *root; + svn_revnum_t rev; + int i; + apr_pool_t *iterpool = svn_pool_create(pool); + + /* Test vectors. */ + struct + { + svn_revnum_t rev; + const char *path; + svn_revnum_t crev; + const char *cpath; + } to_check[] = + { + /* New noderev only upon modification. */ + { 1, "A/B/E/beta", 1, "/A/B/E/beta" }, + { 2, "A/B/E/beta", 1, "/A/B/E/beta" }, + { 3, "A/B/E/beta", 3, "/A/B/E/beta" }, + { 4, "A/B/E/beta", 3, "/A/B/E/beta" }, + + /* Lazily copied node. */ + { 2, "Z/B/E/beta", 1, "/A/B/E/beta" }, + { 3, "Z/B/E/beta", 1, "/A/B/E/beta" }, + { 4, "Z/B/E/beta", 4, "/Z/B/E/beta" }, + + /* Bubble-up upon sub-tree change. */ + { 2, "Z", 2, "/Z" }, + { 3, "Z", 2, "/Z" }, + { 4, "Z", 4, "/Z" }, + + { 0 } + }; + + /* Start with a new repo and the greek tree in rev 1. */ + SVN_ERR(svn_test__create_fs(&fs, "test-repo-node-created-path", + opts, pool)); + + SVN_ERR(svn_fs_begin_txn(&txn, fs, 0, iterpool)); + SVN_ERR(svn_fs_txn_root(&txn_root, txn, iterpool)); + SVN_ERR(svn_test__create_greek_tree(txn_root, iterpool)); + SVN_ERR(test_commit_txn(&rev, txn, NULL, iterpool)); + svn_pool_clear(iterpool); + + /* r2: copy a subtree */ + SVN_ERR(svn_fs_begin_txn(&txn, fs, rev, iterpool)); + SVN_ERR(svn_fs_txn_root(&txn_root, txn, iterpool)); + SVN_ERR(svn_fs_revision_root(&root, fs, rev, iterpool)); + SVN_ERR(svn_fs_copy(root, "A", txn_root, "Z", iterpool)); + SVN_ERR(test_commit_txn(&rev, txn, NULL, iterpool)); + svn_pool_clear(iterpool); + + /* r3: touch node in copy source */ + SVN_ERR(svn_fs_begin_txn(&txn, fs, rev, iterpool)); + SVN_ERR(svn_fs_txn_root(&txn_root, txn, iterpool)); + SVN_ERR(svn_test__set_file_contents(txn_root, "A/B/E/beta", "new", iterpool)); + SVN_ERR(test_commit_txn(&rev, txn, NULL, iterpool)); + svn_pool_clear(iterpool); + + /* r4: touch same relative node in copy target */ + SVN_ERR(svn_fs_begin_txn(&txn, fs, rev, iterpool)); + SVN_ERR(svn_fs_txn_root(&txn_root, txn, iterpool)); + SVN_ERR(svn_test__set_file_contents(txn_root, "Z/B/E/beta", "new", iterpool)); + SVN_ERR(test_commit_txn(&rev, txn, NULL, iterpool)); + svn_pool_clear(iterpool); + + /* Now ask for some 'node created' info. */ + for (i = 0; to_check[i].rev > 0; ++i) + { + svn_revnum_t crev; + const char *cpath; + + svn_pool_clear(iterpool); + + /* Get created path and rev. */ + SVN_ERR(svn_fs_revision_root(&root, fs, to_check[i].rev, iterpool)); + SVN_ERR(svn_fs_node_created_path(&cpath, root, to_check[i].path, + iterpool)); + SVN_ERR(svn_fs_node_created_rev(&crev, root, to_check[i].path, + iterpool)); + + /* Compare the results with our expectations. */ + SVN_TEST_STRING_ASSERT(cpath, to_check[i].cpath); + + if (crev != to_check[i].crev) + return svn_error_createf(SVN_ERR_TEST_FAILED, NULL, + "created rev mismatch for %s@%ld:\n" + " expected '%ld'\n" + " found '%ld", + to_check[i].path, + to_check[i].rev, + to_check[i].crev, + crev); + } + + svn_pool_destroy(iterpool); + + return SVN_NO_ERROR; +} + +static svn_error_t * +test_print_modules(const svn_test_opts_t *opts, + apr_pool_t *pool) +{ + const char *expected, *module_name; + svn_stringbuf_t *modules = svn_stringbuf_create_empty(pool); + + /* Name of the providing module */ + if (strcmp(opts->fs_type, "fsx") == 0) + module_name = "fs_x"; + else if (strcmp(opts->fs_type, "fsfs") == 0) + module_name = "fs_fs"; + else if (strcmp(opts->fs_type, "bdb") == 0) + module_name = "fs_base"; + else + return svn_error_createf(SVN_ERR_TEST_SKIPPED, NULL, + "don't know the module name for %s", + opts->fs_type); + + SVN_ERR(svn_fs_print_modules(modules, pool)); + + /* The requested FS type must be listed amongst the available modules. */ + expected = apr_psprintf(pool, "* %s : ", module_name); + SVN_TEST_ASSERT(strstr(modules->data, expected)); + + return SVN_NO_ERROR; +} + +/* Baton to be used with process_file_contents. */ +typedef struct process_file_contents_baton_t +{ + const char *contents; + svn_boolean_t processed; +} process_file_contents_baton_t; + +/* Implements svn_fs_process_contents_func_t. + * We flag the BATON as "processed" and compare the CONTENTS we've got to + * what we expect through the BATON. + */ +static svn_error_t * +process_file_contents(const unsigned char *contents, + apr_size_t len, + void *baton, + apr_pool_t *scratch_pool) +{ + process_file_contents_baton_t *b = baton; + + SVN_TEST_ASSERT(strlen(b->contents) == len); + SVN_TEST_ASSERT(memcmp(b->contents, contents, len) == 0); + b->processed = TRUE; + + return SVN_NO_ERROR; +} + +static svn_error_t * +test_zero_copy_processsing(const svn_test_opts_t *opts, + apr_pool_t *pool) +{ + svn_fs_t *fs; + svn_fs_txn_t *txn; + svn_fs_root_t *txn_root, *root; + svn_revnum_t rev; + const struct svn_test__tree_entry_t *node; + apr_pool_t *iterpool = svn_pool_create(pool); + + /* Start with a new repo and the greek tree in rev 1. */ + SVN_ERR(svn_test__create_fs(&fs, "test-repo-zero-copy-processing", + opts, pool)); + + SVN_ERR(svn_fs_begin_txn(&txn, fs, 0, iterpool)); + SVN_ERR(svn_fs_txn_root(&txn_root, txn, iterpool)); + SVN_ERR(svn_test__create_greek_tree(txn_root, iterpool)); + SVN_ERR(test_commit_txn(&rev, txn, NULL, iterpool)); + svn_pool_clear(iterpool); + + SVN_ERR(svn_fs_revision_root(&root, fs, rev, pool)); + + /* Prime the full-text cache by reading all file contents. */ + for (node = svn_test__greek_tree_nodes; node->path; node++) + if (node->contents) + { + svn_stream_t *stream; + svn_pool_clear(iterpool); + + SVN_ERR(svn_fs_file_contents(&stream, root, node->path, iterpool)); + SVN_ERR(svn_stream_copy3(stream, svn_stream_buffered(iterpool), + NULL, NULL, iterpool)); + } + + /* Now, try to get the data directly from cache + * (if the backend has caches). */ + for (node = svn_test__greek_tree_nodes; node->path; node++) + if (node->contents) + { + svn_boolean_t success; + + process_file_contents_baton_t baton; + baton.contents = node->contents; + baton.processed = FALSE; + + svn_pool_clear(iterpool); + + SVN_ERR(svn_fs_try_process_file_contents(&success, root, node->path, + process_file_contents, &baton, + iterpool)); + SVN_TEST_ASSERT(success == baton.processed); + } + + svn_pool_destroy(iterpool); + + return SVN_NO_ERROR; +} + +static svn_error_t * +test_dir_optimal_order(const svn_test_opts_t *opts, + apr_pool_t *pool) +{ + svn_fs_t *fs; + svn_fs_txn_t *txn; + svn_fs_root_t *txn_root, *root; + svn_revnum_t rev; + apr_hash_t *unordered; + apr_array_header_t *ordered; + int i; + apr_hash_index_t *hi; + + /* Create a new repo and the greek tree in rev 1. */ + SVN_ERR(svn_test__create_fs(&fs, "test-repo-dir-optimal-order", + opts, pool)); + + SVN_ERR(svn_fs_begin_txn(&txn, fs, 0, pool)); + SVN_ERR(svn_fs_txn_root(&txn_root, txn, pool)); + SVN_ERR(svn_test__create_greek_tree(txn_root, pool)); + SVN_ERR(test_commit_txn(&rev, txn, NULL, pool)); + + SVN_ERR(svn_fs_revision_root(&root, fs, rev, pool)); + /* Call the API function we are interested in. */ + SVN_ERR(svn_fs_dir_entries(&unordered, root, "A", pool)); + SVN_ERR(svn_fs_dir_optimal_order(&ordered, root, unordered, pool)); + + /* Verify that all entries are returned. */ + SVN_TEST_ASSERT(ordered->nelts == apr_hash_count(unordered)); + for (hi = apr_hash_first(pool, unordered); hi; hi = apr_hash_next(hi)) + { + svn_boolean_t found = FALSE; + const char *name = apr_hash_this_key(hi); + + /* Compare hash -> array because the array might contain the same + * entry more than once. Since that can't happen in the hash, doing + * it in this direction ensures ORDERED won't contain duplicates. + */ + for (i = 0; !found && i < ordered->nelts; ++i) + { + svn_fs_dirent_t *item = APR_ARRAY_IDX(ordered, i, svn_fs_dirent_t*); + if (strcmp(item->name, name) == 0) + { + found = TRUE; + SVN_TEST_ASSERT(item == apr_hash_this_val(hi)); + } + } + + SVN_TEST_ASSERT(found); + } + + return SVN_NO_ERROR; +} + +static svn_error_t * +test_config_files(const svn_test_opts_t *opts, + apr_pool_t *pool) +{ + svn_fs_t *fs; + apr_array_header_t *files; + int i; + const char *repo_name = "test-repo-config-files"; + + /* Create a empty and get its config files. */ + SVN_ERR(svn_test__create_fs(&fs, repo_name, opts, pool)); + SVN_ERR(svn_fs_info_config_files(&files, fs, pool, pool)); + + /* All files should exist and be below the repo. */ + for (i = 0; i < files->nelts; ++i) + { + svn_node_kind_t kind; + const char *path = APR_ARRAY_IDX(files, i, const char*); + + SVN_ERR(svn_io_check_path(path, &kind, pool)); + + SVN_TEST_ASSERT(kind == svn_node_file); + SVN_TEST_ASSERT(svn_dirent_is_ancestor(repo_name, path)); + } + + return SVN_NO_ERROR; +} + +static svn_error_t * +test_delta_file_stream(const svn_test_opts_t *opts, + apr_pool_t *pool) +{ + svn_fs_t *fs; + svn_fs_txn_t *txn; + svn_fs_root_t *txn_root, *root1, *root2; + svn_revnum_t rev; + + const char *old_content = "some content"; + const char *new_content = "some more content"; + svn_txdelta_window_handler_t delta_handler; + void *delta_baton; + svn_txdelta_stream_t *delta_stream; + svn_stringbuf_t *source = svn_stringbuf_create_empty(pool); + svn_stringbuf_t *dest = svn_stringbuf_create_empty(pool); + + /* Create a new repo. */ + SVN_ERR(svn_test__create_fs(&fs, "test-repo-delta-file-stream", + opts, pool)); + + /* Revision 1: create a file. */ + SVN_ERR(svn_fs_begin_txn(&txn, fs, 0, pool)); + SVN_ERR(svn_fs_txn_root(&txn_root, txn, pool)); + SVN_ERR(svn_fs_make_file(txn_root, "foo", pool)); + SVN_ERR(svn_test__set_file_contents(txn_root, "foo", old_content, pool)); + SVN_ERR(test_commit_txn(&rev, txn, NULL, pool)); + + /* Revision 2: create a file. */ + SVN_ERR(svn_fs_begin_txn(&txn, fs, rev, pool)); + SVN_ERR(svn_fs_txn_root(&txn_root, txn, pool)); + SVN_ERR(svn_test__set_file_contents(txn_root, "foo", new_content, pool)); + SVN_ERR(test_commit_txn(&rev, txn, NULL, pool)); + + SVN_ERR(svn_fs_revision_root(&root1, fs, 1, pool)); + SVN_ERR(svn_fs_revision_root(&root2, fs, 2, pool)); + + /* Test 1: Get delta against empty target. */ + SVN_ERR(svn_fs_get_file_delta_stream(&delta_stream, + NULL, NULL, root1, "foo", pool)); + + svn_stringbuf_setempty(source); + svn_stringbuf_setempty(dest); + + svn_txdelta_apply(svn_stream_from_stringbuf(source, pool), + svn_stream_from_stringbuf(dest, pool), + NULL, NULL, pool, &delta_handler, &delta_baton); + SVN_ERR(svn_txdelta_send_txstream(delta_stream, + delta_handler, + delta_baton, + pool)); + SVN_TEST_STRING_ASSERT(old_content, dest->data); + + /* Test 2: Get delta against previous version. */ + SVN_ERR(svn_fs_get_file_delta_stream(&delta_stream, + root1, "foo", root2, "foo", pool)); + + svn_stringbuf_set(source, old_content); + svn_stringbuf_setempty(dest); + + svn_txdelta_apply(svn_stream_from_stringbuf(source, pool), + svn_stream_from_stringbuf(dest, pool), + NULL, NULL, pool, &delta_handler, &delta_baton); + SVN_ERR(svn_txdelta_send_txstream(delta_stream, + delta_handler, + delta_baton, + pool)); + SVN_TEST_STRING_ASSERT(new_content, dest->data); + + /* Test 3: Get reverse delta. */ + SVN_ERR(svn_fs_get_file_delta_stream(&delta_stream, + root2, "foo", root1, "foo", pool)); + + svn_stringbuf_set(source, new_content); + svn_stringbuf_setempty(dest); + + svn_txdelta_apply(svn_stream_from_stringbuf(source, pool), + svn_stream_from_stringbuf(dest, pool), + NULL, NULL, pool, &delta_handler, &delta_baton); + SVN_ERR(svn_txdelta_send_txstream(delta_stream, + delta_handler, + delta_baton, + pool)); + SVN_TEST_STRING_ASSERT(old_content, dest->data); + + return SVN_NO_ERROR; +} + +static svn_error_t * +test_fs_merge(const svn_test_opts_t *opts, + apr_pool_t *pool) +{ + svn_fs_t *fs; + svn_fs_txn_t *txn; + svn_fs_root_t *txn_root, *root0, *root1; + svn_revnum_t rev; + + /* Very basic test for svn_fs_merge because all the other interesting + * cases get tested implicitly with concurrent txn / commit tests. + * This API is just a thin layer around the internal merge function + * and we simply check that the plumbing between them works. + */ + + /* Create a new repo. */ + SVN_ERR(svn_test__create_fs(&fs, "test-repo-fs-merge", + opts, pool)); + SVN_ERR(svn_fs_revision_root(&root0, fs, 0, pool)); + + /* Revision 1: create a file. */ + SVN_ERR(svn_fs_begin_txn(&txn, fs, 0, pool)); + SVN_ERR(svn_fs_txn_root(&txn_root, txn, pool)); + SVN_ERR(svn_fs_make_file(txn_root, "foo", pool)); + SVN_ERR(test_commit_txn(&rev, txn, NULL, pool)); + SVN_ERR(svn_fs_revision_root(&root1, fs, rev, pool)); + + /* Merge-able txn: create another file. */ + SVN_ERR(svn_fs_begin_txn(&txn, fs, 0, pool)); + SVN_ERR(svn_fs_txn_root(&txn_root, txn, pool)); + SVN_ERR(svn_fs_make_file(txn_root, "bar", pool)); + + SVN_ERR(svn_fs_merge(NULL, root1, "/", txn_root, "/", root0, "/", pool)); + + /* Not merge-able: create the same file file. */ + SVN_ERR(svn_fs_begin_txn(&txn, fs, 0, pool)); + SVN_ERR(svn_fs_txn_root(&txn_root, txn, pool)); + SVN_ERR(svn_fs_make_file(txn_root, "foo", pool)); + + SVN_TEST_ASSERT_ERROR(svn_fs_merge(NULL, root1, "/", txn_root, "/", root0, + "/", pool), SVN_ERR_FS_CONFLICT); + + return SVN_NO_ERROR; +} + +static svn_error_t * +test_fsfs_config_opts(const svn_test_opts_t *opts, + apr_pool_t *pool) +{ + apr_hash_t *fs_config; + svn_fs_t *fs; + const svn_fs_info_placeholder_t *fs_info; + const svn_fs_fsfs_info_t *fsfs_info; + + /* Bail (with SKIP) on known-untestable scenarios */ + if (strcmp(opts->fs_type, "fsfs") != 0) + return svn_error_create(SVN_ERR_TEST_SKIPPED, NULL, + "this will test FSFS repositories only"); + + /* Remove the test directory from previous runs. */ + SVN_ERR(svn_io_remove_dir2("test-fsfs-config-opts", TRUE, NULL, NULL, pool)); + + /* Create the test directory and add it to the test cleanup list. */ + SVN_ERR(svn_io_dir_make("test-fsfs-config-opts", APR_OS_DEFAULT, pool)); + svn_test_add_dir_cleanup("test-fsfs-config-opts"); + + /* Create an FSFS filesystem with default config.*/ + fs_config = apr_hash_make(pool); + svn_hash_sets(fs_config, SVN_FS_CONFIG_FS_TYPE, SVN_FS_TYPE_FSFS); + SVN_ERR(svn_fs_create(&fs, "test-fsfs-config-opts/default", fs_config, pool)); + + /* Re-open FS to test the data on disk. */ + SVN_ERR(svn_fs_open2(&fs, "test-fsfs-config-opts/default", NULL, pool, pool)); + + SVN_ERR(svn_fs_info(&fs_info, fs, pool, pool)); + SVN_TEST_STRING_ASSERT(fs_info->fs_type, SVN_FS_TYPE_FSFS); + fsfs_info = (const void *) fs_info; + + /* Check FSFS specific info. Don't check the SHARD_SIZE, because it depends + * on a compile-time constant and may be overridden. */ + SVN_TEST_ASSERT(fsfs_info->log_addressing); + SVN_TEST_ASSERT(fsfs_info->min_unpacked_rev == 0); + + /* Create an FSFS filesystem with custom settings: disabled log-addressing + * and custom shard size (123). */ + fs_config = apr_hash_make(pool); + svn_hash_sets(fs_config, SVN_FS_CONFIG_FS_TYPE, SVN_FS_TYPE_FSFS); + svn_hash_sets(fs_config, SVN_FS_CONFIG_FSFS_LOG_ADDRESSING, "false"); + svn_hash_sets(fs_config, SVN_FS_CONFIG_FSFS_SHARD_SIZE, "123"); + SVN_ERR(svn_fs_create(&fs, "test-fsfs-config-opts/custom", fs_config, pool)); + + /* Re-open FS to test the data on disk. */ + SVN_ERR(svn_fs_open2(&fs, "test-fsfs-config-opts/custom", NULL, pool, pool)); + + SVN_ERR(svn_fs_info(&fs_info, fs, pool, pool)); + SVN_TEST_STRING_ASSERT(fs_info->fs_type, SVN_FS_TYPE_FSFS); + fsfs_info = (const void *) fs_info; + + /* Check FSFS specific info, including the SHARD_SIZE. */ + SVN_TEST_ASSERT(fsfs_info->log_addressing == FALSE); + SVN_TEST_ASSERT(fsfs_info->shard_size == 123); + SVN_TEST_ASSERT(fsfs_info->min_unpacked_rev == 0); + + return SVN_NO_ERROR; +} /* ------------------------------------------------------------------------ */ /* The test table. */ @@ -5968,6 +6704,26 @@ static struct svn_test_descriptor_t test "test deletion after replace in changed paths list"), SVN_TEST_OPTS_PASS(purge_txn_test, "test purging transactions"), + SVN_TEST_OPTS_PASS(compare_contents, + "compare contents of different nodes"), + SVN_TEST_OPTS_PASS(test_path_change_create, + "test svn_fs_path_change2_create"), + SVN_TEST_OPTS_PASS(test_node_created_info, + "test FS 'node created' info"), + SVN_TEST_OPTS_PASS(test_print_modules, + "test FS module listing"), + SVN_TEST_OPTS_PASS(test_zero_copy_processsing, + "test zero copy file processing"), + SVN_TEST_OPTS_PASS(test_dir_optimal_order, + "test svn_fs_dir_optimal_order"), + SVN_TEST_OPTS_PASS(test_config_files, + "get configuration files"), + SVN_TEST_OPTS_PASS(test_delta_file_stream, + "get a delta stream on a file"), + SVN_TEST_OPTS_PASS(test_fs_merge, + "get merging txns with newer revisions"), + SVN_TEST_OPTS_PASS(test_fsfs_config_opts, + "test creating FSFS repository with different opts"), SVN_TEST_NULL }; Propchange: subversion/branches/move-tracking-2/subversion/tests/libsvn_fs_x/ ------------------------------------------------------------------------------ Merged /subversion/trunk/subversion/tests/libsvn_fs_x:r1634607-1641646 Modified: subversion/branches/move-tracking-2/subversion/tests/libsvn_fs_x/fs-x-pack-test.c URL: http://svn.apache.org/viewvc/subversion/branches/move-tracking-2/subversion/tests/libsvn_fs_x/fs-x-pack-test.c?rev=1641647&r1=1641646&r2=1641647&view=diff ============================================================================== --- subversion/branches/move-tracking-2/subversion/tests/libsvn_fs_x/fs-x-pack-test.c (original) +++ subversion/branches/move-tracking-2/subversion/tests/libsvn_fs_x/fs-x-pack-test.c Tue Nov 25 16:26:48 2014 @@ -294,30 +294,12 @@ pack_filesystem(const svn_test_opts_t *o apr_psprintf(pool, "%d.pack", i / SHARD_SIZE), "pack", SVN_VA_NULL); - /* These files should exist. */ + /* This file should exist. */ SVN_ERR(svn_io_check_path(path, &kind, pool)); if (kind != svn_node_file) return svn_error_createf(SVN_ERR_FS_GENERAL, NULL, "Expected pack file '%s' not found", path); - path = svn_dirent_join_many(pool, REPO_NAME, "revs", - apr_psprintf(pool, "%d.pack", i / SHARD_SIZE), - "pack.l2p", SVN_VA_NULL); - SVN_ERR(svn_io_check_path(path, &kind, pool)); - if (kind != svn_node_file) - return svn_error_createf(SVN_ERR_FS_GENERAL, NULL, - "Expected log-to-phys index file '%s' not found", - path); - - path = svn_dirent_join_many(pool, REPO_NAME, "revs", - apr_psprintf(pool, "%d.pack", i / SHARD_SIZE), - "pack.p2l", SVN_VA_NULL); - SVN_ERR(svn_io_check_path(path, &kind, pool)); - if (kind != svn_node_file) - return svn_error_createf(SVN_ERR_FS_GENERAL, NULL, - "Expected phys-to-log index file '%s' not found", - path); - /* This directory should not exist. */ path = svn_dirent_join_many(pool, REPO_NAME, "revs", apr_psprintf(pool, "%d", i / SHARD_SIZE), Modified: subversion/branches/move-tracking-2/subversion/tests/libsvn_subr/stream-test.c URL: http://svn.apache.org/viewvc/subversion/branches/move-tracking-2/subversion/tests/libsvn_subr/stream-test.c?rev=1641647&r1=1641646&r2=1641647&view=diff ============================================================================== --- subversion/branches/move-tracking-2/subversion/tests/libsvn_subr/stream-test.c (original) +++ subversion/branches/move-tracking-2/subversion/tests/libsvn_subr/stream-test.c Tue Nov 25 16:26:48 2014 @@ -771,6 +771,38 @@ test_stringbuf_from_stream(apr_pool_t *p return SVN_NO_ERROR; } +static svn_error_t * +empty_read_full_fn(void *baton, char *buffer, apr_size_t *len) +{ + *len = 0; + return SVN_NO_ERROR; +} + +static svn_error_t * +test_stream_compressed_read_full(apr_pool_t *pool) +{ + svn_stream_t *stream, *empty_stream; + char buf[1]; + apr_size_t len; + + /* Reading an empty stream with read_full only support should not error. */ + empty_stream = svn_stream_create(NULL, pool); + + /* Create stream with only full read support. */ + svn_stream_set_read2(empty_stream, NULL, empty_read_full_fn); + + stream = svn_stream_compressed(empty_stream, pool); + len = sizeof(buf); + SVN_ERR(svn_stream_read_full(stream, buf, &len)); + if (len > 0) + return svn_error_create(SVN_ERR_TEST_FAILED, NULL, + "Got unexpected result."); + + SVN_ERR(svn_stream_close(stream)); + + return SVN_NO_ERROR; +} + /* The test table. */ static int max_threads = 1; @@ -800,6 +832,8 @@ static struct svn_test_descriptor_t test "base64 decoding allocation problem"), SVN_TEST_PASS2(test_stringbuf_from_stream, "test svn_stringbuf_from_stream"), + SVN_TEST_PASS2(test_stream_compressed_read_full, + "test compression for streams without partial read"), SVN_TEST_NULL }; Modified: subversion/branches/move-tracking-2/subversion/tests/libsvn_wc/wc-test.c URL: http://svn.apache.org/viewvc/subversion/branches/move-tracking-2/subversion/tests/libsvn_wc/wc-test.c?rev=1641647&r1=1641646&r2=1641647&view=diff ============================================================================== --- subversion/branches/move-tracking-2/subversion/tests/libsvn_wc/wc-test.c (original) +++ subversion/branches/move-tracking-2/subversion/tests/libsvn_wc/wc-test.c Tue Nov 25 16:26:48 2014 @@ -141,7 +141,6 @@ test_node_get_base(const svn_test_opts_t NULL, b->wc_ctx, local_abspath, TRUE /* ignore_enoent */, - FALSE /* show_hidden */, b->pool, b->pool)); SVN_TEST_ASSERT(revision == subtest->base_rev); if (SVN_IS_VALID_REVNUM(subtest->base_rev)) Modified: subversion/branches/move-tracking-2/subversion/tests/templates/greek-fsfs-v6.zip URL: http://svn.apache.org/viewvc/subversion/branches/move-tracking-2/subversion/tests/templates/greek-fsfs-v6.zip?rev=1641647&r1=1641646&r2=1641647&view=diff ============================================================================== Binary files - no diff available. Propchange: subversion/branches/move-tracking-2/tools/ ------------------------------------------------------------------------------ Merged /subversion/trunk/tools:r1634607-1641646 Modified: subversion/branches/move-tracking-2/tools/buildbot/slaves/svn-sparc-solaris/svnbuild.sh URL: http://svn.apache.org/viewvc/subversion/branches/move-tracking-2/tools/buildbot/slaves/svn-sparc-solaris/svnbuild.sh?rev=1641647&r1=1641646&r2=1641647&view=diff ============================================================================== --- subversion/branches/move-tracking-2/tools/buildbot/slaves/svn-sparc-solaris/svnbuild.sh (original) +++ subversion/branches/move-tracking-2/tools/buildbot/slaves/svn-sparc-solaris/svnbuild.sh Tue Nov 25 16:26:48 2014 @@ -28,9 +28,10 @@ SVN_VER_MINOR=`awk '/define SVN_VER_MINO cd ../obj grep obj/subversion/tests /etc/mnttab > /dev/null || mount-tmpfs -if [ $SVN_VER_MINOR -eq 8 ]; then - # A bug causes 1.8 --enable-optimize to add -flto which isn't supported - OPTIONS_1_8='--disable-optimize' +# --enable-optimize adds -flto which breaks the 1.8 C tests because +# they link main() from a library. +if [ $SVN_VER_MINOR -gt 8 ]; then + OPTIMIZE_OPTION='--enable-optimize' fi echo "============ configure" @@ -42,7 +43,7 @@ echo "============ configure" --with-sqlite=/export/home/wandisco/buildbot/sqlite-amalgamation-3071501/sqlite3.c \ --enable-optimize \ --disable-shared \ - $OPTIONS_1_8 \ + $OPTIMIZE_OPTION \ || exit $? echo "============ make" Modified: subversion/branches/move-tracking-2/tools/dist/release.py URL: http://svn.apache.org/viewvc/subversion/branches/move-tracking-2/tools/dist/release.py?rev=1641647&r1=1641646&r2=1641647&view=diff ============================================================================== --- subversion/branches/move-tracking-2/tools/dist/release.py (original) +++ subversion/branches/move-tracking-2/tools/dist/release.py Tue Nov 25 16:26:48 2014 @@ -86,22 +86,22 @@ except AttributeError: tool_versions = { 'trunk' : { 'autoconf' : '2.69', - 'libtool' : '2.4.2', + 'libtool' : '2.4.3', 'swig' : '3.0.0', }, '1.9' : { 'autoconf' : '2.69', - 'libtool' : '2.4.2', + 'libtool' : '2.4.3', 'swig' : '3.0.0' }, '1.8' : { 'autoconf' : '2.69', - 'libtool' : '2.4.2', + 'libtool' : '2.4.3', 'swig' : '2.0.9', }, '1.7' : { 'autoconf' : '2.68', - 'libtool' : '2.4', + 'libtool' : '2.4.3', 'swig' : '2.0.4', }, '1.6' : { Modified: subversion/branches/move-tracking-2/tools/hook-scripts/mailer/tests/mailer-init.sh URL: http://svn.apache.org/viewvc/subversion/branches/move-tracking-2/tools/hook-scripts/mailer/tests/mailer-init.sh?rev=1641647&r1=1641646&r2=1641647&view=diff ============================================================================== --- subversion/branches/move-tracking-2/tools/hook-scripts/mailer/tests/mailer-init.sh (original) +++ subversion/branches/move-tracking-2/tools/hook-scripts/mailer/tests/mailer-init.sh Tue Nov 25 16:26:48 2014 @@ -101,14 +101,14 @@ echo change C6 >> dir6/file4 svn commit -m "copy dir, then make a change" # add a binary file and set property to binary value -echo -e "\x00\x01\x02\x03\x04" > file11 +printf "\x00\x01\x02\x03\x04\n" > file11 svn add file11 svn ps svn:mime-type application/octect-stream file11 svn ps prop2 -F file11 file9 svn commit -m "add binary file" # change the binary file and set property to non binary value -echo -e "\x20\x01\x02\x20" > file11 +printf "\x20\x01\x02\x20\n" > file11 svn ps prop2 propval2 file9 svn commit -m "change binary file"
