summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorFred Hebert <mononcqc@ferd.ca>2018-06-08 19:30:38 -0400
committerGitHub <noreply@github.com>2018-06-08 19:30:38 -0400
commitca36f30fe302c8a23f2e46ec077304cbb208999c (patch)
treefcb132d8c5c42dd87b7024121bb60e58fd46d0ca
parent2c10bc97248e78e2aef1cdb8f87dd300ce954cca (diff)
parentd1fc937515b312c1e5129e9e435e5b462f34b874 (diff)
Merge pull request #1807 from starbelly/1645-erl_files_first_string_crashes_rebar3
Resolve string vs list crashing rebar3
-rw-r--r--src/rebar_erlc_compiler.erl8
-rw-r--r--src/rebar_utils.erl11
-rw-r--r--test/rebar_utils_SUITE.erl11
3 files changed, 27 insertions, 3 deletions
diff --git a/src/rebar_erlc_compiler.erl b/src/rebar_erlc_compiler.erl
index c588a25..ebdd9dd 100644
--- a/src/rebar_erlc_compiler.erl
+++ b/src/rebar_erlc_compiler.erl
@@ -285,6 +285,7 @@ gather_src(Opts, BaseDirParts, [Dir|Rest], Srcs, CompileOpts) ->
%% files, so that yet to be compiled parse transformations are excluded from it.
erl_first_files(Opts, ErlOpts, Dir, NeededErlFiles) ->
ErlFirstFilesConf = rebar_opts:get(Opts, erl_first_files, []),
+ valid_erl_first_conf(ErlFirstFilesConf),
NeededSrcDirs = lists:usort(lists:map(fun filename:dirname/1, NeededErlFiles)),
%% NOTE: order of files here is important!
ErlFirstFiles =
@@ -796,3 +797,10 @@ dir_recursive(Opts, Dir, CompileOpts) when is_list(CompileOpts) ->
undefined -> rebar_dir:recursive(Opts, Dir);
Recursive -> Recursive
end.
+
+valid_erl_first_conf(FileList) ->
+ case rebar_utils:is_list_of_strings(FileList) of
+ true -> true;
+ false -> ?ABORT("An invalid file list (~p) was provided as part of your erl_files_first directive",
+ [FileList])
+ end.
diff --git a/src/rebar_utils.erl b/src/rebar_utils.erl
index 604abb8..2ded481 100644
--- a/src/rebar_utils.erl
+++ b/src/rebar_utils.erl
@@ -73,7 +73,8 @@
list_dir/1,
user_agent/0,
reread_config/1,
- get_proxy_auth/0]).
+ get_proxy_auth/0,
+ is_list_of_strings/1]).
%% for internal use only
@@ -919,3 +920,11 @@ get_proxy_auth() ->
undefined -> [];
{ok, ProxyAuth} -> ProxyAuth
end.
+
+-spec rebar_utils:is_list_of_strings(term()) -> boolean().
+is_list_of_strings(List) when not is_list(hd(List)) ->
+ false;
+is_list_of_strings(List) when is_list(hd(List)) ->
+ true;
+is_list_of_strings(List) when is_list(List) ->
+ true.
diff --git a/test/rebar_utils_SUITE.erl b/test/rebar_utils_SUITE.erl
index e4a5bd3..233fcff 100644
--- a/test/rebar_utils_SUITE.erl
+++ b/test/rebar_utils_SUITE.erl
@@ -32,7 +32,8 @@
blacklisted_otp_version/1,
sh_does_not_miss_messages/1,
tup_merge/1,
- proxy_auth/1]).
+ proxy_auth/1,
+ is_list_of_strings/1]).
-include_lib("common_test/include/ct.hrl").
-include_lib("eunit/include/eunit.hrl").
@@ -48,7 +49,7 @@ all() ->
[{group, args_to_tasks},
sh_does_not_miss_messages,
tup_merge,
- proxy_auth].
+ proxy_auth, is_list_of_strings].
groups() ->
[{args_to_tasks, [], [empty_arglist,
@@ -312,3 +313,9 @@ restore_proxy_env(ProxyEnvKey, false) ->
os:putenv(ProxyEnvKey, "");
restore_proxy_env(ProxyEnvKey, ProxySpec) ->
os:putenv(ProxyEnvKey, ProxySpec).
+
+is_list_of_strings(_Config) ->
+ ?assert(rebar_utils:is_list_of_strings(["foo"])),
+ ?assert(rebar_utils:is_list_of_strings([])),
+ ?assert(rebar_utils:is_list_of_strings("")),
+ ?assert(rebar_utils:is_list_of_strings("foo") == false).