From 206155280def51160a9d81d983aed639015ffb44 Mon Sep 17 00:00:00 2001 From: Bram Moolenaar Date: Mon, 5 Jun 2017 18:46:26 +0200 Subject: patch 8.0.0625: shellescape() always escapes a newline Problem: shellescape() always escapes a newline, which does not work with some shells. (Harm te Hennepe) Solution: Only escape a newline when the "special" argument is non-zero. (Christian Brabandt, closes #1590) --- src/evalfunc.c | 4 +++- src/testdir/test_functions.vim | 25 +++++++++++++++++++++++++ src/version.c | 2 ++ 3 files changed, 30 insertions(+), 1 deletion(-) (limited to 'src') diff --git a/src/evalfunc.c b/src/evalfunc.c index 60cd34424..c198df13a 100644 --- a/src/evalfunc.c +++ b/src/evalfunc.c @@ -10461,8 +10461,10 @@ f_sha256(typval_T *argvars, typval_T *rettv) static void f_shellescape(typval_T *argvars, typval_T *rettv) { + int do_special = non_zero_arg(&argvars[1]); + rettv->vval.v_string = vim_strsave_shellescape( - get_tv_string(&argvars[0]), non_zero_arg(&argvars[1]), TRUE); + get_tv_string(&argvars[0]), do_special, do_special); rettv->v_type = VAR_STRING; } diff --git a/src/testdir/test_functions.vim b/src/testdir/test_functions.vim index e569ef1dc..f0f656ac8 100644 --- a/src/testdir/test_functions.vim +++ b/src/testdir/test_functions.vim @@ -784,3 +784,28 @@ func Test_redo_in_nested_functions() delfunc Operator delfunc Apply endfunc + +func Test_shellescape() + let save_shell = &shell + set shell=bash + call assert_equal("'text'", shellescape('text')) + call assert_equal("'te\"xt'", shellescape('te"xt')) + call assert_equal("'te'\\''xt'", shellescape("te'xt")) + + call assert_equal("'te%xt'", shellescape("te%xt")) + call assert_equal("'te\\%xt'", shellescape("te%xt", 1)) + call assert_equal("'te#xt'", shellescape("te#xt")) + call assert_equal("'te\\#xt'", shellescape("te#xt", 1)) + call assert_equal("'te!xt'", shellescape("te!xt")) + call assert_equal("'te\\!xt'", shellescape("te!xt", 1)) + + call assert_equal("'te\nxt'", shellescape("te\nxt")) + call assert_equal("'te\\\nxt'", shellescape("te\nxt", 1)) + set shell=tcsh + call assert_equal("'te\\!xt'", shellescape("te!xt")) + call assert_equal("'te\\\\!xt'", shellescape("te!xt", 1)) + call assert_equal("'te\\\nxt'", shellescape("te\nxt")) + call assert_equal("'te\\\\\nxt'", shellescape("te\nxt", 1)) + + let &shell = save_shell +endfunc diff --git a/src/version.c b/src/version.c index c066c8175..0280ca810 100644 --- a/src/version.c +++ b/src/version.c @@ -764,6 +764,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ +/**/ + 625, /**/ 624, /**/ -- cgit v1.2.1