aliases for mix tasks
authorAlexander Strizhakov <alex.strizhakov@gmail.com>
Wed, 19 Jun 2019 10:33:33 +0000 (10:33 +0000)
committerrinpatch <rinpatch@sdf.org>
Wed, 19 Jun 2019 10:33:33 +0000 (10:33 +0000)
ecto.migrate
ecto.rollback

lib/mix/tasks/pleroma/ecto/ecto.ex [new file with mode: 0644]
lib/mix/tasks/pleroma/ecto/migrate.ex [new file with mode: 0644]
lib/mix/tasks/pleroma/ecto/rollback.ex [new file with mode: 0644]
lib/pleroma/release_tasks.ex
mix.exs
test/tasks/ecto/migrate_test.exs [new file with mode: 0644]
test/tasks/ecto/rollback_test.exs [new file with mode: 0644]

diff --git a/lib/mix/tasks/pleroma/ecto/ecto.ex b/lib/mix/tasks/pleroma/ecto/ecto.ex
new file mode 100644 (file)
index 0000000..af09cb2
--- /dev/null
@@ -0,0 +1,40 @@
+# Pleroma: A lightweight social networking server
+# Copyright © 2017-2018 Pleroma Authors <https://pleroma.social/>
+# SPDX-License-Identifier: AGPL-3.0-onl
+defmodule Mix.Tasks.Pleroma.Ecto do
+  @doc """
+  Ensures the given repository's migrations path exists on the file system.
+  """
+  @spec ensure_migrations_path(Ecto.Repo.t(), Keyword.t()) :: String.t()
+  def ensure_migrations_path(repo, opts) do
+    path = opts[:migrations_path] || Path.join(source_repo_priv(repo), "migrations")
+
+    if not File.dir?(path) do
+      raise_missing_migrations(Path.relative_to_cwd(path), repo)
+    end
+
+    path
+  end
+
+  @doc """
+  Returns the private repository path relative to the source.
+  """
+  def source_repo_priv(repo) do
+    config = repo.config()
+    priv = config[:priv] || "priv/#{repo |> Module.split() |> List.last() |> Macro.underscore()}"
+    Path.join(File.cwd!(), priv)
+  end
+
+  defp raise_missing_migrations(path, repo) do
+    raise("""
+    Could not find migrations directory #{inspect(path)}
+    for repo #{inspect(repo)}.
+    This may be because you are in a new project and the
+    migration directory has not been created yet. Creating an
+    empty directory at the path above will fix this error.
+    If you expected existing migrations to be found, please
+    make sure your repository has been properly configured
+    and the configured path exists.
+    """)
+  end
+end
diff --git a/lib/mix/tasks/pleroma/ecto/migrate.ex b/lib/mix/tasks/pleroma/ecto/migrate.ex
new file mode 100644 (file)
index 0000000..22eafe7
--- /dev/null
@@ -0,0 +1,61 @@
+# Pleroma: A lightweight social networking server
+# Copyright © 2017-2018 Pleroma Authors <https://pleroma.social/>
+# SPDX-License-Identifier: AGPL-3.0-onl
+
+defmodule Mix.Tasks.Pleroma.Ecto.Migrate do
+  use Mix.Task
+  require Logger
+
+  @shortdoc "Wrapper on `ecto.migrate` task."
+
+  @aliases [
+    n: :step,
+    v: :to
+  ]
+
+  @switches [
+    all: :boolean,
+    step: :integer,
+    to: :integer,
+    quiet: :boolean,
+    log_sql: :boolean,
+    strict_version_order: :boolean,
+    migrations_path: :string
+  ]
+
+  @moduledoc """
+  Changes `Logger` level to `:info` before start migration.
+  Changes level back when migration ends.
+
+  ## Start migration
+
+      mix pleroma.ecto.migrate [OPTIONS]
+
+  Options:
+    - see https://hexdocs.pm/ecto/2.0.0/Mix.Tasks.Ecto.Migrate.html
+  """
+
+  @impl true
+  def run(args \\ []) do
+    {opts, _} = OptionParser.parse!(args, strict: @switches, aliases: @aliases)
+
+    opts =
+      if opts[:to] || opts[:step] || opts[:all],
+        do: opts,
+        else: Keyword.put(opts, :all, true)
+
+    opts =
+      if opts[:quiet],
+        do: Keyword.merge(opts, log: false, log_sql: false),
+        else: opts
+
+    path = Mix.Tasks.Pleroma.Ecto.ensure_migrations_path(Pleroma.Repo, opts)
+
+    level = Logger.level()
+    Logger.configure(level: :info)
+
+    {:ok, _, _} = Ecto.Migrator.with_repo(Pleroma.Repo, &Ecto.Migrator.run(&1, path, :up, opts))
+
+    Logger.configure(level: level)
+  end
+end
diff --git a/lib/mix/tasks/pleroma/ecto/rollback.ex b/lib/mix/tasks/pleroma/ecto/rollback.ex
new file mode 100644 (file)
index 0000000..0033ceb
--- /dev/null
@@ -0,0 +1,65 @@
+# Pleroma: A lightweight social networking server
+# Copyright © 2017-2018 Pleroma Authors <https://pleroma.social/>
+# SPDX-License-Identifier: AGPL-3.0-onl
+
+defmodule Mix.Tasks.Pleroma.Ecto.Rollback do
+  use Mix.Task
+  require Logger
+  @shortdoc "Wrapper on `ecto.rollback` task"
+
+  @aliases [
+    n: :step,
+    v: :to
+  ]
+
+  @switches [
+    all: :boolean,
+    step: :integer,
+    to: :integer,
+    start: :boolean,
+    quiet: :boolean,
+    log_sql: :boolean,
+    migrations_path: :string
+  ]
+
+  @moduledoc """
+  Changes `Logger` level to `:info` before start rollback.
+  Changes level back when rollback ends.
+
+  ## Start rollback
+
+      mix pleroma.ecto.rollback
+
+  Options:
+    - see https://hexdocs.pm/ecto/2.0.0/Mix.Tasks.Ecto.Rollback.html
+  """
+
+  @impl true
+  def run(args \\ []) do
+    {opts, _} = OptionParser.parse!(args, strict: @switches, aliases: @aliases)
+
+    opts =
+      if opts[:to] || opts[:step] || opts[:all],
+        do: opts,
+        else: Keyword.put(opts, :step, 1)
+
+    opts =
+      if opts[:quiet],
+        do: Keyword.merge(opts, log: false, log_sql: false),
+        else: opts
+
+    path = Mix.Tasks.Pleroma.Ecto.ensure_migrations_path(Pleroma.Repo, opts)
+
+    level = Logger.level()
+    Logger.configure(level: :info)
+
+    if Pleroma.Config.get(:env) == :test do
+      Logger.info("Rollback succesfully")
+    else
+      {:ok, _, _} =
+        Ecto.Migrator.with_repo(Pleroma.Repo, &Ecto.Migrator.run(&1, path, :down, opts))
+    end
+
+    Logger.configure(level: level)
+  end
+end
index 7726bc635836c2d4859c492efc73b26cc767f282..eb6eff61c2e3d1bce090b505d33c6ab0d6651e61 100644 (file)
@@ -6,13 +6,12 @@ defmodule Pleroma.ReleaseTasks do
   @repo Pleroma.Repo
 
   def run(args) do
