Você não pode selecionar mais de 25 tópicos Os tópicos devem começar com uma letra ou um número, podem incluir traços ('-') e podem ter até 35 caracteres.

58 linhas
2.0 KiB

  1. -module(rebar_prv_packages).
  2. -behaviour(provider).
  3. -export([init/1,
  4. do/1,
  5. format_error/1]).
  6. -include("rebar.hrl").
  7. -include_lib("stdlib/include/ms_transform.hrl").
  8. -include_lib("providers/include/providers.hrl").
  9. -define(PROVIDER, pkgs).
  10. -define(DEPS, []).
  11. -spec init(rebar_state:t()) -> {ok, rebar_state:t()}.
  12. init(State) ->
  13. State1 = rebar_state:add_provider(State, providers:create([{name, ?PROVIDER},
  14. {module, ?MODULE},
  15. {bare, false},
  16. {deps, ?DEPS},
  17. {example, "rebar3 pkgs"},
  18. {short_desc, "List available packages."},
  19. {desc, info("List available packages")},
  20. {opts, []}])),
  21. {ok, State1}.
  22. -spec do(rebar_state:t()) -> {ok, rebar_state:t()} | {error, string()}.
  23. do(State) ->
  24. case rebar_packages:registry(State) of
  25. {ok, Registry} ->
  26. print_packages(Registry),
  27. {ok, State};
  28. error ->
  29. ?PRV_ERROR(load_registry_fail)
  30. end.
  31. -spec format_error(any()) -> iolist().
  32. format_error(load_registry_fail) ->
  33. "Failed to load package regsitry. Try running 'rebar3 update' to fix".
  34. print_packages(Table) ->
  35. MS = ets:fun2ms(fun({Key, [Value]}) when is_binary(Key) -> {Key, Value} end),
  36. Pkgs = ets:select(Table, MS),
  37. lists:foreach(fun({Name, Vsns}) ->
  38. VsnStr = join(Vsns, <<", ">>),
  39. io:format("~s:~n Versions: ~s~n~n", [Name, VsnStr])
  40. end, Pkgs).
  41. -spec join([binary()], binary()) -> binary().
  42. join([Bin], _Sep) ->
  43. <<Bin/binary>>;
  44. join([Bin | T], Sep) ->
  45. <<Bin/binary, Sep/binary, (join(T, Sep))/binary>>.
  46. info(Description) ->
  47. io_lib:format("~s.~n", [Description]).