Merge branch 'remove-linker-scheme-option' into 'develop'
[akkoma] / lib / pleroma / config / loader.ex
index b13b6eaf487d7a39e834ad152c01fc4bd40ea8aa..b8787cb49ad44213e20e4d0eca7c11ed0d4e3ce6 100644 (file)
@@ -1,5 +1,16 @@
+# Pleroma: A lightweight social networking server
+# Copyright © 2017-2019 Pleroma Authors <https://pleroma.social/>
+# SPDX-License-Identifier: AGPL-3.0-only
+
 defmodule Pleroma.Config.Loader do
-  @paths ["config/config.exs", "config/#{Mix.env()}.exs"]
+  @reject_keys [
+    Pleroma.Repo,
+    Pleroma.Web.Endpoint,
+    :env,
+    :configurable_from_database,
+    :database,
+    :swarm
+  ]
 
   if Code.ensure_loaded?(Config.Reader) do
     @spec load(Path.t()) :: keyword()
@@ -10,8 +21,9 @@ defmodule Pleroma.Config.Loader do
     # support for Elixir less than 1.9
     @spec load(Path.t()) :: keyword()
     def load(path) do
-      {config, _paths} = Mix.Config.eval!(path)
-      config
+      path
+      |> Mix.Config.eval!()
+      |> elem(0)
     end
 
     defp do_merge(conf1, conf2), do: Mix.Config.merge(conf1, conf2)
@@ -21,19 +33,25 @@ defmodule Pleroma.Config.Loader do
   def load_and_merge do
     all_paths =
       if Pleroma.Config.get(:release),
-        do: @paths ++ ["config/releases.exs"],
-        else: @paths
+        do: ["config/config.exs", "config/releases.exs"],
+        else: ["config/config.exs"]
 
     all_paths
     |> Enum.map(&load(&1))
-    |> merge()
+    |> Enum.reduce([], &do_merge(&2, &1))
+    |> filter()
   end
 
-  @spec merge([keyword()], keyword()) :: keyword()
-  def merge(configs, acc \\ [])
-  def merge([], acc), do: acc
+  defp filter(configs) do
+    configs
+    |> Keyword.keys()
+    |> Enum.reduce([], &Keyword.put(&2, &1, filter_group(&1, configs)))
+  end
 
-  def merge([config | others], acc) do
-    merge(others, do_merge(acc, config))
+  @spec filter_group(atom(), keyword()) :: keyword()
+  def filter_group(group, configs) do
+    Enum.reject(configs[group], fn {key, _v} ->
+      key in @reject_keys or (group == :phoenix and key == :serve_endpoints)
+    end)
   end
 end