On Fri, Oct 14, 2016 at 03:35:48PM +0200, Stefan wrote:
> Thanks for taking the time to review the patch, Ivan (and also stsp).
> After talking to stsp, here's a different approach to solve the issue
> without the need for adding a new parameter to the public API.
> 
> (all tests pass on Windows and the conflict resolution UI was tested
> manually to ensure no duplicate options are displayed for the conflict
> resolution)

+1, please commit.

Thank you!

> [[[
> Fix svn resolve --accept=working not working on binary conflicts by retrying
> to find a resolution option for the semantically corresponding
> svn_client_conflict_option_working_text option.
> 
> Additionally, enable the mf option for binary conflicts, so to have the
> option displayed in the client.
> 
> * subversion/libsvn_client/conflicts.c
>   (svn_client_conflict_text_get_resolution_options): return the more
> suitable
>    svn_client_conflict_option_working_text to resolve binary conflicts.
>   (svn_client_conflict_text_resolve_by_id): retry determining resolution
>    option with svn_client_conflict_option_working_text.
> 
> * subversion/svn/conflict-callbacks.c
>   (handle_text_conflict): add "mf" to the list of allowed resolutions for
>    binary conflicts.
> 
> * subversion/tests/cmdline/resolve_tests.py
>   (automatic_binary_conflict_resolution): remove XFail marker
> ]]]
> 
> Regards,
> Stefan
> 

> Index: subversion/libsvn_client/conflicts.c
> ===================================================================
> --- subversion/libsvn_client/conflicts.c      (revision 1764824)
> +++ subversion/libsvn_client/conflicts.c      (working copy)
> @@ -7193,7 +7193,7 @@
>          resolve_text_conflict);
>  
>        add_resolution_option(*options, conflict,
> -        svn_client_conflict_option_merged_text,
> +        svn_client_conflict_option_working_text,
>          _("accept binary file as it appears in the working copy"),
>          resolve_text_conflict);
>    }
> @@ -8537,6 +8537,7 @@
>  {
>    apr_array_header_t *resolution_options;
>    svn_client_conflict_option_t *option;
> +  const char *mime_type;
>  
>    SVN_ERR(svn_client_conflict_text_get_resolution_options(
>              &resolution_options, conflict, ctx,
> @@ -8543,13 +8544,29 @@
>              scratch_pool, scratch_pool));
>    option = svn_client_conflict_option_find_by_id(resolution_options,
>                                                   option_id);
> +
> +  /* Support svn_client_conflict_option_merged_text for binary conflicts by
> +   * mapping this onto the semantically equal
> +   * svn_client_conflict_option_working_text.
> +   */
>    if (option == NULL)
> -    return svn_error_createf(SVN_ERR_CLIENT_CONFLICT_OPTION_NOT_APPLICABLE,
> -                             NULL,
> -                             _("Inapplicable conflict resolution option "
> -                               "given for conflicted path '%s'"),
> -                             svn_dirent_local_style(conflict->local_abspath,
> -                                                    scratch_pool));
> +  {
> +    if (option_id == svn_client_conflict_option_merged_text) {
> +      mime_type = svn_client_conflict_text_get_mime_type(conflict);
> +      if (mime_type && svn_mime_type_is_binary(mime_type))
> +        option = svn_client_conflict_option_find_by_id(resolution_options,
> +                   svn_client_conflict_option_working_text);
> +    }
> +  }
> +
> +  if (option == NULL)
> +      return svn_error_createf(SVN_ERR_CLIENT_CONFLICT_OPTION_NOT_APPLICABLE,
> +                               NULL,
> +                               _("Inapplicable conflict resolution option "
> +                                 "given for conflicted path '%s'"),
> +                               
> svn_dirent_local_style(conflict->local_abspath,
> +                                                      scratch_pool));
> +
>    SVN_ERR(svn_client_conflict_text_resolve(conflict, option, ctx, 
> scratch_pool));
>  
>    return SVN_NO_ERROR;
> Index: subversion/svn/conflict-callbacks.c
> ===================================================================
> --- subversion/svn/conflict-callbacks.c       (revision 1764824)
> +++ subversion/svn/conflict-callbacks.c       (working copy)
> @@ -913,10 +913,9 @@
>            if (knows_something || is_binary)
>              *next_option++ = "r";
>  
> -          /* The 'mine-full' option selects the ".mine" file so only offer
> -           * it if that file exists. It does not exist for binary files,
> -           * for example (questionable historical behaviour since 1.0). */
> -          if (my_abspath)
> +          /* The 'mine-full' option selects the ".mine" file for texts or
> +           * the current working directory file for binary files. */
> +          if (my_abspath || is_binary)
>              *next_option++ = "mf";
>  
>            *next_option++ = "tf";
> Index: subversion/tests/cmdline/resolve_tests.py
> ===================================================================
> --- subversion/tests/cmdline/resolve_tests.py (revision 1764824)
> +++ subversion/tests/cmdline/resolve_tests.py (working copy)
> @@ -602,7 +602,6 @@
>  
>  # Test for issue #4647 'auto resolution mine-full fails on binary file'
>  @Issue(4647)
> -@XFail()
>  def automatic_binary_conflict_resolution(sbox):
>    "resolve -R --accept [base | mf | tf] binary file"
>  



Reply via email to