summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorBram Moolenaar <Bram@vim.org>2019-09-28 15:51:37 +0200
committerBram Moolenaar <Bram@vim.org>2019-09-28 15:51:37 +0200
commit1a613398068580ca1286ac2ed920f20c978aa662 (patch)
tree05b183b30f8ee99eea6288e9657f6213e7eacdb7
parent0f1c6708fdf17bb9c7305b8af5d12189956195b6 (diff)
patch 8.1.2092: MS-Windows: redirect in system() does not workv8.1.2092
Problem: MS-Windows: redirect in system() does not work. Solution: Handle 'shellxescape' and 'shellxquote' better. (Yasuhiro Matsumoto, closes #2054)
-rw-r--r--src/ex_cmds.c35
-rw-r--r--src/misc2.c12
-rw-r--r--src/testdir/test_system.vim40
-rw-r--r--src/version.c2
4 files changed, 61 insertions, 28 deletions
diff --git a/src/ex_cmds.c b/src/ex_cmds.c
index 6ae5969a07..9d58ab41a5 100644
--- a/src/ex_cmds.c
+++ b/src/ex_cmds.c
@@ -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);
}
diff --git a/src/misc2.c b/src/misc2.c
index f4da4c2d5b..da274e6036 100644
--- a/src/misc2.c
+++ b/src/misc2.c
@@ -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);
}
diff --git a/src/testdir/test_system.vim b/src/testdir/test_system.vim
index deee51fa1c..22aceb7078 100644
--- a/src/testdir/test_system.vim
+++ b/src/testdir/test_system.vim
@@ -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!
diff --git a/src/version.c b/src/version.c
index 2d9ffa3577..057a6f7726 100644
--- a/src/version.c
+++ b/src/version.c
@@ -758,6 +758,8 @@ static char *(features[]) =
static int included_patches[] =
{ /* Add new patch number below this line */
/**/
+ 2092,
+/**/
2091,
/**/
2090,