spc-pleroma/lib/pleroma/otp_version.ex

64 lines
1.5 KiB
Elixir
Raw Normal View History

2020-02-11 07:12:57 +00:00
defmodule Pleroma.OTPVersion do
@type check_status() :: :undefined | {:error, String.t()} | :ok
require Logger
@spec check_version() :: check_status()
def check_version do
# OTP Version https://erlang.org/doc/system_principles/versions.html#otp-version
paths = [
Path.join(:code.root_dir(), "OTP_VERSION"),
Path.join([:code.root_dir(), "releases", :erlang.system_info(:otp_release), "OTP_VERSION"])
]
:tesla
|> Application.get_env(:adapter)
|> get_and_check_version(paths)
end
@spec get_and_check_version(module(), [Path.t()]) :: check_status()
def get_and_check_version(Tesla.Adapter.Gun, paths) do
paths
|> check_files()
|> check_version()
end
def get_and_check_version(_, _), do: :ok
defp check_files([]), do: nil
defp check_files([path | paths]) do
if File.exists?(path) do
File.read!(path)
else
check_files(paths)
end
end
defp check_version(nil), do: :undefined
defp check_version(version) do
try do
version = String.replace(version, ~r/\r|\n|\s/, "")
formatted =
version
|> String.split(".")
|> Enum.map(&String.to_integer/1)
|> Enum.take(2)
with [major, minor] when length(formatted) == 2 <- formatted,
true <- (major == 22 and minor >= 2) or major > 22 do
:ok
else
false -> {:error, version}
_ -> :undefined
end
rescue
_ -> :undefined
catch
_ -> :undefined
end
end
end