Skip to content

Commit

Permalink
Merge branch 'master' of https://github.com/erlang/rebar3 into from-f…
Browse files Browse the repository at this point in the history
…ile-with-template
  • Loading branch information
niamtokik committed Jul 12, 2020
2 parents 49cc997 + d92809a commit 0940b37
Show file tree
Hide file tree
Showing 8 changed files with 89 additions and 24 deletions.
13 changes: 12 additions & 1 deletion src/rebar3.erl
Original file line number Diff line number Diff line change
Expand Up @@ -430,7 +430,18 @@ test_state(State) ->
ProfileOpts = proplists:get_value(test, Profiles, []),
ErlOpts = proplists:get_value(erl_opts, ProfileOpts, []),
TestOpts = safe_define_test_macro(ErlOpts),
[{extra_src_dirs, ["test"]}, {erl_opts, TestOpts}].
%% Only define the test directory if it wasn't set by the user already,
%% otherwise our definition may clash with theirs
Extras = rebar_opts:get(Opts, extra_src_dirs, []),
ExtrasTest = proplists:get_value(extra_src_dirs, ProfileOpts, []),
IsDefined = lists:any(fun({"test", _}) -> true
; ("test") -> true
; (_) -> false
end, Extras ++ ExtrasTest),
case IsDefined of
true -> [];
false -> [{extra_src_dirs, [{"test", [{recursive, false}]}]}]
end ++ [{erl_opts, TestOpts}].

-spec safe_define_test_macro([any()]) -> [any()] | [{'d',atom()} | any()].
safe_define_test_macro(Opts) ->
Expand Down
28 changes: 21 additions & 7 deletions src/rebar_compiler.erl
Original file line number Diff line number Diff line change
Expand Up @@ -354,26 +354,40 @@ clean_(CompilerMod, AppInfo, _Label) ->
ok.

annotate_extras(AppInfo) ->
ExtraDirs = rebar_dir:extra_src_dirs(rebar_app_info:opts(AppInfo), []),
OldSrcDirs = rebar_app_info:get(AppInfo, src_dirs, ["src"]),
AppOpts = rebar_app_info:opts(AppInfo),
ExtraDirs = rebar_dir:extra_src_dirs(AppOpts, []),
OldSrcDirs = rebar_dir:src_dirs(AppOpts, ["src"]),
%% Re-annotate the directories with non-default options if it is the
%% case; otherwise, later down the line, the options get dropped with
%% profiles. All of this must be done with the rebar_dir functionality
%% which properly tracks and handles the various legacy formats for
%% recursion setting (erl_opts vs. dir options and profiles)
ExtraDirsOpts = [case rebar_dir:recursive(AppOpts, Dir) of
false -> {Dir, [{recursive, false}]};
true -> Dir
end || Dir <- ExtraDirs],
OldSrcDirsOpts = [case rebar_dir:recursive(AppOpts, Dir) of
false -> {Dir, [{recursive, false}]};
true -> Dir
end || Dir <- OldSrcDirs],
AppDir = rebar_app_info:dir(AppInfo),
lists:map(fun(Dir) ->
lists:map(fun({DirOpt, Dir}) ->
EbinDir = filename:join(rebar_app_info:out_dir(AppInfo), Dir),
%% need a unique name to prevent lookup issues that clobber entries
AppName = unicode:characters_to_binary(
[rebar_app_info:name(AppInfo), "_", Dir]
),
AppInfo0 = rebar_app_info:name(AppInfo, AppName),
AppInfo1 = rebar_app_info:ebin_dir(AppInfo0, EbinDir),
AppInfo2 = rebar_app_info:set(AppInfo1, src_dirs, [Dir]),
AppInfo3 = rebar_app_info:set(AppInfo2, extra_src_dirs, OldSrcDirs),
AppInfo2 = rebar_app_info:set(AppInfo1, src_dirs, [DirOpt]),
AppInfo3 = rebar_app_info:set(AppInfo2, extra_src_dirs, OldSrcDirsOpts),
add_to_includes( % give access to .hrl in app's src/
AppInfo3,
[filename:join([AppDir, D]) || D <- OldSrcDirs]
)
end,
[ExtraDir || ExtraDir <- ExtraDirs,
filelib:is_dir(filename:join(AppDir, ExtraDir))]
[T || T = {_DirOpt, ExtraDir} <- lists:zip(ExtraDirsOpts, ExtraDirs),
filelib:is_dir(filename:join(AppDir, ExtraDir))]
).

find_source_files(BaseDir, SrcExt, SrcDirs, Opts) ->
Expand Down
2 changes: 1 addition & 1 deletion src/rebar_plugins.erl
Original file line number Diff line number Diff line change
Expand Up @@ -131,7 +131,7 @@ handle_plugin(Profile, Plugin, State, Upgrade) ->
catch
?WITH_STACKTRACE(C,T,S)
?DEBUG("~p ~p ~p", [C, T, S]),
?WARN("Plugin ~p not available. It will not be used.", [Plugin]),
?WARN("Errors loading plugin ~p. Run rebar3 with DEBUG=1 set to see errors.", [Plugin]),
{[], State}
end.

Expand Down
2 changes: 1 addition & 1 deletion src/rebar_prv_compile.erl
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@
do/1,
format_error/1]).

