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 -- b...@moolenaar.net -- 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 vim_dev+unsubscr...@googlegroups.com.
For more options, visit https://groups.google.com/d/optout.

Raspunde prin e-mail lui