[svn.haxx.se] · SVN Dev · SVN Users · SVN Org · TSVN Dev · TSVN Users · Subclipse Dev · Subclipse Users · this month's index

Re: svn commit: r1079508 - in /subversion/trunk/subversion: include/svn_client.h include/svn_wc.h libsvn_client/commit_util.c libsvn_client/deprecated.c svn/notify.c

From: Daniel Shahaf <d.s_at_daniel.shahaf.name>
Date: Tue, 15 Mar 2011 06:34:11 +0200

cmpilato_at_apache.org wrote on Tue, Mar 08, 2011 at 20:05:51 -0000:
> Author: cmpilato
> Date: Tue Mar 8 20:05:50 2011
> New Revision: 1079508
>
> URL: http://svn.apache.org/viewvc?rev=1079508&view=rev
> Log:
> For issue #3752 ("Warn about committing copied directory at depth
> 'empty'"), introduce new notification types for overwriting and
> non-overwriting copies. Current, the command-line client treats these
> just as it does their non-copy-ful equivalents.
>
> * subversion/include/svn_wc.h
> (svn_wc_notify_action_t): Add new 'svn_wc_notify_commit_copied' and
> 'svn_wc_notify_commit_copied_replaced' notification types.
>
> * subversion/include/svn_client.h
> (svn_client_commit5): Update docstring to indicate that this
> function will transmit the new notification types, too.
> (svn_client_commit4): Explicitly note that this interface does *not*
> use the new notification types.
>
> * subversion/libsvn_client/commit_util.c
> (do_item_commit): Check for a non-NULL copyfrom_url on the commit
> item and, if found, use the new notification types rather than
> mere "added" and "replaced" notifications.
>
> * subversion/libsvn_client/deprecated.c
> (struct downgrade_commit_copied_notify_baton,
> downgrade_commit_copied_notify_func): New notification wrapper
> function and baton.
> (svn_client_commit4): Use downgrade_commit_copied_notify_func()
> wrapper as necessary to avoid sending unrecognized notification
> types to the caller.
>
> * subversion/svn/notify.c
> (notify): Handle svn_wc_notify_commit_copied as
> svn_wc_notify_commit_added; svn_wc_notify_commit_copied_replaced
> as svn_wc_notify_commit_replaced.
>
> Modified:
> subversion/trunk/subversion/include/svn_client.h
> subversion/trunk/subversion/include/svn_wc.h
> subversion/trunk/subversion/libsvn_client/commit_util.c
> subversion/trunk/subversion/libsvn_client/deprecated.c
> subversion/trunk/subversion/svn/notify.c
>
> Modified: subversion/trunk/subversion/include/svn_client.h
> URL: http://svn.apache.org/viewvc/subversion/trunk/subversion/include/svn_client.h?rev=1079508&r1=1079507&r2=1079508&view=diff
> ==============================================================================
> --- subversion/trunk/subversion/include/svn_client.h (original)
> +++ subversion/trunk/subversion/include/svn_client.h Tue Mar 8 20:05:50 2011
> @@ -1850,6 +1850,7 @@ svn_client_import(svn_client_commit_info
> * @a ctx->notify_baton2 as the commit progresses, with any of the following
> * actions: #svn_wc_notify_commit_modified, #svn_wc_notify_commit_added,
> * #svn_wc_notify_commit_deleted, #svn_wc_notify_commit_replaced,
> + * #svn_wc_notify_commit_copied, #svn_wc_notify_commit_copied_replaced,
> * #svn_wc_notify_commit_postfix_txdelta.
> *
> * If @a depth is #svn_depth_infinity, commit all changes to and
> @@ -1895,7 +1896,10 @@ svn_client_commit5(const apr_array_heade
>
> /**
> * Similar to svn_client_commit5(), but returns the @a commit_info_p directly,
> - * rather than through @a commit_callback.
> + * rather than through @a commit_callback. Does not make use of
> + * #svn_wc_notify_commit_copied or #svn_wc_notify_commit_copied_replaced
> + * (preferring #svn_wc_notify_commit_added and
> + * #svn_wc_notify_commit_replaced, respectively, instead).
> *
> * Also, if no error is returned and @a (*commit_info_p)->revision is set to
> * #SVN_INVALID_REVNUM, then the commit was a no-op; nothing needed to
>
> Modified: subversion/trunk/subversion/include/svn_wc.h
> URL: http://svn.apache.org/viewvc/subversion/trunk/subversion/include/svn_wc.h?rev=1079508&r1=1079507&r2=1079508&view=diff
> ==============================================================================
> --- subversion/trunk/subversion/include/svn_wc.h (original)
> +++ subversion/trunk/subversion/include/svn_wc.h Tue Mar 8 20:05:50 2011
> @@ -1144,6 +1144,16 @@ typedef enum svn_wc_notify_action_t
> * @since New in 1.7. */
> svn_wc_notify_patch_hunk_already_applied,
>
> + /** Committing a non-overwriting copy (path is the target of the
> + * copy, not the source).
> + * @since New in 1.7. */
> + svn_wc_notify_commit_copied,
> +
> + /** Committing an overwriting (replace) copy (path is the target of
> + * the copy, not the source).
> + * @since New in 1.7. */
> + svn_wc_notify_commit_copied_replaced,
> +
> /** The server has instructed the client to follow a URL
> * redirection.
> * @since New in 1.7. */
>
> Modified: subversion/trunk/subversion/libsvn_client/commit_util.c
> URL: http://svn.apache.org/viewvc/subversion/trunk/subversion/libsvn_client/commit_util.c?rev=1079508&r1=1079507&r2=1079508&view=diff
> ==============================================================================
> --- subversion/trunk/subversion/libsvn_client/commit_util.c (original)
> +++ subversion/trunk/subversion/libsvn_client/commit_util.c Tue Mar 8 20:05:50 2011
> @@ -1391,8 +1391,14 @@ do_item_commit(void **dir_baton,
> /* We don't print the "(bin)" notice for binary files when
> replacing, only when adding. So we don't bother to get
> the mime-type here. */
> - notify = svn_wc_create_notify(npath, svn_wc_notify_commit_replaced,
> - pool);
> + if (item->copyfrom_url)
> + notify = svn_wc_create_notify(npath,
> + svn_wc_notify_commit_copied_replaced,
> + pool);
> + else
> + notify = svn_wc_create_notify(npath, svn_wc_notify_commit_replaced,
> + pool);
> +
> }
> else if (item->state_flags & SVN_CLIENT_COMMIT_ITEM_DELETE)
> {
> @@ -1401,8 +1407,13 @@ do_item_commit(void **dir_baton,
> }
> else if (item->state_flags & SVN_CLIENT_COMMIT_ITEM_ADD)
> {
> - notify = svn_wc_create_notify(npath, svn_wc_notify_commit_added,
> - pool);
> + if (item->copyfrom_url)
> + notify = svn_wc_create_notify(npath, svn_wc_notify_commit_copied,
> + pool);
> + else
> + notify = svn_wc_create_notify(npath, svn_wc_notify_commit_added,
> + pool);
> +
> if (item->kind == svn_node_file)
> {
> const svn_string_t *propval;
>
> Modified: subversion/trunk/subversion/libsvn_client/deprecated.c
> URL: http://svn.apache.org/viewvc/subversion/trunk/subversion/libsvn_client/deprecated.c?rev=1079508&r1=1079507&r2=1079508&view=diff
> ==============================================================================
> --- subversion/trunk/subversion/libsvn_client/deprecated.c (original)
> +++ subversion/trunk/subversion/libsvn_client/deprecated.c Tue Mar 8 20:05:50 2011
> @@ -425,6 +425,43 @@ svn_client_import(svn_client_commit_info
> return svn_error_return(err);
> }
>
> +
> +/* Wrapper notify_func2 function and baton for downgrading
> + svn_wc_notify_commit_copied and svn_wc_notify_commit_copied_replaced
> + to svn_wc_notify_commit_added and svn_wc_notify_commit_replaced,
> + respectively. */
> +struct downgrade_commit_copied_notify_baton
> +{
> + svn_wc_notify_func2_t orig_notify_func2;
> + void *orig_notify_baton2;
> +};
> +
> +static void
> +downgrade_commit_copied_notify_func(void *baton,
> + const svn_wc_notify_t *notify,
> + apr_pool_t *pool)
> +{
> + svn_wc_notify_t *my_notify = (svn_wc_notify_t *)notify;
> + struct downgrade_commit_copied_notify_baton *b = baton;
> +
> + if (notify->action == svn_wc_notify_commit_copied)
> + {
> + my_notify = svn_wc_dup_notify(notify, pool);
> + my_notify->action = svn_wc_notify_commit_added;
> + }
> + else if (notify->action == svn_wc_notify_commit_copied)
> + {
> + my_notify = svn_wc_dup_notify(notify, pool);
> + my_notify->action = svn_wc_notify_commit_added;
> + }
> +
> + /* Call the wrapped notification system with MY_NOTIFY, which is
> + either the original NOTIFY object, or a tweaked deep copy
> + thereof. */
> + b->orig_notify_func2(b->orig_notify_baton2, my_notify, pool);
> +}
> +
> +
> svn_error_t *
> svn_client_commit4(svn_commit_info_t **commit_info_p,
> const apr_array_header_t *targets,
> @@ -437,14 +474,33 @@ svn_client_commit4(svn_commit_info_t **c
> apr_pool_t *pool)
> {
> struct capture_baton_t cb;
> + struct downgrade_commit_copied_notify_baton notify_baton;
> + svn_error_t *err;
> +
> + notify_baton.orig_notify_func2 = ctx->notify_func2;
> + notify_baton.orig_notify_baton2 = ctx->notify_baton2;
>
> *commit_info_p = NULL;
> cb.info = commit_info_p;
> cb.pool = pool;
>
> - SVN_ERR(svn_client_commit5(targets, depth, keep_locks, keep_changelists,
> - changelists, revprop_table,
> - capture_commit_info, &cb, ctx, pool));
> + /* Swap out the notification system (if any) with a thin filtering
> + wrapper. */
> + if (ctx->notify_func2)
> + {
> + ctx->notify_func2 = downgrade_commit_copied_notify_func;
> + ctx->notify_baton2 = &notify_baton;
> + }
> +
> + err = svn_client_commit5(targets, depth, keep_locks, keep_changelists,
> + changelists, revprop_table,
> + capture_commit_info, &cb, ctx, pool);
> +
> + /* Ensure that the original notification system is in place. */
> + ctx->notify_func2 = notify_baton.orig_notify_func2;
> + ctx->notify_baton2 = notify_baton.orig_notify_baton2;
> +

This is actually a race condition, isn't it? (for clients that call the
deprecated API while using CTX->notify_func2 in another thread (in the
same or another API))

(Okay, so maybe we'll just let it live on. Presumably N other
deprecated wrappers do this too.)

> + SVN_ERR(err);
>
> if (! *commit_info_p)
> *commit_info_p = svn_create_commit_info(pool);
>
> Modified: subversion/trunk/subversion/svn/notify.c
> URL: http://svn.apache.org/viewvc/subversion/trunk/subversion/svn/notify.c?rev=1079508&r1=1079507&r2=1079508&view=diff
> ==============================================================================
> --- subversion/trunk/subversion/svn/notify.c (original)
> +++ subversion/trunk/subversion/svn/notify.c Tue Mar 8 20:05:50 2011
> @@ -668,6 +668,7 @@ notify(void *baton, const svn_wc_notify_
> break;
>
> case svn_wc_notify_commit_added:
> + case svn_wc_notify_commit_copied:
> if (n->mime_type && svn_mime_type_is_binary(n->mime_type))
> {
> if ((err = svn_cmdline_printf(pool,
> @@ -691,6 +692,7 @@ notify(void *baton, const svn_wc_notify_
> break;
>
> case svn_wc_notify_commit_replaced:
> + case svn_wc_notify_commit_copied_replaced:
> if ((err = svn_cmdline_printf(pool,
> _("Replacing %s\n"),
> path_local)))
>
>
Received on 2011-03-15 05:35:06 CET

This is an archived mail posted to the Subversion Dev mailing list.