-export([compile/2, compile/3]).
-export([compile/2, compile/3, compile/4]).

-include_lib("providers/include/providers.hrl").
-include("rebar.hrl").
Expand Down
14 changes: 5 additions & 9 deletions src/rebar_prv_plugins_upgrade.erl
Original file line number Diff line number Diff line change
Expand Up @@ -62,7 +62,7 @@ upgrade(Plugin, State) ->
?PRV_ERROR({not_found, Plugin});
{ok, P, Profile} ->
State1 = rebar_state:set(State, deps_dir, ?DEFAULT_PLUGINS_DIR),
{Apps, _State2} = rebar_prv_install_deps:handle_deps_as_profile(Profile, State1, [P], true),
{Apps, State2} = rebar_prv_install_deps:handle_deps_as_profile(Profile, State1, [P], true),

{no_cycle, Sorted} = rebar_prv_install_deps:find_cycles(Apps),
ToBuild = rebar_prv_install_deps:cull_compile(Sorted, []),
Expand All @@ -72,7 +72,8 @@ upgrade(Plugin, State) ->
code:add_pathsa(CodePaths),

%% Build plugin and its deps
[build_plugin(AppInfo, Apps, State) || AppInfo <- ToBuild],
_ = build_plugin(ToBuild, State2),

{ok, State}
end.

Expand All @@ -88,11 +89,6 @@ find_plugin(Plugin, Profiles, State) ->
end
end, Profiles).

build_plugin(AppInfo, Apps, State) ->
build_plugin(ToBuild, State) ->
Providers = rebar_state:providers(State),
Resources = rebar_state:resources(State),
AppDir = rebar_app_info:dir(AppInfo),
C = rebar_config:consult(AppDir),
S = rebar_state:new(rebar_state:all_deps(rebar_state:new(), Apps), C, AppDir),
AppInfo1 = rebar_app_info:update_opts(AppInfo, rebar_app_info:opts(AppInfo), C),
rebar_prv_compile:compile(rebar_state:set_resources(S, Resources), Providers, AppInfo1).
rebar_prv_compile:compile(State, Providers, ToBuild, plugins).
10 changes: 8 additions & 2 deletions src/rebar_prv_shell.erl
Original file line number Diff line number Diff line change
Expand Up @@ -104,6 +104,8 @@ do(Config) ->
{ok, Config}.

-spec format_error(any()) -> iolist().
format_error({unknown_app, Unknown}) ->
io_lib:format("Applications list for shell contains an unrecognizable application definition: ~p", [Unknown]);
format_error(Reason) ->
io_lib:format("~p", [Reason]).

Expand Down Expand Up @@ -457,7 +459,9 @@ normalize_load_apps([{App, _Vsn, load} | T]) -> [App | normalize_load_apps(T)];
normalize_load_apps([{_App, _Vsn, none} | T]) -> normalize_load_apps(T);
normalize_load_apps([{App, _Vsn, Operator} | T]) when is_atom(Operator) ->
[App | normalize_load_apps(T)];
normalize_load_apps([App | T]) when is_atom(App) -> [App | normalize_load_apps(T)].
normalize_load_apps([App | T]) when is_atom(App) -> [App | normalize_load_apps(T)];
normalize_load_apps([Unknown | _]) ->
erlang:error(?PRV_ERROR({unknown_app, Unknown})).

normalize_boot_apps([]) -> [];
normalize_boot_apps([{_App, load} | T]) -> normalize_boot_apps(T);
Expand All @@ -467,7 +471,9 @@ normalize_boot_apps([{_App, _Vsn, none} | T]) -> normalize_boot_apps(T);
normalize_boot_apps([{App, _Vsn, Operator} | T]) when is_atom(Operator) ->
[App | normalize_boot_apps(T)];
normalize_boot_apps([{App, _Vsn} | T]) -> [App | normalize_boot_apps(T)];
normalize_boot_apps([App | T]) when is_atom(App) -> [App | normalize_boot_apps(T)].
normalize_boot_apps([App | T]) when is_atom(App) -> [App | normalize_boot_apps(T)];
normalize_boot_apps([Unknown | _]) ->
erlang:error(?PRV_ERROR({unknown_app, Unknown})).

