mirror of
https://github.com/systemd/systemd
synced 2024-10-01 13:55:20 +00:00
Merge pull request #33376 from yuwata/strv_sort_uniq
strv: introduce strv_sort_uniq()
This commit is contained in:
commit
5d42acada4
|
@ -941,11 +941,11 @@ int replace_env_argv(
|
||||||
}
|
}
|
||||||
|
|
||||||
if (ret_unset_variables) {
|
if (ret_unset_variables) {
|
||||||
strv_uniq(strv_sort(unset_variables));
|
strv_sort_uniq(unset_variables);
|
||||||
*ret_unset_variables = TAKE_PTR(unset_variables);
|
*ret_unset_variables = TAKE_PTR(unset_variables);
|
||||||
}
|
}
|
||||||
if (ret_bad_variables) {
|
if (ret_bad_variables) {
|
||||||
strv_uniq(strv_sort(bad_variables));
|
strv_sort_uniq(bad_variables);
|
||||||
*ret_bad_variables = TAKE_PTR(bad_variables);
|
*ret_bad_variables = TAKE_PTR(bad_variables);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -706,6 +706,21 @@ char** strv_sort(char **l) {
|
||||||
return l;
|
return l;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
char** strv_sort_uniq(char **l) {
|
||||||
|
if (strv_isempty(l))
|
||||||
|
return l;
|
||||||
|
|
||||||
|
char **tail = strv_sort(l), *prev = NULL;
|
||||||
|
STRV_FOREACH(i, l)
|
||||||
|
if (streq_ptr(*i, prev))
|
||||||
|
free(*i);
|
||||||
|
else
|
||||||
|
*(tail++) = prev = *i;
|
||||||
|
|
||||||
|
*tail = NULL;
|
||||||
|
return l;
|
||||||
|
}
|
||||||
|
|
||||||
int strv_compare(char * const *a, char * const *b) {
|
int strv_compare(char * const *a, char * const *b) {
|
||||||
int r;
|
int r;
|
||||||
|
|
||||||
|
|
|
@ -161,6 +161,7 @@ bool strv_overlap(char * const *a, char * const *b) _pure_;
|
||||||
_STRV_FOREACH_PAIR(x, y, l, UNIQ_T(i, UNIQ))
|
_STRV_FOREACH_PAIR(x, y, l, UNIQ_T(i, UNIQ))
|
||||||
|
|
||||||
char** strv_sort(char **l);
|
char** strv_sort(char **l);
|
||||||
|
char** strv_sort_uniq(char **l);
|
||||||
void strv_print_full(char * const *l, const char *prefix);
|
void strv_print_full(char * const *l, const char *prefix);
|
||||||
static inline void strv_print(char * const *l) {
|
static inline void strv_print(char * const *l) {
|
||||||
strv_print_full(l, NULL);
|
strv_print_full(l, NULL);
|
||||||
|
|
|
@ -1519,8 +1519,7 @@ int get_timezones(char ***ret) {
|
||||||
if (r < 0)
|
if (r < 0)
|
||||||
return r;
|
return r;
|
||||||
|
|
||||||
strv_sort(zones);
|
strv_sort_uniq(zones);
|
||||||
strv_uniq(zones);
|
|
||||||
|
|
||||||
*ret = TAKE_PTR(zones);
|
*ret = TAKE_PTR(zones);
|
||||||
return 0;
|
return 0;
|
||||||
|
|
|
@ -329,8 +329,7 @@ static int parse_argv(int argc, char *argv[]) {
|
||||||
return log_oom();
|
return log_oom();
|
||||||
}
|
}
|
||||||
|
|
||||||
strv_sort(arg_banks);
|
strv_sort_uniq(arg_banks);
|
||||||
strv_uniq(arg_banks);
|
|
||||||
|
|
||||||
if (arg_current)
|
if (arg_current)
|
||||||
for (UnifiedSection us = 0; us < _UNIFIED_SECTION_MAX; us++)
|
for (UnifiedSection us = 0; us < _UNIFIED_SECTION_MAX; us++)
|
||||||
|
@ -347,10 +346,8 @@ static int parse_argv(int argc, char *argv[]) {
|
||||||
"enter-initrd:leave-initrd:sysinit",
|
"enter-initrd:leave-initrd:sysinit",
|
||||||
"enter-initrd:leave-initrd:sysinit:ready") < 0)
|
"enter-initrd:leave-initrd:sysinit:ready") < 0)
|
||||||
return log_oom();
|
return log_oom();
|
||||||
} else {
|
} else
|
||||||
strv_sort(arg_phase);
|
strv_sort_uniq(arg_phase);
|
||||||
strv_uniq(arg_phase);
|
|
||||||
}
|
|
||||||
|
|
||||||
_cleanup_free_ char *j = NULL;
|
_cleanup_free_ char *j = NULL;
|
||||||
j = strv_join(arg_phase, ", ");
|
j = strv_join(arg_phase, ", ");
|
||||||
|
|
|
@ -3836,8 +3836,7 @@ static int parse_argv(int argc, char *argv[]) {
|
||||||
if (r < 0)
|
if (r < 0)
|
||||||
return log_oom();
|
return log_oom();
|
||||||
|
|
||||||
strv_sort(list);
|
strv_sort_uniq(list);
|
||||||
strv_uniq(list);
|
|
||||||
|
|
||||||
mo = sd_json_variant_unref(mo);
|
mo = sd_json_variant_unref(mo);
|
||||||
r = sd_json_variant_new_array_strv(&mo, list);
|
r = sd_json_variant_new_array_strv(&mo, list);
|
||||||
|
|
|
@ -374,8 +374,7 @@ static int list_x11_keymaps(int argc, char **argv, void *userdata) {
|
||||||
return log_error_errno(SYNTHETIC_ERRNO(ENOENT),
|
return log_error_errno(SYNTHETIC_ERRNO(ENOENT),
|
||||||
"Couldn't find any entries.");
|
"Couldn't find any entries.");
|
||||||
|
|
||||||
strv_sort(list);
|
strv_sort_uniq(list);
|
||||||
strv_uniq(list);
|
|
||||||
|
|
||||||
pager_open(arg_pager_flags);
|
pager_open(arg_pager_flags);
|
||||||
|
|
||||||
|
|
|
@ -58,8 +58,7 @@ static int access_check_var_log_journal(sd_journal *j, bool want_other_users) {
|
||||||
if (r < 0)
|
if (r < 0)
|
||||||
return log_oom();
|
return log_oom();
|
||||||
|
|
||||||
strv_sort(g);
|
strv_sort_uniq(g);
|
||||||
strv_uniq(g);
|
|
||||||
|
|
||||||
s = strv_join(g, "', '");
|
s = strv_join(g, "', '");
|
||||||
if (!s)
|
if (!s)
|
||||||
|
|
|
@ -1436,8 +1436,7 @@ int membershipdb_by_group_strv(const char *name, UserDBFlags flags, char ***ret)
|
||||||
return r;
|
return r;
|
||||||
}
|
}
|
||||||
|
|
||||||
strv_sort(members);
|
strv_sort_uniq(members);
|
||||||
strv_uniq(members);
|
|
||||||
|
|
||||||
*ret = TAKE_PTR(members);
|
*ret = TAKE_PTR(members);
|
||||||
return 0;
|
return 0;
|
||||||
|
|
|
@ -453,8 +453,7 @@ static int run(const char *dest, const char *dest_early, const char *dest_late)
|
||||||
|
|
||||||
(void) parse_credentials();
|
(void) parse_credentials();
|
||||||
|
|
||||||
strv_sort(arg_listen_extra);
|
strv_sort_uniq(arg_listen_extra);
|
||||||
strv_uniq(arg_listen_extra);
|
|
||||||
|
|
||||||
if (!arg_auto && strv_isempty(arg_listen_extra)) {
|
if (!arg_auto && strv_isempty(arg_listen_extra)) {
|
||||||
log_debug("Disabling SSH generator logic, because as it has been turned off explicitly.");
|
log_debug("Disabling SSH generator logic, because as it has been turned off explicitly.");
|
||||||
|
|
|
@ -362,8 +362,7 @@ static int putgrent_with_members(
|
||||||
if (added) {
|
if (added) {
|
||||||
struct group t;
|
struct group t;
|
||||||
|
|
||||||
strv_uniq(l);
|
strv_sort_uniq(l);
|
||||||
strv_sort(l);
|
|
||||||
|
|
||||||
t = *gr;
|
t = *gr;
|
||||||
t.gr_mem = l;
|
t.gr_mem = l;
|
||||||
|
@ -411,8 +410,7 @@ static int putsgent_with_members(
|
||||||
if (added) {
|
if (added) {
|
||||||
struct sgrp t;
|
struct sgrp t;
|
||||||
|
|
||||||
strv_uniq(l);
|
strv_sort_uniq(l);
|
||||||
strv_sort(l);
|
|
||||||
|
|
||||||
t = *sg;
|
t = *sg;
|
||||||
t.sg_mem = l;
|
t.sg_mem = l;
|
||||||
|
|
|
@ -527,6 +527,81 @@ TEST(strv_sort) {
|
||||||
ASSERT_STREQ(input_table[4], "durian");
|
ASSERT_STREQ(input_table[4], "durian");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
TEST(strv_sort_uniq) {
|
||||||
|
static const char* input_table[] = {
|
||||||
|
"durian",
|
||||||
|
"apple",
|
||||||
|
"citrus",
|
||||||
|
"CAPITAL LETTERS FIRST",
|
||||||
|
"banana",
|
||||||
|
"durian",
|
||||||
|
"apple",
|
||||||
|
"citrus",
|
||||||
|
"CAPITAL LETTERS FIRST",
|
||||||
|
"banana",
|
||||||
|
"durian",
|
||||||
|
"apple",
|
||||||
|
"citrus",
|
||||||
|
"CAPITAL LETTERS FIRST",
|
||||||
|
"banana",
|
||||||
|
NULL
|
||||||
|
};
|
||||||
|
|
||||||
|
_cleanup_strv_free_ char **a = NULL, **b = NULL, **c = NULL;
|
||||||
|
|
||||||
|
ASSERT_NULL(strv_sort_uniq(a));
|
||||||
|
|
||||||
|
ASSERT_NOT_NULL(a = strv_new(NULL));
|
||||||
|
assert_se(strv_sort_uniq(a) == a);
|
||||||
|
ASSERT_NULL(a[0]);
|
||||||
|
a = strv_free(a);
|
||||||
|
|
||||||
|
ASSERT_NOT_NULL(a = strv_new("a", "a", "a", "a", "a"));
|
||||||
|
assert_se(strv_sort_uniq(a) == a);
|
||||||
|
ASSERT_STREQ(a[0], "a");
|
||||||
|
ASSERT_NULL(a[1]);
|
||||||
|
a = strv_free(a);
|
||||||
|
|
||||||
|
ASSERT_NOT_NULL(a = strv_new("a", "a", "a", "a", "b"));
|
||||||
|
assert_se(strv_sort_uniq(a) == a);
|
||||||
|
ASSERT_STREQ(a[0], "a");
|
||||||
|
ASSERT_STREQ(a[1], "b");
|
||||||
|
ASSERT_NULL(a[2]);
|
||||||
|
a = strv_free(a);
|
||||||
|
|
||||||
|
ASSERT_NOT_NULL(a = strv_new("b", "a", "a", "a", "a"));
|
||||||
|
assert_se(strv_sort_uniq(a) == a);
|
||||||
|
ASSERT_STREQ(a[0], "a");
|
||||||
|
ASSERT_STREQ(a[1], "b");
|
||||||
|
ASSERT_NULL(a[2]);
|
||||||
|
a = strv_free(a);
|
||||||
|
|
||||||
|
ASSERT_NOT_NULL(a = strv_new("a", "a", "b", "a", "b"));
|
||||||
|
assert_se(strv_sort_uniq(a) == a);
|
||||||
|
ASSERT_STREQ(a[0], "a");
|
||||||
|
ASSERT_STREQ(a[1], "b");
|
||||||
|
ASSERT_NULL(a[2]);
|
||||||
|
a = strv_free(a);
|
||||||
|
|
||||||
|
ASSERT_NOT_NULL(a = strv_copy((char**) input_table));
|
||||||
|
ASSERT_NOT_NULL(b = strv_copy((char**) input_table));
|
||||||
|
ASSERT_NOT_NULL(c = strv_copy((char**) input_table));
|
||||||
|
|
||||||
|
assert_se(strv_sort_uniq(a) == a);
|
||||||
|
assert_se(strv_sort(strv_uniq(b)) == b);
|
||||||
|
assert_se(strv_uniq(strv_sort(c)) == c);
|
||||||
|
|
||||||
|
assert_se(strv_equal(a, b));
|
||||||
|
assert_se(strv_equal(a, c));
|
||||||
|
|
||||||
|
ASSERT_STREQ(a[0], "CAPITAL LETTERS FIRST");
|
||||||
|
ASSERT_STREQ(a[1], "apple");
|
||||||
|
ASSERT_STREQ(a[2], "banana");
|
||||||
|
ASSERT_STREQ(a[3], "citrus");
|
||||||
|
ASSERT_STREQ(a[4], "durian");
|
||||||
|
ASSERT_NULL(a[5]);
|
||||||
|
}
|
||||||
|
|
||||||
TEST(strv_extend_strv_biconcat) {
|
TEST(strv_extend_strv_biconcat) {
|
||||||
_cleanup_strv_free_ char **a = NULL, **b = NULL;
|
_cleanup_strv_free_ char **a = NULL, **b = NULL;
|
||||||
|
|
||||||
|
|
|
@ -336,7 +336,7 @@ static int verb_introspect(int argc, char *argv[], void *userdata) {
|
||||||
if (strv_isempty(auto_interfaces))
|
if (strv_isempty(auto_interfaces))
|
||||||
return log_error_errno(SYNTHETIC_ERRNO(ENXIO), "Service doesn't report any implemented interfaces.");
|
return log_error_errno(SYNTHETIC_ERRNO(ENXIO), "Service doesn't report any implemented interfaces.");
|
||||||
|
|
||||||
interfaces = strv_sort(strv_uniq(auto_interfaces));
|
interfaces = strv_sort_uniq(auto_interfaces);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Automatically switch on JSON_SEQ if we output multiple JSON objects */
|
/* Automatically switch on JSON_SEQ if we output multiple JSON objects */
|
||||||
|
@ -405,7 +405,7 @@ static int verb_introspect(int argc, char *argv[], void *userdata) {
|
||||||
if (list_methods) {
|
if (list_methods) {
|
||||||
pager_open(arg_pager_flags);
|
pager_open(arg_pager_flags);
|
||||||
|
|
||||||
strv_sort(strv_uniq(methods));
|
strv_sort_uniq(methods);
|
||||||
|
|
||||||
if (FLAGS_SET(arg_json_format_flags, SD_JSON_FORMAT_OFF))
|
if (FLAGS_SET(arg_json_format_flags, SD_JSON_FORMAT_OFF))
|
||||||
strv_print(methods);
|
strv_print(methods);
|
||||||
|
|
Loading…
Reference in a new issue