On 13.09.2017 19:16, s...@apache.org wrote:
> Author: stsp
> Date: Wed Sep 13 17:16:43 2017
> New Revision: 1808258
>
> URL: http://svn.apache.org/viewvc?rev=1808258&view=rev
> Log:
> Follow-up to r1808177:
>
> The change in r1808177 had a bug where moves were actually only searched
> within one revision back in history. Detect moves even if are revisions
> between the "branch-point" and the revision being cherry-picked.
>
> * subversion/libsvn_client/conflicts.c
>   (find_nearest_yca): New helper function.
>   (conflict_tree_get_details_local_missing): Use find_nearest_yca() to
>    find a lower bound for the revision range which must be searched for
>    moves.
>
> Modified:
>     subversion/trunk/subversion/libsvn_client/conflicts.c
>
> Modified: subversion/trunk/subversion/libsvn_client/conflicts.c
> URL: 
> http://svn.apache.org/viewvc/subversion/trunk/subversion/libsvn_client/conflicts.c?rev=1808258&r1=1808257&r2=1808258&view=diff
> ==============================================================================
> --- subversion/trunk/subversion/libsvn_client/conflicts.c (original)
> +++ subversion/trunk/subversion/libsvn_client/conflicts.c Wed Sep 13 17:16:43 
> 2017
> @@ -482,6 +482,80 @@ find_yca(svn_client__pathrev_t **yca_loc
>    return SVN_NO_ERROR;
>  }
>  
> +/* Like find_yca, expect that a YCA could also be found via a brute-force
> + * search of parents of REPOS_RELPATH1 and REPOS_RELPATH2, if no "direct"
> + * YCA exists. An implicit assumption is that some parent of REPOS_RELPATH1
> + * is a branch of some parent of REPOS_RELPATH2.
> + *
> + * This function can guess a "good enough" YCA for 'missing nodes' which do
> + * not exist in the working copy, e.g. when a file edit is merged to a path
> + * which does not exist in the working copy.
> + */
> +static svn_error_t *
> +find_nearest_yca(svn_client__pathrev_t **yca_locp,
> +                 const char *repos_relpath1,
> +                 svn_revnum_t peg_rev1,
> +                 const char *repos_relpath2,
> +                 svn_revnum_t peg_rev2,
> +                 const char *repos_root_url,
> +                 const char *repos_uuid,
> +                 svn_ra_session_t *ra_session,
> +                 svn_client_ctx_t *ctx,
> +                 apr_pool_t *result_pool,
> +                 apr_pool_t *scratch_pool)
> +{
> +  svn_client__pathrev_t *yca_loc;
> +  svn_error_t *err;
> +  apr_pool_t *iterpool;
> +  const char *p1, *p2;
> +  int c1, c2;
> +
> +  *yca_locp = NULL;
> +
> +  iterpool = svn_pool_create(scratch_pool);
> +
> +  p1 = repos_relpath1;
> +  c1 = svn_path_component_count(repos_relpath1);

...subversion/libsvn_client/conflicts.c:524:8: warning: implicit conversion 
loses integer precision:
      'apr_size_t' (aka 'unsigned long') to 'int' [-Wshorten-64-to-32]
  c1 = svn_path_component_count(repos_relpath1);
     ~ ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~


> +  while (c1--)
> +    {
> +      svn_pool_clear(iterpool);
> +
> +      p2 = repos_relpath2;
> +      c2 = svn_path_component_count(repos_relpath2);

.../subversion/libsvn_client/conflicts.c:530:12: warning: implicit conversion 
loses integer precision:
      'apr_size_t' (aka 'unsigned long') to 'int' [-Wshorten-64-to-32]
      c2 = svn_path_component_count(repos_relpath2);
         ~ ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~


> +      while (c2--)
> +        {
> +          err = find_yca(&yca_loc, p1, peg_rev1, p2, peg_rev2,
> +                         repos_root_url, repos_uuid, ra_session, ctx,
> +                         result_pool, iterpool);
> +          if (err)
> +            {
> +              if (err->apr_err == SVN_ERR_FS_NOT_FOUND)
> +                {
> +                  svn_error_clear(err);
> +                  yca_loc = NULL;
> +                }
> +              else
> +                return svn_error_trace(err);
> +            }
> +
> +          if (yca_loc)
> +            {
> +              *yca_locp = yca_loc;
> +              svn_pool_destroy(iterpool);
> +              return SVN_NO_ERROR;
> +            }
> +
> +          p2 = svn_relpath_dirname(p2, scratch_pool); 
> +        }
> +
> +      p1 = svn_relpath_dirname(p1, scratch_pool); 
> +    }
> +
> +  svn_pool_destroy(iterpool);
> +
> +  return SVN_NO_ERROR;
> +}


-- Brane

Reply via email to