- changed 10 files
Record the move target path in a moved-away tree conflict skel.Updates can modify the NODES table in ways which discard local moveinformation about tree conflict victims. One example is: echo foo >> epsilon/foo.txt svn mv epsilon alpha svn ci # create r2 svn up -r1 svn mv epsilon beta svn up -r2When 'epsilon' is updated to r2, a tree conflict is raised and the move'epsilon' -> 'beta' is deleted from the NODES table. 'beta' remains a copy.$ svn statusA + beta! C epsilon > local dir moved away, incoming dir delete or move upon update$ The conflict skel for the tree conflict on 'epsilon' now contains: (tree () moved-away deleted epsilon)This leaves the resolver with insufficient information about the localmove 'epsilon' -> 'beta' which existed before the update. To resolve thisconflict we must be able to identify the copy 'beta' as one potential movetarget. The fact that copyfrom on 'beta' points to 'epsilon' is insufficientbecause, in the general case, this copy could have occurred independentlyof the tree conflict.As of this commit, the tree conflict skel also records a move destinationpath, 'beta' in our example: (tree () moved-away deleted epsilon beta)Apart from recording the path in the skel, this commit introduces no othervisible change in behaviour. In the future, the conflict resolver will beable to make use of this new information to correlate the copy 'beta' withthe conflict victim 'epsilon' in the above example.Note that old clients will simply ignore the new extra element at the endof the conflict skel.* subversion/libsvn_wc/conflicts.c (svn_wc__conflict_skel_add_tree_conflict): Add move_dst_op_root_abspath parameter and append it to the skel if it is non-NULL. (svn_wc__conflict_read_tree_conflict): Return the move_dst_op_root_abspath if present in the conflict skel. (read_tree_conflict_desc, resolve_tree_conflict_on_node, svn_wc__conflict_tree_update_break_moved_away, svn_wc__conflict_tree_update_incoming_move, svn_wc__conflict_tree_update_local_add): Update callers.* subversion/libsvn_wc/conflicts.h (svn_wc__conflict_skel_add_tree_conflict, svn_wc__conflict_read_tree_conflict): Update declaration and docstring.* subversion/libsvn_wc/questions.c (internal_conflicted_p): Update caller.* subversion/libsvn_wc/tree_conflicts.c (svn_wc__add_tree_conflict): Update caller.* subversion/libsvn_wc/update_editor.c (open_root, check_tree_conflict, add_directory, open_directory, add_file, open_file, change_file_prop): Update callers.* subversion/libsvn_wc/upgrade.c (svn_wc__upgrade_conflict_skel_from_raw): Update caller.* subversion/libsvn_wc/wc_db.c (revert_maybe_raise_moved_away): Update caller.* subversion/libsvn_wc/wc_db_update_move.c (create_tree_conflict, fetch_conflict_details): Update callers.* subversion/tests/libsvn_wc/conflict-data-test.c (test_serialize_tree_conflict): Update test expectations.* subversion/tests/libsvn_wc/op-depth-test.c (check_db_conflicts): Update caller.