# HG changeset patch # User Bram Moolenaar # Date 1630351804 -7200 # Node ID f165d99cda45fddddb1ab93bc27fe9f42513924c # Parent 168dc6cad2307a0e5a14776fb4d899e657a0ccf3 patch 8.2.3388: fnamemodify('path/..', ':p') differs from using 'path/../' Commit: https://github.com/vim/vim/commit/4eaef9979fc5032606897963f1af37674ee0d422 Author: Bram Moolenaar Date: Mon Aug 30 21:26:16 2021 +0200 patch 8.2.3388: fnamemodify('path/..', ':p') differs from using 'path/../' Problem: fnamemodify('path/..', ':p') differs from using 'path/../'. Solution: Include the "/.." in the directory name. (closes https://github.com/vim/vim/issues/8808) diff --git a/src/os_unix.c b/src/os_unix.c --- a/src/os_unix.c +++ b/src/os_unix.c @@ -2602,6 +2602,10 @@ mch_FullName( */ if (p != NULL) { + if (STRCMP(p, "/..") == 0) + // for "/path/dir/.." include the "/.." + p += 3; + #ifdef HAVE_FCHDIR /* * Use fchdir() if possible, it's said to be faster and more @@ -2644,8 +2648,10 @@ mch_FullName( vim_strncpy(buf, fname, p - fname); if (mch_chdir((char *)buf)) retval = FAIL; + else if (*p == '/') + fname = p + 1; else - fname = p + 1; + fname = p; *buf = NUL; } } diff --git a/src/testdir/test_fnamemodify.vim b/src/testdir/test_fnamemodify.vim --- a/src/testdir/test_fnamemodify.vim +++ b/src/testdir/test_fnamemodify.vim @@ -12,6 +12,8 @@ func Test_fnamemodify() call assert_equal('r', fnamemodify('.', ':p:h')[-1:]) call assert_equal('t', fnamemodify('test.out', ':p')[-1:]) 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('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/version.c b/src/version.c --- a/src/version.c +++ b/src/version.c @@ -756,6 +756,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ /**/ + 3388, +/**/ 3387, /**/ 3386,