1
Fork 0
mirror of https://github.com/RGBCube/serenity synced 2025-05-31 22:48:11 +00:00
serenity/Meta/ShellCompletions/zsh/_serenity
kleines Filmröllchen e01941b41c Meta/ShellCompletions: Complete binaries for run lagom
This completion only works if you have lagom already built in some
capacity, since it scans the build directory tree for binaries, removing
known false positives. However, that is both more accurate than asking
ninja for the targets and filtering those, and it also makes it
independent of the build system used.
2023-05-17 12:55:15 +02:00

108 lines
2.8 KiB
Text

#compdef serenity serenity.sh
get_top_dir() {
git rev-parse --show-toplevel
}
get_lagom_executables() {
# Make completion work with user-defined source directory.
SERENITY_SOURCE_DIR="${SERENITY_SOURCE_DIR:-$(get_top_dir)}"
# If the Lagom binary directory is missing, this creates an empty list instead of erroring.
# Known false positives need to be filtered manually; please add new ones.
find "${SERENITY_SOURCE_DIR}/Build/lagom" -mindepth 1 -type f -executable -not -name '*.so*' \
-not \( -name 'SQLServer' -o -name 'a.out' -o -name 'CMake*.bin' \) \
-printf '%f\n' 2>/dev/null || true
}
_serenity() {
local args
args=(
'1:command:->commands'
'2:target:->targets'
'3:toolchain_or_executable:->toolchains_or_executables'
'*:: :->args'
)
local commands
commands=(
'help'
'build'
'install'
'image'
'run'
'gdb'
'test'
'delete'
'recreate'
'rebuild'
'kaddr2line'
'addr2line'
'rebuild-toolchain'
'rebuild-world'
'copy-src'
)
local targets
targets=(
'x86_64:Target x86_64 or $SERENITY_ARCH (default)'
'aarch64:Target aarch64'
'lagom:Target host machine'
)
local toolchains
toolchains=(
'GNU:Toolchain gcc or $SERENITY_TOOLCHAIN (default)'
'Clang:Toolchain clang'
)
local lagom_executables
# Prevent splitting array on spaces with IFS; bash would have `mapfile` for this.
IFS=$'\n'; set -f
lagom_executables=($(get_lagom_executables))
unset IFS; set +f
_arguments -C -S "$args[@]"
local command
command="$line[1]"
local target
target="$line[2]"
local toolchain
toolchain="$line[3]"
case "$state" in
commands)
_describe 'command' commands
;;
targets)
case "$command" in
install|image|copy-src|kaddr2line|rebuild-toolchain|rebuild-world)
# lagom target is not supported for these, remove from targets
targets[$targets[(i)lagom]]=()
;;
help)
# Help command has no targets.
targets=()
;;
esac
_describe 'target' targets
;;
toolchains_or_executables)
if [[ "$command" != help && "$target" != lagom ]]; then
# Toolchain-dependent invocations.
_describe 'toolchain_or_executable' toolchains
elif [[ "$command" = run && "$target" = lagom ]]; then
# With `run lagom` this already is the executable.
_describe 'toolchain_or_executable' lagom_executables
fi
;;
args)
;;
esac
return 0
}
_serenity