Checkout Tools
  • last updated 2 hours ago
Constraints: committers
Constraints: files
Constraints: dates
Add resolver support for incoming move vs local move of files during merges.

Add two new resolution options for move vs move conflicts with files

after a merge operation:

(m) - apply changes to 'file-target' and revert addition of 'file-source'

(M) - move 'file-target' to 'file-source' and merge

where 'file-branch' is the path the file has on the merge target branch,

and 'file-source' is the path the file has on the merge source branch.

The 'm' option applies textual changes only and leaves the tree structure

of the merge target as it is. The 'M' option changes the file's location in

the merge target to match that of the merge source before merging changes.

I have not written related tests yet, but some manual testing was done.

Proper tests will follow as soon.

* subversion/include/svn_client.h


svn_client_conflict_option_both_moved_file_move_merge): Declare new options.

* subversion/libsvn_client/conflicts.c

(follow_move_chains): Check for local candidates along all moves in the

chain, not just for the final move in the chain.

(resolve_incoming_move_file_text_merge): Implement support for the

svn_client_conflict_option_both_moved_file_move_merge option. This case

is similar enough to make sharing code written for other cases possible.

(resolve_both_moved_file_text_merge): New resolution handler for the

svn_client_conflict_option_both_moved_file_merge option.

(configure_option_incoming_delete_ignore): Don't match move-vs-move cases.

This causes the 'ignore deletion' option to show up in actual delete vs.

delete conflict cases as a side-effect.

(configure_option_incoming_delete_accept): Don't match move-vs-move cases.

(describe_incoming_move_merge_conflict_option): Change 'details' parameter

to a move target path, so this function can also be used for the new

svn_client_conflict_option_both_moved_file_move_merge option.


configure_option_incoming_dir_merge): Update callers.

(configure_option_both_moved_file_merge): Configure new options.




svn_client_conflict_option_set_moved_to_abspath2): Accept new options and

update calls to describe_incoming_move_merge_conflict_option().

(svn_client_conflict_tree_get_resolution_options): Enable new options.

* subversion/libsvn_wc/conflicts.c

(svn_wc__guess_incoming_move_target_nodes): Handle the case where the

conflict victim is a 'local missing' victim. Needed for new options.

* subversion/svn/conflict-callbacks.c

(builtin_resolver_options): Set menu key bindings for new options.

  1. … 3 more files in changeset.
Rename svn_wc__find_repos_node_in_wc() to svn_wc__db_find_repos_node_in_wc().

This namespace is more appropriate for wc_db code, and we might eventually

want to expose a similar libsvn_wc inteface which libsvn_client can use.

No functional change.

* subversion/libsvn_wc/conflicts.c

(svn_wc__guess_incoming_move_target_nodes): Update caller.

* subversion/libsvn_wc/wc_db.c,


(svn_wc__find_repos_node_in_wc): Rename to ...

(svn_wc__db_find_repos_node_in_wc): ... this.

  1. … 2 more files in changeset.
Record the move target path in a moved-away tree conflict skel.

Updates can modify the NODES table in ways which discard local move

information 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 -r2

When '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 status

A + 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 local

move 'epsilon' -> 'beta' which existed before the update. To resolve this

conflict we must be able to identify the copy 'beta' as one potential move

target. The fact that copyfrom on 'beta' points to 'epsilon' is insufficient

because, in the general case, this copy could have occurred independently

of the tree conflict.

As of this commit, the tree conflict skel also records a move destination

path, 'beta' in our example:

(tree () moved-away deleted epsilon beta)

Apart from recording the path in the skel, this commit introduces no other

visible change in behaviour. In the future, the conflict resolver will be

able to make use of this new information to correlate the copy 'beta' with

the conflict victim 'epsilon' in the above example.

Note that old clients will simply ignore the new extra element at the end

of 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_local_add): Update callers.

* subversion/libsvn_wc/conflicts.h


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.

  1. … 9 more files in changeset.
In the conflict resolver, fix the locating of move targets in the

working copy during merges. The previous implementation only worked

for update/switch, because it assumed that a move target's revision

would always match the incoming-new revision of the conflict victim.

This was a design mistake, since this condition won't hold for merges.

Found by: brane

