char_u *tofree2 = NULL;
int retval = -1;
buf_T *buf;
+ job_T *job;
aco_save_T aco;
oparg_T oa; /* operator arguments */
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);
else
normal_cmd(&oa, TRUE);
}
- retval = 0;
+ retval = job->jv_exitval;
ch_log(NULL, "system command finished");
+ job_unref(job);
+
/* restore curwin/curbuf and a few other things */
aucmd_restbuf(&aco);
long_u cmdlen;
int retval = -1;
buf_T *buf;
+ job_T *job;
aco_save_T aco;
oparg_T oa; /* operator arguments */
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);
else
normal_cmd(&oa, TRUE);
}
- retval = 0;
+ retval = job->jv_exitval;
ch_log(NULL, "system command finished");
+ job_unref(job);
+
/* restore curwin/curbuf and a few other things */
aucmd_restbuf(&aco);
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')
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