mkosi: Add zsh to Arch packages

Useful for testing zsh completion changes.
This commit is contained in:
Daan De Meyer 2021-08-23 16:44:58 +01:00
parent e11ca6bb4d
commit 8de7929de5
6 changed files with 96 additions and 15 deletions

View file

@ -56,3 +56,6 @@ Packages=
man-db
# For testing systemd's bash completion scripts.
bash-completion
# For testing systemd's zsh completion scripts
# Run `autoload -Uz compinit; compinit` from a zsh shell in the booted image to enable completions.
zsh

View file

@ -1123,6 +1123,20 @@ Service b@0.service not loaded, b.socket cannot be started.
to the specified point in time. If not specified defaults to the current time.</para></listitem>
</varlistentry>
<varlistentry>
<term><option>--unit=<replaceable>UNIT</replaceable></option></term>
<listitem><para>When used with the <command>condition</command> command, evaluate all the
<varname index="false">Condition*=...</varname> and <varname index="false">Assert*=...</varname>
assignments in the specified unit file. The full unit search path is formed by combining the
directories for the specified unit with the usual unit load paths. The variable
<varname>$SYSTEMD_UNIT_PATH</varname> is supported, and may be used to replace or augment the
compiled in set of unit load paths; see
<citerefentry><refentrytitle>systemd.unit</refentrytitle><manvolnum>5</manvolnum></citerefentry>. All
units files present in the directory containing the specified unit will be used in preference to the
other paths.</para></listitem>
</varlistentry>
<xi:include href="user-system-options.xml" xpointer="host" />
<xi:include href="user-system-options.xml" xpointer="machine" />

View file

