total rebase
[anni] / lib / mix / tasks / pleroma / ecto / rollback.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.Rollback do
6   use Mix.Task
7   import Mix.Pleroma
8   require Logger
9   @shortdoc "Wrapper on `ecto.rollback` task"
10
11   @aliases [
12     n: :step,
13     v: :to
14   ]
15
16   @switches [
17     all: :boolean,
18     step: :integer,
19     to: :integer,
20     start: :boolean,
21     quiet: :boolean,
22     log_sql: :boolean,
23     migrations_path: :string,
24     env: :string
25   ]
26
27   @moduledoc """
28   Changes `Logger` level to `:info` before start rollback.
29   Changes level back when rollback ends.
30
31   ## Start rollback
32
33       mix pleroma.ecto.rollback
34
35   Options:
36     - see https://hexdocs.pm/ecto/2.0.0/Mix.Tasks.Ecto.Rollback.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, :step, 1)
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     if opts[:env] == "test" do
64       Logger.info("Rollback successfully")
65     else
66       {:ok, _, _} =
67         Ecto.Migrator.with_repo(Pleroma.Repo, &Ecto.Migrator.run(&1, path, :down, opts))
68     end
69
70     Logger.configure(level: level)
71   end
72 end