diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/rebar_packages.erl | 13 | ||||
-rw-r--r-- | src/rebar_prv_common_test.erl | 42 | ||||
-rw-r--r-- | src/rebar_prv_install_deps.erl | 13 |
3 files changed, 55 insertions, 13 deletions
diff --git a/src/rebar_packages.erl b/src/rebar_packages.erl index fb2d094..4ab5f9f 100644 --- a/src/rebar_packages.erl +++ b/src/rebar_packages.erl @@ -2,6 +2,7 @@ -export([get_packages/1 ,registry/1 + ,check_registry/3 ,find_highest_matching/3]). -export_type([package/0]). @@ -52,6 +53,18 @@ registry(State) -> error end. +check_registry(Pkg, Vsn, State) -> + case rebar_state:registry(State) of + {ok, T} -> + case ets:lookup(T, Pkg) of + [{Pkg, [Vsns]}] -> + lists:member(Vsn, Vsns); + _ -> + false + end; + error -> + false + end. %% Hex supports use of ~> to specify the version required for a dependency. %% Since rebar3 requires exact versions to choose from we find the highest diff --git a/src/rebar_prv_common_test.erl b/src/rebar_prv_common_test.erl index 9038759..d4370de 100644 --- a/src/rebar_prv_common_test.erl +++ b/src/rebar_prv_common_test.erl @@ -280,23 +280,25 @@ find_suite_dirs(Suites) -> %% eliminate duplicates lists:usort(AllDirs). -copy(State, Target) -> - case reduce_path(Target) == rebar_state:dir(State) of +copy(State, Dir) -> + From = reduce_path(Dir), + case From == rebar_state:dir(State) of true -> throw({error, suite_at_project_root}); false -> ok end, - case retarget_path(State, Target) of + case retarget_path(State, From) of %% directory lies outside of our project's file structure so %% don't copy it - Target -> Target; - NewTarget -> - %% unlink the directory if it's a symlink - case ec_file:is_symlink(NewTarget) of - true -> ok = ec_file:remove(NewTarget); + From -> From; + Target -> + %% recursively delete any symlinks in the target directory + %% if it exists so we don't smash files in the linked dirs + case ec_file:is_dir(Target) of + true -> remove_links(Target); false -> ok end, - ok = ec_file:copy(Target, NewTarget, [recursive]), - NewTarget + ok = ec_file:copy(From, Target, [recursive]), + Target end. compile_dir(State, Dir, OutDir) -> @@ -343,6 +345,26 @@ reduce_path([_|Acc], [".."|Rest]) -> reduce_path(Acc, Rest); reduce_path([], [".."|Rest]) -> reduce_path([], Rest); reduce_path(Acc, [Component|Rest]) -> reduce_path([Component|Acc], Rest). +remove_links(Path) -> + case ec_file:is_dir(Path) of + false -> ok; + true -> remove_links1(Path) + end. + +remove_links1(Path) -> + case ec_file:is_symlink(Path) of + true -> + file:delete(Path); + false -> + lists:foreach(fun(ChildPath) -> + remove_links(ChildPath) + end, sub_dirs(Path)) + end. + +sub_dirs(Path) -> + {ok, SubDirs} = file:list_dir(Path), + [filename:join(Path, SubDir) || SubDir <- SubDirs]. + replace_src_dirs(State, Dirs) -> %% replace any `src_dirs` with the test dirs ErlOpts = rebar_state:get(State, erl_opts, []), diff --git a/src/rebar_prv_install_deps.erl b/src/rebar_prv_install_deps.erl index 5aa34c3..3fb2d71 100644 --- a/src/rebar_prv_install_deps.erl +++ b/src/rebar_prv_install_deps.erl @@ -99,6 +99,8 @@ format_error({bad_constraint, Name, Constraint}) -> io_lib:format("Unable to parse version for package ~s: ~s", [Name, Constraint]); format_error({parse_dep, Dep}) -> io_lib:format("Failed parsing dep ~p", [Dep]); +format_error({not_rebar_package, Package, Version}) -> + io_lib:format("Package not buildable with rebar3: ~s-~s", [Package, Version]); format_error({missing_package, Package, Version}) -> io_lib:format("Package not found in registry: ~s-~s", [Package, Version]); format_error({cycles, Cycles}) -> @@ -210,7 +212,7 @@ update_pkg_deps(Profile, Pkgs, Packages, Upgrade, Seen, State) -> {Solved, State1}. 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, State), Level = rebar_app_info:dep_level(AppInfo), {NewSeen, NewState} = maybe_lock(Profile, AppInfo, Seen, State, Level), {_, AppInfo1} = maybe_fetch(AppInfo, Profile, Upgrade, Seen, NewState), @@ -242,10 +244,15 @@ maybe_lock(Profile, AppInfo, Seen, State, Level) -> {Seen, State} end. -package_to_app(DepsDir, Packages, {Name, Vsn, Level}) -> +package_to_app(DepsDir, Packages, {Name, Vsn, Level}, State) -> case dict:find({Name, Vsn}, Packages) of error -> - throw(?PRV_ERROR({missing_package, Name, Vsn})); + case rebar_packages:check_registry(Name, Vsn, State) of + true -> + throw(?PRV_ERROR({not_rebar_package, Name, Vsn})); + false -> + throw(?PRV_ERROR({missing_package, Name, Vsn})) + end; {ok, P} -> PkgDeps = [{PkgName, PkgVsn} || {PkgName,PkgVsn} <- proplists:get_value(<<"deps">>, P, [])], |