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_log_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_cmdline.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/cmdline.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=1424037&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();
+
   /* Turn our hash of changelists into an array of unique ones. */
   SVN_INT_ERR(svn_hash_keys(&(opt_state.changelists), changelists, pool));
 

Modified: 
subversion/trunk/subversion/tests/cmdline/getopt_tests_data/svn_help_log_switch_stdout
URL: 
http://svn.apache.org/viewvc/subversion/trunk/subversion/tests/cmdline/getopt_tests_data/svn_help_log_switch_stdout?rev=1424037&r1=1424036&r2=1424037&view=diff
==============================================================================
--- 
subversion/trunk/subversion/tests/cmdline/getopt_tests_data/svn_help_log_switch_stdout
 (original)
+++ 
subversion/trunk/subversion/tests/cmdline/getopt_tests_data/svn_help_log_switch_stdout
 Wed Dec 19 19:12:43 2012
@@ -117,6 +117,8 @@ Global options:
   --password ARG           : specify a password ARG
   --no-auth-cache          : do not cache authentication tokens
   --non-interactive        : do no interactive prompting
+  --force-interactive      : do interactive prompting even if standard input
+                             is not a terminal device
   --trust-server-cert      : accept SSL server certificates from unknown
                              certificate authorities without prompting (but 
only
                              with '--non-interactive')
@@ -197,6 +199,8 @@ Global options:
   --password ARG           : specify a password ARG
   --no-auth-cache          : do not cache authentication tokens
   --non-interactive        : do no interactive prompting
+  --force-interactive      : do interactive prompting even if standard input
+                             is not a terminal device
   --trust-server-cert      : accept SSL server certificates from unknown
                              certificate authorities without prompting (but 
only
                              with '--non-interactive')

Modified: subversion/trunk/subversion/tests/cmdline/update_tests.py
URL: 
http://svn.apache.org/viewvc/subversion/trunk/subversion/tests/cmdline/update_tests.py?rev=1424037&r1=1424036&r2=1424037&view=diff
==============================================================================
--- subversion/trunk/subversion/tests/cmdline/update_tests.py (original)
+++ subversion/trunk/subversion/tests/cmdline/update_tests.py Wed Dec 19 
19:12:43 2012
@@ -4108,7 +4108,8 @@ interactive-conflicts = true
   svntest.actions.run_and_verify_update(wc_dir, None, None, None,
                                         "Can't read stdin: End of file found",
                                         None, None, None, None, 1,
-                                        wc_dir, '--config-dir', config_dir)
+                                        wc_dir, '--force-interactive',
+                                        '--config-dir', config_dir)
 
   # Now update -r1 again.  Hopefully we don't get a checksum error!
   expected_output = svntest.wc.State(wc_dir, {


Reply via email to