Skip to content

Commit 04194a1

Browse files
author
José Valim
committed
Support --config on mix run
1 parent 35e04d0 commit 04194a1

File tree

5 files changed

+78
-43
lines changed

5 files changed

+78
-43
lines changed

lib/elixir/lib/kernel/cli.ex

Lines changed: 10 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -323,9 +323,7 @@ defmodule Kernel.CLI do
323323
end
324324

325325
defp process_command({:require, pattern}, _config) when is_binary(pattern) do
326-
files = Path.wildcard(pattern)
327-
files = Enum.uniq(files)
328-
files = Enum.filter files, &:filelib.is_regular(&1)
326+
files = filter_patterns(pattern)
329327

330328
if files != [] do
331329
wrapper fn -> Enum.map files, &Code.require_file(&1) end
@@ -335,9 +333,7 @@ defmodule Kernel.CLI do
335333
end
336334

337335
defp process_command({:parallel_require, pattern}, _config) when is_binary(pattern) do
338-
files = Path.wildcard(pattern)
339-
files = Enum.uniq(files)
340-
files = Enum.filter files, &:filelib.is_regular(&1)
336+
files = filter_patterns(pattern)
341337

342338
if files != [] do
343339
wrapper fn -> Kernel.ParallelRequire.files(files) end
@@ -349,7 +345,7 @@ defmodule Kernel.CLI do
349345
defp process_command({:compile, patterns}, config) do
350346
:filelib.ensure_dir(:filename.join(config.output, "."))
351347

352-
case match_regular_files(patterns) do
348+
case filter_multiple_patterns(patterns) do
353349
{:ok, []} ->
354350
{:error, "No files matched provided patterns"}
355351
{:ok, files} ->
@@ -363,9 +359,13 @@ defmodule Kernel.CLI do
363359
end
364360
end
365361

366-
defp match_regular_files(patterns) do
362+
defp filter_patterns(pattern) do
363+
Enum.filter(Enum.uniq(Path.wildcard(pattern)), &:filelib.is_regular(&1))
364+
end
365+
366+
defp filter_multiple_patterns(patterns) do
367367
matched_files = Enum.map patterns, fn(pattern) ->
368-
case Path.wildcard(pattern) do
368+
case filter_patterns(pattern) do
369369
[] -> {:missing, pattern}
370370
files -> {:ok, files}
371371
end
@@ -380,9 +380,7 @@ defmodule Kernel.CLI do
380380
&elem(&1, 1)
381381

382382
if missing_patterns == [] do
383-
files = Enum.uniq(Enum.concat(files))
384-
files = Enum.filter files, &:filelib.is_regular(&1)
385-
{:ok, files}
383+
{:ok, Enum.uniq(Enum.concat(files))}
386384
else
387385
{:missing, Enum.uniq(missing_patterns)}
388386
end

lib/elixir/test/elixir/gen_server_test.exs

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,17 @@ defmodule GenServerTest do
2626
def handle_cast(request, state) do
2727
super(request, state)
2828
end
29+
30+
def terminate(_reason, _state) do
31+
# There is a race condition if the agent is
32+
# restarted too fast and it is registered.
33+
try do
34+
self |> Process.info(:registered_name) |> elem(1) |> Process.unregister
35+
rescue
36+
_ -> :ok
37+
end
38+
:ok
39+
end
2940
end
3041

3142
test "start_link/2, call/2 and cast/2" do

lib/mix/lib/mix/tasks/run.ex

