Skip to content

Commit

Permalink
Add Sys.which and Sys.isexecutable
Browse files Browse the repository at this point in the history
  • Loading branch information
ararslan committed May 22, 2018
1 parent c5527e9 commit adb3ab7
Show file tree
Hide file tree
Showing 3 changed files with 52 additions and 0 deletions.
3 changes: 3 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -301,6 +301,8 @@ Currently, the `@compat` macro supports the following syntaxes:

* `squeeze` with `dims` as keyword argument ([#26660]).

* `Compat.Sys.which` and `Compat.Sys.isexecutable` ([#26559]).

* `Compat.qr` takes `pivot` as a `Val` _instance_ and keyword argument `full` ([#22475], [#24279]).

* `Compat.rmul!` provides a subset of the functionality of `LinearAlgebra.rmul!` for
Expand Down Expand Up @@ -637,6 +639,7 @@ includes this fix. Find the minimum version from there.
[#26369]: https://github.com/JuliaLang/julia/issues/26369
[#26436]: https://github.com/JuliaLang/julia/issues/26436
[#26442]: https://github.com/JuliaLang/julia/issues/26442
[#26559]: https://github.com/JuliaLang/julia/issues/26559
[#26660]: https://github.com/JuliaLang/julia/issues/26660
[#26670]: https://github.com/JuliaLang/julia/issues/26670
[#27077]: https://github.com/JuliaLang/julia/issues/27077
39 changes: 39 additions & 0 deletions src/Compat.jl
Original file line number Diff line number Diff line change
Expand Up @@ -492,6 +492,45 @@ module Sys
import Base.Sys: isapple, isbsd, islinux, isunix, iswindows
end

@static if VERSION < v"0.7.0-DEV.5171"
function isexecutable(path::AbstractString)
if iswindows()
isfile(path)
else
ccall(:access, Cint, (Ptr{UInt8}, Cint), path, 0x01) == 0
end
end

function which(program::AbstractString)
progs = String[]
base = basename(program)
if iswindows()
isempty(last(splitext(base))) || push!(progs, base)
for p = [".exe", ".com"]
push!(progs, base * p)
end
else
push!(progs, base)
end
dirs = String[]
dir = dirname(program)
if isempty(dir)
pathsep = iswindows() ? ';' : ':'
append!(dirs, map(abspath, split(get(ENV, "PATH", ""), pathsep)))
iswindows() && pushfirst!(dirs, pwd())
else
push!(dirs, abspath(dir))
end
for d in dirs, p in progs
path = joinpath(d, p)
isexecutable(path) && return realpath(path)
end
error("$program not found")
end
else
import Base.Sys: which, isexecutable
end

# https://github.com/JuliaLang/julia/pull/25102
# NOTE: This needs to be in an __init__ because JULIA_HOME is not
# defined when building system images.
Expand Down
10 changes: 10 additions & 0 deletions test/runtests.jl
Original file line number Diff line number Diff line change
Expand Up @@ -1757,4 +1757,14 @@ end
@test isletter('β')
@test !isletter('3')

# 0.7.0-DEV.5171
let sep = Compat.Sys.iswindows() ? ';' : ':'
withenv("PATH" => string(Compat.Sys.BINDIR, sep, get(ENV, "PATH", ""))) do
jl = joinpath(Compat.Sys.BINDIR, "julia") * (Compat.Sys.iswindows() ? ".exe" : "")
@test Compat.Sys.which("julia") == realpath(jl)
@test Compat.Sys.isexecutable(jl)
@test_throws ErrorException Compat.Sys.which("reallyseriouslynotathingyoushouldhave")
end
end

nothing

0 comments on commit adb3ab7

Please sign in to comment.