You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@subversion.apache.org by Bert Huijben <be...@qqmail.nl> on 2012/12/19 20:18:44 UTC

RE: 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


> -----Original Message-----
> From: stsp@apache.org [mailto:stsp@apache.org]
> Sent: woensdag 19 december 2012 20:13
> To: commits@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 



Re: 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

Posted by Stefan Sperling <st...@elego.de>.
On Wed, Dec 19, 2012 at 08:18:44PM +0100, Bert Huijben wrote:
> > +  /* 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 
> 

Thanks, fixed in r1424052.

Re: 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

Posted by Stefan Sperling <st...@elego.de>.
On Wed, Dec 19, 2012 at 08:18:44PM +0100, Bert Huijben wrote:
> > +  /* 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 
> 

Thanks, fixed in r1424052.