|
@ -97,6 +97,8 @@ do(State) -> |
|
|
end. |
|
|
end. |
|
|
|
|
|
|
|
|
-spec format_error(any()) -> iolist(). |
|
|
-spec format_error(any()) -> iolist(). |
|
|
|
|
|
format_error({load_registry_fail, Dep}) -> |
|
|
|
|
|
io_lib:format("Error loading registry to resolve version of ~s. Try fixing by running 'rebar3 update'", [Dep]); |
|
|
format_error({bad_constraint, Name, Constraint}) -> |
|
|
format_error({bad_constraint, Name, Constraint}) -> |
|
|
io_lib:format("Unable to parse version for package ~s: ~s", [Name, Constraint]); |
|
|
io_lib:format("Unable to parse version for package ~s: ~s", [Name, Constraint]); |
|
|
format_error({parse_dep, Dep}) -> |
|
|
format_error({parse_dep, Dep}) -> |
|
@ -129,9 +131,10 @@ handle_deps(Profile, State, Deps, Locks) when is_list(Locks) -> |
|
|
-> {ok, [rebar_app_info:t()], rebar_state:t()} | {error, string()}. |
|
|
-> {ok, [rebar_app_info:t()], rebar_state:t()} | {error, string()}. |
|
|
handle_deps(_Profile, State, [], _, _) -> |
|
|
handle_deps(_Profile, State, [], _, _) -> |
|
|
{ok, [], State}; |
|
|
{ok, [], State}; |
|
|
handle_deps(Profile, State, Deps, Upgrade, Locks) -> |
|
|
|
|
|
|
|
|
handle_deps(Profile, State0, Deps, Upgrade, Locks) -> |
|
|
%% Read in package index and dep graph |
|
|
%% Read in package index and dep graph |
|
|
{Packages, Graph} = rebar_packages:get_packages(State), |
|
|
|
|
|
|
|
|
{Packages, Graph} = rebar_state:packages(State0), |
|
|
|
|
|
State = rebar_state:packages(State0, {Packages, Graph}), |
|
|
%% Split source deps from pkg deps, needed to keep backwards compatibility |
|
|
%% Split source deps from pkg deps, needed to keep backwards compatibility |
|
|
DepsDir = rebar_dir:deps_dir(State), |
|
|
DepsDir = rebar_dir:deps_dir(State), |
|
|
{SrcDeps, PkgDeps} = parse_deps(DepsDir, Deps, State, Locks, 0), |
|
|
{SrcDeps, PkgDeps} = parse_deps(DepsDir, Deps, State, Locks, 0), |
|
@ -210,8 +213,8 @@ handle_pkg_dep(Profile, Pkg, Packages, Upgrade, DepsDir, Fetched, Seen, State) - |
|
|
AppInfo = package_to_app(DepsDir, Packages, Pkg), |
|
|
AppInfo = package_to_app(DepsDir, Packages, Pkg), |
|
|
Level = rebar_app_info:dep_level(AppInfo), |
|
|
Level = rebar_app_info:dep_level(AppInfo), |
|
|
{NewSeen, NewState} = maybe_lock(Profile, AppInfo, Seen, State, Level), |
|
|
{NewSeen, NewState} = maybe_lock(Profile, AppInfo, Seen, State, Level), |
|
|
maybe_fetch(AppInfo, Upgrade, Seen, NewState), |
|
|
|
|
|
{[AppInfo | Fetched], NewSeen, NewState}. |
|
|
|
|
|
|
|
|
{_, AppInfo1} = maybe_fetch(AppInfo, Upgrade, Seen, NewState), |
|
|
|
|
|
{[AppInfo1 | Fetched], NewSeen, NewState}. |
|
|
|
|
|
|
|
|
maybe_lock(Profile, AppInfo, Seen, State, Level) -> |
|
|
maybe_lock(Profile, AppInfo, Seen, State, Level) -> |
|
|
case rebar_app_info:is_checkout(AppInfo) of |
|
|
case rebar_app_info:is_checkout(AppInfo) of |
|
@ -312,8 +315,8 @@ update_unseen_src_dep(AppInfo, Profile, Level, SrcDeps, PkgDeps, SrcApps, State, |
|
|
handle_upgrade(AppInfo, SrcDeps, PkgDeps, SrcApps, |
|
|
handle_upgrade(AppInfo, SrcDeps, PkgDeps, SrcApps, |
|
|
Level, State1, Locks); |
|
|
Level, State1, Locks); |
|
|
_ -> |
|
|
_ -> |
|
|
maybe_fetch(AppInfo, false, Seen, State1), |
|
|
|
|
|
handle_dep(AppInfo, SrcDeps, PkgDeps, SrcApps, |
|
|
|
|
|
|
|
|
{_, AppInfo1} = maybe_fetch(AppInfo, false, Seen, State1), |
|
|
|
|
|
handle_dep(AppInfo1, SrcDeps, PkgDeps, SrcApps, |
|
|
Level, State1, Locks) |
|
|
Level, State1, Locks) |
|
|
end, |
|
|
end, |
|
|
{NewSrcDeps, NewPkgDeps, NewSrcApps, State2, NewSeen, NewLocks}. |
|
|
{NewSrcDeps, NewPkgDeps, NewSrcApps, State2, NewSeen, NewLocks}. |
|
@ -323,12 +326,12 @@ handle_upgrade(AppInfo, SrcDeps, PkgDeps, SrcApps, Level, State, Locks) -> |
|
|
case lists:keyfind(Name, 1, Locks) of |
|
|
case lists:keyfind(Name, 1, Locks) of |
|
|
false -> |
|
|
false -> |
|
|
case maybe_fetch(AppInfo, true, sets:new(), State) of |
|
|
case maybe_fetch(AppInfo, true, sets:new(), State) of |
|
|
true -> |
|
|
|
|
|
handle_dep(AppInfo, SrcDeps, PkgDeps, SrcApps, |
|
|
|
|
|
|
|
|
{true, AppInfo1} -> |
|
|
|
|
|
handle_dep(AppInfo1, SrcDeps, PkgDeps, SrcApps, |
|
|
Level, State, Locks); |
|
|
Level, State, Locks); |
|
|
|
|
|
|
|
|
false -> |
|
|
|
|
|
{[AppInfo|SrcDeps], PkgDeps, SrcApps, State, Locks} |
|
|
|
|
|
|
|
|
{false, AppInfo1} -> |
|
|
|
|
|
{[AppInfo1|SrcDeps], PkgDeps, SrcApps, State, Locks} |
|
|
end; |
|
|
end; |
|
|
_StillLocked -> |
|
|
_StillLocked -> |
|
|
{[AppInfo|SrcDeps], PkgDeps, SrcApps, State, Locks} |
|
|
{[AppInfo|SrcDeps], PkgDeps, SrcApps, State, Locks} |
|
@ -371,31 +374,37 @@ handle_dep(State, DepsDir, AppInfo, Locks, Level) -> |
|
|
{AppInfo2, SrcDeps, PkgDeps, Locks++NewLocks, State1}. |
|
|
{AppInfo2, SrcDeps, PkgDeps, Locks++NewLocks, State1}. |
|
|
|
|
|
|
|
|
-spec maybe_fetch(rebar_app_info:t(), boolean() | {true, binary(), integer()}, |
|
|
-spec maybe_fetch(rebar_app_info:t(), boolean() | {true, binary(), integer()}, |
|
|
sets:set(binary()), rebar_state:t()) -> boolean(). |
|
|
|
|
|
|
|
|
sets:set(binary()), rebar_state:t()) -> {boolean(), rebar_app_info:t()}. |
|
|
maybe_fetch(AppInfo, Upgrade, Seen, State) -> |
|
|
maybe_fetch(AppInfo, Upgrade, Seen, State) -> |
|
|
AppDir = ec_cnv:to_list(rebar_app_info:dir(AppInfo)), |
|
|
AppDir = ec_cnv:to_list(rebar_app_info:dir(AppInfo)), |
|
|
%% Don't fetch dep if it exists in the _checkouts dir |
|
|
%% Don't fetch dep if it exists in the _checkouts dir |
|
|
case rebar_app_info:is_checkout(AppInfo) of |
|
|
case rebar_app_info:is_checkout(AppInfo) of |
|
|
true -> |
|
|
true -> |
|
|
false; |
|
|
|
|
|
|
|
|
{false, AppInfo}; |
|
|
false -> |
|
|
false -> |
|
|
case rebar_app_discover:find_app(AppDir, all) of |
|
|
case rebar_app_discover:find_app(AppDir, all) of |
|
|
false -> |
|
|
false -> |
|
|
case in_default(AppInfo, State) of |
|
|
case in_default(AppInfo, State) of |
|
|
false -> |
|
|
false -> |
|
|
fetch_app(AppInfo, AppDir, State); |
|
|
|
|
|
|
|
|
{fetch_app(AppInfo, AppDir, State), AppInfo}; |
|
|
{true, FoundApp} -> |
|
|
{true, FoundApp} -> |
|
|
|
|
|
%% Preserve the state we created with overrides |
|
|
|
|
|
AppState = rebar_app_info:state(AppInfo), |
|
|
|
|
|
FoundApp = rebar_app_info:state(FoundApp, AppState), |
|
|
?INFO("Linking ~s to ~s", [rebar_app_info:dir(FoundApp), AppDir]), |
|
|
?INFO("Linking ~s to ~s", [rebar_app_info:dir(FoundApp), AppDir]), |
|
|
filelib:ensure_dir(AppDir), |
|
|
filelib:ensure_dir(AppDir), |
|
|
rebar_file_utils:symlink_or_copy(rebar_app_info:dir(FoundApp), AppDir), |
|
|
rebar_file_utils:symlink_or_copy(rebar_app_info:dir(FoundApp), AppDir), |
|
|
true |
|
|
|
|
|
|
|
|
{true, AppInfo} |
|
|
end; |
|
|
end; |
|
|
{true, _} -> |
|
|
|
|
|
|
|
|
{true, AppInfo1} -> |
|
|
|
|
|
%% Preserve the state we created with overrides |
|
|
|
|
|
AppState = rebar_app_info:state(AppInfo), |
|
|
|
|
|
AppInfo2 = rebar_app_info:state(AppInfo1, AppState), |
|
|
case sets:is_element(rebar_app_info:name(AppInfo), Seen) of |
|
|
case sets:is_element(rebar_app_info:name(AppInfo), Seen) of |
|
|
true -> |
|
|
true -> |
|
|
false; |
|
|
|
|
|
|
|
|
{false, AppInfo2}; |
|
|
false -> |
|
|
false -> |
|
|
maybe_upgrade(AppInfo, AppDir, Upgrade, State) |
|
|
|
|
|
|
|
|
{maybe_upgrade(AppInfo, AppDir, Upgrade, State), AppInfo2} |
|
|
end |
|
|
end |
|
|
end |
|
|
end |
|
|
end. |
|
|
end. |
|
@ -439,13 +448,14 @@ parse_dep({Name, Vsn}, {SrcDepsAcc, PkgDepsAcc}, DepsDir, State) when is_list(Vs |
|
|
,ec_cnv:to_binary(Vsn)) | PkgDepsAcc]} |
|
|
,ec_cnv:to_binary(Vsn)) | PkgDepsAcc]} |
|
|
end; |
|
|
end; |
|
|
parse_dep(Name, {SrcDepsAcc, PkgDepsAcc}, DepsDir, State) when is_atom(Name) -> |
|
|
parse_dep(Name, {SrcDepsAcc, PkgDepsAcc}, DepsDir, State) when is_atom(Name) -> |
|
|
|
|
|
{PkgName, PkgVsn} = get_package(ec_cnv:to_binary(Name), State), |
|
|
CheckoutsDir = ec_cnv:to_list(rebar_dir:checkouts_dir(State, Name)), |
|
|
CheckoutsDir = ec_cnv:to_list(rebar_dir:checkouts_dir(State, Name)), |
|
|
case rebar_app_info:discover(CheckoutsDir) of |
|
|
case rebar_app_info:discover(CheckoutsDir) of |
|
|
{ok, _App} -> |
|
|
{ok, _App} -> |
|
|
Dep = new_dep(DepsDir, Name, [], [], State), |
|
|
Dep = new_dep(DepsDir, Name, [], [], State), |
|
|
{[Dep | SrcDepsAcc], PkgDepsAcc}; |
|
|
{[Dep | SrcDepsAcc], PkgDepsAcc}; |
|
|
not_found -> |
|
|
not_found -> |
|
|
{SrcDepsAcc, [ec_cnv:to_binary(Name) | PkgDepsAcc]} |
|
|
|
|
|
|
|
|
{SrcDepsAcc, [{PkgName, PkgVsn} | PkgDepsAcc]} |
|
|
end; |
|
|
end; |
|
|
parse_dep({Name, Source}, {SrcDepsAcc, PkgDepsAcc}, DepsDir, State) when is_tuple(Source) -> |
|
|
parse_dep({Name, Source}, {SrcDepsAcc, PkgDepsAcc}, DepsDir, State) when is_tuple(Source) -> |
|
|
Dep = new_dep(DepsDir, Name, [], Source, State), |
|
|
Dep = new_dep(DepsDir, Name, [], Source, State), |
|
@ -561,3 +571,12 @@ warn_skip_pkg({Name, Source}, State) -> |
|
|
not_needs_compile(App) -> |
|
|
not_needs_compile(App) -> |
|
|
not(rebar_app_info:is_checkout(App)) |
|
|
not(rebar_app_info:is_checkout(App)) |
|
|
andalso rebar_app_info:valid(App). |
|
|
andalso rebar_app_info:valid(App). |
|
|
|
|
|
|
|
|
|
|
|
get_package(Dep, State) -> |
|
|
|
|
|
case rebar_packages:registry(State) of |
|
|
|
|
|
{ok, T} -> |
|
|
|
|
|
HighestDepVsn = rebar_packages:find_highest_matching(Dep, "0", T), |
|
|
|
|
|
{Dep, HighestDepVsn}; |
|
|
|
|
|
error -> |
|
|
|
|
|
throw(?PRV_ERROR({load_registry_fail, Dep})) |
|
|
|
|
|
end. |