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
|