瀏覽代碼

fixes for cover under new compiler/eunit/ct

* only try to cover compile directories that actually exist
* recover from failures where source files don't contain required
  attributes for cover compilation and print warning
pull/905/head
alisdair sullivan 9 年之前
父節點
當前提交
d8be03ab6a
共有 2 個檔案被更改,包括 37 行新增20 行删除
  1. +18
    -14
      src/rebar_prv_cover.erl
  2. +19
    -6
      test/rebar_cover_SUITE.erl

+ 18
- 14
src/rebar_prv_cover.erl 查看文件

@ -279,21 +279,26 @@ cover_compile(State, apps) ->
Apps = filter_checkouts(rebar_state:project_apps(State)),
AppDirs = app_dirs(Apps),
ExtraDirs = extra_src_dirs(State, Apps),
cover_compile(State, AppDirs ++ ExtraDirs);
cover_compile(State, lists:filter(fun(D) -> ec_file:is_dir(D) end, AppDirs ++ ExtraDirs));
cover_compile(State, Dirs) ->
%% start the cover server if necessary
{ok, CoverPid} = start_cover(),
%% redirect cover output
true = redirect_cover_output(State, CoverPid),
CompileResult = compile(Dirs, []),
%% print any warnings about modules that failed to cover compile
lists:foreach(fun print_cover_warnings/1, lists:flatten(CompileResult)).
compile([], Acc) -> lists:reverse(Acc);
compile([Dir|Rest], Acc) ->
?INFO("covering ~p", [Dir]),
Result = cover:compile_beam_directory(Dir),
compile(Rest, [Result|Acc]).
lists:foreach(fun(Dir) ->
?DEBUG("cover compiling ~p", [Dir]),
case catch(cover:compile_beam_directory(Dir)) of
{error, eacces} ->
?WARN("Directory ~p not readable, modules will not be included in coverage", [Dir]);
{error, enoent} ->
?WARN("Directory ~p not found", [Dir]);
{'EXIT', {Reason, _}} ->
?WARN("Cover compilation for directory ~p failed: ~p", [Dir, Reason]);
Results ->
%% print any warnings about modules that failed to cover compile
lists:foreach(fun print_cover_warnings/1, lists:flatten(Results))
end
end, Dirs).
app_dirs(Apps) ->
lists:foldl(fun app_ebin_dirs/2, [], Apps).
@ -302,7 +307,7 @@ app_ebin_dirs(App, Acc) ->
AppDir = rebar_app_info:ebin_dir(App),
ExtraDirs = rebar_dir:extra_src_dirs(rebar_app_info:opts(App), []),
OutDir = rebar_app_info:out_dir(App),
[filename:join([OutDir, D]) || D <- [AppDir|ExtraDirs]] ++ Acc.
[AppDir] ++ [filename:join([OutDir, D]) || D <- ExtraDirs] ++ Acc.
extra_src_dirs(State, Apps) ->
BaseDir = rebar_state:dir(State),
@ -339,9 +344,8 @@ redirect_cover_output(State, CoverPid) ->
group_leader(F, CoverPid).
print_cover_warnings({ok, _}) -> ok;
print_cover_warnings({error, File}) ->
?WARN("Cover compilation of ~p failed, module is not included in cover data.",
[File]).
print_cover_warnings({error, Error}) ->
?WARN("Cover compilation failed: ~p", [Error]).
write_coverdata(State, Task) ->
DataDir = cover_dir(State),

+ 19
- 6
test/rebar_cover_SUITE.erl 查看文件

@ -72,7 +72,7 @@ basic_extra_src_dirs(Config) ->
Name = rebar_test_utils:create_random_name("cover_extra_"),
Vsn = rebar_test_utils:create_random_vsn(),
rebar_test_utils:create_eunit_app(AppDir, Name, Vsn, [kernel, stdlib]),
rebar_test_utils:create_app(AppDir, Name, Vsn, [kernel, stdlib]),
ExtraSrc = io_lib:format("-module(~ts_extra).\n-export([ok/0]).\nok() -> ok.\n", [Name]),
@ -86,8 +86,11 @@ basic_extra_src_dirs(Config) ->
["eunit", "--cover"],
{ok, [{app, Name}]}),
Mod = list_to_atom(lists:flatten(io_lib:format("~ts_extra", [Name]))),
{file, _} = cover:is_compiled(Mod).
Mod = list_to_atom(Name),
{file, _} = cover:is_compiled(Mod),
ExtraMod = list_to_atom(lists:flatten(io_lib:format("~ts_extra", [Name]))),
{file, _} = cover:is_compiled(ExtraMod).
release_extra_src_dirs(Config) ->
AppDir = ?config(apps, Config),
@ -120,10 +123,15 @@ release_extra_src_dirs(Config) ->
["eunit", "--cover"],
{ok, [{app, Name1}, {app, Name2}]}),
Mod1 = list_to_atom(lists:flatten(io_lib:format("~ts_extra", [Name1]))),
Mod1 = list_to_atom(Name1),
{file, _} = cover:is_compiled(Mod1),
Mod2 = list_to_atom(lists:flatten(io_lib:format("~ts_extra", [Name2]))),
{file, _} = cover:is_compiled(Mod2).
Mod2 = list_to_atom(Name2),
{file, _} = cover:is_compiled(Mod2),
ExtraMod1 = list_to_atom(lists:flatten(io_lib:format("~ts_extra", [Name1]))),
{file, _} = cover:is_compiled(ExtraMod1),
ExtraMod2 = list_to_atom(lists:flatten(io_lib:format("~ts_extra", [Name2]))),
{file, _} = cover:is_compiled(ExtraMod2).
root_extra_src_dirs(Config) ->
AppDir = ?config(apps, Config),
@ -147,6 +155,11 @@ root_extra_src_dirs(Config) ->
["eunit", "--cover"],
{ok, [{app, Name1}, {app, Name2}]}),
Mod1 = list_to_atom(Name1),
{file, _} = cover:is_compiled(Mod1),
Mod2 = list_to_atom(Name2),
{file, _} = cover:is_compiled(Mod2),
{file, _} = cover:is_compiled(extra).
index_written(Config) ->

Loading…
取消
儲存