From a459269fa89137ab232928cfeedfd3edeca3d74b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?George=20Guimar=C3=A3es?= Date: Fri, 27 Feb 2026 11:21:43 -0300 Subject: [PATCH 1/2] Print formatted file names in mix format --verbose, add --verbose flag --- lib/mix/lib/mix/tasks/format.ex | 32 ++++++++++++++++++++------ lib/mix/test/mix/tasks/format_test.exs | 29 +++++++++++++++++++++++ 2 files changed, 54 insertions(+), 7 deletions(-) diff --git a/lib/mix/lib/mix/tasks/format.ex b/lib/mix/lib/mix/tasks/format.ex index 9f84edc7c71..ef22c2c4501 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 @@ -795,12 +807,18 @@ defmodule Mix.Tasks.Format do :ok end - defp check!({[{:exit, :stdin, exception, stacktrace} | _], _not_formatted}, _task_opts) do + defp check!( + {[{:exit, :stdin, exception, stacktrace} | _], _not_formatted}, + _task_opts + ) do Mix.shell().error("mix format failed for stdin") reraise exception, stacktrace end - defp check!({[{:exit, file, exception, stacktrace} | _], _not_formatted}, _task_opts) do + defp check!( + {[{:exit, file, exception, stacktrace} | _], _not_formatted}, + _task_opts + ) do Mix.shell().error("mix format failed for file: #{Path.relative_to_cwd(file)}") reraise exception, stacktrace end 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") From 07e4d73b3c5e4448624437c57703e6883c156634 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jos=C3=A9=20Valim?= Date: Sat, 28 Feb 2026 11:43:06 +0100 Subject: [PATCH 2/2] Apply suggestions from code review --- lib/mix/lib/mix/tasks/format.ex | 10 ++-------- 1 file changed, 2 insertions(+), 8 deletions(-) diff --git a/lib/mix/lib/mix/tasks/format.ex b/lib/mix/lib/mix/tasks/format.ex index ef22c2c4501..de5f0dd85ef 100644 --- a/lib/mix/lib/mix/tasks/format.ex +++ b/lib/mix/lib/mix/tasks/format.ex @@ -807,18 +807,12 @@ defmodule Mix.Tasks.Format do :ok end - defp check!( - {[{:exit, :stdin, exception, stacktrace} | _], _not_formatted}, - _task_opts - ) do + defp check!({[{:exit, :stdin, exception, stacktrace} | _], _not_formatted}, _task_opts) do Mix.shell().error("mix format failed for stdin") reraise exception, stacktrace end - defp check!( - {[{:exit, file, exception, stacktrace} | _], _not_formatted}, - _task_opts - ) do + defp check!({[{:exit, file, exception, stacktrace} | _], _not_formatted}, _task_opts) do Mix.shell().error("mix format failed for file: #{Path.relative_to_cwd(file)}") reraise exception, stacktrace end