98 lines
2.8 KiB
Elixir
98 lines
2.8 KiB
Elixir
defmodule Mix.Tasks.Ecto.Migrations do
|
|
use Mix.Task
|
|
import Mix.Ecto
|
|
import Mix.EctoSQL
|
|
|
|
@shortdoc "Displays the repository migration status"
|
|
|
|
@aliases [
|
|
r: :repo
|
|
]
|
|
|
|
@switches [
|
|
repo: [:keep, :string],
|
|
no_compile: :boolean,
|
|
no_deps_check: :boolean,
|
|
migrations_path: :keep,
|
|
prefix: :string
|
|
]
|
|
|
|
@moduledoc """
|
|
Displays the up / down migration status for the given repository.
|
|
|
|
The repository must be set under `:ecto_repos` in the
|
|
current app configuration or given via the `-r` option.
|
|
|
|
By default, migrations are expected at "priv/YOUR_REPO/migrations"
|
|
directory of the current application but it can be configured
|
|
by specifying the `:priv` key under the repository configuration.
|
|
|
|
If the repository has not been started yet, one will be
|
|
started outside our application supervision tree and shutdown
|
|
afterwards.
|
|
|
|
## Examples
|
|
|
|
$ mix ecto.migrations
|
|
$ mix ecto.migrations -r Custom.Repo
|
|
|
|
## Command line options
|
|
|
|
* `--migrations-path` - the path to load the migrations from, defaults to
|
|
`"priv/repo/migrations"`. This option may be given multiple times in which
|
|
case the migrations are loaded from all the given directories and sorted as
|
|
if they were in the same one.
|
|
|
|
Note, if you have previously run migrations from paths `a/` and `b/`, and now
|
|
run `mix ecto.migrations --migrations-path a/` (omitting path `b/`), the
|
|
migrations from the path `b/` will be shown in the output as `** FILE NOT FOUND **`.
|
|
|
|
* `--no-compile` - does not compile applications before running
|
|
|
|
* `--no-deps-check` - does not check dependencies before running
|
|
|
|
* `--prefix` - the prefix to check migrations on
|
|
|
|
* `-r`, `--repo` - the repo to obtain the status for
|
|
|
|
"""
|
|
|
|
@impl true
|
|
def run(args, migrations \\ &Ecto.Migrator.migrations/3, puts \\ &IO.puts/1) do
|
|
repos = parse_repo(args)
|
|
{opts, _} = OptionParser.parse!(args, strict: @switches, aliases: @aliases)
|
|
|
|
for repo <- repos do
|
|
ensure_repo(repo, args)
|
|
paths = ensure_migrations_paths(repo, opts)
|
|
|
|
case Ecto.Migrator.with_repo(repo, &migrations.(&1, paths, opts), mode: :temporary) do
|
|
{:ok, repo_status, _} ->
|
|
puts.(
|
|
"""
|
|
|
|
Repo: #{inspect(repo)}
|
|
|
|
Status Migration ID Migration Name
|
|
--------------------------------------------------
|
|
""" <>
|
|
Enum.map_join(repo_status, "\n", fn {status, number, description} ->
|
|
" #{format(status, 10)}#{format(number, 16)}#{description}"
|
|
end) <> "\n"
|
|
)
|
|
|
|
{:error, error} ->
|
|
Mix.raise("Could not start repo #{inspect(repo)}, error: #{inspect(error)}")
|
|
end
|
|
end
|
|
|
|
:ok
|
|
end
|
|
|
|
defp format(content, pad) do
|
|
content
|
|
|> to_string
|
|
|> String.pad_trailing(pad)
|
|
end
|
|
end
|