Merge pull request #30643 from bluca/completion

bash completion additions for systemctl/systemd-analyze
This commit is contained in:
Yu Watanabe 2023-12-28 04:10:20 +09:00 committed by GitHub
commit 3a30d81238
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
3 changed files with 44 additions and 2 deletions

View file

@ -62,6 +62,8 @@ __get_template_names () { __systemctl $1 list-unit-files "$2*" \
| { while read -r a b; do [[ $a =~ @\. ]] && echo " ${a%%@.*}@"; done; }; }
__get_active_units () { __systemctl $1 list-units "$2*" \
| { while read -r a b; do echo " $a"; done; }; }
__get_active_services() { __systemctl $1 list-units "$2*.service" \
| { while read -r a b; do echo " $a"; done; }; }
__get_not_masked_unit_files() {
# filter out masked, not-found, or template units.
@ -231,12 +233,15 @@ _systemctl () {
list-timers list-units list-unit-files poweroff
reboot rescue show-environment suspend get-default
is-system-running preset-all list-automounts list-paths'
[FILE]='link switch-root bind mount-image'
[FILE]='link switch-root'
[TARGETS]='set-default'
[MACHINES]='list-machines'
[LOG_LEVEL]='log-level'
[LOG_TARGET]='log-target'
[SERVICE_LOG_LEVEL]='service-log-level'
[SERVICE_LOG_TARGET]='service-log-target'
[SERVICE_WATCHDOGS]='service-watchdogs'
[MOUNT]='bind mount-image'
)
for ((i=0; i < COMP_CWORD; i++)); do
@ -365,8 +370,33 @@ _systemctl () {
comps='debug info notice warning err crit alert emerg'
elif __contains_word "$verb" ${VERBS[LOG_TARGET]}; then
comps='console journal kmsg journal-or-kmsg null'
elif __contains_word "$verb" ${VERBS[SERVICE_LOG_LEVEL]}; then
if __contains_word "$prev" ${VERBS[SERVICE_LOG_LEVEL]}; then
comps=$( __get_all_unit_files $mode "$cur" )
elif __contains_word "$prev" debug info notice warning err crit alert emerg; then
return 0
else
comps='debug info notice warning err crit alert emerg'
fi
elif __contains_word "$verb" ${VERBS[SERVICE_LOG_TARGET]}; then
if __contains_word "$prev" ${VERBS[SERVICE_LOG_TARGET]}; then
comps=$( __get_all_unit_files $mode "$cur" )
elif __contains_word "$prev" console journal kmsg journal-or-kmsg null; then
return 0
else
comps='console journal kmsg journal-or-kmsg null'
fi
elif __contains_word "$verb" ${VERBS[SERVICE_WATCHDOGS]}; then
comps='on off'
elif __contains_word "$verb" ${VERBS[MOUNT]}; then
if __contains_word "$prev" ${VERBS[MOUNT]}; then
comps=$( __get_active_services $mode "$cur" )
elif [[ "$prev" =~ .service ]]; then
comps=$( compgen -A file -- "$cur" )
compopt -o filenames
else
return 0
fi
fi
COMPREPLY=( $(compgen -o filenames -W '$comps' -- "$cur_orig") )

View file

@ -51,6 +51,10 @@ __get_syscall_sets() {
done
}
__get_architectures() {
systemd-analyze --no-legend --no-pager architectures | { while read -r a b; do echo " $a"; done }
}
_systemd_analyze() {
local i verb comps mode
local cur=${COMP_WORDS[COMP_CWORD]} prev=${COMP_WORDS[COMP_CWORD-1]} words cword
@ -73,6 +77,7 @@ _systemd_analyze() {
[CONDITION]='condition'
[INSPECT_ELF]='inspect-elf'
[PLOT]='plot'
[ARCHITECTURES]='architectures'
)
local CONFIGS='systemd/bootchart.conf systemd/coredump.conf systemd/journald.conf
@ -198,6 +203,13 @@ _systemd_analyze() {
if [[ $cur = -* ]]; then
comps='--help --version --system --user --global --no-pager --json=off --json=pretty --json=short --table --no-legend'
fi
elif __contains_word "$verb" ${VERBS[ARCHITECTURES]}; then
if [[ $cur = -* ]]; then
comps='--help --version --no-pager --json=off --json=pretty --json=short --no-legend'
else
comps=$( __get_architectures )
fi
fi
COMPREPLY=( $(compgen -W '$comps' -- "$cur") )

View file

@ -597,7 +597,7 @@ static int parse_argv(int argc, char *argv[]) {
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.");
if ((!arg_legend && !streq_ptr(argv[optind], "plot")) ||
if ((!arg_legend && !STRPTR_IN_SET(argv[optind], "plot", "architectures")) ||
(streq_ptr(argv[optind], "plot") && !arg_legend && !arg_table && FLAGS_SET(arg_json_format_flags, JSON_FORMAT_OFF)))
return log_error_errno(SYNTHETIC_ERRNO(EINVAL), "Option --no-legend is only supported for plot with either --table or --json=.");