Patch 8.1.0087
Problem: v:shell_error is always zero when using terminal for "!cmd".
Solution: Use "exitval" of terminal-job. (Ozaki Kiichi, closes #2994)
Files: src/os_unix.c, src/os_win32.c, src/proto/terminal.pro,
src/terminal.c, src/testdir/test_terminal.vim
*** ../vim-8.1.0086/src/os_unix.c 2018-06-13 20:49:47.444338292 +0200
--- src/os_unix.c 2018-06-19 19:53:43.794232600 +0200
***************
*** 4365,4370 ****
--- 4365,4371 ----
char_u *tofree2 = NULL;
int retval = -1;
buf_T *buf;
+ job_T *job;
aco_save_T aco;
oparg_T oa; /* operator arguments */
***************
*** 4374,4379 ****
--- 4375,4385 ----
init_job_options(&opt);
ch_log(NULL, "starting terminal for system command '%s'", cmd);
buf = term_start(NULL, argv, &opt, TERM_START_SYSTEM);
+ if (buf == NULL)
+ goto theend;
+
+ job = term_getjob(buf->b_term);
+ ++job->jv_refcount;
/* Find a window to make "buf" curbuf. */
aucmd_prepbuf(&aco, buf);
***************
*** 4391,4399 ****
else
normal_cmd(&oa, TRUE);
}
! retval = 0;
ch_log(NULL, "system command finished");
/* restore curwin/curbuf and a few other things */
aucmd_restbuf(&aco);
--- 4397,4407 ----
else
normal_cmd(&oa, TRUE);
}
! retval = job->jv_exitval;
ch_log(NULL, "system command finished");
+ job_unref(job);
+
/* restore curwin/curbuf and a few other things */
aucmd_restbuf(&aco);
*** ../vim-8.1.0086/src/os_win32.c 2018-06-12 21:11:08.626548598 +0200
--- src/os_win32.c 2018-06-19 19:53:43.798232583 +0200
***************
*** 4796,4801 ****
--- 4796,4802 ----
long_u cmdlen;
int retval = -1;
buf_T *buf;
+ job_T *job;
aco_save_T aco;
oparg_T oa; /* operator arguments */
***************
*** 4826,4831 ****
--- 4827,4835 ----
if (buf == NULL)
return 255;
+ job = term_getjob(buf->b_term);
+ ++job->jv_refcount;
+
/* Find a window to make "buf" curbuf. */
aucmd_prepbuf(&aco, buf);
***************
*** 4842,4850 ****
else
normal_cmd(&oa, TRUE);
}
! retval = 0;
ch_log(NULL, "system command finished");
/* restore curwin/curbuf and a few other things */
aucmd_restbuf(&aco);
--- 4846,4856 ----
else
normal_cmd(&oa, TRUE);
}
! retval = job->jv_exitval;
ch_log(NULL, "system command finished");
+ job_unref(job);
+
/* restore curwin/curbuf and a few other things */
aucmd_restbuf(&aco);
*** ../vim-8.1.0086/src/proto/terminal.pro 2018-05-17 13:52:53.000000000
+0200
--- src/proto/terminal.pro 2018-06-19 19:53:43.798232583 +0200
***************
*** 55,59 ****
--- 55,60 ----
void f_term_start(typval_T *argvars, typval_T *rettv);
void f_term_wait(typval_T *argvars, typval_T *rettv);
void term_send_eof(channel_T *ch);
+ job_T *term_getjob(term_T *term);
int terminal_enabled(void);
/* vim: set ft=c : */
*** ../vim-8.1.0086/src/terminal.c 2018-06-18 22:15:46.255521457 +0200
--- src/terminal.c 2018-06-19 19:53:43.798232583 +0200
***************
*** 5336,5341 ****
--- 5336,5347 ----
}
}
+ job_T *
+ term_getjob(term_T *term)
+ {
+ return term != NULL ? term->tl_job : NULL;
+ }
+
# if defined(WIN3264) || defined(PROTO)
/**************************************
*** ../vim-8.1.0086/src/testdir/test_terminal.vim 2018-06-12
18:04:28.038267855 +0200
--- src/testdir/test_terminal.vim 2018-06-19 19:55:56.917638761 +0200
***************
*** 522,550 ****
exe buf . 'bwipe'
endfunc
- " must be last, we can't go back from GUI to terminal
- func Test_zz_terminal_in_gui()
- if !CanRunGui()
- return
- endif
-
- " Ignore the "failed to create input context" error.
- call test_ignore_error('E285:')
-
- gui -f
-
- call assert_equal(1, winnr('$'))
- let buf = Run_shell_in_terminal({'term_finish': 'close'})
- call Stop_shell_in_terminal(buf)
- call term_wait(buf)
-
- " closing window wipes out the terminal buffer a with finished job
- call WaitForAssert({-> assert_equal(1, winnr('$'))})
- call assert_equal("", bufname(buf))
-
- unlet g:job
- endfunc
-
func Test_terminal_list_args()
let buf = term_start([&shell, &shellcmdflag, 'echo "123"'])
call assert_fails(buf . 'bwipe', 'E517')
--- 522,527 ----
***************
*** 1546,1548 ****
--- 1523,1580 ----
exe buf . 'bwipe!'
endfunc
+
+ " must be nearly the last, we can't go back from GUI to terminal
+ func Test_zz1_terminal_in_gui()
+ if !CanRunGui()
+ return
+ endif
+
+ " Ignore the "failed to create input context" error.
+ call test_ignore_error('E285:')
+
+ gui -f
+
+ call assert_equal(1, winnr('$'))
+ let buf = Run_shell_in_terminal({'term_finish': 'close'})
+ call Stop_shell_in_terminal(buf)
+ call term_wait(buf)
+
+ " closing window wipes out the terminal buffer a with finished job
+ call WaitForAssert({-> assert_equal(1, winnr('$'))})
+ call assert_equal("", bufname(buf))
+
+ unlet g:job
+ endfunc
+
+ func Test_zz2_terminal_guioptions_bang()
+ if !has('gui_running')
+ return
+ endif
+ set guioptions+=!
+
+ let filename = 'Xtestscript'
+ if has('win32')
+ let filename .= '.bat'
+ let prefix = ''
+ let contents = ['@echo off', 'exit %1']
+ else
+ let filename .= '.sh'
+ let prefix = './'
+ let contents = ['#!/bin/sh', 'exit $1']
+ endif
+ call writefile(contents, filename)
+ call setfperm(filename, 'rwxrwx---')
+
+ " Check if v:shell_error is equal to the exit status.
+ let exitval = 0
+ execute printf(':!%s%s %d', prefix, filename, exitval)
+ call assert_equal(exitval, v:shell_error)
+
+ let exitval = 9
+ execute printf(':!%s%s %d', prefix, filename, exitval)
+ call assert_equal(exitval, v:shell_error)
+
+ set guioptions&
+ call delete(filename)
+ endfunc
*** ../vim-8.1.0086/src/version.c 2018-06-19 19:46:01.703936337 +0200
--- src/version.c 2018-06-19 19:50:34.551011945 +0200
***************
*** 763,764 ****
--- 763,766 ----
{ /* Add new patch number below this line */
+ /**/
+ 87,
/**/
--
>From "know your smileys":
:-) Funny
|-) Funny Oriental
(-: Funny Australian
/// Bram Moolenaar -- [email protected] -- http://www.Moolenaar.net \\\
/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\
\\\ an exciting new programming language -- http://www.Zimbu.org ///
\\\ help me help AIDS victims -- http://ICCF-Holland.org ///
--
--
You received this message from the "vim_dev" maillist.
Do not top-post! Type your reply below the text you are replying to.
For more information, visit http://www.vim.org/maillist.php
---
You received this message because you are subscribed to the Google Groups
"vim_dev" group.
To unsubscribe from this group and stop receiving emails from it, send an email
to [email protected].
For more options, visit https://groups.google.com/d/optout.