diff options
-rwxr-xr-x | bootstrap | 51 | ||||
-rw-r--r-- | rebar.config | 48 | ||||
-rw-r--r-- | rebar.lock | 25 | ||||
-rw-r--r-- | src/rebar.app.src | 1 | ||||
-rw-r--r-- | src/rebar_prv_install_deps.erl | 35 | ||||
-rw-r--r-- | src/rebar_templater.erl | 2 |
6 files changed, 72 insertions, 90 deletions
@@ -4,6 +4,12 @@ main(_Args) -> + application:start(crypto), + application:start(asn1), + application:start(public_key), + application:start(ssl), + inets:start(), + %% Fetch and build deps required to build rebar3 BaseDeps = [{providers, []} ,{getopt, []} @@ -24,6 +30,7 @@ main(_Args) -> setup_env(), os:putenv("REBAR_PROFILE", "bootstrap"), + rebar3:run(["update"]), {ok, State} = rebar3:run(["compile"]), reset_env(), os:putenv("REBAR_PROFILE", ""), @@ -56,28 +63,33 @@ fetch_and_compile({Name, ErlFirstFiles}, Deps) -> ok = fetch(Repo, Name), compile(Name, ErlFirstFiles). -fetch({git, Url, Source}, App) -> +fetch({pkg, Name, Vsn}, App) -> Dir = filename:join([filename:absname("_build/default/lib/"), App]), - case filelib:is_dir(Dir) of - true -> - true = code:add_path(filename:join(Dir, "ebin")), - ok; - false -> - fetch_source(Dir, Url, Source), - ok + CDN = "https://s3.amazonaws.com/s3.hex.pm/tarballs", + Package = binary_to_list(<<Name/binary, "-", Vsn/binary, ".tar">>), + Url = string:join([CDN, Package], "/"), + case request(Url) of + {ok, Binary} -> + {ok, Contents} = extract(Binary), + ok = erl_tar:extract({binary, Contents}, [{cwd, Dir}, compressed]); + _ -> + io:format("Error: Unable to fetch package ~p ~p~n", [Name, Vsn]) end. -fetch_source(Dir, Url, {ref, Ref}) -> - ok = filelib:ensure_dir(Dir), - os:cmd(io_lib:format("git clone ~s ~s", [Url, Dir])), - {ok, Cwd} = file:get_cwd(), - file:set_cwd(Dir), - os:cmd(io_lib:format("git checkout -q ~s", [Ref])), - file:set_cwd(Cwd); -fetch_source(Dir, Url, {_, Branch}) -> - ok = filelib:ensure_dir(Dir), - os:cmd(io_lib:format("git clone ~s ~s -b ~s --single-branch", - [Url, Dir, Branch])). +extract(Binary) -> + {ok, Files} = erl_tar:extract({binary, Binary}, [memory]), + {"contents.tar.gz", Contents} = lists:keyfind("contents.tar.gz", 1, Files), + {ok, Contents}. + +request(Url) -> + case httpc:request(get, {Url, []}, + [{relaxed, true}], + [{body_format, binary}]) of + {ok, {{_Version, 200, _Reason}, _Headers, Body}} -> + {ok, Body}; + Error -> + Error + end. compile(App, FirstFiles) -> Dir = filename:join(filename:absname("_build/default/lib/"), App), @@ -86,6 +98,7 @@ compile(App, FirstFiles) -> FirstFilesPaths = [filename:join([Dir, "src", Module]) || Module <- FirstFiles], Sources = FirstFilesPaths ++ filelib:wildcard(filename:join([Dir, "src", "*.erl"])), [compile_file(X, [{i, filename:join(Dir, "include")} + ,debug_info ,{outdir, filename:join(Dir, "ebin")} ,return | additional_defines()]) || X <- Sources]. diff --git a/rebar.config b/rebar.config index d68f195..ab679dc 100644 --- a/rebar.config +++ b/rebar.config @@ -2,21 +2,11 @@ %% ex: ts=4 sw=4 ft=erlang et {deps, [ - {erlware_commons, "", - {git, "https://github.com/erlware/erlware_commons.git", - {branch, "master"}}}, - {providers, "", - {git, "https://github.com/tsloughter/providers.git", - {tag, "v1.4.0"}}}, - {relx, "", - {git, "https://github.com/erlware/relx.git", - {branch, "master"}}}, - {mustache, ".*", - {git, "https://github.com/soranoba/mustache.git", - {tag, "v0.3.0"}}}, - {getopt, "", - {git, "https://github.com/jcomellas/getopt.git", - {branch, "master"}}}]}. + {erlware_commons, "0.12.0"}, + {providers, "1.4.1"}, + {getopt, "0.8.2"}, + {bbmustache, "1.0.1"}, + {relx, "2.1.0"}]}. {escript_name, rebar3}. {escript_emu_args, "%%! +sbtu +A0\n"}. @@ -41,8 +31,9 @@ {erl_opts, [debug_info]} ]}, - %% We don't want erlydtl to attempt to run on the first compile pass to bootstrap - {bootstrap, []} + {bootstrap, []}, + + {dialyze, [{erl_opts, [debug_info]}]} ]}. %% Overrides @@ -51,16 +42,23 @@ {platform_define, "^R1[4|5]", deprecated_crypto}, no_debug_info, warnings_as_errors]}, - {deps, []}, {plugins, []} + {deps, []}, {plugins, []}, + {profiles, [{dialyze, [{erl_opts, [debug_info]}]}]} ]}, - {override, mustache, [ - {erl_opts, [{platform_define, "^[0-9]+", namespaced_types}, - no_debug_info]}, - {deps, []}, {plugins, []}]}, - {override, getopt, [{erl_opts, [no_debug_info]}]}, - {override, providers, [{erl_opts, [no_debug_info]}]}, + {override, bbmustache, [ + {erl_opts, [no_debug_info, + {platform_define, "^[0-9]+", namespaced_types}]}, + {deps, []}, {plugins, []}, + {profiles, [{dialyze, [{erl_opts, [debug_info]}]}]} + ]}, + {override, getopt, [{erl_opts, [no_debug_info]}, + {profiles, [{dialyze, [{erl_opts, [debug_info]}]}]}]}, + {override, providers, [{erl_opts, [no_debug_info]}, + {profiles, [{dialyze, [{erl_opts, [debug_info]}]}]}]}, {override, relx, [{erl_opts, [{platform_define, "^[0-9]+", namespaced_types}, {platform_define, "^R1[4|5]", deprecated_crypto}, no_debug_info, - warnings_as_errors]}]} + warnings_as_errors]}, + {profiles, [{dialyze, [{erl_opts, [debug_info]}]}]} + ]} ]}. @@ -1,20 +1,5 @@ -[{<<"relx">>, - {git,"https://github.com/erlware/relx.git", - {ref,"74fec3455ba6dbb7d9e369137c1b15ab10804993"}}, - 0}, - {<<"providers">>, - {git,"https://github.com/tsloughter/providers.git", - {ref,"adc0af0a3f5de2049419a753777686b94f4e2c90"}}, - 0}, - {<<"mustache">>, - {git,"https://github.com/soranoba/mustache.git", - {ref,"e5401042c66039eef20ee81abc1537ced1f22bc7"}}, - 0}, - {<<"getopt">>, - {git,"https://github.com/jcomellas/getopt.git", - {ref,"626698975e63866156159661d100785d65eab6f9"}}, - 0}, - {<<"erlware_commons">>, - {git,"https://github.com/erlware/erlware_commons.git", - {ref,"ef0d252b11c863f9c228af2fe93a4e42fba2f7f3"}}, - 0}]. +[{<<"bbmustache">>,{pkg,<<"bbmustache">>,<<"1.0.1">>},0}, + {<<"providers">>,{pkg,<<"providers">>,<<"1.4.1">>},0}, + {<<"erlware_commons">>,{pkg,<<"erlware_commons">>,<<"0.12.0">>},0}, + {<<"relx">>,{pkg,<<"relx">>,<<"2.1.0">>},0}, + {<<"getopt">>,{pkg,<<"getopt">>,<<"0.8.2">>},0}]. diff --git a/src/rebar.app.src b/src/rebar.app.src index 6d081a2..0ec0fcb 100644 --- a/src/rebar.app.src +++ b/src/rebar.app.src @@ -17,6 +17,7 @@ common_test, erlware_commons, providers, + bbmustache, relx, inets]}, {env, [ diff --git a/src/rebar_prv_install_deps.erl b/src/rebar_prv_install_deps.erl index 806293b..cfce1b7 100644 --- a/src/rebar_prv_install_deps.erl +++ b/src/rebar_prv_install_deps.erl @@ -224,28 +224,13 @@ update_pkg_deps(Profile, Pkgs, Packages, Upgrade, Seen, State, Locks) -> handle_pkg_dep(Profile, Pkg, Packages, Upgrade, DepsDir, Fetched, Seen, Locks, State) -> IsLock = pkg_locked(Pkg, Locks), AppInfo = package_to_app(DepsDir, Packages, Pkg, IsLock, State), + Deps = rebar_app_info:deps(AppInfo), Level = rebar_app_info:dep_level(AppInfo), {NewSeen, NewState} = maybe_lock(Profile, AppInfo, Seen, State, Level), {_, AppInfo1} = maybe_fetch(AppInfo, Profile, Upgrade, Seen, NewState), - - Profiles = rebar_state:current_profiles(State), - Name = rebar_app_info:name(AppInfo1), - C = rebar_config:consult(rebar_app_info:dir(AppInfo1)), - BaseDir = rebar_state:get(State, base_dir, []), - S1 = rebar_state:new(rebar_state:set(rebar_state:new(), base_dir, BaseDir), - C, rebar_app_info:dir(AppInfo1)), - S2 = rebar_state:apply_overrides(S1, Name), - - Plugins = rebar_state:get(S2, plugins, []), - S3 = rebar_state:set(S2, {plugins, Profile}, Plugins), - - S4 = rebar_state:apply_profiles(S3, Profiles), - AppInfo2 = rebar_app_info:state(AppInfo1, S4), - - %% Dep may have plugins to install. Find and install here. - S5 = rebar_plugins:install(S4), - AppInfo3 = rebar_app_info:state(AppInfo2, S5), - + {AppInfo2, _, _, _, _} = + handle_dep(NewState, Profile, DepsDir, AppInfo1, Locks, Level), + AppInfo3 = rebar_app_info:deps(AppInfo2, Deps), {[AppInfo3 | Fetched], NewSeen, NewState}. maybe_lock(Profile, AppInfo, Seen, State, Level) -> @@ -284,12 +269,12 @@ package_to_app(DepsDir, Packages, {Name, Vsn, Level}, IsLock, State) -> throw(?PRV_ERROR({missing_package, Name, Vsn})) end; {ok, PkgDeps} -> - {ok, AppInfo} = rebar_app_info:new(Name, Vsn), - AppInfo1 = rebar_app_info:deps(AppInfo, PkgDeps), - AppInfo2 = rebar_app_info:dir(AppInfo1, filename:join([DepsDir, Name])), - AppInfo3 = rebar_app_info:dep_level(AppInfo2, Level), - AppInfo4 = rebar_app_info:is_lock(AppInfo3, IsLock), - rebar_app_info:source(AppInfo4, {pkg, Name, Vsn}) + Source = {pkg, Name, Vsn}, + AppInfo = new_dep(DepsDir, Name, Vsn, Source, IsLock, State), + AppInfo1 = rebar_app_info:dep_level(rebar_app_info:deps(AppInfo, PkgDeps), Level), + BaseDir = rebar_state:get(State, base_dir, []), + AppState1 = rebar_state:set(rebar_app_info:state(AppInfo1), base_dir, BaseDir), + rebar_app_info:state(AppInfo1, AppState1) end. -spec update_src_deps(atom(), non_neg_integer(), list(), list(), list(), rebar_state:t(), boolean(), sets:set(binary()), list()) -> {rebar_state:t(), list(), list(), sets:set(binary())}. diff --git a/src/rebar_templater.erl b/src/rebar_templater.erl index 353fa36..3aa6e90 100644 --- a/src/rebar_templater.erl +++ b/src/rebar_templater.erl @@ -380,4 +380,4 @@ write_file(Output, Data, Force) -> %% Render a binary to a string, using mustache and the specified context %% render(Bin, Context) -> - mustache:render(ec_cnv:to_binary(Bin), Context, [{key_type, atom}]). + bbmustache:render(ec_cnv:to_binary(Bin), Context, [{key_type, atom}]). |