* subversion/include/private/svn_wc_private.h

(svn_wc__guess_incoming_move_target_nodes): Remove 'rev' parameter.

* subversion/libsvn_client/conflicts.c

(follow_move_chains): Move target candidates from libsvn_wc are now

identified only by URL. So check ancestry between the conflict victim

and each move target candiate in case their revisions do not match.

Add 'victim_repos_relpath' parameter.

(init_wc_move_targets, configure_option_local_move_file_merg): Pass the

victim's repos relpath to follow_move_chains().

* subversion/libsvn_wc/conflicts.c

(svn_wc__guess_incoming_move_target_nodes): Remove 'rev' parameter.

* subversion/libsvn_wc/wc-queries.sql

(STMT_FIND_REPOS_PATH_IN_WC): Ignore the revision column.

* subversion/libsvn_wc/wc_db.c

(svn_wc__find_repos_node_in_wc): Remove 'rev' parameter.

* subversion/libsvn_wc/wc_db.h

(svn_wc__find_repos_node_in_wc): Remove 'rev' parameter.

  1. … 5 more files in changeset.
Add an implementation of a new resolver option which resolves "incoming add

vs local add upon update" by merging the local and incoming directory trees.

It mirrors the same resolution option we already support for 'svn merge'.

The implementation for update is entirely different, though. It is merging

the new BASE tree with a locally added tree, both stored in wc.db, whereas

the same resolution option for merge is driven by a repository diff.

This is still work in progress. It mostly works, but there are no tests yet

to confirm that it is working well. But it is functionally complete and good

enough to be committed now.

* subversion/include/private/svn_wc_private.h

(svn_wc__conflict_tree_update_local_add): Declare.

* subversion/libsvn_client/conflicts.c

(resolve_update_incoming_added_dir_merge): New resolver function.

(configure_option_incoming_added_dir_merge): Configure new resolver function.

* subversion/libsvn_wc/conflicts.c

(svn_wc__conflict_tree_update_local_add): New private libsvn_wc API function

which backs the new resolution option.

* subversion/libsvn_wc/wc_db.h

(svn_wc__db_update_local_add): Declare.

* subversion/libsvn_wc/wc_db_update_move.c

(): Update notes on top of this file to document our procedure for updating

locally added directories.

(create_tree_conflict): Handle 'old_version' being NULL, as it is when

a conflict is due to a local addition.

(update_local_add_baton_t, added_node_baton_t): New types for a small

editor-style collection of functions which do the actual ground work.

(update_local_add_mark_node_edited, update_local_add_mark_parent_edited,

mark_update_add_add_tree_conflict, update_incoming_add_merge_props,

update_local_add_notify_obstructed_or_missing): New helper functions.

(tc_editor_update_add_new_file, tc_editor_update_add_new_directory,

tc_editor_update_add_merge_files, tc_editor_update_add_merge_dirprops):

New editor-style callbacks which modify working copy state.

(update_locally_added_node): Drives the former editor functions according

to differences between the post-update BASE layer and the directory tree

which was locally added at the same path before the update was executed.

(update_local_add): The body of svn_wc__db_update_local_add().

This runs within a wc.db transaction.

(svn_wc__db_update_local_add): New wc_db API function for updating locally

added directory trees.

  1. … 4 more files in changeset.
Revert r1771924.

Leaving nested conflicts within the tree conflict victim of an incoming

move after update does not seem to be the best approach. It is unclear how

we can make sure the victim, which is now left behind as a non-conflicted copy,

will eventually be removed to complete the incoming move.

I will try another idea next, which is to move any conflicted children into

the incoming move destination and let their conflicts be resolved there.

  1. … 5 more files in changeset.
[ Note from the future: Reverted in r1772051 ].

Make sure to preserve local changes for nodes which become victims of a

nested incoming move during an update.

With a nested move of a file, previous code flagged a tree conflict at a path

where this file was expected to sit relative to its moved parent.

This was wrong, since the file was not moved along with the parent, but was

also moved. So the real location of the missing file is unknown at that point.

Worse, conflict test 25 has shown that local changes to this file ended up

being deleted after resolving the parent's tree conflict.

Instead, we must keep the parent's copy around if any new conflicts appear

