Packages
rebar3_hex
1.7.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_config.erl
-module(rebar3_hex_config).
-export([init/1,
do/1,
format_error/1]).
-export([path/0
,read/0
,api_url/0
,cdn_url/0
,username/0
,auth/0
,http_proxy/0
,https_proxy/0
,update/1
,write/1]).
-define(PROVIDER, config).
-define(DEPS, []).
-define(DEFAULT_HEX_CONFIG, "hex.config").
-define(DEFAULT_API_URL, "https://hex.pm").
-define(DEFAULT_CDN_URL, "https://s3.amazonaws.com/s3.hex.pm").
-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 config <key> [<value>]"},
{short_desc, "Read or update hex configuration file"},
{desc, ""},
{opts, []}
]),
State1 = rebar_state:add_provider(State, Provider),
{ok, State1}.
-spec do(rebar_state:t()) -> {ok, rebar_state:t()} | {error, string()}.
do(State) ->
case rebar_state:command_args(State) of
["username" | Value] ->
maybe_update(username, Value),
ec_talk:say("username: ~s", [username()]);
["key" | Value] ->
maybe_update(key, Value),
case auth() of
{ok, Key} ->
ec_talk:say("key: ~s", [Key]);
error ->
ignore
end;
["api_url" | Value] ->
maybe_update(api_url, Value),
ec_talk:say("api_url: ~s", [api_url()]);
["cdn_url" | Value] ->
maybe_update(cdn_url, Value),
ec_talk:say("cdn_url: ~s", [cdn_url()]);
["http_proxy" | Value] ->
maybe_update(http_proxy, Value),
ec_talk:say("http_proxy: ~s", [http_proxy()]);
["https_proxy" | Value] ->
maybe_update(https_proxy, Value),
ec_talk:say("https_proxy: ~s", [https_proxy()]);
[Other | _]->
rebar_api:error("Config does not contain a key ~s", [Other]);
[] ->
rebar_api:info("Usage: rebar3 hex config <key> [<value>]", [])
end,
{ok, State}.
-spec format_error(any()) -> iolist().
format_error(no_user) ->
"No user registered. See https://hex.pm/docs/rebar3_publish for instructions.";
format_error(Reason) ->
io_lib:format("~p", [Reason]).
path() ->
filename:join(rebar3_hex_utils:hex_home(), ?DEFAULT_HEX_CONFIG).
read() ->
case file:consult(path()) of
{ok, Config} ->
Config;
_ ->
[]
end.
api_url() ->
proplists:get_value(api_url, read(), ?DEFAULT_API_URL).
cdn_url() ->
proplists:get_value(cdn_url, read(), ?DEFAULT_CDN_URL).
username() ->
proplists:get_value(username, read(), "").
http_proxy() ->
proplists:get_value(http_proxy, read(), "").
https_proxy() ->
proplists:get_value(https_proxy, read(), "").
auth() ->
case lists:keyfind(key, 1, read()) of
{key, Key} ->
{ok, Key};
_ ->
throw({error, {?MODULE, no_user}})
end.
update(NewConfig) ->
Config = read(),
Config1 = lists:ukeymerge(1
,lists:keysort(1, NewConfig)
,lists:keysort(1, Config)),
write(Config1).
write(Config) ->
filelib:ensure_dir(path()),
ok = file:write_file(path(), encode_config(Config)).
%% Internal functions
maybe_update(_, []) ->
ok;
maybe_update(Key, Value) ->
update([{Key, ec_cnv:to_binary(Value)}]).
encode_config(Config) ->
iolist_to_binary([[io_lib:print(Term) | ".\n"] || Term <- Config]).