-module(rebar_prv_plugins).
|
|
|
|
-behaviour(provider).
|
|
|
|
-export([init/1,
|
|
do/1,
|
|
format_error/1]).
|
|
|
|
-include("rebar.hrl").
|
|
-include_lib("providers/include/providers.hrl").
|
|
|
|
-define(PROVIDER, list).
|
|
-define(NAMESPACE, plugins).
|
|
-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},
|
|
{namespace, ?NAMESPACE},
|
|
{bare, true},
|
|
{deps, ?DEPS},
|
|
{example, "rebar3 plugins list"},
|
|
{short_desc, "List local and global plugins for this project"},
|
|
{desc, "List local and global plugins for this project"},
|
|
{opts, []}])),
|
|
{ok, State1}.
|
|
|
|
-spec do(rebar_state:t()) -> {ok, rebar_state:t()} | {error, string()}.
|
|
do(State) ->
|
|
GlobalConfigFile = rebar_dir:global_config(),
|
|
GlobalConfig = rebar_state:new(rebar_config:consult_file(GlobalConfigFile)),
|
|
GlobalPlugins = rebar_state:get(GlobalConfig, plugins, []),
|
|
GlobalSrcDirs = rebar_state:get(GlobalConfig, src_dirs, ["src"]),
|
|
GlobalPluginsDir = filename:join([rebar_dir:global_cache_dir(rebar_state:opts(State)), "plugins", "*"]),
|
|
GlobalApps = rebar_app_discover:find_apps([GlobalPluginsDir], GlobalSrcDirs, all, State),
|
|
display_plugins("Global plugins", GlobalApps, GlobalPlugins),
|
|
|
|
RebarOpts = rebar_state:opts(State),
|
|
SrcDirs = rebar_dir:src_dirs(RebarOpts, ["src"]),
|
|
Plugins = rebar_state:get(State, plugins, []),
|
|
PluginsDirs = filelib:wildcard(filename:join(rebar_dir:plugins_dir(State), "*")),
|
|
CheckoutsDirs = filelib:wildcard(filename:join(rebar_dir:checkouts_dir(State), "*")),
|
|
Apps = rebar_app_discover:find_apps(CheckoutsDirs++PluginsDirs, SrcDirs, all, State),
|
|
display_plugins("Local plugins", Apps, Plugins),
|
|
{ok, State}.
|
|
|
|
-spec format_error(any()) -> iolist().
|
|
format_error(Reason) ->
|
|
io_lib:format("~p", [Reason]).
|
|
|
|
display_plugins(_Header, _Apps, []) ->
|
|
ok;
|
|
display_plugins(Header, Apps, Plugins) ->
|
|
?CONSOLE("--- ~ts ---", [Header]),
|
|
display_plugins(Apps, Plugins),
|
|
?CONSOLE("", []).
|
|
|
|
display_plugins(Apps, Plugins) ->
|
|
lists:foreach(fun(Plugin) ->
|
|
Name = if is_atom(Plugin) -> atom_to_binary(Plugin, unicode);
|
|
is_tuple(Plugin) -> rebar_utils:to_binary(element(1, Plugin))
|
|
end,
|
|
case rebar_app_utils:find(Name, Apps) of
|
|
{ok, _App} ->
|
|
?CONSOLE("~ts", [Name]);
|
|
error ->
|
|
?DEBUG("Unable to find plugin ~ts", [Name])
|
|
end
|
|
end, Plugins).
|