|
|
@ -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), |
|
|
|