subversion

Checkout Tools
  • last updated 2 hours ago
Constraints
Constraints: committers
 
Constraints: files
Constraints: dates

Changeset 1853580 is being indexed.

Add resolver support for moved-file vs moved-file upon update.

The resolver now supports move vs move tree conflicts for files after

an update operation.

Two new resolution operations are available:

(m) - override incoming move and merge incoming changes from 'alpha-moved'

to 'alpha-also-moved'

(M) - accept incoming move and merge local changes from 'alpha-also-moved'

to 'alpha-moved'

Where the file was originally called 'alpha', was renamed to 'alpha-moved'

in the repository, and renamed to 'alpha-also-moved' in the working copy.

Because the local move is broken during the update operation when the

delete-half of the move is updated, the resolver only has the copied half

move available in the working copy. To find the local move destination the

resolver queries the working copy database for nodes which are copies of

the conflict victim's repository path. This can of course lead to ambiguous

results in case a node is first copied and then moved, in which case the

resolver offers the user a choice of local move targets in the usual way.

* subversion/include/private/svn_wc_private.h

(svn_wc__find_copies_of_repos_path): Declare.

* subversion/libsvn_client/conflicts.c

(conflict_tree_update_local_moved_away_details): New conflict details struct.

(resolve_both_moved_file_update_keep_local_move,

resolve_both_moved_file_update_keep_incoming_move): New resolution handlers.

(conflict_tree_get_details_update_local_moved_away): New details fetcher

which locates copied nodes corresponding to the local move.

(get_both_moved_file_paths): New helper function.

(conflict_tree_get_description_update_both_moved_file_merge,

conflict_tree_get_description_update_both_moved_file_move_merge): New

functions which describe incoming move vs local move conflicts flagged

during updates of files.

(configure_option_both_moved_file_merge): Hook up the new options.

(svn_client_conflict_option_get_moved_to_abspath_candidates2,

svn_client_conflict_option_set_moved_to_abspath2,

conflict_type_specific_setup): Support the newly added conflict options.

* subversion/libsvn_wc/node.c

(svn_wc__find_copies_of_repos_path): New.

* subversion/libsvn_wc/wc-queries.sql

(STMT_SELECT_COPIES_OF_REPOS_RELPATH): New query which locates copies of a

particular repository relpath with a particular node kind in working copy.

* subversion/libsvn_wc/wc_db.c

(svn_wc__db_find_copies_of_repos_path): New wc_db API to execute above query.

* subversion/libsvn_wc/wc_db.h

(svn_wc__db_find_copies_of_repos_path): Declare.

* subversion/tests/libsvn_client/conflicts-test.c

(create_file_move_vs_file_move_update_conflict): New helper function.

(test_update_file_move_vs_file_move,

test_update_file_move_vs_file_move_accept_move, test_funcs): New tests

which exercise both of the newly added conflict resolution options.

* STATUS: Nominate r1853483.
* STATUS: Nominate r1853483.
* STATUS: Nominate r1853450.

* STATUS: Nominate r1853450.

Fix #4760 "Missing children when svnadmin dump --include/exclude converts

copy-dir to add-dir".

Follow-up to r1811992: Canonicalize PATH before passing it to the FILTER_FUNC.

In some cases (e.g. for nodes under copied directories) PATH passed by

repos layer to AUTHZ_FUNC may be non-canonical (missing leading '/'). This

causes FILTER_FUNC implemented in svnadmin to wrongly report PATH as "not

included".

* subversion/libsvn_repos/dump.c

(dump_filter_authz_func): Canonicalize PATH before passing it

to the FILTER_FUNC. Add comment.

* subversion/tests/cmdline/svnadmin_tests.py

(dump_include_copied_directory): New.

(test_list): Add new test to table.

Patch by: sergey.raevskiy{_AT_}visualsvn.com

Only enable the 'incoming_move_file_merge' resolution option if the

local change is a file edit.

This resolution option was introduced in r1747727 and accidentally enabled

for any local change vs an incoming deletion. So while this resolution

handler only supports local edits, it was enabled even for other conflicts,

such as those involving locally moved-away files.

In that case Subversion was pretending to resolve the conflict when in fact

it did not resolve it. The resolution handler in libsvn_client internally

