diff options
author | Daniel Hahler <git@thequod.de> | 2019-07-24 22:23:00 +0200 |
---|---|---|
committer | GitHub <noreply@github.com> | 2019-07-24 22:23:00 +0200 |
commit | b8fcf62da9261e47821c5e3d369dc4fd58d2b721 (patch) | |
tree | da9e717539657a8bf2b91807d64d72726c663c4f /src | |
parent | 3566267e753996c441c220c8a109bb4f4b25225c (diff) | |
download | rneovim-b8fcf62da9261e47821c5e3d369dc4fd58d2b721.tar.gz rneovim-b8fcf62da9261e47821c5e3d369dc4fd58d2b721.tar.bz2 rneovim-b8fcf62da9261e47821c5e3d369dc4fd58d2b721.zip |
vim-patch:8.1.1740: exepath() doesn't work for "bin/cat" (#10556)
Problem: Exepath() doesn't work for "bin/cat".
Solution: Check for any path separator. (Daniel Hahler, closes vim/vim#4724,
closes vim/vim#4710)
https://github.com/vim/vim/commit/d08b8c4c04db9433340df38d21f0e26878f28421
Fixes https://github.com/neovim/neovim/issues/10554.
Diffstat (limited to 'src')
-rw-r--r-- | src/nvim/eval.c | 5 | ||||
-rw-r--r-- | src/nvim/os/fs.c | 15 | ||||
-rw-r--r-- | src/nvim/testdir/test_functions.vim | 8 |
3 files changed, 11 insertions, 17 deletions
diff --git a/src/nvim/eval.c b/src/nvim/eval.c index 1bddafbee3..4e5c310fb6 100644 --- a/src/nvim/eval.c +++ b/src/nvim/eval.c @@ -8465,10 +8465,7 @@ static void f_executable(typval_T *argvars, typval_T *rettv, FunPtr fptr) const char *name = tv_get_string(&argvars[0]); // Check in $PATH and also check directly if there is a directory name - rettv->vval.v_number = ( - os_can_exe(name, NULL, true) - || (gettail_dir(name) != name - && os_can_exe(name, NULL, false))); + rettv->vval.v_number = os_can_exe(name, NULL, true); } typedef struct { diff --git a/src/nvim/os/fs.c b/src/nvim/os/fs.c index 57a864b7ec..0ded36942e 100644 --- a/src/nvim/os/fs.c +++ b/src/nvim/os/fs.c @@ -242,23 +242,12 @@ int os_exepath(char *buffer, size_t *size) bool os_can_exe(const char *name, char **abspath, bool use_path) FUNC_ATTR_NONNULL_ARG(1) { - bool no_path = !use_path || path_is_absolute((char_u *)name); - // If the filename is "qualified" (relative or absolute) do not check $PATH. -#ifdef WIN32 - no_path |= (name[0] == '.' - && ((name[1] == '/' || name[1] == '\\') - || (name[1] == '.' && (name[2] == '/' || name[2] == '\\')))); -#else - no_path |= (name[0] == '.' - && (name[1] == '/' || (name[1] == '.' && name[2] == '/'))); -#endif - - if (no_path) { + if (!use_path || gettail_dir(name) != name) { #ifdef WIN32 if (is_executable_ext(name, abspath)) { #else // Must have path separator, cannot execute files in the current directory. - if (gettail_dir(name) != name + if ((use_path || gettail_dir(name) != name) && is_executable(name, abspath)) { #endif return true; diff --git a/src/nvim/testdir/test_functions.vim b/src/nvim/testdir/test_functions.vim index 615536baef..fab1d7790d 100644 --- a/src/nvim/testdir/test_functions.vim +++ b/src/nvim/testdir/test_functions.vim @@ -887,6 +887,14 @@ func Test_Executable() elseif has('unix') call assert_equal(1, executable('cat')) call assert_equal(0, executable('nodogshere')) + + " get "cat" path and remove the leading / + let catcmd = exepath('cat')[1:] + new + lcd / + call assert_equal(1, executable(catcmd)) + call assert_equal('/' .. catcmd, exepath(catcmd)) + bwipe endif endfunc |