46 lines
1.4 KiB
Elixir
46 lines
1.4 KiB
Elixir
defmodule Mix.EctoSQL do
|
|
@moduledoc false
|
|
|
|
@doc """
|
|
Ensures the given repository's migrations paths exists on the file system.
|
|
"""
|
|
@spec ensure_migrations_paths(Ecto.Repo.t(), Keyword.t()) :: [String.t()]
|
|
def ensure_migrations_paths(repo, opts) do
|
|
paths = Keyword.get_values(opts, :migrations_path)
|
|
paths = if paths == [], do: [Path.join(source_repo_priv(repo), "migrations")], else: paths
|
|
|
|
if not Mix.Project.umbrella?() do
|
|
for path <- paths, not File.dir?(path) do
|
|
raise_missing_migrations(Path.relative_to_cwd(path), repo)
|
|
end
|
|
end
|
|
|
|
paths
|
|
end
|
|
|
|
defp raise_missing_migrations(path, repo) do
|
|
Mix.raise("""
|
|
Could not find migrations directory #{inspect(path)}
|
|
for repo #{inspect(repo)}.
|
|
|
|
This may be because you are in a new project and the
|
|
migration directory has not been created yet. Creating an
|
|
empty directory at the path above will fix this error.
|
|
|
|
If you expected existing migrations to be found, please
|
|
make sure your repository has been properly configured
|
|
and the configured path exists.
|
|
""")
|
|
end
|
|
|
|
@doc """
|
|
Returns the private repository path relative to the source.
|
|
"""
|
|
def source_repo_priv(repo) do
|
|
config = repo.config()
|
|
priv = config[:priv] || "priv/#{repo |> Module.split() |> List.last() |> Macro.underscore()}"
|
|
app = Keyword.fetch!(config, :otp_app)
|
|
Path.join(Mix.Project.deps_paths()[app] || File.cwd!(), priv)
|
|
end
|
|
end
|