defmodule Explorer.ReleaseTasks do @moduledoc """ Release tasks used to migrate or generate seeds. """ alias Ecto.Migrator @start_apps [ :crypto, :ssl, :postgrex, :ecto, # If using Ecto 3.0 or higher :ecto_sql ] @repos Application.compile_env(:blockscout, :ecto_repos, [Explorer.Repo, Explorer.Repo.Account]) def create_and_migrate do start_services() create() run_migrations() stop_services() end def create do Enum.each(@repos, &create_db_for/1) end def migrate(_argv) do start_services() run_migrations() stop_services() end def seed(_argv) do start_services() run_migrations() run_seeds() stop_services() end defp start_services do IO.puts("Starting dependencies..") # Start apps necessary for executing migrations Enum.each(@start_apps, &Application.ensure_all_started/1) # Start the Repo(s) for app IO.puts("Starting repos..") # Switch pool_size to 2 for ecto > 3.0 Enum.each(@repos, & &1.start_link(pool_size: 2)) end defp stop_services do IO.puts("Success!") :init.stop() end defp create_db_for(repo) do IO.puts("Create #{inspect(repo)} database if it doesn't exist") case repo.__adapter__.storage_up(repo.config) do :ok -> :ok {:error, :already_up} -> :ok {:error, term} -> {:error, term} end end defp run_migrations do Enum.each(@repos, &run_migrations_for/1) end defp run_migrations_for(repo) do app = Keyword.get(repo.config, :otp_app) IO.puts("Running migrations for #{app}") migrations_path = priv_path_for(repo, "migrations") Migrator.run(repo, migrations_path, :up, all: true) end defp run_seeds do Enum.each(@repos, &run_seeds_for/1) end # sobelow_skip ["RCE.CodeModule"] defp run_seeds_for(repo) do # Run the seed script if it exists seed_script = priv_path_for(repo, "seeds.exs") if File.exists?(seed_script) do IO.puts("Running seed script..") Code.eval_file(seed_script) end end defp priv_path_for(repo, filename) do app = Keyword.get(repo.config, :otp_app) repo_underscore = repo |> Module.split() |> List.last() |> Macro.underscore() priv_dir = "#{:code.priv_dir(app)}" Path.join([priv_dir, repo_underscore, filename]) end end