summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/rebar3.erl23
-rw-r--r--src/rebar_dir.erl6
-rw-r--r--src/rebar_prv_eunit.erl21
-rw-r--r--src/rebar_utils.erl8
4 files changed, 33 insertions, 25 deletions
diff --git a/src/rebar3.erl b/src/rebar3.erl
index e55db71..2b73844 100644
--- a/src/rebar3.erl
+++ b/src/rebar3.erl
@@ -96,7 +96,7 @@ run(RawArgs) ->
run_aux(BaseState2, RawArgs).
run_aux(State, RawArgs) ->
- State2 = case os:getenv("REBAR_PROFILE") of
+ State1 = case os:getenv("REBAR_PROFILE") of
false ->
State;
"" ->
@@ -105,6 +105,9 @@ run_aux(State, RawArgs) ->
rebar_state:apply_profiles(State, [list_to_atom(Profile)])
end,
+ %% bootstrap test profile
+ State2 = rebar_state:add_to_profile(State1, test, test_state(State1)),
+
%% Process each command, resetting any state between each one
BaseDir = rebar_state:get(State, base_dir, ?DEFAULT_BASE_DIR),
State3 = rebar_state:set(State2, base_dir,
@@ -319,3 +322,21 @@ state_from_global_config(Config, GlobalConfigFile) ->
GlobalConfig2 = rebar_state:set(GlobalConfig, plugins, []),
GlobalConfig3 = rebar_state:set(GlobalConfig2, {plugins, global}, rebar_state:get(GlobalConfigThrowAway, plugins, [])),
rebar_state:providers(rebar_state:new(GlobalConfig3, Config), GlobalPlugins).
+
+test_state(State) ->
+ ErlOpts = rebar_state:get(State, erl_opts, []),
+ TestOpts = safe_define_test_macro(ErlOpts),
+ [{extra_src_dirs, ["test"]}, {erl_opts, TestOpts}].
+
+safe_define_test_macro(Opts) ->
+ %% defining a compile macro twice results in an exception so
+ %% make sure 'TEST' is only defined once
+ case test_defined(Opts) of
+ true -> [];
+ false -> [{d, 'TEST'}]
+ end.
+
+test_defined([{d, 'TEST'}|_]) -> true;
+test_defined([{d, 'TEST', true}|_]) -> true;
+test_defined([_|Rest]) -> test_defined(Rest);
+test_defined([]) -> false. \ No newline at end of file
diff --git a/src/rebar_dir.erl b/src/rebar_dir.erl
index 364e197..09e3114 100644
--- a/src/rebar_dir.erl
+++ b/src/rebar_dir.erl
@@ -139,7 +139,7 @@ src_dirs(Opts, Default) ->
Vs = proplists:get_all_values(src_dirs, ErlOpts),
case lists:append([rebar_opts:get(Opts, src_dirs, []) | Vs]) of
[] -> Default;
- Dirs -> Dirs
+ Dirs -> lists:usort(Dirs)
end.
-spec extra_src_dirs(rebar_dict()) -> list(file:filename_all()).
@@ -151,7 +151,7 @@ extra_src_dirs(Opts, Default) ->
Vs = proplists:get_all_values(extra_src_dirs, ErlOpts),
case lists:append([rebar_opts:get(Opts, extra_src_dirs, []) | Vs]) of
[] -> Default;
- Dirs -> Dirs
+ Dirs -> lists:usort(Dirs)
end.
-spec all_src_dirs(rebar_dict()) -> list(file:filename_all()).
@@ -160,7 +160,7 @@ all_src_dirs(Opts) -> all_src_dirs(Opts, [], []).
-spec all_src_dirs(rebar_dict(), list(file:filename_all()), list(file:filename_all())) ->
list(file:filename_all()).
all_src_dirs(Opts, SrcDefault, ExtraDefault) ->
- src_dirs(Opts, SrcDefault) ++ extra_src_dirs(Opts, ExtraDefault).
+ lists:usort(src_dirs(Opts, SrcDefault) ++ extra_src_dirs(Opts, ExtraDefault)).
%% given a path if that path is an ancestor of an app dir return the path relative to that
%% apps outdir. if the path is not an ancestor to any app dirs but is an ancestor of the
diff --git a/src/rebar_prv_eunit.erl b/src/rebar_prv_eunit.erl
index 357b92f..0cdc20b 100644
--- a/src/rebar_prv_eunit.erl
+++ b/src/rebar_prv_eunit.erl
@@ -34,8 +34,7 @@ init(State) ->
{opts, eunit_opts(State)},
{profiles, [test]}]),
State1 = rebar_state:add_provider(State, Provider),
- State2 = rebar_state:add_to_profile(State1, test, test_state(State1)),
- {ok, State2}.
+ {ok, State1}.
-spec do(rebar_state:t()) -> {ok, rebar_state:t()} | {error, string()}.
do(State) ->
@@ -103,19 +102,6 @@ format_error({error, Error}) ->
%% Internal functions
%% ===================================================================
-test_state(State) ->
- ErlOpts = rebar_state:get(State, erl_opts, []),
- TestOpts = safe_define_test_macro(ErlOpts),
- [{extra_src_dirs, ["test"]}, {erl_opts, TestOpts}].
-
-safe_define_test_macro(Opts) ->
- %% defining a compile macro twice results in an exception so
- %% make sure 'TEST' is only defined once
- case test_defined(Opts) of
- true -> Opts;
- false -> [{d, 'TEST'}] ++ Opts
- end.
-
compile(State, {ok, Tests}) ->
%% inject `eunit_first_files`, `eunit_compile_opts` and any
%% directories required by tests into the applications
@@ -191,11 +177,6 @@ inject_test_dir(Opts, Dir) ->
ExtraSrcDirs = rebar_opts:get(Opts, extra_src_dirs, []),
rebar_opts:set(Opts, extra_src_dirs, ExtraSrcDirs ++ [Dir]).
-test_defined([{d, 'TEST'}|_]) -> true;
-test_defined([{d, 'TEST', true}|_]) -> true;
-test_defined([_|Rest]) -> test_defined(Rest);
-test_defined([]) -> false.
-
prepare_tests(State) ->
%% parse and translate command line tests
CmdTests = resolve_tests(State),
diff --git a/src/rebar_utils.erl b/src/rebar_utils.erl
index 4fd4bd1..d00a46f 100644
--- a/src/rebar_utils.erl
+++ b/src/rebar_utils.erl
@@ -654,13 +654,19 @@ update_code(Paths) ->
code:add_patha(Path),
ok;
{ok, Modules} ->
+ %% stick rebar ebin dir before purging to prevent
+ %% inadvertent termination
+ RebarBin = code:lib_dir(rebar, ebin),
+ ok = code:stick_dir(RebarBin),
%% replace_path causes problems when running
%% tests in projects like erlware_commons that rebar3
%% also includes
%code:replace_path(App, Path),
code:del_path(App),
code:add_patha(Path),
- [begin code:purge(M), code:delete(M) end || M <- Modules]
+ [begin code:purge(M), code:delete(M) end || M <- Modules],
+ %% unstick rebar dir
+ ok = code:unstick_dir(RebarBin)
end
end, Paths).