From 5cc7c76a8a2c0fdd0dad0ff79c6abf6130fb4d0e Mon Sep 17 00:00:00 2001 From: Nathaniel Waisbrot Date: Fri, 1 May 2015 17:34:54 -0400 Subject: try to read a config file when running `rebar shell` Adds a `--config` flag to the shell command to specify a config file. If the flag is not specified, attempts to read the sys_config defined for relx. --- src/rebar_prv_shell.erl | 62 ++++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 61 insertions(+), 1 deletion(-) (limited to 'src/rebar_prv_shell.erl') diff --git a/src/rebar_prv_shell.erl b/src/rebar_prv_shell.erl index 6153952..ec2f692 100644 --- a/src/rebar_prv_shell.erl +++ b/src/rebar_prv_shell.erl @@ -52,7 +52,7 @@ init(State) -> {example, "rebar3 shell"}, {short_desc, "Run shell with project apps and deps in path."}, {desc, info()}, - {opts, []}])), + {opts, [{config, undefined, "config", string, "Path to the config file to use. Defaults to the sys_config defined for relx, if present."}]}])), {ok, State1}. -spec do(rebar_state:t()) -> {ok, rebar_state:t()} | {error, string()}. @@ -96,6 +96,8 @@ shell(State) -> code:add_pathsa(rebar_state:code_paths(State, all_deps)), %% add project app test paths ok = add_test_paths(State), + %% try to read in sys.config file + ok = reread_config(State), %% this call never returns (until user quits shell) timer:sleep(infinity). @@ -129,3 +131,61 @@ add_test_paths(State) -> end, rebar_state:project_apps(State)), _ = code:add_path(filename:join([rebar_dir:base_dir(State), "test"])), ok. + +reread_config(State) -> + case find_config(State) of + no_config -> + ok; + {ok, ConfigList} -> + lists:foreach(fun ({Application, Items}) -> + lists:foreach(fun ({Key, Val}) -> + application:set_env(Application, Key, Val) + end, + Items) + end, + ConfigList); + {error, Error} -> + ?ABORT("Error while attempting to read configuration file: ~p", [Error]) + end. + +% First try the --config flag, then try the relx sys_config +-spec find_config(rebar_state:t()) -> {ok, [tuple()]}|no_config|{error, tuple()}. +find_config(State) -> + case find_config_option(State) of + no_config -> + find_config_relx(State); + Result -> + Result + end. + +-spec find_config_option(rebar_state:t()) -> {ok, [tuple()]}|no_config|{error, tuple()}. +find_config_option(State) -> + {Opts, _} = rebar_state:command_parsed_args(State), + case proplists:get_value(config, Opts) of + undefined -> + no_config; + Filename -> + consult_config(State, Filename) + end. + +-spec find_config_relx(rebar_state:t()) -> {ok, [tuple()]}|no_config|{error, tuple()}. +find_config_relx(State) -> + case proplists:get_value(sys_config, rebar_state:get(State, relx, [])) of + undefined -> + no_config; + Filename -> + consult_config(State, Filename) + end. + +-spec consult_config(rebar_state:t(), string()) -> {ok, [tuple()]}|{error, tuple()}. +consult_config(State, Filename) -> + Fullpath = filename:join(rebar_dir:root_dir(State), Filename), + ?DEBUG("Loading configuration from ~p", [Fullpath]), + case file:consult(Fullpath) of + {ok, [Config]} -> + {ok, Config}; + {ok, []} -> + {ok, []}; + {error, Error} -> + {error, {Error, Fullpath}} + end. -- cgit v1.1