summaryrefslogtreecommitdiff
path: root/src/rebar_prv_install_deps.erl
diff options
context:
space:
mode:
Diffstat (limited to 'src/rebar_prv_install_deps.erl')
-rw-r--r--src/rebar_prv_install_deps.erl63
1 files changed, 36 insertions, 27 deletions
diff --git a/src/rebar_prv_install_deps.erl b/src/rebar_prv_install_deps.erl
index 3b78fd1..03dfce4 100644
--- a/src/rebar_prv_install_deps.erl
+++ b/src/rebar_prv_install_deps.erl
@@ -69,13 +69,13 @@ do(State) ->
ProjectApps = rebar_state:project_apps(State),
{ok, State1} = case rebar_state:get(State, locks, []) of
[] ->
- handle_deps(State, ordsets:from_list(rebar_state:get(State, deps, [])));
+ handle_deps(State, rebar_state:get(State, deps, []));
Locks ->
- handle_deps(State, ordsets:from_list(Locks))
+ handle_deps(State, Locks)
end,
- Source = ProjectApps ++ ordsets:to_list(rebar_state:src_deps(State1)),
- {ok, Sort} = rebar_topo:sort_apps(ordsets:to_list(Source)),
+ Source = ProjectApps ++ rebar_state:src_deps(State1),
+ {ok, Sort} = rebar_topo:sort_apps(Source),
{ok, rebar_state:set(State1, deps_to_build, lists:dropwhile(fun is_valid/1, Sort -- ProjectApps))}.
-spec get_deps_dir(rebar_state:t()) -> file:filename_all().
@@ -106,7 +106,7 @@ handle_deps(State, Deps, Update) ->
SrcDeps),
%% Fetch transitive src deps
- State2 = update_src_deps(State1, Update),
+ State2 = update_src_deps(0, State1, Update),
Solved = case rebar_state:binary_deps(State2) of
[] -> %% No binary deps
[];
@@ -124,9 +124,10 @@ handle_deps(State, Deps, Update) ->
end, S)
end,
- AllDeps = ordsets:union([ordsets:to_list(rebar_state:src_deps(State2))
- ,ordsets:from_list(Solved)]),
-
+ AllDeps = lists:keymerge(2
+ ,rebar_state:src_apps(State2)
+ ,Solved),
+ io:format("All ~p~n", [AllDeps]),
%% Sort all apps to build order
State3 = rebar_state:set(State2, all_deps, AllDeps),
{ok, State3}.
@@ -154,21 +155,28 @@ package_to_app(DepsDir, Packages, Name, Vsn) ->
rebar_app_info:dir(AppInfo1, get_deps_dir(DepsDir, <<Name/binary, "-", FmtVsn/binary>>)),
rebar_app_info:source(AppInfo2, Link).
--spec update_src_deps(rebar_state:t(), boolean()) -> rebat_state:t().
-update_src_deps(State, Update) ->
+-spec update_src_deps(integer(), rebar_state:t(), boolean()) -> rebat_state:t().
+update_src_deps(Level, State, Update) ->
SrcDeps = rebar_state:src_deps(State),
DepsDir = get_deps_dir(State),
- case lists:foldl(fun(AppInfo, {SrcDepsAcc, BinaryDepsAcc}) ->
- ok = maybe_fetch(AppInfo, Update),
- {AppInfo1, NewSrcDeps, NewBinaryDeps} = handle_dep(DepsDir, AppInfo),
- {ordsets:union(ordsets:add_element(AppInfo1, SrcDepsAcc), NewSrcDeps)
- ,NewBinaryDeps++BinaryDepsAcc}
- end, {ordsets:new(), rebar_state:binary_deps(State)}, SrcDeps) of
- {NewSrcDeps, NewBinaryDeps} when length(SrcDeps) =:= length(NewSrcDeps) ->
- rebar_state:src_deps(rebar_state:binary_deps(State, NewBinaryDeps), NewSrcDeps);
- {NewSrcDeps, NewBinaryDeps} ->
- State1 = rebar_state:src_deps(rebar_state:binary_deps(State, NewBinaryDeps), NewSrcDeps),
- update_src_deps(State1, Update)
+ case lists:foldl(fun(AppInfo, {SrcDepsAcc, BinaryDepsAcc, StateAcc}) ->
+ case maybe_fetch(AppInfo, Update) of
+ true ->
+ {AppInfo1, NewSrcDeps, NewBinaryDeps} =
+ handle_dep(DepsDir, AppInfo),
+ AppInfo2 = rebar_app_info:dep_level(AppInfo1, Level),
+ {NewSrcDeps ++ SrcDepsAcc
+ ,NewBinaryDeps++BinaryDepsAcc
+ ,rebar_state:src_apps(StateAcc, AppInfo2)};
+ false ->
+ {SrcDepsAcc, BinaryDepsAcc, State}
+ end
+ end, {[], rebar_state:binary_deps(State), State}, SrcDeps) of
+ {NewSrcDeps, NewBinaryDeps, State1} when length(SrcDeps) =:= length(NewSrcDeps) ->
+ rebar_state:src_deps(rebar_state:binary_deps(State1, NewBinaryDeps), NewSrcDeps);
+ {NewSrcDeps, NewBinaryDeps, State1} ->
+ State2 = rebar_state:src_deps(rebar_state:binary_deps(State1, NewBinaryDeps), NewSrcDeps),
+ update_src_deps(Level+1, State2, Update)
end.
-spec handle_dep(binary(), rebar_state:t()) -> {[rebar_app_info:t()], [binary_dep()]}.
@@ -180,7 +188,7 @@ handle_dep(DepsDir, AppInfo) ->
{SrcDeps, BinaryDeps} = parse_deps(DepsDir, Deps),
{AppInfo1, SrcDeps, BinaryDeps}.
--spec maybe_fetch(rebar_app_info:t(), boolean()) -> ok.
+-spec maybe_fetch(rebar_app_info:t(), boolean()) -> boolean().
maybe_fetch(AppInfo, Update) ->
AppDir = ec_cnv:to_list(rebar_app_info:dir(AppInfo)),
%Apps = rebar_app_discover:find_apps([get_deps_dir(State)], all),
@@ -201,12 +209,13 @@ maybe_fetch(AppInfo, Update) ->
true ->
?INFO("Fetching ~s~n", [rebar_app_info:name(AppInfo)]),
Source = rebar_app_info:source(AppInfo),
- rebar_fetch:download_source(AppDir, Source);
+ rebar_fetch:download_source(AppDir, Source),
+ true;
_ ->
- ok
+ false
end.
--spec parse_deps(binary(), [dep()]) -> {ordsets:ordset(rebar_app_info:t()), [binary_dep()]}.
+-spec parse_deps(binary(), [dep()]) -> {[rebar_app_info:t()], [binary_dep()]}.
parse_deps(DepsDir, Deps) ->
lists:foldl(fun({Name, Vsn}, {SrcDepsAcc, BinaryDepsAcc}) ->
{SrcDepsAcc, [parse_goal(ec_cnv:to_binary(Name)
@@ -222,8 +231,8 @@ parse_deps(DepsDir, Deps) ->
rebar_app_info:new(Name, Vsn, Dir)
end,
Dep1 = rebar_app_info:source(Dep, Source),
- {ordsets:add_element(Dep1, SrcDepsAcc), BinaryDepsAcc}
- end, {ordsets:new(), []}, Deps).
+ {[Dep1 | SrcDepsAcc], BinaryDepsAcc}
+ end, {[], []}, Deps).
-spec parse_goal(binary(), binary()) -> binary_dep().
parse_goal(Name, Constraint) ->