Skip to content

Commit

Permalink
Have "rebar3 plugins upgrade" keep its promise
Browse files Browse the repository at this point in the history
  • Loading branch information
paulo-ferraz-oliveira committed Mar 28, 2021
1 parent ab5c342 commit 27c92d7
Show file tree
Hide file tree
Showing 2 changed files with 26 additions and 7 deletions.
20 changes: 16 additions & 4 deletions src/rebar_prv_plugins.erl
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,8 @@

-export([init/1,
do/1,
format_error/1]).
format_error/1,
list_local_plugins/1]).

-include("rebar.hrl").
-include_lib("providers/include/providers.hrl").
Expand Down Expand Up @@ -41,22 +42,33 @@ do(State) ->

RebarOpts = rebar_state:opts(State),
SrcDirs = rebar_dir:src_dirs(RebarOpts, ["src"]),
Plugins = rebar_state:get(State, plugins, []),
ProjectPlugins = rebar_state:get(State, project_plugins, []),
{LocalPluginsDefs, _} = list_local_plugins(State),
PluginsDirs = filelib:wildcard(filename:join(rebar_dir:plugins_dir(State), "*")),

%% use `checkouts_dir' and not `checkouts_out_dir'. Since we use `all' in `find_apps'
%% so it doesn't need to be built and the apps in `checkouts_dir' could be old
%% because the user removing from `_checkouts/' doesn't cause removal of the output
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 ++ ProjectPlugins),
display_plugins("Local plugins", Apps, LocalPluginsDefs),
{ok, State}.

-spec format_error(any()) -> iolist().
format_error(Reason) ->
io_lib:format("~p", [Reason]).

list_local_plugins(State) ->
LocalPluginsDefs = rebar_state:get(State, plugins, [])
++ rebar_state:get(State, project_plugins, []),
LocalPluginsNames = lists:map(
fun (LocalPluginDef) ->
if is_atom(LocalPluginDef) -> LocalPluginDef;
is_tuple(LocalPluginDef) -> element(1, LocalPluginDef)
end
end,
LocalPluginsDefs),
{LocalPluginsDefs, LocalPluginsNames}.

display_plugins(_Header, _Apps, []) ->
ok;
display_plugins(Header, Apps, Plugins) ->
Expand Down
13 changes: 10 additions & 3 deletions src/rebar_prv_plugins_upgrade.erl
Original file line number Diff line number Diff line change
Expand Up @@ -35,14 +35,21 @@ do(State) ->
{Args, _} = rebar_state:command_parsed_args(State),
case proplists:get_value(plugin, Args, none) of
none ->
?PRV_ERROR(no_plugin_arg);
{_, LocalPluginsNames} = rebar_prv_plugins:list_local_plugins(State),
{ok, lists:foldl(
fun (LocalPluginName, StateAcc) ->
case upgrade(atom_to_list(LocalPluginName), StateAcc) of
{error, _} -> StateAcc;
{ok, NewState} -> NewState
end
end,
State,
LocalPluginsNames)};
Plugin ->
upgrade(Plugin, State)
end.

-spec format_error(any()) -> iolist().
format_error(no_plugin_arg) ->
io_lib:format("Must give an installed plugin to upgrade as an argument", []);
format_error({not_found, Plugin}) ->
io_lib:format("Plugin to upgrade not found: ~ts", [Plugin]);
format_error(Reason) ->
Expand Down

0 comments on commit 27c92d7

Please sign in to comment.