Mercurial > vim
changeset 35649:2807910c5550 v9.1.0566
patch 9.1.0566: Stop dir in findfile() doesn't work properly w/o trailing slash
Commit: https://github.com/vim/vim/commit/e6ab23bd4a41840860ae2904956c4d255a9dd528
Author: zeertzjq <zeertzjq@outlook.com>
Date: Thu Jul 11 22:22:26 2024 +0200
patch 9.1.0566: Stop dir in findfile() doesn't work properly w/o trailing slash
Problem: Stop directory in findfile() doesn't work properly without a
trailing slash.
Solution: Always use fnamencmp(), not fnamecmp().
related: #15200
related: #15202
Signed-off-by: zeertzjq <zeertzjq@outlook.com>
Signed-off-by: Christian Brabandt <cb@256bit.org>
author | Christian Brabandt <cb@256bit.org> |
---|---|
date | Thu, 11 Jul 2024 22:30:40 +0200 |
parents | 5606239c517c |
children | 96d071ff7c29 |
files | src/findfile.c src/testdir/test_findfile.vim src/version.c |
diffstat | 3 files changed, 21 insertions(+), 18 deletions(-) [+] |
line wrap: on
line diff
--- a/src/findfile.c +++ b/src/findfile.c @@ -1078,11 +1078,13 @@ vim_findfile(void *search_ctx_arg) && search_ctx->ffsc_stopdirs_v != NULL && !got_int) { ff_stack_T *sptr; + // path_end may point to the NUL or the previous path separator + int plen = (path_end - search_ctx->ffsc_start_dir) + + (*path_end != NUL); // is the last starting directory in the stop list? if (ff_path_in_stoplist(search_ctx->ffsc_start_dir, - (int)(path_end - search_ctx->ffsc_start_dir), - search_ctx->ffsc_stopdirs_v) == TRUE) + plen, search_ctx->ffsc_stopdirs_v) == TRUE) break; // cut of last dir @@ -1521,22 +1523,14 @@ ff_path_in_stoplist(char_u *path, int pa return TRUE; for (i = 0; stopdirs_v[i] != NULL; i++) - { - if ((int)STRLEN(stopdirs_v[i]) > path_len) - { - // match for parent directory. So '/home' also matches - // '/home/rks'. Check for PATHSEP in stopdirs_v[i], else - // '/home/r' would also match '/home/rks' - if (fnamencmp(stopdirs_v[i], path, path_len) == 0 - && vim_ispathsep(stopdirs_v[i][path_len])) - return TRUE; - } - else - { - if (fnamecmp(stopdirs_v[i], path) == 0) - return TRUE; - } - } + // match for parent directory. So '/home' also matches + // '/home/rks'. Check for PATHSEP in stopdirs_v[i], else + // '/home/r' would also match '/home/rks' + if (fnamencmp(stopdirs_v[i], path, path_len) == 0 + && ((int)STRLEN(stopdirs_v[i]) <= path_len + || vim_ispathsep(stopdirs_v[i][path_len]))) + return TRUE; + return FALSE; }
--- a/src/testdir/test_findfile.vim +++ b/src/testdir/test_findfile.vim @@ -101,11 +101,18 @@ func Test_findfile() let l = findfile('bar', ';' . save_dir . '/Xfinddir1/Xdir2/', -1) call assert_equal(1, len(l)) call assert_match('.*/Xfinddir1/Xdir2/Xdir3/bar', l[0]) + let l = findfile('bar', ';' . save_dir . '/Xfinddir1/Xdir2', -1) + call assert_equal(1, len(l)) + call assert_match('.*/Xfinddir1/Xdir2/Xdir3/bar', l[0]) let l = findfile('bar', ';' . save_dir . '/Xfinddir1/', -1) call assert_equal(2, len(l)) call assert_match('.*/Xfinddir1/Xdir2/Xdir3/bar', l[0]) call assert_match('.*/Xfinddir1/bar', l[1]) + let l = findfile('bar', ';' . save_dir . '/Xfinddir1', -1) + call assert_equal(2, len(l)) + call assert_match('.*/Xfinddir1/Xdir2/Xdir3/bar', l[0]) + call assert_match('.*/Xfinddir1/bar', l[1]) " Test combined downwards and upwards search from Xdir2/. cd ../..