mirror of
https://github.com/logos-blockchain/logos-blockchain-pocs.git
synced 2026-01-30 18:53:08 +00:00
119 lines
2.3 KiB
Elixir
119 lines
2.3 KiB
Elixir
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
|
|
]
|
|
|
|
def repos do
|
|
Application.get_env(:explorer, :ecto_repos)
|
|
end
|
|
|
|
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
|