Packages
rebar3_hex
6.9.2
7.1.0
7.0.11
7.0.10
7.0.9
7.0.8
7.0.7
7.0.6
7.0.5
7.0.4
7.0.3
7.0.2
7.0.1
7.0.0
6.11.9
6.11.8
6.11.7
6.11.6
6.11.5
6.11.4
6.11.3
6.11.2
6.11.1
6.11.0
6.10.3
6.10.2
6.10.1
6.10.0
6.9.6
6.9.5
6.9.4
6.9.3
6.9.2
6.9.1
6.9.0
6.8.0
6.7.0
6.6.0
6.5.0
6.4.0
6.3.0
6.2.0
6.1.0
6.0.0
4.1.0
4.0.0
3.1.0
3.0.0
2.5.1
2.5.0
2.4.0
2.3.0
2.2.0
2.1.0
2.0.0
1.20.0
1.19.0
1.18.0
1.17.0
1.16.0
1.15.0
1.14.0
1.13.0
1.12.0
1.11.0
1.10.0
1.9.1
1.9.0
1.8.1
1.8.0
1.7.2
1.7.1
1.7.0
1.6.3
1.6.1
1.6.0
1.5.0
1.4.0
1.3.0
1.2.0
1.1.0
0.9.0
0.8.0
0.7.0
0.6.0
0.5.1
0.5.0
0.4.0
0.3.0
0.2.0
0.1.0
Hex.pm plugin for rebar3
Current section
Files
Jump to
Current section
Files
src/rebar3_hex_retire.erl
%% @doc This provider allows the user to delete a package within one
%% hour of its publication.
%% @end
-module(rebar3_hex_retire).
-export([init/1,
do/1,
format_error/1]).
-export([retire/6]).
-include("rebar3_hex.hrl").
-define(PROVIDER, retire).
-define(DEPS, []).
%% ===================================================================
%% Public API
%% ===================================================================
-spec init(rebar_state:t()) -> {ok, rebar_state:t()}.
init(State) ->
Provider = providers:create([{name, ?PROVIDER},
{module, ?MODULE},
{namespace, hex},
{bare, true},
{deps, ?DEPS},
{example, "rebar3 hex retire some_pkg 0.3.0"},
{short_desc, "Mark a package as deprecated."},
{desc, ""},
{opts, [{pkg, undefined, undefined, string, "Name of the package to retire."},
{vsn, undefined, undefined, string, "Version of the package to retire."},
{reason, undefined, undefined, string, "Reason to retire package."},
{message, undefined, undefined, string, "Clarifying message for retirement"},
rebar3_hex:repo_opt()]}]),
State1 = rebar_state:add_provider(State, Provider),
{ok, State1}.
-spec do(rebar_state:t()) -> {ok, rebar_state:t()} | {error, string()}.
do(State) ->
case rebar3_hex_config:repo(State) of
{ok, Repo} ->
handle_command(State, Repo);
{error, Reason} ->
?PRV_ERROR(Reason)
end.
handle_command(State, Repo) ->
{Args, _} = rebar_state:command_parsed_args(State),
Name = rebar3_hex:get_required(pkg, Args),
PkgName = rebar_utils:to_binary(Name),
Version = rebar3_hex:get_required(vsn, Args),
Reason = rebar3_hex:get_required(reason, Args),
Message = rebar3_hex:get_required(message, Args),
retire(PkgName, rebar_utils:to_binary(Version), Repo,
rebar_utils:to_binary(Reason),
rebar_utils:to_binary(Message),
State).
format_error({api_error, PkgName, Version, Reason}) ->
io_lib:format("Unable to delete package ~ts ~ts: ~ts", [PkgName, Version, Reason]);
format_error({required, pkg}) ->
"retire requires a package name argument to identify the package to delete";
format_error({required, vsn}) ->
"retire requires a version number argument to identify the package to delete";
format_error({required, reason}) ->
"retire requires a reason with value of either other, invalid, security, deprecated or renamed";
format_error({required, message}) ->
"retire requires a message to clarify the reason for the retirement of the package";
format_error(Reason) ->
rebar3_hex_error:format_error(Reason).
retire(PkgName, Version, Repo, Reason, Message, State) ->
case rebar3_hex_config:hex_config_write(Repo) of
{error, no_write_key} ->
?PRV_ERROR({no_write_key, maps:get(name, Repo)});
{ok, HexConfig} ->
Body = #{<<"reason">> => Reason,
<<"message">> => Message},
case hex_api_release:retire(HexConfig, PkgName, Version, Body) of
{ok, {Code, _Headers, _Body}} when Code =:= 204 ->
rebar_api:info("Successfully retired package ~ts ~ts", [PkgName, Version]),
{ok, State};
{ok, {Code, _Headers, _Body}} ->
?PRV_ERROR({api_error, PkgName, Version, rebar3_hex_client:pretty_print_status(Code)});
{error, Reason} ->
?PRV_ERROR({api_error, PkgName, Version, io_lib:format("~p", [Reason])})
end
end.