> -----Original Message-----
> From: phi...@apache.org [mailto:phi...@apache.org]
> Sent: woensdag 10 maart 2010 17:47
> To: comm...@subversion.apache.org
> Subject: svn commit: r921445 - in /subversion/trunk/subversion:
> include/private/svn_wc_private.h include/svn_wc.h libsvn_client/commit.c
> libsvn_wc/entries.c
> 
> Author: philip
> Date: Wed Mar 10 16:47:27 2010
> New Revision: 921445
> 
> URL: http://svn.apache.org/viewvc?rev=921445&view=rev
> Log:
> Remove some access batons from post-commit processing.
> 
> * subversion/include/svn_wc.h
>   (svn_wc_mark_missing_deleted): Deprecate.
> 
> * subversion/include/private/svn_wc_private.h
>   (svn_wc__temp_mark_missing_not_present): New.
> 
> * subversion/libsvn_wc/entries.c
>   (svn_wc__temp_mark_missing_not_present): New.
>   (svn_wc_mark_missing_deleted): Call
> svn_wc__temp_mark_missing_not_present.
> 
> * subversion/libsvn_client/commit.c
>   (struct post_commit_baton): Replace access baton member with wc
> context.
>   (post_process_commit_item): Use db functions instead of access baton.
>   (svn_client_commit4): Store wc context instead of access baton.
> 
> Modified:
>     subversion/trunk/subversion/include/private/svn_wc_private.h
>     subversion/trunk/subversion/include/svn_wc.h
>     subversion/trunk/subversion/libsvn_client/commit.c
>     subversion/trunk/subversion/libsvn_wc/entries.c
> 
> Modified: subversion/trunk/subversion/include/private/svn_wc_private.h
> URL:
> http://svn.apache.org/viewvc/subversion/trunk/subversion/include/private
> /svn_wc_private.h?rev=921445&r1=921444&r2=921445&view=diff
> ==========================================================
> ====================
> --- subversion/trunk/subversion/include/private/svn_wc_private.h (original)
> +++ subversion/trunk/subversion/include/private/svn_wc_private.h Wed
> Mar 10 16:47:27 2010
> @@ -552,6 +552,18 @@ svn_wc__call_with_write_lock(svn_wc__wit
>                               apr_pool_t *result_pool,
>                               apr_pool_t *scratch_pool);
> 
> +
> +/** Mark missing, deleted directory @a local_abspath as 'not-present'
> + * in its parent's list of entries.
> + *
> + * Return #SVN_ERR_WC_PATH_FOUND if @a local_abspath isn't actually a
> + * missing, deleted directory.
> + */
> +svn_error_t *
> +svn_wc__temp_mark_missing_not_present(const char *local_abspath,
> +                                      svn_wc_context_t *wc_ctx,
> +                                      apr_pool_t *scratch_pool);
> +
>  #ifdef __cplusplus
>  }
>  #endif /* __cplusplus */
> 
> Modified: subversion/trunk/subversion/include/svn_wc.h
> URL:
> http://svn.apache.org/viewvc/subversion/trunk/subversion/include/svn_wc
> .h?rev=921445&r1=921444&r2=921445&view=diff
> ==========================================================
> ====================
> --- subversion/trunk/subversion/include/svn_wc.h (original)
> +++ subversion/trunk/subversion/include/svn_wc.h Wed Mar 10 16:47:27
> 2010
> @@ -3312,7 +3312,10 @@ svn_wc_walk_entries(const char *path,
>  /** Mark missing @a path as 'deleted' in its @a parent's list of entries.
>   *
>   * Return #SVN_ERR_WC_PATH_FOUND if @a path isn't actually missing.
> + *
> + * @deprecated Provided for backward compatibility with the 1.6 API.
>   */
> +SVN_DEPRECATED
>  svn_error_t *
>  svn_wc_mark_missing_deleted(const char *path,
>                              svn_wc_adm_access_t *parent,
> 
> Modified: subversion/trunk/subversion/libsvn_client/commit.c
> URL:
> http://svn.apache.org/viewvc/subversion/trunk/subversion/libsvn_client/co
> mmit.c?rev=921445&r1=921444&r2=921445&view=diff
> ==========================================================
> ====================
> --- subversion/trunk/subversion/libsvn_client/commit.c (original)
> +++ subversion/trunk/subversion/libsvn_client/commit.c Wed Mar 10
> 16:47:27 2010
> @@ -935,7 +935,7 @@ struct post_commit_baton
>  {
>    svn_wc_committed_queue_t *queue;
>    apr_pool_t *qpool;
> -  svn_wc_adm_access_t *base_dir_access;
> +  svn_wc_context_t *wc_ctx;
>    svn_boolean_t keep_changelists;
>    svn_boolean_t keep_locks;
>    apr_hash_t *checksums;
> @@ -950,35 +950,23 @@ post_process_commit_item(void *baton, vo
>    svn_client_commit_item3_t *item =
>      *(svn_client_commit_item3_t **)this_item;
>    svn_boolean_t loop_recurse = FALSE;
> -  const char *adm_access_path;
> -  svn_wc_adm_access_t *adm_access;
>    svn_boolean_t remove_lock;
> -  svn_error_t *bump_err;
> -
> -  if (item->kind == svn_node_dir)
> -    adm_access_path = item->path;
> -  else
> -    adm_access_path = svn_dirent_dirname(item->path, pool);
> 
> -  bump_err = svn_wc_adm_retrieve(&adm_access, btn->base_dir_access,
> -                                 adm_access_path, pool);
> -  if (bump_err
> -      && bump_err->apr_err == SVN_ERR_WC_NOT_LOCKED)
> +  /* Is it a missing, deleted directory?
> +
> +     ### Temporary: once we centralise this sort of node is just a
> +     normal delete and will get handled by the post-commit queue. */
> +  if (item->kind == svn_node_dir
> +      && item->state_flags & SVN_CLIENT_COMMIT_ITEM_DELETE)
>      {
> -      /* Is it a directory that was deleted in the commit?
> -         Then we probably committed a missing directory. */
> -      if (item->kind == svn_node_dir
> -          && item->state_flags & SVN_CLIENT_COMMIT_ITEM_DELETE)
> -        {
> -          /* Mark it as deleted in the parent. */
> -          svn_error_clear(bump_err);
> -          return svn_wc_mark_missing_deleted(item->path,
> -                                             btn->base_dir_access, pool);
> -        }
> -    }
> -  if (bump_err)
> -    return bump_err;
> +      svn_boolean_t obstructed;
> 
> +      SVN_ERR(svn_wc__node_is_status_obstructed(&obstructed,
> +                                                btn->wc_ctx, item->path, 
> pool));
> +      if (obstructed)
> +        return svn_wc__temp_mark_missing_not_present(item->path,
> +                                                     btn->wc_ctx, pool);
> +    }
> 
>    if ((item->state_flags & SVN_CLIENT_COMMIT_ITEM_ADD)
>        && (item->kind == svn_node_dir)
> @@ -1282,7 +1270,7 @@ svn_client_commit4(svn_commit_info_t **c
> 
>        btn.queue = queue;
>        btn.qpool = pool;
> -      btn.base_dir_access = base_dir_access;
> +      btn.wc_ctx = ctx->wc_ctx;
>        btn.keep_changelists = keep_changelists;
>        btn.keep_locks = keep_locks;
>        btn.checksums = checksums;
> 
> Modified: subversion/trunk/subversion/libsvn_wc/entries.c
> URL:
> http://svn.apache.org/viewvc/subversion/trunk/subversion/libsvn_wc/entri
> es.c?rev=921445&r1=921444&r2=921445&view=diff
> ==========================================================
> ====================
> --- subversion/trunk/subversion/libsvn_wc/entries.c (original)
> +++ subversion/trunk/subversion/libsvn_wc/entries.c Wed Mar 10 16:47:27
> 2010
> @@ -3365,36 +3365,60 @@ svn_wc_walk_entries3(const char *path,
>  }
> 
>  svn_error_t *
> -svn_wc_mark_missing_deleted(const char *path,
> -                            svn_wc_adm_access_t *parent,
> -                            apr_pool_t *pool)
> +svn_wc__temp_mark_missing_not_present(const char *local_abspath,
> +                                      svn_wc_context_t *wc_ctx,
> +                                      apr_pool_t *scratch_pool)
>  {
> -  svn_node_kind_t pkind;
> -  const char *local_abspath;
> -  svn_wc__db_t *db = svn_wc__adm_get_db(parent);
> -
> -  SVN_ERR(svn_dirent_get_absolute(&local_abspath, path, pool));
> +  svn_wc__db_status_t status;
> +  svn_wc__db_kind_t kind;
> 
> -  SVN_ERR(svn_io_check_path(path, &pkind, pool));
> -
> -  if (pkind == svn_node_none)
> +  SVN_ERR_ASSERT(svn_dirent_is_absolute(local_abspath));
> +  SVN_ERR(svn_wc__db_read_info(&status, &kind,
> +                               NULL, NULL, NULL, NULL, NULL, NULL, NULL,
> +                               NULL, NULL, NULL, NULL, NULL, NULL, NULL,
> +                               NULL, NULL, NULL, NULL, NULL, NULL, NULL,
> +                               NULL,
> +                               wc_ctx->db, local_abspath,
> +                               scratch_pool, scratch_pool));
> +  if (kind == svn_wc__db_kind_dir
> +      && status == svn_wc__db_status_obstructed_delete)
>      {
>        svn_wc_entry_t tmp_entry;
> 
>        tmp_entry.deleted = TRUE;
>        tmp_entry.schedule = svn_wc_schedule_normal;
> 
> -      return svn_error_return(
> -        svn_wc__entry_modify2(db, local_abspath, svn_node_unknown,
> FALSE,
> -                              &tmp_entry,
> -                              (SVN_WC__ENTRY_MODIFY_DELETED
> -                               | SVN_WC__ENTRY_MODIFY_SCHEDULE
> -                               | SVN_WC__ENTRY_MODIFY_FORCE),
> -                              pool));
> +      SVN_ERR(svn_wc__entry_modify2(wc_ctx->db, local_abspath,
> +                                    svn_node_unknown, FALSE, &tmp_entry,
> +                                    (SVN_WC__ENTRY_MODIFY_DELETED
> +                                     | SVN_WC__ENTRY_MODIFY_SCHEDULE
> +                                     | SVN_WC__ENTRY_MODIFY_FORCE),
> +                                    scratch_pool));

Shouldn't this be svn_node_directory and TRUE for parent_stub instead of 
unknown and FALSE?

Only directories can be in obstructed_delete mode, and in this case I don't 
think you can't update the node in the directory itself.

        Bert


Reply via email to