within its children. This preserves local modifications and allows the

resolver to resolve these conflicted children later on.

This change has some loose ends. The nested conflict cannot be resolved yet,

and I'm not sure how we can eventually decide to delete the original conflict

victim (the parent) in order to complete the incoming move operation after

resolving all the nested conflicts. Perhaps we need a new flag in conflict

storage for this?

* subversion/libsvn_client/conflicts.c

(resolve_incoming_move_dir_merge): If new conflicts remain after resolving

the update of an incoming move, do not blow the conflict victim away.

Delete its tree conflict marker instead but otherwise leave it unchanged.

This allows nested conflicts to be dealt with later on.

* subversion/include/private/svn_wc_private.h,


(svn_wc__conflict_tree_update_incoming_move): New output parameter

'new_conflicts_remain'. Pass it on.

* subversion/libsvn_wc/wc_db.h,


(svn_wc__db_update_incoming_move); New output parameter


(update_move_baton_t): New field 'raised_new_conflicts'.

(mark_tc_on_op_root, tc_editor_add_directory,

tc_editor_incoming_add_directory, tc_editor_add_file,

tc_editor_incoming_add_file, tc_editor_alter_directory,

tc_editor_alter_file, tc_editor_update_incoming_moved_file,

tc_editor_delete, tc_incoming_editor_delete): Set the 'raised_new_conflicts'

flag in the update_move_baton if a new conflict is raised.

(tc_editor_update_incoming_moved_file): Likewise, and also change the

way conflicts are recorded: If the move destination is missing, then

flag a conflict at the move source, not at the move destination (which

is not really known at this point).

(update_incoming_move): New output parameter 'new_conflicts_remain'.

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

(test_update_incoming_dir_move_with_nested_file_move): Adjust test

expectations accordingly.

  1. … 5 more files in changeset.
Rename the conflict resolver's "merge_local_changes" family of functions

to "update_incoming_move". Originally these were intended to be used during

merges as well, but that won't be necessary.

* subversion/include/private/svn_wc_private.h, subversion/libsvn_wc/conflicts.c

(svn_wc__conflict_tree_merge_local_changes): Rename to ...

(svn_wc__conflict_tree_update_incoming_move): ... this. Adjust docstring.

Track rename of svn_wc__db API function.

* subversion/libsvn_client/conflicts.c

(resolve_incoming_move_dir_merge): Track rename.

* subversion/libsvn_wc/wc_db.h, subversion/libsvn_wc/wc_db_update_move.c

(merge_local_changes): Rename to ...

(update_incoming_move): ... this.

(svn_wc__db_merge_local_changes): Rename to ...

(svn_wc__db_update_incoming_move): ... this. Track above rename.

  1. … 4 more files in changeset.
In the conflict resolver, do not ignore the merged property value set

by svn_client_conflict_option_set_merged_propval() when resolving a

property conflict with svn_client_conflict_option_merged_text.

While the actual usage in the interactive prompt requires a separate fix

(and I plan to fix it), this lays the necessary groundwork by propagating

the merged property value to the working copy, in case it was set using

the API.

* subversion/libsvn_wc/conflicts.c

(svn_wc__conflict_prop_mark_resolved): Accept the new 'merged_value'


* subversion/include/private/svn_wc_private.h

(svn_wc__conflict_prop_mark_resolved): Adjust declaration.

* subversion/libsvn_client/conflicts.c

(resolve_prop_conflict): Pass the merged value stored in the option

instance when svn_client_conflict_option_merged_text is used.

* subversion/svn/conflict-callbacks.c

(handle_prop_conflicts): Note that a separate fix is required.

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

(assert_conflict_options): New helper, factored out from ...

(assert_tree_conflict_options): ...this function.

(assert_prop_conflict_options): New function.

(test_merge_file_prop): New test.

(test_funcs): Reference new test.

Patch by: ivan


  1. … 4 more files in changeset.
Fix issue #4647 by resolving the error case for binary file conflicts

selecting to use the full local version, by allowing using the local file, if

no merged file is present.

* subversion/libsvn_wc/conflicts.c

(build_text_conflict_resolve_items): in case mine_abspath is null, take

local_abspath instead in case of


