|
|
@ -52,40 +52,41 @@ preprocess(Config, _) -> |
|
|
|
%% Side effect to set deps_dir globally for all dependencies from |
|
|
|
%% top level down. Means the root deps_dir is honoured or the default |
|
|
|
%% used globally since it will be set on the first time through here |
|
|
|
set_global_deps_dir(Config, rebar_config:get_global(deps_dir, [])), |
|
|
|
DepsDir = rebar_config:get_global(Config, deps_dir, []), |
|
|
|
Config1 = set_global_deps_dir(Config, DepsDir), |
|
|
|
|
|
|
|
%% Get the list of deps for the current working directory and identify those |
|
|
|
%% deps that are available/present. |
|
|
|
Deps = rebar_config:get_local(Config, deps, []), |
|
|
|
{Config1, {AvailableDeps, MissingDeps}} = find_deps(Config, find, Deps), |
|
|
|
Deps = rebar_config:get_local(Config1, deps, []), |
|
|
|
{Config2, {AvailableDeps, MissingDeps}} = find_deps(Config1, find, Deps), |
|
|
|
|
|
|
|
?DEBUG("Available deps: ~p\n", [AvailableDeps]), |
|
|
|
?DEBUG("Missing deps : ~p\n", [MissingDeps]), |
|
|
|
|
|
|
|
%% Add available deps to code path |
|
|
|
Config2 = update_deps_code_path(Config1, AvailableDeps), |
|
|
|
Config3 = update_deps_code_path(Config2, AvailableDeps), |
|
|
|
|
|
|
|
%% If skip_deps=true, mark each dep dir as a skip_dir w/ the core so that |
|
|
|
%% the current command doesn't run on the dep dir. However, pre/postprocess |
|
|
|
%% WILL run (and we want it to) for transitivity purposes. |
|
|
|
NewConfig = case rebar_config:get_global(skip_deps, false) of |
|
|
|
NewConfig = case rebar_config:get_global(Config3, skip_deps, false) of |
|
|
|
"true" -> |
|
|
|
lists:foldl( |
|
|
|
fun(#dep{dir = Dir}, C) -> |
|
|
|
rebar_config:set_skip_dir(C, Dir) |
|
|
|
end, Config2, AvailableDeps); |
|
|
|
end, Config3, AvailableDeps); |
|
|
|
_ -> |
|
|
|
Config2 |
|
|
|
Config3 |
|
|
|
end, |
|
|
|
|
|
|
|
%% Return all the available dep directories for process |
|
|
|
{ok, NewConfig, dep_dirs(AvailableDeps)}. |
|
|
|
|
|
|
|
postprocess(Config, _) -> |
|
|
|
case rebar_config:get_xconf(Config, ?MODULE) of |
|
|
|
error -> |
|
|
|
case rebar_config:get_xconf(Config, ?MODULE, undefined) of |
|
|
|
undefined -> |
|
|
|
{ok, []}; |
|
|
|
{ok, Dirs} -> |
|
|
|
Dirs -> |
|
|
|
NewConfig = rebar_config:erase_xconf(Config, ?MODULE), |
|
|
|
{ok, NewConfig, Dirs} |
|
|
|
end. |
|
|
@ -94,8 +95,8 @@ compile(Config, AppFile) -> |
|
|
|
'check-deps'(Config, AppFile). |
|
|
|
|
|
|
|
%% set REBAR_DEPS_DIR and ERL_LIBS environment variables |
|
|
|
setup_env(_Config) -> |
|
|
|
{true, DepsDir} = get_deps_dir(), |
|
|
|
setup_env(Config) -> |
|
|
|
{true, DepsDir} = get_deps_dir(Config), |
|
|
|
%% include rebar's DepsDir in ERL_LIBS |
|
|
|
Separator = case os:type() of |
|
|
|
{win32, nt} -> |
|
|
@ -149,7 +150,8 @@ setup_env(_Config) -> |
|
|
|
{Config1, Deps} = find_deps(Config, read, RawDeps), |
|
|
|
|
|
|
|
%% Update each dep |
|
|
|
UpdatedDeps = [update_source(D) || D <- Deps, D#dep.source =/= undefined], |
|
|
|
UpdatedDeps = [update_source(Config1, D) |
|
|
|
|| D <- Deps, D#dep.source =/= undefined], |
|
|
|
|
|
|
|
%% Add each updated dep to our list of dirs for post-processing. This yields |
|
|
|
%% the necessary transitivity of the deps |
|
|
@ -157,7 +159,7 @@ setup_env(_Config) -> |
|
|
|
|
|
|
|
'delete-deps'(Config, _) -> |
|
|
|
%% Delete all the available deps in our deps/ directory, if any |
|
|
|
{true, DepsDir} = get_deps_dir(), |
|
|
|
{true, DepsDir} = get_deps_dir(Config), |
|
|
|
Deps = rebar_config:get_local(Config, deps, []), |
|
|
|
{Config1, {AvailableDeps, _}} = find_deps(Config, find, Deps), |
|
|
|
_ = [delete_dep(D) |
|
|
@ -183,17 +185,17 @@ setup_env(_Config) -> |
|
|
|
%% need all deps in same dir and should be the one set by the root rebar.config |
|
|
|
%% Sets a default if root config has no deps_dir set |
|
|
|
set_global_deps_dir(Config, []) -> |
|
|
|
rebar_config:set_global(deps_dir, |
|
|
|
rebar_config:set_global(Config, deps_dir, |
|
|
|
rebar_config:get_local(Config, deps_dir, "deps")); |
|
|
|
set_global_deps_dir(_Config, _DepsDir) -> |
|
|
|
ok. |
|
|
|
set_global_deps_dir(Config, _DepsDir) -> |
|
|
|
Config. |
|
|
|
|
|
|
|
get_deps_dir() -> |
|
|
|
get_deps_dir(""). |
|
|
|
get_deps_dir(Config) -> |
|
|
|
get_deps_dir(Config, ""). |
|
|
|
|
|
|
|
get_deps_dir(App) -> |
|
|
|
BaseDir = rebar_config:get_global(base_dir, []), |
|
|
|
DepsDir = rebar_config:get_global(deps_dir, "deps"), |
|
|
|
get_deps_dir(Config, App) -> |
|
|
|
BaseDir = rebar_config:get_xconf(Config, base_dir, []), |
|
|
|
DepsDir = rebar_config:get_global(Config, deps_dir, "deps"), |
|
|
|
{true, filename:join([BaseDir, DepsDir, App])}. |
|
|
|
|
|
|
|
dep_dirs(Deps) -> |
|
|
@ -262,7 +264,7 @@ find_dep(Config, Dep) -> |
|
|
|
find_dep(Config, Dep, undefined) -> |
|
|
|
%% 'source' is undefined. If Dep is not satisfied locally, |
|
|
|
%% go ahead and find it amongst the lib_dir's. |
|
|
|
case find_dep_in_dir(Config, Dep, get_deps_dir(Dep#dep.app)) of |
|
|
|
case find_dep_in_dir(Config, Dep, get_deps_dir(Config, Dep#dep.app)) of |
|
|
|
{_Config1, {avail, _Dir}} = Avail -> |
|
|
|
Avail; |
|
|
|
{Config1, {missing, _}} -> |
|
|
@ -272,7 +274,7 @@ find_dep(Config, Dep, _Source) -> |
|
|
|
%% _Source is defined. Regardless of what it is, we must find it |
|
|
|
%% locally satisfied or fetch it from the original source |
|
|
|
%% into the project's deps |
|
|
|
find_dep_in_dir(Config, Dep, get_deps_dir(Dep#dep.app)). |
|
|
|
find_dep_in_dir(Config, Dep, get_deps_dir(Config, Dep#dep.app)). |
|
|
|
|
|
|
|
find_dep_in_dir(Config, _Dep, {false, Dir}) -> |
|
|
|
{Config, {missing, Dir}}; |
|
|
@ -365,7 +367,7 @@ use_source(Config, Dep, Count) -> |
|
|
|
false -> |
|
|
|
?CONSOLE("Pulling ~p from ~p\n", [Dep#dep.app, Dep#dep.source]), |
|
|
|
require_source_engine(Dep#dep.source), |
|
|
|
{true, TargetDir} = get_deps_dir(Dep#dep.app), |
|
|
|
{true, TargetDir} = get_deps_dir(Config, Dep#dep.app), |
|
|
|
download_source(TargetDir, Dep#dep.source), |
|
|
|
use_source(Config, Dep#dep { dir = TargetDir }, Count-1) |
|
|
|
end. |
|
|
@ -408,17 +410,17 @@ download_source(AppDir, {rsync, Url}) -> |
|
|
|
ok = filelib:ensure_dir(AppDir), |
|
|
|
rebar_utils:sh(?FMT("rsync -az --delete ~s/ ~s", [Url, AppDir]), []). |
|
|
|
|
|
|
|
update_source(Dep) -> |
|
|
|
update_source(Config, Dep) -> |
|
|
|
%% It's possible when updating a source, that a given dep does not have a |
|
|
|
%% VCS directory, such as when a source archive is built of a project, with |
|
|
|
%% all deps already downloaded/included. So, verify that the necessary VCS |
|
|
|
%% directory exists before attempting to do the update. |
|
|
|
{true, AppDir} = get_deps_dir(Dep#dep.app), |
|
|
|
{true, AppDir} = get_deps_dir(Config, Dep#dep.app), |
|
|
|
case has_vcs_dir(element(1, Dep#dep.source), AppDir) of |
|
|
|
true -> |
|
|
|
?CONSOLE("Updating ~p from ~p\n", [Dep#dep.app, Dep#dep.source]), |
|
|
|
require_source_engine(Dep#dep.source), |
|
|
|
update_source(AppDir, Dep#dep.source), |
|
|
|
update_source1(AppDir, Dep#dep.source), |
|
|
|
Dep; |
|
|
|
false -> |
|
|
|
?WARN("Skipping update for ~p: " |
|
|
@ -426,29 +428,29 @@ update_source(Dep) -> |
|
|
|
Dep |
|
|
|
end. |
|
|
|
|
|
|
|
update_source(AppDir, {git, Url}) -> |
|
|
|
update_source(AppDir, {git, Url, {branch, "HEAD"}}); |
|
|
|
update_source(AppDir, {git, Url, ""}) -> |
|
|
|
update_source(AppDir, {git, Url, {branch, "HEAD"}}); |
|
|
|
update_source(AppDir, {git, _Url, {branch, Branch}}) -> |
|
|
|
update_source1(AppDir, {git, Url}) -> |
|
|
|
update_source1(AppDir, {git, Url, {branch, "HEAD"}}); |
|
|
|
update_source1(AppDir, {git, Url, ""}) -> |
|
|
|
update_source1(AppDir, {git, Url, {branch, "HEAD"}}); |
|
|
|
update_source1(AppDir, {git, _Url, {branch, Branch}}) -> |
|
|
|
ShOpts = [{cd, AppDir}], |
|
|
|
rebar_utils:sh("git fetch origin", ShOpts), |
|
|
|
rebar_utils:sh(?FMT("git checkout -q origin/~s", [Branch]), ShOpts); |
|
|
|
update_source(AppDir, {git, _Url, {tag, Tag}}) -> |
|
|
|
update_source1(AppDir, {git, _Url, {tag, Tag}}) -> |
|
|
|
ShOpts = [{cd, AppDir}], |
|
|
|
rebar_utils:sh("git fetch --tags origin", ShOpts), |
|
|
|
rebar_utils:sh(?FMT("git checkout -q ~s", [Tag]), ShOpts); |
|
|
|
update_source(AppDir, {git, _Url, Refspec}) -> |
|
|
|
update_source1(AppDir, {git, _Url, Refspec}) -> |
|
|
|
ShOpts = [{cd, AppDir}], |
|
|
|
rebar_utils:sh("git fetch origin", ShOpts), |
|
|
|
rebar_utils:sh(?FMT("git checkout -q ~s", [Refspec]), ShOpts); |
|
|
|
update_source(AppDir, {svn, _Url, Rev}) -> |
|
|
|
update_source1(AppDir, {svn, _Url, Rev}) -> |
|
|
|
rebar_utils:sh(?FMT("svn up -r ~s", [Rev]), [{cd, AppDir}]); |
|
|
|
update_source(AppDir, {hg, _Url, Rev}) -> |
|
|
|
update_source1(AppDir, {hg, _Url, Rev}) -> |
|
|
|
rebar_utils:sh(?FMT("hg pull -u -r ~s", [Rev]), [{cd, AppDir}]); |
|
|
|
update_source(AppDir, {bzr, _Url, Rev}) -> |
|
|
|
update_source1(AppDir, {bzr, _Url, Rev}) -> |
|
|
|
rebar_utils:sh(?FMT("bzr update -r ~s", [Rev]), [{cd, AppDir}]); |
|
|
|
update_source(AppDir, {rsync, Url}) -> |
|
|
|
update_source1(AppDir, {rsync, Url}) -> |
|
|
|
rebar_utils:sh(?FMT("rsync -az --delete ~s/ ~s",[Url,AppDir]),[]). |
|
|
|
|
|
|
|
%% =================================================================== |
|
|
|