[svn.haxx.se] · SVN Dev · SVN Users · SVN Org · TSVN Dev · TSVN Users · Subclipse Dev · Subclipse Users · this month's index

Re: svn commit: r1422706 - in /subversion/trunk/subversion: libsvn_subr/opt.c tests/cmdline/svntest/main.py

From: Stefan Sperling <stsp_at_elego.de>
Date: Tue, 18 Dec 2012 10:45:41 +0100

On Mon, Dec 17, 2012 at 09:39:49PM +0100, Stefan Sperling wrote:
> The simple patch below implements it with the isatty() on *nix and
> _isatty() on Windows (untested -- thanks for the hint Bert!).

Updated version that adds --force-interactive for users who require
the previous behaviour for whatever purposes.

[[[
Add a new function to the cmdline library to determine whether standard
input is connected to a terminal device. Set the --non-interactive flag
by default if standard input is not a terminal device.
Add a new --force-interactive option to force previous 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.
]]]

Index: subversion/include/svn_cmdline.h
===================================================================
--- subversion/include/svn_cmdline.h (revision 1423113)
+++ subversion/include/svn_cmdline.h (working copy)
@@ -381,6 +381,11 @@ svn_cmdline__getopt_init(apr_getopt_t **os,
                          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 */
Index: subversion/libsvn_subr/cmdline.c
===================================================================
--- subversion/libsvn_subr/cmdline.c (revision 1423113)
+++ subversion/libsvn_subr/cmdline.c (working copy)
@@ -33,6 +33,7 @@
 #include <unistd.h>
 #else
 #include <crtdbg.h>
+#include <io.h>
 #endif
 
 #include <apr_errno.h> /* for apr_strerror */
@@ -923,3 +924,13 @@ svn_cmdline__print_xml_prop_hash(svn_stringbuf_t *
 
     return SVN_NO_ERROR;
 }
+
+svn_boolean_t
+svn_cmdline__stdin_isatty(void)
+{
+#ifdef WIN32
+ return (_isatty(0) != 0);
+#else
+ return (isatty(STDIN_FILENO) != 0);
+#endif
+}
Index: subversion/svn/cl.h
===================================================================
--- subversion/svn/cl.h (revision 1423113)
+++ subversion/svn/cl.h (working copy)
@@ -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;
 
 
Index: subversion/svn/svn.c
===================================================================
--- subversion/svn/svn.c (revision 1423113)
+++ subversion/svn/svn.c (working copy)
@@ -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__options[] =
                        "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__options[] =
    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[], apr_pool_t
       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[], apr_pool_t
       }
     }
 
+ /* 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));
 
Received on 2012-12-18 10:46:43 CET

This is an archived mail posted to the Subversion Dev mailing list.