Packages
rebar3_hex
6.2.0
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_revert.erl
%% @doc This provider allows the user to delete a package within one
%% hour of its publication.
%% @end
-module(rebar3_hex_revert).
-export([init/1,
do/1,
format_error/1]).
-export([revert/4]).
-include("rebar3_hex.hrl").
-define(PROVIDER, revert).
-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 revert some_pkg 0.3.0"},
{short_desc, "Delete a package from the repository"},
{desc, ""},
{opts, [{pkg, undefined, undefined, string, "Name of the package to delete."},
{vsn, undefined, undefined, string, "Version of the package to delete."},
rebar3_hex_utils:repo_opt()]}]),
State1 = rebar_state:add_provider(State, Provider),
{ok, State1}.
-spec do(rebar_state:t()) -> {ok, rebar_state:t()} | {error, string()}.
do(State) ->
Repo = rebar3_hex_utils:repo(State),
{Args, _} = rebar_state:command_parsed_args(State),
case proplists:get_value(pkg, Args, undefined) of
undefined ->
?PRV_ERROR(package_name_required);
Name ->
PkgName = rebar_utils:to_binary(Name),
case proplists:get_value(vsn, Args, undefined) of
undefined ->
?PRV_ERROR(version_required);
Version ->
case revert(PkgName, rebar_utils:to_binary(Version), Repo, State) of
ok ->
{ok, State};
Error ->
Error
end
end
end.
format_error({api_error, PkgName, Version, Reason}) ->
io_lib:format("Unable to delete package ~ts ~ts: ~ts", [PkgName, Version, Reason]);
format_error(package_name_required) ->
"revert requires a package name argument to identify the package to delete";
format_error(version_required) ->
"revert requires a version number argument to identify the package to delete".
%%
revert(PkgName, Version, Repo, _State) ->
case maps:get(write_key, Repo, undefined) of
undefined ->
{error, no_write_key};
WriteKey ->
Username = maps:get(username, Repo),
HexConfig = Repo#{api_key => rebar3_hex_user:decrypt_write_key(Username, WriteKey)},
case hex_api_release:delete(HexConfig, PkgName, Version) of
{ok, {Code, _Headers, _Body}} when Code =:= 200 ;
Code =:= 204 ->
rebar_api:info("Successfully deleted package ~ts ~ts", [PkgName, Version]),
case ec_talk:ask_default(io_lib:format("Also delete tag v~s?", [Version]), boolean, "N") of
true ->
rebar_utils:sh(io_lib:format("git tag -d v~s", [Version]), []);
_ ->
ok
end;
{ok, {Code, _Headers, _Body}} ->
?PRV_ERROR({api_error, PkgName, Version, rebar3_hex_utils:pretty_print_status(Code)});
{error, Reason} ->
?PRV_ERROR({api_error, PkgName, Version, io_lib:format("~p", [Reason])})
end
end.