failed with a "path not found" error which was masked by 'svn resolve' (since

this error is sometimes legitimate) and the conflict marker was still in

place after Subversion proudly proclaimed:

"Applying recommended resolution 'Move and merge'"

Subversion now tells the truth instead:

"Subversion is not smart enough to resolve this tree conflict automatically!"

* subversion/libsvn_client/conflicts.c

(configure_option_incoming_move_file_merge): Only configure this option if

the local change is an 'edit'.

On the 'shelving-v3' branch: don't include unversioned files in count of changed paths.

* subversion/libsvn_client/shelf.c

(shelf_status_walk): Tweak a comment.

(shelf_copy_base): Be sure to remove all unversioned files.

On the 'shelving-v3' branch: remove debugging that broke tests.

* subversion/tests/cmdline/shelf_tests.py

(shelve_unshelve_verify): Remove a debugging 'raise' statement.

Re-implement shelving to use a separate WC for the storage of each shelf.

* subversion/include/svn_client.h

(svn_client__shelf_mods_editor): New.

(svn_client__shelf_replay): Add a notification callback.

* subversion/libsvn_client/shelf.c

(shelf_version_files_dir_abspath): Tweak the directory name to end in

".wc", for clarity.

(get_metadata_abspath,

get_base_file_abspath,

get_working_file_abspath,

get_base_props_abspath,

get_working_props_abspath): Delete.

(status_create,

kind_to_char,

char_to_kind,

status_to_char,

char_to_status,

wc_status_serialize,

wc_status_unserialize,

status_write): Delete.

(status_augment): New.

(status_read): Read WC status directly from shelf-storage WC.

(shelf_status_visitor_t,

shelf_status_baton_t,

shelf_status_visitor,

shelf_status_visit_path,

shelf_status_walk): Adjust to use a WC status walk directly.

(write_changes_baton_t,

notify_shelved,

notify_not_shelved,

read_props_from_wc,

write_props_to_shelf,

read_props_from_shelf,

store_file,

write_changes_visitor,

changelist_filter_baton_t,

changelist_filter_func,

wc_walk_status_multi,

shelf_write_changes): Delete.

(get_shelves_dir): New.

(shelf_construct): Use a different storage dir.

(paths_changed_walk_baton_t,

paths_changed_visitor,

shelf_paths_changed,

svn_client__shelf_paths_changed): Remove unneeded 'as abspath' option.

(send_notification,

apply_prop_mods,

apply_file_mods,

path_driver_cb_baton_t,

path_driver_cb_func,

shelf_replay_path_baton_t,

shelf_replay_path_visitor): Delete.

(svn_client__shelf_replay): Use the WC replay API instead of a shelf-

specific implementation.

(test_apply_file_visitor): Tweak constness.

(file_changed,

file_deleted,

file_added,

diff_baton_t,

diff_visitor): Delete.

(wc_mods_editor): Add explicit notification callback and result pool.

(svn_client__shelf_mods_editor): Expose in the semi-public API.

(svn_client__shelf_apply): Adjust calls.

(unapply_walk_baton_t,

unapply_visitor): New.

(svn_client__shelf_unapply): Rewrite, using a shelf status walk that

reverts each visited path.

(svn_client__shelf_diff): Rewrite, using a WC diff instead of a

shelf-specific implementation.

(shelf_copy_base): New.

(shelf_save_notifer_baton_t,

shelf_save_notifier): New.

(svn_client__shelf_save_new_version3): Rewrite, using a WC replay piped

into a shelf mods editor.

(svn_client__shelf_list): Adjust the shelf storage dir.

* subversion/tests/cmdline/shelf_tests.py

(shelve_mkdir,

shelve_replace_dir): Don't expect "cannot shelve". Do expect failure, for

now.

(shelve_rmdir,

shelve_file_copy,

shelve_dir_copy): Don't expect "cannot shelve".

(refuse_to_shelve_conflict): Change the test case to avoid a known,

unrelated bug.

* subversion/tests/cmdline/svntest/sandbox.py

(Sandbox.build): Expect each sandbox to use an additional WC directory

"<wc-dir-basename>.shelves".

* notes/shelving/shelf-structure.txt

Update to this version.

