mad_release.erl 2.6 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364
  1. -module(mad_release).
  2. -compile(export_all).
  3. release(["beam",N]) -> mad_systools:beam_release(N);
  4. release(["script",N]) -> mad_escript:main(N);
  5. release(["beam"]) -> release(["beam", "sample"]);
  6. release(["script"]) -> release(["script","sample"]);
  7. release([]) -> release(["script"]);
  8. release([X]) -> release(["script",X]).
  9. strip(_) ->
  10. beam_lib:strip_files(
  11. mad_repl:wildcards(["{apps,deps,lib}/*/ebin/*.beam","ebin/*.beam"])),
  12. {ok,[]}.
  13. % TOP SORT
  14. rm_dups([]) -> [];
  15. rm_dups([H|T]) -> case lists:member(H, T) of true -> rm_dups(T); false -> [H|rm_dups(T)] end.
  16. sort(Pairs) -> iterate(Pairs, [], lhs(Pairs) ++ rhs(Pairs)).
  17. lhs(L) -> [X || {X, _, _} <- L].
  18. rhs(L) -> [Y || {_, Y, _} <- L].
  19. rm_pairs(L1, L2) -> [All || All = {X, _Y, _} <- L2, not lists:member(X, L1)].
  20. subtract(L1, L2) -> [X || X <- L1, not lists:member(X, L2)].
  21. iterate([], L, All) -> {ok,rm_dups(L ++ subtract(All, L))};
  22. iterate(P, L, All) -> case subtract(lhs(P), rhs(P)) of [] -> P;
  23. Lhs -> iterate(rm_pairs(Lhs, P), L ++ Lhs, All) end.
  24. appdir(A) -> filename:join(lists:reverse(tl(tl(lists:reverse(filename:split(A)))))).
  25. triples() ->
  26. lists:flatten([ case
  27. file:consult(F) of
  28. {ok,[{application,Name,Opt}]} ->
  29. Apps1 = proplists:get_value(included_applications,Opt,[]),
  30. Apps2 = proplists:get_value(applications,Opt,[]),
  31. Apps = lists:usort(Apps1++Apps2),
  32. Vsn = proplists:get_value(vsn,Opt,[]),
  33. [ case lists:member(A,mad_repl:system()) of
  34. false -> {A,Name,{Vsn,appdir(filename:absname(F))}};
  35. true -> [{A,Name,{Vsn,appdir(filename:absname(F))}}]++ system_deps(A) end || A <- Apps ];
  36. {error,_} ->
  37. mad:info("AppName: ~p~n",[F]), skip
  38. end || F <- mad_repl:wildcards(["{apps,deps}/*/ebin/*.app","ebin/*.app"]), not filelib:is_dir(F) ]).
  39. orderapps() ->
  40. Apps = triples(),
  41. case sort(lists:flatten(Apps)) of
  42. {ok,Sorted} -> {ok,Sorted};
  43. _Return -> {error,"Cycling apps."} end.
  44. system_deps(A) ->
  45. F = code:where_is_file(lists:concat([A,".app"])),
  46. case file:consult(F) of
  47. {ok,[{application,Name,Opt}]} ->
  48. Vsn = proplists:get_value(vsn,Opt,[]),
  49. [ {_A,Name,{Vsn,appdir(F)}} || _A <- proplists:get_value(applications,Opt,[]) ];
  50. {error,_} -> [] end.
  51. resolve(_) ->
  52. case orderapps() of
  53. {ok,Ordered} -> file:write_file(".applist",io_lib:format("~w",[Ordered])),
  54. {ok,Ordered};
  55. {error,Reason} -> {error,Reason} end.