diff options
author | zeertzjq <zeertzjq@outlook.com> | 2022-11-13 08:35:15 +0800 |
---|---|---|
committer | GitHub <noreply@github.com> | 2022-11-13 08:35:15 +0800 |
commit | 9d7dc5062877bd7e035f1f7a74e2462c2e942864 (patch) | |
tree | 218c1cf91cb0efeaeab73f172050e60cd1732938 | |
parent | 849394e4e26f487586761a3640475c27ceca30b9 (diff) | |
download | rneovim-9d7dc5062877bd7e035f1f7a74e2462c2e942864.tar.gz rneovim-9d7dc5062877bd7e035f1f7a74e2462c2e942864.tar.bz2 rneovim-9d7dc5062877bd7e035f1f7a74e2462c2e942864.zip |
vim-patch:9.0.0865: duplicate arguments are not always detected (#21036)
Problem: Duplicate arguments are not always detected.
Solution: Expand to full path before comparing arguments. (Nir Lichtman,
closes vim/vim#11505, closes vim/vim#9402)
https://github.com/vim/vim/commit/b3052aa1b555ab5a81b1459a4972290381b0e7e4
Co-authored-by: Nir Lichtman <nir@lichtman.org>
-rw-r--r-- | src/nvim/arglist.c | 13 | ||||
-rw-r--r-- | src/nvim/testdir/test_arglist.vim | 10 |
2 files changed, 22 insertions, 1 deletions
diff --git a/src/nvim/arglist.c b/src/nvim/arglist.c index c7af1a71be..bd49bc8a36 100644 --- a/src/nvim/arglist.c +++ b/src/nvim/arglist.c @@ -693,8 +693,17 @@ void ex_next(exarg_T *eap) void ex_argdedupe(exarg_T *eap FUNC_ATTR_UNUSED) { for (int i = 0; i < ARGCOUNT; i++) { + // Expand each argument to a full path to catch different paths leading + // to the same file. + char *firstFullname = FullName_save(ARGLIST[i].ae_fname, false); + for (int j = i + 1; j < ARGCOUNT; j++) { - if (path_fnamecmp(ARGLIST[i].ae_fname, ARGLIST[j].ae_fname) == 0) { + char *secondFullname = FullName_save(ARGLIST[j].ae_fname, false); + bool areNamesDuplicate = path_fnamecmp(firstFullname, secondFullname) == 0; + xfree(secondFullname); + + if (areNamesDuplicate) { + // remove one duplicate argument xfree(ARGLIST[j].ae_fname); memmove(ARGLIST + j, ARGLIST + j + 1, (size_t)(ARGCOUNT - j - 1) * sizeof(aentry_T)); @@ -709,6 +718,8 @@ void ex_argdedupe(exarg_T *eap FUNC_ATTR_UNUSED) j--; } } + + xfree(firstFullname); } } diff --git a/src/nvim/testdir/test_arglist.vim b/src/nvim/testdir/test_arglist.vim index cae71e10f3..fb8b17cd16 100644 --- a/src/nvim/testdir/test_arglist.vim +++ b/src/nvim/testdir/test_arglist.vim @@ -418,15 +418,19 @@ func Test_argdedupe() call Reset_arglist() argdedupe call assert_equal([], argv()) + args a a a aa b b a b aa argdedupe call assert_equal(['a', 'aa', 'b'], argv()) + args a b c argdedupe call assert_equal(['a', 'b', 'c'], argv()) + args a argdedupe call assert_equal(['a'], argv()) + args a A b B argdedupe if has('fname_case') @@ -434,11 +438,17 @@ func Test_argdedupe() else call assert_equal(['a', 'b'], argv()) endif + args a b a c a b last argdedupe next call assert_equal('c', expand('%:t')) + + args a ./a + argdedupe + call assert_equal(['a'], argv()) + %argd endfunc |