First
[anni] / lib / mix / tasks / pleroma / ecto / migrate.ex
1 # Pleroma: A lightweight social networking server
2 # Copyright © 2017-2022 Pleroma Authors <https://pleroma.social/>
3 # SPDX-License-Identifier: AGPL-3.0-only
4
5 defmodule Mix.Tasks.Pleroma.Ecto.Migrate do
6   use Mix.Task
7   import Mix.Pleroma
8   require Logger
9
10   @shortdoc "Wrapper on `ecto.migrate` task."
11
12   @aliases [
13     n: :step,
14     v: :to
15   ]
16
17   @switches [
18     all: :boolean,
19     step: :integer,
20     to: :integer,
21     quiet: :boolean,
22     log_sql: :boolean,
23     strict_version_order: :boolean,
24     migrations_path: :string
25   ]
26
27   @moduledoc """
28   Changes `Logger` level to `:info` before start migration.
29   Changes level back when migration ends.
30
31   ## Start migration
32
33       mix pleroma.ecto.migrate [OPTIONS]
34
35   Options:
36     - see https://hexdocs.pm/ecto/2.0.0/Mix.Tasks.Ecto.Migrate.html
37   """
38
39   @impl true
40   def run(args \\ []) do
41     load_pleroma()
42     {opts, _} = OptionParser.parse!(args, strict: @switches, aliases: @aliases)
43
44     if Application.get_env(:pleroma, Pleroma.Repo)[:ssl] do
45       Application.ensure_all_started(:ssl)
46     end
47
48     opts =
49       if opts[:to] || opts[:step] || opts[:all],
50         do: opts,
51         else: Keyword.put(opts, :all, true)
52
53     opts =
54       if opts[:quiet],
55         do: Keyword.merge(opts, log: false, log_sql: false),
56         else: opts
57
58     path = Mix.Tasks.Pleroma.Ecto.ensure_migrations_path(Pleroma.Repo, opts)
59
60     level = Logger.level()
61     Logger.configure(level: :info)
62
63     {:ok, _, _} = Ecto.Migrator.with_repo(Pleroma.Repo, &Ecto.Migrator.run(&1, path, :up, opts))
64
65     Logger.configure(level: level)
66   end
67 end