diff --git a/7.4.672 b/7.4.672 new file mode 100644 index 0000000..579b6ef --- /dev/null +++ b/7.4.672 @@ -0,0 +1,443 @@ +To: vim_dev@googlegroups.com +Subject: Patch 7.4.672 +Fcc: outbox +From: Bram Moolenaar +Mime-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit +------------ + +Patch 7.4.672 +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. +Files: src/ex_getln.c, src/vim.h, src/misc1.c, src/eval.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 + + +*** ../vim-7.4.671/src/ex_getln.c 2015-03-05 19:35:20.690114997 +0100 +--- src/ex_getln.c 2015-03-21 16:18:22.392988057 +0100 +*************** +*** 4885,4890 **** +--- 4885,4891 ---- + char_u *s, *e; + int flags = flagsarg; + int ret; ++ int did_curdir = FALSE; + + if (buf == NULL) + return FAIL; +*************** +*** 4896,4902 **** + if (pat[i] == '\\' && pat[i + 1] == ' ') + STRMOVE(pat + i, pat + i + 1); + +! flags |= EW_FILE | EW_EXEC; + + /* For an absolute name we don't use $PATH. */ + if (mch_isFullName(pat)) +--- 4897,4903 ---- + if (pat[i] == '\\' && pat[i + 1] == ' ') + STRMOVE(pat + i, pat + i + 1); + +! flags |= EW_FILE | EW_EXEC | EW_SHELLCMD; + + /* For an absolute name we don't use $PATH. */ + if (mch_isFullName(pat)) +*************** +*** 4913,4923 **** + + /* + * Go over all directories in $PATH. Expand matches in that directory and +! * collect them in "ga". + */ + ga_init2(&ga, (int)sizeof(char *), 10); +! for (s = path; *s != NUL; s = e) + { + if (*s == ' ') + ++s; /* Skip space used for absolute path name. */ + +--- 4914,4935 ---- + + /* + * Go over all directories in $PATH. Expand matches in that directory and +! * 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 = 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. */ + +*** ../vim-7.4.671/src/vim.h 2015-03-05 19:35:20.686115042 +0100 +--- src/vim.h 2015-03-21 16:19:12.656419663 +0100 +*************** +*** 841,846 **** +--- 841,848 ---- + /* 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 */ +*** ../vim-7.4.671/src/misc1.c 2015-03-20 19:06:01.982429823 +0100 +--- src/misc1.c 2015-03-21 17:03:42.218172476 +0100 +*************** +*** 10987,10994 **** + 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)) + return; + + /* Make room for another item in the file list. */ +--- 10987,10996 ---- + if ((isdir && !(flags & EW_DIR)) || (!isdir && !(flags & EW_FILE))) + return; + +! /* 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. */ +*** ../vim-7.4.671/src/eval.c 2015-03-20 17:36:38.618949214 +0100 +--- src/eval.c 2015-03-21 16:53:45.996929428 +0100 +*************** +*** 10271,10277 **** + typval_T *argvars; + typval_T *rettv; + { +! rettv->vval.v_number = mch_can_exe(get_tv_string(&argvars[0]), NULL); + } + + /* +--- 10271,10281 ---- + typval_T *argvars; + typval_T *rettv; + { +! 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,10290 **** + { + char_u *p = NULL; + +! (void)mch_can_exe(get_tv_string(&argvars[0]), &p); + rettv->v_type = VAR_STRING; + rettv->vval.v_string = p; + } +--- 10288,10294 ---- + { + char_u *p = NULL; + +! (void)mch_can_exe(get_tv_string(&argvars[0]), &p, TRUE); + rettv->v_type = VAR_STRING; + rettv->vval.v_string = p; + } +*** ../vim-7.4.671/src/os_amiga.c 2014-04-01 21:00:45.436733663 +0200 +--- src/os_amiga.c 2015-03-21 16:54:49.456210821 +0100 +*************** +*** 881,892 **** + + /* + * Return 1 if "name" can be executed, 0 if not. + * Return -1 if unknown. + */ + int +! mch_can_exe(name, path) + char_u *name; + char_u **path; + { + /* TODO */ + return -1; +--- 881,894 ---- + + /* + * 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, use_path) + char_u *name; + char_u **path; ++ int use_path; + { + /* TODO */ + return -1; +*** ../vim-7.4.671/src/os_msdos.c 2014-04-01 21:00:45.436733663 +0200 +--- src/os_msdos.c 2015-03-21 16:55:03.048056750 +0100 +*************** +*** 2942,2956 **** + + /* + * Return 1 if "name" can be executed, 0 if not. + * Return -1 if unknown. + */ + int +! mch_can_exe(name, path) + char_u *name; + char_u **path; + { + char *p; + + p = searchpath(name); + if (p == NULL || mch_isdir(p)) + return FALSE; +--- 2942,2965 ---- + + /* + * 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, 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; +*** ../vim-7.4.671/src/os_unix.c 2015-03-20 16:26:48.974173903 +0100 +--- src/os_unix.c 2015-03-21 17:07:43.083443005 +0100 +*************** +*** 3104,3125 **** + + /* + * Return 1 if "name" can be found in $PATH and executed, 0 if not. + * Return -1 if unknown. + */ + int +! mch_can_exe(name, path) + char_u *name; + char_u **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] == '/')))) +! { +! if (executable_file(name)) + { + if (path != NULL) + { +--- 3104,3130 ---- + + /* + * 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, use_path) + char_u *name; + char_u **path; ++ int use_path; + { + char_u *buf; + char_u *p, *e; + int retval; + +! /* 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] == '/')))) +! { +! /* 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,5736 **** + continue; + + /* Skip files that are not executable if we check for that. */ +! if (!dir && (flags & EW_EXEC) && !mch_can_exe(p, NULL)) + continue; + + if (--files_free == 0) +--- 5735,5742 ---- + continue; + + /* Skip files that are not executable if we check for that. */ +! if (!dir && (flags & EW_EXEC) +! && !mch_can_exe(p, NULL, !(flags & EW_SHELLCMD))) + continue; + + if (--files_free == 0) +*************** +*** 6230,6236 **** + continue; + + /* Skip files that are not executable if we check for that. */ +! if (!dir && (flags & EW_EXEC) && !mch_can_exe((*file)[i], NULL)) + continue; + + p = alloc((unsigned)(STRLEN((*file)[i]) + 1 + dir)); +--- 6236,6243 ---- + continue; + + /* Skip files that are not executable if we check for that. */ +! if (!dir && (flags & EW_EXEC) +! && !mch_can_exe((*file)[i], NULL, !(flags & EW_SHELLCMD))) + continue; + + p = alloc((unsigned)(STRLEN((*file)[i]) + 1 + dir)); +*** ../vim-7.4.671/src/os_vms.c 2014-11-12 16:10:44.258085148 +0100 +--- src/os_vms.c 2015-03-21 16:43:28.283924831 +0100 +*************** +*** 483,489 **** + continue; + + /* Skip files that are not executable if we check for that. */ +! if (!dir && (flags & EW_EXEC) && !mch_can_exe(vms_fmatch[i], NULL)) + continue; + + /* allocate memory for pointers */ +--- 483,490 ---- + continue; + + /* Skip files that are not executable if we check for that. */ +! if (!dir && (flags & EW_EXEC) +! && !mch_can_exe(vms_fmatch[i], NULL, !(flags & EW_SHELLCMD))) + continue; + + /* allocate memory for pointers */ +*** ../vim-7.4.671/src/proto/os_amiga.pro 2014-04-01 21:00:45.436733663 +0200 +--- src/proto/os_amiga.pro 2015-03-21 16:50:36.223078295 +0100 +*************** +*** 26,32 **** + 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_nodetype __ARGS((char_u *name)); + void mch_early_init __ARGS((void)); + void mch_exit __ARGS((int r)); +--- 26,32 ---- + 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 use_path)); + int mch_nodetype __ARGS((char_u *name)); + void mch_early_init __ARGS((void)); + void mch_exit __ARGS((int r)); +*** ../vim-7.4.671/src/proto/os_msdos.pro 2014-04-01 21:00:45.436733663 +0200 +--- src/proto/os_msdos.pro 2015-03-21 16:50:39.659039386 +0100 +*************** +*** 38,44 **** + 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_nodetype __ARGS((char_u *name)); + int mch_dirname __ARGS((char_u *buf, int len)); + int mch_remove __ARGS((char_u *name)); +--- 38,44 ---- + 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 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)); +*** ../vim-7.4.671/src/proto/os_unix.pro 2014-04-01 21:00:45.440733663 +0200 +--- src/proto/os_unix.pro 2015-03-21 16:50:44.534984171 +0100 +*************** +*** 42,48 **** + 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_nodetype __ARGS((char_u *name)); + void mch_early_init __ARGS((void)); + void mch_free_mem __ARGS((void)); +--- 42,48 ---- + 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 use_path)); + int mch_nodetype __ARGS((char_u *name)); + void mch_early_init __ARGS((void)); + void mch_free_mem __ARGS((void)); +*** ../vim-7.4.671/src/proto/os_win32.pro 2014-04-01 21:00:45.440733663 +0200 +--- src/proto/os_win32.pro 2015-03-21 16:50:48.558938605 +0100 +*************** +*** 26,32 **** + 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_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)); +--- 26,32 ---- + 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 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)); +*** ../vim-7.4.671/src/version.c 2015-03-21 14:20:11.524982691 +0100 +--- src/version.c 2015-03-21 15:54:19.693311748 +0100 +*************** +*** 743,744 **** +--- 743,746 ---- + { /* Add new patch number below this line */ ++ /**/ ++ 672, + /**/ + +-- +ARTHUR: A scratch? Your arm's off! +BLACK KNIGHT: No, it isn't. +ARTHUR: Well, what's that then? +BLACK KNIGHT: I've had worse. + The Quest for the Holy Grail (Monty Python) + + /// Bram Moolenaar -- Bram@Moolenaar.net -- 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 ///