]> granicus.if.org Git - vim/commitdiff
patch 7.4.1482 v7.4.1482
authorBram Moolenaar <Bram@vim.org>
Thu, 3 Mar 2016 17:09:10 +0000 (18:09 +0100)
committerBram Moolenaar <Bram@vim.org>
Thu, 3 Mar 2016 17:09:10 +0000 (18:09 +0100)
Problem:    "timeout" option not supported on ch_send*() and ch_eval*().
Solution:   Get and use the timeout option from the argument.

src/eval.c
src/testdir/test_channel.vim
src/version.c

index faed315e6b87ca90214d8125843c0089ac7811ae..716706855cfecfaa66895f697bb5d96cb510b72e 100644 (file)
@@ -10518,15 +10518,15 @@ f_ch_readraw(typval_T *argvars, typval_T *rettv)
  */
     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_T *rettv, int eval)
     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_T *rettv, int eval)
     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_T *rettv, int eval)
     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_T *rettv, int eval)
     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);
     }
 }
index 77949945fb5a4d913f32d6e29847c0018a6eb939..2b46566b7641bbe86109d71c6f4b7bfef2babdfb 100644 (file)
@@ -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)
index b7e0890f99e84c28827884dc714d0b6d0d1b8516..90c4ba7885b1f7c42b0607df2f0ef64ab68933da 100644 (file)
@@ -743,6 +743,8 @@ static char *(features[]) =
 
 static int included_patches[] =
 {   /* Add new patch number below this line */
+/**/
+    1482,
 /**/
     1481,
 /**/