mirror of https://github.com/artizirk/dotfiles
Arti Zirk
2 years ago
2 changed files with 356 additions and 0 deletions
@ -0,0 +1,354 @@ |
|||||||
|
#compdef west |
||||||
|
|
||||||
|
# Copyright (c) 2022 Nordic Semiconductor ASA |
||||||
|
# SPDX-License-Identifier: Apache-2.0 |
||||||
|
|
||||||
|
# Ensure this works also when being source-ed |
||||||
|
compdef _west west |
||||||
|
|
||||||
|
typeset -A -g _opt_args |
||||||
|
|
||||||
|
_west_cmds() { |
||||||
|
local -a builtin_cmds=( |
||||||
|
'init[create a west workspace]' |
||||||
|
'update[update projects described in west manifest]' |
||||||
|
'list[print information about projects]' |
||||||
|
'manifest[manage the west manifest]' |
||||||
|
'diff["git diff" for one or more projects]' |
||||||
|
'status["git status" for one or more projects]' |
||||||
|
'forall[run a command in one or more local projects]' |
||||||
|
'config[get or set config file values]' |
||||||
|
'topdir[print the top level directory of the workspace]' |
||||||
|
'help[get help for west or a command]' |
||||||
|
) |
||||||
|
|
||||||
|
local -a zephyr_ext_cmds=( |
||||||
|
'completion[display shell completion scripts]' |
||||||
|
'boards[display information about supported boards]' |
||||||
|
'build[compile a Zephyr application]' |
||||||
|
'sign[sign a Zephyr binary for bootloader chain-loading]' |
||||||
|
'flash[flash and run a binary on a board]' |
||||||
|
'debug[flash and interactively debug a Zephyr application]' |
||||||
|
'debugserver[connect to board and launch a debug server]' |
||||||
|
'attach[interactively debug a board]' |
||||||
|
'zephyr-export[export Zephyr installation as a CMake config package]' |
||||||
|
'spdx[create SPDX bill of materials]' |
||||||
|
'blobs[work with binary blobs]' |
||||||
|
) |
||||||
|
|
||||||
|
local -a all_cmds=(${builtin_cmds} ${zephyr_ext_cmds}) |
||||||
|
|
||||||
|
if [[ -v WEST_COMP_CHECK_WORKSPACE ]]; then |
||||||
|
west topdir &>/dev/null |
||||||
|
if [ $? -eq 0 ]; then |
||||||
|
_values "west command" $all_cmds |
||||||
|
else |
||||||
|
_values "west command" $builtin_cmds |
||||||
|
fi |
||||||
|
else |
||||||
|
_values "west command" $all_cmds |
||||||
|
fi |
||||||
|
} |
||||||
|
|
||||||
|
# Completion script for Zephyr's meta-tool, west |
||||||
|
_west() { |
||||||
|
|
||||||
|
|
||||||
|
# Global options for all commands |
||||||
|
local -a global_opts=( |
||||||
|
# (: * -) as exclusion list means exclude everything else |
||||||
|
'(: * -)'{-h,--help}'[show help]' |
||||||
|
# An exclusion list with the very option means only allow once |
||||||
|
{-v,--verbose}'[enable verbosity]' |
||||||
|
'(: * -)'{-V,--version}'[print version]' |
||||||
|
'(-z --zephyr-base)'{-z,--zephyr-base}'[zephyr base folder]:zephyr base folder:_directories' |
||||||
|
) |
||||||
|
|
||||||
|
typeset -A opt_args |
||||||
|
local curcontext="$curcontext" context state state_descr line |
||||||
|
local -a orig_words |
||||||
|
|
||||||
|
orig_words=( ${words[@]} ) |
||||||
|
|
||||||
|
_arguments -S -C \ |
||||||
|
$global_opts \ |
||||||
|
"1: :->cmds" \ |
||||||
|
"*::arg:->args" \ |
||||||
|
|
||||||
|
case "$state" in |
||||||
|
cmds) |
||||||
|
_west_cmds |
||||||
|
;; |
||||||
|
|
||||||
|
args) |
||||||
|
_opt_args=( ${(@kv)opt_args} ) |
||||||
|
_call_function ret _west_$line[1] |
||||||
|
;; |
||||||
|
esac |
||||||
|
} |
||||||
|
|
||||||
|
__west_x() |
||||||
|
{ |
||||||
|
west 2>/dev/null "$@" |
||||||
|
} |
||||||
|
|
||||||
|
_get_west_projs() { |
||||||
|
local extra_args |
||||||
|
[[ -v _opt_args[-z] ]] && extra_args="-z $_opt_args[-z]" |
||||||
|
[[ -v _opt_args[--zephyr-base] ]] && extra_args="-z $_opt_args[--zephyr-base]" |
||||||
|
|
||||||
|
_west_projs=($(__west_x $extra_args list --format={name})) |
||||||
|
_describe 'projs' _west_projs |
||||||
|
} |
||||||
|
|
||||||
|
_get_west_boards() { |
||||||
|
_west_boards=($(__west_x boards --format={name})) |
||||||
|
_describe 'boards' _west_boards |
||||||
|
} |
||||||
|
|
||||||
|
_west_init() { |
||||||
|
local -a opts=( |
||||||
|
'(-l --local)'{--mr,--manifest-rev}'[manifest revision]:manifest rev:' |
||||||
|
{--mf,--manifest-file}'[manifest file]:manifest file:' |
||||||
|
'(-l --local)'{-m,--manifest}'[manifest URL]:manifest URL:_directories' |
||||||
|
'(-m --manifest --mr --manifest-rev)'{-l,--local}'[use local directory as manifest repository]:local manifest repository directory:_directories' |
||||||
|
) |
||||||
|
|
||||||
|
_arguments -S $opts \ |
||||||
|
"1:workspace directory:" |
||||||
|
} |
||||||
|
|
||||||
|
_west_update() { |
||||||
|
local -a opts=( |
||||||
|
'--stats[print performance stats]' |
||||||
|
'--name-cache[name-based cache]:name cache folder:_directories' |
||||||
|
'--path-cache[path-based cache]:path cache folder:_directories' |
||||||
|
{-f,--fetch}'[fetch strategy]:fetch strategy:(always smart)' |
||||||
|
{-o,--fetch-opt}'[fetch options]:fetch options:' |
||||||
|
{-n,--narrow}'[narrow fetch]' |
||||||
|
{-k,--keep-descendants}'[keep manifest-rev descendants checked out]' |
||||||
|
{-r,--rebase}'[rebase checked out branch onto the new manifest-rev]' |
||||||
|
) |
||||||
|
|
||||||
|
_arguments -S $opts \ |
||||||
|
"1:west proj:_get_west_projs" |
||||||
|
} |
||||||
|
|
||||||
|
_west_list() { |
||||||
|
local -a opts=( |
||||||
|
{-a,--all}'[include inactive projects]' |
||||||
|
'--manifest-path-from-yaml[print performance stats]' |
||||||
|
{-f,--format}'[format string]:format string:' |
||||||
|
) |
||||||
|
|
||||||
|
_arguments -S $opts \ |
||||||
|
"1:west proj:_get_west_projs" |
||||||
|
} |
||||||
|
|
||||||
|
_west_manifest() { |
||||||
|
local -a opts=( |
||||||
|
'--resolve[resolve into single manifest]' |
||||||
|
'--freeze[resolve into single manifest, with SHAs]' |
||||||
|
'--validate[silently validate manifest]' |
||||||
|
'--path[print the path to the top level manifest file]' |
||||||
|
{-o,--out}'[output file]:output file:_files' |
||||||
|
) |
||||||
|
|
||||||
|
_arguments -S $opts |
||||||
|
} |
||||||
|
|
||||||
|
_west_diff() { |
||||||
|
local -a opts=( |
||||||
|
{-a,--all}'[include inactive projects]' |
||||||
|
) |
||||||
|
|
||||||
|
_arguments -S $opts \ |
||||||
|
"1:west proj:_get_west_projs" |
||||||
|
} |
||||||
|
|
||||||
|
_west_status() { |
||||||
|
local -a opts=( |
||||||
|
{-a,--all}'[include inactive projects]' |
||||||
|
) |
||||||
|
|
||||||
|
_arguments -S $opts \ |
||||||
|
"1:west proj:_get_west_projs" |
||||||
|
} |
||||||
|
|
||||||
|
_west_forall() { |
||||||
|
local -a opts=( |
||||||
|
'-c[command to execute]:command:' |
||||||
|
{-a,--all}'[include inactive projects]' |
||||||
|
) |
||||||
|
|
||||||
|
_arguments -S $opts \ |
||||||
|
"1:west proj:_get_west_projs" |
||||||
|
} |
||||||
|
|
||||||
|
_west_config() { |
||||||
|
local -a opts=( |
||||||
|
{-l,--list}'[list all options and values]' |
||||||
|
{-d,--delete}'[delete an option in one config file]' |
||||||
|
{-D,--delete-all}"[delete an option everywhere it\'s set]" |
||||||
|
+ '(mutex)' |
||||||
|
'--system[system-wide file]' |
||||||
|
'--global[global user-wide file]' |
||||||
|
"--local[this workspace\'s file]" |
||||||
|
) |
||||||
|
|
||||||
|
_arguments -S $opts |
||||||
|
} |
||||||
|
|
||||||
|
_west_help() { |
||||||
|
_west_cmds |
||||||
|
} |
||||||
|
|
||||||
|
_west_completion() { |
||||||
|
|
||||||
|
_arguments -S "1:shell:(bash zsh)" |
||||||
|
} |
||||||
|
|
||||||
|
_west_boards() { |
||||||
|
local -a opts=( |
||||||
|
{-f,--format}'[format string]:format string:' |
||||||
|
{-n,--name}'[name regex]:regex:' |
||||||
|
'*--arch-root[Add an arch root]:arch root:_directories' |
||||||
|
'*--board-root[Add a board root]:board root:_directories' |
||||||
|
) |
||||||
|
|
||||||
|
_arguments -S $opts |
||||||
|
} |
||||||
|
|
||||||
|
_west_build() { |
||||||
|
local -a opts=( |
||||||
|
'(-b --board)'{-b,--board}'[board to build for]:board:_get_west_boards' |
||||||
|
'(-d --build-dir)'{-d,--build-dir}'[build directory to create or use]:build dir:_directories' |
||||||
|
'(-f --force)'{-f,--force}'[ignore errors and continue]' |
||||||
|
'--sysbuild[create multi-domain build system]' |
||||||
|
'--no-sysbuild[do not create multi-domain build system]' |
||||||
|
'(-c --cmake)'{-c,--cmake}'[force a cmake run]' |
||||||
|
'--cmake-only[just run cmake]' |
||||||
|
'--domain[execute build tool (make or ninja) for a given domain]:domain:' |
||||||
|
'(-t --target)'{-t,--target}'[run build system target]:target:' |
||||||
|
'(-T --test-item)'{-T,--test-item}'[Build based on test data in .yml]:test item:' |
||||||
|
{-o,--build-opt}'[options to pass to build tool (make or ninja)]:tool opt:' |
||||||
|
'(-n --just-print --dry-run --recon)'{-n,--just-print,--dry-run,--recon}"[just print build commands, don't run them]" |
||||||
|
'(-p --pristine)'{-p,--pristine}'[pristine build setting]:pristine:(auto always never)' |
||||||
|
) |
||||||
|
_arguments -S $opts \ |
||||||
|
"1:source_dir:_directories" |
||||||
|
} |
||||||
|
|
||||||
|
_west_sign() { |
||||||
|
local -a opts=( |
||||||
|
'(-d --build-dir)'{-d,--build-dir}'[build directory to create or use]:build dir:_directories' |
||||||
|
'(-q --quiet)'{-q,--quiet}'[suppress non-error output]' |
||||||
|
'(-f --force)'{-f,--force}'[ignore errors and continue]' |
||||||
|
'(-t --tool)'{-t,--tool}'[image signing tool name]:tool:(imgtool rimage)' |
||||||
|
'(-p --tool-path)'{-p,--tool-path}'[path to the tool]:tool path:_directories' |
||||||
|
'(-D --tool-data)'{-D,--tool-data}'[path to tool data]:tool data path:_directories' |
||||||
|
'(--no-bin)--bin[produce a signed bin file]' |
||||||
|
'(--bin)--no-bin[do not produce a signed bin file]' |
||||||
|
'(-B --sbin)'{-B,--sbin}'[signed .bin filename]:bin filename:_files' |
||||||
|
'(--no-hex)--hex[produce a signed hex file]' |
||||||
|
'(--hex)--no-hex[do not produce a signed hex file]' |
||||||
|
'(-H --shex)'{-H,--shex}'[signed .hex filename]:hex filename:_files' |
||||||
|
) |
||||||
|
|
||||||
|
_arguments -S $opts |
||||||
|
} |
||||||
|
|
||||||
|
typeset -a -g _west_runner_opts=( |
||||||
|
'(-H --context)'{-H,--context}'[print runner-specific options]' |
||||||
|
'--board-dir[board directory]:board dir:_directories' |
||||||
|
'--elf-file[path to zephyr.elf]:path to zephyr.elf:_files' |
||||||
|
'--hex-file[path to zephyr.hex]:path to zephyr.hex:_files' |
||||||
|
'--bin-file[path to zephyr.bin]:path to zephyr.bin:_files' |
||||||
|
'--gdb[path to GDB]:path to GDB:_files' |
||||||
|
'--openocd[path to openocd]:path to openocd:_files' |
||||||
|
'--openocd-search[path to add to openocd search path]:openocd search:_directories' |
||||||
|
) |
||||||
|
|
||||||
|
_west_flash() { |
||||||
|
local -a opts=( |
||||||
|
'(-d --build-dir)'{-d,--build-dir}'[build directory to create or use]:build dir:_directories' |
||||||
|
'(-r --runner)'{-r,--runner}'[override default runner from build-dir]:runner:' |
||||||
|
'--skip-rebuild[do not refresh cmake dependencies first]' |
||||||
|
'--domain[execute build tool (make or ninja) for a given domain]:domain:' |
||||||
|
) |
||||||
|
|
||||||
|
local -a all_opts=(${_west_runner_opts} ${opts}) |
||||||
|
_arguments -S $all_opts |
||||||
|
} |
||||||
|
|
||||||
|
_west_debug() { |
||||||
|
_west_flash |
||||||
|
} |
||||||
|
|
||||||
|
_west_debugserver() { |
||||||
|
_west_flash |
||||||
|
} |
||||||
|
|
||||||
|
_west_attach() { |
||||||
|
_west_flash |
||||||
|
} |
||||||
|
|
||||||
|
_west_spdx() { |
||||||
|
local -a opts=( |
||||||
|
'(-i --init)'{-i,--init}'[initialize CMake file-based API]' |
||||||
|
'(-d --build-dir)'{-d,--build-dir}'[build directory to create or use]:build dir:_directories' |
||||||
|
'(-n --namespace-prefix)'{-n,--namespace-prefix}'[namespace prefix]:namespace prefix:' |
||||||
|
'(-s --spdx-dir)'{-d,--spdx-dir}'[SPDX output directory]:spdx output dir:_directories' |
||||||
|
'--analyze-includes[also analyze included header files]' |
||||||
|
'--include-sdk[also generate SPDX document for SDK]' |
||||||
|
) |
||||||
|
_arguments -S $opts |
||||||
|
} |
||||||
|
|
||||||
|
_west_blobs() { |
||||||
|
local -a blob_cmds=( |
||||||
|
'list[list binary blobs]' |
||||||
|
'fetch[fetch binary blobs]' |
||||||
|
'clean[clean working tree of binary blobs]' |
||||||
|
) |
||||||
|
|
||||||
|
local line state |
||||||
|
|
||||||
|
_arguments -S -C \ |
||||||
|
"1: :->cmds" \ |
||||||
|
"*::arg:->args" \ |
||||||
|
|
||||||
|
case "$state" in |
||||||
|
cmds) |
||||||
|
_values "west blob cmds" $blob_cmds |
||||||
|
;; |
||||||
|
|
||||||
|
args) |
||||||
|
_opt_args=( ${(@kv)opt_args} ) |
||||||
|
_call_function ret _west_blob_$line[1] |
||||||
|
;; |
||||||
|
esac |
||||||
|
} |
||||||
|
|
||||||
|
_west_blob_list () { |
||||||
|
local -a opts=( |
||||||
|
{-f,--format}'[format string]:format string:' |
||||||
|
) |
||||||
|
|
||||||
|
_arguments -S $opts \ |
||||||
|
"1:west proj:_get_west_projs" |
||||||
|
} |
||||||
|
|
||||||
|
_west_blob_fetch () { |
||||||
|
_arguments -S "1:west proj:_get_west_projs" |
||||||
|
} |
||||||
|
|
||||||
|
_west_blob_clean () { |
||||||
|
_arguments -S "1:west proj:_get_west_projs" |
||||||
|
} |
||||||
|
|
||||||
|
# don't run the completion function when being source-ed or eval-ed |
||||||
|
if [ "$funcstack[1]" = "_west" ]; then |
||||||
|
_west |
||||||
|
fi |
||||||
|
|
Loading…
Reference in new issue