Ensure edocs are also built if only overview.edoc changes

This commit is contained in:
Edwin Fine 2012-08-06 14:09:49 -04:00 committed by Tuncer Ayaz
parent d90697d40e
commit ca8d7cc95d

View file

@ -54,18 +54,7 @@ doc(Config, File) ->
{ok, Config1, AppName, _AppData} = {ok, Config1, AppName, _AppData} =
rebar_app_utils:load_app_file(Config, File), rebar_app_utils:load_app_file(Config, File),
%% Determine the age of the summary file case needs_regen(EDocOpts) of
EDocInfoName = filename:join(proplists:get_value(dir, EDocOpts, "doc"),
"edoc-info"),
EDocInfoLastMod = filelib:last_modified(EDocInfoName),
%% For each source directory, look for a more recent file than
%% SumaryLastMod; in that case, we go ahead and do a full regen
NeedsRegen = newer_file_exists(proplists:get_value(source_path,
EDocOpts, ["src"]),
EDocInfoLastMod),
case NeedsRegen of
true -> true ->
?INFO("Regenerating edocs for ~p\n", [AppName]), ?INFO("Regenerating edocs for ~p\n", [AppName]),
ok = edoc:application(AppName, ".", EDocOpts); ok = edoc:application(AppName, ".", EDocOpts);
@ -90,27 +79,41 @@ setup_code_path() ->
true = code:add_patha(rebar_utils:ebin_dir()), true = code:add_patha(rebar_utils:ebin_dir()),
CodePath. CodePath.
newer_file_exists(Paths, LastMod) -> -type path_spec() :: {'file', file:filename()} | file:filename().
CheckFile = fun(Filename, _) -> -spec newer_file_exists(Paths::[path_spec()], OldFile::string()) -> boolean().
FLast = filelib:last_modified(Filename), newer_file_exists(Paths, OldFile) ->
case FLast > LastMod of OldModTime = filelib:last_modified(OldFile),
true ->
?DEBUG("~p is more recent than edoc-info: " ThrowIfNewer = fun(Fn, _Acc) ->
"~120p > ~120p\n", FModTime = filelib:last_modified(Fn),
[Filename, FLast, LastMod]), (FModTime > OldModTime) andalso
throw(newer_file_exists); throw({newer_file_exists, {Fn, FModTime}})
false ->
false
end
end, end,
try try
lists:foldl(fun(P, _) -> lists:foldl(fun({file, F}, _) ->
ThrowIfNewer(F, false);
(P, _) ->
filelib:fold_files(P, ".*.erl", true, filelib:fold_files(P, ".*.erl", true,
CheckFile, false) ThrowIfNewer, false)
end, undefined, Paths), end, undefined, Paths)
false
catch catch
throw:newer_file_exists -> throw:{newer_file_exists, {Filename, FMod}} ->
?DEBUG("~p is more recent than ~p: "
"~120p > ~120p\n",
[Filename, OldFile, FMod, OldModTime]),
true true
end. end.
%% Needs regen if any dependent file is changed since the last
%% edoc run. Dependent files are the erlang source files,
%% and the overview file, if it exists.
-spec needs_regen(edoc:proplist()) -> boolean().
needs_regen(EDocOpts) ->
DocDir = proplists:get_value(dir, EDocOpts, "doc"),
EDocInfoName = filename:join(DocDir, "edoc-info"),
OverviewFile = proplists:get_value(overview, EDocOpts, "overview.edoc"),
EDocOverviewName = filename:join(DocDir, OverviewFile),
SrcPaths = proplists:get_value(source_path, EDocOpts, ["src"]),
newer_file_exists([{file, EDocOverviewName} | SrcPaths], EDocInfoName).