Mercurial > vim
diff src/evalfunc.c @ 13672:4a1efd1a6018 v8.0.1708
patch 8.0.1708: mkdir with 'p' flag fails on existing directory
commit https://github.com/vim/vim/commit/78a16b0f2a142aae1fdc96c50ab0f25194d0e755
Author: Bram Moolenaar <Bram@vim.org>
Date: Sat Apr 14 13:51:55 2018 +0200
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 #2775)
author | Christian Brabandt <cb@256bit.org> |
---|---|
date | Sat, 14 Apr 2018 14:00:06 +0200 |
parents | ab89131d30e0 |
children | 39fcaaa973db |
line wrap: on
line diff
--- a/src/evalfunc.c +++ b/src/evalfunc.c @@ -8057,22 +8057,32 @@ f_mkdir(typval_T *argvars, typval_T *ret dir = get_tv_string_buf(&argvars[0], buf); if (*dir == NUL) - rettv->vval.v_number = FAIL; - else - { - if (*gettail(dir) == NUL) - /* remove trailing slashes */ - *gettail_sep(dir) = NUL; - - if (argvars[1].v_type != VAR_UNKNOWN) - { - if (argvars[2].v_type != VAR_UNKNOWN) - prot = (int)get_tv_number_chk(&argvars[2], NULL); - if (prot != -1 && STRCMP(get_tv_string(&argvars[1]), "p") == 0) - mkdir_recurse(dir, prot); - } - rettv->vval.v_number = prot == -1 ? FAIL : vim_mkdir_emsg(dir, prot); - } + return; + + if (*gettail(dir) == NUL) + /* remove trailing slashes */ + *gettail_sep(dir) = NUL; + + if (argvars[1].v_type != VAR_UNKNOWN) + { + if (argvars[2].v_type != VAR_UNKNOWN) + { + prot = (int)get_tv_number_chk(&argvars[2], NULL); + if (prot == -1) + return; + } + if (STRCMP(get_tv_string(&argvars[1]), "p") == 0) + { + if (mch_isdir(dir)) + { + /* With the "p" flag it's OK if the dir already exists. */ + rettv->vval.v_number = OK; + return; + } + mkdir_recurse(dir, prot); + } + } + rettv->vval.v_number = vim_mkdir_emsg(dir, prot); } #endif