Lines changed: 38 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@ defmodule Mix.Tasks.Run do
2222
2323
## Command line options
2424
25+
* `--config`, `-c` - loads the given configuration file
2526
* `--eval`, `-e` - evaluate the given code
2627
* `--require`, `-r` - require pattern before running the command
2728
* `--parallel-require`, `-pr` - requires pattern in parallel
@@ -33,8 +34,8 @@ defmodule Mix.Tasks.Run do
3334
"""
3435
def run(args) do
3536
{opts, head, _} = OptionParser.parse_head(args,
36-
aliases: [r: :require, pr: :parallel_require, e: :eval],
37-
switches: [parallel_require: :keep, require: :keep, eval: :keep])
37+
aliases: [r: :require, pr: :parallel_require, e: :eval, c: :config],
38+
switches: [parallel_require: :keep, require: :keep, eval: :keep, config: :keep])
3839

3940
# Require the project to be available
4041
Mix.Project.get!
@@ -47,37 +48,12 @@ defmodule Mix.Tasks.Run do
4748
end
4849

4950
System.argv(argv)
51+
process_config opts
5052

5153
# Start app after rewriting System.argv,
5254
# but before requiring and evaling
5355
Mix.Task.run "app.start", args
54-
55-
Enum.each opts, fn({key, value}) ->
56-
case key do
57-
:parallel_require ->
58-
case filter_patterns(value) do
59-
[] ->
60-
Mix.raise "No files matched pattern #{inspect value} given to --parallel-require"
61-
62-
filtered ->
63-
Kernel.ParallelRequire.files(filtered)
64-
end
65-
66-
:require ->
67-
case filter_patterns(value) do
68-
[] ->
69-
Mix.raise "No files matched pattern #{inspect value} given to --require"
70-
71-
filtered ->
72-
Enum.each(filtered, &Code.require_file(&1))
73-
end
74-
75-
:eval ->
76-
Code.eval_string(value)
77-
_ ->
78-
:ok
79-
end
80-
end
56+
process_load opts
8157

8258
if file do
8359
if File.regular?(file) do
@@ -89,7 +65,39 @@ defmodule Mix.Tasks.Run do
8965
if opts[:no_halt], do: :timer.sleep(:infinity)
9066
end
9167

68+
defp process_config(opts) do
69+
Enum.each opts, fn
70+
{:config, value} ->
71+
Mix.Task.run "loadconfig", [value]
72+
_ ->
73+
:ok
74+
end
75+
end
76+
77+
defp process_load(opts) do
78+
Enum.each opts, fn
79+
{:parallel_require, value} ->
80+
case filter_patterns(value) do
81+
[] ->
82+
Mix.raise "No files matched pattern #{inspect value} given to --parallel-require"
83+
filtered ->
84+
Kernel.ParallelRequire.files(filtered)
85+
end
86+
{:require, value} ->
87+
case filter_patterns(value) do
88+
[] ->
89+
Mix.raise "No files matched pattern #{inspect value} given to --require"
90+
filtered ->
91+
Enum.each(filtered, &Code.require_file(&1))
92+
end
93+
{:eval, value} ->
94+
Code.eval_string(value)
95+
_ ->
96+
:ok
97+
end
98+
end
99+
92100
defp filter_patterns(pattern) do
93-
Enum.filter(Enum.uniq(Path.wildcard(pattern)), &File.regular?(&1))
101+
Enum.filter(Enum.uniq(Path.wildcard(pattern)), &:filelib.is_regular(&1))
94102
end
95103
end

lib/mix/lib/mix/tasks/test.ex

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -82,9 +82,13 @@ defmodule Mix.Tasks.Test do
8282
8383
mix test --include external --exclude test
8484
85-
When filtering tests by line number the following styles are equivalent:
85+
In case a single file is being tested, it is possible pass a specific
86+
line number:
8687
8788
mix test test/some/particular/file_test.exs:12
89+
90+
Which is equivalent to:
91+
8892
mix test --only line:12 test/some/particular/file_test.exs
8993
9094
## Configuration

lib/mix/test/mix/tasks/run_test.exs

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,8 @@ Code.require_file "../../test_helper.exs", __DIR__
33
defmodule Mix.Tasks.RunTest do
44
use MixTest.Case
55

6+
import ExUnit.CaptureIO
7+
68
defmodule GetApp do
79
def project do
810
[ app: :get_app,
@@ -17,6 +19,18 @@ defmodule Mix.Tasks.RunTest do
1719
Mix.Project.push MixTest.Case.Sample
1820
end
1921

22+
test "loads configuration" do
23+
in_fixture "no_mixfile", fn ->
24+
assert capture_io(fn ->
25+
Mix.Task.run "run",
26+
["--config", fixture_path("configs/good_config.exs"),
27+
"--eval", "IO.puts Application.get_env(:my_app, :key)"]
28+
end) == "value\n"
29+
end
30+
after
31+
Application.delete_env(:my_app, :key)
32+
end
33+
2034
test "run requires files before evaling commands" do
2135
git_repo = fixture_path("git_repo/lib/git_repo.ex")
2236

0 commit comments

Comments
 (0)