remove_error_handler(0) ->
?WARN("Unable to remove simple error_logger handler", []);
Expand Down
36 changes: 35 additions & 1 deletion test/rebar_compile_SUITE.erl
Original file line number Diff line number Diff line change
Expand Up @@ -38,7 +38,7 @@ all() ->
recompile_when_parse_transform_as_opt_changes,
recompile_when_parse_transform_inline_changes,
regex_filter_skip, regex_filter_regression,
recursive, no_recursive,
recursive, no_recursive, extra_recursion,
always_recompile_when_erl_compiler_options_set,
dont_recompile_when_erl_compiler_options_env_does_not_change,
recompile_when_erl_compiler_options_env_changes,
Expand Down Expand Up @@ -2500,6 +2500,40 @@ no_recursive(Config) ->
?assert(false==lists:member("rec.beam",Files2)),
ok.

extra_recursion(Config) ->
AppDir = ?config(apps, Config),

Name = rebar_test_utils:create_random_name("app1_"),
Vsn = rebar_test_utils:create_random_vsn(),
rebar_test_utils:create_app(AppDir, Name, Vsn, [kernel, stdlib]),
rebar_test_utils:write_src_file(filename:join([AppDir, "src", "src2"]), "rec.erl"),
rebar_test_utils:write_src_file(filename:join([AppDir, "test", "test2"]), "rectest.erl"),

%% Default for src directories: recursive
%% default for extra_src directories: non-recursive
RebarConfig1 = [],
rebar_test_utils:run_and_check(Config, RebarConfig1, ["as", "test", "compile"],
{ok, [{app, Name}]}),
EbinDir = filename:join([AppDir, "_build", "test", "lib", Name, "ebin"]),
{ok, Files1} = rebar_utils:list_dir(EbinDir),
?assert(lists:member("rec.beam", Files1)),
file:delete(filename:join(EbinDir, "rec.beam")),

TestEbinDir = filename:join([AppDir, "_build", "test", "lib", Name, "test"]),
{ok, TestFiles1} = rebar_utils:list_dir(TestEbinDir),
?assertNot(lists:member("rectest.beam", TestFiles1)),

RebarConfig2 = [{src_dirs,[{"src",[{recursive,false}]}]},
{extra_src_dirs, [{"test", [{recursive, true}]}]}],
rebar_test_utils:run_and_check(Config, RebarConfig2, ["as", "test", "compile"],
{ok, [{app, Name}]}),
{ok, Files2} = rebar_utils:list_dir(EbinDir),
?assertNot(lists:member("rec.beam",Files2)),

{ok, TestFiles2} = rebar_utils:list_dir(TestEbinDir),
?assert(lists:member("rectest.beam", TestFiles2)),
ok.

regex_filter_skip(Config) ->
AppDir = ?config(apps, Config),
Name = rebar_test_utils:create_random_name("regex_skip"),
Expand Down
8 changes: 6 additions & 2 deletions test/rebar_plugins_SUITE.erl
Original file line number Diff line number Diff line change
Expand Up @@ -191,13 +191,17 @@ upgrade(Config) ->
{{iolist_to_binary(PkgName), <<"0.1.1">>}, []}]}
]),

%% beam file to verify plugin is acutally compiled
PluginBeam = filename:join([AppDir, "_build", "default", "plugins",
PkgName, "ebin", [PkgName, ".beam"]]),

RConfFile = rebar_test_utils:create_config(AppDir, [{plugins, [list_to_atom(PkgName)]}]),
{ok, RConf} = file:consult(RConfFile),

%% Build with deps.
rebar_test_utils:run_and_check(
Config, RConf, ["compile"],
{ok, [{app, Name}, {plugin, PkgName, <<"0.1.1">>}]}
{ok, [{app, Name, valid}, {file, PluginBeam}, {plugin, PkgName, <<"0.1.1">>}]}
),

catch mock_pkg_resource:unmock(),
Expand All @@ -212,7 +216,7 @@ upgrade(Config) ->
%% Build with deps.
rebar_test_utils:run_and_check(
Config, RConf, ["plugins", "upgrade", PkgName],
{ok, [{app, Name}, {plugin, PkgName, <<"0.1.3">>}]}
{ok, [{app, Name, valid}, {file, PluginBeam}, {plugin, PkgName, <<"0.1.3">>}]}
).

upgrade_project_plugin(Config) ->
Expand Down

0 comments on commit 0940b37

Please sign in to comment.