changeset 19936:ce463840c826 v8.2.0524

patch 8.2.0524: Win32: searching for file matches is slow Commit: https://github.com/vim/vim/commit/c74fbfedfa2df384cca5f6763e2c9e5c0ca6d513 Author: Bram Moolenaar <Bram@vim.org> Date: Mon Apr 6 22:56:28 2020 +0200 patch 8.2.0524: Win32: searching for file matches is slow Problem: Win32: searching for file matches is slow. Solution: Instead of making another round to find any short filename, check for the short name right away. Avoid using an ordinary file like a directory. (Nir Lichtman, closes #5883)
author Bram Moolenaar <Bram@vim.org>
date Mon, 06 Apr 2020 23:00:29 +0200
parents 7d46edfd1c55
children 87711a925c87
files src/filepath.c src/version.c
diffstat 2 files changed, 17 insertions(+), 18 deletions(-) [+]
line wrap: on
line diff
--- a/src/filepath.c
+++ b/src/filepath.c
@@ -64,6 +64,7 @@ get_short_pathname(char_u **fnamep, char
     if (l != 0)
     {
 	char_u *p = utf16_to_enc(newbuf, NULL);
+
 	if (p != NULL)
 	{
 	    vim_free(*bufp);
@@ -3047,6 +3048,7 @@ dos_expandpath(
     WCHAR		*wn = NULL;	// UCS-2 name, NULL when not used.
     char_u		*matchname;
     int			ok;
+    char_u		*p_alt;
 
     // Expanding "**" may take a long time, check for CTRL-C.
     if (stardepth > 0)
@@ -3161,9 +3163,15 @@ dos_expandpath(
     while (ok)
     {
 	p = utf16_to_enc(wfb.cFileName, NULL);   // p is allocated here
+
 	if (p == NULL)
 	    break;  // out of memory
 
+	if (*wfb.cAlternateFileName == NUL)
+	    p_alt == NULL;
+	else
+	    p_alt = utf16_to_enc(wfb.cAlternateFileName, NULL);
+
 	// Ignore entries starting with a dot, unless when asked for.  Accept
 	// all entries found with "matchname".
 	if ((p[0] != '.' || starts_with_dot
@@ -3171,14 +3179,18 @@ dos_expandpath(
 			     && p[1] != NUL && (p[1] != '.' || p[2] != NUL)))
 		&& (matchname == NULL
 		  || (regmatch.regprog != NULL
-				     && vim_regexec(&regmatch, p, (colnr_T)0))
+		     && (vim_regexec(&regmatch, p, (colnr_T)0)
+			 || (p_alt != NULL
+				 && vim_regexec(&regmatch, p_alt, (colnr_T)0)))
+		     ))
 		  || ((flags & EW_NOTWILD)
 		     && fnamencmp(path + (s - buf), p, e - s) == 0)))
 	{
 	    STRCPY(s, p);
 	    len = (int)STRLEN(buf);
 
-	    if (starstar && stardepth < 100)
+	    if (starstar && stardepth < 100
+			  && (wfb.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY))
 	    {
 		// For "**" in the pattern first go deeper in the tree to
 		// find matches.
@@ -3207,24 +3219,9 @@ dos_expandpath(
 	    }
 	}
 
+	vim_free(p_alt);
 	vim_free(p);
 	ok = FindNextFileW(hFind, &wfb);
-
-	// If no more matches and no match was used, try expanding the name
-	// itself.  Finds the long name of a short filename.
-	if (!ok && matchname != NULL && gap->ga_len == start_len)
-	{
-	    STRCPY(s, matchname);
-	    FindClose(hFind);
-	    vim_free(wn);
-	    wn = enc_to_utf16(buf, NULL);
-	    if (wn != NULL)
-		hFind = FindFirstFileW(wn, &wfb);
-	    else
-		hFind =	INVALID_HANDLE_VALUE;
-	    ok = (hFind != INVALID_HANDLE_VALUE);
-	    VIM_CLEAR(matchname);
-	}
     }
 
     FindClose(hFind);
--- a/src/version.c
+++ b/src/version.c
@@ -739,6 +739,8 @@ static char *(features[]) =
 static int included_patches[] =
 {   /* Add new patch number below this line */
 /**/
+    524,
+/**/
     523,
 /**/
     522,