Files
systemd/shell-completion/bash/systemd-vpick
Lennart Poettering 8a9b726de0 vpick: honour the "user.uapi.match_…" extended attributes of entries
systemd-sysupdate copies the "user.uapi.match_…" extended attributes of files
in UAPI.16 manifests onto the files it installs, which restrict the
files to specific systems (hostname, machine ID, machine tags, os-release
image/OS ID and version). Let's honour them when picking entries from
.v/ directories too: entries whose extended attributes don't match the
local system are skipped, as if they didn't exist. The system properties
are only loaded once an entry actually carries one of the attributes.

Entries referenced literally, i.e. without making use of .v/ logic, are
not filtered.

This may be turned off with the new PICK_IGNORE_XATTR_MATCH flag, which
systemd-vpick exposes as --match-xattr=no.
2026-11-02 15:57:51 +01:00

67 lines
2.1 KiB
Bash

# shellcheck shell=bash
# systemd-vpick(1) completion -*- shell-script -*-
# SPDX-License-Identifier: LGPL-2.1-or-later
#
# This file is part of systemd.
#
# systemd is free software; you can redistribute it and/or modify it
# under the terms of the GNU Lesser General Public License as published by
# the Free Software Foundation; either version 2.1 of the License, or
# (at your option) any later version.
#
# systemd is distributed in the hope that it will be useful, but
# WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
# General Public License for more details.
#
# You should have received a copy of the GNU Lesser General Public License
# along with systemd; If not, see <https://www.gnu.org/licenses/>.
__contains_word() {
local w word=$1; shift
for w in "$@"; do
[[ $w = "$word" ]] && return
done
}
_systemd-vpick() {
local cur=${COMP_WORDS[COMP_CWORD]} prev=${COMP_WORDS[COMP_CWORD-1]} words cword
local comps
local -A OPTS=(
[STANDALONE]='--help -h --version'
[ARG]='-B --basename -V -A -S --suffix -t --type -p --print --resolve --match-xattr'
)
_init_completion || return
if __contains_word "$prev" ${OPTS[ARG]}; then
case $prev in
-A)
comps="native secondary uname auto $(systemd-analyze --no-legend --no-pager architectures 2>/dev/null | { while read -r a _; do echo " $a"; done; })"
;;
-t|--type)
comps='reg dir lnk chr blk fifo sock'
;;
-p|--print)
comps='filename version type arch tries all'
;;
--resolve|--match-xattr)
comps='yes no'
;;
esac
COMPREPLY=( $(compgen -W '$comps' -- "$cur") )
return 0
fi
if [[ "$cur" = -* ]] || [[ -z ${comps-} ]]; then
COMPREPLY=( $(compgen -W '${OPTS[*]}' -- "$cur") )
return 0
fi
COMPREPLY=( $(compgen -W '${comps-}' -- "$cur") )
return 0
}
complete -F _systemd-vpick systemd-vpick