[[[ Don't notify about descent into an external when there is no interesting status to report about that external. This alleviates issue #1935. Formerly, the client printed "Performing status on external item at 'foo'" before descending into external directory 'foo', even if there was no status to report under 'foo'. Now, the client will only print the "Performing..." line if there will be output from 'foo' anyway; otherwise, silence is golden. ############################################################### ### ### ### Except that this is broken -- it doesn't even print out ### ### the "Performing..." line when there is status. I have ### ### no time to debug this right now, just saving the patch. ### ### ### ############################################################### This was an attempt to satisfy Scott Palmer's enhancement, see http://subversion.tigris.org/servlets/ReadMsg?list=users&msgNo=36433 and its thread for details. * subversion/include/svn_wc.h (svn_wc_get_status_editor3): Replace svn_wc_get_status_editor2, adding the is_external argument, and the notify_func and notify_baton arguments. (svn_wc_get_status_editor2): Deprecate. * subversion/libsvn_wc/status.c (struct edit_baton): Add is_external flag, no_notify_yet flag, notify_func, and notify_baton. (maybe_notify_for_external): New static function. (send_status_structure, send_unversioned_item): Take 'struct edit_baton *' eb argument, invoke maybe_notify_for_external with it. All callers changed. ##### update other eb->foo arguments, then! ##### (svn_wc_get_status_editor3): New function. (svn_wc_get_status_editor2, svn_wc_get_status_editor): Just wrap svn_wc_get_status_editor3. (struct status_baton): Remove, since we can just use edit_baton. (struct mark_deleted_baton): New baton type. (mark_deleted): Use new baton type, call maybe_notify_for_external. (handle_statii): Use eb as the status baton; call maybe_notify_for_external where appropriate. (close_directory): Call maybe_notify_for_external where appropriate. * subversion/include/svn_client.h (svn_client_status3): Replace svn_client_status3, adding the is_external argument. (svn_client_status2): Deprecate. * subversion/libsvn_client/status.c (svn_client__status_helper): New internal shared function. (svn_client_status3): New function, wraps svn_client__status_helper. (svn_client_status2): Implement by wrapping svn_client__status_helper. * subversion/libsvn_client/client.h (svn_client__do_external_status): Take new empty_externals_silent arg. * subversion/libsvn_client/externals.c (svn_client__do_external_status): Call svn_client__status_helper instead of a public API. Don't notify about impending descent into an external if new empty_externals_silent boolean is true. * subversion/clients/cmdline/status-cmd.c (svn_cl__status): Call svn_client_status3 now. * subversion/libsvn_client/delete.c (svn_client__can_delete): Call svn_client_status3 now. * subversion/svnversion/main.c (main): Call svn_client_status3 now. ]]] Index: subversion/include/svn_wc.h =================================================================== --- subversion/include/svn_wc.h (revision 15608) +++ subversion/include/svn_wc.h (working copy) @@ -1682,6 +1682,12 @@ * If @a no_ignore is set, statuses that would typically be ignored * will instead be reported. * + * If is_external is TRUE, then if @a notify_func is non-null, call it + * with @a notify_baton and an svn_wc_notify_t object (created with the + * action svn_wc_notify_status_external) exactly once, before the + * first invocation @a status_func if there is any invocation, or else + * do not call it at all. + * * If @a cancel_func is non-null, call it with @a cancel_baton while building * the @a statushash to determine if the client has cancelled the operation. * @@ -1692,8 +1698,34 @@ * Allocate the editor itself in @a pool, but the editor does temporary * allocations in a subpool of @a pool. * - * @since New in 1.2. + * @since New in 1.3. */ +svn_error_t *svn_wc_get_status_editor3 (const svn_delta_editor_t **editor, + void **edit_baton, + void **set_locks_baton, + svn_revnum_t *edit_revision, + svn_wc_adm_access_t *anchor, + const char *target, + apr_hash_t *config, + svn_boolean_t recurse, + svn_boolean_t get_all, + svn_boolean_t no_ignore, + svn_boolean_t is_external, + svn_wc_status_func2_t status_func, + void *status_baton, + svn_wc_notify_func2_t notify_func, + void *notify_baton, + svn_cancel_func_t cancel_func, + void *cancel_baton, + svn_wc_traversal_info_t *traversal_info, + apr_pool_t *pool); + +/** + * Like svn_wc_get_status_editor3(), except that @a notify_func and + * @a notify_baton are always NULL. + * + * @deprecated Provided for backwards compatibility with the 1.2 API. + */ svn_error_t *svn_wc_get_status_editor2 (const svn_delta_editor_t **editor, void **edit_baton, void **set_locks_baton, Index: subversion/include/svn_client.h =================================================================== --- subversion/include/svn_client.h (revision 15608) +++ subversion/include/svn_client.h (working copy) @@ -868,15 +868,45 @@ * @a update is set). * * If @a ignore_externals is not set, then recurse into externals - * definitions (if any exist) after handling the main target. This - * calls the client notification function (in @a ctx) with the @c - * svn_wc_notify_status_external action before handling each externals - * definition, and with @c svn_wc_notify_status_completed - * after each. + * definitions (if any exist) after handling the main target. Iff + * a given external has non-empty status -- that is, if it invokes + * @a status_func at all -- call the client notification function (in + * @a ctx) with the @c svn_wc_notify_status_external action before + * that initial invocation of @a status_func for that external, and + * call @c svn_wc_notify_status_completed after the traversal of the + * entire external is completed. * - * @since New in 1.2. + * @since New in 1.3. */ svn_error_t * +svn_client_status3 (svn_revnum_t *result_rev, + const char *path, + const svn_opt_revision_t *revision, + svn_wc_status_func2_t status_func, + void *status_baton, + svn_boolean_t recurse, + svn_boolean_t get_all, + svn_boolean_t update, + svn_boolean_t no_ignore, + svn_boolean_t ignore_externals, + svn_client_ctx_t *ctx, + apr_pool_t *pool); + + +/** + * Like svn_client_status3(), but a slightly different behavior with + * respect to externals: + * + * If @a ignore_externals is not set, call the client notification + * function (in @a ctx) with the @c svn_wc_notify_status_external + * action before recursing into any external, and call it with @c + * svn_wc_notify_status_completed afterwards, regardless of whether + * that external has non-empty status as defined by svn_client_status3(). + * + * @deprecated Provided for backward compatability with the 1.2 API. + * We recommend the svn_client_status3() behavior instead. + */ +svn_error_t * svn_client_status2 (svn_revnum_t *result_rev, const char *path, const svn_opt_revision_t *revision, Index: subversion/libsvn_wc/status.c =================================================================== --- subversion/libsvn_wc/status.c (revision 15608) +++ subversion/libsvn_wc/status.c (working copy) @@ -59,6 +59,9 @@ /* Ignore the svn:ignores. */ svn_boolean_t no_ignore; + /* TRUE iff the target of this status run is an external directory. */ + svn_boolean_t is_external; + /* The comparison revision in the repository. This is a reference because this editor returns this rev to the driver directly, as well as in each statushash entry. */ @@ -71,6 +74,15 @@ svn_wc_status_func2_t status_func; void *status_baton; + /* Notify function/baton, currently used only for notifying that an + external has non-empty status. Iff is_external is TRUE, then + this is invoked before the first time status_func is invoked. */ + svn_wc_notify_func2_t notify_func; + void *notify_baton; + + /* TRUE while notify_func has not yet been invoked. */ + svn_boolean_t no_notify_yet; + /* Cancellation function/baton. */ svn_cancel_func_t cancel_func; void *cancel_baton; @@ -473,11 +485,26 @@ } +/* fooo Needs documentation! */ +static void +maybe_notify_for_external (struct edit_baton *eb, apr_pool_t *pool) +{ + if (eb->is_external && eb->no_notify_yet && eb->notify_func) + { + const char *notify_path = svn_path_join + (eb->anchor, eb->target, pool); + svn_wc_notify_t *notify_object = svn_wc_create_notify + (notify_path, svn_wc_notify_status_external, pool); + (*eb->notify_func) (eb->notify_baton, notify_object, pool); + eb->no_notify_yet = FALSE; + } +} /* Given an ENTRY object representing PATH, build a status structure - and pass it off to the STATUS_FUNC/STATUS_BATON. All other - arguments are the same as those passed to assemble_status(). */ + and pass it off to the STATUS_FUNC/STATUS_BATON. EB is used to + determine whether or not to send an externals notification. All + other arguments are the same as those passed to assemble_status(). */ static svn_error_t * send_status_structure (const char *path, svn_wc_adm_access_t *adm_access, @@ -489,6 +516,7 @@ svn_boolean_t is_ignored, apr_hash_t *repos_locks, const char *repos_root, + struct edit_baton *eb, svn_wc_status_func2_t status_func, void *status_baton, apr_pool_t *pool) @@ -499,7 +527,10 @@ path_kind, path_special, get_all, is_ignored, repos_locks, repos_root, pool)); if (statstruct && (status_func)) - (*status_func) (status_baton, path, statstruct); + { + maybe_notify_for_external (eb, pool); + (*status_func) (status_baton, path, statstruct); + } return SVN_NO_ERROR; } @@ -596,6 +627,9 @@ whether it is ignored; otherwise we will only add the item if it does not match any of the patterns in PATTERNS. + EB is used to determine whether or not to send an externals + notification. + Allocate everything in POOL. */ static svn_error_t * @@ -607,6 +641,7 @@ svn_boolean_t no_ignore, apr_hash_t *repos_locks, const char *repos_root, + struct edit_baton *eb, svn_wc_status_func2_t status_func, void *status_baton, apr_pool_t *pool) @@ -627,7 +662,10 @@ /* If we aren't ignoring it, or if it's an externals path, or it has a lock in the repository, pass this entry to the status func. */ if (no_ignore || (! ignore_me) || is_external || status->repos_lock) - (status_func) (status_baton, path, status); + { + maybe_notify_for_external (eb, pool); + (status_func) (status_baton, path, status); + } return SVN_NO_ERROR; } @@ -705,7 +743,7 @@ SVN_ERR (send_status_structure (path, adm_access, full_entry, dir_entry, kind, special, get_all, FALSE, eb->repos_locks, - eb->repos_root, + eb->repos_root, eb, status_func, status_baton, pool)); } } @@ -714,7 +752,7 @@ /* File entries are ... just fine! */ SVN_ERR (send_status_structure (path, adm_access, entry, dir_entry, kind, special, get_all, FALSE, - eb->repos_locks, eb->repos_root, + eb->repos_locks, eb->repos_root, eb, status_func, status_baton, pool)); } return SVN_NO_ERROR; @@ -844,7 +882,7 @@ SVN_ERR (send_unversioned_item (entry, dirent_p->kind, dirent_p->special, adm_access, patterns, eb->externals, no_ignore, - eb->repos_locks, eb->repos_root, + eb->repos_locks, eb->repos_root, eb, status_func, status_baton, subpool)); } @@ -883,7 +921,7 @@ SVN_ERR (send_unversioned_item (key, dirent_p->kind, dirent_p->special, adm_access, patterns, eb->externals, no_ignore, - eb->repos_locks, eb->repos_root, + eb->repos_locks, eb->repos_root, eb, status_func, status_baton, iterpool)); } @@ -892,7 +930,8 @@ SVN_ERR (send_status_structure (path, adm_access, dir_entry, parent_entry, svn_node_dir, FALSE, get_all, FALSE, eb->repos_locks, - eb->repos_root, status_func, status_baton, + eb->repos_root, eb, + status_func, status_baton, subpool)); /* Loop over entries hash */ @@ -1183,25 +1222,27 @@ } -/* Baton for mark_status. */ -struct status_baton +/* Baton for mark_deleted(). */ +struct mark_deleted_baton { - svn_wc_status_func2_t real_status_func; /* real status function */ - void *real_status_baton; /* real status baton */ + apr_pool_t *pool; /* Used for one-time external notification. */ + struct edit_baton *eb; /* The real baton. */ }; /* A status callback function which wraps the *real* status function/baton. It simply sets the "repos_text_status" field of the STATUS to svn_wc_status_deleted and passes it off to the real - status func/baton. */ + status func/baton. BATON is just 'struct edit_baton *'. */ static void mark_deleted (void *baton, const char *path, svn_wc_status2_t *status) { - struct status_baton *sb = baton; + struct mark_deleted_baton *mdb = baton; + struct edit_baton *eb = mdb->eb; status->repos_text_status = svn_wc_status_deleted; - sb->real_status_func (sb->real_status_baton, path, status); + maybe_notify_for_external (eb, mdb->pool); + eb->status_func (eb->status_baton, path, status); } @@ -1226,14 +1267,14 @@ apr_pool_t *subpool = svn_pool_create (pool); svn_wc_status_func2_t status_func = eb->status_func; void *status_baton = eb->status_baton; - struct status_baton sb; + struct mark_deleted_baton mdb; if (dir_was_deleted) { - sb.real_status_func = eb->status_func; - sb.real_status_baton = eb->status_baton; + mdb.pool = subpool; + mdb.eb = eb; + status_baton = &mdb; status_func = mark_deleted; - status_baton = &sb; } /* Loop over all the statuses still in our hash, handling each one. */ @@ -1266,7 +1307,10 @@ if (dir_was_deleted) status->repos_text_status = svn_wc_status_deleted; if (is_sendable_status (status, eb)) - (eb->status_func)(eb->status_baton, key, status); + { + maybe_notify_for_external (eb, subpool); + (eb->status_func)(eb->status_baton, key, status); + } } /* Destroy the subpool. */ @@ -1493,7 +1537,10 @@ SVN_ERR (handle_statii (eb, dir_status ? dir_status->entry : NULL, db->path, db->statii, was_deleted, TRUE, pool)); if (dir_status && is_sendable_status (dir_status, eb)) - (eb->status_func) (eb->status_baton, db->path, dir_status); + { + maybe_notify_for_external (eb, pool); + (eb->status_func) (eb->status_baton, db->path, dir_status); + } apr_hash_set (pb->statii, db->path, APR_HASH_KEY_STRING, NULL); } else if (! pb) @@ -1522,7 +1569,10 @@ eb->cancel_func, eb->cancel_baton, pool)); } if (is_sendable_status (tgt_status, eb)) - (eb->status_func) (eb->status_baton, path, tgt_status); + { + maybe_notify_for_external (eb, pool); + (eb->status_func) (eb->status_baton, path, tgt_status); + } } } else @@ -1533,7 +1583,10 @@ SVN_ERR (handle_statii (eb, eb->anchor_status->entry, db->path, db->statii, FALSE, eb->descend, pool)); if (is_sendable_status (eb->anchor_status, eb)) - (eb->status_func) (eb->status_baton, db->path, eb->anchor_status); + { + maybe_notify_for_external (eb, pool); + (eb->status_func) (eb->status_baton, db->path, eb->anchor_status); + } eb->anchor_status = NULL; } } @@ -1759,7 +1812,7 @@ /*** Public API ***/ svn_error_t * -svn_wc_get_status_editor2 (const svn_delta_editor_t **editor, +svn_wc_get_status_editor3 (const svn_delta_editor_t **editor, void **edit_baton, void **set_locks_baton, svn_revnum_t *edit_revision, @@ -1769,8 +1822,11 @@ svn_boolean_t recurse, svn_boolean_t get_all, svn_boolean_t no_ignore, + svn_boolean_t is_external, svn_wc_status_func2_t status_func, void *status_baton, + svn_wc_notify_func2_t notify_func, + void *notify_baton, svn_cancel_func_t cancel_func, void *cancel_baton, svn_wc_traversal_info_t *traversal_info, @@ -1787,8 +1843,12 @@ eb->config = config; eb->get_all = get_all; eb->no_ignore = no_ignore; + eb->is_external = is_external; eb->status_func = status_func; eb->status_baton = status_baton; + eb->no_notify_yet = TRUE; + eb->notify_func = notify_func; + eb->notify_baton = notify_baton; eb->cancel_func = cancel_func; eb->cancel_baton = cancel_baton; eb->traversal_info = traversal_info; @@ -1835,7 +1895,37 @@ } +svn_error_t * +svn_wc_get_status_editor2 (const svn_delta_editor_t **editor, + void **edit_baton, + void **set_locks_baton, + svn_revnum_t *edit_revision, + svn_wc_adm_access_t *anchor, + const char *target, + apr_hash_t *config, + svn_boolean_t recurse, + svn_boolean_t get_all, + svn_boolean_t no_ignore, + svn_wc_status_func2_t status_func, + void *status_baton, + svn_cancel_func_t cancel_func, + void *cancel_baton, + svn_wc_traversal_info_t *traversal_info, + apr_pool_t *pool) +{ + return svn_wc_get_status_editor3 (editor, edit_baton, + set_locks_baton, + edit_revision, + anchor, target, + config, recurse, get_all, no_ignore, FALSE, + status_func, status_baton, + NULL, NULL, + cancel_func, cancel_baton, + traversal_info, + pool); +} + /* Helpers for deprecated svn_wc_status_editor(), of type svn_wc_status_func2_t. */ struct old_status_func_cb_baton @@ -1875,10 +1965,11 @@ b->original_func = status_func; b->original_baton = status_baton; - return svn_wc_get_status_editor2 (editor, edit_baton, NULL, edit_revision, + return svn_wc_get_status_editor3 (editor, edit_baton, NULL, edit_revision, anchor, target, config, recurse, - get_all, no_ignore, old_status_func_cb, - b, cancel_func, cancel_baton, + get_all, no_ignore, FALSE, + old_status_func_cb, + b, NULL, NULL, cancel_func, cancel_baton, traversal_info, pool); } Index: subversion/libsvn_client/delete.c =================================================================== --- subversion/libsvn_client/delete.c (revision 15608) +++ subversion/libsvn_client/delete.c (working copy) @@ -89,7 +89,7 @@ revision.kind = svn_opt_revision_unspecified; sb.err = SVN_NO_ERROR; sb.pool = pool; - SVN_ERR (svn_client_status2 (NULL, path, &revision, find_undeletables, &sb, + SVN_ERR (svn_client_status3 (NULL, path, &revision, find_undeletables, &sb, TRUE, FALSE, FALSE, FALSE, FALSE, ctx, pool)); return sb.err; } Index: subversion/libsvn_client/externals.c =================================================================== --- subversion/libsvn_client/externals.c (revision 15608) +++ subversion/libsvn_client/externals.c (working copy) @@ -558,6 +558,7 @@ svn_boolean_t get_all, svn_boolean_t update, svn_boolean_t no_ignore, + svn_boolean_t empty_externals_silent, svn_client_ctx_t *ctx, apr_pool_t *pool) { @@ -616,19 +617,21 @@ if (kind != svn_node_dir) continue; - /* Tell the client we're staring an external status set. */ - if (ctx->notify_func2) + /* Maybe tell the client we're staring an external status set. */ + if ((! empty_externals_silent) && ctx->notify_func2) (ctx->notify_func2) (ctx->notify_baton2, svn_wc_create_notify (fullpath, svn_wc_notify_status_external, iterpool), iterpool); /* And then do the status. */ - SVN_ERR (svn_client_status2 (NULL, fullpath, - &(external->revision), - status_func, status_baton, - TRUE, get_all, update, no_ignore, FALSE, - ctx, iterpool)); + SVN_ERR (svn_client__status_helper + (NULL, fullpath, + &(external->revision), + status_func, status_baton, + TRUE, get_all, update, no_ignore, + TRUE, empty_externals_silent, FALSE, + ctx, iterpool)); } } Index: subversion/libsvn_client/client.h =================================================================== --- subversion/libsvn_client/client.h (revision 15608) +++ subversion/libsvn_client/client.h (working copy) @@ -624,8 +624,34 @@ apr_pool_t *pool); -/* Perform status operations on each external in TRAVERSAL_INFO. All - other options are the same as those passed to svn_client_status(). */ +/* Exactly like svn_client_status3(), except for the additional + * parameters IS_EXTERNAL and EMPTY_EXTERNALS_SILENT. + * + * fooo + */ +svn_error_t *svn_client__status_helper (svn_revnum_t *result_rev, + const char *path, + const svn_opt_revision_t *revision, + svn_wc_status_func2_t status_func, + void *status_baton, + svn_boolean_t recurse, + svn_boolean_t get_all, + svn_boolean_t update, + svn_boolean_t no_ignore, + svn_boolean_t ignore_externals, + svn_boolean_t is_external, + svn_boolean_t empty_externals_silent, + svn_client_ctx_t *ctx, + apr_pool_t *pool); + + +/* Perform status operations on each external in TRAVERSAL_INFO. + If EMPTY_EXTERNALS_SILENT is TRUE, then do not invoke + CTX->notify_func2 unless there is a non-empty status, in which case + invoke it exactly once, before the first invocation of STATUS_FUNC. + See svn_client_status3() for more. + + All other options are the same as those passed to svn_client_status(). */ svn_error_t * svn_client__do_external_status (svn_wc_traversal_info_t *traversal_info, svn_wc_status_func2_t status_func, @@ -633,6 +659,7 @@ svn_boolean_t get_all, svn_boolean_t update, svn_boolean_t no_ignore, + svn_boolean_t empty_externals_silent, svn_client_ctx_t *ctx, apr_pool_t *pool); Index: subversion/libsvn_client/status.c =================================================================== --- subversion/libsvn_client/status.c (revision 15608) +++ subversion/libsvn_client/status.c (working copy) @@ -193,23 +193,25 @@ reporter_abort_report }; + -/*** Public Interface. ***/ +/*** Internally shared interface. ***/ - svn_error_t * -svn_client_status2 (svn_revnum_t *result_rev, - const char *path, - const svn_opt_revision_t *revision, - svn_wc_status_func2_t status_func, - void *status_baton, - svn_boolean_t recurse, - svn_boolean_t get_all, - svn_boolean_t update, - svn_boolean_t no_ignore, - svn_boolean_t ignore_externals, - svn_client_ctx_t *ctx, - apr_pool_t *pool) +svn_client__status_helper (svn_revnum_t *result_rev, + const char *path, + const svn_opt_revision_t *revision, + svn_wc_status_func2_t status_func, + void *status_baton, + svn_boolean_t recurse, + svn_boolean_t get_all, + svn_boolean_t update, + svn_boolean_t no_ignore, + svn_boolean_t ignore_externals, + svn_boolean_t is_external, + svn_boolean_t empty_externals_silent, + svn_client_ctx_t *ctx, + apr_pool_t *pool) { svn_wc_adm_access_t *anchor_access, *target_access; svn_wc_traversal_info_t *traversal_info = svn_wc_init_traversal_info (pool); @@ -232,11 +234,16 @@ /* Get the status edit, and use our wrapping status function/baton as the callback pair. */ - SVN_ERR (svn_wc_get_status_editor2 (&editor, &edit_baton, &set_locks_baton, + SVN_ERR (svn_wc_get_status_editor3 (&editor, &edit_baton, &set_locks_baton, &edit_revision, anchor_access, target, ctx->config, recurse, get_all, no_ignore, - tweak_status, &sb, ctx->cancel_func, - ctx->cancel_baton, traversal_info, + (empty_externals_silent + ? is_external + : FALSE), + tweak_status, &sb, + ctx->notify_func2, ctx->notify_baton2, + ctx->cancel_func, ctx->cancel_baton, + traversal_info, pool)); /* If we want to know about out-of-dateness, we crawl the working copy and @@ -357,12 +364,61 @@ if (recurse && (! ignore_externals)) SVN_ERR (svn_client__do_external_status (traversal_info, status_func, status_baton, get_all, update, - no_ignore, ctx, pool)); + no_ignore, + empty_externals_silent, + ctx, pool)); return SVN_NO_ERROR; } + +/*** Public Interface. ***/ + +svn_error_t * +svn_client_status3 (svn_revnum_t *result_rev, + const char *path, + const svn_opt_revision_t *revision, + svn_wc_status_func2_t status_func, + void *status_baton, + svn_boolean_t recurse, + svn_boolean_t get_all, + svn_boolean_t update, + svn_boolean_t no_ignore, + svn_boolean_t ignore_externals, + svn_client_ctx_t *ctx, + apr_pool_t *pool) +{ + return svn_client__status_helper (result_rev, path, revision, + status_func, status_baton, + recurse, get_all, update, no_ignore, + ignore_externals, + FALSE, TRUE, + ctx, pool); +} + +svn_error_t * +svn_client_status2 (svn_revnum_t *result_rev, + const char *path, + const svn_opt_revision_t *revision, + svn_wc_status_func2_t status_func, + void *status_baton, + svn_boolean_t recurse, + svn_boolean_t get_all, + svn_boolean_t update, + svn_boolean_t no_ignore, + svn_boolean_t ignore_externals, + svn_client_ctx_t *ctx, + apr_pool_t *pool) +{ + return svn_client__status_helper (result_rev, path, revision, + status_func, status_baton, + recurse, get_all, update, no_ignore, + ignore_externals, + FALSE, FALSE, + ctx, pool); +} + /* Baton for old_status_func_cb; does what you think it does. */ struct old_status_func_cb_baton { Index: subversion/clients/cmdline/status-cmd.c =================================================================== --- subversion/clients/cmdline/status-cmd.c (revision 15608) +++ subversion/clients/cmdline/status-cmd.c (working copy) @@ -215,7 +215,7 @@ SVN_ERR (print_start_target_xml (svn_path_local_style (target, pool), pool)); - SVN_ERR (svn_client_status2 (&repos_rev, target, &rev, print_status, &sb, + SVN_ERR (svn_client_status3 (&repos_rev, target, &rev, print_status, &sb, opt_state->nonrecursive ? FALSE : TRUE, opt_state->verbose, opt_state->update, Index: subversion/svnversion/main.c =================================================================== --- subversion/svnversion/main.c (revision 15608) +++ subversion/svnversion/main.c (working copy) @@ -289,7 +289,7 @@ rev.kind = svn_opt_revision_unspecified; ctx.config = apr_hash_make (pool); - err = svn_client_status2 (NULL, wc_path, &rev, analyze_status, + err = svn_client_status3 (NULL, wc_path, &rev, analyze_status, &sb, TRUE, TRUE, FALSE, FALSE, TRUE, &ctx, pool); if (err && (err->apr_err == SVN_ERR_CANCELLED)) svn_error_clear (err);