Hi! make check passed!
[[[ Use recursive locking when deleting an external. No need to make a distinction between files and dirs as the previous code did. * subversion/libsvn_client/externals.c (handle_external_item_change): Remove the adm_access functions and use svn_wc_{acqurire,release}write_lock instead. Patch by: Daniel Näslund <daniel{_AT_}longitudo.com> ]]]
Index: subversion/libsvn_client/externals.c =================================================================== --- subversion/libsvn_client/externals.c (revision 891778) +++ subversion/libsvn_client/externals.c (arbetskopia) @@ -894,53 +894,17 @@ just be renamed to a new one. */ svn_error_t *err; - svn_wc_adm_access_t *adm_access; - svn_boolean_t close_access_baton_when_done; - const char *remove_target_abspath; - /* Determine if a directory or file external is being removed. - Try to handle the case when the user deletes the external by - hand or it is missing. First try to open the directory for a - directory external. If that doesn't work, get the access - baton for the parent directory and remove the entry for the - external. */ - err = svn_wc__adm_open_in_context(&adm_access, ib->ctx->wc_ctx, path, - TRUE, -1, ib->ctx->cancel_func, - ib->ctx->cancel_baton, ib->iter_pool); - if (err) - { - const char *anchor; - const char *target; - svn_error_t *err2; + SVN_ERR(svn_dirent_get_absolute(&remove_target_abspath, + path, + ib->iter_pool)); - SVN_ERR(svn_wc_get_actual_target2(&anchor, &target, ib->ctx->wc_ctx, - path, ib->iter_pool, - ib->iter_pool)); + SVN_ERR(svn_wc__acquire_write_lock(NULL, ib->ctx->wc_ctx, + remove_target_abspath, + ib->iter_pool, + ib->iter_pool)); - err2 = svn_wc_adm_retrieve(&adm_access, ib->adm_access, anchor, - ib->iter_pool); - if (err2) - { - svn_error_clear(err2); - return svn_error_return(err); - } - else - { - svn_error_clear(err); - } - close_access_baton_when_done = FALSE; - SVN_ERR(svn_dirent_get_absolute(&remove_target_abspath, target, - ib->iter_pool)); - } - else - { - close_access_baton_when_done = TRUE; - SVN_ERR(svn_dirent_get_absolute(&remove_target_abspath, - svn_wc_adm_access_path(adm_access), - ib->iter_pool)); - } - /* We don't use relegate_dir_external() here, because we know that nothing else in this externals description (at least) is going to need this directory, and therefore it's better to @@ -950,6 +914,10 @@ ib->ctx->cancel_func, ib->ctx->cancel_baton, ib->iter_pool); + SVN_ERR(svn_wc__release_write_lock(ib->ctx->wc_ctx, + remove_target_abspath, + ib->iter_pool)); + if (ib->ctx->notify_func2) { svn_wc_notify_t *notify = @@ -964,20 +932,6 @@ notify, ib->iter_pool); } - /* ### Ugly. Unlock only if not going to return an error. Revisit */ - if (close_access_baton_when_done && - (!err || err->apr_err == SVN_ERR_WC_LEFT_LOCAL_MOD)) - { - svn_error_t *err2 = svn_wc_adm_close2(adm_access, ib->iter_pool); - if (err2) - { - if (!err) - err = err2; - else - svn_error_clear(err2); - } - } - if (err && (err->apr_err != SVN_ERR_WC_LEFT_LOCAL_MOD)) return svn_error_return(err); svn_error_clear(err);