diff options
author | Bram Moolenaar <Bram@vim.org> | 2016-03-03 18:09:10 +0100 |
---|---|---|
committer | Bram Moolenaar <Bram@vim.org> | 2016-03-03 18:09:10 +0100 |
commit | da94fdf2588b3910d38e477a755748ce2c6d2e66 (patch) | |
tree | 0b754f63290ce625420af880f4deda0616acb566 | |
parent | 9f7820f83bc994bbbecdca9483b355953f07179b (diff) |
patch 7.4.1482v7.4.1482
Problem: "timeout" option not supported on ch_send*() and ch_eval*().
Solution: Get and use the timeout option from the argument.
-rw-r--r-- | src/eval.c | 41 | ||||
-rw-r--r-- | src/testdir/test_channel.vim | 4 | ||||
-rw-r--r-- | src/version.c | 2 |
3 files changed, 28 insertions, 19 deletions
diff --git a/src/eval.c b/src/eval.c index faed315e6b..716706855c 100644 --- a/src/eval.c +++ b/src/eval.c @@ -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); } } diff --git a/src/testdir/test_channel.vim b/src/testdir/test_channel.vim index 77949945fb..2b46566b76 100644 --- 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) diff --git a/src/version.c b/src/version.c index b7e0890f99..90c4ba7885 100644 --- 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, |