diff options
author | Dave Smith <dizzyd@dizzyd.com> | 2012-06-07 05:29:48 -0700 |
---|---|---|
committer | Dave Smith <dizzyd@dizzyd.com> | 2012-06-07 05:29:48 -0700 |
commit | b723e81cbbfe3150fde368fc81c25041320f3173 (patch) | |
tree | aa11c0b98fb8610a15747836c699e9f20626c736 | |
parent | 9d6f7d480a9d8c0e5df1ae42874ecd7b21a74690 (diff) | |
parent | 2f0e545ce0c3c6021953dc2d1a0dc2646ee119ee (diff) |
Merge pull request #242 from basho/dss-smarter-edoc
Only regenerate edocs if a source file is newer than
-rw-r--r-- | src/rebar_edoc.erl | 47 |
1 files changed, 45 insertions, 2 deletions
diff --git a/src/rebar_edoc.erl b/src/rebar_edoc.erl index 27e0015..a8f91e9 100644 --- a/src/rebar_edoc.erl +++ b/src/rebar_edoc.erl @@ -50,9 +50,30 @@ doc(Config, File) -> %% Save code path CodePath = setup_code_path(), - {ok, AppName, _AppData} = rebar_app_utils:load_app_file(File), + + %% Get the edoc_opts and app file info EDocOpts = rebar_config:get(Config, edoc_opts, []), - ok = edoc:application(AppName, ".", EDocOpts), + {ok, AppName, _AppData} = rebar_app_utils:load_app_file(File), + + %% Determine the age of the summary file + 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 -> + ?INFO("Regenerating edocs for ~p\n", [AppName]), + ok = edoc:application(AppName, ".", EDocOpts); + false -> + ?INFO("Skipping regeneration of edocs for ~p\n", [AppName]), + ok + end, + %% Restore code path true = code:set_path(CodePath), ok. @@ -71,3 +92,25 @@ setup_code_path() -> ebin_dir() -> filename:join(rebar_utils:get_cwd(), "ebin"). + +newer_file_exists(Paths, LastMod) -> + CheckFile = fun(Filename, _) -> + FLast = filelib:last_modified(Filename), + case FLast > LastMod of + true -> + ?DEBUG("~p is more recent than edoc-info: ~120p > ~120p\n", + [Filename, FLast, LastMod]), + throw(newer_file_exists); + false -> + false + end + end, + try + lists:foldl(fun(P, _) -> filelib:fold_files(P, ".*.erl", true, CheckFile, false) end, + undefined, Paths), + false + catch + throw:newer_file_exists -> + true + end. + |