basic: add new merge_env_file function
merge_env_file is a new function, that's like load_env_file, but takes a pre-existing environment as an input argument. New environment entries are merged. Variable expansion is performed. Falling back to the process environment is supported (when a flag is set). Alternatively this could be implemented as passing an additional fallback environment array, but later on we're adding another flag to allow braceless expansion, and the two flags can be combined in one arg, so there's less stuff to pass around.
This commit is contained in:
committed by
Zbigniew Jędrzejewski-Szmek
parent
d8ad241f54
commit
37f3ffca27
@@ -112,6 +112,36 @@ static void test_strv_env_merge(void) {
|
||||
assert_se(strv_length(r) == 5);
|
||||
}
|
||||
|
||||
static void test_env_strv_get_n(void) {
|
||||
const char *_env[] = {
|
||||
"FOO=NO NO NO",
|
||||
"FOO=BAR BAR",
|
||||
"BAR=waldo",
|
||||
"PATH=unset",
|
||||
NULL
|
||||
};
|
||||
char **env = (char**) _env;
|
||||
|
||||
assert_se(streq(strv_env_get_n(env, "FOO__", 3, 0), "BAR BAR"));
|
||||
assert_se(streq(strv_env_get_n(env, "FOO__", 3, REPLACE_ENV_USE_ENVIRONMENT), "BAR BAR"));
|
||||
assert_se(streq(strv_env_get_n(env, "FOO", 3, 0), "BAR BAR"));
|
||||
assert_se(streq(strv_env_get_n(env, "FOO", 3, REPLACE_ENV_USE_ENVIRONMENT), "BAR BAR"));
|
||||
|
||||
assert_se(streq(strv_env_get_n(env, "PATH__", 4, 0), "unset"));
|
||||
assert_se(streq(strv_env_get_n(env, "PATH", 4, 0), "unset"));
|
||||
assert_se(streq(strv_env_get_n(env, "PATH__", 4, REPLACE_ENV_USE_ENVIRONMENT), "unset"));
|
||||
assert_se(streq(strv_env_get_n(env, "PATH", 4, REPLACE_ENV_USE_ENVIRONMENT), "unset"));
|
||||
|
||||
env[3] = NULL; /* kill our $PATH */
|
||||
|
||||
assert_se(!strv_env_get_n(env, "PATH__", 4, 0));
|
||||
assert_se(!strv_env_get_n(env, "PATH", 4, 0));
|
||||
assert_se(streq(strv_env_get_n(env, "PATH__", 4, REPLACE_ENV_USE_ENVIRONMENT),
|
||||
getenv("PATH")));
|
||||
assert_se(streq(strv_env_get_n(env, "PATH", 4, REPLACE_ENV_USE_ENVIRONMENT),
|
||||
getenv("PATH")));
|
||||
}
|
||||
|
||||
static void test_replace_env_arg(void) {
|
||||
const char *env[] = {
|
||||
"FOO=BAR BAR",
|
||||
@@ -225,6 +255,7 @@ int main(int argc, char *argv[]) {
|
||||
test_strv_env_unset();
|
||||
test_strv_env_set();
|
||||
test_strv_env_merge();
|
||||
test_env_strv_get_n();
|
||||
test_replace_env_arg();
|
||||
test_env_clean();
|
||||
test_env_name_is_valid();
|
||||
|
||||
@@ -206,6 +206,56 @@ static void test_parse_multiline_env_file(void) {
|
||||
unlink(p);
|
||||
}
|
||||
|
||||
static void test_merge_env_file(void) {
|
||||
char t[] = "/tmp/test-fileio-XXXXXX";
|
||||
int fd, r;
|
||||
FILE *f;
|
||||
_cleanup_strv_free_ char **a = NULL;
|
||||
char **i;
|
||||
|
||||
fd = mkostemp_safe(t);
|
||||
assert_se(fd >= 0);
|
||||
|
||||
log_info("/* %s (%s) */", __func__, t);
|
||||
|
||||
f = fdopen(fd, "w");
|
||||
assert_se(f);
|
||||
|
||||
r = write_string_stream(f,
|
||||
"one=1 \n"
|
||||
"twelve=${one}2\n"
|
||||
"twentyone=2${one}\n"
|
||||
"one=2\n"
|
||||
"twentytwo=2${one}\n", false);
|
||||
assert(r >= 0);
|
||||
|
||||
r = merge_env_file(&a, NULL, t);
|
||||
assert_se(r >= 0);
|
||||
strv_sort(a);
|
||||
|
||||
STRV_FOREACH(i, a)
|
||||
log_info("Got: <%s>", *i);
|
||||
|
||||
assert_se(streq(a[0], "one=2"));
|
||||
assert_se(streq(a[1], "twelve=12"));
|
||||
assert_se(streq(a[2], "twentyone=21"));
|
||||
assert_se(streq(a[3], "twentytwo=22"));
|
||||
assert_se(a[4] == NULL);
|
||||
|
||||
|
||||
r = merge_env_file(&a, NULL, t);
|
||||
assert_se(r >= 0);
|
||||
strv_sort(a);
|
||||
|
||||
STRV_FOREACH(i, a)
|
||||
log_info("Got2: <%s>", *i);
|
||||
|
||||
assert_se(streq(a[0], "one=2"));
|
||||
assert_se(streq(a[1], "twelve=12"));
|
||||
assert_se(streq(a[2], "twentyone=21"));
|
||||
assert_se(streq(a[3], "twentytwo=22"));
|
||||
assert_se(a[4] == NULL);
|
||||
}
|
||||
|
||||
static void test_executable_is_script(void) {
|
||||
char t[] = "/tmp/test-executable-XXXXXX";
|
||||
@@ -557,11 +607,13 @@ static void test_tempfn(void) {
|
||||
}
|
||||
|
||||
int main(int argc, char *argv[]) {
|
||||
log_set_max_level(LOG_DEBUG);
|
||||
log_parse_environment();
|
||||
log_open();
|
||||
|
||||
test_parse_env_file();
|
||||
test_parse_multiline_env_file();
|
||||
test_merge_env_file();
|
||||
test_executable_is_script();
|
||||
test_status_field();
|
||||
test_capeff();
|
||||
|
||||
Reference in New Issue
Block a user