diff options
author | Tristan Sloughter <t@crashfast.com> | 2014-11-28 22:32:20 -0600 |
---|---|---|
committer | Tristan Sloughter <t@crashfast.com> | 2014-11-29 08:42:06 -0600 |
commit | 14cb6803e0a0742613cd4e476c5db0e5a1b134e7 (patch) | |
tree | f1e6b831c0ac80239b9876083dafed6148f56ab9 /src/rebar_prv_install_deps.erl | |
parent | 8d655d3c502295394ab30d9fc3fd11679629885d (diff) |
wip: profiles
Diffstat (limited to 'src/rebar_prv_install_deps.erl')
-rw-r--r-- | src/rebar_prv_install_deps.erl | 82 |
1 files changed, 41 insertions, 41 deletions
diff --git a/src/rebar_prv_install_deps.erl b/src/rebar_prv_install_deps.erl index 9822b32..7fdddac 100644 --- a/src/rebar_prv_install_deps.erl +++ b/src/rebar_prv_install_deps.erl @@ -37,10 +37,6 @@ -export([handle_deps/2, handle_deps/3]). -%% for internal use only --export([get_deps_dir/1]). --export([get_deps_dir/2]). - -define(PROVIDER, install_deps). -define(DEPS, [app_discovery]). @@ -67,11 +63,12 @@ init(State) -> -spec do(rebar_state:t()) -> {ok, rebar_state:t()} | {error, string()}. do(State) -> + Profile = rebar_state:current_profile(State), ProjectApps = rebar_state:project_apps(State), try {ok, State1} = case rebar_state:get(State, locks, []) of [] -> - handle_deps(State, rebar_state:get(State, deps, [])); + handle_deps(State, rebar_state:get(State, {deps, Profile}, [])); Locks -> handle_deps(State, Locks) end, @@ -94,16 +91,6 @@ do(State) -> format_error(Reason) -> io_lib:format("~p", [Reason]). --spec get_deps_dir(rebar_state:t()) -> file:filename_all(). -get_deps_dir(State) -> - BaseDir = rebar_state:get(State, base_dir, ""), - DepsDir = rebar_state:get(State, deps_dir, ?DEFAULT_DEPS_DIR), - get_deps_dir(BaseDir, DepsDir). - --spec get_deps_dir(file:filename_all(), file:filename_all()) -> file:filename_all(). -get_deps_dir(DepsDir, App) -> - filename:join(DepsDir, App). - -spec handle_deps(rebar_state:t(), [dep()]) -> {ok, rebar_state:t()}. handle_deps(State, Deps) -> handle_deps(State, Deps, false). @@ -117,8 +104,8 @@ handle_deps(State, Deps, Update) -> {Packages, Graph} = rebar_packages:get_packages(State), %% Split source deps from pkg deps, needed to keep backwards compatibility - DepsDir = get_deps_dir(State), - {SrcDeps, PkgDeps} = parse_deps(DepsDir, Deps), + DepsDir = rebar_utils:deps_dir(State), + {SrcDeps, PkgDeps} = parse_deps(State, DepsDir, Deps), State1 = rebar_state:src_deps(rebar_state:pkg_deps(State, PkgDeps), SrcDeps), @@ -144,7 +131,7 @@ handle_deps(State, Deps, Update) -> AppInfo <- package_to_app(DepsDir ,Packages ,Pkg), - maybe_fetch(AppInfo, Update, sets:new())] + maybe_fetch(State2, AppInfo, Update, sets:new())] end, AllDeps = lists:ukeymerge(2 @@ -152,7 +139,8 @@ handle_deps(State, Deps, Update) -> ,lists:ukeysort(2, Solved)), %% Sort all apps to build order State3 = rebar_state:set(State2, all_deps, AllDeps), - {ok, State3}. + State4 = rebar_state:set(State3, {all_deps, rebar_state:current_profile(State)}, AllDeps), + {ok, State4}. %% =================================================================== %% Internal functions @@ -167,7 +155,7 @@ package_to_app(DepsDir, Packages, {Name, Vsn}) -> Link = proplists:get_value(<<"link">>, P, ""), {ok, AppInfo} = rebar_app_info:new(Name, Vsn), AppInfo1 = rebar_app_info:deps(AppInfo, PkgDeps), - AppInfo2 = rebar_app_info:dir(AppInfo1, get_deps_dir(DepsDir, Name)), + AppInfo2 = rebar_app_info:dir(AppInfo1, rebar_utils:deps_dir(DepsDir, Name)), [rebar_app_info:source(AppInfo2, {pkg, Name, Vsn, Link})] end. @@ -188,7 +176,7 @@ update_src_deps(Level, State, Update, Seen) -> ,Level ,StateAcc); _ -> - maybe_fetch(AppInfo, false, SeenAcc), + maybe_fetch(StateAcc, AppInfo, false, SeenAcc), handle_dep(AppInfo ,SrcDepsAcc ,PkgDepsAcc @@ -213,7 +201,7 @@ handle_update(AppInfo, UpdateName, UpdateLevel, SrcDeps, PkgDeps, Level, State) case UpdateLevel < DepLevel orelse Name =:= UpdateName of true -> - case maybe_fetch(AppInfo, true, []) of + case maybe_fetch(State, AppInfo, true, []) of true -> handle_dep(AppInfo ,SrcDeps @@ -229,29 +217,38 @@ handle_update(AppInfo, UpdateName, UpdateLevel, SrcDeps, PkgDeps, Level, State) end. handle_dep(AppInfo, SrcDeps, PkgDeps, Level, State) -> - DepsDir = get_deps_dir(State), + DepsDir = rebar_utils:deps_dir(State), {AppInfo1, NewSrcDeps, NewPkgDeps} = - handle_dep(DepsDir, AppInfo), + handle_dep(State, DepsDir, AppInfo), AppInfo2 = rebar_app_info:dep_level(AppInfo1, Level), {NewSrcDeps ++ SrcDeps ,NewPkgDeps++PkgDeps ,rebar_state:src_apps(State, AppInfo2)}. --spec handle_dep(file:filename_all(), rebar_app_info:t()) -> +-spec handle_dep(rebar_state:t(), file:filename_all(), rebar_app_info:t()) -> {rebar_app_info:t(), [rebar_app_info:t()], [pkg_dep()]}. -handle_dep(DepsDir, AppInfo) -> +handle_dep(State, DepsDir, AppInfo) -> + Profile = rebar_state:current_profile(State), C = rebar_config:consult(rebar_app_info:dir(AppInfo)), S = rebar_state:new(rebar_state:new(), C, rebar_app_info:dir(AppInfo)), - Deps = rebar_state:get(S, deps, []), - AppInfo1 = rebar_app_info:deps(AppInfo, rebar_state:deps_names(S)), - {SrcDeps, PkgDeps} = parse_deps(DepsDir, Deps), + S1 = rebar_state:apply_profile(S, Profile), + Deps = case Profile of + default -> + rebar_state:get(S1, {deps, Profile}, []); + _ -> + rebar_state:get(S1, {deps, default}, []) ++ + rebar_state:get(S1, {deps, Profile}, []) + end, + AppInfo1 = rebar_app_info:deps(AppInfo, rebar_state:deps_names(Deps)), + {SrcDeps, PkgDeps} = parse_deps(State, DepsDir, Deps), {AppInfo1, SrcDeps, PkgDeps}. --spec maybe_fetch(rebar_app_info:t(), boolean() | {true, binary(), integer()}, +-spec maybe_fetch(rebar_state:t(), rebar_app_info:t(), boolean() | {true, binary(), integer()}, sets:set(binary())) -> boolean(). -maybe_fetch(AppInfo, Update, Seen) -> +maybe_fetch(State, AppInfo, Update, Seen) -> AppDir = ec_cnv:to_list(rebar_app_info:dir(AppInfo)), - Apps = rebar_app_discover:find_apps(["_checkouts"], all), + DefaultProfileDeps = rebar_utils:default_profile_deps(State), + Apps = rebar_app_discover:find_apps(["_checkouts", DefaultProfileDeps], all), case rebar_app_utils:find(rebar_app_info:name(AppInfo), Apps) of {ok, _} -> %% Don't fetch dep if it exists in the _checkouts dir @@ -301,28 +298,31 @@ maybe_fetch(AppInfo, Update, Seen) -> end end. --spec parse_deps(binary(), [dep()]) -> {[rebar_app_info:t()], [pkg_dep()]}. -parse_deps(DepsDir, Deps) -> +-spec parse_deps(rebar_state:t(), binary(), [dep()]) -> {[rebar_app_info:t()], [pkg_dep()]}. +parse_deps(State, DepsDir, Deps) -> lists:foldl(fun({Name, Vsn}, {SrcDepsAcc, PkgDepsAcc}) -> {SrcDepsAcc, [parse_goal(ec_cnv:to_binary(Name) ,ec_cnv:to_binary(Vsn)) | PkgDepsAcc]}; (Name, {SrcDepsAcc, PkgDepsAcc}) when is_atom(Name) -> {SrcDepsAcc, [ec_cnv:to_binary(Name) | PkgDepsAcc]}; ({Name, Vsn, Source}, {SrcDepsAcc, PkgDepsAcc}) when is_tuple (Source) -> - Dep = new_dep(DepsDir, Name, Vsn, Source), + Dep = new_dep(State, DepsDir, Name, Vsn, Source), {[Dep | SrcDepsAcc], PkgDepsAcc}; ({Name, Vsn, Source, _Level}, {SrcDepsAcc, PkgDepsAcc}) when is_tuple (Source) -> - Dep = new_dep(DepsDir, Name, Vsn, Source), + Dep = new_dep(State, DepsDir, Name, Vsn, Source), {[Dep | SrcDepsAcc], PkgDepsAcc} end, {[], []}, Deps). -new_dep(DepsDir, Name, Vsn, Source) -> - Dir = ec_cnv:to_list(get_deps_dir(DepsDir, Name)), - {ok, Dep} = case rebar_app_info:discover(Dir) of - {ok, App} -> +new_dep(State, DepsDir, Name, Vsn, Source) -> + Dirs = [ec_cnv:to_list(filename:join(rebar_utils:default_profile_deps(State), Name)), + ec_cnv:to_list(filename:join(DepsDir, Name))], + {ok, Dep} = case ec_lists:search(fun(Dir) -> + rebar_app_info:discover(Dir) + end, Dirs) of + {ok, App, _} -> {ok, App}; not_found -> - rebar_app_info:new(Name, Vsn, Dir) + rebar_app_info:new(Name, Vsn, ec_cnv:to_list(filename:join(DepsDir, Name))) end, rebar_app_info:source(Dep, Source). |