diff --git a/src/errors.h b/src/errors.h index 949a532794..951acabb29 100644 --- a/src/errors.h +++ b/src/errors.h @@ -30,8 +30,9 @@ EXTERN char e_invalid_expression_str[] #endif EXTERN char e_invalid_range[] INIT(= N_("E16: Invalid range")); -#if defined(UNIX) || defined(FEAT_SYN_HL) || defined(FEAT_SPELL) -EXTERN char e_src_is_directory[] +#if defined(UNIX) || defined(FEAT_SYN_HL) \ + || defined(FEAT_SPELL) || defined(FEAT_EVAL) +EXTERN char e_str_is_directory[] INIT(= N_("E17: \"%s\" is a directory")); #endif #ifdef FEAT_EVAL diff --git a/src/ex_cmds.c b/src/ex_cmds.c index be35845356..25f06e623c 100644 --- a/src/ex_cmds.c +++ b/src/ex_cmds.c @@ -2116,7 +2116,7 @@ check_overwrite( // with UNIX it is possible to open a directory if (mch_isdir(ffname)) { - semsg(_(e_src_is_directory), ffname); + semsg(_(e_str_is_directory), ffname); return FAIL; } #endif diff --git a/src/ex_docmd.c b/src/ex_docmd.c index c5e96bde5b..c12f151c3a 100644 --- a/src/ex_docmd.c +++ b/src/ex_docmd.c @@ -8386,7 +8386,7 @@ open_exfile( // with Unix it is possible to open a directory if (mch_isdir(fname)) { - semsg(_(e_src_is_directory), fname); + semsg(_(e_str_is_directory), fname); return NULL; } #endif diff --git a/src/filepath.c b/src/filepath.c index f0da60f452..851091e57a 100644 --- a/src/filepath.c +++ b/src/filepath.c @@ -892,33 +892,35 @@ f_exepath(typval_T *argvars, typval_T *rettv) rettv->vval.v_string = p; } +/* + * Return TRUE if "fname" is a readable file. + */ + int +file_is_readable(char_u *fname) +{ + int fd; + +#ifndef O_NONBLOCK +# define O_NONBLOCK 0 +#endif + if (*fname && !mch_isdir(fname) + && (fd = mch_open((char *)fname, O_RDONLY | O_NONBLOCK, 0)) >= 0) + { + close(fd); + return TRUE; + } + return FALSE; +} + /* * "filereadable()" function */ void f_filereadable(typval_T *argvars, typval_T *rettv) { - int fd; - char_u *p; - int n; - if (in_vim9script() && check_for_string_arg(argvars, 0) == FAIL) return; - -#ifndef O_NONBLOCK -# define O_NONBLOCK 0 -#endif - p = tv_get_string(&argvars[0]); - if (*p && !mch_isdir(p) && (fd = mch_open((char *)p, - O_RDONLY | O_NONBLOCK, 0)) >= 0) - { - n = TRUE; - close(fd); - } - else - n = FALSE; - - rettv->vval.v_number = n; + rettv->vval.v_number = file_is_readable(tv_get_string(&argvars[0])); } /* @@ -1761,7 +1763,7 @@ read_file_or_blob(typval_T *argvars, typval_T *rettv, int always_blob) if (mch_isdir(fname)) { - semsg(_(e_src_is_directory), fname); + semsg(_(e_str_is_directory), fname); return; } if (*fname == NUL || (fd = mch_fopen((char *)fname, READBIN)) == NULL) diff --git a/src/proto/filepath.pro b/src/proto/filepath.pro index 62612117db..bf3d5163da 100644 --- a/src/proto/filepath.pro +++ b/src/proto/filepath.pro @@ -5,6 +5,7 @@ void f_chdir(typval_T *argvars, typval_T *rettv); void f_delete(typval_T *argvars, typval_T *rettv); void f_executable(typval_T *argvars, typval_T *rettv); void f_exepath(typval_T *argvars, typval_T *rettv); +int file_is_readable(char_u *fname); void f_filereadable(typval_T *argvars, typval_T *rettv); void f_filewritable(typval_T *argvars, typval_T *rettv); void f_finddir(typval_T *argvars, typval_T *rettv); diff --git a/src/spellfile.c b/src/spellfile.c index ad0d000211..aaacb2e448 100644 --- a/src/spellfile.c +++ b/src/spellfile.c @@ -5976,7 +5976,7 @@ mkspell( } if (mch_isdir(wfname)) { - semsg(_(e_src_is_directory), wfname); + semsg(_(e_str_is_directory), wfname); goto theend; } diff --git a/src/testdir/test_vim9_import.vim b/src/testdir/test_vim9_import.vim index b1e96c5ea3..c6a820654a 100644 --- a/src/testdir/test_vim9_import.vim +++ b/src/testdir/test_vim9_import.vim @@ -2508,13 +2508,19 @@ def Test_import_autoload_fails() vim9script import autoload './doesNotExist.vim' END - v9.CheckScriptSuccess(lines) + v9.CheckScriptFailure(lines, 'E282:', 2) lines =<< trim END vim9script import autoload '/dir/doesNotExist.vim' END - v9.CheckScriptSuccess(lines) + v9.CheckScriptFailure(lines, 'E282:', 2) + + lines =<< trim END + vim9script + import autoload '../testdir' + END + v9.CheckScriptFailure(lines, 'E17:', 2) lines =<< trim END vim9script diff --git a/src/version.c b/src/version.c index 843affd3ed..3db4108f3a 100644 --- a/src/version.c +++ b/src/version.c @@ -750,6 +750,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ +/**/ + 4653, /**/ 4652, /**/