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, {