Matthew Bentham <mj...@artvps.com> writes:

>  static svn_error_t *
>  calculate_target_mergeinfo(svn_ra_session_t *ra_session,
>                             apr_hash_t **target_mergeinfo,
>                             svn_wc_adm_access_t *adm_access,
>                             const char *src_path_or_url,
>                             svn_revnum_t src_revnum,
> -                           svn_boolean_t no_repos_access,
>                             svn_client_ctx_t *ctx,
>                             apr_pool_t *pool)
>  {
> -  const svn_wc_entry_t *entry = NULL;
>    svn_boolean_t locally_added = FALSE;
>    const char *src_url;
>    apr_hash_t *src_mergeinfo = NULL;
> @@ -94,13 +90,15 @@
>       bother checking. */
>    if (adm_access)
>      {
> +      svn_boolean_t added, copied;
>        const char *local_abspath;
>  
>        SVN_ERR(svn_dirent_get_absolute(&local_abspath, src_path_or_url, 
> pool));
> -      SVN_ERR(svn_wc__get_entry_versioned(&entry, ctx->wc_ctx, local_abspath,
> -                                          svn_node_unknown, FALSE, FALSE,
> -                                          pool, pool));
> -      if (entry->schedule == svn_wc_schedule_add && (! entry->copied))
> +      SVN_ERR(svn_wc__node_is_status_added(&added, ctx->wc_ctx,
> +                                           local_abspath, pool));
> +      SVN_ERR(svn_wc__node_is_status_copied(&copied, ctx->wc_ctx,
> +                                           local_abspath, pool));

It looks a bit odd to call _added just before _copied when _copied
itself calls _added.

> +      if (added && !copied)
>          {
>            locally_added = TRUE;
>          }

> +svn_wc__node_is_status_copied(svn_boolean_t *is_copied,
> +                              svn_wc_context_t *wc_ctx,
> +                              const char *local_abspath,
> +                              apr_pool_t *scratch_pool)
> +{
> +  svn_wc__db_status_t status;
> +  svn_boolean_t added;
> +
> +  SVN_ERR(svn_wc__node_is_status_added(&added, wc_ctx, local_abspath,
> +                                scratch_pool));
> +  if (!added)
> +    {
> +      *is_copied = FALSE;
> +      return SVN_NO_ERROR;
> +    }
> +
> +  SVN_ERR(svn_wc__db_scan_addition(&status, 
> +                                NULL, NULL, NULL, NULL,
> +                                NULL, NULL, NULL, NULL,
> +                                wc_ctx->db, local_abspath,
> +                                scratch_pool, scratch_pool));
> +  *is_copied = (status == svn_wc__db_status_copied);

What about svn_wc__db_status_moved_here?  That's a copy where the
source happened to be deleted as well.  What should _is_status_copied
return?  How should calculate_target_mergeinfo handle _moved_here?
Like copied or like added?

> +
> +  return SVN_NO_ERROR;

Perhaps calculate_target_mergeinfo should simply call _scan_addition
to get the added/copied/moved status?

-- 
Philip

Reply via email to