]> granicus.if.org Git - vim/commitdiff
patch 8.1.2092: MS-Windows: redirect in system() does not work v8.1.2092
authorBram Moolenaar <Bram@vim.org>
Sat, 28 Sep 2019 13:51:37 +0000 (15:51 +0200)
committerBram Moolenaar <Bram@vim.org>
Sat, 28 Sep 2019 13:51:37 +0000 (15:51 +0200)
Problem:    MS-Windows: redirect in system() does not work.
Solution:   Handle 'shellxescape' and 'shellxquote' better. (Yasuhiro
            Matsumoto, closes #2054)

src/ex_cmds.c
src/misc2.c
src/testdir/test_system.vim
src/version.c

index 6ae5969a077d28b18aa3ca19d214bb2b506ea92a..9d58ab41a5f7378bd7dd0a47983f6c51c39f07b8 100644 (file)
@@ -1762,12 +1762,21 @@ make_filter_cmd(
        STRCAT(buf, itmp);
     }
 #else
-    /*
-     * For shells that don't understand braces around commands, at least allow
-     * the use of commands in a pipe.
-     */
-    STRCPY(buf, cmd);
-    if (itmp != NULL)
+    // For shells that don't understand braces around commands, at least allow
+    // the use of commands in a pipe.
+    if (*p_sxe != NUL && *p_sxq == '(')
+    {
+       if (itmp != NULL || otmp != NULL)
+           vim_snprintf((char *)buf, len, "(%s)", (char *)cmd);
+       else
+           STRCPY(buf, cmd);
+       if (itmp != NULL)
+       {
+           STRCAT(buf, " < ");
+           STRCAT(buf, itmp);
+       }
+    }
+    else
     {
        char_u  *p;
 
@@ -1819,18 +1828,20 @@ append_redir(
     char_u     *end;
 
     end = buf + STRLEN(buf);
-    /* find "%s" */
+    // find "%s"
     for (p = opt; (p = vim_strchr(p, '%')) != NULL; ++p)
     {
-       if (p[1] == 's') /* found %s */
+       if (p[1] == 's') // found %s
            break;
-       if (p[1] == '%') /* skip %% */
+       if (p[1] == '%') // skip %%
            ++p;
     }
     if (p != NULL)
     {
-       *end = ' '; /* not really needed? Not with sh, ksh or bash */
-       vim_snprintf((char *)end + 1, (size_t)(buflen - (end + 1 - buf)),
+#ifdef MSWIN
+       *end++ = ' '; // not really needed? Not with sh, ksh or bash
+#endif
+       vim_snprintf((char *)end, (size_t)(buflen - (end - buf)),
                                                  (char *)opt, (char *)fname);
     }
     else
@@ -1838,7 +1849,7 @@ append_redir(
 #ifdef FEAT_QUICKFIX
                " %s %s",
 #else
-               " %s%s",        /* " > %s" causes problems on Amiga */
+               " %s%s",        // " > %s" causes problems on Amiga
 #endif
                (char *)opt, (char *)fname);
 }
index f4da4c2d5bc3216dcbb2db02ea3c790e50397bb2..da274e6036853f7e43afb12bd86bb700754fe0a6 100644 (file)
@@ -3157,7 +3157,7 @@ call_shell(char_u *cmd, int opt)
        {
            char_u *ecmd = cmd;
 
-           if (*p_sxe != NUL && STRCMP(p_sxq, "(") == 0)
+           if (*p_sxe != NUL && *p_sxq == '(')
            {
                ecmd = vim_strsave_escaped_ext(cmd, p_sxe, '^', FALSE);
                if (ecmd == NULL)
@@ -3168,11 +3168,11 @@ call_shell(char_u *cmd, int opt)
            {
                STRCPY(ncmd, p_sxq);
                STRCAT(ncmd, ecmd);
-               /* When 'shellxquote' is ( append ).
-                * When 'shellxquote' is "( append )". */
-               STRCAT(ncmd, STRCMP(p_sxq, "(") == 0 ? (char_u *)")"
-                          : STRCMP(p_sxq, "\"(") == 0 ? (char_u *)")\""
-                          : p_sxq);
+               // When 'shellxquote' is ( append ).
+               // When 'shellxquote' is "( append )".
+               STRCAT(ncmd, *p_sxq == '(' ? (char_u *)")"
+                   : *p_sxq == '"' && *(p_sxq+1) == '(' ? (char_u *)")\""
+                   : p_sxq);
                retval = mch_call_shell(ncmd, opt);
                vim_free(ncmd);
            }
index deee51fa1ce1a70953f51640401153ec54dbea6e..22aceb707874995f62a5365315c1cdd0d71d9a2f 100644 (file)
@@ -3,9 +3,24 @@
 source shared.vim
 
 func Test_System()
-  if !executable('echo') || !executable('cat') || !executable('wc')
+  if !has('win32')
+    call assert_equal("123\n", system('echo 123'))
+    call assert_equal(['123'], systemlist('echo 123'))
+    call assert_equal('123',   system('cat', '123'))
+    call assert_equal(['123'], systemlist('cat', '123'))
+    call assert_equal(["as\<NL>df"], systemlist('cat', ["as\<NL>df"]))
+  else
+    call assert_equal("123\n", system('echo 123'))
+    call assert_equal(["123\r"], systemlist('echo 123'))
+    call assert_equal("123",   system('more', '123'))
+    call assert_equal(["123"], systemlist('more', '123'))
+    call assert_equal(["as\<NL>df"], systemlist('more', ["as\<NL>df"]))
+  endif
+
+  if !executable('cat') || !executable('wc')
     return
   endif
+
   let out = 'echo 123'->system()
   " On Windows we may get a trailing space.
   if out != "123 \n"
@@ -13,14 +28,17 @@ func Test_System()
   endif
 
   let out = 'echo 123'->systemlist()
-  " On Windows we may get a trailing space and CR.
-  if out != ["123 \r"]
-    call assert_equal(['123'], out)
+  if !has('win32')
+    call assert_equal(["123"], out)
+  else
+    call assert_equal(["123\r"], out)
   endif
 
-  call assert_equal('123',   system('cat', '123'))
-  call assert_equal(['123'], systemlist('cat', '123'))
-  call assert_equal(["as\<NL>df"], systemlist('cat', ["as\<NL>df"]))
+  if executable('cat')
+    call assert_equal('123',   system('cat', '123'))   
+    call assert_equal(['123'], systemlist('cat', '123'))       
+    call assert_equal(["as\<NL>df"], systemlist('cat', ["as\<NL>df"])) 
+  endif
 
   new Xdummy
   call setline(1, ['asdf', "pw\<NL>er", 'xxxx'])
@@ -39,9 +57,11 @@ func Test_System()
     call assert_equal(['3'],  out)
   endif
 
-  let out = systemlist('cat', bufnr('%'))
-  " On Windows we may get a trailing CR.
-  if out != ["asdf\r", "pw\<NL>er\r", "xxxx\r"]
+  if !has('win32')
+    let out = systemlist('cat', bufnr('%'))
+    call assert_equal(['asdf', "pw\<NL>er", 'xxxx'],  out)
+  else
+    let out = systemlist('more', bufnr('%'))
     call assert_equal(['asdf', "pw\<NL>er", 'xxxx'],  out)
   endif
   bwipe!
index 2d9ffa3577f5a53b1d0a947f630571d66953f232..057a6f7726d9f51111774fc51cf4ef4cb182adc7 100644 (file)
@@ -757,6 +757,8 @@ static char *(features[]) =
 
 static int included_patches[] =
 {   /* Add new patch number below this line */
+/**/
+    2092,
 /**/
     2091,
 /**/