Merge branch 'develop' into gun
[akkoma] / lib / pleroma / otp_version.ex
1 defmodule Pleroma.OTPVersion do
2 @type check_status() :: :undefined | {:error, String.t()} | :ok
3
4 require Logger
5
6 @spec check_version() :: check_status()
7 def check_version do
8 # OTP Version https://erlang.org/doc/system_principles/versions.html#otp-version
9 paths = [
10 Path.join(:code.root_dir(), "OTP_VERSION"),
11 Path.join([:code.root_dir(), "releases", :erlang.system_info(:otp_release), "OTP_VERSION"])
12 ]
13
14 :tesla
15 |> Application.get_env(:adapter)
16 |> get_and_check_version(paths)
17 end
18
19 @spec get_and_check_version(module(), [Path.t()]) :: check_status()
20 def get_and_check_version(Tesla.Adapter.Gun, paths) do
21 paths
22 |> check_files()
23 |> check_version()
24 end
25
26 def get_and_check_version(_, _), do: :ok
27
28 defp check_files([]), do: nil
29
30 defp check_files([path | paths]) do
31 if File.exists?(path) do
32 File.read!(path)
33 else
34 check_files(paths)
35 end
36 end
37
38 defp check_version(nil), do: :undefined
39
40 defp check_version(version) do
41 try do
42 version = String.replace(version, ~r/\r|\n|\s/, "")
43
44 formatted =
45 version
46 |> String.split(".")
47 |> Enum.map(&String.to_integer/1)
48 |> Enum.take(2)
49
50 with [major, minor] when length(formatted) == 2 <- formatted,
51 true <- (major == 22 and minor >= 2) or major > 22 do
52 :ok
53 else
54 false -> {:error, version}
55 _ -> :undefined
56 end
57 rescue
58 _ -> :undefined
59 catch
60 _ -> :undefined
61 end
62 end
63 end