Modified: subversion/branches/java10-compat/subversion/svn/conflict-callbacks.c URL: http://svn.apache.org/viewvc/subversion/branches/java10-compat/subversion/svn/conflict-callbacks.c?rev=1841179&r1=1841178&r2=1841179&view=diff ============================================================================== --- subversion/branches/java10-compat/subversion/svn/conflict-callbacks.c (original) +++ subversion/branches/java10-compat/subversion/svn/conflict-callbacks.c Tue Sep 18 01:50:50 2018 @@ -1534,22 +1534,14 @@ build_tree_conflict_options( id != svn_client_conflict_option_accept_current_wc_state) *all_options_are_dumb = FALSE; - if (id == svn_client_conflict_option_incoming_move_file_text_merge || - id == svn_client_conflict_option_incoming_move_dir_merge) - { + if (*possible_moved_to_repos_relpaths == NULL) SVN_ERR( - svn_client_conflict_option_get_moved_to_repos_relpath_candidates( + svn_client_conflict_option_get_moved_to_repos_relpath_candidates2( possible_moved_to_repos_relpaths, builtin_option, result_pool, iterpool)); - SVN_ERR(svn_client_conflict_option_get_moved_to_abspath_candidates( - possible_moved_to_abspaths, builtin_option, - result_pool, iterpool)); - } - else if (id == svn_client_conflict_option_local_move_file_text_merge || - id == svn_client_conflict_option_local_move_dir_merge || - id == svn_client_conflict_option_sibling_move_file_text_merge || - id == svn_client_conflict_option_sibling_move_dir_merge) - SVN_ERR(svn_client_conflict_option_get_moved_to_abspath_candidates( + + if (*possible_moved_to_abspaths == NULL) + SVN_ERR(svn_client_conflict_option_get_moved_to_abspath_candidates2( possible_moved_to_abspaths, builtin_option, result_pool, iterpool)); } @@ -1682,6 +1674,69 @@ prompt_move_target_path(int *preferred_m return SVN_NO_ERROR; } +static svn_error_t * +find_conflict_option_with_repos_move_targets( + svn_client_conflict_option_t **option_with_move_targets, + apr_array_header_t *options, + apr_pool_t *scratch_pool) +{ + apr_pool_t *iterpool = svn_pool_create(scratch_pool); + int i; + apr_array_header_t *possible_moved_to_repos_relpaths = NULL; + + *option_with_move_targets = NULL; + + for (i = 0; i < options->nelts; i++) + { + svn_client_conflict_option_t *option; + + svn_pool_clear(iterpool); + option = APR_ARRAY_IDX(options, i, svn_client_conflict_option_t *); + SVN_ERR(svn_client_conflict_option_get_moved_to_repos_relpath_candidates2( + &possible_moved_to_repos_relpaths, option, iterpool, iterpool)); + if (possible_moved_to_repos_relpaths) + { + *option_with_move_targets = option; + break; + } + } + svn_pool_destroy(iterpool); + + return SVN_NO_ERROR; +} + +static svn_error_t * +find_conflict_option_with_working_copy_move_targets( + svn_client_conflict_option_t **option_with_move_targets, + apr_array_header_t *options, + apr_pool_t *scratch_pool) +{ + apr_pool_t *iterpool = svn_pool_create(scratch_pool); + int i; + apr_array_header_t *possible_moved_to_abspaths = NULL; + + *option_with_move_targets = NULL; + + for (i = 0; i < options->nelts; i++) + { + svn_client_conflict_option_t *option; + + svn_pool_clear(iterpool); + option = APR_ARRAY_IDX(options, i, svn_client_conflict_option_t *); + SVN_ERR(svn_client_conflict_option_get_moved_to_abspath_candidates2( + &possible_moved_to_abspaths, option, scratch_pool, + iterpool)); + if (possible_moved_to_abspaths) + { + *option_with_move_targets = option; + break; + } + } + svn_pool_destroy(iterpool); + + return SVN_NO_ERROR; +} + /* Ask the user what to do about the tree conflict described by CONFLICT * and either resolve the conflict accordingly or postpone resolution. * SCRATCH_POOL is used for temporary allocations. */ @@ -1809,7 +1864,7 @@ handle_tree_conflict(svn_boolean_t *reso { int preferred_move_target_idx; apr_array_header_t *options; - svn_client_conflict_option_t *conflict_option; + svn_client_conflict_option_t *option; SVN_ERR(prompt_move_target_path(&preferred_move_target_idx, possible_moved_to_repos_relpaths, @@ -1822,22 +1877,12 @@ handle_tree_conflict(svn_boolean_t *reso ctx, iterpool, iterpool)); - conflict_option = - svn_client_conflict_option_find_by_id( - options, - svn_client_conflict_option_incoming_move_file_text_merge); - if (conflict_option == NULL) + SVN_ERR(find_conflict_option_with_repos_move_targets( + &option, options, iterpool)); + if (option) { - conflict_option = - svn_client_conflict_option_find_by_id( - options, svn_client_conflict_option_incoming_move_dir_merge); - } - - if (conflict_option) - { - SVN_ERR(svn_client_conflict_option_set_moved_to_repos_relpath( - conflict_option, preferred_move_target_idx, - ctx, iterpool)); + SVN_ERR(svn_client_conflict_option_set_moved_to_repos_relpath2( + option, preferred_move_target_idx, ctx, iterpool)); repos_move_target_chosen = TRUE; wc_move_target_chosen = FALSE; @@ -1863,7 +1908,7 @@ handle_tree_conflict(svn_boolean_t *reso { int preferred_move_target_idx; apr_array_header_t *options; - svn_client_conflict_option_t *conflict_option; + svn_client_conflict_option_t *option; SVN_ERR(prompt_move_target_path(&preferred_move_target_idx, possible_moved_to_abspaths, TRUE, @@ -1875,50 +1920,12 @@ handle_tree_conflict(svn_boolean_t *reso ctx, iterpool, iterpool)); - conflict_option = - svn_client_conflict_option_find_by_id( - options, - svn_client_conflict_option_incoming_move_file_text_merge); - if (conflict_option == NULL) - { - conflict_option = - svn_client_conflict_option_find_by_id( - options, - svn_client_conflict_option_local_move_file_text_merge); - } - if (conflict_option == NULL) - { - conflict_option = - svn_client_conflict_option_find_by_id( - options, - svn_client_conflict_option_local_move_dir_merge); - } - if (conflict_option == NULL) - { - conflict_option = - svn_client_conflict_option_find_by_id( - options, - svn_client_conflict_option_sibling_move_file_text_merge); - } - if (conflict_option == NULL) - { - conflict_option = - svn_client_conflict_option_find_by_id( - options, - svn_client_conflict_option_sibling_move_dir_merge); - } - if (conflict_option == NULL) - { - conflict_option = - svn_client_conflict_option_find_by_id( - options, svn_client_conflict_option_incoming_move_dir_merge); - } - - if (conflict_option) + SVN_ERR(find_conflict_option_with_working_copy_move_targets( + &option, options, iterpool)); + if (option) { - SVN_ERR(svn_client_conflict_option_set_moved_to_abspath( - conflict_option, preferred_move_target_idx, ctx, - iterpool)); + SVN_ERR(svn_client_conflict_option_set_moved_to_abspath2( + option, preferred_move_target_idx, ctx, iterpool)); wc_move_target_chosen = TRUE; /* Update option description. */
Modified: subversion/branches/java10-compat/subversion/svn/info-cmd.c URL: http://svn.apache.org/viewvc/subversion/branches/java10-compat/subversion/svn/info-cmd.c?rev=1841179&r1=1841178&r2=1841179&view=diff ============================================================================== --- subversion/branches/java10-compat/subversion/svn/info-cmd.c (original) +++ subversion/branches/java10-compat/subversion/svn/info-cmd.c Tue Sep 18 01:50:50 2018 @@ -21,6 +21,10 @@ * ==================================================================== */ +/* We define this here to remove any further warnings about the usage of + experimental functions in this file. */ +#define SVN_EXPERIMENTAL + /* ==================================================================== */ Modified: subversion/branches/java10-compat/subversion/svn/svn.c URL: http://svn.apache.org/viewvc/subversion/branches/java10-compat/subversion/svn/svn.c?rev=1841179&r1=1841178&r2=1841179&view=diff ============================================================================== --- subversion/branches/java10-compat/subversion/svn/svn.c (original) +++ subversion/branches/java10-compat/subversion/svn/svn.c Tue Sep 18 01:50:50 2018 @@ -480,7 +480,7 @@ const apr_getopt_option_t svn_cl__option {"drop", opt_drop, 0, N_("drop shelf after successful unshelve")}, - {"viewspec", opt_viewspec, 0, + {"x-viewspec", opt_viewspec, 0, N_("print the working copy layout")}, /* Long-opt Aliases @@ -823,7 +823,7 @@ const svn_opt_subcommand_desc3_t svn_cl_ " about TARGET.\n" "\n"), N_( " EXPERIMENTAL:\n" - " With --viewspec, print the working copy layout.\n" + " With --x-viewspec, print the working copy layout.\n" )}, {'r', 'R', opt_depth, opt_targets, opt_incremental, opt_xml, opt_changelist, opt_include_externals, opt_show_item, opt_no_newline, @@ -1953,7 +1953,7 @@ const svn_opt_subcommand_desc3_t svn_cl_ )}, { 'q' } }, - { "x-shelf-diff", svn_cl__shelf_diff, {"shelf-diff"}, {N_( + { "x-shelf-diff", svn_cl__shelf_diff, {0}, {N_( "Show shelved changes as a diff.\n" "usage: x-shelf-diff SHELF [VERSION]\n" "\n"), N_( @@ -1968,7 +1968,7 @@ const svn_opt_subcommand_desc3_t svn_cl_ {opt_summarize}, }, - { "x-shelf-drop", svn_cl__shelf_drop, {"shelf-drop"}, {N_( + { "x-shelf-drop", svn_cl__shelf_drop, {0}, {N_( "Delete a shelf.\n" "usage: x-shelf-drop SHELF [PATH ...]\n" "\n"), N_( @@ -1980,7 +1980,7 @@ const svn_opt_subcommand_desc3_t svn_cl_ )}, }, - { "x-shelf-list", svn_cl__shelf_list, {"shelf-list", "shelves"}, {N_( + { "x-shelf-list", svn_cl__shelf_list, {"x-shelves"}, {N_( "List shelves.\n" "usage: x-shelf-list [PATH ...]\n" "\n"), N_( @@ -1994,7 +1994,7 @@ const svn_opt_subcommand_desc3_t svn_cl_ {'q', 'v'} }, - { "x-shelf-list-by-paths", svn_cl__shelf_list_by_paths, {"shelf-list-by-paths"}, {N_( + { "x-shelf-list-by-paths", svn_cl__shelf_list_by_paths, {0}, {N_( "List which shelf affects each path.\n" "usage: x-shelf-list-by-paths [PATH...]\n" "\n"), N_( @@ -2005,7 +2005,7 @@ const svn_opt_subcommand_desc3_t svn_cl_ )}, }, - { "x-shelf-log", svn_cl__shelf_log, {"shelf-log"}, {N_( + { "x-shelf-log", svn_cl__shelf_log, {0}, {N_( "Show the versions of a shelf.\n" "usage: x-shelf-log SHELF [PATH...]\n" "\n"), N_( @@ -2018,7 +2018,7 @@ const svn_opt_subcommand_desc3_t svn_cl_ {'q', 'v'} }, - { "x-shelf-save", svn_cl__shelf_save, {"shelf-save"}, {N_( + { "x-shelf-save", svn_cl__shelf_save, {0}, {N_( "Copy local changes onto a new version of a shelf.\n" "usage: x-shelf-save SHELF [PATH...]\n" "\n"), N_( @@ -2036,7 +2036,7 @@ const svn_opt_subcommand_desc3_t svn_cl_ } }, - { "x-shelve", svn_cl__shelf_shelve, {"shelve"}, {N_( + { "x-shelve", svn_cl__shelf_shelve, {0}, {N_( "Move local changes onto a shelf.\n" "usage: x-shelve [--keep-local] SHELF [PATH...]\n" "\n"), N_( @@ -2065,7 +2065,7 @@ const svn_opt_subcommand_desc3_t svn_cl_ SVN_CL__LOG_MSG_OPTIONS, } }, - { "x-unshelve", svn_cl__shelf_unshelve, {"unshelve"}, {N_( + { "x-unshelve", svn_cl__shelf_unshelve, {0}, {N_( "Copy shelved changes back into the WC.\n" "usage: x-unshelve [--drop] [SHELF [VERSION]]\n" "\n"), N_( Modified: subversion/branches/java10-compat/subversion/tests/cmdline/getopt_tests_data/svn--help_stdout URL: http://svn.apache.org/viewvc/subversion/branches/java10-compat/subversion/tests/cmdline/getopt_tests_data/svn--help_stdout?rev=1841179&r1=1841178&r2=1841179&view=diff ============================================================================== --- subversion/branches/java10-compat/subversion/tests/cmdline/getopt_tests_data/svn--help_stdout (original) +++ subversion/branches/java10-compat/subversion/tests/cmdline/getopt_tests_data/svn--help_stdout Tue Sep 18 01:50:50 2018 @@ -47,14 +47,14 @@ Available subcommands: unlock update (up) upgrade - x-shelf-diff (shelf-diff) - x-shelf-drop (shelf-drop) - x-shelf-list (shelf-list, shelves) - x-shelf-list-by-paths (shelf-list-by-paths) - x-shelf-log (shelf-log) - x-shelf-save (shelf-save) - x-shelve (shelve) - x-unshelve (unshelve) + 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/java10-compat/subversion/tests/cmdline/getopt_tests_data/svn_help_stdout URL: http://svn.apache.org/viewvc/subversion/branches/java10-compat/subversion/tests/cmdline/getopt_tests_data/svn_help_stdout?rev=1841179&r1=1841178&r2=1841179&view=diff ============================================================================== --- subversion/branches/java10-compat/subversion/tests/cmdline/getopt_tests_data/svn_help_stdout (original) +++ subversion/branches/java10-compat/subversion/tests/cmdline/getopt_tests_data/svn_help_stdout Tue Sep 18 01:50:50 2018 @@ -47,14 +47,14 @@ Available subcommands: unlock update (up) upgrade - x-shelf-diff (shelf-diff) - x-shelf-drop (shelf-drop) - x-shelf-list (shelf-list, shelves) - x-shelf-list-by-paths (shelf-list-by-paths) - x-shelf-log (shelf-log) - x-shelf-save (shelf-save) - x-shelve (shelve) - x-unshelve (unshelve) + 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/java10-compat/subversion/tests/cmdline/shelf_tests.py URL: http://svn.apache.org/viewvc/subversion/branches/java10-compat/subversion/tests/cmdline/shelf_tests.py?rev=1841179&r1=1841178&r2=1841179&view=diff ============================================================================== --- subversion/branches/java10-compat/subversion/tests/cmdline/shelf_tests.py (original) +++ subversion/branches/java10-compat/subversion/tests/cmdline/shelf_tests.py Tue Sep 18 01:50:50 2018 @@ -1,6 +1,6 @@ #!/usr/bin/env python # -# shelve_tests.py: testing shelving +# shelf_tests.py: testing shelving # # Subversion is a tool for revision control. # See http://subversion.apache.org for more information. @@ -111,12 +111,12 @@ def shelve_unshelve_verify(sbox, modifie if cannot_shelve: svntest.actions.run_and_verify_svn(None, '.* could not be shelved.*', - 'shelve', 'foo') + 'x-shelve', 'foo') return # Shelve; check there are no longer any modifications svntest.actions.run_and_verify_svn(None, [], - 'shelve', 'foo') + 'x-shelve', 'foo') check_wc_state(wc_dir, virginal_state) # List; ensure the shelf is listed @@ -124,11 +124,11 @@ def shelve_unshelve_verify(sbox, modifie [r'foo\s*version \d+.*', r' ', ]) - svntest.actions.run_and_verify_svn(expected_output, [], 'shelves') + svntest.actions.run_and_verify_svn(expected_output, [], 'x-shelves') # Unshelve; check the original modifications are here again svntest.actions.run_and_verify_svn(None, [], - 'unshelve', 'foo') + 'x-unshelve', 'foo') check_wc_state(wc_dir, modified_state) #---------------------------------------------------------------------- @@ -273,14 +273,14 @@ def save_revert_restore(sbox, modifier1, # Save a checkpoint; check nothing changed svntest.actions.run_and_verify_svn(None, [], - 'shelf-save', 'foo') + 'x-shelf-save', 'foo') check_wc_state(wc_dir, modified_state1) # Modify again; remember the state; save a checkpoint modifier2(sbox) modified_state2 = get_wc_state(wc_dir) svntest.actions.run_and_verify_svn(None, [], - 'shelf-save', 'foo') + 'x-shelf-save', 'foo') check_wc_state(wc_dir, modified_state2) # Revert @@ -290,7 +290,7 @@ def save_revert_restore(sbox, modifier1, # Restore; check the original modifications are here again svntest.actions.run_and_verify_svn(None, [], - 'unshelve', 'foo', '1') + 'x-unshelve', 'foo', '1') check_wc_state(wc_dir, modified_state1) os.chdir(was_cwd) @@ -351,7 +351,7 @@ def unshelve_refuses_if_conflicts(sbox): # Shelve; check there are no longer any local mods svntest.actions.run_and_verify_svn(None, [], - 'shelve', 'foo') + 'x-shelve', 'foo') check_wc_state(wc_dir, initial_state) # Make a different local mod that will conflict with the shelf @@ -360,7 +360,7 @@ def unshelve_refuses_if_conflicts(sbox): # Try to unshelve; check it fails with an error about a conflict svntest.actions.run_and_verify_svn(None, '.*[Cc]onflict.*', - 'unshelve', 'foo') + 'x-unshelve', 'foo') # Check nothing changed in the attempt check_wc_state(wc_dir, modified_state2) @@ -462,13 +462,13 @@ def shelve_with_log_message(sbox): sbox.simple_add_text('New file', 'f') log_message = 'Log message for foo' svntest.actions.run_and_verify_svn(None, [], - 'shelve', 'foo', '-m', log_message) + 'x-shelve', 'foo', '-m', log_message) expected_output = svntest.verify.RegexListOutput( ['foo .*', ' ' + log_message ]) svntest.actions.run_and_verify_svn(expected_output, [], - 'shelf-list') + 'x-shelf-list') os.chdir(was_cwd) @@ -518,7 +518,7 @@ def shelf_status(sbox): run_and_verify_status(sbox.wc_dir, expected_status) svntest.actions.run_and_verify_svn(None, [], - 'shelve', 'foo') + 'x-shelve', 'foo') run_and_verify_shelf_status(sbox.wc_dir, expected_status, shelf='foo') os.chdir(was_cwd) @@ -603,17 +603,17 @@ def list_shelves(sbox): # an empty list svntest.actions.run_and_verify_svn([], [], - 'shelf-list', '-q') + 'x-shelf-list', '-q') # make two shelves sbox.simple_append('A/mu', 'appended mu text') svntest.actions.run_and_verify_svn(None, [], - 'shelf-save', 'foo') + 'x-shelf-save', 'foo') sbox.simple_append('A/mu', 'appended more text') svntest.actions.run_and_verify_svn(None, [], - 'shelf-save', 'foo', '-m', 'log msg') + 'x-shelf-save', 'foo', '-m', 'log msg') svntest.actions.run_and_verify_svn(None, [], - 'shelf-save', 'bar', '-m', 'log msg') + 'x-shelf-save', 'bar', '-m', 'log msg') # We don't check for time-ordering of the shelves. If we want to do so, we # would need to sleep for timestamps to differ, between creating them. @@ -621,7 +621,7 @@ def list_shelves(sbox): # a quiet list expected_out = svntest.verify.UnorderedRegexListOutput(['foo', 'bar']) svntest.actions.run_and_verify_svn(expected_out, [], - 'shelf-list', '-q') + 'x-shelf-list', '-q') # a detailed list expected_out = svntest.verify.UnorderedRegexListOutput(['foo .* 1 path.*', @@ -629,7 +629,7 @@ def list_shelves(sbox): 'bar .* 1 path.*', ' log msg']) svntest.actions.run_and_verify_svn(expected_out, [], - 'shelf-list') + 'x-shelf-list') os.chdir(was_cwd) @@ -668,7 +668,7 @@ def refuse_to_shelve_conflict(sbox): r' > not shelved']) svntest.actions.run_and_verify_svn(expected_out, '.* 1 path could not be shelved', - 'shelf-save', 'foo') + 'x-shelf-save', 'foo') os.chdir(was_cwd) @@ -695,7 +695,7 @@ def unshelve_with_merge(sbox, setup, mod # Shelve; check there are no longer any modifications svntest.actions.run_and_verify_svn(None, [], - 'shelve', 'foo') + 'x-shelve', 'foo') check_wc_state(wc_dir, initial_state) # Make a different change, with which we shall merge @@ -705,7 +705,7 @@ def unshelve_with_merge(sbox, setup, mod # Unshelve; check the expected result of the merge svntest.actions.run_and_verify_svn(None, [], - 'unshelve', 'foo') + 'x-unshelve', 'foo') tweak_expected_state(modified_state) check_wc_state(wc_dir, modified_state) @@ -892,7 +892,7 @@ def run_and_verify_shelf_diff_summarize( exit_code, output, errput = svntest.actions.run_and_verify_svn( None, [], - 'shelf-diff', '--summarize', shelf, *args) + 'x-shelf-diff', '--summarize', shelf, *args) actual = svntest.tree.build_tree_from_diff_summarize(output) @@ -930,7 +930,7 @@ def shelf_diff_simple(sbox): modified_state = get_wc_state(wc_dir) svntest.actions.run_and_verify_svn(None, [], - 'shelf-save', 'foo') + 'x-shelf-save', 'foo') # basic svn-style diff expected_output = make_diff_header('A/mu', 'revision 2', 'working copy') + [ @@ -940,7 +940,7 @@ def shelf_diff_simple(sbox): ] + make_diff_prop_header('A/mu') \ + make_diff_prop_modified('p1', 'v', 'changed') svntest.actions.run_and_verify_svn(expected_output, [], - 'shelf-diff', 'foo') + 'x-shelf-diff', 'foo') # basic summary diff expected_diff = svntest.wc.State(wc_dir, { Modified: subversion/branches/java10-compat/subversion/tests/cmdline/svntest/main.py URL: http://svn.apache.org/viewvc/subversion/branches/java10-compat/subversion/tests/cmdline/svntest/main.py?rev=1841179&r1=1841178&r2=1841179&view=diff ============================================================================== --- subversion/branches/java10-compat/subversion/tests/cmdline/svntest/main.py (original) +++ subversion/branches/java10-compat/subversion/tests/cmdline/svntest/main.py Tue Sep 18 01:50:50 2018 @@ -56,7 +56,7 @@ import svntest from svntest import Failure from svntest import Skip -SVN_VER_MINOR = 11 +SVN_VER_MINOR = 12 ###################################################################### # Modified: subversion/branches/java10-compat/subversion/tests/libsvn_client/conflicts-test.c URL: http://svn.apache.org/viewvc/subversion/branches/java10-compat/subversion/tests/libsvn_client/conflicts-test.c?rev=1841179&r1=1841178&r2=1841179&view=diff ============================================================================== --- subversion/branches/java10-compat/subversion/tests/libsvn_client/conflicts-test.c (original) +++ subversion/branches/java10-compat/subversion/tests/libsvn_client/conflicts-test.c Tue Sep 18 01:50:50 2018 @@ -5700,6 +5700,185 @@ test_cherry_pick_post_move_edit_dir(cons return SVN_NO_ERROR; } +static svn_error_t * +test_local_missing_abiguous_moves(const svn_test_opts_t *opts, + apr_pool_t *pool) +{ + svn_test__sandbox_t *b = apr_palloc(pool, sizeof(*b)); + svn_opt_revision_t opt_rev; + svn_client_ctx_t *ctx; + svn_client_conflict_t *conflict; + apr_array_header_t *options; + svn_client_conflict_option_t *option; + apr_array_header_t *possible_moved_to_repos_relpaths; + apr_array_header_t *possible_moved_to_abspaths; + struct status_baton sb; + struct svn_client_status_t *status; + svn_stringbuf_t *buf; + + SVN_ERR(svn_test__sandbox_create(b, "local_missing_ambiguous_moves", opts, + pool)); + + SVN_ERR(sbox_add_and_commit_greek_tree(b)); /* r1 */ + + /* Create a copy of node "A" (the "trunk") to "A1" (the "branch"). */ + SVN_ERR(sbox_wc_copy(b, "A", "A1")); + SVN_ERR(sbox_wc_commit(b, "")); /* r2 */ + + SVN_ERR(sbox_wc_update(b, "", SVN_INVALID_REVNUM)); + /* Copy a file across branch boundaries (gives ambiguous WC targets later). */ + SVN_ERR(sbox_wc_copy(b, "A/mu", "A1/mu-copied-from-A")); + /* Create an ambiguous move with the "trunk". */ + SVN_ERR(sbox_wc_copy(b, "A/mu", "A/mu-copied")); + SVN_ERR(sbox_wc_move(b, "A/mu", "A/mu-moved")); + SVN_ERR(sbox_wc_commit(b, "")); /* r3 */ + + /* Modify the moved file on the "branch". */ + SVN_ERR(sbox_file_write(b, "A1/mu", "Modified content." APR_EOL_STR)); + SVN_ERR(sbox_wc_commit(b, "")); /* r4 */ + SVN_ERR(sbox_wc_update(b, "", SVN_INVALID_REVNUM)); + + /* Merge "A1" ("branch") into "A" ("trunk"). */ + opt_rev.kind = svn_opt_revision_head; + opt_rev.value.number = SVN_INVALID_REVNUM; + SVN_ERR(svn_test__create_client_ctx(&ctx, b, pool)); + SVN_ERR(svn_client_merge_peg5(svn_path_url_add_component2(b->repos_url, "A1", + pool), + NULL, &opt_rev, sbox_wc_path(b, "A"), + svn_depth_infinity, + FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, + NULL, ctx, pool)); + + SVN_ERR(svn_client_conflict_get(&conflict, sbox_wc_path(b, "A/mu"), + ctx, b->pool, b->pool)); + { + svn_client_conflict_option_id_t expected_opts[] = { + svn_client_conflict_option_postpone, + svn_client_conflict_option_accept_current_wc_state, + -1 /* end of list */ + }; + SVN_ERR(assert_tree_conflict_options(conflict, ctx, expected_opts, + b->pool)); + } + SVN_ERR(svn_client_conflict_tree_get_details(conflict, ctx, b->pool)); + { + svn_client_conflict_option_id_t expected_opts[] = { + svn_client_conflict_option_postpone, + svn_client_conflict_option_accept_current_wc_state, + svn_client_conflict_option_local_move_file_text_merge, + -1 /* end of list */ + }; + SVN_ERR(assert_tree_conflict_options(conflict, ctx, expected_opts, + b->pool)); + } + + SVN_ERR(svn_client_conflict_tree_get_resolution_options(&options, conflict, + ctx, b->pool, + b->pool)); + option = svn_client_conflict_option_find_by_id( + options, svn_client_conflict_option_local_move_file_text_merge); + SVN_TEST_ASSERT(option != NULL); + + /* + * Possible repository destinations for moved-away 'A/mu' are: + * (1): '^/A/mu-copied' + * (2): '^/A/mu-moved' + * (3): '^/A1/mu-copied-from-A' + */ + SVN_ERR(svn_client_conflict_option_get_moved_to_repos_relpath_candidates( + &possible_moved_to_repos_relpaths, option, b->pool, b->pool)); + SVN_TEST_INT_ASSERT(possible_moved_to_repos_relpaths->nelts, 3); + SVN_TEST_STRING_ASSERT( + APR_ARRAY_IDX(possible_moved_to_repos_relpaths, 0, const char *), + "A/mu-copied"); + SVN_TEST_STRING_ASSERT( + APR_ARRAY_IDX(possible_moved_to_repos_relpaths, 1, const char *), + "A/mu-moved"); + SVN_TEST_STRING_ASSERT( + APR_ARRAY_IDX(possible_moved_to_repos_relpaths, 2, const char *), + "A1/mu-copied-from-A"); + + /* Move target for "A/mu-copied" (selected by default) is not ambiguous. */ + SVN_ERR(svn_client_conflict_option_get_moved_to_abspath_candidates( + &possible_moved_to_abspaths, option, b->pool, b->pool)); + SVN_TEST_INT_ASSERT(possible_moved_to_abspaths->nelts, 1); + SVN_TEST_STRING_ASSERT( + APR_ARRAY_IDX(possible_moved_to_abspaths, 0, const char *), + sbox_wc_path(b, "A/mu-copied")); + + /* Move target for "A/mu-moved" is not ambiguous. */ + SVN_ERR(svn_client_conflict_option_set_moved_to_repos_relpath(option, 1, + ctx, b->pool)); + SVN_ERR(svn_client_conflict_option_get_moved_to_abspath_candidates( + &possible_moved_to_abspaths, option, b->pool, b->pool)); + SVN_TEST_INT_ASSERT(possible_moved_to_abspaths->nelts, 1); + SVN_TEST_STRING_ASSERT( + APR_ARRAY_IDX(possible_moved_to_abspaths, 0, const char *), + sbox_wc_path(b, "A/mu-moved")); + + /* Select move target "A1/mu-copied-from-A". */ + SVN_ERR(svn_client_conflict_option_set_moved_to_repos_relpath(option, 2, + ctx, b->pool)); + + /* + * Possible working copy destinations for moved-away 'A/mu' are: + * (1): 'A/mu-copied-from-A' + * (2): 'A1/mu-copied-from-A' + */ + SVN_ERR(svn_client_conflict_option_get_moved_to_abspath_candidates( + &possible_moved_to_abspaths, option, b->pool, b->pool)); + SVN_TEST_INT_ASSERT(possible_moved_to_abspaths->nelts, 2); + SVN_TEST_STRING_ASSERT( + APR_ARRAY_IDX(possible_moved_to_abspaths, 0, const char *), + sbox_wc_path(b, "A/mu-copied-from-A")); + SVN_TEST_STRING_ASSERT( + APR_ARRAY_IDX(possible_moved_to_abspaths, 1, const char *), + sbox_wc_path(b, "A1/mu-copied-from-A")); + + /* Select move target "A/mu-moved". */ + SVN_ERR(svn_client_conflict_option_set_moved_to_repos_relpath(option, 1, + ctx, b->pool)); + + /* Resolve the tree conflict. */ + SVN_ERR(svn_client_conflict_tree_resolve_by_id( + conflict, + svn_client_conflict_option_local_move_file_text_merge, ctx, + b->pool)); + + /* The node "A/mu" should no longer exist. */ + SVN_TEST_ASSERT_ERROR(svn_client_conflict_get(&conflict, + sbox_wc_path(b, "A/mu"), + ctx, pool, pool), + SVN_ERR_WC_PATH_NOT_FOUND); + + /* Ensure that the merged file has the expected status. */ + opt_rev.kind = svn_opt_revision_working; + sb.result_pool = b->pool; + SVN_ERR(svn_client_status6(NULL, ctx, sbox_wc_path(b, "A/mu-moved"), + &opt_rev, svn_depth_unknown, TRUE, TRUE, + TRUE, TRUE, FALSE, TRUE, NULL, + status_func, &sb, b->pool)); + status = sb.status; + SVN_TEST_ASSERT(status->kind == svn_node_file); + SVN_TEST_ASSERT(status->versioned); + SVN_TEST_ASSERT(!status->conflicted); + SVN_TEST_ASSERT(status->node_status == svn_wc_status_modified); + SVN_TEST_ASSERT(status->text_status == svn_wc_status_modified); + SVN_TEST_ASSERT(status->prop_status == svn_wc_status_none); + SVN_TEST_ASSERT(!status->copied); + SVN_TEST_ASSERT(!status->switched); + SVN_TEST_ASSERT(!status->file_external); + SVN_TEST_ASSERT(status->moved_from_abspath == NULL); + SVN_TEST_ASSERT(status->moved_to_abspath == NULL); + + /* And it should have expected contents. */ + SVN_ERR(svn_stringbuf_from_file2(&buf, sbox_wc_path(b, "A/mu-moved"), + pool)); + SVN_TEST_STRING_ASSERT(buf->data, "Modified content." APR_EOL_STR); + + return SVN_NO_ERROR; +} + /* ========================================================================== */ @@ -5798,6 +5977,8 @@ static struct svn_test_descriptor_t test "do not suggest unrelated move targets (#4766)"), SVN_TEST_OPTS_PASS(test_cherry_pick_post_move_edit_dir, "cherry-pick edit from moved directory"), + SVN_TEST_OPTS_PASS(test_local_missing_abiguous_moves, + "local missing conflict with ambiguous moves"), SVN_TEST_NULL }; Modified: subversion/branches/java10-compat/tools/client-side/bash_completion URL: http://svn.apache.org/viewvc/subversion/branches/java10-compat/tools/client-side/bash_completion?rev=1841179&r1=1841178&r2=1841179&view=diff ============================================================================== --- subversion/branches/java10-compat/tools/client-side/bash_completion (original) +++ subversion/branches/java10-compat/tools/client-side/bash_completion Tue Sep 18 01:50:50 2018 @@ -248,8 +248,8 @@ _svn() 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" - cmds="$cmds shelf-list-by-paths shelf-diff shelf-drop shelf-list shelf-log shelf-save" - cmds="$cmds shelve shelves unshelve" + cmds="$cmds x-shelf-diff x-shelf-drop x-shelf-list x-shelf-list-by-paths" + cmds="$cmds x-shelf-log x-shelf-save x-shelve x-shelves x-unshelve" # help options have a strange command status... local helpOpts='--help -h' @@ -1024,34 +1024,34 @@ _svn() upgrade) cmdOpts="$qOpts $pOpts" ;; - shelf-list-by-paths) + x-shelf-list-by-paths) cmdOpts="$pOpts" ;; - shelf-diff) + x-shelf-diff) cmdOpts="$pOpts --summarize" ;; - shelf-drop) + x-shelf-drop) cmdOpts="$pOpts" ;; - shelf-list|shelves) + x-shelf-list|x-shelves) cmdOpts="$qOpts $pOpts" ;; - shelf-log) + x-shelf-log) cmdOpts="$qOpts $pOpts" ;; - shelf-save) + x-shelf-save) cmdOpts="--dry-run \ --depth --targets $cOpts \ $mOpts \ $qOpts $pOpts" ;; - shelve) + x-shelve) cmdOpts="--keep-local --dry-run \ --depth --targets $cOpts \ $mOpts \ $qOpts $pOpts" ;; - unshelve) + x-unshelve) cmdOpts="--drop --dry-run \ $qOpts $pOpts" ;; Modified: subversion/branches/java10-compat/tools/dist/release.py URL: http://svn.apache.org/viewvc/subversion/branches/java10-compat/tools/dist/release.py?rev=1841179&r1=1841178&r2=1841179&view=diff ============================================================================== --- subversion/branches/java10-compat/tools/dist/release.py (original) +++ subversion/branches/java10-compat/tools/dist/release.py Tue Sep 18 01:50:50 2018 @@ -75,6 +75,14 @@ tool_versions = { 'swig' : ['3.0.12', '7cf9f447ae7ed1c51722efc45e7f14418d15d7a1e143ac9f09a668999f4fc94d'], }, + '1.11' : { + 'autoconf' : ['2.69', + '954bd69b391edc12d6a4a51a2dd1476543da5c6bbf05a95b59dc0dd6fd4c2969'], + 'libtool' : ['2.4.6', + 'e3bd4d5d3d025a36c21dd6af7ea818a2afcd4dfc1ea5a17b39d7854bcd0c06e3'], + 'swig' : ['3.0.12', + '7cf9f447ae7ed1c51722efc45e7f14418d15d7a1e143ac9f09a668999f4fc94d'], + }, '1.10' : { 'autoconf' : ['2.69', '954bd69b391edc12d6a4a51a2dd1476543da5c6bbf05a95b59dc0dd6fd4c2969'], @@ -103,7 +111,9 @@ tool_versions = { # The version that is our current recommended release # ### TODO: derive this from svn_version.h; see ../../build/getversion.py -recommended_release = '1.10' +recommended_release = '1.11' +# For clean-dist, a whitelist of artifacts to keep, by version. +supported_release_lines = frozenset({"1.9", "1.10", "1.11", "1.12"}) # Some constants repos = 'https://svn.apache.org/repos/asf/subversion' @@ -906,15 +916,15 @@ def clean_dist(args): filenames = stdout.split('\n') filenames = filter(lambda x: x.startswith('subversion-'), filenames) versions = set(map(Version, filenames)) - minor_lines = set(map(minor, versions)) to_keep = set() - # Keep 3 minor lines: 1.10.0-alpha3, 1.9.7, 1.8.19. # TODO: When we release 1.A.0 GA we'll have to manually remove 1.(A-2).* artifacts. - for recent_line in sorted(minor_lines, reverse=True)[:3]: - to_keep.add(max( + for line_to_keep in [minor(Version(x + ".0")) for x in supported_release_lines]: + candidates = list( x for x in versions - if minor(x) == recent_line - )) + if minor(x) == line_to_keep + ) + if candidates: + to_keep.add(max(candidates)) for i in sorted(to_keep): logging.info("Saving release '%s'", i)
