Browse Source

Rebuild PLT when beams no longer exist

pull/900/head
James Fish 9 years ago
parent
commit
d48f02dbc4
2 changed files with 48 additions and 7 deletions
  1. +16
    -5
      src/rebar_prv_dialyzer.erl
  2. +32
    -2
      test/rebar_dialyzer_SUITE.erl

+ 16
- 5
src/rebar_prv_dialyzer.erl View File

@ -173,7 +173,7 @@ do_update_proj_plt(State, Plt, Output) ->
case read_plt(State, Plt) of
{ok, OldFiles} ->
check_plt(State, Plt, Output, OldFiles, Files);
{error, no_such_file} ->
error ->
build_proj_plt(State, Plt, Output, Files)
end.
@ -252,14 +252,25 @@ read_plt(_State, Plt) ->
case dialyzer:plt_info(Plt) of
{ok, Info} ->
Files = proplists:get_value(files, Info, []),
{ok, Files};
{error, no_such_file} = Error ->
Error;
read_plt_files(Plt, Files);
{error, no_such_file} ->
error;
{error, read_error} ->
Error = io_lib:format("Could not read the PLT file ~p", [Plt]),
throw({dialyzer_error, Error})
end.
%% If any file no longer exists dialyzer will fail when updating the PLT.
read_plt_files(Plt, Files) ->
case [File || File <- Files, not filelib:is_file(File)] of
[] ->
{ok, Files};
Missing ->
?INFO("Could not find ~p files in ~p...", [length(Missing), Plt]),
?DEBUG("Could not find files: ~p", [Missing]),
error
end.
check_plt(State, Plt, Output, OldList, FilesList) ->
Old = sets:from_list(OldList),
Files = sets:from_list(FilesList),
@ -337,7 +348,7 @@ update_base_plt(State, BasePlt, Output, BaseFiles) ->
case read_plt(State, BasePlt) of
{ok, OldBaseFiles} ->
check_plt(State, BasePlt, Output, OldBaseFiles, BaseFiles);
{error, no_such_file} ->
error ->
_ = filelib:ensure_dir(BasePlt),
build_plt(State, BasePlt, Output, BaseFiles)
end.

+ 32
- 2
test/rebar_dialyzer_SUITE.erl View File

@ -69,7 +69,16 @@ update_base_plt(Config) ->
?assertEqual(ErtsFiles, BasePltFiles2),
{ok, PltFiles} = plt_files(Plt),
?assertEqual(ErtsFiles, PltFiles).
?assertEqual(ErtsFiles, PltFiles),
add_missing_file(BasePlt),
ok = file:delete(Plt),
rebar_test_utils:run_and_check(Config, RebarConfig, ["dialyzer"],
{ok, [{app, Name}]}),
{ok, BasePltFiles3} = plt_files(BasePlt),
?assertEqual(ErtsFiles, BasePltFiles3).
update_app_plt(Config) ->
@ -103,7 +112,15 @@ update_app_plt(Config) ->
{ok, [{app, Name}]}),
{ok, PltFiles3} = plt_files(Plt),
?assertEqual(ErtsFiles, PltFiles3).
?assertEqual(ErtsFiles, PltFiles3),
add_missing_file(Plt),
rebar_test_utils:run_and_check(Config, RebarConfig, ["dialyzer"],
{ok, [{app, Name}]}),
{ok, PltFiles4} = plt_files(Plt),
?assertEqual(ErtsFiles, PltFiles4).
build_release_plt(Config) ->
AppDir = ?config(apps, Config),
@ -211,6 +228,19 @@ alter_plt(Plt) ->
{files, [code:which(dialyzer)]}]),
ok.
add_missing_file(Plt) ->
Source = code:which(dialyzer),
Dest = filename:join(filename:dirname(Plt), "dialyzer.beam"),
{ok, _} = file:copy(Source, Dest),
_ = try
dialyzer:run([{analysis_type, plt_add},
{init_plt, Plt},
{files, [Dest]}])
after
ok = file:delete(Dest)
end,
ok.
-spec merge_config(Config, Config) -> Config when
Config :: [{term(), term()}].
merge_config(NewConfig, OldConfig) ->

Loading…
Cancel
Save