diff options
author | Sam Bingner <sam@bingner.com> | 2019-06-05 22:02:50 -1000 |
---|---|---|
committer | Sam Bingner <sam@bingner.com> | 2019-06-05 22:02:50 -1000 |
commit | a255618e22152ca2e5fd361a3d0762e9db20dd80 (patch) | |
tree | 5c98f76c0de0785b8d5b58ac622da34f0d024a8f /data/vim/patches/8.1.1378 | |
parent | 1b1fa61507a809a66f053a8523f883b2b6a2f487 (diff) |
Update vim to 8.1.1471
Diffstat (limited to 'data/vim/patches/8.1.1378')
-rw-r--r-- | data/vim/patches/8.1.1378 | 514 |
1 files changed, 514 insertions, 0 deletions
diff --git a/data/vim/patches/8.1.1378 b/data/vim/patches/8.1.1378 new file mode 100644 index 000000000..bdeb0a8e3 --- /dev/null +++ b/data/vim/patches/8.1.1378 @@ -0,0 +1,514 @@ +To: vim_dev@googlegroups.com +Subject: Patch 8.1.1378 +Fcc: outbox +From: Bram Moolenaar <Bram@moolenaar.net> +Mime-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit +------------ + +Patch 8.1.1378 +Problem: Delete() can not handle a file name that looks like a pattern. +Solution: Use readdir() instead of appending "/*" and expanding wildcards. + (Ken Takata, closes #4424, closes #696) +Files: src/testdir/test_functions.vim, src/evalfunc.c, src/fileio.c, + src/proto/fileio.pro + + +*** ../vim-8.1.1377/src/testdir/test_functions.vim 2019-05-16 22:24:52.407017760 +0200 +--- src/testdir/test_functions.vim 2019-05-24 14:01:13.044012690 +0200 +*************** +*** 1436,1441 **** +--- 1436,1456 ---- + call delete('Xdir', 'rf') + endfunc + ++ func Test_delete_rf() ++ call mkdir('Xdir') ++ call writefile([], 'Xdir/foo.txt') ++ call writefile([], 'Xdir/bar.txt') ++ call mkdir('Xdir/[a-1]') " issue #696 ++ call writefile([], 'Xdir/[a-1]/foo.txt') ++ call writefile([], 'Xdir/[a-1]/bar.txt') ++ call assert_true(filereadable('Xdir/foo.txt')) ++ call assert_true(filereadable('Xdir/[a-1]/foo.txt')) ++ ++ call assert_equal(0, delete('Xdir', 'rf')) ++ call assert_false(filereadable('Xdir/foo.txt')) ++ call assert_false(filereadable('Xdir/[a-1]/foo.txt')) ++ endfunc ++ + func Test_call() + call assert_equal(3, call('len', [123])) + call assert_fails("call call('len', 123)", 'E714:') +*** ../vim-8.1.1377/src/evalfunc.c 2019-05-19 19:59:30.160255591 +0200 +--- src/evalfunc.c 2019-05-24 14:10:12.777486166 +0200 +*************** +*** 9349,9365 **** + } + + /* +! * Evaluate "expr" for readdir(). + */ + static int +! readdir_checkitem(typval_T *expr, char_u *name) + { + typval_T save_val; + typval_T rettv; + typval_T argv[2]; + int retval = 0; + int error = FALSE; + + prepare_vimvar(VV_VAL, &save_val); + set_vim_var_string(VV_VAL, name, -1); + argv[0].v_type = VAR_STRING; +--- 9349,9369 ---- + } + + /* +! * Evaluate "expr" (= "context") for readdir(). + */ + static int +! readdir_checkitem(void *context, char_u *name) + { ++ typval_T *expr = (typval_T *)context; + typval_T save_val; + typval_T rettv; + typval_T argv[2]; + int retval = 0; + int error = FALSE; + ++ if (expr->v_type == VAR_UNKNOWN) ++ return 1; ++ + prepare_vimvar(VV_VAL, &save_val); + set_vim_var_string(VV_VAL, name, -1); + argv[0].v_type = VAR_STRING; +*************** +*** 9386,9521 **** + f_readdir(typval_T *argvars, typval_T *rettv) + { + typval_T *expr; +! int failed = FALSE; + char_u *path; + garray_T ga; + int i; +- #ifdef MSWIN +- char_u *buf, *p; +- int ok; +- HANDLE hFind = INVALID_HANDLE_VALUE; +- WIN32_FIND_DATAW wfb; +- WCHAR *wn = NULL; // UCS-2 name, NULL when not used. +- #endif + + if (rettv_list_alloc(rettv) == FAIL) + return; + path = tv_get_string(&argvars[0]); + expr = &argvars[1]; +- ga_init2(&ga, (int)sizeof(char *), 20); +- +- #ifdef MSWIN +- buf = alloc((int)MAXPATHL); +- if (buf == NULL) +- return; +- STRNCPY(buf, path, MAXPATHL-5); +- p = vim_strpbrk(path, (char_u *)"\\/"); +- if (p != NULL) +- *p = NUL; +- STRCAT(buf, "\\*"); +- +- wn = enc_to_utf16(buf, NULL); +- if (wn != NULL) +- hFind = FindFirstFileW(wn, &wfb); +- ok = (hFind != INVALID_HANDLE_VALUE); +- if (!ok) +- smsg(_(e_notopen), path); +- else +- { +- while (ok) +- { +- int ignore; +- +- p = utf16_to_enc(wfb.cFileName, NULL); // p is allocated here +- if (p == NULL) +- break; // out of memory +- +- ignore = p[0] == '.' && (p[1] == NUL +- || (p[1] == '.' && p[2] == NUL)); +- if (!ignore && expr->v_type != VAR_UNKNOWN) +- { +- int r = readdir_checkitem(expr, p); +- +- if (r < 0) +- { +- vim_free(p); +- break; +- } +- if (r == 0) +- ignore = TRUE; +- } +- +- if (!ignore) +- { +- if (ga_grow(&ga, 1) == OK) +- ((char_u**)ga.ga_data)[ga.ga_len++] = vim_strsave(p); +- else +- { +- failed = TRUE; +- vim_free(p); +- break; +- } +- } +- +- vim_free(p); +- ok = FindNextFileW(hFind, &wfb); +- } +- FindClose(hFind); +- } +- +- vim_free(buf); +- vim_free(wn); +- #else +- DIR *dirp; +- struct dirent *dp; +- char_u *p; +- +- dirp = opendir((char *)path); +- if (dirp == NULL) +- smsg(_(e_notopen), path); +- else +- { +- for (;;) +- { +- int ignore; +- +- dp = readdir(dirp); +- if (dp == NULL) +- break; +- p = (char_u *)dp->d_name; +- +- ignore = p[0] == '.' && +- (p[1] == NUL || +- (p[1] == '.' && p[2] == NUL)); +- if (!ignore && expr->v_type != VAR_UNKNOWN) +- { +- int r = readdir_checkitem(expr, p); +- +- if (r < 0) +- break; +- if (r == 0) +- ignore = TRUE; +- } +- +- if (!ignore) +- { +- if (ga_grow(&ga, 1) == OK) +- ((char_u**)ga.ga_data)[ga.ga_len++] = vim_strsave(p); +- else +- { +- failed = TRUE; +- break; +- } +- } +- } +- +- closedir(dirp); +- } +- #endif + +! if (!failed && rettv->vval.v_list != NULL && ga.ga_len > 0) + { +- sort_strings((char_u **)ga.ga_data, ga.ga_len); + for (i = 0; i < ga.ga_len; i++) + { + p = ((char_u **)ga.ga_data)[i]; +--- 9390,9409 ---- + f_readdir(typval_T *argvars, typval_T *rettv) + { + typval_T *expr; +! int ret; + char_u *path; ++ char_u *p; + garray_T ga; + int i; + + if (rettv_list_alloc(rettv) == FAIL) + return; + path = tv_get_string(&argvars[0]); + expr = &argvars[1]; + +! ret = readdir_core(&ga, path, (void *)expr, readdir_checkitem); +! if (ret == OK && rettv->vval.v_list != NULL && ga.ga_len > 0) + { + for (i = 0; i < ga.ga_len; i++) + { + p = ((char_u **)ga.ga_data)[i]; +*** ../vim-8.1.1377/src/fileio.c 2019-05-24 11:45:18.987591736 +0200 +--- src/fileio.c 2019-05-24 14:10:26.221420180 +0200 +*************** +*** 7172,7191 **** + + #if defined(TEMPDIRNAMES) || defined(FEAT_EVAL) || defined(PROTO) + /* + * Delete "name" and everything in it, recursively. +! * return 0 for succes, -1 if some file was not deleted. + */ + int + delete_recursive(char_u *name) + { + int result = 0; +- char_u **files; +- int file_count; + int i; + char_u *exp; + +! /* A symbolic link to a directory itself is deleted, not the directory it +! * points to. */ + if ( + # if defined(UNIX) || defined(MSWIN) + mch_isrealdir(name) +--- 7172,7335 ---- + + #if defined(TEMPDIRNAMES) || defined(FEAT_EVAL) || defined(PROTO) + /* ++ * Core part of "readdir()" function. ++ * Retrieve the list of files/directories of "path" into "gap". ++ * Return OK for success, FAIL for failure. ++ */ ++ int ++ readdir_core( ++ garray_T *gap, ++ char_u *path, ++ void *context, ++ int (*checkitem)(void *context, char_u *name)) ++ { ++ int failed = FALSE; ++ #ifdef MSWIN ++ char_u *buf, *p; ++ int ok; ++ HANDLE hFind = INVALID_HANDLE_VALUE; ++ WIN32_FIND_DATAW wfb; ++ WCHAR *wn = NULL; // UTF-16 name, NULL when not used. ++ #endif ++ ++ ga_init2(gap, (int)sizeof(char *), 20); ++ ++ #ifdef MSWIN ++ buf = alloc((int)MAXPATHL); ++ if (buf == NULL) ++ return FAIL; ++ STRNCPY(buf, path, MAXPATHL-5); ++ p = buf + strlen(buf); ++ MB_PTR_BACK(buf, p); ++ if (*p == '\\' || *p == '/') ++ *p = NUL; ++ STRCAT(buf, "\\*"); ++ ++ wn = enc_to_utf16(buf, NULL); ++ if (wn != NULL) ++ hFind = FindFirstFileW(wn, &wfb); ++ ok = (hFind != INVALID_HANDLE_VALUE); ++ if (!ok) ++ { ++ failed = TRUE; ++ smsg(_(e_notopen), path); ++ } ++ else ++ { ++ while (ok) ++ { ++ int ignore; ++ ++ p = utf16_to_enc(wfb.cFileName, NULL); // p is allocated here ++ if (p == NULL) ++ break; // out of memory ++ ++ ignore = p[0] == '.' && (p[1] == NUL ++ || (p[1] == '.' && p[2] == NUL)); ++ if (!ignore && checkitem != NULL) ++ { ++ int r = checkitem(context, p); ++ ++ if (r < 0) ++ { ++ vim_free(p); ++ break; ++ } ++ if (r == 0) ++ ignore = TRUE; ++ } ++ ++ if (!ignore) ++ { ++ if (ga_grow(gap, 1) == OK) ++ ((char_u**)gap->ga_data)[gap->ga_len++] = vim_strsave(p); ++ else ++ { ++ failed = TRUE; ++ vim_free(p); ++ break; ++ } ++ } ++ ++ vim_free(p); ++ ok = FindNextFileW(hFind, &wfb); ++ } ++ FindClose(hFind); ++ } ++ ++ vim_free(buf); ++ vim_free(wn); ++ #else ++ DIR *dirp; ++ struct dirent *dp; ++ char_u *p; ++ ++ dirp = opendir((char *)path); ++ if (dirp == NULL) ++ { ++ failed = TRUE; ++ smsg(_(e_notopen), path); ++ } ++ else ++ { ++ for (;;) ++ { ++ int ignore; ++ ++ dp = readdir(dirp); ++ if (dp == NULL) ++ break; ++ p = (char_u *)dp->d_name; ++ ++ ignore = p[0] == '.' && ++ (p[1] == NUL || ++ (p[1] == '.' && p[2] == NUL)); ++ if (!ignore && checkitem != NULL) ++ { ++ int r = checkitem(context, p); ++ ++ if (r < 0) ++ break; ++ if (r == 0) ++ ignore = TRUE; ++ } ++ ++ if (!ignore) ++ { ++ if (ga_grow(gap, 1) == OK) ++ ((char_u**)gap->ga_data)[gap->ga_len++] = vim_strsave(p); ++ else ++ { ++ failed = TRUE; ++ break; ++ } ++ } ++ } ++ ++ closedir(dirp); ++ } ++ #endif ++ ++ if (!failed && gap->ga_len > 0) ++ sort_strings((char_u **)gap->ga_data, gap->ga_len); ++ ++ return failed ? FAIL : OK; ++ } ++ ++ /* + * Delete "name" and everything in it, recursively. +! * return 0 for success, -1 if some file was not deleted. + */ + int + delete_recursive(char_u *name) + { + int result = 0; + int i; + char_u *exp; ++ garray_T ga; + +! // A symbolic link to a directory itself is deleted, not the directory it +! // points to. + if ( + # if defined(UNIX) || defined(MSWIN) + mch_isrealdir(name) +*************** +*** 7194,7215 **** + # endif + ) + { +! vim_snprintf((char *)NameBuff, MAXPATHL, "%s/*", name); +! exp = vim_strsave(NameBuff); + if (exp == NULL) + return -1; +! if (gen_expand_wildcards(1, &exp, &file_count, &files, +! EW_DIR|EW_FILE|EW_SILENT|EW_ALLLINKS|EW_DODOT|EW_EMPTYOK) == OK) + { +! for (i = 0; i < file_count; ++i) +! if (delete_recursive(files[i]) != 0) + result = -1; +! FreeWild(file_count, files); + } + else + result = -1; + vim_free(exp); +- (void)mch_rmdir(name); + } + else + result = mch_remove(name) == 0 ? 0 : -1; +--- 7338,7361 ---- + # endif + ) + { +! exp = vim_strsave(name); + if (exp == NULL) + return -1; +! if (readdir_core(&ga, exp, NULL, NULL) == OK) + { +! for (i = 0; i < ga.ga_len; ++i) +! { +! vim_snprintf((char *)NameBuff, MAXPATHL, "%s/%s", exp, +! ((char_u **)ga.ga_data)[i]); +! if (delete_recursive(NameBuff) != 0) + result = -1; +! } +! ga_clear_strings(&ga); + } + else + result = -1; ++ (void)mch_rmdir(exp); + vim_free(exp); + } + else + result = mch_remove(name) == 0 ? 0 : -1; +*** ../vim-8.1.1377/src/proto/fileio.pro 2019-02-15 21:06:05.342289715 +0100 +--- src/proto/fileio.pro 2019-05-24 14:04:05.371239020 +0200 +*************** +*** 24,29 **** +--- 24,30 ---- + void buf_reload(buf_T *buf, int orig_mode); + void buf_store_time(buf_T *buf, stat_T *st, char_u *fname); + void write_lnum_adjust(linenr_T offset); ++ int readdir_core(garray_T *gap, char_u *path, void *context, int (*checkitem)(void *context, char_u *name)); + int delete_recursive(char_u *name); + void vim_deltempdir(void); + char_u *vim_tempname(int extra_char, int keep); +*** ../vim-8.1.1377/src/version.c 2019-05-24 13:32:33.148376324 +0200 +--- src/version.c 2019-05-24 14:05:17.550903987 +0200 +*************** +*** 769,770 **** +--- 769,772 ---- + { /* Add new patch number below this line */ ++ /**/ ++ 1378, + /**/ + +-- +How To Keep A Healthy Level Of Insanity: +5. Put decaf in the coffee maker for 3 weeks. Once everyone has gotten + over their caffeine addictions, switch to espresso. + + /// 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 /// |