-    Mix.Tasks.Pleroma.Common.start_pleroma()
     [task | args] = String.split(args)
 
     case task do
-      "migrate" -> migrate()
+      "migrate" -> migrate(args)
       "create" -> create()
-      "rollback" -> rollback(String.to_integer(Enum.at(args, 0)))
+      "rollback" -> rollback(args)
       task -> mix_task(task, args)
     end
   end
@@ -35,12 +34,12 @@ defmodule Pleroma.ReleaseTasks do
     end
   end
 
-  def migrate do
-    {:ok, _, _} = Ecto.Migrator.with_repo(@repo, &Ecto.Migrator.run(&1, :up, all: true))
+  def migrate(args) do
+    Mix.Tasks.Pleroma.Ecto.Migrate.run(args)
   end
 
-  def rollback(version) do
-    {:ok, _, _} = Ecto.Migrator.with_repo(@repo, &Ecto.Migrator.run(&1, :down, to: version))
+  def rollback(args) do
+    Mix.Tasks.Pleroma.Ecto.Rollback.run(args)
   end
 
   def create do
diff --git a/mix.exs b/mix.exs
index 2bd1450c9b25bcaaaccf0d3910da8edb4f06107c..7f8e36cbb98157ec32a52a998cede2ecd3b65ee0 100644 (file)
--- a/mix.exs
+++ b/mix.exs
@@ -154,6 +154,8 @@ defmodule Pleroma.Mixfile do
   # See the documentation for `Mix` for more info on aliases.
   defp aliases do
     [
+      "ecto.migrate": ["pleroma.ecto.migrate"],
+      "ecto.rollback": ["pleroma.ecto.rollback"],
       "ecto.setup": ["ecto.create", "ecto.migrate", "run priv/repo/seeds.exs"],
       "ecto.reset": ["ecto.drop", "ecto.setup"],
       test: ["ecto.create --quiet", "ecto.migrate", "test"]
diff --git a/test/tasks/ecto/migrate_test.exs b/test/tasks/ecto/migrate_test.exs
new file mode 100644 (file)
index 0000000..0538a7b
--- /dev/null
@@ -0,0 +1,20 @@
+# Pleroma: A lightweight social networking server
+# Copyright © 2017-2018 Pleroma Authors <https://pleroma.social/>
+# SPDX-License-Identifier: AGPL-3.0-onl
+
+defmodule Mix.Tasks.Pleroma.Ecto.MigrateTest do
+  use Pleroma.DataCase, async: true
+  import ExUnit.CaptureLog
+  require Logger
+
+  test "ecto.migrate info message" do
+    level = Logger.level()
+    Logger.configure(level: :warn)
+
+    assert capture_log(fn ->
+             Mix.Tasks.Pleroma.Ecto.Migrate.run()
+           end) =~ "[info] Already up"
+
+    Logger.configure(level: level)
+  end
+end
diff --git a/test/tasks/ecto/rollback_test.exs b/test/tasks/ecto/rollback_test.exs
new file mode 100644 (file)
index 0000000..33d093f
--- /dev/null
@@ -0,0 +1,16 @@
+defmodule Mix.Tasks.Pleroma.Ecto.RollbackTest do
+  use Pleroma.DataCase
+  import ExUnit.CaptureLog
+  require Logger
+
+  test "ecto.rollback info message" do
+    level = Logger.level()
+    Logger.configure(level: :warn)
+
+    assert capture_log(fn ->
+             Mix.Tasks.Pleroma.Ecto.Rollback.run()
+           end) =~ "[info] Rollback succesfully"
+
+    Logger.configure(level: level)
+  end
+end