Suggested by: stsp

Approved by: rhuijben

In the conflict resolver, start adding support for merging local edits in

the working copy into an incoming moved directory.

This code is still very rough. It lacks docstrings. Many things won't work yet.

But it already makes 'svn update' apply local file edits to an incoming move,

and makes an existing regression test XPASS, so I'm happy enough to put the

current state of things in to keep working on it incrementally.

* subversion/include/private/svn_wc_private.h

(svn_wc__conflict_tree_merge_local_changes): Declare.

* subversion/libsvn_client/conflicts.c

(resolve_incoming_move_dir_merge): Merge local changes with support from

new functionality added to libsvn_wc in this commit.

* subversion/libsvn_wc/conflicts.c

(svn_wc__conflict_tree_merge_local_changes): New. This function merges

local changes (i.e. the delta between BASE and WORKING) from one

directory in the working copy to another.

* subversion/libsvn_wc/wc_db.h

(svn_wc__db_merge_local_changes): Declare.

* subversion/libsvn_wc/wc_db_update_move.c

(tc_editor_merge_local_file_change): New TC editor receiver function.

(get_working_info): New helper function. Similar to get_infp() but returns

information about the WORKING tree.

(walk_local_changes): Recursive walker which drives the TC editor per node.

(merge_local_changes, svn_wc__db_merge_local_changes): New TC editor driver.

Has not been tested yet beyond merging of simple file edits.

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

(test_funcs): Remove XFAIL marker from test_merge_incoming_move_dir2.

  1. … 5 more files in changeset.
Add APIs to the conflict resolver which allow clients to resolve ambiguous

move target paths.

* subversion/include/private/svn_wc_private.h

(svn_wc__guess_incoming_move_target_node): Rename to ...

(svn_wc__guess_incoming_move_target_nodes): ... this, and return the full

list of canidates, instead of just returning the "best" candidate.

* subversion/include/svn_client.h


svn_client_conflict_option_set_moved_to_abspath): Declare.

* subversion/libsvn_client/conflicts.c

(svn_client_conflict_option_t): Add type-specific data for tree conflicts

involving incoming moves.

(conflict_tree_incoming_delete_details): Remove moved_to_abspath. It has

been superseded by type-specific option data.

(resolve_incoming_move_file_text_merge): Tweak sanity check for availability

of conflict details. Get the move target path from option data instead of

details data.

(configure_option_incoming_move_file_merge): Store move target canidates

returned by libsvn_wc as type-specific option data.

(svn_client_conflict_option_get_moved_to_abspath_candidates): New. Return

a copy of the list of move target candidates stored in option data.

(svn_client_conflict_option_set_moved_to_abspath): New. Allows the client

to pick a move target from the list of candidates.

* subversion/libsvn_wc/conflicts.c

(svn_wc__guess_incoming_move_target_node): Renamed to ...

(svn_wc__guess_incoming_move_target_nodes): .. this. Return an array of

candidates. Ensure that our preferred candidate appears first in the list.

  1. … 3 more files in changeset.
Fix a crash in 'svn resolve' (also affects 1.9.x).

* subversion/libsvn_wc/conflicts.c

(build_text_conflict_resolve_items): Before creating a merged version of a

file for 'theirs-conflict' or 'mine-conflict' resolution, verify that all

the necessary input files are actually available.

Found by: Gustavo Chaves <>

When guessing a move target in the working copy, take node kind into account.

* subversion/include/private/svn_wc_private.h

(svn_wc__guess_incoming_move_target_node): Add 'victim_node_kind' parameter.

* subversion/libsvn_client/conflicts.c

(configure_option_incoming_move_file_merge): Rename 'local_abspath' to

'victim_abspath' for clarity. Pass victim node kind to libsvn_wc.

* subversion/libsvn_wc/conflicts.c

(svn_wc__guess_incoming_move_target_node): Use 'victim_node_kind' parameter

to filter out candidates with mismatching node kind.

  1. … 2 more files in changeset.
* subversion/libsvn_wc/conflicts.c

(svn_wc__guess_incoming_move_target_node): Return something even if all

common ancestors are the empty string (longest_ancestor_len is initially 0).

* subversion/libsvn_wc/conflicts.c

