Daniel Näslund <dan...@longitudo.com> writes:

> 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));

Does this lock an external directory?  I think the 1.6 code would lock
such a directory before deleting it and that the code would fail if it
was not locked.  The current wc-ng code doesn't check for locks in
quite the same way and this allows code to make changes without locks,
but I'm not sure that's the correct thing to do.

>  
> -          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));
> +

Why the change in behaviour?  The old code would leave the locks if
the remove call failed.  Is this because you are no longer locking the
external?

>        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);

-- 
Philip

Reply via email to