Hi Everyone, I thought I would use this thread to solicit a few opinions about threads like this one and the Patch Manager's role with them.
In a previous thread Hyrum noted that because the discussion was between full-committers there wasn't necessarily a role for the PM to play within the scope of that topic / thread. I.e. there is a discussion happening about development work - perhaps there is even a patch submission (or commit) being discussed on list by developers who have commit privileges. So it would seem sensible that I shouldn't "bother" to keep a watch on this specific one either. But is it so clear-cut? Should I only advocate submissions by non-committers, or is it appropriate, if I note a discussion missing a conclusion to bring that back to the lists attention, too? I don't mind either way - though my job (while not particularly demanding in the first place), would be "easier" if I simply ignored threads where the "mantle" was taken up by full-committers. I'm happy to do the work - but at the same time I'm mindful of creating unnecessary noise on the list. Gavin "Beau" Baumanis On 10/11/2010, at 9:21 PM, Julian Foad wrote: > On Wed, 2010-11-10, [email protected] wrote: >> Author: cmpilato >> Date: Wed Nov 10 01:44:35 2010 >> New Revision: 1033320 >> >> URL: http://svn.apache.org/viewvc?rev=1033320&view=rev >> Log: >> Fix issue #3622 ("svn should exit with exit code 1 if updating >> externals fails"). >> >> * subversion/include/svn_error_codes.h >> (SVN_ERR_CL_ERROR_PROCESSING_EXTERNALS): New error code. >> >> * subversion/svn/cl.h >> (struct svn_cl__check_externals_failed_notify_baton): New baton. >> (svn_cl__check_externals_failed_notify_wrapper): New function. >> >> * subversion/svn/notify.c >> (svn_cl__check_externals_failed_notify_wrapper): New function. >> >> * subversion/svn/update-cmd.c >> (svn_cl__update): Use the new wrapper baton and function to track >> externals processing failures, and return an error after all else >> is finished if such failures occured. >> >> * subversion/svn/export-cmd.c >> (svn_cl__export): Use the new wrapper baton and function to track >> externals processing failures, and return an error after all else >> is finished if such failures occured. >> >> * subversion/svn/switch-cmd.c >> (svn_cl__switch): Use the new wrapper baton and function to track >> externals processing failures, and return an error after all else >> is finished if such failures occured. >> >> * subversion/tests/cmdline/externals_tests.py >> (old_style_externals_ignore_peg_reg, >> can_place_file_external_into_dir_external): Change expected exit code. > > Hi Mike. Useful fix. > > I see that as well as reporting errors in externals, svn_wc_notify_t can > also report errors in locking: > > /** Points to an error describing the reason for the failure when @c > * action is one of the following: #svn_wc_notify_failed_lock, > * #svn_wc_notify_failed_unlock, #svn_wc_notify_failed_external. > * Is @c NULL otherwise. */ > svn_error_t *err; > > Without investigating further, it seems to me that we will want to do > something similar for locking errors too. With this in mind, it might > be worth generalizing the wrapper stuff to "had an error" rather than > "had an externals error". (It can check nb->err != SVN_NO_ERROR rather > than nb->status==...) > > > I'm wondering about the wrapper function approach - did you feel it's > important to separate this error detection from the notification > function? I wonder if it would be simpler overall to get svn's existing > notifier code to track the presence of errors for you, instead. The > basic approach would be: add the flag > > svn_boolean_t had_error; > > to the private "struct notify_baton"; add a getter such as > > svn_boolean_t svn_cl__notifier_had_error(void *baton); > > that gets this flag; and make notify() do > > if (n->err) > nb->had_error = TRUE; > > Then the various subcommands would only need to call this function to > read the "had_error" indication. What do you think? > > >> Modified: subversion/trunk/subversion/include/svn_error_codes.h >> ============================================================================== >> --- subversion/trunk/subversion/include/svn_error_codes.h (original) >> +++ subversion/trunk/subversion/include/svn_error_codes.h Wed Nov 10 >> 01:44:35 2010 >> @@ -1391,6 +1391,10 @@ SVN_ERROR_START >> SVN_ERR_CL_CATEGORY_START + 10, >> "No external merge tool available") >> >> + SVN_ERRDEF(SVN_ERR_CL_ERROR_PROCESSING_EXTERNALS, >> + SVN_ERR_CL_CATEGORY_START + 11, >> + "Failed processing one or more externals definitions") >> + >> /* malfunctions such as assertion failures */ >> >> SVN_ERRDEF(SVN_ERR_ASSERTION_FAIL, >> >> Modified: subversion/trunk/subversion/svn/cl.h >> ============================================================================== >> --- subversion/trunk/subversion/svn/cl.h (original) >> +++ subversion/trunk/subversion/svn/cl.h Wed Nov 10 01:44:35 2010 >> @@ -569,6 +569,21 @@ svn_cl__notifier_mark_checkout(void *bat >> svn_error_t * >> svn_cl__notifier_mark_export(void *baton); >> >> +/* Baton for use with svn_cl__check_externals_failed_notify_wrapper(). */ >> +struct svn_cl__check_externals_failed_notify_baton >> +{ >> + void *wrapped_baton; /* The "real" notify_func2. */ >> + svn_wc_notify_func2_t wrapped_func; /* The "real" notify_func2 baton. */ > > Those two are swapped relative to their comments. > >> + svn_boolean_t had_externals_error; /* Did something fail in an external? >> */ >> +}; >> + >> +/* Notification function wrapper (implements `svn_wc_notify_func2_t'). >> + Use with an svn_cl__check_externals_failed_notify_baton BATON. */ >> +void >> +svn_cl__check_externals_failed_notify_wrapper(void *baton, >> + const svn_wc_notify_t *n, >> + apr_pool_t *pool); >> + >> /* Print conflict stats accumulated in NOTIFY_BATON. >> * Return any error encountered during printing. >> * Do all allocations in POOL.*/ >> >> Modified: subversion/trunk/subversion/svn/export-cmd.c >> ============================================================================== >> --- subversion/trunk/subversion/svn/export-cmd.c (original) >> +++ subversion/trunk/subversion/svn/export-cmd.c Wed Nov 10 01:44:35 2010 >> @@ -52,6 +52,7 @@ svn_cl__export(apr_getopt_t *os, >> svn_error_t *err; >> svn_opt_revision_t peg_revision; >> const char *truefrom; >> + struct svn_cl__check_externals_failed_notify_baton nwb; >> >> SVN_ERR(svn_cl__args_to_target_array_print_reserved(&targets, os, >> opt_state->targets, >> @@ -95,6 +96,12 @@ svn_cl__export(apr_getopt_t *os, >> if (opt_state->depth == svn_depth_unknown) >> opt_state->depth = svn_depth_infinity; >> >> + nwb.wrapped_func = ctx->notify_func2; >> + nwb.wrapped_baton = ctx->notify_baton2; >> + nwb.had_externals_error = FALSE; >> + ctx->notify_func2 = svn_cl__check_externals_failed_notify_wrapper; >> + ctx->notify_baton2 = &nwb; >> + >> /* Do the export. */ >> err = svn_client_export5(NULL, truefrom, to, &peg_revision, >> &(opt_state->start_revision), >> @@ -106,5 +113,10 @@ svn_cl__export(apr_getopt_t *os, >> _("Destination directory exists; please remove " >> "the directory or use --force to overwrite")); >> >> + if (nwb.had_externals_error) >> + return svn_error_create(SVN_ERR_CL_ERROR_PROCESSING_EXTERNALS, NULL, >> + _("Failure occured processing one or more " >> + "externals definitions")); >> + >> return svn_error_return(err); >> } >> >> Modified: subversion/trunk/subversion/svn/notify.c >> ============================================================================== >> --- subversion/trunk/subversion/svn/notify.c (original) >> +++ subversion/trunk/subversion/svn/notify.c Wed Nov 10 01:44:35 2010 >> @@ -952,3 +952,18 @@ svn_cl__notifier_mark_export(void *baton >> nb->is_export = TRUE; >> return SVN_NO_ERROR; >> } >> + >> +void >> +svn_cl__check_externals_failed_notify_wrapper(void *baton, >> + const svn_wc_notify_t *n, >> + apr_pool_t *pool) >> +{ >> + struct svn_cl__check_externals_failed_notify_baton *nwb = baton; >> + >> + if (n->action == svn_wc_notify_failed_external) >> + nwb->had_externals_error = TRUE; >> + >> + if (nwb->wrapped_func) >> + nwb->wrapped_func(nwb->wrapped_baton, n, pool); >> +} > > All the rest looks fine. > > - Julian > > >

