Browse Source

solve @seb3s problem with mergin env settings from both .app files and root sys.config overrides at early stages of booting OTP applications

Namdak Tonpa 8 years ago
parent
commit
059f59dbcf
3 changed files with 12 additions and 15 deletions
  1. 1 1
      include/mad.hrl
  2. BIN
      mad
  3. 11 14
      src/provision/mad_repl.erl

+ 1 - 1
include/mad.hrl

@@ -1 +1 @@
--define(VERSION,"a35d0e").
+-define(VERSION,"cbe5cc").

BIN
mad


+ 11 - 14
src/provision/mad_repl.erl

@@ -46,23 +46,20 @@ load_includes(AppConfigs) ->
                         {ok,[A]} -> A end,
              load_config(Apps, []) end || File <- AppConfigs, is_list(File) ].
 
-acc_start(A,Acc,Config) when is_tuple(A) -> % If "A" is app descriptor we extend the env information
-    AppName = element(2, A),
-    Filter=fun({Elem,Rest}) when Elem =:= AppName -> { true, Rest }; (_) -> false end,
-    SysConfigs = lists:flatten(lists:filtermap(Filter,Config)),
-    Map=fun({env=K,V}) -> {K, V++SysConfigs}; ({K,V}) -> {K,V} end,
-    setelement(3, A, lists:map(Map, element(3,A)));
-acc_start(A,Acc,Config) -> A.
+acc_start(A,Acc,Config) ->
+    application:ensure_all_started(A), Acc.
 
 load_apps([],Config,_Acc) ->
-    load_config(Config,[]),
-    AppList=applist(),
     lists:foldl(fun(A,Acc) -> case lists:member(A,system()) of
-        true -> acc_start(A,Acc,Config);
-        _ -> case load_config(A) of
-            [] -> acc_start(A,Acc,Config);
-            E  -> acc_start(E,Acc,Config) end end end,[], AppList),
-    [ application:ensure_all_started(A) || A <- AppList ];
+         true -> load_config(Config,[]),
+                 acc_start(A,Acc,Config);
+            _ -> X = load_config(A),
+                 {application,Name,Map} = X,
+                 [ application:set_env(Name,K,V) || {K,V} <- proplists:get_value(env,Map,[]) ],
+                 load_config(Config,[]),
+                 case X of
+                      [] -> acc_start(A,Acc,X);
+                      _E -> acc_start(_E,Acc,X) end end end,[], applist());
 load_apps(["applist"],Config,Acc) -> load_apps([],Config,Acc);
 load_apps(Params,_,_Acc) -> [ application:ensure_all_started(list_to_atom(A))||A<-Params].