Test removed HTTP adapter
[akkoma] / lib / pleroma / utils.ex
index e95766223d86e9965fbcfdc9f5595e98a5505461..bd9939c9fa9fe9b8f0625052c728ea69a5829dcf 100644 (file)
@@ -1,13 +1,36 @@
 # Pleroma: A lightweight social networking server
-# Copyright © 2017-2020 Pleroma Authors <https://pleroma.social/>
+# Copyright © 2017-2021 Pleroma Authors <https://pleroma.social/>
 # SPDX-License-Identifier: AGPL-3.0-only
 
 defmodule Pleroma.Utils do
+  @posix_error_codes ~w(
+    eacces eagain ebadf ebadmsg ebusy edeadlk edeadlock edquot eexist efault
+    efbig eftype eintr einval eio eisdir eloop emfile emlink emultihop
+    enametoolong enfile enobufs enodev enolck enolink enoent enomem enospc
+    enosr enostr enosys enotblk enotdir enotsup enxio eopnotsupp eoverflow
+    eperm epipe erange erofs espipe esrch estale etxtbsy exdev
+  )a
+
+  @repo_timeout Pleroma.Config.get([Pleroma.Repo, :timeout], 15_000)
+
   def compile_dir(dir) when is_binary(dir) do
+    dir
+    |> elixir_files()
+    |> Kernel.ParallelCompiler.compile()
+  end
+
+  defp elixir_files(dir) when is_binary(dir) do
     dir
     |> File.ls!()
     |> Enum.map(&Path.join(dir, &1))
-    |> Kernel.ParallelCompiler.compile()
+    |> Enum.flat_map(fn path ->
+      if File.dir?(path) do
+        elixir_files(path)
+      else
+        [path]
+      end
+    end)
+    |> Enum.filter(fn path -> String.ends_with?(path, ".ex") end)
   end
 
   @doc """
@@ -22,7 +45,10 @@ defmodule Pleroma.Utils do
   """
   @spec command_available?(String.t()) :: boolean()
   def command_available?(command) do
-    match?({_output, 0}, System.cmd("sh", ["-c", "command -v #{command}"]))
+    case :os.find_executable(String.to_charlist(command)) do
+      false -> false
+      _ -> true
+    end
   end
 
   @doc "creates the uniq temporary directory"
@@ -44,4 +70,29 @@ defmodule Pleroma.Utils do
       error -> error
     end
   end
+
+  @spec posix_error_message(atom()) :: binary()
+  def posix_error_message(code) when code in @posix_error_codes do
+    error_message = Gettext.dgettext(Pleroma.Web.Gettext, "posix_errors", "#{code}")
+    "(POSIX error: #{error_message})"
+  end
+
+  def posix_error_message(_), do: ""
+
+  @doc """
+  Returns [timeout: integer] suitable for passing as an option to Repo functions.
+
+  This function detects if the execution was triggered from IEx shell, Mix task, or
+  ./bin/pleroma_ctl and sets the timeout to :infinity, else returns the default timeout value.
+  """
+  @spec query_timeout() :: [timeout: integer]
+  def query_timeout do
+    {parent, _, _, _} = Process.info(self(), :current_stacktrace) |> elem(1) |> Enum.fetch!(2)
+
+    cond do
+      parent |> to_string |> String.starts_with?("Elixir.Mix.Task") -> [timeout: :infinity]
+      parent == :erl_eval -> [timeout: :infinity]
+      true -> [timeout: @repo_timeout]
+    end
+  end
 end