瀏覽代碼

Abort when file:consult/1 returns an error

- Modified rebar_hex_repos:auth_config/1 to abort on error except in
 the case of enoent, in which we return an empty map.
 - added auth_config_errors test to test/rebar_pkg_repos_SUITE
pull/2022/head
Bryan Paxton 6 年之前
父節點
當前提交
6379510ebf
共有 2 個檔案被更改,包括 52 行新增5 行删除
  1. +13
    -3
      src/rebar_hex_repos.erl
  2. +39
    -2
      test/rebar_pkg_repos_SUITE.erl

+ 13
- 3
src/rebar_hex_repos.erl 查看文件

@ -136,11 +136,21 @@ auth_config_file(State) ->
-spec auth_config(rebar_state:t()) -> map(). -spec auth_config(rebar_state:t()) -> map().
auth_config(State) -> auth_config(State) ->
case file:consult(auth_config_file(State)) of
AuthFile = auth_config_file(State),
case file:consult(AuthFile) of
{ok, [Config]} -> {ok, [Config]} ->
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. end.
-spec update_auth_config(map(), rebar_state:t()) -> ok. -spec update_auth_config(map(), rebar_state:t()) -> ok.

+ 39
- 2
test/rebar_pkg_repos_SUITE.erl 查看文件

@ -9,7 +9,7 @@
all() -> all() ->
[default_repo, repo_merging, repo_replacing, [default_repo, repo_merging, repo_replacing,
auth_merging, organization_merging, {group, resolve_version}].
auth_merging, auth_config_errors, organization_merging, {group, resolve_version}].
groups() -> groups() ->
[{resolve_version, [use_first_repo_match, use_exact_with_hash, fail_repo_update, [{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), fun(_State) -> true end),
[{state, State} | Config]; [{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(file, [passthrough, no_link, unstick]),
meck:new(rebar_packages, [passthrough, no_link]), meck:new(rebar_packages, [passthrough, no_link]),
Config; Config;
@ -131,6 +132,7 @@ init_per_testcase(_, Config) ->
Config. Config.
end_per_testcase(Case, _Config) when Case =:= auth_merging ; end_per_testcase(Case, _Config) when Case =:= auth_merging ;
Case =:= auth_config_errors ;
Case =:= organization_merging -> Case =:= organization_merging ->
meck:unload(file), meck:unload(file),
meck:unload(rebar_packages); meck:unload(rebar_packages);
@ -234,6 +236,41 @@ auth_merging(_Config) ->
ok. 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) -> organization_merging(_Config) ->
Repo1 = #{name => <<"hexpm:repo-1">>, Repo1 = #{name => <<"hexpm:repo-1">>,
api_url => <<"repo-1/api">>}, api_url => <<"repo-1/api">>},

Loading…
取消
儲存