Current section
Files
Jump to
Current section
Files
lib/nox.nvm.ex
defmodule Nox.Nvm do
@moduledoc """
NVM wrapper
"""
alias Nox.Semver
@doc """
Run NVM command
"""
@spec run(Nox.Env.t, String.t | nil) :: :ok | {:error, code :: integer}
def run(env, args) do
exe = Path.join [basedir(env), "bin", "nodenv"]
case System.cmd(exe, String.split(args), env: sys_env(env), stderr_to_stdout: true, into: Nox.Cli.stream()) do
{_, 0} -> :ok
{_, code} -> {:error, code}
end
end
@doc """
Returns environment variables for working with this env
"""
@spec sys_env(Nox.Env.t) :: [{String.t, String.t}]
def sys_env(env) do
bindir = bindir(env)
path0 = System.get_env("PATH")
[
{"PATH", "#{bindir}:#{path0}"},
{"NODENV_ROOT", basedir(env)}
]
end
@doc false
def basedir(env), do: Path.join env.dir, "nvm"
@doc false
def bindir(env), do: Path.join basedir(env), "shims"
@doc """
Returns true if installed version matches required one
"""
@spec stale?(Nox.Env.t) :: boolean
def stale?(env) do
case version(env) do
:error -> true
vsn -> Semver.cmp(env.versions[:nvm], vsn, :minor) != 0
end
end
@doc """
Returns real version from dir
"""
@spec version(Path.t | Nox.Env.t) :: String.t
def version(dir) when is_binary(dir), do: version(Nox.Env.new(dir: dir))
def version(env) do
out = :os.cmd('git -C #{basedir(env)} describe 2> /dev/null')
case String.trim("#{out}") do
"" -> :error
vsn -> vsn
end
end
end