findExe finds cmd and bat files; refs #5049

This commit is contained in:
Araq 2017-01-06 14:07:05 +01:00
commit 36964d7491

View file

@ -562,24 +562,33 @@ when declared(getEnv) or defined(nimscript):
if lstat(path, rawInfo) < 0'i32: result = false if lstat(path, rawInfo) < 0'i32: result = false
else: result = S_ISLNK(rawInfo.st_mode) else: result = S_ISLNK(rawInfo.st_mode)
proc findExe*(exe: string, followSymlinks: bool = true): string {. const
ExeExts* = when defined(windows): ["exe", "cmd", "bat"] else: [""] ## \
## platform specific file extension for executables. On Windows
## ``["exe", "cmd", "bat"]``, on Posix ``[""]``.
proc findExe*(exe: string, followSymlinks: bool = true;
extensions=ExeExts): string {.
tags: [ReadDirEffect, ReadEnvEffect, ReadIOEffect].} = tags: [ReadDirEffect, ReadEnvEffect, ReadIOEffect].} =
## Searches for `exe` in the current working directory and then ## Searches for `exe` in the current working directory and then
## in directories listed in the ``PATH`` environment variable. ## in directories listed in the ``PATH`` environment variable.
## Returns "" if the `exe` cannot be found. On DOS-like platforms, `exe` ## Returns "" if the `exe` cannot be found. `exe`
## is added the `ExeExt <#ExeExt>`_ file extension if it has none. ## is added the `ExeExts <#ExeExts>`_ file extensions if it has none.
## If the system supports symlinks it also resolves them until it ## If the system supports symlinks it also resolves them until it
## meets the actual file. This behavior can be disabled if desired. ## meets the actual file. This behavior can be disabled if desired.
result = addFileExt(exe, ExeExt) for ext in extensions:
result = addFileExt(exe, ext)
if existsFile(result): return if existsFile(result): return
var path = string(getEnv("PATH")) var path = string(getEnv("PATH"))
for candidate in split(path, PathSep): for candidate in split(path, PathSep):
when defined(windows): when defined(windows):
var x = (if candidate[0] == '"' and candidate[^1] == '"': var x = (if candidate[0] == '"' and candidate[^1] == '"':
substr(candidate, 1, candidate.len-2) else: candidate) / substr(candidate, 1, candidate.len-2) else: candidate) /
result exe
else: else:
var x = expandTilde(candidate) / result var x = expandTilde(candidate) / exe
for ext in extensions:
let x = addFileExt(x, ext)
if existsFile(x): if existsFile(x):
when not defined(windows) and declared(os): when not defined(windows) and declared(os):
while followSymlinks: # doubles as if here while followSymlinks: # doubles as if here