mirror of
https://github.com/neovim/neovim.git
synced 2025-02-25 18:55:25 -06:00
vim-patch:8.0.1708: mkdir with 'p' flag fails on existing directory
Problem: Mkdir with 'p' flag fails on existing directory, which is
different from the mkdir shell command.
Solution: Don't fail if the directory already exists. (James McCoy,
closes vim/vim#2775)
78a16b0f2a
This commit is contained in:
@@ -12880,33 +12880,36 @@ static void f_mkdir(typval_T *argvars, typval_T *rettv, FunPtr fptr)
|
||||
char buf[NUMBUFLEN];
|
||||
const char *const dir = tv_get_string_buf(&argvars[0], buf);
|
||||
if (*dir == NUL) {
|
||||
rettv->vval.v_number = FAIL;
|
||||
} else {
|
||||
if (*path_tail((char_u *)dir) == NUL) {
|
||||
// Remove trailing slashes.
|
||||
*path_tail_with_sep((char_u *)dir) = NUL;
|
||||
}
|
||||
|
||||
if (argvars[1].v_type != VAR_UNKNOWN) {
|
||||
if (argvars[2].v_type != VAR_UNKNOWN) {
|
||||
prot = tv_get_number_chk(&argvars[2], NULL);
|
||||
}
|
||||
if (prot != -1 && strcmp(tv_get_string(&argvars[1]), "p") == 0) {
|
||||
char *failed_dir;
|
||||
int ret = os_mkdir_recurse(dir, prot, &failed_dir);
|
||||
if (ret != 0) {
|
||||
EMSG3(_(e_mkdir), failed_dir, os_strerror(ret));
|
||||
xfree(failed_dir);
|
||||
rettv->vval.v_number = FAIL;
|
||||
return;
|
||||
} else {
|
||||
rettv->vval.v_number = OK;
|
||||
return;
|
||||
}
|
||||
}
|
||||
}
|
||||
rettv->vval.v_number = prot == -1 ? FAIL : vim_mkdir_emsg(dir, prot);
|
||||
return;
|
||||
}
|
||||
|
||||
if (*path_tail((char_u *)dir) == NUL) {
|
||||
// Remove trailing slashes.
|
||||
*path_tail_with_sep((char_u *)dir) = NUL;
|
||||
}
|
||||
|
||||
if (argvars[1].v_type != VAR_UNKNOWN) {
|
||||
if (argvars[2].v_type != VAR_UNKNOWN) {
|
||||
prot = tv_get_number_chk(&argvars[2], NULL);
|
||||
if (prot == -1) {
|
||||
return;
|
||||
}
|
||||
}
|
||||
if (strcmp(tv_get_string(&argvars[1]), "p") == 0) {
|
||||
char *failed_dir;
|
||||
int ret = os_mkdir_recurse(dir, prot, &failed_dir);
|
||||
if (ret != 0) {
|
||||
EMSG3(_(e_mkdir), failed_dir, os_strerror(ret));
|
||||
xfree(failed_dir);
|
||||
rettv->vval.v_number = FAIL;
|
||||
return;
|
||||
} else {
|
||||
rettv->vval.v_number = OK;
|
||||
return;
|
||||
}
|
||||
}
|
||||
}
|
||||
rettv->vval.v_number = vim_mkdir_emsg(dir, prot);
|
||||
}
|
||||
|
||||
/// "mode()" function
|
||||
|
||||
@@ -21,3 +21,20 @@ func Test_E963()
|
||||
call assert_fails("let v:oldfiles=''", 'E963:')
|
||||
call assert_equal(v_o, v:oldfiles)
|
||||
endfunc
|
||||
|
||||
func Test_mkdir_p()
|
||||
call mkdir('Xmkdir/nested', 'p')
|
||||
call assert_true(isdirectory('Xmkdir/nested'))
|
||||
try
|
||||
" Trying to make existing directories doesn't error
|
||||
call mkdir('Xmkdir', 'p')
|
||||
call mkdir('Xmkdir/nested', 'p')
|
||||
catch /E739:/
|
||||
call assert_report('mkdir(..., "p") failed for an existing directory')
|
||||
endtry
|
||||
" 'p' doesn't suppress real errors
|
||||
call writefile([], 'Xfile')
|
||||
call assert_fails('call mkdir("Xfile", "p")', 'E739')
|
||||
call delete('Xfile')
|
||||
call delete('Xmkdir', 'rf')
|
||||
endfunc
|
||||
|
||||
Reference in New Issue
Block a user