]> git.ipfire.org Git - thirdparty/vim.git/commitdiff
updated for version 7.4.672 v7.4.672
authorBram Moolenaar <Bram@vim.org>
Sat, 21 Mar 2015 16:32:19 +0000 (17:32 +0100)
committerBram Moolenaar <Bram@vim.org>
Sat, 21 Mar 2015 16:32:19 +0000 (17:32 +0100)
Problem:    When completing a shell command, directories in the current
            directory are not listed.
Solution:   When "." is not in $PATH also look in the current directory for
            directories.

13 files changed:
src/eval.c
src/ex_getln.c
src/misc1.c
src/os_amiga.c
src/os_msdos.c
src/os_unix.c
src/os_vms.c
src/proto/os_amiga.pro
src/proto/os_msdos.pro
src/proto/os_unix.pro
src/proto/os_win32.pro
src/version.c
src/vim.h

index 7aefdb58fd579c58417fdc2a055de99024bdfef3..ebd7e379e897ba22cc4a1ff33db15152b667ca33 100644 (file)
@@ -10271,7 +10271,11 @@ f_executable(argvars, rettv)
     typval_T   *argvars;
     typval_T   *rettv;
 {
-    rettv->vval.v_number = mch_can_exe(get_tv_string(&argvars[0]), NULL);
+    char_u *name = get_tv_string(&argvars[0]);
+
+    /* Check in $PATH and also check directly if there is a directory name. */
+    rettv->vval.v_number = mch_can_exe(name, NULL, TRUE)
+                || (gettail(name) != name && mch_can_exe(name, NULL, FALSE));
 }
 
 /*
@@ -10284,7 +10288,7 @@ f_exepath(argvars, rettv)
 {
     char_u *p = NULL;
 
-    (void)mch_can_exe(get_tv_string(&argvars[0]), &p);
+    (void)mch_can_exe(get_tv_string(&argvars[0]), &p, TRUE);
     rettv->v_type = VAR_STRING;
     rettv->vval.v_string = p;
 }
index e18a8ede93cc53b0c5538c80dd7ab759ec2d7651..31e61d0945ac76c4505bc8d50e5cd8df569ce401 100644 (file)
@@ -4885,6 +4885,7 @@ expand_shellcmd(filepat, num_file, file, flagsarg)
     char_u     *s, *e;
     int                flags = flagsarg;
     int                ret;
+    int                did_curdir = FALSE;
 
     if (buf == NULL)
        return FAIL;
@@ -4896,7 +4897,7 @@ expand_shellcmd(filepat, num_file, file, flagsarg)
        if (pat[i] == '\\' && pat[i + 1] == ' ')
            STRMOVE(pat + i, pat + i + 1);
 
-    flags |= EW_FILE | EW_EXEC;
+    flags |= EW_FILE | EW_EXEC | EW_SHELLCMD;
 
     /* For an absolute name we don't use $PATH. */
     if (mch_isFullName(pat))
@@ -4913,11 +4914,22 @@ expand_shellcmd(filepat, num_file, file, flagsarg)
 
     /*
      * Go over all directories in $PATH.  Expand matches in that directory and
-     * collect them in "ga".
+     * collect them in "ga".  When "." is not in $PATH also expand for the
+     * current directory, to find "subdir/cmd".
      */
     ga_init2(&ga, (int)sizeof(char *), 10);
