]> granicus.if.org Git - vim/commitdiff
patch 8.2.0524: Win32: searching for file matches is slow v8.2.0524
authorBram Moolenaar <Bram@vim.org>
Mon, 6 Apr 2020 20:56:28 +0000 (22:56 +0200)
committerBram Moolenaar <Bram@vim.org>
Mon, 6 Apr 2020 20:56:28 +0000 (22:56 +0200)
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)

src/filepath.c
src/version.c

index 15372af8e26827ff3911aa6093ab709af80b5c90..c37455e852714df4aff6a3fcc647d5d889c2ebfd 100644 (file)
@@ -64,6 +64,7 @@ get_short_pathname(char_u **fnamep, char_u **bufp, int *fnamelen)
     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);
index d39537d7e90ff2bd5509ae1aa9997b1218c22f72..ae61cf2a6b2d43d7151be88b95af90ee35dbe9a3 100644 (file)
@@ -738,6 +738,8 @@ static char *(features[]) =
 
 static int included_patches[] =
 {   /* Add new patch number below this line */
+/**/
+    524,
 /**/
     523,
 /**/