diff --git a/lib/mix/lib/mix/tasks/format.ex b/lib/mix/lib/mix/tasks/format.ex index 9f84edc7c71..de5f0dd85ef 100644 --- a/lib/mix/lib/mix/tasks/format.ex +++ b/lib/mix/lib/mix/tasks/format.ex @@ -77,6 +77,8 @@ defmodule Mix.Tasks.Format do * `--dry-run` - does not save files after formatting. + * `--verbose` - prints the names of files that were formatted. + * `--dot-formatter` - path to the file with formatter configuration. Defaults to `.formatter.exs` if one is available. See the "Formatting options" section above for more information. @@ -199,6 +201,7 @@ defmodule Mix.Tasks.Format do no_exit: :boolean, dot_formatter: :string, dry_run: :boolean, + verbose: :boolean, stdin_filename: :string, force: :boolean, migrate: :boolean @@ -764,18 +767,27 @@ defmodule Mix.Tasks.Format do :ok true -> - write_or_print(file, input, output) + write_or_print(file, input, output, task_opts) end rescue exception -> {:exit, file, exception, __STACKTRACE__} end - defp write_or_print(file, input, output) do + defp write_or_print(file, input, output, task_opts) do cond do - file == :stdin -> IO.write(output) - input == output -> :ok - true -> File.write!(file, output) + file == :stdin -> + IO.write(output) + + input == output -> + :ok + + true -> + File.write!(file, output) + + if task_opts[:verbose] do + Mix.shell().info([:green, "* formatting ", :reset, Path.relative_to_cwd(file)]) + end end :ok diff --git a/lib/mix/test/mix/tasks/format_test.exs b/lib/mix/test/mix/tasks/format_test.exs index d5d17bbace4..eaf1aa1aade 100644 --- a/lib/mix/test/mix/tasks/format_test.exs +++ b/lib/mix/test/mix/tasks/format_test.exs @@ -85,6 +85,35 @@ defmodule Mix.Tasks.FormatTest do end) end + test "prints formatted file names with --verbose", context do + in_tmp(context.test, fn -> + File.write!("a.ex", """ + foo bar + """) + + File.write!("b.ex", """ + foo(bar) + """) + + Mix.Tasks.Format.run(["a.ex", "b.ex", "--verbose"]) + + assert_received {:mix_shell, :info, ["* formatting a.ex"]} + refute_received {:mix_shell, :info, ["* formatting b.ex"]} + end) + end + + test "does not print formatted file names by default", context do + in_tmp(context.test, fn -> + File.write!("a.ex", """ + foo bar + """) + + Mix.Tasks.Format.run(["a.ex"]) + + refute_received {:mix_shell, :info, ["* formatting a.ex"]} + end) + end + test "does not try to format a directory that matches a given pattern", context do in_tmp(context.test, fn -> File.mkdir_p!("a.ex")