Просмотр исходного кода

fix sys.config include files. Overriding settings in include files were previously lost for user applications.

seb3s 7 лет назад
Родитель
Сommit
755cdf3512
1 измененных файлов с 27 добавлено и 13 удалено
  1. 27 13
      src/provision/mad_repl.erl

+ 27 - 13
src/provision/mad_repl.erl

@@ -26,7 +26,7 @@ parse_applist(AppList) ->
    Res = string:tokens(string:strip(string:strip(binary_to_list(AppList),right,$]),left,$[),","),
    [ list_to_atom(R) || R <-Res ]  -- disabled().
 
-load_config() ->
+load_sysconfig() ->
    Config = wildcards(["sys.config",lists:concat(["etc/",mad:host(),"/sys.config"])]),
    _Apps = case Config of
         [] -> case mad_repl:load_file("sys.config") of
@@ -34,25 +34,38 @@ load_config() ->
               {ok,Bin} -> parse(unicode:characters_to_list(Bin)) end;
       File -> case file:consult(hd(File)) of
               {error,_} -> [];
-              {ok,[A]} -> A end end.
+              {ok,[A]} -> merge_include(A, []) end end.
 
-load_config(AppConfigs,[]) ->
-    [ [ application:set_env(App,K,V) || {K,V} <- Cfg] || {App,Cfg} <- AppConfigs],
-    load_includes(AppConfigs).
+load_sysconfig(AppConfigs) ->
+    [[application:set_env(App,K,V) || {K,V} <- Cfg] || {App,Cfg} <- AppConfigs].
 
-load_includes(AppConfigs) ->
-    [ begin Apps = case file:consult(File) of
-                        {error,_} -> [];
-                        {ok,[A]} -> A end,
-             load_config(Apps, []) end || File <- AppConfigs, is_list(File) ].
+merge_include([], Acc) -> Acc;
+merge_include([H | Rest], Acc) -> merge_include(Rest, merge_config(H, Acc)).
+
+merge_config({App, NewConfig} = Add, Acc) ->
+    lists:keystore(App, 1, Acc, case lists:keyfind(App, 1, Acc) of
+        false ->  Add;
+        {App, AppConfigs} -> merge_config(App, AppConfigs, NewConfig)
+    end);
+
+merge_config(File, Acc) when is_list(File) ->
+    BFName = filename:basename(File, ".config"),
+    FName = filename:join(filename:dirname(File), BFName ++ ".config"),
+    case file:consult(FName) of
+        {ok,[A]} -> merge_include(A, Acc);
+        _ -> Acc
+    end.
+
+merge_config(App, AppConfigs, []) -> {App, AppConfigs};
+merge_config(App, AppConfigs, [{Key, _} = Tuple | Rest]) ->
+    merge_config(App, lists:keystore(Key, 1, AppConfigs, Tuple), Rest).
 
 acc_start(A,Acc) ->
     application:ensure_all_started(A), Acc.
 
 % for system application we just start, forgot about env merging
 
-load(true,A,Acc,Config) ->
-    load_config(Config,[]),
+load(true,A,Acc,_Config) ->
     acc_start(A,Acc);
 
 % for user application we should merge app from ebin and from sys.config
@@ -87,7 +100,8 @@ sh(Params) ->
     code:set_path(SystemPath++UserPath),
     code:add_path(filename:join([cwd(),filename:basename(escript:script_name())])),
     load(),
-    Config = load_config(),
+    Config = load_sysconfig(),
+    load_sysconfig(Config),
     Driver = mad_utils:get_value(shell_driver,_Config,user_drv),
     repl_intro(Config),
     case os:type() of