File 0258-fix-logger_formatter-format-by-making-templates-line.patch of Package erlang

From fe36d8b1c767691265f55b665910a0d60d9bfb7e Mon Sep 17 00:00:00 2001
From: gfngfn <suwa-takashi141@g.ecc.u-tokyo.ac.jp>
Date: Tue, 31 May 2022 10:46:39 +0900
Subject: [PATCH] fix `logger_formatter:format` by making templates linear
 before split

This modification is for fixing a strange behavior of the
logger formatter about `msg` occurring at conditional branching
in logger templates; see
https://github.com/gfngfn/a_strange_behavior_of_logger_formatter
for example.
---
 lib/kernel/src/logger_formatter.erl        | 22 ++++++++++++++--------
 lib/kernel/test/logger_formatter_SUITE.erl | 14 +++++++++++++-
 2 files changed, 27 insertions(+), 9 deletions(-)

diff --git a/lib/kernel/src/logger_formatter.erl b/lib/kernel/src/logger_formatter.erl
index 579b4f8f73..f64ec85b32 100644
--- a/lib/kernel/src/logger_formatter.erl
+++ b/lib/kernel/src/logger_formatter.erl
@@ -48,7 +48,8 @@ format(#{level:=Level,msg:=Msg0,meta:=Meta},Config0)
     Config = add_default_config(Config0),
     Meta1 = maybe_add_legacy_header(Level,Meta,Config),
     Template = maps:get(template,Config),
-    {BT,AT0} = lists:splitwith(fun(msg) -> false; (_) -> true end, Template),
+    LinearTemplate = linearize_template(Meta1,Template),
+    {BT,AT0} = lists:splitwith(fun(msg) -> false; (_) -> true end, LinearTemplate),
     {DoMsg,AT} =
         case AT0 of
             [msg|Rest] -> {true,Rest};
@@ -89,6 +90,18 @@ format(#{level:=Level,msg:=Msg0,meta:=Meta},Config0)
         end,
     truncate(B,MsgStr,A,maps:get(max_size,Config)).
 
+linearize_template(Data,[{Key,IfExist,Else}|Format]) ->
+    BranchForUse =
+        case value(Key,Data) of
+            {ok,_Value} -> linearize_template(Data,IfExist);
+            error -> linearize_template(Data,Else)
+        end,
+    BranchForUse ++ linearize_template(Data,Format);
+linearize_template(Data,[StrOrKey|Format]) ->
+    [StrOrKey|linearize_template(Data,Format)];
+linearize_template(_Data,[]) ->
+    [].
+
 trim([H|T],Rev) when H==$\s; H==$\r; H==$\n ->
     trim(T,Rev);
 trim([H|T],false) when is_list(H) ->
@@ -110,13 +123,6 @@ trim(String,_) ->
 
 do_format(Level,Data,[level|Format],Config) ->
     [to_string(level,Level,Config)|do_format(Level,Data,Format,Config)];
-do_format(Level,Data,[{Key,IfExist,Else}|Format],Config) ->
-    String =
-        case value(Key,Data) of
-            {ok,Value} -> do_format(Level,Data#{Key=>Value},IfExist,Config);
-            error -> do_format(Level,Data,Else,Config)
-        end,
-    [String|do_format(Level,Data,Format,Config)];
 do_format(Level,Data,[Key|Format],Config)
   when is_atom(Key) orelse
        (is_list(Key) andalso is_atom(hd(Key))) ->
diff --git a/lib/kernel/test/logger_formatter_SUITE.erl b/lib/kernel/test/logger_formatter_SUITE.erl
index f1c64110a1..d160dce32f 100644
--- a/lib/kernel/test/logger_formatter_SUITE.erl
+++ b/lib/kernel/test/logger_formatter_SUITE.erl
@@ -272,7 +272,7 @@ template(_Config) ->
                                [[nested,subkey]]),
     String8 = format(info,{"~p",[term]},Meta8,#{template=>Template8,
                                                 single_line=>true}),
-    ct:log(String6),
+    ct:log(String8),
     SelfStr = pid_to_list(self()),
     RefStr8 = ref_to_list(Ref8),
     ListStr = "[list,\"string\",4321,#{},{tuple}]",
@@ -345,6 +345,18 @@ template(_Config) ->
         _ -> ct:fail({full_nested_map_unexpected,MultipleKeysStr10})
     end,
 
+    Meta11A = #{time=>Time,be_short=>ok},
+    Meta11B = #{time=>Time},
+    Template11 =
+        [{be_short,
+          ["short:",msg],
+          ["long:[",level,"]",msg]}],
+    String11A = format(info,{"~p",[term]},Meta11A,#{template=>Template11,single_line=>true}),
+    String11B = format(info,{"~p",[term]},Meta11B,#{template=>Template11,single_line=>true}),
+    ct:log(String11A),
+    ct:log(String11B),
+    {"short:term","long:[info]term"} = {String11A,String11B},
+
     ok.
 
 format_msg(_Config) ->
-- 
2.35.3

openSUSE Build Service is sponsored by