> -----Original Message----- > From: s...@apache.org [mailto:s...@apache.org] > Sent: woensdag 19 december 2012 20:13 > To: comm...@subversion.apache.org > Subject: svn commit: r1424037 - in /subversion/trunk/subversion: > include/svn_cmdline.h libsvn_subr/cmdline.c svn/cl.h svn/svn.c > tests/cmdline/getopt_tests_data/svn_help_log_switch_stdout > tests/cmdline/update_tests.py > > Author: stsp > Date: Wed Dec 19 19:12:43 2012 > New Revision: 1424037 > > URL: http://svn.apache.org/viewvc?rev=1424037&view=rev > Log: > Add a new function to the cmdline library to determine whether standard > input is connected to a terminal device, and set the --non-interactive > option if standard input is not connected to a terminal device. > > The idea is to make 'svn' non-interactive by default if run from scripts > which are launched in some unattended automated fashion. In such a > situation > it is possible for scripts to hang if 'svn' decides to prompt for information > such as login credentials or conflict resolution options. > > Also add a new --force-interactive option which enforces the old behaviour. > > * subversion/include/svn_cmdline.h > (svn_cmdline__stdin_isatty): Declare. > > * subversion/libsvn_subr/cmdline.c: Include io.h on Windows. > (svn_cmdline__stdin_isatty): New. > > * subversion/svn/cl.h > (svn_cl__opt_state_t): Add force_interactive option. > > * subversion/svn/svn.c > (svn_cl__longopt_t): Add opt_force_interactive. > (sub_main): Set the --non-interactive option based on whether stdin is a > tty, > unless interactive mode has been forced with --force-interactive. > Enforce mutual exclusion of --non-interactive and --force-interactive. > > * > subversion/tests/cmdline/getopt_tests_data/svn_help_log_switch_stdout: > Adjust. > > * subversion/tests/cmdline/update_tests.py > (eof_in_interactive_conflict_resolver): Pass --force-interactive to ensure > the interactive conflict resolver will be run as expected. > > Modified: > subversion/trunk/subversion/include/svn_cmdline.h > subversion/trunk/subversion/libsvn_subr/cmdline.c > subversion/trunk/subversion/svn/cl.h > subversion/trunk/subversion/svn/svn.c > > subversion/trunk/subversion/tests/cmdline/getopt_tests_data/svn_help_lo > g_switch_stdout > subversion/trunk/subversion/tests/cmdline/update_tests.py > > Modified: subversion/trunk/subversion/include/svn_cmdline.h > URL: > http://svn.apache.org/viewvc/subversion/trunk/subversion/include/svn_c > mdline.h?rev=1424037&r1=1424036&r2=1424037&view=diff > ========================================================== > ==================== > --- subversion/trunk/subversion/include/svn_cmdline.h (original) > +++ subversion/trunk/subversion/include/svn_cmdline.h Wed Dec 19 > 19:12:43 2012 > @@ -381,6 +381,11 @@ svn_cmdline__getopt_init(apr_getopt_t ** > const char *argv[], > apr_pool_t *pool); > > +/* Determine whether standard input is associated with a terminal. > + * @since New in 1.8. */ > +svn_boolean_t > +svn_cmdline__stdin_isatty(void); > + > #ifdef __cplusplus > } > #endif /* __cplusplus */ > > Modified: subversion/trunk/subversion/libsvn_subr/cmdline.c > URL: > http://svn.apache.org/viewvc/subversion/trunk/subversion/libsvn_subr/cm > dline.c?rev=1424037&r1=1424036&r2=1424037&view=diff > ========================================================== > ==================== > --- subversion/trunk/subversion/libsvn_subr/cmdline.c (original) > +++ subversion/trunk/subversion/libsvn_subr/cmdline.c Wed Dec 19 > 19:12:43 2012 > @@ -33,8 +33,10 @@ > #include <unistd.h> > #else > #include <crtdbg.h> > +#include <io.h> > #endif > > +#include <apr.h> /* for STDIN_FILENO */ > #include <apr_errno.h> /* for apr_strerror */ > #include <apr_general.h> /* for apr_initialize/apr_terminate */ > #include <apr_strings.h> /* for apr_snprintf */ > @@ -923,3 +925,13 @@ svn_cmdline__print_xml_prop_hash(svn_str > > return SVN_NO_ERROR; > } > + > +svn_boolean_t > +svn_cmdline__stdin_isatty(void) > +{ > +#ifdef WIN32 > + return (_isatty(STDIN_FILENO) != 0); > +#else > + return (isatty(STDIN_FILENO) != 0); > +#endif > +} > > Modified: subversion/trunk/subversion/svn/cl.h > URL: > http://svn.apache.org/viewvc/subversion/trunk/subversion/svn/cl.h?rev=1 > 424037&r1=1424036&r2=1424037&view=diff > ========================================================== > ==================== > --- subversion/trunk/subversion/svn/cl.h (original) > +++ subversion/trunk/subversion/svn/cl.h Wed Dec 19 19:12:43 2012 > @@ -238,6 +238,7 @@ typedef struct svn_cl__opt_state_t > svn_boolean_t include_externals; /* Recurses (in)to file & dir externals */ > svn_boolean_t show_inherited_props; /* get inherited properties */ > apr_array_header_t* search_patterns; /* pattern arguments for --search > */ > + svn_boolean_t force_interactive; /* force interactive prompting */ > } svn_cl__opt_state_t; > > > > Modified: subversion/trunk/subversion/svn/svn.c > URL: > http://svn.apache.org/viewvc/subversion/trunk/subversion/svn/svn.c?rev= > 1424037&r1=1424036&r2=1424037&view=diff > ========================================================== > ==================== > --- subversion/trunk/subversion/svn/svn.c (original) > +++ subversion/trunk/subversion/svn/svn.c Wed Dec 19 19:12:43 2012 > @@ -101,6 +101,7 @@ typedef enum svn_cl__longopt_t { > opt_no_ignore, > opt_no_unlock, > opt_non_interactive, > + opt_force_interactive, > opt_old_cmd, > opt_record_only, > opt_relocate, > @@ -230,6 +231,10 @@ const apr_getopt_option_t svn_cl__option > "with '--non-interactive')") }, > {"non-interactive", opt_non_interactive, 0, > N_("do no interactive prompting")}, > + {"force-interactive", opt_force_interactive, 0, > + N_("do interactive prompting even if standard input\n" > + " " > + "is not a terminal device")}, > {"dry-run", opt_dry_run, 0, > N_("try operation but make no changes")}, > {"ignore-ancestry", opt_ignore_ancestry, 0, > @@ -401,7 +406,8 @@ const apr_getopt_option_t svn_cl__option > willy-nilly to every invocation of 'svn') . */ > const int svn_cl__global_options[] = > { opt_auth_username, opt_auth_password, opt_no_auth_cache, > opt_non_interactive, > - opt_trust_server_cert, opt_config_dir, opt_config_options, 0 > + opt_force_interactive, opt_trust_server_cert, opt_config_dir, > + opt_config_options, 0 > }; > > /* Options for giving a log message. (Some of these also have other uses.) > @@ -1982,6 +1988,9 @@ sub_main(int argc, const char *argv[], a > case opt_non_interactive: > opt_state.non_interactive = TRUE; > break; > + case opt_force_interactive: > + opt_state.force_interactive = TRUE; > + break; > case opt_trust_server_cert: > opt_state.trust_server_cert = TRUE; > break; > @@ -2191,6 +2200,21 @@ sub_main(int argc, const char *argv[], a > } > } > > + /* The --non-interactive and --force-interactive options are mutually > + * exclusive. */ > + if (opt_state.non_interactive && opt_state.force_interactive) > + { > + err = svn_error_create(SVN_ERR_CL_ARG_PARSING_ERROR, NULL, > + _("--non-interactive and --force-interactive " > + "are mutually exclusive")); > + return EXIT_ERROR(err); > + } > + > + /* If stdin is not a terminal and --force-interactive was not passed, > + * set --non-interactive. */ > + if (!opt_state.force_interactive) > + opt_state.non_interactive = !svn_cmdline__stdin_isatty(); > +
This will disable checking for --non-interactive when stdin is not rerouted, or (if the arguments are parsed later) the check for both force and force not is to high up in this function. Bert