@ -55,13 +55,14 @@ _systemd_analyze() {
)
local -A VERBS=(
[STANDALONE]='time blame plot dump unit-paths exit-status condition calendar timestamp timespan'
[STANDALONE]='time blame plot dump unit-paths exit-status calendar timestamp timespan'
[CRITICAL_CHAIN]='critical-chain'
[DOT]='dot'
[VERIFY]='verify'
[SECCOMP_FILTER]='syscall-filter'
[CAT_CONFIG]='cat-config'
[SECURITY]='security'
[CONDITION]='condition'
)
local CONFIGS='systemd/bootchart.conf systemd/coredump.conf systemd/journald.conf
@ -153,6 +154,18 @@ _systemd_analyze() {
fi
comps=$( __get_services $mode )
fi
elif __contains_word "$verb" ${VERBS[CONDITION]}; then
if [[ $cur = -* ]]; then
comps='--help --version --system --user --global --no-pager --root --image'
elif [[ $prev = "-u" ]] || [[ $prev = "--unit" ]]; then
if __contains_word "--user" ${COMP_WORDS[*]}; then
mode=--user
else
mode=--system
fi
comps=$( __get_services $mode )
fi
fi
COMPREPLY=( $(compgen -W '$comps' -- "$cur") )

View file

@ -3,6 +3,7 @@
#include <stdlib.h>
#include "analyze-condition.h"
#include "analyze-verify.h"
#include "condition.h"
#include "conf-parser.h"
#include "load-fragment.h"
@ -72,29 +73,57 @@ static int log_helper(void *userdata, int level, int error, const char *file, in
return r;
}
int verify_conditions(char **lines, UnitFileScope scope) {
int verify_conditions(char **lines, UnitFileScope scope, const char *unit, const char *root) {
_cleanup_(manager_freep) Manager *m = NULL;
Unit *u;
char **line;
int r, q = 1;
if (unit) {
_cleanup_strv_free_ char **filenames = NULL;
_cleanup_free_ char *var = NULL;
filenames = strv_new(unit);
if (!filenames)
return log_oom();
r = verify_generate_path(&var, filenames);
if (r < 0)
return log_error_errno(r, "Failed to generate unit load path: %m");
assert_se(set_unit_path(var) >= 0);
}
r = manager_new(scope, MANAGER_TEST_RUN_MINIMAL, &m);
if (r < 0)
return log_error_errno(r, "Failed to initialize manager: %m");
log_debug("Starting manager...");
r = manager_startup(m, /* serialization= */ NULL, /* fds= */ NULL, /* root= */ NULL);
r = manager_startup(m, /* serialization= */ NULL, /* fds= */ NULL, root);
if (r < 0)
return r;
r = unit_new_for_name(m, sizeof(Service), "test.service", &u);
if (r < 0)
return log_error_errno(r, "Failed to create test.service: %m");
if (unit) {
_cleanup_free_ char *prepared = NULL;
STRV_FOREACH(line, lines) {
r = parse_condition(u, *line);
r = verify_prepare_filename(unit, &prepared);
if (r < 0)
return log_error_errno(r, "Failed to prepare filename %s: %m", unit);
r = manager_load_startable_unit_or_warn(m, NULL, prepared, &u);
if (r < 0)
return r;
} else {
char **line;
r = unit_new_for_name(m, sizeof(Service), "test.service", &u);
if (r < 0)
return log_error_errno(r, "Failed to create test.service: %m");
STRV_FOREACH(line, lines) {
r = parse_condition(u, *line);
if (r < 0)
return r;
}
}
r = condition_test_list(u->asserts, environ, assert_type_to_string, log_helper, u);

View file

@ -3,4 +3,4 @@
#include "install.h"
int verify_conditions(char **lines, UnitFileScope scope);
int verify_conditions(char **lines, UnitFileScope scope, const char *unit, const char *root);

View file

@ -96,12 +96,14 @@ static bool arg_offline = false;
static unsigned arg_threshold = 100;
static unsigned arg_iterations = 1;
static usec_t arg_base_time = USEC_INFINITY;
static char *arg_unit = NULL;
STATIC_DESTRUCTOR_REGISTER(arg_dot_from_patterns, strv_freep);
STATIC_DESTRUCTOR_REGISTER(arg_dot_to_patterns, strv_freep);
STATIC_DESTRUCTOR_REGISTER(arg_root, freep);
STATIC_DESTRUCTOR_REGISTER(arg_image, freep);
STATIC_DESTRUCTOR_REGISTER(arg_security_policy, freep);
STATIC_DESTRUCTOR_REGISTER(arg_unit, freep);
typedef struct BootTimes {
usec_t firmware_time;
@ -2147,7 +2149,7 @@ static int service_watchdogs(int argc, char *argv[], void *userdata) {
}
static int do_condition(int argc, char *argv[], void *userdata) {
return verify_conditions(strv_skip(argv, 1), arg_scope);
return verify_conditions(strv_skip(argv, 1), arg_scope, arg_unit, arg_root);
}
static int do_verify(int argc, char *argv[], void *userdata) {
@ -2327,6 +2329,7 @@ static int parse_argv(int argc, char *argv[]) {
{ "machine", required_argument, NULL, 'M' },
{ "iterations", required_argument, NULL, ARG_ITERATIONS },
{ "base-time", required_argument, NULL, ARG_BASE_TIME },
{ "unit", required_argument, NULL, 'U' },
{}
};
@ -2335,7 +2338,7 @@ static int parse_argv(int argc, char *argv[]) {
assert(argc >= 0);
assert(argv);
while ((c = getopt_long(argc, argv, "hH:M:", options, NULL)) >= 0)
while ((c = getopt_long(argc, argv, "hH:M:U:", options, NULL)) >= 0)
switch (c) {
case 'h':
@ -2465,6 +2468,16 @@ static int parse_argv(int argc, char *argv[]) {
break;
case 'U': {
_cleanup_free_ char *mangled = NULL;
r = unit_name_mangle(optarg, UNIT_NAME_MANGLE_WARN, &mangled);
if (r < 0)
return log_error_errno(r, "Failed to mangle unit name %s: %m", optarg);
free_and_replace(arg_unit, mangled);
break;
}
case '?':
return -EINVAL;
@ -2493,15 +2506,24 @@ static int parse_argv(int argc, char *argv[]) {
return log_error_errno(SYNTHETIC_ERRNO(EINVAL),
"Option --security-policy= is only supported for security.");
if ((arg_root || arg_image) && (!STRPTR_IN_SET(argv[optind], "cat-config", "verify")) &&
if ((arg_root || arg_image) && (!STRPTR_IN_SET(argv[optind], "cat-config", "verify", "condition")) &&
(!(streq_ptr(argv[optind], "security") && arg_offline)))
return log_error_errno(SYNTHETIC_ERRNO(EINVAL),
"Options --root= and --image= are only supported for cat-config, verify and security when used with --offline= right now.");
"Options --root= and --image= are only supported for cat-config, verify, condition and security when used with --offline= right now.");
/* Having both an image and a root is not supported by the code */
if (arg_root && arg_image)
return log_error_errno(SYNTHETIC_ERRNO(EINVAL), "Please specify either --root= or --image=, the combination of both is not supported.");
if (arg_unit && !streq_ptr(argv[optind], "condition"))
return log_error_errno(SYNTHETIC_ERRNO(EINVAL), "Option --unit= is only supported for condition");
if (streq_ptr(argv[optind], "condition") && !arg_unit && optind >= argc - 1)
return log_error_errno(SYNTHETIC_ERRNO(EINVAL), "Too few arguments for condition");
if (streq_ptr(argv[optind], "condition") && arg_unit && optind < argc - 1)
return log_error_errno(SYNTHETIC_ERRNO(EINVAL), "No conditions can be passed if --unit= is used.");
return 1; /* work to do */
}
@ -2532,7 +2554,7 @@ static int run(int argc, char *argv[]) {
{ "exit-status", VERB_ANY, VERB_ANY, 0, dump_exit_status },
{ "syscall-filter", VERB_ANY, VERB_ANY, 0, dump_syscall_filters },
{ "capability", VERB_ANY, VERB_ANY, 0, dump_capabilities },
{ "condition", 2, VERB_ANY, 0, do_condition },
{ "condition", VERB_ANY, VERB_ANY, 0, do_condition },
{ "verify", 2, VERB_ANY, 0, do_verify },
{ "calendar", 2, VERB_ANY, 0, test_calendar },
{ "timestamp", 2, VERB_ANY, 0, test_timestamp },