Patch 8.1.0017
Problem:    Shell command completion has duplicates. (Yegappan Lakshmanan)
Solution:   Use a hash table to avoid duplicates. (Ozaki Kiichi, closes #539,
            closes #2733)
Files:      src/ex_getln.c, src/testdir/test_cmdline.vim


*** ../vim-8.1.0016/src/ex_getln.c      2018-05-13 18:28:45.000000000 +0200
--- src/ex_getln.c      2018-05-22 16:50:19.196716156 +0200
***************
*** 5147,5153 ****
  {
      char_u    *pat;
      int               i;
!     char_u    *path;
      int               mustfree = FALSE;
      garray_T    ga;
      char_u    *buf = alloc(MAXPATHL);
--- 5147,5153 ----
  {
      char_u    *pat;
      int               i;
!     char_u    *path = NULL;
      int               mustfree = FALSE;
      garray_T    ga;
      char_u    *buf = alloc(MAXPATHL);
***************
*** 5156,5161 ****
--- 5156,5164 ----
      int               flags = flagsarg;
      int               ret;
      int               did_curdir = FALSE;
+     hashtab_T found_ht;
+     hashitem_T        *hi;
+     hash_T    hash;
  
      if (buf == NULL)
        return FAIL;
***************
*** 5169,5183 ****
  
      flags |= EW_FILE | EW_EXEC | EW_SHELLCMD;
  
!     /* For an absolute name we don't use $PATH. */
!     if (mch_isFullName(pat))
!       path = (char_u *)" ";
!     else if ((pat[0] == '.' && (vim_ispathsep(pat[1])
!                           || (pat[1] == '.' && vim_ispathsep(pat[2])))))
        path = (char_u *)".";
      else
      {
!       path = vim_getenv((char_u *)"PATH", &mustfree);
        if (path == NULL)
            path = (char_u *)"";
      }
--- 5172,5185 ----
  
      flags |= EW_FILE | EW_EXEC | EW_SHELLCMD;
  
!     if (pat[0] == '.' && (vim_ispathsep(pat[1])
!                              || (pat[1] == '.' && vim_ispathsep(pat[2]))))
        path = (char_u *)".";
      else
      {
!       /* For an absolute name we don't use $PATH. */
!       if (!mch_isFullName(pat))
!           path = vim_getenv((char_u *)"PATH", &mustfree);
        if (path == NULL)
            path = (char_u *)"";
      }
***************
*** 5188,5193 ****
--- 5190,5196 ----
       * current directory, to find "subdir/cmd".
       */
      ga_init2(&ga, (int)sizeof(char *), 10);
+     hash_init(&found_ht);
      for (s = path; ; s = e)
      {
        if (*s == NUL)
***************
*** 5200,5208 ****
        else if (*s == '.')
            did_curdir = TRUE;
  
-       if (*s == ' ')
-           ++s;        /* Skip space used for absolute path name. */
- 
  #if defined(MSWIN)
        e = vim_strchr(s, ';');
  #else
--- 5203,5208 ----
***************
*** 5229,5243 ****
            {
                for (i = 0; i < *num_file; ++i)
                {
!                   s = (*file)[i];
!                   if (STRLEN(s) > l)
                    {
!                       /* Remove the path again. */
!                       STRMOVE(s, s + l);
!                       ((char_u **)ga.ga_data)[ga.ga_len++] = s;
                    }
!                   else
!                       vim_free(s);
                }
                vim_free(*file);
            }
--- 5229,5251 ----
            {
                for (i = 0; i < *num_file; ++i)
                {
!                   char_u *name = (*file)[i];
! 
!                   if (STRLEN(name) > l)
                    {
!                       // Check if this name was already found.
!                       hash = hash_hash(name + l);
!                       hi = hash_lookup(&found_ht, name + l, hash);
!                       if (HASHITEM_EMPTY(hi))
!                       {
!                           // Remove the path that was prepended.
!                           STRMOVE(name, name + l);
!                           ((char_u **)ga.ga_data)[ga.ga_len++] = name;
!                           hash_add_item(&found_ht, hi, name, hash);
!                           name = NULL;
!                       }
                    }
!                   vim_free(name);
                }
                vim_free(*file);
            }
***************
*** 5252,5257 ****
--- 5260,5266 ----
      vim_free(pat);
      if (mustfree)
        vim_free(path);
+     hash_clear(&found_ht);
      return OK;
  }
  
*** ../vim-8.1.0016/src/testdir/test_cmdline.vim        2018-05-12 
13:15:47.000000000 +0200
--- src/testdir/test_cmdline.vim        2018-05-22 16:46:15.281766628 +0200
***************
*** 231,236 ****
--- 231,245 ----
    let l = getcompletion('not', 'mapclear')
    call assert_equal([], l)
  
+   let l = getcompletion('.', 'shellcmd')
+   call assert_equal(['./', '../'], l[0:1])
+   call assert_equal(-1, match(l[2:], '^\.\.\?/$'))
+   let root = has('win32') ? 'C:\\' : '/'
+   let l = getcompletion(root, 'shellcmd')
+   let expected = map(filter(glob(root . '*', 0, 1),
+         \ 'isdirectory(v:val) || executable(v:val)'), 'isdirectory(v:val) ? 
v:val . ''/'' : v:val')
+   call assert_equal(expected, l)
+ 
    if has('cscope')
      let l = getcompletion('', 'cscope')
      let cmds = ['add', 'find', 'help', 'kill', 'reset', 'show']
***************
*** 258,265 ****
    endif
  
    " For others test if the name is recognized.
!   let names = ['buffer', 'environment', 'file_in_path',
!       \ 'mapping', 'shellcmd', 'tag', 'tag_listfiles', 'user']
    if has('cmdline_hist')
      call add(names, 'history')
    endif
--- 267,273 ----
    endif
  
    " For others test if the name is recognized.
!   let names = ['buffer', 'environment', 'file_in_path', 'mapping', 'tag', 
'tag_listfiles', 'user']
    if has('cmdline_hist')
      call add(names, 'history')
    endif
*** ../vim-8.1.0016/src/version.c       2018-05-21 22:50:22.514568516 +0200
--- src/version.c       2018-05-22 16:48:23.473237408 +0200
***************
*** 763,764 ****
--- 763,766 ----
  {   /* Add new patch number below this line */
+ /**/
+     17,
  /**/

-- 
ARTHUR:       You are indeed brave Sir knight, but the fight is mine.
BLACK KNIGHT: Had enough?
ARTHUR:       You stupid bastard.  You havn't got any arms left.
                 "Monty Python and the Holy Grail" PYTHON (MONTY) PICTURES LTD

 /// Bram Moolenaar -- [email protected] -- http://www.Moolenaar.net   \\\
///        sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\
\\\  an exciting new programming language -- http://www.Zimbu.org        ///
 \\\            help me help AIDS victims -- http://ICCF-Holland.org    ///

-- 
-- 
You received this message from the "vim_dev" maillist.
Do not top-post! Type your reply below the text you are replying to.
For more information, visit http://www.vim.org/maillist.php

--- 
You received this message because you are subscribed to the Google Groups 
"vim_dev" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
For more options, visit https://groups.google.com/d/optout.

Raspunde prin e-mail lui