(svn_wc__guess_incoming_move_target_node): Prefer candidates with a shorter

path-wise distance to the conflict victim. This helps in cases where both

the merge source and target branches are part of the same working copy.

Without taking path-wise distance into account, we could easily end up

modifying a file which is on the merge source branch, while we're looking

for a file which is part of the target branch.

Add a conflict resolver option which follows an incoming file move.

This new option works for update, switch, and merge operations.

There is no unit test for this option yet.

I have not tested reverse-updates or reverse-merges yet.

We need many many additional tests anyway.

* subversion/include/private/svn_wc_private.h

(svn_wc__guess_incoming_move_target_node): Declare.

* subversion/include/svn_client.h

(svn_client_conflict_option_incoming_move_file_text_merge): New option ID.

* subversion/libsvn_client/conflicts.c

(conflict_tree_incoming_delete_details): Add 'moved_to_abspath'.

(resolve_merge_incoming_added_file_text_merge): Fix typo in comment.

(resolve_incoming_move_file_text_merge): New resolver function.

(configure_option_incoming_move_file_merge): New option config function.

(svn_client_conflict_tree_get_resolution_options): Configure new option.

* subversion/libsvn_wc/conflicts.c

(svn_wc__guess_incoming_move_target_node): Implement. This function

attempts to map a deleted tree conflict victim to a working copy node

which corresponds to the incoming move target.

* subversion/libsvn_wc/wc-queries.sql

(STMT_FIND_REPOS_PATH_IN_WC): New query. Returns all local relpaths at

the 'working' layer (i.e. from nodes_current) which map to a particular

repository path at a particular revision.

* subversion/libsvn_wc/wc_db.c

(svn_wc__find_repos_node_in_wc): New. Runs the above query.

* subversion/libsvn_wc/wc_db.h

(svn_wc__find_repos_node_in_wc): Declare.

* subversion/svn/conflict-callbacks.c

(builtin_resolver_options): Wire up the new option in the conflict menu.

  1. … 7 more files in changeset.
Don't ever send resolution notifications for properties without including

a property name. This looks ugly and wasn't intended.

* subversion/libsvn_wc/conflicts.c

(conflict_status_walker, svn_wc__conflict_prop_mark_resolved): Send a

propery name along with svn_wc_notify_resolved_prop. If that's not

possible send a general 'resolved' notification.

* subversion/svn/notify.c

(notify_body): Assert property name for svn_wc_notify_resolved_prop.

  1. … 1 more file in changeset.
Use the new svn_wc_notify_action_t values for conflicts in more places.

* subversion/libsvn_wc/conflicts.c


svn_wc__conflict_prop_mark_resolved): Use new notifcations for text and

property conflicts, respectively.

* subversion/tests/cmdline/

(update_output_with_conflicts): Adjust expected output.

  1. … 1 more file in changeset.
Start using new svn_wc_notify_action_t values for conflicts.

Fixes regression test fallout caused by ealier related commits.

* subversion/libsvn_wc/conflicts.c

(conflict_status_walker): Use type-specific conflict resolution

notifications. Use the generic 'resolved' notification only if

the caller doesn't care which kind of conflict we're resolving.



svn_wc__conflict_tree_update_moved_away_node): Use specific notification

action values for tree conflicts.

* subversion/tests/cmdline/

(build_simple_file_move_tests, move_conflict_details): Adjust expected output.

* subversion/tests/cmdline/

(actual_only_node_behaviour): Adjust expected output.

  1. … 2 more files in changeset.
* subversion/libsvn_wc/conflicts.c

(svn_wc__conflict_tree_update_raise_moved_away): Remove unused variable.

Really perform updates of moved-away nodes with the new conflict resolver.

* subversion/libsvn_client/resolved.c

(resolve_tree_conflict): Check for the right option_id. The resolver already

uses svn_client_conflict_option_update_move_destination internally, instead

of svn_client_conflict_option_working_text_where_conflicted.

With this change, updates of moved-away nodes take the new code path.

* subversion/libsvn_wc/conflicts.c

(svn_wc__conflict_tree_update_moved_away_node): We must mark the conflict

resolved manually because svn_wc__db_update_moved_away_conflict_victim()

