|
| 1 | +defmodule LoadRepos do |
| 2 | + defp load_apps do |
| 3 | + :code.get_path() |
| 4 | + |> Enum.flat_map(fn app_dir -> |
| 5 | + Path.join(app_dir, "*.app") |> Path.wildcard() |
| 6 | + end) |
| 7 | + |> Enum.map(fn app_file -> |
| 8 | + app_file |> Path.basename() |> Path.rootname(".app") |> String.to_atom() |
| 9 | + end) |
| 10 | + |> Enum.map(&Application.load/1) |
| 11 | + end |
| 12 | + |
| 13 | + defp configs do |
| 14 | + for {app, _, _} <- Application.loaded_applications(), |
| 15 | + repos = Application.get_env(app, :ecto_repos), |
| 16 | + is_list(repos) and repos != [], |
| 17 | + repo <- repos, |
| 18 | + do: {repo, Map.new(Application.get_env(app, repo))} |
| 19 | + end |
| 20 | + |
| 21 | + defp config_to_url(_, %{url: url}), do: url |
| 22 | + |
| 23 | + defp config_to_url(repo, %{ |
| 24 | + hostname: hostname, |
| 25 | + username: username, |
| 26 | + password: password, |
| 27 | + database: database |
| 28 | + }) do |
| 29 | + %URI{ |
| 30 | + scheme: adapter_to_string(repo.__adapter__), |
| 31 | + userinfo: "#{username}:#{password}", |
| 32 | + host: hostname, |
| 33 | + path: Path.join("/", database) |
| 34 | + } |
| 35 | + |> URI.to_string() |
| 36 | + end |
| 37 | + |
| 38 | + defp adapter_to_string(Ecto.Adapters.Postgres), do: "postgres" |
| 39 | + defp adapter_to_string(Ecto.Adapters.MySQL), do: "mysql" |
| 40 | + defp adapter_to_string(mod), do: raise("Unknown adapter #{inspect(mod)}") |
| 41 | + |
| 42 | + def main do |
| 43 | + load_apps() |
| 44 | + |
| 45 | + configs() |
| 46 | + |> Enum.map(fn {repo, config} -> |
| 47 | + [inspect(repo), ?\s, config_to_url(repo, config)] |
| 48 | + end) |
| 49 | + |> Enum.intersperse(?\n) |
| 50 | + |> IO.puts() |
| 51 | + end |
| 52 | +end |
| 53 | + |
| 54 | +LoadRepos.main() |
0 commit comments