aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rwxr-xr-xpriv/templates/extended_bin11
-rw-r--r--priv/templates/nodetool31
-rw-r--r--src/rlx_prv_overlay.erl4
-rw-r--r--test/rlx_release_SUITE.erl3
-rw-r--r--test/rlx_test_utils.erl1
5 files changed, 47 insertions, 3 deletions
diff --git a/priv/templates/extended_bin b/priv/templates/extended_bin
index b873958..8c523d9 100755
--- a/priv/templates/extended_bin
+++ b/priv/templates/extended_bin
@@ -441,9 +441,18 @@ case "$1" in
relx_nodetool rpcterms $@
;;
+ eval)
+ # Make sure a node IS running
+ if ! relx_nodetool "ping" > /dev/null; then
+ echo "Node is not running!"
+ exit 1
+ fi
+ shift
+ relx_nodetool "eval" $@
+ ;;
*)
- echo "Usage: $REL_NAME {start|start_boot <file>|foreground|stop|restart|reboot|pid|ping|console|console_clean|console_boot <file>|attach|remote_console|upgrade|escript|rpc|rpcterms}"
+ echo "Usage: $REL_NAME {start|start_boot <file>|foreground|stop|restart|reboot|pid|ping|console|console_clean|console_boot <file>|attach|remote_console|upgrade|escript|rpc|rpcterms|eval}"
exit 1
;;
esac
diff --git a/priv/templates/nodetool b/priv/templates/nodetool
index b3cd247..1f409f5 100644
--- a/priv/templates/nodetool
+++ b/priv/templates/nodetool
@@ -52,9 +52,38 @@ main(Args) ->
Other ->
io:format("~p\n", [Other])
end;
+ ["eval" | ListOfArgs] ->
+ % shells may process args into more than one, and end up stripping
+ % spaces, so this converts all of that to a single string to parse
+ String = binary_to_list(
+ list_to_binary(
+ string:join(ListOfArgs," ")
+ )
+ ),
+
+ % then just as a convenience to users, if they forgot a trailing
+ % '.' add it for them.
+ Normalized =
+ case lists:reverse(String) of
+ [$. | _] -> String;
+ R -> lists:reverse([$. | R])
+ end,
+
+ % then scan and parse the string
+ {ok, Scanned, _} = erl_scan:string(Normalized),
+ {ok, Parsed } = erl_parse:parse_exprs(Scanned),
+
+ % and evaluate it on the remote node
+ case rpc:call(TargetNode, erl_eval, exprs, [Parsed, [] ]) of
+ {value, Value, _} ->
+ io:format ("~p\n",[Value]);
+ {badrpc, Reason} ->
+ io:format("RPC to ~p failed: ~p\n", [TargetNode, Reason]),
+ halt(1)
+ end;
Other ->
io:format("Other: ~p\n", [Other]),
- io:format("Usage: nodetool {ping|stop|restart|reboot|rpc|rpcterms} [RPC]\n")
+ io:format("Usage: nodetool {ping|stop|restart|reboot|rpc|rpcterms|eval [Terms]} [RPC]\n")
end,
net_kernel:stop().
diff --git a/src/rlx_prv_overlay.erl b/src/rlx_prv_overlay.erl
index 412e5ba..becdb32 100644
--- a/src/rlx_prv_overlay.erl
+++ b/src/rlx_prv_overlay.erl
@@ -197,7 +197,9 @@ merge_overlay_vars(State, FileNames) ->
%% to the current one being read
OverlayRelativeRoot = filename:dirname(FileName),
NewTerms = check_overlay_inclusion(State, OverlayRelativeRoot, Terms),
- lists:ukeymerge(1, lists:ukeysort(1, NewTerms), Acc);
+ lists:foldl(fun(NewTerm, A) ->
+ lists:keystore(element(1, NewTerm), 1, A, NewTerm)
+ end, Acc, NewTerms);
{error, Reason} ->
ec_cmd_log:warn(rlx_state:log(State),
format_error({unable_to_read_varsfile, FileName, Reason})),
diff --git a/test/rlx_release_SUITE.erl b/test/rlx_release_SUITE.erl
index 710370a..780b1c8 100644
--- a/test/rlx_release_SUITE.erl
+++ b/test/rlx_release_SUITE.erl
@@ -550,6 +550,7 @@ overlay_release(Config) ->
VarsFile1 = filename:join([LibDir1, "vars1.config"]),
rlx_test_utils:write_config(VarsFile1, [{yahoo, "yahoo"},
{yahoo2, [{foo, "bar"}]},
+ {foo_yahoo, "foo_{{yahoo}}"},
{foo_dir, "foodir"}]),
VarsFile2 = filename:join([LibDir1, "vars2.config"]),
@@ -610,6 +611,8 @@ overlay_release(Config) ->
proplists:get_value(release_name, TemplateData)),
?assertEqual("yahoo/foo4",
proplists:get_value(yahoo4, TemplateData)),
+ ?assertEqual("foo_yahoo",
+ proplists:get_value(foo_yahoo, TemplateData)),
?assertEqual("yahoo",
proplists:get_value(google, TemplateData)).
diff --git a/test/rlx_test_utils.erl b/test/rlx_test_utils.erl
index 9db2835..1157e3f 100644
--- a/test/rlx_test_utils.erl
+++ b/test/rlx_test_utils.erl
@@ -77,4 +77,5 @@ test_template_contents() ->
"{yahoo4, \"{{yahoo4}}\"}.\n"
"{yahoo, \"{{yahoo}}\"}.\n"
"{foo_dir, \"{{foo_dir}}\"}.\n"
+ "{foo_yahoo, \"{{foo_yahoo}}\"}.\n"
"{google, \"{{google}}\"}.\n".