defmodule Mix.DbSeeds do @moduledoc false import Mix.EctoSQL @doc """ Ensures the given repository's seeds path exists on the file system. """ @spec ensure_seeds_path(Ecto.Repo.t(), Keyword.t()) :: String.t() def ensure_seeds_path(repo, opts) do path = opts[:seeds_path] || Path.join(source_repo_priv(repo), "seeds") if not Mix.Project.umbrella?() and not File.dir?(path) do raise_missing_seeds(Path.relative_to_cwd(path), repo) end path end @doc """ Restarts the app if there was any migration command. """ @spec restart_apps_if_migrated([atom], list()) :: :ok def restart_apps_if_migrated(_apps, []), do: :ok def restart_apps_if_migrated(apps, [_ | _]) do # Silence the logger to avoid application down messages. Logger.remove_backend(:console) for app <- Enum.reverse(apps) do Application.stop(app) end for app <- apps do Application.ensure_all_started(app) end :ok after Logger.add_backend(:console, flush: true) end def root_mod(repo_mod) do name = repo_mod |> root_mod_name Module.concat([name]) end def root_mod_name(repo_mod) do repo_mod |> Module.split() |> List.first() end # @doc """ # Gets a path relative to the application path. # Raises on umbrella application. # """ # def no_umbrella!(task) do # if Mix.Project.umbrella? do # Mix.raise "cannot run task #{inspect task} from umbrella application" # end # end @doc """ Gets the seeds path from a repository. """ @spec seeds_path(Ecto.Repo.t()) :: String.t() def seeds_path(repo) do Path.join(source_repo_priv(repo), "seeds") end defp raise_missing_seeds(path, repo) do Mix.raise(""" Could not find seeds 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 seeds to be found, please make sure your repository has been properly configured and the configured path exists. """) end end