Current section
Files
Jump to
Current section
Files
src/mix_covertool.erl
-module(mix_covertool).
%% mix plugin callbacks
-export([start/2]).
-include("covertool.hrl").
%% ===================================================================
%% Mix plugin callbacks
%% ===================================================================
start(_CompilePath, Opts) ->
_ = cover:start(),
Summary = proplists:get_bool(summary, Opts),
AppName = proplists:get_value(app, mix_project(config)),
ExtraApps = proplists:get_value(include_apps, Opts, []),
AppsPaths = mix_project(deps_paths),
BuildPath = mix_project(build_path),
{ok, Cwd} = file:get_cwd(),
Configs = lists:map(fun(App) ->
AppPath = maps:get(App, AppsPaths, Cwd),
BeamDir = filename:join([unicode:characters_to_list(BuildPath), "lib", App, "ebin"]),
Sources = lists:map(fun(Dir) -> filename:join([unicode:characters_to_list(AppPath), Dir]) end, ["lib", "src"]),
compile_beam_directory(BeamDir),
OutputFile = filename:join([Cwd, atom_to_list(App) ++ ".covertool.xml"]),
#config{appname = App, sources = Sources, beams = [BeamDir], summary = Summary, output = OutputFile}
end, [AppName | ExtraApps]),
fun() ->
lists:foreach(fun(Config) -> covertool:generate_report(Config, cover:modules()) end, Configs)
end.
compile_beam_directory(CompilePath) ->
case cover:compile_beam_directory(CompilePath) of
Results when is_list(Results) ->
ok;
{error, _} ->
mix(raise, <<"Failed to cover compile directory">>)
end.
%% ===================================================================
%% Mix helpers
%% ===================================================================
mix(Fun, Arg) ->
'Elixir.Mix':Fun(Arg).
mix_project(Fun) ->
'Elixir.Mix.Project':Fun().