summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorzeertzjq <zeertzjq@outlook.com>2024-07-12 07:29:14 +0200
committerChristian Brabandt <cb@256bit.org>2024-07-12 07:29:14 +0200
commit1ee7420460768df67ea4bc73467f2d4f8b1555bd (patch)
tree18453c6b3fb5d87a8cae56bd017d703f35d7f0d6
parentfc533c9f06aff579437f9f2348a21241a72c7967 (diff)
patch 9.1.0569: fnamemodify() treats ".." and "../" differentlyv9.1.0569
Problem: fnamemodify() treats ".." and "../" differently. Solution: Expand ".." properly like how "/.." is treated in 8.2.3388. (zeertzjq) closes: #15218 Signed-off-by: zeertzjq <zeertzjq@outlook.com> Signed-off-by: Christian Brabandt <cb@256bit.org>
-rw-r--r--src/os_unix.c5
-rw-r--r--src/testdir/test_findfile.vim10
-rw-r--r--src/testdir/test_fnamemodify.vim2
-rw-r--r--src/testdir/test_taglist.vim15
-rw-r--r--src/version.c2
5 files changed, 30 insertions, 4 deletions
diff --git a/src/os_unix.c b/src/os_unix.c
index 474d288019..76e7a8a027 100644
--- a/src/os_unix.c
+++ b/src/os_unix.c
@@ -2699,6 +2699,9 @@ mch_FullName(
if ((force || !mch_isFullName(fname))
&& ((p = vim_strrchr(fname, '/')) == NULL || p != fname))
{
+ if (p == NULL && STRCMP(fname, "..") == 0)
+ // Handle ".." without path separators.
+ p = fname + 2;
/*
* If the file name has a path, change to that directory for a moment,
* and then get the directory (and get back to where we were).
@@ -2707,7 +2710,7 @@ mch_FullName(
if (p != NULL)
{
if (STRCMP(p, "/..") == 0)
- // for "/path/dir/.." include the "/.."
+ // For "/path/dir/.." include the "/..".
p += 3;
#ifdef HAVE_FCHDIR
diff --git a/src/testdir/test_findfile.vim b/src/testdir/test_findfile.vim
index 9247a813da..a5e18b9570 100644
--- a/src/testdir/test_findfile.vim
+++ b/src/testdir/test_findfile.vim
@@ -107,6 +107,9 @@ func Test_findfile()
let l = findfile('bar', ';../', -1)
call assert_equal(1, len(l))
call assert_match('.*/Xfinddir1/Xdir2/Xdir3/bar', l[0])
+ let l = findfile('bar', ';..', -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))
@@ -117,6 +120,9 @@ func Test_findfile()
let l = findfile('bar', ';../../', -1)
call assert_equal(1, len(l))
call assert_match('.*/Xfinddir1/Xdir2/Xdir3/bar', l[0])
+ let l = findfile('bar', ';../..', -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))
@@ -130,6 +136,10 @@ func Test_findfile()
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', ';../../..', -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 ../..
diff --git a/src/testdir/test_fnamemodify.vim b/src/testdir/test_fnamemodify.vim
index c19f4646b3..4e61343fa4 100644
--- a/src/testdir/test_fnamemodify.vim
+++ b/src/testdir/test_fnamemodify.vim
@@ -14,6 +14,8 @@ func Test_fnamemodify()
call assert_equal($HOME .. "/foo" , fnamemodify('~/foo', ':p'))
call assert_equal(fnamemodify('.', ':p:h:h:h') .. '/', fnamemodify($HOME .. '/../', ':p'))
call assert_equal(fnamemodify('.', ':p:h:h:h') .. '/', fnamemodify($HOME .. '/..', ':p'))
+ call assert_equal(fnamemodify('.', ':p:h:h') .. '/', fnamemodify('../', ':p'))
+ call assert_equal(fnamemodify('.', ':p:h:h') .. '/', fnamemodify('..', ':p'))
call assert_equal('test.out', fnamemodify('test.out', ':.'))
call assert_equal('a', fnamemodify('../testdir/a', ':.'))
call assert_equal('~/testdir/test.out', fnamemodify('test.out', ':~'))
diff --git a/src/testdir/test_taglist.vim b/src/testdir/test_taglist.vim
index 8e0797252a..236f5ac071 100644
--- a/src/testdir/test_taglist.vim
+++ b/src/testdir/test_taglist.vim
@@ -135,15 +135,15 @@ func Test_tagfiles_stopdir()
call writefile([], 'Xtagsdir1/Xtags', 'D')
cd Xtagsdir1/
- let &tags = './Xtags;' .. fnamemodify('./..', ':p')
+ let &tags = './Xtags;' .. fnamemodify('..', ':p')
call assert_equal(1, len(tagfiles()))
cd Xtagsdir2/
- let &tags = './Xtags;' .. fnamemodify('./..', ':p')
+ let &tags = './Xtags;' .. fnamemodify('..', ':p')
call assert_equal(1, len(tagfiles()))
cd Xtagsdir3/
- let &tags = './Xtags;' .. fnamemodify('./..', ':p')
+ let &tags = './Xtags;' .. fnamemodify('..', ':p')
call assert_equal(0, len(tagfiles()))
let &tags = './Xtags;../'
@@ -155,6 +155,15 @@ func Test_tagfiles_stopdir()
cd ..
call assert_equal(1, len(tagfiles()))
+ let &tags = './Xtags;..'
+ call assert_equal(1, len(tagfiles()))
+
+ cd Xtagsdir2/
+ call assert_equal(1, len(tagfiles()))
+
+ cd Xtagsdir3/
+ call assert_equal(0, len(tagfiles()))
+
set tags&
call chdir(save_cwd)
endfunc
diff --git a/src/version.c b/src/version.c
index 3b4cca66d4..4c6ed9960a 100644
--- a/src/version.c
+++ b/src/version.c
@@ -705,6 +705,8 @@ static char *(features[]) =
static int included_patches[] =
{ /* Add new patch number below this line */
/**/
+ 569,
+/**/
568,
/**/
567,