Modified: subversion/branches/swig-py3/subversion/svnsync/svnsync.c URL: http://svn.apache.org/viewvc/subversion/branches/swig-py3/subversion/svnsync/svnsync.c?rev=1847678&r1=1847677&r2=1847678&view=diff ============================================================================== --- subversion/branches/swig-py3/subversion/svnsync/svnsync.c (original) +++ subversion/branches/swig-py3/subversion/svnsync/svnsync.c Wed Nov 28 21:25:32 2018 @@ -89,17 +89,17 @@ enum svnsync__opt { svnsync_opt_config_dir, \ svnsync_opt_config_options -static const svn_opt_subcommand_desc2_t svnsync_cmd_table[] = +static const svn_opt_subcommand_desc3_t svnsync_cmd_table[] = { - { "initialize", initialize_cmd, { "init" }, - N_("usage: svnsync initialize DEST_URL SOURCE_URL\n" - "\n" + { "initialize", initialize_cmd, { "init" }, {N_( + "usage: svnsync initialize DEST_URL SOURCE_URL\n" + "\n"), N_( "Initialize a destination repository for synchronization from\n" "another repository.\n" - "\n" + "\n"), N_( "If the source URL is not the root of a repository, only the\n" "specified part of the repository will be synchronized.\n" - "\n" + "\n"), N_( "The destination URL must point to the root of a repository which\n" "has been configured to allow revision property changes. In\n" "the general case, the destination repository must contain no\n" @@ -109,65 +109,70 @@ static const svn_opt_subcommand_desc2_t "their counterparts in the source repository. (This is useful\n" "when initializing a copy of a repository as a mirror of that same\n" "repository, for example.)\n" - "\n" + "\n"), N_( "You should not commit to, or make revision property changes in,\n" "the destination repository by any method other than 'svnsync'.\n" "In other words, the destination repository should be a read-only\n" - "mirror of the source repository.\n"), + "mirror of the source repository.\n" + )}, { SVNSYNC_OPTS_DEFAULT, svnsync_opt_source_prop_encoding, 'q', svnsync_opt_allow_non_empty, svnsync_opt_disable_locking, svnsync_opt_steal_lock, 'M' } }, - { "synchronize", synchronize_cmd, { "sync" }, - N_("usage: svnsync synchronize DEST_URL [SOURCE_URL]\n" - "\n" + { "synchronize", synchronize_cmd, { "sync" }, {N_( + "usage: svnsync synchronize DEST_URL [SOURCE_URL]\n" + "\n"), N_( "Transfer all pending revisions to the destination from the source\n" "with which it was initialized.\n" - "\n" + "\n"), N_( "If SOURCE_URL is provided, use that as the source repository URL,\n" "ignoring what is recorded in the destination repository as the\n" "source URL. Specifying SOURCE_URL is recommended in particular\n" "if untrusted users/administrators may have write access to the\n" - "DEST_URL repository.\n"), + "DEST_URL repository.\n" + )}, { SVNSYNC_OPTS_DEFAULT, svnsync_opt_source_prop_encoding, 'q', svnsync_opt_disable_locking, svnsync_opt_steal_lock, 'M' } }, - { "copy-revprops", copy_revprops_cmd, { 0 }, - N_("usage:\n" - "\n" + { "copy-revprops", copy_revprops_cmd, { 0 }, {N_( + "usage:\n" + "\n"), N_( " 1. svnsync copy-revprops DEST_URL [SOURCE_URL]\n" " 2. svnsync copy-revprops DEST_URL REV[:REV2]\n" - "\n" + "\n"), N_( "Copy the revision properties in a given range of revisions to the\n" "destination from the source with which it was initialized. If the\n" "revision range is not specified, it defaults to all revisions in\n" "the DEST_URL repository. Note also that the 'HEAD' revision is the\n" "latest in DEST_URL, not necessarily the latest in SOURCE_URL.\n" - "\n" + "\n"), N_( "If SOURCE_URL is provided, use that as the source repository URL,\n" "ignoring what is recorded in the destination repository as the\n" "source URL. Specifying SOURCE_URL is recommended in particular\n" "if untrusted users/administrators may have write access to the\n" "DEST_URL repository.\n" - "\n" + "\n"), N_( "Unless you need to trigger the destination repositoy's revprop\n" "change hooks for all revision properties, it is recommended to use\n" "the --skip-unchanged option for best performance.\n" - "\n" - "Form 2 is deprecated syntax, equivalent to specifying \"-rREV[:REV2]\".\n"), + "\n"), N_( + "Form 2 is deprecated syntax, equivalent to specifying \"-rREV[:REV2]\".\n" + )}, { SVNSYNC_OPTS_DEFAULT, svnsync_opt_source_prop_encoding, 'q', 'r', svnsync_opt_disable_locking, svnsync_opt_steal_lock, svnsync_opt_skip_unchanged, 'M' } }, - { "info", info_cmd, { 0 }, - N_("usage: svnsync info DEST_URL\n" - "\n" + { "info", info_cmd, { 0 }, {N_( + "usage: svnsync info DEST_URL\n" + "\n"), N_( "Print information about the synchronization destination repository\n" - "located at DEST_URL.\n"), + "located at DEST_URL.\n" + )}, { SVNSYNC_OPTS_DEFAULT } }, - { "help", help_cmd, { "?", "h" }, - N_("usage: svnsync help [SUBCOMMAND...]\n" - "\n" - "Describe the usage of this program or its subcommands.\n"), + { "help", help_cmd, { "?", "h" }, {N_( + "usage: svnsync help [SUBCOMMAND...]\n" + "\n"), N_( + "Describe the usage of this program or its subcommands.\n" + )}, { 0 } }, - { NULL, NULL, { 0 }, NULL, { 0 } } + { NULL, NULL, { 0 }, {NULL}, { 0 } } }; static const apr_getopt_option_t svnsync_options[] = @@ -1937,7 +1942,7 @@ help_cmd(apr_getopt_t *os, void *baton, SVN_ERR(svn_ra_print_modules(version_footer, pool)); - SVN_ERR(svn_opt_print_help4(os, "svnsync", + SVN_ERR(svn_opt_print_help5(os, "svnsync", opt_baton ? opt_baton->version : FALSE, opt_baton ? opt_baton->quiet : FALSE, /*###opt_state ? opt_state->verbose :*/ FALSE, @@ -1960,7 +1965,7 @@ help_cmd(apr_getopt_t *os, void *baton, static svn_error_t * sub_main(int *exit_code, int argc, const char *argv[], apr_pool_t *pool) { - const svn_opt_subcommand_desc2_t *subcommand = NULL; + const svn_opt_subcommand_desc3_t *subcommand = NULL; apr_array_header_t *received_opts; opt_baton_t opt_baton; svn_config_t *config; @@ -2189,7 +2194,7 @@ sub_main(int *exit_code, int argc, const } if (opt_baton.help) - subcommand = svn_opt_get_canonical_subcommand2(svnsync_cmd_table, "help"); + subcommand = svn_opt_get_canonical_subcommand3(svnsync_cmd_table, "help"); /* The --non-interactive and --force-interactive options are mutually * exclusive. */ @@ -2269,8 +2274,8 @@ sub_main(int *exit_code, int argc, const if (opt_baton.version) { /* Use the "help" subcommand to handle "--version". */ - static const svn_opt_subcommand_desc2_t pseudo_cmd = - { "--version", help_cmd, {0}, "", + static const svn_opt_subcommand_desc3_t pseudo_cmd = + { "--version", help_cmd, {0}, {""}, {svnsync_opt_version, /* must accept its own option */ 'q', /* --quiet */ } }; @@ -2290,7 +2295,7 @@ sub_main(int *exit_code, int argc, const SVN_ERR(svn_utf_cstring_to_utf8(&first_arg, os->argv[os->ind++], pool)); - subcommand = svn_opt_get_canonical_subcommand2(svnsync_cmd_table, + subcommand = svn_opt_get_canonical_subcommand3(svnsync_cmd_table, first_arg); if (subcommand == NULL) { @@ -2308,11 +2313,11 @@ sub_main(int *exit_code, int argc, const if (opt_id == 'h' || opt_id == '?') continue; - if (! svn_opt_subcommand_takes_option3(subcommand, opt_id, NULL)) + if (! svn_opt_subcommand_takes_option4(subcommand, opt_id, NULL)) { const char *optstr; const apr_getopt_option_t *badopt = - svn_opt_get_option_from_code2(opt_id, svnsync_options, subcommand, + svn_opt_get_option_from_code3(opt_id, svnsync_options, subcommand, pool); svn_opt_format_option(&optstr, badopt, FALSE, pool); if (subcommand->name[0] == '-')
Modified: subversion/branches/swig-py3/subversion/svnversion/svnversion.c URL: http://svn.apache.org/viewvc/subversion/branches/swig-py3/subversion/svnversion/svnversion.c?rev=1847678&r1=1847677&r2=1847678&view=diff ============================================================================== --- subversion/branches/swig-py3/subversion/svnversion/svnversion.c (original) +++ subversion/branches/swig-py3/subversion/svnversion/svnversion.c Wed Nov 28 21:25:32 2018 @@ -38,7 +38,7 @@ static svn_error_t * version(svn_boolean_t quiet, apr_pool_t *pool) { - return svn_opt_print_help4(NULL, "svnversion", TRUE, quiet, FALSE, + return svn_opt_print_help5(NULL, "svnversion", TRUE, quiet, FALSE, NULL, NULL, NULL, NULL, NULL, NULL, pool); } Propchange: subversion/branches/swig-py3/subversion/tests/afl/ ------------------------------------------------------------------------------ --- svn:ignore (original) +++ svn:ignore Wed Nov 28 21:25:32 2018 @@ -1,3 +1,4 @@ *.lo .libs afl-x509 +afl-svndiff Modified: subversion/branches/swig-py3/subversion/tests/cmdline/authz_tests.py URL: http://svn.apache.org/viewvc/subversion/branches/swig-py3/subversion/tests/cmdline/authz_tests.py?rev=1847678&r1=1847677&r2=1847678&view=diff ============================================================================== --- subversion/branches/swig-py3/subversion/tests/cmdline/authz_tests.py (original) +++ subversion/branches/swig-py3/subversion/tests/cmdline/authz_tests.py Wed Nov 28 21:25:32 2018 @@ -168,7 +168,7 @@ def authz_read_access(sbox): fws_url = B_url + '/folder with spaces' fws_empty_folder_url = fws_url + '/empty folder' - if sbox.repo_url.startswith("http"): + if svntest.main.is_ra_type_dav(): expected_err = ".*svn: E175013: .*[Ff]orbidden.*" else: expected_err = ".*svn: E170001: Authorization failed.*" @@ -280,7 +280,7 @@ def authz_write_access(sbox): write_restrictive_svnserve_conf(sbox.repo_dir) - if sbox.repo_url.startswith('http'): + if svntest.main.is_ra_type_dav(): expected_err = ".*svn: E175013: .*[Ff]orbidden.*" else: expected_err = ".*svn: E220004: Access denied.*" @@ -367,7 +367,7 @@ def authz_checkout_test(sbox): # 1st part: disable all read access, checkout should fail # write an authz file with *= on / - if sbox.repo_url.startswith('http'): + if svntest.main.is_ra_type_dav(): expected_err = ".*svn: E175013: .*[Ff]orbidden.*" else: expected_err = ".*svn: E170001: Authorization failed.*" @@ -502,7 +502,7 @@ def authz_log_and_tracing_test(sbox): write_restrictive_svnserve_conf(sbox.repo_dir) # write an authz file with *=rw on / - if sbox.repo_url.startswith('http'): + if svntest.main.is_ra_type_dav(): expected_err = ".*svn: E175013: .*[Ff]orbidden.*" else: expected_err = ".*svn: E170001: Authorization failed.*" @@ -533,7 +533,7 @@ def authz_log_and_tracing_test(sbox): # now disable read access on the first version of rho, keep the copy in # /A/D readable. - if sbox.repo_url.startswith('http'): + if svntest.main.is_ra_type_dav(): expected_err = ".*svn: E175013: .*[Ff]orbidden.*" else: expected_err = ".*svn: E170001: Authorization failed.*" @@ -551,7 +551,7 @@ def authz_log_and_tracing_test(sbox): 'log', '-r', '2', '--limit', '1', wc_dir) - if sbox.repo_url.startswith('http'): + if svntest.main.is_ra_type_dav(): expected_err2 = expected_err else: expected_err2 = ".*svn: E220001: ((Unreadable path encountered; " \ @@ -593,7 +593,7 @@ def authz_log_and_tracing_test(sbox): svntest.actions.run_and_verify_svn(None, expected_err2, 'cat', '-r', '2', D_url+'/rho') - if sbox.repo_url.startswith('http'): + if svntest.main.is_ra_type_dav(): expected_err2 = expected_err else: expected_err2 = ".*svn: E220001: Unreadable path encountered; access denied.*" @@ -624,7 +624,7 @@ def authz_aliases(sbox): write_restrictive_svnserve_conf(sbox.repo_dir) - if sbox.repo_url.startswith("http"): + if svntest.main.is_ra_type_dav(): expected_err = ".*svn: E175013: .*[Ff]orbidden.*" else: expected_err = ".*svn: E170001: Authorization failed.*" @@ -669,9 +669,9 @@ def authz_validate(sbox): write_authz_file(sbox, { "/" : "* = r", "/A/B" : "@undefined_group = rw" }) - if sbox.repo_url.startswith("http"): + if svntest.main.is_ra_type_dav(): expected_err = ".*svn: E175013: .*[Ff]orbidden.*" - elif sbox.repo_url.startswith("svn"): + elif svntest.main.is_ra_type_svn(): expected_err = ".*Invalid authz configuration" else: expected_err = ".*@undefined_group.*" @@ -688,9 +688,9 @@ devs1 = @admins, dev1 devs2 = @admins, dev2 devs = @devs1, dev3, dev4""" }) - if sbox.repo_url.startswith("http"): + if svntest.main.is_ra_type_dav(): expected_err = ".*svn: E175013: .*[Ff]orbidden.*" - elif sbox.repo_url.startswith("svn"): + elif svntest.main.is_ra_type_svn(): expected_err = ".*Invalid authz configuration" else: expected_err = ".*Circular dependency.*" @@ -726,7 +726,7 @@ def authz_locking(sbox): write_authz_file(sbox, {"/": "", "/A": "jrandom = rw"}) write_restrictive_svnserve_conf(sbox.repo_dir) - if sbox.repo_url.startswith('http'): + if svntest.main.is_ra_type_dav(): expected_err = ".*svn: E175013: .*[Ff]orbidden.*" else: expected_err = ".*svn: warning: W170001: Authorization failed.*" @@ -781,7 +781,7 @@ def authz_locking(sbox): svntest.actions.run_and_verify_info([{'Lock Token' : None}], sbox.ospath('A/mu')) - if sbox.repo_url.startswith('http'): + if svntest.main.is_ra_type_dav(): expected_err = ".*svn: warning: W160039: .*([Aa]uth.*perf|[Ff]orbidden).*" else: expected_err = ".*svn: warning: W170001: Authorization failed.*" @@ -863,7 +863,7 @@ def authz_svnserve_anon_access_read(sbox # is not really a branch (it's the same URL), but we only care about # authz here, not the semantics of the merge. (Merges had been # failing in authz, for the reasons summarized in - # http://subversion.tigris.org/issues/show_bug.cgi?id=2712#desc13.) + # https://issues.apache.org/jira/browse/SVN-2712#desc13.) svntest.actions.run_and_verify_svn(None, [], 'merge', '-c', '2', B_url, B_path) @@ -981,7 +981,7 @@ def multiple_matches(sbox): sbox.build(create_wc = False) root_url = sbox.repo_url write_restrictive_svnserve_conf(sbox.repo_dir) - if sbox.repo_url.startswith("http"): + if svntest.main.is_ra_type_dav(): expected_err = ".*svn: E175013: .*[Ff]orbidden.*" else: expected_err = ".*svn: E170001: Authorization failed.*" @@ -1137,7 +1137,7 @@ def case_sensitive_authz(sbox): # error messages expected_error_for_commit = ".*Commit failed.*" - if sbox.repo_url.startswith("http"): + if svntest.main.is_ra_type_dav(): expected_error_for_cat = ".*[Ff]orbidden.*" else: expected_error_for_cat = ".*svn: E170001: Authorization failed.*" @@ -1663,6 +1663,37 @@ def remove_access_after_commit(sbox): expected_status, [], True) +@XFail() +@Skip(svntest.main.is_ra_type_file) +def inverted_group_membership(sbox): + "access rights for user in inverted group" + + # Bug reported here: https://lists.apache.org/thread.html/6cc7b22b211827ff946373407a516a3ab4d866fe03cdc85d22ff276b@%3Cdev.subversion.apache.org%3E + + sbox.build(create_wc = False) + + svntest.actions.enable_revprop_changes(sbox.repo_dir) + write_restrictive_svnserve_conf(sbox.repo_dir) + write_authz_file(sbox, + {"/" : ("$anonymous =\n" + "~@readonly = rw\n" + "@readonly = r\n")}, + {"groups": "readonly = %s\n" % svntest.main.wc_author2}) + + expected_output = svntest.verify.UnorderedOutput(['A/\n', 'iota\n']) + + # User mentioned in the @readonly group can read ... + svntest.actions.run_and_verify_svn(expected_output, [], + 'list', + '--username', svntest.main.wc_author2, + sbox.repo_url) + + # ... but the access control entry for the inverted group isn't applied. + svntest.actions.run_and_verify_svn(expected_output, [], + 'list', + '--username', svntest.main.wc_author, + sbox.repo_url) + ######################################################################## # Run the tests @@ -1700,6 +1731,7 @@ test_list = [ None, authz_file_external_to_authz, authz_log_censor_revprops, remove_access_after_commit, + inverted_group_membership, ] serial_only = True Modified: subversion/branches/swig-py3/subversion/tests/cmdline/basic_tests.py URL: http://svn.apache.org/viewvc/subversion/branches/swig-py3/subversion/tests/cmdline/basic_tests.py?rev=1847678&r1=1847677&r2=1847678&view=diff ============================================================================== --- subversion/branches/swig-py3/subversion/tests/cmdline/basic_tests.py (original) +++ subversion/branches/swig-py3/subversion/tests/cmdline/basic_tests.py Wed Nov 28 21:25:32 2018 @@ -3024,16 +3024,19 @@ def peg_rev_on_non_existent_wc_path(sbox # setup some history sbox.simple_move('A', 'A2') sbox.simple_move('A2/mu', 'A2/mu2') - open(sbox.ospath('A2/mu2'), 'w').write('r2\n') + with open(sbox.ospath('A2/mu2'), 'w') as f: + f.write('r2\n') sbox.simple_commit(message='r2') # sbox.simple_move('A2/mu2', 'A2/mu3') sbox.simple_move('A2', 'A3') - open(sbox.ospath('A3/mu3'), 'w').write('r3\n') + with open(sbox.ospath('A3/mu3'), 'w') as f: + f.write('r3\n') sbox.simple_commit(message='r3') # sbox.simple_move('A3/mu3', 'A3/mu4') - open(sbox.ospath('A3/mu4'), 'w').write('r4\n') + with open(sbox.ospath('A3/mu4'), 'w') as f: + f.write('r4\n') sbox.simple_move('A3', 'A4') sbox.simple_commit(message='r4') @@ -3047,6 +3050,15 @@ def peg_rev_on_non_existent_wc_path(sbox 'cat', '-r2', sbox.ospath('mu3') + '@3') +@Issue(4532) +def diff_previous_revision_of_r0(sbox): + """diff -rPREV on WC at revision 0""" + + sbox.build(empty=True) + svntest.actions.run_and_verify_svn(None, 'svn: E195002: ', + 'diff', '-rPREV', sbox.ospath('')) + + # With 'svn mkdir --parents' the target directory may already exist on disk. # In that case it was wrongly performing a recursive 'add' on its contents. def mkdir_parents_target_exists_on_disk(sbox): @@ -3121,24 +3133,27 @@ def filtered_ls(sbox): sbox.build(read_only=True) path = sbox.repo_url + "/A/D" - # check plain info - expected = [ "H/omega\n", - "gamma\n" ] - - exit_code, output, error = svntest.actions.run_and_verify_svn( - expected, [], 'ls', path, '--depth=infinity', '--search=*a') - - # check case-insensitivity - exit_code, output, error = svntest.actions.run_and_verify_svn( - expected, [], 'ls', path, '--depth=infinity', '--search=*A') - - expected = [ "H/\n" ] - exit_code, output, error = svntest.actions.run_and_verify_svn( - expected, [], 'ls', path, '--depth=infinity', '--search=h') - - # we don't match full paths - exit_code, output, error = svntest.actions.run_and_verify_svn( - [], [], 'ls', path, '--depth=infinity', '--search=*/*') + # with and without externals, because without externals on a 1.10+ server + # a server-side code path is used + for extra_opts in [ [], ['--include-externals'] ]: + + expected = [ "H/omega\n", + "gamma\n" ] + + exit_code, output, error = svntest.actions.run_and_verify_svn( + expected, [], 'ls', path, '--depth=infinity', '--search=*a', *extra_opts) + + # check case-insensitivity + exit_code, output, error = svntest.actions.run_and_verify_svn( + expected, [], 'ls', path, '--depth=infinity', '--search=*A', *extra_opts) + + expected = [ "H/\n" ] + exit_code, output, error = svntest.actions.run_and_verify_svn( + expected, [], 'ls', path, '--depth=infinity', '--search=h', *extra_opts) + + # we don't match full paths + exit_code, output, error = svntest.actions.run_and_verify_svn( + [], [], 'ls', path, '--depth=infinity', '--search=*/*', *extra_opts) @Issue(4700) @XFail(svntest.main.is_fs_type_fsx) @@ -3197,6 +3212,36 @@ def null_prop_update_last_changed_revisi 'info', sbox.path('iota'), '--show-item', 'last-changed-revision') +@Skip(svntest.main.is_os_windows) +def filtered_ls_top_level_path(sbox): + "filtered 'svn ls' top level path" + + sbox.build(read_only=True, create_wc=False) + d_path = sbox.repo_url + "/A/B" + f_path = sbox.repo_url + "/A/B/lambda" + + d_expected = svntest.verify.RegexListOutput([ + r".* \./", # expect '*B*' to match its name which is 'B' + r".* E/beta", + r".* lambda" ]) + f_expected = [ "lambda\n" ] + + # with and without externals, because without externals on a 1.10+ server + # a server-side code path is used + for extra_opts in [ [], ['--include-externals'] ]: + + exit_code, output, error = svntest.actions.run_and_verify_svn( + d_expected, [], 'ls', '-v', d_path, '-R', '--search=*B*', *extra_opts) + + exit_code, output, error = svntest.actions.run_and_verify_svn( + f_expected, [], 'ls', f_path, '--search=lambda', *extra_opts) + + # we don't match full paths, even for the top level path + exit_code, output, error = svntest.actions.run_and_verify_svn( + [], [], 'ls', '-v', d_path, '-R', '--search=*/*', *extra_opts) + exit_code, output, error = svntest.actions.run_and_verify_svn( + [], [], 'ls', f_path, '--search=*/*', *extra_opts) + ######################################################################## # Run the tests @@ -3266,11 +3311,13 @@ test_list = [ None, rm_missing_with_case_clashing_ondisk_item, delete_conflicts_one_of_many, peg_rev_on_non_existent_wc_path, + diff_previous_revision_of_r0, mkdir_parents_target_exists_on_disk, plaintext_password_storage_disabled, filtered_ls, null_update_last_changed_revision, null_prop_update_last_changed_revision, + filtered_ls_top_level_path, ] if __name__ == '__main__': Modified: subversion/branches/swig-py3/subversion/tests/cmdline/blame_tests.py URL: http://svn.apache.org/viewvc/subversion/branches/swig-py3/subversion/tests/cmdline/blame_tests.py?rev=1847678&r1=1847677&r2=1847678&view=diff ============================================================================== --- subversion/branches/swig-py3/subversion/tests/cmdline/blame_tests.py (original) +++ subversion/branches/swig-py3/subversion/tests/cmdline/blame_tests.py Wed Nov 28 21:25:32 2018 @@ -958,7 +958,8 @@ def blame_youngest_to_oldest(sbox): sbox.simple_commit() #r3 # Delete a line. - open(iota_moved, 'w').write(line) + with open(iota_moved, 'w') as f: + f.write(line) sbox.simple_commit() #r4 expected_output = [ Modified: subversion/branches/swig-py3/subversion/tests/cmdline/commit_tests.py URL: http://svn.apache.org/viewvc/subversion/branches/swig-py3/subversion/tests/cmdline/commit_tests.py?rev=1847678&r1=1847677&r2=1847678&view=diff ============================================================================== --- subversion/branches/swig-py3/subversion/tests/cmdline/commit_tests.py (original) +++ subversion/branches/swig-py3/subversion/tests/cmdline/commit_tests.py Wed Nov 28 21:25:32 2018 @@ -2823,7 +2823,8 @@ def commit_add_subadd(sbox): # prepare targets file targets = "A/D A/D/H A/D/H/chi A/D/H/omega A/D/H/psi".split() - open(targets_file, 'w').write("\n".join(targets)) + with open(targets_file, 'w') as f: + f.write("\n".join(targets)) # r2: rm A/D sbox.simple_rm('A/D') @@ -3113,6 +3114,39 @@ def commit_xml(sbox): sbox.simple_append('index.html', '<Q></R>', True) sbox.simple_commit() +@Issue(4722) +def commit_issue4722_checksum(sbox): + "commit that triggered checksum failure" + + sbox.build() + + # This bug only ever affected FSFS in 1.9.7. The test could be + # considered a bit "fragile" as any change to the on-disk + # representation may well make it pass trivially. On the other hand + # it should still pass irrespective of that representation, and for + # all other repository types. + + # Enough data to allow the bug to occur + with open(sbox.ospath('f'), 'w') as fp: + for i in range(0, 2001): + fp.write('abcdefghijklmnopqrstuvwxyz') + sbox.simple_add('f') + sbox.simple_commit() + + # Just the right data to trigger the bug + with open(sbox.ospath('f'), 'w') as fp: + for i in range(0, 8713): + fp.write(str(i)) + fp.write("11111") + sbox.simple_commit() + + # Trigger deduplication which is when the bug occurred + with open(sbox.ospath('f'), 'w') as fp: + for i in range(0, 2001): + fp.write('abcdefghijklmnopqrstuvwxyz') + sbox.simple_commit() + + ######################################################################## # Run the tests @@ -3190,6 +3224,7 @@ test_list = [ None, commit_mergeinfo_ood, mkdir_conflict_proper_error, commit_xml, + commit_issue4722_checksum, ] if __name__ == '__main__': Modified: subversion/branches/swig-py3/subversion/tests/cmdline/copy_tests.py URL: http://svn.apache.org/viewvc/subversion/branches/swig-py3/subversion/tests/cmdline/copy_tests.py?rev=1847678&r1=1847677&r2=1847678&view=diff ============================================================================== --- subversion/branches/swig-py3/subversion/tests/cmdline/copy_tests.py (original) +++ subversion/branches/swig-py3/subversion/tests/cmdline/copy_tests.py Wed Nov 28 21:25:32 2018 @@ -1021,6 +1021,76 @@ def repos_to_wc(sbox): os.path.join(D_dir, 'B')) #---------------------------------------------------------------------- +def foreign_repos_to_wc(sbox): + "foreign repository to WC copy" + + sbox.build() + wc_dir = sbox.wc_dir + + def move_url(repo_url, source, dest): + svntest.main.run_svn(False, 'move', '-m', svntest.main.make_log_msg(), + repo_url + '/' + source, + repo_url + '/' + dest) + + # Scenarios: + # (parent-path-under-'A/', base-name, child-paths, mergeinfo-inheritance) + scenarios = [ + ('B', 'E', ['alpha','beta'], 'explicit'), + ('B', 'F', [], 'inherited'), + ('D/G', 'pi', [], 'explicit'), + ('D/G', 'rho', [], 'inherited'), + ] + + # Add some mergeinfo, which should be discarded by a foreign repo copy. + # On each path of interest, add either explicit or inherited mergeinfo: + # the implementation handles these cases differently. + # (We commit these initially in the original repo just for convenience: as + # we already have a WC. Really they only need to be in the 'other' repo.) + for parent, name, children, mi_inheritance in scenarios: + if mi_inheritance == 'explicit': + sbox.simple_propset(SVN_PROP_MERGEINFO, + '/branch/' + name + ':1', 'A/' + parent + '/' + name) + else: + sbox.simple_propset(SVN_PROP_MERGEINFO, + '/branch/' + name + ':1', 'A/' + parent) + sbox.simple_commit() + + # We have a standard repository and working copy. Now we create a + # second repository with the same greek tree, but different UUID. + repo_dir = sbox.repo_dir + other_repo_dir, other_repo_url = sbox.add_repo_path('other') + svntest.main.copy_repos(repo_dir, other_repo_dir, 2, 1) + move_url(other_repo_url, 'A', 'A2') + move_url(other_repo_url, 'A2', 'A3') + + # URL->wc copy: + # copy a file and a directory from a foreign repository. + # we should get some scheduled additions *without history*. + peg_rev = '3' + op_rev = '2' + + for parent, name, children, mi_inheritance in scenarios: + src_url = other_repo_url + '/A2/' + parent + '/' + name + src_url_resolved = src_url.replace('/A2/', '/A/') + + expected_output = svntest.verify.UnorderedOutput([ + '--- Copying from foreign repository URL \'%s\':\n' % src_url_resolved, + 'A %s\n' % sbox.ospath(name), + ] + [ + 'A %s\n' % sbox.ospath(name + '/' + child) + for child in children + ]) + svntest.actions.run_and_verify_svn(expected_output, [], + 'copy', '-r' + op_rev, + src_url + '@' + peg_rev, + wc_dir) + + # Validate the mergeinfo of the copy destination (we expect none) + svntest.actions.run_and_verify_svn([], '.*W200017: Property.*not found', + 'propget', SVN_PROP_MERGEINFO, + sbox.ospath(name)) + +#---------------------------------------------------------------------- # Issue 1084: ra_svn move/copy bug @Issue(1084) def copy_to_root(sbox): @@ -3504,6 +3574,50 @@ def copy_make_parents_wc_wc(sbox): expected_output, expected_status) + +#---------------------------------------------------------------------- +# Test copying and creating parents in the wc with dst directory being +# precreated and unversioned + +def copy_make_parents_wc_wc_existing_unversioned_dst(sbox): + "svn cp --parents WC_PATH WC_PATH (ex. unver. dst)" + + sbox.build() + wc_dir = sbox.wc_dir + + iota_path = sbox.ospath('iota') + new_iota_path = sbox.ospath('X/Y/Z/iota') + os.makedirs(os.path.dirname(new_iota_path)) + + # Copy iota + svntest.actions.run_and_verify_svn(None, [], + 'cp', '--parents', + iota_path, new_iota_path) + + # Create expected output + expected_output = svntest.wc.State(wc_dir, { + 'X' : Item(verb='Adding'), + 'X/Y' : Item(verb='Adding'), + 'X/Y/Z' : Item(verb='Adding'), + 'X/Y/Z/iota' : Item(verb='Adding'), + }) + + # Create expected status tree + expected_status = svntest.actions.get_virginal_state(wc_dir, 1) + + # Add the moved files + expected_status.add({ + 'X' : Item(status=' ', wc_rev=2), + 'X/Y' : Item(status=' ', wc_rev=2), + 'X/Y/Z' : Item(status=' ', wc_rev=2), + 'X/Y/Z/iota' : Item(status=' ', wc_rev=2), + }) + + svntest.actions.run_and_verify_commit(wc_dir, + expected_output, + expected_status) + + #---------------------------------------------------------------------- # Test copying and creating parents from the repo to the wc @@ -3546,6 +3660,49 @@ def copy_make_parents_repo_wc(sbox): #---------------------------------------------------------------------- +# Test copying and creating parents from the repo to the wc with dst +# directory being precreated and unversioned + +def copy_make_parents_repo_wc_existing_unversioned_dst(sbox): + "svn cp --parents URL WC_PATH with (ex. unver. dst)" + + sbox.build() + wc_dir = sbox.wc_dir + + iota_url = sbox.repo_url + '/iota' + new_iota_path = sbox.ospath('X/Y/Z/iota') + os.makedirs(os.path.dirname(new_iota_path)) + + # Copy iota + svntest.actions.run_and_verify_svn(None, [], + 'cp', '--parents', + iota_url, new_iota_path) + + # Create expected output + expected_output = svntest.wc.State(wc_dir, { + 'X' : Item(verb='Adding'), + 'X/Y' : Item(verb='Adding'), + 'X/Y/Z' : Item(verb='Adding'), + 'X/Y/Z/iota' : Item(verb='Adding'), + }) + + # Create expected status tree + expected_status = svntest.actions.get_virginal_state(wc_dir, 1) + + # Add the moved files + expected_status.add({ + 'X' : Item(status=' ', wc_rev=2), + 'X/Y' : Item(status=' ', wc_rev=2), + 'X/Y/Z' : Item(status=' ', wc_rev=2), + 'X/Y/Z/iota' : Item(status=' ', wc_rev=2), + }) + + svntest.actions.run_and_verify_commit(wc_dir, + expected_output, + expected_status) + + +#---------------------------------------------------------------------- # Test copying and creating parents from the wc to the repo def copy_make_parents_wc_repo(sbox): @@ -3651,70 +3808,49 @@ def URI_encoded_repos_to_wc(sbox): expected_status = svntest.actions.get_virginal_state(wc_dir, 1) expected_disk = svntest.main.greek_state.copy() + def path_join(head, tail): + if not head: return tail + if not tail: return head + return head + '/' + tail + + def greek_file_item(path): + if path[-1:].islower(): + basename = re.sub('.*/', '', path) + return Item("This is the file '" + basename + "'.\n") + return Item() + + A_paths = [ + "", + "B", + "B/lambda", + "B/E", + "B/E/alpha", + "B/E/beta", + "B/F", + "mu", + "C", + "D", + "D/gamma", + "D/G", + "D/G/pi", + "D/G/rho", + "D/G/tau", + "D/H", + "D/H/chi", + "D/H/omega", + "D/H/psi", + ] + def copy_URL_to_WC(URL_rel_path, dest_name, rev): - lines = [ - "A " + os.path.join(wc_dir, dest_name, "B") + "\n", - "A " + os.path.join(wc_dir, dest_name, "B", "lambda") + "\n", - "A " + os.path.join(wc_dir, dest_name, "B", "E") + "\n", - "A " + os.path.join(wc_dir, dest_name, "B", "E", "alpha") + "\n", - "A " + os.path.join(wc_dir, dest_name, "B", "E", "beta") + "\n", - "A " + os.path.join(wc_dir, dest_name, "B", "F") + "\n", - "A " + os.path.join(wc_dir, dest_name, "mu") + "\n", - "A " + os.path.join(wc_dir, dest_name, "C") + "\n", - "A " + os.path.join(wc_dir, dest_name, "D") + "\n", - "A " + os.path.join(wc_dir, dest_name, "D", "gamma") + "\n", - "A " + os.path.join(wc_dir, dest_name, "D", "G") + "\n", - "A " + os.path.join(wc_dir, dest_name, "D", "G", "pi") + "\n", - "A " + os.path.join(wc_dir, dest_name, "D", "G", "rho") + "\n", - "A " + os.path.join(wc_dir, dest_name, "D", "G", "tau") + "\n", - "A " + os.path.join(wc_dir, dest_name, "D", "H") + "\n", - "A " + os.path.join(wc_dir, dest_name, "D", "H", "chi") + "\n", - "A " + os.path.join(wc_dir, dest_name, "D", "H", "omega") + "\n", - "A " + os.path.join(wc_dir, dest_name, "D", "H", "psi") + "\n", - "Checked out revision " + str(rev - 1) + ".\n", - "A " + os.path.join(wc_dir, dest_name) + "\n"] - expected = svntest.verify.UnorderedOutput(lines) - expected_status.add({ - dest_name + "/B" : Item(status=' ', wc_rev=rev), - dest_name + "/B/lambda" : Item(status=' ', wc_rev=rev), - dest_name + "/B/E" : Item(status=' ', wc_rev=rev), - dest_name + "/B/E/alpha" : Item(status=' ', wc_rev=rev), - dest_name + "/B/E/beta" : Item(status=' ', wc_rev=rev), - dest_name + "/B/F" : Item(status=' ', wc_rev=rev), - dest_name + "/mu" : Item(status=' ', wc_rev=rev), - dest_name + "/C" : Item(status=' ', wc_rev=rev), - dest_name + "/D" : Item(status=' ', wc_rev=rev), - dest_name + "/D/gamma" : Item(status=' ', wc_rev=rev), - dest_name + "/D/G" : Item(status=' ', wc_rev=rev), - dest_name + "/D/G/pi" : Item(status=' ', wc_rev=rev), - dest_name + "/D/G/rho" : Item(status=' ', wc_rev=rev), - dest_name + "/D/G/tau" : Item(status=' ', wc_rev=rev), - dest_name + "/D/H" : Item(status=' ', wc_rev=rev), - dest_name + "/D/H/chi" : Item(status=' ', wc_rev=rev), - dest_name + "/D/H/omega" : Item(status=' ', wc_rev=rev), - dest_name + "/D/H/psi" : Item(status=' ', wc_rev=rev), - dest_name : Item(status=' ', wc_rev=rev)}) - expected_disk.add({ - dest_name : Item(props={}), - dest_name + '/B' : Item(), - dest_name + '/B/lambda' : Item("This is the file 'lambda'.\n"), - dest_name + '/B/E' : Item(), - dest_name + '/B/E/alpha' : Item("This is the file 'alpha'.\n"), - dest_name + '/B/E/beta' : Item("This is the file 'beta'.\n"), - dest_name + '/B/F' : Item(), - dest_name + '/mu' : Item("This is the file 'mu'.\n"), - dest_name + '/C' : Item(), - dest_name + '/D' : Item(), - dest_name + '/D/gamma' : Item("This is the file 'gamma'.\n"), - dest_name + '/D/G' : Item(), - dest_name + '/D/G/pi' : Item("This is the file 'pi'.\n"), - dest_name + '/D/G/rho' : Item("This is the file 'rho'.\n"), - dest_name + '/D/G/tau' : Item("This is the file 'tau'.\n"), - dest_name + '/D/H' : Item(), - dest_name + '/D/H/chi' : Item("This is the file 'chi'.\n"), - dest_name + '/D/H/omega' : Item("This is the file 'omega'.\n"), - dest_name + '/D/H/psi' : Item("This is the file 'psi'.\n"), - }) + expected = svntest.verify.UnorderedOutput( + [ "A " + sbox.ospath(path_join(dest_name, p)) + "\n" + for p in A_paths ]) + expected_status.add( + { path_join(dest_name, p) : Item(status=' ', wc_rev=rev) + for p in A_paths }) + expected_disk.add( + { path_join(dest_name, p) : greek_file_item(p) + for p in A_paths }) # Make a copy svntest.actions.run_and_verify_svn(expected, [], @@ -4333,7 +4469,7 @@ def copy_added_dir_with_copy(sbox): def copy_broken_symlink(sbox): """copy broken symlink""" - ## See http://subversion.tigris.org/issues/show_bug.cgi?id=3303. ## + ## See https://issues.apache.org/jira/browse/SVN-3303. ## sbox.build() wc_dir = sbox.wc_dir @@ -5904,7 +6040,9 @@ test_list = [ None, copy_peg_rev_url, old_dir_wc_to_wc, copy_make_parents_wc_wc, + copy_make_parents_wc_wc_existing_unversioned_dst, copy_make_parents_repo_wc, + copy_make_parents_repo_wc_existing_unversioned_dst, copy_make_parents_wc_repo, copy_make_parents_repo_repo, URI_encoded_repos_to_wc, @@ -5955,6 +6093,7 @@ test_list = [ None, ext_wc_copy_deleted, copy_subtree_deleted, resurrect_at_root, + foreign_repos_to_wc, ] if __name__ == '__main__': Modified: subversion/branches/swig-py3/subversion/tests/cmdline/dav-mirror-autocheck.sh URL: http://svn.apache.org/viewvc/subversion/branches/swig-py3/subversion/tests/cmdline/dav-mirror-autocheck.sh?rev=1847678&r1=1847677&r2=1847678&view=diff ============================================================================== --- subversion/branches/swig-py3/subversion/tests/cmdline/dav-mirror-autocheck.sh (original) +++ subversion/branches/swig-py3/subversion/tests/cmdline/dav-mirror-autocheck.sh Wed Nov 28 21:25:32 2018 @@ -31,7 +31,7 @@ # # The set of changes sent through the system is currently # just the test case for issue 2939, using svnmucc -# http://subversion.tigris.org/issues/show_bug.cgi?id=2939 +# https://issues.apache.org/jira/browse/SVN-2939 # But of course, any svn traffic liable to break over # mirroring would be a good addition. # @@ -100,6 +100,7 @@ function setup_config() { say "setting up config: " $1 cat > "$1" <<__EOF__ +$LOAD_MOD_MPM $LOAD_MOD_LOG_CONFIG $LOAD_MOD_MIME $LOAD_MOD_UNIXD @@ -114,9 +115,30 @@ $LOAD_MOD_AUTHZ_CORE $LOAD_MOD_AUTHZ_USER $LOAD_MOD_AUTHZ_HOST +__EOF__ + +if "$HTTPD" -v | grep '/2\.[012]' >/dev/null; then + cat >> "$1" <<__EOF__ LockFile lock User $(id -un) Group $(id -gn) +__EOF__ +else +HTTPD_LOCK="$HTTPD_ROOT/lock" +mkdir "$HTTPD_LOCK" \ + || fail "couldn't create lock directory '$HTTPD_LOCK'" + cat >> "$1" <<__EOF__ +# worker and prefork MUST have a mpm-accept lockfile in 2.3.0+ +<IfModule worker.c> + Mutex "file:$HTTPD_LOCK" mpm-accept +</IfModule> +<IfModule prefork.c> + Mutex "file:$HTTPD_LOCK" mpm-accept +</IfModule> +__EOF__ +fi + +cat >> "$1" <<__EOF__ Listen ${TEST_PORT} ServerName localhost PidFile "${HTTPD_ROOT}/pid" @@ -133,6 +155,9 @@ MaxRequestsPerChild 0 <IfModule worker.c> ThreadsPerChild 8 </IfModule> +<IfModule event.c> + ThreadsPerChild 8 +</IfModule> MaxClients 16 HostNameLookups Off LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" format @@ -202,6 +227,12 @@ function usage() { SCRIPT=$(basename $0) +NO_TESTS= +if [ "x$1" = 'x--no-tests' ]; then + NO_TESTS=1 + shift +fi + if [ $# -ne 1 ] ; then usage fi @@ -249,7 +280,7 @@ HTPASSWD=$(get_prog_name htpasswd htpass SVN=$ABS_BUILDDIR/subversion/svn/svn SVNADMIN=$ABS_BUILDDIR/subversion/svnadmin/svnadmin SVNSYNC=$ABS_BUILDDIR/subversion/svnsync/svnsync -SVNMUCC=${SVNMUCC:-$ABS_BUILDDIR/tools/client-side/svnmucc/svnmucc} +SVNMUCC=$ABS_BUILDDIR/subversion/svnmucc/svnmucc SVNLOOK=$ABS_BUILDDIR/subversion/svnlook/svnlook [ -x $HTTPD ] || fail "HTTPD '$HTTPD' not executable" @@ -259,9 +290,7 @@ SVNLOOK=$ABS_BUILDDIR/subversion/svnlook [ -x $SVNADMIN ] || fail "SVNADMIN $SVNADMIN not built" [ -x $SVNSYNC ] || fail "SVNSYNC $SVNSYNC not built" [ -x $SVNLOOK ] || fail "SVNLOOK $SVNLOOK not built" -[ -x $SVNMUCC ] \ - || fail SVNMUCC $SVNMUCC executable not built, needed for test. \ - \'cd $ABS_BUILDDIR\; make svnmucc\' to fix. +[ -x $SVNMUCC ] || fail "SVNMUCC $SVNMUCC not built" say HTTPD: $HTTPD say SVN: $SVN @@ -309,6 +338,10 @@ LOAD_MOD_AUTHN_FILE="$(get_loadmodule_co LOAD_MOD_AUTHZ_USER="$(get_loadmodule_config mod_authz_user)" \ || fail "Authz_User module not found." } +if [ ${APACHE_MPM:+set} ]; then + LOAD_MOD_MPM=$(get_loadmodule_config mod_mpm_$APACHE_MPM) \ + || fail "MPM module not found" +fi if [ ${MODULE_PATH:+set} ]; then MOD_DAV_SVN="$MODULE_PATH/mod_dav_svn.so" @@ -365,7 +398,9 @@ $SVNADMIN create "$SLAVE_REPOS" || fail $SVNADMIN dump "$MASTER_REPOS" | $SVNADMIN load "$SLAVE_REPOS" \ || fail "duplicate repositories failed" # make sure uuid's match -[ `cat "$SLAVE_REPOS/db/uuid"` = `cat "$MASTER_REPOS/db/uuid"` ] \ +read MASTER_UUID < "$MASTER_REPOS/db/uuid" +read SLAVE_UUID < "$SLAVE_REPOS/db/uuid" +[ "$SLAVE_UUID" = "$MASTER_UUID" ] \ || fail "master/slave uuid mismatch" # setup hooks: # slave allows revprop changes @@ -397,12 +432,18 @@ $SVNSYNC initialize --non-interactive "$ --username=svnsync --password=svnsync \ || fail "svnsync initialize failed" +if [ $NO_TESTS ]; then + echo "MASTER_URL=$MASTER_URL" + echo "SLAVE_URL=$SLAVE_URL" + exit +fi + # OK, let's start testing! Commit changes to slave, expect # them to proxy through to the master, and then # svnsync back to the slave # # reproducible test case from: -# http://subversion.tigris.org/issues/show_bug.cgi?id=2939 +# https://issues.apache.org/jira/browse/SVN-2939 # BASE_URL="$SLAVE_URL" say running svnmucc test to $BASE_URL Modified: subversion/branches/swig-py3/subversion/tests/cmdline/davautocheck.sh URL: http://svn.apache.org/viewvc/subversion/branches/swig-py3/subversion/tests/cmdline/davautocheck.sh?rev=1847678&r1=1847677&r2=1847678&view=diff ============================================================================== --- subversion/branches/swig-py3/subversion/tests/cmdline/davautocheck.sh (original) +++ subversion/branches/swig-py3/subversion/tests/cmdline/davautocheck.sh Wed Nov 28 21:25:32 2018 @@ -52,6 +52,7 @@ # Run this script with the test suite name and test number to execute just this # test: # subversion/tests/cmdline/davautocheck.sh basic 4 +# This script can also be invoked via "make davautocheck". # # If the temporary directory is not deleted, it can be reused for further # manual DAV protocol interoperation testing. HTTPD must be started by @@ -65,18 +66,19 @@ # APXS=/opt/svn/1.4.x/bin/apxs MODULE_PATH=/opt/svn/1.4.x/modules \ # subversion/tests/cmdline/davautocheck.sh # -# To prevent the server from advertising httpv2, pass USE_HTTPV1 in -# the environment. +# Other environment variables that are interpreted by this script: # -# To enable "SVNCacheRevProps on" set CACHE_REVPROPS in the environment. +# make davautocheck CACHE_REVPROPS=1 # sets SVNCacheRevProps on # -# To test over https set USE_SSL in the environment. +# make davautocheck BLOCK_READ=1 # sets SVNBlockRead on # -# To use value for "SVNPathAuthz" directive set SVN_PATH_AUTHZ with -# appropriate value in the environment. +# make davautocheck USE_SSL=1 # run over https # -# To load an MPM module for Apache 2.4 use APACHE_MPM=event in the -# environment. +# make davautocheck USE_HTTPV1=1 # sets SVNAdvertiseV2Protocol off +# +# make davautocheck APACHE_MPM=event # specifies the 2.4 MPM +# +# make davautocheck SVN_PATH_AUTHZ=short_circuit # SVNPathAuthz short_circuit # # Passing --no-tests as argv[1] will have the script start a server # but not run any tests. Passing --gdb or --lldb will do the same, and in @@ -222,6 +224,11 @@ if [ ${CACHE_REVPROPS:+set} ]; then CACHE_REVPROPS_SETTING=on fi +BLOCK_READ_SETTING=off +if [ ${BLOCK_READ:+set} ]; then + BLOCK_READ_SETTING=on +fi + if [ ${MODULE_PATH:+set} ]; then MOD_DAV_SVN="$MODULE_PATH/mod_dav_svn.so" MOD_AUTHZ_SVN="$MODULE_PATH/mod_authz_svn.so" @@ -274,6 +281,9 @@ say "Using '$HTPASSWD'..." LOAD_MOD_DAV=$(get_loadmodule_config mod_dav) \ || fail "DAV module not found" +LOAD_MOD_DAV_FS=$(get_loadmodule_config mod_dav_fs) \ + || fail "Filesystem DAV module not found" + LOAD_MOD_LOG_CONFIG=$(get_loadmodule_config mod_log_config) \ || fail "log_config module not found" @@ -440,6 +450,7 @@ $LOAD_MOD_MIME $LOAD_MOD_ALIAS $LOAD_MOD_UNIXD $LOAD_MOD_DAV +$LOAD_MOD_DAV_FS LoadModule dav_svn_module "$MOD_DAV_SVN" $LOAD_MOD_AUTH $LOAD_MOD_AUTHN_CORE @@ -475,6 +486,13 @@ mkdir "$HTTPD_LOCK" \ __EOF__ fi +HTTPD_DAV="$HTTPD_ROOT/dav" +mkdir "$HTTPD_DAV" \ + || fail "couldn't create DAV lock directory '$HTTPD_DAV'" +cat >> "$HTTPD_CFG" <<__EOF__ +DavLockDB "$HTTPD_DAV/lock.db" +__EOF__ + if [ ${USE_SSL:+set} ]; then cat >> "$HTTPD_CFG" <<__EOF__ SSLEngine on @@ -518,40 +536,59 @@ CustomLog "$HTTPD_ROOT/ops" "% #Require all granted </Directory> +Alias /nodavroot $ABS_BUILDDIR/subversion/tests/cmdline/svn-test-work/nodavroot +<Directory $ABS_BUILDDIR/subversion/tests/cmdline/svn-test-work/nodavroot> +</Directory> + +Alias /fsdavroot $ABS_BUILDDIR/subversion/tests/cmdline/svn-test-work/fsdavroot +<Directory $ABS_BUILDDIR/subversion/tests/cmdline/svn-test-work/fsdavroot> + DAV filesystem +</Directory> + <Location /svn-test-work/repositories> +__EOF__ +location_common() { +cat >> "$HTTPD_CFG" <<__EOF__ DAV svn - SVNParentPath "$ABS_BUILDDIR/subversion/tests/cmdline/svn-test-work/repositories" AuthzSVNAccessFile "$ABS_BUILDDIR/subversion/tests/cmdline/svn-test-work/authz" AuthType Basic AuthName "Subversion Repository" AuthUserFile $HTTPD_USERS - Require valid-user SVNAdvertiseV2Protocol ${ADVERTISE_V2_PROTOCOL} SVNCacheRevProps ${CACHE_REVPROPS_SETTING} + SVNListParentPath On + SVNBlockRead ${BLOCK_READ_SETTING} +__EOF__ +} +location_common +cat >> "$HTTPD_CFG" <<__EOF__ + SVNParentPath "$ABS_BUILDDIR/subversion/tests/cmdline/svn-test-work/repositories" + Require valid-user ${SVN_PATH_AUTHZ_LINE} </Location> <Location /ddt-test-work/repositories> - DAV svn +__EOF__ +location_common +cat >> "$HTTPD_CFG" <<__EOF__ SVNParentPath "$ABS_BUILDDIR/subversion/tests/cmdline/svn-test-work/repositories" - AuthzSVNAccessFile "$ABS_BUILDDIR/subversion/tests/cmdline/svn-test-work/authz" - AuthType Basic - AuthName "Subversion Repository" - AuthUserFile $HTTPD_USERS Require valid-user - SVNAdvertiseV2Protocol ${ADVERTISE_V2_PROTOCOL} - SVNCacheRevProps ${CACHE_REVPROPS_SETTING} ${SVN_PATH_AUTHZ_LINE} DontDoThatConfigFile "$HTTPD_DONTDOTHAT" </Location> <Location /svn-test-work/local_tmp/repos> - DAV svn +__EOF__ +location_common +cat >> "$HTTPD_CFG" <<__EOF__ SVNPath "$ABS_BUILDDIR/subversion/tests/cmdline/svn-test-work/local_tmp/repos" - AuthzSVNAccessFile "$ABS_BUILDDIR/subversion/tests/cmdline/svn-test-work/authz" - AuthType Basic - AuthName "Subversion Repository" - AuthUserFile $HTTPD_USERS Require valid-user - SVNAdvertiseV2Protocol ${ADVERTISE_V2_PROTOCOL} + ${SVN_PATH_AUTHZ_LINE} +</Location> +<Location /svn-test-work/local_tmp/trojan> +__EOF__ +location_common +cat >> "$HTTPD_CFG" <<__EOF__ + SVNPath "$ABS_BUILDDIR/subversion/tests/cmdline/svn-test-work/local_tmp/trojan" + Require valid-user ${SVN_PATH_AUTHZ_LINE} </Location> <Location /authz-test-work/anon> @@ -574,84 +611,54 @@ CustomLog "$HTTPD_ROOT/ops" "% ${SVN_PATH_AUTHZ_LINE} </Location> <Location /authz-test-work/mixed> - DAV svn +__EOF__ +location_common +cat >> "$HTTPD_CFG" <<__EOF__ SVNParentPath "$ABS_BUILDDIR/subversion/tests/cmdline/svn-test-work/local_tmp" - AuthzSVNAccessFile "$ABS_BUILDDIR/subversion/tests/cmdline/svn-test-work/authz" - SVNAdvertiseV2Protocol ${ADVERTISE_V2_PROTOCOL} - SVNCacheRevProps ${CACHE_REVPROPS_SETTING} - SVNListParentPath On - AuthType Basic - AuthName "Subversion Repository" - AuthUserFile $HTTPD_USERS Require valid-user Satisfy Any ${SVN_PATH_AUTHZ_LINE} </Location> <Location /authz-test-work/mixed-noauthwhenanon> - DAV svn +__EOF__ +location_common +cat >> "$HTTPD_CFG" <<__EOF__ SVNParentPath "$ABS_BUILDDIR/subversion/tests/cmdline/svn-test-work/local_tmp" - AuthzSVNAccessFile "$ABS_BUILDDIR/subversion/tests/cmdline/svn-test-work/authz" - SVNAdvertiseV2Protocol ${ADVERTISE_V2_PROTOCOL} - SVNCacheRevProps ${CACHE_REVPROPS_SETTING} - SVNListParentPath On - AuthType Basic - AuthName "Subversion Repository" - AuthUserFile $HTTPD_USERS Require valid-user AuthzSVNNoAuthWhenAnonymousAllowed On SVNPathAuthz On </Location> <Location /authz-test-work/authn> - DAV svn +__EOF__ +location_common +cat >> "$HTTPD_CFG" <<__EOF__ SVNParentPath "$ABS_BUILDDIR/subversion/tests/cmdline/svn-test-work/local_tmp" - AuthzSVNAccessFile "$ABS_BUILDDIR/subversion/tests/cmdline/svn-test-work/authz" - SVNAdvertiseV2Protocol ${ADVERTISE_V2_PROTOCOL} - SVNCacheRevProps ${CACHE_REVPROPS_SETTING} - SVNListParentPath On - AuthType Basic - AuthName "Subversion Repository" - AuthUserFile $HTTPD_USERS Require valid-user ${SVN_PATH_AUTHZ_LINE} </Location> <Location /authz-test-work/authn-anonoff> - DAV svn +__EOF__ +location_common +cat >> "$HTTPD_CFG" <<__EOF__ SVNParentPath "$ABS_BUILDDIR/subversion/tests/cmdline/svn-test-work/local_tmp" - AuthzSVNAccessFile "$ABS_BUILDDIR/subversion/tests/cmdline/svn-test-work/authz" - SVNAdvertiseV2Protocol ${ADVERTISE_V2_PROTOCOL} - SVNCacheRevProps ${CACHE_REVPROPS_SETTING} - SVNListParentPath On - AuthType Basic - AuthName "Subversion Repository" - AuthUserFile $HTTPD_USERS Require valid-user AuthzSVNAnonymous Off SVNPathAuthz On </Location> <Location /authz-test-work/authn-lcuser> - DAV svn +__EOF__ +location_common +cat >> "$HTTPD_CFG" <<__EOF__ SVNParentPath "$ABS_BUILDDIR/subversion/tests/cmdline/svn-test-work/local_tmp" - AuthzSVNAccessFile "$ABS_BUILDDIR/subversion/tests/cmdline/svn-test-work/authz" - SVNAdvertiseV2Protocol ${ADVERTISE_V2_PROTOCOL} - SVNCacheRevProps ${CACHE_REVPROPS_SETTING} - SVNListParentPath On - AuthType Basic - AuthName "Subversion Repository" - AuthUserFile $HTTPD_USERS Require valid-user AuthzForceUsernameCase Lower ${SVN_PATH_AUTHZ_LINE} </Location> <Location /authz-test-work/authn-group> - DAV svn +__EOF__ +location_common +cat >> "$HTTPD_CFG" <<__EOF__ SVNParentPath "$ABS_BUILDDIR/subversion/tests/cmdline/svn-test-work/local_tmp" - AuthzSVNAccessFile "$ABS_BUILDDIR/subversion/tests/cmdline/svn-test-work/authz" - SVNAdvertiseV2Protocol ${ADVERTISE_V2_PROTOCOL} - SVNCacheRevProps ${CACHE_REVPROPS_SETTING} - SVNListParentPath On - AuthType Basic - AuthName "Subversion Repository" - AuthUserFile $HTTPD_USERS AuthGroupFile $HTTPD_GROUPS Require group random AuthzSVNAuthoritative Off @@ -659,15 +666,10 @@ CustomLog "$HTTPD_ROOT/ops" "% </Location> <IfModule mod_authz_core.c> <Location /authz-test-work/sallrany> - DAV svn +__EOF__ +location_common +cat >> "$HTTPD_CFG" <<__EOF__ SVNParentPath "$ABS_BUILDDIR/subversion/tests/cmdline/svn-test-work/local_tmp" - AuthzSVNAccessFile "$ABS_BUILDDIR/subversion/tests/cmdline/svn-test-work/authz" - SVNAdvertiseV2Protocol ${ADVERTISE_V2_PROTOCOL} - SVNCacheRevProps ${CACHE_REVPROPS_SETTING} - SVNListParentPath On - AuthType Basic - AuthName "Subversion Repository" - AuthUserFile $HTTPD_USERS AuthzSendForbiddenOnFailure On Satisfy All <RequireAny> @@ -677,15 +679,10 @@ CustomLog "$HTTPD_ROOT/ops" "% ${SVN_PATH_AUTHZ_LINE} </Location> <Location /authz-test-work/sallrall> - DAV svn +__EOF__ +location_common +cat >> "$HTTPD_CFG" <<__EOF__ SVNParentPath "$ABS_BUILDDIR/subversion/tests/cmdline/svn-test-work/local_tmp" - AuthzSVNAccessFile "$ABS_BUILDDIR/subversion/tests/cmdline/svn-test-work/authz" - SVNAdvertiseV2Protocol ${ADVERTISE_V2_PROTOCOL} - SVNCacheRevProps ${CACHE_REVPROPS_SETTING} - SVNListParentPath On - AuthType Basic - AuthName "Subversion Repository" - AuthUserFile $HTTPD_USERS AuthzSendForbiddenOnFailure On Satisfy All <RequireAll> Modified: subversion/branches/swig-py3/subversion/tests/cmdline/depth_tests.py URL: http://svn.apache.org/viewvc/subversion/branches/swig-py3/subversion/tests/cmdline/depth_tests.py?rev=1847678&r1=1847677&r2=1847678&view=diff ============================================================================== --- subversion/branches/swig-py3/subversion/tests/cmdline/depth_tests.py (original) +++ subversion/branches/swig-py3/subversion/tests/cmdline/depth_tests.py Wed Nov 28 21:25:32 2018 @@ -1073,7 +1073,7 @@ def commit_depth_immediates(sbox): # Message-ID: <[email protected]> # Date: Thu, 12 Jul 2007 15:59:45 -0400 # - # See also http://subversion.tigris.org/issues/show_bug.cgi?id=2882. + # See also https://issues.apache.org/jira/browse/SVN-2882. # # Outline of the test: # ==================== Modified: subversion/branches/swig-py3/subversion/tests/cmdline/diff_tests.py URL: http://svn.apache.org/viewvc/subversion/branches/swig-py3/subversion/tests/cmdline/diff_tests.py?rev=1847678&r1=1847677&r2=1847678&view=diff ============================================================================== --- subversion/branches/swig-py3/subversion/tests/cmdline/diff_tests.py (original) +++ subversion/branches/swig-py3/subversion/tests/cmdline/diff_tests.py Wed Nov 28 21:25:32 2018 @@ -36,7 +36,6 @@ from svntest import err, wc from prop_tests import binary_mime_type_on_text_file_warning from svntest.verify import make_diff_header, make_no_diff_deleted_header, \ - make_diff_header, make_no_diff_deleted_header, \ make_git_diff_header, make_diff_prop_header, \ make_diff_prop_val, make_diff_prop_deleted, \ make_diff_prop_added, make_diff_prop_modified @@ -2712,7 +2711,7 @@ def diff_ignore_eolstyle(sbox): " Bb\n", "-Cc\n", "+Cc\n", - "\ No newline at end of file\n" ] + "\\ No newline at end of file\n" ] svntest.actions.run_and_verify_svn(expected_output, [], 'diff', '-x', '--ignore-eol-style', @@ -3855,7 +3854,7 @@ def diff_arbitrary_files_and_dirs(sbox): sbox.build() wc_dir = sbox.wc_dir - # diff iota with A/mu + # diff files (iota with A/mu) expected_output = make_diff_header("iota", "working copy", "working copy", "iota", "A/mu") + [ "@@ -1 +1 @@\n", @@ -3866,7 +3865,11 @@ def diff_arbitrary_files_and_dirs(sbox): 'diff', '--old', sbox.ospath('iota'), '--new', sbox.ospath('A/mu')) - # diff A/B/E with A/D + # diff dirs (A/B/E with A/D) + # .../gamma is to show as replaced; .../beta is to show as modified + sbox.simple_mkdir('A/B/E/gamma') + sbox.simple_propset('p', 'v', 'A/B/E/gamma') + sbox.simple_add_text("This is a different beta file.\n", 'A/D/beta') expected_output = make_diff_header("G/pi", "nonexistent", "working copy", "B/E", "D") + [ "@@ -0,0 +1 @@\n", @@ -3896,11 +3899,16 @@ def diff_arbitrary_files_and_dirs(sbox): "@@ -1 +0,0 @@\n", "-This is the file 'alpha'.\n" ] + make_diff_header("beta", "working copy", - "nonexistent", "B/E", "D") + [ - "@@ -1 +0,0 @@\n", - "-This is the file 'beta'.\n" - ] + make_diff_header("gamma", "nonexistent", "working copy", "B/E", "D") + [ + "@@ -1 +1 @@\n", + "-This is the file 'beta'.\n", + "+This is a different beta file.\n" + ] + make_diff_header("gamma", "working copy", + "nonexistent", "B/E", "D") \ + + make_diff_prop_header("gamma") \ + + make_diff_prop_deleted("p", "v") \ + + make_diff_header("gamma", "nonexistent", + "working copy", "B/E", "D") + [ "@@ -0,0 +1 @@\n", "+This is the file 'gamma'.\n" ] @@ -5160,6 +5168,90 @@ def diff_unversioned_files_git(sbox): '--old', sbox.ospath('foo'), '--new', sbox.ospath('A/bar')) +# Summary diff with a repository source side and a local copy target side. +# This particular combination crashed in 1.10.0 and earlier releases. +def diff_summary_repo_wc_local_copy(sbox): + "diff summary repo wc local copy" + sbox.build() + wc_dir = sbox.wc_dir + + sbox.simple_copy('iota', 'iota2') + sbox.simple_append('iota2', 'hello\n') + expected_diff = svntest.wc.State(wc_dir, { + 'iota': Item(status='M '), + }) + svntest.actions.run_and_verify_diff_summarize( + expected_diff, + '--old=' + sbox.ospath('iota') + '@HEAD', + '--new=' + sbox.ospath('iota2')) + +# Summary diff with a repository source side and a local copy target side. +# Svn reported the unmodified copy as modified in 1.10.0 and earlier releases. +@XFail() +def diff_summary_repo_wc_local_copy_unmodified(sbox): + "diff summary repo wc local copy unmodified" + sbox.build() + wc_dir = sbox.wc_dir + + sbox.simple_copy('iota', 'iota2') + expected_diff = svntest.wc.State(wc_dir, { + }) + svntest.actions.run_and_verify_diff_summarize( + expected_diff, + '--old=' + sbox.ospath('iota') + '@HEAD', + '--new=' + sbox.ospath('iota2')) + +# Fails with "Can't open file '.../iota': Too many levels of symbolic links" +# on Unix. +@XFail() +@Skip(svntest.main.is_os_windows) +def diff_file_replaced_by_symlink(sbox): + "diff base vs working: symlink replaces a file" + sbox.build(read_only=True) + wc_dir = sbox.wc_dir + + iota_path = sbox.ospath('iota') + os.remove(iota_path) + + # create a symlink pointing to itself + # alternatively it could point to a non-existing path + sbox.simple_symlink('iota', 'iota') + + # TODO: add a full expected output + expected_output = svntest.verify.AnyOutput + svntest.actions.run_and_verify_svn(expected_output, [], 'diff', wc_dir) + +# Test 'svn diff --git' with a copy. +# +# When this diff is rooted at a path below the repository root directory, +# it errored out while printing the git diff header, due to confusion of +# diff-relative and repository-relative copyfrom paths. +@XFail() +def diff_git_format_copy(sbox): + "diff git format copy" + sbox.build(create_wc=False) + svntest.actions.run_and_verify_svn(None, [], 'checkout', + sbox.repo_url + '/A/B', + sbox.wc_dir) + os.chdir(sbox.wc_dir) + sbox.wc_dir = '' + + sbox.simple_copy('E/alpha', 'alpha_copied') + sbox.simple_append('alpha_copied', "This is a copy of 'alpha'.\n") + + expected_output = \ + make_git_diff_header('alpha_copied', 'A/B/alpha_copied', + "revision 1", "working copy", + copyfrom_path="A/B/E/alpha", + copyfrom_rev='1', cp=True, + text_changes=True) + [ + "@@ -1 +1,2 @@\n", + " This is the file 'alpha'.\n", + "+This is a copy of 'alpha'.\n", + ] + + svntest.actions.run_and_verify_svn(expected_output, [], 'diff', + '--git', '.') ######################################################################## #Run the tests @@ -5257,6 +5349,10 @@ test_list = [ None, diff_symlinks, diff_peg_resolve, diff_unversioned_files_git, + diff_summary_repo_wc_local_copy, + diff_summary_repo_wc_local_copy_unmodified, + diff_file_replaced_by_symlink, + diff_git_format_copy, ] if __name__ == '__main__': Modified: subversion/branches/swig-py3/subversion/tests/cmdline/entries_tests.py URL: http://svn.apache.org/viewvc/subversion/branches/swig-py3/subversion/tests/cmdline/entries_tests.py?rev=1847678&r1=1847677&r2=1847678&view=diff ============================================================================== --- subversion/branches/swig-py3/subversion/tests/cmdline/entries_tests.py (original) +++ subversion/branches/swig-py3/subversion/tests/cmdline/entries_tests.py Wed Nov 28 21:25:32 2018 @@ -121,14 +121,17 @@ def basic_entries(sbox): G_path, iota_path) # Add a file over the DELETED 'alpha'. It should be schedule-add. - open(alpha_path, 'w').write('New alpha contents\n') + with open(alpha_path, 'w') as f: + f.write('New alpha contents\n') # Delete 'beta', then add a file over it. Should be schedule-replace. svntest.actions.run_and_verify_svn(None, [], 'rm', beta_path) - open(beta_path, 'w').write('New beta contents\n') + with open(beta_path, 'w') as f: + f.write('New beta contents\n') # Plain old add. Should have revision == 0. - open(added_path, 'w').write('Added file contents\n') + with open(added_path, 'w') as f: + f.write('Added file contents\n') svntest.actions.run_and_verify_svn(None, [], 'add', alpha_path, beta_path, added_path) Modified: subversion/branches/swig-py3/subversion/tests/cmdline/export_tests.py URL: http://svn.apache.org/viewvc/subversion/branches/swig-py3/subversion/tests/cmdline/export_tests.py?rev=1847678&r1=1847677&r2=1847678&view=diff ============================================================================== --- subversion/branches/swig-py3/subversion/tests/cmdline/export_tests.py (original) +++ subversion/branches/swig-py3/subversion/tests/cmdline/export_tests.py Wed Nov 28 21:25:32 2018 @@ -610,7 +610,8 @@ def export_file_overwrite_fails(sbox): os.mkdir(tmpdir) # Run it for source local - open(os.path.join(tmpdir, 'iota'), 'w').write(not_iota_contents) + with open(os.path.join(tmpdir, 'iota'), 'w') as f: + f.write(not_iota_contents) svntest.actions.run_and_verify_svn([], '.*exist.*', 'export', iota_path, tmpdir) @@ -621,7 +622,8 @@ def export_file_overwrite_fails(sbox): svntest.actions.verify_disk(tmpdir, expected_disk) # Run it for source URL - open(os.path.join(tmpdir, 'iota'), 'w').write(not_iota_contents) + with open(os.path.join(tmpdir, 'iota'), 'w') as f: + f.write(not_iota_contents) svntest.actions.run_and_verify_svn([], '.*exist.*', 'export', iota_url, tmpdir) @@ -721,7 +723,7 @@ def export_working_copy_ignoring_keyword def export_with_url_unsafe_characters(sbox): "export file with URL unsafe characters" - ## See http://subversion.tigris.org/issues/show_bug.cgi?id=3683 ## + ## See https://issues.apache.org/jira/browse/SVN-3683 ## sbox.build() wc_dir = sbox.wc_dir @@ -904,14 +906,16 @@ def export_file_overwrite_with_force(sbo }) # Run it for WC export - open(os.path.join(tmpdir, 'iota'), 'w').write(not_iota_contents) + with open(os.path.join(tmpdir, 'iota'), 'w') as f: + f.write(not_iota_contents) svntest.actions.run_and_verify_svn(svntest.verify.AnyOutput, [], 'export', '--force', iota_path, tmpdir) svntest.actions.verify_disk(tmpdir, expected_disk) # Run it for URL export - open(os.path.join(tmpdir, 'iota'), 'w').write(not_iota_contents) + with open(os.path.join(tmpdir, 'iota'), 'w') as f: + f.write(not_iota_contents) svntest.actions.run_and_verify_svn(svntest.verify.AnyOutput, [], 'export', '--force', iota_url, tmpdir) Modified: subversion/branches/swig-py3/subversion/tests/cmdline/externals_tests.py URL: http://svn.apache.org/viewvc/subversion/branches/swig-py3/subversion/tests/cmdline/externals_tests.py?rev=1847678&r1=1847677&r2=1847678&view=diff ============================================================================== --- subversion/branches/swig-py3/subversion/tests/cmdline/externals_tests.py (original) +++ subversion/branches/swig-py3/subversion/tests/cmdline/externals_tests.py Wed Nov 28 21:25:32 2018 @@ -1146,7 +1146,7 @@ def external_into_path_with_spaces(sbox) repo_url = sbox.repo_url ext = '^/A/D "A/copy of D"\n' +\ - '^/A/D A/another\ copy\ of\ D' + '^/A/D A/another\\ copy\\ of\\ D' change_external(wc_dir, ext) expected_output = svntest.wc.State(wc_dir, { @@ -2818,7 +2818,7 @@ def remap_file_external_with_prop_del(sb # Now update to bring the new external down. # This previously segfaulted as described in - # http://subversion.tigris.org/issues/show_bug.cgi?id=4093#desc1 + # https://issues.apache.org/jira/browse/SVN-4093#desc1 svntest.actions.run_and_verify_svn(None, [], 'up', wc_dir) @@ -2946,16 +2946,13 @@ def url_to_wc_copy_of_externals(sbox): external_tau_path = os.path.join(wc_dir, "External-WC-to-URL-Copy", "external", "tau") expected_stdout = verify.UnorderedOutput([ - " U " + external_root_path + "\n", + "A " + external_root_path + "\n", "\n", "Fetching external item into '" + external_ex_path + "':\n", - "A " + external_pi_path + "\n", - "A " + external_rho_path + "\n", - "A " + external_tau_path + "\n", - "Checked out external at revision 2.\n", - "\n", - "Checked out revision 2.\n", - "A " + external_root_path + "\n" + "A " + external_ex_path + "\n", + "A " + external_pi_path + "\n", + "A " + external_rho_path + "\n", + "A " + external_tau_path + "\n", ]) exit_code, stdout, stderr = svntest.actions.run_and_verify_svn2( expected_stdout, [], 0, 'copy', repo_url + '/A/C', @@ -3871,12 +3868,14 @@ def copy_pin_externals_whitespace_dir(sb extdef = sbox.get_tempname('extdef') info = sbox.get_tempname('info') - open(extdef, 'w').write( + with open(extdef, 'w') as f: + f.write( '"' + ss_path +'/deps/sqlite" ext/sqlite\n' + '"^/deps/A P R" \'ext/A P R\'\n' + - '^/deps/B\ D\ B\' ext/B\ D\ B\'\n' + + '^/deps/B\\ D\\ B\' ext/B\\ D\\ B\'\n' + repo_url + '/deps/wors%23+t ext/wors#+t') - open(info, 'w').write('info\n') + with open(info, 'w') as f: + f.write('info\n') svntest.actions.run_and_verify_svnmucc(None, [], '-U', repo_url, 'mkdir', 'trunk', @@ -4398,6 +4397,55 @@ def invalid_uris_in_repo(sbox): "-r", revision) svntest.main.safe_rmtree(sbox.wc_dir) +# Like issue #3741 'externals not removed when working copy is made shallow' +# but with --set-depth=exclude instead of --set-depth=empty. +def update_dir_external_exclude(sbox): + "exclude update should remove externals" + + sbox.build() + + # Create an external in r2 + sbox.simple_propset('svn:externals', '^/A/D/H X', 'A/B/E') + sbox.simple_commit() + + # Update to fetch externals + expected_output = svntest.wc.State(sbox.wc_dir, { + 'A/B/E/X/chi' : Item(status='A '), + 'A/B/E/X/omega' : Item(status='A '), + 'A/B/E/X/psi' : Item(status='A '), + }) + svntest.actions.run_and_verify_update(sbox.wc_dir, + expected_output, None, None, + [], False, + sbox.ospath('A/B/E')) + + # Now make A/B/E shallow by updating with "--set-depth exclude" + expected_output = svntest.wc.State(sbox.wc_dir, { + 'A/B/E' : Item(status='D '), + 'A/B/E/X' : Item(verb='Removed external'), + }) + svntest.actions.run_and_verify_update(sbox.wc_dir, + expected_output, None, None, + [], False, + '--set-depth=exclude', + sbox.ospath('A/B/E')) + + # And bring the external back by updating with "--set-depth infinity" + expected_output = svntest.wc.State(sbox.wc_dir, { + 'A/B/E' : Item(status='A '), + 'A/B/E/alpha' : Item(status='A '), + 'A/B/E/beta' : Item(status='A '), + 'A/B/E/X/chi' : Item(status='A '), + 'A/B/E/X/omega' : Item(status='A '), + 'A/B/E/X/psi' : Item(status='A '), + }) + svntest.actions.run_and_verify_update(sbox.wc_dir, + expected_output, None, None, + [], False, + '--set-depth=infinity', + sbox.ospath('A/B/E')) + + ######################################################################## # Run the tests @@ -4474,6 +4522,7 @@ test_list = [ None, file_external_recorded_info, external_externally_removed, invalid_uris_in_repo, + update_dir_external_exclude, ] if __name__ == '__main__': Modified: subversion/branches/swig-py3/subversion/tests/cmdline/getopt_tests_data/svn--help_stdout URL: http://svn.apache.org/viewvc/subversion/branches/swig-py3/subversion/tests/cmdline/getopt_tests_data/svn--help_stdout?rev=1847678&r1=1847677&r2=1847678&view=diff ============================================================================== --- subversion/branches/swig-py3/subversion/tests/cmdline/getopt_tests_data/svn--help_stdout (original) +++ subversion/branches/swig-py3/subversion/tests/cmdline/getopt_tests_data/svn--help_stdout Wed Nov 28 21:25:32 2018 @@ -42,18 +42,19 @@ Available subcommands: resolve resolved revert - shelf-diff - shelf-drop - shelf-list (shelves) - shelf-log - shelf-save - shelve - unshelve status (stat, st) switch (sw) unlock update (up) upgrade + x-shelf-diff + x-shelf-drop + x-shelf-list (x-shelves) + x-shelf-list-by-paths + x-shelf-log + x-shelf-save + x-shelve + x-unshelve Subversion is a tool for version control. For additional information, see http://subversion.apache.org/ Modified: subversion/branches/swig-py3/subversion/tests/cmdline/getopt_tests_data/svn_help_log_switch_stdout URL: http://svn.apache.org/viewvc/subversion/branches/swig-py3/subversion/tests/cmdline/getopt_tests_data/svn_help_log_switch_stdout?rev=1847678&r1=1847677&r2=1847678&view=diff ============================================================================== --- subversion/branches/swig-py3/subversion/tests/cmdline/getopt_tests_data/svn_help_log_switch_stdout (original) +++ subversion/branches/swig-py3/subversion/tests/cmdline/getopt_tests_data/svn_help_log_switch_stdout Wed Nov 28 21:25:32 2018 @@ -84,6 +84,10 @@ usage: 1. log [PATH][@REV] was created: svn log --stop-on-copy --limit 1 -r0:HEAD ^/branches/foo + Show all log messages for commits between the tags ^/tags/2.0 and + ^/tags/3.0; assuming that tag 2.0 was created in revision 100: + svn log -rHEAD:100 ^/tags/3.0 + If ^/trunk/foo.c was moved to ^/trunk/bar.c' in revision 22, 'svn log -v' shows a deletion and a copy in its changed paths list, such as: D /trunk/foo.c @@ -205,7 +209,7 @@ Valid options: 'BASE' base rev of item's working copy 'COMMITTED' last commit at or before BASE 'PREV' revision just before COMMITTED - -N [--non-recursive] : obsolete; try --depth=files or --depth=immediates + -N [--non-recursive] : obsolete; same as --depth=files --depth ARG : limit operation by depth ARG ('empty', 'files', 'immediates', or 'infinity') --set-depth ARG : set new working copy depth to ARG ('exclude', Modified: subversion/branches/swig-py3/subversion/tests/cmdline/getopt_tests_data/svn_help_stdout URL: http://svn.apache.org/viewvc/subversion/branches/swig-py3/subversion/tests/cmdline/getopt_tests_data/svn_help_stdout?rev=1847678&r1=1847677&r2=1847678&view=diff ============================================================================== --- subversion/branches/swig-py3/subversion/tests/cmdline/getopt_tests_data/svn_help_stdout (original) +++ subversion/branches/swig-py3/subversion/tests/cmdline/getopt_tests_data/svn_help_stdout Wed Nov 28 21:25:32 2018 @@ -42,18 +42,19 @@ Available subcommands: resolve resolved revert - shelf-diff - shelf-drop - shelf-list (shelves) - shelf-log - shelf-save - shelve - unshelve status (stat, st) switch (sw) unlock update (up) upgrade + x-shelf-diff + x-shelf-drop + x-shelf-list (x-shelves) + x-shelf-list-by-paths + x-shelf-log + x-shelf-save + x-shelve + x-unshelve Subversion is a tool for version control. For additional information, see http://subversion.apache.org/ Modified: subversion/branches/swig-py3/subversion/tests/cmdline/info_tests.py URL: http://svn.apache.org/viewvc/subversion/branches/swig-py3/subversion/tests/cmdline/info_tests.py?rev=1847678&r1=1847677&r2=1847678&view=diff ============================================================================== --- subversion/branches/swig-py3/subversion/tests/cmdline/info_tests.py (original) +++ subversion/branches/swig-py3/subversion/tests/cmdline/info_tests.py Wed Nov 28 21:25:32 2018 @@ -716,6 +716,72 @@ def info_item_uncommmitted(sbox): sbox.ospath('newfile'), sbox.ospath('newdir')) +def info_item_size_wc_recursive(sbox): + "recursive '--show-item=repos-size' on local path" + + sbox.build(read_only=True) + + svntest.actions.run_and_verify_svn( + [], [], + 'info', '--show-item=repos-size', '--recursive', + sbox.ospath('')) + + +def info_item_size_repos(sbox): + "non-recursive '--show-item=repos-size' on URL" + + sbox.build(read_only=True) + + svntest.actions.run_and_verify_svn( + "25\n", [], + 'info', '--show-item=repos-size', + sbox.repo_url + "/iota") + + # Same, but without the newline. + svntest.actions.run_and_verify_svn( + "25", [], + 'info', '--show-item=repos-size', '--no-newline', + sbox.repo_url + "/iota") + + # Same, but with "human-readable" output. + svntest.actions.run_and_verify_svn( + "25 B", [], + 'info', '--show-item=repos-size', '--human-readable', + sbox.repo_url + "/iota") + + # No output when the URL is a directory. + svntest.actions.run_and_verify_svn( + [], [], + 'info', '--show-item=repos-size', + sbox.repo_url) + + +def info_item_size_repos_recursive(sbox): + "recursive '--show-item=repos-size' on dir URL" + + sbox.build(read_only=True) + + expected_output = svntest.verify.UnorderedOutput([ + "25 " + sbox.repo_url + "/iota\n", + "27 " + sbox.repo_url + "/A/B/lambda\n", + "25 " + sbox.repo_url + "/A/B/E/beta\n", + "26 " + sbox.repo_url + "/A/B/E/alpha\n", + "23 " + sbox.repo_url + "/A/mu\n", + "26 " + sbox.repo_url + "/A/D/gamma\n", + "23 " + sbox.repo_url + "/A/D/G/pi\n", + "24 " + sbox.repo_url + "/A/D/G/rho\n", + "24 " + sbox.repo_url + "/A/D/G/tau\n", + "26 " + sbox.repo_url + "/A/D/H/omega\n", + "24 " + sbox.repo_url + "/A/D/H/psi\n", + "24 " + sbox.repo_url + "/A/D/H/chi\n", + ]) + + svntest.actions.run_and_verify_svn( + expected_output, [], + 'info', '--show-item=repos-size', '--recursive', + sbox.repo_url) + + def info_item_failures(sbox): "failure modes of 'svn info --show-item'" @@ -746,6 +812,11 @@ def info_item_failures(sbox): 'info', '--show-item=revision', '--no-newline', sbox.ospath('A'), sbox.ospath('iota')) + svntest.actions.run_and_verify_svn( + None, (r".*E200007: can't show in-repository size.*"), + 'info', '--show-item=repos-size', + sbox.ospath('iota')) + ######################################################################## # Run the tests @@ -767,6 +838,9 @@ test_list = [ None, info_item_simple_multiple, info_item_url, info_item_uncommmitted, + info_item_size_wc_recursive, + info_item_size_repos, + info_item_size_repos_recursive, info_item_failures, ] Modified: subversion/branches/swig-py3/subversion/tests/cmdline/iprop_authz_tests.py URL: http://svn.apache.org/viewvc/subversion/branches/swig-py3/subversion/tests/cmdline/iprop_authz_tests.py?rev=1847678&r1=1847677&r2=1847678&view=diff ============================================================================== --- subversion/branches/swig-py3/subversion/tests/cmdline/iprop_authz_tests.py (original) +++ subversion/branches/swig-py3/subversion/tests/cmdline/iprop_authz_tests.py Wed Nov 28 21:25:32 2018 @@ -105,7 +105,7 @@ def iprops_authz(sbox): write_authz_file(sbox, { "/" : svntest.main.wc_author + "=rw", "/A/D/H/psi" : svntest.main.wc_author + "=",}) - if sbox.repo_url.startswith("http"): + if svntest.main.is_ra_type_dav(): expected_err = ".*[Ff]orbidden.*" else: expected_err = ".*svn: E170001: Authorization failed.*" Modified: subversion/branches/swig-py3/subversion/tests/cmdline/lock_tests.py URL: http://svn.apache.org/viewvc/subversion/branches/swig-py3/subversion/tests/cmdline/lock_tests.py?rev=1847678&r1=1847677&r2=1847678&view=diff ============================================================================== --- subversion/branches/swig-py3/subversion/tests/cmdline/lock_tests.py (original) +++ subversion/branches/swig-py3/subversion/tests/cmdline/lock_tests.py Wed Nov 28 21:25:32 2018 @@ -1571,7 +1571,8 @@ def cp_isnt_ro(sbox): mu2_path = sbox.ospath('A/mu2') mu3_path = sbox.ospath('A/mu3') kappa_path = sbox.ospath('kappa') - open(kappa_path, 'w').write("This is the file 'kappa'.\n") + with open(kappa_path, 'w') as f: + f.write("This is the file 'kappa'.\n") ## added file sbox.simple_add('kappa') @@ -2251,7 +2252,6 @@ def dav_lock_refresh(sbox): if r.status != httplib.OK: raise svntest.Failure('Lock refresh failed: %d %s' % (r.status, r.reason)) -@SkipUnless(svntest.main.is_ra_type_dav) def delete_locked_file_with_percent(sbox): "lock and delete a file called 'a %( ) .txt'" Modified: subversion/branches/swig-py3/subversion/tests/cmdline/log_tests.py URL: http://svn.apache.org/viewvc/subversion/branches/swig-py3/subversion/tests/cmdline/log_tests.py?rev=1847678&r1=1847677&r2=1847678&view=diff ============================================================================== --- subversion/branches/swig-py3/subversion/tests/cmdline/log_tests.py (original) +++ subversion/branches/swig-py3/subversion/tests/cmdline/log_tests.py Wed Nov 28 21:25:32 2018 @@ -1592,7 +1592,7 @@ def merge_sensitive_log_added_mergeinfo_ # a merge results in added explicit mergeinfo on a path, but that # path previously inherited mergeinfo (rather than had no explicit # or inherited mergeinfo). See issue #3235, specifically - # http://subversion.tigris.org/issues/show_bug.cgi?id=3235#desc8. + # https://issues.apache.org/jira/browse/SVN-3235#desc8. sbox.build() wc_dir = sbox.wc_dir @@ -1752,7 +1752,7 @@ def merge_sensitive_log_added_mergeinfo_ def merge_sensitive_log_propmod_merge_inheriting_path(sbox): "log -g and simple propmod to merge-inheriting path" - # Issue #3285 (http://subversion.tigris.org/issues/show_bug.cgi?id=3285) + # Issue #3285 (https://issues.apache.org/jira/browse/SVN-3285) sbox.build() wc_dir = sbox.wc_dir @@ -2166,13 +2166,13 @@ def log_diff(sbox): + [ "@@ -1 +1,2 @@\n", " This is the file 'beta'.\n", "+9\n", - "\ No newline at end of file\n", + "\\ No newline at end of file\n", ] ] r8diff = [ make_diff_header('A2/D/G/rho', 'nonexistent', 'revision 8') + [ "@@ -0,0 +1 @@\n", "+88\n", - "\ No newline at end of file\n", + "\\ No newline at end of file\n", ] ] log_chain = parse_log_output(output, with_diffs=True) Modified: subversion/branches/swig-py3/subversion/tests/cmdline/merge_authz_tests.py URL: http://svn.apache.org/viewvc/subversion/branches/swig-py3/subversion/tests/cmdline/merge_authz_tests.py?rev=1847678&r1=1847677&r2=1847678&view=diff ============================================================================== --- subversion/branches/swig-py3/subversion/tests/cmdline/merge_authz_tests.py (original) +++ subversion/branches/swig-py3/subversion/tests/cmdline/merge_authz_tests.py Wed Nov 28 21:25:32 2018 @@ -486,7 +486,7 @@ def mergeinfo_and_skipped_paths(sbox): def merge_fails_if_subtree_is_deleted_on_src(sbox): "merge fails if subtree is deleted on src" - ## See http://subversion.tigris.org/issues/show_bug.cgi?id=2876. ## + ## See https://issues.apache.org/jira/browse/SVN-2876. ## # Create a WC sbox.build() @@ -613,7 +613,7 @@ def reintegrate_fails_if_no_root_access( # should be able to reintegrate, regardless of what authorization # they have to parents of the source and target. # - # See http://subversion.tigris.org/issues/show_bug.cgi?id=3242#desc78 + # See https://issues.apache.org/jira/browse/SVN-3242#desc78 # Some paths we'll care about wc_dir = sbox.wc_dir Modified: subversion/branches/swig-py3/subversion/tests/cmdline/merge_automatic_tests.py URL: http://svn.apache.org/viewvc/subversion/branches/swig-py3/subversion/tests/cmdline/merge_automatic_tests.py?rev=1847678&r1=1847677&r2=1847678&view=diff ============================================================================== --- subversion/branches/swig-py3/subversion/tests/cmdline/merge_automatic_tests.py (original) +++ subversion/branches/swig-py3/subversion/tests/cmdline/merge_automatic_tests.py Wed Nov 28 21:25:32 2018 @@ -1163,7 +1163,7 @@ def effective_sync_results_in_reintegrat # Now try an explicit --reintegrate merge from ^/branch to A. # This should work because since the resolution of - # http://subversion.tigris.org/issues/show_bug.cgi?id=3577 + # https://issues.apache.org/jira/browse/SVN-3577 # if B is *effectively* synced with A, then B can be reintegrated # to A. sbox.simple_update() Modified: subversion/branches/swig-py3/subversion/tests/cmdline/merge_reintegrate_tests.py URL: http://svn.apache.org/viewvc/subversion/branches/swig-py3/subversion/tests/cmdline/merge_reintegrate_tests.py?rev=1847678&r1=1847677&r2=1847678&view=diff ============================================================================== --- subversion/branches/swig-py3/subversion/tests/cmdline/merge_reintegrate_tests.py (original) +++ subversion/branches/swig-py3/subversion/tests/cmdline/merge_reintegrate_tests.py Wed Nov 28 21:25:32 2018 @@ -1363,7 +1363,7 @@ def reintegrate_with_subtree_mergeinfo(s # how can any prop changes be merged to it? The answer is that # the merge code does some quiet housekeeping, merging gamma_moved's # inherited mergeinfo into its incoming mergeinfo, see - # http://subversion.tigris.org/issues/show_bug.cgi?id=4309 + # https://issues.apache.org/jira/browse/SVN-4309 # This test is not covering issue #4309 so we let the current # behavior pass. # r17 - B) Synch merge from A to A_COPY
