]> git.ipfire.org Git - thirdparty/vim.git/commitdiff
patch 9.0.0865: duplicate arguments are not always detected v9.0.0865
authorNir Lichtman <nir@lichtman.org>
Sat, 12 Nov 2022 17:00:31 +0000 (17:00 +0000)
committerBram Moolenaar <Bram@vim.org>
Sat, 12 Nov 2022 17:00:31 +0000 (17:00 +0000)
Problem:    Duplicate arguments are not always detected.
Solution:   Expand to full path before comparing arguments. (Nir Lichtman,
            closes #11505, closes #9402)

src/arglist.c
src/testdir/test_arglist.vim
src/version.c

index bc51cded1f84918034b11486244bb8931627363a..b35cdfe7ab41218d90686844fadd121089bafeb5 100644 (file)
@@ -784,9 +784,25 @@ ex_argdedupe(exarg_T *eap UNUSED)
     int j;
 
     for (i = 0; i < ARGCOUNT; ++i)
+    {
+       // Expand each argument to a full path to catch different paths leading
+       // to the same file.
+       char_u *firstFullname = FullName_save(ARGLIST[i].ae_fname, FALSE);
+       if (firstFullname == NULL)
+           return;  // out of memory
+
        for (j = i + 1; j < ARGCOUNT; ++j)
-           if (fnamecmp(ARGLIST[i].ae_fname, ARGLIST[j].ae_fname) == 0)
+       {
+           char_u *secondFullname = FullName_save(ARGLIST[j].ae_fname, FALSE);
+           if (secondFullname == NULL)
+               break;  // out of memory
+           int areNamesDuplicate =
+                                 fnamecmp(firstFullname, secondFullname) == 0;
+           vim_free(secondFullname);
+
+           if (areNamesDuplicate)
            {
+               // remove one duplicate argument
                vim_free(ARGLIST[j].ae_fname);
                mch_memmove(ARGLIST + j, ARGLIST + j + 1,
                                        (ARGCOUNT - j - 1) * sizeof(aentry_T));
@@ -799,6 +815,10 @@ ex_argdedupe(exarg_T *eap UNUSED)
 
                --j;
            }
+       }
+
+       vim_free(firstFullname);
+    }
 }
 
 /*
index 1bc556fa916ca0d1614bbafd3a32d31b4667b472..edc8b77429e20ac6c68c5434bb35a621b9888484 100644 (file)
@@ -420,15 +420,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')
@@ -436,11 +440,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
 
index a0c4371ce6de8d84859f73c4e3c9525a211341a0..98e7fd0b5287cccd6742c3b70d9b60ca6829535e 100644 (file)
@@ -695,6 +695,8 @@ static char *(features[]) =
 
 static int included_patches[] =
 {   /* Add new patch number below this line */
+/**/
+    865,
 /**/
     864,
 /**/