Modified: subversion/branches/fsx-1.10/subversion/tests/libsvn_wc/wc-test-queries.sql URL: http://svn.apache.org/viewvc/subversion/branches/fsx-1.10/subversion/tests/libsvn_wc/wc-test-queries.sql?rev=1685464&r1=1685463&r2=1685464&view=diff ============================================================================== --- subversion/branches/fsx-1.10/subversion/tests/libsvn_wc/wc-test-queries.sql (original) +++ subversion/branches/fsx-1.10/subversion/tests/libsvn_wc/wc-test-queries.sql Sun Jun 14 20:58:10 2015 @@ -44,8 +44,14 @@ DELETE FROM nodes; -- STMT_INSERT_NODE INSERT INTO nodes (local_relpath, op_depth, presence, repos_path, - revision, parent_relpath, wc_id, repos_id, kind, depth) - VALUES (?1, ?2, ?3, ?4, ?5, ?6, 1, 1, 'dir', 'infinity') + revision, parent_relpath, moved_to, moved_here, + properties, wc_id, repos_id, kind, + depth) + VALUES (?1, ?2, ?3, ?4, ?5, ?6, ?7, ?8, ?9, 1, + CASE WHEN ?3 != 'base-deleted' THEN 1 END, + 'dir', + CASE WHEN ?3 in ('normal', 'incomplete') + THEN 'infinity' END) -- STMT_DELETE_ACTUAL DELETE FROM actual_node; @@ -54,8 +60,18 @@ DELETE FROM actual_node; INSERT INTO actual_node (local_relpath, parent_relpath, changelist, wc_id) VALUES (?1, ?2, ?3, 1) +-- STMT_ENSURE_EMPTY_PRISTINE +INSERT OR IGNORE INTO pristine (checksum, md5_checksum, size, refcount) + VALUES ('$sha1$da39a3ee5e6b4b0d3255bfef95601890afd80709', + '$md5 $d41d8cd98f00b204e9800998ecf8427e', + 0, 0) + -- STMT_NODES_SET_FILE -UPDATE nodes SET kind = 'file' WHERE wc_id = 1 and local_relpath = ?1 +UPDATE nodes + SET kind = 'file', + checksum = '$sha1$da39a3ee5e6b4b0d3255bfef95601890afd80709', + depth = NULL +WHERE wc_id = 1 and local_relpath = ?1 -- STMT_SELECT_ALL_ACTUAL SELECT local_relpath FROM actual_node WHERE wc_id = 1
Modified: subversion/branches/fsx-1.10/subversion/tests/svn_test.h URL: http://svn.apache.org/viewvc/subversion/branches/fsx-1.10/subversion/tests/svn_test.h?rev=1685464&r1=1685463&r2=1685464&view=diff ============================================================================== --- subversion/branches/fsx-1.10/subversion/tests/svn_test.h (original) +++ subversion/branches/fsx-1.10/subversion/tests/svn_test.h Sun Jun 14 20:58:10 2015 @@ -149,6 +149,8 @@ typedef struct svn_test_opts_t const char *repos_dir; /* Repository url: The url to access REPOS_DIR as */ const char *repos_url; + /* Memcached server. */ + const char *memcached_server; /* Repository template: pre-created repository to copy for tests */ const char *repos_template; /* Minor version to use for servers and FS backends, or zero to use Modified: subversion/branches/fsx-1.10/subversion/tests/svn_test_fs.c URL: http://svn.apache.org/viewvc/subversion/branches/fsx-1.10/subversion/tests/svn_test_fs.c?rev=1685464&r1=1685463&r2=1685464&view=diff ============================================================================== --- subversion/branches/fsx-1.10/subversion/tests/svn_test_fs.c (original) +++ subversion/branches/fsx-1.10/subversion/tests/svn_test_fs.c Sun Jun 14 20:58:10 2015 @@ -399,27 +399,30 @@ static svn_error_t * get_dir_entries(apr_hash_t *tree_entries, svn_fs_root_t *root, const char *path, - apr_pool_t *pool) + apr_pool_t *scratch_pool) { apr_hash_t *entries; apr_hash_index_t *hi; + apr_pool_t *iterpool = svn_pool_create(scratch_pool); + apr_pool_t *result_pool = apr_hash_pool_get(tree_entries); - SVN_ERR(svn_fs_dir_entries(&entries, root, path, pool)); + SVN_ERR(svn_fs_dir_entries(&entries, root, path, scratch_pool)); /* Copy this list to the master list with the path prepended to the names */ - for (hi = apr_hash_first(pool, entries); hi; hi = apr_hash_next(hi)) + for (hi = apr_hash_first(scratch_pool, entries); hi; hi = apr_hash_next(hi)) { void *val; svn_fs_dirent_t *dirent; const char *full_path; + svn_pool_clear(iterpool); apr_hash_this(hi, NULL, NULL, &val); dirent = val; /* Calculate the full path of this entry (by appending the name to the path thus far) */ - full_path = svn_path_join(path, dirent->name, pool); + full_path = svn_path_join(path, dirent->name, result_pool); /* Now, copy this dirent to the master hash, but this time, use the full path for the key */ @@ -427,7 +430,7 @@ get_dir_entries(apr_hash_t *tree_entries /* If this entry is a directory, recurse into the tree. */ if (dirent->kind == svn_node_dir) - SVN_ERR(get_dir_entries(tree_entries, root, full_path, pool)); + SVN_ERR(get_dir_entries(tree_entries, root, full_path, iterpool)); } return SVN_NO_ERROR; @@ -500,6 +503,7 @@ svn_test__validate_tree(svn_fs_root_t *r { apr_hash_t *tree_entries, *expected_entries; apr_pool_t *subpool = svn_pool_create(pool); + apr_pool_t *iterpool = svn_pool_create(pool); svn_stringbuf_t *extra_entries = NULL; svn_stringbuf_t *missing_entries = NULL; svn_stringbuf_t *corrupt_entries = NULL; @@ -509,6 +513,13 @@ svn_test__validate_tree(svn_fs_root_t *r /* There should be no entry with this name. */ const char *na_name = "es-vee-en"; + /* Create our master hash for storing the entries */ + tree_entries = apr_hash_make(subpool); + + /* Recursively get the whole tree */ + SVN_ERR(get_dir_entries(tree_entries, root, "", iterpool)); + svn_pool_clear(iterpool); + /* Create a hash for storing our expected entries */ expected_entries = apr_hash_make(subpool); @@ -517,12 +528,6 @@ svn_test__validate_tree(svn_fs_root_t *r apr_hash_set(expected_entries, entries[i].path, APR_HASH_KEY_STRING, &(entries[i])); - /* Create our master hash for storing the entries */ - tree_entries = apr_hash_make(pool); - - /* Begin the recursive directory entry dig */ - SVN_ERR(get_dir_entries(tree_entries, root, "", subpool)); - /* For each entry in our EXPECTED_ENTRIES hash, try to find that entry in the TREE_ENTRIES hash given us by the FS. If we find that object, remove it from the TREE_ENTRIES. If we don't find @@ -536,6 +541,7 @@ svn_test__validate_tree(svn_fs_root_t *r void *val; svn_test__tree_entry_t *entry; + svn_pool_clear(iterpool); apr_hash_this(hi, &key, &keylen, &val); entry = val; @@ -546,7 +552,7 @@ svn_test__validate_tree(svn_fs_root_t *r svn_error_t *err; if ((err = validate_tree_entry(root, entry->path, - entry->contents, subpool))) + entry->contents, iterpool))) { /* If we don't have a corrupt entries string, make one. */ if (! corrupt_entries) @@ -627,6 +633,7 @@ svn_test__validate_tree(svn_fs_root_t *r extra_entries ? extra_entries->data : ""); } + svn_pool_destroy(iterpool); svn_pool_destroy(subpool); return SVN_NO_ERROR; } @@ -675,6 +682,7 @@ svn_test__txn_script_exec(svn_fs_root_t apr_pool_t *pool) { int i; + apr_pool_t *iterpool = svn_pool_create(pool); /* Run through the list of edits, making the appropriate edit on that entry in the TXN_ROOT. */ @@ -685,18 +693,19 @@ svn_test__txn_script_exec(svn_fs_root_t int cmd = script[i].cmd; svn_boolean_t is_dir = (param1 == 0); + svn_pool_clear(iterpool); switch (cmd) { case 'a': if (is_dir) { - SVN_ERR(svn_fs_make_dir(txn_root, path, pool)); + SVN_ERR(svn_fs_make_dir(txn_root, path, iterpool)); } else { - SVN_ERR(svn_fs_make_file(txn_root, path, pool)); + SVN_ERR(svn_fs_make_file(txn_root, path, iterpool)); SVN_ERR(svn_test__set_file_contents(txn_root, path, - param1, pool)); + param1, iterpool)); } break; @@ -706,21 +715,21 @@ svn_test__txn_script_exec(svn_fs_root_t svn_fs_root_t *rev_root; svn_fs_t *fs = svn_fs_root_fs(txn_root); - SVN_ERR(svn_fs_youngest_rev(&youngest, fs, pool)); - SVN_ERR(svn_fs_revision_root(&rev_root, fs, youngest, pool)); - SVN_ERR(svn_fs_copy(rev_root, path, txn_root, param1, pool)); + SVN_ERR(svn_fs_youngest_rev(&youngest, fs, iterpool)); + SVN_ERR(svn_fs_revision_root(&rev_root, fs, youngest, iterpool)); + SVN_ERR(svn_fs_copy(rev_root, path, txn_root, param1, iterpool)); } break; case 'd': - SVN_ERR(svn_fs_delete(txn_root, path, pool)); + SVN_ERR(svn_fs_delete(txn_root, path, iterpool)); break; case 'e': if (! is_dir) { SVN_ERR(svn_test__set_file_contents(txn_root, path, - param1, pool)); + param1, iterpool)); } break; @@ -729,6 +738,7 @@ svn_test__txn_script_exec(svn_fs_root_t } } + svn_pool_destroy(iterpool); return SVN_NO_ERROR; } @@ -765,21 +775,26 @@ svn_test__check_greek_tree(svn_fs_root_t svn_stringbuf_t *rstring; svn_stringbuf_t *content; const struct svn_test__tree_entry_t *node; + apr_pool_t *iterpool = svn_pool_create(pool); /* Loop through the list of files, checking for matching content. */ for (node = svn_test__greek_tree_nodes; node->path; node++) { if (node->contents) { - SVN_ERR(svn_fs_file_contents(&rstream, root, node->path, pool)); - SVN_ERR(svn_test__stream_to_string(&rstring, rstream, pool)); - content = svn_stringbuf_create(node->contents, pool); + svn_pool_clear(iterpool); + + SVN_ERR(svn_fs_file_contents(&rstream, root, node->path, iterpool)); + SVN_ERR(svn_test__stream_to_string(&rstring, rstream, iterpool)); + content = svn_stringbuf_create(node->contents, iterpool); if (! svn_stringbuf_compare(rstring, content)) return svn_error_createf(SVN_ERR_FS_GENERAL, NULL, "data read != data written in file '%s'.", node->path); } } + + svn_pool_destroy(iterpool); return SVN_NO_ERROR; } @@ -789,22 +804,28 @@ svn_test__create_greek_tree_at(svn_fs_ro apr_pool_t *pool) { const struct svn_test__tree_entry_t *node; + apr_pool_t *iterpool = svn_pool_create(pool); for (node = svn_test__greek_tree_nodes; node->path; node++) { - const char *path = svn_relpath_join(root_dir, node->path, pool); + const char *path; + svn_pool_clear(iterpool); + + path = svn_relpath_join(root_dir, node->path, iterpool); if (node->contents) { - SVN_ERR(svn_fs_make_file(txn_root, path, pool)); + SVN_ERR(svn_fs_make_file(txn_root, path, iterpool)); SVN_ERR(svn_test__set_file_contents(txn_root, path, node->contents, - pool)); + iterpool)); } else { - SVN_ERR(svn_fs_make_dir(txn_root, path, pool)); + SVN_ERR(svn_fs_make_dir(txn_root, path, iterpool)); } } + + svn_pool_destroy(iterpool); return SVN_NO_ERROR; } Modified: subversion/branches/fsx-1.10/subversion/tests/svn_test_main.c URL: http://svn.apache.org/viewvc/subversion/branches/fsx-1.10/subversion/tests/svn_test_main.c?rev=1685464&r1=1685463&r2=1685464&view=diff ============================================================================== --- subversion/branches/fsx-1.10/subversion/tests/svn_test_main.c (original) +++ subversion/branches/fsx-1.10/subversion/tests/svn_test_main.c Sun Jun 14 20:58:10 2015 @@ -104,6 +104,7 @@ enum test_options_e { reposdir_opt, reposurl_opt, repostemplate_opt, + memcached_server_opt, mode_filter_opt, sqlite_log_opt, parallel_opt, @@ -144,6 +145,8 @@ static const apr_getopt_option_t cl_opti N_("the url to access reposdir as")}, {"repos-template",repostemplate_opt, 1, N_("the repository to use as template")}, + {"memcached-server", memcached_server_opt, 1, + N_("the memcached server to use")}, {"sqlite-logging", sqlite_log_opt, 0, N_("enable SQLite logging")}, {"parallel", parallel_opt, 0, @@ -158,29 +161,46 @@ static const apr_getopt_option_t cl_opti /* When non-zero, don't remove test directories */ static svn_boolean_t skip_cleanup = FALSE; -/* All cleanup actions are registered as cleanups on this pool. */ -#if !defined(thread_local) && APR_HAS_THREADS +/* All cleanup actions are registered as cleanups on the cleanup_pool, + * which may be thread-specific. */ +#if APR_HAS_THREADS +/* The thread-local data key for the cleanup pool. */ +static apr_threadkey_t *cleanup_pool_key = NULL; -# if __STDC_VERSION__ >= 201112 && !defined __STDC_NO_THREADS__ -# define thread_local _Thread_local -# elif defined(WIN32) && defined(_MSC_VER) -# define thread_local __declspec(thread) -# elif defined(__thread) - /* ### Might work somewhere? */ -# define thread_local __thread -# else - /* gcc defines __thread in some versions, but not all. - ### Who knows how to check for this? - ### stackoverflow recommends __GNUC__ but that breaks on - ### openbsd. */ -# endif -#endif +/* No-op destructor for apr_threadkey_private_create(). */ +static void null_threadkey_dtor(void *stuff) {} + +/* Set the thread-specific cleanup pool. */ +static void set_cleanup_pool(apr_pool_t *pool) +{ + apr_status_t status = apr_threadkey_private_set(pool, cleanup_pool_key); + if (status) + { + printf("apr_threadkey_private_set() failed with code %ld.\n", + (long)status); + exit(1); + } +} + +/* Get the thread-specific cleanup pool. */ +static apr_pool_t *get_cleanup_pool(void) +{ + void *data; + apr_status_t status = apr_threadkey_private_get(&data, cleanup_pool_key); + if (status) + { + printf("apr_threadkey_private_get() failed with code %ld.\n", + (long)status); + exit(1); + } + return data; +} -#ifdef thread_local -#define HAVE_PER_THREAD_CLEANUP -static thread_local apr_pool_t * cleanup_pool = NULL; +# define cleanup_pool (get_cleanup_pool()) +# define HAVE_PER_THREAD_CLEANUP #else static apr_pool_t *cleanup_pool = NULL; +# define set_cleanup_pool(p) (cleanup_pool = (p)) #endif /* Used by test_thread to serialize access to stdout. */ @@ -224,7 +244,7 @@ svn_test_add_dir_cleanup(const char *pat err = svn_mutex__lock(log_mutex); if (err) { - if (verbose_mode) + if (verbose_mode) printf("FAILED svn_mutex__lock in svn_test_add_dir_cleanup.\n"); svn_error_clear(err); return; @@ -241,7 +261,7 @@ svn_test_add_dir_cleanup(const char *pat err = svn_mutex__unlock(log_mutex, NULL); if (err) { - if (verbose_mode) + if (verbose_mode) printf("FAILED svn_mutex__unlock in svn_test_add_dir_cleanup.\n"); svn_error_clear(err); } @@ -508,7 +528,7 @@ test_thread(apr_thread_t *thread, void * = apr_allocator_owner_get(svn_pool_create_allocator(FALSE)); #ifdef HAVE_PER_THREAD_CLEANUP - cleanup_pool = svn_pool_create(thread_root); + set_cleanup_pool(svn_pool_create(thread_root)); #endif pool = svn_pool_create(thread_root); @@ -620,7 +640,7 @@ do_tests_concurrently(const char *progna CHECK_STATUS(result, "Test thread returned an error."); } - + return params.got_error != FALSE; } @@ -729,13 +749,14 @@ svn_test__init_auth_baton(svn_auth_baton SVN_CONFIG_OPTION_PASSWORD_STORES, "windows-cryptoapi"); - SVN_ERR(svn_cmdline_create_auth_baton(ab, - TRUE /* non_interactive */, - "jrandom", "rayjandom", - NULL, - TRUE /* no_auth_cache */, - FALSE /* trust_server_cert */, - cfg_config, NULL, NULL, result_pool)); + SVN_ERR(svn_cmdline_create_auth_baton2(ab, + TRUE /* non_interactive */, + "jrandom", "rayjandom", + NULL, + TRUE /* no_auth_cache */, + TRUE /* trust_server_cert_unkown_ca */, + FALSE, FALSE, FALSE, FALSE, + cfg_config, NULL, NULL, result_pool)); return SVN_NO_ERROR; } @@ -780,6 +801,19 @@ svn_test_main(int argc, const char *argv svn_error_clear(err); } + /* Set up the thread-local storage key for the cleanup pool. */ +#ifdef HAVE_PER_THREAD_CLEANUP + apr_err = apr_threadkey_private_create(&cleanup_pool_key, + null_threadkey_dtor, + pool); + if (apr_err) + { + printf("apr_threadkey_private_create() failed with code %ld.\n", + (long)apr_err); + exit(1); + } +#endif /* HAVE_PER_THREAD_CLEANUP */ + /* Remember the command line */ test_argc = argc; test_argv = argv; @@ -884,6 +918,10 @@ svn_test_main(int argc, const char *argv opts.repos_template = svn_dirent_internal_style(opts.repos_template, pool); break; + case memcached_server_opt: + SVN_INT_ERR(svn_utf_cstring_to_utf8(&opts.memcached_server, opt_arg, + pool)); + break; case list_opt: list_mode = TRUE; break; @@ -954,7 +992,7 @@ svn_test_main(int argc, const char *argv } /* Create an iteration pool for the tests */ - cleanup_pool = svn_pool_create(pool); + set_cleanup_pool(svn_pool_create(pool)); test_pool = svn_pool_create(pool); if (!allow_segfaults) Modified: subversion/branches/fsx-1.10/tools/buildbot/slaves/i686-debian-sarge1/svnlog.sh URL: http://svn.apache.org/viewvc/subversion/branches/fsx-1.10/tools/buildbot/slaves/i686-debian-sarge1/svnlog.sh?rev=1685464&r1=1685463&r2=1685464&view=diff ============================================================================== --- subversion/branches/fsx-1.10/tools/buildbot/slaves/i686-debian-sarge1/svnlog.sh (original) +++ subversion/branches/fsx-1.10/tools/buildbot/slaves/i686-debian-sarge1/svnlog.sh Sun Jun 14 20:58:10 2015 @@ -25,7 +25,7 @@ set -x # upload file to server FILENAME=tests-`date +%Y%m%d%H%M`.log.tgz tar -czf $FILENAME tests.log -ftp -n www.mobsol.be < ../ftpscript +ftp -n www.mobsol.be < ../ftpscript rm $FILENAME echo "Logs of the testrun can be found here: http://www.mobsol.be/logs/eh-debsarge1/$FILENAME" Modified: subversion/branches/fsx-1.10/tools/buildbot/slaves/svn-sparc-solaris/svncheck.sh URL: http://svn.apache.org/viewvc/subversion/branches/fsx-1.10/tools/buildbot/slaves/svn-sparc-solaris/svncheck.sh?rev=1685464&r1=1685463&r2=1685464&view=diff ============================================================================== --- subversion/branches/fsx-1.10/tools/buildbot/slaves/svn-sparc-solaris/svncheck.sh (original) +++ subversion/branches/fsx-1.10/tools/buildbot/slaves/svn-sparc-solaris/svncheck.sh Sun Jun 14 20:58:10 2015 @@ -30,10 +30,10 @@ export LD_PRELOAD_64 if [ $SVN_VER_MINOR -eq 9 ]; then echo "============ make svnserveautocheck" - make svnserveautocheck CLEANUP=1 PARALLEL=30 THREADED=1 + make svnserveautocheck CLEANUP=1 PARALLEL=30 THREADED=1 || exit $? else echo "============ make check" - make check CLEANUP=1 PARALLEL=30 THREADED=1 + make check CLEANUP=1 PARALLEL=30 THREADED=1 || exit $? fi exit 0 Modified: subversion/branches/fsx-1.10/tools/buildbot/slaves/svn-x64-centos/svnbuild.sh URL: http://svn.apache.org/viewvc/subversion/branches/fsx-1.10/tools/buildbot/slaves/svn-x64-centos/svnbuild.sh?rev=1685464&r1=1685463&r2=1685464&view=diff ============================================================================== --- subversion/branches/fsx-1.10/tools/buildbot/slaves/svn-x64-centos/svnbuild.sh (original) +++ subversion/branches/fsx-1.10/tools/buildbot/slaves/svn-x64-centos/svnbuild.sh Sun Jun 14 20:58:10 2015 @@ -33,7 +33,7 @@ if [ $SVN_VER_MINOR -ge 9 ]; then APR=/home/bt/packages/apr-1.3.9-prefix/bin/apr-1-config APU=/home/bt/packages/apr-1.3.9-prefix/bin/apu-1-config APXS=/home/bt/packages/apr-1.3.9-prefix/bin/apxs - SERF=/home/bt/packages/apr-1.3.9-prefix + SERF=/home/bt/packages/apr-1.3.9-prefix else APR=/usr APU=/usr Modified: subversion/branches/fsx-1.10/tools/buildbot/slaves/svn-x64-centos/svnlog.sh URL: http://svn.apache.org/viewvc/subversion/branches/fsx-1.10/tools/buildbot/slaves/svn-x64-centos/svnlog.sh?rev=1685464&r1=1685463&r2=1685464&view=diff ============================================================================== --- subversion/branches/fsx-1.10/tools/buildbot/slaves/svn-x64-centos/svnlog.sh (original) +++ subversion/branches/fsx-1.10/tools/buildbot/slaves/svn-x64-centos/svnlog.sh Sun Jun 14 20:58:10 2015 @@ -25,7 +25,7 @@ set -x # upload file to server FILENAME=tests-`date +%Y%m%d%H%M`.log.tgz tar -czf $FILENAME tests.log -ftp -n www.mobsol.be < ../ftpscript +ftp -n www.mobsol.be < ../ftpscript rm $FILENAME echo "Logs of the testrun can be found here: http://www.mobsol.be/logs/eh-debsarge1/$FILENAME" Modified: subversion/branches/fsx-1.10/tools/buildbot/slaves/svn-x64-macosx-gnu-shared-daily-ra_serf/svnlog.sh URL: http://svn.apache.org/viewvc/subversion/branches/fsx-1.10/tools/buildbot/slaves/svn-x64-macosx-gnu-shared-daily-ra_serf/svnlog.sh?rev=1685464&r1=1685463&r2=1685464&view=diff ============================================================================== --- subversion/branches/fsx-1.10/tools/buildbot/slaves/svn-x64-macosx-gnu-shared-daily-ra_serf/svnlog.sh (original) +++ subversion/branches/fsx-1.10/tools/buildbot/slaves/svn-x64-macosx-gnu-shared-daily-ra_serf/svnlog.sh Sun Jun 14 20:58:10 2015 @@ -23,7 +23,7 @@ # upload file to server FILENAME=tests-`date +%Y%m%d%H%M`.log.tgz tar -czf $FILENAME tests.log -ftp -n www.mobsol.be < ../ftpscript +ftp -n www.mobsol.be < ../ftpscript rm $FILENAME echo "Logs of the testrun can be found here: http://www.mobsol.be/logs/osx10.4-gcc4.0.1-ia32/$FILENAME" Modified: subversion/branches/fsx-1.10/tools/buildbot/slaves/svn-x64-macosx-gnu-shared/svnlog.sh URL: http://svn.apache.org/viewvc/subversion/branches/fsx-1.10/tools/buildbot/slaves/svn-x64-macosx-gnu-shared/svnlog.sh?rev=1685464&r1=1685463&r2=1685464&view=diff ============================================================================== --- subversion/branches/fsx-1.10/tools/buildbot/slaves/svn-x64-macosx-gnu-shared/svnlog.sh (original) +++ subversion/branches/fsx-1.10/tools/buildbot/slaves/svn-x64-macosx-gnu-shared/svnlog.sh Sun Jun 14 20:58:10 2015 @@ -23,7 +23,7 @@ # upload file to server FILENAME=tests-`date +%Y%m%d%H%M`.log.tgz tar -czf $FILENAME tests.log -ftp -n www.mobsol.be < ../ftpscript +ftp -n www.mobsol.be < ../ftpscript rm $FILENAME echo "Logs of the testrun can be found here: http://www.mobsol.be/logs/osx10.4-gcc4.0.1-ia32/$FILENAME" Modified: subversion/branches/fsx-1.10/tools/buildbot/slaves/svn-x64-macosx/mkramdisk.sh URL: http://svn.apache.org/viewvc/subversion/branches/fsx-1.10/tools/buildbot/slaves/svn-x64-macosx/mkramdisk.sh?rev=1685464&r1=1685463&r2=1685464&view=diff ============================================================================== --- subversion/branches/fsx-1.10/tools/buildbot/slaves/svn-x64-macosx/mkramdisk.sh (original) +++ subversion/branches/fsx-1.10/tools/buildbot/slaves/svn-x64-macosx/mkramdisk.sh Sun Jun 14 20:58:10 2015 @@ -24,15 +24,40 @@ if [ -z "$1" ]; then exit 1 fi +if [ -z "$2" ]; then + echo "Missing parameter: RAMdisk config file" + exit 1 +fi + volume="/Volumes/$1" +ramconf="$2" -mount | fgrep "on ${volume} " >/dev/null || { +ramconfpath=$(dirname "${ramconf}") +if [ ! -d "${ramconfpath}" ]; then + echo "Missing RAMdisk config file path: ${ramconfpath}" + exit 1 +fi +if [ -f "${ramconf}" ]; then + echo "RAMdisk config file exists: ${ramconf}" + exit 1 +fi + +if [ -d "${volume}" ]; then + echo "Mount point exists: ${volume}" + exit 1 +fi + +mount | grep "^/dev/disk[0-9][0-9]* on ${volume} (hfs" >/dev/null || { set -e + echo -n "" > "${ramconf}" + # Make sure we strip trailing spaces from the result of older # versions of hduitil. - device=$(echo $(hdiutil attach -nomount ram://900000)) + device=$(echo $(hdiutil attach -nomount ram://1000000)) newfs_hfs -M 0700 -v "$1" "${device}" hdiutil mountvol "${device}" + + echo -n "${device}" > "${ramconf}" } exit 0 Modified: subversion/branches/fsx-1.10/tools/buildbot/slaves/svn-x64-macosx/rmramdisk.sh URL: http://svn.apache.org/viewvc/subversion/branches/fsx-1.10/tools/buildbot/slaves/svn-x64-macosx/rmramdisk.sh?rev=1685464&r1=1685463&r2=1685464&view=diff ============================================================================== --- subversion/branches/fsx-1.10/tools/buildbot/slaves/svn-x64-macosx/rmramdisk.sh (original) +++ subversion/branches/fsx-1.10/tools/buildbot/slaves/svn-x64-macosx/rmramdisk.sh Sun Jun 14 20:58:10 2015 @@ -24,11 +24,39 @@ if [ -z "$1" ]; then exit 1 fi +if [ -z "$2" ]; then + echo "Missing parameter: RAMdisk config file" + exit 1 +fi + volume="/Volumes/$1" +ramconf="$2" + +if [ ! -f "${ramconf}" ]; then + mount | grep "^/dev/disk[0-9][0-9]* on ${volume} (hfs" || { + echo "Not mounted: ${volume}" + exit 0 + } + echo "Missing RAMdisk config file: ${ramconf}" + exit 1 +fi + +if [ ! -d "${volume}" ]; then + echo "Mount point missing: ${volume}" + exit 1 +fi + +device=$(cat "${ramconf}") +devfmt=$(echo "${device}" | grep "^/dev/disk[0-9][0-9]*$") +if [ "${device}" != "${devfmt}" ]; then + echo "Invalid device name: ${device}" + exit 1 +fi -mount | fgrep "on ${volume} " >/dev/null && { +mount | grep "^${device} on ${volume} (hfs" >/dev/null && { set -e - hdiutil detach "${volume}" -force + rm "${ramconf}" + hdiutil detach "${device}" -force } exit 0 Modified: subversion/branches/fsx-1.10/tools/buildbot/slaves/svn-x64-macosx/setenv.sh URL: http://svn.apache.org/viewvc/subversion/branches/fsx-1.10/tools/buildbot/slaves/svn-x64-macosx/setenv.sh?rev=1685464&r1=1685463&r2=1685464&view=diff ============================================================================== --- subversion/branches/fsx-1.10/tools/buildbot/slaves/svn-x64-macosx/setenv.sh (original) +++ subversion/branches/fsx-1.10/tools/buildbot/slaves/svn-x64-macosx/setenv.sh Sun Jun 14 20:58:10 2015 @@ -50,12 +50,14 @@ export SVNBB_APR_15 export SVNBB_APR_20_DEV export SVNBB_JUNIT export SVNBB_PARALLEL -export LIBTOOL_CONFIG # Set the absolute source path abssrc=$(pwd) +# Set the path to the RAMdisk device name file +ramconf=$(dirname "${abssrc}")/ramdisk.conf + # The RAMdisk volume name is the same as the name of the builder volume_name=$(basename $(dirname "${abssrc}")) if [ -z "${volume_name}" ]; then Modified: subversion/branches/fsx-1.10/tools/buildbot/slaves/svn-x64-macosx/svnbuild.sh URL: http://svn.apache.org/viewvc/subversion/branches/fsx-1.10/tools/buildbot/slaves/svn-x64-macosx/svnbuild.sh?rev=1685464&r1=1685463&r2=1685464&view=diff ============================================================================== --- subversion/branches/fsx-1.10/tools/buildbot/slaves/svn-x64-macosx/svnbuild.sh (original) +++ subversion/branches/fsx-1.10/tools/buildbot/slaves/svn-x64-macosx/svnbuild.sh Sun Jun 14 20:58:10 2015 @@ -24,7 +24,7 @@ scripts=$(cd $(dirname "$0") && pwd) . ${scripts}/setenv.sh -${scripts}/mkramdisk.sh ${volume_name} +${scripts}/mkramdisk.sh ${volume_name} ${ramconf} # These are the default APR and Serf config options serfconfig="--with-serf=${SVNBB_SERF} --with-apxs=/usr/sbin/apxs" @@ -80,7 +80,7 @@ cd ${absbld} env CC=clang CXX=clang++ \ ${abssrc}/configure \ --prefix="${absbld}/.install-prefix" \ - --disable-debug${optimizeconfig} \ + --enable-debug${optimizeconfig} \ --disable-nls \ --disable-mod-activation \ ${aprconfig}${serfconfig} \ Modified: subversion/branches/fsx-1.10/tools/buildbot/slaves/svn-x64-macosx/svncheck-bindings.sh URL: http://svn.apache.org/viewvc/subversion/branches/fsx-1.10/tools/buildbot/slaves/svn-x64-macosx/svncheck-bindings.sh?rev=1685464&r1=1685463&r2=1685464&view=diff ============================================================================== --- subversion/branches/fsx-1.10/tools/buildbot/slaves/svn-x64-macosx/svncheck-bindings.sh (original) +++ subversion/branches/fsx-1.10/tools/buildbot/slaves/svn-x64-macosx/svncheck-bindings.sh Sun Jun 14 20:58:10 2015 @@ -20,10 +20,11 @@ run_tests() { check="$1" + cleanup="$2" echo "============ make check-${check}" cd ${absbld} - make check-${check} || exit 1 + make check-${check} ${cleanup} || exit 1 } @@ -53,6 +54,6 @@ done ${check_swig_py} && run_tests swig-py ${check_swig_pl} && run_tests swig-pl ${check_swig_rb} && run_tests swig-rb -${check_javahl} && run_tests javahl +${check_javahl} && run_tests javahl JAVAHL_CLEANUP=1 exit 0 Modified: subversion/branches/fsx-1.10/tools/buildbot/slaves/svn-x64-macosx/svnclean.sh URL: http://svn.apache.org/viewvc/subversion/branches/fsx-1.10/tools/buildbot/slaves/svn-x64-macosx/svnclean.sh?rev=1685464&r1=1685463&r2=1685464&view=diff ============================================================================== --- subversion/branches/fsx-1.10/tools/buildbot/slaves/svn-x64-macosx/svnclean.sh (original) +++ subversion/branches/fsx-1.10/tools/buildbot/slaves/svn-x64-macosx/svnclean.sh Sun Jun 14 20:58:10 2015 @@ -24,4 +24,4 @@ scripts=$(cd $(dirname "$0") && pwd) . ${scripts}/setenv.sh -${scripts}/rmramdisk.sh ${volume_name} +${scripts}/rmramdisk.sh ${volume_name} ${ramconf} Modified: subversion/branches/fsx-1.10/tools/buildbot/slaves/ubuntu-x64/svnlog.sh URL: http://svn.apache.org/viewvc/subversion/branches/fsx-1.10/tools/buildbot/slaves/ubuntu-x64/svnlog.sh?rev=1685464&r1=1685463&r2=1685464&view=diff ============================================================================== --- subversion/branches/fsx-1.10/tools/buildbot/slaves/ubuntu-x64/svnlog.sh (original) +++ subversion/branches/fsx-1.10/tools/buildbot/slaves/ubuntu-x64/svnlog.sh Sun Jun 14 20:58:10 2015 @@ -25,7 +25,7 @@ set -x # upload file to server FILENAME=tests-`date +%Y%m%d%H%M`.log.tgz tar -czf $FILENAME tests.log -ftp -n www.mobsol.be < ../ftpscript +ftp -n www.mobsol.be < ../ftpscript rm $FILENAME echo "Logs of the testrun can be found here: http://www.mobsol.be/logs/eh-debsarge1/$FILENAME" Modified: subversion/branches/fsx-1.10/tools/buildbot/slaves/win32-SharpSvn/svntest-bindings.cmd URL: http://svn.apache.org/viewvc/subversion/branches/fsx-1.10/tools/buildbot/slaves/win32-SharpSvn/svntest-bindings.cmd?rev=1685464&r1=1685463&r2=1685464&view=diff ============================================================================== --- subversion/branches/fsx-1.10/tools/buildbot/slaves/win32-SharpSvn/svntest-bindings.cmd (original) +++ subversion/branches/fsx-1.10/tools/buildbot/slaves/win32-SharpSvn/svntest-bindings.cmd Sun Jun 14 20:58:10 2015 @@ -80,29 +80,6 @@ if "%SVN_BRANCH%" GTR "1.9." ( echo Done. ) -) ELSE IF "%SVN_BRANCH%" GTR "1.8." ( - - mkdir "%TESTDIR%\swig\pl-debug\SVN" - mkdir "%TESTDIR%\swig\pl-debug\auto\SVN" - xcopy subversion\bindings\swig\perl\native\*.pm "%TESTDIR%\swig\pl-debug\SVN" > nul: - pushd debug\subversion\bindings\swig\perl\native - for %%i in (*.dll) do ( - set name=%%i - mkdir "%TESTDIR%\swig\pl-debug\auto\SVN\!name:~0,-4!" - xcopy "!name:~0,-4!.*" "%TESTDIR%\swig\pl-debug\auto\SVN\!name:~0,-4!" > nul: - xcopy /y "_Core.dll" "%TESTDIR%\swig\pl-debug\auto\SVN\!name:~0,-4!" > nul: - ) - popd - - - SET PERL5LIB=%PERL5LIB%;%TESTDIR%\swig\pl-debug; - pushd subversion\bindings\swig\perl\native - perl -MExtUtils::Command::MM -e "test_harness()" t\*.t - IF ERRORLEVEL 1 ( - echo [Test runner reported error !ERRORLEVEL!] - REM SET result=1 - ) - popd ) if "%SVN_BRANCH%" GTR "1.9." ( Modified: subversion/branches/fsx-1.10/tools/buildbot/slaves/win32-SharpSvn/svntest-build-bindings.cmd URL: http://svn.apache.org/viewvc/subversion/branches/fsx-1.10/tools/buildbot/slaves/win32-SharpSvn/svntest-build-bindings.cmd?rev=1685464&r1=1685463&r2=1685464&view=diff ============================================================================== --- subversion/branches/fsx-1.10/tools/buildbot/slaves/win32-SharpSvn/svntest-build-bindings.cmd (original) +++ subversion/branches/fsx-1.10/tools/buildbot/slaves/win32-SharpSvn/svntest-build-bindings.cmd Sun Jun 14 20:58:10 2015 @@ -31,7 +31,7 @@ IF "%SVN_BRANCH%" LEQ "1.6.x" ( SET DEBUG_TARGETS=/t:__ALL_TESTS__ SET RELEASE_TARGETS=/t:__SWIG_PYTHON__ -if "%SVN_BRANCH%" GTR "1.8." ( +if "%SVN_BRANCH%" GTR "1.9." ( SET DEBUG_TARGETS=%DEBUG_TARGETS% /t:__SWIG_PERL__ ) Modified: subversion/branches/fsx-1.10/tools/client-side/bash_completion URL: http://svn.apache.org/viewvc/subversion/branches/fsx-1.10/tools/client-side/bash_completion?rev=1685464&r1=1685463&r2=1685464&view=diff ============================================================================== --- subversion/branches/fsx-1.10/tools/client-side/bash_completion (original) +++ subversion/branches/fsx-1.10/tools/client-side/bash_completion Sun Jun 14 20:58:10 2015 @@ -167,7 +167,7 @@ _svn() cmds="$cmds info list ls lock log merge mergeinfo mkdir move mv rename" cmds="$cmds patch propdel pdel propedit pedit propget pget proplist" cmds="$cmds plist propset pset relocate resolve resolved revert status" - cmds="$cmds switch unlock update upgrade youngest" + cmds="$cmds switch unlock update upgrade" # help options have a strange command status... local helpOpts='--help -h' @@ -781,7 +781,8 @@ _svn() # otherwise build possible options for the command pOpts="--username --password --no-auth-cache --non-interactive \ - --trust-server-cert --force-interactive" + --trust-server-cert-failures \ + --force-interactive" mOpts="-m --message -F --file --encoding --force-log --with-revprop" rOpts="-r --revision" qOpts="-q --quiet" @@ -827,7 +828,7 @@ _svn() ;; copy|cp) cmdOpts="$mOpts $rOpts $qOpts --editor-cmd $pOpts --parents \ - --ignore-externals" + --ignore-externals --pin-externals" ;; delete|del|remove|rm) cmdOpts="--force $mOpts $qOpts --targets --editor-cmd $pOpts \ @@ -854,7 +855,8 @@ _svn() ;; info) cmdOpts="$pOpts $rOpts --targets -R --recursive --depth \ - --include-externals --incremental --xml $cOpts" + --include-externals --incremental --xml \ + --show-item --no-newline $cOpts" ;; list|ls) cmdOpts="$rOpts -v --verbose -R --recursive $pOpts \ @@ -869,12 +871,12 @@ _svn() --incremental --xml $qOpts -l --limit -c --change \ $gOpts --with-all-revprops --with-revprop --depth \ --diff --diff-cmd -x --extensions --internal-diff \ - --with-no-revprops --search --search-and --auto-moves" + --with-no-revprops --search --search-and" ;; merge) cmdOpts="$rOpts $nOpts $qOpts --force --dry-run --diff3-cmd \ $pOpts --ignore-ancestry -c --change -x --extensions \ - --record-only --accept --reintegrate \ + --record-only --accept \ --allow-mixed-revisions -v --verbose" ;; mergeinfo) @@ -903,7 +905,7 @@ _svn() cmdOpts="$cmdOpts --revprop $rOpts" ;; propget|pget|pg) - cmdOpts="-v --verbose -R --recursive $rOpts --strict \ + cmdOpts="-v --verbose -R --recursive $rOpts --no-newline \ $pOpts $cOpts --depth --xml --show-inherited-props" [[ $isRevProp || ! $prop ]] && cmdOpts="$cmdOpts --revprop" ;; @@ -935,7 +937,7 @@ _svn() status|stat|st) cmdOpts="-u --show-updates -v --verbose $nOpts $qOpts $pOpts \ --no-ignore --ignore-externals --incremental --xml \ - $cOpts" + $rOpts $cOpts" ;; switch|sw) cmdOpts="--relocate $rOpts $nOpts $qOpts $pOpts --diff3-cmd \ @@ -953,9 +955,6 @@ _svn() upgrade) cmdOpts="$qOpts $pOpts" ;; - youngest) - cmdOpts="$pOpts --no-newline" - ;; *) ;; esac Modified: subversion/branches/fsx-1.10/tools/client-side/bash_completion_test URL: http://svn.apache.org/viewvc/subversion/branches/fsx-1.10/tools/client-side/bash_completion_test?rev=1685464&r1=1685463&r2=1685464&view=diff ============================================================================== --- subversion/branches/fsx-1.10/tools/client-side/bash_completion_test (original) +++ subversion/branches/fsx-1.10/tools/client-side/bash_completion_test Sun Jun 14 20:58:10 2015 @@ -114,14 +114,18 @@ get_svn_subcommands() { # Usage: get_svn_options SUBCMD get_svn_options() { { svn help "$1" | + # Remove deprecated options + grep -v deprecated | # Find the relevant lines; remove "arg" and description. sed -n -e '1,/^Valid options:$/d;/^ -/!d' \ -e 's/\( ARG\)* * : .*//;p' | # Remove brackets; put each word on its own line. tr -d '] ' | tr '[' '\n' # The following options are always accepted but not listed in the help - echo "-h" - echo "--help" + if [ "$1" != "help" ] ; then + echo "-h" + echo "--help" + fi } | sort } Modified: subversion/branches/fsx-1.10/tools/client-side/svn-ssl-fingerprints.sh URL: http://svn.apache.org/viewvc/subversion/branches/fsx-1.10/tools/client-side/svn-ssl-fingerprints.sh?rev=1685464&r1=1685463&r2=1685464&view=diff ============================================================================== --- subversion/branches/fsx-1.10/tools/client-side/svn-ssl-fingerprints.sh (original) +++ subversion/branches/fsx-1.10/tools/client-side/svn-ssl-fingerprints.sh Sun Jun 14 20:58:10 2015 @@ -20,7 +20,7 @@ # # # $0 --- list the fingerprints of SSL certificates that svn has seen before. -# +# # SYNOPSIS: # $0 # $0 /path/to/.subversion Modified: subversion/branches/fsx-1.10/tools/dev/benchmarks/RepoPerf/copy_repo.py URL: http://svn.apache.org/viewvc/subversion/branches/fsx-1.10/tools/dev/benchmarks/RepoPerf/copy_repo.py?rev=1685464&r1=1685463&r2=1685464&view=diff ============================================================================== --- subversion/branches/fsx-1.10/tools/dev/benchmarks/RepoPerf/copy_repo.py (original) +++ subversion/branches/fsx-1.10/tools/dev/benchmarks/RepoPerf/copy_repo.py Sun Jun 14 20:58:10 2015 @@ -137,7 +137,7 @@ class Repository: @classmethod def is_repository(cls, path): """ Quick check that PATH is (probably) a repository. - This is mainly to filter out aux files put next to + This is mainly to filter out aux files put next to (not inside) the repositories to copy. """ format_path = os.path.join(path, 'db', 'format') Modified: subversion/branches/fsx-1.10/tools/dev/benchmarks/RepoPerf/win_repo_bench.py URL: http://svn.apache.org/viewvc/subversion/branches/fsx-1.10/tools/dev/benchmarks/RepoPerf/win_repo_bench.py?rev=1685464&r1=1685463&r2=1685464&view=diff ============================================================================== --- subversion/branches/fsx-1.10/tools/dev/benchmarks/RepoPerf/win_repo_bench.py (original) +++ subversion/branches/fsx-1.10/tools/dev/benchmarks/RepoPerf/win_repo_bench.py Sun Jun 14 20:58:10 2015 @@ -115,7 +115,7 @@ def run_cs_command(state, config, reposi # Display the operation repo_title = repository.replace('nonpacked', 'nopack') - print state, "\t", repo_title, "\t", prefix, "\t", config, "\t", + print state, "\t", repo_title, "\t", prefix, "\t", config, "\t", sys.stdout.flush() # Execute the command and show the execution times @@ -146,18 +146,18 @@ def run_test_cs_sequence(config, reposit run_cs_command("Cold", config, repository, prefix, args) stop_server(prefix) - # OS caches are quite hot now. + # OS caches are quite hot now. # Run operation from hot OS caches but cold SVN caches. start_server(prefix, config) run_cs_command("WarmOS", config, repository, prefix, args) stop_server(prefix) - # OS caches may be even hotter now. + # OS caches may be even hotter now. # Run operation from hot OS caches but cold SVN caches. start_server(prefix, config) run_cs_command("HotOS", config, repository, prefix, args) - # Keep server process and thus the warmed up SVN caches. + # Keep server process and thus the warmed up SVN caches. # Run operation from hot OS and SVN caches. run_cs_command("WrmSVN", config, repository, prefix, args) run_cs_command("HotSVN", config, repository, prefix, args) @@ -215,7 +215,7 @@ def run_admin_command(state, config, rep else: extra = [] - print state, "\t", repository, "\t", config, "\t", + print state, "\t", repository, "\t", config, "\t", sys.stdout.flush() subprocess.call(["TimeWin.exe", exe] + args + extra) Modified: subversion/branches/fsx-1.10/tools/dev/benchmarks/large_dirs/create_bigdir.sh URL: http://svn.apache.org/viewvc/subversion/branches/fsx-1.10/tools/dev/benchmarks/large_dirs/create_bigdir.sh?rev=1685464&r1=1685463&r2=1685464&view=diff ============================================================================== --- subversion/branches/fsx-1.10/tools/dev/benchmarks/large_dirs/create_bigdir.sh (original) +++ subversion/branches/fsx-1.10/tools/dev/benchmarks/large_dirs/create_bigdir.sh Sun Jun 14 20:58:10 2015 @@ -29,7 +29,7 @@ SVNPATH="$('pwd')/subversion" # Comment the SVNSERVE line to use file:// instead of svn://. SVN=${SVNPATH}/svn/svn -SVNADMIN=${SVNPATH}/svnadmin/svnadmin +SVNADMIN=${SVNPATH}/svnadmin/svnadmin SVNSERVE=${SVNPATH}/svnserve/svnserve # VALGRIND="valgrind --tool=callgrind" @@ -45,7 +45,7 @@ REPOROOT=/dev/shm FILECOUNT=1 MAXCOUNT=20000 -# only 1.7 supports server-side caching and uncompressed data transfer +# only 1.7 supports server-side caching and uncompressed data transfer SERVEROPTS="-c 0 -M 400" @@ -162,7 +162,7 @@ run_svn_get() { fi } -# main loop +# main loop while [ $FILECOUNT -lt $MAXCOUNT ]; do echo "Processing $FILECOUNT files in the same folder" @@ -172,7 +172,7 @@ while [ $FILECOUNT -lt $MAXCOUNT ]; do mkdir $WC/$FILECOUNT for i in 1 $sequence; do echo "File number $i" > $WC/$FILECOUNT/$i - done + done printf "\tAdding files ... \t" run_svn add $FILECOUNT -q @@ -182,7 +182,7 @@ while [ $FILECOUNT -lt $MAXCOUNT ]; do printf "\tCommit files ... \t" run_svn_ci $FILECOUNT add - + printf "\tListing files ... \t" run_svn ls $FILECOUNT Modified: subversion/branches/fsx-1.10/tools/dev/build-svn-deps-win.pl URL: http://svn.apache.org/viewvc/subversion/branches/fsx-1.10/tools/dev/build-svn-deps-win.pl?rev=1685464&r1=1685463&r2=1685464&view=diff ============================================================================== --- subversion/branches/fsx-1.10/tools/dev/build-svn-deps-win.pl (original) +++ subversion/branches/fsx-1.10/tools/dev/build-svn-deps-win.pl Sun Jun 14 20:58:10 2015 @@ -17,7 +17,7 @@ # under the License. # ==================================================================== # -# Script to build all the dependencies for Subversion on Windows +# Script to build all the dependencies for Subversion on Windows # It's been written for Windows 8 and Visual Studio 2012, but # it's entirely possible it will work with older versions of both. @@ -27,7 +27,7 @@ # Subversion and quickly get up a development environment. # Prerequisites: -# Perl: http://www.activestate.com/activeperl/downloads +# Perl: http://www.activestate.com/activeperl/downloads # Python: http://www.activestate.com/activepython/downloads # 7-Zip: http://www.7-zip.org/download.html # CMake: http://www.cmake.org/cmake/resources/software.html @@ -42,7 +42,7 @@ # available. # # TODO: -# Find some way to work around the lack of devenv in Express (msbuild will help some) +# Find some way to work around the lack of devenv in Express (msbuild will help some) # Include a package target that zips everything up. # Perl script that runs the Subversion get-make.py tool with the right args. # Alternatively update gen-make.py with an arg that knows about our layout. @@ -54,7 +54,7 @@ # Allow selection of Arch (x86 and x64) # ZLib support for OpenSSL (have to patch openssl) # Use CMake zlib build instead. -# Assembler support for OpenSSL. +# Assembler support for OpenSSL. # Add more specific commands to the command line (e.g. build-httpd) ################################### @@ -208,10 +208,10 @@ my $PERL = $Config{perlpath}; # Directory constants that we setup for convenience, but that # shouldn't be changed since they are assumed in the build systems -# of the various dependencies. +# of the various dependencies. my $HTTPD; # Where httpd gets built my $BDB; # Where bdb gets built -my $BINDIR; # where binaries are installed +my $BINDIR; # where binaries are installed my $LIBDIR; # where libraries are installed my $INCDIR; # where headers are installed my $SRCLIB; # httpd's srclib dir @@ -274,7 +274,7 @@ sub system_or_die { } # Like perl -pi.orig the second arg is a reference to a -# function that does whatever line processing you want. +# function that does whatever line processing you want. # Note that $_ is used for the input and output of the # function. So modifying $_ changes the line in the file. # bak can be passed to set the backup extension. If the @@ -345,7 +345,7 @@ sub prepare_structure { sub clean_structure { # ignore errors in this function the paths may not exist my $real_clean = shift; - + if ($real_clean) { rmtree($SRCDIR); } @@ -478,7 +478,7 @@ sub extract_dependencies { extract_file($API_FILE, $SRCLIB, "$SRCLIB\\apr-iconv-$API_VER", "$SRCLIB\\apr-iconv"); # We fix the line endings before putting the non-Apache deps in place since it - # touches everything under httpd and there's no point in doing other things. + # touches everything under httpd and there's no point in doing other things. httpd_fix_lineends(); extract_file($ZLIB_FILE, $SRCLIB, "$SRCLIB\\zlib-$ZLIB_VER", "$SRCLIB\\zlib"); @@ -507,7 +507,7 @@ sub build_pcre { my $pcre_options = '-DPCRE_NO_RECURSE:BOOL=ON'; my $pcre_shared_libs = '-DBUILD_SHARED_LIBS:BOOL=ON'; my $pcre_install_prefix = "-DCMAKE_INSTALL_PREFIX:PATH=$INSTDIR"; - my $cmake_cmd = qq("$CMAKE" -G "$pcre_generator" "$pcre_build_type" "$pcre_shared_libs" "$pcre_install_prefix" "$pcre_options" .); + my $cmake_cmd = qq("$CMAKE" -G "$pcre_generator" "$pcre_build_type" "$pcre_shared_libs" "$pcre_install_prefix" "$pcre_options" .); system_or_die("Failure generating pcre Makefiles", $cmake_cmd); system_or_die("Failure building pcre", qq("$NMAKE")); system_or_die("Failure testing pcre", qq("$NMAKE" test)); @@ -521,7 +521,7 @@ sub build_zlib { chdir_or_die("$SRCLIB\\zlib"); $ENV{CC_OPTS} = $DEBUG ? '/MDd /Gm /ZI /Od /GZ /D_DEBUG' : '/MD /02 /Zi'; $ENV{COMMON_CC_OPTS} = '/nologo /W3 /DWIN32 /D_WINDOWS'; - + system_or_die("Failure building zilb", qq("$NMAKE" /nologo -f win32\\Makefile.msc STATICLIB=zlibstat.lib all)); delete $ENV{CC_OPTS}; @@ -533,14 +533,14 @@ sub build_zlib { sub build_openssl { chdir_or_die("$SRCLIB\\openssl"); - # We're building openssl without an assembler. If someone wants to + # We're building openssl without an assembler. If someone wants to # use this for production they should probably download NASM and # remove the no-asm below and use ms\do_nasm.bat instead. - + # TODO: Enable openssl to use zlib. openssl needs some patching to do # this since it wants to look for zlib as zlib1.dll and as the httpd # build instructions note you probably don't want to dynamic link zlib. - + # TODO: OpenSSL requires perl on the path since it uses perl without a full # path in the batch file and the makefiles. Probably should determine # if PERL is on the path and add it here if not. @@ -599,7 +599,7 @@ sub httpd_fix_lineends { chdir_or_die($TOPDIR); } -# The httpd makefile in 2.4.4 doesn't know about .vcxproj files and +# The httpd makefile in 2.4.4 doesn't know about .vcxproj files and # still thinks it's got an older version of Visual Studio because # .vcproj files have become .vcxproj. sub httpd_fix_makefile { @@ -607,8 +607,8 @@ sub httpd_fix_makefile { modify_file_in_place($file, sub { s/\.vcproj/.vcxproj/i; - # below fixes that installd breaks when trying to install pcre because - # dll is named pcred.dll when a Debug build. + # below fixes that installd breaks when trying to install pcre because + # dll is named pcred.dll when a Debug build. s/^(\s*copy srclib\\pcre\\pcre\.\$\(src_dll\)\s+"\$\(inst_dll\)"\s+<\s*\.y\s*)$/!IF EXISTS("srclib\\pcre\\pcre\.\$(src_dll)")\n$1!ENDIF\n!IF EXISTS("srclib\\pcre\\pcred\.\$(src_dll)")\n\tcopy srclib\\pcre\\pcred.\$(src_dll)\t\t\t"\$(inst_dll)" <.y\n!ENDIF\n/; }); } @@ -797,8 +797,8 @@ sub build_httpd { sub build_bdb { chdir_or_die($BDB); - print(cwd(),$/); - my $sln = 'build_windows\Berkeley_DB_vs2010.sln'; + print(cwd(),$/); + my $sln = 'build_windows\Berkeley_DB_vs2010.sln'; upgrade_solution($sln); my $platform = $DEBUG ? 'Debug|Win32' : 'Release|Win32'; @@ -834,7 +834,7 @@ sub build_serf { s/^(INTDIR = Debug)$/$1\nOPENSSL_OUT_SUFFIX = .dbg/; s/(\$\(OPENSSL_SRC\)\\out32(?:dll)?)/$1\$(OPENSSL_OUT_SUFFIX)/g; }, '.debug'); - + chdir_or_die($TOPDIR); } Modified: subversion/branches/fsx-1.10/tools/dev/fsfs-access-map.c URL: http://svn.apache.org/viewvc/subversion/branches/fsx-1.10/tools/dev/fsfs-access-map.c?rev=1685464&r1=1685463&r2=1685464&view=diff ============================================================================== --- subversion/branches/fsx-1.10/tools/dev/fsfs-access-map.c (original) +++ subversion/branches/fsx-1.10/tools/dev/fsfs-access-map.c Sun Jun 14 20:58:10 2015 @@ -60,7 +60,7 @@ typedef struct file_stats_t /* number of read() calls that returned 0 bytes */ apr_int64_t empty_reads; - + /* total number of bytes returned by those reads */ apr_int64_t read_size; @@ -198,9 +198,9 @@ open_file(const char *name, int handle) /* determine first revision of rev / packed rev files */ if (strstr(name, "/db/revs/") != NULL && strstr(name, "manifest") == NULL) if (strstr(name, ".pack/pack") != NULL) - file->rev_num = atoi(strstr(name, "/db/revs/") + 9); + file->rev_num = SVN_STR_TO_REV(strstr(name, "/db/revs/") + 9); else - file->rev_num = atoi(strrchr(name, '/') + 1); + file->rev_num = SVN_STR_TO_REV(strrchr(name, '/') + 1); else file->rev_num = -1; @@ -314,7 +314,7 @@ parse_line(svn_stringbuf_t *line) else while(*func_start == ' ') func_start++; - + first_param_end = strchr(func_end, ','); if (first_param_end == NULL) first_param_end = strchr(func_end, ')'); @@ -558,13 +558,13 @@ scale_line(color_t* out, int in_len) { double scaling_factor = (double)(in_len) / (double)(out_len); - + apr_size_t i; memset(out, 0, out_len * sizeof(color_t)); for (i = 0; i < out_len; ++i) { color_t color = { 0 }; - + double source_start = i * scaling_factor; double source_end = (i + 1) * scaling_factor; @@ -626,7 +626,7 @@ write_bitmap(apr_array_header_t *info, /**/ line = apr_pcalloc(pool, xsize * sizeof(color_t)); scaled_line = apr_pcalloc(pool, row_size); - + /* write header to file */ write_bitmap_header(file, max_x, ysize); Modified: subversion/branches/fsx-1.10/tools/dev/po-merge.py URL: http://svn.apache.org/viewvc/subversion/branches/fsx-1.10/tools/dev/po-merge.py?rev=1685464&r1=1685463&r2=1685464&view=diff ============================================================================== --- subversion/branches/fsx-1.10/tools/dev/po-merge.py (original) +++ subversion/branches/fsx-1.10/tools/dev/po-merge.py Sun Jun 14 20:58:10 2015 @@ -188,7 +188,7 @@ def main(argv): # We're done. Tell the user what we did. print(('%d strings updated. ' - '%d fuzzy strings. ' + '%d fuzzy strings. ' '%d of %d strings are still untranslated (%.0f%%).' % (update_count, fuzzy, untranslated, string_count, 100.0 * untranslated / string_count))) Modified: subversion/branches/fsx-1.10/tools/dev/remove-trailing-whitespace.sh URL: http://svn.apache.org/viewvc/subversion/branches/fsx-1.10/tools/dev/remove-trailing-whitespace.sh?rev=1685464&r1=1685463&r2=1685464&view=diff ============================================================================== --- subversion/branches/fsx-1.10/tools/dev/remove-trailing-whitespace.sh (original) +++ subversion/branches/fsx-1.10/tools/dev/remove-trailing-whitespace.sh Sun Jun 14 20:58:10 2015 @@ -17,8 +17,8 @@ # specific language governing permissions and limitations # under the License. - for ext in c h cpp java py pl rb hpp cmd bat; do - find . -name "*.$ext" -exec \ + for ext in c h cpp java py pl rb hpp cmd bat sql sh; do + find . -name "*.$ext" -not -type l -exec \ perl -pi -e 's/[ \t]*$//' {} + ; # don't use \s to not strip ^L pagebreaks - done + done Modified: subversion/branches/fsx-1.10/tools/dev/unix-build/Makefile.svn URL: http://svn.apache.org/viewvc/subversion/branches/fsx-1.10/tools/dev/unix-build/Makefile.svn?rev=1685464&r1=1685463&r2=1685464&view=diff ============================================================================== --- subversion/branches/fsx-1.10/tools/dev/unix-build/Makefile.svn (original) +++ subversion/branches/fsx-1.10/tools/dev/unix-build/Makefile.svn Sun Jun 14 20:58:10 2015 @@ -1470,13 +1470,12 @@ $(MOD_DONTDOTHAT_CONF): echo >>[email protected] '/ = deny' mv -f [email protected] $@ -$(HTTPD_CHECK_USERS): +$(HTTPD_CHECK_CONF): $(MOD_DONTDOTHAT_CONF) mkdir -p $(dir $@) - echo > [email protected] 'jrandom:xCGl35kV9oWCY' - echo >>[email protected] 'jconstant:xCGl35kV9oWCY' - mv -f [email protected] $@ - -$(HTTPD_CHECK_CONF): $(HTTPD_CHECK_USERS) $(MOD_DONTDOTHAT_CONF) + $(PREFIX)/httpd/bin/htpasswd -bc $(HTTPD_CHECK_USERS).tmp jrandom rayjandom + $(PREFIX)/httpd/bin/htpasswd -b $(HTTPD_CHECK_USERS).tmp jconstant rayjandom + $(PREFIX)/httpd/bin/htpasswd -b $(HTTPD_CHECK_USERS).tmp __dumpster__ __loadster__ + mv -f $(HTTPD_CHECK_USERS).tmp $(HTTPD_CHECK_USERS) echo > [email protected] '# httpd config for make check' echo >>[email protected] 'ServerRoot "$(PREFIX)/httpd"' echo >>[email protected] 'Listen localhost:$(HTTPD_CHECK_PORT)' Propchange: subversion/branches/fsx-1.10/tools/dev/wc-ng/ ------------------------------------------------------------------------------ --- svn:ignore (added) +++ svn:ignore Sun Jun 14 20:58:10 2015 @@ -0,0 +1 @@ +svn-wc-db-tester Modified: subversion/branches/fsx-1.10/tools/dev/x509-parser.c URL: http://svn.apache.org/viewvc/subversion/branches/fsx-1.10/tools/dev/x509-parser.c?rev=1685464&r1=1685463&r2=1685464&view=diff ============================================================================== --- subversion/branches/fsx-1.10/tools/dev/x509-parser.c (original) +++ subversion/branches/fsx-1.10/tools/dev/x509-parser.c Sun Jun 14 20:58:10 2015 @@ -84,7 +84,7 @@ is_der_cert(const svn_string_t *raw) { /* really simplistic fingerprinting of a DER. By definition it must * start with an ASN.1 tag of a constructed (0x20) sequence (0x10). - * It's somewhat unfortunate that 0x30 happens to also come out to the + * It's somewhat unfortunate that 0x30 happens to also come out to the * ASCII for '0' which may mean this will create false positives. */ return raw->data[0] == 0x30 ? TRUE : FALSE; } Modified: subversion/branches/fsx-1.10/tools/diff/diff.c URL: http://svn.apache.org/viewvc/subversion/branches/fsx-1.10/tools/diff/diff.c?rev=1685464&r1=1685463&r2=1685464&view=diff ============================================================================== --- subversion/branches/fsx-1.10/tools/diff/diff.c (original) +++ subversion/branches/fsx-1.10/tools/diff/diff.c Sun Jun 14 20:58:10 2015 @@ -117,7 +117,7 @@ int main(int argc, const char *argv[]) APR_ARRAY_PUSH(options_array, const char *) = argv[i]; - /* Special case: '-U' takes an argument, so capture the + /* Special case: '-U' takes an argument, so capture the * next argument in the array. */ if (argv[i][1] == 'U' && !argv[i][2]) { Modified: subversion/branches/fsx-1.10/tools/dist/backport.pl URL: http://svn.apache.org/viewvc/subversion/branches/fsx-1.10/tools/dist/backport.pl?rev=1685464&r1=1685463&r2=1685464&view=diff ============================================================================== --- subversion/branches/fsx-1.10/tools/dist/backport.pl (original) +++ subversion/branches/fsx-1.10/tools/dist/backport.pl Sun Jun 14 20:58:10 2015 @@ -3,6 +3,19 @@ use warnings; use strict; use feature qw/switch say/; +use v5.10.0; # needed for $^V + +# The given/when smartmatch facility, introduced in Perl v5.10, was made +# experimental and "subject to change" in v5.18 (see perl5180delta). Every +# use of it now triggers a warning. +# +# As of Perl v5.20.1, the semantics of given/when provided by Perl are +# compatible with those expected by the script, so disable the warning for +# those Perls. But don't try to disable the the warning category on Perls +# that don't know that category, since that breaks compilation. +no if (v5.17.0 le $^V and $^V le v5.20.1), + warnings => 'experimental::smartmatch'; + # Licensed to the Apache Software Foundation (ASF) under one # or more contributor license agreements. See the NOTICE file # distributed with this work for additional information @@ -26,6 +39,8 @@ use Term::ReadKey qw/ReadMode ReadKey/; use File::Basename qw/basename dirname/; use File::Copy qw/copy move/; use File::Temp qw/tempfile/; +use IO::Select (); +use IPC::Open3 qw/open3/; use POSIX qw/ctermid strftime isprint isspace/; use Text::Wrap qw/wrap/; use Tie::File (); @@ -63,7 +78,7 @@ my @sh = qw/false true/; die if grep { ($sh[$_] eq 'true') != !!$_ } $DEBUG, $MAY_COMMIT, $VERBOSE, $YES; # Username for entering votes. -my $SVN_A_O_REALM = '<https://svn.apache.org:443> ASF Committers'; +my $SVN_A_O_REALM = '<https://svn.apache.org:443> ASF Committers'; my ($AVAILID) = $ENV{AVAILID} // do { local $_ = `$SVN auth svn.apache.org:443 2>/dev/null`; # TODO: pass $SVN_A_O_REALM ($? == 0 && /Auth.*realm: \Q$SVN_A_O_REALM\E\nUsername: (.*)/) ? $1 : undef @@ -97,6 +112,7 @@ unless (defined $AVAILID) { my $STATUS = './STATUS'; my $STATEFILE = './.backports1'; my $BRANCHES = '^/subversion/branches'; +my $TRUNK = '^/subversion/trunk'; $ENV{LC_ALL} = "C"; # since we parse 'svn info' output and use isprint() # Globals. @@ -119,6 +135,39 @@ $SVNq = "$SVN -q "; $SVNq =~ s/-q// if $DEBUG; +my $BACKPORT_OPTIONS_HELP = <<EOF; +y: Run a merge. It will not be committed. + WARNING: This will run 'update' and 'revert -R ./'. +l: Show logs for the entries being nominated. +v: Show the full entry (the prompt only shows an abridged version). +q: Quit the "for each entry" loop. If you have entered any votes or + approvals, you will be prompted to commit them. +±1: Enter a +1 or -1 vote + You will be prompted to commit your vote at the end. +±0: Enter a +0 or -0 vote + You will be prompted to commit your vote at the end. +a: Move the entry to the "Approved changes" section. + When both approving and voting on an entry, approve first: for example, + to enter a third +1 vote, type "a" "+" "1". +e: Edit the entry in \$EDITOR, which is '$EDITOR'. + You will be prompted to commit your edits at the end. +N: Move to the next entry. Do not prompt for the current entry again, even + in future runs, unless the STATUS nomination has been modified (e.g., + revisions added, justification changed) in the repository. + (This is a local action that will not affect other people or bots.) + : Move to the next entry. Prompt for the current entry again in the next + run of backport.pl. + (That's a space character, ASCII 0x20.) +?: Display this list. +EOF + +my $BACKPORT_OPTIONS_MERGE_OPTIONS_HELP = <<EOF; +y: Open a shell. +d: View a diff. +N: Move to the next entry. +?: Display this list. +EOF + sub backport_usage { my $basename = basename $0; print <<EOF; @@ -148,42 +197,42 @@ sense of "match" is either substring (fg In interactive mode (the default), you will be prompted once per STATUS entry. At a prompt, you have the following options: -y: Run a merge. It will not be committed. - WARNING: This will run 'update' and 'revert -R ./'. -l: Show logs for the entries being nominated. -v: Show the full entry (the prompt only shows an abridged version). -q: Quit the "for each nomination" loop. -±1: Enter a +1 or -1 vote - You will be prompted to commit your vote at the end. -±0: Enter a +0 or -0 vote - You will be prompted to commit your vote at the end. -a: Move the entry to the "Approved changes" section. - When both approving and voting on an entry, approve first: for example, - to enter a third +1 vote, type "a" "+" "1". -e: Edit the entry in $EDITOR. - You will be prompted to commit your edits at the end. -N: Move to the next entry. Cache the entry in '$STATEFILE' and do not - prompt for it again (even across runs) until it is changed. - : Move to the next entry, without adding the current one to the cache. - (That's a space character, ASCII 0x20.) +$BACKPORT_OPTIONS_HELP After running a merge, you have the following options: -y: Open a shell. -d: View a diff. -N: Move to the next entry. +$BACKPORT_OPTIONS_MERGE_OPTIONS_HELP To commit a merge, you have two options: either answer 'y' to the second prompt to open a shell, and manually run 'svn commit' therein; or set \$MAY_COMMIT=1 in the environment before running the script, in which case answering 'y' to the first prompt will not only run the merge but also commit it. -There is also a batch mode (normally used only by cron jobs and buildbot tasks, -rather than interactively): when \$YES and \$MAY_COMMIT are defined to '1' in -the environment, this script will iterate the "Approved:" section, and merge -and commit each entry therein. If only \$YES is defined, the script will -merge every nomination (including unapproved and vetoed ones), and complain -to stderr if it notices any conflicts. +There are two batch modes. The first mode is used by the nightly svn-role +mergebot. It is enabled by setting \$YES and \$MAY_COMMIT to '1' in the +environment. In this mode, the script will iterate the "Approved changes:" +section and merge and commit each entry therein. To prevent an entry from +being auto-merged, veto it or move it to a new section named "Approved, but +merge manually:". + +The second batch mode is used by the hourly conflicts detector bot. It is +triggered by having \$YES defined in the environment to '1' and \$MAY_COMMIT +undefined. In this mode, the script will locally merge every nomination +(including unapproved and vetoed ones), and complain to stderr if the merge +failed due to a conflict. This mode never commits anything. + +The hourly conflicts detector bot turns red if any entry produced a merge +conflict. When entry A depends on entry B for a clean merge, put a "Depends:" +header on entry A to instruct the bot not to turn red due to A. (The header +is not parsed; only its presence or absence matters.) + +Both batch modes also perform a basic sanity-check on entries that declare +backport branches (via the "Branch:" header): if a backport branch is used, but +at least one of the revisions enumerated in the entry title had neither been +merged from $TRUNK to the branch root, nor been committed +directly to the backport branch, the hourly bot will turn red and +nightly bot will skip the entry and email its admins. (The nightly bot does +not email the list on failure, since it doesn't use buildbot.) The 'svn' binary defined by the environment variable \$SVN, or otherwise the 'svn' found in \$PATH, will be used to manage the working copy. @@ -286,9 +335,9 @@ sub shell_escape { sub shell_safe_path_or_url($) { local $_ = shift; - return m{^[A-Za-z0-9._:+/-]+$} and !/^-|^[+]/; + return (m{^[A-Za-z0-9._:+/-]+$} and !/^-|^[+]/); } - + # Shell-safety-validating wrapper for File::Temp::tempfile sub my_tempfile { my ($fh, $fn) = tempfile(); @@ -297,9 +346,46 @@ sub my_tempfile { return ($fh, $fn); } +# The first argument is a shell script. Run it and return the shell's +# exit code, and stdout and stderr as references to arrays of lines. +sub run_in_shell($) { + my $script = shift; + my $pid = open3 \*SHELL_IN, \*SHELL_OUT, \*SHELL_ERR, qw#/bin/sh#; + # open3 raises exception when it fails; no need to error check + + print SHELL_IN $script; + close SHELL_IN; + + # Read loop: tee stdout,stderr to arrays. + my $select = IO::Select->new(\*SHELL_OUT, \*SHELL_ERR); + my (@readable, $outlines, $errlines); + while (@readable = $select->can_read) { + for my $fh (@readable) { + my $line = <$fh>; + $select->remove($fh) if eof $fh or not defined $line; + next unless defined $line; + + if ($fh == \*SHELL_OUT) { + push @$outlines, $line; + print STDOUT $line; + } + if ($fh == \*SHELL_ERR) { + push @$errlines, $line; + print STDERR $line; + } + } + } + waitpid $pid, 0; # sets $? + return $?, $outlines, $errlines; +} + +# EXPECTED_ERROR_P is subref called with EXIT_CODE, OUTLINES, ERRLINES, +# expected to return TRUE if the error should be considered fatal (cause +# backport.pl to exit non-zero) or not. It may be undef for default behaviour. sub merge { - my %entry = @_; + my %entry = %{ +shift }; + my $expected_error_p = shift // sub { 0 }; # by default, errors are unexpected my $parno = $entry{parno} - scalar grep { $_->{parno} < $entry{parno} } @MERGES_TODAY; my ($logmsg_fh, $logmsg_filename) = my_tempfile(); @@ -345,7 +431,7 @@ fi $SVNq up $SVNq merge @mergeargs 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 + if [ -z "`$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? @@ -413,15 +499,26 @@ EOF revert(verbose => 0, discard_STATUS => $MAY_COMMIT); $MERGED_SOMETHING++; - open SHELL, '|-', qw#/bin/sh# or die "$! (in '$entry{header}')"; - print SHELL $script; - close SHELL or do { - warn "$0: sh($?): $! (in '$entry{header}')"; - die "Lost track of paragraph numbers; aborting" if $MAY_COMMIT - }; - $ERRORS{$entry{id}} = [\%entry, "sh($?): $!"] if $?; + my ($exit_code, $outlines, $errlines) = run_in_shell $script; + unless ($! == 0) { + die "system() failed to spawn subshell ($!); aborting"; + } + unless ($exit_code == 0) { + warn "$0: subshell exited with code $exit_code (in '$entry{header}') " + ."(maybe due to 'set -e'?)"; + + # If we're committing, don't attempt to guess the problem and gracefully + # continue; just abort. + if ($MAY_COMMIT) { + die "Lost track of paragraph numbers; aborting"; + } + + # Record the error, unless the caller wants not to. + $ERRORS{$entry{id}} = [\%entry, "subshell exited with code $exit_code"] + unless $expected_error_p->($exit_code, $outlines, $errlines); + } - unlink $logmsg_filename unless $? or $!; + unlink $logmsg_filename unless $exit_code; } # Input formats: @@ -481,7 +578,7 @@ sub parse_entry { # summary do { push @logsummary, shift - } until $_[0] =~ /^\s*[][\w]+:/ or not defined $_[0]; + } until $_[0] =~ /^\s*[A-Z][][\w]*:/ or not defined $_[0]; # votes unshift @votes, pop until $_[-1] =~ /^\s*Votes:/ or not defined $_[-1]; @@ -502,8 +599,8 @@ sub parse_entry { $notes .= shift while @_ and $_[0] !~ /^\w/; my %accepts = map { $_ => 1 } ($notes =~ /--accept[ =]([a-z-]+)/g); given (scalar keys %accepts) { - when (0) { } - when (1) { $accept = [keys %accepts]->[0]; } + when (0) { } + when (1) { $accept = [keys %accepts]->[0]; } default { warn "Too many --accept values at '", logsummarysummary({ logsummary => [@logsummary] }), @@ -625,7 +722,7 @@ sub vote { (exists $approved->{$key}) ? ($raw_approved .= $_) : (print VOTES); next; } - + s/^(\s*\Q$vote\E:.*)/"$1, $AVAILID"/me or s/(.*\w.*?\n)/"$1 $vote: $AVAILID\n"/se; $_ = edit_string $_, $entry->{header}, trailing_eol => 2 @@ -648,7 +745,7 @@ sub vote { grep { !$approvedcheck{$_} } keys %$approved if scalar(keys %$approved) != scalar(keys %approvedcheck); prompt "Press the 'any' key to continue...\n", dontprint => 1 - if scalar(keys %$approved) != scalar(keys %approvedcheck) + if scalar(keys %$approved) != scalar(keys %approvedcheck) or scalar(keys %$votes) != scalar(keys %votescheck); move "$STATUS.$$.tmp", $STATUS; @@ -668,7 +765,7 @@ sub vote { "Approve $_->{entry}->{header}." } @votesarray; (@sentences == 1) - ? $sentences[0] + ? "* STATUS: $sentences[0]" : "* STATUS:\n" . join "", map " $_\n", @sentences; }; @@ -810,6 +907,38 @@ sub exit_stage_left { exit scalar keys %ERRORS; } +# Given an ENTRY, check whether all ENTRY->{revisions} have been merged +# into ENTRY->{branch}, if it has one. If revisions are missing, record +# a warning in $ERRORS. Return TRUE If the entry passed the validation +# and FALSE otherwise. +sub validate_branch_contains_named_revisions { + my %entry = @_; + return 1 unless defined $entry{branch}; + my %present; + + return "Why are you running so old versions?" # true in boolean context + if $SVNvsn < 1_005_000; # doesn't have the 'mergeinfo' subcommand + + my $shell_escaped_branch = shell_escape($entry{branch}); + %present = do { + my @present = `$SVN mergeinfo --show-revs=merged -- $TRUNK $BRANCHES/$shell_escaped_branch && + $SVN mergeinfo --show-revs=eligible -- $BRANCHES/$shell_escaped_branch`; + chomp @present; + @present = map /(\d+)/g, @present; + map +($_ => 1), @present; + }; + + my @absent = grep { not exists $present{$_} } @{$entry{revisions}}; + + if (@absent) { + $ERRORS{$entry{id}} //= [\%entry, + sprintf("Revisions '%s' nominated but not included in branch", + (join ", ", map { "r$_" } @absent)), + ]; + } + return @absent ? 0 : 1; +} + sub handle_entry { my $in_approved = shift; my $approved = shift; @@ -829,10 +958,23 @@ sub handle_entry { unless (@vetoes) { if ($MAY_COMMIT and $in_approved) { # svn-role mode - merge %entry; + merge \%entry if validate_branch_contains_named_revisions %entry; } elsif (!$MAY_COMMIT) { # Scan-for-conflicts mode - merge %entry; + + # First, sanity-check the entry. We ignore the result; even if it + # failed, we do want to check for conflicts, in the remainder of this + # block. + validate_branch_contains_named_revisions %entry; + + # E155015 is SVN_ERR_WC_FOUND_CONFLICT + my $expected_error_p = sub { + my ($exit_code, $outlines, $errlines) = @_; + ($exit_code == 0) + or + (grep /svn: E155015:/, @$errlines) + }; + merge \%entry, ($entry{depends} ? $expected_error_p : undef); my $output = `$SVN status`; @@ -889,12 +1031,13 @@ sub handle_entry { # See above for why the while(1). QUESTION: while (1) { my $key = $entry{digest}; - given (prompt 'Run a merge? [y,l,v,±1,±0,q,e,a, ,N] ', + given (prompt 'Run a merge? [y,l,v,±1,±0,q,e,a, ,N,?] ', verbose => 1, extra => qr/[+-]/) { when (/^y/i) { - merge %entry; - while (1) { - given (prompt "Shall I open a subshell? [ydN] ", verbose => 1) { + # TODO: validate_branch_contains_named_revisions %entry; + merge \%entry; + while (1) { + given (prompt "Shall I open a subshell? [ydN?] ", verbose => 1) { when (/^y/i) { # TODO: if $MAY_COMMIT, save the log message to a file (say, # backport.logmsg in the wcroot). @@ -906,6 +1049,10 @@ sub handle_entry { or warn "diff failed ($?): $!"; next; } + when (/^[?]/i) { + print $BACKPORT_OPTIONS_MERGE_OPTIONS_HELP; + next; + } when (/^N/i) { # fall through. } @@ -969,6 +1116,10 @@ sub handle_entry { when (/^\x20/) { last PROMPT; # Fall off the end of the given/when block. } + when (/^[?]/i) { + print $BACKPORT_OPTIONS_HELP; + next QUESTION; + } default { say "Please use one of the options in brackets (q to quit)!"; next QUESTION; @@ -1091,7 +1242,7 @@ sub nominate_main { # Construct entry. my $logmsg = `$SVN propget --revprop -r $revnums[0] --strict svn:log '^/'`; die "Can't fetch log message of r$revnums[0]: $!" unless $logmsg; - + unless ($logmsg =~ s/^(.*?)\n\n.*/$1/s) { # "* file\n (symbol): Log message." @@ -1104,7 +1255,7 @@ sub nominate_main { } my @lines; - warn "Wrapping [$logmsg]\n"; + warn "Wrapping [$logmsg]\n" if $DEBUG; push @lines, wrap " * ", ' 'x3, join ', ', map "r$_", @revnums; push @lines, wrap ' 'x3, ' 'x3, split /\n/, $logmsg; push @lines, " Justification:"; @@ -1136,7 +1287,7 @@ sub nominate_main { # Done! system "$SVN diff -- $STATUS"; if (prompt "Commit this nomination? ") { - system "$SVN commit -m 'Nominate r$revnums[0].' -- $STATUS"; + system "$SVN commit -m '* STATUS: Nominate r$revnums[0].' -- $STATUS"; exit $?; } elsif (!$had_local_mods or prompt "Revert STATUS (destroying local mods)? ") {
