Merge branch 'ecto-rollback-in-test-env' into 'develop'
[akkoma] / lib / mix / tasks / pleroma / ecto / rollback.ex
1 # Pleroma: A lightweight social networking server
2 # Copyright © 2017-2021 Pleroma Authors <https://pleroma.social/>
3 # SPDX-License-Identifier: AGPL-3.0-onl
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 succesfully")
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