-    for (s = path; *s != NUL; s = e)
+    for (s = path; ; s = e)
     {
+       if (*s == NUL)
+       {
+           if (did_curdir)
+               break;
+           /* Find directories in the current directory, path is empty. */
+           did_curdir = TRUE;
+       }
+       else if (*s == '.')
+           did_curdir = TRUE;
+
        if (*s == ' ')
            ++s;        /* Skip space used for absolute path name. */
 
index 940a3e917e6d64686cd514da4c68ba5e770c435b..bd1fe255b1d4528928b2f4ae3fcb06e27cd5fd71 100644 (file)
@@ -10987,8 +10987,10 @@ addfile(gap, f, flags)
     if ((isdir && !(flags & EW_DIR)) || (!isdir && !(flags & EW_FILE)))
        return;
 
-    /* If the file isn't executable, may not add it.  Do accept directories. */
-    if (!isdir && (flags & EW_EXEC) && !mch_can_exe(f, NULL))
+    /* If the file isn't executable, may not add it.  Do accept directories.
+     * When invoked from expand_shellcmd() do not use $PATH. */
+    if (!isdir && (flags & EW_EXEC)
+                            && !mch_can_exe(f, NULL, !(flags & EW_SHELLCMD)))
        return;
 
     /* Make room for another item in the file list. */
index 324fc367b7c475e69560d6f7b37cffa8a53e3116..ccd3b0c1c5c11cf85311879019c2c7dfce13eab2 100644 (file)
@@ -881,12 +881,14 @@ mch_mkdir(name)
 
 /*
  * Return 1 if "name" can be executed, 0 if not.
+ * If "use_path" is FALSE only check if "name" is executable.
  * Return -1 if unknown.
  */
     int
-mch_can_exe(name, path)
+mch_can_exe(name, path, use_path)
     char_u     *name;
     char_u     **path;
+    int                use_path;
 {
     /* TODO */
     return -1;
index f24a6f8eadfb7d3bbf8422084d81674ea61d1e30..1b75a30f7fd2b2655a8bc3936b67b87ead474377 100644 (file)
@@ -2942,15 +2942,24 @@ mch_isdir(char_u *name)
 
 /*
  * Return 1 if "name" can be executed, 0 if not.
+ * If "use_path" is FALSE only check if "name" is executable.
  * Return -1 if unknown.
  */
     int
-mch_can_exe(name, path)
+mch_can_exe(name, path, use_path)
     char_u     *name;
     char_u     **path;
+    int                use_path;
 {
     char       *p;
+    int                mode;
 
+    if (!use_path)
+    {
+       /* TODO: proper check if file is executable. */
+       mode = vim_chmod(name);
+       return mode != -1 && (mode & FA_DIREC) == 0;
+    }
     p = searchpath(name);
     if (p == NULL || mch_isdir(p))
        return FALSE;
index 8f6b9143ee1e339278a5ab99960f71d66cfd87ba..df045a50f697c382fa570fbd1c4fae1d0de98f40 100644 (file)
@@ -3104,22 +3104,27 @@ executable_file(name)
 
 /*
  * Return 1 if "name" can be found in $PATH and executed, 0 if not.
+ * If "use_path" is FALSE only check if "name" is executable.
  * Return -1 if unknown.
  */
     int
-mch_can_exe(name, path)
+mch_can_exe(name, path, use_path)
     char_u     *name;
     char_u     **path;
+    int                use_path;
 {
     char_u     *buf;
     char_u     *p, *e;
     int                retval;
 
-    /* If it's an absolute or relative path don't need to use $PATH. */
-    if (mch_isFullName(name) || (name[0] == '.' && (name[1] == '/'
-                                     || (name[1] == '.' && name[2] == '/'))))
+    /* When "use_path" is false and if it's an absolute or relative path don't
+     * need to use $PATH. */
+    if (!use_path || mch_isFullName(name) || (name[0] == '.'
+                  && (name[1] == '/' || (name[1] == '.' && name[2] == '/'))))
     {
-       if (executable_file(name))
+       /* There must be a path separator, files in the current directory
+        * can't be executed. */
+       if (gettail(name) != name && executable_file(name))
        {
            if (path != NULL)
            {
@@ -5730,7 +5735,8 @@ mch_expand_wildcards(num_pat, pat, num_file, file, flags)
                    continue;
 
                /* Skip files that are not executable if we check for that. */
-               if (!dir && (flags & EW_EXEC) && !mch_can_exe(p, NULL))
+               if (!dir && (flags & EW_EXEC)
+                            && !mch_can_exe(p, NULL, !(flags & EW_SHELLCMD)))
                    continue;
 
                if (--files_free == 0)
@@ -6230,7 +6236,8 @@ mch_expand_wildcards(num_pat, pat, num_file, file, flags)
            continue;
 
        /* Skip files that are not executable if we check for that. */
-       if (!dir && (flags & EW_EXEC) && !mch_can_exe((*file)[i], NULL))
+       if (!dir && (flags & EW_EXEC)
+                   && !mch_can_exe((*file)[i], NULL, !(flags & EW_SHELLCMD)))
            continue;
 
        p = alloc((unsigned)(STRLEN((*file)[i]) + 1 + dir));
index 12eceedd0cce1f8241352dcef62cd63062d75801..7c2d87255304f875c1c385e02c9c0194fad312eb 100644 (file)
@@ -483,7 +483,8 @@ mch_expand_wildcards(int num_pat, char_u **pat, int *num_file, char_u ***file, i
                continue;
 
            /* Skip files that are not executable if we check for that. */
-           if (!dir && (flags & EW_EXEC) && !mch_can_exe(vms_fmatch[i], NULL))
+           if (!dir && (flags & EW_EXEC)
+                && !mch_can_exe(vms_fmatch[i], NULL, !(flags & EW_SHELLCMD)))
                continue;
 
            /* allocate memory for pointers */
index 16ee6571df19cc6774fb2b0cf21fac2d8c24aebb..24c1f7248bacf25201c1f466aba3a382135d6043 100644 (file)
@@ -26,7 +26,7 @@ int mch_setperm __ARGS((char_u *name, long perm));
 void mch_hide __ARGS((char_u *name));
 int mch_isdir __ARGS((char_u *name));
 int mch_mkdir __ARGS((char_u *name));
-int mch_can_exe __ARGS((char_u *name, char_u **path));
+int mch_can_exe __ARGS((char_u *name, char_u **path, int use_path));
 int mch_nodetype __ARGS((char_u *name));
 void mch_early_init __ARGS((void));
 void mch_exit __ARGS((int r));
index e75521110a679976e2bcd32eabe35ac8e3a53d49..e035b9509ebf28401bf89e3bd0eab9796144f035 100644 (file)
@@ -38,7 +38,7 @@ long mch_getperm __ARGS((char_u *name));
 int mch_setperm __ARGS((char_u *name, long perm));
 void mch_hide __ARGS((char_u *name));
 int mch_isdir __ARGS((char_u *name));
-int mch_can_exe __ARGS((char_u *name, char_u **path));
+int mch_can_exe __ARGS((char_u *name, char_u **path, int use_path));
 int mch_nodetype __ARGS((char_u *name));
 int mch_dirname __ARGS((char_u *buf, int len));
 int mch_remove __ARGS((char_u *name));
index a59b6aa5e5429e4a21f8aa2679398dd53ba01acf..23434ba9fd6556683ca002347724d98e7b7560d9 100644 (file)
@@ -42,7 +42,7 @@ void mch_set_acl __ARGS((char_u *fname, vim_acl_T aclent));
 void mch_free_acl __ARGS((vim_acl_T aclent));
 void mch_hide __ARGS((char_u *name));
 int mch_isdir __ARGS((char_u *name));
-int mch_can_exe __ARGS((char_u *name, char_u **path));
+int mch_can_exe __ARGS((char_u *name, char_u **path, int use_path));
 int mch_nodetype __ARGS((char_u *name));
 void mch_early_init __ARGS((void));
 void mch_free_mem __ARGS((void));
index c149bc89f574b906149cb5450197dbb6458355a6..cbabe3a9f153244806ced79d7f3d34c6412465c3 100644 (file)
@@ -26,7 +26,7 @@ int mch_is_symbolic_link __ARGS((char_u *fname));
 int mch_is_linked __ARGS((char_u *fname));
 int win32_fileinfo __ARGS((char_u *fname, BY_HANDLE_FILE_INFORMATION *info));
 int mch_writable __ARGS((char_u *name));
-int mch_can_exe __ARGS((char_u *name, char_u **path));
+int mch_can_exe __ARGS((char_u *name, char_u **path, int use_path));
 int mch_nodetype __ARGS((char_u *name));
 vim_acl_T mch_get_acl __ARGS((char_u *fname));
 void mch_set_acl __ARGS((char_u *fname, vim_acl_T acl));
index 405b8a7cee08c7e49fcfa4986690faf2047f1c7e..344c327dde517a794101056e1d9393e7aad34569 100644 (file)
@@ -741,6 +741,8 @@ static char *(features[]) =
 
 static int included_patches[] =
 {   /* Add new patch number below this line */
+/**/
+    672,
 /**/
     671,
 /**/
index 825c844c2c59133c7ca9d3bf7720add7f1708925..fe8f5582886894f614ac2c07f8ce28d9cc59238d 100644 (file)
--- a/src/vim.h
+++ b/src/vim.h
@@ -841,6 +841,8 @@ extern char *(*dyn_libintl_textdomain)(const char *domainname);
 /* Note: mostly EW_NOTFOUND and EW_SILENT are mutually exclusive: EW_NOTFOUND
  * is used when executing commands and EW_SILENT for interactive expanding. */
 #define EW_ALLLINKS    0x1000  /* also links not pointing to existing file */
+#define EW_SHELLCMD    0x2000  /* called from expand_shellcmd(), don't check
+                                * if executable is in $PATH */
 
 /* Flags for find_file_*() functions. */
 #define FINDFILE_FILE  0       /* only files */