summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorFred Hebert <mononcqc@ferd.ca>2019-02-20 21:11:52 -0500
committerGitHub <noreply@github.com>2019-02-20 21:11:52 -0500
commit9e2e54afd74104ecb05c55e033803f41932eb940 (patch)
tree385da3aa69fbad8288b9d9209c2fd41207f9c0f8
parent80c84170244ce426f2a112ddcacde21284dca59d (diff)
parent6379510ebf1c14c934960d13d29563c0494c2d90 (diff)
Merge pull request #2022 from starbelly/abort-on-auth-config-syntax-error
Abort when file:consult/1 returns an error in rebar3_hex_repos:auth_config/1
-rw-r--r--src/rebar_hex_repos.erl16
-rw-r--r--test/rebar_pkg_repos_SUITE.erl41
2 files changed, 52 insertions, 5 deletions
diff --git a/src/rebar_hex_repos.erl b/src/rebar_hex_repos.erl
index def5f49..babaa32 100644
--- a/src/rebar_hex_repos.erl
+++ b/src/rebar_hex_repos.erl
@@ -136,11 +136,21 @@ auth_config_file(State) ->
-spec auth_config(rebar_state:t()) -> map().
auth_config(State) ->
- case file:consult(auth_config_file(State)) of
+ AuthFile = auth_config_file(State),
+ case file:consult(AuthFile) of
{ok, [Config]} ->
Config;
- _ ->
- #{}
+ {error, Reason} when is_atom(Reason) ->
+ case Reason of
+ enoent ->
+ #{};
+ _ ->
+ % TODO: map to an english reason
+ ?ABORT("Error reading repos auth config (~ts) : ~ts", [AuthFile, atom_to_list(Reason)])
+ end;
+ {error, {_Line, _Mod, _Term} = Err} ->
+ Reason = file:format_error(Err),
+ ?ABORT("Error found in repos auth config (~ts) at line ~ts", [AuthFile, Reason])
end.
-spec update_auth_config(map(), rebar_state:t()) -> ok.
diff --git a/test/rebar_pkg_repos_SUITE.erl b/test/rebar_pkg_repos_SUITE.erl
index 55bc020..874da71 100644
--- a/test/rebar_pkg_repos_SUITE.erl
+++ b/test/rebar_pkg_repos_SUITE.erl
@@ -9,7 +9,7 @@
all() ->
[default_repo, repo_merging, repo_replacing,
- auth_merging, organization_merging, {group, resolve_version}].
+ auth_merging, auth_config_errors, organization_merging, {group, resolve_version}].
groups() ->
[{resolve_version, [use_first_repo_match, use_exact_with_hash, fail_repo_update,
@@ -119,7 +119,8 @@ init_per_testcase(optional_prereleases, Config) ->
fun(_State) -> true end),
[{state, State} | Config];
-init_per_testcase(auth_merging, Config) ->
+init_per_testcase(Case, Config) when Case =:= auth_merging ;
+ Case =:= auth_config_errors ->
meck:new(file, [passthrough, no_link, unstick]),
meck:new(rebar_packages, [passthrough, no_link]),
Config;
@@ -131,6 +132,7 @@ init_per_testcase(_, Config) ->
Config.
end_per_testcase(Case, _Config) when Case =:= auth_merging ;
+ Case =:= auth_config_errors ;
Case =:= organization_merging ->
meck:unload(file),
meck:unload(rebar_packages);
@@ -234,6 +236,41 @@ auth_merging(_Config) ->
ok.
+auth_config_errors(_Config) ->
+ Repo1 = #{name => <<"repo-1">>,
+ api_url => <<"repo-1/api">>},
+ Repo2 = #{name => <<"repo-2">>,
+ repo_url => <<"repo-2/repo">>,
+ repo_verify => false},
+
+ State = rebar_state:new([{hex, [{repos, [Repo1, Repo2]}]}]),
+ meck:expect(file, consult,
+ fun(_) ->
+ {error, {3,erl_parse,["syntax error before: ","'=>'"]}}
+ end),
+
+ ?assertThrow(rebar_abort, rebar_pkg_resource:init(pkg, State)),
+ meck:expect(file, consult,
+ fun(_) ->
+ {error, enoent}
+ end),
+
+
+ {ok, #resource{state=#{ repos := [
+ UpdatedRepo1,
+ UpdatedRepo2,
+ DefaultRepo
+ ]}}} = rebar_pkg_resource:init(pkg, State),
+
+ ?assertEqual(undefined, maps:get(write_key, UpdatedRepo1, undefined)),
+ ?assertEqual(undefined, maps:get(read_key, UpdatedRepo1, undefined)),
+ ?assertEqual(undefined, maps:get(repos_key, UpdatedRepo1, undefined)),
+ ?assertEqual(undefined, maps:get(write_key, UpdatedRepo2, undefined)),
+ ?assertEqual(undefined, maps:get(repos_key, UpdatedRepo2, undefined)),
+ ?assertEqual(undefined, maps:get(read_key, UpdatedRepo2, undefined)),
+ ?assertEqual(undefined, maps:get(write_key, DefaultRepo, undefined)),
+ ok.
+
organization_merging(_Config) ->
Repo1 = #{name => <<"hexpm:repo-1">>,
api_url => <<"repo-1/api">>},