File 3611-kernel-Add-os-env-0.patch of Package erlang
From 021f9aeaebee25b71ac5b06f7a5662d1358dfde1 Mon Sep 17 00:00:00 2001
From: Sverker Eriksson <sverker@erlang.org>
Date: Thu, 3 Sep 2020 15:27:34 +0200
Subject: [PATCH] kernel: Add os:env/0
as a nicer name for undocumented os:list_env_vars/0
---
erts/emulator/beam/bif.tab | 2 +-
erts/emulator/beam/erl_bif_os.c | 2 +-
lib/kernel/doc/src/os.xml | 17 +++++++++++++++++
lib/kernel/src/os.erl | 8 ++++----
lib/kernel/test/os_SUITE.erl | 15 +++++++++++++++
5 files changed, 38 insertions(+), 6 deletions(-)
diff --git a/erts/emulator/beam/bif.tab b/erts/emulator/beam/bif.tab
index d1920bd072..a7e45c0da6 100644
--- a/erts/emulator/beam/bif.tab
+++ b/erts/emulator/beam/bif.tab
@@ -394,7 +394,7 @@ bif ets:match_spec_run_r/3
bif os:get_env_var/1
bif os:set_env_var/2
bif os:unset_env_var/1
-bif os:list_env_vars/0
+bif os:env/0
bif os:getpid/0
bif os:timestamp/0
bif os:system_time/0
diff --git a/erts/emulator/beam/erl_bif_os.c b/erts/emulator/beam/erl_bif_os.c
index ce2b27409b..65302b99f9 100644
--- a/erts/emulator/beam/erl_bif_os.c
+++ b/erts/emulator/beam/erl_bif_os.c
@@ -77,7 +77,7 @@ static void os_getenv_foreach(Process *process, Eterm *result, Eterm key, Eterm
(*result) = CONS(hp, kvp_term, (*result));
}
-BIF_RETTYPE os_list_env_vars_0(BIF_ALIST_0)
+BIF_RETTYPE os_env_0(BIF_ALIST_0)
{
const erts_osenv_t *global_env;
Eterm result = NIL;
diff --git a/lib/kernel/doc/src/os.xml b/lib/kernel/doc/src/os.xml
index 666aca988f..33b8dbcdb7 100644
--- a/lib/kernel/doc/src/os.xml
+++ b/lib/kernel/doc/src/os.xml
@@ -172,6 +172,21 @@ DirOut = os:cmd("dir"), % on Win32 platform</code>
</desc>
</func>
+ <func>
+ <name name="env" arity="0" since="OTP 24.0"/>
+ <fsummary>List all environment variables.</fsummary>
+ <desc>
+ <p>Returns a list of all environment variables.
+ Each environment variable is expressed as a tuple
+ <c>{VarName,Value}</c>, where <c>VarName</c> is the name of
+ the variable and <c>Value</c> its value.</p>
+ <p>If Unicode filename encoding is in effect (see the
+ <seecom marker="erts:erl#file_name_encoding"><c>erl</c> manual
+ page</seecom>), the strings can contain characters with
+ codepoints > 255.</p>
+ </desc>
+ </func>
+
<func>
<name name="find_executable" arity="1" since=""/>
<name name="find_executable" arity="2" since=""/>
@@ -201,6 +216,8 @@ DirOut = os:cmd("dir"), % on Win32 platform</code>
<seecom marker="erts:erl#file_name_encoding"><c>erl</c> manual
page</seecom>), the strings can contain characters with
codepoints > 255.</p>
+ <p>Consider using <seemfa marker="#env/0"><c>env/0</c></seemfa>
+ for a nicer 2-tuple format.</p>
</desc>
</func>
diff --git a/lib/kernel/src/os.erl b/lib/kernel/src/os.erl
index b1488f1390..27c40ff5c1 100644
--- a/lib/kernel/src/os.erl
+++ b/lib/kernel/src/os.erl
@@ -31,7 +31,7 @@
%%% BIFs
--export([get_env_var/1, getpid/0, list_env_vars/0, perf_counter/0,
+-export([get_env_var/1, getpid/0, env/0, perf_counter/0,
perf_counter/1, set_env_var/2, set_signal/2, system_time/0,
system_time/1, timestamp/0, unset_env_var/1]).
@@ -46,8 +46,8 @@
-type env_var_name_value() :: nonempty_string().
--spec list_env_vars() -> [{env_var_name(), env_var_value()}].
-list_env_vars() ->
+-spec env() -> [{env_var_name(), env_var_value()}].
+env() ->
erlang:nif_error(undef).
-spec get_env_var(VarName) -> Value | false when
@@ -115,7 +115,7 @@ set_signal(_Signal, _Option) ->
-spec getenv() -> [env_var_name_value()].
getenv() ->
- [lists:flatten([Key, $=, Value]) || {Key, Value} <- os:list_env_vars() ].
+ [lists:flatten([Key, $=, Value]) || {Key, Value} <- os:env() ].
-spec getenv(VarName) -> Value | false when
VarName :: env_var_name(),
diff --git a/lib/kernel/test/os_SUITE.erl b/lib/kernel/test/os_SUITE.erl
index e952dec625..ad089132bd 100644
--- a/lib/kernel/test/os_SUITE.erl
+++ b/lib/kernel/test/os_SUITE.erl
@@ -23,6 +23,7 @@
init_per_group/2,end_per_group/2,
init_per_testcase/2,end_per_testcase/2]).
-export([space_in_cwd/1, quoting/1, cmd_unicode/1,
+ env/1,
null_in_command/1, space_in_name/1, bad_command/1,
find_executable/1, unix_comment_in_command/1, deep_list_command/1,
large_output_command/1, background_command/0, background_command/1,
@@ -38,6 +39,7 @@ suite() ->
all() ->
[space_in_cwd, quoting, cmd_unicode, null_in_command,
space_in_name, bad_command,
+ env,
find_executable, unix_comment_in_command, deep_list_command,
large_output_command, background_command, message_leak,
close_stdin, max_size_command, perf_counter_api].
@@ -71,6 +73,19 @@ init_per_testcase(_TC,Config) ->
end_per_testcase(_,_Config) ->
ok.
+env(Config) when is_list(Config) ->
+ Env0 = os:env(),
+ GetEnv0 = os:getenv(),
+ lists:foldl(fun({K,V}, [KV | T]) ->
+ KV = K ++ "=" ++ V,
+ V = os:getenv(K),
+ V = os:getenv(K, default),
+ T
+ end,
+ GetEnv0,
+ Env0),
+ ok.
+
%% Test that executing a command in a current working directory
%% with space in its name works.
space_in_cwd(Config) when is_list(Config) ->
--
2.26.2