diff --git a/include/api.hrl b/include/api.hrl index 84a3934..75fe299 100644 --- a/include/api.hrl +++ b/include/api.hrl @@ -1,6 +1,6 @@ -define(MAD,[compile/1,app/1,get/1,release/1,resolve/1,clean/1, start/1,attach/1,stop/1,sh/1,deps/1,up/1,fetch/1, - static/1,eunit/1,strip/1]). + static/1,eunit/1,strip/1,ez/1]). -type return() :: [] | true | false | {ok,any()} | {error,any()}. @@ -20,3 +20,4 @@ -spec static(list(string())) -> return(). -spec eunit(list(string())) -> return(). -spec strip(list(string())) -> return(). +-spec ez(list(string())) -> return(). diff --git a/include/mad.hrl b/include/mad.hrl index bb36dd9..9aaae6d 100644 --- a/include/mad.hrl +++ b/include/mad.hrl @@ -1 +1 @@ --define(VERSION,"a14d11"). +-define(VERSION,"ce47d7"). diff --git a/src/mad.erl b/src/mad.erl index 54ee27f..d628a3f 100644 --- a/src/mad.erl +++ b/src/mad.erl @@ -45,6 +45,7 @@ atomize("sh") -> 'sh'; atomize("rep"++_) -> 'sh'; atomize("pla"++_) -> 'resolve'; atomize("str"++_) -> 'strip'; +atomize("ez") -> 'ez'; atomize(Else) -> Else. profile() -> application:get_env(mad,profile,mad_local). @@ -69,7 +70,7 @@ help() -> info("MAD Manage Dependencies ~s~n",[?VERSION]), info("~n"), info(" invoke = mad | mad list~n"), info(" list = [] | command [options] list ~n"), - info(" command = app [web|mqtt] | deps | clean | compile | strip~n"), + info(" command = app [web|mqtt] | deps | clean | compile | strip | ez~n"), info(" | bundle [beam|script] | get | up [name] ~n"), info(" | start | stop | attach | repl | static ~n"), return(false). diff --git a/src/mad_local.erl b/src/mad_local.erl index 00912d7..a942b11 100644 --- a/src/mad_local.erl +++ b/src/mad_local.erl @@ -18,3 +18,4 @@ up(Params) -> mad_git:up(Params). fetch(Params) -> mad_git:fetch(Params). eunit(Params) -> mad_eunit:main_test(Params). sh(Params) -> mad_repl:sh(Params). +ez(Params) -> mad_ez:main(Params). \ No newline at end of file diff --git a/src/package/mad_ez.erl b/src/package/mad_ez.erl new file mode 100644 index 0000000..682d53b --- /dev/null +++ b/src/package/mad_ez.erl @@ -0,0 +1,52 @@ +-module(mad_ez). +-description("EZ bundle"). +-compile(export_all). +%cd path/to/app; mad ez +main(_) -> + Base = filename:basename(mad_utils:cwd()), + [AppFile] = mad_repl:wildcards(["ebin/*.app"]), + Vsn = vsn(AppFile), + {Name,App} = case lists:suffix("-" ++ Vsn,Base) of + true -> {Base,Base -- ["-"++Vsn]}; + false -> {Base++"-"++Vsn,Base} + end, + Rename = fun(F)-> + Path = filename:join([Name, "ebin", filename:basename(F)]), + mad:info("Ez ~s~n",[Path]), + Path + end, + Files = static() ++ beams(Rename,fun read/1), + {ok,_}= zip:create(Name ++ ".ez", Files, opts()), + {ok,App}. + +opts() -> [{compress,all},{uncompress,[".beam",".app",".so"]}]. +read(F)-> {ok, B} = file:read_file(filename:absname(F)), B. +vsn(F) -> case file:consult( F ) of + { ok, [{application,_,Terms}|_]} -> + proplists:get_value(vsn, Terms, []); + _ -> [] + end. +id(X) -> X. + +static() -> + Name = "static.gz", + {ok,{_,Bin}} = zip:create(Name, + [ begin + mad:info("static: ~ts~n",[F]), + { binary_to_list(base64:encode(unicode:characters_to_binary(F))), element(2,file:read_file(F)) } + end + || F <- mad_repl:wildcards(["priv/**"]), not filelib:is_dir(F) ], + [{compress,all},memory]), + [ { Name, Bin } ]. + +beams() -> beams(fun id/1, fun read/1). +beams(Fun,Read) -> + [ { Fun(F), Read(F) } || + F <- mad_repl:wildcards(["ebin/*","sys.config",".applist"]) ]. + +privs() -> privs(fun id/1, fun read/1). +privs(Fun,Read) -> + [ { Fun(F), Read(F) } || + F <- mad_repl:wildcards(["priv/**"]), not filelib:is_dir(p(F)) ]. + +p(F) -> mad:info("~p~n",[F]),F.