To: vim_dev@googlegroups.com Subject: Patch 8.0.1708 Fcc: outbox From: Bram Moolenaar Mime-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ------------ Patch 8.0.1708 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) Files: src/evalfunc.c, src/testdir/test_eval_stuff.vim, runtime/doc/eval.txt *** ../vim-8.0.1707/src/evalfunc.c 2018-04-10 15:59:04.295392601 +0200 --- src/evalfunc.c 2018-04-14 13:44:43.081634516 +0200 *************** *** 8057,8078 **** 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); } } #endif --- 8057,8088 ---- dir = get_tv_string_buf(&argvars[0], buf); if (*dir == NUL) ! 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 *** ../vim-8.0.1707/src/testdir/test_eval_stuff.vim 2018-02-13 18:05:14.080439478 +0100 --- src/testdir/test_eval_stuff.vim 2018-04-14 13:36:34.401184113 +0200 *************** *** 25,27 **** --- 25,44 ---- let c5 = nr2char(screenchar(&lines, 5)) call assert_equal('wrong', c1 . c2 . c3 . c4 . c5) 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 *** ../vim-8.0.1707/runtime/doc/eval.txt 2018-04-10 15:59:04.287392657 +0200 --- runtime/doc/eval.txt 2018-04-14 13:46:03.829057784 +0200 *************** *** 6113,6118 **** --- 6138,6145 ---- Example: > :call mkdir($HOME . "/tmp/foo/bar", "p", 0700) < This function is not available in the |sandbox|. + There is no error if the directory already exists and the "p" + flag is passed (since patch 8.0.1708). Not available on all systems. To check use: > :if exists("*mkdir") < *** ../vim-8.0.1707/src/version.c 2018-04-13 22:15:42.431294621 +0200 --- src/version.c 2018-04-14 13:51:17.402832651 +0200 *************** *** 764,765 **** --- 764,767 ---- { /* Add new patch number below this line */ + /**/ + 1708, /**/ -- If Apple would build a car... ... it would be powered by the sun, be reliable, five times as fast and twice as easy to drive; but would only run on five percent of the roads. /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\ /// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\ \\\ an exciting new programming language -- http://www.Zimbu.org /// \\\ help me help AIDS victims -- http://ICCF-Holland.org ///