diff options
Diffstat (limited to 'src/rebar_prv_install_deps.erl')
-rw-r--r-- | src/rebar_prv_install_deps.erl | 63 |
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) -> |