findExe() now by default follows symlinks.

This commit is contained in:
Hans Raaf
2016-07-16 22:44:19 +02:00
parent 2ac21261b4
commit c00bb2ca82
2 changed files with 27 additions and 5 deletions

View File

@@ -556,12 +556,21 @@ when declared(getEnv) or defined(nimscript):
yield substr(s, first, last-1)
inc(last)
proc findExe*(exe: string): string {.
when not defined(windows) and declared(os):
proc checkSymlink(path: string): bool =
var rawInfo: Stat
if lstat(path, rawInfo) < 0'i32:
raiseOSError(osLastError())
S_ISLNK(rawInfo.st_mode)
proc findExe*(exe: string, followSymlinks: bool = true): string {.
tags: [ReadDirEffect, ReadEnvEffect, ReadIOEffect].} =
## Searches for `exe` in the current working directory and then
## in directories listed in the ``PATH`` environment variable.
## Returns "" if the `exe` cannot be found. On DOS-like platforms, `exe`
## is added the `ExeExt <#ExeExt>`_ file extension if it has none.
## If the system supports symlinks it also resolves them until it
## meets the actual file. This behavior can be disabled if desired.
result = addFileExt(exe, ExeExt)
if existsFile(result): return
var path = string(getEnv("PATH"))
@@ -572,7 +581,22 @@ when declared(getEnv) or defined(nimscript):
result
else:
var x = expandTilde(candidate) / result
if existsFile(x): return x
if existsFile(x):
when not defined(windows) and declared(os):
while followSymlinks: # doubles as if here
if x.checkSymlink:
var r = newString(256)
var len = readlink(x, r, 256)
if len < 0:
raiseOSError(osLastError())
if len > 256:
r = newString(len+1)
len = readlink(x, r, len)
setLen(r, len)
x = r
else:
break
return x
result = ""
when defined(nimscript) or (defined(nimdoc) and not declared(os)):