diff --git a/lib/pleroma/utils.ex b/lib/pleroma/utils.ex index a446d3ae6..bd9939c9f 100644 --- a/lib/pleroma/utils.ex +++ b/lib/pleroma/utils.ex @@ -14,10 +14,23 @@ defmodule Pleroma.Utils do @repo_timeout Pleroma.Config.get([Pleroma.Repo, :timeout], 15_000) def compile_dir(dir) when is_binary(dir) do + dir + |> elixir_files() + |> Kernel.ParallelCompiler.compile() + end + + defp elixir_files(dir) when is_binary(dir) do dir |> File.ls!() |> Enum.map(&Path.join(dir, &1)) - |> Kernel.ParallelCompiler.compile() + |> Enum.flat_map(fn path -> + if File.dir?(path) do + elixir_files(path) + else + [path] + end + end) + |> Enum.filter(fn path -> String.ends_with?(path, ".ex") end) end @doc """ diff --git a/test/fixtures/runtime_modules/first.ex b/test/fixtures/runtime_modules/first.ex new file mode 100644 index 000000000..2b663a1b0 --- /dev/null +++ b/test/fixtures/runtime_modules/first.ex @@ -0,0 +1,2 @@ +defmodule DynamicModule.First do +end diff --git a/test/fixtures/runtime_modules/nope.exs b/test/fixtures/runtime_modules/nope.exs new file mode 100644 index 000000000..8fe676af6 --- /dev/null +++ b/test/fixtures/runtime_modules/nope.exs @@ -0,0 +1 @@ +def thisisnotloaded diff --git a/test/fixtures/runtime_modules/subdir/second.ex b/test/fixtures/runtime_modules/subdir/second.ex new file mode 100644 index 000000000..22dc046c6 --- /dev/null +++ b/test/fixtures/runtime_modules/subdir/second.ex @@ -0,0 +1,2 @@ +defmodule DynamicModule.Second do +end diff --git a/test/pleroma/utils_test.exs b/test/pleroma/utils_test.exs index c593a9490..e21573679 100644 --- a/test/pleroma/utils_test.exs +++ b/test/pleroma/utils_test.exs @@ -12,4 +12,11 @@ defmodule Pleroma.UtilsTest do File.rm_rf(path) end end + + describe "compile_dir/1" do + test "recursively compiles directories" do + {:ok, [DynamicModule.First, DynamicModule.Second], []} = + Pleroma.Utils.compile_dir("test/fixtures/runtime_modules") + end + end end