summaryrefslogtreecommitdiff
path: root/src/rebar_utils.erl
diff options
context:
space:
mode:
Diffstat (limited to 'src/rebar_utils.erl')
-rw-r--r--src/rebar_utils.erl29
1 files changed, 28 insertions, 1 deletions
diff --git a/src/rebar_utils.erl b/src/rebar_utils.erl
index bfe7bce..4bf089e 100644
--- a/src/rebar_utils.erl
+++ b/src/rebar_utils.erl
@@ -36,7 +36,8 @@
now_str/0,
ensure_dir/1,
beam_to_mod/2, beams/1,
- abort/2]).
+ abort/2,
+ escript_foldl/3]).
-include("rebar.hrl").
@@ -111,6 +112,14 @@ abort(String, Args) ->
?ERROR(String, Args),
halt(1).
+escript_foldl(Fun, Acc, File) ->
+ case erlang:function_exported(zip, foldl, 3) of
+ true ->
+ emulate_escript_foldl(Fun, Acc, File);
+ false ->
+ escript:foldl(Fun, Acc, File)
+ end.
+
%% ====================================================================
%% Internal functions
%% ====================================================================
@@ -144,3 +153,21 @@ beams(Dir) ->
filelib:fold_files(Dir, ".*\.beam\$", true,
fun(F, Acc) -> [F | Acc] end, []).
+emulate_escript_foldl(Fun, Acc, File) ->
+ case escript:extract(File, [compile_source]) of
+ {ok, [_Shebang, _Comment, _EmuArgs, Body]} ->
+ case Body of
+ {source, BeamCode} ->
+ GetInfo = fun() -> file:read_file_info(File) end,
+ GetBin = fun() -> BeamCode end,
+ {ok, Fun(".", GetInfo, GetBin, Acc)};
+ {beam, BeamCode} ->
+ GetInfo = fun() -> file:read_file_info(File) end,
+ GetBin = fun() -> BeamCode end,
+ {ok, Fun(".", GetInfo, GetBin, Acc)};
+ {archive, ArchiveBin} ->
+ zip:foldl(Fun, Acc, {File, ArchiveBin})
+ end;
+ {error, Reason} ->
+ {error, Reason}
+ end.