does not mark the conflict resolved for us.

  1. … 1 more file in changeset.
Fix test fallout caused by recent conflict resolver changes.

* subversion/include/private/svn_wc_private.h

(svn_wc__conflict_tree_update_break_moved_away): Add 'moved-away' to the

list of valid local changes for this function.

* subversion/libsvn_wc/conflicts.c

(svn_wc__conflict_tree_update_break_moved_away): Allow 'moved-away'.

  1. … 1 more file in changeset.
Provide another private libsvn_wc API function for resolving a tree conflict.

This function resolves a 'local moved-away vs. incoming edit' conflict

upon update/switch. Use this new API from libsvn_client's new conflict

resolver instead of calling the generic svn_wc__resolve_conflicts()

function for this conflict.

* subversion/include/private/svn_wc_private.h

(svn_wc__conflict_tree_update_moved_away_node): Declare and document.

* subversion/libsvn_client/resolved.c

(resolve_tree_conflict): Call svn_wc__conflict_tree_update_moved_away_node()

if appropriate for the tree conflict and its resolution option.

Break single if-statement into several if-else-if for readability.

* subversion/libsvn_wc/conflicts.c

(svn_wc__conflict_tree_update_moved_away_node): Implement, based on existing

code from resolve_tree_conflict_on_node().

  1. … 2 more files in changeset.
* subversion/libsvn_wc/conflicts.c


svn_wc__conflict_tree_update_raise_moved_away): Fix indentation.

* subversion/libsvn_wc/conflicts.c

(svn_wc__conflict_tree_update_raise_moved_away): Ensure that conflict action

has the expected value.

Introduce svn_wc__conflict_tree_update_raise_moved_away(), a private

libsvn_wc API function for use by libsvn_client's conflict resolver.

This API may raise an error if other tree conflicts need to be resolved before

the tree conflict specified by the caller. Make the new conflict resolver

handle this case. (This behaviour is now exposed to the public API rather than

hidden in libsvn_wc as was the case with the legacy conflict resolver.)

* subversion/include/private/svn_wc_private.h

(svn_wc__conflict_tree_update_raise_moved_away): Declare.

* subversion/include/svn_client.h

(svn_client_conflict_tree_resolve): Document new error behavior in case a

conflict cannot be resolved yet.

* subversion/libsvn_client/resolved.c

(conflict_option_resolve_func_t): Document new error behavior in case a

conflict cannot be resolved yet.

(resolve_tree_conflict): Use svn_wc__conflict_tree_update_raise_moved_away()

if applicable.

* subversion/libsvn_wc/conflicts.c

(svn_wc__conflict_tree_update_raise_moved_away): Implement.

* subversion/svn/resolve-cmd.c

(handle_tree_conflict_resolution_failure): New helper function. Copied from

legacy libsvn_wc conflict resolver code.

(conflict_status_walker): Handle tree conflicts which cannot be resolved

right away by retrying them later after resolving other conflicts first.

  1. … 4 more files in changeset.
* subversion/libsvn_wc/conflicts.c

(resolve_tree_conflict_on_node): Fix comment for clarity.

* subversion/libsvn_wc/conflicts.c

(resolve_tree_conflict_on_node): Update comment which referred to a function

that doesn't exist.

Provide a new private libsvn_wc API function for resolving a tree conflict.

This function resolves a 'local delete/replace vs. incoming <any>' conflict

upon update/switch to the current (i.e. post-update) working copy state.

Use this new API from libsvn_client's new conflict resolver instead of

calling the generic svn_wc__resolve_conflicts() function for this conflict.

This is the first special-case tree conflict resolver function in libsvn_wc.

Hopefully, many more will follow.

* subversion/include/private/svn_wc_private.h

(svn_wc__conflict_tree_update_break_moved_away): Declare and document.

* subversion/libsvn_client/resolved.c

(resolve_tree_conflict): Call svn_wc__conflict_tree_update_break_moved_away()

if appropriate for the tree conflict and its resolution option.

* subversion/libsvn_wc/conflicts.c

(svn_wc__conflict_tree_update_break_moved_away): Implement, based on existing

code from resolve_tree_conflict_on_node().

  1. … 2 more files in changeset.