Make a branch for shelving v3.
* notes/shelving/shelf-structure.txt: Update for shelving v2 in svn 1.11.
Let the WC mods editor and WC replay editor APIs take explicit notification

callbacks.

* subversion/include/private/svn_client_private.h

(svn_client__wc_replay,

svn_client__wc_copy_mods): Take a notification callback.

* subversion/libsvn_client/commit.c

(svn_client__wc_replay): Take a notification callback.

* subversion/libsvn_client/wc_editor.c

(svn_client__wc_copy_mods): Take a notification callback.

* subversion/svn/shelf-cmd.c

(svn_cl__wc_copy_mods): Adjust caller.

* subversion/tests/cmdline/commit_tests.py

(commit_sees_tree_conflict_on_unversioned_path): New test, XFail.

(test_list): Run it.

On branch swig-py3: A follow up r1851888: Save/restore Python error indicator

For all callback APIs which don't return svn_error_t * cannot notify

Python exception their caller, and as exceptions chain in Python 3,

exception conext should be detached from caller.

* subversion/bindings/swig/python/libsvn_swig_py/swigutil_py.c

(svn_swig_py_notify_func, svn_swig_py_notify_func2,

svn_swig_py_status_func, svn_swig_py_client_status_func,

svn_swig_py_status_func2, ra_callbacks_progress_func,

svn_swig_py_config_enumerator2, svn_swig_py_config_section_enumerator2):

Save error indicator before Python function call and then restore it

after call

* subversion/libsvn_client/wc_editor.c

(svn_client__wc_copy_mods): Remove the WC locking, now that the

WC editor does it, following r1852559.

Comment out a failing swig-rb test.

Issue 4805, "delta path editor binding broken for root path".

* subversion/bindings/swig/ruby/test/test_delta.rb

(test_path_driver): Comment out (as no XFail mechanism is available).

Improve backward compatibility for svn_delta_path_driver2().

This ensures the input array is not modified, and changes the behaviour to

be less surprising.

* subversion/include/svn_delta.h,

subversion/libsvn_delta/deprecated.c

(svn_delta_path_driver2): Add back slash prefixes if any, rather than the

first, of the inputs had one. Duplicate the array if modifying it.

Teach the WC editor to acquire and release a WC write lock.

* subversion/include/private/svn_client_private.h

(svn_client__wc_editor): Document that it manages the write lock.

(svn_client__wc_editor_internal): Add an option flag to manage the write lock.

* subversion/libsvn_client/copy.c

(copy_foreign_dir,

svn_client__repos_to_wc_copy_by_editor): Ask the WC editor not to manage

the write lock for us here, as the caller does it.

* subversion/libsvn_client/shelf.c

(svn_client__shelf_apply): Don't aquire and release the write lock here:

let the WC editor do it.

* subversion/libsvn_client/wc_editor.c

(edit_baton_t): Add fields to manage the write lock.

(release_write_lock,

pool_cleanup_handler): New.

(edit_open): If requested, acquire the write lock and arrange for it to be

released on pool clean-up.

(edit_close): If acquired, release the write lock.

(svn_client__wc_editor_internal): Add the option flag to manage the write

lock. Initialize the 'abort_edit' method so that it will release the

write lock, the same as 'close_edit'.

(svn_client__wc_editor): Ask for the write lock to be managed.

In the updated delta editor path driver, ensure paths are relpaths.

This also fixes a bug with '/'-prefixed paths in svn_delta_path_driver2(). A

path given as the string "/" was handled as a regular path (first open the

editor root, then call the callback passing it the root parent-dir-baton)

rather than as a root path.

* subversion/include/svn_delta.h

(svn_delta_path_driver_cb_func2_t,

svn_delta_path_driver3,

svn_delta_path_driver_step): Declare that paths are relpaths.

(svn_delta_path_driver2): Document that a slash prefix is allowed.

* subversion/libsvn_delta/deprecated.c

(path_driver_2_to_3_baton_t,

path_driver_2_to_3_func,

svn_delta_path_driver2): Implement backward compatibility for a slash

prefix.

* subversion/libsvn_delta/path_driver.c

(svn_delta_path_driver3): Rename variables to 'relpath', for clarity.

