| 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
 | # Pleroma: A lightweight social networking server
# Copyright © 2017-2020 Pleroma Authors <https://pleroma.social/>
# SPDX-License-Identifier: AGPL-3.0-only
defmodule Mix.Pleroma do
  @apps [
    :restarter,
    :ecto,
    :ecto_sql,
    :postgrex,
    :db_connection,
    :cachex,
    :flake_id,
    :swoosh,
    :timex
  ]
  @cachex_children ["object", "user"]
  @doc "Common functions to be reused in mix tasks"
  def start_pleroma do
    Pleroma.Config.Holder.save_default()
    Application.put_env(:phoenix, :serve_endpoints, false, persistent: true)
    if Pleroma.Config.get(:env) != :test do
      Application.put_env(:logger, :console, level: :debug)
    end
    adapter = Application.get_env(:tesla, :adapter)
    apps =
      if adapter == Tesla.Adapter.Gun do
        [:gun | @apps]
      else
        [:hackney | @apps]
      end
    Enum.each(apps, &Application.ensure_all_started/1)
    children =
      [
        Pleroma.Repo,
        {Pleroma.Config.TransferTask, false},
        Pleroma.Web.Endpoint,
        {Oban, Pleroma.Config.get(Oban)}
      ] ++
        http_children(adapter)
    cachex_children = Enum.map(@cachex_children, &Pleroma.Application.build_cachex(&1, []))
    Supervisor.start_link(children ++ cachex_children,
      strategy: :one_for_one,
      name: Pleroma.Supervisor
    )
    if Pleroma.Config.get(:env) not in [:test, :benchmark] do
      pleroma_rebooted?()
    end
  end
  defp pleroma_rebooted? do
    if Restarter.Pleroma.rebooted?() do
      :ok
    else
      Process.sleep(10)
      pleroma_rebooted?()
    end
  end
  def load_pleroma do
    Application.load(:pleroma)
  end
  def get_option(options, opt, prompt, defval \\ nil, defname \\ nil) do
    Keyword.get(options, opt) || shell_prompt(prompt, defval, defname)
  end
  def shell_prompt(prompt, defval \\ nil, defname \\ nil) do
    prompt_message = "#{prompt} [#{defname || defval}] "
    input =
      if mix_shell?(),
        do: Mix.shell().prompt(prompt_message),
        else: :io.get_line(prompt_message)
    case input do
      "\n" ->
        case defval do
          nil ->
            shell_prompt(prompt, defval, defname)
          defval ->
            defval
        end
      input ->
        String.trim(input)
    end
  end
  def shell_yes?(message) do
    if mix_shell?(),
      do: Mix.shell().yes?("Continue?"),
      else: shell_prompt(message, "Continue?") in ~w(Yn Y y)
  end
  def shell_info(message) do
    if mix_shell?(),
      do: Mix.shell().info(message),
      else: IO.puts(message)
  end
  def shell_error(message) do
    if mix_shell?(),
      do: Mix.shell().error(message),
      else: IO.puts(:stderr, message)
  end
  @doc "Performs a safe check whether `Mix.shell/0` is available (does not raise if Mix is not loaded)"
  def mix_shell?, do: :erlang.function_exported(Mix, :shell, 0)
  def escape_sh_path(path) do
    ~S(') <> String.replace(path, ~S('), ~S(\')) <> ~S(')
  end
  defp http_children(Tesla.Adapter.Gun) do
    Pleroma.Gun.ConnectionPool.children() ++
      [{Task, &Pleroma.HTTP.AdapterHelper.Gun.limiter_setup/0}]
  end
  defp http_children(_), do: []
end
 |