changeset 8380:892d7dcf17ec v7.4.1482

commit https://github.com/vim/vim/commit/da94fdf2588b3910d38e477a755748ce2c6d2e66 Author: Bram Moolenaar <Bram@vim.org> Date: Thu Mar 3 18:09:10 2016 +0100 patch 7.4.1482 Problem: "timeout" option not supported on ch_send*() and ch_eval*(). Solution: Get and use the timeout option from the argument.
author Christian Brabandt <cb@256bit.org>
date Thu, 03 Mar 2016 18:15:05 +0100
parents c63196126179
children 74475e3eed32
files src/eval.c src/testdir/test_channel.vim src/version.c
diffstat 3 files changed, 28 insertions(+), 19 deletions(-) [+]
line wrap: on
line diff
--- a/src/eval.c
+++ b/src/eval.c
@@ -10518,15 +10518,15 @@ f_ch_readraw(typval_T *argvars, typval_T
  */
     static channel_T *
 send_common(
-	typval_T *argvars,
-	char_u *text,
-	int id,
-	int eval,
-	char *fun,
-	int *part_read)
+	typval_T    *argvars,
+	char_u	    *text,
+	int	    id,
+	int	    eval,
+	jobopt_T    *opt,
+	char	    *fun,
+	int	    *part_read)
 {
     channel_T	*channel;
-    jobopt_T	opt;
     int		part_send;
 
     channel = get_channel_arg(&argvars[0]);
@@ -10535,25 +10535,25 @@ send_common(
     part_send = channel_part_send(channel);
     *part_read = channel_part_read(channel);
 
-    clear_job_options(&opt);
-    if (get_job_options(&argvars[2], &opt, JO_CALLBACK) == FAIL)
+    clear_job_options(opt);
+    if (get_job_options(&argvars[2], opt, JO_CALLBACK + JO_TIMEOUT) == FAIL)
 	return NULL;
 
     /* Set the callback. An empty callback means no callback and not reading
      * the response. With "ch_evalexpr()" and "ch_evalraw()" a callback is not
      * allowed. */
-    if (opt.jo_callback != NULL && *opt.jo_callback != NUL)
+    if (opt->jo_callback != NULL && *opt->jo_callback != NUL)
     {
 	if (eval)
 	{
 	    EMSG2(_("E917: Cannot use a callback with %s()"), fun);
 	    return NULL;
 	}
-	channel_set_req_callback(channel, part_send, opt.jo_callback, id);
+	channel_set_req_callback(channel, part_send, opt->jo_callback, id);
     }
 
     if (channel_send(channel, part_send, text, fun) == OK
-						   && opt.jo_callback == NULL)
+						  && opt->jo_callback == NULL)
 	return channel;
     return NULL;
 }
@@ -10571,6 +10571,7 @@ ch_expr_common(typval_T *argvars, typval
     ch_mode_T	ch_mode;
     int		part_send;
     int		part_read;
+    jobopt_T    opt;
     int		timeout;
 
     /* return an empty string by default */
@@ -10595,12 +10596,15 @@ ch_expr_common(typval_T *argvars, typval
     if (text == NULL)
 	return;
 
-    channel = send_common(argvars, text, id, eval,
+    channel = send_common(argvars, text, id, eval, &opt,
 			    eval ? "ch_evalexpr" : "ch_sendexpr", &part_read);
     vim_free(text);
     if (channel != NULL && eval)
     {
-	/* TODO: timeout from options */
+	if (opt.jo_set & JO_TIMEOUT)
+	    timeout = opt.jo_timeout;
+	else
+	    timeout = channel_get_timeout(channel, part_read);
 	timeout = channel_get_timeout(channel, part_read);
 	if (channel_read_json_block(channel, part_read, timeout, id, &listtv)
 									== OK)
@@ -10644,6 +10648,7 @@ ch_raw_common(typval_T *argvars, typval_
     char_u	*text;
     channel_T	*channel;
     int		part_read;
+    jobopt_T    opt;
     int		timeout;
 
     /* return an empty string by default */
@@ -10651,12 +10656,14 @@ ch_raw_common(typval_T *argvars, typval_
     rettv->vval.v_string = NULL;
 
     text = get_tv_string_buf(&argvars[1], buf);
-    channel = send_common(argvars, text, 0, eval,
+    channel = send_common(argvars, text, 0, eval, &opt,
 			      eval ? "ch_evalraw" : "ch_sendraw", &part_read);
     if (channel != NULL && eval)
     {
-	/* TODO: timeout from options */
-	timeout = channel_get_timeout(channel, part_read);
+	if (opt.jo_set & JO_TIMEOUT)
+	    timeout = opt.jo_timeout;
+	else
+	    timeout = channel_get_timeout(channel, part_read);
 	rettv->vval.v_string = channel_read_block(channel, part_read, timeout);
     }
 }
--- a/src/testdir/test_channel.vim
+++ b/src/testdir/test_channel.vim
@@ -120,7 +120,7 @@ func s:communicate(port)
   call assert_equal('added1', getline(line('$') - 1))
   call assert_equal('added2', getline('$'))
 
-  call assert_equal('ok', ch_evalexpr(handle, 'do normal'))
+  call assert_equal('ok', ch_evalexpr(handle, 'do normal', {'timeout': 100}))
   sleep 10m
   call assert_equal('added more', getline('$'))
 
@@ -342,7 +342,7 @@ func Test_raw_pipe()
     let msg = ch_readraw(handle)
     call assert_equal("this\nAND this\n", substitute(msg, "\r", "", 'g'))
 
-    let reply = ch_evalraw(handle, "quit\n")
+    let reply = ch_evalraw(handle, "quit\n", {'timeout': 100})
     call assert_equal("Goodbye!\n", substitute(reply, "\r", "", 'g'))
   finally
     call job_stop(job)
--- a/src/version.c
+++ b/src/version.c
@@ -744,6 +744,8 @@ static char *(features[]) =
 static int included_patches[] =
 {   /* Add new patch number below this line */
 /**/
+    1482,
+/**/
     1481,
 /**/
     1480,