diff options
Diffstat (limited to 'lib/mix/lib/mix/tasks/format.ex')
-rw-r--r-- | lib/mix/lib/mix/tasks/format.ex | 16 |
1 files changed, 14 insertions, 2 deletions
diff --git a/lib/mix/lib/mix/tasks/format.ex b/lib/mix/lib/mix/tasks/format.ex index 6d4afc874..a164f3aac 100644 --- a/lib/mix/lib/mix/tasks/format.ex +++ b/lib/mix/lib/mix/tasks/format.ex @@ -251,10 +251,12 @@ defmodule Mix.Tasks.Format do def formatter_for_file(file, opts \\ []) do {dot_formatter, formatter_opts} = eval_dot_formatter(opts) + prefix = Keyword.get(opts, :root, []) + {formatter_opts_and_subs, _sources} = - eval_deps_and_subdirectories(dot_formatter, [], formatter_opts, [dot_formatter]) + eval_deps_and_subdirectories(dot_formatter, prefix, formatter_opts, [dot_formatter]) - find_formatter_and_opts_for_file(file, formatter_opts_and_subs) + find_formatter_and_opts_for_file(file, prefix, formatter_opts_and_subs) end @doc """ @@ -275,6 +277,10 @@ defmodule Mix.Tasks.Format do File.regular?(".formatter.exs") -> {".formatter.exs", eval_file_with_keyword_list(".formatter.exs")} + opts[:root] && File.regular?(Path.join(opts[:root], ".formatter.exs")) -> + dot_formatter = Path.join(opts[:root], ".formatter.exs") + {dot_formatter, eval_file_with_keyword_list(dot_formatter)} + true -> {".formatter.exs", []} end @@ -582,6 +588,12 @@ defmodule Mix.Tasks.Format do {find_formatter_for_file(file, formatter_opts), formatter_opts} end + defp find_formatter_and_opts_for_file(file, prefix, formatter_opts_and_subs) do + split = file |> Path.relative_to(prefix) |> Path.split() + formatter_opts = recur_formatter_opts_for_file(split, formatter_opts_and_subs) + {find_formatter_for_file(file, formatter_opts), formatter_opts} + end + defp recur_formatter_opts_for_file(split, {formatter_opts, subs}) do Enum.find_value(subs, formatter_opts, fn {sub, formatter_opts_and_subs} -> if List.starts_with?(split, Path.split(sub)) do |