Du kannst nicht mehr als 25 Themen auswählen Themen müssen entweder mit einem Buchstaben oder einer Ziffer beginnen. Sie können Bindestriche („-“) enthalten und bis zu 35 Zeichen lang sein.

74 Zeilen
2.6 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, true},
  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. rebar_packages:packages(State),
  25. case rebar_state:command_args(State) of
  26. [Name] ->
  27. print_packages(get_packages(iolist_to_binary(Name)));
  28. _ ->
  29. print_packages(sort_packages())
  30. end,
  31. {ok, State}.
  32. -spec format_error(any()) -> iolist().
  33. format_error(load_registry_fail) ->
  34. "Failed to load package regsitry. Try running 'rebar3 update' to fix".
  35. print_packages(Pkgs) ->
  36. orddict:map(fun(Name, Vsns) ->
  37. SortedVsns = lists:sort(fun(A, B) ->
  38. ec_semver:lte(ec_semver:parse(A)
  39. ,ec_semver:parse(B))
  40. end, Vsns),
  41. VsnStr = join(SortedVsns, <<", ">>),
  42. ?CONSOLE("~s:~n Versions: ~s~n", [Name, VsnStr])
  43. end, Pkgs).
  44. sort_packages() ->
  45. ets:foldl(fun({package_index_version, _}, Acc) ->
  46. Acc;
  47. ({Pkg, Vsns}, Acc) ->
  48. orddict:store(Pkg, Vsns, Acc);
  49. (_, Acc) ->
  50. Acc
  51. end, orddict:new(), ?PACKAGE_TABLE).
  52. get_packages(Name) ->
  53. ets:lookup(?PACKAGE_TABLE, Name).
  54. -spec join([binary()], binary()) -> binary().
  55. join([Bin], _Sep) ->
  56. <<Bin/binary>>;
  57. join([Bin | T], Sep) ->
  58. <<Bin/binary, Sep/binary, (join(T, Sep))/binary>>.
  59. info(Description) ->
  60. io_lib:format("~s.~n", [Description]).