浏览代码

change from post-purging modules after checking their module info to

pre-purging before checking to facilitate long do chains
pull/202/head
alisdair sullivan 10 年前
父节点
当前提交
6c421e5433
共有 3 个文件被更改,包括 23 次插入10 次删除
  1. +2
    -4
      src/rebar_erlc_compiler.erl
  2. +8
    -4
      src/rebar_otp_app.erl
  3. +13
    -2
      test/rebar_compile_SUITE.erl

+ 2
- 4
src/rebar_erlc_compiler.erl 查看文件

@ -260,10 +260,10 @@ opts_changed(Opts, Target) ->
Basename = filename:basename(Target, ".beam"),
Dirname = filename:dirname(Target),
ObjectFile = filename:join([Dirname, Basename]),
_ = purge(list_to_atom(Basename)),
case code:load_abs(ObjectFile) of
{module, Mod} ->
Compile = Mod:module_info(compile),
_ = purge(Mod),
lists:sort(Opts) =/= lists:sort(proplists:get_value(options,
Compile));
{error, nofile} -> false
@ -273,9 +273,7 @@ purge(Mod) ->
%% remove old code if necessary
_ = code:purge(Mod),
%% move current code to old
true = code:delete(Mod),
%% remove new old code
_ = code:purge(Mod).
_ = code:delete(Mod).
check_erlcinfo(_Config, #erlcinfo{vsn=?ERLCINFO_VSN}) ->
ok;

+ 8
- 4
src/rebar_otp_app.erl 查看文件

@ -167,18 +167,22 @@ ebin_modules(App, Dir) ->
beam_src(Beam) ->
try
Mod = list_to_atom(filename:basename(Beam, ".beam")),
_ = purge(Mod),
{module, Mod} = code:load_abs(filename:rootname(Beam, ".beam")),
Compile = Mod:module_info(compile),
%% completely purge module so any other attempts to load it succeed
_ = code:purge(Mod),
_ = code:delete(Mod),
_ = code:purge(Mod),
proplists:get_value(source, Compile, [])
catch
error:undef -> [];
error:nofile -> []
end.
purge(Mod) ->
%% remove old code if necessary
_ = code:purge(Mod),
%% move current code to old
_ = code:delete(Mod).
ensure_registered(AppData) ->
case lists:keyfind(registered, 1, AppData) of
false ->

+ 13
- 2
test/rebar_compile_SUITE.erl 查看文件

@ -11,7 +11,8 @@
build_checkout_deps/1,
recompile_when_opts_change/1,
dont_recompile_when_opts_dont_change/1,
dont_recompile_yrl_or_xrl/1]).
dont_recompile_yrl_or_xrl/1,
purge_before_load/1]).
-include_lib("common_test/include/ct.hrl").
-include_lib("eunit/include/eunit.hrl").
@ -33,7 +34,7 @@ all() ->
[build_basic_app, build_release_apps,
build_checkout_apps, build_checkout_deps,
recompile_when_opts_change, dont_recompile_when_opts_dont_change,
dont_recompile_yrl_or_xrl].
dont_recompile_yrl_or_xrl, purge_before_load].
build_basic_app(Config) ->
AppDir = ?config(apps, Config),
@ -183,3 +184,13 @@ dont_recompile_yrl_or_xrl(Config) ->
NewModTime = filelib:last_modified(XrlBeam),
?assert(ModTime == NewModTime).
purge_before_load(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]),
Tasks = ["do", "compile,compile,compile"],
rebar_test_utils:run_and_check(Config, [], Tasks, {ok, [{app, Name}]}).

正在加载...
取消
保存