Current section

Files

Jump to
piazza_core lib ecto release_tasks.ex
Raw

lib/ecto/release_tasks.ex

defmodule Piazza.Ecto.ReleaseTasks do
@start_apps [
:crypto,
:ssl,
:postgrex,
:ecto,
:hackney,
:goth,
:ecto_sql # If using Ecto 3.0 or higher
]
@repos Application.get_env(:piazza_core, :repos)
def migrate(_argv) do
start_services()
run_migrations()
stop_services()
end
def seed(_argv) do
start_services()
run_migrations()
run_seeds()
stop_services()
end
def drop(_argv) do
start_services()
run_migrations(:down)
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..")
# pool_size can be 1 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 run_migrations(direction \\ :up) do
Enum.each(@repos, &run_migrations_for(&1, direction))
end
defp run_migrations_for(repo, direction) do
app = Keyword.get(repo.config(), :otp_app)
IO.puts("Running migrations for #{app}")
migrations_path = priv_path_for(repo, "migrations")
Ecto.Migrator.run(repo, migrations_path, direction, all: true)
end
# defp drop_db() do
# Enum.each(@repos, & &1.__adapter__.storage_down(&1.config))
# end
defp run_seeds do
Enum.each(@repos, &run_seeds_for/1)
end
defp run_seeds_for(repo) do
# Run the seed script if it exists
seed_root = priv_path_for(repo, "seeds")
seed_root
|> File.ls()
|> case do
{:ok, files} ->
files
|> Enum.sort()
|> IO.inspect(label: "seeds to run")
|> Enum.map(&Path.join([seed_root, &1]))
|> Enum.each(fn file ->
IO.puts "Running seed for #{file}"
Code.eval_file(file)
end)
{:error, _} -> IO.puts "No seeds to run"
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