summaryrefslogtreecommitdiff
path: root/src/rebar_config.erl
diff options
context:
space:
mode:
Diffstat (limited to 'src/rebar_config.erl')
-rw-r--r--src/rebar_config.erl271
1 files changed, 12 insertions, 259 deletions
diff --git a/src/rebar_config.erl b/src/rebar_config.erl
index 50682e0..a45bef9 100644
--- a/src/rebar_config.erl
+++ b/src/rebar_config.erl
@@ -26,148 +26,20 @@
%% -------------------------------------------------------------------
-module(rebar_config).
--export([new/0, new/1, new/2, new2/2, base_config/1, consult_file/1,
- get/3, get_local/3, get_list/3,
- get_all/2,
- set/3,
- command_args/1, command_args/2,
- set_global/3, get_global/3,
- is_recursive/1,
- save_env/3, get_env/2, reset_envs/1,
- set_skip_dir/2, is_skip_dir/2, reset_skip_dirs/1,
- create_logic_providers/2,
- providers/1, providers/2, add_provider/2,
- add_dep/2, get_dep/2, deps/2, deps/1, deps_graph/1, deps_graph/2, deps_to_build/1,
- goals/1, goals/2,
- get_app/2, apps_to_build/1, apps_to_build/2, add_app/2, replace_app/3,
- set_xconf/3, get_xconf/2, get_xconf/3, erase_xconf/2]).
+-export([consult/1
+ ,consult_file/1]).
-include("rebar.hrl").
--ifdef(namespaced_types).
-%% dict:dict() exists starting from Erlang 17.
--type rebar_dict() :: dict:dict(term(), term()).
--else.
-%% dict() has been obsoleted in Erlang 17 and deprecated in 18.
--type rebar_dict() :: dict().
--endif.
-
--record(config, { dir :: file:filename(),
- opts = [] :: list(),
- local_opts = [] :: list(),
- globals = new_globals() :: rebar_dict(),
- envs = new_env() :: rebar_dict(),
- command_args = [] :: list(),
- %% cross-directory/-command config
- goals = [],
- providers = [],
- apps_to_build = [],
- deps_to_build = [],
- deps = [],
- deps_graph = undefined,
- skip_dirs = new_skip_dirs() :: rebar_dict(),
- xconf = new_xconf() :: rebar_dict() }).
-
--export_type([config/0]).
-
--opaque config() :: #config{}.
-
--define(DEFAULT_NAME, "rebar.config").
--define(LOCK_FILE, "rebar.lock").
-
%% ===================================================================
%% Public API
%% ===================================================================
-base_config(GlobalConfig) ->
- ConfName = rebar_config:get_global(GlobalConfig, config, ?DEFAULT_NAME),
- new(GlobalConfig, ConfName).
-
-new() ->
- #config{dir = rebar_utils:get_cwd()}.
-
-new(ConfigFile) when is_list(ConfigFile) ->
- case consult_file(ConfigFile) of
- {ok, Opts} ->
- #config { dir = rebar_utils:get_cwd(),
- opts = Opts };
- Other ->
- ?ABORT("Failed to load ~s: ~p~n", [ConfigFile, Other])
- end;
-new(_ParentConfig=#config{opts=Opts0, globals=Globals, skip_dirs=SkipDirs, xconf=Xconf}) ->
- new(#config{opts=Opts0, globals=Globals, skip_dirs=SkipDirs, xconf=Xconf},
- ?DEFAULT_NAME).
-
-new(ParentConfig=#config{}, ConfName) ->
- %% Load terms from rebar.config, if it exists
- Dir = rebar_utils:get_cwd(),
- new(ParentConfig, ConfName, Dir).
-
-new2(_ParentConfig=#config{opts=Opts0, globals=Globals, skip_dirs=SkipDirs, xconf=Xconf}, Dir) ->
- new(#config{opts=Opts0, globals=Globals, skip_dirs=SkipDirs, xconf=Xconf},
- ?DEFAULT_NAME, Dir).
-
-new(ParentConfig, ConfName, Dir) ->
- ConfigFile = filename:join([Dir, ConfName]),
- Opts0 = ParentConfig#config.opts,
- Opts = case consult_file(ConfigFile) of
- {ok, Terms} ->
- Terms;
- {error, enoent} ->
- [];
- Other ->
- ?ABORT("Failed to load ~s: ~p\n", [ConfigFile, Other])
- end,
-
- Opts1 = case consult_file(?LOCK_FILE) of
- {ok, [D]} ->
- [{lock_deps, D} | Opts];
- _ ->
- Opts
- end,
-
- ProviderModules = [],
- create_logic_providers(ProviderModules, ParentConfig#config{dir=Dir
- ,local_opts=Opts1
- ,opts=Opts0}).
-
-
-get(Config, Key, Default) ->
- proplists:get_value(Key, Config#config.opts, Default).
-
-get_list(Config, Key, Default) ->
- get(Config, Key, Default).
-
-get_local(Config, Key, Default) ->
- proplists:get_value(Key, Config#config.local_opts, Default).
-
-get_all(Config, Key) ->
- proplists:get_all_values(Key, Config#config.opts).
-
-set(Config, Key, Value) ->
- Opts = proplists:delete(Key, Config#config.opts),
- Config#config { opts = [{Key, Value} | Opts] }.
-
-set_global(Config, jobs=Key, Value) when is_list(Value) ->
- set_global(Config, Key, list_to_integer(Value));
-set_global(Config, jobs=Key, Value) when is_integer(Value) ->
- NewGlobals = dict:store(Key, erlang:max(1, Value), Config#config.globals),
- Config#config{globals = NewGlobals};
-set_global(Config, Key, Value) ->
- NewGlobals = dict:store(Key, Value, Config#config.globals),
- Config#config{globals = NewGlobals}.
-
-get_global(Config, Key, Default) ->
- case dict:find(Key, Config#config.globals) of
- error ->
- Default;
- {ok, Value} ->
- Value
- end.
-
-is_recursive(Config) ->
- get_xconf(Config, recursive, false).
+-spec consult(file:name()) -> {ok, any()}.
+consult(Dir) ->
+ consult_file(filename:join(Dir, ?DEFAULT_CONFIG_FILE)).
+-spec consult_file(file:name()) -> {ok, any()}.
consult_file(File) when is_binary(File) ->
consult_file(binary_to_list(File));
consult_file(File) ->
@@ -178,136 +50,25 @@ consult_file(File) ->
Script = File ++ ".script",
case filelib:is_regular(Script) of
true ->
- consult_and_eval(File, Script);
+ {ok, Terms} = consult_and_eval(File, Script),
+ Terms;
false ->
?DEBUG("Consult config file ~p~n", [File]),
- file:consult(File)
+ try_consult(File)
end
end.
-save_env(Config, Mod, Env) ->
- NewEnvs = dict:store(Mod, Env, Config#config.envs),
- Config#config{envs = NewEnvs}.
-
-get_env(Config, Mod) ->
- dict:fetch(Mod, Config#config.envs).
-
-reset_envs(Config) ->
- Config#config{envs = new_env()}.
-
-set_skip_dir(Config, Dir) ->
- OldSkipDirs = Config#config.skip_dirs,
- NewSkipDirs = case is_skip_dir(Config, Dir) of
- false ->
- ?DEBUG("Adding skip dir: ~s\n", [Dir]),
- dict:store(Dir, true, OldSkipDirs);
- true ->
- OldSkipDirs
- end,
- Config#config{skip_dirs = NewSkipDirs}.
-
-is_skip_dir(Config, Dir) ->
- dict:is_key(Dir, Config#config.skip_dirs).
-
-reset_skip_dirs(Config) ->
- Config#config{skip_dirs = new_skip_dirs()}.
-
-set_xconf(Config, Key, Value) ->
- NewXconf = dict:store(Key, Value, Config#config.xconf),
- Config#config{xconf=NewXconf}.
-
-get_xconf(Config, Key) ->
- {ok, Value} = dict:find(Key, Config#config.xconf),
- Value.
-
-get_xconf(Config, Key, Default) ->
- case dict:find(Key, Config#config.xconf) of
- error ->
- Default;
- {ok, Value} ->
- Value
- end.
-
-erase_xconf(Config, Key) ->
- NewXconf = dict:erase(Key, Config#config.xconf),
- Config#config{xconf = NewXconf}.
-
-command_args(#config{command_args=CmdArgs}) ->
- CmdArgs.
-
-command_args(Config, CmdArgs) ->
- Config#config{command_args=CmdArgs}.
-
-get_dep(#config{deps=Apps}, Name) ->
- lists:keyfind(Name, 2, Apps).
-
-deps(#config{deps=Apps}) ->
- Apps.
-
-deps(Config, Apps) ->
- Config#config{deps=Apps}.
-
-deps_graph(#config{deps_graph=Graph}) ->
- Graph.
-
-deps_graph(Config, Graph) ->
- Config#config{deps_graph=Graph}.
-
-get_app(#config{apps_to_build=Apps}, Name) ->
- lists:keyfind(Name, 2, Apps).
-
-apps_to_build(#config{apps_to_build=Apps}) ->
- Apps.
-
-apps_to_build(Config, Apps) ->
- Config#config{apps_to_build=Apps}.
-
-add_app(Config=#config{apps_to_build=Apps}, App) ->
- Config#config{apps_to_build=[App | Apps]}.
-
-replace_app(Config=#config{apps_to_build=Apps}, Name, App) ->
- Apps1 = lists:keydelete(Name, 2, Apps),
- Config#config{apps_to_build=[App | Apps1]}.
-
-deps_to_build(#config{deps_to_build=Apps}) ->
- Apps.
-
-add_dep(Config=#config{deps_to_build=Apps}, App) ->
- Config#config{deps_to_build=[App | Apps]}.
-
-providers(#config{providers=Providers}) ->
- Providers.
-
-providers(Config, NewProviders) ->
- Config#config{providers=NewProviders}.
-
-goals(#config{goals=Goals}) ->
- Goals.
-
-goals(Config, Goals) ->
- Config#config{goals=Goals}.
-
-add_provider(Config=#config{providers=Providers}, Provider) ->
- Config#config{providers=[Provider | Providers]}.
-
-create_logic_providers(ProviderModules, State0) ->
- lists:foldl(fun(ProviderMod, Acc) ->
- {ok, State1} = rebar_provider:new(ProviderMod, Acc),
- State1
- end, State0, ProviderModules).
-
%% ===================================================================
%% Internal functions
%% ===================================================================
consult_and_eval(File, Script) ->
?DEBUG("Evaluating config script ~p~n", [Script]),
- ConfigData = try_consult(File),
- file:script(Script, bs([{'CONFIG', ConfigData}, {'SCRIPT', Script}])).
+ StateData = try_consult(File),
+ file:script(Script, bs([{'CONFIG', StateData}, {'SCRIPT', Script}])).
remove_script_ext(F) ->
- "tpircs." ++ Rev = lists:reverse(F),
- lists:reverse(Rev).
+ filename:rootname(F, ".script").
try_consult(File) ->
case file:consult(File) of
@@ -324,11 +85,3 @@ bs(Vars) ->
lists:foldl(fun({K,V}, Bs) ->
erl_eval:add_binding(K, V, Bs)
end, erl_eval:new_bindings(), Vars).
-
-new_globals() -> dict:new().
-
-new_env() -> dict:new().
-
-new_skip_dirs() -> dict:new().
-
-new_xconf() -> dict:new().