瀏覽代碼

wip: updating handling of src deps to include level in lock

pull/3/head
Tristan Sloughter 10 年之前
父節點
當前提交
c8772ff398
共有 4 個檔案被更改,包括 59 行新增30 行删除
  1. +9
    -0
      src/rebar_app_info.erl
  2. +36
    -27
      src/rebar_prv_install_deps.erl
  3. +2
    -1
      src/rebar_prv_lock.erl
  4. +12
    -2
      src/rebar_state.erl

+ 9
- 0
src/rebar_app_info.erl 查看文件

@ -21,6 +21,8 @@
ebin_dir/1,
deps/1,
deps/2,
dep_level/1,
dep_level/2,
dir/1,
dir/2,
source/1,
@ -37,6 +39,7 @@
original_vsn :: string(),
app_details=[] :: list(),
deps=[] :: list(),
dep_level :: integer(),
dir :: file:name(),
source :: string() | undefined,
valid :: boolean()}).
@ -166,6 +169,12 @@ deps(#app_info_t{deps=Deps}) ->
deps(AppInfo=#app_info_t{}, Deps) ->
AppInfo#app_info_t{deps=Deps}.
dep_level(AppInfo=#app_info_t{}, Level) ->
AppInfo#app_info_t{dep_level=Level}.
dep_level(AppInfo=#app_info_t{dep_level=Level}) ->
Level.
-spec dir(t()) -> file:name().
dir(#app_info_t{dir=Dir}) ->
Dir.

+ 36
- 27
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) ->

+ 2
- 1
src/rebar_prv_lock.erl 查看文件

@ -40,7 +40,8 @@ do(State) ->
Source when is_tuple(Source) ->
{rebar_app_info:name(Dep)
,rebar_app_info:original_vsn(Dep)
,rebar_fetch:lock_source(Dir, Source)};
,rebar_fetch:lock_source(Dir, Source)
,rebar_app_info:dep_level(Dep)};
_Source ->
{rebar_app_info:name(Dep)
,rebar_app_info:original_vsn(Dep)}

+ 12
- 2
src/rebar_state.erl 查看文件

@ -13,6 +13,7 @@
deps_names/1,
binary_deps/1, binary_deps/2,
src_deps/1, src_deps/2,
src_apps/1, src_apps/2,
prepend_hook/3, append_hook/3, hooks/2,
providers/1, providers/2, add_provider/2]).
@ -35,9 +36,10 @@
envs = new_env() :: rebar_dict(),
command_args = [] :: list(),
src_deps = ordsets:new() :: ordsets:ordset(rebar_app_info:t()),
src_deps = [] :: [rebar_app_info:t()],
src_apps = [] :: dict:dict(),
binary_deps = [],
project_apps = ordsets:new() :: ordsets:ordset(rebar_app_info:t()),
project_apps = [] :: [rebar_app_info:t()],
providers = [],
hooks = [],
@ -139,6 +141,14 @@ src_deps(State=#state_t{src_deps=SrcDeps}, NewSrcDeps) when is_list(SrcDeps) ->
src_deps(State=#state_t{src_deps=SrcDeps}, SrcDep) ->
State#state_t{src_deps=[SrcDep | SrcDeps]}.
src_apps(#state_t{src_apps=SrcApps}) ->
SrcApps.
src_apps(State=#state_t{src_apps=SrcApps}, NewSrcApps) when is_list(NewSrcApps) ->
State#state_t{src_apps=NewSrcApps};
src_apps(State=#state_t{src_apps=SrcApps}, NewSrcApp) ->
State#state_t{src_apps=[NewSrcApp | SrcApps]}.
project_apps(#state_t{project_apps=Apps}) ->
Apps.

Loading…
取消
儲存