0
0
mirror of https://github.com/vim/vim.git synced 2025-09-25 03:54:15 -04:00

patch 8.2.4838: checking for absolute path is not trivial

Problem:    Checking for absolute path is not trivial.
Solution:   Add isabsolutepath(). (closes #10303)
This commit is contained in:
LemonBoy
2022-04-28 15:26:33 +01:00
committed by Bram Moolenaar
parent 68a573ce2b
commit dca1d40cd0
7 changed files with 55 additions and 0 deletions

View File

@@ -295,6 +295,7 @@ inputsecret({prompt} [, {text}]) String like input() but hiding the text
insert({object}, {item} [, {idx}]) List insert {item} in {object} [before {idx}] insert({object}, {item} [, {idx}]) List insert {item} in {object} [before {idx}]
interrupt() none interrupt script execution interrupt() none interrupt script execution
invert({expr}) Number bitwise invert invert({expr}) Number bitwise invert
isabsolutepath({path}) Number |TRUE| if {path} is an absolute path
isdirectory({directory}) Number |TRUE| if {directory} is a directory isdirectory({directory}) Number |TRUE| if {directory} is a directory
isinf({expr}) Number determine if {expr} is infinity value isinf({expr}) Number determine if {expr} is infinity value
(positive or negative) (positive or negative)
@@ -4672,6 +4673,24 @@ invert({expr}) *invert()*
< Can also be used as a |method|: > < Can also be used as a |method|: >
:let bits = bits->invert() :let bits = bits->invert()
isabsolutepath({directory}) *isabsolutepath()*
The result is a Number, which is |TRUE| when {path} is an
absolute path.
< On Unix, a path is considered absolute when it starts with '/'.
On MS-Windows, it is considered absolute when it starts with an
optional drive prefix and is followed by a '\' or '/'. UNC paths
are always absolute.
Example: >
echo isabsolutepath('/usr/share/') " 1
echo isabsolutepath('./foobar') " 0
echo isabsolutepath('C:\Windows') " 1
echo isabsolutepath('foobar') " 0
echo isabsolutepath('\\remote\file') " 1
Can also be used as a |method|: >
GetName()->isabsolutepath()
isdirectory({directory}) *isdirectory()* isdirectory({directory}) *isdirectory()*
The result is a Number, which is |TRUE| when a directory The result is a Number, which is |TRUE| when a directory
with the name {directory} exists. If {directory} doesn't with the name {directory} exists. If {directory} doesn't

View File

@@ -904,6 +904,7 @@ System functions and manipulation of files:
getfperm() get the permissions of a file getfperm() get the permissions of a file
setfperm() set the permissions of a file setfperm() set the permissions of a file
getftype() get the kind of a file getftype() get the kind of a file
isabsolutepath() check if a path is absolute
isdirectory() check if a directory exists isdirectory() check if a directory exists
getfsize() get the size of a file getfsize() get the size of a file
getcwd() get the current working directory getcwd() get the current working directory

View File

@@ -1969,6 +1969,8 @@ static funcentry_T global_functions[] =
ret_void, f_interrupt}, ret_void, f_interrupt},
{"invert", 1, 1, FEARG_1, arg1_number, {"invert", 1, 1, FEARG_1, arg1_number,
ret_number, f_invert}, ret_number, f_invert},
{"isabsolutepath", 1, 1, FEARG_1, arg1_string,
ret_number_bool, f_isabsolutepath},
{"isdirectory", 1, 1, FEARG_1, arg1_string, {"isdirectory", 1, 1, FEARG_1, arg1_string,
ret_number_bool, f_isdirectory}, ret_number_bool, f_isdirectory},
{"isinf", 1, 1, FEARG_1, arg1_float_or_nr, {"isinf", 1, 1, FEARG_1, arg1_float_or_nr,

View File

@@ -1416,6 +1416,18 @@ f_isdirectory(typval_T *argvars, typval_T *rettv)
rettv->vval.v_number = mch_isdir(tv_get_string(&argvars[0])); rettv->vval.v_number = mch_isdir(tv_get_string(&argvars[0]));
} }
/*
* "isabsolutepath()" function
*/
void
f_isabsolutepath(typval_T *argvars, typval_T *rettv)
{
if (in_vim9script() && check_for_string_arg(argvars, 0) == FAIL)
return;
rettv->vval.v_number = mch_isFullName(tv_get_string_strict(&argvars[0]));
}
/* /*
* Create the directory in which "dir" is located, and higher levels when * Create the directory in which "dir" is located, and higher levels when
* needed. * needed.

View File

@@ -22,6 +22,7 @@ void f_glob(typval_T *argvars, typval_T *rettv);
void f_glob2regpat(typval_T *argvars, typval_T *rettv); void f_glob2regpat(typval_T *argvars, typval_T *rettv);
void f_globpath(typval_T *argvars, typval_T *rettv); void f_globpath(typval_T *argvars, typval_T *rettv);
void f_isdirectory(typval_T *argvars, typval_T *rettv); void f_isdirectory(typval_T *argvars, typval_T *rettv);
void f_isabsolutepath(typval_T *argvars, typval_T *rettv);
void f_mkdir(typval_T *argvars, typval_T *rettv); void f_mkdir(typval_T *argvars, typval_T *rettv);
void f_pathshorten(typval_T *argvars, typval_T *rettv); void f_pathshorten(typval_T *argvars, typval_T *rettv);
void f_readdir(typval_T *argvars, typval_T *rettv); void f_readdir(typval_T *argvars, typval_T *rettv);

View File

@@ -2887,5 +2887,23 @@ func Test_funcref_to_string()
call assert_equal("function('g:Test_funcref_to_string')", string(Fn)) call assert_equal("function('g:Test_funcref_to_string')", string(Fn))
endfunc endfunc
" Test for isabsolutepath()
func Test_isabsolutepath()
call assert_false(isabsolutepath(''))
call assert_false(isabsolutepath('.'))
call assert_false(isabsolutepath('../Foo'))
call assert_false(isabsolutepath('Foo/'))
if has('win32')
call assert_true(isabsolutepath('A:\'))
call assert_true(isabsolutepath('A:\Foo'))
call assert_true(isabsolutepath('A:/Foo'))
call assert_false(isabsolutepath('A:Foo'))
call assert_false(isabsolutepath('\Windows'))
call assert_true(isabsolutepath('\\Server2\Share\Test\Foo.txt'))
else
call assert_true(isabsolutepath('/'))
call assert_true(isabsolutepath('/usr/share/'))
endif
endfunc
" vim: shiftwidth=2 sts=2 expandtab " vim: shiftwidth=2 sts=2 expandtab

View File

@@ -746,6 +746,8 @@ static char *(features[]) =
static int included_patches[] = static int included_patches[] =
{ /* Add new patch number below this line */ { /* Add new patch number below this line */
/**/
4838,
/**/ /**/
4837, 4837,
/**/ /**/