1 # Pleroma: A lightweight social networking server
2 # Copyright © 2017-2021 Pleroma Authors <https://pleroma.social/>
3 # SPDX-License-Identifier: AGPL-3.0-only
5 defmodule Pleroma.Utils do
7 eacces eagain ebadf ebadmsg ebusy edeadlk edeadlock edquot eexist efault
8 efbig eftype eintr einval eio eisdir eloop emfile emlink emultihop
9 enametoolong enfile enobufs enodev enolck enolink enoent enomem enospc
10 enosr enostr enosys enotblk enotdir enotsup enxio eopnotsupp eoverflow
11 eperm epipe erange erofs espipe esrch estale etxtbsy exdev
14 @repo_timeout Pleroma.Config.get([Pleroma.Repo, :timeout], 15_000)
16 def compile_dir(dir) when is_binary(dir) do
19 |> Kernel.ParallelCompiler.compile()
22 defp elixir_files(dir) when is_binary(dir) do
25 |> Enum.map(&Path.join(dir, &1))
26 |> Enum.flat_map(fn path ->
33 |> Enum.filter(fn path -> String.ends_with?(path, ".ex") end)
37 POSIX-compliant check if command is available in the system
40 iex> command_available?("git")
42 iex> command_available?("wrongcmd")
46 @spec command_available?(String.t()) :: boolean()
47 def command_available?(command) do
48 case :os.find_executable(String.to_charlist(command)) do
54 @doc "creates the uniq temporary directory"
55 @spec tmp_dir(String.t()) :: {:ok, String.t()} | {:error, :file.posix()}
56 def tmp_dir(prefix \\ "") do
60 Timex.to_unix(Timex.now()),
62 String.downcase(Integer.to_string(:rand.uniform(0x100000000), 36))
66 tmp_dir = Path.join(System.tmp_dir!(), sub_dir)
68 case File.mkdir(tmp_dir) do
74 @spec posix_error_message(atom()) :: binary()
75 def posix_error_message(code) when code in @posix_error_codes do
76 error_message = Gettext.dgettext(Pleroma.Web.Gettext, "posix_errors", "#{code}")
77 "(POSIX error: #{error_message})"
80 def posix_error_message(_), do: ""
83 Returns [timeout: integer] suitable for passing as an option to Repo functions.
85 This function detects if the execution was triggered from IEx shell, Mix task, or
86 ./bin/pleroma_ctl and sets the timeout to :infinity, else returns the default timeout value.
88 @spec query_timeout() :: [timeout: integer]
90 {parent, _, _, _} = Process.info(self(), :current_stacktrace) |> elem(1) |> Enum.fetch!(2)
93 parent |> to_string |> String.starts_with?("Elixir.Mix.Task") -> [timeout: :infinity]
94 parent == :erl_eval -> [timeout: :infinity]
95 true -> [timeout: @repo_timeout]