-module(rebar_prv_packages).
|
|
|
|
-behaviour(provider).
|
|
|
|
-export([init/1,
|
|
do/1,
|
|
format_error/1]).
|
|
|
|
-include("rebar.hrl").
|
|
-include_lib("stdlib/include/ms_transform.hrl").
|
|
-include_lib("providers/include/providers.hrl").
|
|
|
|
-define(PROVIDER, pkgs).
|
|
-define(DEPS, []).
|
|
|
|
-spec init(rebar_state:t()) -> {ok, rebar_state:t()}.
|
|
init(State) ->
|
|
State1 = rebar_state:add_provider(State, providers:create([{name, ?PROVIDER},
|
|
{module, ?MODULE},
|
|
{bare, true},
|
|
{deps, ?DEPS},
|
|
{example, "rebar3 pkgs"},
|
|
{short_desc, "List available packages."},
|
|
{desc, info("List available packages")},
|
|
{opts, []}])),
|
|
{ok, State1}.
|
|
|
|
-spec do(rebar_state:t()) -> {ok, rebar_state:t()} | {error, string()}.
|
|
do(State) ->
|
|
rebar_packages:packages(State),
|
|
case rebar_state:command_args(State) of
|
|
[Name] ->
|
|
print_packages(get_packages(iolist_to_binary(Name)));
|
|
_ ->
|
|
print_packages(sort_packages())
|
|
end,
|
|
{ok, State}.
|
|
|
|
-spec format_error(any()) -> iolist().
|
|
format_error(load_registry_fail) ->
|
|
"Failed to load package regsitry. Try running 'rebar3 update' to fix".
|
|
|
|
print_packages(Pkgs) ->
|
|
orddict:map(fun(Name, Vsns) ->
|
|
SortedVsns = lists:sort(fun(A, B) ->
|
|
ec_semver:lte(ec_semver:parse(A)
|
|
,ec_semver:parse(B))
|
|
end, Vsns),
|
|
VsnStr = join(SortedVsns, <<", ">>),
|
|
?CONSOLE("~s:~n Versions: ~s~n", [Name, VsnStr])
|
|
end, Pkgs).
|
|
|
|
sort_packages() ->
|
|
ets:foldl(fun({package_index_version, _}, Acc) ->
|
|
Acc;
|
|
({Pkg, Vsns}, Acc) ->
|
|
orddict:store(Pkg, Vsns, Acc);
|
|
(_, Acc) ->
|
|
Acc
|
|
end, orddict:new(), ?PACKAGE_TABLE).
|
|
|
|
get_packages(Name) ->
|
|
ets:lookup(?PACKAGE_TABLE, Name).
|
|
|
|
|
|
-spec join([binary()], binary()) -> binary().
|
|
join([Bin], _Sep) ->
|
|
<<Bin/binary>>;
|
|
join([Bin | T], Sep) ->
|
|
<<Bin/binary, Sep/binary, (join(T, Sep))/binary>>.
|
|
|
|
|
|
info(Description) ->
|
|
io_lib:format("~s.~n", [Description]).
|