diff options
author | Kevin Smith <kevin@hypotheticalabs.com> | 2010-01-05 10:41:15 -0500 |
---|---|---|
committer | Kevin Smith <kevin@hypotheticalabs.com> | 2010-01-05 10:41:15 -0500 |
commit | c9d175a30d6e63d7b1c3db4a0ed0b7d3d7b706be (patch) | |
tree | 7e9692227f840211dabd7e039f69f1a8ae892e1e | |
parent | bfcb54cbc90712091ed886077e52bba2e43f42eb (diff) | |
parent | 93111bfcf784bc8b17dd70220a19f95ce51f88f4 (diff) |
Merging
-rw-r--r-- | src/rebar_erlc_compiler.erl | 26 | ||||
-rw-r--r-- | src/rebar_erlydtl_compiler.erl | 95 |
2 files changed, 68 insertions, 53 deletions
diff --git a/src/rebar_erlc_compiler.erl b/src/rebar_erlc_compiler.erl index 575e7dc..933d2df 100644 --- a/src/rebar_erlc_compiler.erl +++ b/src/rebar_erlc_compiler.erl @@ -52,16 +52,11 @@ clean(_Config, _AppFile) -> %% Erlang compilation is recursive, so it's possible that we have a nested %% directory structure in ebin with .beam files within. As such, we want %% to scan whatever is left in the ebin/ directory for sub-dirs which - %% satisfy our criteria. TODO: Is there a better way to do this? - Dirs = ordsets:from_list([base_dir(F) || - F <- rebar_utils:find_files("ebin", "^.*\\.beam\$")]), - case Dirs of - [] -> - ok; - _ -> - ok = rebar_file_utils:rm_rf(string:join(Dirs, " ")) - end. - + %% satisfy our criteria. + BeamFiles = rebar_utils:find_files("ebin", "^.*\\.beam$"), + rebar_file_utils:delete_each(BeamFiles), + lists:foreach(fun(Dir) -> delete_dir(Dir, dirs(Dir)) end, dirs("ebin")), + ok. %% =================================================================== @@ -164,6 +159,11 @@ compile_mib(Source, _Target, Config) -> ?FAIL end. -base_dir(Filename) -> - ["ebin" | Rest] = filename:split(Filename), - filename:join("ebin", hd(Rest)). +dirs(Dir) -> + [F || F <- filelib:wildcard(filename:join([Dir, "*"])), filelib:is_dir(F)]. + +delete_dir(Dir, []) -> + file:del_dir(Dir); +delete_dir(Dir, Subdirs) -> + lists:foreach(fun(D) -> delete_dir(D, dirs(D)) end, Subdirs), + file:del_dir(Dir). diff --git a/src/rebar_erlydtl_compiler.erl b/src/rebar_erlydtl_compiler.erl index 9a40f67..d635854 100644 --- a/src/rebar_erlydtl_compiler.erl +++ b/src/rebar_erlydtl_compiler.erl @@ -103,7 +103,58 @@ default(out_dir) -> "ebin"; default(source_ext) -> ".dtl"; default(module_ext) -> "_dtl". -referenced_dtls(Source, _Target, Config) -> +compile_dtl(Source, Target, Config) -> + case code:which(erlydtl) of + non_existing -> + ?CONSOLE( + "~n===============================================~n" + " You need to install erlydtl to comple DTL templates~n" + " Download the latest tarball release from github~n" + " http://code.google.com/p/erlydtl/~n" + " and install it into your erlang library dir~n" + "===============================================~n~n", []), + ?FAIL; + _ -> + case needs_compile(Source, Target, Config) of + true -> + do_compile(Source, Target, Config); + false -> + skipped + end + end. + +do_compile(Source, Target, Config) -> + %% TODO: Check last mod on target and referenced DTLs here.. + DtlOpts = erlydtl_opts(Config), + %% ensure that doc_root and out_dir are defined, + %% using defaults if necessary + Opts = [{out_dir, option(out_dir, DtlOpts)}, + {doc_root, option(doc_root, DtlOpts)}, + report, return], + case erlydtl:compile(Source, + module_name(Target), + Opts++DtlOpts) of + ok -> ok; + Reason -> + ?CONSOLE("Compiling template ~s failed:~n ~p~n", + [Source, Reason]), + ?FAIL + end. + +module_name(Target) -> + F = filename:basename(Target), + string:substr(F, 1, length(F)-length(".beam")). + +needs_compile(Source, Target, Config) -> + LM = filelib:last_modified(Target), + case LM < filelib:last_modified(Source) of + true -> true; + false -> + lists:any(fun(D) -> LM < filelib:last_modified(D) end, + referenced_dtls(Source, Config)) + end. + +referenced_dtls(Source, Config) -> Set = referenced_dtls1([Source], Config, sets:add_element(Source, sets:new())), Final = sets:to_list(sets:del_element(Source, Set)), @@ -111,7 +162,7 @@ referenced_dtls(Source, _Target, Config) -> referenced_dtls1(Step, Config, Seen) -> DtlOpts = erlydtl_opts(Config), - ExtMatch = re:replace(option(source_ext, DtlOpts), "\.", "\\\\.", + ExtMatch = re:replace(option(source_ext, DtlOpts), "\.", "\\\\\\\\.", [{return, list}]), AllRefs = lists:append( [ string:tokens( @@ -124,43 +175,7 @@ referenced_dtls1(Step, Config, Seen) -> New = sets:subtract(sets:from_list(Existing), Seen), case sets:size(New) of 0 -> Seen; - _ -> referenced_dtls(sets:to_list(New), Config, - sets:union(New, Seen)) - end. - -compile_dtl(Source, Target, Config) -> - case code:which(erlydtl) of - non_existing -> - ?CONSOLE( - "~n===============================================~n" - " You need to install erlydtl to comple DTL templates~n" - " Download the latest tarball release from github~n" - " http://code.google.com/p/erlydtl/~n" - " and install it into your erlang library dir~n" - "===============================================~n~n", []), - ?FAIL; - _ -> - %% TODO: Check last mod on target and referenced DTLs here.. - DtlOpts = erlydtl_opts(Config), - %% ensure that doc_root and out_dir are defined, - %% using defaults if necessary - Opts = [{out_dir, option(out_dir, DtlOpts)}, - {doc_root, option(doc_root, DtlOpts)}, - report, return], - case erlydtl:compile(Source, - module_name(Source,DtlOpts), - Opts++DtlOpts) of - ok -> ok; - Reason -> - ?CONSOLE("Compiling template ~s failed:~n ~p~n", - [Source, Reason]), - ?FAIL - end + _ -> referenced_dtls1(sets:to_list(New), Config, + sets:union(New, Seen)) end. -module_name(DtlPath, DtlOpts) -> - F = filename:basename(DtlPath), - SourceExt = option(source_ext, DtlOpts), - ModuleExt = option(module_ext, DtlOpts), - list_to_atom(lists:sublist(F, length(F)-length(SourceExt)) - ++ModuleExt). |