diff options
| -rw-r--r-- | src/rebar_app_utils.erl | 38 | ||||
| -rw-r--r-- | test/rebar_pkg_SUITE.erl | 25 | 
2 files changed, 36 insertions, 27 deletions
| diff --git a/src/rebar_app_utils.erl b/src/rebar_app_utils.erl index 602fd42..ae1ea1c 100644 --- a/src/rebar_app_utils.erl +++ b/src/rebar_app_utils.erl @@ -118,14 +118,14 @@ parse_dep(Dep, Parent, DepsDir, State, Locks, Level) ->      end.  parse_dep(Parent, {Name, Vsn, {pkg, PkgName}}, DepsDir, IsLock, State) -> -    {PkgName1, PkgVsn} = parse_goal(ec_cnv:to_binary(PkgName), ec_cnv:to_binary(Vsn)), +    {PkgName1, PkgVsn} = {ec_cnv:to_binary(PkgName), ec_cnv:to_binary(Vsn)},      dep_to_app(Parent, DepsDir, Name, PkgVsn, {pkg, PkgName1, PkgVsn}, IsLock, State);  parse_dep(Parent, {Name, {pkg, PkgName}}, DepsDir, IsLock, State) ->      %% Package dependency with different package name from app name      dep_to_app(Parent, DepsDir, Name, undefined, {pkg, ec_cnv:to_binary(PkgName), undefined}, IsLock, State);  parse_dep(Parent, {Name, Vsn}, DepsDir, IsLock, State) when is_list(Vsn); is_binary(Vsn) ->      %% Versioned Package dependency -    {PkgName, PkgVsn} = parse_goal(ec_cnv:to_binary(Name), ec_cnv:to_binary(Vsn)), +    {PkgName, PkgVsn} = {ec_cnv:to_binary(Name), ec_cnv:to_binary(Vsn)},      dep_to_app(Parent, DepsDir, PkgName, PkgVsn, {pkg, PkgName, PkgVsn}, IsLock, State);  parse_dep(Parent, Name, DepsDir, IsLock, State) when is_atom(Name); is_binary(Name) ->      %% Unversioned package dependency @@ -168,21 +168,22 @@ dep_to_app(Parent, DepsDir, Name, Vsn, Source, IsLock, State) ->      AppInfo3 = rebar_app_info:apply_overrides(rebar_app_info:get(AppInfo2, overrides, []), AppInfo2),      rebar_app_info:is_lock(AppInfo3, IsLock). -update_source(AppInfo, {pkg, PkgName, undefined}, State) -> -    {PkgName1, PkgVsn1} = get_package(PkgName, State), +update_source(AppInfo, {pkg, PkgName, PkgVsn}, State) -> +    {PkgName1, PkgVsn1} = case PkgVsn of +                              undefined -> +                                  get_package(PkgName, "0", State); +                              <<"~>", Vsn/binary>> -> +                                  [Vsn1] = binary:split(Vsn, [<<" ">>], [trim_all, global]), +                                  get_package(PkgName, Vsn1, State); +                              _ -> +                                  {PkgName, PkgVsn} +                          end,      AppInfo1 = rebar_app_info:source(AppInfo, {pkg, PkgName1, PkgVsn1}),      Deps = rebar_packages:deps(PkgName1                                ,PkgVsn1                                ,State),      AppInfo2 = rebar_app_info:resource_type(rebar_app_info:deps(AppInfo1, Deps), pkg),      rebar_app_info:original_vsn(AppInfo2, PkgVsn1); -update_source(AppInfo, {pkg, PkgName, PkgVsn}, State) -> -    AppInfo1 = rebar_app_info:source(AppInfo, {pkg, PkgName, PkgVsn}), -    Deps = rebar_packages:deps(PkgName -                              ,PkgVsn -                              ,State), -    AppInfo2 = rebar_app_info:resource_type(rebar_app_info:deps(AppInfo1, Deps), pkg), -    rebar_app_info:original_vsn(AppInfo2, PkgVsn);  update_source(AppInfo, Source, _State) ->      rebar_app_info:source(AppInfo, Source). @@ -198,19 +199,8 @@ format_error(Error) ->  %% Internal functions  %% =================================================================== --spec parse_goal(binary(), binary()) -> {binary(), binary()} | {binary(), binary(), binary()}. -parse_goal(Name, Constraint) -> -    case re:run(Constraint, "([^\\d]*)(\\d.*)", [{capture, [1,2], binary}]) of -        {match, [<<>>, Vsn]} -> -            {Name, Vsn}; -        {match, [Op, Vsn]} -> -            {Name, Vsn, binary_to_atom(Op, utf8)}; -        nomatch -> -            throw(?PRV_ERROR({bad_constraint, Name, Constraint})) -    end. - -get_package(Dep, State) -> -    case rebar_packages:find_highest_matching(Dep, "0", ?PACKAGE_TABLE, State) of +get_package(Dep, Vsn, State) -> +    case rebar_packages:find_highest_matching(Dep, Vsn, ?PACKAGE_TABLE, State) of          {ok, HighestDepVsn} ->              {Dep, HighestDepVsn};          none -> diff --git a/test/rebar_pkg_SUITE.erl b/test/rebar_pkg_SUITE.erl index 37e3a5e..9f19e0d 100644 --- a/test/rebar_pkg_SUITE.erl +++ b/test/rebar_pkg_SUITE.erl @@ -11,7 +11,8 @@  -define(good_checksum, <<"1C6CE379D191FBAB41B7905075E0BF87CBBE23C77CECE775C5A0B786B2244C35">>).  all() -> [good_uncached, good_cached, badindexchk, badpkg, -          bad_to_good, good_disconnect, bad_disconnect, pkgs_provider]. +          bad_to_good, good_disconnect, bad_disconnect, pkgs_provider, +          find_highest_matching].  init_per_suite(Config) ->      application:start(meck), @@ -86,7 +87,12 @@ init_per_testcase(bad_disconnect=Name, Config0) ->      meck:unload(httpc),      meck:new(httpc, [passthrough, unsticky]),      meck:expect(httpc, request, fun(_, _, _, _, _) -> {error, econnrefused} end), -    Config. +    Config; +init_per_testcase(Name, Config0) -> +    Config = [{good_cache, false}, +              {pkg, {<<"goodpkg">>, <<"1.0.0">>}} +              | Config0], +    mock_config(Name, Config).  end_per_testcase(_, Config) ->      unmock_config(Config), @@ -172,6 +178,16 @@ pkgs_provider(Config) ->          {ok, []}      ). +find_highest_matching(_Config) -> +    State = rebar_state:new(), +    {ok, Vsn} = rebar_packages:find_highest_matching(<<"goodpkg">>, <<"1.0.0">>, package_index, State), +    ?assertEqual(<<"1.0.1">>, Vsn), +    {ok, Vsn1} = rebar_packages:find_highest_matching(<<"goodpkg">>, <<"1.0">>, package_index, State), +    ?assertEqual(<<"1.1.1">>, Vsn1), +    {ok, Vsn2} = rebar_packages:find_highest_matching(<<"goodpkg">>, <<"2.0">>, package_index, State), +    ?assertEqual(<<"2.0.0">>, Vsn2). + +  %%%%%%%%%%%%%%%  %%% Helpers %%%  %%%%%%%%%%%%%%% @@ -182,10 +198,13 @@ mock_config(Name, Config) ->      Tid = ets:new(registry_table, [public]),      ets:insert_new(Tid, [          {<<"badindexchk">>,[[<<"1.0.0">>]]}, -        {<<"goodpkg">>,[[<<"1.0.0">>]]}, +        {<<"goodpkg">>,[[<<"1.0.0">>, <<"1.0.1">>, <<"1.1.1">>, <<"2.0.0">>]]},          {<<"badpkg">>,[[<<"1.0.0">>]]},          {{<<"badindexchk">>,<<"1.0.0">>}, [[], ?bad_checksum, [<<"rebar3">>]]},          {{<<"goodpkg">>,<<"1.0.0">>}, [[], ?good_checksum, [<<"rebar3">>]]}, +        {{<<"goodpkg">>,<<"1.0.1">>}, [[], ?good_checksum, [<<"rebar3">>]]}, +        {{<<"goodpkg">>,<<"1.1.1">>}, [[], ?good_checksum, [<<"rebar3">>]]}, +        {{<<"goodpkg">>,<<"2.0.0">>}, [[], ?good_checksum, [<<"rebar3">>]]},          {{<<"badpkg">>,<<"1.0.0">>}, [[], ?good_checksum, [<<"rebar3">>]]}      ]),      CacheDir = filename:join([CacheRoot, "hex", "com", "test", "packages"]), | 
