From c198ad21ae84272ecebfb0b1c3789ee87646222c Mon Sep 17 00:00:00 2001 From: JimMoen Date: Mon, 29 Apr 2024 15:56:05 +0800 Subject: [PATCH 1/6] feat: make avsc and i18n valid --- rebar.config | 6 +++++- src/emqx_plugrel.app.src | 4 +++- src/emqx_plugrel.erl | 45 +++++++++++++++++++++++++++++++++++++--- 3 files changed, 50 insertions(+), 5 deletions(-) diff --git a/rebar.config b/rebar.config index 0126a26..4f8413a 100644 --- a/rebar.config +++ b/rebar.config @@ -1,2 +1,6 @@ +%% -*- mode: erlang -*- {erl_opts, [debug_info]}. -{deps, [jsx]}. +{deps, [ + {jsx, {git, "https://github.com/talentdeficit/jsx", {tag, "v3.1.0"}}}, + {erlavro, {git, "https://github.com/emqx/erlavro.git", {tag, "2.10.0"}}} +]}. diff --git a/src/emqx_plugrel.app.src b/src/emqx_plugrel.app.src index 91fd30e..32b788e 100644 --- a/src/emqx_plugrel.app.src +++ b/src/emqx_plugrel.app.src @@ -4,7 +4,9 @@ {registered, []}, {applications, [kernel, - stdlib + stdlib, + jsx, + erlavro ]}, {env,[]}, {modules, []}, diff --git a/src/emqx_plugrel.erl b/src/emqx_plugrel.erl index 094b3fb..5a38063 100644 --- a/src/emqx_plugrel.erl +++ b/src/emqx_plugrel.erl @@ -1,5 +1,9 @@ -module(emqx_plugrel). +-feature(maybe_expr, enable). + +-include_lib("kernel/include/file.hrl"). + -export([init/1, do/1, format_error/1]). -define(METADATA_VSN, <<"0.1.0">>). @@ -45,7 +49,7 @@ do(State) -> end, {ok, State}. --spec format_error(any()) -> iolist(). +-spec format_error(any()) -> iolist(). format_error(Reason) -> io_lib:format("~p", [Reason]). @@ -146,8 +150,11 @@ do_make_tar(Cwd, NameWithVsn) -> maybe_copy_files(LibDir) -> lists:foreach( fun(F) -> - case file:read_file_info(F) of - {ok, _} -> rebar_file_utils:cp_r([F], LibDir); + maybe + true ?= filelib:is_regular(F), + true ?= validate_file(F), %% validate only when file existed + rebar_file_utils:cp_r([F], LibDir) + else _ -> ok end end, @@ -158,6 +165,38 @@ maybe_copy_files(LibDir) -> ), ok. +validate_file(?plugin_avsc_file = F) -> + validate_avsc(F); +validate_file(?plugin_i18n_file = F) -> + validate_i18n(F); +validate_file(F) -> + ?LOG(debug, "Skipping validate file ~ts", [F]), + true. + +validate_avsc(F) -> + {ok, Bin} = file:read_file(F), + try avro:decode_schema(Bin) of + _ -> + ?LOG(debug, "avsc file valid: ~ts", [F]), + true + catch + _ : _ -> + ?LOG(error, "Trying validate avsc file failed.", []), + error({failed_to_validate_avsc_file, F}) + end. + +validate_i18n(F) -> + {ok, Bin} = file:read_file(F), + try jsx:decode(Bin) of + _ -> + ?LOG(debug, "i18n file valid: ~ts", [F]), + true + catch + _ : _ -> + ?LOG(error, "Trying validate i18n file failed.", []), + error({failed_to_validate_i18n_file, F}) + end. + bin(X) -> iolist_to_binary(X). str_list(L) -> lists:map(fun bin/1, L). From 70bcaf8784e6a38681d396bc20068876f3472d00 Mon Sep 17 00:00:00 2001 From: JimMoen Date: Mon, 29 Apr 2024 18:08:48 +0800 Subject: [PATCH 2/6] fix: log stack trace for debugging --- src/emqx_plugrel.erl | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/src/emqx_plugrel.erl b/src/emqx_plugrel.erl index 5a38063..e579b55 100644 --- a/src/emqx_plugrel.erl +++ b/src/emqx_plugrel.erl @@ -176,12 +176,12 @@ validate_file(F) -> validate_avsc(F) -> {ok, Bin} = file:read_file(F), try avro:decode_schema(Bin) of - _ -> - ?LOG(debug, "avsc file valid: ~ts", [F]), + _ -> + ?LOG(debug, "Valid AVRO schema file: ~ts", [F]), true catch - _ : _ -> - ?LOG(error, "Trying validate avsc file failed.", []), + E : R : S -> + ?LOG(error, "Invalid AVRO schema file. Error = ~p, Reason = ~p, Stacktrace=~p", [E, R, S]), error({failed_to_validate_avsc_file, F}) end. @@ -189,11 +189,11 @@ validate_i18n(F) -> {ok, Bin} = file:read_file(F), try jsx:decode(Bin) of _ -> - ?LOG(debug, "i18n file valid: ~ts", [F]), + ?LOG(debug, "Valid i18n file: ~ts", [F]), true catch - _ : _ -> - ?LOG(error, "Trying validate i18n file failed.", []), + E : R : S -> + ?LOG(error, "Invalid i18n json file. Error = ~p, Reason = ~p, Stacktrace=~p", [E, R, S]), error({failed_to_validate_i18n_file, F}) end. From 341d8940454924b1fc53d8fc3319d372d10fbfa4 Mon Sep 17 00:00:00 2001 From: JimMoen Date: Mon, 29 Apr 2024 18:08:57 +0800 Subject: [PATCH 3/6] fix: replace jsx to jsone --- rebar.config | 1 - src/emqx_plugrel.app.src | 2 +- src/emqx_plugrel.erl | 4 ++-- 3 files changed, 3 insertions(+), 4 deletions(-) diff --git a/rebar.config b/rebar.config index 4f8413a..4bf88a6 100644 --- a/rebar.config +++ b/rebar.config @@ -1,6 +1,5 @@ %% -*- mode: erlang -*- {erl_opts, [debug_info]}. {deps, [ - {jsx, {git, "https://github.com/talentdeficit/jsx", {tag, "v3.1.0"}}}, {erlavro, {git, "https://github.com/emqx/erlavro.git", {tag, "2.10.0"}}} ]}. diff --git a/src/emqx_plugrel.app.src b/src/emqx_plugrel.app.src index 32b788e..19814e5 100644 --- a/src/emqx_plugrel.app.src +++ b/src/emqx_plugrel.app.src @@ -5,7 +5,7 @@ {applications, [kernel, stdlib, - jsx, + jsone, erlavro ]}, {env,[]}, diff --git a/src/emqx_plugrel.erl b/src/emqx_plugrel.erl index e579b55..5cb0f54 100644 --- a/src/emqx_plugrel.erl +++ b/src/emqx_plugrel.erl @@ -125,7 +125,7 @@ make_tar(#{name := Name, rel_vsn := Vsn, rel_apps := Apps} = Info, State) -> ok = filelib:ensure_dir(InfoFile), ok = maybe_copy_files(LibDir), %% write info file - ok = file:write_file(InfoFile, jsx:encode(Info, [space, {indent, 4}])), + ok = file:write_file(InfoFile, jsone:encode(Info, [{space, 1}, {indent, 4}])), %% copy apps to lib dir Sources = lists:map(fun(App) -> filename:join([BaseDir, "rel", Name, "lib", App]) end, Apps), ok = rebar_file_utils:cp_r(Sources, LibDir), @@ -187,7 +187,7 @@ validate_avsc(F) -> validate_i18n(F) -> {ok, Bin} = file:read_file(F), - try jsx:decode(Bin) of + try jsone:decode(Bin, [{object_format, map}]) of _ -> ?LOG(debug, "Valid i18n file: ~ts", [F]), true From 7162c262e2cbdd5dcd4faab4ffc014a972f18b05 Mon Sep 17 00:00:00 2001 From: JimMoen Date: Mon, 29 Apr 2024 23:17:36 +0800 Subject: [PATCH 4/6] fix: prevents forward slashes in a JSON string from being escaped --- src/emqx_plugrel.erl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/emqx_plugrel.erl b/src/emqx_plugrel.erl index 5cb0f54..4b8194b 100644 --- a/src/emqx_plugrel.erl +++ b/src/emqx_plugrel.erl @@ -125,7 +125,7 @@ make_tar(#{name := Name, rel_vsn := Vsn, rel_apps := Apps} = Info, State) -> ok = filelib:ensure_dir(InfoFile), ok = maybe_copy_files(LibDir), %% write info file - ok = file:write_file(InfoFile, jsone:encode(Info, [{space, 1}, {indent, 4}])), + ok = file:write_file(InfoFile, jsone:encode(Info, [native_forward_slash, {space, 1}, {indent, 4}])), %% copy apps to lib dir Sources = lists:map(fun(App) -> filename:join([BaseDir, "rel", Name, "lib", App]) end, Apps), ok = rebar_file_utils:cp_r(Sources, LibDir), From 367793adfe6f85ba1b570a5b3b226e605ad717de Mon Sep 17 00:00:00 2001 From: JimMoen Date: Mon, 29 Apr 2024 23:21:23 +0800 Subject: [PATCH 5/6] ci: use otp26 for `maybe` expressions --- .github/workflows/erlang.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/erlang.yml b/.github/workflows/erlang.yml index f6a1122..acfb5d7 100644 --- a/.github/workflows/erlang.yml +++ b/.github/workflows/erlang.yml @@ -13,7 +13,7 @@ jobs: runs-on: ubuntu-latest container: - image: erlang:23 + image: erlang:26 steps: - uses: actions/checkout@v2 From 955b02d9bc2b8c6f3e311fe5708c9bdd99978e9a Mon Sep 17 00:00:00 2001 From: JimMoen Date: Mon, 29 Apr 2024 23:24:18 +0800 Subject: [PATCH 6/6] test: move `maybe_expr` enable into rebar.config --- rebar.config | 4 +++- src/emqx_plugrel.erl | 4 ---- 2 files changed, 3 insertions(+), 5 deletions(-) diff --git a/rebar.config b/rebar.config index 4bf88a6..9fa61cf 100644 --- a/rebar.config +++ b/rebar.config @@ -1,5 +1,7 @@ %% -*- mode: erlang -*- -{erl_opts, [debug_info]}. + +{erl_opts, [debug_info, {feature, maybe_expr, enable}]}. + {deps, [ {erlavro, {git, "https://github.com/emqx/erlavro.git", {tag, "2.10.0"}}} ]}. diff --git a/src/emqx_plugrel.erl b/src/emqx_plugrel.erl index 4b8194b..5d20b0a 100644 --- a/src/emqx_plugrel.erl +++ b/src/emqx_plugrel.erl @@ -1,9 +1,5 @@ -module(emqx_plugrel). --feature(maybe_expr, enable). - --include_lib("kernel/include/file.hrl"). - -export([init/1, do/1, format_error/1]). -define(METADATA_VSN, <<"0.1.0">>).