From 3687b0f1046aa79c040ed6f200da26ce6c2b5680 Mon Sep 17 00:00:00 2001 From: Guillaume Grenet Date: Sat, 14 Dec 2013 17:59:04 +0800 Subject: [PATCH 1/2] CLI/compile: fail when some patterns aren't matched --- lib/elixir/lib/kernel/cli.ex | 49 +++++++++++++++++++++++++++--------- 1 file changed, 37 insertions(+), 12 deletions(-) diff --git a/lib/elixir/lib/kernel/cli.ex b/lib/elixir/lib/kernel/cli.ex index d45c594b699..db1c1fa725b 100644 --- a/lib/elixir/lib/kernel/cli.ex +++ b/lib/elixir/lib/kernel/cli.ex @@ -339,21 +339,46 @@ defmodule Kernel.CLI do defp process_command({:compile, patterns}, config) do :filelib.ensure_dir(:filename.join(config.output, ".")) - files = Enum.map patterns, &Path.wildcard(&1) - files = Enum.uniq(Enum.concat(files)) - files = Enum.filter files, &:filelib.is_regular(&1) - - if files != [] do - wrapper fn -> - Code.compiler_options(config.compiler_options) - Kernel.ParallelCompiler.files_to_path(files, config.output, - each_file: fn file -> if config.verbose_compile do IO.puts "Compiled #{file}" end end) - end - else - { :error, "--compile : No files matched patterns #{Enum.join(patterns, ",")}" } + case match_regular_files(patterns) do + { :ok, [] } -> + { :error, "--compile : No files matched provided patterns." } + { :ok, files } -> + wrapper fn -> + Code.compiler_options(config.compiler_options) + Kernel.ParallelCompiler.files_to_path(files, config.output, + each_file: fn file -> if config.verbose_compile do IO.puts "Compiled #{file}" end end) + end + { :missing, missing } -> + { :error, "--compile : No files matched pattern(s) #{Enum.join(missing, ",")}" } end end + defp match_regular_files(patterns) do + + matched_files = Enum.map patterns, fn(pattern) -> + case Path.wildcard(pattern) do + [] -> {:missing, pattern } + files -> {:ok, files } + end + end + + files = Enum.filter_map matched_files, + fn(match) -> elem(match, 0) == :ok end, + &elem(&1, 1) + + missing_patterns = Enum.filter_map matched_files, + fn(match) -> elem(match, 0) == :missing end, + &elem(&1, 1) + + if missing_patterns == [] do + files = Enum.uniq(Enum.concat(files)) + files = Enum.filter files, &:filelib.is_regular(&1) + { :ok, files } + else + { :missing, Enum.uniq(missing_patterns) } + end + end + defp wrapper(fun) do fun.() :ok From cd43f618e03a35fb4e3058dca4a7263af6b79868 Mon Sep 17 00:00:00 2001 From: Guillaume Grenet Date: Sat, 14 Dec 2013 18:27:29 +0800 Subject: [PATCH 2/2] CLI/Compile: added a test to showcase the new behaviour --- lib/elixir/test/elixir/kernel/cli_test.exs | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/lib/elixir/test/elixir/kernel/cli_test.exs b/lib/elixir/test/elixir/kernel/cli_test.exs index dbbe71f4289..6b9b5483caf 100644 --- a/lib/elixir/test/elixir/kernel/cli_test.exs +++ b/lib/elixir/test/elixir/kernel/cli_test.exs @@ -94,6 +94,14 @@ defmodule Kernel.CLI.CompileTest do assert :string.str(output, bar) > 0, "expected bar.ex to miss module Foo" assert :string.str(output, 'elixir_compiler') == 0, "expected elixir_compiler to not be in output" end + + test :compile_missing_patterns do + fixture = fixture_path "compile_sample.ex" + output = elixirc('#{fixture} non_existing.ex -o #{tmp_path}') + assert :string.str(output, 'non_existing.ex') > 0, "expected non_existing.ex to be mentionned" + assert :string.str(output, 'compile_sample.ex') == 0, "expected compile_sample.ex to not be mentionned" + refute File.exists?(tmp_path("Elixir.CompileSample.beam")) , "expected the sample to not be compiled" + end end defmodule Kernel.CLI.ParallelCompilerTest do