(svn_delta_path_driver_step): Assert the path is a relpath, remove support

for a slash prefix, and rename variables.

Minor cleanup: extract a helper function.

* subversion/libsvn_delta/path_driver.c

(push_dir_stack_item): New.

(open_dir): Use it here.

(svn_delta_path_driver_step): Use it twice here.

Upgrade uses of the editor path driver callback, following r1852526.

* subversion/libsvn_client/add.c

(path_driver_cb_func): Take the editor and edit-baton as direct parameters.

(mkdir_urls): Upgrade to svn_delta_path_driver3.

* subversion/libsvn_client/commit_util.c

(item_commit_baton): Remove the editor and edit-baton from here.

(do_item_commit): Take the editor and edit-baton as direct parameters.

(svn_client__do_commit): Upgrade to svn_delta_path_driver3.

* subversion/libsvn_client/copy.c

(path_driver_cb_baton): Remove the editor and edit-baton from here.

(path_driver_cb_func): Take the editor and edit-baton as direct parameters.

(repos_to_repos_copy): Upgrade to svn_delta_path_driver3.

* subversion/libsvn_delta/branch_compat.c

(apply_change): Take the editor and edit-baton as direct parameters.

(drive_changes): Upgrade to svn_delta_path_driver3.

* subversion/libsvn_delta/compat.c

(apply_change): Take the editor and edit-baton as direct parameters.

(drive_changes): Upgrade to svn_delta_path_driver3.

* subversion/libsvn_repos/replay.c

(path_driver_cb_baton): Remove the editor and edit-baton from here.

(path_driver_cb_func): Take the editor and edit-baton as direct parameters.

(svn_repos_replay2): Upgrade to svn_delta_path_driver3.

Make the editor path driver callback a little easier to use.

Add 'editor' and 'edit_baton' parameters to the path driver callback. All

but trivial callback implementations need these, and they otherwise had to

be passed through the callback baton, which was straightforward but more

trouble than it need be.

* subversion/include/svn_delta.h

(svn_delta_path_driver_cb_func2_t,

svn_delta_path_driver3): New.

* subversion/libsvn_delta/path_driver.c

(svn_delta_path_driver3): Rename from 'svn_delta_path_driver2'.

(svn_delta_path_driver_state_t,

svn_delta_path_driver_start): Change the callback function type.

(svn_delta_path_driver_step): Pass the extra parameters.

* subversion/libsvn_delta/deprecated.c

(path_driver_2_to_3_baton_t,

path_driver_2_to_3_func,

svn_delta_path_driver2): New.

* subversion/libsvn_client/shelf.c

(path_driver_cb_func): Take 'editor' and 'edit_baton' as direct parameters.

(path_driver_cb_baton_t,

svn_client__shelf_replay): Remove them from the path driver baton.

* subversion/include/svn_delta.h (svn_delta_path_driver_cb_func_t): Improve docs.
* STATUS: Nominate r1852436.

* STATUS: Nominate r1852436.

* STATUS: Nominate r1852436.

Make 'svn update' not record a tree conflict when deleting an unmodified

directory which happens to contain unversioned items. Instead, just leave

the unversioned items behind on disk when deleting the unmodified directory,

which matches the behaviour of Subversion 1.8.

Prompted by a question on users@:

https://svn.haxx.se/users/archive-2019-01/0060.shtml

* subversion/libsvn_wc/update_editor.c

(check_tree_conflict): Ignore unversioned items during check for local mods.

This prevents a tree conflict from being recorded.

* subversion/tests/cmdline/switch_tests.py

(tolerate_local_mods): Don't expect an unversioned item to cause a tree

conflict. Add the item to version control instead to meet this test's

expectations.

* subversion/tests/cmdline/update_tests.py

(update_keeps_unversioned_items_in_deleted_dir, test_list): New test

which ensures that update will leave unversioned items on disk when

deleting an unmodified directory.

* CHANGES: Retroactively add date of 1.11.1, 1.10.4, and 1.9.10 releases.

Make the new shelf-replay-to-delta-editor API public (experimental).

* subversion/include/svn_client.h,

subversion/libsvn_client/shelf.c

(svn_client__shelf_apply): Rename from 'shelf_replay' and make public.